diff --git a/compiler/java/com/google/dart/compiler/DartCompiler.java b/compiler/java/com/google/dart/compiler/DartCompiler.java
index e82153e..1d0eb285 100644
--- a/compiler/java/com/google/dart/compiler/DartCompiler.java
+++ b/compiler/java/com/google/dart/compiler/DartCompiler.java
@@ -4,6 +4,7 @@
 
 package com.google.dart.compiler;
 
+import com.google.common.base.Objects;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
@@ -711,36 +712,50 @@
 
         // check that all sourced units have no directives
         for (DartUnit unit : lib.getUnits()) {
+          // don't need to check a unit that hasn't changed
           if (unit.isDiet()) {
-            // don't need to check a unit that hasn't changed
             continue;
           }
-          if (invalidDirectivesForPart(unit.getDirectives())) {
-            // find corresponding source node for this unit
-            for (LibraryNode sourceNode : lib.getSourcePaths()) {
-              if (sourceNode == lib.getSelfSourcePath()) {
-                // skip the special synthetic selfSourcePath node
-                continue;
-              }
-              DartSource dartSource = (DartSource) unit.getSourceInfo().getSource();
-              // check for directives
-              if (dartSource.getRelativePath().equals(sourceNode.getText())) {
-                context.onError(new DartCompilationError(unit.getDirectives().get(0),
-                    DartCompilerErrorCode.ILLEGAL_DIRECTIVES_IN_SOURCED_UNIT,
-                    Elements.getRelativeSourcePath(dartSource, lib.getSource())));
-              }
+          // ignore library unit
+          DartSource unitSource = (DartSource) unit.getSourceInfo().getSource();
+          if (isLibrarySelfUnit(lib, unitSource)) {
+            continue;
+          }
+          // analyze directives
+          List<DartDirective> directives = unit.getDirectives();
+          if (directives.isEmpty()) {
+            // TODO(scheglov) Remove after http://code.google.com/p/dart/issues/detail?id=6121
+            if (!StringUtils.startsWith(lib.getName(), "dart:")) {
+              context.onError(new DartCompilationError(unitSource,
+                  DartCompilerErrorCode.MISSING_PART_OF_DIRECTIVE, lib.getName()));
             }
+          } else if (directives.size() == 1 && directives.get(0) instanceof DartPartOfDirective) {
+            DartPartOfDirective directive = (DartPartOfDirective) directives.get(0);
+            String dirName = directive.getLibraryName();
+            if (!Objects.equal(dirName, lib.getName())) {
+              context.onError(new DartCompilationError(directive,
+                  DartCompilerErrorCode.WRONG_PART_OF_NAME, lib.getName(), dirName));
+            }
+          } else {
+            context.onError(new DartCompilationError(directives.get(0),
+                DartCompilerErrorCode.ILLEGAL_DIRECTIVES_IN_SOURCED_UNIT,
+                Elements.getRelativeSourcePath(unitSource, lib.getSource())));
           }
         }
       }
     }
 
-    private boolean invalidDirectivesForPart(List<DartDirective> directives) {
-      int size = directives.size();
-      if (size == 1) {
-        return !(directives.get(0) instanceof DartPartOfDirective);
+    private static boolean isLibrarySelfUnit(LibraryUnit lib, DartSource unitSource) {
+      String unitRelativePath = unitSource.getRelativePath();
+      for (LibraryNode sourceNode : lib.getSourcePaths()) {
+        if (unitRelativePath.equals(sourceNode.getText())) {
+          if (sourceNode == lib.getSelfSourcePath()) {
+            return true;
+          }
+          return false;
+        }
       }
-      return size > 0;
+      return false;
     }
 
     private void setEntryPoint() {
diff --git a/compiler/java/com/google/dart/compiler/DartCompilerErrorCode.java b/compiler/java/com/google/dart/compiler/DartCompilerErrorCode.java
index 0744833..251b871 100644
--- a/compiler/java/com/google/dart/compiler/DartCompilerErrorCode.java
+++ b/compiler/java/com/google/dart/compiler/DartCompilerErrorCode.java
@@ -17,12 +17,16 @@
   ENTRY_POINT_METHOD_MAY_NOT_BE_SETTER(ErrorSeverity.WARNING,
       "Entry point \"%s\" may not be a setter"),
   ILLEGAL_DIRECTIVES_IN_SOURCED_UNIT("This part was included by %s via a "
-      + "part directive, so cannot itself contain directives other than a part of directive"),
+      + "part directive, so cannot itself contain directives other than a 'part of' directive"),
   IO("Input/Output error: %s"),
   MIRRORS_NOT_FULLY_IMPLEMENTED(ErrorSeverity.WARNING, "dart:mirrors is not fully implemented yet"),
   MISSING_LIBRARY_DIRECTIVE("a library which is imported is missing a library directive: %s"),
   MISSING_SOURCE("Cannot find referenced source: %s"),
-  UNIT_WAS_ALREADY_INCLUDED("Unit '%s' was already included");
+  MISSING_PART_OF_DIRECTIVE("Unit is part of library '%s', but has no 'part of' directive"),
+  UNIT_WAS_ALREADY_INCLUDED("Unit '%s' was already included"),
+  WRONG_PART_OF_NAME(
+      ErrorSeverity.WARNING,
+      "This part was included by '%s' via a 'part' directive, but uses name '%s' in 'part of' directive");
   private final ErrorSeverity severity;
   private final String message;
 
diff --git a/compiler/java/com/google/dart/compiler/DeltaAnalyzer.java b/compiler/java/com/google/dart/compiler/DeltaAnalyzer.java
index e7c2ec5..2829cd9 100644
--- a/compiler/java/com/google/dart/compiler/DeltaAnalyzer.java
+++ b/compiler/java/com/google/dart/compiler/DeltaAnalyzer.java
@@ -16,6 +16,7 @@
 import com.google.dart.compiler.resolver.CoreTypeProvider;
 import com.google.dart.compiler.resolver.CoreTypeProviderImplementation;
 import com.google.dart.compiler.resolver.Element;
+import com.google.dart.compiler.resolver.ElementKind;
 import com.google.dart.compiler.resolver.LibraryElement;
 import com.google.dart.compiler.resolver.MemberBuilder;
 import com.google.dart.compiler.resolver.Resolver;
@@ -95,7 +96,11 @@
     Scope scope = libraryUnit.getElement().getScope();
     for (Element member : enclosingLibrary.getMembers()) {
       if (member.getSourceInfo().getSource() != originalSource) {
-        scope.declareElement(member.getName(), member);
+        String name = member.getName();
+        if (ElementKind.of(member) == ElementKind.LIBRARY) {
+          name = "__library_" + ((LibraryElement) member).getLibraryUnit().getName();
+        }
+        scope.declareElement(name, member);
       }
     }
     return scope;
diff --git a/compiler/java/com/google/dart/compiler/ast/DartBlock.java b/compiler/java/com/google/dart/compiler/ast/DartBlock.java
index e19edc0..27d0d058 100644
--- a/compiler/java/com/google/dart/compiler/ast/DartBlock.java
+++ b/compiler/java/com/google/dart/compiler/ast/DartBlock.java
@@ -14,7 +14,9 @@
   private final NodeList<DartStatement> statements = NodeList.create(this);
 
   public DartBlock(List<DartStatement> statements) {
-    this.statements.addAll(statements);
+    if (statements != null && !statements.isEmpty()) {
+      this.statements.addAll(statements);
+    }
   }
 
   public List<DartStatement> getStatements() {
diff --git a/compiler/java/com/google/dart/compiler/ast/DartClass.java b/compiler/java/com/google/dart/compiler/ast/DartClass.java
index 5fb737b..f5c20b5 100644
--- a/compiler/java/com/google/dart/compiler/ast/DartClass.java
+++ b/compiler/java/com/google/dart/compiler/ast/DartClass.java
@@ -30,49 +30,48 @@
   // points to the JS class. Otherwise it is null.
   private final DartStringLiteral nativeName;
 
+  private final int tokenOffset;
+  private final int tokenLength;
+  private final int defaultTokenOffset;
+  private final int implementsOffset;
   private final int openBraceOffset;
   private final int closeBraceOffset;
 
-  public DartClass(DartIdentifier name, DartStringLiteral nativeName, DartTypeNode superclass,
-      List<DartTypeNode> interfaces, int openBraceOffset, int closeBraceOffset,
-      List<DartNode> members, List<DartTypeParameter> typeParameters, Modifiers modifiers) {
-    this(name, nativeName, superclass, interfaces, openBraceOffset, closeBraceOffset, members,
-        typeParameters, null, false, modifiers);
+  public DartClass(int tokenOffset, int tokenLength, DartIdentifier name,
+      DartStringLiteral nativeName, DartTypeNode superclass, int implementsOffset,
+      List<DartTypeNode> interfaces, int defaultTokenOffset, int openBraceOffset,
+      int closeBraceOffset, List<DartNode> members, List<DartTypeParameter> typeParameters,
+      Modifiers modifiers) {
+    this(tokenOffset, tokenLength, name, nativeName, superclass, implementsOffset, interfaces,
+        defaultTokenOffset, openBraceOffset, closeBraceOffset, members, typeParameters, null,
+        false, modifiers);
   }
 
-  public DartClass(DartIdentifier name, DartTypeNode superclass, List<DartTypeNode> interfaces,
-                   int openBraceOffset, int closeBraceOffset,
-                   List<DartNode> members,
-                   List<DartTypeParameter> typeParameters,
-                   DartParameterizedTypeNode defaultClass) {
-    this(name,
-        null,
-        superclass,
-        interfaces,
-        openBraceOffset,
-        closeBraceOffset,
-        members,
-        typeParameters,
-        defaultClass,
-        true,
-        Modifiers.NONE);
+  public DartClass(int tokenOffset, int tokenLength, DartIdentifier name, DartTypeNode superclass,
+      int implementsOffset, List<DartTypeNode> interfaces, int defaultTokenOffset,
+      int openBraceOffset, int closeBraceOffset, List<DartNode> members,
+      List<DartTypeParameter> typeParameters, DartParameterizedTypeNode defaultClass) {
+    this(tokenOffset, tokenLength, name, null, superclass, implementsOffset, interfaces,
+        defaultTokenOffset, openBraceOffset, closeBraceOffset, members, typeParameters,
+        defaultClass, true, Modifiers.NONE);
   }
 
-  public DartClass(DartIdentifier name, DartStringLiteral nativeName,
-                   DartTypeNode superclass, List<DartTypeNode> interfaces,
-                   int openBraceOffset, int closeBraceOffset,
-                   List<DartNode> members,
-                   List<DartTypeParameter> typeParameters,
-                   DartParameterizedTypeNode defaultClass,
-                   boolean isInterface,
-                   Modifiers modifiers) {
+  public DartClass(int tokenOffset, int tokenLength, DartIdentifier name,
+      DartStringLiteral nativeName, DartTypeNode superclass, int implementsOffset,
+      List<DartTypeNode> interfaces, int defaultTokenOffset, int openBraceOffset,
+      int closeBraceOffset, List<DartNode> members, List<DartTypeParameter> typeParameters,
+      DartParameterizedTypeNode defaultClass, boolean isInterface, Modifiers modifiers) {
     super(name);
+    this.tokenOffset = tokenOffset;
+    this.tokenLength = tokenLength;
     this.nativeName = becomeParentOf(nativeName);
     this.superclass = becomeParentOf(superclass);
+    this.defaultTokenOffset = defaultTokenOffset;
     this.openBraceOffset = openBraceOffset;
     this.closeBraceOffset = closeBraceOffset;
     this.members.addAll(members);
     this.typeParameters.addAll(typeParameters);
+    this.implementsOffset = implementsOffset;
     this.interfaces.addAll(interfaces);
     this.defaultClass = becomeParentOf(defaultClass);
     this.isInterface = isInterface;
@@ -109,6 +108,18 @@
     }
     return false;
   }
+
+  public int getTokenOffset() {
+    return tokenOffset;
+  }
+  
+  public int getTokenLength() {
+    return tokenLength;
+  }
+  
+  public int getDefaultTokenOffset() {
+    return defaultTokenOffset;
+  }
   
   public int getOpenBraceOffset() {
     return openBraceOffset;
@@ -125,6 +136,10 @@
   public List<DartTypeParameter> getTypeParameters() {
     return typeParameters;
   }
+  
+  public int getImplementsOffset() {
+    return implementsOffset;
+  }
 
   public List<DartTypeNode> getInterfaces() {
     return interfaces;
diff --git a/compiler/java/com/google/dart/compiler/ast/DartFunction.java b/compiler/java/com/google/dart/compiler/ast/DartFunction.java
index 09e644a..a7693d3 100644
--- a/compiler/java/com/google/dart/compiler/ast/DartFunction.java
+++ b/compiler/java/com/google/dart/compiler/ast/DartFunction.java
@@ -23,7 +23,9 @@
       DartTypeNode returnTypeNode) {
     this.parametersOptionalOpen = parametersOptionalOpen;
     this.parametersOptionalClose = parametersOptionalClose;
-    this.parameters.addAll(parameters);
+    if (parameters != null && !parameters.isEmpty()) {
+      this.parameters.addAll(parameters);
+    }
     this.parametersCloseParen = parametersCloseParen;
     this.body = becomeParentOf(body);
     this.returnTypeNode = becomeParentOf(returnTypeNode);
diff --git a/compiler/java/com/google/dart/compiler/ast/DartIdentifier.java b/compiler/java/com/google/dart/compiler/ast/DartIdentifier.java
index 3f131a7..09eadc2 100644
--- a/compiler/java/com/google/dart/compiler/ast/DartIdentifier.java
+++ b/compiler/java/com/google/dart/compiler/ast/DartIdentifier.java
@@ -31,6 +31,12 @@
   }
 
   @Override
+  // Note: final added for performance reasons.
+  public final String toString() {
+    return name;
+  }
+
+  @Override
   public boolean isAssignable() {
     return true;
   }
@@ -60,7 +66,7 @@
   }
 
   @Override
-  public void visitChildren(ASTVisitor<?> visitor) {
+  public final void visitChildren(ASTVisitor<?> visitor) {
   }
 
   @Override
diff --git a/compiler/java/com/google/dart/compiler/ast/DartInvocation.java b/compiler/java/com/google/dart/compiler/ast/DartInvocation.java
index 4d81c28..477c4c3 100644
--- a/compiler/java/com/google/dart/compiler/ast/DartInvocation.java
+++ b/compiler/java/com/google/dart/compiler/ast/DartInvocation.java
@@ -39,7 +39,9 @@
   private NodeElement element;
 
   public DartInvocation(List<DartExpression> arguments) {
-    this.arguments.addAll(arguments);
+    if (arguments != null && !arguments.isEmpty()) {
+      this.arguments.addAll(arguments);
+    }
   }
 
   public DartExpression getTarget() {
diff --git a/compiler/java/com/google/dart/compiler/ast/DartNode.java b/compiler/java/com/google/dart/compiler/ast/DartNode.java
index 7368822..1c207817 100644
--- a/compiler/java/com/google/dart/compiler/ast/DartNode.java
+++ b/compiler/java/com/google/dart/compiler/ast/DartNode.java
@@ -41,7 +41,7 @@
   }
 
   @Override
-  public final String toString() {
+  public String toString() {
     return this.toSource();
   }
 
@@ -117,7 +117,10 @@
    * @param visitor the visitor that will be used to visit the child
    */
   protected void safelyVisitChild(DartNode child, ASTVisitor<?> visitor) {
-    if (child != null) {
+    // Inline the DartIdentifier path - it's by far the most common.
+    if (child instanceof DartIdentifier) {
+      visitor.visitIdentifier((DartIdentifier)child);
+    } else if (child != null) {
       child.accept(visitor);
     }
   }
diff --git a/compiler/java/com/google/dart/compiler/ast/DartPartOfDirective.java b/compiler/java/com/google/dart/compiler/ast/DartPartOfDirective.java
index d9bdbe0..9d55581 100644
--- a/compiler/java/com/google/dart/compiler/ast/DartPartOfDirective.java
+++ b/compiler/java/com/google/dart/compiler/ast/DartPartOfDirective.java
@@ -8,12 +8,18 @@
  * Implements the "part of" directive.
  */
 public class DartPartOfDirective extends DartDirective {
-  private DartExpression name;
+  private final int ofOffset;
+  private final DartExpression name;
 
-  public DartPartOfDirective(DartExpression name) {
+  public DartPartOfDirective(int ofOffset, DartExpression name) {
+    this.ofOffset = ofOffset;
     this.name = becomeParentOf(name);
   }
 
+  public int getOfOffset() {
+    return ofOffset;
+  }
+
   public DartExpression getName() {
     return name;
   }
diff --git a/compiler/java/com/google/dart/compiler/ast/DartSyntheticErrorIdentifier.java b/compiler/java/com/google/dart/compiler/ast/DartSyntheticErrorIdentifier.java
index 2e7e96c..55f780f 100644
--- a/compiler/java/com/google/dart/compiler/ast/DartSyntheticErrorIdentifier.java
+++ b/compiler/java/com/google/dart/compiler/ast/DartSyntheticErrorIdentifier.java
@@ -26,7 +26,4 @@
     return tokenString;
   }
 
-  @Override
-  public void visitChildren(ASTVisitor<?> visitor) {
-  }
 }
diff --git a/compiler/java/com/google/dart/compiler/ast/DartToSourceVisitor.java b/compiler/java/com/google/dart/compiler/ast/DartToSourceVisitor.java
index 2d4d80a..e913de9 100644
--- a/compiler/java/com/google/dart/compiler/ast/DartToSourceVisitor.java
+++ b/compiler/java/com/google/dart/compiler/ast/DartToSourceVisitor.java
@@ -255,7 +255,12 @@
       p(")");
     }
     if (x.getDefaultExpr() != null) {
-      p(" = ");
+      if (x.getModifiers().isOptional()) {
+        p(" = ");
+      }
+      if (x.getModifiers().isNamed()) {
+        p(" : ");
+      }
       accept(x.getDefaultExpr());
     }
     return null;
@@ -280,7 +285,7 @@
       p("set ");
     }
     // name
-    pFunctionDeclaration(x.getName(), func);
+    pFunctionDeclaration(x.getName(), func, !x.getModifiers().isGetter());
     p(" ");
     // initializers
     List<DartInitializer> inits = x.getInitializers();
@@ -338,31 +343,40 @@
     }
   }
 
-  private void pFunctionDeclaration(DartNode name, DartFunction x) {
+  private void pFunctionDeclaration(DartNode name, DartFunction x, boolean includeParameters) {
     if (name != null) {
       accept(name);
     }
-    p("(");
-    pFormalParameters(x.getParameters());
-    p(")");
+    if (includeParameters) {
+      p("(");
+      pFormalParameters(x.getParameters());
+      p(")");
+    }
   }
 
   private void pFormalParameters(List<DartParameter> params) {
-    boolean first = true, hasNamed = false;
+    boolean first = true, hasPositional = false, hasNamed = false;
     for (DartParameter param : params) {
       if (!first) {
         p(", ");
       }
+      if (!hasPositional && param.getModifiers().isOptional()) {
+        hasPositional = true;
+        p("[");
+      }
       if (!hasNamed && param.getModifiers().isNamed()) {
         hasNamed = true;
-        p("[");
+        p("{");
       }
       accept(param);
       first = false;
     }
-    if (hasNamed) {
+    if (hasPositional) {
       p("]");
     }
+    if (hasNamed) {
+      p("}");
+    }
   }
   
   @Override
@@ -793,7 +807,7 @@
       p(" ");
     }
     DartIdentifier name = x.getName();
-    pFunctionDeclaration(name, x.getFunction());
+    pFunctionDeclaration(name, x.getFunction(), true);
     p(" ");
     if (x.getFunction().getBody() != null) {
       pBlock(x.getFunction().getBody(), false);
diff --git a/compiler/java/com/google/dart/compiler/ast/DartUnit.java b/compiler/java/com/google/dart/compiler/ast/DartUnit.java
index 15c2537..063455e 100644
--- a/compiler/java/com/google/dart/compiler/ast/DartUnit.java
+++ b/compiler/java/com/google/dart/compiler/ast/DartUnit.java
@@ -24,6 +24,8 @@
   private final NodeList<DartComment> comments = NodeList.create(this);
   private final DartSource source;
   private final boolean isDiet;
+  
+  private boolean hasParseErrors;
 
   public DartUnit(DartSource source, boolean isDiet) {
     this.source = source;
@@ -69,6 +71,14 @@
     return isDiet;
   }
 
+  public void setHasParseErrors(boolean hasParseErrors) {
+    this.hasParseErrors = hasParseErrors;
+  }
+  
+  public boolean hasParseErrors() {
+    return hasParseErrors;
+  }
+
   /**
    * Answer the receiver's directives, not <code>null</code>.
    */
diff --git a/compiler/java/com/google/dart/compiler/ast/NodeList.java b/compiler/java/com/google/dart/compiler/ast/NodeList.java
index 2394de6..8eda6ba 100644
--- a/compiler/java/com/google/dart/compiler/ast/NodeList.java
+++ b/compiler/java/com/google/dart/compiler/ast/NodeList.java
@@ -48,8 +48,8 @@
    */
   public void accept(ASTVisitor<?> visitor) {
     if (elements != null) {
-      for (E element : elements) {
-        element.accept(visitor);
+      for (int i = 0, size = elements.size(); i < size; i++) {
+        elements.get(i).accept(visitor);
       }
     }
   }
diff --git a/compiler/java/com/google/dart/compiler/parser/AbstractParser.java b/compiler/java/com/google/dart/compiler/parser/AbstractParser.java
index 273313b..6295eb1 100644
--- a/compiler/java/com/google/dart/compiler/parser/AbstractParser.java
+++ b/compiler/java/com/google/dart/compiler/parser/AbstractParser.java
@@ -38,6 +38,7 @@
     private Map<String, List<Token>> methods;
 
     private void init(StackTraceElement[] stackTrace) {
+      // This method, she is slow.
       if (classes == null) {
         classes = Maps.newHashMap();
         methods = Maps.newHashMap();
diff --git a/compiler/java/com/google/dart/compiler/parser/CompletionHooksParserBase.java b/compiler/java/com/google/dart/compiler/parser/CompletionHooksParserBase.java
index eee7ee2..6be2ebe 100644
--- a/compiler/java/com/google/dart/compiler/parser/CompletionHooksParserBase.java
+++ b/compiler/java/com/google/dart/compiler/parser/CompletionHooksParserBase.java
@@ -240,6 +240,10 @@
   protected void beginImportDirective() {
     begin();
   }
+  
+  protected void beginImportCombinator() {
+    begin();
+  }
 
   protected void beginInitializer() {
     begin();
diff --git a/compiler/java/com/google/dart/compiler/parser/DartParser.java b/compiler/java/com/google/dart/compiler/parser/DartParser.java
index 4b51d39..41d3d9b 100644
--- a/compiler/java/com/google/dart/compiler/parser/DartParser.java
+++ b/compiler/java/com/google/dart/compiler/parser/DartParser.java
@@ -11,6 +11,7 @@
 import com.google.dart.compiler.DartCompilerListener;
 import com.google.dart.compiler.DartSource;
 import com.google.dart.compiler.ErrorCode;
+import com.google.dart.compiler.ErrorSeverity;
 import com.google.dart.compiler.InternalCompilerException;
 import com.google.dart.compiler.LibrarySource;
 import com.google.dart.compiler.PackageLibraryManager;
@@ -103,6 +104,7 @@
 import com.google.dart.compiler.ast.Modifiers;
 import com.google.dart.compiler.metrics.CompilerMetrics;
 import com.google.dart.compiler.parser.DartScanner.Location;
+import com.google.dart.compiler.resolver.Elements;
 import com.google.dart.compiler.util.Lists;
 import com.google.dart.compiler.util.apache.StringUtils;
 
@@ -143,7 +145,7 @@
   private static final String ABSTRACT_KEYWORD = "abstract";
   private static final String AS_KEYWORD = "as";
   private static final String CALL_KEYWORD = "call";
-  private static final String DYNAMIC_KEYWORD = "dynamic";
+  public static final String DYNAMIC_KEYWORD = "dynamic";
   private static final String EXPORT_KEYWORD = "export";
   private static final String EXTERNAL_KEYWORD = "external";
   private static final String FACTORY_KEYWORD = "factory";
@@ -331,6 +333,13 @@
         } else if (peekPseudoKeyword(0, INTERFACE_KEYWORD) && peek(1).equals(Token.IDENTIFIER)) {
           consume(Token.IDENTIFIER);
           isParsingInterface = true;
+          // TODO(scheglov) remove after http://code.google.com/p/dart/issues/detail?id=6318 
+          if (!Elements.isCoreLibrarySource(source)
+              && !Elements.isLibrarySource(source, "/isolate/isolate.dart")
+              && !Elements.isLibrarySource(source, "crypto/crypto.dart")
+              && !Elements.isDart2JsLibrarySource(source)) {
+            reportError(position(), ParserErrorCode.DEPRECATED_INTERFACE);
+          }
           node = done(parseClass());
         } else if (peekPseudoKeyword(0, TYPEDEF_KEYWORD)
             && (peek(1).equals(Token.IDENTIFIER) || peek(1).equals(Token.VOID) || peek(1).equals(Token.AS))) {
@@ -362,6 +371,7 @@
         DartParserCommentsHelper.addComments(unit, source, sourceCode, commentLocs);
       }
       // done
+      unit.setHasParseErrors(errorCount != 0);
       return done(unit);
     } catch (StringInterpolationParseError exception) {
       throw new InternalCompilerException("Failed to parse " + source.getUri(), exception);
@@ -374,19 +384,22 @@
    * @param node the node with which the metadata is to be associated
    * @param metadata the metadata to be associated with the node
    */
-  private void setMetadata(DartNodeWithMetadata node, List<DartAnnotation> metadata) {
-    node.setMetadata(metadata);
-    if (node instanceof DartDeclaration<?>) {
-      for (DartAnnotation annotation : metadata) {
-        DartExpression nameNode = annotation.getName();
-        if (nameNode instanceof DartIdentifier) {
-          String name = ((DartIdentifier) nameNode).getName();
-          if (name.equals("deprecated")) {
-            DartDeclaration<?> declaration = (DartDeclaration<?>) node;
-            declaration.setObsoleteMetadata(declaration.getObsoleteMetadata().makeDeprecated());
-          } else if (name.equals("override")) {
-            DartDeclaration<?> declaration = (DartDeclaration<?>) node;
-            declaration.setObsoleteMetadata(declaration.getObsoleteMetadata().makeOverride());
+  private void setMetadata(DartNodeWithMetadata node, List<DartAnnotation> annotations) {
+    if (annotations != null && !annotations.isEmpty()) {
+      node.setMetadata(annotations);
+      if (node instanceof DartDeclaration<?>) {
+        for (int i = 0, size = annotations.size(); i < size; i++) {
+          DartAnnotation annotation = annotations.get(i);
+          DartExpression nameNode = annotation.getName();
+          if (nameNode instanceof DartIdentifier) {
+            String name = ((DartIdentifier) nameNode).getName();
+            if (name.equals("deprecated")) {
+              DartDeclaration<?> declaration = (DartDeclaration<?>) node;
+              declaration.setObsoleteMetadata(declaration.getObsoleteMetadata().makeDeprecated());
+            } else if (name.equals("override")) {
+              DartDeclaration<?> declaration = (DartDeclaration<?>) node;
+              declaration.setObsoleteMetadata(declaration.getObsoleteMetadata().makeOverride());
+            }
           }
         }
       }
@@ -624,12 +637,13 @@
 
     List<ImportCombinator> combinators = new ArrayList<ImportCombinator>();
     while (peekPseudoKeyword(0, HIDE_KEYWORD) || peekPseudoKeyword(0, SHOW_KEYWORD)) {
+      beginImportCombinator();
       if (optionalPseudoKeyword(HIDE_KEYWORD)) {
         List<DartIdentifier> hiddenNames = parseIdentifierList();
-        combinators.add(new ImportHideCombinator(hiddenNames));
+        combinators.add(done(new ImportHideCombinator(hiddenNames)));
       } else if (optionalPseudoKeyword(SHOW_KEYWORD)) {
         List<DartIdentifier> shownNames = parseIdentifierList();
-        combinators.add(new ImportShowCombinator(shownNames));
+        combinators.add(done(new ImportShowCombinator(shownNames)));
       }
     }
 
@@ -760,9 +774,10 @@
     beginPartOfDirective();
     next(); // "part"
     next(); // "of"
+    int ofOffset=  position();
     DartExpression libraryName = parseLibraryName();
     expect(Token.SEMICOLON);
-    return done(new DartPartOfDirective(libraryName));
+    return done(new DartPartOfDirective(ofOffset, libraryName));
   }
 
   private void parseResourceDirective() {
@@ -914,6 +929,9 @@
    */
   private DartDeclaration<?> parseClass() {
     beginClassBody();
+    
+    int tokenOffset = ctx.getTokenLocation().getBegin();
+    int tokenLength = ctx.getTokenLocation().getEnd() - tokenOffset;
 
     // Parse modifiers.
     Modifiers modifiers = Modifiers.NONE;
@@ -936,6 +954,7 @@
 
     // Parse the extends and implements clauses.
     DartTypeNode superType = null;
+    int implementsOffset = -1;
     List<DartTypeNode> interfaces = null;
     if (isParsingInterface) {
       if (optional(Token.EXTENDS)) {
@@ -946,14 +965,18 @@
         superType = parseTypeAnnotation();
       }
       if (optionalPseudoKeyword(IMPLEMENTS_KEYWORD)) {
+        implementsOffset = position();
         interfaces = parseTypeAnnotationList();
       }
     }
 
     // Deal with factory clause for interfaces.
     DartParameterizedTypeNode defaultClass = null;
+    int defaultTokenOffset = -1;
     if (isParsingInterface &&
         (optionalDeprecatedFactory() || optional(Token.DEFAULT))) {
+      defaultTokenOffset = position();
+      beginTypeAnnotation();
       DartExpression qualified = parseQualified(false);
       List<DartTypeParameter> defaultTypeParameters = parseTypeParametersOpt();
       defaultClass = doneWithoutConsuming(new DartParameterizedTypeNode(qualified,
@@ -990,18 +1013,13 @@
     }
 
     if (isParsingInterface) {
-      return done(new DartClass(name, superType, interfaces, openBraceOffset, closeBraceOffset,
-          members, typeParameters, defaultClass));
+      return done(new DartClass(tokenOffset, tokenLength, name, superType, implementsOffset,
+          interfaces, defaultTokenOffset, openBraceOffset, closeBraceOffset, members,
+          typeParameters, defaultClass));
     } else {
-      return done(new DartClass(name,
-          nativeName,
-          superType,
-          interfaces,
-          openBraceOffset,
-          closeBraceOffset,
-          members,
-          typeParameters,
-          modifiers));
+      return done(new DartClass(tokenOffset, tokenLength, name, nativeName, superType,
+          implementsOffset, interfaces, defaultTokenOffset, openBraceOffset, closeBraceOffset,
+          members, typeParameters, modifiers));
     }
   }
 
@@ -1257,9 +1275,6 @@
       }
     }
     if (optionalPseudoKeyword(ABSTRACT_KEYWORD)) {
-      if (isParsingInterface) {
-        reportError(position(), ParserErrorCode.ABSTRACT_MEMBER_IN_INTERFACE);
-      }
       if (modifiers.isStatic()) {
         reportError(position(), ParserErrorCode.STATIC_MEMBERS_CANNOT_BE_ABSTRACT);
       }
@@ -1290,6 +1305,22 @@
         reportError(position(), ParserErrorCode.DISALLOWED_FACTORY_KEYWORD);
       }
     }
+    
+    // report "abstract" warning after all other checks to don't hide error with warning
+    // we ignore problems if there was already reported problem after given position
+    if (modifiers.isAbstract()) {
+      // TODO(scheglov) remove after http://code.google.com/p/dart/issues/detail?id=6322
+      // TODO(scheglov) remove after http://code.google.com/p/dart/issues/detail?id=6323
+      if (!Elements.isCoreLibrarySource(source)
+          && !Elements.isLibrarySource(source, "html/dartium/html_dartium.dart")
+          && !Elements.isLibrarySource(source, "/math/math.dart")
+          && !Elements.isLibrarySource(source, "/io/io_runtime.dart")
+          && !Elements.isLibrarySource(source, "/crypto/crypto.dart")
+          && !Elements.isLibrarySource(source, "/utf/utf.dart")
+          && !Elements.isDart2JsLibrarySource(source)) {
+        reportError(position(), ParserErrorCode.DEPRECATED_ABSTRACT_METHOD);
+      }
+    }
 
     if (modifiers.isFactory()) {
       if (!isParsingClass) {
@@ -1692,12 +1723,16 @@
 
     // Parse the parameters definitions.
     FormalParameters parametersInfo;
-    if (modifiers.isGetter() && peek(0) != Token.LPAREN) {
-      // TODO: For now the parameters are optional so that both the old and new style will be
-      // accepted, but eventually parameters should be disallowed.
+    if (modifiers.isGetter()) {
       parametersInfo = new FormalParameters(new ArrayList<DartParameter>(), -1, -1);
+      if (peek(0) == Token.LPAREN) {
+        // TODO(scheglov) remove after http://code.google.com/p/dart/issues/detail?id=6297
+        if (!Elements.isHtmlLibrarySource(source)) {
+          reportError(position(), ParserErrorCode.DEPRECATED_GETTER);
+        }
+        parametersInfo = parseFormalParameterList();
+      }
     } else {
-      //reportError(position(), ParserErrorCode.DEPRECATED_GETTER);
       parametersInfo = parseFormalParameterList();
     }
     List<DartParameter> parameters = parametersInfo.val;
@@ -1708,7 +1743,11 @@
         reportError(position(), ParserErrorCode.ILLEGAL_NUMBER_OF_PARAMETERS);
       }
       // In methods with required arity each parameter is required.
-      for (DartParameter parameter : parameters) {
+      for (int i = 0, size = parameters.size(); i < size; i++) {
+        DartParameter parameter = parameters.get(i);
+        if (parameter.getModifiers().isOptional()) {
+          reportError(parameter, ParserErrorCode.OPTIONAL_POSITIONAL_PARAMETER_NOT_ALLOWED);
+        }
         if (parameter.getModifiers().isNamed()) {
           reportError(parameter, ParserErrorCode.NAMED_PARAMETER_NOT_ALLOWED);
         }
@@ -1718,7 +1757,8 @@
         reportError(position(), ParserErrorCode.ILLEGAL_NUMBER_OF_PARAMETERS);
       }
       // In methods with required arity each parameter is required.
-      for (DartParameter parameter : parameters) {
+      for (int i = 0, size = parameters.size(); i < size; i++) {
+        DartParameter parameter = parameters.get(i);
         if (parameter.getModifiers().isNamed()) {
           reportError(parameter, ParserErrorCode.NAMED_PARAMETER_NOT_ALLOWED);
         }
@@ -2139,8 +2179,6 @@
 
     if (isOptional) {
       modifiers = modifiers.makeOptional();
-      // TODO(brianwilkerson) Remove the line below when we no longer need to support the old syntax.
-      modifiers = modifiers.makeNamed();
     }
     if (isNamed) {
       modifiers = modifiers.makeNamed();
@@ -2272,7 +2310,8 @@
    */
   private void validateNoDefaultParameterValues(List<DartParameter> parameters,
       ErrorCode errorCode) {
-    for (DartParameter parameter : parameters) {
+    for (int i = 0, size = parameters.size(); i < size; i++) {
+      DartParameter parameter = parameters.get(i);
       DartExpression defaultExpr = parameter.getDefaultExpr();
       if (defaultExpr != null) {
         reportError(defaultExpr,  errorCode);
@@ -4343,6 +4382,13 @@
       if (!optional(Token.LPAREN)) {
         return false;
       }
+      // if it looks as "(Type name, ....)" then it may be function expression
+      boolean hasTwoIdentifiersComma;
+      {
+        int nameOffset = skipTypeName(0);
+        hasTwoIdentifiersComma = nameOffset != -1 && peek(nameOffset + 0) == Token.IDENTIFIER
+            && peek(nameOffset + 1) == Token.COMMA;
+      }
       // find matching parenthesis
       int count = 1;
       while (count != 0) {
@@ -4357,7 +4403,7 @@
             break;
         }
       }
-      return (peek(0) == Token.ARROW || peek(0) == Token.LBRACE);
+      return (peek(0) == Token.ARROW || peek(0) == Token.LBRACE) || hasTwoIdentifiersComma;
     } finally {
       rollback();
     }
@@ -5319,8 +5365,11 @@
    * 
    * @return whether the current error should be reported
    */
-  private boolean incErrorCount() {
-    errorCount++;
+  private boolean incErrorCount(ErrorCode errorCode) {
+    // count only errors, but not warnings (such as "abstract")
+    if (errorCode.getErrorSeverity() == ErrorSeverity.ERROR) {
+      errorCount++;
+    }
     
     if (errorCount >= MAX_DEFAULT_ERRORS) {
       if (errorCount == MAX_DEFAULT_ERRORS) {
@@ -5345,7 +5394,7 @@
   @Override
   protected void reportError(int position, ErrorCode errorCode, Object... arguments) {
     // TODO(devoncarew): we're not correctly identifying dart:html as a core library
-    if (incErrorCount()) {
+    if (incErrorCount(errorCode)) {
       super.reportError(position, errorCode, arguments);
     }
   }
@@ -5353,13 +5402,13 @@
   @Override
   protected void reportErrorAtPosition(int startPosition, int endPosition,
       ErrorCode errorCode, Object... arguments) {
-    if (incErrorCount()) {
+    if (incErrorCount(errorCode)) {
       super.reportErrorAtPosition(startPosition, endPosition, errorCode, arguments);
     }
   }
 
   private void reportError(DartCompilationError dartError) {
-    if (incErrorCount()) {
+    if (incErrorCount(dartError.getErrorCode())) {
       ctx.error(dartError);
       errorHistory.add(dartError.hashCode());
     }
diff --git a/compiler/java/com/google/dart/compiler/parser/ParserErrorCode.java b/compiler/java/com/google/dart/compiler/parser/ParserErrorCode.java
index 645c7a0..0e3a536 100644
--- a/compiler/java/com/google/dart/compiler/parser/ParserErrorCode.java
+++ b/compiler/java/com/google/dart/compiler/parser/ParserErrorCode.java
@@ -33,8 +33,10 @@
   DEFAULT_POSITIONAL_PARAMETER("Positional parameters cannot have default values"),
   DEPRECATED_CATCH("This style of catch clause has been deprecated. Please use the 'on' <type> " +
       "'catch' '(' <identifier> (',' <identifier>)? ')' form."),
-  DEPRECATED_GETTER(ErrorSeverity.WARNING, "The presence of parentheses afer the name of the getter "
+  DEPRECATED_ABSTRACT_METHOD(ErrorSeverity.WARNING, "Modifier 'abstract' is deprecated for methods without body. Remove it."),
+  DEPRECATED_GETTER("The presence of parentheses after the name of the getter "
       + "has been deprecated and will soon be disallowed. Please remove the parentheses."),
+  DEPRECATED_INTERFACE("Deprecated declaration of the 'interface', use abstract 'class' instead"),
   DEPRECATED_USE_OF_FACTORY_KEYWORD("Deprecated use of the 'factory' keyword: use 'default' instead"),
   DEPRECATED_RAW_STRING("The use of '@' to prefix a raw string has been deprecated; use 'r' instead"),
   DEPRECATED_RESOURCE_DIRECTIVE("The #resource directive has been deprecated and will soon be disallowed"),
@@ -73,9 +75,9 @@
   EXPECTED_TOKEN("Unexpected token '%s' (expected '%s')"),
   // TODO(zundel): error message needs JUnit test
   EXPECTED_VAR_FINAL_OR_TYPE("Expected 'var', 'final' or type"),
+  EXTERNAL_ABSTRACT("External methods cannot be abstract"),
   EXTERNAL_ONLY_METHOD("Only a top-level function, a method, a getter, a setter or an non-redirecting constructor can be specified as external"),
   EXTERNAL_METHOD_BODY("External methods cannot have body"),
-  EXTERNAL_ABSTRACT("External methods cannot be abstract"),
   INVALID_SEPARATOR_FOR_NAMED("Use ':' between a named parameter and its value"),
   INVALID_SEPARATOR_FOR_OPTIONAL("Use '=' between an optional parameter and its value"),
   // TODO(zundel): this error message is out of date
@@ -117,6 +119,7 @@
   ONLY_ONE_LIBRARY_DIRECTIVE("Only one library directive may be declared in a file"),
   OPERATOR_CANNOT_BE_STATIC("Operators cannot be static"),
   OPERATOR_IS_NOT_USER_DEFINABLE("Operator is not user definable"),
+  OPTIONAL_POSITIONAL_PARAMETER_NOT_ALLOWED("Optional positional parameter is not allowed for operator or setter method"),
   POSITIONAL_AFTER_NAMED_ARGUMENT("Positional argument after named argument"),
   REDIRECTING_CONSTRUCTOR_CANNOT_HAVE_A_BODY("Redirecting constructor cannot have a body"),
   REDIRECTING_CONSTRUCTOR_PARAM("Redirecting constructor cannot have initializers"),
diff --git a/compiler/java/com/google/dart/compiler/resolver/ClassScope.java b/compiler/java/com/google/dart/compiler/resolver/ClassScope.java
index 5c39d05..a1b9a5b 100644
--- a/compiler/java/com/google/dart/compiler/resolver/ClassScope.java
+++ b/compiler/java/com/google/dart/compiler/resolver/ClassScope.java
@@ -7,6 +7,7 @@
 import com.google.dart.compiler.type.InterfaceType;
 
 import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
 
 /**
@@ -54,7 +55,10 @@
         }
       }
     }
-    for (InterfaceType supertype : classElement.getInterfaces()) {
+    
+    List<InterfaceType> interfaces = classElement.getInterfaces();
+    for (int i = 0, size = interfaces.size(); i < size; i++) {
+      InterfaceType supertype = interfaces.get(i);
       Element enclosing = supertype.getElement().getEnclosingElement();
       ClassElement superclassElement = supertype.getElement();
       if (!examinedTypes.contains(superclassElement)) {
diff --git a/compiler/java/com/google/dart/compiler/resolver/Elements.java b/compiler/java/com/google/dart/compiler/resolver/Elements.java
index de23bb9..55f1401 100644
--- a/compiler/java/com/google/dart/compiler/resolver/Elements.java
+++ b/compiler/java/com/google/dart/compiler/resolver/Elements.java
@@ -446,7 +446,21 @@
     int num = 0;
     List<VariableElement> parameters = method.getParameters();
     for (VariableElement parameter : parameters) {
-      if (!parameter.isNamed()) {
+      if (!parameter.isOptional() && !parameter.isNamed()) {
+        num++;
+      }
+    }
+    return num;
+  }
+  
+  /**
+   * @return the number of optional positional parameters in given {@link MethodElement}.
+   */
+  public static int getNumberOfOptionalPositionalParameters(MethodElement method) {
+    int num = 0;
+    List<VariableElement> parameters = method.getParameters();
+    for (VariableElement parameter : parameters) {
+      if (parameter.isOptional()) {
         num++;
       }
     }
@@ -713,6 +727,21 @@
     }
     return false;
   }
+  
+  /**
+   * @return <code>true</code> if given {@link Source} represents library with given name.
+   */
+  public static boolean isDart2JsLibrarySource(Source source) {
+    if (source instanceof DartSource) {
+      DartSource dartSource = (DartSource) source;
+      LibrarySource library = dartSource.getLibrary();
+      if (library != null) {
+        String libraryName = library.getName();
+        return libraryName.contains("lib/compiler/implementation/");
+      }
+    }
+    return false;
+  }
 
   /**
    * @return <code>true</code> if given {@link Source} represents code library declaration or
@@ -727,6 +756,10 @@
         || Elements.isLibrarySource(source, "/core/core.dart")
         || Elements.isLibrarySource(source, "/core/coreimpl.dart");
   }
+  
+  public static boolean isHtmlLibrarySource(Source source) {
+    return Elements.isLibrarySource(source, "/html/dartium/html_dartium.dart");
+  }
 
   /**
    * @return the {@link LibraryElement} which declares given {@link Element}.
diff --git a/compiler/java/com/google/dart/compiler/resolver/MemberBuilder.java b/compiler/java/com/google/dart/compiler/resolver/MemberBuilder.java
index 12e7ce1..8953c4d 100644
--- a/compiler/java/com/google/dart/compiler/resolver/MemberBuilder.java
+++ b/compiler/java/com/google/dart/compiler/resolver/MemberBuilder.java
@@ -557,9 +557,9 @@
      * Checks that top-level "main()" has no parameters.
      */
     private void checkTopLevelMainFunction(DartMethodDefinition method) {
-      if (Objects.equal(method.getName().toSource(), "main")
+      if (!method.getFunction().getParameters().isEmpty()
           && currentHolder instanceof LibraryElement
-          && !method.getFunction().getParameters().isEmpty()) {
+          && Objects.equal(method.getName().toString(), "main")) {
         resolutionError(method.getName(), ResolverErrorCode.MAIN_FUNCTION_PARAMETERS);
       }
     }
diff --git a/compiler/java/com/google/dart/compiler/resolver/ResolveVisitor.java b/compiler/java/com/google/dart/compiler/resolver/ResolveVisitor.java
index 666b0e9..ad1da78 100644
--- a/compiler/java/com/google/dart/compiler/resolver/ResolveVisitor.java
+++ b/compiler/java/com/google/dart/compiler/resolver/ResolveVisitor.java
@@ -55,10 +55,15 @@
     Elements.setType(element, type);
     for (DartParameter parameter : node.getParameters()) {
       if (!(parameter.getQualifier() instanceof DartThisExpression) &&
-          parameter.getModifiers().isNamed() &&
           DartIdentifier.isPrivateName(parameter.getElement().getName())) {
-        getContext().onError(parameter.getName(),
-            ResolverErrorCode.NAMED_PARAMETERS_CANNOT_START_WITH_UNDER);
+        if (parameter.getModifiers().isOptional()) {
+          getContext().onError(parameter.getName(),
+              ResolverErrorCode.OPTIONAL_PARAMETERS_CANNOT_START_WITH_UNDER);
+        }
+        if (parameter.getModifiers().isNamed()) {
+          getContext().onError(parameter.getName(),
+              ResolverErrorCode.NAMED_PARAMETERS_CANNOT_START_WITH_UNDER);
+        }
       }
     }
     return element;
diff --git a/compiler/java/com/google/dart/compiler/resolver/Resolver.java b/compiler/java/com/google/dart/compiler/resolver/Resolver.java
index b95c726..9edadea 100644
--- a/compiler/java/com/google/dart/compiler/resolver/Resolver.java
+++ b/compiler/java/com/google/dart/compiler/resolver/Resolver.java
@@ -84,7 +84,6 @@
 import com.google.dart.compiler.type.TypeKind;
 import com.google.dart.compiler.type.TypeVariable;
 import com.google.dart.compiler.type.Types;
-import com.google.dart.compiler.util.apache.StringUtils;
 
 import java.util.EnumSet;
 import java.util.Iterator;
@@ -281,10 +280,15 @@
           if (parameter.getQualifier() instanceof DartThisExpression) {
             onError(parameter.getName(), ResolverErrorCode.PARAMETER_INIT_OUTSIDE_CONSTRUCTOR);
           } else {
-            if (parameter.getModifiers().isNamed()
-                && DartIdentifier.isPrivateName(parameter.getElement().getName())) {
-              onError(parameter.getName(),
-                  ResolverErrorCode.NAMED_PARAMETERS_CANNOT_START_WITH_UNDER);
+            if (DartIdentifier.isPrivateName(parameter.getElement().getName())) {
+              if (parameter.getModifiers().isOptional()) {
+                onError(parameter.getName(),
+                    ResolverErrorCode.OPTIONAL_PARAMETERS_CANNOT_START_WITH_UNDER);
+              }
+              if (parameter.getModifiers().isNamed()) {
+                onError(parameter.getName(),
+                    ResolverErrorCode.NAMED_PARAMETERS_CANNOT_START_WITH_UNDER);
+              }
             }
             getContext().declare(parameter.getElement(), ResolverErrorCode.DUPLICATE_PARAMETER);
           }
@@ -374,14 +378,6 @@
 
         // Make sure the default class matches the interface type parameters
         checkInterfaceTypeParamsToDefault(classElement, defaultClass);
-
-        // Check that interface constructors have corresponding methods in default class.
-        checkInterfaceConstructors(classElement);
-      } else if (classElement.isInterface() && classElement.getConstructors() != null) {
-        for (ConstructorElement interfaceConstructor : classElement.getConstructors()) {
-          onError(interfaceConstructor.getNameLocation(),
-                  ResolverErrorCode.ILLEGAL_CONSTRUCTOR_NO_DEFAULT_IN_INTERFACE);
-        }
       }
 
       if (!classElement.isInterface() && Elements.needsImplicitDefaultConstructor(classElement)) {
@@ -545,57 +541,6 @@
     }
 
     /**
-     * Checks that interface constructors have corresponding methods in default class.
-     */
-    private void checkInterfaceConstructors(ClassElement interfaceElement) {
-      String interfaceClassName = interfaceElement.getName();
-      String defaultClassName = interfaceElement.getDefaultClass().getElement().getName();
-
-      for (ConstructorElement interfaceConstructor : interfaceElement.getConstructors()) {
-        ConstructorElement defaultConstructor =
-            resolveInterfaceConstructorInDefaultClass(
-                interfaceConstructor,
-                interfaceConstructor);
-        if (defaultConstructor != null) {
-          // Remember for TypeAnalyzer.
-          interfaceConstructor.setDefaultConstructor(defaultConstructor);
-          // Validate number of required parameters.
-          {
-            int numReqInterface = Elements.getNumberOfRequiredParameters(interfaceConstructor);
-            int numReqDefault = Elements.getNumberOfRequiredParameters(defaultConstructor);
-            if (numReqInterface != numReqDefault) {
-              onError(
-                  interfaceConstructor,
-                  ResolverErrorCode.DEFAULT_CONSTRUCTOR_NUMBER_OF_REQUIRED_PARAMETERS,
-                  Elements.getRawMethodName(interfaceConstructor),
-                  interfaceClassName,
-                  numReqInterface,
-                  Elements.getRawMethodName(defaultConstructor),
-                  defaultClassName,
-                  numReqDefault);
-            }
-          }
-          // Validate names of named parameters.
-          {
-            List<String> interfaceNames = Elements.getNamedParameters(interfaceConstructor);
-            List<String> defaultNames = Elements.getNamedParameters(defaultConstructor);
-            if (!interfaceNames.equals(defaultNames)) {
-              onError(
-                  interfaceConstructor,
-                  ResolverErrorCode.DEFAULT_CONSTRUCTOR_NAMED_PARAMETERS,
-                  Elements.getRawMethodName(interfaceConstructor),
-                  interfaceClassName,
-                  interfaceNames,
-                  Elements.getRawMethodName(defaultConstructor),
-                  defaultClassName,
-                  defaultNames);
-            }
-          }
-        }
-      }
-    }
-
-    /**
      * Returns <code>true</code> if the {@link ClassElement} has an implicit or a declared
      * default constructor.
      */
@@ -1696,9 +1641,6 @@
       // Will check that element is not null.
       ConstructorElement constructor = checkIsConstructor(x, element);
 
-      // try to lookup the constructor in the default class.
-      constructor = resolveInterfaceConstructorInDefaultClass(x.getConstructor(), constructor);
-
       // Check constructor.
       if (constructor != null) {
         boolean constConstructor = constructor.getModifiers().isConstant();
@@ -1721,87 +1663,6 @@
       return recordElement(x, constructor);
     }
 
-    /**
-     * If given {@link ConstructorElement} is declared in interface, try to resolve it in
-     * corresponding default class.
-     *
-     * @return the resolved {@link ConstructorElement}, or same as given.
-     */
-    private ConstructorElement resolveInterfaceConstructorInDefaultClass(HasSourceInfo errorTarget,
-        ConstructorElement constructor) {
-      // If no default class, use existing constructor.
-      if (constructor == null || constructor.getConstructorType().getDefaultClass() == null) {
-        return constructor;
-      }
-      // Prepare elements and names for classes.
-      ClassElement originalClass = constructor.getConstructorType();
-      ClassElement defaultClass = originalClass.getDefaultClass().getElement();
-      String originalClassName = originalClass.getName();
-      String defaultClassName = defaultClass.getName();
-      // Prepare "qualifier.name" for original constructor.
-      String rawOriginalMethodName = Elements.getRawMethodName(constructor);
-      int originalDotIndex = rawOriginalMethodName.indexOf('.');
-      String originalQualifier = StringUtils.substringBefore(rawOriginalMethodName, ".");
-      String originalName = StringUtils.substringAfter(rawOriginalMethodName, ".");
-      // Separate checks for cases when factory implements interface and not.
-      boolean factoryImplementsInterface = Elements.implementsType(defaultClass, originalClass);
-      if (factoryImplementsInterface) {
-        for (ConstructorElement defaultConstructor : defaultClass.getConstructors()) {
-          String rawDefaultMethodName = Elements.getRawMethodName(defaultConstructor);
-          // kI == nI and kF == nF
-          if (rawOriginalMethodName.equals(originalClassName)
-              && rawDefaultMethodName.equals(defaultClassName)) {
-            return defaultConstructor;
-          }
-          // kI == nI.name and kF == nF.name
-          if (originalDotIndex != -1) {
-            int defaultDotIndex = rawDefaultMethodName.indexOf('.');
-            if (defaultDotIndex != -1) {
-              String defaultQualifier = StringUtils.substringBefore(rawDefaultMethodName, ".");
-              String defaultName = StringUtils.substringAfter(rawDefaultMethodName, ".");
-              if (defaultQualifier.equals(defaultClassName)
-                  && originalQualifier.equals(originalClassName)
-                  && defaultName.equals(originalName)) {
-                return defaultConstructor;
-              }
-            }
-          }
-        }
-      } else {
-        for (ConstructorElement defaultConstructor : defaultClass.getConstructors()) {
-          String rawDefaultMethodName = Elements.getRawMethodName(defaultConstructor);
-          if (rawDefaultMethodName.equals(rawOriginalMethodName)) {
-            return defaultConstructor;
-          }
-        }
-      }
-      // If constructor not found, try implicit default constructor of the default class.
-      if (Elements.isDefaultConstructor(constructor)
-          && (Elements.isSyntheticConstructor(constructor) || factoryImplementsInterface)
-          && Elements.needsImplicitDefaultConstructor(defaultClass)) {
-        return new SyntheticDefaultConstructorElement(null, defaultClass, typeProvider);
-      }
-      // Factory constructor not resolved, report error with specific message for each case.
-      {
-        String expectedFactoryConstructorName;
-        if (factoryImplementsInterface) {
-          if (originalDotIndex == -1) {
-            expectedFactoryConstructorName = defaultClassName;
-          } else {
-            expectedFactoryConstructorName = defaultClassName + "." + originalName;
-          }
-        } else {
-          expectedFactoryConstructorName = rawOriginalMethodName;
-        }
-        onError(
-            errorTarget,
-            ResolverErrorCode.DEFAULT_CONSTRUCTOR_UNRESOLVED,
-            expectedFactoryConstructorName,
-            defaultClassName);
-        return null;
-      }
-    }
-
     @Override
     public Element visitGotoStatement(DartGotoStatement x) {
       // Don't bother unless there's a target.
@@ -2220,14 +2081,7 @@
         if (superCall != null) {
 
           // Do positional parameters match?
-          List<VariableElement> superParameters = superCall.getParameters();
-          // Count the number of positional parameters required by super call
-          int superPositionalCount = 0;
-          for (; superPositionalCount < superParameters.size(); superPositionalCount++) {
-            if (superParameters.get(superPositionalCount).isNamed()) {
-              break;
-            }
-          }
+          int superPositionalCount = Elements.getNumberOfRequiredParameters(superCall);
           if (superPositionalCount > 0) {
             onError(node, ResolverErrorCode.TOO_FEW_ARGUMENTS_IN_IMPLICIT_SUPER,
                 superCall.getType().toString());
diff --git a/compiler/java/com/google/dart/compiler/resolver/ResolverErrorCode.java b/compiler/java/com/google/dart/compiler/resolver/ResolverErrorCode.java
index 7b7c295..b081100 100644
--- a/compiler/java/com/google/dart/compiler/resolver/ResolverErrorCode.java
+++ b/compiler/java/com/google/dart/compiler/resolver/ResolverErrorCode.java
@@ -34,8 +34,8 @@
   CANNOT_OVERRIDE_INSTANCE_MEMBER("static member cannot override instance member %s of %s"),
   CANNOT_OVERRIDE_METHOD_NUM_REQUIRED_PARAMS(
       "cannot override method %s from %s, wrong number of required parameters"),
-  CANNOT_OVERRIDE_METHOD_NAMED_PARAMS(
-      "cannot override method %s, named parameters don't match"),
+  CANNOT_OVERRIDE_METHOD_NAMED_PARAMS("cannot override method %s, named parameters don't match"),
+  CANNOT_OVERRIDE_METHOD_OPTIONAL_PARAMS("cannot override method %s, optional positional parameters don't match"),
   CANNOT_RESOLVE_CONSTRUCTOR("cannot resolve constructor %s"),
   CANNOT_RESOLVE_FIELD("cannot resolve field %s"),
   CANNOT_RESOLVE_LABEL("cannot resolve label %s"),
@@ -77,6 +77,8 @@
   DEFAULT_CONSTRUCTOR_UNRESOLVED("Cannot resolve constructor with name '%s' in default class '%s'"),
   DEFAULT_CONSTRUCTOR_NUMBER_OF_REQUIRED_PARAMETERS(
       "Constructor '%s' in '%s' has %s required parameters, doesn't match '%s' in '%s' with %s"),
+  DEFAULT_CONSTRUCTOR_OPTIONAL_POSITIONAL_PARAMETERS(
+      "Constructor '%s' in '%s' has %s optional positional parameters, doesn't match '%s' in '%s' with %s"),
   DEFAULT_CONSTRUCTOR_NAMED_PARAMETERS(
       "Constructor '%s' in '%s' has named parameters %s, doesn't match '%s' in '%s' with %s"),
   DEFAULT_MUST_SPECIFY_CLASS("default must indicate a class, not an interface"),
@@ -123,8 +125,6 @@
   ILLEGAL_ACCESS_TO_PRIVATE("'%s' is private and not defined in this library"),
   // TODO(zundel): error message needs JUnit test - how to test #imports in junit?
   ILLEGAL_ACCESS_TO_PRIVATE_MEMBER("\"%s\" refers to \"%s\" which is in a different library"),
-  ILLEGAL_CONSTRUCTOR_NO_DEFAULT_IN_INTERFACE(
-      "Illegal constructor declaration.  No default clause in interface"),
   ILLEGAL_FIELD_ACCESS_FROM_STATIC("Illegal access of instance field %s from static scope"),
   ILLEGAL_METHOD_ACCESS_FROM_STATIC("Illegal access of instance method %s from static scope"),
   INIT_FIELD_ONLY_IMMEDIATELY_SURROUNDING_CLASS(
@@ -170,7 +170,7 @@
   NOT_A_TYPE("type \"%s\" expected, but \"%s\" found"),
   // TODO(zundel): error message needs JUnit test (reachable code?)
   NOT_AN_INSTANCE_FIELD("%s is not an instance field"),
-  REDIRECTED_CONSTRUCTOR_CYCLE("Redirected constructor call has a cycle."),
+  OPTIONAL_PARAMETERS_CANNOT_START_WITH_UNDER("Optional parameters cannot start with an '_' character"),
   PARAMETER_INIT_OUTSIDE_CONSTRUCTOR("Parameter initializers can only be used in constructors"),
   SUPER_METHOD_INVOCATION_IN_CONSTRUCTOR_INITIALIZER(
       "Super method invocation is not allowed in constructor initializer"),
@@ -181,6 +181,7 @@
       "Parameter initializers cannot be used with redirected constructors"),
   // TODO(zundel): error message needs JUnit test
   PARAMETER_NOT_MATCH_FIELD("Could not match parameter initializer '%s' with any field"),
+  REDIRECTED_CONSTRUCTOR_CYCLE("Redirected constructor call has a cycle."),
   REDIRECTION_CONSTRUCTOR_TARGET_TYPE(
       "Target of redirecting factory constructor is not a type"),
   REDIRECTION_CONSTRUCTOR_TARGET_MUST_BE_CONST(
diff --git a/compiler/java/com/google/dart/compiler/resolver/Scope.java b/compiler/java/com/google/dart/compiler/resolver/Scope.java
index a20d7ee..3655f4e 100644
--- a/compiler/java/com/google/dart/compiler/resolver/Scope.java
+++ b/compiler/java/com/google/dart/compiler/resolver/Scope.java
@@ -27,7 +27,6 @@
   private final String name;
   private List<LabelElement> labels;
   private LibraryElement library;
-  private boolean stateProgress;
   private boolean stateReady;
 
   @VisibleForTesting
diff --git a/compiler/java/com/google/dart/compiler/resolver/TypeErrorCode.java b/compiler/java/com/google/dart/compiler/resolver/TypeErrorCode.java
index 068c897..36c182d 100644
--- a/compiler/java/com/google/dart/compiler/resolver/TypeErrorCode.java
+++ b/compiler/java/com/google/dart/compiler/resolver/TypeErrorCode.java
@@ -51,6 +51,7 @@
   NO_SUCH_NAMED_PARAMETER("no such named parameter \"%s\" defined"),
   NO_SUCH_TYPE("no such type \"%s\"", true),
   NOT_A_FUNCTION_TYPE("\"%s\" is not a function type"),
+  NOT_A_FUNCTION_TYPE_FIELD("'%s' is a field of type '%s', not a function; remove parentheses"),
   NOT_A_MEMBER_OF("\"%s\" is not a member of %s"),
   NOT_A_MEMBER_OF_INFERRED(ErrorSeverity.INFO, "\"%s\" is not a member of %s"),
   NOT_A_METHOD_IN("\"%s\" is not a method in %s"),
diff --git a/compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java b/compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java
index 3ccd7e2..454b0b0 100644
--- a/compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java
+++ b/compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java
@@ -32,6 +32,7 @@
 import com.google.dart.compiler.ast.DartBlock;
 import com.google.dart.compiler.ast.DartBooleanLiteral;
 import com.google.dart.compiler.ast.DartBreakStatement;
+import com.google.dart.compiler.ast.DartCascadeExpression;
 import com.google.dart.compiler.ast.DartCase;
 import com.google.dart.compiler.ast.DartCatchBlock;
 import com.google.dart.compiler.ast.DartClass;
@@ -127,6 +128,7 @@
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Iterator;
+import java.util.LinkedHashMap;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
@@ -773,7 +775,9 @@
             // if we fell back to Dynamic, keep it
           } else {
             Type unionType = getUnionType(currentType, inferredType);
-            unionType = Types.makeInferred(unionType);
+            if (unionType != currentType) {
+              unionType = Types.makeInferred(unionType);
+            }
             blockOldTypes.getFirst().rememberOldType(element, element.getType());
             Elements.setType(element, unionType);
           }
@@ -784,21 +788,25 @@
        * @return the {@link Type} which is both "a" and "b" types. May be "dynamic" if "a" and "b"
        *         don't form hierarchy.
        */
-      Type getUnionType(Type a, Type b) {
-        if (TypeKind.of(a) == TypeKind.DYNAMIC) {
-          return b;
+      Type getUnionType(Type curType, Type newType) {
+        if (TypeKind.of(curType) == TypeKind.DYNAMIC) {
+          return newType;
         }
-        if (TypeKind.of(b) == TypeKind.DYNAMIC) {
-          return a;
+        if (TypeKind.of(newType) == TypeKind.DYNAMIC) {
+          return curType;
         }
-        if (types.isSubtype(a, b)) {
-          return a;
+        if (types.isSubtype(curType, newType)) {
+          return curType;
         }
-        if (types.isSubtype(b, a)) {
-          return b;
+        if (types.isSubtype(newType, curType)) {
+          return newType;
         }
-        // TODO(scheglov) return union of types, but this is not easy
-        return dynamicType;
+        // if InterfaceType, use union
+        if (curType instanceof InterfaceType && newType instanceof InterfaceType) {
+          return types.unionTypes(ImmutableList.of((InterfaceType) curType, (InterfaceType) newType));
+        }
+        // keep type as is
+        return curType;
       }
 
       void restore() {
@@ -1063,7 +1071,7 @@
               if (Elements.isFieldWithGetter(field)) {
                 Type fieldType = field.getType();
                 if (!types.isAssignable(functionType, fieldType)) {
-                  onError(diagnosticNode, TypeErrorCode.NOT_A_FUNCTION_TYPE, fieldType);
+                  onError(diagnosticNode, TypeErrorCode.NOT_A_FUNCTION_TYPE_FIELD, field.getName(), fieldType);
                 }
               }
               return dynamicType;
@@ -1137,14 +1145,13 @@
       }
 
       // Check optional parameters.
-      // TODO(scheglov) currently this block does not work,
-      // because we handle all optional parameter as named
       {
         Map<String, Type> optionalParameterTypes = ftype.getOptionalParameterTypes();
         Iterator<Entry<String, Type>> optionalParameterTypesIterator =
             optionalParameterTypes.entrySet().iterator();
         while (optionalParameterTypesIterator.hasNext()
-            && argumentTypes.hasNext()) {
+            && argumentTypes.hasNext()
+            && !(argumentNodes.get(argumentIndex) instanceof DartNamedExpression)) {
           Entry<String, Type> namedEntry = optionalParameterTypesIterator.next();
           Type optionalType = namedEntry.getValue();
           optionalType.getClass(); // quick null check
@@ -1171,28 +1178,28 @@
         Map<String, Type> namedParameterTypes = ftype.getNamedParameterTypes();
         Iterator<Entry<String, Type>> namedParameterTypesIterator =
             namedParameterTypes.entrySet().iterator();
-        // Check positional arguments for named parameters.
-        while (namedParameterTypesIterator.hasNext()
-            && argumentTypes.hasNext()
-            && !(argumentNodes.get(argumentIndex) instanceof DartNamedExpression)) {
-          Entry<String, Type> namedEntry = namedParameterTypesIterator.next();
-          String parameterName = namedEntry.getKey();
-          usedNamedParametersPositional.add(parameterName);
-          Type namedType = namedEntry.getValue();
-          namedType.getClass(); // quick null check
-          Type argumentType = argumentTypes.next();
-          argumentType.getClass(); // quick null check
-          DartExpression argumentNode = argumentNodes.get(argumentIndex);
-          if (parameters != null) {
-            argumentNode.setInvocationParameterId(parameters.get(argumentIndex));
-          } else {
-            argumentNode.setInvocationParameterId(argumentIndex);
-          }
-          if (checkAssignable(argumentNode, namedType, argumentType)) {
-            inferFunctionLiteralParametersTypes(argumentNode, namedType);
-          }
-          argumentIndex++;
-        }
+//        // Check positional arguments for named parameters.
+//        while (namedParameterTypesIterator.hasNext()
+//            && argumentTypes.hasNext()
+//            && !(argumentNodes.get(argumentIndex) instanceof DartNamedExpression)) {
+//          Entry<String, Type> namedEntry = namedParameterTypesIterator.next();
+//          String parameterName = namedEntry.getKey();
+//          usedNamedParametersPositional.add(parameterName);
+//          Type namedType = namedEntry.getValue();
+//          namedType.getClass(); // quick null check
+//          Type argumentType = argumentTypes.next();
+//          argumentType.getClass(); // quick null check
+//          DartExpression argumentNode = argumentNodes.get(argumentIndex);
+//          if (parameters != null) {
+//            argumentNode.setInvocationParameterId(parameters.get(argumentIndex));
+//          } else {
+//            argumentNode.setInvocationParameterId(argumentIndex);
+//          }
+//          if (checkAssignable(argumentNode, namedType, argumentType)) {
+//            inferFunctionLiteralParametersTypes(argumentNode, namedType);
+//          }
+//          argumentIndex++;
+//        }
         // Check named arguments for named parameters.
         while (argumentTypes.hasNext()
             && argumentNodes.get(argumentIndex) instanceof DartNamedExpression) {
@@ -1436,6 +1443,14 @@
     }
 
     @Override
+    public Type visitCascadeExpression(DartCascadeExpression node) {
+      DartExpression target = node.getTarget();
+      Type type = nonVoidTypeOf(target);
+      node.visitChildren(this);
+      return type;
+    }
+
+    @Override
     public Type visitFunctionObjectInvocation(DartFunctionObjectInvocation node) {
       ClassElement element = functionType.getElement();
       node.setElement(element);
@@ -2947,6 +2962,7 @@
         referencedTypes.add(type.getReturnType());
         // parameters
         referencedTypes.addAll(type.getParameterTypes());
+        referencedTypes.addAll(type.getOptionalParameterTypes().values());
         referencedTypes.addAll(type.getNamedParameterTypes().values());
       }
       // check that referenced types do not have references on "target"
@@ -3328,64 +3344,161 @@
         List<VariableElement> superParameters = superMethod.getParameters();
         // Number of required parameters should be same.
         {
-          int numRequired = getNumRequiredParameters(parameters);
-          int superNumRequired = getNumRequiredParameters(superParameters);
+          int numRequired = Elements.getNumberOfRequiredParameters(method);
+          int superNumRequired = Elements.getNumberOfRequiredParameters(superMethod);
           if (numRequired != superNumRequired) {
-            StringBuilder builder = new StringBuilder();
-            builder.append(method.getName());
-            builder.append("(");
-            boolean inNamed = false;
-            int parameterCount = superParameters.size();
-            for (int i = 0; i < parameterCount; i++) {
-              if (i > 0) {
-                builder.append(", ");
-              }
-              VariableElement parameter = superParameters.get(i);
-              if (!inNamed && parameter.isNamed()) {
-                builder.append("[");
-                inNamed = true;
-              }
-              builder.append(parameter.getType().toString());
-            }
-            if (inNamed) {
-              builder.append("]");
-            }
-            builder.append(")");
             onError(errorTarget,
                     ResolverErrorCode.CANNOT_OVERRIDE_METHOD_NUM_REQUIRED_PARAMS,
-                    builder.toString(),
+                    getMethodSignature(superMethod),
                     superMethod.getEnclosingElement().getName());
             return false;
           }
         }
-        // "method" should have at least all named parameters of "superMethod" in the same order.
-        List<VariableElement> named = getNamedParameters(parameters);
-        List<VariableElement> superNamed = getNamedParameters(superParameters);
-        Iterator<VariableElement> namedIterator = named.iterator();
-        Iterator<VariableElement> superNamedIterator = superNamed.iterator();
-        while (superNamedIterator.hasNext()) {
-          VariableElement superParameter = superNamedIterator.next();
-          if (namedIterator.hasNext()) {
-            VariableElement parameter = namedIterator.next();
-            if (Objects.equal(parameter.getName(), superParameter.getName())) {
-              DartExpression superDefValue = superParameter.getDefaultValue();
-              DartExpression defValue = parameter.getDefaultValue();
-              if (superDefValue != null
-                  && !Objects.equal(ObjectUtils.toString(defValue),
-                      ObjectUtils.toString(superDefValue))) {
-                onError(parameter.getSourceInfo(),
-                    TypeErrorCode.CANNOT_OVERRIDE_METHOD_DEFAULT_VALUE, method.getName(),
-                    superDefValue);
-              }
-              continue;
+        // TODO(scheglov) remove after http://code.google.com/p/dart/issues/detail?id=6306
+        if (Elements.isLibrarySource(errorTarget.getSourceInfo().getSource(), "/io/io_runtime.dart")) {
+          return true;
+        }
+        // "method" should have at least same number of optional positional parameters as "superMethod"
+        {
+          LinkedHashMap<VariableElement, DartExpression> defMethod = getParametersDefaultsOptional(parameters);
+          LinkedHashMap<VariableElement, DartExpression> defSuper = getParametersDefaultsOptional(superParameters);
+          if (defMethod.size() < defSuper.size()) {
+            onError(errorTarget,
+                    ResolverErrorCode.CANNOT_OVERRIDE_METHOD_OPTIONAL_PARAMS,
+                    getMethodSignature(superMethod),
+                    superMethod.getEnclosingElement().getName());
+            return false;
+          }
+          Iterator<Entry<VariableElement, DartExpression>> defMethodIter = defMethod.entrySet().iterator();
+          Iterator<Entry<VariableElement, DartExpression>> defSuperIter = defSuper.entrySet().iterator();
+          while (defSuperIter.hasNext()) {
+            Entry<VariableElement, DartExpression> methodEntry = defMethodIter.next();
+            Entry<VariableElement, DartExpression> superEntry = defSuperIter.next();
+            DartExpression methodValue = methodEntry.getValue();
+            DartExpression superValue = superEntry.getValue();
+            if (superValue != null
+                && !Objects.equal(ObjectUtils.toString(methodValue),
+                    ObjectUtils.toString(superValue))) {
+              onError(methodEntry.getKey().getSourceInfo(),
+                  TypeErrorCode.CANNOT_OVERRIDE_METHOD_DEFAULT_VALUE, method.getName(),
+                  superValue);
             }
           }
-          onError(errorTarget, ResolverErrorCode.CANNOT_OVERRIDE_METHOD_NAMED_PARAMS, method.getName());
-          return false;
         }
+        // "method" should have at least all named parameters of "superMethod".
+        {
+          Map<String, VariableElement> methodNames = getParametersNamed(parameters);
+          Map<String, VariableElement> superNames = getParametersNamed(superParameters);
+          if (!methodNames.keySet().containsAll(superNames.keySet())) {
+            onError(errorTarget, ResolverErrorCode.CANNOT_OVERRIDE_METHOD_NAMED_PARAMS, method.getName());
+            return false;
+          }
+          Map<String, DartExpression> methodDefs = getParametersDefaultsNamed(parameters);
+          Map<String, DartExpression> superDefs = getParametersDefaultsNamed(superParameters);
+          for (Entry<String, DartExpression> entry : superDefs.entrySet()) {
+            String name = entry.getKey();
+            DartExpression defValue = methodDefs.get(name);
+            DartExpression superDefValue = superDefs.get(name);
+            if (superDefValue != null
+                && !Objects.equal(ObjectUtils.toString(defValue),
+                    ObjectUtils.toString(superDefValue))) {
+              onError(methodNames.get(name).getSourceInfo(),
+                  TypeErrorCode.CANNOT_OVERRIDE_METHOD_DEFAULT_VALUE, method.getName(),
+                  superDefValue);
+            }
+          }
+        }
+//        List<VariableElement> named = getNamedParameters(parameters);
+//        List<VariableElement> superNamed = getNamedParameters(superParameters);
+//        Iterator<VariableElement> namedIterator = named.iterator();
+//        Iterator<VariableElement> superNamedIterator = superNamed.iterator();
+//        while (superNamedIterator.hasNext()) {
+//          VariableElement superParameter = superNamedIterator.next();
+//          if (namedIterator.hasNext()) {
+//            VariableElement parameter = namedIterator.next();
+//            if (Objects.equal(parameter.getName(), superParameter.getName())) {
+//              DartExpression superDefValue = superParameter.getDefaultValue();
+//              DartExpression defValue = parameter.getDefaultValue();
+//              if (superDefValue != null
+//                  && !Objects.equal(ObjectUtils.toString(defValue),
+//                      ObjectUtils.toString(superDefValue))) {
+//                onError(parameter.getSourceInfo(),
+//                    TypeErrorCode.CANNOT_OVERRIDE_METHOD_DEFAULT_VALUE, method.getName(),
+//                    superDefValue);
+//              }
+//              continue;
+//            }
+//          }
+//          onError(errorTarget, ResolverErrorCode.CANNOT_OVERRIDE_METHOD_NAMED_PARAMS, method.getName());
+//          return false;
+//        }
         return true;
       }
 
+      private String getMethodSignature(MethodElement method) {
+        StringBuilder builder = new StringBuilder();
+        builder.append(method.getName());
+        builder.append("(");
+        boolean inOptional = false;
+        boolean inNamed = false;
+        List<VariableElement> superParameters = method.getParameters();
+        int parameterCount = superParameters.size();
+        for (int i = 0; i < parameterCount; i++) {
+          if (i > 0) {
+            builder.append(", ");
+          }
+          VariableElement parameter = superParameters.get(i);
+          if (!inOptional && parameter.isOptional()) {
+            builder.append("[");
+            inOptional = true;
+          }
+          if (!inNamed && parameter.isNamed()) {
+            builder.append("{");
+            inNamed = true;
+          }
+          builder.append(parameter.getType().toString());
+        }
+        if (inOptional) {
+          builder.append("]");
+        }
+        if (inNamed) {
+          builder.append("}");
+        }
+        builder.append(")");
+        String methodSignature = builder.toString();
+        return methodSignature;
+      }
+
+      private LinkedHashMap<VariableElement, DartExpression> getParametersDefaultsOptional(List<VariableElement> parameters) {
+        LinkedHashMap<VariableElement, DartExpression> defaults = Maps.newLinkedHashMap();
+        for (VariableElement parameter : parameters) {
+          if (parameter.isOptional()) {
+            defaults.put(parameter, parameter.getDefaultValue());
+          }
+        }
+        return defaults;
+      }
+
+      private Map<String, VariableElement> getParametersNamed(List<VariableElement> parameters) {
+        Map<String, VariableElement> namedParameters = Maps.newHashMap();
+        for (VariableElement parameter : parameters) {
+          if (parameter.isNamed()) {
+            namedParameters.put(parameter.getName(), parameter);
+          }
+        }
+        return namedParameters;
+      }
+      
+      private Map<String, DartExpression> getParametersDefaultsNamed(List<VariableElement> parameters) {
+        Map<String, DartExpression> defaults = Maps.newHashMap();
+        for (VariableElement parameter : parameters) {
+          if (parameter.isNamed()) {
+            defaults.put(parameter.getName(), parameter.getDefaultValue());
+          }
+        }
+        return defaults;
+      }
+
       private int getNumRequiredParameters(List<VariableElement> parameters) {
         int numRequired = 0;
         for (VariableElement parameter : parameters) {
diff --git a/compiler/java/com/google/dart/compiler/type/Types.java b/compiler/java/com/google/dart/compiler/type/Types.java
index 43d6813..3c1d122 100644
--- a/compiler/java/com/google/dart/compiler/type/Types.java
+++ b/compiler/java/com/google/dart/compiler/type/Types.java
@@ -162,7 +162,14 @@
       return interTypes.get(0);
     }
     // create union
-    return new InterfaceTypeUnion(interTypes);
+    return unionTypes(interTypes);
+  }
+
+  /**
+   * @return the {@link InterfaceType} which is union of given ones.
+   */
+  public InterfaceType unionTypes(List<InterfaceType> types) {
+    return new InterfaceTypeUnion(types);
   }
 
   /**
@@ -355,6 +362,27 @@
         return false;
       }
     }
+
+    {
+      Map<String, Type> sOpti = s.getOptionalParameterTypes();
+      Map<String, Type> tOpti = t.getOptionalParameterTypes();
+      if (tOpti.size() < sOpti.size()) {
+        return false;
+      }
+      Iterator<Entry<String, Type>> tList = tOpti.entrySet().iterator();
+      Iterator<Entry<String, Type>> sList = sOpti.entrySet().iterator();
+      while (sList.hasNext()) {
+        if (!tList.hasNext()) {
+          return false;
+        }
+        Entry<String, Type> sEntry = sList.next();
+        Entry<String, Type> tEntry = tList.next();
+        if (!isAssignable(tEntry.getValue(), sEntry.getValue())) {
+          return false;
+        }
+      }
+    }
+    
     Map<String, Type> tNamed = t.getNamedParameterTypes();
     Map<String, Type> sNamed = s.getNamedParameterTypes();
     if (tNamed.isEmpty() && !sNamed.isEmpty()) {
@@ -366,23 +394,34 @@
     if (!sNamed.isEmpty()) {
       LinkedHashMap<String,Type> tMap = (LinkedHashMap<String, Type>)(tNamed);
       LinkedHashMap<String,Type> sMap = (LinkedHashMap<String, Type>)(sNamed);
-      Iterator<Entry<String, Type>> tList = tMap.entrySet().iterator();
-      Iterator<Entry<String, Type>> sList = sMap.entrySet().iterator();
-      // t named parameters must start with the named parameters of s
-      while (sList.hasNext()) {
-        if (!tList.hasNext()) {
-          return false;
-        }
-        Entry<String, Type> sEntry = sList.next();
-        Entry<String, Type> tEntry = tList.next();
-        if (!sEntry.getKey().equals(tEntry.getKey())) {
-          return false;
-        }
-        // Classic: parameter types are contravariant; Dart: assignable.
-        if (!isAssignable(tEntry.getValue(), sEntry.getValue())) {
+      if (!tMap.keySet().containsAll(sMap.keySet())) {
+        return false;
+      }
+      for (Entry<String, Type> entry : sMap.entrySet()) {
+        String name = entry.getKey();
+        Type sType = sMap.get(name);
+        Type tType = tMap.get(name);
+        if (!isAssignable(tType, sType)) {
           return false;
         }
       }
+//      Iterator<Entry<String, Type>> tList = tMap.entrySet().iterator();
+//      Iterator<Entry<String, Type>> sList = sMap.entrySet().iterator();
+//      // t named parameters must start with the named parameters of s
+//      while (sList.hasNext()) {
+//        if (!tList.hasNext()) {
+//          return false;
+//        }
+//        Entry<String, Type> sEntry = sList.next();
+//        Entry<String, Type> tEntry = tList.next();
+//        if (!sEntry.getKey().equals(tEntry.getKey())) {
+//          return false;
+//        }
+//        // Classic: parameter types are contravariant; Dart: assignable.
+//        if (!isAssignable(tEntry.getValue(), sEntry.getValue())) {
+//          return false;
+//        }
+//      }
     }
 
     // Classic: parameter types are contravariant; Dart: assignable.
diff --git a/compiler/javatests/com/google/dart/compiler/CodeCompletionParseTest.java b/compiler/javatests/com/google/dart/compiler/CodeCompletionParseTest.java
index 33f58d7..6776675 100644
--- a/compiler/javatests/com/google/dart/compiler/CodeCompletionParseTest.java
+++ b/compiler/javatests/com/google/dart/compiler/CodeCompletionParseTest.java
@@ -13,7 +13,7 @@
 public class CodeCompletionParseTest extends CompilerTestCase {
 
   public void test1() throws Exception {
-    AnalyzeLibraryResult result = analyzeLibrary("foo", makeCode(
+    AnalyzeLibraryResult result = analyzeLibrary(makeCode(
         "class CellLocation {",
         "  int _field1;",
         "  String _field2;",
@@ -29,7 +29,7 @@
   }
 
   public void test2() throws Exception {
-    AnalyzeLibraryResult result = analyzeLibrary("foo", makeCode(
+    AnalyzeLibraryResult result = analyzeLibrary(makeCode(
         "doFoo() {",
         "  new ", // cursor
         "}"));
@@ -38,7 +38,7 @@
   }
 
   public void test3() throws Exception {
-    AnalyzeLibraryResult result = analyzeLibrary("foo", makeCode(
+    AnalyzeLibraryResult result = analyzeLibrary(makeCode(
         "class Foo {",
         "  static final Bar b = const ", // cursor
         "}",
@@ -51,7 +51,7 @@
   }
 
   public void test4() throws Exception {
-    AnalyzeLibraryResult result = analyzeLibrary("foo", makeCode(
+    AnalyzeLibraryResult result = analyzeLibrary(makeCode(
         "foo() {",
         "  int SEED;",
         "  for (int i = 0; i < S)", // cursor before )
@@ -61,7 +61,7 @@
   }
 
   public void test5() throws Exception {
-    AnalyzeLibraryResult result = analyzeLibrary("foo", makeCode(
+    AnalyzeLibraryResult result = analyzeLibrary(makeCode(
         "ckass Sunflower {",
         "  static final int SEED_RADIUS = 2;",
         "  static final int SCALE_FACTOR = 4;",
@@ -73,7 +73,7 @@
   }
 
   public void test6() throws Exception {
-    AnalyzeLibraryResult result = analyzeLibrary("foo", makeCode(
+    AnalyzeLibraryResult result = analyzeLibrary(makeCode(
         "class Sunflower {",
         "  static final int SEED_RADIUS = 2;",
         "  static final int SCALE_FACTOR = 4;",
diff --git a/compiler/javatests/com/google/dart/compiler/CompilerTestCase.java b/compiler/javatests/com/google/dart/compiler/CompilerTestCase.java
index d2b4420..9a1cae7 100644
--- a/compiler/javatests/com/google/dart/compiler/CompilerTestCase.java
+++ b/compiler/javatests/com/google/dart/compiler/CompilerTestCase.java
@@ -19,6 +19,7 @@
 import com.google.dart.compiler.ast.LibraryUnit;
 import com.google.dart.compiler.common.ErrorExpectation;
 import com.google.dart.compiler.common.SourceInfo;
+import com.google.dart.compiler.end2end.inc.MemoryLibrarySource;
 import com.google.dart.compiler.parser.DartParser;
 import com.google.dart.compiler.parser.DartParserRunner;
 import com.google.dart.compiler.resolver.Element;
@@ -187,10 +188,9 @@
   }
 
   protected AnalyzeLibraryResult analyzeLibrary(String... lines) throws Exception {
-    String name = getName();
     testSource = makeCode(lines);
-    AnalyzeLibraryResult libraryResult = analyzeLibrary(name, testSource);
-    testUnit = libraryResult.getLibraryUnitResult().getUnit(name);
+    AnalyzeLibraryResult libraryResult = analyzeLibrary(testSource);
+    testUnit = libraryResult.getLibraryUnitResult().getUnits().iterator().next();
     return libraryResult;
   }
 
@@ -199,26 +199,24 @@
    * <p>
    * <b>Note:</b> if the IDE changes how it calls analyzeLibrary, this should
    * be changed to match.
-   *
-   * @param name the name to use for the source file
    * @param code the Dart code to parse/analyze
+   *
    * @return an {@link AnalyzeLibraryResult} containing the {@link LibraryUnit}
    *     and all the errors/warnings generated from the supplied code
    * @throws Exception
    */
-  protected AnalyzeLibraryResult analyzeLibrary(String name, String code)
+  protected AnalyzeLibraryResult analyzeLibrary(String code)
       throws Exception {
     AnalyzeLibraryResult result = new AnalyzeLibraryResult();
     result.source = code;
     // Prepare library.
-    MockLibrarySource lib = new MockLibrarySource();
+    MemoryLibrarySource lib = new MemoryLibrarySource("Test.dart");
+    lib.setContent("Test.dart", code);
     // Prepare unit.
     Map<URI, DartUnit> testUnits =  Maps.newHashMap();
     {
-      DartSource src = new DartSourceTest(name, code, lib);
+      DartSource src = lib.getSourceFor("Test.dart");
       DartUnit unit = makeParser(src, code, result).parseUnit();
-      // Remember unit.
-      lib.addSource(src);
       testUnits.put(src.getUri(), unit);
     }
     DartArtifactProvider provider = new MockArtifactProvider();
diff --git a/compiler/javatests/com/google/dart/compiler/DeltaAnalyzerTest.java b/compiler/javatests/com/google/dart/compiler/DeltaAnalyzerTest.java
index 9924cc8..e4deb24 100644
--- a/compiler/javatests/com/google/dart/compiler/DeltaAnalyzerTest.java
+++ b/compiler/javatests/com/google/dart/compiler/DeltaAnalyzerTest.java
@@ -4,8 +4,10 @@
 
 package com.google.dart.compiler;
 
+import com.google.common.base.Joiner;
 import com.google.dart.compiler.ast.DartUnit;
 import com.google.dart.compiler.ast.LibraryUnit;
+import com.google.dart.compiler.end2end.inc.MemoryLibrarySource;
 import com.google.dart.compiler.resolver.ClassElement;
 import com.google.dart.compiler.resolver.Element;
 import com.google.dart.compiler.resolver.LibraryElement;
@@ -13,7 +15,6 @@
 import com.google.dart.compiler.testing.TestCompilerConfiguration;
 import com.google.dart.compiler.testing.TestCompilerContext;
 import com.google.dart.compiler.testing.TestDartArtifactProvider;
-import com.google.dart.compiler.testing.TestLibrarySource;
 import com.google.dart.compiler.util.DartSourceString;
 
 import junit.framework.TestCase;
@@ -26,10 +27,13 @@
   private final DartArtifactProvider provider = new TestDartArtifactProvider();
 
   public void testNoChangeSingleFile() throws IOException {
-    TestLibrarySource librarySource = new TestLibrarySource(getName());
-    librarySource.addSource("before.dart",
+    MemoryLibrarySource librarySource = new MemoryLibrarySource("App.dart");
+    librarySource.setContent("App.dart", "library App; part 'before.dart';");
+    librarySource.setContent("before.dart",
+        Joiner.on("\n").join(new String[] {
+                            "part of App;",
                             "class Foo {}",
-                            "m() {}");
+                            "m() {}"}));
     DartUnit change = analyzeNoChange(librarySource);
     assertEquals(2, change.getTopLevelNodes().size());
     ClassElement cls = (ClassElement) change.getTopLevelNodes().get(0).getElement();
@@ -45,12 +49,17 @@
   }
 
   public void testNoChangeTwoFiles() throws IOException {
-    TestLibrarySource librarySource = new TestLibrarySource(getName());
-    librarySource.addSource("before.dart",
+    MemoryLibrarySource librarySource = new MemoryLibrarySource("App.dart");
+    librarySource.setContent("App.dart", "library App; part 'before.dart'; part 'common.dart';");
+    librarySource.setContent("before.dart",
+        Joiner.on("\n").join(new String[] {
+                            "part of App;",
                             "class Foo extends Bar {}",
-                            "m() {}");
-    librarySource.addSource("common.dart",
-                            "class Bar {}");
+                            "m() {}"}));
+    librarySource.setContent("common.dart",
+        Joiner.on("\n").join(new String[] {
+                            "part of App;",
+                            "class Bar {}"}));
     DartUnit change = analyzeNoChange(librarySource);
     assertEquals(2, change.getTopLevelNodes().size());
     ClassElement cls = (ClassElement) change.getTopLevelNodes().get(0).getElement();
@@ -67,12 +76,14 @@
   }
 
   public void testChangeSingleFile() throws IOException {
-    TestLibrarySource librarySource = new TestLibrarySource(getName());
-    librarySource.addSource("before.dart",
-                            "class Foo {}",
-                            "m() {}");
+    MemoryLibrarySource librarySource = new MemoryLibrarySource("App.dart");
+    librarySource.setContent("App.dart", "library App;");
+    librarySource.setContent(
+        "before.dart",
+        Joiner.on("\n").join(new String[] {"part of App;", "class Foo {}", "m() {}"}));
     DartSource sourceBefore = librarySource.getSourceFor("before.dart");
-    DartSource sourceAfter = new DartSourceString("after.dart", "class Foo {}");
+    DartSource sourceAfter = new DartSourceString("after.dart", Joiner.on("\n").join(
+        new String[] {"part of App;", "class Foo {}", ""}));
     DartUnit change = analyze(librarySource, sourceBefore, sourceAfter);
     assertEquals(1, change.getTopLevelNodes().size());
     Element element = change.getLibrary().getElement().lookupLocalElement("m");
@@ -85,14 +96,19 @@
   }
 
   public void testChangeTwoFiles() throws IOException {
-    TestLibrarySource librarySource = new TestLibrarySource(getName());
-    librarySource.addSource("before.dart",
+    MemoryLibrarySource librarySource = new MemoryLibrarySource("App.dart");
+    librarySource.setContent("App.dart", "library App; part 'before.dart'; part 'common.dart';");
+    librarySource.setContent("before.dart",
+        Joiner.on("\n").join(new String[] {
+                            "part of App;",
                             "class Foo extends Bar {}",
-                            "m() {}");
-    librarySource.addSource("common.dart",
-                            "class Bar {}");
+                            "m() {}"}));
+    librarySource.setContent("common.dart",
+        Joiner.on("\n").join(new String[] {
+                            "part of App;",
+                            "class Bar {}"}));
     DartSource sourceBefore = librarySource.getSourceFor("before.dart");
-    DartSource sourceAfter = new DartSourceString("after.dart", "class Foo extends Bar {}");
+    DartSource sourceAfter = new DartSourceString("after.dart", "part of App; class Foo extends Bar {}");
     DartUnit change = analyze(librarySource, sourceBefore, sourceAfter);
     assertEquals(1, change.getTopLevelNodes().size());
     assertNull(change.getLibrary().getElement().lookupLocalElement("m"));
diff --git a/compiler/javatests/com/google/dart/compiler/IdeTest.java b/compiler/javatests/com/google/dart/compiler/IdeTest.java
deleted file mode 100644
index 198a145..0000000
--- a/compiler/javatests/com/google/dart/compiler/IdeTest.java
+++ /dev/null
@@ -1,270 +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.
-
-package com.google.dart.compiler;
-
-import com.google.dart.compiler.ast.DartClass;
-import com.google.dart.compiler.ast.DartExprStmt;
-import com.google.dart.compiler.ast.DartExpression;
-import com.google.dart.compiler.ast.DartIdentifier;
-import com.google.dart.compiler.ast.DartMethodDefinition;
-import com.google.dart.compiler.ast.DartNode;
-import com.google.dart.compiler.ast.DartPropertyAccess;
-import com.google.dart.compiler.ast.DartReturnStatement;
-import com.google.dart.compiler.ast.DartStatement;
-import com.google.dart.compiler.ast.DartUnit;
-import com.google.dart.compiler.ast.DartUnqualifiedInvocation;
-import com.google.dart.compiler.ast.LibraryUnit;
-import com.google.dart.compiler.resolver.ClassElement;
-import com.google.dart.compiler.resolver.CoreTypeProvider;
-import com.google.dart.compiler.resolver.CoreTypeProviderImplementation;
-import com.google.dart.compiler.resolver.Element;
-import com.google.dart.compiler.resolver.FieldElement;
-import com.google.dart.compiler.resolver.MethodElement;
-import com.google.dart.compiler.resolver.Scope;
-import com.google.dart.compiler.testing.TestCompilerConfiguration;
-import com.google.dart.compiler.testing.TestCompilerContext;
-import com.google.dart.compiler.testing.TestCompilerContext.EventKind;
-import com.google.dart.compiler.testing.TestDartArtifactProvider;
-import com.google.dart.compiler.testing.TestLibrarySource;
-import com.google.dart.compiler.type.FunctionType;
-import com.google.dart.compiler.type.InterfaceType;
-import com.google.dart.compiler.type.Type;
-import com.google.dart.compiler.type.TypeAnalyzer;
-
-import junit.framework.TestCase;
-
-import java.io.IOException;
-
-/**
- * Test of the IDE API in DartCompiler.
- */
-public class IdeTest extends TestCase {
-
-  private final TestCompilerContext context = new TestCompilerContext(EventKind.ERROR,
-      EventKind.TYPE_ERROR) {
-    @Override
-    protected void handleEvent(DartCompilationError event, EventKind kind) {
-      super.handleEvent(event, kind);
-      // For debugging:
-      // System.err.println(event);
-    }
-  };
-
-  private final DartCompilerListener listener = context;
-
-  private final DartArtifactProvider provider = new TestDartArtifactProvider();
-
-  private final CompilerConfiguration config = new TestCompilerConfiguration();
-
-  public void testAnalyseNoSemicolonPropertyAccess() {
-    DartUnit unit =
-        analyzeUnit(
-            "no_semicolon_property_access",
-            "class Foo {",
-            "  int i;",
-            "  void foo() {",
-            "    i.y", // Missing semicolon.
-            "  }",
-            "}");
-    assertEquals("errorCount", 1, context.getErrorCount()); // Missing semicolon.
-    assertEquals("typeErrorCount", 1, context.getTypeErrorCount()); // No member named "y".
-    DartExprStmt statement = (DartExprStmt) firstStatementOfMethod(unit, "Foo", "foo");
-    FieldElement element = (FieldElement) qualifierElement(statement.getExpression());
-    assertEquals("int", element.getType().getElement().getName());
-  }
-
-  public void testAnalyseNoSemicolonBrokenPropertyAccess() {
-    DartUnit unit =
-        analyzeUnit(
-            "no_semicolon_broken_property_access",
-            "class Foo {",
-            "  int i;",
-            "  void foo() {",
-            "    i.", // Syntax error and missing semicolon.
-            "  }",
-            "}");
-    // Expected identifier and missing semicolon
-    assertEquals("errorCount", 2, context.getErrorCount());
-    assertEquals("typeErrorCount", 1, context.getTypeErrorCount()); // No member named "".
-    DartExprStmt statement = (DartExprStmt) firstStatementOfMethod(unit, "Foo", "foo");
-    FieldElement element = (FieldElement) qualifierElement(statement.getExpression());
-    assertEquals("int", element.getType().getElement().getName());
-  }
-
-  public void testAnalyseBrokenPropertyAccess() {
-    DartUnit unit =
-        analyzeUnit(
-            "broken_property_access",
-            "class Foo {",
-            "  int i;",
-            "  void foo() {",
-            "    i.;", // Syntax error here.
-            "  }",
-            "}");
-    assertEquals("errorCount", 1, context.getErrorCount()); // Expected identifier.
-    assertEquals("typeErrorCount", 1, context.getTypeErrorCount()); // No member named "".
-    DartExprStmt statement = (DartExprStmt) firstStatementOfMethod(unit, "Foo", "foo");
-    FieldElement element = (FieldElement) qualifierElement(statement.getExpression());
-    assertEquals("int", element.getType().getElement().getName());
-  }
-
-  public void testAnalyseNoSemicolonIdentifier() {
-    DartUnit unit =
-        analyzeUnit(
-            "no_semicolon_identifier",
-            "class Foo {",
-            "  int i;",
-            "  void foo() {",
-            "    i", // Missing semicolon.
-            "  }",
-            "}");
-    assertEquals("errorCount", 1, context.getErrorCount()); // Missing semicolon.
-    assertEquals("typeErrorCount", 0, context.getTypeErrorCount());
-    DartExprStmt statement = (DartExprStmt) firstStatementOfMethod(unit, "Foo", "foo");
-    FieldElement field = (FieldElement) targetElement(statement.getExpression());
-    assertEquals("int", field.getType().getElement().getName());
-  }
-
-  public void testAnalyseNoSemicolonMethodCall() {
-    DartUnit unit =
-        analyzeUnit(
-            "no_semicolon_method_call",
-            "class Foo {",
-            "  int i () { return 0; }",
-            "  void foo() {",
-            "    i()", // Missing semicolon.
-            "  }",
-            "}");
-    assertEquals("errorCount", 1, context.getErrorCount()); // Missing semicolon.
-    assertEquals("typeErrorCount", 0, context.getTypeErrorCount());
-    DartExprStmt statement = (DartExprStmt) firstStatementOfMethod(unit, "Foo", "foo");
-    DartExpression expression = statement.getExpression();
-    DartUnqualifiedInvocation invocation = (DartUnqualifiedInvocation) expression;
-    MethodElement method = (MethodElement) targetElement(invocation.getTarget());
-    assertEquals("i", method.getName());
-    FunctionType type = (FunctionType) method.getType();
-    assertEquals("int", type.getReturnType().getElement().getName());
-  }
-
-  public void testAnalyseVoidKeyword() {
-    DartUnit unit =
-        analyzeUnit(
-            "void_keyword",
-            "class Foo {",
-            "  Function voidFunction;",
-            "  void foo() {",
-            "    void", // Missing semicolon and keyword
-            "  }",
-            "}");
-    // Expected identifier and missing semicolon.
-    assertEquals("errorCount", 2, context.getErrorCount());
-    // You can't use 'void' as a member name.  It might be the beginning of a variable declaration
-    // so it isn't an error in and of itself.
-    assertEquals("typeErrorCount", 0, context.getTypeErrorCount());
-    DartExprStmt statement = (DartExprStmt) firstStatementOfMethod(unit, "Foo", "foo");
-    DartIdentifier expression = (DartIdentifier) statement.getExpression();
-    assertEquals("", expression.getName());
-  }
-
-  public void testAnalyseVoidKeywordPropertyAccess() {
-    DartUnit unit =
-        analyzeUnit(
-            "void_keyword_property_access",
-            "class Foo {",
-            "  Function voidFunction;",
-            "  void foo() {",
-            "    this.void", // Missing semicolon and keyword
-            "  }",
-            "}");
-    // Expected identifier and missing semicolon.
-    assertEquals("errorCount", 2, context.getErrorCount());
-    assertEquals("typeErrorCount", 1, context.getTypeErrorCount());
-    DartExprStmt statement = (DartExprStmt) firstStatementOfMethod(unit, "Foo", "foo");
-    DartPropertyAccess expression = (DartPropertyAccess) statement.getExpression();
-    assertEquals("", expression.getPropertyName());
-  }
-
-  public void testReturnIntTypeAnalysis() {
-    DartUnit unit =
-        analyzeUnit(
-            "return_int_type_analysis",
-            "class Foo {",
-            "  int i;",
-            "  int foo() {",
-            "    return i;",
-            "  }",
-            "}");
-    Scope unitScope = unit.getLibrary().getElement().getScope();
-    CoreTypeProvider typeProvider = new CoreTypeProviderImplementation(unitScope, context);
-    DartClass classNode = getClassOfUnit(unit, "Foo");
-    DartReturnStatement rtnStmt = (DartReturnStatement) firstStatementOfMethod(unit, "Foo", "foo");
-    ClassElement classElement = classNode.getElement();
-    InterfaceType definingType = classElement.getType();
-    Type type = TypeAnalyzer.analyze(rtnStmt.getValue(), typeProvider, context, definingType);
-    assertNotNull(type);
-    assertEquals("int", type.getElement().getName());
-  }
-
-  private Element targetElement(DartExpression expression) {
-    DartIdentifier identifier = (DartIdentifier) expression;
-    Element element = identifier.getElement();
-    assertNotNull(element);
-    return element;
-  }
-
-  private Element qualifierElement(DartExpression node) {
-    DartPropertyAccess propertyAccess = (DartPropertyAccess) node;
-    DartIdentifier identifier = (DartIdentifier) propertyAccess.getQualifier();
-    Element element = identifier.getElement();
-    assertNotNull(element);
-    return element;
-  }
-
-  private DartClass getClassOfUnit(DartUnit unit, String cls) {
-    DartClass dartClass = null;
-    for (DartNode node : unit.getTopLevelNodes()) {
-      DartClass classNode = (DartClass) node;
-      if (node instanceof DartClass) {
-        if (classNode.getName().getName().equals(cls)) {
-          dartClass = classNode;
-        }
-      }
-    }
-    assertNotNull(dartClass);
-    return dartClass;
-  }
-
-  private DartStatement firstStatementOfMethod(DartUnit unit, String cls, String member) {
-    DartClass classNode = getClassOfUnit(unit, cls);
-    for (DartNode memberNode : classNode.getMembers()) {
-      if (memberNode instanceof DartMethodDefinition) {
-        DartMethodDefinition methodNode = (DartMethodDefinition) memberNode;
-        if (methodNode.getName() instanceof DartIdentifier) {
-          DartIdentifier methodName = (DartIdentifier) methodNode.getName();
-          if (methodName.getName().equals(member)) {
-            return methodNode.getFunction().getBody().getStatements().get(0);
-          }
-        }
-      }
-    }
-    fail();
-    return null;
-  }
-
-  private DartUnit analyzeUnit(String name, String... sourceLines) throws AssertionError {
-    TestLibrarySource lib = new TestLibrarySource(name);
-    lib.addSource(name + ".dart", sourceLines);
-    LibraryUnit libraryUnit;
-    try {
-      libraryUnit = DartCompiler.analyzeLibrary(lib, null, config, provider, listener);
-      assertNotNull("libraryUnit == null", libraryUnit);
-    } catch (IOException e) {
-      throw new AssertionError(e);
-    }
-    DartUnit unit = libraryUnit.getUnit(name + ".dart");
-    assertNotNull("unit == null", unit);
-    return unit;
-  }
-}
diff --git a/compiler/javatests/com/google/dart/compiler/IdeTests.java b/compiler/javatests/com/google/dart/compiler/IdeTests.java
deleted file mode 100644
index 3e03e56..0000000
--- a/compiler/javatests/com/google/dart/compiler/IdeTests.java
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package com.google.dart.compiler;
-
-import junit.extensions.TestSetup;
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-public class IdeTests extends TestSetup {
-
-  public IdeTests(Test test) {
-    super(test);
-  }
-
-  public static Test suite() {
-    TestSuite suite = new TestSuite("IDE/dartc integration test suite.");
-    suite.addTestSuite(IdeTest.class);
-    suite.addTestSuite(DeltaAnalyzerTest.class);
-    suite.addTestSuite(CodeCompletionParseTest.class);
-    return suite;
-  }
-}
diff --git a/compiler/javatests/com/google/dart/compiler/end2end/inc/IncrementalCompilation2Test.java b/compiler/javatests/com/google/dart/compiler/end2end/inc/IncrementalCompilation2Test.java
index 9b1c945..eb13e61 100644
--- a/compiler/javatests/com/google/dart/compiler/end2end/inc/IncrementalCompilation2Test.java
+++ b/compiler/javatests/com/google/dart/compiler/end2end/inc/IncrementalCompilation2Test.java
@@ -91,9 +91,9 @@
             "part 'B.dart';",
             "part 'C.dart';",
             ""));
-    appSource.setContent("A.dart", "");
-    appSource.setContent("B.dart", "");
-    appSource.setContent("C.dart", "");
+    appSource.setContent("A.dart", "part of application;");
+    appSource.setContent("B.dart", "part of application;");
+    appSource.setContent("C.dart", "part of application;");
   }
 
   @Override
@@ -114,6 +114,7 @@
         "B.dart",
         makeCode(
             "// filler filler filler filler filler filler filler filler filler filler filler",
+            "part of application;",
             "class A {",
             "  int not_hole;",
             "}",
@@ -122,6 +123,7 @@
         "C.dart",
         makeCode(
             "// filler filler filler filler filler filler filler filler filler filler filler",
+            "part of application;",
             "class B extends A {",
             "  int bar() {",
             "    return super.not_hole;", // qualified reference
@@ -135,6 +137,7 @@
         "A.dart",
         makeCode(
             "// filler filler filler filler filler filler filler filler filler filler filler",
+            "part of application;",
             "int not_hole;",
             ""));
     compile();
@@ -157,6 +160,7 @@
         "B.dart",
         makeCode(
             "// filler filler filler filler filler filler filler filler filler filler filler",
+            "part of application;",
             "class A {",
             "  int foo() {",
             "    return hole;", // no such field
@@ -164,12 +168,13 @@
             "}",
             ""));
     compile();
-    assertErrors(errors, errEx(TypeErrorCode.CANNOT_BE_RESOLVED, 4, 12, 4));
+    assertErrors(errors, errEx(TypeErrorCode.CANNOT_BE_RESOLVED, 5, 12, 4));
     // Update units and compile.
     appSource.setContent(
         "A.dart",
         makeCode(
             "// filler filler filler filler filler filler filler filler filler filler filler",
+            "part of application;",
             "int hole;",
             ""));
     compile();
@@ -190,6 +195,7 @@
         "B.dart",
         makeCode(
             "// filler filler filler filler filler filler filler filler filler filler filler",
+            "part of application;",
             "class A {",
             "  foo() {}",
             "}",
@@ -198,6 +204,7 @@
         "C.dart",
         makeCode(
             "// filler filler filler filler filler filler filler filler filler filler filler",
+            "part of application;",
             "class B extends A {",
             "  int bar() {",
             "    foo();", // unqualified invocation
@@ -212,6 +219,7 @@
           "A.dart",
           makeCode(
               "// filler filler filler filler filler filler filler filler filler filler filler",
+              "part of application;",
               "foo() {}",
               ""));
       compile();
@@ -226,7 +234,7 @@
     Thread.sleep(5);
     // Remove top-level foo(), so invocation of foo() in B should be bound to the super class.
     {
-      appSource.setContent("A.dart", "");
+      appSource.setContent("A.dart", "part of application;");
       compile();
       // B should be compiled because it also declares foo(), so produces "shadow" conflict.
       // C should be compiled because it has unqualified invocation which was declared in A.
@@ -245,6 +253,7 @@
         "B.dart",
         makeCode(
             "// filler filler filler filler filler filler filler filler filler filler filler",
+            "part of application;",
             "class A {",
             "  foo() {}",
             "}",
@@ -253,6 +262,7 @@
         "C.dart",
         makeCode(
             "// filler filler filler filler filler filler filler filler filler filler filler",
+            "part of application;",
             "class B extends A {",
             "  int bar() {",
             "    super.foo();", // qualified invocation
@@ -267,6 +277,7 @@
           "A.dart",
           makeCode(
               "// filler filler filler filler filler filler filler filler filler filler filler",
+              "part of application;",
               "foo() {}",
               ""));
       compile();
@@ -288,6 +299,7 @@
         "B.dart",
         makeCode(
             "// filler filler filler filler filler filler filler filler filler filler filler",
+            "part of application;",
             "class A {",
             "  var foo;",
             "}",
@@ -296,6 +308,7 @@
         "C.dart",
         makeCode(
             "// filler filler filler filler filler filler filler filler filler filler filler",
+            "part of application;",
             "class B extends A {",
             "  int bar() {",
             "    foo = 0;", // unqualified access
@@ -310,6 +323,7 @@
           "A.dart",
           makeCode(
               "// filler filler filler filler filler filler filler filler filler filler filler",
+              "part of application;",
               "var foo;",
               ""));
       compile();
@@ -324,7 +338,7 @@
     Thread.sleep(5);
     // Remove top-level "foo", so access to "foo" in B should be bound to the super class.
     {
-      appSource.setContent("A.dart", "");
+      appSource.setContent("A.dart", "part of application;");
       compile();
       // B should be compiled because it also declares "foo", so produces "shadow" conflict.
       // C should be compiled because it has unqualified access which was declared in A.
@@ -343,6 +357,7 @@
         "B.dart",
         makeCode(
             "// filler filler filler filler filler filler filler filler filler filler filler",
+            "part of application;",
             "class A {",
             "  var foo;",
             "}",
@@ -351,6 +366,7 @@
         "C.dart",
         makeCode(
             "// filler filler filler filler filler filler filler filler filler filler filler",
+            "part of application;",
             "class B extends A {",
             "  int bar() {",
             "    super.foo = 0;", // qualified access
@@ -365,6 +381,7 @@
           "A.dart",
           makeCode(
               "// filler filler filler filler filler filler filler filler filler filler filler",
+              "part of application;",
               "var foo;",
               ""));
       compile();
@@ -382,6 +399,7 @@
         "B.dart",
         makeCode(
             "// filler filler filler filler filler filler filler filler filler filler filler",
+            "part of application;",
             "methodB() {",
             "  var symbolDependency_foo;",
             "}"));
@@ -392,6 +410,7 @@
         "A.dart",
         makeCode(
             "// filler filler filler filler filler filler filler filler filler filler filler",
+            "part of application;",
             "var symbolDependency_foo;"));
     compile();
     // Now there is top-level declarations conflict between A and B.
@@ -406,17 +425,19 @@
         "A.dart",
         makeCode(
             "// filler filler filler filler filler filler filler filler filler filler filler",
+            "part of application;",
             "var duplicate;"));
     appSource.setContent(
         "B.dart",
         makeCode(
             "// filler filler filler filler filler filler filler filler filler filler filler",
+            "part of application;",
             "bar() {",
             "  var duplicate;",
             "}"));
     compile();
     // Update units and compile.
-    appSource.setContent("A.dart", "");
+    appSource.setContent("A.dart", "part of application;");
     compile();
     // Top-level declaration in A was removed, so no conflict.
     // So:
@@ -434,11 +455,13 @@
         "A.dart",
         makeCode(
             "// filler filler filler filler filler filler filler filler filler filler filler",
+            "part of application;",
             "var duplicate;"));
     appSource.setContent(
         "B.dart",
         makeCode(
             "// filler filler filler filler filler filler filler filler filler filler filler",
+            "part of application;",
             "bar() {",
             "  var duplicate;",
             "}"));
@@ -465,6 +488,7 @@
         "A.dart",
         makeCode(
             "// filler filler filler filler filler filler filler filler filler filler filler",
+            "part of application;",
             "class A {",
             "}",
             ""));
@@ -472,6 +496,7 @@
         "B.dart",
         makeCode(
             "// filler filler filler filler filler filler filler filler filler filler filler",
+            "part of application;",
             "class B extends A {",
             "  foo() {",
             "    var bar;",
@@ -485,6 +510,7 @@
         "A.dart",
         makeCode(
             "// filler filler filler filler filler filler filler filler filler filler filler",
+            "part of application;",
             "class A {",
             "  var bar;",
             "}",
@@ -500,6 +526,7 @@
         "A.dart",
         makeCode(
             "// filler filler filler filler filler filler filler filler filler filler filler",
+            "part of application;",
             "var conflict;",
             ""));
     compile();
@@ -509,6 +536,7 @@
         "B.dart",
         makeCode(
             "// filler filler filler filler filler filler filler filler filler filler filler",
+            "part of application;",
             "var conflict;",
             ""));
     compile();
@@ -516,8 +544,8 @@
     // Both A and B have errors.
     assertErrors(
         errors,
-        errEx("A.dart", ResolverErrorCode.DUPLICATE_TOP_LEVEL_DECLARATION, 2, 5, 8),
-        errEx("B.dart", ResolverErrorCode.DUPLICATE_TOP_LEVEL_DECLARATION, 2, 5, 8));
+        errEx("A.dart", ResolverErrorCode.DUPLICATE_TOP_LEVEL_DECLARATION, 3, 5, 8),
+        errEx("B.dart", ResolverErrorCode.DUPLICATE_TOP_LEVEL_DECLARATION, 3, 5, 8));
   }
 
   /**
@@ -797,6 +825,7 @@
         "A.dart",
         makeCode(
             "// filler filler filler filler filler filler filler filler filler filler filler",
+            "part of application;",
             ""));
     appSource.setContent(
         APP,
@@ -936,40 +965,6 @@
         errEx(ResolverErrorCode.CANNOT_ACCESS_METHOD, 6, 5, 7),
         errEx(ResolverErrorCode.CANNOT_ACCESS_METHOD, 9, 11, 7));
   }
-  
-  /**
-   * When we resolve factory constructors, we should check if "lib" is library prefix, it is not
-   * always have to be name of type.  
-   * <p>
-   * http://code.google.com/p/dart/issues/detail?id=2478
-   */
-  public void test_factoryClass_fromPrefixImportedLibrary() throws Exception {
-    appSource.setContent(
-        "A.dart",
-        makeCode(
-            "// filler filler filler filler filler filler filler filler filler filler filler",
-            "library A;",
-            "import '" + APP + "';",
-            "interface I default A {",
-            "  I();",
-            "  I.named();",
-            "}",
-            ""));
-    appSource.setContent(
-        APP,
-        makeCode(
-            "// filler filler filler filler filler filler filler filler filler filler filler",
-            "library application;",
-            "import 'A.dart' as lib;",
-            "class A {",
-            "  factory lib.I() {}",
-            "  factory lib.I.named() {}",
-            "}",
-            ""));
-    // do compile, no errors expected
-    compile();
-    assertErrors(errors);
-  }
 
   /**
    * <p>
@@ -1478,6 +1473,97 @@
   }
 
   /**
+   * Part should have one and only one directive - "part of".
+   */
+  public void test_partDirectives_otherThenPartOf() throws Exception {
+    appSource.setContent(
+        "A.dart",
+        makeCode(
+            "// filler filler filler filler filler filler filler filler filler filler filler",
+            "library A;",
+            ""));
+    appSource.setContent(
+        APP,
+        makeCode(
+            "// filler filler filler filler filler filler filler filler filler filler filler",
+            "library application;",
+            "part 'A.dart';",
+            ""));
+    // do compile
+    compile();
+    assertErrors(errors, errEx(DartCompilerErrorCode.ILLEGAL_DIRECTIVES_IN_SOURCED_UNIT, 2, 1, 10));
+  }
+  
+  /**
+   * Part should have one and only one directive - "part of".
+   */
+  public void test_partDirectives_otherThenPartOf2() throws Exception {
+    appSource.setContent(
+        "A.dart",
+        makeCode(
+            "// filler filler filler filler filler filler filler filler filler filler filler",
+            "part of application;",
+            "part 'A.dart';",
+            ""));
+    appSource.setContent(
+        APP,
+        makeCode(
+            "// filler filler filler filler filler filler filler filler filler filler filler",
+            "library application;",
+            "part 'A.dart';",
+            ""));
+    // do compile
+    compile();
+    assertErrors(errors, errEx(DartCompilerErrorCode.ILLEGAL_DIRECTIVES_IN_SOURCED_UNIT, 2, 1, 20));
+  }
+  
+  /**
+   * Part should have one and only one directive - "part of".
+   */
+  public void test_partDirectives_noPartOf() throws Exception {
+    appSource.setContent(
+        "A.dart",
+        makeCode(
+            "// filler filler filler filler filler filler filler filler filler filler filler",
+            ""));
+    appSource.setContent(
+        APP,
+        makeCode(
+            "// filler filler filler filler filler filler filler filler filler filler filler",
+            "library application;",
+            "part 'A.dart';",
+            ""));
+    // do compile
+    compile();
+    assertErrors(errors, errEx(DartCompilerErrorCode.MISSING_PART_OF_DIRECTIVE, -1, -1, 0));
+  }
+  
+  /**
+   * Part should have one and only one directive - "part of".
+   */
+  public void test_partDirectives_wrongNameInPartOf() throws Exception {
+    appSource.setContent(
+        "A.dart",
+        makeCode(
+            "// filler filler filler filler filler filler filler filler filler filler filler",
+            "part of Z;",
+            ""));
+    appSource.setContent(
+        APP,
+        makeCode(
+            "// filler filler filler filler filler filler filler filler filler filler filler",
+            "library application;",
+            "part 'A.dart';",
+            ""));
+    // do compile
+    compile();
+    assertErrors(
+        errors,
+        errEx(DartCompilerErrorCode.WRONG_PART_OF_NAME, 2, 1, 10),
+        errEx(TypeErrorCode.CANNOT_BE_RESOLVED, 2, 9, 1));
+  }
+
+  /**
    * Internals of Dart use "dart-ext:" import scheme, and these libraries are allowed to use
    * "native". New import syntax.
    */
@@ -1496,7 +1582,7 @@
     compile();
     assertErrors(errors);
   }
-  
+
   /**
    * Internals of Dart use "dart-ext:" import scheme, and these libraries are allowed to use
    * "native". Obsolete import syntax.
diff --git a/compiler/javatests/com/google/dart/compiler/end2end/inc/IncrementalCompilationTest.java b/compiler/javatests/com/google/dart/compiler/end2end/inc/IncrementalCompilationTest.java
index 9e36610..ea7e9e1 100644
--- a/compiler/javatests/com/google/dart/compiler/end2end/inc/IncrementalCompilationTest.java
+++ b/compiler/javatests/com/google/dart/compiler/end2end/inc/IncrementalCompilationTest.java
@@ -17,6 +17,7 @@
 import com.google.dart.compiler.MockArtifactProvider;
 import com.google.dart.compiler.MockBundleLibrarySource;
 import com.google.dart.compiler.Source;
+import com.google.dart.compiler.util.apache.StringUtils;
 
 import junit.framework.AssertionFailedError;
 
@@ -104,6 +105,7 @@
 
   public void testFullCompile() {
     compile();
+    System.out.println(StringUtils.join(errors, "\n"));
 
     // Assert that all artifacts are written.
     didWrite("someimpl.dart", EXTENSION_TIMESTAMP);
diff --git a/compiler/javatests/com/google/dart/compiler/end2end/inc/MemoryLibrarySource.java b/compiler/javatests/com/google/dart/compiler/end2end/inc/MemoryLibrarySource.java
index a2fd2c4..e31466f 100644
--- a/compiler/javatests/com/google/dart/compiler/end2end/inc/MemoryLibrarySource.java
+++ b/compiler/javatests/com/google/dart/compiler/end2end/inc/MemoryLibrarySource.java
@@ -22,17 +22,20 @@
 public class MemoryLibrarySource implements LibrarySource {
   public static final String IO_EXCEPTION_CONTENT = "simulate-IOException";
   private final String libName;
+  private final Map<String, DartSource> sourceMap;
   private final Map<String, String> sourceContentMap;
   private final Map<String, Long> sourceLastModifiedMap;
 
   public MemoryLibrarySource(String libName) {
     this.libName = libName;
+    sourceMap = Maps.newHashMap();
     sourceContentMap = Maps.newHashMap();
     sourceLastModifiedMap = Maps.newHashMap();
   }
 
   private MemoryLibrarySource(String libName, MemoryLibrarySource parent) {
     this.libName = libName;
+    sourceMap = parent.sourceMap;
     sourceContentMap = parent.sourceContentMap;
     sourceLastModifiedMap = parent.sourceLastModifiedMap;
   }
@@ -75,17 +78,33 @@
   }
 
   @Override
-  public LibrarySource getImportFor(final String relPath) throws IOException {
+  public LibrarySource getImportFor(String relPath) throws IOException {
+    if (!sourceContentMap.containsKey(relPath)) {
+      return null;
+    }
     return new MemoryLibrarySource(relPath, this);
   }
 
   @Override
   public DartSource getSourceFor(final String relPath) {
+    DartSource result;
+    // check cache
+    {
+      result = sourceMap.get(relPath);
+      if (result != null) {
+        return result;
+      }
+    }
+    // prepare content
     final String content = sourceContentMap.get(relPath);
     final Long sourceLastModified = sourceLastModifiedMap.get(relPath);
+    // may be does not exist
+    if (content == null) {
+      return null;
+    }
     // Return fake UrlDateSource with in-memory content.
     final URI uri = URI.create(relPath);
-    return new UrlDartSource(uri, relPath, this) {
+    result = new UrlDartSource(uri, relPath, this) {
       @Override
       public String getName() {
         return relPath;
@@ -111,12 +130,15 @@
         return new StringReader(content);
       }
     };
+    sourceMap.put(relPath, result);
+    return result;
   }
 
   /**
    * Sets the given content for the source.
    */
   public void setContent(String relPath, String content) {
+    sourceMap.remove(relPath);
     sourceContentMap.put(relPath, content);
     sourceLastModifiedMap.put(relPath, System.currentTimeMillis());
   }
diff --git a/compiler/javatests/com/google/dart/compiler/end2end/inc/my.app.dart b/compiler/javatests/com/google/dart/compiler/end2end/inc/my.app.dart
index a905502..15aca3f 100644
--- a/compiler/javatests/com/google/dart/compiler/end2end/inc/my.app.dart
+++ b/compiler/javatests/com/google/dart/compiler/end2end/inc/my.app.dart
@@ -1,6 +1,7 @@
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+library myApp;
 
 import "some.lib.dart";
 part "my.dart";
diff --git a/compiler/javatests/com/google/dart/compiler/end2end/inc/my.dart b/compiler/javatests/com/google/dart/compiler/end2end/inc/my.dart
index 37619d8..f123883 100644
--- a/compiler/javatests/com/google/dart/compiler/end2end/inc/my.dart
+++ b/compiler/javatests/com/google/dart/compiler/end2end/inc/my.dart
@@ -1,6 +1,7 @@
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+part of myApp;
 
 var x = 0, y = 1;
 void fn() { /* ... */ }
diff --git a/compiler/javatests/com/google/dart/compiler/end2end/inc/my.merged.app.dart b/compiler/javatests/com/google/dart/compiler/end2end/inc/my.merged.app.dart
index 4a4edf8..afe2335 100644
--- a/compiler/javatests/com/google/dart/compiler/end2end/inc/my.merged.app.dart
+++ b/compiler/javatests/com/google/dart/compiler/end2end/inc/my.merged.app.dart
@@ -1,6 +1,7 @@
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+library myApp;
 
 import "some.lib.dart";
 part "my.dart";
diff --git a/compiler/javatests/com/google/dart/compiler/end2end/inc/my.no5ref.dart b/compiler/javatests/com/google/dart/compiler/end2end/inc/my.no5ref.dart
index 3feac3f..a35149c 100644
--- a/compiler/javatests/com/google/dart/compiler/end2end/inc/my.no5ref.dart
+++ b/compiler/javatests/com/google/dart/compiler/end2end/inc/my.no5ref.dart
@@ -1,6 +1,7 @@
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+part of myApp;
 
 class Spoo<T> {
   Spoo() { }
diff --git a/compiler/javatests/com/google/dart/compiler/end2end/inc/my.nuke5.app.dart b/compiler/javatests/com/google/dart/compiler/end2end/inc/my.nuke5.app.dart
index 113bab8..6d50f3c 100644
--- a/compiler/javatests/com/google/dart/compiler/end2end/inc/my.nuke5.app.dart
+++ b/compiler/javatests/com/google/dart/compiler/end2end/inc/my.nuke5.app.dart
@@ -1,6 +1,7 @@
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+library myApp;
 
 import "some.lib.dart";
 part "my.dart";
diff --git a/compiler/javatests/com/google/dart/compiler/end2end/inc/my.prefixed.app.dart b/compiler/javatests/com/google/dart/compiler/end2end/inc/my.prefixed.app.dart
index 0028c36..e5958dc 100644
--- a/compiler/javatests/com/google/dart/compiler/end2end/inc/my.prefixed.app.dart
+++ b/compiler/javatests/com/google/dart/compiler/end2end/inc/my.prefixed.app.dart
@@ -1,6 +1,7 @@
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+library myAppPref;
 
 import "some.prefixable.lib.dart" as prefix;
 
diff --git a/compiler/javatests/com/google/dart/compiler/end2end/inc/my.unprefixed.app.dart b/compiler/javatests/com/google/dart/compiler/end2end/inc/my.unprefixed.app.dart
index b34d3fe..7b36d57 100644
--- a/compiler/javatests/com/google/dart/compiler/end2end/inc/my.unprefixed.app.dart
+++ b/compiler/javatests/com/google/dart/compiler/end2end/inc/my.unprefixed.app.dart
@@ -1,6 +1,7 @@
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+library myAppUnPref;
 
 import "some.prefixable.lib.dart";
 
diff --git a/compiler/javatests/com/google/dart/compiler/end2end/inc/mybase.dart b/compiler/javatests/com/google/dart/compiler/end2end/inc/mybase.dart
index 80a3045..f10a5cf 100644
--- a/compiler/javatests/com/google/dart/compiler/end2end/inc/mybase.dart
+++ b/compiler/javatests/com/google/dart/compiler/end2end/inc/mybase.dart
@@ -1,6 +1,7 @@
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+part of myApp;
 
 class QualifierBase {
   Other5 other5;
diff --git a/compiler/javatests/com/google/dart/compiler/end2end/inc/mybase.no5ref.dart b/compiler/javatests/com/google/dart/compiler/end2end/inc/mybase.no5ref.dart
index 53d5a3a..ff7209d 100644
--- a/compiler/javatests/com/google/dart/compiler/end2end/inc/mybase.no5ref.dart
+++ b/compiler/javatests/com/google/dart/compiler/end2end/inc/mybase.no5ref.dart
@@ -1,6 +1,7 @@
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+part of myApp;
 
 class QualifierBase {
   Other6 other6;
diff --git a/compiler/javatests/com/google/dart/compiler/end2end/inc/myother0.dart b/compiler/javatests/com/google/dart/compiler/end2end/inc/myother0.dart
index 0d184ca..cb6e48b 100644
--- a/compiler/javatests/com/google/dart/compiler/end2end/inc/myother0.dart
+++ b/compiler/javatests/com/google/dart/compiler/end2end/inc/myother0.dart
@@ -1,6 +1,7 @@
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+part of myApp;
 
 class Other0 {
   static int value() { return 42; }
diff --git a/compiler/javatests/com/google/dart/compiler/end2end/inc/myother0.fillthehole.dart b/compiler/javatests/com/google/dart/compiler/end2end/inc/myother0.fillthehole.dart
index 26c4290..d0f572a 100644
--- a/compiler/javatests/com/google/dart/compiler/end2end/inc/myother0.fillthehole.dart
+++ b/compiler/javatests/com/google/dart/compiler/end2end/inc/myother0.fillthehole.dart
@@ -1,6 +1,7 @@
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+part of myApp;
 
 class Other0 {
   static int value() { return 42; }
diff --git a/compiler/javatests/com/google/dart/compiler/end2end/inc/myother0.fillthemethodhole.dart b/compiler/javatests/com/google/dart/compiler/end2end/inc/myother0.fillthemethodhole.dart
index 324c0b0..b9a35c8 100644
--- a/compiler/javatests/com/google/dart/compiler/end2end/inc/myother0.fillthemethodhole.dart
+++ b/compiler/javatests/com/google/dart/compiler/end2end/inc/myother0.fillthemethodhole.dart
@@ -1,6 +1,7 @@
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+part of myApp;
 
 class Other0 {
   static int value() { return 42; }
diff --git a/compiler/javatests/com/google/dart/compiler/end2end/inc/myother0.fillthenothole.dart b/compiler/javatests/com/google/dart/compiler/end2end/inc/myother0.fillthenothole.dart
index 4831e5c..005d4a9 100644
--- a/compiler/javatests/com/google/dart/compiler/end2end/inc/myother0.fillthenothole.dart
+++ b/compiler/javatests/com/google/dart/compiler/end2end/inc/myother0.fillthenothole.dart
@@ -1,6 +1,7 @@
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+part of myApp;
 
 class Other0 {
   static int value() { return 42; }
diff --git a/compiler/javatests/com/google/dart/compiler/end2end/inc/myother0.globalfunctionchange.dart b/compiler/javatests/com/google/dart/compiler/end2end/inc/myother0.globalfunctionchange.dart
index 02b894e..c0377a3 100644
--- a/compiler/javatests/com/google/dart/compiler/end2end/inc/myother0.globalfunctionchange.dart
+++ b/compiler/javatests/com/google/dart/compiler/end2end/inc/myother0.globalfunctionchange.dart
@@ -1,6 +1,7 @@
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+part of myApp;
 
 class Other0 {
   static int value() { return 42; }
diff --git a/compiler/javatests/com/google/dart/compiler/end2end/inc/myother0.globalvarchange.dart b/compiler/javatests/com/google/dart/compiler/end2end/inc/myother0.globalvarchange.dart
index ae829c2..ad04968 100644
--- a/compiler/javatests/com/google/dart/compiler/end2end/inc/myother0.globalvarchange.dart
+++ b/compiler/javatests/com/google/dart/compiler/end2end/inc/myother0.globalvarchange.dart
@@ -1,6 +1,7 @@
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+part of myApp;
 
 class Other0 {
   static int value() { return 42; }
diff --git a/compiler/javatests/com/google/dart/compiler/end2end/inc/myother0.newstaticmethod.dart b/compiler/javatests/com/google/dart/compiler/end2end/inc/myother0.newstaticmethod.dart
index bfb73e4..628c947 100644
--- a/compiler/javatests/com/google/dart/compiler/end2end/inc/myother0.newstaticmethod.dart
+++ b/compiler/javatests/com/google/dart/compiler/end2end/inc/myother0.newstaticmethod.dart
@@ -1,6 +1,7 @@
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+part of myApp;
 
 class Other0 {
   static int value() { return 42; }
diff --git a/compiler/javatests/com/google/dart/compiler/end2end/inc/myother0.returntypechange.dart b/compiler/javatests/com/google/dart/compiler/end2end/inc/myother0.returntypechange.dart
index ddd35cb..aa88248 100644
--- a/compiler/javatests/com/google/dart/compiler/end2end/inc/myother0.returntypechange.dart
+++ b/compiler/javatests/com/google/dart/compiler/end2end/inc/myother0.returntypechange.dart
@@ -1,6 +1,7 @@
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+part of myApp;
 
 class Other0 {
   static int value() { return 42; }
diff --git a/compiler/javatests/com/google/dart/compiler/end2end/inc/myother1.change.dart b/compiler/javatests/com/google/dart/compiler/end2end/inc/myother1.change.dart
index 670f9d7..dbe9acd 100644
--- a/compiler/javatests/com/google/dart/compiler/end2end/inc/myother1.change.dart
+++ b/compiler/javatests/com/google/dart/compiler/end2end/inc/myother1.change.dart
@@ -1,6 +1,7 @@
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+part of myApp;
 
 class Other1 {
   static Function FN;
diff --git a/compiler/javatests/com/google/dart/compiler/end2end/inc/myother1.dart b/compiler/javatests/com/google/dart/compiler/end2end/inc/myother1.dart
index 831dc03..cba3e1e 100644
--- a/compiler/javatests/com/google/dart/compiler/end2end/inc/myother1.dart
+++ b/compiler/javatests/com/google/dart/compiler/end2end/inc/myother1.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-
+part of myApp;
 
 class Other1 {
 
diff --git a/compiler/javatests/com/google/dart/compiler/end2end/inc/myother2.change.dart b/compiler/javatests/com/google/dart/compiler/end2end/inc/myother2.change.dart
index 287a13b..f861bbc 100644
--- a/compiler/javatests/com/google/dart/compiler/end2end/inc/myother2.change.dart
+++ b/compiler/javatests/com/google/dart/compiler/end2end/inc/myother2.change.dart
@@ -1,6 +1,7 @@
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+part of myApp;
 
 class IntBag {
   int contents;
diff --git a/compiler/javatests/com/google/dart/compiler/end2end/inc/myother2.dart b/compiler/javatests/com/google/dart/compiler/end2end/inc/myother2.dart
index 25fa306..2ad88e1 100644
--- a/compiler/javatests/com/google/dart/compiler/end2end/inc/myother2.dart
+++ b/compiler/javatests/com/google/dart/compiler/end2end/inc/myother2.dart
@@ -1,6 +1,7 @@
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+part of myApp;
 
 class IntBag {
   int contents;
diff --git a/compiler/javatests/com/google/dart/compiler/end2end/inc/myother3.dart b/compiler/javatests/com/google/dart/compiler/end2end/inc/myother3.dart
index d36fbb8..e81353c 100644
--- a/compiler/javatests/com/google/dart/compiler/end2end/inc/myother3.dart
+++ b/compiler/javatests/com/google/dart/compiler/end2end/inc/myother3.dart
@@ -1,6 +1,7 @@
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+part of myApp;
 
 class Other3 {
   static int field;
diff --git a/compiler/javatests/com/google/dart/compiler/end2end/inc/myother3.newstaticfield.dart b/compiler/javatests/com/google/dart/compiler/end2end/inc/myother3.newstaticfield.dart
index d502c43..8394405 100644
--- a/compiler/javatests/com/google/dart/compiler/end2end/inc/myother3.newstaticfield.dart
+++ b/compiler/javatests/com/google/dart/compiler/end2end/inc/myother3.newstaticfield.dart
@@ -1,6 +1,7 @@
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+part of myApp;
 
 class Other3 {
   static int field;
diff --git a/compiler/javatests/com/google/dart/compiler/end2end/inc/myother34.dart b/compiler/javatests/com/google/dart/compiler/end2end/inc/myother34.dart
index cf25243..767c0a2 100644
--- a/compiler/javatests/com/google/dart/compiler/end2end/inc/myother34.dart
+++ b/compiler/javatests/com/google/dart/compiler/end2end/inc/myother34.dart
@@ -1,6 +1,7 @@
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+part of myApp;
 
 class Other3 {
   static int field;
diff --git a/compiler/javatests/com/google/dart/compiler/end2end/inc/myother4.change.dart b/compiler/javatests/com/google/dart/compiler/end2end/inc/myother4.change.dart
index 7433e99..be9df67 100644
--- a/compiler/javatests/com/google/dart/compiler/end2end/inc/myother4.change.dart
+++ b/compiler/javatests/com/google/dart/compiler/end2end/inc/myother4.change.dart
@@ -1,6 +1,7 @@
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+part of myApp;
 
 class Other4 {
   static int field;
diff --git a/compiler/javatests/com/google/dart/compiler/end2end/inc/myother4.dart b/compiler/javatests/com/google/dart/compiler/end2end/inc/myother4.dart
index 1b71811..3039f16 100644
--- a/compiler/javatests/com/google/dart/compiler/end2end/inc/myother4.dart
+++ b/compiler/javatests/com/google/dart/compiler/end2end/inc/myother4.dart
@@ -1,6 +1,7 @@
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+part of myApp;
 
 class Other4 {
   static int field;
diff --git a/compiler/javatests/com/google/dart/compiler/end2end/inc/myother4.newstaticfield.dart b/compiler/javatests/com/google/dart/compiler/end2end/inc/myother4.newstaticfield.dart
index 7433e99..be9df67 100644
--- a/compiler/javatests/com/google/dart/compiler/end2end/inc/myother4.newstaticfield.dart
+++ b/compiler/javatests/com/google/dart/compiler/end2end/inc/myother4.newstaticfield.dart
@@ -1,6 +1,7 @@
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+part of myApp;
 
 class Other4 {
   static int field;
diff --git a/compiler/javatests/com/google/dart/compiler/end2end/inc/myother5.change.dart b/compiler/javatests/com/google/dart/compiler/end2end/inc/myother5.change.dart
index 54da0a0..899983b 100644
--- a/compiler/javatests/com/google/dart/compiler/end2end/inc/myother5.change.dart
+++ b/compiler/javatests/com/google/dart/compiler/end2end/inc/myother5.change.dart
@@ -1,6 +1,7 @@
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+part of myApp;
 
 class Other5 {
   int field;
diff --git a/compiler/javatests/com/google/dart/compiler/end2end/inc/myother5.dart b/compiler/javatests/com/google/dart/compiler/end2end/inc/myother5.dart
index 00011c4..803faa7 100644
--- a/compiler/javatests/com/google/dart/compiler/end2end/inc/myother5.dart
+++ b/compiler/javatests/com/google/dart/compiler/end2end/inc/myother5.dart
@@ -1,6 +1,7 @@
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+part of myApp;
 
 class Other5 {
   int field;
diff --git a/compiler/javatests/com/google/dart/compiler/end2end/inc/myother6.change.dart b/compiler/javatests/com/google/dart/compiler/end2end/inc/myother6.change.dart
index 989b78e..7ac2378 100644
--- a/compiler/javatests/com/google/dart/compiler/end2end/inc/myother6.change.dart
+++ b/compiler/javatests/com/google/dart/compiler/end2end/inc/myother6.change.dart
@@ -1,6 +1,7 @@
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+part of myApp;
 
 class Other6 {
   Other6() { }
diff --git a/compiler/javatests/com/google/dart/compiler/end2end/inc/myother6.dart b/compiler/javatests/com/google/dart/compiler/end2end/inc/myother6.dart
index b89b75d..b1b9245 100644
--- a/compiler/javatests/com/google/dart/compiler/end2end/inc/myother6.dart
+++ b/compiler/javatests/com/google/dart/compiler/end2end/inc/myother6.dart
@@ -1,6 +1,7 @@
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+part of myApp;
 
 class Other6 {
   Other6() { }
diff --git a/compiler/javatests/com/google/dart/compiler/end2end/inc/myother6.removeclass.dart b/compiler/javatests/com/google/dart/compiler/end2end/inc/myother6.removeclass.dart
index 1885bdb..2a17f79 100644
--- a/compiler/javatests/com/google/dart/compiler/end2end/inc/myother6.removeclass.dart
+++ b/compiler/javatests/com/google/dart/compiler/end2end/inc/myother6.removeclass.dart
@@ -1,6 +1,7 @@
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+part of myApp;
 
 class Other6 {
   Other6() { }
diff --git a/compiler/javatests/com/google/dart/compiler/end2end/inc/myother7.dart b/compiler/javatests/com/google/dart/compiler/end2end/inc/myother7.dart
index c5ebbb4..0ca2c06 100644
--- a/compiler/javatests/com/google/dart/compiler/end2end/inc/myother7.dart
+++ b/compiler/javatests/com/google/dart/compiler/end2end/inc/myother7.dart
@@ -1,6 +1,7 @@
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+part of myApp;
 
 class Baz {
   SomeClass2 sc2;
diff --git a/compiler/javatests/com/google/dart/compiler/end2end/inc/some.dart b/compiler/javatests/com/google/dart/compiler/end2end/inc/some.dart
index 8624331..0bb2c0d 100644
--- a/compiler/javatests/com/google/dart/compiler/end2end/inc/some.dart
+++ b/compiler/javatests/com/google/dart/compiler/end2end/inc/some.dart
@@ -1,13 +1,14 @@
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+part of some_lib;
 
-interface SomeClass default SomeClassImpl {
-  SomeClass(arg);
+abstract class SomeClass {
+  factory SomeClass(arg) = SomeClassImpl;
   get message;
 }
 
-interface SomeInterface2 {
+abstract class SomeInterface2 {
 }
 
 // myother7.dart/Baz depends on SomeClass2 which depends on SomeInterface2
diff --git a/compiler/javatests/com/google/dart/compiler/end2end/inc/some.intfchange.dart b/compiler/javatests/com/google/dart/compiler/end2end/inc/some.intfchange.dart
index b3d26c3..a67807e 100644
--- a/compiler/javatests/com/google/dart/compiler/end2end/inc/some.intfchange.dart
+++ b/compiler/javatests/com/google/dart/compiler/end2end/inc/some.intfchange.dart
@@ -1,13 +1,14 @@
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+part of some_lib;
 
-interface SomeClass default SomeClassImpl {
-  SomeClass(arg);
+abstract class SomeClass {
+  factory SomeClass(arg) = SomeClassImpl;
   String get message; // Added return type
 }
 
-interface SomeInterface2 {
+abstract class SomeInterface2 {
 }
 
 // myother7.dart/Baz depends on SomeClass2 which depends on SomeInterface2
diff --git a/compiler/javatests/com/google/dart/compiler/end2end/inc/some.newmethod.dart b/compiler/javatests/com/google/dart/compiler/end2end/inc/some.newmethod.dart
index 92d4924..783aeaa 100644
--- a/compiler/javatests/com/google/dart/compiler/end2end/inc/some.newmethod.dart
+++ b/compiler/javatests/com/google/dart/compiler/end2end/inc/some.newmethod.dart
@@ -1,14 +1,15 @@
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+part of some_lib;
 
-interface SomeClass default SomeClassImpl {
-  SomeClass(arg);
-  String get message;
+abstract class SomeClass {
+  factory SomeClass(arg) = SomeClassImpl;
+  get message;
   newMethod();
 }
 
-interface SomeInterface2 {
+abstract class SomeInterface2 {
 }
 
 // myother7.dart/Baz depends on SomeClass2 which depends on SomeInterface2
diff --git a/compiler/javatests/com/google/dart/compiler/end2end/inc/someimpl.bodychange.dart b/compiler/javatests/com/google/dart/compiler/end2end/inc/someimpl.bodychange.dart
index 1311a06..a3fd2fd 100644
--- a/compiler/javatests/com/google/dart/compiler/end2end/inc/someimpl.bodychange.dart
+++ b/compiler/javatests/com/google/dart/compiler/end2end/inc/someimpl.bodychange.dart
@@ -1,6 +1,7 @@
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+part of someimpl_dart;
 
 class SomeClassImpl implements SomeClass {
   String message_;
diff --git a/compiler/javatests/com/google/dart/compiler/end2end/inc/someimpl.change.dart b/compiler/javatests/com/google/dart/compiler/end2end/inc/someimpl.change.dart
index 4be14ea..667978e 100644
--- a/compiler/javatests/com/google/dart/compiler/end2end/inc/someimpl.change.dart
+++ b/compiler/javatests/com/google/dart/compiler/end2end/inc/someimpl.change.dart
@@ -1,6 +1,7 @@
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+part of someimpl_dart;
 
 class SomeClassImpl implements SomeClass {
   String message_;
diff --git a/compiler/javatests/com/google/dart/compiler/end2end/inc/someimpl.dart b/compiler/javatests/com/google/dart/compiler/end2end/inc/someimpl.dart
index 2be548f..85b6861 100644
--- a/compiler/javatests/com/google/dart/compiler/end2end/inc/someimpl.dart
+++ b/compiler/javatests/com/google/dart/compiler/end2end/inc/someimpl.dart
@@ -1,6 +1,7 @@
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+part of someimpl_dart;
 
 class SomeClassImpl implements SomeClass {
   String message_;
diff --git a/compiler/javatests/com/google/dart/compiler/parser/ClassesInterfaces.dart b/compiler/javatests/com/google/dart/compiler/parser/ClassesInterfaces.dart
index 8001649..9535c88 100644
--- a/compiler/javatests/com/google/dart/compiler/parser/ClassesInterfaces.dart
+++ b/compiler/javatests/com/google/dart/compiler/parser/ClassesInterfaces.dart
@@ -111,16 +111,16 @@
   Baz(x, y, z) : super(x, y, z) {}
 }
 
-interface Foo extends D, E {
+abstract class Foo implements D, E {
   bar();
 }
 
 // Test bounds on type parameters
-interface Bar<K extends Foo, V> extends Foo {
+abstract class Bar<K extends Foo, V> implements Foo {
 }
 
-interface Bar<K extends Foo, V extends Foo> extends Foo {
+abstract class Bar<K extends Foo, V extends Foo> implements Foo {
 }
 
-interface Bar<K, V extends Foo> extends Foo {
+abstract class Bar<K, V extends Foo> implements Foo {
 }
diff --git a/compiler/javatests/com/google/dart/compiler/parser/ErrorMessageLocationTest.java b/compiler/javatests/com/google/dart/compiler/parser/ErrorMessageLocationTest.java
index 78e402b..cb1376a 100644
--- a/compiler/javatests/com/google/dart/compiler/parser/ErrorMessageLocationTest.java
+++ b/compiler/javatests/com/google/dart/compiler/parser/ErrorMessageLocationTest.java
@@ -20,7 +20,7 @@
   public void testUnexpectedTokenErrorMessage() {
     String sourceCode =
         "// Empty comment\n" +
-        "interface foo while Bar {\n" +
+        "class foo while Bar {\n" +
         "}";
 
     DartParserRunner runner = DartParserRunner.parse(getName(), sourceCode);
@@ -30,7 +30,7 @@
     DartCompilationError actualError = actualErrors.get(0);
 
     String errorTokenString = "while";
-    assertEquals(15, actualError.getColumnNumber());
+    assertEquals(11, actualError.getColumnNumber());
     assertEquals(errorTokenString.length(), actualError.getLength());
     assertEquals(2, actualError.getLineNumber());
     assertEquals(sourceCode.indexOf(errorTokenString), actualError.getStartPosition());
diff --git a/compiler/javatests/com/google/dart/compiler/parser/MethodSignatures.dart b/compiler/javatests/com/google/dart/compiler/parser/MethodSignatures.dart
index bceecd6..6a2b414 100644
--- a/compiler/javatests/com/google/dart/compiler/parser/MethodSignatures.dart
+++ b/compiler/javatests/com/google/dart/compiler/parser/MethodSignatures.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-interface MethodSignatureSyntax {
+abstract class MethodSignatureSyntax {
   a();
   b(x);
   c(int x);
diff --git a/compiler/javatests/com/google/dart/compiler/parser/NegativeParserTest.java b/compiler/javatests/com/google/dart/compiler/parser/NegativeParserTest.java
index f627314..65a57e1 100644
--- a/compiler/javatests/com/google/dart/compiler/parser/NegativeParserTest.java
+++ b/compiler/javatests/com/google/dart/compiler/parser/NegativeParserTest.java
@@ -21,13 +21,26 @@
  * Negative Parser/Syntax tests.
  */
 public class NegativeParserTest extends CompilerTestCase {
+  public void test_deprecatedGetterSyntax() {
+    parseExpectErrors("get foo() {}", errEx(ParserErrorCode.DEPRECATED_GETTER, 1, 5, 3));
+  }
+
+  public void test_deprecatedAbstract() {
+    parseExpectWarnings(makeCode(
+        "// filler filler filler filler filler filler filler filler filler filler",
+        "abstract class A {",
+        "  abstract m();",
+        "}",
+        ""), errEx(ParserErrorCode.DEPRECATED_ABSTRACT_METHOD, 3, 3, 8));
+  }
+  
   public void testFieldInitializerInRedirectionConstructor1() {
     parseExpectErrors(
         "class A { A(x) { } A.foo() : this(5), y = 5; var y; }",
         errEx(ParserErrorCode.REDIRECTING_CONSTRUCTOR_OTHER, 1, 39, 5),
         errEx(ParserErrorCode.REDIRECTING_CONSTRUCTOR_ITSELF, 1, 30, 7));
   }
-
+  
   public void testFieldInitializerInRedirectionConstructor2() {
     parseExpectErrors(
         "class A { A(x) { } A.foo() : y = 5, this(5); var y; }",
@@ -175,9 +188,15 @@
         errEx(ParserErrorCode.DEFAULT_VALUE_CAN_NOT_BE_SPECIFIED_IN_CLOSURE, 1, 41, 5));
   }
 
-  public void test_namedParameterValue_inSetter() {
+  public void test_optionalPositionalParameterValue_inSetter() {
     parseExpectErrors(
         "class A { set f([int b]); }",
+        errEx(ParserErrorCode.OPTIONAL_POSITIONAL_PARAMETER_NOT_ALLOWED, 1, 18, 5));
+  }
+  
+  public void test_namedParameterValue_inSetter() {
+    parseExpectErrors(
+        "class A { set f({int b}); }",
         errEx(ParserErrorCode.NAMED_PARAMETER_NOT_ALLOWED, 1, 18, 5));
   }
 
@@ -187,9 +206,15 @@
         errEx(ParserErrorCode.MISSING_OPTIONAL_PARAMETER_END, 1, 43, 1));
   }
 
-  public void test_namedParameterValue_inOperator() {
+  public void test_optionalPositionalParameterValue_inOperator() {
     parseExpectErrors(
         "class A { operator []=(int a, [int b]); }",
+        errEx(ParserErrorCode.OPTIONAL_POSITIONAL_PARAMETER_NOT_ALLOWED, 1, 32, 5));
+  }
+  
+  public void test_namedParameterValue_inOperator() {
+    parseExpectErrors(
+        "class A { operator []=(int a, {int b}); }",
         errEx(ParserErrorCode.NAMED_PARAMETER_NOT_ALLOWED, 1, 32, 5));
   }
 
@@ -352,6 +377,7 @@
   public void testDeprecatedFactoryInInterface() {
     parseExpectWarnings(
         "interface foo factory bar {}",
+        errEx(ParserErrorCode.DEPRECATED_INTERFACE, 1, 1, 9),
         errEx(ParserErrorCode.DEPRECATED_USE_OF_FACTORY_KEYWORD, 1, 15, 7));
   }
 
@@ -381,8 +407,18 @@
             "// filler filler filler filler filler filler filler filler filler filler",
             "abstract interface A {",
             "}"),
+        errEx(ParserErrorCode.DEPRECATED_INTERFACE, 2, 10, 9),
         errEx(ParserErrorCode.ABSTRACT_TOP_LEVEL_ELEMENT, 2, 1, 8));
   }
+  
+  public void test_deprecatedInterface() {
+    parseExpectErrors(
+        Joiner.on("\n").join(
+            "// filler filler filler filler filler filler filler filler filler filler",
+            "interface A {",
+            "}"),
+            errEx(ParserErrorCode.DEPRECATED_INTERFACE, 2, 1, 9));
+  }
 
   public void test_abstractTopLevel_typedef() {
     parseExpectErrors(
@@ -396,17 +432,6 @@
         errEx(ParserErrorCode.ABSTRACT_TOP_LEVEL_ELEMENT, 1, 1, 8));
   }
 
-  public void test_abstractMethodWithBody() {
-    parseExpectErrors(
-        Joiner.on("\n").join(
-            "// filler filler filler filler filler filler filler filler filler filler",
-            "class A {",
-            "  abstract foo() {",
-            "  }",
-            "}"),
-        errEx(ParserErrorCode.ABSTRACT_METHOD_WITH_BODY, 3, 12, 3));
-  }
-
   public void test_incompleteExpressionInInterpolation() {
     parseExpectErrors(
         "var s = 'fib(3) = ${fib(3}';",
@@ -421,6 +446,7 @@
             "  foo() {",
             "  }",
             "}"),
+        errEx(ParserErrorCode.DEPRECATED_INTERFACE, 2, 1, 9),
         errEx(ParserErrorCode.INTERFACE_METHOD_WITH_BODY, 3, 3, 3));
   }
 
@@ -578,7 +604,7 @@
             "class MyClass {}",
             "class MyInterface {}",
             "topLevelMethod() {}",
-            "int get topLevelGetter() {return 0;}",
+            "int get topLevelGetter {return 0;}",
             "void set topLevelSetter(int v) {}",
             "typedef void MyTypeDef();",
             ""));
@@ -630,7 +656,7 @@
             "  }",
             "}",
             "topLevelMethod() {}",
-            "int get topLevelGetter() {return 0;}",
+            "int get topLevelGetter {return 0;}",
             "void set topLevelSetter(int setterParam) {}",
             "typedef void MyTypeDef();",
             ""));
@@ -750,6 +776,7 @@
             "interface A native 'N' {",
             "}",
             ""),
+        errEx(ParserErrorCode.DEPRECATED_INTERFACE, 2, 1, 9),
         errEx(ParserErrorCode.NATIVE_ONLY_CLASS, 2, 13, 6));
   }
 
diff --git a/compiler/javatests/com/google/dart/compiler/parser/ParserRecoveryTest.java b/compiler/javatests/com/google/dart/compiler/parser/ParserRecoveryTest.java
index 6c4f95b..b615cdf 100644
--- a/compiler/javatests/com/google/dart/compiler/parser/ParserRecoveryTest.java
+++ b/compiler/javatests/com/google/dart/compiler/parser/ParserRecoveryTest.java
@@ -48,6 +48,63 @@
     // Implemented elsewhere
   }
 
+  public void test_incompleteFunctionExpression() {
+    DartParserRunner parserRunner = parseSource(Joiner.on("\n").join(
+        "// filler filler filler filler filler filler filler filler filler filler",
+        "main() {",
+        "  var v = (AAA a, BB)",
+        "}"));
+    DartUnit unit = parserRunner.getDartUnit();
+    assertEquals(
+        Joiner.on("\n").join(
+            "// unit test_incompleteFunctionExpression",
+            "",
+            "main() {",
+            "  var v = (AAA a, BB) {",
+            "  };",
+            "}",
+            ""),
+        unit.toString());
+  }
+
+  public void test_incompleteFunctionExpression_qualifiedType() {
+    DartParserRunner parserRunner = parseSource(Joiner.on("\n").join(
+        "// filler filler filler filler filler filler filler filler filler filler",
+        "main() {",
+        "  var v = (pref.AAA a, BB)",
+        "}"));
+    DartUnit unit = parserRunner.getDartUnit();
+    assertEquals(
+        Joiner.on("\n").join(
+            "// unit test_incompleteFunctionExpression_qualifiedType",
+            "",
+            "main() {",
+            "  var v = (pref.AAA a, BB) {",
+            "  };",
+            "}",
+            ""),
+        unit.toString());
+  }
+  
+  public void test_incompleteFunctionExpression_typeArguments() {
+    DartParserRunner parserRunner = parseSource(Joiner.on("\n").join(
+        "// filler filler filler filler filler filler filler filler filler filler",
+        "main() {",
+        "  var v = (AAA<T1, T2<T3, T4>, T5> a, BB)",
+        "}"));
+    DartUnit unit = parserRunner.getDartUnit();
+    assertEquals(
+        Joiner.on("\n").join(
+            "// unit test_incompleteFunctionExpression_typeArguments",
+            "",
+            "main() {",
+            "  var v = (AAA<T1, T2<T3, T4>, T5> a, BB) {",
+            "  };",
+            "}",
+            ""),
+            unit.toString());
+  }
+
   public void testVarOnMethodDefinition() {
     // This syntax is illegal, and should produce errors, but since it is a common error,
     // we want to make sure it produce a valid AST for editor users
diff --git a/compiler/javatests/com/google/dart/compiler/parser/SyntaxTest.java b/compiler/javatests/com/google/dart/compiler/parser/SyntaxTest.java
index 64474bd..f977713 100644
--- a/compiler/javatests/com/google/dart/compiler/parser/SyntaxTest.java
+++ b/compiler/javatests/com/google/dart/compiler/parser/SyntaxTest.java
@@ -55,6 +55,16 @@
         "export 'a.dart';"));
   }
 
+  public void test_hasParseErrors_true() {
+    DartUnit unit = parseSource("garbage").getDartUnit();
+    assertTrue(unit.hasParseErrors());
+  }
+  
+  public void test_hasParseErrors_false() {
+    DartUnit unit = parseSource("// empty").getDartUnit();
+    assertFalse(unit.hasParseErrors());
+  }
+  
   public void test_importDirective_noUri() {
     DartUnit unit = parseUnit("test.dart", Joiner.on("\n").join(
         "library lib;",
@@ -78,7 +88,7 @@
     parseUnit("getter.dart", Joiner.on("\n").join(
         "class G {",
         "  // Old getter syntax",
-        "  int get g1() => 1;",
+        "  int get g1 => 1;",
         "  // New getter syntax",
         "  int get g2 => 2;",
         "}"));
@@ -1025,11 +1035,10 @@
     parseUnit("phony_test_missing_factory_body.dart",
         Joiner.on("\n").join(
             "class A {",
-            "  abstract factory A.c();",  // error - no body
+            "  factory A.c();",  // error - no body
             "  A() {}",
             "}"),
-            ParserErrorCode.FACTORY_CANNOT_BE_ABSTRACT, 2, 12,
-            ParserErrorCode.EXPECTED_FUNCTION_STATEMENT_BODY, 2, 25);
+            ParserErrorCode.EXPECTED_FUNCTION_STATEMENT_BODY, 2, 16);
   }
 
   public void test_factoryAbstractStatic() throws Exception {
@@ -1037,25 +1046,10 @@
       Joiner.on("\n").join(
         "class A {",
         "  A() {}",
-        "  abstract factory A.named1() { return new A();}",
+        "  factory A.named1() { return new A();}",
         "  static factory A.named2() { return new A();}",
-        "  static abstract factory A.named3() { return new A();}",
         "}"),
-        ParserErrorCode.FACTORY_CANNOT_BE_ABSTRACT, 3, 12,
-        ParserErrorCode.FACTORY_CANNOT_BE_STATIC, 4, 10,
-        ParserErrorCode.STATIC_MEMBERS_CANNOT_BE_ABSTRACT, 5, 10,
-        ParserErrorCode.FACTORY_CANNOT_BE_STATIC, 5, 19);
-  }
-
-  public void test_staticAbstractMember() throws Exception {
-    parseUnit("phony_test_static_abstract_member.dart",
-        Joiner.on("\n").join(
-            "class A {",
-            "  static abstract var foo;",
-            "  static abstract bar();",
-            "}"),
-            ParserErrorCode.STATIC_MEMBERS_CANNOT_BE_ABSTRACT, 2, 10,
-            ParserErrorCode.STATIC_MEMBERS_CANNOT_BE_ABSTRACT, 3, 10);
+        ParserErrorCode.FACTORY_CANNOT_BE_STATIC, 4, 10);
   }
 
   public void test_factoryInInterface() throws Exception {
@@ -1064,21 +1058,11 @@
             "interface A {",
             "  factory A();",
             "}"),
+            ParserErrorCode.DEPRECATED_INTERFACE, 1, 1,
             ParserErrorCode.FACTORY_MEMBER_IN_INTERFACE, 2, 3,
             ParserErrorCode.EXPECTED_FUNCTION_STATEMENT_BODY, 2, 14);
   }
 
-  public void test_AbstractVar() throws Exception {
-    parseUnit("phony_test_abstract_var.dart",
-        Joiner.on("\n").join(
-            "class A {",
-            "  abstract var a;",
-            "  abstract final b;",
-            "}"),
-            ParserErrorCode.DISALLOWED_ABSTRACT_KEYWORD, 2, 3,
-            ParserErrorCode.DISALLOWED_ABSTRACT_KEYWORD, 3, 3);
-  }
-
   public void test_localVariable_const() {
     DartUnit unit = parseUnit("constVar.dart", makeCode(
         "main() {",
@@ -1401,11 +1385,10 @@
     parseUnit("phony_test_abstract_in_interface.dart",
         Joiner.on("\n").join(
             "interface A {",
-            "  abstract var foo;",
-            "  abstract bar();",
+            "  var foo;",
+            "  bar();",
             "}"),
-            ParserErrorCode.ABSTRACT_MEMBER_IN_INTERFACE, 2, 3,
-            ParserErrorCode.ABSTRACT_MEMBER_IN_INTERFACE, 3, 3);
+            ParserErrorCode.DEPRECATED_INTERFACE, 1, 1);
   }
 
   public void test_voidParameterField() throws Exception {
@@ -1458,6 +1441,7 @@
             "  static foo();",
             "  static var bar;",
             "}"),
+            ParserErrorCode.DEPRECATED_INTERFACE, 1, 1,
             ParserErrorCode.NON_FINAL_STATIC_MEMBER_IN_INTERFACE, 2, 3,
             ParserErrorCode.NON_FINAL_STATIC_MEMBER_IN_INTERFACE, 3, 3);
   }
@@ -1483,13 +1467,6 @@
             ParserErrorCode.EXPECTED_TOKEN, 2, 15);
   }
 
-  public void test_abstractMethod_withModifier() {
-    parseUnit("test.dart", Joiner.on("\n").join(
-        "class C {",
-        "  abstract m(a, b, c);",
-        "}"));
-  }
-
   public void test_abstractMethod_withoutModifier() {
     parseUnit("test.dart", Joiner.on("\n").join(
         "class C {",
diff --git a/compiler/javatests/com/google/dart/compiler/parser/TryCatch.dart b/compiler/javatests/com/google/dart/compiler/parser/TryCatch.dart
index ea95022..4708733 100644
--- a/compiler/javatests/com/google/dart/compiler/parser/TryCatch.dart
+++ b/compiler/javatests/com/google/dart/compiler/parser/TryCatch.dart
@@ -2,11 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-interface TestException1 {
+abstract class TestException1 {
   int foo();
 }
 
-interface TestException2 {
+abstract class TestException2 {
   int bar();
 }
 
diff --git a/compiler/javatests/com/google/dart/compiler/resolver/CompileTimeConstantTest.java b/compiler/javatests/com/google/dart/compiler/resolver/CompileTimeConstantTest.java
index 765bab7..ae86c27 100644
--- a/compiler/javatests/com/google/dart/compiler/resolver/CompileTimeConstantTest.java
+++ b/compiler/javatests/com/google/dart/compiler/resolver/CompileTimeConstantTest.java
@@ -865,11 +865,11 @@
         Joiner.on("\n").join(
             "class Object {}",
             "class Function {}",
-            "Function get topLevelGetter() => () {};",
+            "Function get topLevelGetter => () {};",
             "topLevel([var x = topLevelGetter]) { x(); }",
             "main() { topLevel(); }"),
         errEx(ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION, 4, 19, 14),
-        errEx(ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION, 3, 1, 39));
+        errEx(ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION, 3, 1, 37));
   }
   
   /** 
@@ -880,7 +880,7 @@
     resolveAndTestCtConstExpectErrors(
         Joiner.on("\n").join(    
             "class Object {}",
-            "interface int {}",
+            "class int {}",
             "class A {",
             "  const int value1 = (1 << 5) - 1;",
             "  const int value2 = value1 & 0xFFFF;",
@@ -901,7 +901,7 @@
     resolveAndTestCtConstExpectErrors(
         Joiner.on("\n").join(    
             "class Object {}",
-            "interface double {}",
+            "class double {}",
             "class A {",
             "  const double value1 = (1.0 * 5.0) - 1.0;",
             "  const double value2 = value1 + 99.0;",
@@ -922,7 +922,7 @@
     resolveAndTestCtConstExpectErrors(
         Joiner.on("\n").join(    
             "class Object {}",
-            "interface double {}",
+            "class double {}",
             "class A {",
             "  const double value1 = (1 * 5) - 1.0;",
             "  const double value2 = value1 + 99.0;",
@@ -943,7 +943,7 @@
     resolveAndTestCtConstExpectErrors(
         Joiner.on("\n").join(    
             "class Object {}",
-            "interface int {}",
+            "class int {}",
             "class A {",
             "  const int value1 = ('Invalid') - 1;",
             "  const int value2 = value1 & 0xFFFF;",
@@ -958,7 +958,7 @@
     resolveAndTestCtConstExpectErrors(
         Joiner.on("\n").join(            
             "class Object {}",
-            "interface int {}",                             
+            "class int {}",                             
             "class A {",
             "  const int value3 = ('Invalid') + 1;",
             "  const int value4 = value3 & 0xFFFF;",
@@ -970,7 +970,7 @@
     resolveAndTestCtConstExpectErrors(
         Joiner.on("\n").join(            
             "class Object {}",
-            "interface int {}",
+            "class int {}",
             "class A {",                             
             "  const int value5 = ('Invalid') * 1;",
             "  const int value6 = value5 & 0xFFFF;",            
@@ -982,7 +982,7 @@
     resolveAndTestCtConstExpectErrors(
         Joiner.on("\n").join(                
             "class Object {}",
-            "interface int {}",
+            "class int {}",
             "class A {",
             "  const int value7 = ('Invalid') / 1;",
             "  const int value8 = value7 & 0xFFFF;",                        
diff --git a/compiler/javatests/com/google/dart/compiler/resolver/NegativeResolverTest.java b/compiler/javatests/com/google/dart/compiler/resolver/NegativeResolverTest.java
index bba5949..28d4dc5 100644
--- a/compiler/javatests/com/google/dart/compiler/resolver/NegativeResolverTest.java
+++ b/compiler/javatests/com/google/dart/compiler/resolver/NegativeResolverTest.java
@@ -246,20 +246,6 @@
   }
 
   /**
-   * Section 7.8: It is a compile-time error if the extends clause of a class C includes a type
-   * expression that does not denote a class available in the lexical scope of C.
-   */
-  public void test_classExtendsInterface() {
-    checkSourceErrors(
-        makeCode(
-            "// filler filler filler filler filler filler filler filler filler filler",
-            "interface I {}",
-            "class A extends I {",
-            "}"),
-        errEx(ResolverErrorCode.NOT_A_CLASS, 3, 17, 1));
-  }
-
-  /**
    * Class can implement class, this causes implementation of an implicit interface.
    */
   public void test_classImplementsClass() {
@@ -270,17 +256,6 @@
         "}"));
   }
 
-  /**
-   * Interface can extend class, this causes implementation of an implicit interface.
-   */
-  public void test_interfaceExtendsClass() {
-    checkSourceErrors(makeCode(
-        "// filler filler filler filler filler filler filler filler filler filler",
-        "class A {}",
-        "interface B extends A {",
-        "}"));
-  }
-
   public void tesClassImplementsUnknownInterfaceNegativeTest() {
     checkNumErrors("ClassImplementsUnknownInterfaceNegativeTest.dart", 1);
   }
@@ -341,7 +316,7 @@
     checkSourceErrors(
         makeCode(
             "// filler filler filler filler filler filler filler filler filler filler",
-            "get foo() {}",
+            "get foo {}",
             "set bar(x) {}",
             "class foo {}",
             "class bar{}"),
@@ -355,7 +330,7 @@
             "// filler filler filler filler filler filler filler filler filler filler",
             "class foo {}",
             "class bar {}",
-            "get foo() {}",
+            "get foo {}",
             "set bar(x) {}"),
         errEx(ResolverErrorCode.DUPLICATE_TOP_LEVEL_DECLARATION, 2, 7, 3),
         errEx(ResolverErrorCode.DUPLICATE_TOP_LEVEL_DECLARATION, 4, 5, 3));
@@ -370,7 +345,7 @@
   public void test_nameShadow_topLevel_getter_setter() {
     checkSourceErrors(makeCode(
         "// filler filler filler filler filler filler filler filler filler filler",
-        "get bar() {}",
+        "get bar {}",
         "set bar(x) {}"));
   }
 
@@ -378,7 +353,7 @@
     checkSourceErrors(makeCode(
         "// filler filler filler filler filler filler filler filler filler filler",
         "set bar(x) {}",
-        "get bar() {}"));
+        "get bar {}"));
   }
   
   public void test_nameShadow_topLevel_setter_variable() {
@@ -405,8 +380,8 @@
     checkSourceErrors(
         makeCode(
             "// filler filler filler filler filler filler filler filler filler filler",
-            "get bar() {}",
-            "get bar() {}"),
+            "get bar {}",
+            "get bar {}"),
         errEx(ResolverErrorCode.DUPLICATE_TOP_LEVEL_DECLARATION, 2, 5, 3),
         errEx(ResolverErrorCode.DUPLICATE_TOP_LEVEL_DECLARATION, 3, 5, 3));
     assertEquals(
@@ -648,7 +623,7 @@
   public void test_nameShadow_field_interfaceMethodParameter() {
     checkSourceErrors(makeCode(
         "// filler filler filler filler filler filler filler filler filler filler",
-        "interface A {",
+        "abstract class A {",
         "  var a;",
         "  foo(a);",
         "}"));
@@ -681,7 +656,7 @@
             "// filler filler filler filler filler filler filler filler filler filler",
             "class A {",
             "  set foo(x) {}",
-            "  get foo() {}",
+            "  get foo {}",
             "  var foo;",
             "}"),
         errEx(ResolverErrorCode.DUPLICATE_MEMBER, 4, 7, 3),
@@ -737,7 +712,7 @@
             "// filler filler filler filler filler filler filler filler filler filler",
             "class A {",
             "  var foo;",
-            "  get foo() {}",
+            "  get foo {}",
             "}"),
         errEx(ResolverErrorCode.DUPLICATE_MEMBER, 3, 7, 3),
         errEx(ResolverErrorCode.DUPLICATE_MEMBER, 4, 7, 3));
@@ -751,9 +726,9 @@
         makeCode(
             "// filler filler filler filler filler filler filler filler filler filler",
             "class A {",
-            "  get foo() {}",
+            "  get foo {}",
             "  set foo(x) {}",
-            "  get foo() {}",
+            "  get foo {}",
             "}"),
         errEx(ResolverErrorCode.DUPLICATE_MEMBER, 3, 7, 3),
         errEx(ResolverErrorCode.DUPLICATE_MEMBER, 5, 7, 3));
@@ -768,7 +743,7 @@
             "// filler filler filler filler filler filler filler filler filler filler",
             "class A {",
             "  set foo(x) {}",
-            "  get foo() {}",
+            "  get foo {}",
             "  set foo(x) {}",
             "}"),
         errEx(ResolverErrorCode.DUPLICATE_MEMBER, 3, 7, 3),
@@ -783,7 +758,7 @@
         makeCode(
             "// filler filler filler filler filler filler filler filler filler filler",
             "class A {",
-            "  get foo() {}",
+            "  get foo {}",
             "  var foo;",
             "}"),
         errEx(ResolverErrorCode.DUPLICATE_MEMBER, 3, 7, 3),
@@ -864,10 +839,6 @@
         errEx(ResolverErrorCode.CONST_CONSTRUCTOR_MUST_CALL_CONST_SUPER, 3, 9, 1));
   }
 
-  public void testRawTypesNegativeTest() {
-    checkNumErrors("RawTypesNegativeTest.dart", 6);
-  }
-
   public void testConstConstructorNonFinalFieldsNegativeTest() {
     checkSourceErrors(
         makeCode(
@@ -881,7 +852,7 @@
             "  final bar;",
             "  var baz;",
             "}",
-            "interface C {",
+            "abstract class C {",
             "  var x;",
             "}"),
         errEx(ResolverErrorCode.CONST_CLASS_WITH_NONFINAL_FIELDS, 3, 7, 1),
@@ -1048,17 +1019,6 @@
         errEx(ResolverErrorCode.THIS_IN_INITIALIZER_AS_EXPRESSION, 5, 25, 4));
   }
 
-  public void testInterfaceWithConcreteConstructorAndDefaultNonImlplementing() throws Exception {
-    checkSourceErrors(
-        makeCode(
-            "// filler filler filler filler filler filler filler filler filler filler",
-            "class A {}",
-            "interface I default A {",
-            "  I();",
-            "}"),
-        errEx(ResolverErrorCode.DEFAULT_CONSTRUCTOR_UNRESOLVED, 4, 3, 4));
-  }
-
   public void test_resolvedTypeVariableBounds_inFunctionTypeAlias() throws Exception {
     DartUnit unit =
         parseUnit(
diff --git a/compiler/javatests/com/google/dart/compiler/resolver/RawTypesNegativeTest.dart b/compiler/javatests/com/google/dart/compiler/resolver/RawTypesNegativeTest.dart
deleted file mode 100644
index aaa3bb3..0000000
--- a/compiler/javatests/com/google/dart/compiler/resolver/RawTypesNegativeTest.dart
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-interface Super<T> {}
-
-interface Sub<S> extends Super<S> default SubImplementation<S> {
-  Sub();
-}
-
-class SubImplementation<U> implements Sub<U> {
-  SubImplementation() {}
-}
-
-class A {
-  main() {
-    Sub<A, A> s = new Sub();
-    Sub<A, A> s2 = new Sub<A>();
-    Sub<A, A> s3;
-    A<A> s4;
-  }
-}
diff --git a/compiler/javatests/com/google/dart/compiler/resolver/ResolverCompilerTest.java b/compiler/javatests/com/google/dart/compiler/resolver/ResolverCompilerTest.java
index 50a93b2..1c71828 100644
--- a/compiler/javatests/com/google/dart/compiler/resolver/ResolverCompilerTest.java
+++ b/compiler/javatests/com/google/dart/compiler/resolver/ResolverCompilerTest.java
@@ -3,11 +3,9 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.google.dart.compiler.resolver;
 
-import com.google.common.base.Joiner;
 import com.google.common.collect.Lists;
 import com.google.common.io.CharStreams;
 import com.google.dart.compiler.CompilerTestCase;
-import com.google.dart.compiler.DartCompilationError;
 import com.google.dart.compiler.Source;
 import com.google.dart.compiler.ast.ASTVisitor;
 import com.google.dart.compiler.ast.DartClass;
@@ -49,7 +47,6 @@
 
   public void test_parameters_withFunctionAlias() throws Exception {
     AnalyzeLibraryResult libraryResult = analyzeLibrary(
-        "Test.dart",
         "typedef List<T> TypeAlias<T, U extends List<T>>(List<T> arg, U u);");
     assertErrors(libraryResult.getCompilationErrors());
     DartUnit unit = libraryResult.getLibraryUnitResult().getUnits().iterator().next();
@@ -75,10 +72,10 @@
    * This test succeeds if no exceptions are thrown.
    */
   public void test_recursiveTypes() throws Exception {
-    analyzeLibrary("test.dart", Joiner.on("\n").join(
+    analyzeLibrary(
         "class A extends A implements A {}",
         "class B extends C {}",
-        "class C extends B {}"));
+        "class C extends B {}");
   }
 
   /**
@@ -87,16 +84,13 @@
    */
   public void test_resolution_on_class_decls() throws Exception {
     AnalyzeLibraryResult libraryResult = analyzeLibrary(
-        "Test.dart",
-        Joiner.on("\n").join(
             "class A {}",
-            "interface B<T> default C {}",
+            "abstract class B<T> {}",
             "class C<T> extends A implements B<T> {}",
             "class D extends C<int> {}",
             "class E implements C<int> {}",
             "class F<T extends A> {}",
-            "class G extends F<C<int>> {}",
-            "interface H<T> default C<T> {}"));
+            "class G extends F<C<int>> {}");
     assertErrors(libraryResult.getCompilationErrors());
     DartUnit unit = libraryResult.getLibraryUnitResult().getUnits().iterator().next();
     List<DartNode> nodes = unit.getTopLevelNodes();
@@ -114,8 +108,6 @@
     assertEquals("F", F.getClassName());
     DartClass G = (DartClass) nodes.get(6);
     assertEquals("G", G.getClassName());
-    DartClass H = (DartClass) nodes.get(7);
-    assertEquals("H", H.getClassName());
 
     // class A
     assertNotNull(A.getName().getElement());
@@ -131,8 +123,6 @@
     assertNotNull(T.getName().getElement());
     assertTrue(T.getName().getElement() instanceof TypeVariableElement);
     assertEquals("T", T.getName().getName());
-    assertNotNull(B.getDefaultClass().getExpression().getElement());
-    assertSame(C.getElement(), B.getDefaultClass().getExpression().getElement());
 
     // class C<T> extends A implements B<T> {}
     assertNotNull(C.getName().getElement());
@@ -193,24 +183,6 @@
     assertEquals(
         "int",
         typeArg.getTypeArguments().get(0).getIdentifier().getElement().getOriginalName());
-
-    // class H<T> extends C<T> {}",
-    assertNotNull(H.getName().getElement());
-    assertSame(H.getElement(), H.getName().getElement());
-    assertEquals(1, H.getTypeParameters().size());
-    T = H.getTypeParameters().get(0);
-    assertNotNull(T);
-    assertNotNull(T.getName().getElement());
-    assertTrue(T.getName().getElement() instanceof TypeVariableElement);
-    assertNotNull(H.getDefaultClass().getExpression().getElement());
-    assertSame(C.getElement(), H.getDefaultClass().getExpression().getElement());
-    // This type parameter T resolves to the Type variable on the default class, so it
-    // isn't the same type variable instance specified in this interface declaration,
-    // though it must have the same name.
-    DartTypeParameter defaultT = H.getDefaultClass().getTypeParameters().get(0);
-    assertNotNull(defaultT.getName().getElement());
-    assertTrue(defaultT.getName().getElement() instanceof TypeVariableElement);
-    assertEquals(T.getName().getElement().getName(), defaultT.getName().getElement().getName());
   }
 
   /**
@@ -218,15 +190,13 @@
    */
   public void test_resolveConstructor_implicit() throws Exception {
     AnalyzeLibraryResult libraryResult = analyzeLibrary(
-        "Test.dart",
-        Joiner.on("\n").join(
-            "class F {",
-            "}",
-            "class Test {",
-            "  foo() {",
-            "    new F();",
-            "  }",
-            "}"));
+        "class F {",
+        "}",
+        "class Test {",
+        "  foo() {",
+        "    new F();",
+        "  }",
+        "}");
     assertErrors(libraryResult.getCompilationErrors());
     DartUnit unit = libraryResult.getLibraryUnitResult().getUnits().iterator().next();
     DartNewExpression newExpression = findNodeBySource(unit, "new F()");
@@ -237,15 +207,13 @@
 
   public void test_resolveConstructor_noSuchConstructor() throws Exception {
     AnalyzeLibraryResult libraryResult = analyzeLibrary(
-        "Test.dart",
-        Joiner.on("\n").join(
-            "class A {",
-            "}",
-            "class Test {",
-            "  foo() {",
-            "    new A.foo();",
-            "  }",
-            "}"));
+        "class A {",
+        "}",
+        "class Test {",
+        "  foo() {",
+        "    new A.foo();",
+        "  }",
+        "}");
     assertErrors(
         libraryResult.getErrors(),
         errEx(ResolverErrorCode.NEW_EXPRESSION_NOT_CONSTRUCTOR, 5, 11, 3));
@@ -257,515 +225,32 @@
 
   public void test_resolveConstructor_super_implicitDefault() throws Exception {
     AnalyzeLibraryResult libraryResult = analyzeLibrary(
-        "Test.dart",
-        Joiner.on("\n").join(
-            "// filler filler filler filler filler filler filler filler filler filler",
-            "class A {",
-            "}",
-            "class B extends A {",
-            "  B() : super() {}",
-            "}",
-            ""));
+        "// filler filler filler filler filler filler filler filler filler filler",
+        "class A {",
+        "}",
+        "class B extends A {",
+        "  B() : super() {}",
+        "}",
+        "");
     assertErrors(libraryResult.getErrors());
   }
 
   public void test_superMethodInvocation_inConstructorInitializer() throws Exception {
     AnalyzeLibraryResult libraryResult = analyzeLibrary(
-        "Test.dart",
-        Joiner.on("\n").join(
-            "// filler filler filler filler filler filler filler filler filler filler",
-            "class A {",
-            "  foo() {}",
-            "}",
-            "class B extends A {",
-            "  var x;",
-            "  B() : x = super.foo() {}",
-            "}",
-            ""));
+        "// filler filler filler filler filler filler filler filler filler filler",
+        "class A {",
+        "  foo() {}",
+        "}",
+        "class B extends A {",
+        "  var x;",
+        "  B() : x = super.foo() {}",
+        "}",
+        "");
     assertErrors(
         libraryResult.getErrors(),
         errEx(ResolverErrorCode.SUPER_METHOD_INVOCATION_IN_CONSTRUCTOR_INITIALIZER, 7, 13, 11));
   }
 
-  /**
-   * We should be able to resolve implicit default constructor.
-   */
-  public void test_resolveInterfaceConstructor_implicitDefault_noInterface_noFactory()
-      throws Exception {
-    AnalyzeLibraryResult libraryResult = analyzeLibrary(
-        "Test.dart",
-        Joiner.on("\n").join(
-            "interface I default F {",
-            "}",
-            "class F implements I {",
-            "}",
-            "class Test {",
-            "  foo() {",
-            "    new I();",
-            "  }",
-            "}"));
-    assertErrors(libraryResult.getCompilationErrors());
-    DartUnit unit = libraryResult.getLibraryUnitResult().getUnits().iterator().next();
-    DartNewExpression newExpression = findNodeBySource(unit, "new I()");
-    ConstructorElement constructorElement = newExpression.getElement();
-    assertNotNull(constructorElement);
-    assertEquals("", getElementSource(constructorElement));
-  }
-
-  /**
-   * We should be able to resolve implicit default constructor.
-   */
-  public void test_resolveInterfaceConstructor_implicitDefault_hasInterface_noFactory()
-      throws Exception {
-    AnalyzeLibraryResult libraryResult = analyzeLibrary(
-        "Test.dart",
-        Joiner.on("\n").join(
-            "interface I default F {",
-            "}",
-            "class F implements I {",
-            "}",
-            "class Test {",
-            "  foo() {",
-            "    new I();",
-            "  }",
-            "}"));
-    assertErrors(libraryResult.getCompilationErrors());
-    DartUnit unit = libraryResult.getLibraryUnitResult().getUnits().iterator().next();
-    DartNewExpression newExpression = findNodeBySource(unit, "new I()");
-    ConstructorElement constructorElement = newExpression.getElement();
-    assertNotNull(constructorElement);
-    assertEquals("", getElementSource(constructorElement));
-  }
-
-  /**
-   * We should be able to resolve implicit default constructor.
-   */
-  public void test_resolveInterfaceConstructor_implicitDefault_noInterface_hasFactory()
-      throws Exception {
-    AnalyzeLibraryResult libraryResult = analyzeLibrary(
-        "Test.dart",
-        Joiner.on("\n").join(
-            "interface I default F {",
-            "}",
-            "class F implements I {",
-            "  F();",
-            "}",
-            "class Test {",
-            "  foo() {",
-            "    new I();",
-            "  }",
-            "}"));
-    assertErrors(libraryResult.getCompilationErrors());
-    DartUnit unit = libraryResult.getLibraryUnitResult().getUnits().iterator().next();
-    DartNewExpression newExpression = findNodeBySource(unit, "new I()");
-    ConstructorElement constructorElement = newExpression.getElement();
-    assertEquals(true, getElementSource(constructorElement).contains("F()"));
-  }
-
-  /**
-   * If "const I()" is used, then constructor should be "const".
-   */
-  public void test_resolveInterfaceConstructor_const() throws Exception {
-    AnalyzeLibraryResult libraryResult = analyzeLibrary(
-        "Test.dart",
-        Joiner.on("\n").join(
-            "interface I default F {",
-            "  I(int x);",
-            "}",
-            "class F implements I {",
-            "  F(int y) {}",
-            "}",
-            "class Test {",
-            "  foo() {",
-            "    const I(0);",
-            "  }",
-            "}"));
-    assertErrors(
-        libraryResult.getCompilationErrors(),
-        errEx(ResolverErrorCode.CONST_AND_NONCONST_CONSTRUCTOR, 9, 5, 10));
-  }
-
-  /**
-   * From specification 0.05, 11/14/2011.
-   * <p>
-   * A constructor kI of I corresponds to a constructor kF of its factory class F if either
-   * <ul>
-   * <li>F does not implement I and kI and kF have the same name, OR
-   * <li>F implements I and either
-   * <ul>
-   * <li>kI is named NI and kF is named NF, OR
-   * <li>kI is named NI.id and kF is named NF.id.
-   * </ul>
-   * </ul>
-   * <p>
-   * http://code.google.com/p/dart/issues/detail?id=521
-   */
-  public void test_resolveInterfaceConstructor_whenFactoryImplementsInterface_nameIsIdentifier()
-      throws Exception {
-    AnalyzeLibraryResult libraryResult = analyzeLibrary(
-        "Test.dart",
-        Joiner.on("\n").join(
-            "interface I default F {",
-            "  I(int x);",
-            "}",
-            "class F implements I {",
-            "  F(int y) {}",
-            "  factory I(int y) {}",
-            "}",
-            "class Test {",
-            "  foo() {",
-            "    new I(0);",
-            "  }",
-            "}"));
-    assertErrors(libraryResult.getCompilationErrors());
-    DartUnit unit = libraryResult.getLibraryUnitResult().getUnits().iterator().next();
-    DartNewExpression newExpression = findNodeBySource(unit, "new I(0)");
-    ConstructorElement constructorElement = newExpression.getElement();
-    assertEquals(true, getElementSource(constructorElement).contains("F(int y)"));
-  }
-
-  /**
-   * From specification 0.05, 11/14/2011.
-   * <p>
-   * A constructor kI of I corresponds to a constructor kF of its factory class F if either
-   * <ul>
-   * <li>F does not implement I and kI and kF have the same name, OR
-   * <li>F implements I and either
-   * <ul>
-   * <li>kI is named NI and kF is named NF , OR
-   * <li>kI is named NI.id and kF is named NF.id.
-   * </ul>
-   * </ul>
-   * <p>
-   * http://code.google.com/p/dart/issues/detail?id=521
-   */
-  public void test_resolveInterfaceConstructor_whenFactoryImplementsInterface_nameIsQualified()
-      throws Exception {
-    AnalyzeLibraryResult libraryResult = analyzeLibrary(
-        "Test.dart",
-        Joiner.on("\n").join(
-            "interface I default F {",
-            "  I.foo(int x);",
-            "}",
-            "class F implements I {",
-            "  F.foo(int y) {}",
-            "  factory I.foo(int y) {}",
-            "}",
-            "class Test {",
-            "  foo() {",
-            "    new I.foo(0);",
-            "  }",
-            "}"));
-    assertErrors(libraryResult.getCompilationErrors());
-    DartUnit unit = libraryResult.getLibraryUnitResult().getUnits().iterator().next();
-    // "new I.foo()" - good
-    {
-      DartNewExpression newExpression = findNodeBySource(unit, "new I.foo(0)");
-      ConstructorElement constructorElement = newExpression.getElement();
-      assertEquals(true, getElementSource(constructorElement).contains("F.foo(int y)"));
-    }
-  }
-
-  /**
-   * From specification 0.05, 11/14/2011.
-   * <p>
-   * A constructor kI of I corresponds to a constructor kF of its factory class F if either
-   * <ul>
-   * <li>F does not implement I and kI and kF have the same name, OR
-   * <li>F implements I and either
-   * <ul>
-   * <li>kI is named NI and kF is named NF , OR
-   * <li>kI is named NI.id and kF is named NF.id.
-   * </ul>
-   * </ul>
-   * <p>
-   * http://code.google.com/p/dart/issues/detail?id=521
-   */
-  public void test_resolveInterfaceConstructor_whenFactoryImplementsInterface_negative()
-      throws Exception {
-    AnalyzeLibraryResult libraryResult = analyzeLibrary(
-        "Test.dart",
-        Joiner.on("\n").join(
-            "interface I default F {",
-            "  I(int x);",
-            "  I.foo(int x);",
-            "}",
-            "class F implements I {",
-            "  factory I.foo(int x) {}",
-            "}",
-            "class Test {",
-            "  foo() {",
-            "    new I(0);",
-            "    new I.foo(0);",
-            "  }",
-            "}"));
-    // Check errors.
-    {
-      List<DartCompilationError> errors = libraryResult.getCompilationErrors();
-      assertErrors(
-          errors,
-          errEx(ResolverErrorCode.DEFAULT_CONSTRUCTOR_UNRESOLVED, 2, 3, 9),
-          errEx(ResolverErrorCode.DEFAULT_CONSTRUCTOR_UNRESOLVED, 3, 3, 13),
-          errEx(ResolverErrorCode.DEFAULT_CONSTRUCTOR_UNRESOLVED, 10, 9, 1),
-          errEx(ResolverErrorCode.DEFAULT_CONSTRUCTOR_UNRESOLVED, 11, 9, 5));
-      {
-        String message = errors.get(0).getMessage();
-        assertTrue(message, message.contains("'F'"));
-        assertTrue(message, message.contains("'F'"));
-      }
-      {
-        String message = errors.get(1).getMessage();
-        assertTrue(message, message.contains("'F.foo'"));
-        assertTrue(message, message.contains("'F'"));
-      }
-    }
-    DartUnit unit = libraryResult.getLibraryUnitResult().getUnits().iterator().next();
-    // "new I()" - no such constructor, has other constructors, so no implicit default.
-    {
-      DartNewExpression newExpression = findNodeBySource(unit, "new I(0)");
-      assertEquals(null, newExpression.getElement());
-    }
-    // "new I.foo()" - would be valid, if not "F implements I", but here invalid
-    {
-      DartNewExpression newExpression = findNodeBySource(unit, "new I.foo(0)");
-      assertEquals(null, newExpression.getElement());
-    }
-  }
-
-  /**
-   * From specification 0.05, 11/14/2011.
-   * <p>
-   * A constructor kI of I corresponds to a constructor kF of its factory class F if either
-   * <ul>
-   * <li>F does not implement I and kI and kF have the same name, OR
-   * <li>F implements I and either
-   * <ul>
-   * <li>kI is named NI and kF is named NF , OR
-   * <li>kI is named NI.id and kF is named NF.id.
-   * </ul>
-   * </ul>
-   * <p>
-   * http://code.google.com/p/dart/issues/detail?id=521
-   */
-  public void test_resolveInterfaceConstructor_noFactoryImplementsInterface() throws Exception {
-    AnalyzeLibraryResult libraryResult = analyzeLibrary(
-        "Test.dart",
-        Joiner.on("\n").join(
-            "interface I default F {",
-            "  I(int x);",
-            "  I.foo(int x);",
-            "}",
-            "class F {",
-            "  F.foo(int y) {}",
-            "  factory I(int y) {}",
-            "  factory I.foo(int y) {}",
-            "}",
-            "class Test {",
-            "  foo() {",
-            "    new I(0);",
-            "    new I.foo(0);",
-            "  }",
-            "}"));
-    assertErrors(libraryResult.getCompilationErrors());
-    DartUnit unit = libraryResult.getLibraryUnitResult().getUnits().iterator().next();
-    // "new I()"
-    {
-      DartNewExpression newExpression = findNodeBySource(unit, "new I(0)");
-      ConstructorElement constructorElement = newExpression.getElement();
-      assertEquals(true, getElementSource(constructorElement).contains("I(int y)"));
-    }
-    // "new I.foo()"
-    {
-      DartNewExpression newExpression = findNodeBySource(unit, "new I.foo(0)");
-      ConstructorElement constructorElement = newExpression.getElement();
-      assertEquals(true, getElementSource(constructorElement).contains("I.foo(int y)"));
-    }
-  }
-
-  /**
-   * From specification 0.05, 11/14/2011.
-   * <p>
-   * A constructor kI of I corresponds to a constructor kF of its factory class F if either
-   * <ul>
-   * <li>F does not implement I and kI and kF have the same name, OR
-   * <li>F implements I and either
-   * <ul>
-   * <li>kI is named NI and kF is named NF , OR
-   * <li>kI is named NI.id and kF is named NF.id.
-   * </ul>
-   * </ul>
-   * <p>
-   * http://code.google.com/p/dart/issues/detail?id=521
-   */
-  public void test_resolveInterfaceConstructor_noFactoryImplementsInterface_negative()
-      throws Exception {
-    AnalyzeLibraryResult libraryResult = analyzeLibrary(
-        "Test.dart",
-        Joiner.on("\n").join(
-            "interface I default F {",
-            "  I.foo(int x);",
-            "}",
-            "class F {",
-            "}",
-            "class Test {",
-            "  foo() {",
-            "    new I.foo(0);",
-            "  }",
-            "}"));
-    // Check errors.
-    {
-      List<DartCompilationError> errors = libraryResult.getCompilationErrors();
-      assertErrors(
-          errors,
-          errEx(ResolverErrorCode.DEFAULT_CONSTRUCTOR_UNRESOLVED, 2, 3, 13),
-          errEx(ResolverErrorCode.DEFAULT_CONSTRUCTOR_UNRESOLVED, 8, 9, 5));
-      {
-        String message = errors.get(0).getMessage();
-        assertTrue(message, message.contains("'I.foo'"));
-        assertTrue(message, message.contains("'F'"));
-      }
-    }
-    DartUnit unit = libraryResult.getLibraryUnitResult().getUnits().iterator().next();
-    // "new I.foo()"
-    {
-      DartNewExpression newExpression = findNodeBySource(unit, "new I.foo(0)");
-      assertEquals(null, newExpression.getElement());
-    }
-  }
-
-  /**
-   * From specification 0.05, 11/14/2011.
-   * <p>
-   * It is a compile-time error if kI and kF do not have the same number of required parameters.
-   * <p>
-   * http://code.google.com/p/dart/issues/detail?id=521
-   */
-  public void test_resolveInterfaceConstructor_hasByName_negative_notSameNumberOfRequiredParameters()
-      throws Exception {
-    AnalyzeLibraryResult libraryResult = analyzeLibrary(
-        "Test.dart",
-        Joiner.on("\n").join(
-            "interface I default F {",
-            "  I.foo(int x);",
-            "}",
-            "class F implements I {",
-            "  factory F.foo() {}",
-            "}",
-            "class Test {",
-            "  foo() {",
-            "    new I.foo();",
-            "  }",
-            "}"));
-    assertErrors(libraryResult.getTypeErrors());
-    // Check errors.
-    {
-      List<DartCompilationError> errors = libraryResult.getCompilationErrors();
-      assertErrors(
-          errors,
-          errEx(ResolverErrorCode.DEFAULT_CONSTRUCTOR_NUMBER_OF_REQUIRED_PARAMETERS, 2, 3, 13));
-      {
-        String message = errors.get(0).getMessage();
-        assertTrue(message, message.contains("'F.foo'"));
-        assertTrue(message, message.contains("'F'"));
-        assertTrue(message, message.contains("0"));
-        assertTrue(message, message.contains("1"));
-        assertTrue(message, message.contains("'F.foo'"));
-      }
-    }
-    DartUnit unit = libraryResult.getLibraryUnitResult().getUnits().iterator().next();
-    // "new I.foo()" - resolved, but we produce error.
-    {
-      DartNewExpression newExpression = findNodeBySource(unit, "new I.foo()");
-      ConstructorElement constructorElement = newExpression.getElement();
-      assertEquals(true, getElementSource(constructorElement).contains("F.foo()"));
-    }
-  }
-
-  /**
-   * From specification 0.05, 11/14/2011.
-   * <p>
-   * It is a compile-time error if kI and kF do not have identically named optional parameters,
-   * declared in the same order.
-   * <p>
-   * http://code.google.com/p/dart/issues/detail?id=521
-   */
-  public void test_resolveInterfaceConstructor_hasByName_negative_notSameNamedParameters()
-      throws Exception {
-    AnalyzeLibraryResult libraryResult = analyzeLibrary(
-        "Test.dart",
-        Joiner.on("\n").join(
-            "interface I default F {",
-            "  I.foo(int a, [int b, int c]);",
-            "  I.bar(int a, [int b, int c]);",
-            "  I.baz(int a, [int b]);",
-            "}",
-            "class F implements I {",
-            "  factory F.foo(int any, [int b = 1]) {}",
-            "  factory F.bar(int any, [int c = 1, int b = 2]) {}",
-            "  factory F.baz(int any, [int c = 1]) {}",
-            "}",
-            "class Test {",
-            "  foo() {",
-            "    new I.foo(0);",
-            "    new I.bar(0);",
-            "    new I.baz(0);",
-            "  }",
-            "}"));
-    assertErrors(libraryResult.getTypeErrors());
-    // Check errors.
-    {
-      List<DartCompilationError> errors = libraryResult.getCompilationErrors();
-      assertErrors(
-          errors,
-          errEx(ResolverErrorCode.DEFAULT_CONSTRUCTOR_NAMED_PARAMETERS, 2, 3, 29),
-          errEx(ResolverErrorCode.DEFAULT_CONSTRUCTOR_NAMED_PARAMETERS, 3, 3, 29),
-          errEx(ResolverErrorCode.DEFAULT_CONSTRUCTOR_NAMED_PARAMETERS, 4, 3, 22));
-      {
-        String message = errors.get(0).getMessage();
-        assertTrue(message, message.contains("'I.foo'"));
-        assertTrue(message, message.contains("'F'"));
-        assertTrue(message, message.contains("[b]"));
-        assertTrue(message, message.contains("[b, c]"));
-        assertTrue(message, message.contains("'F.foo'"));
-      }
-      {
-        String message = errors.get(1).getMessage();
-        assertTrue(message, message.contains("'I.bar'"));
-        assertTrue(message, message.contains("'F'"));
-        assertTrue(message, message.contains("[c, b]"));
-        assertTrue(message, message.contains("[b, c]"));
-        assertTrue(message, message.contains("'F.bar'"));
-      }
-      {
-        String message = errors.get(2).getMessage();
-        assertTrue(message, message.contains("'I.baz'"));
-        assertTrue(message, message.contains("'F'"));
-        assertTrue(message, message.contains("[b]"));
-        assertTrue(message, message.contains("[c]"));
-        assertTrue(message, message.contains("'F.baz'"));
-      }
-    }
-    DartUnit unit = libraryResult.getLibraryUnitResult().getUnits().iterator().next();
-    // "new I.foo()" - resolved, but we produce error.
-    {
-      DartNewExpression newExpression = findNodeBySource(unit, "new I.foo(0)");
-      ConstructorElement constructorElement = newExpression.getElement();
-      assertEquals(true, getElementSource(constructorElement).contains("F.foo("));
-    }
-    // "new I.bar()" - resolved, but we produce error.
-    {
-      DartNewExpression newExpression = findNodeBySource(unit, "new I.bar(0)");
-      ConstructorElement constructorElement = newExpression.getElement();
-      assertEquals(true, getElementSource(constructorElement).contains("F.bar("));
-    }
-    // "new I.baz()" - resolved, but we produce error.
-    {
-      DartNewExpression newExpression = findNodeBySource(unit, "new I.baz(0)");
-      ConstructorElement constructorElement = newExpression.getElement();
-      assertEquals(true, getElementSource(constructorElement).contains("F.baz("));
-    }
-  }
-
   private static String getElementSource(Element element) throws Exception {
     SourceInfo sourceInfo = element.getSourceInfo();
     // TODO(scheglov) When we will remove Source.getNode(), this null check may be removed
@@ -789,12 +274,10 @@
    */
   public void test_setElement_forName_inDeclarations() throws Exception {
     AnalyzeLibraryResult libraryResult = analyzeLibrary(
-        "Test.dart",
-        Joiner.on("\n").join(
             "// filler filler filler filler filler filler filler filler filler filler",
             "class A<B extends A> {",
             "  var a1;",
-            "  get a2() {}",
+            "  get a2 {}",
             "  A() {}",
             "}",
             "var c;",
@@ -805,7 +288,7 @@
             "  h: d(0);",
             "}",
             "typedef i();",
-            ""));
+            "");
     assertErrors(libraryResult.getErrors());
     DartUnit unit = libraryResult.getLibraryUnitResult().getUnits().iterator().next();
     // in class A
diff --git a/compiler/javatests/com/google/dart/compiler/resolver/ResolverTest.java b/compiler/javatests/com/google/dart/compiler/resolver/ResolverTest.java
index 9192064..75dfde1 100644
--- a/compiler/javatests/com/google/dart/compiler/resolver/ResolverTest.java
+++ b/compiler/javatests/com/google/dart/compiler/resolver/ResolverTest.java
@@ -177,9 +177,9 @@
     // but the spec mentions no such error
     resolveAndTest(Joiner.on("\n").join(
         "class Object {}",
-        "interface int {}",
-        "interface bool {}",
-        "interface I<X> {",
+        "class int {}",
+        "class bool {}",
+        "abstract class I<X> {",
         "}",
         "class A extends C implements I<int> {}",
         "class B extends C implements I<bool> {}",
@@ -198,28 +198,6 @@
      */
   }
 
-  public void testImplicitDefaultConstructor_OnInterfaceWithoutFactory() {
-    // Check that the implicit constructor is resolved correctly
-    resolveAndTest(Joiner.on("\n").join(
-        "class Object {}",
-        "interface B {}",
-        "class C { main() { new B(); } }"),
-        ResolverErrorCode.NEW_EXPRESSION_NOT_CONSTRUCTOR);
-
-    /*
-     * We should check for signature mismatch but that is a TypeAnalyzer issue.
-     */
-  }
-
-  public void testImplicitDefaultConstructor_ThroughFactories() {
-    // Check that we generate implicit constructors through factories also.
-    resolveAndTest(Joiner.on("\n").join(
-        "class Object {}",
-        "interface B default C {}",
-        "class C {}",
-        "class D { main() { new B(); } }"));
-  }
-
   public void testImplicitDefaultConstructor_WithConstCtor() {
     // Check that we generate an error if the implicit constructor would violate const.
     resolveAndTest(Joiner.on("\n").join(
@@ -272,33 +250,19 @@
 
     resolveAndTest(Joiner.on("\n").join(
         "class Object {}",
-        "interface int {}",
-        "interface bool {}",
+        "class int {}",
+        "class bool {}",
         "class Cyclic extends Cyclic {",
         "}",
         "class A extends B {",
         "}",
         "class B extends A {",
         "}",
-        "interface I extends I {",
-        "}",
-        "class C implements I1, I {",
-        "}",
-        "interface I1 {",
-        "}",
-        "class D implements I1, I2 {",
-        "}",
-        "interface I2 extends I3 {",
-        "}",
-        "interface I3 extends I2 {",
+        "class C implements C {",
         "}"),
         ResolverErrorCode.CYCLIC_CLASS,
         ResolverErrorCode.CYCLIC_CLASS,
         ResolverErrorCode.CYCLIC_CLASS,
-        ResolverErrorCode.CYCLIC_CLASS,
-        ResolverErrorCode.CYCLIC_CLASS,
-        ResolverErrorCode.CYCLIC_CLASS,
-        ResolverErrorCode.CYCLIC_CLASS,
         ResolverErrorCode.CYCLIC_CLASS
     );
   }
@@ -313,265 +277,6 @@
         ResolverErrorCode.NO_SUCH_TYPE_CONSTRUCTOR);
   }
 
-
-  public void testDefaultTypeArgs1() {
-    // Type arguments match
-    resolveAndTest(Joiner.on("\n").join(
-        "class Object {}",
-        "interface int {}",
-        "interface A<T> default B<T> {",
-        "  A();",
-        "}",
-        "class B<T> implements A<T> {",
-        "  B() {}",
-        "}"));
-  }
-
-  public void testDefaultTypeArgs2() {
-    // Type arguments match
-    resolveAndTest(Joiner.on("\n").join(
-        "class Object {}",
-        "interface A<T> default B<T> {",
-        "}",
-        "class B<T> {",
-        "  factory A.construct () {}",
-        "}"));
-  }
-
-  public void testDefaultTypeArgs3() {
-    // Type arguments match
-    resolveAndTest(Joiner.on("\n").join(
-        "class Object {}",
-        "interface A<T> default B<T> {",
-        "}",
-        "class B<T> {",
-        "  B() {}",
-        "}"));
-  }
-
-  public void testDefaultTypeArgs4() {
-    // Type arguments match
-    resolveAndTest(Joiner.on("\n").join(
-        "class Object {}",
-        "interface A<T> default B<T> {",
-        "}",
-        "class B<T> implements A<T> {",
-        "  B() {}",
-        "}"));
-  }
-
-  public void testDefaultTypeArgs5() {
-    // Invoke constructor in factory method with (wrong) type args
-    resolveAndTest(Joiner.on("\n").join(
-        "class Object {}",
-        "interface int {}",
-        "interface A<T> default B {",
-        "}",
-        "class B<T> {",
-        "}"));
-  }
-
-  public void testDefaultTypeArgs6() {
-    // Invoke constructor in factory method with (wrong) type args
-    resolveAndTest(Joiner.on("\n").join(
-        "class Object {}",
-        "interface int {}",
-        "interface A<T> default B {",
-        "}",
-        "class B<T extends int> {",
-        "}"));
-  }
-
-  public void testDefaultTypeArgs7() {
-    // Example from spec v0.6
-    resolveAndTest(Joiner.on("\n").join(
-        "class Object{}",
-        "interface Hashable {}",
-        "class HashMapImplementation<K extends Hashable, V> {",
-        "}",
-        "interface Map<K, V> default HashMapImplementation<K extends Hashable, V> {",
-        "}"));
-  }
-
-  public void testDefaultTypeArgs8() {
-    resolveAndTest(Joiner.on("\n").join(
-        "class Object{}",
-        "interface A<K,V> default B<K, V extends K> {",
-        "}",
-        "class B<K, V extends K> {",
-        "}"));
-  }
-
-  public void testDefaultTypeArgs9() {
-    resolveAndTest(Joiner.on("\n").join(
-        "class Object{}",
-        "interface List<T> {}",
-        "interface A<K,V> default B<K, V extends List<K>> {}",
-        "class B<K, V extends List<K>> {",
-        "}"));
-  }
-
-  public void testDefaultTypeArgs10() {
-    resolveAndTest(Joiner.on("\n").join(
-        "class Object{}",
-        "interface List<T> {}",
-        "class A<T, U, V> {}",
-        "interface I2<T> default B<T extends A> {}",
-        "class B<T extends A> {}",
-        ""));
-  }
-
-
-  public void testDefaultTypeArgsNew() {
-    // Invoke constructor in factory method with type args
-    resolveAndTest(Joiner.on("\n").join(
-        "class Object {}",
-        "interface int {}",
-        "interface A<T> default B<T> {",
-        "  B();",
-        "}",
-        "class C<T> implements A<T> {}",
-        "class B<T> {",
-        "  factory B() { return new C<T>();}",
-        "}"));
-  }
-
-  public void testFactoryBadTypeArgs1() {
-    // Invoke constructor in factory method with (wrong) type args
-    resolveAndTest(Joiner.on("\n").join(
-        "class Object {}",
-        "interface int {}",
-        "interface A<T> default B<T> {",
-        "  A();",
-        "}",
-        "class C<T> implements A<T> {}",
-        "class B<T> {",
-        "  factory A() { return new C<K>();}",
-        "}"),
-        TypeErrorCode.NO_SUCH_TYPE);
-  }
-
-  public void testFactoryBadTypeArgs2() {
-    // Invoke constructor in factory method with (wrong) type args
-    resolveAndTest(Joiner.on("\n").join(
-        "class Object {}",
-        "interface int {}",
-        "interface A<T> default B {",
-        "  A();",
-        "}",
-        "class C<T> implements A<T> {}",
-        "class B {",
-        "  factory A() { return new C<int>();}",
-        "}"),
-        ResolverErrorCode.DEFAULT_CLASS_MUST_HAVE_SAME_TYPE_PARAMS);
-  }
-
-  public void testFactoryBadTypeArgs3() {
-    // Invoke constructor in factory method with (wrong) type args
-    resolveAndTest(Joiner.on("\n").join(
-        "class Object {}",
-        "interface int {}",
-        "interface A<T> default B<K> {",
-        "  A();",
-        "}",
-        "class C<T> implements A<T> {}",
-        "class B<T> {",
-        "  factory A() { return new C<T>();}",
-        "}"),
-        ResolverErrorCode.TYPE_PARAMETERS_MUST_MATCH_EXACTLY);
-  }
-
-  public void testFactoryBadTypeArgs4() {
-    // Invoke constructor in factory method with (wrong) type args
-    resolveAndTest(Joiner.on("\n").join(
-        "class Object {}",
-        "interface int {}",
-        "interface A<T> default B<T> {",
-        "  A();",
-        "}",
-        "class C<T> implements A<T> {}",
-        "class B<K> {",
-        "  factory A() { return new C<K>();}",
-        "}"),
-        ResolverErrorCode.TYPE_PARAMETERS_MUST_MATCH_EXACTLY,
-        ResolverErrorCode.TYPE_VARIABLE_DOES_NOT_MATCH);
-  }
-
-  public void testFactoryBadTypeArgs5() {
-    // Invoke constructor in factory method with (wrong) type args
-    resolveAndTest(Joiner.on("\n").join(
-        "class Object {}",
-        "interface int {}",
-        "interface A<T> default B<T,L> {",
-        "  A();",
-        "}",
-        "class C<T> implements A<T> {}",
-        "class B<T> {",
-        "  factory A() { return new C<T>();}",
-        "}"),
-        ResolverErrorCode.TYPE_PARAMETERS_MUST_MATCH_EXACTLY);
-  }
-
-  public void testFactoryBadTypeArgs6() {
-    // Invoke constructor in factory method with (wrong) type args
-    resolveAndTest(Joiner.on("\n").join(
-        "class Object {}",
-        "interface int {}",
-        "interface A<T> default B<K> {",
-        "  A();",
-        "}",
-        "class C<T> implements A<T> {}",
-        "class B<K> {",
-        "  factory A() { return new C<K>();}",
-        "}"),
-        ResolverErrorCode.TYPE_VARIABLE_DOES_NOT_MATCH);
-  }
-
-  public void testFactoryBadTypeArgs7() {
-    // Invoke constructor in factory method with (wrong) type args
-    resolveAndTest(Joiner.on("\n").join(
-        "class Object {}",
-        "interface int {}",
-        "interface A<T,K> default B<T,K> {",
-        "  A();",
-        "}",
-        "class C<T,K> implements A<T,K> {}",
-        "class B<K,T> {",
-        "  factory A() { return new C<int, Object>();}",
-        "}"),
-        ResolverErrorCode.TYPE_PARAMETERS_MUST_MATCH_EXACTLY,
-        ResolverErrorCode.TYPE_VARIABLE_DOES_NOT_MATCH,
-        ResolverErrorCode.TYPE_VARIABLE_DOES_NOT_MATCH);
-  }
-
-  public void testFactoryBadTypeArgs8() {
-    // Invoke constructor in factory method with (wrong) type args
-    resolveAndTest(Joiner.on("\n").join(
-        "class Object {}",
-        "interface int {}",
-        "interface A<T> default B<T> {",
-        "  A();",
-        "}",
-        "class B<T extends int> {",
-        "  factory A() {}",
-        "}"),
-        ResolverErrorCode.TYPE_PARAMETERS_MUST_MATCH_EXACTLY);
-  }
-
-  public void testFactoryBadTypeArgs9() {
-    // Invoke constructor in factory method with (wrong) type args
-    resolveAndTest(Joiner.on("\n").join(
-        "class Object {}",
-        "interface int {}",
-        "interface A<T> default B<T extends int> {",
-        "  A();",
-        "}",
-        "class B<T> {",
-        "  factory A() {}",
-        "}"),
-        ResolverErrorCode.TYPE_PARAMETERS_MUST_MATCH_EXACTLY);
-  }
-
   public void test_constFactory() throws Exception {
     resolveAndTest(Joiner.on("\n").join(
         "class Object {}",
@@ -581,44 +286,6 @@
         errEx(ResolverErrorCode.FACTORY_CANNOT_BE_CONST, 3, 17, 1));
   }
 
-  public void testFactoryBadTypeArgs11() {
-    // Invoke constructor in factory method with (wrong) type args
-    resolveAndTest(Joiner.on("\n").join(
-        "class Object {}",
-        "interface int {}",
-        "interface A<T> default Bogus {",
-        "}",
-        "class B<T> {",
-        "}"),
-        ResolverErrorCode.NO_SUCH_TYPE);
-  }
-
-  public void testFactoryBadTypeArgs10() {
-    // Invoke constructor in factory method with (wrong) type args
-    resolveAndTest(Joiner.on("\n").join(
-        "class Object {}",
-        "interface int {}",
-        "interface A<T> default B {",
-        "  A();",
-        "}",
-        "class B {",
-        "  factory A() {}",
-        "}"),
-        ResolverErrorCode.DEFAULT_CLASS_MUST_HAVE_SAME_TYPE_PARAMS);
-  }
-
-  public void testBadDefaultTypeArgs11() {
-    // Example from spec v0.6
-    resolveAndTest(Joiner.on("\n").join(
-        "class Object{}",
-        "interface Hashable {}",
-        "class HashMapImplementation<K extends Hashable, V> {",
-        "}",
-        "interface Map<K, V> default HashMapImplementation<K, V> {",
-        "}"),
-        ResolverErrorCode.TYPE_PARAMETERS_MUST_MATCH_EXACTLY);
-  }
-
   public void testBadGenerativeConstructor1() {
     resolveAndTest(Joiner.on("\n").join(
         "class Object { }",
@@ -640,18 +307,6 @@
         ResolverErrorCode.TOO_MANY_QUALIFIERS_FOR_METHOD);
   }
 
-  public void testBadGenerativeConstructor3() {
-    resolveAndTest(Joiner.on("\n").join(
-        "class Object { }",
-        "interface B { }",
-        "class A extends B {",
-        "  var val; ",
-        "  B.foo() : this.val = 1;",
-        "}"),
-        ResolverErrorCode.NOT_A_CLASS,
-        ResolverErrorCode.CANNOT_DECLARE_NON_FACTORY_CONSTRUCTOR);
-  }
-
   public void testGenerativeConstructor() {
     resolveAndTest(Joiner.on("\n").join(
         "class Object {}",
@@ -750,19 +405,6 @@
       TypeErrorCode.NO_SUCH_TYPE);
   }
 
-  public void testNewExpression6() {
-    resolveAndTest(Joiner.on("\n").join(
-      "class Object {}",
-      "interface int {}",
-      "interface A<T> default B<T> {",
-      "  A.construct(); ",
-      "}",
-      "class B<T> implements A<T> {",
-      "  B() { }",
-      "  factory B.construct() { return new B<T>(); }",
-      "}"));
-  }
-
   public void test_noSuchType_field() throws Exception {
     resolveAndTest(Joiner.on("\n").join(
         "class Object {}",
@@ -857,7 +499,7 @@
     String source =
         Joiner.on("\n").join(
             "class Object {}",
-            "interface Base<T> {}",
+            "abstract class Base<T> {}",
             "class MyClass implements Base<Unknown> {",
             "}");
     List<DartCompilationError> errors = resolveAndTest(source, ResolverErrorCode.NO_SUCH_TYPE);
@@ -1080,8 +722,8 @@
   public void test_noSuchType_mapLiteral_num_type_args() throws Exception {
     resolveAndTest(Joiner.on("\n").join(
         "class Object {}",
-        "interface int {}",
-        "interface String {}",
+        "class int {}",
+        "class String {}",
         "class MyClass {",
         "  foo() {",
         "    var map0 = {};",
@@ -1248,7 +890,7 @@
   public void testConstClass() {
     resolveAndTest(Joiner.on("\n").join(
         "class Object {}",
-        "interface int {}",
+        "class int {}",
         "class GoodBase {",
         "  const GoodBase() : foo = 1;",
         "  final foo;",
@@ -1286,7 +928,7 @@
   public void testFinalInit1() {
     resolveAndTest(Joiner.on("\n").join(
         "class Object {}",
-        "interface int {}",
+        "class int {}",
         "final f1 = 1;",
         "final f2;",  // error
         "class A {",
@@ -1343,18 +985,6 @@
         "}"));
   }
 
-  public void testFinalInit6() {
-    resolveAndTest(Joiner.on("\n").join(
-        "class Object {}",
-        "interface I1 {",
-        "  final a;",        // not initialized, but in an interface
-        "}",
-        "interface I2 {",
-        "  final a;",        // not initialized, but in an interface
-        "  C(arg);",
-        "}"));
-  }
-
   public void testFinalInit7() {
     resolveAndTest(Joiner.on("\n").join(
         "class Object {}",
@@ -1376,7 +1006,7 @@
     resolveAndTest(Joiner.on("\n").join(
         "// filler filler filler filler filler filler filler filler filler filler",
         "class Object {}",
-        "interface int {}",
+        "class int {}",
         "const f;",
         ""),
         errEx(ResolverErrorCode.CONST_REQUIRES_VALUE, 4, 7, 1));
@@ -1403,12 +1033,12 @@
   public void testNoGetterOrSetter() {
     resolveAndTest(Joiner.on("\n").join(
         "class Object {}",
-        "get getter1() {}",
+        "get getter1 {}",
         "set setter1(arg) {}",
         "class A {",
-        "  static get getter2() {}",
+        "  static get getter2 {}",
         "  static set setter2(arg) {}",
-        "  get getter3() {}",
+        "  get getter3 {}",
         "  set setter3(arg) {}",
         "}",
         "method() {",
@@ -1434,7 +1064,7 @@
   public void testErrorInUnqualifiedInvocation1() {
     resolveAndTest(Joiner.on("\n").join(
         "class Object {}",
-        "interface int {}",
+        "class int {}",
         "class Foo {",
         "  Foo() {}",
         "}",
@@ -1447,7 +1077,7 @@
   public void testErrorInUnqualifiedInvocation2() {
     resolveAndTest(Joiner.on("\n").join(
         "class Object {}",
-        "interface int {}",
+        "class int {}",
         "class Foo {}",
         "method() {",
         " Foo();",
@@ -1458,7 +1088,7 @@
   public void testErrorInUnqualifiedInvocation3() {
     resolveAndTest(Joiner.on("\n").join(
         "class Object {}",
-        "interface int {}",
+        "class int {}",
         "class Foo<T> {",
         "  method() {",
         "   T();",
@@ -1471,7 +1101,7 @@
   public void testErrorInUnqualifiedInvocation4() {
     resolveAndTest(Joiner.on("\n").join(
         "class Object {}",
-        "interface int {}",
+        "class int {}",
         "typedef int foo();",
         "method() {",
         " foo();",
@@ -1482,7 +1112,7 @@
   public void testErrorInUnqualifiedInvocation5() {
     resolveAndTest(Joiner.on("\n").join(
         "class Object {}",
-        "interface int {}",
+        "class int {}",
         "method() {",
         "  outer: for(int i = 0; i < 1; i++) {",
         "    outer();",
@@ -1501,28 +1131,42 @@
     // requested to disable this
     resolveAndTest(Joiner.on("\n").join(
         "class Object {}",
-        "method([_foo]) {}",
+        "method({_foo}) {}",
         "class Foo {",
         "  var _bar;",
-        "  //Foo([this._bar]){}",
-        "  method([_foo]){}",
+        "  //Foo({this._bar}){}",
+        "  method({_foo}){}",
         "}"),
         errEx(ResolverErrorCode.NAMED_PARAMETERS_CANNOT_START_WITH_UNDER, 2, 9, 4),
 //        errEx(ResolverErrorCode.NAMED_PARAMETERS_CANNOT_START_WITH_UNDER, 5, 8, 9),
         errEx(ResolverErrorCode.NAMED_PARAMETERS_CANNOT_START_WITH_UNDER, 6, 11, 4));
   }
+  
+  public void testUndercoreInOptionalParameterMethodDefinition() {
+    resolveAndTest(Joiner.on("\n").join(
+        "class Object {}",
+        "method([_foo]) {}",
+        "typedef myFuncType([_foo]);",
+        "class Foo {",
+        "  var _bar;",
+        "  method([_foo]){}",
+        "}"),
+        errEx(ResolverErrorCode.OPTIONAL_PARAMETERS_CANNOT_START_WITH_UNDER, 2, 9, 4),
+        errEx(ResolverErrorCode.OPTIONAL_PARAMETERS_CANNOT_START_WITH_UNDER, 6, 11, 4),
+        errEx(ResolverErrorCode.OPTIONAL_PARAMETERS_CANNOT_START_WITH_UNDER, 3, 21, 4));
+  }
 
   public void testUndercoreInNamedParameterFunctionDefinition() {
     resolveAndTest(Joiner.on("\n").join(
         "class Object {}",
-        "var f = func([_foo]) {};"),
+        "var f = func({_foo}) {};"),
         errEx(ResolverErrorCode.NAMED_PARAMETERS_CANNOT_START_WITH_UNDER, 2, 15, 4));
   }
 
   public void testUndercoreInNamedParameterFunctionAlias() {
     resolveAndTest(Joiner.on("\n").join(
         "class Object {}",
-        "typedef Object func([_foo]);"),
+        "typedef Object func({_foo});"),
         errEx(ResolverErrorCode.NAMED_PARAMETERS_CANNOT_START_WITH_UNDER, 2, 22, 4));
   }
 
@@ -1567,7 +1211,7 @@
   public void test_redirectConstructor() {
     resolveAndTest(Joiner.on("\n").join(
         "class Object {}",
-        "interface int {}",
+        "class int {}",
         "int topLevel() {}",
         "class A {",
         "  method() {}",
@@ -1613,23 +1257,17 @@
     resolveAndTest(Joiner.on("\n").join(
         "class Object {}",
         "class A {",
-        "  abstract A();",
-        "  abstract A.named();",
-        "}",
-        "class B {",
-        "  static B() {}",
-        "  static B.named() {}",
+        "  static A() {}",
+        "  static A.named() {}",
         "}"),
-        errEx(ResolverErrorCode.CONSTRUCTOR_CANNOT_BE_ABSTRACT, 3, 12, 1),
-        errEx(ResolverErrorCode.CONSTRUCTOR_CANNOT_BE_ABSTRACT, 4, 12, 7),
-        errEx(ResolverErrorCode.CONSTRUCTOR_CANNOT_BE_STATIC, 7, 10, 1),
-        errEx(ResolverErrorCode.CONSTRUCTOR_CANNOT_BE_STATIC, 8, 10, 7));
+        errEx(ResolverErrorCode.CONSTRUCTOR_CANNOT_BE_STATIC, 3, 10, 1),
+        errEx(ResolverErrorCode.CONSTRUCTOR_CANNOT_BE_STATIC, 4, 10, 7));
   }
 
   public void test_illegalConstructorReturnType() throws Exception {
     resolveAndTest(Joiner.on("\n").join(
         "class Object {}",
-        "interface int {}",
+        "class int {}",
         "class A {",
         "  void A();",
         "  void A.named();",
@@ -1678,18 +1316,6 @@
         errEx(ResolverErrorCode.CANNOT_CALL_FUNCTION_TYPE_ALIAS, 4, 3, 6));
   }
 
-  public void test_defaultTargetInterface() throws Exception {
-    resolveAndTest(Joiner.on("\n").join(
-        "class Object {}",
-        "interface A default B {",
-        "  A();",
-        "}",
-        "interface B {",
-        "}"),
-        errEx(ResolverErrorCode.DEFAULT_MUST_SPECIFY_CLASS, 2, 21, 1),
-        errEx(ResolverErrorCode.DEFAULT_CONSTRUCTOR_UNRESOLVED, 3, 3, 4));
-  }
-
   public void test_initializerErrors() {
     resolveAndTest(Joiner.on("\n").join(
         "class Object {}",
@@ -1707,15 +1333,6 @@
         errEx(ResolverErrorCode.EXPECTED_FIELD_NOT_TYPE_VAR, 8, 12, 1));
   }
 
-  public void test_noDefaultOnInterface() throws Exception {
-    resolveAndTest(Joiner.on("\n").join(
-        "class Object {}",
-        "interface I {",
-        "  I();",
-        "}"),
-        errEx(ResolverErrorCode.ILLEGAL_CONSTRUCTOR_NO_DEFAULT_IN_INTERFACE, 3, 3, 1));
-  }
-
   public void test_illegalAccessFromStatic() throws Exception {
     resolveAndTest(Joiner.on("\n").join(
         "class Object {}",
diff --git a/compiler/javatests/com/google/dart/compiler/resolver/ResolverTestCase.java b/compiler/javatests/com/google/dart/compiler/resolver/ResolverTestCase.java
index b5f4233..6819987 100644
--- a/compiler/javatests/com/google/dart/compiler/resolver/ResolverTestCase.java
+++ b/compiler/javatests/com/google/dart/compiler/resolver/ResolverTestCase.java
@@ -108,8 +108,8 @@
       parameterNodes.add(makeTypeVariable(parameter));
     }
     List<DartNode> members = Arrays.<DartNode>asList();
-    return new DartClass(new DartIdentifier(name), null, supertype,
-                         interfaces, -1, -1, members, parameterNodes, Modifiers.NONE);
+    return new DartClass(-1, 0, new DartIdentifier(name), null, supertype,
+                         -1, interfaces, -1, -1, -1, members, parameterNodes, Modifiers.NONE);
   }
 
   static DartClass makeInterface(String name, List<DartTypeNode> interfaces,
@@ -119,8 +119,8 @@
       parameterNodes.add(makeTypeVariable(parameter));
     }
     List<DartNode> members = Arrays.<DartNode> asList();
-    return new DartClass(new DartIdentifier(name), null, null, interfaces, -1, -1, members,
-        parameterNodes, defaultClass, true, Modifiers.NONE);
+    return new DartClass(-1, 0, new DartIdentifier(name), null, null, -1, interfaces, -1, -1, -1,
+        members, parameterNodes, defaultClass, true, Modifiers.NONE);
   }
 
   static DartParameterizedTypeNode makeDefault(String name) {
diff --git a/compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerCompilerTest.java b/compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerCompilerTest.java
index e532d26..445482f 100644
--- a/compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerCompilerTest.java
+++ b/compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerCompilerTest.java
@@ -3,21 +3,14 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.google.dart.compiler.type;
 
-import com.google.common.base.Joiner;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
 import com.google.dart.compiler.CommandLineOptions.CompilerOptions;
 import com.google.dart.compiler.CompilerTestCase;
-import com.google.dart.compiler.DartArtifactProvider;
 import com.google.dart.compiler.DartCompilationError;
-import com.google.dart.compiler.DartCompiler;
 import com.google.dart.compiler.DartCompilerErrorCode;
-import com.google.dart.compiler.DartCompilerListener;
 import com.google.dart.compiler.DefaultCompilerConfiguration;
-import com.google.dart.compiler.MockArtifactProvider;
-import com.google.dart.compiler.MockLibrarySource;
 import com.google.dart.compiler.ast.ASTVisitor;
 import com.google.dart.compiler.ast.DartArrayAccess;
 import com.google.dart.compiler.ast.DartBinaryExpression;
@@ -36,7 +29,6 @@
 import com.google.dart.compiler.ast.DartMethodInvocation;
 import com.google.dart.compiler.ast.DartNewExpression;
 import com.google.dart.compiler.ast.DartNode;
-import com.google.dart.compiler.ast.DartParameter;
 import com.google.dart.compiler.ast.DartPropertyAccess;
 import com.google.dart.compiler.ast.DartTypeNode;
 import com.google.dart.compiler.ast.DartUnaryExpression;
@@ -57,8 +49,6 @@
 import static com.google.dart.compiler.common.ErrorExpectation.assertErrors;
 import static com.google.dart.compiler.common.ErrorExpectation.errEx;
 
-import java.io.Reader;
-import java.io.StringReader;
 import java.net.URI;
 import java.util.List;
 import java.util.Set;
@@ -174,14 +164,16 @@
         "typedef A A();",
         "typedef B(B b);",
         "typedef C([C c]);",
-        "typedef D<T extends D>();",
+        "typedef D({D d});",
+        "typedef E<T extends E>();",
         "");
     assertErrors(
         libraryResult.getErrors(),
         errEx(TypeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF, 2, 1, 14),
         errEx(TypeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF, 3, 1, 15),
         errEx(TypeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF, 4, 1, 17),
-        errEx(TypeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF, 5, 1, 25));
+        errEx(TypeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF, 5, 1, 17),
+        errEx(TypeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF, 6, 1, 25));
   }
 
   /**
@@ -199,8 +191,10 @@
         "typedef B2(A2 a);",
         "typedef B3 A3();",
         "typedef B3([A3 a]);",
-        "typedef A4<T extends B4>();",
-        "typedef B4(A4 a);",
+        "typedef B4 A4();",
+        "typedef B4({A4 a});",
+        "typedef A5<T extends B5>();",
+        "typedef B5(A5 a);",
         "");
     assertErrors(
         libraryResult.getErrors(),
@@ -210,8 +204,10 @@
         errEx(TypeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF, 5, 1, 17),
         errEx(TypeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF, 6, 1, 16),
         errEx(TypeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF, 7, 1, 19),
-        errEx(TypeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF, 8, 1, 27),
-        errEx(TypeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF, 9, 1, 17));
+        errEx(TypeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF, 8, 1, 16),
+        errEx(TypeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF, 9, 1, 19),
+        errEx(TypeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF, 10, 1, 27),
+        errEx(TypeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF, 11, 1, 17));
   }
   
   /**
@@ -252,8 +248,6 @@
   public void test_resolveClassMethod() throws Exception {
     AnalyzeLibraryResult libraryResult =
         analyzeLibrary(
-            "Test.dart",
-            Joiner.on("\n").join(
                 "class Object {}",
                 "class Test {",
                 "  foo() {",
@@ -261,7 +255,7 @@
                 "  }",
                 "  f() {",
                 "  }",
-                "}"));
+                "}");
     DartUnit unit = libraryResult.getLibraryUnitResult().getUnits().iterator().next();
     // find f() invocation
     DartInvocation invocation = findInvocationSimple(unit, "f()");
@@ -287,16 +281,14 @@
   public void test_resolveLocalFunction() throws Exception {
     AnalyzeLibraryResult libraryResult =
         analyzeLibrary(
-            "Test.dart",
-            Joiner.on("\n").join(
-                "class Object {}",
-                "class Test {",
-                "  foo() {",
-                "    f() {",
-                "    }",
-                "    f();",
-                "  }",
-                "}"));
+            "class Object {}",
+            "class Test {",
+            "  foo() {",
+            "    f() {",
+            "    }",
+            "    f();",
+            "  }",
+            "}");
     DartUnit unit = libraryResult.getLibraryUnitResult().getUnits().iterator().next();
     // find f() invocation
     DartInvocation invocation = findInvocationSimple(unit, "f()");
@@ -490,7 +482,7 @@
    * http://code.google.com/p/dart/issues/detail?id=345
    */
   public void test_badTopLevelFactory() throws Exception {
-    AnalyzeLibraryResult libraryResult = analyzeLibrary("Test.dart", "factory foo() {}");
+    AnalyzeLibraryResult libraryResult = analyzeLibrary("factory foo() {}");
     DartUnit unit = libraryResult.getLibraryUnitResult().getUnits().iterator().next();
     DartMethodDefinition factory = (DartMethodDefinition) unit.getTopLevelNodes().get(0);
     assertNotNull(factory);
@@ -535,83 +527,6 @@
   }
 
   /**
-   * From specification 0.05, 11/14/2011.
-   * <p>
-   * It is a static type warning if the type of the nth required formal parameter of kI is not
-   * identical to the type of the nth required formal parameter of kF.
-   * <p>
-   * It is a static type warning if the types of named optional parameters with the same name differ
-   * between kI and kF .
-   * <p>
-   * http://code.google.com/p/dart/issues/detail?id=521
-   */
-  public void test_resolveInterfaceConstructor_hasByName_negative_notSameParametersType()
-      throws Exception {
-    AnalyzeLibraryResult libraryResult =
-        analyzeLibrary(
-            "Test.dart",
-            Joiner.on("\n").join(
-                "interface I default F {",
-                "  I.foo(int a, [int b, int c]);",
-                "}",
-                "class F implements I {",
-                "  factory F.foo(num any, [bool b, Object c]) {}",
-                "}",
-                "class Test {",
-                "  foo() {",
-                "    new I.foo(0);",
-                "  }",
-                "}"));
-    // No compilation errors.
-    assertErrors(libraryResult.getCompilationErrors());
-    // Check type warnings.
-    {
-      List<DartCompilationError> errors = libraryResult.getTypeErrors();
-      assertErrors(errors, errEx(TypeErrorCode.DEFAULT_CONSTRUCTOR_TYPES, 2, 3, 29));
-      assertEquals(
-          "Constructor 'I.foo' in 'I' has parameters types (int,int,int), doesn't match 'F.foo' in 'F' with (num,bool,Object)",
-          errors.get(0).getMessage());
-    }
-    DartUnit unit = libraryResult.getLibraryUnitResult().getUnits().iterator().next();
-    // "new I.foo()" - resolved, but we produce error.
-    {
-      DartNewExpression newExpression = findNodeBySource(unit, "new I.foo(0)");
-      DartNode constructorNode = newExpression.getElement().getNode();
-      assertEquals(true, constructorNode.toSource().contains("F.foo("));
-    }
-  }
-
-  /**
-   * There was problem that <code>this.fieldName</code> constructor parameter had no type, so we
-   * produced incompatible interface/default class warning.
-   */
-  public void test_resolveInterfaceConstructor_sameParametersType_thisFieldParameter()
-      throws Exception {
-    AnalyzeLibraryResult libraryResult =
-        analyzeLibrary(
-            "Test.dart",
-            Joiner.on("\n").join(
-                "interface I default F {",
-                "  I(int a);",
-                "}",
-                "class F implements I {",
-                "  int a;",
-                "  F(this.a) {}",
-                "}"));
-    // Check that parameter has resolved type.
-    {
-      DartUnit unit = libraryResult.getLibraryUnitResult().getUnits().iterator().next();
-      DartClass classF = (DartClass) unit.getTopLevelNodes().get(1);
-      DartMethodDefinition methodF = (DartMethodDefinition) classF.getMembers().get(1);
-      DartParameter parameter = methodF.getFunction().getParameters().get(0);
-      assertEquals("int", parameter.getElement().getType().toString());
-    }
-    // No errors or type warnings.
-    assertErrors(libraryResult.getCompilationErrors());
-    assertErrors(libraryResult.getTypeErrors());
-  }
-
-  /**
    * In contrast, if A is intended to be concrete, the checker should warn about all unimplemented
    * methods, but allow clients to instantiate it freely.
    */
@@ -619,20 +534,18 @@
       throws Exception {
     AnalyzeLibraryResult libraryResult =
         analyzeLibrary(
-            getName(),
-            makeCode(
-                "interface Foo {",
-                "  int fooA;",
-                "  void fooB();",
-                "}",
-                "interface Bar {",
-                "  void barA();",
-                "}",
-                "class A implements Foo, Bar {",
-                "}",
-                "main() {",
-                "  new A();",
-                "}"));
+            "interface Foo {",
+            "  int fooA;",
+            "  void fooB();",
+            "}",
+            "interface Bar {",
+            "  void barA();",
+            "}",
+            "class A implements Foo, Bar {",
+            "}",
+            "main() {",
+            "  new A();",
+            "}");
     assertErrors(
         libraryResult.getTypeErrors(),
         errEx(TypeErrorCode.CONTRETE_CLASS_WITH_UNIMPLEMENTED_MEMBERS, 8, 7, 1));
@@ -655,8 +568,6 @@
       throws Exception {
     AnalyzeLibraryResult libraryResult =
         analyzeLibrary(
-            getName(),
-            makeCode(
                 "abstract class A {",
                 "  abstract void foo();",
                 "}",
@@ -664,7 +575,7 @@
                 "}",
                 "main() {",
                 "  new B();",
-                "}"));
+                "}");
     assertErrors(
         libraryResult.getTypeErrors(),
         errEx(TypeErrorCode.CONTRETE_CLASS_WITH_UNIMPLEMENTED_MEMBERS, 4, 7, 1));
@@ -684,14 +595,12 @@
       throws Exception {
     AnalyzeLibraryResult libraryResult =
         analyzeLibrary(
-            getName(),
-            makeCode(
-                "class A {",
-                "  abstract void foo();",
-                "}",
-                "main() {",
-                "  new A();",
-                "}"));
+            "class A {",
+            "  abstract void foo();",
+            "}",
+            "main() {",
+            "  new A();",
+            "}");
     assertErrors(
         libraryResult.getTypeErrors(),
         errEx(TypeErrorCode.CONTRETE_CLASS_WITH_UNIMPLEMENTED_MEMBERS, 1, 7, 1));
@@ -707,14 +616,12 @@
       throws Exception {
     AnalyzeLibraryResult libraryResult =
         analyzeLibrary(
-            getName(),
-            makeCode(
                 "class A {",
-                "  abstract get x();",
+                "  abstract get x;",
                 "}",
                 "main() {",
                 "  new A();",
-                "}"));
+                "}");
     assertErrors(
         libraryResult.getTypeErrors(),
         errEx(TypeErrorCode.CONTRETE_CLASS_WITH_UNIMPLEMENTED_MEMBERS, 1, 7, 1));
@@ -747,11 +654,11 @@
   public void test_warnAbstract_whenInstantiate_implementsOnlyGetter() throws Exception {
     AnalyzeLibraryResult libraryResult = analyzeLibrary(
         "interface I {",
-        "  get foo();",
+        "  get foo;",
         "  set foo(x);",
         "}",
         "class A implements I {",
-        "  get foo() => 0;",
+        "  get foo => 0;",
         "}",
         "main() {",
         "  new A();",
@@ -768,15 +675,15 @@
   public void test_warnAbstract_whenInstantiate_implementsSetter_inSuperClass() throws Exception {
     AnalyzeLibraryResult libraryResult = analyzeLibrary(
         "interface I {",
-        "  get foo();",
+        "  get foo;",
         "  set foo(x);",
         "}",
         "abstract class A implements I {",
-        "  abstract get foo();",
+        "  abstract get foo;",
         "  set foo(x) {}",
         "}",
         "class B extends A {",
-        "  get foo() => 0;",
+        "  get foo => 0;",
         "}",
         "main() {",
         "  new B();",
@@ -788,14 +695,12 @@
       throws Exception {
     AnalyzeLibraryResult libraryResult =
         analyzeLibrary(
-            getName(),
-            makeCode(
-                "abstract class A {",
-                "  abstract void bar();",
-                "}",
-                "main() {",
-                "  new A();",
-                "}"));
+            "abstract class A {",
+            "  abstract void bar();",
+            "}",
+            "main() {",
+            "  new A();",
+            "}");
     assertErrors(
         libraryResult.getTypeErrors(),
         errEx(TypeErrorCode.INSTANTIATION_OF_ABSTRACT_CLASS, 5, 7, 1));
@@ -808,22 +713,18 @@
    */
   public void test_warnAbstract_onAbstractClass_whenInstantiate_factoryConstructor()
       throws Exception {
-    AnalyzeLibraryResult libraryResult =
-        analyzeLibrary(
-            getName(),
-            makeCode(
-                "abstract class A {",  // explicitly abstract
-                "  factory A() {",
-                "    return null;",
-                "  }",
-                "}",
-                "class C {",
-                "  foo() {",
-                "    return new A();",  // no error - factory constructor
-                "  }",
-                "}"));
-    assertErrors(
-        libraryResult.getTypeErrors());
+    AnalyzeLibraryResult libraryResult = analyzeLibrary(
+        "abstract class A {", // explicitly abstract
+        "  factory A() {",
+        "    return null;",
+        "  }",
+        "}",
+        "class C {",
+        "  foo() {",
+        "    return new A();", // no error - factory constructor
+        "  }",
+        "}");
+    assertErrors(libraryResult.getTypeErrors());
   }
 
   /**
@@ -835,21 +736,18 @@
       throws Exception {
     AnalyzeLibraryResult libraryResult =
         analyzeLibrary(
-            getName(),
-            makeCode(
-                "abstract class A {", // class is abstract
-                "  factory A() {",
-                "    return null;",
-                "  }",
-                "  abstract method();",
-                "}",
-                "class C {",
-                "  foo() {",
-                "    return new A();",  // no error, factory constructor
-                "  }",
-                "}"));
-    assertErrors(
-        libraryResult.getTypeErrors());
+            "abstract class A {", // class is abstract
+            "  factory A() {",
+            "    return null;",
+            "  }",
+            "  abstract method();",
+            "}",
+            "class C {",
+            "  foo() {",
+            "    return new A();",  // no error, factory constructor
+            "  }",
+            "}");
+    assertErrors(libraryResult.getTypeErrors());
   }
 
   /**
@@ -858,14 +756,12 @@
   public void testWarnOnNonVoidSetter() throws Exception {
     AnalyzeLibraryResult libraryResult =
         analyzeLibrary(
-            getName(),
-            makeCode(
                 "class A {",
                 "  void set foo(bool a) {}",
                 "  set bar(bool a) {}",
                 "  dynamic set baz(bool a) {}",
                 "  bool set bob(bool a) {}",
-                "}"));
+                "}");
     assertErrors(
         libraryResult.getTypeErrors(),
         errEx(TypeErrorCode.SETTER_RETURN_TYPE, 4, 3, 7),
@@ -890,14 +786,12 @@
   public void test_callFunctionFromField() throws Exception {
     AnalyzeLibraryResult libraryResult =
         analyzeLibrary(
-            getName(),
-            makeCode(
-                "class WorkElement {",
-                "  Function run;",
-                "}",
-                "foo(WorkElement e) {",
-                "  e.run();",
-                "}"));
+            "class WorkElement {",
+            "  Function run;",
+            "}",
+            "foo(WorkElement e) {",
+            "  e.run();",
+            "}");
     assertErrors(libraryResult.getTypeErrors());
   }
 
@@ -925,16 +819,14 @@
    */
   public void test_doubleGetterAccess_inForEach() throws Exception {
     AnalyzeLibraryResult libraryResult = analyzeLibrary(
-        getName(),
-        makeCode(
             "class Test {",
-            "  Iterable get iter() {}",
+            "  Iterable get iter {}",
             "}",
-            "Test get test() {}",
+            "Test get test {}",
             "f() {",
             "  for (var v in test.iter) {}",
             "}",
-            ""));
+            "");
     assertErrors(libraryResult.getTypeErrors());
   }
 
@@ -945,8 +837,6 @@
   public void test_invocationArguments() throws Exception {
     AnalyzeLibraryResult libraryResult =
         analyzeLibrary(
-            getName(),
-            makeCode(
                 "/* 01 */ foo() {",
                 "/* 02 */   f_0_0();",
                 "/* 03 */   f_0_0(-1);",
@@ -963,18 +853,14 @@
                 "/* 14 */   f_0_1(n1: 1);",
                 "/* 15 */   f_0_1(x: 1);",
                 "/* 16 */   f_0_1(n1: 1, n1: 2);",
-                "/* 17 */",
-                "/* 18 */   f_1_3(-1, 1, n3: 2);",
-                "/* 19 */   f_1_3(-1, 1, n1: 1);",
                 "}",
                 "",
                 "f_0_0() {}",
                 "f_1_0(r1) {}",
                 "f_2_0(r1, r2) {}",
-                "f_0_1([n1]) {}",
-                "f_0_2([n1, n2]) {}",
-                "f_1_3(r1, [n1, n2, n3]) {}",
-                ""));
+                "f_0_1({n1}) {}",
+                "f_0_2({n1, n2}) {}",
+                "");
     assertErrors(
         libraryResult.getTypeErrors(),
         errEx(TypeErrorCode.EXTRA_ARGUMENT, 3, 18, 2),
@@ -982,13 +868,32 @@
         errEx(TypeErrorCode.EXTRA_ARGUMENT, 7, 22, 2),
         errEx(TypeErrorCode.EXTRA_ARGUMENT, 7, 26, 2),
         errEx(TypeErrorCode.MISSING_ARGUMENT, 9, 12, 5),
+        errEx(TypeErrorCode.EXTRA_ARGUMENT, 12, 18, 1),
+        errEx(TypeErrorCode.EXTRA_ARGUMENT, 13, 18, 1),
         errEx(TypeErrorCode.EXTRA_ARGUMENT, 13, 21, 1),
-        errEx(TypeErrorCode.NO_SUCH_NAMED_PARAMETER, 15, 18, 4),
-        errEx(TypeErrorCode.DUPLICATE_NAMED_ARGUMENT, 19, 25, 5));
+        errEx(TypeErrorCode.NO_SUCH_NAMED_PARAMETER, 15, 18, 4));
     assertErrors(
         libraryResult.getCompilationErrors(),
         errEx(ResolverErrorCode.DUPLICATE_NAMED_ARGUMENT, 16, 25, 5));
   }
+  
+  /**
+   * Test that optional positional and named parameters are handled separately.
+   */
+  public void test_invocationArguments2() throws Exception {
+    AnalyzeLibraryResult libraryResult = analyzeLibrary(
+        "// filler filler filler filler filler filler filler filler filler filler",
+        "func([int np1, int np2, int np3]) {}",
+        "main() {",
+        "  func(np1: 1, np2: 2, np3: 2);",
+        "}",
+        "");
+    assertErrors(
+        libraryResult.getTypeErrors(),
+        errEx(TypeErrorCode.NO_SUCH_NAMED_PARAMETER, 4, 8, 6),
+        errEx(TypeErrorCode.NO_SUCH_NAMED_PARAMETER, 4, 16, 6),
+        errEx(TypeErrorCode.NO_SUCH_NAMED_PARAMETER, 4, 24, 6));
+  }
 
   /**
    * We should return correct {@link Type} for {@link DartNewExpression}.
@@ -996,27 +901,24 @@
   public void test_DartNewExpression_getType() throws Exception {
     AnalyzeLibraryResult libraryResult =
         analyzeLibrary(
-            getName(),
-            makeCode(
-                "// filler filler filler filler filler filler filler filler filler filler",
-                "class A {",
-                "  A() {}",
-                "  A.foo() {}",
-                "}",
-                "var a1 = new A();",
-                "var a2 = new A.foo();",
-                ""));
+            "// filler filler filler filler filler filler filler filler filler filler",
+            "class A {",
+            "  A() {}",
+            "  A.foo() {}",
+            "}",
+            "var a1 = new A();",
+            "var a2 = new A.foo();",
+            "");
     assertErrors(libraryResult.getErrors());
-    DartUnit unit = libraryResult.getLibraryUnitResult().getUnit(getName());
     // new A()
     {
-      DartNewExpression newExpression = (DartNewExpression) getTopLevelFieldInitializer(unit, 1);
+      DartNewExpression newExpression = (DartNewExpression) getTopLevelFieldInitializer(testUnit, 1);
       Type newType = newExpression.getType();
       assertEquals("A", newType.getElement().getName());
     }
     // new A.foo()
     {
-      DartNewExpression newExpression = (DartNewExpression) getTopLevelFieldInitializer(unit, 2);
+      DartNewExpression newExpression = (DartNewExpression) getTopLevelFieldInitializer(testUnit, 2);
       Type newType = newExpression.getType();
       assertEquals("A", newType.getElement().getName());
     }
@@ -1041,25 +943,23 @@
   public void test_setterOnlyProperty_noGetter() throws Exception {
     AnalyzeLibraryResult libraryResult =
         analyzeLibrary(
-            getName(),
-            makeCode(
-                "class SetOnly {",
-                "  set foo(arg) {}",
-                "}",
-                "class SetOnlyWrapper {",
-                "  SetOnly setOnly;",
-                "}",
-                "",
-                "main() {",
-                "  SetOnly setOnly = new SetOnly();",
-                "  setOnly.foo = 1;", // 10: OK, use setter
-                "  setOnly.foo += 2;", // 11: ERR, no getter
-                "  print(setOnly.foo);", // 12: ERR, no getter
-                "  var bar;",
-                "  bar = setOnly.foo;", // 14: ERR, assignment, but we are not LHS
-                "  bar = new SetOnlyWrapper().setOnly.foo;", // 15: ERR, even in chained expression
-                "  new SetOnlyWrapper().setOnly.foo = 3;", // 16: OK
-                "}"));
+            "class SetOnly {",
+            "  set foo(arg) {}",
+            "}",
+            "class SetOnlyWrapper {",
+            "  SetOnly setOnly;",
+            "}",
+            "",
+            "main() {",
+            "  SetOnly setOnly = new SetOnly();",
+            "  setOnly.foo = 1;", // 10: OK, use setter
+            "  setOnly.foo += 2;", // 11: ERR, no getter
+            "  print(setOnly.foo);", // 12: ERR, no getter
+            "  var bar;",
+            "  bar = setOnly.foo;", // 14: ERR, assignment, but we are not LHS
+            "  bar = new SetOnlyWrapper().setOnly.foo;", // 15: ERR, even in chained expression
+            "  new SetOnlyWrapper().setOnly.foo = 3;", // 16: OK
+            "}");
     assertErrors(
         libraryResult.getTypeErrors(),
         errEx(TypeErrorCode.FIELD_HAS_NO_GETTER, 11, 11, 3),
@@ -1071,28 +971,24 @@
   public void test_setterOnlyProperty_normalField() throws Exception {
     AnalyzeLibraryResult libraryResult =
         analyzeLibrary(
-            getName(),
-            makeCode(
-                "class A {",
-                "  var foo;",
-                "}",
-                "",
-                "main() {",
-                "  A a = new A();",
-                "  a.foo = 1;",
-                "  a.foo += 2;",
-                "  print(a.foo);",
-                "}"));
+            "class A {",
+            "  var foo;",
+            "}",
+            "",
+            "main() {",
+            "  A a = new A();",
+            "  a.foo = 1;",
+            "  a.foo += 2;",
+            "  print(a.foo);",
+            "}");
     assertErrors(libraryResult.getTypeErrors());
   }
 
   public void test_setterOnlyProperty_getterInSuper() throws Exception {
     AnalyzeLibraryResult libraryResult =
         analyzeLibrary(
-            getName(),
-            makeCode(
                 "class A {",
-                "  get foo() {}",
+                "  get foo {}",
                 "}",
                 "class B extends A {",
                 "  set foo(arg) {}",
@@ -1103,17 +999,15 @@
                 "  b.foo = 1;",
                 "  b.foo += 2;",
                 "  print(b.foo);",
-                "}"));
+                "}");
     assertErrors(libraryResult.getTypeErrors());
   }
 
   public void test_setterOnlyProperty_getterInInterface() throws Exception {
     AnalyzeLibraryResult libraryResult =
         analyzeLibrary(
-            getName(),
-            makeCode(
                 "interface A {",
-                "  get foo() {}",
+                "  get foo {}",
                 "}",
                 "abstract class B implements A {",
                 "  set foo(arg) {}",
@@ -1124,7 +1018,7 @@
                 "  b.foo = 1;",
                 "  b.foo += 2;",
                 "  print(b.foo);",
-                "}"));
+                "}");
     assertErrors(
         libraryResult.getTypeErrors(),
         errEx(TypeErrorCode.INSTANTIATION_OF_ABSTRACT_CLASS, 9, 13, 1));
@@ -1133,10 +1027,8 @@
   public void test_getterOnlyProperty_noSetter() throws Exception {
     AnalyzeLibraryResult libraryResult =
         analyzeLibrary(
-            getName(),
-            makeCode(
                 "class GetOnly {",
-                "  get foo() {}",
+                "  get foo {}",
                 "}",
                 "class GetOnlyWrapper {",
                 "  GetOnly getOnly;",
@@ -1151,7 +1043,7 @@
                 "  bar = getOnly.foo;", // 14: OK, use getter
                 "  new GetOnlyWrapper().getOnly.foo = 3;", // 15: ERR, no setter
                 "  bar = new GetOnlyWrapper().getOnly.foo;", // 16: OK, use getter
-                "}"));
+                "}");
     assertErrors(
         libraryResult.getTypeErrors(),
         errEx(TypeErrorCode.FIELD_HAS_NO_SETTER, 11, 11, 3),
@@ -1162,13 +1054,11 @@
   public void test_getterOnlyProperty_setterInSuper() throws Exception {
     AnalyzeLibraryResult libraryResult =
         analyzeLibrary(
-            getName(),
-            makeCode(
                 "class A {",
                 "  set foo(arg) {}",
                 "}",
                 "class B extends A {",
-                "  get foo() {}",
+                "  get foo {}",
                 "}",
                 "",
                 "main() {",
@@ -1176,20 +1066,18 @@
                 "  b.foo = 1;",
                 "  b.foo += 2;",
                 "  print(b.foo);",
-                "}"));
+                "}");
     assertErrors(libraryResult.getTypeErrors());
   }
 
   public void test_getterOnlyProperty_setterInInterface() throws Exception {
     AnalyzeLibraryResult libraryResult =
         analyzeLibrary(
-            getName(),
-            makeCode(
                 "interface A {",
                 "  set foo(arg) {}",
                 "}",
                 "abstract class B implements A {",
-                "  get foo() {}",
+                "  get foo {}",
                 "}",
                 "",
                 "main() {",
@@ -1197,7 +1085,7 @@
                 "  b.foo = 1;",
                 "  b.foo += 2;",
                 "  print(b.foo);",
-                "}"));
+                "}");
     assertErrors(
         libraryResult.getTypeErrors(),
         errEx(TypeErrorCode.INSTANTIATION_OF_ABSTRACT_CLASS, 9, 13, 1));
@@ -1281,18 +1169,16 @@
 
   public void test_finalField_inClass() throws Exception {
     AnalyzeLibraryResult libraryResult = analyzeLibrary(
-        getName(),
-        makeCode(
-            "// filler filler filler filler filler filler filler filler filler filler",
-            "class A {",
-            "  final f;",
-            "}",
-            "main() {",
-            "  A a = new A();",
-            "  a.f = 0;", // 6: ERR, is final
-            "  a.f += 1;", // 7: ERR, is final
-            "  print(a.f);", // 8: OK, can read
-            "}"));
+        "// filler filler filler filler filler filler filler filler filler filler",
+        "class A {",
+        "  final f;",
+        "}",
+        "main() {",
+        "  A a = new A();",
+        "  a.f = 0;", // 6: ERR, is final
+        "  a.f += 1;", // 7: ERR, is final
+        "  print(a.f);", // 8: OK, can read
+        "}");
     assertErrors(
         libraryResult.getTypeErrors(),
         errEx(TypeErrorCode.FIELD_IS_FINAL, 7, 5, 1),
@@ -1301,21 +1187,19 @@
 
   public void test_finalField_inInterface() throws Exception {
     AnalyzeLibraryResult libraryResult = analyzeLibrary(
-        getName(),
-        makeCode(
-            "// filler filler filler filler filler filler filler filler filler filler",
-            "interface I default A {",
-            "  final f;",
-            "}",
-            "class A implements I {",
-            "  var f;",
-            "}",
-            "main() {",
-            "  I a = new I();",
-            "  a.f = 0;", // 6: ERR, is final
-            "  a.f += 1;", // 7: ERR, is final
-            "  print(a.f);", // 8: OK, can read
-            "}"));
+        "// filler filler filler filler filler filler filler filler filler filler",
+        "interface I default A {",
+        "  final f;",
+        "}",
+        "class A implements I {",
+        "  var f;",
+        "}",
+        "main() {",
+        "  I a = new I();",
+        "  a.f = 0;", // 6: ERR, is final
+        "  a.f += 1;", // 7: ERR, is final
+        "  print(a.f);", // 8: OK, can read
+        "}");
     assertErrors(
         libraryResult.getTypeErrors(),
         errEx(TypeErrorCode.FIELD_IS_FINAL, 10, 5, 1),
@@ -1324,43 +1208,39 @@
 
   public void test_notFinalField() throws Exception {
     AnalyzeLibraryResult libraryResult = analyzeLibrary(
-        getName(),
-        makeCode(
-            "// filler filler filler filler filler filler filler filler filler filler",
-            "interface I default A {",
-            "  var f;",
-            "}",
-            "class A implements I {",
-            "  var f;",
-            "}",
-            "main() {",
-            "  I a = new I();",
-            "  a.f = 0;", // 6: OK, field "f" is not final
-            "  a.f += 1;", // 7: OK, field "f" is not final
-            "  print(a.f);", // 8: OK, can read
-            "}"));
+        "// filler filler filler filler filler filler filler filler filler filler",
+        "interface I default A {",
+        "  var f;",
+        "}",
+        "class A implements I {",
+        "  var f;",
+        "}",
+        "main() {",
+        "  I a = new I();",
+        "  a.f = 0;", // 6: OK, field "f" is not final
+        "  a.f += 1;", // 7: OK, field "f" is not final
+        "  print(a.f);", // 8: OK, can read
+        "}");
     assertErrors(libraryResult.getTypeErrors());
   }
 
   public void test_constField() throws Exception {
     AnalyzeLibraryResult libraryResult = analyzeLibrary(
-        getName(),
-        makeCode(
-            "// filler filler filler filler filler filler filler filler filler filler",
-            "const f = 1;",
-            "class A {",
-            "  const f = 1;",
-            "  method() {",
-            "    f = 2;",
-            "    this.f = 2;",
-            "  }",
-            "}",
-            "main() {",
-            "  f = 2;",
-            "  A a = new A();",
-            "  a.f = 2;",
-            "}",
-            ""));
+        "// filler filler filler filler filler filler filler filler filler filler",
+        "const f = 1;",
+        "class A {",
+        "  const f = 1;",
+        "  method() {",
+        "    f = 2;",
+        "    this.f = 2;",
+        "  }",
+        "}",
+        "main() {",
+        "  f = 2;",
+        "  A a = new A();",
+        "  a.f = 2;",
+        "}",
+        "");
     assertErrors(
         libraryResult.getErrors(),
         errEx(ResolverErrorCode.CANNOT_ASSIGN_TO_FINAL, 6, 5, 1),
@@ -1371,13 +1251,11 @@
   
   public void test_identicalFunction() throws Exception {
     AnalyzeLibraryResult libraryResult = analyzeLibrary(
-        getName(),
-        makeCode(
-            "// filler filler filler filler filler filler filler filler filler filler",
-            "const A = 1;",
-            "const B = 2;",
-            "const C = identical(A, B);",
-            ""));
+        "// filler filler filler filler filler filler filler filler filler filler",
+        "const A = 1;",
+        "const B = 2;",
+        "const C = identical(A, B);",
+        "");
     assertErrors(libraryResult.getErrors());
   }
 
@@ -1467,55 +1345,48 @@
   public void test_methodReturnTypes() throws Exception {
     AnalyzeLibraryResult libraryResult =
         analyzeLibrary(
-            getName(),
-            makeCode(
                 "// filler filler filler filler filler filler filler filler filler filler",
                 "int fA() {}",
                 "dynamic fB() {}",
                 "void fC() {}",
                 "fD() {}",
-                ""));
+                "");
     assertErrors(libraryResult.getTypeErrors());
-    DartUnit unit = libraryResult.getLibraryUnitResult().getUnit(getName());
     {
-      DartMethodDefinition fA = (DartMethodDefinition) unit.getTopLevelNodes().get(0);
+      DartMethodDefinition fA = (DartMethodDefinition) testUnit.getTopLevelNodes().get(0);
       assertEquals("int", fA.getElement().getReturnType().getElement().getName());
     }
     {
-      DartMethodDefinition fB = (DartMethodDefinition) unit.getTopLevelNodes().get(1);
+      DartMethodDefinition fB = (DartMethodDefinition) testUnit.getTopLevelNodes().get(1);
       assertEquals("dynamic", fB.getElement().getReturnType().getElement().getName());
     }
     {
-      DartMethodDefinition fC = (DartMethodDefinition) unit.getTopLevelNodes().get(2);
+      DartMethodDefinition fC = (DartMethodDefinition) testUnit.getTopLevelNodes().get(2);
       assertEquals("void", fC.getElement().getReturnType().getElement().getName());
     }
     {
-      DartMethodDefinition fD = (DartMethodDefinition) unit.getTopLevelNodes().get(3);
+      DartMethodDefinition fD = (DartMethodDefinition) testUnit.getTopLevelNodes().get(3);
       assertEquals("dynamic", fD.getElement().getReturnType().getElement().getName());
     }
   }
 
   public void test_bindToLibraryFunctionFirst() throws Exception {
-    AnalyzeLibraryResult libraryResult =
-        analyzeLibrary(
-            getName(),
-            makeCode(
-                "// filler filler filler filler filler filler filler filler filler filler",
-                "foo() {}",
-                "class A {",
-                " foo() {}",
-                "}",
-                "class B extends A {",
-                "  bar() {",
-                "    foo();",
-                "  }",
-                "}",
-                ""));
-    DartUnit unit = libraryResult.getLibraryUnitResult().getUnit(getName());
+    analyzeLibrary(
+        "// filler filler filler filler filler filler filler filler filler filler",
+        "foo() {}",
+        "class A {",
+        " foo() {}",
+        "}",
+        "class B extends A {",
+        "  bar() {",
+        "    foo();",
+        "  }",
+        "}",
+        "");
     // Find foo() invocation.
     DartUnqualifiedInvocation invocation;
     {
-      DartClass classB = (DartClass) unit.getTopLevelNodes().get(2);
+      DartClass classB = (DartClass) testUnit.getTopLevelNodes().get(2);
       DartMethodDefinition methodBar = (DartMethodDefinition) classB.getMembers().get(0);
       DartExprStmt stmt = (DartExprStmt) methodBar.getFunction().getBody().getStatements().get(0);
       invocation = (DartUnqualifiedInvocation) stmt.getExpression();
@@ -1523,7 +1394,7 @@
     // Check that unqualified foo() invocation is resolved to the top-level (library) function.
     NodeElement element = invocation.getTarget().getElement();
     assertNotNull(element);
-    assertSame(unit, element.getNode().getParent());
+    assertSame(testUnit, element.getNode().getParent());
   }
 
   /**
@@ -1531,13 +1402,12 @@
    * as an exception.
    */
   public void test_invalidImportUri() throws Exception {
-    List<DartCompilationError> errors =
-        analyzeLibrarySourceErrors(makeCode(
-            "// filler filler filler filler filler filler filler filler filler filler",
-            "library test;",
-            "import 'badURI';",
-            ""));
-    assertErrors(errors, errEx(DartCompilerErrorCode.MISSING_SOURCE, 3, 1, 16));
+    AnalyzeLibraryResult libraryResult = analyzeLibrary(
+        "// filler filler filler filler filler filler filler filler filler filler",
+        "library test;",
+        "import 'badURI';",
+        "");
+    assertErrors(libraryResult.getErrors(), errEx(DartCompilerErrorCode.MISSING_SOURCE, 3, 1, 16));
   }
 
   /**
@@ -1545,49 +1415,20 @@
    * as an exception.
    */
   public void test_invalidSourceUri() throws Exception {
-    List<DartCompilationError> errors =
-        analyzeLibrarySourceErrors(makeCode(
-            "// filler filler filler filler filler filler filler filler filler filler",
-            "library test;",
-            "part 'badURI';",
-            ""));
-    assertErrors(errors, errEx(DartCompilerErrorCode.MISSING_SOURCE, 3, 1, 14));
-  }
-
-  /**
-   * Analyzes source for given library and returns {@link DartCompilationError}s.
-   */
-  private static List<DartCompilationError> analyzeLibrarySourceErrors(final String code)
-      throws Exception {
-    MockLibrarySource lib = new MockLibrarySource() {
-      @Override
-      public Reader getSourceReader() {
-        return new StringReader(code);
-      }
-    };
-    DartArtifactProvider provider = new MockArtifactProvider();
-    final List<DartCompilationError> errors = Lists.newArrayList();
-    DartCompiler.analyzeLibrary(
-        lib,
-        Maps.<URI, DartUnit>newHashMap(),
-        CHECK_ONLY_CONFIGURATION,
-        provider,
-        new DartCompilerListener.Empty() {
-          @Override
-          public void onError(DartCompilationError event) {
-            errors.add(event);
-          }
-        });
-    return errors;
+    AnalyzeLibraryResult libraryResult = analyzeLibrary(
+        "// filler filler filler filler filler filler filler filler filler filler",
+        "library test;",
+        "part 'badURI';",
+        "");
+    assertErrors(libraryResult.getErrors(), errEx(DartCompilerErrorCode.MISSING_SOURCE, 3, 1, 14));
   }
 
   public void test_mapLiteralKeysUnique() throws Exception {
-    List<DartCompilationError> errors =
-        analyzeLibrarySourceErrors(makeCode(
-            "// filler filler filler filler filler filler filler filler filler filler",
-            "var m = {'a' : 0, 'b': 1, 'a': 2};",
-            ""));
-    assertErrors(errors, errEx(TypeErrorCode.MAP_LITERAL_KEY_UNIQUE, 2, 27, 3));
+    AnalyzeLibraryResult libraryResult = analyzeLibrary(
+        "// filler filler filler filler filler filler filler filler filler filler",
+        "var m = {'a' : 0, 'b': 1, 'a': 2};",
+        "");
+    assertErrors(libraryResult.getErrors(), errEx(TypeErrorCode.MAP_LITERAL_KEY_UNIQUE, 2, 27, 3));
   }
 
   /**
@@ -1596,7 +1437,7 @@
   public void test_implementsAndOverrides_noRequiredParameter() throws Exception {
     AnalyzeLibraryResult result =
         analyzeLibrary(
-            "interface I {",
+            "abstract class I {",
             "  foo(x);",
             "}",
             "class C implements I {",
@@ -1613,26 +1454,26 @@
   public void test_implementsAndOverrides_additionalNamedParameter() throws Exception {
     AnalyzeLibraryResult result =
         analyzeLibrary(
-            "interface I {",
-            "  foo([x]);",
+            "abstract class I {",
+            "  foo({x});",
             "}",
             "class C implements I {",
-            "  foo([x,y]) {}",
+            "  foo({x,y}) {}",
             "}");
     assertErrors(result.getErrors());
   }
-  
+
   public void test_implementsAndOverrides_lessNamedParameter() throws Exception {
     AnalyzeLibraryResult result = analyzeLibrary(
         "abstract class A {",
-        "  abstract foo([x, y]);",
+        "  foo({x, y});",
         "}",
         "abstract class B extends A {",
-        "  abstract foo([x]);",
+        "  foo({x});",
         "}");
     assertErrors(
         result.getErrors(),
-        errEx(ResolverErrorCode.CANNOT_OVERRIDE_METHOD_NAMED_PARAMS, 5, 12, 3));
+        errEx(ResolverErrorCode.CANNOT_OVERRIDE_METHOD_NAMED_PARAMS, 5, 3, 3));
   }
 
   /**
@@ -1643,10 +1484,10 @@
     AnalyzeLibraryResult result =
         analyzeLibrary(
             "abstract class A {",
-            "  abstract foo();",
+            "  foo();",
             "}",
             "class B extends A {",
-            "  foo([x]) {}",
+            "  foo({x}) {}",
             "}",
             "bar() {",
             "  new B();",
@@ -1655,13 +1496,37 @@
     assertErrors(result.getErrors());
   }
 
+  public void test_implementsAndOverrides_lessOptionalPositionalParameter() throws Exception {
+    AnalyzeLibraryResult result = analyzeLibrary(
+        "abstract class A {",
+        "  foo([x, y]);",
+        "}",
+        "abstract class B extends A {",
+        "  foo([x]);",
+        "}");
+    assertErrors(
+        result.getErrors(),
+        errEx(ResolverErrorCode.CANNOT_OVERRIDE_METHOD_OPTIONAL_PARAMS, 5, 3, 3));
+  }
+  
+  public void test_implementsAndOverrides_moreOptionalPositionalParameter() throws Exception {
+    AnalyzeLibraryResult result = analyzeLibrary(
+        "abstract class A {",
+        "  foo([x]);",
+        "}",
+        "abstract class B extends A {",
+        "  foo([a, b]);",
+        "}");
+    assertErrors(result.getErrors());
+  }
+
   /**
    * No required parameter "x". Named parameter "x" is not enough.
    */
   public void test_implementsAndOverrides_extraRequiredParameter() throws Exception {
     AnalyzeLibraryResult result =
         analyzeLibrary(
-            "interface I {",
+            "abstract class I {",
             "  foo();",
             "}",
             "class C implements I {",
@@ -1676,7 +1541,7 @@
    * <p>
    * http://code.google.com/p/dart/issues/detail?id=3183
    */
-  public void test_implementsAndOverrides_differentDefaultValue() throws Exception {
+  public void test_implementsAndOverrides_differentDefaultValue_optional() throws Exception {
     AnalyzeLibraryResult result =
         analyzeLibrary(
             "// filler filler filler filler filler filler filler filler filler filler",
@@ -1699,6 +1564,34 @@
         errEx(TypeErrorCode.CANNOT_OVERRIDE_METHOD_DEFAULT_VALUE, 11, 7, 5),
         errEx(TypeErrorCode.CANNOT_OVERRIDE_METHOD_DEFAULT_VALUE, 12, 7, 7));
   }
+  
+  /**
+   * <p>
+   * http://code.google.com/p/dart/issues/detail?id=3183
+   */
+  public void test_implementsAndOverrides_differentDefaultValue_named() throws Exception {
+    AnalyzeLibraryResult result =
+        analyzeLibrary(
+            "// filler filler filler filler filler filler filler filler filler filler",
+            "class A {",
+            "  f1({x}) {}",
+            "  f2({x: 1}) {}",
+            "  f3({x: 1}) {}",
+            "  f4({x: 1}) {}",
+            "}",
+            "class B extends A {",
+            "  f1({x: 2}) {}",
+            "  f2({x]) {}",
+            "  f3({x: 2}) {}",
+            "  f4({x: '2'}) {}",
+            "}",
+            "");
+    assertErrors(
+        result.getErrors(),
+        errEx(TypeErrorCode.CANNOT_OVERRIDE_METHOD_DEFAULT_VALUE, 10, 7, 1),
+        errEx(TypeErrorCode.CANNOT_OVERRIDE_METHOD_DEFAULT_VALUE, 11, 7, 4),
+        errEx(TypeErrorCode.CANNOT_OVERRIDE_METHOD_DEFAULT_VALUE, 12, 7, 6));
+  }
 
   /**
    * It is a compile-time error if an instance method m1 overrides an instance member m2 and m1 does
@@ -1709,11 +1602,11 @@
   public void test_implementsAndOverrides_noNamedParameter() throws Exception {
     AnalyzeLibraryResult result =
         analyzeLibrary(
-            "interface I {",
-            "  foo([x,y]);",
+            "abstract class I {",
+            "  foo({x,y});",
             "}",
             "class C implements I {",
-            "  foo([x]) {}",
+            "  foo({x}) {}",
             "}");
     assertErrors(
         result.getErrors(),
@@ -1749,24 +1642,16 @@
         errEx(ResolverErrorCode.INVALID_OVERRIDE_METADATA, 6, 3, 3));
   }
 
-  /**
-   * It is a compile-time error if an instance method m1 overrides an instance member m2 and m1 does
-   * not declare all the named parameters declared by m2 in the same order.
-   * <p>
-   * Here: wrong order.
-   */
   public void testImplementsAndOverrides5() throws Exception {
     AnalyzeLibraryResult result =
         analyzeLibrary(
-            "interface I {",
-            "  foo([y,x]);",
+            "abstract class I {",
+            "  foo({y,x});",
             "}",
             "class C implements I {",
-            "  foo([x,y]) {}",
+            "  foo({x,y}) {}",
             "}");
-    assertErrors(
-        result.getErrors(),
-        errEx(ResolverErrorCode.CANNOT_OVERRIDE_METHOD_NAMED_PARAMS, 5, 3, 3));
+    assertErrors(result.getErrors());
   }
 
   /**
@@ -1794,11 +1679,11 @@
         analyzeLibrary(
             "// filler filler filler filler filler filler filler filler filler filler",
             "class A {",
-            "  static get field() => 0;",
+            "  static get field => 0;",
             "         set field(var v) {}",
             "}",
             "class B {",
-            "         get field() => 0;",
+            "         get field => 0;",
             "  static set field(var v) {}",
             "}",
             "");
@@ -1820,7 +1705,7 @@
             "class C {",
             "  A getterField; ",
             "  B setterField; ",
-            "  A get field() { return getterField; }",
+            "  A get field { return getterField; }",
             "  void set field(B arg) { setterField = arg; }",
             "}",
             "main() {",
@@ -1841,12 +1726,12 @@
             "class A {} ",
             "A topGetterField; ",
             "var topSetterField; ",
-            "A get topField() { return topGetterField; }",
+            "A get topField { return topGetterField; }",
             "void set topField(arg) { topSetterField = arg; }",
             "class C {",
             "  A getterField; ",
             "  var setterField; ",
-            "  A get field() { return getterField; }",
+            "  A get field { return getterField; }",
             "  void set field(arg) { setterField = arg; }",
             "}");
     assertErrors(result.getErrors());
@@ -1859,12 +1744,12 @@
             "class A {} ",
             "var topGetterField; ",
             "A topSetterField; ",
-            "get topField() { return topGetterField; }",
+            "get topField { return topGetterField; }",
             "void set topField(A arg) { topSetterField = arg; }",
             "class C {",
             "  var getterField; ",
             "  A setterField; ",
-            "  get field() { return getterField; }",
+            "  get field { return getterField; }",
             "  void set field(A arg) { setterField = arg; }",
             "}");
     assertErrors(result.getErrors());
@@ -1878,12 +1763,12 @@
             "class B {}",
             "A topGetterField; ",
             "B topSetterField; ",
-            "A get topField() { return topGetterField; }",
+            "A get topField { return topGetterField; }",
             "void set topField(B arg) { topSetterField = arg; }",
             "class C {",
             "  A getterField; ",
             "  B setterField; ",
-            "  A get field() { return getterField; }",
+            "  A get field { return getterField; }",
             "  void set field(B arg) { setterField = arg; }",
             "}");
     assertErrors(result.getErrors(),
@@ -1948,7 +1833,7 @@
     AnalyzeLibraryResult result =
         analyzeLibrary(
             "// filler filler filler filler filler filler filler filler filler filler",
-            "interface I<T extends num> { }",
+            "abstract class I<T extends num> { }",
             "class A<T extends num> implements I<T> { }",
             "class B<T> implements I<T> { }"); // static type error B.T not assignable to num
     assertErrors(result.getErrors(), errEx(TypeErrorCode.TYPE_NOT_ASSIGNMENT_COMPATIBLE, 4, 25, 1));
@@ -1988,7 +1873,7 @@
         analyzeLibrary(
             "// filler filler filler filler filler filler filler filler filler filler",
             "class Base1<T1> {",
-            "  T1 get val() {}",
+            "  T1 get val {}",
             "}",
             "class Base2<T2> extends Base1<T2> {",
             "}",
@@ -2524,8 +2409,7 @@
   }
 
   /**
-   * When single variable has conflicting type constraints, right now we don't try to unify them,
-   * instead we fall back to "dynamic".
+   * When single variable has conflicting type constraints, we use union of types.
    */
   public void test_typesPropagation_ifIsType_conflictingTypes() throws Exception {
     analyzeLibrary(
@@ -2536,7 +2420,7 @@
         "  }",
         "}",
         "");
-    assertInferredElementTypeString(testUnit, "v1", "dynamic");
+    assertInferredElementTypeString(testUnit, "v1", "[int, String]");
   }
 
   public void test_typesPropagation_ifIsType_negation() throws Exception {
@@ -2884,6 +2768,38 @@
     assertInferredElementTypeString(testUnit, "b3", "dynamic");
   }
 
+  /**
+   * When variable has explicit type, we should not fall to 'dynamic', we need to keep this type.
+   * <p>
+   * http://code.google.com/p/dart/issues/detail?id=6399
+   */
+  public void test_typesPropagation_assertIsType_hasExplicitType() throws Exception {
+    analyzeLibrary(
+        "class A {}",
+        "class B extends A {}",
+        "class C extends B {}",
+        "main() {",
+        "  B v;",
+        "  if (v is A) {",
+        "    var v1 = v;",
+        "  }",
+        "  if (v is B) {",
+        "    var v2 = v;",
+        "  }",
+        "  if (v is C) {",
+        "    var v3 = v;",
+        "  }",
+        "  if (v is String) {",
+        "    var v4 = v;",
+        "  }",
+        "}",
+        "");
+    assertInferredElementTypeString(testUnit, "v1", "B");
+    assertInferredElementTypeString(testUnit, "v2", "B");
+    assertInferredElementTypeString(testUnit, "v3", "C");
+    assertInferredElementTypeString(testUnit, "v4", "[B, String]");
+  }
+
   public void test_typesPropagation_field_inClass_final() throws Exception {
     analyzeLibrary(
         "// filler filler filler filler filler filler filler filler filler filler",
@@ -3020,7 +2936,7 @@
         "// filler filler filler filler filler filler filler filler filler filler",
         "class Event {}",
         "typedef void EventListener(Event event);",
-        "foo([EventListener listener]) {",
+        "foo({EventListener listener}) {",
         "}",
         "main() {",
         "  foo(listener: (e) {",
@@ -3140,10 +3056,10 @@
   public void test_typesPropagation_conditional() throws Exception {
     AnalyzeLibraryResult libraryResult = analyzeLibrary(
         "// filler filler filler filler filler filler filler filler filler filler",
-        "interface I1 {",
+        "abstract class I1 {",
         "  f1();",
         "}",
-        "interface I2 {",
+        "abstract class I2 {",
         "  f2();",
         "}",
         "class A implements I1, I2 {",
@@ -3257,8 +3173,8 @@
   public void test_getType_getterInNegation() throws Exception {
     AnalyzeLibraryResult libraryResult = analyzeLibrary(
         "class A {",
-        "  int get intProperty() => 42;",
-        "  bool get boolProperty() => true;",
+        "  int get intProperty => 42;",
+        "  bool get boolProperty => true;",
         "}",
         "f() {",
         "  var a = new A();",
@@ -3279,7 +3195,7 @@
     AnalyzeLibraryResult libraryResult = analyzeLibrary(
         "class A<T> {",
         "  T field;",
-        "  T get prop() => null;",
+        "  T get prop => null;",
         "}",
         "f() {",
         "  var a = new A<bool>();",
@@ -3303,7 +3219,7 @@
   public void test_getType_getterInSwitch_default() throws Exception {
     AnalyzeLibraryResult libraryResult = analyzeLibrary(
         "// filler filler filler filler filler filler filler filler filler filler",
-        "int get foo() {}",
+        "int get foo {}",
         "f() {",
         "  switch (true) {",
         "    default:",
@@ -3321,7 +3237,7 @@
   public void test_getType_getterInSwitchExpression_topLevel() throws Exception {
     AnalyzeLibraryResult libraryResult = analyzeLibrary(
         "// filler filler filler filler filler filler filler filler filler filler",
-        "int get foo() => 42;",
+        "int get foo => 42;",
         "f() {",
         "  switch (foo) {",
         "    case 2:",
@@ -3340,7 +3256,7 @@
     AnalyzeLibraryResult libraryResult = analyzeLibrary(
         "// filler filler filler filler filler filler filler filler filler filler",
         "class A<T> {",
-        "  T get foo() => null;",
+        "  T get foo => null;",
         "}",
         "f() {",
         "  A<int> a = new A<int>();",
@@ -3420,9 +3336,8 @@
             "}",
             "");
     assertErrors(libraryResult.getErrors());
-    DartUnit unit = libraryResult.getLibraryUnitResult().getUnit(getName());
     // find == expression
-    DartExpression expression = findNodeBySource(unit, "new C() == new C()");
+    DartExpression expression = findNodeBySource(testUnit, "new C() == new C()");
     assertNotNull(expression);
     // validate == element
     MethodElement equalsElement = (MethodElement) expression.getElement();
@@ -3441,7 +3356,7 @@
             "  bar();",
             "}",
             "interface J extends I {",
-            "  get foo();",
+            "  get foo;",
             "  set bar();",
             "}");
       assertErrors(libraryResult.getTypeErrors(),
@@ -3534,7 +3449,7 @@
         "// filler filler filler filler filler filler filler filler filler filler",
         "class A {}",
         "interface I {",
-        "  get foo();",
+        "  get foo;",
         "  set bar();",
         "}",
         "interface J extends I {",
@@ -3719,7 +3634,7 @@
   public void test_incompatibleTypesInHierarchy1() throws Exception {
     AnalyzeLibraryResult libraryResult = analyzeLibrary(
         "// filler filler filler filler filler filler filler filler filler filler",
-        "interface Interface<T> {",
+        "abstract class Interface<T> {",
         "  T m();",
         "}",
         "abstract class A implements Interface {",
@@ -3734,7 +3649,7 @@
   public void test_incompatibleTypesInHierarchy2() throws Exception {
     AnalyzeLibraryResult libraryResult = analyzeLibrary(
         "// filler filler filler filler filler filler filler filler filler filler",
-        "interface Interface<T> {",
+        "abstract class Interface<T> {",
         "  T m();",
         "}",
         "abstract class A implements Interface<String> {",
@@ -3861,7 +3776,7 @@
     AnalyzeLibraryResult libraryResult = analyzeLibrary(
         "// filler filler filler filler filler filler filler filler filler filler",
         "class C {" +
-        "  get method() { }",
+        "  get method { }",
         "}",
         "main () {",
         "  new C().method = _() {};",
@@ -3880,7 +3795,7 @@
     AnalyzeLibraryResult libraryResult = analyzeLibrary(
         "// filler filler filler filler filler filler filler filler filler filler",
         "class C {" +
-        "  get method() { }",
+        "  get method { }",
         "  operator []=(k, v) {}",
         "}",
         "main () {",
@@ -4232,6 +4147,21 @@
         errEx(TypeErrorCode.NOT_A_FUNCTION_TYPE, 10, 3, 3),
         errEx(TypeErrorCode.NOT_A_FUNCTION_TYPE, 11, 3, 9));
   }
+  
+  public void test_invokeNonFunction_getter() throws Exception {
+    AnalyzeLibraryResult libraryResult = analyzeLibrary(
+        "// filler filler filler filler filler filler filler filler filler filler",
+        "class A {",
+        "  int get foo => 0;",
+        "}",
+        "main() {",
+        "  A a = new A();",
+        "  a.foo();",
+        "}");
+    assertErrors(
+        libraryResult.getErrors(),
+        errEx(TypeErrorCode.NOT_A_FUNCTION_TYPE_FIELD, 7, 5, 3));
+  }
 
   public void test_wrongOperandTypeForUnaryExpression() throws Exception {
     AnalyzeLibraryResult libraryResult = analyzeLibrary(
@@ -4330,7 +4260,7 @@
     AnalyzeLibraryResult libraryResult = analyzeLibrary(
         "// filler filler filler filler filler filler filler filler filler filler",
         "external topFunction();",
-        "external get topGetter();",
+        "external get topGetter;",
         "external set topSetter(var v);",
         "class A {",
         "  external const A.con();",
@@ -4338,7 +4268,7 @@
         "  external factory A.named();",
         "  external classMethod();",
         "  external static classMethodStatic();",
-        "  external get classGetter();",
+        "  external get classGetter;",
         "  external set classSetter(var v);",
         "}",
         "");
@@ -4388,7 +4318,6 @@
         "  external A() {}",
         "  external factory A.named() {}",
         "  external classMethod() {}",
-        "  external abstract classMethodAbstract();",
         "}",
         "");
     assertErrors(
@@ -4396,8 +4325,18 @@
         errEx(ParserErrorCode.EXTERNAL_METHOD_BODY, 2, 24, 2),
         errEx(ParserErrorCode.EXTERNAL_METHOD_BODY, 4, 16, 2),
         errEx(ParserErrorCode.EXTERNAL_METHOD_BODY, 5, 30, 2),
-        errEx(ParserErrorCode.EXTERNAL_METHOD_BODY, 6, 26, 2),
-        errEx(ParserErrorCode.EXTERNAL_ABSTRACT, 7, 12, 8));
+        errEx(ParserErrorCode.EXTERNAL_METHOD_BODY, 6, 26, 2));
+  }
+
+  public void test_cascade_type() throws Exception {
+    analyzeLibrary(
+        "// filler filler filler filler filler filler filler filler filler filler",
+        "main() {",
+        "  String s = '';",
+        "  var v = s..length;",
+        "}",
+        "");
+    assertInferredElementTypeString(testUnit, "v", "String");
   }
 
   /**
@@ -4481,13 +4420,13 @@
    * http://code.google.com/p/dart/issues/detail?id=3084
    */
   public void test_unresolvedIdentifier_inStatic_notPropertyAccess() throws Exception {
-    AnalyzeLibraryResult libraryResult = analyzeLibrary(makeCode(
+    AnalyzeLibraryResult libraryResult = analyzeLibrary(
         "// filler filler filler filler filler filler filler filler filler filler",
         "process(x) {}",
         "main() {",
         "  unknown = 0;",
         "  process(unknown);",
-        "}"));
+        "}");
     assertErrors(
         libraryResult.getErrors(),
         errEx(ResolverErrorCode.CANNOT_BE_RESOLVED, 4, 3, 7),
@@ -4501,7 +4440,7 @@
    * http://code.google.com/p/dart/issues/detail?id=3084
    */
   public void test_unresolvedIdentifier_inInstance_notPropertyAccess() throws Exception {
-    AnalyzeLibraryResult libraryResult = analyzeLibrary(makeCode(
+    AnalyzeLibraryResult libraryResult = analyzeLibrary(
         "// filler filler filler filler filler filler filler filler filler filler",
         "process(x) {}",
         "class A {",
@@ -4509,7 +4448,7 @@
         "    unknown = 0;",
         "    process(unknown);",
         "  }",
-        "}"));
+        "}");
     assertErrors(
         libraryResult.getErrors(),
         errEx(TypeErrorCode.CANNOT_BE_RESOLVED, 5, 5, 7),
@@ -4521,13 +4460,13 @@
    * http://code.google.com/p/dart/issues/detail?id=3084
    */
   public void test_unresolvedIdentifier_inStatic_inPropertyAccess() throws Exception {
-    AnalyzeLibraryResult libraryResult = analyzeLibrary(makeCode(
+    AnalyzeLibraryResult libraryResult = analyzeLibrary(
         "// filler filler filler filler filler filler filler filler filler filler",
         "process(x) {}",
         "main() {",
         "  Unknown.foo = 0;",
         "  process(Unknown.foo);",
-        "}"));
+        "}");
     assertErrors(
         libraryResult.getErrors(),
         errEx(TypeErrorCode.CANNOT_BE_RESOLVED, 4, 3, 7),
@@ -4540,7 +4479,7 @@
    * http://code.google.com/p/dart/issues/detail?id=3800
    */
   public void test_unresolvedConstructor() throws Exception {
-    AnalyzeLibraryResult libraryResult = analyzeLibrary(makeCode(
+    AnalyzeLibraryResult libraryResult = analyzeLibrary(
         "// filler filler filler filler filler filler filler filler filler filler",
         "class A {}",
         "main() {",
@@ -4548,7 +4487,7 @@
         "  new A.noSuchConstructor(); // warning",
         "  new B(); // warning",
         "  new B.noSuchConstructor(); // warning",
-        "}"));
+        "}");
     assertErrors(
         libraryResult.getErrors(),
         errEx(ResolverErrorCode.NEW_EXPRESSION_NOT_CONSTRUCTOR, 5, 9, 17),
@@ -4578,7 +4517,7 @@
    * many other points in the Editor.
    */
   public void test_typeForEveryExpression_variable() throws Exception {
-    AnalyzeLibraryResult libraryResult = analyzeLibrary(
+    analyzeLibrary(
         "// filler filler filler filler filler filler filler filler filler filler",
         "class A {}",
         "process(x) {}",
@@ -4586,8 +4525,7 @@
         "  A aaa = new A();",
         "  process(aaa);",
         "}");
-    DartUnit unit = libraryResult.getLibraryUnitResult().getUnit(getName());
-    unit.accept(new ASTVisitor<Void>() {
+    testUnit.accept(new ASTVisitor<Void>() {
       public Void visitIdentifier(DartIdentifier node) {
         // ignore declaration
         if (node.getParent() instanceof DartDeclaration) {
@@ -4609,7 +4547,7 @@
    * many other points in the Editor.
    */
   public void test_typeForEveryExpression_typeNode() throws Exception {
-    AnalyzeLibraryResult libraryResult = analyzeLibrary(
+    analyzeLibrary(
         "// filler filler filler filler filler filler filler filler filler filler",
         "class AAA {",
         "  static foo() {}",
@@ -4617,8 +4555,7 @@
         "main() {",
         "  AAA.foo();",
         "}");
-    DartUnit unit = libraryResult.getLibraryUnitResult().getUnit(getName());
-    unit.accept(new ASTVisitor<Void>() {
+    testUnit.accept(new ASTVisitor<Void>() {
       public Void visitIdentifier(DartIdentifier node) {
         // ignore declaration
         if (node.getParent() instanceof DartDeclaration) {
@@ -4689,7 +4626,6 @@
         "  method(10, 20, 30, 40);",
         "}");
     assertErrors(libraryResult.getErrors());
-    DartUnit unit = libraryResult.getLibraryUnitResult().getUnit(getName());
     new ArgumentsBindingTester() {
       @Override
       void checkArgs(int invocationIndex) {
@@ -4714,7 +4650,7 @@
           }
         }
       }
-    }.doTest(unit);
+    }.doTest(testUnit);
   }
   
   public void test_formalParameters_positional_named() throws Exception {
@@ -4728,7 +4664,6 @@
         "  method(10, 20, d: 40, c: 30);",
         "}");
     assertErrors(libraryResult.getErrors());
-    DartUnit unit = libraryResult.getLibraryUnitResult().getUnit(getName());
     new ArgumentsBindingTester() {
       @Override
       void checkArgs(int invocationIndex) {
@@ -4759,7 +4694,7 @@
           }
         }
       }
-    }.doTest(unit);
+    }.doTest(testUnit);
   }
 
   /**
@@ -4770,12 +4705,12 @@
    * http://code.google.com/p/dart/issues/detail?id=3989
    */
   public void test_constructorName_sameAsMemberName() throws Exception {
-    AnalyzeLibraryResult libraryResult = analyzeLibrary(makeCode(
+    AnalyzeLibraryResult libraryResult = analyzeLibrary(
         "// filler filler filler filler filler filler filler filler filler filler",
         "class A {",
         "  A.foo() {}",
         "  foo() {}",
-        "}"));
+        "}");
     assertErrors(
         libraryResult.getErrors(),
         errEx(ResolverErrorCode.CONSTRUCTOR_WITH_NAME_OF_MEMBER, 3, 3, 5));
@@ -4786,13 +4721,13 @@
    * http://code.google.com/p/dart/issues/detail?id=3904
    */
   public void test_reifiedClasses() throws Exception {
-    AnalyzeLibraryResult libraryResult = analyzeLibrary(makeCode(
+    AnalyzeLibraryResult libraryResult = analyzeLibrary(
         "// filler filler filler filler filler filler filler filler filler filler",
         "class A {}",
         "process(x) {}",
         "main() {",
         "  process(A);",
-        "}"));
+        "}");
     assertErrors(libraryResult.getErrors());
   }
 
@@ -4801,7 +4736,7 @@
    * http://code.google.com/p/dart/issues/detail?id=3968
    */
   public void test_redirectingFactoryConstructor() throws Exception {
-    AnalyzeLibraryResult libraryResult = analyzeLibrary(makeCode(
+    AnalyzeLibraryResult libraryResult = analyzeLibrary(
         "// filler filler filler filler filler filler filler filler filler filler",
         "class A {",
         "  A() {}",
@@ -4812,7 +4747,7 @@
         "  factory B.foo() = A;",
         "  factory B.bar() = A.named;",
         "}",
-        ""));
+        "");
     assertErrors(libraryResult.getErrors());
     // prepare "class A"
     ClassElement elementA = findNode(DartClass.class, "class A").getElement();
@@ -4837,7 +4772,7 @@
   }
   
   public void test_redirectingFactoryConstructor_cycle() throws Exception {
-    AnalyzeLibraryResult libraryResult = analyzeLibrary(makeCode(
+    AnalyzeLibraryResult libraryResult = analyzeLibrary(
         "// filler filler filler filler filler filler filler filler filler filler",
         "class A {",
         "  factory A.nameA() = C.nameC;",
@@ -4848,7 +4783,7 @@
         "class C {",
         "  factory C.nameC() = B.nameB;",
         "}",
-        ""));
+        "");
     assertErrors(
         libraryResult.getErrors(),
         errEx(ResolverErrorCode.REDIRECTION_CONSTRUCTOR_CYCLE, 3, 11, 7),
@@ -4857,7 +4792,7 @@
   }
   
   public void test_redirectingFactoryConstructor_notConst_fromConst() throws Exception {
-    AnalyzeLibraryResult libraryResult = analyzeLibrary(makeCode(
+    AnalyzeLibraryResult libraryResult = analyzeLibrary(
         "// filler filler filler filler filler filler filler filler filler filler",
         "class A {",
         "  A.named() {}",
@@ -4866,7 +4801,7 @@
         "class B {",
         "  const factory B.bar() = A.named;",
         "}",
-        ""));
+        "");
     assertErrors(
         libraryResult.getErrors(),
         errEx(ResolverErrorCode.REDIRECTION_CONSTRUCTOR_TARGET_MUST_BE_CONST, 7, 29, 5));
@@ -4877,7 +4812,7 @@
    * http://code.google.com/p/dart/issues/detail?id=4778
    */
   public void test_unqualifiedAccessToGenericTypeField() throws Exception {
-    AnalyzeLibraryResult libraryResult = analyzeLibrary(makeCode(
+    AnalyzeLibraryResult libraryResult = analyzeLibrary(
         "// filler filler filler filler filler filler filler filler filler filler",
         "class Game {}",
         "class GameRenderer<G extends Game> {",
@@ -4891,7 +4826,7 @@
         "    var a = game.score;",
         "  }",
         "}",
-        ""));
+        "");
     assertErrors(libraryResult.getErrors());
   }
 
@@ -4922,7 +4857,7 @@
     String[] lines = {
         "// filler filler filler filler filler filler filler filler filler filler",
         "class A {",
-        "  noSuchMethod(String name, List args) {}",
+        "  noSuchMethod(InvocationMirror invocation) {}",
         "}",
         "class B extends A {}",
         "class C {}",
@@ -4964,7 +4899,7 @@
     String[] lines = {
         "// filler filler filler filler filler filler filler filler filler filler",
         "class A {",
-        "  noSuchMethod(String name, List args) {}",
+        "  noSuchMethod(InvocationMirror invocation) {}",
         "}",
         "class B extends A {}",
         "class C {}",
@@ -5028,19 +4963,6 @@
 
   /**
    * <p>
-   * http://code.google.com/p/dart/issues/detail?id=5084
-   */
-  public void test_duplicateSuperInterface_okInInterfaceExtends() throws Exception {
-    AnalyzeLibraryResult result = analyzeLibrary(
-        "// filler filler filler filler filler filler filler filler filler filler",
-        "interface A {}",
-        "interface B extends A, A {}",
-        "");
-    assertErrors(result.getErrors());
-  }
-
-  /**
-   * <p>
    * http://code.google.com/p/dart/issues/detail?id=5082
    */
   public void test_argumentDefinitionTest_type() throws Exception {
@@ -5292,7 +5214,7 @@
     AnalyzeLibraryResult result = analyzeLibrary(
         "// filler filler filler filler filler filler filler filler filler filler",
         "class A {",
-        "  static get f() => 0;",
+        "  static get f => 0;",
         "}",
         "main() {",
         "  A.f = 0;",
diff --git a/compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerTest.java b/compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerTest.java
index 4774c79..c4396fa 100644
--- a/compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerTest.java
+++ b/compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerTest.java
@@ -303,7 +303,7 @@
 
   public void testCyclicTypeVariable() {
     Map<String, ClassNodeElement> classes = loadSource(
-        "interface A<T> { }",
+        "abstract class A<T> { }",
         "typedef funcType<T>(T arg);",
         "class B<T extends T> {}",
         "class C<T extends A<T>> {}",
@@ -335,18 +335,6 @@
       TypeErrorCode.TYPE_NOT_ASSIGNMENT_COMPATIBLE);
   }
 
-  public void testFactory() {
-    analyzeClasses(loadSource(
-        "interface Foo default Bar {",
-        "  Foo(String argument);",
-        "}",
-        "interface Baz {}",
-        "class Bar implements Foo, Baz {",
-        "  Bar(String argument) {}",
-        "}"));
-    analyzeFail("Baz x = new Foo('');", TypeErrorCode.TYPE_NOT_ASSIGNMENT_COMPATIBLE);
-  }
-
   public void testFieldAccess() {
     ClassElement element = loadFile("class_with_supertypes.dart").get("ClassWithSupertypes");
     assertNotNull("unable to locate ClassWithSupertypes", element);
@@ -540,13 +528,13 @@
         "}",
         "class C<U> {",
         "}",
-        "interface I<S> extends I2<bool> {",
+        "abstract class I<S> extends I2<bool> {",
         "}",
         "class G<V> {",
         "}",
-        "interface I1<W> {",
+        "abstract class I1<W> {",
         "}",
-        "interface I2<X> {",
+        "abstract class I2<X> {",
         "}",
         "class D implements I2<int> {",
         "}",
@@ -554,7 +542,7 @@
         "}");
     analyzeClasses(classes);
     assertEquals("[]", object.getAllSupertypes().toString());
-    assertEquals("[I<int>, I1<String>, I2<bool>, B<String>, C<G<String>>, Object]",
+    assertEquals("[B<String>, I<int>, I1<String>, I2<bool>, C<G<String>>, Object]",
                  classes.get("A").getAllSupertypes().toString());
     assertEquals("[I<int>, I1<B.T>, I2<bool>, C<G<B.T>>, Object]",
                  classes.get("B").getAllSupertypes().toString());
@@ -564,7 +552,7 @@
     assertEquals("[Object]", classes.get("I1").getAllSupertypes().toString());
     assertEquals("[Object]", classes.get("I2").getAllSupertypes().toString());
     assertEquals("[I2<int>, Object]", classes.get("D").getAllSupertypes().toString());
-    assertEquals("[I2<int>, D, Object]", classes.get("E").getAllSupertypes().toString());
+    assertEquals("[I2<int>, D, I2<int>, Object]", classes.get("E").getAllSupertypes().toString());
   }
 
   public void testIdentifiers() {
@@ -592,7 +580,7 @@
 
   public void testImplementsAndOverrides() {
     analyzeClasses(loadSource(
-        "interface Interface {",
+        "abstract class Interface {",
         "  void foo(int x);",
         "  void bar();",
         "}",
@@ -620,7 +608,7 @@
 
   public void testImplementsAndOverrides2() {
     analyzeClasses(loadSource(
-        "interface Interface {",
+        "abstract class Interface {",
         "  void foo(int x);",
         "}",
         // Abstract class not reported until first instantiation.
@@ -705,27 +693,6 @@
     checkSimpleType(string.getType(), "'f${null}sk'");
   }
 
-  public void testLoadInterfaces() {
-    loadFile("interfaces.dart");
-    ClassElement superElement = (ClassElement)coreElements.get("Super");
-    assertNotNull("no element for Super", superElement);
-    assertEquals(object.getType(), superElement.getSupertype());
-    assertEquals(0, superElement.getInterfaces().size());
-    ClassElement sub = (ClassElement)coreElements.get("Sub");
-    assertNotNull("no element for Sub", sub);
-    assertEquals(object.getType(), sub.getSupertype());
-    assertEquals(1, sub.getInterfaces().size());
-    assertEquals(superElement, sub.getInterfaces().get(0).getElement());
-    InterfaceType superString = itype(superElement, itype(string));
-    InterfaceType subString = itype(sub, itype(string));
-    Types types = getTypes();
-    assertEquals("Super<String>", String.valueOf(types.asInstanceOf(superString, superElement)));
-    assertEquals("Super<String>", String.valueOf(types.asInstanceOf(subString, superElement)));
-    assertEquals("Sub<String>", String.valueOf(types.asInstanceOf(subString, sub)));
-    assertNull(types.asInstanceOf(superString, sub));
-  }
-
-
   public void testMapLiteral() {
     analyze("{ var x = {\"key\": 42}; }");
     analyze("{ var x = {'key': 42}; }");
@@ -818,52 +785,6 @@
     analyze("VoidFunction f = foo() {};");
   }
 
-  public void testNewExpression() {
-    analyzeClasses(loadSource(
-        "class Foo {",
-        "  Foo(int x) {}",
-        "  Foo.foo() {}",
-        "  Foo.bar([int i = null]) {}",
-        "}",
-        "interface Bar<T> default Baz<T> {",
-        "  Bar.make();",
-        "}",
-        "class Baz<T> {",
-        "  factory Bar.make(T x) { return null; }",
-        "}",
-        "class Foobar<T extends String> {",
-        "}"));
-
-    analyze("Foo x = new Foo(0);");
-    analyzeFail("Foo x = new Foo();", TypeErrorCode.MISSING_ARGUMENT);
-    analyzeFail("Foo x = new Foo('');", TypeErrorCode.TYPE_NOT_ASSIGNMENT_COMPATIBLE);
-    analyzeFail("Foo x = new Foo(0, null);", TypeErrorCode.EXTRA_ARGUMENT);
-
-    analyze("Foo x = new Foo.foo();");
-    analyzeFail("Foo x = new Foo.foo(null);", TypeErrorCode.EXTRA_ARGUMENT);
-
-    analyze("Foo x = new Foo.bar();");
-    analyze("Foo x = new Foo.bar(0);");
-    analyzeFail("Foo x = new Foo.bar('');", TypeErrorCode.TYPE_NOT_ASSIGNMENT_COMPATIBLE);
-    analyzeFail("Foo x = new Foo.bar(0, null);", TypeErrorCode.EXTRA_ARGUMENT);
-    analyzeFail("var x = new Foobar<num>();", TypeErrorCode.TYPE_NOT_ASSIGNMENT_COMPATIBLE);
-    analyze("Bar<String> x = new Bar.make('');");
-  }
-
-  public void testAssignableTypeArg() {
-      analyzeClasses(loadSource(
-          "interface Bar<T> default Baz<T> {",
-          "  Bar.make();",
-          "}",
-          "class Baz<T> {",
-          "  Baz(T x) { return null; }",
-          "  factory Bar.make(T x) { return null; }",
-          "}"));
-      analyze("Baz<String> x = new Baz<String>('');");
-      analyze("Bar<String> x = new Bar.make('');");
-      analyze("Bar<String> x = new Bar<String>.make('');");
-  }
-
   public void testOddStuff() {
     Map<String, ClassNodeElement> classes = analyzeClasses(loadSource(
         "class Class {",
@@ -939,19 +860,6 @@
     }
   }
 
-  public void testRawTypes() {
-    loadFile("interfaces.dart");
-
-    analyze("{ Sub s; }");
-    analyze("{ var s = new Sub(); }");
-    analyze("{ Sub s = new Sub(); }");
-    analyze("{ Sub<String> s = new Sub(); }");
-    analyze("{ Sub<String> s; }");
-    analyze("{ var s = new Sub<String>(); }");
-    analyze("{ Sub s = new Sub<String>(); }");
-    analyze("{ Sub<String> s = new Sub<String>(); }");
-  }
-
   public void testReturn() {
     analyzeFail(returnWithType("int", "'string'"),
       TypeErrorCode.TYPE_NOT_ASSIGNMENT_COMPATIBLE);
@@ -1058,17 +966,6 @@
     analyzeClass(classes.get("B"), 0);
   }
 
-  public void testSuperInterfaces() {
-    // If this test is failing, first debug any failures in testLoadInterfaces.
-    loadFile("interfaces.dart");
-    analyze("Super<String> s = new Sub<String>();");
-    analyze("Super<Object> o = new Sub<String>();");
-    analyzeFail("Super<String> f1 = new Sub<int>();",
-      TypeErrorCode.TYPE_NOT_ASSIGNMENT_COMPATIBLE);
-    analyzeFail("Sub<String> f2 = new Sub<int>();",
-      TypeErrorCode.TYPE_NOT_ASSIGNMENT_COMPATIBLE);
-  }
-
   public void testSwitch() {
     analyze("{ int i = 27; switch(i) { case i: break; } }");
     analyzeFail(
@@ -1124,16 +1021,6 @@
     analyzeIn(cls, "foo() { T t = true; }()", 1);
   }
 
-  public void testDefaultTypeArgs() {
-    Map<String, ClassNodeElement> source = loadSource(
-        "class Object{}",
-        "interface List<T> {}",
-        "interface A<K,V> default B<K, V extends List<K>> {}",
-        "class B<K, V extends List<K>> {",
-        "}");
-        analyzeClasses(source);
-  }
-
   public void testUnaryOperators() {
     Map<String, ClassNodeElement> source = loadSource(
         "class Foo {",
@@ -1356,25 +1243,10 @@
       TypeErrorCode.TYPE_NOT_ASSIGNMENT_COMPATIBLE);
   }
 
-  public void testValidateFactoryBounds() {
-    Map<String, ClassNodeElement> source = loadSource(
-        "class Object {}",
-        "interface Foo {}",
-        "interface Bar extends Foo {}",
-        "interface IA<T> default A<T extends Foo> { IA(); }",
-        "class A<T extends Foo> implements IA<T> {",
-        "  factory A() {}",
-        "}");
-    analyzeClasses(source);
-    analyze("{ var val1 = new IA<Foo>(); }");
-    analyze("{ var val1 = new IA<Bar>(); }");
-    analyzeFail("{ var val1 = new IA<String>(); }",TypeErrorCode.TYPE_NOT_ASSIGNMENT_COMPATIBLE);
-  }
-
   public void testStringConcat() {
     Map<String, ClassNodeElement> source = loadSource(
         "class Object {}",
-        "interface Foo {",
+        "abstract class Foo {",
         "  operator +(arg1);" +
         "}",
         "Foo a = new Foo();",
diff --git a/compiler/javatests/com/google/dart/compiler/type/class_with_methods.dart b/compiler/javatests/com/google/dart/compiler/type/class_with_methods.dart
index 966b943..5f0f424 100644
--- a/compiler/javatests/com/google/dart/compiler/type/class_with_methods.dart
+++ b/compiler/javatests/com/google/dart/compiler/type/class_with_methods.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-interface ClassWithMethods {
+abstract class ClassWithMethods {
   untypedNoArgumentMethod();
   untypedOneArgumentMethod(argument);
   untypedTwoArgumentMethod(argument1, argument2);
diff --git a/compiler/javatests/com/google/dart/compiler/type/class_with_supertypes.dart b/compiler/javatests/com/google/dart/compiler/type/class_with_supertypes.dart
index b08a614..32a67a3 100644
--- a/compiler/javatests/com/google/dart/compiler/type/class_with_supertypes.dart
+++ b/compiler/javatests/com/google/dart/compiler/type/class_with_supertypes.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-interface Interface {
+abstract class Interface {
   void methodInInterface();
   int fieldInInterface;
   static final int staticFieldInInterface = 1;
diff --git a/compiler/javatests/com/google/dart/compiler/type/class_with_type_parameter.dart b/compiler/javatests/com/google/dart/compiler/type/class_with_type_parameter.dart
index 48be4d3..f61bf4a 100644
--- a/compiler/javatests/com/google/dart/compiler/type/class_with_type_parameter.dart
+++ b/compiler/javatests/com/google/dart/compiler/type/class_with_type_parameter.dart
@@ -2,9 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-interface A {}
+abstract class A {}
 
-interface B extends A {}
+abstract class B extends A {}
 
 class ClassWithTypeParameter<T extends B> {
   A aField;
diff --git a/compiler/javatests/com/google/dart/compiler/type/covariant_class.dart b/compiler/javatests/com/google/dart/compiler/type/covariant_class.dart
index 4d48597..f38bb42 100644
--- a/compiler/javatests/com/google/dart/compiler/type/covariant_class.dart
+++ b/compiler/javatests/com/google/dart/compiler/type/covariant_class.dart
@@ -2,16 +2,16 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-interface A {
+abstract class A {
 }
 
-interface B extends A {
+abstract class B extends A {
 }
 
-interface C extends A {
+abstract class C extends A {
 }
 
-interface D {
+abstract class D {
 }
 
 class Super {
diff --git a/compiler/javatests/com/google/dart/compiler/type/generic_class_with_supertypes.dart b/compiler/javatests/com/google/dart/compiler/type/generic_class_with_supertypes.dart
index b96748f..c0ccbb9 100644
--- a/compiler/javatests/com/google/dart/compiler/type/generic_class_with_supertypes.dart
+++ b/compiler/javatests/com/google/dart/compiler/type/generic_class_with_supertypes.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-interface Interface<I1, I2> {
+abstract class Interface<I1, I2> {
   I1 interfaceField;
   I1 interfaceMethod(I2 arg);
 }
diff --git a/compiler/javatests/com/google/dart/compiler/type/interfaces.dart b/compiler/javatests/com/google/dart/compiler/type/interfaces.dart
deleted file mode 100644
index deccd20..0000000
--- a/compiler/javatests/com/google/dart/compiler/type/interfaces.dart
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-interface Super<T> {}
-
-interface Sub<S> extends Super<S> default SubImplementation<S> {
-  Sub();
-}
-
-class SubImplementation<U> implements Sub<U> {
-  SubImplementation() {}
-}
diff --git a/dart.gyp b/dart.gyp
index 589c1d3..3ec8489 100644
--- a/dart.gyp
+++ b/dart.gyp
@@ -30,7 +30,7 @@
       'type': 'none',
       'dependencies': [
         'runtime/dart-runtime.gyp:dart',
-        'dart2js',
+        'utils/compiler/compiler.gyp:dart2js',
       ],
       'actions': [
         {
@@ -99,10 +99,19 @@
       'target_name': 'dart2js',
       'type': 'none',
       'dependencies': [
+        'third_party/v8/src/d8.gyp:d8',
         'utils/compiler/compiler.gyp:dart2js',
       ],
     },
     {
+      'target_name': 'dart2js_bot',
+      'type': 'none',
+      'dependencies': [
+        'third_party/v8/src/d8.gyp:d8',
+        'create_sdk',
+      ],
+    },
+    {
       'target_name': 'api_docs',
       'type': 'none',
       'dependencies': [
diff --git a/lib/_internal/libraries.dart b/lib/_internal/libraries.dart
index 651afcb..bcd7386 100644
--- a/lib/_internal/libraries.dart
+++ b/lib/_internal/libraries.dart
@@ -22,6 +22,10 @@
  */
 const Map<String, LibraryInfo> LIBRARIES = const <LibraryInfo> {
 
+  "collection": const LibraryInfo(
+      "collection/collection.dart",
+      implementation: true),
+
   "core": const LibraryInfo(
       "core/core.dart",
       dart2jsPatchPath: "compiler/implementation/lib/core_patch.dart"),
@@ -40,9 +44,9 @@
       dart2jsPath: "html/dart2js/html_dart2js.dart"),
 
   "io": const LibraryInfo(
-      "io/io_runtime.dart",
+      "io/io.dart",
       category: "Server",
-      dart2jsPath: "compiler/implementation/lib/io.dart"),
+      dart2jsPatchPath: "compiler/implementation/lib/io_patch.dart"),
 
   "isolate": const LibraryInfo(
       "isolate/isolate.dart",
diff --git a/lib/coreimpl/arrays.dart b/lib/collection/arrays.dart
similarity index 95%
rename from lib/coreimpl/arrays.dart
rename to lib/collection/arrays.dart
index 2a43a95..7835182 100644
--- a/lib/coreimpl/arrays.dart
+++ b/lib/collection/arrays.dart
@@ -82,12 +82,11 @@
     }
     if (start < 0 ) {
       String message = "$start must be greater than or equal to 0";
-      throw new IndexOutOfRangeException(message);
+      throw new RangeError(message);
     }
     if (start + length > a.length) {
       String message = "$start + $length must be in the range [0..${a.length})";
-      throw new IndexOutOfRangeException(message);
+      throw new RangeError(message);
     }
   }
 }
-
diff --git a/lib/collection/collection.dart b/lib/collection/collection.dart
new file mode 100644
index 0000000..3112e86
--- /dev/null
+++ b/lib/collection/collection.dart
@@ -0,0 +1,10 @@
+// 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 collection;
+
+part 'arrays.dart';
+part 'collections.dart';
+part 'maps.dart';
+part 'splay_tree.dart';
diff --git a/lib/collection/collection_sources.gypi b/lib/collection/collection_sources.gypi
new file mode 100644
index 0000000..9eea155
--- /dev/null
+++ b/lib/collection/collection_sources.gypi
@@ -0,0 +1,14 @@
+# 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.
+
+# This file contains all sources for the dart:collection library.
+{
+  'sources': [
+    'arrays.dart',
+    'collections.dart',
+    'maps.dart',
+    'splay_tree.dart',
+  ],
+}
+
diff --git a/lib/coreimpl/collections.dart b/lib/collection/collections.dart
similarity index 97%
rename from lib/coreimpl/collections.dart
rename to lib/collection/collections.dart
index 873e9cd..2bee21c 100644
--- a/lib/coreimpl/collections.dart
+++ b/lib/collection/collections.dart
@@ -100,7 +100,9 @@
    * it allows this method and [_emitMap] to identify recursive collections
    * and maps.
    */
-  static void _emitCollection(Collection c, StringBuffer result, List visiting) {
+  static void _emitCollection(Collection c,
+                              StringBuffer result,
+                              List visiting) {
     visiting.add(c);
     bool isList = c is List;
     result.add(isList ? '[' : '{');
diff --git a/lib/coreimpl/maps.dart b/lib/collection/maps.dart
similarity index 100%
rename from lib/coreimpl/maps.dart
rename to lib/collection/maps.dart
diff --git a/lib/coreimpl/splay_tree.dart b/lib/collection/splay_tree.dart
similarity index 100%
rename from lib/coreimpl/splay_tree.dart
rename to lib/collection/splay_tree.dart
diff --git a/lib/compiler/implementation/closure.dart b/lib/compiler/implementation/closure.dart
index 23d5e9e..0465c22 100644
--- a/lib/compiler/implementation/closure.dart
+++ b/lib/compiler/implementation/closure.dart
@@ -45,9 +45,7 @@
     return measure(() {
       ClosureClassMap nestedClosureData = closureMappingCache[node];
       if (nestedClosureData == null) {
-        // TODO(floitsch): we can only assume that the reason for not having a
-        // closure data here is, because the function is inside an initializer.
-        compiler.unimplemented("Closures inside initializers", node: node);
+        compiler.internalError("No closure cache", node: node);
       }
       return nestedClosureData;
     });
@@ -366,8 +364,7 @@
   }
 
   visitNewExpression(NewExpression node) {
-    TypeAnnotation annotation = node.send.getTypeAnnotation();
-    DartType type = elements.getType(annotation);
+    DartType type = elements.getType(node);
 
     bool hasTypeVariable(DartType type) {
       if (type is TypeVariableType) {
@@ -611,9 +608,8 @@
       // TODO(ahe): This is problematic. The backend should not repeat
       // the work of the resolver. It is the resolver's job to create
       // parameters, etc. Other phases should only visit statements.
-      // TODO(floitsch): we avoid visiting the initializers on purpose so that
-      // we get an error-message later in the builder.
       if (node.parameters != null) node.parameters.accept(this);
+      if (node.initializers != null) node.initializers.accept(this);
       if (node.body != null) node.body.accept(this);
     });
   }
diff --git a/lib/compiler/implementation/compile_time_constants.dart b/lib/compiler/implementation/compile_time_constants.dart
index 1569de6..0b1a61e 100644
--- a/lib/compiler/implementation/compile_time_constants.dart
+++ b/lib/compiler/implementation/compile_time_constants.dart
@@ -30,7 +30,7 @@
 
 
   ConstantHandler(Compiler compiler, this.constantSystem)
-      : initialVariableValues = new Map<VariableElement, Dynamic>(),
+      : initialVariableValues = new Map<VariableElement, dynamic>(),
         compiledConstants = new Set<Constant>(),
         pendingVariables = new Set<VariableElement>(),
         lazyStatics = new Set<VariableElement>(),
diff --git a/lib/compiler/implementation/compiler.dart b/lib/compiler/implementation/compiler.dart
index 97fad39..0f5fa17 100644
--- a/lib/compiler/implementation/compiler.dart
+++ b/lib/compiler/implementation/compiler.dart
@@ -105,10 +105,6 @@
 
   bool disableInlining = false;
 
-  // TODO(5074): Remove this field once we don't accept the
-  // deprecated parameter specification.
-  static final bool REJECT_NAMED_ARGUMENT_AS_POSITIONAL = true;
-
   final Tracer tracer;
 
   CompilerTask measuredTask;
@@ -132,9 +128,11 @@
   ClassElement nullClass;
   ClassElement listClass;
   ClassElement mapClass;
+  ClassElement jsInvocationMirrorClass;
   Element assertMethod;
   Element identicalFunction;
   Element functionApplyMethod;
+  Element invokeOnMethod;
 
   Element get currentElement => _currentElement;
   withCurrentElement(Element element, f()) {
@@ -142,6 +140,13 @@
     _currentElement = element;
     try {
       return f();
+    } on SpannableAssertionFailure catch (ex) {
+      if (!hasCrashed) {
+        SourceSpan span = spanFromSpannable(ex.node);
+        reportDiagnostic(span, ex.message, api.Diagnostic.ERROR);
+      }
+      hasCrashed = true;
+      throw;
     } on CompilerCancelledException catch (ex) {
       throw;
     } on StackOverflowError catch (ex) {
@@ -178,12 +183,15 @@
   static const SourceString MAIN = const SourceString('main');
   static const SourceString CALL_OPERATOR_NAME = const SourceString('call');
   static const SourceString NO_SUCH_METHOD = const SourceString('noSuchMethod');
+  static const int NO_SUCH_METHOD_ARG_COUNT = 1;
+  static const SourceString INVOKE_ON = const SourceString('invokeOn');
   static const SourceString RUNTIME_TYPE = const SourceString('runtimeType');
   static const SourceString START_ROOT_ISOLATE =
       const SourceString('startRootIsolate');
   bool enabledNoSuchMethod = false;
   bool enabledRuntimeType = false;
   bool enabledFunctionApply = false;
+  bool enabledInvokeOn = false;
 
   Stopwatch progress;
 
@@ -226,8 +234,9 @@
         new dart_backend.DartBackend(this, strips);
     constantHandler = new ConstantHandler(this, backend.constantSystem);
     enqueuer = new EnqueueTask(this);
-    tasks = [scanner, dietParser, parser, resolver, closureToClassMapper,
-             checker, typesTask, constantHandler, enqueuer];
+    tasks = [scanner, dietParser, parser, patchParser, libraryLoader,
+             resolver, closureToClassMapper, checker, typesTask,
+             constantHandler, enqueuer];
     tasks.addAll(backend.tasks);
   }
 
@@ -279,7 +288,7 @@
     } else if (token != null) {
       span = spanFromTokens(token, token);
     } else if (instruction != null) {
-      span = spanFromElement(currentElement);
+      span = spanFromHInstruction(instruction);
     } else if (element != null) {
       span = spanFromElement(element);
     } else {
@@ -289,6 +298,20 @@
     throw new CompilerCancelledException(reason);
   }
 
+  SourceSpan spanFromSpannable(Spannable node) {
+    if (node is Node) {
+      return spanFromNode(node);
+    } else if (node is Token) {
+      return spanFromTokens(node, node);
+    } else if (node is HInstruction) {
+      return spanFromHInstruction(node);
+    } else if (node is Element) {
+      return spanFromElement(node);
+    } else {
+      throw 'No error location.';
+    }
+  }
+
   void reportFatalError(String reason, Element element,
                         {Node node, Token token, HInstruction instruction}) {
     withCurrentElement(element, () {
@@ -325,6 +348,11 @@
     Selector selector = new Selector.noSuchMethod();
     enqueuer.resolution.registerInvocation(NO_SUCH_METHOD, selector);
     enqueuer.codegen.registerInvocation(NO_SUCH_METHOD, selector);
+
+    Element createInvocationMirrorElement =
+        findHelper(const SourceString('createInvocationMirror'));
+    enqueuer.resolution.addToWorkList(createInvocationMirrorElement);
+    enqueuer.codegen.addToWorkList(createInvocationMirrorElement);
   }
 
   void enableIsolateSupport(LibraryElement element) {
@@ -376,6 +404,8 @@
     functionClass = lookupSpecialClass(const SourceString('Function'));
     listClass = lookupSpecialClass(const SourceString('List'));
     mapClass = lookupSpecialClass(const SourceString('Map'));
+    jsInvocationMirrorClass =
+        lookupSpecialClass(const SourceString('JSInvocationMirror'));
     closureClass = lookupSpecialClass(const SourceString('Closure'));
     dynamicClass = lookupSpecialClass(const SourceString('Dynamic_'));
     nullClass = lookupSpecialClass(const SourceString('Null'));
@@ -408,6 +438,9 @@
     functionClass.ensureResolved(this);
     functionApplyMethod =
         functionClass.lookupLocalMember(const SourceString('apply'));
+    jsInvocationMirrorClass.ensureResolved(this);
+    invokeOnMethod = jsInvocationMirrorClass.lookupLocalMember(
+        const SourceString('invokeOn'));
   }
 
   void loadCoreImplLibrary() {
@@ -538,6 +571,7 @@
         internalErrorOnElement(work.element, "Work list is not empty.");
       });
     }
+    if (!REPORT_EXCESS_RESOLUTION) return;
     var resolved = new Set.from(enqueuer.resolution.resolvedElements.keys);
     for (Element e in codegenWorld.generatedCode.keys) {
       resolved.remove(e);
@@ -566,7 +600,6 @@
       }
     }
     log('Excess resolution work: ${resolved.length}.');
-    if (!REPORT_EXCESS_RESOLUTION) return;
     for (Element e in resolved) {
       SourceSpan span = spanFromElement(e);
       reportDiagnostic(span, 'Warning: $e resolved but not compiled.',
@@ -759,6 +792,17 @@
         : spanFromTokens(position, position, uri);
   }
 
+  SourceSpan spanFromHInstruction(HInstruction instruction) {
+    Element element = instruction.sourceElement;
+    if (element == null) element = currentElement;
+    var position = instruction.sourcePosition;
+    if (position == null) return spanFromElement(element);
+    Token token = position.token;
+    if (token == null) return spanFromElement(element);
+    Uri uri = element.getCompilationUnit().script.uri;
+    return spanFromTokens(token, token, uri);
+  }
+
   Script readScript(Uri uri, [Node node]) {
     unimplemented('Compiler.readScript');
   }
@@ -864,8 +908,8 @@
   if (condition is Function){
     condition = condition();
   }
-  if (!condition && message != null) {
-    print('assertion failed: $message');
+  if (spannable == null || !condition) {
+    throw new SpannableAssertionFailure(spannable, message);
   }
-  return spannable != null && condition;
+  return true;
 }
diff --git a/lib/compiler/implementation/dart_backend/backend.dart b/lib/compiler/implementation/dart_backend/backend.dart
index 8f46463..0ac9d3e 100644
--- a/lib/compiler/implementation/dart_backend/backend.dart
+++ b/lib/compiler/implementation/dart_backend/backend.dart
@@ -41,10 +41,10 @@
         result : getFirstNotNullResult((e) => e.getSelector(send));
   }
 
-  DartType getType(TypeAnnotation annotation) {
-    final result = super.getType(annotation);
+  DartType getType(Node node) {
+    final result = super.getType(node);
     return result != null ?
-        result : getFirstNotNullResult((e) => e.getType(annotation));
+        result : getFirstNotNullResult((e) => e.getType(node));
   }
 
   getFirstNotNullResult(f(TreeElements element)) {
@@ -310,6 +310,10 @@
       addClass(classElement);
     };
 
+    compiler.resolverWorld.instantiatedClasses.forEach(
+        (ClassElement classElement) {
+      if (shouldOutput(classElement)) addClass(classElement);
+    });
     resolvedElements.forEach((element, treeElements) {
       if (!shouldOutput(element)) return;
 
@@ -481,6 +485,14 @@
     if (node.receiver != null && renames[node.receiver] == '') return;
     super.unparseSendReceiver(node, spacesNeeded: spacesNeeded);
   }
+
+  unparseFunctionName(Node name) {
+    if (name != null && renames.containsKey(name)) {
+      sb.add(renames[name]);
+    } else {
+      super.unparseFunctionName(name);
+    }
+  }
 }
 
 
diff --git a/lib/compiler/implementation/dart_backend/placeholder_collector.dart b/lib/compiler/implementation/dart_backend/placeholder_collector.dart
index 52a578a..c0e51de 100644
--- a/lib/compiler/implementation/dart_backend/placeholder_collector.dart
+++ b/lib/compiler/implementation/dart_backend/placeholder_collector.dart
@@ -24,6 +24,16 @@
   }
 }
 
+class ConstructorPlaceholder {
+  final Node node;
+  final DartType type;
+  final bool isRedirectingCall;
+  ConstructorPlaceholder(this.node, this.type)
+      : this.isRedirectingCall = false;
+  ConstructorPlaceholder.redirectingCall(this.node)
+      : this.type = null, this.isRedirectingCall = true;
+}
+
 class DeclarationTypePlaceholder {
   final TypeAnnotation typeNode;
   final bool requiresVar;
@@ -41,7 +51,12 @@
   visitForeignSend(Send node) {}
 
   visitSuperSend(Send node) {
-    collector.tryMakeMemberPlaceholder(node.selector);
+    Element element = elements[node];
+    if (element != null && element.isConstructor()) {
+      collector.makeRedirectingConstructorPlaceholder(node.selector, element);
+    } else {
+      collector.tryMakeMemberPlaceholder(node.selector);
+    }
   }
 
   visitDynamicSend(Send node) {
@@ -98,30 +113,7 @@
       if (node.receiver is Identifier
           && node.receiver.asIdentifier().isThis()) {
         assert(node.selector is Identifier);
-        collector.tryMakeMemberPlaceholder(node.selector);
-      }
-      // Field names can be exposed as names of optional arguments, e.g.
-      // class C {
-      //   final field;
-      //   C([this.field]);
-      // }
-      // Do not forget to rename them as well.
-      FunctionElement functionElement = element;
-      Link<Element> optionalParameters =
-          functionElement.functionSignature.optionalParameters;
-      for (final argument in node.argumentsNode) {
-        NamedArgument named = argument.asNamedArgument();
-        if (named == null) continue;
-        Identifier name = named.name;
-        String nameAsString = name.source.slowToString();
-        for (final parameter in optionalParameters) {
-          if (identical(parameter.kind, ElementKind.FIELD_PARAMETER)) {
-            if (parameter.name.slowToString() == nameAsString) {
-              collector.tryMakeMemberPlaceholder(name);
-              break;
-            }
-          }
-        }
+        collector.makeRedirectingConstructorPlaceholder(node.selector, element);
       }
       return;
     }
@@ -136,7 +128,7 @@
   }
 
   internalError(String reason, {Node node}) {
-    collector.internalError(reason, node);
+    collector.internalError(reason, node: node);
   }
 }
 
@@ -146,11 +138,12 @@
   final Map<Element, ElementAst> elementAsts;
   final Set<Node> nullNodes;  // Nodes that should not be in output.
   final Set<Identifier> unresolvedNodes;
-  final Map<Element, Set<Identifier>> elementNodes;
+  final Map<Element, Set<Node>> elementNodes;
   final Map<FunctionElement, FunctionScope> functionScopes;
   final Map<LibraryElement, Set<Identifier>> privateNodes;
   final List<DeclarationTypePlaceholder> declarationTypePlaceholders;
   final Map<String, Set<Identifier>> memberPlaceholders;
+  final Map<Element, List<ConstructorPlaceholder>> constructorPlaceholders;
   Map<String, LocalPlaceholder> currentLocalPlaceholders;
   Element currentElement;
   FunctionElement topmostEnclosingFunction;
@@ -165,59 +158,19 @@
   PlaceholderCollector(this.compiler, this.fixedMemberNames, this.elementAsts) :
       nullNodes = new Set<Node>(),
       unresolvedNodes = new Set<Identifier>(),
-      elementNodes = new Map<Element, Set<Identifier>>(),
+      elementNodes = new Map<Element, Set<Node>>(),
       functionScopes = new Map<FunctionElement, FunctionScope>(),
       privateNodes = new Map<LibraryElement, Set<Identifier>>(),
       declarationTypePlaceholders = new List<DeclarationTypePlaceholder>(),
-      memberPlaceholders = new Map<String, Set<Identifier>>();
-
-  void tryMakeConstructorNamePlaceholder(
-      FunctionExpression constructor, ClassElement element) {
-    Node nameNode = constructor.name;
-    if (nameNode is Send) nameNode = nameNode.receiver;
-    if (nameNode.asIdentifier().token.slowToString()
-        == element.name.slowToString()) {
-      makeElementPlaceholder(nameNode, element);
-    }
-  }
+      memberPlaceholders = new Map<String, Set<Identifier>>(),
+      constructorPlaceholders =
+          new Map<Element, List<ConstructorPlaceholder>>();
 
   void collectFunctionDeclarationPlaceholders(
       FunctionElement element, FunctionExpression node) {
     if (element.isGenerativeConstructor() || element.isFactoryConstructor()) {
-      // Two complicated cases for class/interface renaming:
-      // 1) class which implements constructors of other interfaces, but not
-      //    implements interfaces themselves:
-      //      0.dart: class C { I(); }
-      //      1.dart and 2.dart: interface I default C { I(); }
-      //    now we have to duplicate our I() constructor in C class with
-      //    proper names.
-      // 2) (even worse for us):
-      //      0.dart: class C { C(); }
-      //      1.dart: interface C default p0.C { C(); }
-      //    the second case is just a bug now.
-      tryMakeConstructorNamePlaceholder(node, element.getEnclosingClass());
-
-      // If we have interface constructor, make sure that we put placeholder
-      // for its default factory implementation.
-      // Example:
-      // interface I default C { I();}
-      // class C { factory I() {} }
-      // 2 cases:
-      // Plain interface name. Rename it unless it is the default
-      // constructor for enclosing class.
-      // Example:
-      // interface I { I(); }
-      // class C implements I { C(); }  don't rename this case.
-      // OR I.named() inside C, rename first part.
-      if (element.defaultImplementation != null
-          && !identical(element.defaultImplementation, element)) {
-        FunctionElement implementingFactory = element.defaultImplementation;
-        if (implementingFactory is !SynthesizedConstructorElement) {
-          tryMakeConstructorNamePlaceholder(
-              elementAsts[implementingFactory].ast,
-              element.getEnclosingClass());
-        }
-      }
+      DartType type = element.getEnclosingClass().type.asRaw();
+      makeConstructorPlaceholder(node.name, element, type);
     } else if (Elements.isStaticOrTopLevel(element)) {
       // Note: this code should only rename private identifiers for class'
       // fields/getters/setters/methods.  Top-level identifiers are renamed
@@ -331,7 +284,7 @@
     nullNodes.add(node);
   }
 
-  void makeElementPlaceholder(Identifier node, Element element) {
+  void makeElementPlaceholder(Node node, Element element) {
     assert(element != null);
     if (identical(element, entryFunction)) return;
     if (identical(element.getLibrary(), coreLibrary)) return;
@@ -341,9 +294,9 @@
     if (element == compiler.types.dynamicType.element) {
       internalError(
           'Should never make element placeholder for dynamic type element',
-          node);
+          node: node);
     }
-    elementNodes.putIfAbsent(element, () => new Set<Identifier>()).add(node);
+    elementNodes.putIfAbsent(element, () => new Set<Node>()).add(node);
   }
 
   void makePrivateIdentifier(Identifier node) {
@@ -369,6 +322,18 @@
     getLocalPlaceholder().nodes.add(identifier);
   }
 
+  void makeConstructorPlaceholder(Node node, Element element, DartType type) {
+    assert(type != null);
+    constructorPlaceholders
+        .putIfAbsent(element, () => <ConstructorPlaceholder>[])
+            .add(new ConstructorPlaceholder(node, type));
+  }
+  void makeRedirectingConstructorPlaceholder(Node node, Element element) {
+    constructorPlaceholders
+        .putIfAbsent(element, () => <ConstructorPlaceholder>[])
+            .add(new ConstructorPlaceholder.redirectingCall(node));
+  }
+
   void internalError(String reason, {Node node}) {
     compiler.cancel(reason, node: node);
   }
@@ -379,6 +344,45 @@
 
   visitNode(Node node) { node.visitChildren(this); }  // We must go deeper.
 
+  visitNewExpression(NewExpression node) {
+    Send send = node.send;
+    InterfaceType type = treeElements.getType(node);
+    assert(type != null);
+    Element constructor = treeElements[send];
+    assert(constructor != null);
+    assert(send.receiver == null);
+    if (constructor is !ErroneousElement) {
+      makeConstructorPlaceholder(node.send.selector, constructor, type);
+      // TODO(smok): Should this be in visitNamedArgument?
+      // Field names can be exposed as names of optional arguments, e.g.
+      // class C {
+      //   final field;
+      //   C([this.field]);
+      // }
+      // Do not forget to rename them as well.
+      FunctionElement constructorFunction = constructor;
+      Link<Element> optionalParameters =
+          constructorFunction.functionSignature.optionalParameters;
+      for (final argument in send.argumentsNode) {
+        NamedArgument named = argument.asNamedArgument();
+        if (named == null) continue;
+        Identifier name = named.name;
+        String nameAsString = name.source.slowToString();
+        for (final parameter in optionalParameters) {
+          if (identical(parameter.kind, ElementKind.FIELD_PARAMETER)) {
+            if (parameter.name.slowToString() == nameAsString) {
+              tryMakeMemberPlaceholder(name);
+              break;
+            }
+          }
+        }
+      }
+    } else {
+      makeUnresolvedPlaceholder(node.send.selector);
+    }
+    visit(node.send.argumentsNode);
+  }
+
   visitSend(Send send) {
     new SendVisitor(this, treeElements).visitSend(send);
     send.visitChildren(this);
@@ -448,62 +452,21 @@
     }
     // We call [resolveReturnType] to allow having 'void'.
     final type = compiler.resolveReturnType(currentElement, node);
-    bool hasPrefix = false;
     if (type is InterfaceType || type is TypedefType) {
-      Node target = node.typeName;
-      if (node.typeName is Send) {
-        final send = node.typeName.asSend();
-        Identifier receiver = send.receiver;
-        Identifier selector = send.selector;
-        Element potentialPrefix =
-            currentElement.getLibrary().findLocal(receiver.source);
-        if (potentialPrefix != null && potentialPrefix.isPrefix()) {
-          // prefix.Class case.
-          hasPrefix = true;
-        } else {
-          // Class.namedContructor case.
-          target = receiver;
-          // If element is unresolved, mark namedConstructor as unresolved.
-          if (treeElements[node] == null) {
-            makeUnresolvedPlaceholder(selector);
-          }
-        }
-      }
       // TODO(antonm): is there a better way to detect unresolved types?
       // Corner case: dart:core type with a prefix.
       // Most probably there are some additional problems with
       // coreLibPrefix.topLevels.
-      Element typeElement = type.element;
-      Element dynamicTypeElement = compiler.types.dynamicType.element;
-      if (hasPrefix &&
-          (identical(typeElement.getLibrary(), coreLibrary) ||
-          identical(typeElement, dynamicTypeElement))) {
-        makeNullPlaceholder(node.typeName.asSend().receiver);
+      if (!identical(type.element, compiler.types.dynamicType.element)) {
+        makeTypePlaceholder(node.typeName, type);
       } else {
-        if (hasPrefix) {
-          assert(node.typeName is Send);
-          Send typeName = node.typeName;
-          assert(typeName.receiver is Identifier);
-          assert(typeName.selector is Identifier);
-          makeNullPlaceholder(typeName.receiver);
-        }
-        if (!identical(typeElement, dynamicTypeElement)) {
-          makeTypePlaceholder(target, type);
-        } else {
-          if (!isDynamicType(node)) makeUnresolvedPlaceholder(target);
-        }
+        if (!isDynamicType(node)) makeUnresolvedPlaceholder(node.typeName);
       }
     }
-    // Trying to differentiate new A.foo() and lib.A cases. In the latter case
-    // we don't want to go deeper into typeName.
-    if (hasPrefix) {
-      // Visit only type arguments, otherwise in case of lib.Class type
-      // annotation typeName is Send and we go to visitGetterSend, as a result
-      // "Class" is added to member placeholders.
-      visit(node.typeArguments);
-    } else {
-      node.visitChildren(this);
-    }
+    // Visit only type arguments, otherwise in case of lib.Class type
+    // annotation typeName is Send and we go to visitGetterSend, as a result
+    // "Class" is added to member placeholders.
+    visit(node.typeArguments);
   }
 
   visitVariableDefinitions(VariableDefinitions node) {
diff --git a/lib/compiler/implementation/dart_backend/renamer.dart b/lib/compiler/implementation/dart_backend/renamer.dart
index bf35ab3..7b71afa 100644
--- a/lib/compiler/implementation/dart_backend/renamer.dart
+++ b/lib/compiler/implementation/dart_backend/renamer.dart
@@ -77,18 +77,71 @@
     }
   }
 
-  sortedForEach(Map<Element, Dynamic> map, f) {
+  sortedForEach(Map<Element, dynamic> map, f) {
     for (Element element in sortElements(map.keys)) {
       f(element, map[element]);
     }
   }
 
+  String renameType(DartType type, Function renameElement) {
+    // TODO(smok): Do not rename type if it is in platform library or
+    // js-helpers.
+    StringBuffer result = new StringBuffer(renameElement(type.element));
+    if (type is InterfaceType) {
+      if (!type.arguments.isEmpty) {
+        result.add('<');
+        Link<DartType> argumentsLink = type.arguments;
+        result.add(renameType(argumentsLink.head, renameElement));
+        for (Link<DartType> link = argumentsLink.tail; !link.isEmpty;
+             link = link.tail) {
+          result.add(',');
+          result.add(renameType(link.head, renameElement));
+        }
+        result.add('>');
+      }
+    }
+    return result.toString();
+  }
+
+  String renameConstructor(Element element, ConstructorPlaceholder placeholder,
+      Function renameString, Function renameElement) {
+    assert(element.isConstructor());
+    StringBuffer result = new StringBuffer();
+    String name = element.name.slowToString();
+    if (element.name != element.getEnclosingClass().name) {
+      // Named constructor or factory. Is there a more reliable way to check
+      // this case?
+      if (!placeholder.isRedirectingCall) {
+        result.add(renameType(placeholder.type, renameElement));
+        result.add('.');
+      }
+      String prefix = '${element.getEnclosingClass().name.slowToString()}\$';
+      if (!name.startsWith(prefix)) {
+        // Factory for another interface (that is going away soon).
+        compiler.internalErrorOnElement(element,
+            "Factory constructors for external interfaces are not supported.");
+      }
+      name = name.substring(prefix.length);
+      if (!element.getLibrary().isPlatformLibrary) {
+        name = renameString(element.getLibrary(), name);
+      }
+      result.add(name);
+    } else {
+      assert(!placeholder.isRedirectingCall);
+      result.add(renameType(placeholder.type, renameElement));
+    }
+    return result.toString();
+  }
+
   Function makeElementRenamer(rename, generateUniqueName) => (element) {
     assert(Elements.isStaticOrTopLevel(element)
            || element is TypeVariableElement);
     // TODO(smok): We may want to reuse class static field and method names.
     String originalName = element.name.slowToString();
     LibraryElement library = element.getLibrary();
+    if (identical(element.getLibrary(), compiler.coreLibrary)) {
+      return originalName;
+    }
     if (library.isPlatformLibrary) {
       assert(element.isTopLevel());
       final prefix =
@@ -108,6 +161,7 @@
   // Renamer function that takes library and original name and returns a new
   // name for given identifier.
   Function rename;
+  Function renameElement;
   // A function that takes original identifier name and generates a new unique
   // identifier.
   Function generateUniqueName;
@@ -119,7 +173,7 @@
     generateUniqueName = (_) =>
         generator.generate(forbiddenIdentifiers.contains);
     rename = makeRenamer(generateUniqueName);
-    Function renameElement = makeElementRenamer(rename, generateUniqueName);
+    renameElement = makeElementRenamer(rename, generateUniqueName);
 
     Set<String> allParameterIdentifiers = new Set<String>();
     for (var functionScope in placeholderCollector.functionScopes.values) {
@@ -188,7 +242,7 @@
       return newName;
     };
     rename = makeRenamer(generateUniqueName);
-    Function renameElement = makeElementRenamer(rename, generateUniqueName);
+    renameElement = makeElementRenamer(rename, generateUniqueName);
     // Rename elements.
     sortedForEach(placeholderCollector.elementNodes,
         (Element element, Set<Node> nodes) {
@@ -230,6 +284,14 @@
     });
   }
 
+  // Rename constructors.
+  placeholderCollector.constructorPlaceholders.forEach(
+      (Element constructor, List<ConstructorPlaceholder> placeholders) {
+        for (ConstructorPlaceholder ph in placeholders) {
+          renames[ph.node] =
+              renameConstructor(constructor, ph, rename, renameElement);
+        }
+  });
   sortedForEach(placeholderCollector.privateNodes, (library, nodes) {
     renameNodes(nodes, (node) => rename(library, node.source.slowToString()));
   });
diff --git a/lib/compiler/implementation/elements/elements.dart b/lib/compiler/implementation/elements/elements.dart
index 1fcdac5..82808cf 100644
--- a/lib/compiler/implementation/elements/elements.dart
+++ b/lib/compiler/implementation/elements/elements.dart
@@ -159,6 +159,16 @@
     return enclosingElement != null && enclosingElement.isClass();
   }
   bool isInstanceMember() => false;
+
+  /**
+   * Returns [:true:] if this element is enclosed in a static member or is
+   * itself a static member.
+   */
+  bool isInStaticMember() {
+    Element member = getEnclosingMember();
+    return member != null && member.modifiers.isStatic();
+  }
+
   bool isFactoryConstructor() => modifiers.isFactory();
   bool isGenerativeConstructor() =>
       identical(kind, ElementKind.GENERATIVE_CONSTRUCTOR);
@@ -296,6 +306,10 @@
     return null;
   }
 
+  /**
+   * Returns the member enclosing this element or the element itself if it is a
+   * member. If no enclosing element is found, [:null:] is returned.
+   */
   Element getEnclosingMember() {
     for (Element e = this; e != null; e = e.enclosingElement) {
       if (e.isMember()) return e;
@@ -339,6 +353,8 @@
   FunctionElement asFunctionElement() => null;
 
   static bool isInvalid(Element e) => e == null || e.isErroneous();
+
+  bool isAbstract(Compiler compiler) => modifiers.isAbstract();
 }
 
 /**
@@ -1170,7 +1186,7 @@
     return type;
   }
 
-  Node parseNode(DiagnosticListener listener) {
+  FunctionExpression parseNode(DiagnosticListener listener) {
     if (patch == null) {
       if (modifiers.isExternal()) {
         listener.cancel("Compiling external function with no implementation.",
@@ -1193,6 +1209,15 @@
       return super.toString();
     }
   }
+
+  bool isAbstract(Compiler compiler) {
+    if (super.isAbstract(compiler)) return true;
+    if (modifiers.isExternal()) return false;
+    if (isFunction() || isAccessor()) {
+      return !parseNode(compiler).hasBody();
+    }
+    return false;
+  }
 }
 
 class ConstructorBodyElement extends FunctionElement {
@@ -1263,7 +1288,7 @@
    * variables are not set until [element] has been resolved.
    */
   static Link<DartType> createTypeVariables(TypeDeclarationElement element,
-                                        NodeList parameters) {
+                                            NodeList parameters) {
     if (parameters == null) return const Link<DartType>();
 
     // Create types and elements for type variable.
diff --git a/lib/compiler/implementation/enqueue.dart b/lib/compiler/implementation/enqueue.dart
index 6ac8d8f..eac0761 100644
--- a/lib/compiler/implementation/enqueue.dart
+++ b/lib/compiler/implementation/enqueue.dart
@@ -105,6 +105,8 @@
       compiler.enabledRuntimeType = true;
     } else if (element == compiler.functionApplyMethod) {
       compiler.enabledFunctionApply = true;
+    } else if (element == compiler.invokeOnMethod) {
+      compiler.enabledInvokeOn = true;
     }
 
     // Enable isolate support if we start using something from the
diff --git a/lib/compiler/implementation/js/printer.dart b/lib/compiler/implementation/js/printer.dart
index d2f7fab..eaa8579 100644
--- a/lib/compiler/implementation/js/printer.dart
+++ b/lib/compiler/implementation/js/printer.dart
@@ -13,6 +13,8 @@
   bool atStatementBegin = false;
   final DanglingElseVisitor danglingElseVisitor;
   final Namer namer;
+  bool pendingSemicolon = false;
+  bool pendingSpace = false;
 
   Printer(leg.Compiler compiler)
       : shouldCompressOutput = compiler.enableMinification,
@@ -42,6 +44,16 @@
 
   void out(String str) {
     if (str != "") {
+      const identifierRegexp = const RegExp(r'^[a-zA-Z_0-9$]');
+      if (pendingSemicolon && (!shouldCompressOutput || str != "}")) {
+        outBuffer.add(";");
+      }
+      if (pendingSpace &&
+          (!shouldCompressOutput || identifierRegexp.hasMatch(str))) {
+        outBuffer.add(" ");
+      }
+      pendingSpace = false;
+      pendingSemicolon = false;
       outBuffer.add(str);
       lastAddedString = str;
     }
@@ -52,6 +64,14 @@
     lineOut();
   }
 
+  void outSemicolonLn() {
+    if (shouldCompressOutput) {
+      pendingSemicolon = true;
+    } else {
+      out(";\n");
+    }
+  }
+
   void outIndent(String str) { indent(); out(str); }
   void outIndentLn(String str) { indent(); outLn(str); }
   void indent() {
@@ -143,7 +163,7 @@
     indent();
     visitNestedExpression(expressionStatement.expression, EXPRESSION,
                           newInForInit: false, newAtStatementBegin: true);
-    outLn(";");
+    outSemicolonLn();
   }
 
   visitEmptyStatement(EmptyStatement nop) {
@@ -179,7 +199,7 @@
       }
       out("else");
       if (elsePart is If) {
-        out(" ");
+        pendingSpace = true;
         ifOut(elsePart, false);
       } else {
         blockBody(elsePart, needsSeparation: true, needsNewline: true);
@@ -221,7 +241,8 @@
     out("(");
     visitNestedExpression(loop.leftHandSide, EXPRESSION,
                           newInForInit: true, newAtStatementBegin: false);
-    out(" in ");
+    out(" in");
+    pendingSpace = true;
     visitNestedExpression(loop.object, EXPRESSION,
                           newInForInit: false, newAtStatementBegin: false);
     out(")");
@@ -250,41 +271,46 @@
     out("(");
     visitNestedExpression(loop.condition, EXPRESSION,
                           newInForInit: false, newAtStatementBegin: false);
-    outLn(");");
+    out(")");
+    outSemicolonLn();
   }
 
   visitContinue(Continue node) {
     if (node.targetLabel == null) {
-      outIndentLn("continue;");
+      outIndentLn("continue");
     } else {
-      outIndentLn("continue ${node.targetLabel};");
+      outIndentLn("continue ${node.targetLabel}");
     }
+    pendingSemicolon = true;
   }
 
   visitBreak(Break node) {
     if (node.targetLabel == null) {
-      outIndentLn("break;");
+      outIndentLn("break");
     } else {
-      outIndentLn("break ${node.targetLabel};");
+      outIndentLn("break ${node.targetLabel}");
     }
+    pendingSemicolon = true;
   }
 
   visitReturn(Return node) {
     if (node.value == null) {
-      outIndentLn("return;");
+      outIndentLn("return");
     } else {
-      outIndent("return ");
+      outIndent("return");
+      pendingSpace = true;
       visitNestedExpression(node.value, EXPRESSION,
                             newInForInit: false, newAtStatementBegin: false);
-      outLn(";");
     }
+    outSemicolonLn();
   }
 
   visitThrow(Throw node) {
-    outIndent("throw ");
+    outIndent("throw");
+    pendingSpace = true;
     visitNestedExpression(node.expression, EXPRESSION,
                           newInForInit: false, newAtStatementBegin: false);
-    outLn(";");
+    outSemicolonLn();
   }
 
   visitTry(Try node) {
@@ -329,7 +355,8 @@
   }
 
   visitCase(Case node) {
-    outIndent("case ");
+    outIndent("case");
+    pendingSpace = true;
     visitNestedExpression(node.expression, EXPRESSION,
                           newInForInit: false, newAtStatementBegin: false);
     outLn(":");
diff --git a/lib/compiler/implementation/js_backend/backend.dart b/lib/compiler/implementation/js_backend/backend.dart
index 9f79fcc..672e4ab 100644
--- a/lib/compiler/implementation/js_backend/backend.dart
+++ b/lib/compiler/implementation/js_backend/backend.dart
@@ -17,8 +17,9 @@
       : this.returnType = null,
         compiledFunctions = new List<Element>();
 
-  void update(HType type, Recompile recompile) {
-    HType newType = returnType != null ? returnType.union(type) : type;
+  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
@@ -120,14 +121,14 @@
   int get length => types.length;
   HType operator[](int index) => types[index];
 
-  HTypeList union(HTypeList other) {
+  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]);
+      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);
@@ -147,7 +148,7 @@
    * is returned. Otherwise a different [HTypeList] object is returned
    * with the type union information.
    */
-  HTypeList unionWithInvoke(HInvoke node, HTypeMap types) {
+  HTypeList unionWithInvoke(HInvoke node, HTypeMap types, Compiler compiler) {
     // Union an all unknown list with something stays all unknown.
     if (allUnknown) return this;
 
@@ -159,7 +160,7 @@
     bool onlyUnknown = true;
     HTypeList result = this;
     for (int i = 0; i < length; i++) {
-      HType newType = this[i].union(types[node.inputs[i + 1]]);
+      HType newType = this[i].union(types[node.inputs[i + 1]], compiler);
       if (result == this && newType != this[i]) {
         // Create a new argument types object with the matching types copied.
         result = new HTypeList(length);
@@ -307,7 +308,7 @@
     HType newType;
 
     if (oldType != null) {
-      newType = oldType.union(type);
+      newType = oldType.union(type, compiler);
     } else {
       newType = type;
     }
@@ -403,7 +404,7 @@
     // initializer list.
     HType result = constructorType != null ? constructorType : initializerType;
     HType type = fieldTypeMap[field];
-    if (type != null) result = result.union(type);
+    if (type != null) result = result.union(type, compiler);
     return result;
   }
 
@@ -480,7 +481,8 @@
       staticTypeMap[element] = new HTypeList.fromStaticInvocation(node, types);
     } else {
       if (oldTypes.allUnknown) return;
-      HTypeList newTypes = oldTypes.unionWithInvoke(node, types);
+      HTypeList newTypes =
+          oldTypes.unionWithInvoke(node, types, backend.compiler);
       if (identical(newTypes, oldTypes)) return;
       staticTypeMap[element] = newTypes;
       if (optimizedStaticFunctions.contains(element)) {
@@ -522,7 +524,8 @@
       selectorTypeMap[selector] = providedTypes;
     } else {
       HTypeList oldTypes = selectorTypeMap[selector];
-      HTypeList newTypes = oldTypes.unionWithInvoke(node, types);
+      HTypeList newTypes =
+           oldTypes.unionWithInvoke(node, types, backend.compiler);
       if (identical(newTypes, oldTypes)) return;
       selectorTypeMap[selector] = newTypes;
     }
@@ -589,7 +592,7 @@
                                                   defaultValueTypes);
       }
       assert(types.allUnknown || types.length == signature.parameterCount);
-      found = (found == null) ? types : found.union(types);
+      found = (found == null) ? types : found.union(types, compiler);
       return !found.allUnknown;
     });
     return found != null ? found : HTypeList.ALL_UNKNOWN;
@@ -841,7 +844,7 @@
     assert(invariant(element, element.isDeclaration));
     ReturnInfo info = returnInfo[element];
     if (info != null) {
-      info.update(returnType, scheduleForRecompilation);
+      info.update(returnType, scheduleForRecompilation, compiler);
     } else {
       returnInfo[element] = new ReturnInfo(returnType);
     }
diff --git a/lib/compiler/implementation/js_backend/emitter.dart b/lib/compiler/implementation/js_backend/emitter.dart
index f164a85..aecbea0 100644
--- a/lib/compiler/implementation/js_backend/emitter.dart
+++ b/lib/compiler/implementation/js_backend/emitter.dart
@@ -443,41 +443,30 @@
 
   void addParameterStubs(FunctionElement member,
                          DefineMemberFunction defineInstanceMember) {
-    // TODO(5074): Update this comment once we remove support for
-    // the deprecated parameter specification.
     // We fill the lists depending on the selector. For example,
     // take method foo:
-    //    foo(a, b, [c, d]);
+    //    foo(a, b, {c, d});
     //
     // We may have multiple ways of calling foo:
-    // (1) foo(1, 2, 3, 4)
-    // (2) foo(1, 2);
-    // (3) foo(1, 2, 3);
-    // (4) foo(1, 2, c: 3);
-    // (5) foo(1, 2, d: 4);
-    // (6) foo(1, 2, c: 3, d: 4);
-    // (7) foo(1, 2, d: 4, c: 3);
+    // (1) foo(1, 2);
+    // (2) foo(1, 2, c: 3);
+    // (3) foo(1, 2, d: 4);
+    // (4) foo(1, 2, c: 3, d: 4);
+    // (5) foo(1, 2, d: 4, c: 3);
     //
     // What we generate at the call sites are:
-    // (1) foo$4(1, 2, 3, 4)
-    // (2) foo$2(1, 2);
-    // (3) foo$3(1, 2, 3);
-    // (4) foo$3$c(1, 2, 3);
-    // (5) foo$3$d(1, 2, 4);
-    // (6) foo$4$c$d(1, 2, 3, 4);
-    // (7) foo$4$c$d(1, 2, 3, 4);
+    // (1) foo$2(1, 2);
+    // (2) foo$3$c(1, 2, 3);
+    // (3) foo$3$d(1, 2, 4);
+    // (4) foo$4$c$d(1, 2, 3, 4);
+    // (5) foo$4$c$d(1, 2, 3, 4);
     //
     // The stubs we generate are (expressed in Dart):
-    // (1) No stub generated, call is direct.
-    // (2) foo$2(a, b) => foo$4(a, b, null, null)
-    // (3) foo$3(a, b, c) => foo$4(a, b, c, null)
-    // (4) foo$3$c(a, b, c) => foo$4(a, b, c, null);
-    // (5) foo$3$d(a, b, d) => foo$4(a, b, null, d);
-    // (6) foo$4$c$d(a, b, c, d) => foo$4(a, b, c, d);
-    // (7) Same as (5).
-    //
-    // We need to generate a stub for (5) because the order of the
-    // stub arguments and the real method may be different.
+    // (1) foo$2(a, b) => foo$4$c$d(a, b, null, null)
+    // (2) foo$3$c(a, b, c) => foo$4$c$d(a, b, c, null);
+    // (3) foo$3$d(a, b, d) => foo$4$c$d(a, b, null, d);
+    // (4) No stub generated, call is direct.
+    // (5) No stub generated, call is direct.
 
     // Keep a cache of which stubs have already been generated, to
     // avoid duplicates. Note that even if selectors are
@@ -488,9 +477,6 @@
         && member.name == Namer.CLOSURE_INVOCATION_NAME) {
       // If [Function.apply] is called, we pessimistically compile all
       // possible stubs for this closure.
-      // TODO(5074): This functionality only supports the new
-      // parameter specification, and this comment should be removed
-      // once the old specification is not supported.
       FunctionSignature signature = member.computeSignature(compiler);
       Set<Selector> selectors = signature.optionalParametersAreNamed
           ? computeNamedSelectors(signature, member)
@@ -600,9 +586,8 @@
 
     if (member.isFunction()
         || member.isGenerativeConstructorBody()
-        || member.isGetter()
-        || member.isSetter()) {
-      if (member.modifiers.isAbstract()) return;
+        || member.isAccessor()) {
+      if (member.isAbstract(compiler)) return;
       CodeBuffer codeBuffer = compiler.codegenWorld.generatedCode[member];
       if (codeBuffer == null) return;
       defineInstanceMember(namer.getName(member), codeBuffer);
@@ -1268,8 +1253,8 @@
     // Do not generate no such method handlers if there is no class.
     if (compiler.codegenWorld.instantiatedClasses.isEmpty) return;
 
-    String noSuchMethodName =
-        namer.publicInstanceMethodNameByArity(Compiler.NO_SUCH_METHOD, 2);
+    String noSuchMethodName = namer.publicInstanceMethodNameByArity(
+        Compiler.NO_SUCH_METHOD, Compiler.NO_SUCH_METHOD_ARG_COUNT);
 
     // Keep track of the JavaScript names we've already added so we
     // do not introduce duplicates (bad for code size).
@@ -1294,14 +1279,36 @@
     }
 
     CodeBuffer generateMethod(String methodName, Selector selector) {
+      // Values match JSInvocationMirror in js-helper library.
+      const int METHOD = 0;
+      const int GETTER = 1;
+      const int SETTER = 2;
+      int type = METHOD;
+      if (selector.isGetter()) {
+        type = GETTER;
+      } else if (selector.isSetter()) {
+        type = SETTER;
+      }
       CodeBuffer args = new CodeBuffer();
       for (int i = 0; i < selector.argumentCount; i++) {
         if (i != 0) args.add(', ');
         args.add('\$$i');
       }
+      CodeBuffer argNames = new CodeBuffer();
+      List<SourceString> names = selector.getOrderedNamedArguments();
+      for (int i = 0; i < names.length; i++) {
+        if (i != 0) argNames.add(', ');
+        argNames.add('"');
+        argNames.add(names[i].slowToString());
+        argNames.add('"');
+      }
+      String internalName = namer.instanceMethodInvocationName(
+          selector.library, new SourceString(methodName), selector);
       CodeBuffer buffer = new CodeBuffer();
       buffer.add('function($args) {\n');
-      buffer.add('  return this.$noSuchMethodName("$methodName", [$args]);\n');
+      buffer.add('  return this.$noSuchMethodName('
+                     '\$.createInvocationMirror("$methodName", "$internalName",'
+                     ' $type, [$args], [$argNames]));\n');
       buffer.add(' }');
       return buffer;
     }
@@ -1438,9 +1445,6 @@
 
     // TODO(ngeoffray): These globals are currently required by the isolate
     // library. They should be removed.
-    String runtimeTypeCache =
-        compiler.enabledRuntimeType ? "  context.runtimeTypeCache = {}\n" : "";
-
     buffer.add("""
 var \$globalThis = $currentIsolate;
 var \$globalState;
@@ -1452,7 +1456,7 @@
 
 function \$initGlobals(context) {
   context.isolateStatics = new ${namer.ISOLATE}();
-$runtimeTypeCache}
+}
 function \$setGlobals(context) {
   $currentIsolate = context.isolateStatics;
   \$globalThis = $currentIsolate;
@@ -1527,9 +1531,6 @@
       // constants to be set up.
       emitStaticNonFinalFieldInitializations(mainBuffer);
       emitLazilyInitializedStaticFields(mainBuffer);
-      if (compiler.enabledRuntimeType && !compiler.hasIsolateSupport()) {
-        mainBuffer.add('$isolateProperties.runtimeTypeCache = {};\n');
-      }
 
       isolateProperties = isolatePropertiesName;
       // The following code should not use the short-hand for the
diff --git a/lib/compiler/implementation/lib/core_patch.dart b/lib/compiler/implementation/lib/core_patch.dart
index d458e74..f75c3d7 100644
--- a/lib/compiler/implementation/lib/core_patch.dart
+++ b/lib/compiler/implementation/lib/core_patch.dart
@@ -19,8 +19,11 @@
 
   patch String toString() => Primitives.objectToString(this);
 
-  patch Dynamic noSuchMethod(String name, List args) {
-    throw new NoSuchMethodError(this, name, args);
+  patch dynamic noSuchMethod(InvocationMirror invocation) {
+    throw new NoSuchMethodError(this,
+                                invocation.memberName,
+                                invocation.positionalArguments,
+                                invocation.namedArguments);
   }
 
   patch Type get runtimeType {
@@ -141,3 +144,71 @@
 
   patch int get weekday => Primitives.getWeekday(this);
 }
+
+
+// Patch for Stopwatch implementation.
+patch class _StopwatchImpl {
+  patch static int _frequency() => 1000;
+  patch static int _now() => Primitives.dateNow();
+}
+
+
+// Patch for List implementation.
+patch class _ListImpl<E> {
+  patch factory List([int length]) => Primitives.newList(length);
+
+  patch factory List.from(Iterable<E> other) {
+    var result = new List();
+    for (var element in other) {
+      result.add(element);
+    }
+    return result;
+  }
+}
+
+
+// Patch for String implementation.
+patch class _StringImpl {
+  patch factory String.fromCharCodes(List<int> charCodes) {
+    checkNull(charCodes);
+    if (!isJsArray(charCodes)) {
+      if (charCodes is !List) throw new ArgumentError(charCodes);
+      charCodes = new List.from(charCodes);
+    }
+    return Primitives.stringFromCharCodes(charCodes);
+  }
+
+  patch static String join(List<String> strings, String separator) {
+    checkNull(strings);
+    checkNull(separator);
+    if (separator is !String) throw new ArgumentError(separator);
+    return stringJoinUnchecked(_toJsStringArray(strings), separator);
+  }
+
+  patch static String concatAll(List<String> strings) {
+    return stringJoinUnchecked(_toJsStringArray(strings), "");
+  }
+
+  static List _toJsStringArray(List<String> strings) {
+    checkNull(strings);
+    var array;
+    final length = strings.length;
+    if (isJsArray(strings)) {
+      array = strings;
+      for (int i = 0; i < length; i++) {
+        final string = strings[i];
+        checkNull(string);
+        if (string is !String) throw new ArgumentError(string);
+      }
+    } else {
+      array = new List(length);
+      for (int i = 0; i < length; i++) {
+        final string = strings[i];
+        checkNull(string);
+        if (string is !String) throw new ArgumentError(string);
+        array[i] = string;
+      }
+    }
+    return array;
+  }
+}
diff --git a/lib/compiler/implementation/lib/coreimpl_patch.dart b/lib/compiler/implementation/lib/coreimpl_patch.dart
index ef73b1c..4ef493e 100644
--- a/lib/compiler/implementation/lib/coreimpl_patch.dart
+++ b/lib/compiler/implementation/lib/coreimpl_patch.dart
@@ -4,80 +4,6 @@
 
 // Patch file for dart:coreimpl classes.
 
-// Patch for String implementation.
-// TODO(ager): Split out into date_patch.dart and allow #source
-// in patch files?
-patch class StringImplementation {
-  patch static String _fromCharCodes(List<int> charCodes) {
-    checkNull(charCodes);
-    if (!isJsArray(charCodes)) {
-      if (charCodes is !List) throw new ArgumentError(charCodes);
-      charCodes = new List.from(charCodes);
-    }
-    return Primitives.stringFromCharCodes(charCodes);
-  }
-
-  patch String join(List<String> strings, String separator) {
-    checkNull(strings);
-    checkNull(separator);
-    if (separator is !String) throw new ArgumentError(separator);
-    return stringJoinUnchecked(_toJsStringArray(strings), separator);
-  }
-
-  patch String concatAll(List<String> strings) {
-    return stringJoinUnchecked(_toJsStringArray(strings), "");
-  }
-
-  static List _toJsStringArray(List<String> strings) {
-    checkNull(strings);
-    var array;
-    final length = strings.length;
-    if (isJsArray(strings)) {
-      array = strings;
-      for (int i = 0; i < length; i++) {
-        final string = strings[i];
-        checkNull(string);
-        if (string is !String) throw new ArgumentError(string);
-      }
-    } else {
-      array = new List(length);
-      for (int i = 0; i < length; i++) {
-        final string = strings[i];
-        checkNull(string);
-        if (string is !String) throw new ArgumentError(string);
-        array[i] = string;
-      }
-    }
-    return array;
-  }
-}
-
-
-// Patch for List implementation.
-// TODO(ager): Split out into date_patch.dart and allow #source
-// in patch files?
-patch class ListImplementation<E> {
-  patch factory List([int length]) => Primitives.newList(length);
-
-  patch static List _from(Iterable other) {
-    List result = new List();
-    for (var element in other) {
-      result.add(element);
-    }
-    return result;
-  }
-}
-
-
-// Patch for Stopwatch implementation.
-// TODO(ager): Split out into stopwatch_patch.dart and allow #source
-// in patch files?
-patch class StopwatchImplementation {
-  patch static int _frequency() => 1000;
-  patch static int _now() => Primitives.dateNow();
-}
-
-
 // Patch for RegExp implementation.
 // TODO(ager): Split out into regexp_patch.dart and allow #source in
 // patch files?
diff --git a/lib/compiler/implementation/lib/interceptors.dart b/lib/compiler/implementation/lib/interceptors.dart
index 1467ca8..2fc25a6 100644
--- a/lib/compiler/implementation/lib/interceptors.dart
+++ b/lib/compiler/implementation/lib/interceptors.dart
@@ -4,7 +4,7 @@
 
 #library('dart:_interceptors');
 
-#import('dart:coreimpl');
+#import('dart:collection');
 
 add$1(var receiver, var value) {
   if (isJsArray(receiver)) {
@@ -19,7 +19,7 @@
   if (isJsArray(receiver)) {
     if (index is !int) throw new ArgumentError(index);
     if (index < 0 || index >= receiver.length) {
-      throw new IndexOutOfRangeException(index);
+      throw new RangeError.value(index);
     }
     checkGrowable(receiver, 'removeAt');
     return JS("Object", r'#.splice(#, 1)[0]', receiver, index);
@@ -30,7 +30,7 @@
 removeLast(var receiver) {
   if (isJsArray(receiver)) {
     checkGrowable(receiver, 'removeLast');
-    if (receiver.length == 0) throw new IndexOutOfRangeException(-1);
+    if (receiver.length == 0) throw new RangeError.value(-1);
     return JS('Object', r'#.pop()', receiver);
   }
   return UNINTERCEPTED(receiver.removeLast());
@@ -56,7 +56,7 @@
   if (isJsArray(receiver)) {
     checkNull(newLength); // TODO(ahe): This is not specified but co19 tests it.
     if (newLength is !int) throw new ArgumentError(newLength);
-    if (newLength < 0) throw new IndexOutOfRangeException(newLength);
+    if (newLength < 0) throw new RangeError.value(newLength);
     checkGrowable(receiver, 'set length');
     JS('void', r'#.length = #', receiver, newLength);
   } else {
@@ -93,8 +93,8 @@
 charCodeAt(var receiver, int index) {
   if (receiver is String) {
     if (index is !num) throw new ArgumentError(index);
-    if (index < 0) throw new IndexOutOfRangeException(index);
-    if (index >= receiver.length) throw new IndexOutOfRangeException(index);
+    if (index < 0) throw new RangeError.value(index);
+    if (index >= receiver.length) throw new RangeError.value(index);
     return JS('int', r'#.charCodeAt(#)', receiver, index);
   } else {
     return UNINTERCEPTED(receiver.charCodeAt(index));
@@ -196,10 +196,10 @@
   if (start is !int) throw new ArgumentError(start);
   if (length is !int) throw new ArgumentError(length);
   if (length < 0) throw new ArgumentError(length);
-  if (start < 0) throw new IndexOutOfRangeException(start);
+  if (start < 0) throw new RangeError.value(start);
   var end = start + length;
   if (end > receiver.length) {
-    throw new IndexOutOfRangeException(length);
+    throw new RangeError.value(length);
   }
   if (length < 0) throw new ArgumentError(length);
   return JS('Object', r'#.slice(#, #)', receiver, start, end);
@@ -299,10 +299,10 @@
   if (length < 0) throw new ArgumentError(length);
   var receiverLength = JS('num', r'#.length', receiver);
   if (start < 0 || start >= receiverLength) {
-    throw new IndexOutOfRangeException(start);
+    throw new RangeError.value(start);
   }
   if (start + length > receiverLength) {
-    throw new IndexOutOfRangeException(start + length);
+    throw new RangeError.value(start + length);
   }
   Arrays.copy(receiver,
               start + length,
@@ -334,9 +334,9 @@
   if (length is !int) throw new ArgumentError(length);
   if (startFrom is !int) throw new ArgumentError(startFrom);
   if (length < 0) throw new ArgumentError(length);
-  if (start < 0) throw new IndexOutOfRangeException(start);
+  if (start < 0) throw new RangeError.value(start);
   if (start + length > receiver.length) {
-    throw new IndexOutOfRangeException(start + length);
+    throw new RangeError.value(start + length);
   }
 
   Arrays.copy(from, startFrom, receiver, start, length);
@@ -596,9 +596,9 @@
   var length = receiver.length;
   if (endIndex == null) endIndex = length;
   checkNum(endIndex);
-  if (startIndex < 0 ) throw new IndexOutOfRangeException(startIndex);
-  if (startIndex > endIndex) throw new IndexOutOfRangeException(startIndex);
-  if (endIndex > length) throw new IndexOutOfRangeException(endIndex);
+  if (startIndex < 0 ) throw new RangeError.value(startIndex);
+  if (startIndex > endIndex) throw new RangeError.value(startIndex);
+  if (endIndex > length) throw new RangeError.value(endIndex);
   return substringUnchecked(receiver, startIndex, endIndex);
 }
 
diff --git a/lib/compiler/implementation/lib/io.dart b/lib/compiler/implementation/lib/io.dart
deleted file mode 100644
index aeeff9e..0000000
--- a/lib/compiler/implementation/lib/io.dart
+++ /dev/null
@@ -1,212 +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.
-
-// This is a copy of the VM's dart:io library. This API is not usable
-// when running inside a web browser. Nevertheless, Leg provides a
-// mock version of the dart:io library so that it can statically
-// analyze programs that use dart:io.
-
-// TODO(ahe): Separate API from implementation details.
-
-/**
- * The IO library is used for Dart server applications,
- * which run on a stand-alone Dart VM from the command line.
- * *This library does not work in browser based applications.*
- *
- * This library allows you to work with files, directories,
- * sockets, processes, HTTP servers and clients, and more.
- */
-#library("dart:io");
-#import("dart:coreimpl");
-#import("dart:math");
-#import("dart:isolate");
-// TODO(ahe): Should Leg support this library?
-// #import("dart:nativewrappers");
-#import("dart:uri");
-#import("dart:crypto");
-#import("dart:utf");
-#source('../../../../runtime/bin/buffer_list.dart');
-// Uses native keyword.
-//#source('../../../../runtime/bin/common.dart');
-#source('../../../../runtime/bin/chunked_stream.dart');
-#source('../../../../runtime/bin/directory.dart');
-// Uses native keyword.
-// #source('../../../../runtime/bin/directory_impl.dart');
-// Uses native keyword.
-// #source('../../../../runtime/bin/eventhandler.dart');
-#source('../../../../runtime/bin/file.dart');
-// Uses native keyword.
-// #source('../../../../runtime/bin/file_impl.dart');
-#source('../../../../runtime/bin/http.dart');
-#source('../../../../runtime/bin/http_impl.dart');
-#source('../../../../runtime/bin/http_parser.dart');
-#source('../../../../runtime/bin/http_utils.dart');
-#source('../../../../runtime/bin/input_stream.dart');
-#source('../../../../runtime/bin/list_stream.dart');
-#source('../../../../runtime/bin/list_stream_impl.dart');
-#source('../../../../runtime/bin/output_stream.dart');
-#source('../../../../runtime/bin/path.dart');
-#source('../../../../runtime/bin/path_impl.dart');
-#source('../../../../runtime/bin/platform.dart');
-// Uses native keyword.
-// #source('../../../../runtime/bin/platform_impl.dart');
-#source('../../../../runtime/bin/process.dart');
-// Uses native keyword.
-// #source('../../../../runtime/bin/process_impl.dart');
-#source('../../../../runtime/bin/socket.dart');
-// Uses native keyword.
-// #source('../../../../runtime/bin/socket_impl.dart');
-#source('../../../../runtime/bin/socket_stream.dart');
-#source('../../../../runtime/bin/socket_stream_impl.dart');
-// Uses native keyword.
-// #source('../../../../runtime/bin/stdio.dart');
-#source('../../../../runtime/bin/stream_util.dart');
-#source('../../../../runtime/bin/string_stream.dart');
-#source('../../../../runtime/bin/timer_impl.dart');
-#source('../../../../runtime/bin/websocket.dart');
-#source('../../../../runtime/bin/websocket_impl.dart');
-
-/**
-  * An [OSError] object holds information about an error from the
-  * operating system.
-  */
-class OSError {
-  /** Constant used to indicate that no OS error code is available. */
-  static const int noErrorCode = -1;
-
-  /** Creates an OSError object from a message and an errorCode. */
-  const OSError([String this.message = "", int this.errorCode = noErrorCode]);
-
-  /** Converts an OSError object to a string representation. */
-  String toString() {
-    throw new UnsupportedError('OSError.toString');
-  }
-
-  /**
-    * Error message supplied by the operating system. null if no message is
-    * associated with the error.
-    */
-  final String message;
-
-  /**
-    * Error code supplied by the operating system. Will have the value
-    * [noErrorCode] if there is no error code associated with the error.
-    */
-  final int errorCode;
-}
-
-List _ensureFastAndSerializableBuffer(List buffer, int offset, int bytes) {
-  throw new UnsupportedError('_ensureFastAndSerializableBuffer');
-}
-
-class _File {
-  factory _File(arg) {
-    throw new UnsupportedError('new File($arg)');
-  }
-
-  factory _File.fromPath(arg) {
-    throw new UnsupportedError('new File.fromPath($arg)');
-  }
-}
-
-class _Platform {
-  static int get numberOfProcessors {
-    throw new UnsupportedError('_Platform.numberOfProcessors');
-  }
-
-  static String get pathSeparator {
-    throw new UnsupportedError('_Platform.pathSeparator');
-  }
-
-  static String get operatingSystem {
-    throw new UnsupportedError('_Platform.operatingSystem');
-  }
-
-  static String get localHostname {
-    throw new UnsupportedError('_Platform.localHostname');
-  }
-
-  static Map<String, String> get environment {
-    throw new UnsupportedError('_Platform.environment');
-  }
-}
-
-class _Directory {
-  factory _Directory(arg) {
-    throw new UnsupportedError('new Directory($arg)');
-  }
-
-  factory _Directory.fromPath(arg) {
-    throw new UnsupportedError('new Directory.fromPath($arg)');
-  }
-
-  factory _Directory.current() {
-    throw new UnsupportedError('new Directory.current()');
-  }
-}
-
-class _DirectoryLister {
-}
-
-void _exit(int exitCode) {
-  throw new UnsupportedError("exit($exitCode)");
-}
-
-class _Process {
-  static Future<Process> start(String executable,
-                               List<String> arguments,
-                               [ProcessOptions options]) {
-    var msg = 'Process.start($executable, $arguments, $options)';
-    throw new UnsupportedError(msg);
-  }
-
-  static Future<ProcessResult> run(String executable,
-                                   List<String> arguments,
-                                   [ProcessOptions options]) {
-    var msg = 'Process.run($executable, $arguments, $options)';
-    throw new UnsupportedError(msg);
-  }
-}
-
-class _ServerSocket {
-  factory _ServerSocket(String bindAddress, int port, int backlog) {
-    throw new UnsupportedError(
-        'new ServerSocket($bindAddress, $port, $backlog)');
-  }
-}
-
-class _Socket {
-  factory _Socket(String host, int port) {
-    throw new UnsupportedError('new Socket($host, $port)');
-  }
-}
-
-class _EventHandler {
-  factory _EventHandler() {
-    throw new UnsupportedError('new _EventHandler()');
-  }
-
-  static void _start() {
-    throw new UnsupportedError('_EventHandler._start()');
-  }
-
-  static _sendData(int id, ReceivePort receivePort, int data) {
-    var msg = '_EventHandler._sendData($id, $receivePort, $data)';
-    throw new UnsupportedError(msg);
-  }
-
-  static _EventHandler get _eventHandler {
-    throw new UnsupportedError('_EventHandler._eventhandler');
-  }
-
-  static void set _eventHandler(_EventHandler e) {
-    throw new UnsupportedError('_EventHandler._eventhandler = $e');
-  }
-}
-
-const InputStream stdin = null;
-
-const OutputStream stdout = null;
-
-const OutputStream stderr = null;
diff --git a/lib/compiler/implementation/lib/io_patch.dart b/lib/compiler/implementation/lib/io_patch.dart
new file mode 100644
index 0000000..f603e87
--- /dev/null
+++ b/lib/compiler/implementation/lib/io_patch.dart
@@ -0,0 +1,177 @@
+// 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.
+
+patch class _BufferUtils {
+  patch static bool _isBuiltinList(List buffer) {
+    throw new UnsupportedError("_isBuiltinList");
+  }
+}
+
+patch class _Directory {
+  patch static String _current() {
+    throw new UnsupportedError("Directory._current");
+  }
+  patch static _createTemp(String template) {
+    throw new UnsupportedError("Directory._createTemp");
+  }
+  patch static int _exists(String path) {
+    throw new UnsupportedError("Directory._exists");
+  }
+  patch static _create(String path) {
+    throw new UnsupportedError("Directory._create");
+  }
+  patch static _delete(String path, bool recursive) {
+    throw new UnsupportedError("Directory._delete");
+  }
+  patch static _rename(String path, String newPath) {
+    throw new UnsupportedError("Directory._rename");
+  }
+  patch static SendPort _newServicePort() {
+    throw new UnsupportedError("Directory._newServicePort");
+  }
+}
+
+patch class _EventHandler {
+  patch static void _start() {
+    throw new UnsupportedError("EventHandler._start");
+  }
+
+  patch static _sendData(Object sender,
+                         ReceivePort receivePort,
+                         int data) {
+    throw new UnsupportedError("EventHandler._sendData");
+  }
+}
+
+patch class _FileUtils {
+  patch static SendPort _newServicePort() {
+    throw new UnsupportedError("FileUtils._newServicePort");
+  }
+}
+
+patch class _File {
+  patch static _exists(String name) {
+    throw new UnsupportedError("File._exists");
+  }
+  patch static _create(String name) {
+    throw new UnsupportedError("File._create");
+  }
+  patch static _delete(String name) {
+    throw new UnsupportedError("File._delete");
+  }
+  patch static _directory(String name) {
+    throw new UnsupportedError("File._directory");
+  }
+  patch static _lengthFromName(String name) {
+    throw new UnsupportedError("File._lengthFromName");
+  }
+  patch static _lastModified(String name) {
+    throw new UnsupportedError("File._lastModified");
+  }
+  patch static _open(String name, int mode) {
+    throw new UnsupportedError("File._open");
+  }
+  patch static int _openStdio(int fd) {
+    throw new UnsupportedError("File._openStdio");
+  }
+  patch static _fullPath(String name) {
+    throw new UnsupportedError("File._fullPath");
+  }
+}
+
+patch class _RandomAccessFile {
+  patch static int _close(int id) {
+    throw new UnsupportedError("RandomAccessFile._close");
+  }
+  patch static _readByte(int id) {
+    throw new UnsupportedError("RandomAccessFile._readByte");
+  }
+  patch static _readList(int id, List<int> buffer, int offset, int bytes) {
+    throw new UnsupportedError("RandomAccessFile._readList");
+  }
+  patch static _writeByte(int id, int value) {
+    throw new UnsupportedError("RandomAccessFile._writeByte");
+  }
+  patch static _writeList(int id, List<int> buffer, int offset, int bytes) {
+    throw new UnsupportedError("RandomAccessFile._writeList");
+  }
+  patch static _position(int id) {
+    throw new UnsupportedError("RandomAccessFile._position");
+  }
+  patch static _setPosition(int id, int position) {
+    throw new UnsupportedError("RandomAccessFile._setPosition");
+  }
+  patch static _truncate(int id, int length) {
+    throw new UnsupportedError("RandomAccessFile._truncate");
+  }
+  patch static _length(int id) {
+    throw new UnsupportedError("RandomAccessFile._length");
+  }
+  patch static _flush(int id) {
+    throw new UnsupportedError("RandomAccessFile._flush");
+  }
+}
+
+patch class _HttpSessionManager {
+  patch static Uint8List _getRandomBytes(int count) {
+    throw new UnsupportedError("HttpSessionManager._getRandomBytes");
+  }
+}
+
+patch class _Platform {
+  patch static int _numberOfProcessors() {
+    throw new UnsupportedError("Platform._numberOfProcessors");
+  }
+  patch static String _pathSeparator() {
+    throw new UnsupportedError("Platform._pathSeparator");
+  }
+  patch static String _operatingSystem() {
+    throw new UnsupportedError("Platform._operatingSystem");
+  }
+  patch static _localHostname() {
+    throw new UnsupportedError("Platform._localHostname");
+  }
+  patch static _environment() {
+    throw new UnsupportedError("Platform._environment");
+  }
+}
+
+patch class _ProcessUtils {
+  patch static _exit(int status) {
+    throw new UnsupportedError("ProcessUtils._exit");
+  }
+}
+
+patch class Process {
+  patch static Future<Process> start(String executable,
+                                     List<String> arguments,
+                                     [ProcessOptions options]) {
+    throw new UnsupportedError("Process.start");
+  }
+
+  patch static Future<ProcessResult> run(String executable,
+                                         List<String> arguments,
+                                         [ProcessOptions options]) {
+    throw new UnsupportedError("Process.run");
+  }
+}
+
+patch class ServerSocket {
+  patch factory ServerSocket(String bindAddress, int port, int backlog) {
+    return new _ServerSocket(bindAddress, port, backlog);
+  }
+}
+
+patch class Socket {
+  patch factory Socket(String host, int port) => new _Socket(host, port);
+}
+
+patch class _StdIOUtils {
+  patch static _getStdioHandle(Socket socket, int num) {
+    throw new UnsupportedError("StdIOUtils._getStdioHandle");
+  }
+  patch static _getStdioHandleType(int num) {
+    throw new UnsupportedError("StdIOUtils._getStdioHandleType");
+  }
+}
diff --git a/lib/compiler/implementation/lib/js_helper.dart b/lib/compiler/implementation/lib/js_helper.dart
index fcfa49b..56807be 100644
--- a/lib/compiler/implementation/lib/js_helper.dart
+++ b/lib/compiler/implementation/lib/js_helper.dart
@@ -5,6 +5,7 @@
 #library('dart:_js_helper');
 
 #import('dart:coreimpl');
+#import('dart:collection');
 
 #source('constant_map.dart');
 #source('native_helper.dart');
@@ -299,7 +300,7 @@
       if (!identical(index.truncate(), index)) throw new ArgumentError(index);
     }
     if (index < 0 || index >= a.length) {
-      throw new IndexOutOfRangeException(index);
+      throw new RangeError.value(index);
     }
     return JS('Object', r'#[#]', a, index);
   }
@@ -312,7 +313,7 @@
       throw new ArgumentError(index);
     }
     if (index < 0 || index >= a.length) {
-      throw new IndexOutOfRangeException(index);
+      throw new RangeError.value(index);
     }
     checkMutable(a, 'indexed set');
     JS('Object', r'#[#] = #', a, index, value);
@@ -352,6 +353,63 @@
   }
 }
 
+createInvocationMirror(name, internalName, type, arguments, argumentNames) =>
+    new JSInvocationMirror(name, internalName, type, arguments, argumentNames);
+
+class JSInvocationMirror implements InvocationMirror {
+  static const METHOD = 0;
+  static const GETTER = 1;
+  static const SETTER = 2;
+
+  final String memberName;
+  final String _internalName;
+  final int _kind;
+  final List _arguments;
+  final List _namedArgumentNames;
+  /** Map from argument name to index in _arguments. */
+  Map<String,dynamic> _namedIndices = null;
+
+  JSInvocationMirror(this.memberName,
+                     this._internalName,
+                     this._kind,
+                     this._arguments,
+                     this._namedArgumentNames);
+
+  bool get isMethod => _kind == METHOD;
+  bool get isGetter => _kind == GETTER;
+  bool get isSetter => _kind == SETTER;
+  bool get isAccessor => _kind != METHOD;
+
+  List get positionalArguments {
+    if (isGetter) return null;
+    var list = [];
+    var argumentCount =
+        _arguments.length - _namedArgumentNames.length;
+    for (var index = 0 ; index < argumentCount ; index++) {
+      list.add(_arguments[index]);
+    }
+    return list;
+  }
+
+  Map<String,dynamic> get namedArguments {
+    if (isAccessor) return null;
+    var map = <String,dynamic>{};
+    int namedArgumentCount = _namedArgumentNames.length;
+    int namedArgumentsStartIndex = _arguments.length - namedArgumentCount;
+    for (int i = 0; i < namedArgumentCount; i++) {
+      map[_namedArgumentNames[i]] = _arguments[namedArgumentsStartIndex + i];
+    }
+    return map;
+  }
+
+  invokeOn(Object object) {
+    List arguments = _arguments;
+    if (!isJsArray(arguments)) arguments = new List.from(arguments);
+    return JS("var", "#[#].apply(#, #)",
+              object, _internalName, object, arguments);
+  }
+}
+
 class Primitives {
   static int hashCodeSeed = 0;
 
@@ -647,7 +705,7 @@
     String selectorName = 'call\$$argumentCount$buffer';
     var jsFunction = JS('var', '#[#]', function, selectorName);
     if (jsFunction == null) {
-      throw new NoSuchMethodError(function, selectorName, arguments);
+      throw new NoSuchMethodError(function, selectorName, arguments, {});
     }
     // We bound 'this' to [function] because of how we compile
     // closures: escaped local variables are stored and accessed through
@@ -671,7 +729,7 @@
  * access.
  */
 ioore(index) {
-  throw new IndexOutOfRangeException(index);
+  throw new RangeError.value(index);
 }
 
 listInsertRange(receiver, start, length, initialValue) {
@@ -686,7 +744,7 @@
 
   var receiverLength = JS('num', r'#.length', receiver);
   if (start < 0 || start > receiverLength) {
-    throw new IndexOutOfRangeException(start);
+    throw new RangeError.value(start);
   }
   receiver.length = receiverLength + length;
   Arrays.copy(receiver,
@@ -888,7 +946,7 @@
         type == 'non_object_property_load') {
       return new NullPointerException();
     } else if (type == 'undefined_method') {
-      return new NoSuchMethodError('', name, []);
+      return new NoSuchMethodError('', name, [], {});
     }
 
     var ieErrorCode = JS('int', '#.number & 0xffff', ex);
@@ -909,7 +967,7 @@
         // Object doesn't support property or method 'foo' which sets the error
         // code 438 in IE.
         // TODO(kasperl): Compute the right name if possible.
-        return new NoSuchMethodError('', '<unknown>', []);
+        return new NoSuchMethodError('', '<unknown>', [], {});
       }
     }
 
@@ -1375,8 +1433,9 @@
  * Called by generated code when a method that must be statically
  * resolved cannot be found.
  */
-void throwNoSuchMethod(obj, name, arguments) {
-  throw new NoSuchMethodError(obj, name, arguments);
+void throwNoSuchMethod(obj, name, arguments, expectedArgumentNames) {
+  throw new NoSuchMethodError(obj, name, arguments, const {},
+                              expectedArgumentNames);
 }
 
 /**
@@ -1393,15 +1452,15 @@
   toString() => typeName;
 }
 
+var runtimeTypeCache = JS('var', '{}');
+
 Type getOrCreateCachedRuntimeType(String key) {
-  Type runtimeType =
-      JS('Type', r'#.runtimeTypeCache[#]', JS_CURRENT_ISOLATE(), key);
-  if (runtimeType == null) {
-    runtimeType = new TypeImpl(key);
-    JS('void', r'#.runtimeTypeCache[#] = #', JS_CURRENT_ISOLATE(), key,
-       runtimeType);
+  Type result = JS('Type', r'#[#]', runtimeTypeCache, key);
+  if (result == null) {
+    result = new TypeImpl(key);
+    JS('var', r'#[#] = #', runtimeTypeCache, key, result);
   }
-  return runtimeType;
+  return result;
 }
 
 String getRuntimeTypeString(var object) {
diff --git a/lib/compiler/implementation/lib/native_helper.dart b/lib/compiler/implementation/lib/native_helper.dart
index 1ff2e1c..3f79e26 100644
--- a/lib/compiler/implementation/lib/native_helper.dart
+++ b/lib/compiler/implementation/lib/native_helper.dart
@@ -7,6 +7,13 @@
   if (name == 'Window') return 'DOMWindow';
   if (name == 'CanvasPixelArray') return 'Uint8ClampedArray';
   if (name == 'WebKitMutationObserver') return 'MutationObserver';
+  if (name == 'AudioChannelMerger') return 'ChannelMergerNode';
+  if (name == 'AudioChannelSplitter') return 'ChannelSplitterNode';
+  if (name == 'AudioGainNode') return 'GainNode';
+  if (name == 'AudioPannerNode') return 'PannerNode';
+  if (name == 'JavaScriptAudioNode') return 'ScriptProcessorNode';
+  if (name == 'Oscillator') return 'OscillatorNode';
+  if (name == 'RealtimeAnalyserNode') return 'AnalyserNode';
   return name;
 }
 
@@ -16,6 +23,13 @@
   if (name == 'Window') return 'DOMWindow';
   if (name == 'CanvasPixelArray') return 'Uint8ClampedArray';
   if (name == 'WebKitMutationObserver') return 'MutationObserver';
+  if (name == 'AudioChannelMerger') return 'ChannelMergerNode';
+  if (name == 'AudioChannelSplitter') return 'ChannelSplitterNode';
+  if (name == 'AudioGainNode') return 'GainNode';
+  if (name == 'AudioPannerNode') return 'PannerNode';
+  if (name == 'JavaScriptAudioNode') return 'ScriptProcessorNode';
+  if (name == 'Oscillator') return 'OscillatorNode';
+  if (name == 'RealtimeAnalyserNode') return 'AnalyserNode';
   return name;
 }
 
diff --git a/lib/compiler/implementation/lib/string_helper.dart b/lib/compiler/implementation/lib/string_helper.dart
index eaf132c..3a35778 100644
--- a/lib/compiler/implementation/lib/string_helper.dart
+++ b/lib/compiler/implementation/lib/string_helper.dart
@@ -13,7 +13,7 @@
 
   String group(int group_) {
     if (group_ != 0) {
-      throw new IndexOutOfRangeException(group_);
+      throw new RangeError.value(group_);
     }
     return pattern;
   }
@@ -105,7 +105,7 @@
   } else {
     checkNull(from);
     // TODO(floitsch): implement generic String.replace (with patterns).
-    throw "StringImplementation.replaceAll(Pattern) UNIMPLEMENTED";
+    throw "String.replaceAll(Pattern) UNIMPLEMENTED";
   }
 }
 
@@ -118,7 +118,7 @@
   } else {
     checkNull(from);
     // TODO(floitsch): implement generic String.replace (with patterns).
-    throw "StringImplementation.replace(Pattern) UNIMPLEMENTED";
+    throw "String.replace(Pattern) UNIMPLEMENTED";
   }
 }
 
@@ -129,7 +129,7 @@
     var re = regExpGetNative(pattern);
     return JS('List', r'#.split(#)', receiver, re);
   } else {
-    throw "StringImplementation.split(Pattern) UNIMPLEMENTED";
+    throw "String.split(Pattern) UNIMPLEMENTED";
   }
 }
 
diff --git a/lib/compiler/implementation/resolution/members.dart b/lib/compiler/implementation/resolution/members.dart
index 34cec51..f96bf11 100644
--- a/lib/compiler/implementation/resolution/members.dart
+++ b/lib/compiler/implementation/resolution/members.dart
@@ -333,7 +333,8 @@
   TreeElements resolveField(VariableElement element) {
     Node tree = element.parseNode(compiler);
     if(element.modifiers.isStatic() && element.variables.isTopLevel()) {
-      error(element.modifiers.getStatic(), MessageKind.TOP_LEVEL_VARIABLE_DECLARED_STATIC);
+      error(element.modifiers.getStatic(),
+            MessageKind.TOP_LEVEL_VARIABLE_DECLARED_STATIC);
     }
     ResolverVisitor visitor = visitorFor(element);
     initializerDo(tree, visitor.visit);
@@ -1058,23 +1059,21 @@
   // flags instead of closures.
   // TODO(johnniwinther): Should never return [null] but instead an erroneous
   // type.
-  DartType resolveTypeAnnotation(TypeAnnotation node,
-                                 {Scope inScope, ClassElement inClass,
-                                 onFailure(Node, MessageKind, [List arguments]),
-                                 whenResolved(Node, Type)}) {
+  DartType resolveTypeAnnotation(
+      TypeAnnotation node,
+      Scope scope,
+      {onFailure(Node node, MessageKind kind, [List arguments]),
+       whenResolved(Node node, DartType type)}) {
     if (onFailure == null) {
       onFailure = (n, k, [arguments]) {};
     }
     if (whenResolved == null) {
       whenResolved = (n, t) {};
     }
-    if (inClass != null) {
-      inScope = inClass.buildScope();
-    }
-    if (inScope == null) {
+    if (scope == null) {
       compiler.internalError('resolveTypeAnnotation: no scope specified');
     }
-    return resolveTypeAnnotationInContext(inScope, node, onFailure,
+    return resolveTypeAnnotationInContext(scope, node, onFailure,
                                           whenResolved);
   }
 
@@ -1699,15 +1698,18 @@
     Selector selector = mapping.getSelector(node);
     if (selector == null) return;
 
-    // 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
-    // with the same arguments.
-    if (node.isCall &&
-        (Elements.isUnresolved(target) ||
-         target.isGetter() ||
-         Elements.isClosureSend(node, target))) {
-      Selector call = new Selector.callClosureFrom(selector);
-      world.registerDynamicInvocation(call.name, call);
+    if (node.isCall) {
+      if (Elements.isUnresolved(target) ||
+          target.isGetter() ||
+          Elements.isClosureSend(node, target)) {
+        // 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
+        // with the same arguments.
+        Selector call = new Selector.callClosureFrom(selector);
+        world.registerDynamicInvocation(call.name, call);
+      } else if (!selector.applies(target, compiler)) {
+        warnArgumentMismatch(node, target);
+      }
     }
 
     // TODO(ngeoffray): Warn if target is null and the send is
@@ -1717,6 +1719,13 @@
     return node.isPropertyAccess ? target : null;
   }
 
+  void warnArgumentMismatch(Send node, Element target) {
+    // TODO(karlklose): we can be more precise about the reason of the
+    // mismatch.
+    warning(node.argumentsNode, MessageKind.INVALID_ARGUMENTS,
+            [target.name]);
+  }
+
   visitSendSet(SendSet node) {
     Element target = resolveSend(node);
     Element setter = target;
@@ -1917,31 +1926,7 @@
    * [null], if there is no corresponding constructor, class or library.
    */
   FunctionElement resolveConstructor(NewExpression node) {
-    // Resolve the constructor that [node] refers to.
-    ConstructorResolver visitor =
-        new ConstructorResolver(compiler, this, node.isConst());
-    FunctionElement constructor = node.accept(visitor);
-    // Try to resolve the type that the new-expression constructs.
-    TypeAnnotation annotation = node.send.getTypeAnnotation();
-    if (Elements.isUnresolved(constructor)) {
-      // Resolve the type arguments. We cannot create a type and check the
-      // number of type arguments for this annotation, because we do not know
-      // the element.
-      Link arguments = const Link<Node>();
-      if (annotation.typeArguments != null) {
-        arguments = annotation.typeArguments.nodes;
-      }
-      for (Node argument in arguments) {
-        resolveTypeRequired(argument);
-      }
-    } else {
-      // Resolve and store the type this annotation resolves to. The type
-      // is used in the backend, e.g., for creating runtime type information.
-      // TODO(karlklose): This will resolve the class element again. Refactor
-      // so we can use the TypeResolver.
-      resolveTypeRequired(annotation);
-    }
-    return constructor;
+    return node.accept(new ConstructorResolver(compiler, this));
   }
 
   DartType resolveTypeRequired(TypeAnnotation node) {
@@ -1971,10 +1956,21 @@
   }
 
   DartType resolveTypeAnnotation(TypeAnnotation node) {
+    // TODO(johnniwinther): Remove this together with the named arguments
+    // on [TypeResolver.resolveTypeAnnotation].
+    void checkAndUseType(TypeAnnotation annotation, DartType type) {
+      useType(annotation, type);
+      if (type != null &&
+          identical(type.kind, TypeKind.TYPE_VARIABLE) &&
+          enclosingElement.isInStaticMember()) {
+        warning(annotation, MessageKind.TYPE_VARIABLE_WITHIN_STATIC_MEMBER,
+                [type]);
+      }
+    }
+
     Function report = typeRequired ? error : warning;
-    DartType type = typeResolver.resolveTypeAnnotation(node, inScope: scope,
-                                                       onFailure: report,
-                                                       whenResolved: useType);
+    DartType type = typeResolver.resolveTypeAnnotation(
+        node, scope, onFailure: report, whenResolved: checkAndUseType);
     if (type == null) return null;
     if (inCheckContext) {
       compiler.enqueuer.resolution.registerIsCheck(type);
@@ -2339,7 +2335,7 @@
       TypeVariableElement variableElement = typeVariable.element;
       if (typeNode.bound != null) {
         DartType boundType = typeResolver.resolveTypeAnnotation(
-            typeNode.bound, inScope: scope, onFailure: warning);
+            typeNode.bound, scope, onFailure: warning);
         if (boundType != null && boundType.element == variableElement) {
           // TODO(johnniwinther): Check for more general cycles, like
           // [: <A extends B, B extends C, C extends B> :].
@@ -2868,13 +2864,10 @@
 
 class ConstructorResolver extends CommonResolverVisitor<Element> {
   final ResolverVisitor resolver;
-  // TODO(ngeoffray): have this context at the call site.
-  final bool inConstContext;
+  bool inConstContext = false;
+  DartType type;
 
-  ConstructorResolver(Compiler compiler,
-                      this.resolver,
-                      this.inConstContext)
-      : super(compiler);
+  ConstructorResolver(Compiler compiler, this.resolver) : super(compiler);
 
   visitNode(Node node) {
     throw 'not supported';
@@ -2927,6 +2920,7 @@
   }
 
   visitNewExpression(NewExpression node) {
+    inConstContext = node.isConst();
     Node selector = node.send.selector;
     Element e = visit(selector);
     if (!Elements.isUnresolved(e) && identical(e.kind, ElementKind.CLASS)) {
@@ -2937,11 +2931,21 @@
       }
       e = lookupConstructor(cls, selector, const SourceString(''));
     }
+    if (type == null) {
+      if (Elements.isUnresolved(e)) {
+        type = compiler.dynamicClass.computeType(compiler);
+      } else {
+        type = e.getEnclosingClass().computeType(compiler).asRaw();
+      }
+    }
+    resolver.mapping.setType(node, type);
     return e;
   }
 
   visitTypeAnnotation(TypeAnnotation node) {
-    return visit(node.typeName);
+    assert(invariant(node, type == null));
+    type = resolver.resolveTypeRequired(node);
+    return resolver.mapping[node];
   }
 
   visitSend(Send node) {
diff --git a/lib/compiler/implementation/scanner/class_element_parser.dart b/lib/compiler/implementation/scanner/class_element_parser.dart
index 39e6d25..8e3c360 100644
--- a/lib/compiler/implementation/scanner/class_element_parser.dart
+++ b/lib/compiler/implementation/scanner/class_element_parser.dart
@@ -132,15 +132,14 @@
     addMember(memberElement);
   }
 
-  void endFactoryMethod(Token factoryKeyword, Token periodBeforeName,
-                        Token endToken) {
-    super.endFactoryMethod(factoryKeyword, periodBeforeName, endToken);
+  void endFactoryMethod(Token beginToken, Token endToken) {
+    super.endFactoryMethod(beginToken, endToken);
     FunctionExpression method = popNode();
     pushNode(null);
     SourceString name = getMethodNameHack(method.name);
     ElementKind kind = ElementKind.FUNCTION;
     Element memberElement =
-        new PartialFunctionElement(name, factoryKeyword, null, endToken,
+        new PartialFunctionElement(name, beginToken, null, endToken,
                                    kind, method.modifiers, enclosingElement);
     addMember(memberElement);
   }
diff --git a/lib/compiler/implementation/scanner/listener.dart b/lib/compiler/implementation/scanner/listener.dart
index 8d309ae..ae3453b 100644
--- a/lib/compiler/implementation/scanner/listener.dart
+++ b/lib/compiler/implementation/scanner/listener.dart
@@ -99,8 +99,7 @@
   void beginFactoryMethod(Token token) {
   }
 
-  void endFactoryMethod(Token startKeyword, Token periodBeforeName,
-                        Token endToken) {
+  void endFactoryMethod(Token beginToken, Token endToken) {
   }
 
   void beginFormalParameter(Token token) {
@@ -408,7 +407,7 @@
   void handleConditionalExpression(Token question, Token colon) {
   }
 
-  void handleConstExpression(Token token, bool named) {
+  void handleConstExpression(Token token) {
   }
 
   void handleFunctionTypedFormalParameter(Token token) {
@@ -474,7 +473,7 @@
   void handleNamedArgument(Token colon) {
   }
 
-  void handleNewExpression(Token token, bool named) {
+  void handleNewExpression(Token token) {
   }
 
   void handleNoArguments(Token token) {
@@ -1388,7 +1387,11 @@
   }
 
   void endFunctionBody(int count, Token beginToken, Token endToken) {
-    pushNode(new Block(makeNodeList(count, beginToken, endToken, null)));
+    if (count == 0 && beginToken == null) {
+      pushNode(new EmptyStatement(endToken));
+    } else {
+      pushNode(new Block(makeNodeList(count, beginToken, endToken, null)));
+    }
   }
 
   void handleNoFunctionBody(Token token) {
@@ -1570,19 +1573,15 @@
     pushNode(new Send(receiver, selector, arguments));
   }
 
-  void handleNewExpression(Token token, bool named) {
+  void handleNewExpression(Token token) {
     NodeList arguments = popNode();
     Node name = popNode();
-    if (named) {
-      TypeAnnotation type = popNode();
-      name = new Send(type, name);
-    }
     pushNode(new NewExpression(token, new Send(null, name, arguments)));
   }
 
-  void handleConstExpression(Token token, bool named) {
+  void handleConstExpression(Token token) {
     // [token] carries the 'const' information.
-    handleNewExpression(token, named);
+    handleNewExpression(token);
   }
 
   void handleOperatorName(Token operatorKeyword, Token token) {
@@ -1687,25 +1686,14 @@
     pushNode(new EmptyStatement(token));
   }
 
-  void endFactoryMethod(Token startKeyword, Token periodBeforeName,
-                        Token endToken) {
+  void endFactoryMethod(Token beginToken, Token endToken) {
     Statement body = popNode();
     NodeList formals = popNode();
-    // TODO(karlklose): don't throw type parameters away.
-    NodeList typeParameters;
-    Node name;
-    if (periodBeforeName != null) {
-      name = popNode();
-      typeParameters = popNode();
-      // A library prefix was handled in [handleQualified].
-      name = new Send(popNode(), name);
-    } else {
-      typeParameters = popNode();
-      name = popNode();
-    }
+    Node name = popNode();
+
     // TODO(ahe): Move this parsing to the parser.
     int modifierCount = 0;
-    Token modifier = startKeyword;
+    Token modifier = beginToken;
     if (modifier.stringValue == "external") {
       handleModifier(modifier);
       modifierCount++;
diff --git a/lib/compiler/implementation/scanner/parser.dart b/lib/compiler/implementation/scanner/parser.dart
index 5f3e99a..73e8c0a 100644
--- a/lib/compiler/implementation/scanner/parser.dart
+++ b/lib/compiler/implementation/scanner/parser.dart
@@ -977,21 +977,14 @@
     Token factoryKeyword = token;
     listener.beginFactoryMethod(factoryKeyword);
     token = token.next; // Skip 'factory'.
-    token = parseIdentifier(token);
-    token = parseQualifiedRestOpt(token);
-    token = parseTypeVariablesOpt(token);
-    Token period = null;
-    if (optional('.', token)) {
-      period = token;
-      token = parseIdentifier(token.next);
-    }
+    token = parseConstructorReference(token);
     token = parseFormalParameters(token);
     if (optional('=', token)) {
       token = parseRedirectingFactoryBody(token);
     } else {
       token = parseFunctionBody(token, false);
     }
-    listener.endFactoryMethod(start, period, token);
+    listener.endFactoryMethod(start, token);
     return token.next;
   }
 
@@ -1652,22 +1645,22 @@
     return false;
   }
 
-  Token parseNewExpression(Token token) {
-    Token newKeyword = token;
-    token = expect('new', token);
-    token = parseType(token);
-    bool named = false;
-    if (optional('.', token)) {
-      named = true;
-      token = parseIdentifier(token.next);
-    }
+  Token parseRequiredArguments(Token token) {
     if (optional('(', token)) {
       token = parseArguments(token);
     } else {
       listener.handleNoArguments(token);
       token = listener.unexpected(token);
     }
-    listener.handleNewExpression(newKeyword, named);
+    return token;
+  }
+
+  Token parseNewExpression(Token token) {
+    Token newKeyword = token;
+    token = expect('new', token);
+    token = parseConstructorReference(token);
+    token = parseRequiredArguments(token);
+    listener.handleNewExpression(newKeyword);
     return token;
   }
 
@@ -1681,15 +1674,9 @@
         (identical(value, '{'))) {
       return parseLiteralListOrMap(constKeyword);
     }
-    token = parseType(token);
-    bool named = false;
-    if (optional('.', token)) {
-      named = true;
-      token = parseIdentifier(token.next);
-    }
-    expect('(', token);
-    token = parseArguments(token);
-    listener.handleConstExpression(constKeyword, named);
+    token = parseConstructorReference(token);
+    token = parseRequiredArguments(token);
+    listener.handleConstExpression(constKeyword);
     return token;
   }
 
diff --git a/lib/compiler/implementation/ssa/bailout.dart b/lib/compiler/implementation/ssa/bailout.dart
index bd6223f..e6423cd 100644
--- a/lib/compiler/implementation/ssa/bailout.dart
+++ b/lib/compiler/implementation/ssa/bailout.dart
@@ -192,7 +192,7 @@
 
   void visitInstruction(HInstruction instruction) {
     HType speculativeType = types[instruction];
-    HType computedType = instruction.computeTypeFromInputTypes(types);
+    HType computedType = instruction.computeTypeFromInputTypes(types, compiler);
     // Currently the type in [types] is the speculative type each instruction
     // would like to have. We start by recomputing the type non-speculatively.
     // If we add a type guard then the guard will expose the speculative type.
diff --git a/lib/compiler/implementation/ssa/builder.dart b/lib/compiler/implementation/ssa/builder.dart
index 1ef011b..2dbd9a3 100644
--- a/lib/compiler/implementation/ssa/builder.dart
+++ b/lib/compiler/implementation/ssa/builder.dart
@@ -322,15 +322,21 @@
    * If the scope (function or loop) [node] has captured variables then this
    * method creates a box and sets up the redirections.
    */
-  void enterScope(Node node) {
+  void enterScope(Node node, Element element) {
     // See if any variable in the top-scope of the function is captured. If yes
     // we need to create a box-object.
     ClosureScope scopeData = closureData.capturingScopes[node];
     if (scopeData != null) {
-      // The scope has captured variables. Create a box.
-      // TODO(floitsch): Clean up this hack. Should we create a box-object by
-      // just creating an empty object literal?
-      HInstruction box = createBox();
+      HInstruction box;
+      // The scope has captured variables.
+      if (element != null && element.isGenerativeConstructorBody()) {
+        // The box is passed as a parameter to a generative
+        // constructor body.
+        box = new HParameterValue(scopeData.boxElement);
+        builder.add(box);
+      } else {
+        box = createBox();
+      }
       // Add the box to the known locals.
       directLocals[scopeData.boxElement] = box;
       // Make sure that accesses to the boxed locals go into the box. We also
@@ -398,7 +404,7 @@
       });
     }
 
-    enterScope(node);
+    enterScope(node, element);
 
     // If the freeVariableMapping is not empty, then this function was a
     // nested closure that captures variables. Redirect the captured
@@ -610,7 +616,7 @@
       // redirections already now. This way the initializer can write its
       // values into the box.
       // For other loops the box will be created when entering the body.
-      enterScope(node);
+      enterScope(node, null);
     }
   }
 
@@ -641,7 +647,7 @@
     // If there are no declared boxed loop variables then we did not create the
     // box before the initializer and we have to create the box now.
     if (!scopeData.hasBoxedLoopVariables()) {
-      enterScope(node);
+      enterScope(node, null);
     }
   }
 
@@ -867,7 +873,7 @@
   HGraph graph;
   LocalsHandler localsHandler;
   HInstruction rethrowableException;
-  Map<Element, HParameterValue> parameters;
+  Map<Element, HInstruction> parameters;
   final RuntimeTypeInformation rti;
 
   Map<TargetElement, JumpHandler> jumpTargets;
@@ -907,7 +913,7 @@
       stack = new List<HInstruction>(),
       activationVariables = new Map<Element, HLocalValue>(),
       jumpTargets = new Map<TargetElement, JumpHandler>(),
-      parameters = new Map<Element, HParameterValue>(),
+      parameters = new Map<Element, HInstruction>(),
       sourceElementStack = <Element>[work.element],
       inliningStack = <InliningState>[],
       rti = builder.compiler.codegenWorld.rti,
@@ -916,7 +922,7 @@
   }
 
   static const MAX_INLINING_DEPTH = 3;
-  static const MAX_INLINING_SOURCE_SIZE = 100;
+  static const MAX_INLINING_SOURCE_SIZE = 128;
   List<InliningState> inliningStack;
   Element returnElement = null;
 
@@ -970,10 +976,8 @@
     if (constructor is SynthesizedConstructorElement) return null;
     FunctionExpression node = constructor.parseNode(compiler);
     // If we know the body doesn't have any code, we don't generate it.
-    if (node.body.asBlock() != null) {
-      NodeList statements = node.body.asBlock().statements;
-      if (statements.isEmpty) return null;
-    }
+    if (!node.hasBody()) return null;
+    if (node.hasEmptyBody()) return null;
     ClassElement classElement = constructor.getEnclosingClass();
     ConstructorBodyElement bodyElement;
     for (Link<Element> backendMembers = classElement.backendMembers;
@@ -1153,6 +1157,10 @@
       FunctionSignature params = constructor.computeSignature(compiler);
       params.orderedForEachParameter((Element parameter) {
         HInstruction argument = compiledArguments[index++];
+        // Because we are inlining the initializer, we must update
+        // what was given as parameter. This will be used in case
+        // there is a parameter check expression in the initializer.
+        parameters[parameter] = argument;
         localsHandler.updateLocal(parameter, argument);
         // Don't forget to update the field, if the parameter is of the
         // form [:this.x:].
@@ -1166,7 +1174,21 @@
       TreeElements oldElements = elements;
       elements =
           compiler.enqueuer.resolution.getCachedElements(constructor);
+
+      ClosureClassMap oldClosureData = localsHandler.closureData;
+      Node node = constructor.parseNode(compiler);
+      localsHandler.closureData =
+          compiler.closureToClassMapper.computeClosureToClassMapping(
+              constructor, node, elements);
+
+      params.orderedForEachParameter((Element parameterElement) {
+        if (elements.isParameterChecked(parameterElement)) {
+          addParameterCheckInstruction(parameterElement);
+        }
+      });
+      localsHandler.enterScope(node, constructor);
       buildInitializers(constructor, constructors, fieldValues);
+      localsHandler.closureData = oldClosureData;
       elements = oldElements;
     });
   }
@@ -1354,8 +1376,36 @@
       FunctionSignature functionSignature = body.computeSignature(compiler);
       int arity = functionSignature.parameterCount;
       functionSignature.orderedForEachParameter((parameter) {
+        // TODO(ngeoffray): No need to pass the parameters that are
+        // captured and stored in a box. Because this information is
+        // not trivial to get in codegen.dart, we just pass the
+        // parameters anyway. We need to update both codegen.dart and
+        // builder.dart on how parameters are being passed.
         bodyCallInputs.add(localsHandler.readLocal(parameter));
       });
+
+      // If parameters are checked, we pass the already computed
+      // boolean to the constructor body.
+      TreeElements elements =
+          compiler.enqueuer.resolution.getCachedElements(constructor);
+      Node node = constructor.parseNode(compiler);
+      ClosureClassMap parameterClosureData =
+          compiler.closureToClassMapper.getMappingForNestedFunction(node);
+      functionSignature.orderedForEachParameter((parameter) {
+        if (elements.isParameterChecked(parameter)) {
+          Element fieldCheck =
+              parameterClosureData.parametersWithSentinel[parameter];
+          bodyCallInputs.add(localsHandler.readLocal(fieldCheck));
+        }
+      });
+
+      // If there are locals that escape (ie used in closures), we
+      // pass the box to the constructor.
+      ClosureScope scopeData = parameterClosureData.capturingScopes[node];
+      if (scopeData != null) {
+        bodyCallInputs.add(localsHandler.readLocal(scopeData.boxElement));
+      }
+
       // TODO(ahe): The constructor name is statically resolved. See
       // SsaCodeGenerator.visitInvokeDynamicMethod. Is there a cleaner
       // way to do this?
@@ -1376,48 +1426,56 @@
   }
 
   void addParameterCheckInstruction(Element element) {
-    // This is the code we emit for a parameter that is being checked
-    // on whether it was given at value at the call site:
-    //
-    // foo([a = 42) {
-    //   if (?a) print('parameter passed $a');
-    // }
-    //
-    // foo([a = 42]) {
-    //   var t1 = a === sentinel;
-    //   if (t1) a = 42;
-    //   if (!t1) print('parameter passed ' + a);
-    // }
+    HInstruction check;
+    Element checkResultElement =
+        localsHandler.closureData.parametersWithSentinel[element];
+    if (currentElement.isGenerativeConstructorBody()) {
+      // A generative constructor body receives extra parameters that
+      // indicate if a parameter was passed to the factory.
+      check = new HParameterValue(checkResultElement);
+      add(check);
+    } else {
+      // This is the code we emit for a parameter that is being checked
+      // on whether it was given at value at the call site:
+      //
+      // foo([a = 42) {
+      //   if (?a) print('parameter passed $a');
+      // }
+      //
+      // foo([a = 42]) {
+      //   var t1 = a === sentinel;
+      //   if (t1) a = 42;
+      //   if (!t1) print('parameter passed ' + a);
+      // }
 
-    // Fetch the original default value of [element];
-    ConstantHandler handler = compiler.constantHandler;
-    Constant constant = handler.compileVariable(element);
-    HConstant defaultValue = constant == null
-        ? graph.addConstantNull(constantSystem)
-        : graph.addConstant(constant);
+      // Fetch the original default value of [element];
+      ConstantHandler handler = compiler.constantHandler;
+      Constant constant = handler.compileVariable(element);
+      HConstant defaultValue = constant == null
+          ? graph.addConstantNull(constantSystem)
+          : graph.addConstant(constant);
 
-    // Emit the equality check with the sentinel.
-    HConstant sentinel = graph.addConstant(SentinelConstant.SENTINEL);
-    Element equalsHelper = interceptors.getTripleEqualsInterceptor();
-    HInstruction target = new HStatic(equalsHelper);
-    add(target);
-    HInstruction operand = parameters[element];
-    HInstruction check = new HIdentity(target, sentinel, operand);
-    add(check);
+      // Emit the equality check with the sentinel.
+      HConstant sentinel = graph.addConstant(SentinelConstant.SENTINEL);
+      Element equalsHelper = interceptors.getTripleEqualsInterceptor();
+      HInstruction target = new HStatic(equalsHelper);
+      add(target);
+      HInstruction operand = parameters[element];
+      check = new HIdentity(target, sentinel, operand);
+      add(check);
 
-    // If the check succeeds, we must update the parameter with the
-    // default value.
-    handleIf(element.parseNode(compiler),
-             () => stack.add(check),
-             () => localsHandler.updateLocal(element, defaultValue),
-             null);
+      // If the check succeeds, we must update the parameter with the
+      // default value.
+      handleIf(element.parseNode(compiler),
+               () => stack.add(check),
+               () => localsHandler.updateLocal(element, defaultValue),
+               null);
 
-    // Create the instruction that parameter checks will use.
-    check = new HNot(check);
-    add(check);
+      // Create the instruction that parameter checks will use.
+      check = new HNot(check);
+      add(check);
+    }
 
-    ClosureClassMap closureData = localsHandler.closureData;
-    Element checkResultElement = closureData.parametersWithSentinel[element];
     localsHandler.updateLocal(checkResultElement, check);
   }
 
@@ -2300,6 +2358,15 @@
     push(result);
   }
 
+  void pushInvokeHelper4(Element helper, HInstruction a0, HInstruction a1,
+                         HInstruction a2, HInstruction a3) {
+    HInstruction reference = new HStatic(helper);
+    add(reference);
+    List<HInstruction> inputs = <HInstruction>[reference, a0, a1, a2, a3];
+    HInstruction result = new HInvokeStatic(inputs);
+    push(result);
+  }
+
   visitOperatorSend(node) {
     assert(node.selector is Operator);
     if (!methodInterceptionEnabled) {
@@ -2500,6 +2567,12 @@
 
     addDynamicSendArgumentsToList(node, inputs);
 
+    Element element = elements[node];
+    if (element != null && compiler.world.hasNoOverridingMember(element)) {
+      if (tryInlineMethod(element, selector, node.arguments)) {
+        return;
+      }
+    }
     // The first entry in the inputs list is the receiver.
     pushWithPosition(new HInvokeDynamicMethod(selector, inputs), node);
 
@@ -2733,15 +2806,14 @@
     } else if (element.isFunction() || element.isGenerativeConstructor()) {
       // TODO(5347): Try to avoid the need for calling [implementation] before
       // calling [addStaticSendArgumentsToList].
+      FunctionElement function = element.implementation;
       bool succeeded = addStaticSendArgumentsToList(selector, node.arguments,
-                                                    element.implementation,
-                                                    inputs);
+                                                    function, inputs);
       if (!succeeded) {
-        // TODO(ngeoffray): Match the VM behavior and throw an
-        // exception at runtime.
-        compiler.cancel('Unimplemented non-matching static call', node: node);
+        generateWrongArgumentCountError(node, element, node.arguments);
+      } else {
+        push(new HInvokeSuper(inputs));
       }
-      push(new HInvokeSuper(inputs));
     } else {
       target = new HInvokeSuper(inputs);
       add(target);
@@ -2902,7 +2974,7 @@
         <HInstruction>[typeInfoSetter, newObject, runtimeInfo]));
   }
 
-  visitNewSend(Send node) {
+  visitNewSend(Send node, InterfaceType type) {
     bool isListConstructor = false;
     computeType(element) {
       Element originalElement = elements[node];
@@ -2940,16 +3012,10 @@
                                                   constructor.implementation,
                                                   inputs);
     if (!succeeded) {
-      // TODO(ngeoffray): Match the VM behavior and throw an
-      // exception at runtime.
-      compiler.cancel('Unimplemented non-matching static call', node: node);
+      generateWrongArgumentCountError(node, constructor, node.arguments);
+      return;
     }
 
-    TypeAnnotation annotation = node.getTypeAnnotation();
-    if (annotation == null) {
-      compiler.internalError("malformed send in new expression");
-    }
-    InterfaceType type = elements.getType(annotation);
     if (type.element.modifiers.isAbstract() &&
         constructor.isGenerativeConstructor()) {
       generateAbstractClassInstantiationError(node, type.name.slowToString());
@@ -2983,7 +3049,8 @@
                                 argumentNodes: node.arguments);
       return;
     }
-    if (identical(element, compiler.assertMethod) && !compiler.enableUserAssertions) {
+    if (identical(element, compiler.assertMethod)
+        && !compiler.enableUserAssertions) {
       stack.add(graph.addConstantNull(constantSystem));
       return;
     }
@@ -3002,9 +3069,8 @@
                                                     element.implementation,
                                                     inputs);
       if (!succeeded) {
-        // TODO(ngeoffray): Match the VM behavior and throw an
-        // exception at runtime.
-        compiler.cancel('Unimplemented non-matching static call', node: node);
+        generateWrongArgumentCountError(node, element, node.arguments);
+        return;
       }
 
       // TODO(kasperl): Try to use the general inlining infrastructure for
@@ -3060,7 +3126,8 @@
   void generateThrowNoSuchMethod(Node diagnosticNode,
                                  String methodName,
                                  {Link<Node> argumentNodes,
-                                  List<HInstruction> argumentValues}) {
+                                  List<HInstruction> argumentValues,
+                                  List<String> existingArguments}) {
     Element helper =
         compiler.findHelper(const SourceString('throwNoSuchMethod'));
     Constant receiverConstant =
@@ -3080,7 +3147,40 @@
     }
     HInstruction arguments = new HLiteralList(argumentValues);
     add(arguments);
-    pushInvokeHelper3(helper, receiver, name, arguments);
+    HInstruction existingNamesList;
+    if (existingArguments != null) {
+      List<HInstruction> existingNames = <HInstruction>[];
+      for (String name in existingArguments) {
+        HInstruction nameConstant =
+            graph.addConstantString(new DartString.literal(name),
+                                    diagnosticNode, constantSystem);
+        existingNames.add(nameConstant);
+      }
+      existingNamesList = new HLiteralList(existingNames);
+      add(existingNamesList);
+    } else {
+      existingNamesList = graph.addConstantNull(constantSystem);
+    }
+    pushInvokeHelper4(helper, receiver, name, arguments, existingNamesList);
+  }
+
+  /**
+   * Generate code to throw a [NoSuchMethodError] exception for calling a
+   * method with a wrong number of arguments or mismatching named optional
+   * arguments.
+   */
+  void generateWrongArgumentCountError(Node diagnosticNode,
+                                       FunctionElement function,
+                                       Link<Node> argumentNodes) {
+    List<String> existingArguments = <String>[];
+    FunctionSignature signature = function.computeSignature(compiler);
+    signature.forEachParameter((Element parameter) {
+      existingArguments.add(parameter.name.slowToString());
+    });
+    generateThrowNoSuchMethod(diagnosticNode,
+                              function.name.slowToString(),
+                              argumentNodes: argumentNodes,
+                              existingArguments: existingArguments);
   }
 
   visitNewExpression(NewExpression node) {
@@ -3104,7 +3204,7 @@
       Constant constant = handler.compileNodeWithDefinitions(node, elements);
       stack.add(graph.addConstant(constant));
     } else {
-      visitNewSend(node.send);
+      visitNewSend(node.send, elements.getType(node));
     }
   }
 
diff --git a/lib/compiler/implementation/ssa/codegen.dart b/lib/compiler/implementation/ssa/codegen.dart
index fdf877a..2bf0d51 100644
--- a/lib/compiler/implementation/ssa/codegen.dart
+++ b/lib/compiler/implementation/ssa/codegen.dart
@@ -86,7 +86,7 @@
       parameterNames.forEach((element, name) {
         parameters.add(new js.Parameter(name));
       });
-      addTypeParameters(work.element, parameters, parameterNames);
+      addBackendParameters(work.element, parameters, parameterNames);
       String parametersString = Strings.join(parameterNames.values, ", ");
       SsaOptimizedCodeGenerator codegen = new SsaOptimizedCodeGenerator(
           backend, work, parameters, parameterNames);
@@ -117,23 +117,54 @@
     });
   }
 
-  void addTypeParameters(Element element,
-                         List<js.Parameter> parameters,
-                         Map<Element, String> parameterNames) {
-    if (!element.isConstructor()) return;
-    ClassElement cls = element.enclosingElement;
-    if (!compiler.world.needsRti(cls)) return;
-    cls.typeVariables.forEach((TypeVariableType typeVariable) {
-      String name = typeVariable.element.name.slowToString();
-      String prefix = '';
-      // Avoid collisions with real parameters of the method.
-      do {
-        name = JsNames.getValid('$prefix$name');
-        prefix = '\$$prefix';
-      } while (parameterNames.containsValue(name));
-      parameterNames[typeVariable.element] = name;
-      parameters.add(new js.Parameter(name));
-    });
+  void addBackendParameter(Element element,
+                           List<js.Parameter> parameters,
+                           Map<Element, String> parameterNames) {
+    String name = element.name.slowToString();
+    String prefix = '';
+    // Avoid collisions with real parameters of the method.
+    do {
+      name = JsNames.getValid('$prefix$name');
+      prefix = '\$$prefix';
+    } while (parameterNames.containsValue(name));
+    parameterNames[element] = name;
+    parameters.add(new js.Parameter(name));
+  }
+
+  void addBackendParameters(Element element,
+                            List<js.Parameter> parameters,
+                            Map<Element, String> parameterNames) {
+    // TODO(ngeoffray): We should infer this information from the
+    // graph, instead of recomputing what the builder did.
+    if (element.isConstructor()) {
+      // Put the type parameters.
+      ClassElement cls = element.enclosingElement;
+      if (!compiler.world.needsRti(cls)) return;
+      cls.typeVariables.forEach((TypeVariableType typeVariable) {
+        addBackendParameter(typeVariable.element, parameters, parameterNames);
+      });
+    } else if (element.isGenerativeConstructorBody()) {
+      // Put the parameter checks parameters.
+      Node node = element.implementation.parseNode(compiler);
+      ClosureClassMap closureData =
+          compiler.closureToClassMapper.getMappingForNestedFunction(node);
+      FunctionElement functionElement = element;
+      FunctionSignature params = functionElement.computeSignature(compiler);
+      TreeElements elements =
+          compiler.enqueuer.resolution.getCachedElements(element);
+      params.orderedForEachParameter((Element element) {
+        if (elements.isParameterChecked(element)) {
+          Element checkResultElement =
+              closureData.parametersWithSentinel[element];
+          addBackendParameter(checkResultElement, parameters, parameterNames);
+        }
+      });
+      // Put the box parameter.
+      ClosureScope scopeData = closureData.capturingScopes[node];
+      if (scopeData != null) {
+        addBackendParameter(scopeData.boxElement, parameters, parameterNames);
+      }
+    }
   }
 
   CodeBuffer generateBailoutMethod(WorkItem work, HGraph graph) {
@@ -145,7 +176,7 @@
       parameterNames.forEach((element, name) {
         parameters.add(new js.Parameter(name));
       });
-      addTypeParameters(work.element, parameters, parameterNames);
+      addBackendParameters(work.element, parameters, parameterNames);
 
       SsaUnoptimizedCodeGenerator codegen = new SsaUnoptimizedCodeGenerator(
           backend, work, parameters, parameterNames);
@@ -896,7 +927,7 @@
             jsCondition = generateExpression(condition);
             currentContainer = body;
           } else {
-            jsCondition = new js.LiteralBool(true);
+            jsCondition = newLiteralBool(true);
             currentContainer = body;
             generateStatements(condition);
             use(condition.conditionExpression);
@@ -1310,7 +1341,7 @@
   visitBoolify(HBoolify node) {
     assert(node.inputs.length == 1);
     use(node.inputs[0]);
-    push(new js.Binary('===', pop(), new js.LiteralBool(true)), node);
+    push(new js.Binary('===', pop(), newLiteralBool(true)), node);
   }
 
   visitExit(HExit node) {
@@ -1515,6 +1546,12 @@
                                    Selector defaultSelector) {
     // TODO(4434): For private members we need to use the untyped selector.
     if (defaultSelector.name.isPrivate()) return defaultSelector;
+    // 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) {
+      return defaultSelector;
+    }
     HType receiverHType = types[node.inputs[0]];
     DartType receiverType = receiverHType.computeType(compiler);
     if (receiverType != null) {
@@ -1635,7 +1672,9 @@
   // involving only things with guaranteed number types and a given
   // field.
   bool isSimpleFieldNumberComputation(HInstruction value, HFieldSet node) {
-    if (value.guaranteedType.union(HType.NUMBER) == HType.NUMBER) return true;
+    if (value.guaranteedType.union(HType.NUMBER, compiler) == HType.NUMBER) {
+      return true;
+    }
     if (value is HBinaryArithmetic) {
       return (isSimpleFieldNumberComputation(value.left, node) &&
               isSimpleFieldNumberComputation(value.right, node));
@@ -1706,12 +1745,21 @@
     push(new js.New(new js.VariableUse(jsClassReference), arguments), node);
   }
 
+  js.Expression newLiteralBool(bool value) {
+    if (compiler.enableMinification) {
+      // Use !0 for true, !1 for false.
+      return new js.Prefix("!", new js.LiteralNumber(value ? "0" : "1"));
+    } else {
+      return new js.LiteralBool(value);
+    }
+  }
+
   void generateConstant(Constant constant) {
     Namer namer = backend.namer;
     // TODO(floitsch): should we use the ConstantVisitor here?
     if (!constant.isObject()) {
       if (constant.isBool()) {
-        push(new js.LiteralBool((constant as BoolConstant).value));
+        push(newLiteralBool(constant.value));
       } else if (constant.isNum()) {
         // TODO(floitsch): get rid of the code buffer.
         CodeBuffer buffer = new CodeBuffer();
@@ -1810,7 +1858,7 @@
 
     if (input is HBoolify && isGenerateAtUseSite(input)) {
       use(input.inputs[0]);
-      push(new js.Binary("!==", pop(), new js.LiteralBool(true)), input);
+      push(new js.Binary("!==", pop(), newLiteralBool(true)), input);
     } else if (canGenerateOptimizedComparison(input) &&
                isGenerateAtUseSite(input)) {
       Map<String, String> inverseOperator = const <String, String>{
@@ -2307,9 +2355,11 @@
     world.registerIsCheck(type);
     Element element = type.element;
     if (identical(element.kind, ElementKind.TYPE_VARIABLE)) {
-      compiler.unimplemented("visitIs for type variables", instruction: node);
+      compiler.unimplemented("visitIs for type variables",
+                             instruction: node.expression);
     } else if (identical(element.kind, ElementKind.TYPEDEF)) {
-      compiler.unimplemented("visitIs for typedefs", instruction: node);
+      compiler.unimplemented("visitIs for typedefs",
+                             instruction: node.expression);
     }
     LibraryElement coreLibrary = compiler.coreLibrary;
     ClassElement objectClass = compiler.objectClass;
@@ -2318,7 +2368,7 @@
     if (identical(element, objectClass) || identical(element, compiler.dynamicClass)) {
       // The constant folder also does this optimization, but we make
       // it safe by assuming it may have not run.
-      push(new js.LiteralBool(true), node);
+      push(newLiteralBool(true), node);
     } else if (element == compiler.stringClass) {
       checkString(input, '===');
       attachLocationToLast(node);
@@ -2634,7 +2684,7 @@
     js.Statement body = currentContainer;
     currentContainer = oldContainerStack.removeLast();
     body = unwrapStatement(body);
-    js.While loop = new js.While(new js.LiteralBool(true), body);
+    js.While loop = new js.While(newLiteralBool(true), body);
 
     HLoopInformation info = block.loopInformation;
     attachLocationRange(loop,
@@ -2895,7 +2945,7 @@
     js.Statement body = unwrapStatement(currentContainer);
     currentContainer = oldContainerStack.removeLast();
 
-    js.Statement result = new js.While(new js.LiteralBool(true), body);
+    js.Statement result = new js.While(newLiteralBool(true), body);
     attachLocationRange(result,
                         info.loopBlockInformation.sourcePosition,
                         info.loopBlockInformation.endSourcePosition);
diff --git a/lib/compiler/implementation/ssa/nodes.dart b/lib/compiler/implementation/ssa/nodes.dart
index 78e8e74..5e416d1 100644
--- a/lib/compiler/implementation/ssa/nodes.dart
+++ b/lib/compiler/implementation/ssa/nodes.dart
@@ -899,7 +899,7 @@
    * the incoming type is already set to integer, the likely type might still
    * just return the number type.
    */
-  HType computeLikelyType(HTypeMap types) => types[this];
+  HType computeLikelyType(HTypeMap types, Compiler compiler) => types[this];
 
   /**
    * Compute the type of the instruction by propagating the input types through
@@ -907,7 +907,9 @@
    *
    * By default just copy the guaranteed type.
    */
-  HType computeTypeFromInputTypes(HTypeMap types) => guaranteedType;
+  HType computeTypeFromInputTypes(HTypeMap types, Compiler compiler) {
+    return guaranteedType;
+  }
 
   /**
    * Compute the desired type for the the given [input]. Aside from using
@@ -915,7 +917,9 @@
    * the given [types] which, during the invocation of this method,
    * represents the desired type of [this].
    */
-  HType computeDesiredTypeForInput(HInstruction input, HTypeMap types) {
+  HType computeDesiredTypeForInput(HInstruction input,
+                                   HTypeMap types,
+                                   Compiler compiler) {
     return HType.UNKNOWN;
   }
 
@@ -1209,7 +1213,7 @@
   HBailoutTarget get bailoutTarget => inputs[1];
   int get state => bailoutTarget.state;
 
-  HType computeTypeFromInputTypes(HTypeMap types) {
+  HType computeTypeFromInputTypes(HTypeMap types, Compiler compiler) {
     return isEnabled ? guardedType : types[guarded];
   }
 
@@ -1261,12 +1265,14 @@
 
   HType get guaranteedType => HType.INTEGER;
 
-  HType computeDesiredTypeForInput(HInstruction input, HTypeMap types) {
+  HType computeDesiredTypeForInput(HInstruction input,
+                                   HTypeMap types,
+                                   Compiler compiler) {
     // If the desired type of the input is already a number, we want
     // to specialize it to an integer.
     return input.isNumber(types)
       ? HType.INTEGER
-      : super.computeDesiredTypeForInput(input, types);
+      : super.computeDesiredTypeForInput(input, types, compiler);
   }
 
   accept(HVisitor visitor) => visitor.visitIntegerCheck(this);
@@ -1394,14 +1400,17 @@
   Element get element => target.element;
   HStatic get target => inputs[0];
 
-  HType computeDesiredTypeForInput(HInstruction input, HTypeMap types) {
+  HType computeDesiredTypeForInput(HInstruction input,
+                                   HTypeMap types,
+                                   Compiler compiler) {
     // TODO(floitsch): we want the target to be a function.
     if (input == target) return HType.UNKNOWN;
-    return computeDesiredTypeForNonTargetInput(input, types);
+    return computeDesiredTypeForNonTargetInput(input, types, compiler);
   }
 
   HType computeDesiredTypeForNonTargetInput(HInstruction input,
-                                            HTypeMap types) {
+                                            HTypeMap types,
+                                            Compiler compiler) {
     return HType.UNKNOWN;
   }
 }
@@ -1447,19 +1456,20 @@
     return isLengthGetter() && inputs[1].isIndexablePrimitive(types);
   }
 
-  HType computeLikelyType(HTypeMap types) {
+  HType computeLikelyType(HTypeMap types, Compiler compiler) {
     // In general a length getter or method returns an int.
     if (isLengthGetter()) return HType.INTEGER;
     return HType.UNKNOWN;
   }
 
-  HType computeTypeFromInputTypes(HTypeMap types) {
+  HType computeTypeFromInputTypes(HTypeMap types, Compiler compiler) {
     if (isLengthGetterOnStringOrArray(types)) return HType.INTEGER;
     return HType.UNKNOWN;
   }
 
   HType computeDesiredTypeForNonTargetInput(HInstruction input,
-                                            HTypeMap types) {
+                                            HTypeMap types,
+                                            Compiler compiler) {
     // If the first argument is a string or an array and we invoke methods
     // on it that mutate it, then we want to restrict the incoming type to be
     // a mutable array.
@@ -1639,7 +1649,7 @@
   bool isBuiltin(HTypeMap types)
       => left.isNumber(types) && right.isNumber(types);
 
-  HType computeTypeFromInputTypes(HTypeMap types) {
+  HType computeTypeFromInputTypes(HTypeMap types, Compiler compiler) {
     if (left.isInteger(types) && right.isInteger(types)) return HType.INTEGER;
     if (left.isNumber(types)) {
       if (left.isDouble(types) || right.isDouble(types)) return HType.DOUBLE;
@@ -1649,7 +1659,8 @@
   }
 
   HType computeDesiredTypeForNonTargetInput(HInstruction input,
-                                            HTypeMap types) {
+                                            HTypeMap types,
+                                            Compiler compiler) {
     HType propagatedType = types[this];
     // If the desired output type should be an integer we want to get two
     // integers as arguments.
@@ -1671,7 +1682,7 @@
     return HType.UNKNOWN;
   }
 
-  HType computeLikelyType(HTypeMap types) {
+  HType computeLikelyType(HTypeMap types, Compiler compiler) {
     if (left.isTypeUnknown(types)) return HType.NUMBER;
     return HType.UNKNOWN;
   }
@@ -1696,16 +1707,17 @@
       : super(target, left, right);
   accept(HVisitor visitor) => visitor.visitDivide(this);
 
-  HType computeTypeFromInputTypes(HTypeMap types) {
+  HType computeTypeFromInputTypes(HTypeMap types, Compiler compiler) {
     if (left.isNumber(types)) return HType.DOUBLE;
     return HType.UNKNOWN;
   }
 
   HType computeDesiredTypeForNonTargetInput(HInstruction input,
-                                            HTypeMap types) {
+                                            HTypeMap types,
+                                            Compiler compiler) {
     // A division can never return an integer. So don't ask for integer inputs.
     if (isInteger(types)) return HType.UNKNOWN;
-    return super.computeDesiredTypeForNonTargetInput(input, types);
+    return super.computeDesiredTypeForNonTargetInput(input, types, compiler);
   }
 
   BinaryOperation operation(ConstantSystem constantSystem)
@@ -1793,7 +1805,7 @@
   HBinaryBitOp(HStatic target, HInstruction left, HInstruction right)
       : super(target, left, right);
 
-  HType computeTypeFromInputTypes(HTypeMap types) {
+  HType computeTypeFromInputTypes(HTypeMap types, Compiler compiler) {
     // All bitwise operations on primitive types either produce an
     // integer or throw an error.
     if (left.isPrimitive(types)) return HType.INTEGER;
@@ -1801,7 +1813,8 @@
   }
 
   HType computeDesiredTypeForNonTargetInput(HInstruction input,
-                                            HTypeMap types) {
+                                            HTypeMap types,
+                                            Compiler compiler) {
     HType propagatedType = types[this];
     // If the outgoing type should be a number we can get that only if both
     // inputs are integers. If we don't know the outgoing type we try to make
@@ -1812,7 +1825,7 @@
     return HType.UNKNOWN;
   }
 
-  HType computeLikelyType(HTypeMap types) {
+  HType computeLikelyType(HTypeMap types, Compiler compiler) {
     if (left.isTypeUnknown(types)) return HType.INTEGER;
     return HType.UNKNOWN;
   }
@@ -1914,14 +1927,15 @@
 
   bool isBuiltin(HTypeMap types) => operand.isNumber(types);
 
-  HType computeTypeFromInputTypes(HTypeMap types) {
+  HType computeTypeFromInputTypes(HTypeMap types, Compiler compiler) {
     HType operandType = types[operand];
     if (operandType.isNumber()) return operandType;
     return HType.UNKNOWN;
   }
 
   HType computeDesiredTypeForNonTargetInput(HInstruction input,
-                                            HTypeMap types) {
+                                            HTypeMap types,
+                                            Compiler compiler) {
     HType propagatedType = types[this];
     // If the outgoing type should be a number (integer, double or both) we
     // want the outgoing type to be the input too.
@@ -1931,7 +1945,7 @@
     return HType.UNKNOWN;
   }
 
-  HType computeLikelyType(HTypeMap types) => HType.NUMBER;
+  HType computeLikelyType(HTypeMap types, Compiler compiler) => HType.NUMBER;
 
   abstract UnaryOperation operation(ConstantSystem constantSystem);
 }
@@ -1951,7 +1965,7 @@
   HBitNot(HStatic target, HInstruction input) : super(target, input);
   accept(HVisitor visitor) => visitor.visitBitNot(this);
 
-  HType computeTypeFromInputTypes(HTypeMap types) {
+  HType computeTypeFromInputTypes(HTypeMap types, Compiler compiler) {
     // All bitwise operations on primitive types either produce an
     // integer or throw an error.
     if (operand.isPrimitive(types)) return HType.INTEGER;
@@ -1959,7 +1973,8 @@
   }
 
   HType computeDesiredTypeForNonTargetInput(HInstruction input,
-                                            HTypeMap types) {
+                                            HTypeMap types,
+                                            Compiler compiler) {
     HType propagatedType = types[this];
     // Bit operations only work on integers. If there is no desired output
     // type or if it as a number we want to get an integer as input.
@@ -2095,7 +2110,9 @@
   HType get guaranteedType => HType.BOOLEAN;
 
   // 'Not' only works on booleans. That's what we want as input.
-  HType computeDesiredTypeForInput(HInstruction input, HTypeMap types) {
+  HType computeDesiredTypeForInput(HInstruction input,
+                                   HTypeMap types,
+                                   Compiler compiler) {
     return HType.BOOLEAN;
   }
 
@@ -2167,7 +2184,9 @@
   // have the same known type return it. If any two inputs have
   // different known types, we'll return a conflict -- otherwise we'll
   // simply return an unknown type.
-  HType computeInputsType(bool ignoreUnknowns, HTypeMap types) {
+  HType computeInputsType(bool ignoreUnknowns,
+                          HTypeMap types,
+                          Compiler compiler) {
     HType candidateType = HType.CONFLICTING;
     for (int i = 0, length = inputs.length; i < length; i++) {
       HType inputType = types[inputs[i]];
@@ -2176,24 +2195,26 @@
       // For example, if one incoming edge has type integer and the other has
       // type double, then the phi is either an integer or double and thus has
       // type number.
-      candidateType = candidateType.union(inputType);
+      candidateType = candidateType.union(inputType, compiler);
       if (candidateType.isUnknown()) return HType.UNKNOWN;
     }
     return candidateType;
   }
 
-  HType computeTypeFromInputTypes(HTypeMap types) {
-    HType inputsType = computeInputsType(false, types);
+  HType computeTypeFromInputTypes(HTypeMap types, Compiler compiler) {
+    HType inputsType = computeInputsType(false, types, compiler);
     if (inputsType.isConflicting()) return HType.UNKNOWN;
     return inputsType;
   }
 
-  HType computeDesiredTypeForInput(HInstruction input, HTypeMap types) {
+  HType computeDesiredTypeForInput(HInstruction input,
+                                   HTypeMap types,
+                                   Compiler compiler) {
     HType propagatedType = types[this];
     // Best case scenario for a phi is, when all inputs have the same type. If
     // there is no desired outgoing type we therefore try to unify the input
     // types (which is basically the [likelyType]).
-    if (propagatedType.isUnknown()) return computeLikelyType(types);
+    if (propagatedType.isUnknown()) return computeLikelyType(types, compiler);
     // When the desired outgoing type is conflicting we don't need to give any
     // requirements on the inputs.
     if (propagatedType.isConflicting()) return HType.UNKNOWN;
@@ -2201,8 +2222,8 @@
     return propagatedType;
   }
 
-  HType computeLikelyType(HTypeMap types) {
-    HType agreedType = computeInputsType(true, types);
+  HType computeLikelyType(HTypeMap types, Compiler compiler) {
+    HType agreedType = computeInputsType(true, types, compiler);
     if (agreedType.isConflicting()) return HType.UNKNOWN;
     // Don't be too restrictive. If the agreed type is integer or double just
     // say that the likely type is number. If more is expected the type will be
@@ -2241,7 +2262,7 @@
     }
   }
 
-  HType computeTypeFromInputTypes(HTypeMap types) {
+  HType computeTypeFromInputTypes(HTypeMap types, Compiler compiler) {
     if (left.isNumber(types) || usesBoolifiedInterceptor) return HType.BOOLEAN;
     return HType.UNKNOWN;
   }
@@ -2252,7 +2273,8 @@
   }
 
   HType computeDesiredTypeForNonTargetInput(HInstruction input,
-                                            HTypeMap types) {
+                                            HTypeMap types,
+                                            Compiler compiler) {
     HType propagatedType = types[this];
     // For all relational operations exept HEquals, we expect to get numbers
     // only. With numbers the outgoing type is a boolean. If something else
@@ -2265,7 +2287,7 @@
     return HType.UNKNOWN;
   }
 
-  HType computeLikelyType(HTypeMap types) => HType.BOOLEAN;
+  HType computeLikelyType(HTypeMap types, Compiler compiler) => HType.BOOLEAN;
 
   bool isBuiltin(HTypeMap types)
       => left.isNumber(types) && right.isNumber(types);
@@ -2285,13 +2307,14 @@
     return types[left].isPrimitiveOrNull() || right.isConstantNull();
   }
 
-  HType computeTypeFromInputTypes(HTypeMap types) {
+  HType computeTypeFromInputTypes(HTypeMap types, Compiler compiler) {
     if (isBuiltin(types) || usesBoolifiedInterceptor) return HType.BOOLEAN;
     return HType.UNKNOWN;
   }
 
   HType computeDesiredTypeForNonTargetInput(HInstruction input,
-                                            HTypeMap types) {
+                                            HTypeMap types,
+                                            Compiler compiler) {
     HType propagatedType = types[this];
     if (input == left && types[right].isUseful()) {
       // All our useful types have === semantics. But we don't want to
@@ -2332,11 +2355,14 @@
   bool isBuiltin(HTypeMap types) => true;
 
   HType get guaranteedType => HType.BOOLEAN;
-  HType computeTypeFromInputTypes(HTypeMap types)
+  HType computeTypeFromInputTypes(HTypeMap types, Compiler compiler)
       => HType.BOOLEAN;
   // Note that the identity operator really does not care for its input types.
-  HType computeDesiredTypeForInput(HInstruction input, HTypeMap types)
-      => HType.UNKNOWN;
+  HType computeDesiredTypeForInput(HInstruction input,
+                                   HTypeMap types,
+                                   Compiler compiler) {
+    return HType.UNKNOWN;
+  }
 
   BinaryOperation operation(ConstantSystem constantSystem)
       => constantSystem.identity;
@@ -2497,7 +2523,8 @@
   HInstruction get index => inputs[2];
 
   HType computeDesiredTypeForNonTargetInput(HInstruction input,
-                                            HTypeMap types) {
+                                            HTypeMap types,
+                                            Compiler compiler) {
     if (input == receiver &&
         (index.isTypeUnknown(types) || index.isNumber(types))) {
       return HType.INDEXABLE_PRIMITIVE;
@@ -2543,7 +2570,8 @@
   // is never used as input.
 
   HType computeDesiredTypeForNonTargetInput(HInstruction input,
-                                            HTypeMap types) {
+                                            HTypeMap types,
+                                            Compiler compiler) {
     if (input == receiver &&
         (index.isTypeUnknown(types) || index.isNumber(types))) {
       return HType.MUTABLE_ARRAY;
diff --git a/lib/compiler/implementation/ssa/optimize.dart b/lib/compiler/implementation/ssa/optimize.dart
index 5e2685c..30da6c5 100644
--- a/lib/compiler/implementation/ssa/optimize.dart
+++ b/lib/compiler/implementation/ssa/optimize.dart
@@ -399,7 +399,7 @@
 
     // We don't optimize on numbers to preserve the runtime semantics.
     if (!(left.isNumber(types) && right.isNumber(types)) &&
-        leftType.intersection(rightType).isConflicting()) {
+        leftType.intersection(rightType, compiler).isConflicting()) {
       return graph.addConstantBool(false, constantSystem);
     }
 
@@ -489,7 +489,7 @@
     // If the intersection of the types is still the incoming type then
     // the incoming type was a subtype of the guarded type, and no check
     // is required.
-    HType combinedType = types[value].intersection(node.guardedType);
+    HType combinedType = types[value].intersection(node.guardedType, compiler);
     return (combinedType == types[value]) ? value : node;
   }
 
@@ -576,7 +576,7 @@
     if (types[value].canBeNull() && node.isBooleanConversionCheck) {
       return node;
     }
-    HType combinedType = types[value].intersection(types[node]);
+    HType combinedType = types[value].intersection(types[node], compiler);
     return (combinedType == types[value]) ? value : node;
   }
 
@@ -616,7 +616,7 @@
   HInstruction visitInvokeDynamicSetter(HInvokeDynamicSetter node) {
     Element field =
         findConcreteFieldForDynamicAccess(node.receiver, node.selector);
-    if (field == null) return node;
+    if (field == null || !field.isAssignable()) return node;
     HInstruction value = node.inputs[1];
     if (compiler.enableTypeAssertions) {
       HInstruction other = value.convertType(
@@ -890,9 +890,13 @@
       if (block.isLoopHeader()) {
         int changesFlags = loopChangesFlags[block.id];
         HLoopInformation info = block.loopInformation;
-        HBasicBlock last = info.getLastBackEdge();
-        for (int j = block.id; j <= last.id; j++) {
-          moveLoopInvariantCodeFromBlock(graph.blocks[j], block, changesFlags);
+        // Iterate over all blocks of this loop. Note that blocks in
+        // inner loops are not visited here, but we know they
+        // were visited before because we are iterating in post-order.
+        // So instructions that are GVN'ed in an inner loop are in their
+        // loop entry, and [info.blocks] contains this loop entry.
+        for (HBasicBlock other in info.blocks) {
+          moveLoopInvariantCodeFromBlock(other, block, changesFlags);
         }
       }
     }
@@ -901,6 +905,7 @@
   void moveLoopInvariantCodeFromBlock(HBasicBlock block,
                                       HBasicBlock loopHeader,
                                       int changesFlags) {
+    assert(block.parentLoopHeader == loopHeader);
     HBasicBlock preheader = loopHeader.predecessors[0];
     int dependsFlags = HInstruction.computeDependsOnFlags(changesFlags);
     HInstruction instruction = block.first;
@@ -1256,7 +1261,8 @@
           predecessorsFieldSetters.forEach((Element element, HType type) {
             HType currentType = currentFieldSetters[element];
             if (currentType != null) {
-              newFieldSetters[element] = currentType.union(type);
+              newFieldSetters[element] =
+                  currentType.union(type, backend.compiler);
             }
           });
           currentFieldSetters = newFieldSetters;
diff --git a/lib/compiler/implementation/ssa/types.dart b/lib/compiler/implementation/ssa/types.dart
index b8277bf..da534d583 100644
--- a/lib/compiler/implementation/ssa/types.dart
+++ b/lib/compiler/implementation/ssa/types.dart
@@ -109,7 +109,7 @@
    * An intersection with [UNKNOWN] returns the non-UNKNOWN type. An
    * intersection with [CONFLICTING] returns [CONFLICTING].
    */
-  abstract HType intersection(HType other);
+  abstract HType intersection(HType other, Compiler compiler);
 
   /**
    * The union of two types is the union of its values. For example:
@@ -123,7 +123,7 @@
    * A union with [UNKNOWN] returns [UNKNOWN].
    * A union of [CONFLICTING] with any other types returns the other type.
    */
-  abstract HType union(HType other);
+  abstract HType union(HType other, Compiler compiler);
 }
 
 /** Used to represent [HType.UNKNOWN] and [HType.CONFLICTING]. */
@@ -140,8 +140,8 @@
   bool canBePrimitive() => true;
   bool canBeNull() => true;
 
-  HType union(HType other) => this;
-  HType intersection(HType other) => other;
+  HType union(HType other, Compiler compiler) => this;
+  HType intersection(HType other, Compiler compiler) => other;
 }
 
 class HConflictingType extends HAnalysisType {
@@ -149,8 +149,8 @@
   bool canBePrimitive() => true;
   bool canBeNull() => true;
 
-  HType union(HType other) => other;
-  HType intersection(HType other) => this;
+  HType union(HType other, Compiler compiler) => other;
+  HType intersection(HType other, Compiler compiler) => this;
 }
 
 abstract class HPrimitiveType extends HType {
@@ -168,7 +168,7 @@
 
   DartType computeType(Compiler compiler) => null;
 
-  HType union(HType other) {
+  HType union(HType other, Compiler compiler) {
     if (other.isConflicting()) return HType.NULL;
     if (other.isUnknown()) return HType.UNKNOWN;
     if (other.isString()) return HType.STRING_OR_NULL;
@@ -180,7 +180,7 @@
     return other;
   }
 
-  HType intersection(HType other) {
+  HType intersection(HType other, Compiler compiler) {
     if (other.isUnknown()) return HType.NULL;
     if (other.isConflicting()) return HType.CONFLICTING;
     if (!other.canBeNull()) return HType.CONFLICTING;
@@ -204,7 +204,7 @@
     return compiler.boolClass.computeType(compiler);
   }
 
-  HType union(HType other) {
+  HType union(HType other, Compiler compiler) {
     if (other.isConflicting()) return HType.BOOLEAN_OR_NULL;
     if (other.isUnknown()) return HType.UNKNOWN;
     if (other.isBooleanOrNull()) return HType.BOOLEAN_OR_NULL;
@@ -213,7 +213,7 @@
     return HType.UNKNOWN;
   }
 
-  HType intersection(HType other) {
+  HType intersection(HType other, Compiler compiler) {
     if (other.isConflicting()) return HType.CONFLICTING;
     if (other.isUnknown()) return HType.BOOLEAN_OR_NULL;
     if (other.isBooleanOrNull()) return HType.BOOLEAN_OR_NULL;
@@ -232,7 +232,7 @@
     return compiler.boolClass.computeType(compiler);
   }
 
-  HType union(HType other) {
+  HType union(HType other, Compiler compiler) {
     if (other.isConflicting()) return HType.BOOLEAN;
     if (other.isUnknown()) return HType.UNKNOWN;
     if (other.isBoolean()) return HType.BOOLEAN;
@@ -241,7 +241,7 @@
     return HType.UNKNOWN;
   }
 
-  HType intersection(HType other) {
+  HType intersection(HType other, Compiler compiler) {
     if (other.isConflicting()) return HType.CONFLICTING;
     if (other.isUnknown()) return HType.BOOLEAN;
     if (other.isBooleanOrNull()) return HType.BOOLEAN;
@@ -259,7 +259,7 @@
     return compiler.numClass.computeType(compiler);
   }
 
-  HType union(HType other) {
+  HType union(HType other, Compiler compiler) {
     if (other.isConflicting()) return HType.NUMBER_OR_NULL;
     if (other.isUnknown()) return HType.UNKNOWN;
     if (other.isNumberOrNull()) return HType.NUMBER_OR_NULL;
@@ -268,7 +268,7 @@
     return HType.UNKNOWN;
   }
 
-  HType intersection(HType other) {
+  HType intersection(HType other, Compiler compiler) {
     if (other.isConflicting()) return HType.CONFLICTING;
     if (other.isUnknown()) return HType.NUMBER_OR_NULL;
     if (other.isInteger()) return HType.INTEGER;
@@ -291,7 +291,7 @@
     return compiler.numClass.computeType(compiler);
   }
 
-  HType union(HType other) {
+  HType union(HType other, Compiler compiler) {
     if (other.isConflicting()) return HType.NUMBER;
     if (other.isUnknown()) return HType.UNKNOWN;
     if (other.isNumber()) return HType.NUMBER;
@@ -300,7 +300,7 @@
     return HType.UNKNOWN;
   }
 
-  HType intersection(HType other) {
+  HType intersection(HType other, Compiler compiler) {
     if (other.isConflicting()) return HType.CONFLICTING;
     if (other.isUnknown()) return HType.NUMBER;
     if (other.isNumber()) return other;
@@ -320,7 +320,7 @@
     return compiler.intClass.computeType(compiler);
   }
 
-  HType union(HType other) {
+  HType union(HType other, Compiler compiler) {
     if (other.isConflicting()) return HType.INTEGER_OR_NULL;
     if (other.isUnknown()) return HType.UNKNOWN;
     if (other.isIntegerOrNull()) return HType.INTEGER_OR_NULL;
@@ -331,7 +331,7 @@
     return HType.UNKNOWN;
   }
 
-  HType intersection(HType other) {
+  HType intersection(HType other, Compiler compiler) {
     if (other.isConflicting()) return HType.CONFLICTING;
     if (other.isUnknown()) return HType.INTEGER_OR_NULL;
     if (other.isIntegerOrNull()) return HType.INTEGER_OR_NULL;
@@ -354,7 +354,7 @@
     return compiler.intClass.computeType(compiler);
   }
 
-  HType union(HType other) {
+  HType union(HType other, Compiler compiler) {
     if (other.isConflicting()) return HType.INTEGER;
     if (other.isUnknown()) return HType.UNKNOWN;
     if (other.isInteger()) return HType.INTEGER;
@@ -365,7 +365,7 @@
     return HType.UNKNOWN;
   }
 
-  HType intersection(HType other) {
+  HType intersection(HType other, Compiler compiler) {
     if (other.isConflicting()) return HType.CONFLICTING;
     if (other.isUnknown()) return HType.INTEGER;
     if (other.isIntegerOrNull()) return HType.INTEGER;
@@ -387,7 +387,7 @@
     return compiler.doubleClass.computeType(compiler);
   }
 
-  HType union(HType other) {
+  HType union(HType other, Compiler compiler) {
     if (other.isConflicting()) return HType.DOUBLE_OR_NULL;
     if (other.isUnknown()) return HType.UNKNOWN;
     if (other.isDoubleOrNull()) return HType.DOUBLE_OR_NULL;
@@ -398,7 +398,7 @@
     return HType.UNKNOWN;
   }
 
-  HType intersection(HType other) {
+  HType intersection(HType other, Compiler compiler) {
     if (other.isConflicting()) return HType.CONFLICTING;
     if (other.isUnknown()) return HType.DOUBLE_OR_NULL;
     if (other.isIntegerOrNull()) return HType.NULL;
@@ -421,7 +421,7 @@
     return compiler.doubleClass.computeType(compiler);
   }
 
-  HType union(HType other) {
+  HType union(HType other, Compiler compiler) {
     if (other.isConflicting()) return HType.DOUBLE;
     if (other.isUnknown()) return HType.UNKNOWN;
     if (other.isDouble()) return HType.DOUBLE;
@@ -432,7 +432,7 @@
     return HType.UNKNOWN;
   }
 
-  HType intersection(HType other) {
+  HType intersection(HType other, Compiler compiler) {
     if (other.isConflicting()) return HType.CONFLICTING;
     if (other.isUnknown()) return HType.DOUBLE;
     if (other.isIntegerOrNull()) return HType.CONFLICTING;
@@ -455,7 +455,7 @@
     return null;
   }
 
-  HType union(HType other) {
+  HType union(HType other, Compiler compiler) {
     if (other.isConflicting()) return HType.INDEXABLE_PRIMITIVE;
     if (other.isUnknown()) return HType.UNKNOWN;
     if (other.isIndexablePrimitive()) return HType.INDEXABLE_PRIMITIVE;
@@ -470,7 +470,7 @@
     return HType.UNKNOWN;
   }
 
-  HType intersection(HType other) {
+  HType intersection(HType other, Compiler compiler) {
     if (other.isConflicting()) return HType.CONFLICTING;
     if (other.isUnknown()) return HType.INDEXABLE_PRIMITIVE;
     if (other.isIndexablePrimitive()) return other;
@@ -489,7 +489,7 @@
     return compiler.stringClass.computeType(compiler);
   }
 
-  HType union(HType other) {
+  HType union(HType other, Compiler compiler) {
     if (other.isConflicting()) return HType.STRING_OR_NULL;
     if (other.isUnknown()) return HType.UNKNOWN;
     if (other.isString()) return HType.STRING_OR_NULL;
@@ -511,7 +511,7 @@
     return HType.UNKNOWN;
   }
 
-  HType intersection(HType other) {
+  HType intersection(HType other, Compiler compiler) {
     if (other.isConflicting()) return HType.CONFLICTING;
     if (other.isUnknown()) return HType.STRING_OR_NULL;
     if (other.isString()) return HType.STRING;
@@ -535,7 +535,7 @@
     return compiler.stringClass.computeType(compiler);
   }
 
-  HType union(HType other) {
+  HType union(HType other, Compiler compiler) {
     if (other.isConflicting()) return HType.STRING;
     if (other.isUnknown()) return HType.UNKNOWN;
     if (other.isString()) return HType.STRING;
@@ -546,7 +546,7 @@
     return HType.UNKNOWN;
   }
 
-  HType intersection(HType other) {
+  HType intersection(HType other, Compiler compiler) {
     if (other.isConflicting()) return HType.CONFLICTING;
     if (other.isUnknown()) return HType.STRING;
     if (other.isString()) return HType.STRING;
@@ -567,7 +567,7 @@
     return compiler.listClass.computeType(compiler);
   }
 
-  HType union(HType other) {
+  HType union(HType other, Compiler compiler) {
     if (other.isConflicting()) return HType.READABLE_ARRAY;
     if (other.isUnknown()) return HType.UNKNOWN;
     if (other.isReadableArray()) return HType.READABLE_ARRAY;
@@ -576,7 +576,7 @@
     return HType.UNKNOWN;
   }
 
-  HType intersection(HType other) {
+  HType intersection(HType other, Compiler compiler) {
     if (other.isConflicting()) return HType.CONFLICTING;
     if (other.isUnknown()) return HType.READABLE_ARRAY;
     if (other.isString()) return HType.CONFLICTING;
@@ -592,7 +592,7 @@
   bool isMutableArray() => true;
   String toString() => "mutable array";
 
-  HType union(HType other) {
+  HType union(HType other, Compiler compiler) {
     if (other.isConflicting()) return HType.MUTABLE_ARRAY;
     if (other.isUnknown()) return HType.UNKNOWN;
     if (other.isMutableArray()) return HType.MUTABLE_ARRAY;
@@ -602,7 +602,7 @@
     return HType.UNKNOWN;
   }
 
-  HType intersection(HType other) {
+  HType intersection(HType other, Compiler compiler) {
     if (other.isConflicting()) return HType.CONFLICTING;
     if (other.isUnknown()) return HType.MUTABLE_ARRAY;
     if (other.isMutableArray()) return other;
@@ -618,7 +618,7 @@
   bool isFixedArray() => true;
   String toString() => "fixed array";
 
-  HType union(HType other) {
+  HType union(HType other, Compiler compiler) {
     if (other.isConflicting()) return HType.FIXED_ARRAY;
     if (other.isUnknown()) return HType.UNKNOWN;
     if (other.isFixedArray()) return HType.FIXED_ARRAY;
@@ -629,7 +629,7 @@
     return HType.UNKNOWN;
   }
 
-  HType intersection(HType other) {
+  HType intersection(HType other, Compiler compiler) {
     if (other.isConflicting()) return HType.CONFLICTING;
     if (other.isUnknown()) return HType.FIXED_ARRAY;
     if (other.isFixedArray()) return HType.FIXED_ARRAY;
@@ -646,7 +646,7 @@
   bool isExtendableArray() => true;
   String toString() => "extendable array";
 
-  HType union(HType other) {
+  HType union(HType other, Compiler compiler) {
     if (other.isConflicting()) return HType.EXTENDABLE_ARRAY;
     if (other.isUnknown()) return HType.UNKNOWN;
     if (other.isExtendableArray()) return HType.EXTENDABLE_ARRAY;
@@ -657,7 +657,7 @@
     return HType.UNKNOWN;
   }
 
-  HType intersection(HType other) {
+  HType intersection(HType other, Compiler compiler) {
     if (other.isConflicting()) return HType.CONFLICTING;
     if (other.isUnknown()) return HType.EXTENDABLE_ARRAY;
     if (other.isExtendableArray()) return HType.EXTENDABLE_ARRAY;
@@ -697,13 +697,17 @@
     return classElement.lookupMember(name);
   }
 
-  HType intersection(HType other) {
+  HType intersection(HType other, Compiler compiler) {
     assert(!(isExact() && canBeNull()));
     if (other.isConflicting()) return HType.CONFLICTING;
     if (other.isNull()) return canBeNull() ? HType.NULL : HType.CONFLICTING;
+
     if (other is HBoundedType) {
       HBoundedType temp = other;
       if (identical(this.type, temp.type)) {
+        // If the types are the same, we return the [HBoundedType]
+        // that has the most restrictive representation: if it's exact
+        // (eg cannot be a subtype), and if it cannot be null.
         if (isExact()) {
           return this;
         } else if (other.isExact()) {
@@ -713,6 +717,12 @@
         } else {
           return this;
         }
+      // If one type is a subtype of the other, we return the former,
+      // which is the narrower type.
+      } else if (compiler.types.isSubtype(type, other.type)) {
+        return this;
+      } else if (compiler.types.isSubtype(other.type, type)) {
+        return other;
       }
     }
     if (other.isUnknown()) return this;
@@ -723,11 +733,12 @@
   bool operator ==(HType other) {
     if (other is !HBoundedType) return false;
     HBoundedType bounded = other;
-    return (identical(type, bounded.type) && identical(canBeNull(), bounded.canBeNull())
-            && identical(isExact(), other .isExact()));
+    return (identical(type, bounded.type)
+            && identical(canBeNull(), bounded.canBeNull())
+            && identical(isExact(), other.isExact()));
   }
 
-  HType union(HType other) {
+  HType union(HType other, Compiler compiler) {
     if (other.isNull()) {
       if (canBeNull()) {
         return this;
@@ -758,7 +769,7 @@
   const HBoundedPotentialPrimitiveNumberOrString(DartType type, bool canBeNull)
       : super(type, canBeNull);
 
-  HType union(HType other) {
+  HType union(HType other, Compiler compiler) {
     if (other.isNumber()) return this;
     if (other.isNumberOrNull()) {
       if (canBeNull()) return this;
@@ -776,10 +787,10 @@
       return new HBoundedPotentialPrimitiveNumberOrString(type, true);
     }
 
-    return super.union(other);
+    return super.union(other, compiler);
   }
 
-  HType intersection(HType other) {
+  HType intersection(HType other, Compiler compiler) {
     if (other.isNumber()) return other;
     if (other.isNumberOrNull()) {
       if (!canBeNull()) return HType.NUMBER;
@@ -790,7 +801,7 @@
       if (!canBeNull()) return HType.STRING;
       return other;
     }
-    return super.intersection(other);
+    return super.intersection(other, compiler);
   }
 }
 
@@ -798,7 +809,7 @@
   const HBoundedPotentialPrimitiveArray(DartType type, bool canBeNull)
       : super(type, canBeNull);
 
-  HType union(HType other) {
+  HType union(HType other, Compiler compiler) {
     if (other.isString()) return HType.UNKNOWN;
     if (other.isReadableArray()) return this;
     // TODO(ngeoffray): implement union types.
@@ -810,15 +821,15 @@
         return new HBoundedPotentialPrimitiveArray(type, true);
       }
     }
-    return super.union(other);
+    return super.union(other, compiler);
   }
 
-  HType intersection(HType other) {
+  HType intersection(HType other, Compiler compiler) {
     if (other.isConflicting()) return HType.CONFLICTING;
     if (other.isString()) return HType.CONFLICTING;
     if (other.isReadableArray()) return other;
     if (other.isIndexablePrimitive()) return HType.READABLE_ARRAY;
-    return super.intersection(other);
+    return super.intersection(other, compiler);
   }
 }
 
@@ -828,7 +839,7 @@
 
   bool isPrimitiveOrNull() => true;
 
-  HType union(HType other) {
+  HType union(HType other, Compiler compiler) {
     if (other.isString()) return this;
     if (other.isStringOrNull()) {
       if (canBeNull()) {
@@ -846,10 +857,10 @@
     }
     // TODO(ngeoffray): implement union types.
     if (other.isIndexablePrimitive()) return HType.UNKNOWN;
-    return super.union(other);
+    return super.union(other, compiler);
   }
 
-  HType intersection(HType other) {
+  HType intersection(HType other, Compiler compiler) {
     if (other.isConflicting()) return HType.CONFLICTING;
     if (other.isString()) return HType.STRING;
     if (other.isStringOrNull()) {
@@ -857,7 +868,7 @@
     }
     if (other.isReadableArray()) return HType.CONFLICTING;
     if (other.isIndexablePrimitive()) return HType.STRING;
-    return super.intersection(other);
+    return super.intersection(other, compiler);
   }
 }
 
diff --git a/lib/compiler/implementation/ssa/types_propagation.dart b/lib/compiler/implementation/ssa/types_propagation.dart
index e4809c87..b64d2f1 100644
--- a/lib/compiler/implementation/ssa/types_propagation.dart
+++ b/lib/compiler/implementation/ssa/types_propagation.dart
@@ -21,7 +21,7 @@
 
   HType computeType(HInstruction instruction) {
     if (instruction.hasGuaranteedType()) return instruction.guaranteedType;
-    return instruction.computeTypeFromInputTypes(types);
+    return instruction.computeTypeFromInputTypes(types, compiler);
   }
 
   // Re-compute and update the type of the instruction. Returns
@@ -172,7 +172,7 @@
     HType desiredType = HType.UNKNOWN;
     for (final user in instruction.usedBy) {
       HType userType =
-          user.computeDesiredTypeForInput(instruction, types);
+          user.computeDesiredTypeForInput(instruction, types, compiler);
       // Mainly due to the "if (true)" added by hackAroundPossiblyAbortingBody
       // in builder.dart uninitialized variables will propagate a type of null
       // which will result in a conflicting type when combined with a primitive
@@ -180,7 +180,7 @@
       // TODO(sgjesse): Reconcider this when hackAroundPossiblyAbortingBody
       // has been removed.
       if (desiredType.isPrimitive() && userType == HType.NULL) continue;
-      desiredType = desiredType.intersection(userType);
+      desiredType = desiredType.intersection(userType, compiler);
       // No need to continue if two users disagree on the type.
       if (desiredType.isConflicting()) break;
     }
@@ -203,7 +203,7 @@
     // TODO(ngeoffray): Allow speculative optimizations on
     // non-primitive types?
     if (!desiredType.isPrimitive()) return newType;
-    return newType.intersection(desiredType);
+    return newType.intersection(desiredType, compiler);
   }
 
   // Do not use speculative argument type optimization for now.
diff --git a/lib/compiler/implementation/ssa/value_range_analyzer.dart b/lib/compiler/implementation/ssa/value_range_analyzer.dart
index 79970b7..6439c96 100644
--- a/lib/compiler/implementation/ssa/value_range_analyzer.dart
+++ b/lib/compiler/implementation/ssa/value_range_analyzer.dart
@@ -4,18 +4,68 @@
 
 part of ssa;
 
+
+class ValueRangeInfo {
+  final ConstantSystem constantSystem;
+
+  IntValue intZero;
+  IntValue intOne;
+
+  ValueRangeInfo(this.constantSystem) {
+    intZero = newIntValue(0);
+    intOne = newIntValue(1);
+  }
+
+  Value newIntValue(int value) {
+    return new IntValue(value, this);
+  }
+
+  Value newInstructionValue(HInstruction instruction) {
+    return new InstructionValue(instruction, this);
+  }
+
+  Value newLengthValue(HInstruction instruction) {
+    return new LengthValue(instruction, this);
+  }
+
+  Value newAddValue(Value left, Value right) {
+    return new AddValue(left, right, this);
+  }
+
+  Value newSubtractValue(Value left, Value right) {
+    return new SubtractValue(left, right, this);
+  }
+
+  Value newNegateValue(Value value) {
+    return new NegateValue(value, this);
+  }
+
+  Range newRange(Value low, Value up) {
+    return new Range(low, up, this);
+  }
+
+  Range newUnboundRange() {
+    return new Range.unbound(this);
+  }
+
+  Range newNormalizedRange(Value low, Value up) {
+    return new Range.normalize(low, up, this);
+  }
+}
+
 /**
  * A [Value] represents both symbolic values like the value of a
  * parameter, or the length of an array, and concrete values, like
  * constants.
  */
 abstract class Value {
-  const Value();
+  final ValueRangeInfo info;
+  const Value([this.info = null]);
 
-  Value operator +(Value other);
-  Value operator -(Value other);
-  Value operator -();
-  Value operator &(Value other);
+  Value operator +(Value other) => const UnknownValue();
+  Value operator -(Value other) => const UnknownValue();
+  Value operator -()  => const UnknownValue();
+  Value operator &(Value other) => const UnknownValue();
 
   Value min(Value other) {
     if (this == other) return this;
@@ -47,32 +97,44 @@
  */
 class IntValue extends Value {
   final int value;
-  const IntValue(this.value);
+
+  const IntValue(this.value, info) : super(info);
 
   Value operator +(other) {
     if (other.isZero) return this;
     if (other is !IntValue) return other + this;
-    return new IntValue(value + other.value);
+    ConstantSystem constantSystem = info.constantSystem;
+    var constant = constantSystem.add.fold(
+        constantSystem.createInt(value), constantSystem.createInt(other.value));
+    if (!constant.isInt()) return const UnknownValue();
+    return info.newIntValue(constant.value);
   }
 
   Value operator -(other) {
     if (other.isZero) return this;
     if (other is !IntValue) return -other + this;
-    return new IntValue(value - other.value);
+    ConstantSystem constantSystem = info.constantSystem;
+    var constant = constantSystem.subtract.fold(
+        constantSystem.createInt(value), constantSystem.createInt(other.value));
+    if (!constant.isInt()) return const UnknownValue();
+    return info.newIntValue(constant.value);
   }
 
   Value operator -() {
     if (isZero) return this;
-    return new IntValue(-value);
+    ConstantSystem constantSystem = info.constantSystem;
+    var constant = constantSystem.negate.fold(
+        constantSystem.createInt(value));
+    if (!constant.isInt()) return const UnknownValue();
+    return info.newIntValue(constant.value);
   }
 
   Value operator &(other) {
-    if (other is !IntValue) {
-      if (isPositive) return this;
-      if (other.isPositive) return new IntValue(-value);
-      return const UnknownValue();
-    }
-    return new IntValue(value & other.value);
+    if (other is !IntValue) return const UnknownValue();
+    ConstantSystem constantSystem = info.constantSystem;
+    var constant = constantSystem.bitAnd.fold(
+        constantSystem.createInt(value), constantSystem.createInt(other.value));
+    return info.newIntValue(constant.value);
   }
 
   Value min(other) {
@@ -101,15 +163,10 @@
  * which is currently +infinity.
  */
 class MaxIntValue extends Value {
-  const MaxIntValue();
+  const MaxIntValue() : super(null);
   Value operator +(Value other) => this;
   Value operator -(Value other) => this;
   Value operator -() => const MinIntValue();
-  Value operator &(Value other) {
-    if (other.isPositive) return other;
-    if (other.isNegative) return const IntValue(0);
-    return this;
-  }
   Value min(Value other) => other;
   Value max(Value other) => this;
   String toString() => 'Max';
@@ -122,14 +179,10 @@
  * which is currently -infinity.
  */
 class MinIntValue extends Value {
-  const MinIntValue();
+  const MinIntValue() : super(null);
   Value operator +(Value other) => this;
   Value operator -(Value other) => this;
   Value operator -() => const MaxIntValue();
-  Value operator &(Value other) {
-    if (other.isPositive) return const IntValue(0);
-    return this;
-  }
   Value min(Value other) => this;
   Value max(Value other) => other;
   String toString() => 'Min';
@@ -142,11 +195,10 @@
  * operation that could not be done because of too much complexity.
  */
 class UnknownValue extends Value {
-  const UnknownValue();
+  const UnknownValue() : super(null);
   Value operator +(Value other) => const UnknownValue();
   Value operator -(Value other) => const UnknownValue();
   Value operator -() => const UnknownValue();
-  Value operator &(Value other) => const UnknownValue();
   Value min(Value other) => const UnknownValue();
   Value max(Value other) => const UnknownValue();
   bool get isNegative => false;
@@ -159,7 +211,7 @@
  */
 class InstructionValue extends Value {
   final HInstruction instruction;
-  InstructionValue(this.instruction);
+  InstructionValue(this.instruction, info) : super(info);
 
   bool operator ==(other) {
     if (other is !InstructionValue) return false;
@@ -170,38 +222,33 @@
     if (other.isZero) return this;
     if (other is IntValue) {
       if (other.isNegative) {
-        return new SubtractValue(this, -other);
+        return info.newSubtractValue(this, -other);
       }
-      return new AddValue(this, other);
+      return info.newAddValue(this, other);
     }
     if (other is InstructionValue) {
-      return new AddValue(this, other);
+      return info.newAddValue(this, other);
     }
     return other + this;
   }
 
   Value operator -(Value other) {
     if (other.isZero) return this;
-    if (this == other) return const IntValue(0);
+    if (this == other) return info.intZero;
     if (other is IntValue) {
       if (other.isNegative) {
-        return new AddValue(this, -other);
+        return info.newAddValue(this, -other);
       }
-      return new SubtractValue(this, other);
+      return info.newSubtractValue(this, other);
     }
     if (other is InstructionValue) {
-      return new SubtractValue(this, other);
+      return info.newSubtractValue(this, other);
     }
     return -other + this;
   }
 
   Value operator -() {
-    return new NegateValue(this);
-  }
-
-  Value operator &(Value other) {
-    if (other is IntValue) return other & this;
-    return this;
+    return info.newNegateValue(this);
   }
 
   bool get isNegative => false;
@@ -216,7 +263,7 @@
  * the value is positive.
  */
 class LengthValue extends InstructionValue {
-  LengthValue(HInstruction instruction) : super(instruction);
+  LengthValue(HInstruction instruction, info) : super(instruction, info);
   bool get isPositive => true;
   String toString() => 'Length: $instruction';
 }
@@ -225,18 +272,14 @@
  * Represents a binary operation on two [Value], where the operation
  * did not yield a canonical value.
  */
-class OperationValue extends Value {
-  Operation operation;
-}
-
-class BinaryOperationValue extends OperationValue {
+class BinaryOperationValue extends Value {
   final Value left;
   final Value right;
-  BinaryOperationValue(this.left, this.right);
+  BinaryOperationValue(this.left, this.right, info) : super(info);
 }
 
 class AddValue extends BinaryOperationValue {
-  AddValue(left, right) : super(left, right);
+  AddValue(left, right, info) : super(left, right, info);
 
   bool operator ==(other) {
     if (other is !AddValue) return false;
@@ -244,7 +287,6 @@
       || (left == other.right && right == other.left);
   }
 
-  Value operator &(Value other) => const UnknownValue();
   Value operator -() => -left - right;
 
   Value operator +(Value other) {
@@ -283,14 +325,13 @@
 }
 
 class SubtractValue extends BinaryOperationValue {
-  SubtractValue(left, right) : super(left, right);
+  SubtractValue(left, right, info) : super(left, right, info);
 
   bool operator ==(other) {
     if (other is !SubtractValue) return false;
     return left == other.left && right == other.right;
   }
 
-  Value operator &(Value other) => const UnknownValue();
   Value operator -() => right - left;
 
   Value operator +(Value other) {
@@ -328,9 +369,9 @@
   String toString() => '$left - $right';
 }
 
-class NegateValue extends OperationValue {
+class NegateValue extends Value {
   final Value value;
-  NegateValue(this.value);
+  NegateValue(this.value, info) : super(info);
 
   bool operator ==(other) {
     if (other is !NegateValue) return false;
@@ -339,16 +380,16 @@
 
   Value operator +(other) {
     if (other.isZero) return this;
-    if (other == value) return const IntValue(0);
+    if (other == value) return info.intZero;
     if (other is NegateValue) return this - other.value;
     if (other is IntValue) {
       if (other.isNegative) {
-        return new SubtractValue(this, -other);
+        return info.newSubtractValue(this, -other);
       }
-      return new SubtractValue(other, value);
+      return info.newSubtractValue(other, value);
     }
     if (other is InstructionValue) {
-      return new SubtractValue(other, value);
+      return info.newSubtractValue(other, value);
     }
     return other - value;
   }
@@ -359,12 +400,12 @@
     if (other.isZero) return this;
     if (other is IntValue) {
       if (other.isNegative) {
-        return new SubtractValue(-other, value);
+        return info.newSubtractValue(-other, value);
       }
-      return new SubtractValue(this, other);
+      return info.newSubtractValue(this, other);
     }
     if (other is InstructionValue) {
-      return new SubtractValue(this, other);
+      return info.newSubtractValue(this, other);
     }
     if (other is NegateValue) return this + other.value;
     return -other - value;
@@ -385,20 +426,22 @@
 class Range {
   final Value lower;
   final Value upper;
-  const Range(this.lower, this.upper);
-  const Range.unbound()
+  final ValueRangeInfo info;
+  Range(this.lower, this.upper, this.info);
+  Range.unbound(this.info)
       : lower = const MinIntValue(),
         upper = const MaxIntValue();
   /**
    * Checks if the given values are unknown, and creates a
    * range that does not have any unknown values.
    */
-  Range.normalize(Value low, Value up)
+  Range.normalize(Value low, Value up, this.info)
       : lower = low == const UnknownValue() ? const MinIntValue() : low,
         upper = up == const UnknownValue() ? const MaxIntValue() : up;
 
   Range union(Range other) {
-    return new Range.normalize(lower.min(other.lower), upper.max(other.upper));
+    return info.newNormalizedRange(
+        lower.min(other.lower), upper.max(other.upper));
   }
 
   intersection(Range other) {
@@ -416,19 +459,19 @@
       else if (other.upper is IntValue) up = other.upper;
       else up = upper;
     }
-    return new Range(low, up);
+    return info.newRange(low, up);
   }
 
   Range operator +(Range other) {
-    return new Range.normalize(lower + other.lower, upper + other.upper);
+    return info.newNormalizedRange(lower + other.lower, upper + other.upper);
   }
 
   Range operator -(Range other) {
-    return new Range.normalize(lower - other.upper, upper - other.lower);
+    return info.newNormalizedRange(lower - other.upper, upper - other.lower);
   }
 
   Range operator -() {
-    return new Range.normalize(-upper, -lower);
+    return info.newNormalizedRange(-upper, -lower);
   }
 
   Range operator &(Range other) {
@@ -436,7 +479,7 @@
         && other.isSingleValue
         && lower is IntValue
         && other.lower is IntValue) {
-      return new Range(lower & other.lower, upper & other.upper);
+      return info.newRange(lower & other.lower, upper & other.upper);
     }
     if (isPositive && other.isPositive) {
       Value up = upper.min(other.upper);
@@ -448,13 +491,13 @@
         // or b & a.
         if (up is! IntValue && upper != other.upper) up = const MaxIntValue();
       }
-      return new Range(const IntValue(0), up);
+      return info.newRange(info.intZero, up);
     } else if (isPositive) {
-      return new Range(const IntValue(0), upper);
+      return info.newRange(info.intZero, upper);
     } else if (other.isPositive) {
-      return new Range(const IntValue(0), other.upper);
+      return info.newRange(info.intZero, other.upper);
     } else {
-      return const Range.unbound();
+      return info.newUnboundRange();
     }
   }
 
@@ -509,10 +552,14 @@
 
   final ConstantSystem constantSystem;
   final HTypeMap types;
+  final ValueRangeInfo info;
+
   WorkItem work;
   HGraph graph;
 
-  SsaValueRangeAnalyzer(this.constantSystem, this.types, WorkItem this.work);
+  SsaValueRangeAnalyzer(constantSystem, this.types, this.work)
+      : info = new ValueRangeInfo(constantSystem),
+        this.constantSystem = constantSystem;
 
   void visitGraph(HGraph graph) {
     this.graph = graph;
@@ -545,20 +592,20 @@
   }
 
   Range visitInstruction(HInstruction instruction) {
-    return const Range.unbound();
+    return info.newUnboundRange();
   }
 
   Range visitParameterValue(HParameterValue parameter) {
-    if (!parameter.isInteger(types)) return const Range.unbound();
-    Value value = new InstructionValue(parameter);
-    return new Range(value, value);
+    if (!parameter.isInteger(types)) return info.newUnboundRange();
+    Value value = info.newInstructionValue(parameter);
+    return info.newRange(value, value);
   }
 
   Range visitPhi(HPhi phi) {
-    if (!phi.isInteger(types)) return const Range.unbound();
+    if (!phi.isInteger(types)) return info.newUnboundRange();
     if (phi.block.isLoopHeader()) {
       Range range = tryInferLoopPhiRange(phi);
-      if (range == null) return const Range.unbound();
+      if (range == null) return info.newUnboundRange();
       return range;
     }
 
@@ -571,27 +618,27 @@
 
   Range tryInferLoopPhiRange(HPhi phi) {
     HInstruction update = phi.inputs[1];
-    return update.accept(new LoopUpdateRecognizer(phi, ranges, types));
+    return update.accept(new LoopUpdateRecognizer(phi, ranges, types, info));
   }
 
   Range visitConstant(HConstant constant) {
-    if (!constant.isInteger(types)) return const Range.unbound();
+    if (!constant.isInteger(types)) return info.newUnboundRange();
     IntConstant constantInt = constant.constant;
-    Value value = new IntValue(constantInt.value);
-    return new Range(value, value);
+    Value value = info.newIntValue(constantInt.value);
+    return info.newRange(value, value);
   }
 
   Range visitInvokeInterceptor(HInvokeInterceptor interceptor) {
-    if (!interceptor.isInteger(types)) return const Range.unbound();
+    if (!interceptor.isInteger(types)) return info.newUnboundRange();
     if (!interceptor.isLengthGetterOnStringOrArray(types)) {
       return visitInstruction(interceptor);
     }
-    LengthValue value = new LengthValue(interceptor);
+    LengthValue value = info.newLengthValue(interceptor);
     // We know this range is above zero. To simplify the analysis, we
     // put the zero value as the lower bound of this range. This
     // allows to easily remove the second bound check in the following
     // expression: a[1] + a[0].
-    return new Range(const IntValue(0), value);
+    return info.newRange(info.intZero, value);
   }
 
   Range visitBoundsCheck(HBoundsCheck check) {
@@ -602,7 +649,7 @@
 
     // Check if the index is strictly below the upper bound of the length
     // range.
-    Value maxIndex = lengthRange.upper - const IntValue(1);
+    Value maxIndex = lengthRange.upper - info.intOne;
     bool belowLength = maxIndex != const MaxIntValue()
         && indexRange.upper.min(maxIndex) == indexRange.upper;
 
@@ -632,7 +679,7 @@
       if (low != const UnknownValue()) {
         HInstruction instruction =
             createRangeConversion(next, check.length);
-        ranges[instruction] = new Range(low, lengthRange.upper);
+        ranges[instruction] = info.newRange(low, lengthRange.upper);
       }
     }
 
@@ -640,7 +687,7 @@
       // Update the range of the index if using the length bounds
       // narrows it.
       Range newIndexRange = indexRange.intersection(
-          new Range(lengthRange.lower, maxIndex));
+          info.newRange(lengthRange.lower, maxIndex));
       if (indexRange == newIndexRange) return indexRange;
       HInstruction instruction = createRangeConversion(next, check.index);
       ranges[instruction] = newIndexRange;
@@ -653,8 +700,8 @@
   Range visitRelational(HRelational relational) {
     HInstruction right = relational.right;
     HInstruction left = relational.left;
-    if (!left.isInteger(types)) return const Range.unbound();
-    if (!right.isInteger(types)) return const Range.unbound();
+    if (!left.isInteger(types)) return info.newUnboundRange();
+    if (!right.isInteger(types)) return info.newUnboundRange();
     BinaryOperation operation = relational.operation(constantSystem);
     Range rightRange = ranges[relational.right];
     Range leftRange = ranges[relational.left];
@@ -670,7 +717,7 @@
           relational, graph.addConstantBool(false, constantSystem));
       relational.block.remove(relational);
     }
-    return const Range.unbound();
+    return info.newUnboundRange();
   }
 
   void handleEqualityCheck(HRelational node) {
@@ -684,7 +731,7 @@
   }
 
   Range handleBinaryOperation(HBinaryArithmetic instruction) {
-    if (!instruction.isInteger(types)) return const Range.unbound();
+    if (!instruction.isInteger(types)) return info.newUnboundRange();
     return instruction.operation(constantSystem).apply(
         ranges[instruction.left], ranges[instruction.right]);
   }
@@ -698,7 +745,7 @@
   }
 
   Range visitBitAnd(HBitAnd node) {
-    if (!node.isInteger(types)) return const Range.unbound();
+    if (!node.isInteger(types)) return info.newUnboundRange();
     HInstruction right = node.right;
     HInstruction left = node.left;
     if (left.isInteger(types) && right.isInteger(types)) {
@@ -708,11 +755,11 @@
     Range tryComputeRange(HInstruction instruction) {
       Range range = ranges[instruction];
       if (range.isPositive) {
-        return new Range(const IntValue(0), range.upper);
+        return info.newRange(info.intZero, range.upper);
       } else if (range.isNegative) {
-        return new Range(range.lower, const IntValue(0));
+        return info.newRange(range.lower, info.intZero);
       }
-      return const Range.unbound();
+      return info.newUnboundRange();
     }
 
     if (left.isInteger(types)) {
@@ -720,12 +767,12 @@
     } else if (right.isInteger(types)) {
       return tryComputeRange(right);
     }
-    return const Range.unbound();
+    return info.newUnboundRange();
   }
 
   Range visitCheck(HCheck instruction) {
     if (ranges[instruction.checkedInput] == null) {
-      return const Range.unbound();
+      return info.newUnboundRange();
     }
     return ranges[instruction.checkedInput];
   }
@@ -758,22 +805,22 @@
     }
   }
 
-  static Range computeConstrainedRange(BinaryOperation operation,
-                                       Range leftRange,
-                                       Range rightRange) {
+  Range computeConstrainedRange(BinaryOperation operation,
+                                Range leftRange,
+                                Range rightRange) {
     Range range;
     if (operation == const LessOperation()) {
-      range = new Range(
-          const MinIntValue(), rightRange.upper - const IntValue(1));
+      range = info.newRange(
+          const MinIntValue(), rightRange.upper - info.intOne);
     } else if (operation == const LessEqualOperation()) {
-      range = new Range(const MinIntValue(), rightRange.upper);
+      range = info.newRange(const MinIntValue(), rightRange.upper);
     } else if (operation == const GreaterOperation()) {
-      range = new Range(
-          rightRange.lower + const IntValue(1), const MaxIntValue());
+      range = info.newRange(
+          rightRange.lower + info.intOne, const MaxIntValue());
     } else if (operation == const GreaterEqualOperation()) {
-      range = new Range(rightRange.lower, const MaxIntValue());
+      range = info.newRange(rightRange.lower, const MaxIntValue());
     } else {
-      range = const Range.unbound();
+      range = info.newUnboundRange();
     }
     return range.intersection(leftRange);
   }
@@ -781,13 +828,13 @@
   Range visitConditionalBranch(HConditionalBranch branch) {
     var condition = branch.condition;
     // TODO(ngeoffray): Handle complex conditions.
-    if (condition is !HRelational) return const Range.unbound();
-    if (condition is HEquals) return const Range.unbound();
-    if (condition is HIdentity) return const Range.unbound();
+    if (condition is !HRelational) return info.newUnboundRange();
+    if (condition is HEquals) return info.newUnboundRange();
+    if (condition is HIdentity) return info.newUnboundRange();
     HInstruction right = condition.right;
     HInstruction left = condition.left;
-    if (!left.isInteger(types)) return const Range.unbound();
-    if (!right.isInteger(types)) return const Range.unbound();
+    if (!left.isInteger(types)) return info.newUnboundRange();
+    if (!right.isInteger(types)) return info.newUnboundRange();
 
     Range rightRange = ranges[right];
     Range leftRange = ranges[left];
@@ -835,7 +882,7 @@
       }
     }
 
-    return const Range.unbound();
+    return info.newUnboundRange();
   }
 
   Range visitRangeConversion(HRangeConversion conversion) {
@@ -851,30 +898,31 @@
   final HPhi loopPhi;
   final Map<HInstruction, Range> ranges;
   final HTypeMap types;
-  LoopUpdateRecognizer(this.loopPhi, this.ranges, this.types);
+  final ValueRangeInfo info;
+  LoopUpdateRecognizer(this.loopPhi, this.ranges, this.types, this.info);
 
   Range visitAdd(HAdd operation) {
     Range range = getRangeForRecognizableOperation(operation);
-    if (range == null) return const Range.unbound();
+    if (range == null) return info.newUnboundRange();
     Range initial = ranges[loopPhi.inputs[0]];
     if (range.isPositive) {
-      return new Range(initial.lower, const MaxIntValue());
+      return info.newRange(initial.lower, const MaxIntValue());
     } else if (range.isNegative) {
-      return new Range(const MinIntValue(), initial.upper);
+      return info.newRange(const MinIntValue(), initial.upper);
     }
-    return const Range.unbound();
+    return info.newUnboundRange();
   }
 
   Range visitSubtract(HSubtract operation) {
     Range range = getRangeForRecognizableOperation(operation);
-    if (range == null) return const Range.unbound();
+    if (range == null) return info.newUnboundRange();
     Range initial = ranges[loopPhi.inputs[0]];
     if (range.isPositive) {
-      return new Range(const MinIntValue(), initial.upper);
+      return info.newRange(const MinIntValue(), initial.upper);
     } else if (range.isNegative) {
-      return new Range(initial.lower, const MaxIntValue());
+      return info.newRange(initial.lower, const MaxIntValue());
     }
-    return const Range.unbound();
+    return info.newUnboundRange();
   }
 
   Range visitPhi(HPhi phi) {
@@ -921,8 +969,8 @@
     // We currently only handle constants in updates if the
     // update does not have a range.
     if (other.isConstant()) {
-      Value value = new IntValue(other.constant.value);
-      return new Range(value, value);
+      Value value = info.newIntValue(other.constant.value);
+      return info.newRange(value, value);
     }
     return null;
   }
diff --git a/lib/compiler/implementation/tree/nodes.dart b/lib/compiler/implementation/tree/nodes.dart
index 3c261ec..9d0be9eb 100644
--- a/lib/compiler/implementation/tree/nodes.dart
+++ b/lib/compiler/implementation/tree/nodes.dart
@@ -93,12 +93,6 @@
   return token;
 }
 
-class NodeAssertionFailure implements Exception {
-  final Node node;
-  final String message;
-  NodeAssertionFailure(this.node, this.message);
-}
-
 /**
  * A node in a syntax tree.
  *
@@ -338,22 +332,6 @@
     assert(receiver == null);
     return new Send(newReceiver, selector, argumentsNode);
   }
-
-  /**
-   * Returns the type annotation of a connstructor call in an object
-   * instantiation.
-   */
-  TypeAnnotation getTypeAnnotation() {
-    if (selector is TypeAnnotation) {
-      return selector;
-    } else if (selector is Send) {
-      Send selectorSend = selector;
-      if (selectorSend.receiver is TypeAnnotation) {
-        return selectorSend.receiver;
-      }
-    }
-    return null;
-  }
 }
 
 class Postfix extends NodeList {
@@ -657,12 +635,12 @@
     if (body != null) body.accept(visitor);
   }
 
-  bool hasBody() {
-    // TODO(karlklose,ahe): refactor AST nodes (issue 1713).
-    if (body.asReturn() != null) return true;
-    NodeList statements = body.asBlock().statements;
-    return (!statements.nodes.isEmpty ||
-            !identical(statements.getBeginToken().kind, $SEMICOLON));
+  bool hasBody() => body.asEmptyStatement() == null;
+
+  bool hasEmptyBody() {
+    Block block = body.asBlock();
+    if (block == null) return false;
+    return block.statements.isEmpty;
   }
 
   Token getBeginToken() {
@@ -1304,8 +1282,8 @@
    */
   DartString get dartString {
     if (isInterpolation) {
-      throw new NodeAssertionFailure(this,
-                                     "Getting dartString on interpolation;");
+      throw new SpannableAssertionFailure(
+          this, "Getting dartString on interpolation;");
     }
     if (dartStringCache == null) {
       DartString firstString = first.accept(const GetDartStringVisitor());
diff --git a/lib/compiler/implementation/tree/unparser.dart b/lib/compiler/implementation/tree/unparser.dart
index 9eb2794..1f410c1 100644
--- a/lib/compiler/implementation/tree/unparser.dart
+++ b/lib/compiler/implementation/tree/unparser.dart
@@ -109,26 +109,13 @@
     visit(node.function);
   }
 
-  visitFunctionExpression(FunctionExpression node) {
-    // Check length to not print unnecessary whitespace.
-    if (node.modifiers.nodes.length() > 0) {
-      visit(node.modifiers);
-      sb.add(' ');
-    }
-    if (node.returnType != null) {
-      visit(node.returnType);
-      sb.add(' ');
-    }
-    if (node.getOrSet != null) {
-      add(node.getOrSet.value);
-      sb.add(' ');
-    }
+  void unparseFunctionName(Node name) {
     // TODO(antonm): that's a workaround as currently FunctionExpression
     // names are modelled with Send and it emits operator[] as only
     // operator, without [] which are expected to be emitted with
     // arguments.
-    if (node.name is Send) {
-      Send send = node.name;
+    if (name is Send) {
+      Send send = name;
       assert(send is !SendSet);
       if (!send.isOperator) {
         // Looks like a factory method.
@@ -146,8 +133,25 @@
       }
       visit(send.selector);
     } else {
-      visit(node.name);
+      visit(name);
     }
+  }
+
+  visitFunctionExpression(FunctionExpression node) {
+    // Check length to not print unnecessary whitespace.
+    if (node.modifiers.nodes.length() > 0) {
+      visit(node.modifiers);
+      sb.add(' ');
+    }
+    if (node.returnType != null) {
+      visit(node.returnType);
+      sb.add(' ');
+    }
+    if (node.getOrSet != null) {
+      add(node.getOrSet.value);
+      sb.add(' ');
+    }
+    unparseFunctionName(node.name);
     visit(node.parameters);
     visit(node.initializers);
     visit(node.body);
diff --git a/lib/compiler/implementation/typechecker.dart b/lib/compiler/implementation/typechecker.dart
index 81d0e23..d9c27ff 100644
--- a/lib/compiler/implementation/typechecker.dart
+++ b/lib/compiler/implementation/typechecker.dart
@@ -26,9 +26,28 @@
   }
 }
 
+class TypeKind {
+  final String id;
+
+  const TypeKind(String this.id);
+
+  static const TypeKind FUNCTION = const TypeKind('function');
+  static const TypeKind INTERFACE = const TypeKind('interface');
+  static const TypeKind STATEMENT = const TypeKind('statement');
+  static const TypeKind TYPEDEF = const TypeKind('typedef');
+  static const TypeKind TYPE_VARIABLE = const TypeKind('type variable');
+  static const TypeKind VOID = const TypeKind('void');
+
+  String toString() => id;
+}
+
 abstract class DartType {
   abstract SourceString get name;
 
+  abstract TypeKind get kind;
+
+  const DartType();
+
   /**
    * Returns the [Element] which declared this type.
    *
@@ -53,13 +72,17 @@
   abstract DartType unalias(Compiler compiler);
 
   abstract bool operator ==(other);
+
+  DartType asRaw() => this;
 }
 
-class TypeVariableType implements DartType {
+class TypeVariableType extends DartType {
   final TypeVariableElement element;
 
   TypeVariableType(this.element);
 
+  TypeKind get kind => TypeKind.TYPE_VARIABLE;
+
   SourceString get name => element.name;
 
   DartType unalias(Compiler compiler) => this;
@@ -77,10 +100,13 @@
 /**
  * A statement type tracks whether a statement returns or may return.
  */
-class StatementType implements DartType {
+class StatementType extends DartType {
   final String stringName;
+
   Element get element => null;
 
+  TypeKind get kind => TypeKind.STATEMENT;
+
   SourceString get name => new SourceString(stringName);
 
   const StatementType(this.stringName);
@@ -106,9 +132,13 @@
   String toString() => stringName;
 }
 
-class VoidType implements DartType {
+class VoidType extends DartType {
   const VoidType(this.element);
+
+  TypeKind get kind => TypeKind.VOID;
+
   SourceString get name => element.name;
+
   final VoidElement element;
 
   DartType unalias(Compiler compiler) => this;
@@ -120,13 +150,15 @@
   String toString() => name.slowToString();
 }
 
-class InterfaceType implements DartType {
+class InterfaceType extends DartType {
   final Element element;
   final Link<DartType> arguments;
 
   const InterfaceType(this.element,
                       [this.arguments = const Link<DartType>()]);
 
+  TypeKind get kind => TypeKind.INTERFACE;
+
   SourceString get name => element.name;
 
   DartType unalias(Compiler compiler) => this;
@@ -158,9 +190,14 @@
     if (!identical(element, other.element)) return false;
     return arguments == other.arguments;
   }
+
+  InterfaceType asRaw() {
+    if (arguments.isEmpty) return this;
+    return new InterfaceType(element);
+  }
 }
 
-class FunctionType implements DartType {
+class FunctionType extends DartType {
   final Element element;
   DartType returnType;
   Link<DartType> parameterTypes;
@@ -170,6 +207,8 @@
     assert(element == null || invariant(element, element.isDeclaration));
   }
 
+  TypeKind get kind => TypeKind.FUNCTION;
+
   DartType unalias(Compiler compiler) => this;
 
   String toString() {
@@ -213,13 +252,15 @@
   }
 }
 
-class TypedefType implements DartType {
+class TypedefType extends DartType {
   final TypedefElement element;
   final Link<DartType> typeArguments;
 
   const TypedefType(this.element,
       [this.typeArguments = const Link<DartType>()]);
 
+  TypeKind get kind => TypeKind.TYPEDEF;
+
   SourceString get name => element.name;
 
   DartType unalias(Compiler compiler) {
@@ -521,7 +562,7 @@
   }
 
   DartType lookupMethodType(Node node, ClassElement classElement,
-                        SourceString name) {
+                            SourceString name) {
     Element member = classElement.lookupLocalMember(name);
     if (member == null) {
       classElement.ensureResolved(compiler);
diff --git a/lib/compiler/implementation/universe/universe.dart b/lib/compiler/implementation/universe/universe.dart
index d9df893..d4a01a5 100644
--- a/lib/compiler/implementation/universe/universe.dart
+++ b/lib/compiler/implementation/universe/universe.dart
@@ -198,7 +198,8 @@
 
   // TODO(kasperl): This belongs somewhere else.
   Selector.noSuchMethod()
-      : this(SelectorKind.CALL, Compiler.NO_SUCH_METHOD, null, 2);
+      : this(SelectorKind.CALL, Compiler.NO_SUCH_METHOD, null,
+             Compiler.NO_SUCH_METHOD_ARG_COUNT);
 
   bool isGetter() => identical(kind, SelectorKind.GETTER);
   bool isSetter() => identical(kind, SelectorKind.SETTER);
@@ -223,6 +224,9 @@
       => appliesUntyped(element, compiler);
 
   bool appliesUntyped(Element element, Compiler compiler) {
+    if (Elements.isUnresolved(element)) return false;
+    if (element.isForeign()) return true;
+
     if (element.isSetter()) return isSetter();
     if (element.isGetter()) return isGetter() || isCall();
     if (element.isField()) return isGetter() || isSetter() || isCall();
@@ -236,18 +240,12 @@
     if (positionalArgumentCount < requiredParameterCount) return false;
 
     if (!parameters.optionalParametersAreNamed) {
-      // TODO(5074): Remove this check once we don't accept the
-      // deprecated parameter specification.
-      if (!Compiler.REJECT_NAMED_ARGUMENT_AS_POSITIONAL) {
-        return optionalParametersAppliesDEPRECATED(element, compiler);
-      } else {
-        // We have already checked that the number of arguments are
-        // not greater than the number of parameters. Therefore the
-        // number of positional arguments are not greater than the
-        // number of parameters.
-        assert(positionalArgumentCount <= parameters.parameterCount);
-        return namedArguments.isEmpty;
-      }
+      // We have already checked that the number of arguments are
+      // not greater than the number of parameters. Therefore the
+      // number of positional arguments are not greater than the
+      // number of parameters.
+      assert(positionalArgumentCount <= parameters.parameterCount);
+      return namedArguments.isEmpty;
     } else {
       if (positionalArgumentCount > requiredParameterCount) return false;
       assert(positionalArgumentCount == requiredParameterCount);
@@ -267,98 +265,6 @@
     }
   }
 
-  // TODO(5074): Remove this method once we don't accept the
-  // deprecated parameter specification.
-  bool optionalParametersAppliesDEPRECATED(FunctionElement function,
-                                           Compiler compiler) {
-    FunctionSignature parameters = function.computeSignature(compiler);
-    int requiredParameterCount = parameters.requiredParameterCount;
-    int optionalParameterCount = parameters.optionalParameterCount;
-
-    bool hasOptionalParameters = !parameters.optionalParameters.isEmpty;
-    if (namedArguments.isEmpty) {
-      if (!hasOptionalParameters) {
-        return requiredParameterCount == argumentCount;
-      } else {
-        return argumentCount >= requiredParameterCount &&
-            argumentCount <= requiredParameterCount + optionalParameterCount;
-      }
-    } else {
-      if (!hasOptionalParameters) return false;
-      Link<Element> remainingNamedParameters = parameters.optionalParameters;
-      for (int i = requiredParameterCount; i < positionalArgumentCount; i++) {
-        remainingNamedParameters = remainingNamedParameters.tail;
-      }
-      Set<SourceString> nameSet = new Set<SourceString>();
-      for (;
-           !remainingNamedParameters.isEmpty;
-           remainingNamedParameters = remainingNamedParameters.tail) {
-        nameSet.add(remainingNamedParameters.head.name);
-      }
-
-      for (SourceString name in namedArguments) {
-        if (!nameSet.contains(name)) {
-          return false;
-        }
-        nameSet.remove(name);
-      }
-      return true;
-    }
-  }
-
-  // TODO(5074): Remove this method once we don't accept the
-  // deprecated parameter specification.
-  bool addOptionalArgumentsToListDEPRECATED(Link<Node> arguments,
-                                            List list,
-                                            FunctionElement element,
-                                            compileArgument(Node argument),
-                                            compileConstant(Element element),
-                                            Compiler compiler) {
-    assert(invariant(element, element.isImplementation));
-    // If there are named arguments, provide them in the order
-    // expected by the called function, which is the source order.
-    FunctionSignature parameters = element.computeSignature(compiler);
-
-    // Visit positional arguments and add them to the list.
-    for (int i = parameters.requiredParameterCount;
-         i < positionalArgumentCount;
-         arguments = arguments.tail, i++) {
-      list.add(compileArgument(arguments.head));
-    }
-
-    // Visit named arguments and add them into a temporary list.
-    List compiledNamedArguments = [];
-    for (; !arguments.isEmpty; arguments = arguments.tail) {
-      NamedArgument namedArgument = arguments.head;
-      compiledNamedArguments.add(compileArgument(namedArgument.expression));
-    }
-
-    Link<Element> remainingNamedParameters = parameters.optionalParameters;
-    // Skip the optional parameters that have been given in the
-    // positional arguments.
-    for (int i = parameters.requiredParameterCount;
-         i < positionalArgumentCount;
-         i++) {
-      remainingNamedParameters = remainingNamedParameters.tail;
-    }
-
-    // Loop over the remaining named parameters, and try to find
-    // their values: either in the temporary list or using the
-    // default value.
-    for (;
-         !remainingNamedParameters.isEmpty;
-         remainingNamedParameters = remainingNamedParameters.tail) {
-      Element parameter = remainingNamedParameters.head;
-      int foundIndex = namedArguments.indexOf(parameter.name);
-      if (foundIndex != -1) {
-        list.add(compiledNamedArguments[foundIndex]);
-      } else {
-        list.add(compileConstant(parameter));
-      }
-    }
-  }
-
-
   /**
    * Returns [:true:] if the selector and the [element] match; [:false:]
    * otherwise.
@@ -381,22 +287,14 @@
     });
 
     if (!parameters.optionalParametersAreNamed) {
-      // TODO(5074): Remove this check once we don't accept the
-      // deprecated parameter specification.
-      if (!Compiler.REJECT_NAMED_ARGUMENT_AS_POSITIONAL) {
-        addOptionalArgumentsToListDEPRECATED(
-            arguments, list, element, compileArgument, compileConstant,
-            compiler);
-      } else {
-        parameters.forEachOptionalParameter((element) {
-          if (!arguments.isEmpty) {
-            list.add(compileArgument(arguments.head));
-            arguments = arguments.tail;
-          } else {
-            list.add(compileConstant(element));
-          }
-        });
-      }
+      parameters.forEachOptionalParameter((element) {
+        if (!arguments.isEmpty) {
+          list.add(compileArgument(arguments.head));
+          arguments = arguments.tail;
+        } else {
+          list.add(compileConstant(element));
+        }
+      });
     } else {
       // Visit named arguments and add them into a temporary list.
       List compiledNamedArguments = [];
@@ -510,6 +408,8 @@
   }
 
   bool applies(Element element, Compiler compiler) {
+    // [TypedSelector] are only used when compiling.
+    assert(compiler.phase == Compiler.PHASE_COMPILING);
     if (!element.isMember()) return false;
 
     // A closure can be called through any typed selector:
@@ -523,7 +423,10 @@
     }
 
     ClassElement self = receiverType.element;
-    if (other.implementsInterface(self) || other.isSubclassOf(self)) {
+
+    if (other.implementsInterface(self)
+        || other.isSubclassOf(self)
+        || compiler.world.hasAnySubclassThatImplements(other, receiverType)) {
       return appliesUntyped(element, compiler);
     }
 
diff --git a/lib/compiler/implementation/util/util.dart b/lib/compiler/implementation/util/util.dart
index ef3b0f6..b39bd46 100644
--- a/lib/compiler/implementation/util/util.dart
+++ b/lib/compiler/implementation/util/util.dart
@@ -12,4 +12,13 @@
  * Tagging interface for classes from which source spans can be generated.
  */
 // TODO(johnniwinther): Find a better name.
+// TODO(ahe): How about "Bolt"?
 abstract class Spannable {}
+
+class SpannableAssertionFailure {
+  final Spannable node;
+  final String message;
+  SpannableAssertionFailure(this.node, this.message);
+
+  String toString() => 'compiler crashed.';
+}
diff --git a/lib/compiler/implementation/warnings.dart b/lib/compiler/implementation/warnings.dart
index f1198a2..97df27f 100644
--- a/lib/compiler/implementation/warnings.dart
+++ b/lib/compiler/implementation/warnings.dart
@@ -141,6 +141,8 @@
       'cannot use type variable as constructor');
   static const DUPLICATE_TYPE_VARIABLE_NAME = const MessageKind(
       'type variable #{1} already declared');
+  static const TYPE_VARIABLE_WITHIN_STATIC_MEMBER = const MessageKind(
+      'cannot refer to type variable #{1} within a static member');
   static const INVALID_BREAK = const MessageKind(
       'target of break is not a statement');
   static const INVALID_USE_OF_SUPER = const MessageKind(
diff --git a/lib/compiler/implementation/world.dart b/lib/compiler/implementation/world.dart
index 836d47c..bea9547 100644
--- a/lib/compiler/implementation/world.dart
+++ b/lib/compiler/implementation/world.dart
@@ -7,6 +7,7 @@
 class World {
   final Compiler compiler;
   final Map<ClassElement, Set<ClassElement>> subtypes;
+  final Map<ClassElement, Set<ClassElement>> typesImplementedBySubclasses;
   final Set<ClassElement> classesNeedingRti;
   final Map<ClassElement, Set<ClassElement>> rtiDependencies;
   final FunctionSet userDefinedGetters;
@@ -14,6 +15,8 @@
 
   World(Compiler compiler)
       : subtypes = new Map<ClassElement, Set<ClassElement>>(),
+        typesImplementedBySubclasses =
+            new Map<ClassElement, Set<ClassElement>>(),
         userDefinedGetters = new FunctionSet(compiler),
         userDefinedSetters = new FunctionSet(compiler),
         classesNeedingRti = new Set<ClassElement>(),
@@ -26,11 +29,26 @@
         compiler.internalErrorOnElement(
             cls, 'Class "${cls.name.slowToString()}" is not resolved.');
       }
+
       for (DartType type in cls.allSupertypes) {
         Set<Element> subtypesOfCls =
           subtypes.putIfAbsent(type.element, () => new Set<ClassElement>());
         subtypesOfCls.add(cls);
       }
+
+      // Walk through the superclasses, and record the types
+      // implemented by that type on the superclasses.
+      DartType type = cls.supertype;
+      while (type != null) {
+        Set<Element> typesImplementedBySubclassesOfCls =
+          typesImplementedBySubclasses.putIfAbsent(
+              type.element, () => new Set<ClassElement>());
+        for (DartType current in cls.allSupertypes) {
+          typesImplementedBySubclassesOfCls.add(current.element);
+        }
+        ClassElement classElement = type.element;
+        type = classElement.supertype;
+      }
     }
 
     compiler.resolverWorld.instantiatedClasses.forEach(addSubtypes);
@@ -106,6 +124,23 @@
     return userDefinedSetters.hasAnyElementMatchingSelector(selector);
   }
 
+  // Returns whether a subclass of [superclass] implements [type].
+  bool hasAnySubclassThatImplements(ClassElement superclass, DartType type) {
+    Set<ClassElement> typesImplementedBySubclasses =
+          typesImplementedBySubclasses[superclass];
+    if (typesImplementedBySubclasses == null) return false;
+    return typesImplementedBySubclasses.contains(type.element);
+  }
+
+  bool hasNoOverridingMember(Element element) {
+    ClassElement cls = element.getEnclosingClass();
+    Set<ClassElement> subclasses = compiler.world.subtypes[cls];
+    // TODO(ngeoffray): Implement the full thing.
+    return subclasses == null || subclasses.isEmpty;
+  }
+
+
+
   void registerUsedElement(Element element) {
     if (element.isMember()) {
       if (element.isGetter()) {
diff --git a/lib/core/core.dart b/lib/core/core.dart
index f602943..bf9af27 100644
--- a/lib/core/core.dart
+++ b/lib/core/core.dart
@@ -5,6 +5,7 @@
 #library("dart:core");
 
 #import("dart:coreimpl");
+#import("dart:collection");
 
 #source("bool.dart");
 #source("collection.dart");
diff --git a/lib/core/errors.dart b/lib/core/errors.dart
index 9a16d83..c516426 100644
--- a/lib/core/errors.dart
+++ b/lib/core/errors.dart
@@ -42,6 +42,36 @@
 }
 
 /**
+ * Exception thrown because of an index outside of the valid range.
+ *
+ * Temporarily extends [Exception] for backwards compatiblity.
+ */
+class RangeError extends ArgumentError implements Exception {
+  // TODO(lrn): This constructor should be called only with string values.
+  // It currently isn't in all cases.
+  /** Create a new [RangeError] with the given [message]. */
+  RangeError(var message) : super("$message");
+
+  /** Create a new [RangeError] with a message for the given [value]. */
+  RangeError.value(num value) : super("value $value");
+
+  String toString() => "RangeError: $message";
+}
+
+/**
+ * Temporary backwards compatibilty class.
+ *
+ * This class allows code throwing the old [IndexOutOfRangeException] to
+ * work until they change to the new [RangeError] name.
+ * Code **catching** IndexOutOfRangeException will fail to catch
+ * the [RangeError] objects that are now thrown.
+ */
+class IndexOutOfRangeException extends ArgumentError {
+  IndexOutOfRangeException(var message) : super(message);
+}
+
+
+/**
  * Temporary backwards compatibility class.
  *
  * Removed when users have had time to change to using [ArgumentError].
@@ -73,39 +103,56 @@
  */
 class NoSuchMethodError implements Error {
   final Object _receiver;
-  final String _functionName;
+  final String _memberName;
   final List _arguments;
+  final Map<String,Dynamic> _namedArguments;
   final List _existingArgumentNames;
 
   /**
    * Create a [NoSuchMethodError] corresponding to a failed method call.
    *
-   * The first parameter is the receiver of the method call.
-   * The second parameter is the name of the called method.
-   * The third parameter is the positional arguments that the method was
-   * called with.
+   * The first parameter to this constructor is the receiver of the method call.
+   * That is, the object on which the method was attempted called.
+   * The second parameter is the name of the called method or accessor.
+   * The third parameter is a list of the positional arguments that the method
+   * was called with.
+   * The fourth parameter is a map from [String] names to the values of named
+   * arguments that the method was called with.
    * The optional [exisitingArgumentNames] is the expected parameters of a
    * method with the same name on the receiver, if available. This is
    * the method that would have been called if the parameters had matched.
-   *
-   * TODO(lrn): This will be rewritten to use mirrors when they are available.
    */
   const NoSuchMethodError(Object this._receiver,
-                          String this._functionName,
+                          String this._memberName,
                           List this._arguments,
+                          Map<String,Dynamic> this._namedArguments,
                           [List existingArgumentNames = null])
       : this._existingArgumentNames = existingArgumentNames;
 
   String toString() {
     StringBuffer sb = new StringBuffer();
-    for (int i = 0; i < _arguments.length; i++) {
-      if (i > 0) {
-        sb.add(", ");
+    int i = 0;
+    if (_arguments != null) {
+      for (; i < _arguments.length; i++) {
+        if (i > 0) {
+          sb.add(", ");
+        }
+        sb.add(safeToString(_arguments[i]));
       }
-      sb.add(safeToString(_arguments[i]));
+    }
+    if (_namedArguments != null) {
+      _namedArguments.forEach((String key, var value) {
+        if (i > 0) {
+          sb.add(", ");
+        }
+        sb.add(key);
+        sb.add(": ");
+        sb.add(safeToString(value));
+        i++;
+      });
     }
     if (_existingArgumentNames === null) {
-      return "NoSuchMethodError : method not found: '$_functionName'\n"
+      return "NoSuchMethodError : method not found: '$_memberName'\n"
           "Receiver: ${safeToString(_receiver)}\n"
           "Arguments: [$sb]";
     } else {
@@ -119,10 +166,10 @@
       }
       String formalParameters = sb.toString();
       return "NoSuchMethodError: incorrect number of arguments passed to "
-          "method named '$_functionName'\n"
+          "method named '$_memberName'\n"
           "Receiver: ${safeToString(_receiver)}\n"
-          "Tried calling: $_functionName($actualParameters)\n"
-          "Found: $_functionName($formalParameters)";
+          "Tried calling: $_memberName($actualParameters)\n"
+          "Found: $_memberName($formalParameters)";
     }
   }
 
@@ -156,7 +203,7 @@
 class UnsupportedError implements Error {
   final String message;
   UnsupportedError(this.message);
-  String toString() => "Unsupported operation: message";
+  String toString() => "Unsupported operation: $message";
 }
 
 /**
@@ -168,7 +215,7 @@
 class StateError implements Error {
   final String message;
   StateError(this.message);
-  String toString() => "Bad state: message";
+  String toString() => "Bad state: $message";
 }
 
 
diff --git a/lib/core/exceptions.dart b/lib/core/exceptions.dart
index c1774ef..e498567 100644
--- a/lib/core/exceptions.dart
+++ b/lib/core/exceptions.dart
@@ -24,18 +24,6 @@
 
 
 /**
- * Exception thrown because of an index outside of the valid range.
- */
-class IndexOutOfRangeException implements Exception {
-  const IndexOutOfRangeException(this._value);
-
-  String toString() => "IndexOutOfRangeException: $_value";
-
-  final _value;
-}
-
-
-/**
  * Exception thrown when a string or some other data does not have an expected
  * format and cannot be parsed or processed.
  */
diff --git a/lib/core/expect.dart b/lib/core/expect.dart
index adf0604..b26ddc5 100644
--- a/lib/core/expect.dart
+++ b/lib/core/expect.dart
@@ -264,13 +264,16 @@
                       String reason = null]) {
     try {
       f();
-    } catch (e) {
+    } catch (e, s) {
       if (check !== null) {
-        Expect.isTrue(check(e));
+        if (!check(e)) {
+          String msg = reason == null ? "" : reason;
+          _fail("Expect.throws($msg): Unexpected '$e'\n$s");
+        }
       }
       return;
     }
-    String msg = _getMessage(reason);
+    String msg = reason == null ? "" : reason;
     _fail('Expect.throws($msg) fails');
   }
 
diff --git a/lib/core/list.dart b/lib/core/list.dart
index 6dd841f..b4948a3 100644
--- a/lib/core/list.dart
+++ b/lib/core/list.dart
@@ -7,7 +7,7 @@
  * fixed size or extendable.
  */
 interface List<E> extends Collection<E>, Sequence<E>
-                  default ListImplementation<E> {
+                  default _ListImpl<E> {
   /**
    * Creates a list of the given [length].
    *
@@ -27,13 +27,13 @@
 
   /**
    * Returns the element at the given [index] in the list or throws
-   * an [IndexOutOfRangeException] if [index] is out of bounds.
+   * an [RangeError] if [index] is out of bounds.
    */
   E operator [](int index);
 
   /**
    * Sets the entry at the given [index] in the list to [value].
-   * Throws an [IndexOutOfRangeException] if [index] is out of bounds.
+   * Throws an [RangeError] if [index] is out of bounds.
    */
   void operator []=(int index, E value);
 
@@ -108,7 +108,7 @@
    * down by one position.
    * Returns the removed element.
    * Throws an [ArgumentError] if [index] is not an [int].
-   * Throws an [IndexOutOfRangeException] if the [index] does not point inside
+   * Throws an [RangeError] if the [index] does not point inside
    * the list.
    * Throws an [UnsupportedError], and doesn't remove the element,
    * if the length of the list cannot be changed.
@@ -133,7 +133,7 @@
    * starting at  [start].
    * Returns an empty list if [length] is 0.
    * Throws an [ArgumentError] if [length] is negative.
-   * Throws an [IndexOutOfRangeException] if [start] or
+   * Throws an [RangeError] if [start] or
    * [:start + length - 1:] are out of range.
    */
   List<E> getRange(int start, int length);
@@ -143,7 +143,7 @@
    * at [startFrom], into the list, starting at [start].
    * If [length] is 0, this method does not do anything.
    * Throws an [ArgumentError] if [length] is negative.
-   * Throws an [IndexOutOfRangeException] if [start] or
+   * Throws an [RangeError] if [start] or
    * [:start + length - 1:] are out of range for [:this:], or if
    * [startFrom] or [:startFrom + length - 1:] are out of range for [from].
    */
@@ -155,7 +155,7 @@
    * not extendable.
    * If [length] is 0, this method does not do anything.
    * Throws an [ArgumentError] if [length] is negative.
-   * Throws an [IndexOutOfRangeException] if [start] or
+   * Throws an [RangeError] if [start] or
    * [:start + length: - 1] are out of range.
    */
   void removeRange(int start, int length);
@@ -169,8 +169,25 @@
    * If [start] is the length of the list, this method inserts the
    * range at the end of the list.
    * Throws an [ArgumentError] if [length] is negative.
-   * Throws an [IndexOutOfRangeException] if [start] is negative or if
+   * Throws an [RangeError] if [start] is negative or if
    * [start] is greater than the length of the list.
    */
   void insertRange(int start, int length, [E initialValue]);
 }
+
+class _ListImpl<E> {
+  /**
+   * Factory implementation of List().
+   *
+   * Creates a list of the given [length].
+   */
+  external factory List([int length]);
+
+  /**
+   * Factory implementation of List.from().
+   *
+   * Creates a list with the elements of [other]. The order in
+   * the list will be the order provided by the iterator of [other].
+   */
+  external factory List.from(Iterable<E> other);
+}
diff --git a/lib/core/object.dart b/lib/core/object.dart
index ba41cb8..4ab04bca 100644
--- a/lib/core/object.dart
+++ b/lib/core/object.dart
@@ -48,14 +48,15 @@
   /**
    * [noSuchMethod] is invoked when users invoke a non-existant method
    * on an object. The name of the method and the arguments of the
-   * invocation are passed to [noSuchMethod]. If [noSuchMethod]
-   * returns a value, that value becomes the result of the original
-   * invocation.
+   * invocation are passed to [noSuchMethod] in an [InvocationMirror].
+   * If [noSuchMethod] returns a value, that value becomes the result of
+   * the original invocation.
    *
    * The default behavior of [noSuchMethod] is to throw a
    * [noSuchMethodError].
    */
-  external Dynamic noSuchMethod(String name, List args);
+  external dynamic noSuchMethod(InvocationMirror invocation);
+
   /**
    * A representation of the runtime type of the object.
    */
diff --git a/lib/core/queue.dart b/lib/core/queue.dart
index ecdfe36..bf1e49c 100644
--- a/lib/core/queue.dart
+++ b/lib/core/queue.dart
@@ -70,3 +70,269 @@
    */
   void clear();
 }
+
+
+/**
+ * An entry in a doubly linked list. It contains a pointer to the next
+ * entry, the previous entry, and the boxed element.
+ *
+ * WARNING: This class is temporary located in dart:core. It'll be removed
+ * at some point in the near future.
+ */
+class DoubleLinkedQueueEntry<E> {
+  DoubleLinkedQueueEntry<E> _previous;
+  DoubleLinkedQueueEntry<E> _next;
+  E _element;
+
+  DoubleLinkedQueueEntry(E e) {
+    _element = e;
+  }
+
+  void _link(DoubleLinkedQueueEntry<E> p,
+             DoubleLinkedQueueEntry<E> n) {
+    _next = n;
+    _previous = p;
+    p._next = this;
+    n._previous = this;
+  }
+
+  void append(E e) {
+    new DoubleLinkedQueueEntry<E>(e)._link(this, _next);
+  }
+
+  void prepend(E e) {
+    new DoubleLinkedQueueEntry<E>(e)._link(_previous, this);
+  }
+
+  E remove() {
+    _previous._next = _next;
+    _next._previous = _previous;
+    _next = null;
+    _previous = null;
+    return _element;
+  }
+
+  DoubleLinkedQueueEntry<E> _asNonSentinelEntry() {
+    return this;
+  }
+
+  DoubleLinkedQueueEntry<E> previousEntry() {
+    return _previous._asNonSentinelEntry();
+  }
+
+  DoubleLinkedQueueEntry<E> nextEntry() {
+    return _next._asNonSentinelEntry();
+  }
+
+  E get element {
+    return _element;
+  }
+
+  void set element(E e) {
+    _element = e;
+  }
+}
+
+/**
+ * A sentinel in a double linked list is used to manipulate the list
+ * at both ends. A double linked list has exactly one sentinel, which
+ * is the only entry when the list is constructed. Initially, a
+ * sentinel has its next and previous entry point to itself. A
+ * sentinel does not box any user element.
+ */
+class _DoubleLinkedQueueEntrySentinel<E> extends DoubleLinkedQueueEntry<E> {
+  _DoubleLinkedQueueEntrySentinel() : super(null) {
+    _link(this, this);
+  }
+
+  E remove() {
+    throw new StateError("Empty queue");
+  }
+
+  DoubleLinkedQueueEntry<E> _asNonSentinelEntry() {
+    return null;
+  }
+
+  void set element(E e) {
+    // This setter is unreachable.
+    assert(false);
+  }
+
+  E get element {
+    throw new StateError("Empty queue");
+  }
+}
+
+/**
+ * Implementation of a double linked list that box list elements into
+ * DoubleLinkedQueueEntry objects.
+ *
+ * WARNING: This class is temporary located in dart:core. It'll be removed
+ * at some point in the near future.
+ */
+class DoubleLinkedQueue<E> implements Queue<E> {
+  _DoubleLinkedQueueEntrySentinel<E> _sentinel;
+
+  DoubleLinkedQueue() {
+    _sentinel = new _DoubleLinkedQueueEntrySentinel<E>();
+  }
+
+  factory DoubleLinkedQueue.from(Iterable<E> other) {
+    Queue<E> list = new DoubleLinkedQueue();
+    for (final e in other) {
+      list.addLast(e);
+    }
+    return list;
+  }
+
+  void addLast(E value) {
+    _sentinel.prepend(value);
+  }
+
+  void addFirst(E value) {
+    _sentinel.append(value);
+  }
+
+  void add(E value) {
+    addLast(value);
+  }
+
+  void addAll(Collection<E> collection) {
+    for (final e in collection) {
+      add(e);
+    }
+  }
+
+  E removeLast() {
+    return _sentinel._previous.remove();
+  }
+
+  E removeFirst() {
+    return _sentinel._next.remove();
+  }
+
+  E get first {
+    return _sentinel._next.element;
+  }
+
+  E get last {
+    return _sentinel._previous.element;
+  }
+
+  DoubleLinkedQueueEntry<E> lastEntry() {
+    return _sentinel.previousEntry();
+  }
+
+  DoubleLinkedQueueEntry<E> firstEntry() {
+    return _sentinel.nextEntry();
+  }
+
+  int get length {
+    int counter = 0;
+    forEach(void _(E element) { counter++; });
+    return counter;
+  }
+
+  bool get isEmpty {
+    return (_sentinel._next === _sentinel);
+  }
+
+  void clear() {
+    _sentinel._next = _sentinel;
+    _sentinel._previous = _sentinel;
+  }
+
+  void forEach(void f(E element)) {
+    DoubleLinkedQueueEntry<E> entry = _sentinel._next;
+    while (entry !== _sentinel) {
+      DoubleLinkedQueueEntry<E> nextEntry = entry._next;
+      f(entry._element);
+      entry = nextEntry;
+    }
+  }
+
+  void forEachEntry(void f(DoubleLinkedQueueEntry<E> element)) {
+    DoubleLinkedQueueEntry<E> entry = _sentinel._next;
+    while (entry !== _sentinel) {
+      DoubleLinkedQueueEntry<E> nextEntry = entry._next;
+      f(entry);
+      entry = nextEntry;
+    }
+  }
+
+  bool every(bool f(E element)) {
+    DoubleLinkedQueueEntry<E> entry = _sentinel._next;
+    while (entry !== _sentinel) {
+      DoubleLinkedQueueEntry<E> nextEntry = entry._next;
+      if (!f(entry._element)) return false;
+      entry = nextEntry;
+    }
+    return true;
+  }
+
+  bool some(bool f(E element)) {
+    DoubleLinkedQueueEntry<E> entry = _sentinel._next;
+    while (entry !== _sentinel) {
+      DoubleLinkedQueueEntry<E> nextEntry = entry._next;
+      if (f(entry._element)) return true;
+      entry = nextEntry;
+    }
+    return false;
+  }
+
+  Queue map(f(E element)) {
+    Queue other = new Queue();
+    DoubleLinkedQueueEntry<E> entry = _sentinel._next;
+    while (entry !== _sentinel) {
+      DoubleLinkedQueueEntry<E> nextEntry = entry._next;
+      other.addLast(f(entry._element));
+      entry = nextEntry;
+    }
+    return other;
+  }
+
+  Dynamic reduce(Dynamic initialValue,
+                 Dynamic combine(Dynamic previousValue, E element)) {
+    return Collections.reduce(this, initialValue, combine);
+  }
+
+  Queue<E> filter(bool f(E element)) {
+    Queue<E> other = new Queue<E>();
+    DoubleLinkedQueueEntry<E> entry = _sentinel._next;
+    while (entry !== _sentinel) {
+      DoubleLinkedQueueEntry<E> nextEntry = entry._next;
+      if (f(entry._element)) other.addLast(entry._element);
+      entry = nextEntry;
+    }
+    return other;
+  }
+
+  _DoubleLinkedQueueIterator<E> iterator() {
+    return new _DoubleLinkedQueueIterator<E>(_sentinel);
+  }
+
+  String toString() {
+    return Collections.collectionToString(this);
+  }
+}
+
+class _DoubleLinkedQueueIterator<E> implements Iterator<E> {
+  final _DoubleLinkedQueueEntrySentinel<E> _sentinel;
+  DoubleLinkedQueueEntry<E> _currentEntry;
+
+  _DoubleLinkedQueueIterator(_DoubleLinkedQueueEntrySentinel this._sentinel) {
+    _currentEntry = _sentinel;
+  }
+
+  bool get hasNext {
+    return _currentEntry._next !== _sentinel;
+  }
+
+  E next() {
+    if (!hasNext) {
+      throw new StateError("No more elements");
+    }
+    _currentEntry = _currentEntry._next;
+    return _currentEntry.element;
+  }
+}
diff --git a/lib/core/stopwatch.dart b/lib/core/stopwatch.dart
index 2cb77a7..79e08c9 100644
--- a/lib/core/stopwatch.dart
+++ b/lib/core/stopwatch.dart
@@ -14,7 +14,7 @@
    *
    *     Stopwatch stopwatch = new Stopwatch()..start();
    */
-  factory Stopwatch() => new StopwatchImplementation();
+  factory Stopwatch() => new _StopwatchImpl();
 
   /**
    * Starts the [Stopwatch]. The [elapsed] count is increasing monotonically.
@@ -62,3 +62,69 @@
    */
   int get frequency;
 }
+
+class _StopwatchImpl implements Stopwatch {
+  // The _start and _stop fields capture the time when [start] and [stop]
+  // are called respectively.
+  // If _start is null, then the [Stopwatch] has not been started yet.
+  // If _stop is null, then the [Stopwatch] has not been stopped yet,
+  // or is running.
+  int _start;
+  int _stop;
+
+  _StopwatchImpl() : _start = null, _stop = null {}
+
+  void start() {
+    if (_start === null) {
+      // This stopwatch has never been started.
+      _start = _now();
+    } else {
+      if (_stop === null) {
+        return;
+      }
+      // Restarting this stopwatch. Prepend the elapsed time to the current
+      // start time.
+      _start = _now() - (_stop - _start);
+      _stop = null;
+    }
+  }
+
+  void stop() {
+    if (_start === null || _stop !== null) {
+      return;
+    }
+    _stop = _now();
+  }
+
+  void reset() {
+    if (_start === null) return;
+    // If [_start] is not null, then the stopwatch had already been started. It
+    // may running right now.
+    _start = _now();
+    if (_stop !== null) {
+      // The watch is not running. So simply set the [_stop] to [_start] thus
+      // having an elapsed time of 0.
+      _stop = _start;
+    }
+  }
+
+  int get elapsedTicks {
+    if (_start === null) {
+      return 0;
+    }
+    return (_stop === null) ? (_now() - _start) : (_stop - _start);
+  }
+
+  int get elapsedMicroseconds {
+    return (elapsedTicks * 1000000) ~/ frequency;
+  }
+
+  int get elapsedMilliseconds {
+    return (elapsedTicks * 1000) ~/ frequency;
+  }
+
+  int get frequency => _frequency();
+
+  external static int _frequency();
+  external static int _now();
+}
diff --git a/lib/core/string.dart b/lib/core/string.dart
index 801e415..ad4aefe 100644
--- a/lib/core/string.dart
+++ b/lib/core/string.dart
@@ -10,7 +10,7 @@
  */
 interface String
     extends Comparable, Pattern, Sequence<String>
-    default StringImplementation {
+    default _StringImpl {
   /**
    * Allocates a new String for the specified [charCodes].
    */
@@ -131,3 +131,22 @@
    */
   String toUpperCase();
 }
+
+class _StringImpl {
+  /**
+   * Factory implementation of String.fromCharCodes:
+   * Allocates a new String for the specified [charCodes].
+   */
+  external factory String.fromCharCodes(List<int> charCodes);
+
+  /**
+   * Joins all the given strings to create a new string.
+   */
+  external static String join(List<String> strings, String separator);
+
+  /**
+   * Concatenates all the given strings to create a new string.
+   */
+  external static String concatAll(List<String> strings);
+
+}
diff --git a/lib/core/string_buffer.dart b/lib/core/string_buffer.dart
index 7530cdb..0561d83 100644
--- a/lib/core/string_buffer.dart
+++ b/lib/core/string_buffer.dart
@@ -117,7 +117,7 @@
   String toString() {
     if (_buffer.length === 0) return "";
     if (_buffer.length === 1) return _buffer[0];
-    String result = StringImplementation.concatAll(_buffer);
+    String result = _StringImpl.concatAll(_buffer);
     _buffer.clear();
     _buffer.add(result);
     // Since we track the length at each add operation, there is no
diff --git a/lib/core/strings.dart b/lib/core/strings.dart
index e8cbcc0..86655e9 100644
--- a/lib/core/strings.dart
+++ b/lib/core/strings.dart
@@ -7,13 +7,13 @@
    * Joins all the given strings to create a new string.
    */
   static String join(List<String> strings, String separator) {
-    return StringImplementation.join(strings, separator);
+    return _StringImpl.join(strings, separator);
   }
 
   /**
    * Concatenates all the given strings to create a new string.
    */
   static String concatAll(List<String> strings) {
-    return StringImplementation.concatAll(strings);
+    return _StringImpl.concatAll(strings);
   }
 }
diff --git a/lib/coreimpl/coreimpl.dart b/lib/coreimpl/coreimpl.dart
index 7e5b7ec..c28a72b 100644
--- a/lib/coreimpl/coreimpl.dart
+++ b/lib/coreimpl/coreimpl.dart
@@ -4,14 +4,8 @@
 
 #library("dart:coreimpl");
 
-#source("arrays.dart");
-#source("collections.dart");
+#import("dart:collection");
+
 #source("hash_map_set.dart");
 #source("linked_hash_map.dart");
-#source("list.dart");
-#source("maps.dart");
-#source("queue.dart");
 #source("regexp.dart");
-#source("splay_tree.dart");
-#source("stopwatch_implementation.dart");
-#source("string.dart");
diff --git a/lib/coreimpl/corelib_impl_sources.gypi b/lib/coreimpl/corelib_impl_sources.gypi
index 0ff6644..82531db 100644
--- a/lib/coreimpl/corelib_impl_sources.gypi
+++ b/lib/coreimpl/corelib_impl_sources.gypi
@@ -4,16 +4,8 @@
 
 {
   'sources': [
-    'arrays.dart',
-    'collections.dart',
     'hash_map_set.dart',
     'linked_hash_map.dart',
-    'list.dart',
-    'maps.dart',
-    'queue.dart',
     'regexp.dart',
-    'splay_tree.dart',
-    'stopwatch_implementation.dart',
-    'string.dart',
   ],
 }
diff --git a/lib/coreimpl/list.dart b/lib/coreimpl/list.dart
deleted file mode 100644
index f162140..0000000
--- a/lib/coreimpl/list.dart
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/**
- * A [List] is an indexable collection with a length. It can be of
- * fixed size or extendable.
- */
-class ListImplementation<E> {
-  /**
-   * Factory implementation of List().
-   *
-   * Creates a list of the given [length].
-   */
-  external factory List([int length]);
-
-  /**
-   * Factory implementation of List.from().
-   *
-   * Creates a list with the elements of [other]. The order in
-   * the list will be the order provided by the iterator of [other].
-   */
-  factory List.from(Iterable<E> other) {
-    // TODO(ajohnsen): Make external once the vm can handle it, so we don't
-    // lose generic type information.
-    // Issue: #4727
-    return _from(other);
-  }
-
-  external static List _from(Iterable other);
-}
diff --git a/lib/coreimpl/queue.dart b/lib/coreimpl/queue.dart
deleted file mode 100644
index b56d7d1..0000000
--- a/lib/coreimpl/queue.dart
+++ /dev/null
@@ -1,263 +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.
-
-
-/**
- * An entry in a doubly linked list. It contains a pointer to the next
- * entry, the previous entry, and the boxed element.
- */
-class DoubleLinkedQueueEntry<E> {
-  DoubleLinkedQueueEntry<E> _previous;
-  DoubleLinkedQueueEntry<E> _next;
-  E _element;
-
-  DoubleLinkedQueueEntry(E e) {
-    _element = e;
-  }
-
-  void _link(DoubleLinkedQueueEntry<E> p,
-             DoubleLinkedQueueEntry<E> n) {
-    _next = n;
-    _previous = p;
-    p._next = this;
-    n._previous = this;
-  }
-
-  void append(E e) {
-    new DoubleLinkedQueueEntry<E>(e)._link(this, _next);
-  }
-
-  void prepend(E e) {
-    new DoubleLinkedQueueEntry<E>(e)._link(_previous, this);
-  }
-
-  E remove() {
-    _previous._next = _next;
-    _next._previous = _previous;
-    _next = null;
-    _previous = null;
-    return _element;
-  }
-
-  DoubleLinkedQueueEntry<E> _asNonSentinelEntry() {
-    return this;
-  }
-
-  DoubleLinkedQueueEntry<E> previousEntry() {
-    return _previous._asNonSentinelEntry();
-  }
-
-  DoubleLinkedQueueEntry<E> nextEntry() {
-    return _next._asNonSentinelEntry();
-  }
-
-  E get element {
-    return _element;
-  }
-
-  void set element(E e) {
-    _element = e;
-  }
-}
-
-/**
- * A sentinel in a double linked list is used to manipulate the list
- * at both ends. A double linked list has exactly one sentinel, which
- * is the only entry when the list is constructed. Initially, a
- * sentinel has its next and previous entry point to itself. A
- * sentinel does not box any user element.
- */
-class _DoubleLinkedQueueEntrySentinel<E> extends DoubleLinkedQueueEntry<E> {
-  _DoubleLinkedQueueEntrySentinel() : super(null) {
-    _link(this, this);
-  }
-
-  E remove() {
-    throw new StateError("Empty queue");
-  }
-
-  DoubleLinkedQueueEntry<E> _asNonSentinelEntry() {
-    return null;
-  }
-
-  void set element(E e) {
-    // This setter is unreachable.
-    assert(false);
-  }
-
-  E get element {
-    throw new StateError("Empty queue");
-  }
-}
-
-/**
- * Implementation of a double linked list that box list elements into
- * DoubleLinkedQueueEntry objects.
- */
-class DoubleLinkedQueue<E> implements Queue<E> {
-  _DoubleLinkedQueueEntrySentinel<E> _sentinel;
-
-  DoubleLinkedQueue() {
-    _sentinel = new _DoubleLinkedQueueEntrySentinel<E>();
-  }
-
-  factory DoubleLinkedQueue.from(Iterable<E> other) {
-    Queue<E> list = new DoubleLinkedQueue();
-    for (final e in other) {
-      list.addLast(e);
-    }
-    return list;
-  }
-
-  void addLast(E value) {
-    _sentinel.prepend(value);
-  }
-
-  void addFirst(E value) {
-    _sentinel.append(value);
-  }
-
-  void add(E value) {
-    addLast(value);
-  }
-
-  void addAll(Collection<E> collection) {
-    for (final e in collection) {
-      add(e);
-    }
-  }
-
-  E removeLast() {
-    return _sentinel._previous.remove();
-  }
-
-  E removeFirst() {
-    return _sentinel._next.remove();
-  }
-
-  E get first {
-    return _sentinel._next.element;
-  }
-
-  E get last {
-    return _sentinel._previous.element;
-  }
-
-  DoubleLinkedQueueEntry<E> lastEntry() {
-    return _sentinel.previousEntry();
-  }
-
-  DoubleLinkedQueueEntry<E> firstEntry() {
-    return _sentinel.nextEntry();
-  }
-
-  int get length {
-    int counter = 0;
-    forEach(void _(E element) { counter++; });
-    return counter;
-  }
-
-  bool get isEmpty {
-    return (_sentinel._next === _sentinel);
-  }
-
-  void clear() {
-    _sentinel._next = _sentinel;
-    _sentinel._previous = _sentinel;
-  }
-
-  void forEach(void f(E element)) {
-    DoubleLinkedQueueEntry<E> entry = _sentinel._next;
-    while (entry !== _sentinel) {
-      DoubleLinkedQueueEntry<E> nextEntry = entry._next;
-      f(entry._element);
-      entry = nextEntry;
-    }
-  }
-
-  void forEachEntry(void f(DoubleLinkedQueueEntry<E> element)) {
-    DoubleLinkedQueueEntry<E> entry = _sentinel._next;
-    while (entry !== _sentinel) {
-      DoubleLinkedQueueEntry<E> nextEntry = entry._next;
-      f(entry);
-      entry = nextEntry;
-    }
-  }
-
-  bool every(bool f(E element)) {
-    DoubleLinkedQueueEntry<E> entry = _sentinel._next;
-    while (entry !== _sentinel) {
-      DoubleLinkedQueueEntry<E> nextEntry = entry._next;
-      if (!f(entry._element)) return false;
-      entry = nextEntry;
-    }
-    return true;
-  }
-
-  bool some(bool f(E element)) {
-    DoubleLinkedQueueEntry<E> entry = _sentinel._next;
-    while (entry !== _sentinel) {
-      DoubleLinkedQueueEntry<E> nextEntry = entry._next;
-      if (f(entry._element)) return true;
-      entry = nextEntry;
-    }
-    return false;
-  }
-
-  Queue map(f(E element)) {
-    Queue other = new Queue();
-    DoubleLinkedQueueEntry<E> entry = _sentinel._next;
-    while (entry !== _sentinel) {
-      DoubleLinkedQueueEntry<E> nextEntry = entry._next;
-      other.addLast(f(entry._element));
-      entry = nextEntry;
-    }
-    return other;
-  }
-
-  Dynamic reduce(Dynamic initialValue,
-                 Dynamic combine(Dynamic previousValue, E element)) {
-    return Collections.reduce(this, initialValue, combine);
-  }
-
-  Queue<E> filter(bool f(E element)) {
-    Queue<E> other = new Queue<E>();
-    DoubleLinkedQueueEntry<E> entry = _sentinel._next;
-    while (entry !== _sentinel) {
-      DoubleLinkedQueueEntry<E> nextEntry = entry._next;
-      if (f(entry._element)) other.addLast(entry._element);
-      entry = nextEntry;
-    }
-    return other;
-  }
-
-  _DoubleLinkedQueueIterator<E> iterator() {
-    return new _DoubleLinkedQueueIterator<E>(_sentinel);
-  }
-
-  String toString() {
-    return Collections.collectionToString(this);
-  }
-}
-
-class _DoubleLinkedQueueIterator<E> implements Iterator<E> {
-  final _DoubleLinkedQueueEntrySentinel<E> _sentinel;
-  DoubleLinkedQueueEntry<E> _currentEntry;
-
-  _DoubleLinkedQueueIterator(_DoubleLinkedQueueEntrySentinel this._sentinel) {
-    _currentEntry = _sentinel;
-  }
-
-  bool get hasNext {
-    return _currentEntry._next !== _sentinel;
-  }
-
-  E next() {
-    if (!hasNext) {
-      throw new StateError("No more elements");
-    }
-    _currentEntry = _currentEntry._next;
-    return _currentEntry.element;
-  }
-}
diff --git a/lib/coreimpl/stopwatch_implementation.dart b/lib/coreimpl/stopwatch_implementation.dart
deleted file mode 100644
index 30b4ca2..0000000
--- a/lib/coreimpl/stopwatch_implementation.dart
+++ /dev/null
@@ -1,72 +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.
-
-/**
- * A simple implementation of the [Stopwatch] interface.
- */
-class StopwatchImplementation implements Stopwatch {
-  // The _start and _stop fields capture the time when [start] and [stop]
-  // are called respectively.
-  // If _start is null, then the [Stopwatch] has not been started yet.
-  // If _stop is null, then the [Stopwatch] has not been stopped yet,
-  // or is running.
-  int _start;
-  int _stop;
-
-  StopwatchImplementation() : _start = null, _stop = null {}
-
-  void start() {
-    if (_start === null) {
-      // This stopwatch has never been started.
-      _start = _now();
-    } else {
-      if (_stop === null) {
-        return;
-      }
-      // Restarting this stopwatch. Prepend the elapsed time to the current
-      // start time.
-      _start = _now() - (_stop - _start);
-      _stop = null;
-    }
-  }
-
-  void stop() {
-    if (_start === null || _stop !== null) {
-      return;
-    }
-    _stop = _now();
-  }
-
-  void reset() {
-    if (_start === null) return;
-    // If [_start] is not null, then the stopwatch had already been started. It
-    // may running right now.
-    _start = _now();
-    if (_stop !== null) {
-      // The watch is not running. So simply set the [_stop] to [_start] thus
-      // having an elapsed time of 0.
-      _stop = _start;
-    }
-  }
-
-  int get elapsedTicks {
-    if (_start === null) {
-      return 0;
-    }
-    return (_stop === null) ? (_now() - _start) : (_stop - _start);
-  }
-
-  int get elapsedMicroseconds {
-    return (elapsedTicks * 1000000) ~/ frequency;
-  }
-
-  int get elapsedMilliseconds {
-    return (elapsedTicks * 1000) ~/ frequency;
-  }
-
-  int get frequency => _frequency();
-
-  external static int _frequency();
-  external static int _now();
-}
diff --git a/lib/coreimpl/string.dart b/lib/coreimpl/string.dart
deleted file mode 100644
index 4e23e67..0000000
--- a/lib/coreimpl/string.dart
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class StringImplementation {
-  /**
-   * Factory implementation of String.fromCharCodes:
-   * Allocates a new String for the specified [charCodes].
-   */
-  factory String.fromCharCodes(List<int> charCodes) {
-    return _fromCharCodes(charCodes);
-  }
-
-  external static String _fromCharCodes(List<int> charCodes);
-
-  /**
-   * Joins all the given strings to create a new string.
-   */
-  external static String join(List<String> strings, String separator);
-
-  /**
-   * Concatenates all the given strings to create a new string.
-   */
-  external static String concatAll(List<String> strings);
-
-}
diff --git a/lib/html/dart2js/html_dart2js.dart b/lib/html/dart2js/html_dart2js.dart
index 738c5d4..663b0c0 100644
--- a/lib/html/dart2js/html_dart2js.dart
+++ b/lib/html/dart2js/html_dart2js.dart
@@ -97,6 +97,58 @@
 
 // WARNING: Do not edit - generated code.
 
+/// @domName AnalyserNode
+abstract class AnalyserNode implements AudioNode {
+
+  /** @domName AnalyserNode.fftSize */
+  int fftSize;
+
+  /** @domName AnalyserNode.frequencyBinCount */
+  int get frequencyBinCount;
+
+  /** @domName AnalyserNode.maxDecibels */
+  num maxDecibels;
+
+  /** @domName AnalyserNode.minDecibels */
+  num minDecibels;
+
+  /** @domName AnalyserNode.smoothingTimeConstant */
+  num smoothingTimeConstant;
+
+  /** @domName AnalyserNode.getByteFrequencyData */
+  void getByteFrequencyData(Uint8Array array);
+
+  /** @domName AnalyserNode.getByteTimeDomainData */
+  void getByteTimeDomainData(Uint8Array array);
+
+  /** @domName AnalyserNode.getFloatFrequencyData */
+  void getFloatFrequencyData(Float32Array array);
+}
+
+class _AnalyserNodeImpl extends _AudioNodeImpl implements AnalyserNode native "*AnalyserNode" {
+
+  int fftSize;
+
+  final int frequencyBinCount;
+
+  num maxDecibels;
+
+  num minDecibels;
+
+  num smoothingTimeConstant;
+
+  void getByteFrequencyData(_Uint8ArrayImpl array) native;
+
+  void getByteTimeDomainData(_Uint8ArrayImpl array) native;
+
+  void getFloatFrequencyData(_Float32ArrayImpl array) 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.
+
+// WARNING: Do not edit - generated code.
+
 /// @domName HTMLAnchorElement
 abstract class AnchorElement implements Element {
 
@@ -631,8 +683,11 @@
   /** @domName AudioBufferSourceNode.loop */
   bool loop;
 
-  /** @domName AudioBufferSourceNode.looping */
-  bool looping;
+  /** @domName AudioBufferSourceNode.loopEnd */
+  num loopEnd;
+
+  /** @domName AudioBufferSourceNode.loopStart */
+  num loopStart;
 
   /** @domName AudioBufferSourceNode.playbackRate */
   AudioParam get playbackRate;
@@ -688,7 +743,9 @@
 
   bool loop;
 
-  bool looping;
+  num loopEnd;
+
+  num loopStart;
 
   final _AudioParamImpl playbackRate;
 
@@ -701,30 +758,6 @@
 
 // WARNING: Do not edit - generated code.
 
-/// @domName AudioChannelMerger
-abstract class AudioChannelMerger implements AudioNode {
-}
-
-class _AudioChannelMergerImpl extends _AudioNodeImpl implements AudioChannelMerger native "*AudioChannelMerger" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName AudioChannelSplitter
-abstract class AudioChannelSplitter implements AudioNode {
-}
-
-class _AudioChannelSplitterImpl extends _AudioNodeImpl implements AudioChannelSplitter native "*AudioChannelSplitter" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
 
 /// @domName AudioContext
 abstract class AudioContext implements EventTarget {
@@ -751,7 +784,7 @@
   num get sampleRate;
 
   /** @domName AudioContext.createAnalyser */
-  RealtimeAnalyserNode createAnalyser();
+  AnalyserNode createAnalyser();
 
   /** @domName AudioContext.createBiquadFilter */
   BiquadFilterNode createBiquadFilter();
@@ -763,25 +796,22 @@
   AudioBufferSourceNode createBufferSource();
 
   /** @domName AudioContext.createChannelMerger */
-  AudioChannelMerger createChannelMerger([int numberOfInputs]);
+  ChannelMergerNode createChannelMerger([int numberOfInputs]);
 
   /** @domName AudioContext.createChannelSplitter */
-  AudioChannelSplitter createChannelSplitter([int numberOfOutputs]);
+  ChannelSplitterNode createChannelSplitter([int numberOfOutputs]);
 
   /** @domName AudioContext.createConvolver */
   ConvolverNode createConvolver();
 
-  /** @domName AudioContext.createDelayNode */
-  DelayNode createDelayNode([num maxDelayTime]);
+  /** @domName AudioContext.createDelay */
+  DelayNode createDelay([num maxDelayTime]);
 
   /** @domName AudioContext.createDynamicsCompressor */
   DynamicsCompressorNode createDynamicsCompressor();
 
-  /** @domName AudioContext.createGainNode */
-  AudioGainNode createGainNode();
-
-  /** @domName AudioContext.createJavaScriptNode */
-  JavaScriptAudioNode createJavaScriptNode(int bufferSize, [int numberOfInputChannels, int numberOfOutputChannels]);
+  /** @domName AudioContext.createGain */
+  GainNode createGain();
 
   /** @domName AudioContext.createMediaElementSource */
   MediaElementAudioSourceNode createMediaElementSource(MediaElement mediaElement);
@@ -790,10 +820,13 @@
   MediaStreamAudioSourceNode createMediaStreamSource(MediaStream mediaStream);
 
   /** @domName AudioContext.createOscillator */
-  Oscillator createOscillator();
+  OscillatorNode createOscillator();
 
   /** @domName AudioContext.createPanner */
-  AudioPannerNode createPanner();
+  PannerNode createPanner();
+
+  /** @domName AudioContext.createScriptProcessor */
+  ScriptProcessorNode createScriptProcessor(int bufferSize, [int numberOfInputChannels, int numberOfOutputChannels]);
 
   /** @domName AudioContext.createWaveShaper */
   WaveShaperNode createWaveShaper();
@@ -828,7 +861,7 @@
 
   final num sampleRate;
 
-  _RealtimeAnalyserNodeImpl createAnalyser() native;
+  _AnalyserNodeImpl createAnalyser() native;
 
   _BiquadFilterNodeImpl createBiquadFilter() native;
 
@@ -836,27 +869,27 @@
 
   _AudioBufferSourceNodeImpl createBufferSource() native;
 
-  _AudioChannelMergerImpl createChannelMerger([int numberOfInputs]) native;
+  _ChannelMergerNodeImpl createChannelMerger([int numberOfInputs]) native;
 
-  _AudioChannelSplitterImpl createChannelSplitter([int numberOfOutputs]) native;
+  _ChannelSplitterNodeImpl createChannelSplitter([int numberOfOutputs]) native;
 
   _ConvolverNodeImpl createConvolver() native;
 
-  _DelayNodeImpl createDelayNode([num maxDelayTime]) native;
+  _DelayNodeImpl createDelay([num maxDelayTime]) native;
 
   _DynamicsCompressorNodeImpl createDynamicsCompressor() native;
 
-  _AudioGainNodeImpl createGainNode() native;
-
-  _JavaScriptAudioNodeImpl createJavaScriptNode(int bufferSize, [int numberOfInputChannels, int numberOfOutputChannels]) native;
+  _GainNodeImpl createGain() native;
 
   _MediaElementAudioSourceNodeImpl createMediaElementSource(_MediaElementImpl mediaElement) native;
 
   _MediaStreamAudioSourceNodeImpl createMediaStreamSource(_MediaStreamImpl mediaStream) native;
 
-  _OscillatorImpl createOscillator() native;
+  _OscillatorNodeImpl createOscillator() native;
 
-  _AudioPannerNodeImpl createPanner() native;
+  _PannerNodeImpl createPanner() native;
+
+  _ScriptProcessorNodeImpl createScriptProcessor(int bufferSize, [int numberOfInputChannels, int numberOfOutputChannels]) native;
 
   _WaveShaperNodeImpl createWaveShaper() native;
 
@@ -926,23 +959,6 @@
 
 // WARNING: Do not edit - generated code.
 
-/// @domName AudioGainNode
-abstract class AudioGainNode implements AudioNode {
-
-  /** @domName AudioGainNode.gain */
-  AudioGain get gain;
-}
-
-class _AudioGainNodeImpl extends _AudioNodeImpl implements AudioGainNode native "*AudioGainNode" {
-
-  final _AudioGainImpl gain;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
 /// @domName AudioListener
 abstract class AudioListener {
 
@@ -1017,95 +1033,6 @@
 
 // WARNING: Do not edit - generated code.
 
-/// @domName AudioPannerNode
-abstract class AudioPannerNode implements AudioNode {
-
-  static const int EQUALPOWER = 0;
-
-  static const int EXPONENTIAL_DISTANCE = 2;
-
-  static const int HRTF = 1;
-
-  static const int INVERSE_DISTANCE = 1;
-
-  static const int LINEAR_DISTANCE = 0;
-
-  static const int SOUNDFIELD = 2;
-
-  /** @domName AudioPannerNode.coneGain */
-  AudioGain get coneGain;
-
-  /** @domName AudioPannerNode.coneInnerAngle */
-  num coneInnerAngle;
-
-  /** @domName AudioPannerNode.coneOuterAngle */
-  num coneOuterAngle;
-
-  /** @domName AudioPannerNode.coneOuterGain */
-  num coneOuterGain;
-
-  /** @domName AudioPannerNode.distanceGain */
-  AudioGain get distanceGain;
-
-  /** @domName AudioPannerNode.distanceModel */
-  int distanceModel;
-
-  /** @domName AudioPannerNode.maxDistance */
-  num maxDistance;
-
-  /** @domName AudioPannerNode.panningModel */
-  int panningModel;
-
-  /** @domName AudioPannerNode.refDistance */
-  num refDistance;
-
-  /** @domName AudioPannerNode.rolloffFactor */
-  num rolloffFactor;
-
-  /** @domName AudioPannerNode.setOrientation */
-  void setOrientation(num x, num y, num z);
-
-  /** @domName AudioPannerNode.setPosition */
-  void setPosition(num x, num y, num z);
-
-  /** @domName AudioPannerNode.setVelocity */
-  void setVelocity(num x, num y, num z);
-}
-
-class _AudioPannerNodeImpl extends _AudioNodeImpl implements AudioPannerNode native "*AudioPannerNode" {
-
-  final _AudioGainImpl coneGain;
-
-  num coneInnerAngle;
-
-  num coneOuterAngle;
-
-  num coneOuterGain;
-
-  final _AudioGainImpl distanceGain;
-
-  int distanceModel;
-
-  num maxDistance;
-
-  int panningModel;
-
-  num refDistance;
-
-  num rolloffFactor;
-
-  void setOrientation(num x, num y, num z) native;
-
-  void setPosition(num x, num y, num z) native;
-
-  void setVelocity(num x, num y, num z) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
 /// @domName AudioParam
 abstract class AudioParam {
 
@@ -1136,8 +1063,8 @@
   /** @domName AudioParam.linearRampToValueAtTime */
   void linearRampToValueAtTime(num value, num time);
 
-  /** @domName AudioParam.setTargetValueAtTime */
-  void setTargetValueAtTime(num targetValue, num time, num timeConstant);
+  /** @domName AudioParam.setTargetAtTime */
+  void setTargetAtTime(num target, num time, num timeConstant);
 
   /** @domName AudioParam.setValueAtTime */
   void setValueAtTime(num value, num time);
@@ -1166,7 +1093,7 @@
 
   void linearRampToValueAtTime(num value, num time) native;
 
-  void setTargetValueAtTime(num targetValue, num time, num timeConstant) native;
+  void setTargetAtTime(num target, num time, num timeConstant) native;
 
   void setValueAtTime(num value, num time) native;
 
@@ -7823,6 +7750,30 @@
 
 // WARNING: Do not edit - generated code.
 
+/// @domName ChannelMergerNode
+abstract class ChannelMergerNode implements AudioNode {
+}
+
+class _ChannelMergerNodeImpl extends _AudioNodeImpl implements ChannelMergerNode native "*ChannelMergerNode" {
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+/// @domName ChannelSplitterNode
+abstract class ChannelSplitterNode implements AudioNode {
+}
+
+class _ChannelSplitterNodeImpl extends _AudioNodeImpl implements ChannelSplitterNode native "*ChannelSplitterNode" {
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
 /// @domName CharacterData
 abstract class CharacterData implements Node {
 
@@ -8259,6 +8210,9 @@
 
   /** @domName HTMLContentElement.select */
   String select;
+
+  /** @domName HTMLContentElement.getDistributedNodes */
+  List<Node> getDistributedNodes();
 }
 
 class _ContentElementImpl extends _ElementImpl implements ContentElement native "*HTMLContentElement" {
@@ -8266,6 +8220,8 @@
   bool resetStyleInheritance;
 
   String select;
+
+  List<Node> getDistributedNodes() 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
@@ -9313,7 +9269,7 @@
   String toString();
 
   /** @domName DOMTokenList.toggle */
-  bool toggle(String token);
+  bool toggle(String token, [bool force]);
 }
 
 class _DOMTokenListImpl implements DOMTokenList native "*DOMTokenList" {
@@ -9326,7 +9282,7 @@
 
   String toString() native;
 
-  bool toggle(String token) native;
+  bool toggle(String token, [bool force]) 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
@@ -14484,6 +14440,23 @@
 
 // WARNING: Do not edit - generated code.
 
+/// @domName GainNode
+abstract class GainNode implements AudioNode {
+
+  /** @domName GainNode.gain */
+  AudioGain get gain;
+}
+
+class _GainNodeImpl extends _AudioNodeImpl implements GainNode native "*GainNode" {
+
+  final _AudioGainImpl gain;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
 /// @domName Gamepad
 abstract class Gamepad {
 
@@ -15047,7 +15020,7 @@
       _HttpRequestFactoryProvider.createHttpRequest_get(url, onSuccess);
 
   factory HttpRequest.getWithCredentials(String url, onSuccess(HttpRequest request)) =>
-      _HttpRequestFactoryProvider.createHttpRequestgetWithCredentials(url, onSuccess);
+      _HttpRequestFactoryProvider.createHttpRequest_getWithCredentials(url, onSuccess);
 
   factory HttpRequest() => _HttpRequestFactoryProvider.createHttpRequest();
 
@@ -15359,10 +15332,10 @@
   String get direction;
 
   /** @domName IDBCursor.key */
-  dynamic get key;
+  Object get key;
 
   /** @domName IDBCursor.primaryKey */
-  dynamic get primaryKey;
+  Object get primaryKey;
 
   /** @domName IDBCursor.source */
   dynamic get source;
@@ -15384,11 +15357,9 @@
 
   final String direction;
 
-  dynamic get key => _convertNativeToDart_IDBKey(this._key);
-  dynamic get _key => JS("dynamic", "#.key", this);
+  final Object key;
 
-  dynamic get primaryKey => _convertNativeToDart_IDBKey(this._primaryKey);
-  dynamic get _primaryKey => JS("dynamic", "#.primaryKey", this);
+  final Object primaryKey;
 
   final dynamic source;
 
@@ -15424,13 +15395,12 @@
 abstract class IDBCursorWithValue implements IDBCursor {
 
   /** @domName IDBCursorWithValue.value */
-  dynamic get value;
+  Object get value;
 }
 
 class _IDBCursorWithValueImpl extends _IDBCursorImpl implements IDBCursorWithValue native "*IDBCursorWithValue" {
 
-  dynamic get value => _convertNativeToDart_IDBAny(this._value);
-  dynamic get _value => JS("dynamic", "#.value", this);
+  final Object value;
 }
 // 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
@@ -16191,14 +16161,6 @@
 
   _IDBOpenDBRequestEventsImpl get on =>
     new _IDBOpenDBRequestEventsImpl(this);
-
-  // From EventTarget
-
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
-
-  bool $dom_dispatchEvent(_EventImpl event) native "dispatchEvent";
-
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
 }
 
 class _IDBOpenDBRequestEventsImpl extends _IDBRequestEventsImpl implements IDBOpenDBRequestEvents {
@@ -16442,14 +16404,6 @@
 
   _IDBVersionChangeRequestEventsImpl get on =>
     new _IDBVersionChangeRequestEventsImpl(this);
-
-  // From EventTarget
-
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
-
-  bool $dom_dispatchEvent(_EventImpl event) native "dispatchEvent";
-
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
 }
 
 class _IDBVersionChangeRequestEventsImpl extends _IDBRequestEventsImpl implements IDBVersionChangeRequestEvents {
@@ -16761,6 +16715,9 @@
   /** @domName HTMLInputElement.defaultValue */
   String defaultValue;
 
+  /** @domName HTMLInputElement.dirName */
+  String dirName;
+
   /** @domName HTMLInputElement.disabled */
   bool disabled;
 
@@ -16893,6 +16850,9 @@
   /** @domName HTMLInputElement.setCustomValidity */
   void setCustomValidity(String error);
 
+  /** @domName HTMLInputElement.setRangeText */
+  void setRangeText(String replacement, [int start, int end, String selectionMode]);
+
   /** @domName HTMLInputElement.setSelectionRange */
   void setSelectionRange(int start, int end, [String direction]);
 
@@ -16929,6 +16889,8 @@
 
   String defaultValue;
 
+  String dirName;
+
   bool disabled;
 
   _FileListImpl files;
@@ -17017,6 +16979,8 @@
 
   void setCustomValidity(String error) native;
 
+  void setRangeText(String replacement, [int start, int end, String selectionMode]) native;
+
   void setSelectionRange(int start, int end, [String direction]) native;
 
   void stepDown([int n]) native;
@@ -17392,50 +17356,6 @@
 
 // WARNING: Do not edit - generated code.
 
-/// @domName JavaScriptAudioNode
-abstract class JavaScriptAudioNode implements AudioNode, EventTarget {
-
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
-  JavaScriptAudioNodeEvents get on;
-
-  /** @domName JavaScriptAudioNode.bufferSize */
-  int get bufferSize;
-}
-
-abstract class JavaScriptAudioNodeEvents implements Events {
-
-  EventListenerList get audioProcess;
-}
-
-class _JavaScriptAudioNodeImpl extends _AudioNodeImpl implements JavaScriptAudioNode native "*JavaScriptAudioNode" {
-
-  _JavaScriptAudioNodeEventsImpl get on =>
-    new _JavaScriptAudioNodeEventsImpl(this);
-
-  final int bufferSize;
-
-  // From EventTarget
-
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
-
-  bool $dom_dispatchEvent(_EventImpl event) native "dispatchEvent";
-
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
-}
-
-class _JavaScriptAudioNodeEventsImpl extends _EventsImpl implements JavaScriptAudioNodeEvents {
-  _JavaScriptAudioNodeEventsImpl(_ptr) : super(_ptr);
-
-  EventListenerList get audioProcess => this['audioprocess'];
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
 /// @domName JavaScriptCallFrame
 abstract class JavaScriptCallFrame {
 
@@ -17929,14 +17849,6 @@
 class _LocalMediaStreamImpl extends _MediaStreamImpl implements LocalMediaStream native "*LocalMediaStream" {
 
   void stop() native;
-
-  // From EventTarget
-
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
-
-  bool $dom_dispatchEvent(_EventImpl event) native "dispatchEvent";
-
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
 }
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -21863,6 +21775,18 @@
 
 // WARNING: Do not edit - generated code.
 
+/// @domName OESElementIndexUint
+abstract class OESElementIndexUint {
+}
+
+class _OESElementIndexUintImpl implements OESElementIndexUint native "*OESElementIndexUint" {
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
 /// @domName OESStandardDerivatives
 abstract class OESStandardDerivatives {
 
@@ -22185,8 +22109,8 @@
 
 // WARNING: Do not edit - generated code.
 
-/// @domName Oscillator
-abstract class Oscillator implements AudioSourceNode {
+/// @domName OscillatorNode
+abstract class OscillatorNode implements AudioSourceNode {
 
   static const int CUSTOM = 4;
 
@@ -22206,29 +22130,29 @@
 
   static const int UNSCHEDULED_STATE = 0;
 
-  /** @domName Oscillator.detune */
+  /** @domName OscillatorNode.detune */
   AudioParam get detune;
 
-  /** @domName Oscillator.frequency */
+  /** @domName OscillatorNode.frequency */
   AudioParam get frequency;
 
-  /** @domName Oscillator.playbackState */
+  /** @domName OscillatorNode.playbackState */
   int get playbackState;
 
-  /** @domName Oscillator.type */
+  /** @domName OscillatorNode.type */
   int type;
 
-  /** @domName Oscillator.setWaveTable */
+  /** @domName OscillatorNode.setWaveTable */
   void setWaveTable(WaveTable waveTable);
 
-  /** @domName Oscillator.start */
+  /** @domName OscillatorNode.start */
   void start(num when);
 
-  /** @domName Oscillator.stop */
+  /** @domName OscillatorNode.stop */
   void stop(num when);
 }
 
-class _OscillatorImpl extends _AudioSourceNodeImpl implements Oscillator native "*Oscillator" {
+class _OscillatorNodeImpl extends _AudioSourceNodeImpl implements OscillatorNode native "*OscillatorNode" {
 
   final _AudioParamImpl detune;
 
@@ -22396,6 +22320,95 @@
 
 // WARNING: Do not edit - generated code.
 
+/// @domName PannerNode
+abstract class PannerNode implements AudioNode {
+
+  static const int EQUALPOWER = 0;
+
+  static const int EXPONENTIAL_DISTANCE = 2;
+
+  static const int HRTF = 1;
+
+  static const int INVERSE_DISTANCE = 1;
+
+  static const int LINEAR_DISTANCE = 0;
+
+  static const int SOUNDFIELD = 2;
+
+  /** @domName PannerNode.coneGain */
+  AudioGain get coneGain;
+
+  /** @domName PannerNode.coneInnerAngle */
+  num coneInnerAngle;
+
+  /** @domName PannerNode.coneOuterAngle */
+  num coneOuterAngle;
+
+  /** @domName PannerNode.coneOuterGain */
+  num coneOuterGain;
+
+  /** @domName PannerNode.distanceGain */
+  AudioGain get distanceGain;
+
+  /** @domName PannerNode.distanceModel */
+  int distanceModel;
+
+  /** @domName PannerNode.maxDistance */
+  num maxDistance;
+
+  /** @domName PannerNode.panningModel */
+  int panningModel;
+
+  /** @domName PannerNode.refDistance */
+  num refDistance;
+
+  /** @domName PannerNode.rolloffFactor */
+  num rolloffFactor;
+
+  /** @domName PannerNode.setOrientation */
+  void setOrientation(num x, num y, num z);
+
+  /** @domName PannerNode.setPosition */
+  void setPosition(num x, num y, num z);
+
+  /** @domName PannerNode.setVelocity */
+  void setVelocity(num x, num y, num z);
+}
+
+class _PannerNodeImpl extends _AudioNodeImpl implements PannerNode native "*PannerNode" {
+
+  final _AudioGainImpl coneGain;
+
+  num coneInnerAngle;
+
+  num coneOuterAngle;
+
+  num coneOuterGain;
+
+  final _AudioGainImpl distanceGain;
+
+  int distanceModel;
+
+  num maxDistance;
+
+  int panningModel;
+
+  num refDistance;
+
+  num rolloffFactor;
+
+  void setOrientation(num x, num y, num z) native;
+
+  void setPosition(num x, num y, num z) native;
+
+  void setVelocity(num x, num y, num z) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
 /// @domName HTMLParagraphElement
 abstract class ParagraphElement implements Element {
 
@@ -23277,7 +23290,7 @@
   void addIceCandidate(RTCIceCandidate candidate);
 
   /** @domName RTCPeerConnection.addStream */
-  void addStream(MediaStream stream, Map mediaConstraints);
+  void addStream(MediaStream stream, [Map mediaConstraints]);
 
   /** @domName RTCPeerConnection.close */
   void close();
@@ -23286,7 +23299,7 @@
   void createAnswer(RTCSessionDescriptionCallback successCallback, [RTCErrorCallback failureCallback, Map mediaConstraints]);
 
   /** @domName RTCPeerConnection.createDataChannel */
-  RTCDataChannel createDataChannel(String label, Map options);
+  RTCDataChannel createDataChannel(String label, [Map options]);
 
   /** @domName RTCPeerConnection.createOffer */
   void createOffer(RTCSessionDescriptionCallback successCallback, [RTCErrorCallback failureCallback, Map mediaConstraints]);
@@ -23310,7 +23323,7 @@
   void setRemoteDescription(RTCSessionDescription description, [VoidCallback successCallback, RTCErrorCallback failureCallback]);
 
   /** @domName RTCPeerConnection.updateIce */
-  void updateIce(Map configuration, Map mediaConstraints);
+  void updateIce([Map configuration, Map mediaConstraints]);
 }
 
 abstract class RTCPeerConnectionEvents implements Events {
@@ -23351,34 +23364,53 @@
 
   void addIceCandidate(_RTCIceCandidateImpl candidate) native;
 
-  void addStream(_MediaStreamImpl stream, Map mediaConstraints) {
-    var mediaConstraints_1 = _convertDartToNative_Dictionary(mediaConstraints);
-    _addStream_1(stream, mediaConstraints_1);
+  void addStream(_MediaStreamImpl stream, [mediaConstraints]) {
+    if (?mediaConstraints) {
+      var mediaConstraints_1 = _convertDartToNative_Dictionary(mediaConstraints);
+      _addStream_1(stream, mediaConstraints_1);
+      return;
+    }
+    _addStream_2(stream);
     return;
   }
   void _addStream_1(_MediaStreamImpl stream, mediaConstraints) native "addStream";
+  void _addStream_2(_MediaStreamImpl stream) native "addStream";
 
   void close() native;
 
   void createAnswer(RTCSessionDescriptionCallback successCallback, [failureCallback, mediaConstraints]) {
-    var mediaConstraints_1 = _convertDartToNative_Dictionary(mediaConstraints);
-    _createAnswer_1(successCallback, failureCallback, mediaConstraints_1);
+    if (?mediaConstraints) {
+      var mediaConstraints_1 = _convertDartToNative_Dictionary(mediaConstraints);
+      _createAnswer_1(successCallback, failureCallback, mediaConstraints_1);
+      return;
+    }
+    _createAnswer_2(successCallback, failureCallback);
     return;
   }
   void _createAnswer_1(RTCSessionDescriptionCallback successCallback, RTCErrorCallback failureCallback, mediaConstraints) native "createAnswer";
+  void _createAnswer_2(RTCSessionDescriptionCallback successCallback, RTCErrorCallback failureCallback) native "createAnswer";
 
-  _RTCDataChannelImpl createDataChannel(String label, Map options) {
-    var options_1 = _convertDartToNative_Dictionary(options);
-    return _createDataChannel_1(label, options_1);
+  _RTCDataChannelImpl createDataChannel(String label, [options]) {
+    if (?options) {
+      var options_1 = _convertDartToNative_Dictionary(options);
+      return _createDataChannel_1(label, options_1);
+    }
+    return _createDataChannel_2(label);
   }
   _RTCDataChannelImpl _createDataChannel_1(label, options) native "createDataChannel";
+  _RTCDataChannelImpl _createDataChannel_2(label) native "createDataChannel";
 
   void createOffer(RTCSessionDescriptionCallback successCallback, [failureCallback, mediaConstraints]) {
-    var mediaConstraints_1 = _convertDartToNative_Dictionary(mediaConstraints);
-    _createOffer_1(successCallback, failureCallback, mediaConstraints_1);
+    if (?mediaConstraints) {
+      var mediaConstraints_1 = _convertDartToNative_Dictionary(mediaConstraints);
+      _createOffer_1(successCallback, failureCallback, mediaConstraints_1);
+      return;
+    }
+    _createOffer_2(successCallback, failureCallback);
     return;
   }
   void _createOffer_1(RTCSessionDescriptionCallback successCallback, RTCErrorCallback failureCallback, mediaConstraints) native "createOffer";
+  void _createOffer_2(RTCSessionDescriptionCallback successCallback, RTCErrorCallback failureCallback) native "createOffer";
 
   bool $dom_dispatchEvent(_EventImpl event) native "dispatchEvent";
 
@@ -23392,13 +23424,24 @@
 
   void setRemoteDescription(_RTCSessionDescriptionImpl description, [VoidCallback successCallback, RTCErrorCallback failureCallback]) native;
 
-  void updateIce(Map configuration, Map mediaConstraints) {
-    var configuration_1 = _convertDartToNative_Dictionary(configuration);
-    var mediaConstraints_2 = _convertDartToNative_Dictionary(mediaConstraints);
-    _updateIce_1(configuration_1, mediaConstraints_2);
+  void updateIce([configuration, mediaConstraints]) {
+    if (?mediaConstraints) {
+      var configuration_1 = _convertDartToNative_Dictionary(configuration);
+      var mediaConstraints_2 = _convertDartToNative_Dictionary(mediaConstraints);
+      _updateIce_1(configuration_1, mediaConstraints_2);
+      return;
+    }
+    if (?configuration) {
+      var configuration_3 = _convertDartToNative_Dictionary(configuration);
+      _updateIce_2(configuration_3);
+      return;
+    }
+    _updateIce_3();
     return;
   }
   void _updateIce_1(configuration, mediaConstraints) native "updateIce";
+  void _updateIce_2(configuration) native "updateIce";
+  void _updateIce_3() native "updateIce";
 }
 
 class _RTCPeerConnectionEventsImpl extends _EventsImpl implements RTCPeerConnectionEvents {
@@ -23761,58 +23804,6 @@
 
 // WARNING: Do not edit - generated code.
 
-/// @domName RealtimeAnalyserNode
-abstract class RealtimeAnalyserNode implements AudioNode {
-
-  /** @domName RealtimeAnalyserNode.fftSize */
-  int fftSize;
-
-  /** @domName RealtimeAnalyserNode.frequencyBinCount */
-  int get frequencyBinCount;
-
-  /** @domName RealtimeAnalyserNode.maxDecibels */
-  num maxDecibels;
-
-  /** @domName RealtimeAnalyserNode.minDecibels */
-  num minDecibels;
-
-  /** @domName RealtimeAnalyserNode.smoothingTimeConstant */
-  num smoothingTimeConstant;
-
-  /** @domName RealtimeAnalyserNode.getByteFrequencyData */
-  void getByteFrequencyData(Uint8Array array);
-
-  /** @domName RealtimeAnalyserNode.getByteTimeDomainData */
-  void getByteTimeDomainData(Uint8Array array);
-
-  /** @domName RealtimeAnalyserNode.getFloatFrequencyData */
-  void getFloatFrequencyData(Float32Array array);
-}
-
-class _RealtimeAnalyserNodeImpl extends _AudioNodeImpl implements RealtimeAnalyserNode native "*RealtimeAnalyserNode" {
-
-  int fftSize;
-
-  final int frequencyBinCount;
-
-  num maxDecibels;
-
-  num minDecibels;
-
-  num smoothingTimeConstant;
-
-  void getByteFrequencyData(_Uint8ArrayImpl array) native;
-
-  void getByteTimeDomainData(_Uint8ArrayImpl array) native;
-
-  void getFloatFrequencyData(_Float32ArrayImpl array) 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.
-
-// WARNING: Do not edit - generated code.
-
 /// @domName Rect
 abstract class Rect {
 
@@ -24149,19 +24140,9 @@
 
   final _SVGAnimatedStringImpl target;
 
-  // From SVGURIReference
+  // From SVGExternalResourcesRequired
 
-  final _SVGAnimatedStringImpl href;
-
-  // From SVGTests
-
-  final _SVGStringListImpl requiredExtensions;
-
-  final _SVGStringListImpl requiredFeatures;
-
-  final _SVGStringListImpl systemLanguage;
-
-  bool hasExtension(String extension) native;
+  final _SVGAnimatedBooleanImpl externalResourcesRequired;
 
   // From SVGLangSpace
 
@@ -24169,23 +24150,6 @@
 
   String xmlspace;
 
-  // From SVGExternalResourcesRequired
-
-  final _SVGAnimatedBooleanImpl externalResourcesRequired;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-
-  // From SVGTransformable
-
-  final _SVGAnimatedTransformListImpl transform;
-
   // From SVGLocatable
 
   final _SVGElementImpl farthestViewportElement;
@@ -24199,6 +24163,33 @@
   _SVGMatrixImpl getScreenCTM() native;
 
   _SVGMatrixImpl getTransformToElement(_SVGElementImpl element) native;
+
+  // From SVGStylable
+
+  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
+
+  // Use implementation from Element.
+  // final _CSSStyleDeclarationImpl style;
+
+  _CSSValueImpl getPresentationAttribute(String name) native;
+
+  // From SVGTests
+
+  final _SVGStringListImpl requiredExtensions;
+
+  final _SVGStringListImpl requiredFeatures;
+
+  final _SVGStringListImpl systemLanguage;
+
+  bool hasExtension(String extension) native;
+
+  // From SVGTransformable
+
+  final _SVGAnimatedTransformListImpl transform;
+
+  // From SVGURIReference
+
+  final _SVGAnimatedStringImpl href;
 }
 // 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
@@ -24895,20 +24886,6 @@
 
   num getStartTime() native;
 
-  // From SVGTests
-
-  final _SVGStringListImpl requiredExtensions;
-
-  final _SVGStringListImpl requiredFeatures;
-
-  final _SVGStringListImpl systemLanguage;
-
-  bool hasExtension(String extension) native;
-
-  // From SVGExternalResourcesRequired
-
-  final _SVGAnimatedBooleanImpl externalResourcesRequired;
-
   // From ElementTimeControl
 
   void beginElement() native;
@@ -24918,6 +24895,20 @@
   void endElement() native;
 
   void endElementAt(num offset) native;
+
+  // From SVGExternalResourcesRequired
+
+  final _SVGAnimatedBooleanImpl externalResourcesRequired;
+
+  // From SVGTests
+
+  final _SVGStringListImpl requiredExtensions;
+
+  final _SVGStringListImpl requiredFeatures;
+
+  final _SVGStringListImpl systemLanguage;
+
+  bool hasExtension(String extension) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -24946,15 +24937,9 @@
 
   final _SVGAnimatedLengthImpl r;
 
-  // From SVGTests
+  // From SVGExternalResourcesRequired
 
-  final _SVGStringListImpl requiredExtensions;
-
-  final _SVGStringListImpl requiredFeatures;
-
-  final _SVGStringListImpl systemLanguage;
-
-  bool hasExtension(String extension) native;
+  final _SVGAnimatedBooleanImpl externalResourcesRequired;
 
   // From SVGLangSpace
 
@@ -24962,23 +24947,6 @@
 
   String xmlspace;
 
-  // From SVGExternalResourcesRequired
-
-  final _SVGAnimatedBooleanImpl externalResourcesRequired;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-
-  // From SVGTransformable
-
-  final _SVGAnimatedTransformListImpl transform;
-
   // From SVGLocatable
 
   final _SVGElementImpl farthestViewportElement;
@@ -24992,6 +24960,29 @@
   _SVGMatrixImpl getScreenCTM() native;
 
   _SVGMatrixImpl getTransformToElement(_SVGElementImpl element) native;
+
+  // From SVGStylable
+
+  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
+
+  // Use implementation from Element.
+  // final _CSSStyleDeclarationImpl style;
+
+  _CSSValueImpl getPresentationAttribute(String name) native;
+
+  // From SVGTests
+
+  final _SVGStringListImpl requiredExtensions;
+
+  final _SVGStringListImpl requiredFeatures;
+
+  final _SVGStringListImpl systemLanguage;
+
+  bool hasExtension(String extension) native;
+
+  // From SVGTransformable
+
+  final _SVGAnimatedTransformListImpl transform;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -25010,15 +25001,9 @@
 
   final _SVGAnimatedEnumerationImpl clipPathUnits;
 
-  // From SVGTests
+  // From SVGExternalResourcesRequired
 
-  final _SVGStringListImpl requiredExtensions;
-
-  final _SVGStringListImpl requiredFeatures;
-
-  final _SVGStringListImpl systemLanguage;
-
-  bool hasExtension(String extension) native;
+  final _SVGAnimatedBooleanImpl externalResourcesRequired;
 
   // From SVGLangSpace
 
@@ -25026,23 +25011,6 @@
 
   String xmlspace;
 
-  // From SVGExternalResourcesRequired
-
-  final _SVGAnimatedBooleanImpl externalResourcesRequired;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-
-  // From SVGTransformable
-
-  final _SVGAnimatedTransformListImpl transform;
-
   // From SVGLocatable
 
   final _SVGElementImpl farthestViewportElement;
@@ -25056,6 +25024,29 @@
   _SVGMatrixImpl getScreenCTM() native;
 
   _SVGMatrixImpl getTransformToElement(_SVGElementImpl element) native;
+
+  // From SVGStylable
+
+  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
+
+  // Use implementation from Element.
+  // final _CSSStyleDeclarationImpl style;
+
+  _CSSValueImpl getPresentationAttribute(String name) native;
+
+  // From SVGTests
+
+  final _SVGStringListImpl requiredExtensions;
+
+  final _SVGStringListImpl requiredFeatures;
+
+  final _SVGStringListImpl systemLanguage;
+
+  bool hasExtension(String extension) native;
+
+  // From SVGTransformable
+
+  final _SVGAnimatedTransformListImpl transform;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -25183,9 +25174,9 @@
 
   final _SVGAnimatedLengthImpl y;
 
-  // From SVGURIReference
+  // From SVGExternalResourcesRequired
 
-  final _SVGAnimatedStringImpl href;
+  final _SVGAnimatedBooleanImpl externalResourcesRequired;
 
   // From SVGTests
 
@@ -25197,9 +25188,9 @@
 
   bool hasExtension(String extension) native;
 
-  // From SVGExternalResourcesRequired
+  // From SVGURIReference
 
-  final _SVGAnimatedBooleanImpl externalResourcesRequired;
+  final _SVGAnimatedStringImpl href;
 }
 // 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
@@ -25213,15 +25204,9 @@
 
 class _SVGDefsElementImpl extends _SVGElementImpl implements SVGDefsElement native "*SVGDefsElement" {
 
-  // From SVGTests
+  // From SVGExternalResourcesRequired
 
-  final _SVGStringListImpl requiredExtensions;
-
-  final _SVGStringListImpl requiredFeatures;
-
-  final _SVGStringListImpl systemLanguage;
-
-  bool hasExtension(String extension) native;
+  final _SVGAnimatedBooleanImpl externalResourcesRequired;
 
   // From SVGLangSpace
 
@@ -25229,23 +25214,6 @@
 
   String xmlspace;
 
-  // From SVGExternalResourcesRequired
-
-  final _SVGAnimatedBooleanImpl externalResourcesRequired;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-
-  // From SVGTransformable
-
-  final _SVGAnimatedTransformListImpl transform;
-
   // From SVGLocatable
 
   final _SVGElementImpl farthestViewportElement;
@@ -25259,6 +25227,29 @@
   _SVGMatrixImpl getScreenCTM() native;
 
   _SVGMatrixImpl getTransformToElement(_SVGElementImpl element) native;
+
+  // From SVGStylable
+
+  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
+
+  // Use implementation from Element.
+  // final _CSSStyleDeclarationImpl style;
+
+  _CSSValueImpl getPresentationAttribute(String name) native;
+
+  // From SVGTests
+
+  final _SVGStringListImpl requiredExtensions;
+
+  final _SVGStringListImpl requiredFeatures;
+
+  final _SVGStringListImpl systemLanguage;
+
+  bool hasExtension(String extension) native;
+
+  // From SVGTransformable
+
+  final _SVGAnimatedTransformListImpl transform;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -25754,15 +25745,9 @@
 
   final _SVGAnimatedLengthImpl ry;
 
-  // From SVGTests
+  // From SVGExternalResourcesRequired
 
-  final _SVGStringListImpl requiredExtensions;
-
-  final _SVGStringListImpl requiredFeatures;
-
-  final _SVGStringListImpl systemLanguage;
-
-  bool hasExtension(String extension) native;
+  final _SVGAnimatedBooleanImpl externalResourcesRequired;
 
   // From SVGLangSpace
 
@@ -25770,23 +25755,6 @@
 
   String xmlspace;
 
-  // From SVGExternalResourcesRequired
-
-  final _SVGAnimatedBooleanImpl externalResourcesRequired;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-
-  // From SVGTransformable
-
-  final _SVGAnimatedTransformListImpl transform;
-
   // From SVGLocatable
 
   final _SVGElementImpl farthestViewportElement;
@@ -25800,6 +25768,29 @@
   _SVGMatrixImpl getScreenCTM() native;
 
   _SVGMatrixImpl getTransformToElement(_SVGElementImpl element) native;
+
+  // From SVGStylable
+
+  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
+
+  // Use implementation from Element.
+  // final _CSSStyleDeclarationImpl style;
+
+  _CSSValueImpl getPresentationAttribute(String name) native;
+
+  // From SVGTests
+
+  final _SVGStringListImpl requiredExtensions;
+
+  final _SVGStringListImpl requiredFeatures;
+
+  final _SVGStringListImpl systemLanguage;
+
+  bool hasExtension(String extension) native;
+
+  // From SVGTransformable
+
+  final _SVGAnimatedTransformListImpl transform;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -26552,16 +26543,6 @@
 
   final _SVGAnimatedPreserveAspectRatioImpl preserveAspectRatio;
 
-  // From SVGURIReference
-
-  final _SVGAnimatedStringImpl href;
-
-  // From SVGLangSpace
-
-  String xmllang;
-
-  String xmlspace;
-
   // From SVGExternalResourcesRequired
 
   final _SVGAnimatedBooleanImpl externalResourcesRequired;
@@ -26578,6 +26559,12 @@
 
   final _SVGAnimatedLengthImpl y;
 
+  // From SVGLangSpace
+
+  String xmllang;
+
+  String xmlspace;
+
   // From SVGStylable
 
   _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
@@ -26586,6 +26573,10 @@
   // final _CSSStyleDeclarationImpl style;
 
   _CSSValueImpl getPresentationAttribute(String name) native;
+
+  // From SVGURIReference
+
+  final _SVGAnimatedStringImpl href;
 }
 // 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
@@ -27051,9 +27042,9 @@
 
   void setFilterRes(int filterResX, int filterResY) native;
 
-  // From SVGURIReference
+  // From SVGExternalResourcesRequired
 
-  final _SVGAnimatedStringImpl href;
+  final _SVGAnimatedBooleanImpl externalResourcesRequired;
 
   // From SVGLangSpace
 
@@ -27061,10 +27052,6 @@
 
   String xmlspace;
 
-  // From SVGExternalResourcesRequired
-
-  final _SVGAnimatedBooleanImpl externalResourcesRequired;
-
   // From SVGStylable
 
   _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
@@ -27073,6 +27060,10 @@
   // final _CSSStyleDeclarationImpl style;
 
   _CSSValueImpl getPresentationAttribute(String name) native;
+
+  // From SVGURIReference
+
+  final _SVGAnimatedStringImpl href;
 }
 // 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
@@ -27217,15 +27208,9 @@
 
   final _SVGAnimatedLengthImpl y;
 
-  // From SVGTests
+  // From SVGExternalResourcesRequired
 
-  final _SVGStringListImpl requiredExtensions;
-
-  final _SVGStringListImpl requiredFeatures;
-
-  final _SVGStringListImpl systemLanguage;
-
-  bool hasExtension(String extension) native;
+  final _SVGAnimatedBooleanImpl externalResourcesRequired;
 
   // From SVGLangSpace
 
@@ -27233,23 +27218,6 @@
 
   String xmlspace;
 
-  // From SVGExternalResourcesRequired
-
-  final _SVGAnimatedBooleanImpl externalResourcesRequired;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-
-  // From SVGTransformable
-
-  final _SVGAnimatedTransformListImpl transform;
-
   // From SVGLocatable
 
   final _SVGElementImpl farthestViewportElement;
@@ -27263,6 +27231,29 @@
   _SVGMatrixImpl getScreenCTM() native;
 
   _SVGMatrixImpl getTransformToElement(_SVGElementImpl element) native;
+
+  // From SVGStylable
+
+  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
+
+  // Use implementation from Element.
+  // final _CSSStyleDeclarationImpl style;
+
+  _CSSValueImpl getPresentationAttribute(String name) native;
+
+  // From SVGTests
+
+  final _SVGStringListImpl requiredExtensions;
+
+  final _SVGStringListImpl requiredFeatures;
+
+  final _SVGStringListImpl systemLanguage;
+
+  bool hasExtension(String extension) native;
+
+  // From SVGTransformable
+
+  final _SVGAnimatedTransformListImpl transform;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -27276,15 +27267,9 @@
 
 class _SVGGElementImpl extends _SVGElementImpl implements SVGGElement native "*SVGGElement" {
 
-  // From SVGTests
+  // From SVGExternalResourcesRequired
 
-  final _SVGStringListImpl requiredExtensions;
-
-  final _SVGStringListImpl requiredFeatures;
-
-  final _SVGStringListImpl systemLanguage;
-
-  bool hasExtension(String extension) native;
+  final _SVGAnimatedBooleanImpl externalResourcesRequired;
 
   // From SVGLangSpace
 
@@ -27292,23 +27277,6 @@
 
   String xmlspace;
 
-  // From SVGExternalResourcesRequired
-
-  final _SVGAnimatedBooleanImpl externalResourcesRequired;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-
-  // From SVGTransformable
-
-  final _SVGAnimatedTransformListImpl transform;
-
   // From SVGLocatable
 
   final _SVGElementImpl farthestViewportElement;
@@ -27322,6 +27290,29 @@
   _SVGMatrixImpl getScreenCTM() native;
 
   _SVGMatrixImpl getTransformToElement(_SVGElementImpl element) native;
+
+  // From SVGStylable
+
+  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
+
+  // Use implementation from Element.
+  // final _CSSStyleDeclarationImpl style;
+
+  _CSSValueImpl getPresentationAttribute(String name) native;
+
+  // From SVGTests
+
+  final _SVGStringListImpl requiredExtensions;
+
+  final _SVGStringListImpl requiredFeatures;
+
+  final _SVGStringListImpl systemLanguage;
+
+  bool hasExtension(String extension) native;
+
+  // From SVGTransformable
+
+  final _SVGAnimatedTransformListImpl transform;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -27377,10 +27368,6 @@
 
   num y;
 
-  // From SVGURIReference
-
-  final _SVGAnimatedStringImpl href;
-
   // From SVGStylable
 
   _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
@@ -27389,6 +27376,10 @@
   // final _CSSStyleDeclarationImpl style;
 
   _CSSValueImpl getPresentationAttribute(String name) native;
+
+  // From SVGURIReference
+
+  final _SVGAnimatedStringImpl href;
 }
 // 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
@@ -27425,10 +27416,6 @@
 
   final _SVGAnimatedEnumerationImpl spreadMethod;
 
-  // From SVGURIReference
-
-  final _SVGAnimatedStringImpl href;
-
   // From SVGExternalResourcesRequired
 
   final _SVGAnimatedBooleanImpl externalResourcesRequired;
@@ -27441,6 +27428,10 @@
   // final _CSSStyleDeclarationImpl style;
 
   _CSSValueImpl getPresentationAttribute(String name) native;
+
+  // From SVGURIReference
+
+  final _SVGAnimatedStringImpl href;
 }
 // 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
@@ -27491,19 +27482,9 @@
 
   final _SVGAnimatedLengthImpl y;
 
-  // From SVGURIReference
+  // From SVGExternalResourcesRequired
 
-  final _SVGAnimatedStringImpl href;
-
-  // From SVGTests
-
-  final _SVGStringListImpl requiredExtensions;
-
-  final _SVGStringListImpl requiredFeatures;
-
-  final _SVGStringListImpl systemLanguage;
-
-  bool hasExtension(String extension) native;
+  final _SVGAnimatedBooleanImpl externalResourcesRequired;
 
   // From SVGLangSpace
 
@@ -27511,23 +27492,6 @@
 
   String xmlspace;
 
-  // From SVGExternalResourcesRequired
-
-  final _SVGAnimatedBooleanImpl externalResourcesRequired;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-
-  // From SVGTransformable
-
-  final _SVGAnimatedTransformListImpl transform;
-
   // From SVGLocatable
 
   final _SVGElementImpl farthestViewportElement;
@@ -27541,6 +27505,33 @@
   _SVGMatrixImpl getScreenCTM() native;
 
   _SVGMatrixImpl getTransformToElement(_SVGElementImpl element) native;
+
+  // From SVGStylable
+
+  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
+
+  // Use implementation from Element.
+  // final _CSSStyleDeclarationImpl style;
+
+  _CSSValueImpl getPresentationAttribute(String name) native;
+
+  // From SVGTests
+
+  final _SVGStringListImpl requiredExtensions;
+
+  final _SVGStringListImpl requiredFeatures;
+
+  final _SVGStringListImpl systemLanguage;
+
+  bool hasExtension(String extension) native;
+
+  // From SVGTransformable
+
+  final _SVGAnimatedTransformListImpl transform;
+
+  // From SVGURIReference
+
+  final _SVGAnimatedStringImpl href;
 }
 // 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
@@ -27788,15 +27779,9 @@
 
   final _SVGAnimatedLengthImpl y2;
 
-  // From SVGTests
+  // From SVGExternalResourcesRequired
 
-  final _SVGStringListImpl requiredExtensions;
-
-  final _SVGStringListImpl requiredFeatures;
-
-  final _SVGStringListImpl systemLanguage;
-
-  bool hasExtension(String extension) native;
+  final _SVGAnimatedBooleanImpl externalResourcesRequired;
 
   // From SVGLangSpace
 
@@ -27804,23 +27789,6 @@
 
   String xmlspace;
 
-  // From SVGExternalResourcesRequired
-
-  final _SVGAnimatedBooleanImpl externalResourcesRequired;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-
-  // From SVGTransformable
-
-  final _SVGAnimatedTransformListImpl transform;
-
   // From SVGLocatable
 
   final _SVGElementImpl farthestViewportElement;
@@ -27834,6 +27802,29 @@
   _SVGMatrixImpl getScreenCTM() native;
 
   _SVGMatrixImpl getTransformToElement(_SVGElementImpl element) native;
+
+  // From SVGStylable
+
+  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
+
+  // Use implementation from Element.
+  // final _CSSStyleDeclarationImpl style;
+
+  _CSSValueImpl getPresentationAttribute(String name) native;
+
+  // From SVGTests
+
+  final _SVGStringListImpl requiredExtensions;
+
+  final _SVGStringListImpl requiredFeatures;
+
+  final _SVGStringListImpl systemLanguage;
+
+  bool hasExtension(String extension) native;
+
+  // From SVGTransformable
+
+  final _SVGAnimatedTransformListImpl transform;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -27906,13 +27897,13 @@
 
 class _SVGMPathElementImpl extends _SVGElementImpl implements SVGMPathElement native "*SVGMPathElement" {
 
-  // From SVGURIReference
-
-  final _SVGAnimatedStringImpl href;
-
   // From SVGExternalResourcesRequired
 
   final _SVGAnimatedBooleanImpl externalResourcesRequired;
+
+  // From SVGURIReference
+
+  final _SVGAnimatedStringImpl href;
 }
 // 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
@@ -27983,16 +27974,22 @@
 
   void setOrientToAuto() native;
 
+  // From SVGExternalResourcesRequired
+
+  final _SVGAnimatedBooleanImpl externalResourcesRequired;
+
+  // From SVGFitToViewBox
+
+  final _SVGAnimatedPreserveAspectRatioImpl preserveAspectRatio;
+
+  final _SVGAnimatedRectImpl viewBox;
+
   // From SVGLangSpace
 
   String xmllang;
 
   String xmlspace;
 
-  // From SVGExternalResourcesRequired
-
-  final _SVGAnimatedBooleanImpl externalResourcesRequired;
-
   // From SVGStylable
 
   _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
@@ -28001,12 +27998,6 @@
   // final _CSSStyleDeclarationImpl style;
 
   _CSSValueImpl getPresentationAttribute(String name) native;
-
-  // From SVGFitToViewBox
-
-  final _SVGAnimatedPreserveAspectRatioImpl preserveAspectRatio;
-
-  final _SVGAnimatedRectImpl viewBox;
 }
 // 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
@@ -28050,15 +28041,9 @@
 
   final _SVGAnimatedLengthImpl y;
 
-  // From SVGTests
+  // From SVGExternalResourcesRequired
 
-  final _SVGStringListImpl requiredExtensions;
-
-  final _SVGStringListImpl requiredFeatures;
-
-  final _SVGStringListImpl systemLanguage;
-
-  bool hasExtension(String extension) native;
+  final _SVGAnimatedBooleanImpl externalResourcesRequired;
 
   // From SVGLangSpace
 
@@ -28066,10 +28051,6 @@
 
   String xmlspace;
 
-  // From SVGExternalResourcesRequired
-
-  final _SVGAnimatedBooleanImpl externalResourcesRequired;
-
   // From SVGStylable
 
   _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
@@ -28078,6 +28059,16 @@
   // final _CSSStyleDeclarationImpl style;
 
   _CSSValueImpl getPresentationAttribute(String name) native;
+
+  // From SVGTests
+
+  final _SVGStringListImpl requiredExtensions;
+
+  final _SVGStringListImpl requiredFeatures;
+
+  final _SVGStringListImpl systemLanguage;
+
+  bool hasExtension(String extension) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -28551,15 +28542,9 @@
 
   num getTotalLength() native;
 
-  // From SVGTests
+  // From SVGExternalResourcesRequired
 
-  final _SVGStringListImpl requiredExtensions;
-
-  final _SVGStringListImpl requiredFeatures;
-
-  final _SVGStringListImpl systemLanguage;
-
-  bool hasExtension(String extension) native;
+  final _SVGAnimatedBooleanImpl externalResourcesRequired;
 
   // From SVGLangSpace
 
@@ -28567,23 +28552,6 @@
 
   String xmlspace;
 
-  // From SVGExternalResourcesRequired
-
-  final _SVGAnimatedBooleanImpl externalResourcesRequired;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-
-  // From SVGTransformable
-
-  final _SVGAnimatedTransformListImpl transform;
-
   // From SVGLocatable
 
   final _SVGElementImpl farthestViewportElement;
@@ -28597,6 +28565,29 @@
   _SVGMatrixImpl getScreenCTM() native;
 
   _SVGMatrixImpl getTransformToElement(_SVGElementImpl element) native;
+
+  // From SVGStylable
+
+  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
+
+  // Use implementation from Element.
+  // final _CSSStyleDeclarationImpl style;
+
+  _CSSValueImpl getPresentationAttribute(String name) native;
+
+  // From SVGTests
+
+  final _SVGStringListImpl requiredExtensions;
+
+  final _SVGStringListImpl requiredFeatures;
+
+  final _SVGStringListImpl systemLanguage;
+
+  bool hasExtension(String extension) native;
+
+  // From SVGTransformable
+
+  final _SVGAnimatedTransformListImpl transform;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -29360,9 +29351,30 @@
 
   final _SVGAnimatedLengthImpl y;
 
-  // From SVGURIReference
+  // From SVGExternalResourcesRequired
 
-  final _SVGAnimatedStringImpl href;
+  final _SVGAnimatedBooleanImpl externalResourcesRequired;
+
+  // From SVGFitToViewBox
+
+  final _SVGAnimatedPreserveAspectRatioImpl preserveAspectRatio;
+
+  final _SVGAnimatedRectImpl viewBox;
+
+  // From SVGLangSpace
+
+  String xmllang;
+
+  String xmlspace;
+
+  // From SVGStylable
+
+  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
+
+  // Use implementation from Element.
+  // final _CSSStyleDeclarationImpl style;
+
+  _CSSValueImpl getPresentationAttribute(String name) native;
 
   // From SVGTests
 
@@ -29374,30 +29386,9 @@
 
   bool hasExtension(String extension) native;
 
-  // From SVGLangSpace
+  // From SVGURIReference
 
-  String xmllang;
-
-  String xmlspace;
-
-  // From SVGExternalResourcesRequired
-
-  final _SVGAnimatedBooleanImpl externalResourcesRequired;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-
-  // From SVGFitToViewBox
-
-  final _SVGAnimatedPreserveAspectRatioImpl preserveAspectRatio;
-
-  final _SVGAnimatedRectImpl viewBox;
+  final _SVGAnimatedStringImpl href;
 }
 // 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
@@ -29500,15 +29491,9 @@
 
   final _SVGPointListImpl points;
 
-  // From SVGTests
+  // From SVGExternalResourcesRequired
 
-  final _SVGStringListImpl requiredExtensions;
-
-  final _SVGStringListImpl requiredFeatures;
-
-  final _SVGStringListImpl systemLanguage;
-
-  bool hasExtension(String extension) native;
+  final _SVGAnimatedBooleanImpl externalResourcesRequired;
 
   // From SVGLangSpace
 
@@ -29516,23 +29501,6 @@
 
   String xmlspace;
 
-  // From SVGExternalResourcesRequired
-
-  final _SVGAnimatedBooleanImpl externalResourcesRequired;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-
-  // From SVGTransformable
-
-  final _SVGAnimatedTransformListImpl transform;
-
   // From SVGLocatable
 
   final _SVGElementImpl farthestViewportElement;
@@ -29546,6 +29514,29 @@
   _SVGMatrixImpl getScreenCTM() native;
 
   _SVGMatrixImpl getTransformToElement(_SVGElementImpl element) native;
+
+  // From SVGStylable
+
+  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
+
+  // Use implementation from Element.
+  // final _CSSStyleDeclarationImpl style;
+
+  _CSSValueImpl getPresentationAttribute(String name) native;
+
+  // From SVGTests
+
+  final _SVGStringListImpl requiredExtensions;
+
+  final _SVGStringListImpl requiredFeatures;
+
+  final _SVGStringListImpl systemLanguage;
+
+  bool hasExtension(String extension) native;
+
+  // From SVGTransformable
+
+  final _SVGAnimatedTransformListImpl transform;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -29569,15 +29560,9 @@
 
   final _SVGPointListImpl points;
 
-  // From SVGTests
+  // From SVGExternalResourcesRequired
 
-  final _SVGStringListImpl requiredExtensions;
-
-  final _SVGStringListImpl requiredFeatures;
-
-  final _SVGStringListImpl systemLanguage;
-
-  bool hasExtension(String extension) native;
+  final _SVGAnimatedBooleanImpl externalResourcesRequired;
 
   // From SVGLangSpace
 
@@ -29585,23 +29570,6 @@
 
   String xmlspace;
 
-  // From SVGExternalResourcesRequired
-
-  final _SVGAnimatedBooleanImpl externalResourcesRequired;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-
-  // From SVGTransformable
-
-  final _SVGAnimatedTransformListImpl transform;
-
   // From SVGLocatable
 
   final _SVGElementImpl farthestViewportElement;
@@ -29615,6 +29583,29 @@
   _SVGMatrixImpl getScreenCTM() native;
 
   _SVGMatrixImpl getTransformToElement(_SVGElementImpl element) native;
+
+  // From SVGStylable
+
+  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
+
+  // Use implementation from Element.
+  // final _CSSStyleDeclarationImpl style;
+
+  _CSSValueImpl getPresentationAttribute(String name) native;
+
+  // From SVGTests
+
+  final _SVGStringListImpl requiredExtensions;
+
+  final _SVGStringListImpl requiredFeatures;
+
+  final _SVGStringListImpl systemLanguage;
+
+  bool hasExtension(String extension) native;
+
+  // From SVGTransformable
+
+  final _SVGAnimatedTransformListImpl transform;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -29771,15 +29762,9 @@
 
   final _SVGAnimatedLengthImpl y;
 
-  // From SVGTests
+  // From SVGExternalResourcesRequired
 
-  final _SVGStringListImpl requiredExtensions;
-
-  final _SVGStringListImpl requiredFeatures;
-
-  final _SVGStringListImpl systemLanguage;
-
-  bool hasExtension(String extension) native;
+  final _SVGAnimatedBooleanImpl externalResourcesRequired;
 
   // From SVGLangSpace
 
@@ -29787,23 +29772,6 @@
 
   String xmlspace;
 
-  // From SVGExternalResourcesRequired
-
-  final _SVGAnimatedBooleanImpl externalResourcesRequired;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-
-  // From SVGTransformable
-
-  final _SVGAnimatedTransformListImpl transform;
-
   // From SVGLocatable
 
   final _SVGElementImpl farthestViewportElement;
@@ -29817,6 +29785,29 @@
   _SVGMatrixImpl getScreenCTM() native;
 
   _SVGMatrixImpl getTransformToElement(_SVGElementImpl element) native;
+
+  // From SVGStylable
+
+  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
+
+  // Use implementation from Element.
+  // final _CSSStyleDeclarationImpl style;
+
+  _CSSValueImpl getPresentationAttribute(String name) native;
+
+  // From SVGTests
+
+  final _SVGStringListImpl requiredExtensions;
+
+  final _SVGStringListImpl requiredFeatures;
+
+  final _SVGStringListImpl systemLanguage;
+
+  bool hasExtension(String extension) native;
+
+  // From SVGTransformable
+
+  final _SVGAnimatedTransformListImpl transform;
 }
 
 class _SVGRectImpl implements SVGRect native "*SVGRect" {
@@ -30057,15 +30048,15 @@
 
   void unsuspendRedrawAll() native;
 
-  // From SVGTests
+  // From SVGExternalResourcesRequired
 
-  final _SVGStringListImpl requiredExtensions;
+  final _SVGAnimatedBooleanImpl externalResourcesRequired;
 
-  final _SVGStringListImpl requiredFeatures;
+  // From SVGFitToViewBox
 
-  final _SVGStringListImpl systemLanguage;
+  final _SVGAnimatedPreserveAspectRatioImpl preserveAspectRatio;
 
-  bool hasExtension(String extension) native;
+  final _SVGAnimatedRectImpl viewBox;
 
   // From SVGLangSpace
 
@@ -30073,19 +30064,6 @@
 
   String xmlspace;
 
-  // From SVGExternalResourcesRequired
-
-  final _SVGAnimatedBooleanImpl externalResourcesRequired;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-
   // From SVGLocatable
 
   final _SVGElementImpl farthestViewportElement;
@@ -30100,11 +30078,24 @@
 
   _SVGMatrixImpl getTransformToElement(_SVGElementImpl element) native;
 
-  // From SVGFitToViewBox
+  // From SVGStylable
 
-  final _SVGAnimatedPreserveAspectRatioImpl preserveAspectRatio;
+  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
 
-  final _SVGAnimatedRectImpl viewBox;
+  // Use implementation from Element.
+  // final _CSSStyleDeclarationImpl style;
+
+  _CSSValueImpl getPresentationAttribute(String name) native;
+
+  // From SVGTests
+
+  final _SVGStringListImpl requiredExtensions;
+
+  final _SVGStringListImpl requiredFeatures;
+
+  final _SVGStringListImpl systemLanguage;
+
+  bool hasExtension(String extension) native;
 
   // From SVGZoomAndPan
 
@@ -30127,13 +30118,13 @@
 
   String type;
 
-  // From SVGURIReference
-
-  final _SVGAnimatedStringImpl href;
-
   // From SVGExternalResourcesRequired
 
   final _SVGAnimatedBooleanImpl externalResourcesRequired;
+
+  // From SVGURIReference
+
+  final _SVGAnimatedStringImpl href;
 }
 // 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
@@ -30381,15 +30372,9 @@
 
 class _SVGSwitchElementImpl extends _SVGElementImpl implements SVGSwitchElement native "*SVGSwitchElement" {
 
-  // From SVGTests
+  // From SVGExternalResourcesRequired
 
-  final _SVGStringListImpl requiredExtensions;
-
-  final _SVGStringListImpl requiredFeatures;
-
-  final _SVGStringListImpl systemLanguage;
-
-  bool hasExtension(String extension) native;
+  final _SVGAnimatedBooleanImpl externalResourcesRequired;
 
   // From SVGLangSpace
 
@@ -30397,23 +30382,6 @@
 
   String xmlspace;
 
-  // From SVGExternalResourcesRequired
-
-  final _SVGAnimatedBooleanImpl externalResourcesRequired;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-
-  // From SVGTransformable
-
-  final _SVGAnimatedTransformListImpl transform;
-
   // From SVGLocatable
 
   final _SVGElementImpl farthestViewportElement;
@@ -30427,6 +30395,29 @@
   _SVGMatrixImpl getScreenCTM() native;
 
   _SVGMatrixImpl getTransformToElement(_SVGElementImpl element) native;
+
+  // From SVGStylable
+
+  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
+
+  // Use implementation from Element.
+  // final _CSSStyleDeclarationImpl style;
+
+  _CSSValueImpl getPresentationAttribute(String name) native;
+
+  // From SVGTests
+
+  final _SVGStringListImpl requiredExtensions;
+
+  final _SVGStringListImpl requiredFeatures;
+
+  final _SVGStringListImpl systemLanguage;
+
+  bool hasExtension(String extension) native;
+
+  // From SVGTransformable
+
+  final _SVGAnimatedTransformListImpl transform;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -30440,16 +30431,22 @@
 
 class _SVGSymbolElementImpl extends _SVGElementImpl implements SVGSymbolElement native "*SVGSymbolElement" {
 
+  // From SVGExternalResourcesRequired
+
+  final _SVGAnimatedBooleanImpl externalResourcesRequired;
+
+  // From SVGFitToViewBox
+
+  final _SVGAnimatedPreserveAspectRatioImpl preserveAspectRatio;
+
+  final _SVGAnimatedRectImpl viewBox;
+
   // From SVGLangSpace
 
   String xmllang;
 
   String xmlspace;
 
-  // From SVGExternalResourcesRequired
-
-  final _SVGAnimatedBooleanImpl externalResourcesRequired;
-
   // From SVGStylable
 
   _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
@@ -30458,12 +30455,6 @@
   // final _CSSStyleDeclarationImpl style;
 
   _CSSValueImpl getPresentationAttribute(String name) native;
-
-  // From SVGFitToViewBox
-
-  final _SVGAnimatedPreserveAspectRatioImpl preserveAspectRatio;
-
-  final _SVGAnimatedRectImpl viewBox;
 }
 // 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
@@ -30587,15 +30578,9 @@
 
   void selectSubString(int offset, int length) native;
 
-  // From SVGTests
+  // From SVGExternalResourcesRequired
 
-  final _SVGStringListImpl requiredExtensions;
-
-  final _SVGStringListImpl requiredFeatures;
-
-  final _SVGStringListImpl systemLanguage;
-
-  bool hasExtension(String extension) native;
+  final _SVGAnimatedBooleanImpl externalResourcesRequired;
 
   // From SVGLangSpace
 
@@ -30603,10 +30588,6 @@
 
   String xmlspace;
 
-  // From SVGExternalResourcesRequired
-
-  final _SVGAnimatedBooleanImpl externalResourcesRequired;
-
   // From SVGStylable
 
   _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
@@ -30615,6 +30596,16 @@
   // final _CSSStyleDeclarationImpl style;
 
   _CSSValueImpl getPresentationAttribute(String name) native;
+
+  // From SVGTests
+
+  final _SVGStringListImpl requiredExtensions;
+
+  final _SVGStringListImpl requiredFeatures;
+
+  final _SVGStringListImpl systemLanguage;
+
+  bool hasExtension(String extension) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -30628,10 +30619,6 @@
 
 class _SVGTextElementImpl extends _SVGTextPositioningElementImpl implements SVGTextElement native "*SVGTextElement" {
 
-  // From SVGTransformable
-
-  final _SVGAnimatedTransformListImpl transform;
-
   // From SVGLocatable
 
   final _SVGElementImpl farthestViewportElement;
@@ -30645,6 +30632,10 @@
   _SVGMatrixImpl getScreenCTM() native;
 
   _SVGMatrixImpl getTransformToElement(_SVGElementImpl element) native;
+
+  // From SVGTransformable
+
+  final _SVGAnimatedTransformListImpl transform;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -31053,19 +31044,9 @@
 
   final _SVGAnimatedLengthImpl y;
 
-  // From SVGURIReference
+  // From SVGExternalResourcesRequired
 
-  final _SVGAnimatedStringImpl href;
-
-  // From SVGTests
-
-  final _SVGStringListImpl requiredExtensions;
-
-  final _SVGStringListImpl requiredFeatures;
-
-  final _SVGStringListImpl systemLanguage;
-
-  bool hasExtension(String extension) native;
+  final _SVGAnimatedBooleanImpl externalResourcesRequired;
 
   // From SVGLangSpace
 
@@ -31073,23 +31054,6 @@
 
   String xmlspace;
 
-  // From SVGExternalResourcesRequired
-
-  final _SVGAnimatedBooleanImpl externalResourcesRequired;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-
-  // From SVGTransformable
-
-  final _SVGAnimatedTransformListImpl transform;
-
   // From SVGLocatable
 
   final _SVGElementImpl farthestViewportElement;
@@ -31103,6 +31067,33 @@
   _SVGMatrixImpl getScreenCTM() native;
 
   _SVGMatrixImpl getTransformToElement(_SVGElementImpl element) native;
+
+  // From SVGStylable
+
+  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
+
+  // Use implementation from Element.
+  // final _CSSStyleDeclarationImpl style;
+
+  _CSSValueImpl getPresentationAttribute(String name) native;
+
+  // From SVGTests
+
+  final _SVGStringListImpl requiredExtensions;
+
+  final _SVGStringListImpl requiredFeatures;
+
+  final _SVGStringListImpl systemLanguage;
+
+  bool hasExtension(String extension) native;
+
+  // From SVGTransformable
+
+  final _SVGAnimatedTransformListImpl transform;
+
+  // From SVGURIReference
+
+  final _SVGAnimatedStringImpl href;
 }
 // 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
@@ -31371,6 +31362,42 @@
 
 // WARNING: Do not edit - generated code.
 
+/// @domName ScriptProcessorNode
+abstract class ScriptProcessorNode implements AudioNode, EventTarget {
+
+  /**
+   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
+   */
+  ScriptProcessorNodeEvents get on;
+
+  /** @domName ScriptProcessorNode.bufferSize */
+  int get bufferSize;
+}
+
+abstract class ScriptProcessorNodeEvents implements Events {
+
+  EventListenerList get audioProcess;
+}
+
+class _ScriptProcessorNodeImpl extends _AudioNodeImpl implements ScriptProcessorNode native "*ScriptProcessorNode" {
+
+  _ScriptProcessorNodeEventsImpl get on =>
+    new _ScriptProcessorNodeEventsImpl(this);
+
+  final int bufferSize;
+}
+
+class _ScriptProcessorNodeEventsImpl extends _EventsImpl implements ScriptProcessorNodeEvents {
+  _ScriptProcessorNodeEventsImpl(_ptr) : super(_ptr);
+
+  EventListenerList get audioProcess => this['audioprocess'];
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
 /// @domName ScriptProfile
 abstract class ScriptProfile {
 
@@ -33395,6 +33422,9 @@
   /** @domName HTMLTextAreaElement.defaultValue */
   String defaultValue;
 
+  /** @domName HTMLTextAreaElement.dirName */
+  String dirName;
+
   /** @domName HTMLTextAreaElement.disabled */
   bool disabled;
 
@@ -33461,6 +33491,9 @@
   /** @domName HTMLTextAreaElement.setCustomValidity */
   void setCustomValidity(String error);
 
+  /** @domName HTMLTextAreaElement.setRangeText */
+  void setRangeText(String replacement, [int start, int end, String selectionMode]);
+
   /** @domName HTMLTextAreaElement.setSelectionRange */
   void setSelectionRange(int start, int end, [String direction]);
 }
@@ -33473,6 +33506,8 @@
 
   String defaultValue;
 
+  String dirName;
+
   bool disabled;
 
   final _FormElementImpl form;
@@ -33517,6 +33552,8 @@
 
   void setCustomValidity(String error) native;
 
+  void setRangeText(String replacement, [int start, int end, String selectionMode]) native;
+
   void setSelectionRange(int start, int end, [String direction]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -36148,7 +36185,7 @@
   int getError();
 
   /** @domName WebGLRenderingContext.getExtension */
-  void getExtension(String name);
+  Object getExtension(String name);
 
   /** @domName WebGLRenderingContext.getFramebufferAttachmentParameter */
   Object getFramebufferAttachmentParameter(int target, int attachment, int pname);
@@ -36504,7 +36541,7 @@
 
   int getError() native;
 
-  void getExtension(String name) native;
+  Object getExtension(String name) native;
 
   Object getFramebufferAttachmentParameter(int target, int attachment, int pname) native;
 
@@ -40857,14 +40894,13 @@
    * [:start + length:].
    * Returns an empty list if [length] is 0.
    * Throws an [ArgumentError] if [length] is negative.
-   * Throws an [IndexOutOfRangeException] if [start] or
-   * [:start + length:] are out of range.
+   * Throws a [RangeError] if [start] or [:start + length:] are out of range.
    */
   static List getRange(List a, int start, int length, List accumulator) {
     if (length < 0) throw new ArgumentError('length');
-    if (start < 0) throw new IndexOutOfRangeException(start);
+    if (start < 0) throw new RangeError.value(start);
     int end = start + length;
-    if (end > a.length) throw new IndexOutOfRangeException(end);
+    if (end > a.length) throw new RangeError.value(end);
     for (int i = start; i < end; i++) {
       accumulator.add(a[i]);
     }
diff --git a/lib/html/dartium/html_dartium.dart b/lib/html/dartium/html_dartium.dart
index c9d103a..88f1eef 100644
--- a/lib/html/dartium/html_dartium.dart
+++ b/lib/html/dartium/html_dartium.dart
@@ -119,6 +119,72 @@
 
 // WARNING: Do not edit - generated code.
 
+/// @domName AnalyserNode
+abstract class AnalyserNode implements AudioNode {
+
+  /** @domName AnalyserNode.fftSize */
+  int fftSize;
+
+  /** @domName AnalyserNode.frequencyBinCount */
+  int get frequencyBinCount;
+
+  /** @domName AnalyserNode.maxDecibels */
+  num maxDecibels;
+
+  /** @domName AnalyserNode.minDecibels */
+  num minDecibels;
+
+  /** @domName AnalyserNode.smoothingTimeConstant */
+  num smoothingTimeConstant;
+
+  /** @domName AnalyserNode.getByteFrequencyData */
+  void getByteFrequencyData(Uint8Array array);
+
+  /** @domName AnalyserNode.getByteTimeDomainData */
+  void getByteTimeDomainData(Uint8Array array);
+
+  /** @domName AnalyserNode.getFloatFrequencyData */
+  void getFloatFrequencyData(Float32Array array);
+}
+// 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.
+
+class _AnalyserNodeImpl extends _AudioNodeImpl implements AnalyserNode {
+
+  int get fftSize native "AnalyserNode_fftSize_Getter";
+
+  void set fftSize(int value) native "AnalyserNode_fftSize_Setter";
+
+  int get frequencyBinCount native "AnalyserNode_frequencyBinCount_Getter";
+
+  num get maxDecibels native "AnalyserNode_maxDecibels_Getter";
+
+  void set maxDecibels(num value) native "AnalyserNode_maxDecibels_Setter";
+
+  num get minDecibels native "AnalyserNode_minDecibels_Getter";
+
+  void set minDecibels(num value) native "AnalyserNode_minDecibels_Setter";
+
+  num get smoothingTimeConstant native "AnalyserNode_smoothingTimeConstant_Getter";
+
+  void set smoothingTimeConstant(num value) native "AnalyserNode_smoothingTimeConstant_Setter";
+
+  void getByteFrequencyData(Uint8Array array) native "AnalyserNode_getByteFrequencyData_Callback";
+
+  void getByteTimeDomainData(Uint8Array array) native "AnalyserNode_getByteTimeDomainData_Callback";
+
+  void getFloatFrequencyData(Float32Array array) native "AnalyserNode_getFloatFrequencyData_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.
+
 /// @domName HTMLAnchorElement
 abstract class AnchorElement implements Element {
 
@@ -796,8 +862,11 @@
   /** @domName AudioBufferSourceNode.loop */
   bool loop;
 
-  /** @domName AudioBufferSourceNode.looping */
-  bool looping;
+  /** @domName AudioBufferSourceNode.loopEnd */
+  num loopEnd;
+
+  /** @domName AudioBufferSourceNode.loopStart */
+  num loopStart;
 
   /** @domName AudioBufferSourceNode.playbackRate */
   AudioParam get playbackRate;
@@ -829,9 +898,13 @@
 
   void set loop(bool value) native "AudioBufferSourceNode_loop_Setter";
 
-  bool get looping native "AudioBufferSourceNode_looping_Getter";
+  num get loopEnd native "AudioBufferSourceNode_loopEnd_Getter";
 
-  void set looping(bool value) native "AudioBufferSourceNode_looping_Setter";
+  void set loopEnd(num value) native "AudioBufferSourceNode_loopEnd_Setter";
+
+  num get loopStart native "AudioBufferSourceNode_loopStart_Getter";
+
+  void set loopStart(num value) native "AudioBufferSourceNode_loopStart_Setter";
 
   AudioParam get playbackRate native "AudioBufferSourceNode_playbackRate_Getter";
 
@@ -862,42 +935,6 @@
 
 // WARNING: Do not edit - generated code.
 
-/// @domName AudioChannelMerger
-abstract class AudioChannelMerger implements AudioNode {
-}
-// 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.
-
-class _AudioChannelMergerImpl extends _AudioNodeImpl implements AudioChannelMerger {
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName AudioChannelSplitter
-abstract class AudioChannelSplitter implements AudioNode {
-}
-// 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.
-
-class _AudioChannelSplitterImpl extends _AudioNodeImpl implements AudioChannelSplitter {
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
 
 /// @domName AudioContext
 abstract class AudioContext implements EventTarget {
@@ -924,7 +961,7 @@
   num get sampleRate;
 
   /** @domName AudioContext.createAnalyser */
-  RealtimeAnalyserNode createAnalyser();
+  AnalyserNode createAnalyser();
 
   /** @domName AudioContext.createBiquadFilter */
   BiquadFilterNode createBiquadFilter();
@@ -936,25 +973,22 @@
   AudioBufferSourceNode createBufferSource();
 
   /** @domName AudioContext.createChannelMerger */
-  AudioChannelMerger createChannelMerger([int numberOfInputs]);
+  ChannelMergerNode createChannelMerger([int numberOfInputs]);
 
   /** @domName AudioContext.createChannelSplitter */
-  AudioChannelSplitter createChannelSplitter([int numberOfOutputs]);
+  ChannelSplitterNode createChannelSplitter([int numberOfOutputs]);
 
   /** @domName AudioContext.createConvolver */
   ConvolverNode createConvolver();
 
-  /** @domName AudioContext.createDelayNode */
-  DelayNode createDelayNode([num maxDelayTime]);
+  /** @domName AudioContext.createDelay */
+  DelayNode createDelay([num maxDelayTime]);
 
   /** @domName AudioContext.createDynamicsCompressor */
   DynamicsCompressorNode createDynamicsCompressor();
 
-  /** @domName AudioContext.createGainNode */
-  AudioGainNode createGainNode();
-
-  /** @domName AudioContext.createJavaScriptNode */
-  JavaScriptAudioNode createJavaScriptNode(int bufferSize, [int numberOfInputChannels, int numberOfOutputChannels]);
+  /** @domName AudioContext.createGain */
+  GainNode createGain();
 
   /** @domName AudioContext.createMediaElementSource */
   MediaElementAudioSourceNode createMediaElementSource(MediaElement mediaElement);
@@ -963,10 +997,13 @@
   MediaStreamAudioSourceNode createMediaStreamSource(MediaStream mediaStream);
 
   /** @domName AudioContext.createOscillator */
-  Oscillator createOscillator();
+  OscillatorNode createOscillator();
 
   /** @domName AudioContext.createPanner */
-  AudioPannerNode createPanner();
+  PannerNode createPanner();
+
+  /** @domName AudioContext.createScriptProcessor */
+  ScriptProcessorNode createScriptProcessor(int bufferSize, [int numberOfInputChannels, int numberOfOutputChannels]);
 
   /** @domName AudioContext.createWaveShaper */
   WaveShaperNode createWaveShaper();
@@ -1006,7 +1043,7 @@
 
   num get sampleRate native "AudioContext_sampleRate_Getter";
 
-  RealtimeAnalyserNode createAnalyser() native "AudioContext_createAnalyser_Callback";
+  AnalyserNode createAnalyser() native "AudioContext_createAnalyser_Callback";
 
   BiquadFilterNode createBiquadFilter() native "AudioContext_createBiquadFilter_Callback";
 
@@ -1026,68 +1063,68 @@
 
   AudioBufferSourceNode createBufferSource() native "AudioContext_createBufferSource_Callback";
 
-  AudioChannelMerger createChannelMerger([/*unsigned long*/ numberOfInputs]) {
+  ChannelMergerNode createChannelMerger([/*unsigned long*/ numberOfInputs]) {
     if (?numberOfInputs) {
       return _createChannelMerger_1(numberOfInputs);
     }
     return _createChannelMerger_2();
   }
 
-  AudioChannelMerger _createChannelMerger_1(numberOfInputs) native "AudioContext_createChannelMerger_1_Callback";
+  ChannelMergerNode _createChannelMerger_1(numberOfInputs) native "AudioContext_createChannelMerger_1_Callback";
 
-  AudioChannelMerger _createChannelMerger_2() native "AudioContext_createChannelMerger_2_Callback";
+  ChannelMergerNode _createChannelMerger_2() native "AudioContext_createChannelMerger_2_Callback";
 
-  AudioChannelSplitter createChannelSplitter([/*unsigned long*/ numberOfOutputs]) {
+  ChannelSplitterNode createChannelSplitter([/*unsigned long*/ numberOfOutputs]) {
     if (?numberOfOutputs) {
       return _createChannelSplitter_1(numberOfOutputs);
     }
     return _createChannelSplitter_2();
   }
 
-  AudioChannelSplitter _createChannelSplitter_1(numberOfOutputs) native "AudioContext_createChannelSplitter_1_Callback";
+  ChannelSplitterNode _createChannelSplitter_1(numberOfOutputs) native "AudioContext_createChannelSplitter_1_Callback";
 
-  AudioChannelSplitter _createChannelSplitter_2() native "AudioContext_createChannelSplitter_2_Callback";
+  ChannelSplitterNode _createChannelSplitter_2() native "AudioContext_createChannelSplitter_2_Callback";
 
   ConvolverNode createConvolver() native "AudioContext_createConvolver_Callback";
 
-  DelayNode createDelayNode([/*double*/ maxDelayTime]) {
+  DelayNode createDelay([/*double*/ maxDelayTime]) {
     if (?maxDelayTime) {
-      return _createDelayNode_1(maxDelayTime);
+      return _createDelay_1(maxDelayTime);
     }
-    return _createDelayNode_2();
+    return _createDelay_2();
   }
 
-  DelayNode _createDelayNode_1(maxDelayTime) native "AudioContext_createDelayNode_1_Callback";
+  DelayNode _createDelay_1(maxDelayTime) native "AudioContext_createDelay_1_Callback";
 
-  DelayNode _createDelayNode_2() native "AudioContext_createDelayNode_2_Callback";
+  DelayNode _createDelay_2() native "AudioContext_createDelay_2_Callback";
 
   DynamicsCompressorNode createDynamicsCompressor() native "AudioContext_createDynamicsCompressor_Callback";
 
-  AudioGainNode createGainNode() native "AudioContext_createGainNode_Callback";
-
-  JavaScriptAudioNode createJavaScriptNode(/*unsigned long*/ bufferSize, [/*unsigned long*/ numberOfInputChannels, /*unsigned long*/ numberOfOutputChannels]) {
-    if (?numberOfOutputChannels) {
-      return _createJavaScriptNode_1(bufferSize, numberOfInputChannels, numberOfOutputChannels);
-    }
-    if (?numberOfInputChannels) {
-      return _createJavaScriptNode_2(bufferSize, numberOfInputChannels);
-    }
-    return _createJavaScriptNode_3(bufferSize);
-  }
-
-  JavaScriptAudioNode _createJavaScriptNode_1(bufferSize, numberOfInputChannels, numberOfOutputChannels) native "AudioContext_createJavaScriptNode_1_Callback";
-
-  JavaScriptAudioNode _createJavaScriptNode_2(bufferSize, numberOfInputChannels) native "AudioContext_createJavaScriptNode_2_Callback";
-
-  JavaScriptAudioNode _createJavaScriptNode_3(bufferSize) native "AudioContext_createJavaScriptNode_3_Callback";
+  GainNode createGain() native "AudioContext_createGain_Callback";
 
   MediaElementAudioSourceNode createMediaElementSource(MediaElement mediaElement) native "AudioContext_createMediaElementSource_Callback";
 
   MediaStreamAudioSourceNode createMediaStreamSource(MediaStream mediaStream) native "AudioContext_createMediaStreamSource_Callback";
 
-  Oscillator createOscillator() native "AudioContext_createOscillator_Callback";
+  OscillatorNode createOscillator() native "AudioContext_createOscillator_Callback";
 
-  AudioPannerNode createPanner() native "AudioContext_createPanner_Callback";
+  PannerNode createPanner() native "AudioContext_createPanner_Callback";
+
+  ScriptProcessorNode createScriptProcessor(/*unsigned long*/ bufferSize, [/*unsigned long*/ numberOfInputChannels, /*unsigned long*/ numberOfOutputChannels]) {
+    if (?numberOfOutputChannels) {
+      return _createScriptProcessor_1(bufferSize, numberOfInputChannels, numberOfOutputChannels);
+    }
+    if (?numberOfInputChannels) {
+      return _createScriptProcessor_2(bufferSize, numberOfInputChannels);
+    }
+    return _createScriptProcessor_3(bufferSize);
+  }
+
+  ScriptProcessorNode _createScriptProcessor_1(bufferSize, numberOfInputChannels, numberOfOutputChannels) native "AudioContext_createScriptProcessor_1_Callback";
+
+  ScriptProcessorNode _createScriptProcessor_2(bufferSize, numberOfInputChannels) native "AudioContext_createScriptProcessor_2_Callback";
+
+  ScriptProcessorNode _createScriptProcessor_3(bufferSize) native "AudioContext_createScriptProcessor_3_Callback";
 
   WaveShaperNode createWaveShaper() native "AudioContext_createWaveShaper_Callback";
 
@@ -1176,29 +1213,6 @@
 
 // WARNING: Do not edit - generated code.
 
-/// @domName AudioGainNode
-abstract class AudioGainNode implements AudioNode {
-
-  /** @domName AudioGainNode.gain */
-  AudioGain get gain;
-}
-// 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.
-
-class _AudioGainNodeImpl extends _AudioNodeImpl implements AudioGainNode {
-
-  AudioGain get gain native "AudioGainNode_gain_Getter";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
 /// @domName AudioListener
 abstract class AudioListener {
 
@@ -1303,117 +1317,6 @@
 
 // WARNING: Do not edit - generated code.
 
-/// @domName AudioPannerNode
-abstract class AudioPannerNode implements AudioNode {
-
-  static const int EQUALPOWER = 0;
-
-  static const int EXPONENTIAL_DISTANCE = 2;
-
-  static const int HRTF = 1;
-
-  static const int INVERSE_DISTANCE = 1;
-
-  static const int LINEAR_DISTANCE = 0;
-
-  static const int SOUNDFIELD = 2;
-
-  /** @domName AudioPannerNode.coneGain */
-  AudioGain get coneGain;
-
-  /** @domName AudioPannerNode.coneInnerAngle */
-  num coneInnerAngle;
-
-  /** @domName AudioPannerNode.coneOuterAngle */
-  num coneOuterAngle;
-
-  /** @domName AudioPannerNode.coneOuterGain */
-  num coneOuterGain;
-
-  /** @domName AudioPannerNode.distanceGain */
-  AudioGain get distanceGain;
-
-  /** @domName AudioPannerNode.distanceModel */
-  int distanceModel;
-
-  /** @domName AudioPannerNode.maxDistance */
-  num maxDistance;
-
-  /** @domName AudioPannerNode.panningModel */
-  int panningModel;
-
-  /** @domName AudioPannerNode.refDistance */
-  num refDistance;
-
-  /** @domName AudioPannerNode.rolloffFactor */
-  num rolloffFactor;
-
-  /** @domName AudioPannerNode.setOrientation */
-  void setOrientation(num x, num y, num z);
-
-  /** @domName AudioPannerNode.setPosition */
-  void setPosition(num x, num y, num z);
-
-  /** @domName AudioPannerNode.setVelocity */
-  void setVelocity(num x, num y, num z);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _AudioPannerNodeImpl extends _AudioNodeImpl implements AudioPannerNode {
-
-  AudioGain get coneGain native "AudioPannerNode_coneGain_Getter";
-
-  num get coneInnerAngle native "AudioPannerNode_coneInnerAngle_Getter";
-
-  void set coneInnerAngle(num value) native "AudioPannerNode_coneInnerAngle_Setter";
-
-  num get coneOuterAngle native "AudioPannerNode_coneOuterAngle_Getter";
-
-  void set coneOuterAngle(num value) native "AudioPannerNode_coneOuterAngle_Setter";
-
-  num get coneOuterGain native "AudioPannerNode_coneOuterGain_Getter";
-
-  void set coneOuterGain(num value) native "AudioPannerNode_coneOuterGain_Setter";
-
-  AudioGain get distanceGain native "AudioPannerNode_distanceGain_Getter";
-
-  int get distanceModel native "AudioPannerNode_distanceModel_Getter";
-
-  void set distanceModel(int value) native "AudioPannerNode_distanceModel_Setter";
-
-  num get maxDistance native "AudioPannerNode_maxDistance_Getter";
-
-  void set maxDistance(num value) native "AudioPannerNode_maxDistance_Setter";
-
-  int get panningModel native "AudioPannerNode_panningModel_Getter";
-
-  void set panningModel(int value) native "AudioPannerNode_panningModel_Setter";
-
-  num get refDistance native "AudioPannerNode_refDistance_Getter";
-
-  void set refDistance(num value) native "AudioPannerNode_refDistance_Setter";
-
-  num get rolloffFactor native "AudioPannerNode_rolloffFactor_Getter";
-
-  void set rolloffFactor(num value) native "AudioPannerNode_rolloffFactor_Setter";
-
-  void setOrientation(num x, num y, num z) native "AudioPannerNode_setOrientation_Callback";
-
-  void setPosition(num x, num y, num z) native "AudioPannerNode_setPosition_Callback";
-
-  void setVelocity(num x, num y, num z) native "AudioPannerNode_setVelocity_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
 /// @domName AudioParam
 abstract class AudioParam {
 
@@ -1444,8 +1347,8 @@
   /** @domName AudioParam.linearRampToValueAtTime */
   void linearRampToValueAtTime(num value, num time);
 
-  /** @domName AudioParam.setTargetValueAtTime */
-  void setTargetValueAtTime(num targetValue, num time, num timeConstant);
+  /** @domName AudioParam.setTargetAtTime */
+  void setTargetAtTime(num target, num time, num timeConstant);
 
   /** @domName AudioParam.setValueAtTime */
   void setValueAtTime(num value, num time);
@@ -1481,7 +1384,7 @@
 
   void linearRampToValueAtTime(num value, num time) native "AudioParam_linearRampToValueAtTime_Callback";
 
-  void setTargetValueAtTime(num targetValue, num time, num timeConstant) native "AudioParam_setTargetValueAtTime_Callback";
+  void setTargetAtTime(num target, num time, num timeConstant) native "AudioParam_setTargetAtTime_Callback";
 
   void setValueAtTime(num value, num time) native "AudioParam_setValueAtTime_Callback";
 
@@ -8687,6 +8590,42 @@
 
 // WARNING: Do not edit - generated code.
 
+/// @domName ChannelMergerNode
+abstract class ChannelMergerNode implements AudioNode {
+}
+// 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.
+
+class _ChannelMergerNodeImpl extends _AudioNodeImpl implements ChannelMergerNode {
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+/// @domName ChannelSplitterNode
+abstract class ChannelSplitterNode implements AudioNode {
+}
+// 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.
+
+class _ChannelSplitterNodeImpl extends _AudioNodeImpl implements ChannelSplitterNode {
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
 /// @domName CharacterData
 abstract class CharacterData implements Node {
 
@@ -9170,6 +9109,9 @@
 
   /** @domName HTMLContentElement.select */
   String select;
+
+  /** @domName HTMLContentElement.getDistributedNodes */
+  List<Node> getDistributedNodes();
 }
 // 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
@@ -9187,6 +9129,8 @@
 
   void set select(String value) native "HTMLContentElement_select_Setter";
 
+  List<Node> getDistributedNodes() native "HTMLContentElement_getDistributedNodes_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
@@ -10362,7 +10306,7 @@
   String toString();
 
   /** @domName DOMTokenList.toggle */
-  bool toggle(String token);
+  bool toggle(String token, [bool force]);
 }
 // 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
@@ -10380,7 +10324,16 @@
 
   String toString() native "DOMTokenList_toString_Callback";
 
-  bool toggle(String token) native "DOMTokenList_toggle_Callback";
+  bool toggle(/*DOMString*/ token, [/*boolean*/ force]) {
+    if (?force) {
+      return _toggle_1(token, force);
+    }
+    return _toggle_2(token);
+  }
+
+  bool _toggle_1(token, force) native "DOMTokenList_toggle_1_Callback";
+
+  bool _toggle_2(token) native "DOMTokenList_toggle_2_Callback";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -11075,29 +11028,9 @@
 
   DirectoryReader createReader() native "DirectoryEntry_createReader_Callback";
 
-  void getDirectory(/*DOMString*/ path, {/*Dictionary*/ options, /*EntryCallback*/ successCallback, /*ErrorCallback*/ errorCallback}) {
-    if (?options) {
-      _getDirectory_1(path, options, successCallback, errorCallback);
-      return;
-    }
-    _getDirectory_2(path);
-  }
+  void getDirectory(String path, {Map options, EntryCallback successCallback, ErrorCallback errorCallback}) native "DirectoryEntry_getDirectory_Callback";
 
-  void _getDirectory_1(path, options, successCallback, errorCallback) native "DirectoryEntry_getDirectory_1_Callback";
-
-  void _getDirectory_2(path) native "DirectoryEntry_getDirectory_2_Callback";
-
-  void getFile(/*DOMString*/ path, {/*Dictionary*/ options, /*EntryCallback*/ successCallback, /*ErrorCallback*/ errorCallback}) {
-    if (?options) {
-      _getFile_1(path, options, successCallback, errorCallback);
-      return;
-    }
-    _getFile_2(path);
-  }
-
-  void _getFile_1(path, options, successCallback, errorCallback) native "DirectoryEntry_getFile_1_Callback";
-
-  void _getFile_2(path) native "DirectoryEntry_getFile_2_Callback";
+  void getFile(String path, {Map options, EntryCallback successCallback, ErrorCallback errorCallback}) native "DirectoryEntry_getFile_Callback";
 
   void removeRecursively(VoidCallback successCallback, [ErrorCallback errorCallback]) native "DirectoryEntry_removeRecursively_Callback";
 
@@ -13421,11 +13354,18 @@
   // Hooks to support custom WebComponents.
   var xtag;
 
-  noSuchMethod(String name, List args) {
+  noSuchMethod(InvocationMirror invocation) {
     if (dynamicUnknownElementDispatcher == null) {
-      throw new NoSuchMethodError(this, name, args);
+      throw new NoSuchMethodError(this, invocation.memberName,
+                                        invocation.positionalArguments,
+                                        invocation.namedArguments);
     } else {
-      return dynamicUnknownElementDispatcher(this, name, args);
+      String hackedName = invocation.memberName;
+      if (invocation.isGetter) hackedName = "get:$hackedName";
+      if (invocation.isSetter) hackedName = "set:$hackedName";
+      return dynamicUnknownElementDispatcher(this,
+                                             hackedName,
+                                             invocation.positionalArguments);
     }
   }
 
@@ -16060,6 +16000,29 @@
 
 // WARNING: Do not edit - generated code.
 
+/// @domName GainNode
+abstract class GainNode implements AudioNode {
+
+  /** @domName GainNode.gain */
+  AudioGain get gain;
+}
+// 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.
+
+class _GainNodeImpl extends _AudioNodeImpl implements GainNode {
+
+  AudioGain get gain native "GainNode_gain_Getter";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
 /// @domName Gamepad
 abstract class Gamepad {
 
@@ -16708,7 +16671,7 @@
       _HttpRequestFactoryProvider.createHttpRequest_get(url, onSuccess);
 
   factory HttpRequest.getWithCredentials(String url, onSuccess(HttpRequest request)) =>
-      _HttpRequestFactoryProvider.createHttpRequestgetWithCredentials(url, onSuccess);
+      _HttpRequestFactoryProvider.createHttpRequest_getWithCredentials(url, onSuccess);
 
   factory HttpRequest() => _HttpRequestFactoryProvider.createHttpRequest();
 
@@ -17054,10 +17017,10 @@
   String get direction;
 
   /** @domName IDBCursor.key */
-  dynamic get key;
+  Object get key;
 
   /** @domName IDBCursor.primaryKey */
-  dynamic get primaryKey;
+  Object get primaryKey;
 
   /** @domName IDBCursor.source */
   dynamic get source;
@@ -17084,9 +17047,9 @@
 
   String get direction native "IDBCursor_direction_Getter";
 
-  dynamic get key native "IDBCursor_key_Getter";
+  Object get key native "IDBCursor_key_Getter";
 
-  dynamic get primaryKey native "IDBCursor_primaryKey_Getter";
+  Object get primaryKey native "IDBCursor_primaryKey_Getter";
 
   dynamic get source native "IDBCursor_source_Getter";
 
@@ -17119,7 +17082,7 @@
 abstract class IDBCursorWithValue implements IDBCursor {
 
   /** @domName IDBCursorWithValue.value */
-  dynamic get value;
+  Object get value;
 }
 // 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
@@ -17129,7 +17092,7 @@
 
 class _IDBCursorWithValueImpl extends _IDBCursorImpl implements IDBCursorWithValue {
 
-  dynamic get value native "IDBCursorWithValue_value_Getter";
+  Object get value native "IDBCursorWithValue_value_Getter";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17273,16 +17236,7 @@
 
   void close() native "IDBDatabase_close_Callback";
 
-  IDBObjectStore createObjectStore(/*DOMString*/ name, [/*Dictionary*/ options]) {
-    if (?options) {
-      return _createObjectStore_1(name, options);
-    }
-    return _createObjectStore_2(name);
-  }
-
-  IDBObjectStore _createObjectStore_1(name, options) native "IDBDatabase_createObjectStore_1_Callback";
-
-  IDBObjectStore _createObjectStore_2(name) native "IDBDatabase_createObjectStore_2_Callback";
+  IDBObjectStore createObjectStore(String name, [Map options]) native "IDBDatabase_createObjectStore_Callback";
 
   void deleteObjectStore(String name) native "IDBDatabase_deleteObjectStore_Callback";
 
@@ -17355,7 +17309,7 @@
 
   IDBVersionChangeRequest deleteDatabase(String name) native "IDBFactory_deleteDatabase_Callback";
 
-  IDBOpenDBRequest open(/*DOMString*/ name, [/*unsigned long long*/ version]) {
+  IDBOpenDBRequest open(/*DOMString*/ name, [/*long long*/ version]) {
     if (?version) {
       return _open_1(name, version);
     }
@@ -17433,9 +17387,7 @@
     if ((key_OR_range is IDBKeyRange || key_OR_range == null)) {
       return _count_2(key_OR_range);
     }
-    if ((key_OR_range is dynamic || key_OR_range == null)) {
-      return _count_3(key_OR_range);
-    }
+    return _count_3(key_OR_range);
     throw "Incorrect number or type of arguments";
   }
 
@@ -17449,9 +17401,7 @@
     if ((key is IDBKeyRange || key == null)) {
       return _get_1(key);
     }
-    if ((key is dynamic || key == null)) {
-      return _get_2(key);
-    }
+    return _get_2(key);
     throw "Incorrect number or type of arguments";
   }
 
@@ -17463,9 +17413,7 @@
     if ((key is IDBKeyRange || key == null)) {
       return _getKey_1(key);
     }
-    if ((key is dynamic || key == null)) {
-      return _getKey_2(key);
-    }
+    return _getKey_2(key);
     throw "Incorrect number or type of arguments";
   }
 
@@ -17483,10 +17431,10 @@
     if ((key_OR_range is IDBKeyRange || key_OR_range == null) && (direction is String || direction == null)) {
       return _openCursor_3(key_OR_range, direction);
     }
-    if ((key_OR_range is dynamic || key_OR_range == null) && !?direction) {
+    if (!?direction) {
       return _openCursor_4(key_OR_range);
     }
-    if ((key_OR_range is dynamic || key_OR_range == null) && (direction is String || direction == null)) {
+    if ((direction is String || direction == null)) {
       return _openCursor_5(key_OR_range, direction);
     }
     throw "Incorrect number or type of arguments";
@@ -17512,10 +17460,10 @@
     if ((key_OR_range is IDBKeyRange || key_OR_range == null) && (direction is String || direction == null)) {
       return _openKeyCursor_3(key_OR_range, direction);
     }
-    if ((key_OR_range is dynamic || key_OR_range == null) && !?direction) {
+    if (!?direction) {
       return _openKeyCursor_4(key_OR_range);
     }
-    if ((key_OR_range is dynamic || key_OR_range == null) && (direction is String || direction == null)) {
+    if ((direction is String || direction == null)) {
       return _openKeyCursor_5(key_OR_range, direction);
     }
     throw "Incorrect number or type of arguments";
@@ -17760,9 +17708,7 @@
     if ((key_OR_range is IDBKeyRange || key_OR_range == null)) {
       return _count_2(key_OR_range);
     }
-    if ((key_OR_range is dynamic || key_OR_range == null)) {
-      return _count_3(key_OR_range);
-    }
+    return _count_3(key_OR_range);
     throw "Incorrect number or type of arguments";
   }
 
@@ -17773,36 +17719,24 @@
   IDBRequest _count_3(key_OR_range) native "IDBObjectStore_count_3_Callback";
 
   IDBIndex createIndex(/*DOMString*/ name, keyPath, [/*Dictionary*/ options]) {
-    if ((name is String || name == null) && (keyPath is List<String> || keyPath == null) && !?options) {
-      return _createIndex_1(name, keyPath);
-    }
     if ((name is String || name == null) && (keyPath is List<String> || keyPath == null) && (options is Map || options == null)) {
-      return _createIndex_2(name, keyPath, options);
-    }
-    if ((name is String || name == null) && (keyPath is String || keyPath == null) && !?options) {
-      return _createIndex_3(name, keyPath);
+      return _createIndex_1(name, keyPath, options);
     }
     if ((name is String || name == null) && (keyPath is String || keyPath == null) && (options is Map || options == null)) {
-      return _createIndex_4(name, keyPath, options);
+      return _createIndex_2(name, keyPath, options);
     }
     throw "Incorrect number or type of arguments";
   }
 
-  IDBIndex _createIndex_1(name, keyPath) native "IDBObjectStore_createIndex_1_Callback";
+  IDBIndex _createIndex_1(name, keyPath, options) native "IDBObjectStore_createIndex_1_Callback";
 
   IDBIndex _createIndex_2(name, keyPath, options) native "IDBObjectStore_createIndex_2_Callback";
 
-  IDBIndex _createIndex_3(name, keyPath) native "IDBObjectStore_createIndex_3_Callback";
-
-  IDBIndex _createIndex_4(name, keyPath, options) native "IDBObjectStore_createIndex_4_Callback";
-
   IDBRequest delete(key_OR_keyRange) {
     if ((key_OR_keyRange is IDBKeyRange || key_OR_keyRange == null)) {
       return _delete_1(key_OR_keyRange);
     }
-    if ((key_OR_keyRange is dynamic || key_OR_keyRange == null)) {
-      return _delete_2(key_OR_keyRange);
-    }
+    return _delete_2(key_OR_keyRange);
     throw "Incorrect number or type of arguments";
   }
 
@@ -17816,9 +17750,7 @@
     if ((key is IDBKeyRange || key == null)) {
       return _get_1(key);
     }
-    if ((key is dynamic || key == null)) {
-      return _get_2(key);
-    }
+    return _get_2(key);
     throw "Incorrect number or type of arguments";
   }
 
@@ -17838,10 +17770,10 @@
     if ((key_OR_range is IDBKeyRange || key_OR_range == null) && (direction is String || direction == null)) {
       return _openCursor_3(key_OR_range, direction);
     }
-    if ((key_OR_range is dynamic || key_OR_range == null) && !?direction) {
+    if (!?direction) {
       return _openCursor_4(key_OR_range);
     }
-    if ((key_OR_range is dynamic || key_OR_range == null) && (direction is String || direction == null)) {
+    if ((direction is String || direction == null)) {
       return _openCursor_5(key_OR_range, direction);
     }
     throw "Incorrect number or type of arguments";
@@ -17901,12 +17833,6 @@
   _IDBOpenDBRequestEventsImpl get on =>
     new _IDBOpenDBRequestEventsImpl(this);
 
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "IDBOpenDBRequest_addEventListener_Callback";
-
-  bool $dom_dispatchEvent(Event event) native "IDBOpenDBRequest_dispatchEvent_Callback";
-
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "IDBOpenDBRequest_removeEventListener_Callback";
-
 }
 
 class _IDBOpenDBRequestEventsImpl extends _IDBRequestEventsImpl implements IDBOpenDBRequestEvents {
@@ -18179,12 +18105,6 @@
   _IDBVersionChangeRequestEventsImpl get on =>
     new _IDBVersionChangeRequestEventsImpl(this);
 
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "IDBVersionChangeRequest_addEventListener_Callback";
-
-  bool $dom_dispatchEvent(Event event) native "IDBVersionChangeRequest_dispatchEvent_Callback";
-
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "IDBVersionChangeRequest_removeEventListener_Callback";
-
 }
 
 class _IDBVersionChangeRequestEventsImpl extends _IDBRequestEventsImpl implements IDBVersionChangeRequestEvents {
@@ -18571,6 +18491,9 @@
   /** @domName HTMLInputElement.defaultValue */
   String defaultValue;
 
+  /** @domName HTMLInputElement.dirName */
+  String dirName;
+
   /** @domName HTMLInputElement.disabled */
   bool disabled;
 
@@ -18703,6 +18626,9 @@
   /** @domName HTMLInputElement.setCustomValidity */
   void setCustomValidity(String error);
 
+  /** @domName HTMLInputElement.setRangeText */
+  void setRangeText(String replacement, [int start, int end, String selectionMode]);
+
   /** @domName HTMLInputElement.setSelectionRange */
   void setSelectionRange(int start, int end, [String direction]);
 
@@ -18760,6 +18686,10 @@
 
   void set defaultValue(String value) native "HTMLInputElement_defaultValue_Setter";
 
+  String get dirName native "HTMLInputElement_dirName_Getter";
+
+  void set dirName(String value) native "HTMLInputElement_dirName_Setter";
+
   bool get disabled native "HTMLInputElement_disabled_Getter";
 
   void set disabled(bool value) native "HTMLInputElement_disabled_Setter";
@@ -18916,6 +18846,22 @@
 
   void setCustomValidity(String error) native "HTMLInputElement_setCustomValidity_Callback";
 
+  void setRangeText(/*DOMString*/ replacement, [/*unsigned long*/ start, /*unsigned long*/ end, /*DOMString*/ selectionMode]) {
+    if ((replacement is String || replacement == null) && !?start && !?end && !?selectionMode) {
+      _setRangeText_1(replacement);
+      return;
+    }
+    if ((replacement is String || replacement == null) && (start is int || start == null) && (end is int || end == null) && (selectionMode is String || selectionMode == null)) {
+      _setRangeText_2(replacement, start, end, selectionMode);
+      return;
+    }
+    throw "Incorrect number or type of arguments";
+  }
+
+  void _setRangeText_1(replacement) native "HTMLInputElement_setRangeText_1_Callback";
+
+  void _setRangeText_2(replacement, start, end, selectionMode) native "HTMLInputElement_setRangeText_2_Callback";
+
   void setSelectionRange(int start, int end, [String direction]) native "HTMLInputElement_setSelectionRange_Callback";
 
   void stepDown([/*long*/ n]) {
@@ -19357,54 +19303,6 @@
 
 // WARNING: Do not edit - generated code.
 
-/// @domName JavaScriptAudioNode
-abstract class JavaScriptAudioNode implements AudioNode, EventTarget {
-
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
-  JavaScriptAudioNodeEvents get on;
-
-  /** @domName JavaScriptAudioNode.bufferSize */
-  int get bufferSize;
-}
-
-abstract class JavaScriptAudioNodeEvents implements Events {
-
-  EventListenerList get audioProcess;
-}
-// 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.
-
-class _JavaScriptAudioNodeImpl extends _AudioNodeImpl implements JavaScriptAudioNode {
-
-  _JavaScriptAudioNodeEventsImpl get on =>
-    new _JavaScriptAudioNodeEventsImpl(this);
-
-  int get bufferSize native "JavaScriptAudioNode_bufferSize_Getter";
-
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "JavaScriptAudioNode_addEventListener_Callback";
-
-  bool $dom_dispatchEvent(Event event) native "JavaScriptAudioNode_dispatchEvent_Callback";
-
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "JavaScriptAudioNode_removeEventListener_Callback";
-
-}
-
-class _JavaScriptAudioNodeEventsImpl extends _EventsImpl implements JavaScriptAudioNodeEvents {
-  _JavaScriptAudioNodeEventsImpl(_ptr) : super(_ptr);
-
-  EventListenerList get audioProcess => this['audioprocess'];
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
 /// @domName JavaScriptCallFrame
 abstract class JavaScriptCallFrame {
 
@@ -20012,12 +19910,6 @@
 
   void stop() native "LocalMediaStream_stop_Callback";
 
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "LocalMediaStream_addEventListener_Callback";
-
-  bool $dom_dispatchEvent(Event event) native "LocalMediaStream_dispatchEvent_Callback";
-
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "LocalMediaStream_removeEventListener_Callback";
-
 }
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -24125,6 +24017,24 @@
 
 // WARNING: Do not edit - generated code.
 
+/// @domName OESElementIndexUint
+abstract class OESElementIndexUint {
+}
+// 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.
+
+class _OESElementIndexUintImpl extends NativeFieldWrapperClass1 implements OESElementIndexUint {
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
 /// @domName OESStandardDerivatives
 abstract class OESStandardDerivatives {
 
@@ -24549,8 +24459,8 @@
 
 // WARNING: Do not edit - generated code.
 
-/// @domName Oscillator
-abstract class Oscillator implements AudioSourceNode {
+/// @domName OscillatorNode
+abstract class OscillatorNode implements AudioSourceNode {
 
   static const int CUSTOM = 4;
 
@@ -24570,25 +24480,25 @@
 
   static const int UNSCHEDULED_STATE = 0;
 
-  /** @domName Oscillator.detune */
+  /** @domName OscillatorNode.detune */
   AudioParam get detune;
 
-  /** @domName Oscillator.frequency */
+  /** @domName OscillatorNode.frequency */
   AudioParam get frequency;
 
-  /** @domName Oscillator.playbackState */
+  /** @domName OscillatorNode.playbackState */
   int get playbackState;
 
-  /** @domName Oscillator.type */
+  /** @domName OscillatorNode.type */
   int type;
 
-  /** @domName Oscillator.setWaveTable */
+  /** @domName OscillatorNode.setWaveTable */
   void setWaveTable(WaveTable waveTable);
 
-  /** @domName Oscillator.start */
+  /** @domName OscillatorNode.start */
   void start(num when);
 
-  /** @domName Oscillator.stop */
+  /** @domName OscillatorNode.stop */
   void stop(num when);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -24597,23 +24507,23 @@
 
 // WARNING: Do not edit - generated code.
 
-class _OscillatorImpl extends _AudioSourceNodeImpl implements Oscillator {
+class _OscillatorNodeImpl extends _AudioSourceNodeImpl implements OscillatorNode {
 
-  AudioParam get detune native "Oscillator_detune_Getter";
+  AudioParam get detune native "OscillatorNode_detune_Getter";
 
-  AudioParam get frequency native "Oscillator_frequency_Getter";
+  AudioParam get frequency native "OscillatorNode_frequency_Getter";
 
-  int get playbackState native "Oscillator_playbackState_Getter";
+  int get playbackState native "OscillatorNode_playbackState_Getter";
 
-  int get type native "Oscillator_type_Getter";
+  int get type native "OscillatorNode_type_Getter";
 
-  void set type(int value) native "Oscillator_type_Setter";
+  void set type(int value) native "OscillatorNode_type_Setter";
 
-  void setWaveTable(WaveTable waveTable) native "Oscillator_setWaveTable_Callback";
+  void setWaveTable(WaveTable waveTable) native "OscillatorNode_setWaveTable_Callback";
 
-  void start(num when) native "Oscillator_start_Callback";
+  void start(num when) native "OscillatorNode_start_Callback";
 
-  void stop(num when) native "Oscillator_stop_Callback";
+  void stop(num when) native "OscillatorNode_stop_Callback";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -24800,6 +24710,117 @@
 
 // WARNING: Do not edit - generated code.
 
+/// @domName PannerNode
+abstract class PannerNode implements AudioNode {
+
+  static const int EQUALPOWER = 0;
+
+  static const int EXPONENTIAL_DISTANCE = 2;
+
+  static const int HRTF = 1;
+
+  static const int INVERSE_DISTANCE = 1;
+
+  static const int LINEAR_DISTANCE = 0;
+
+  static const int SOUNDFIELD = 2;
+
+  /** @domName PannerNode.coneGain */
+  AudioGain get coneGain;
+
+  /** @domName PannerNode.coneInnerAngle */
+  num coneInnerAngle;
+
+  /** @domName PannerNode.coneOuterAngle */
+  num coneOuterAngle;
+
+  /** @domName PannerNode.coneOuterGain */
+  num coneOuterGain;
+
+  /** @domName PannerNode.distanceGain */
+  AudioGain get distanceGain;
+
+  /** @domName PannerNode.distanceModel */
+  int distanceModel;
+
+  /** @domName PannerNode.maxDistance */
+  num maxDistance;
+
+  /** @domName PannerNode.panningModel */
+  int panningModel;
+
+  /** @domName PannerNode.refDistance */
+  num refDistance;
+
+  /** @domName PannerNode.rolloffFactor */
+  num rolloffFactor;
+
+  /** @domName PannerNode.setOrientation */
+  void setOrientation(num x, num y, num z);
+
+  /** @domName PannerNode.setPosition */
+  void setPosition(num x, num y, num z);
+
+  /** @domName PannerNode.setVelocity */
+  void setVelocity(num x, num y, num z);
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+class _PannerNodeImpl extends _AudioNodeImpl implements PannerNode {
+
+  AudioGain get coneGain native "PannerNode_coneGain_Getter";
+
+  num get coneInnerAngle native "PannerNode_coneInnerAngle_Getter";
+
+  void set coneInnerAngle(num value) native "PannerNode_coneInnerAngle_Setter";
+
+  num get coneOuterAngle native "PannerNode_coneOuterAngle_Getter";
+
+  void set coneOuterAngle(num value) native "PannerNode_coneOuterAngle_Setter";
+
+  num get coneOuterGain native "PannerNode_coneOuterGain_Getter";
+
+  void set coneOuterGain(num value) native "PannerNode_coneOuterGain_Setter";
+
+  AudioGain get distanceGain native "PannerNode_distanceGain_Getter";
+
+  int get distanceModel native "PannerNode_distanceModel_Getter";
+
+  void set distanceModel(int value) native "PannerNode_distanceModel_Setter";
+
+  num get maxDistance native "PannerNode_maxDistance_Getter";
+
+  void set maxDistance(num value) native "PannerNode_maxDistance_Setter";
+
+  int get panningModel native "PannerNode_panningModel_Getter";
+
+  void set panningModel(int value) native "PannerNode_panningModel_Setter";
+
+  num get refDistance native "PannerNode_refDistance_Getter";
+
+  void set refDistance(num value) native "PannerNode_refDistance_Setter";
+
+  num get rolloffFactor native "PannerNode_rolloffFactor_Getter";
+
+  void set rolloffFactor(num value) native "PannerNode_rolloffFactor_Setter";
+
+  void setOrientation(num x, num y, num z) native "PannerNode_setOrientation_Callback";
+
+  void setPosition(num x, num y, num z) native "PannerNode_setPosition_Callback";
+
+  void setVelocity(num x, num y, num z) native "PannerNode_setVelocity_Callback";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
 /// @domName HTMLParagraphElement
 abstract class ParagraphElement implements Element {
 
@@ -25005,41 +25026,13 @@
 
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "PeerConnection00_addEventListener_Callback";
 
-  void addStream(/*MediaStream*/ stream, [/*Dictionary*/ mediaStreamHints]) {
-    if (?mediaStreamHints) {
-      _addStream_1(stream, mediaStreamHints);
-      return;
-    }
-    _addStream_2(stream);
-  }
-
-  void _addStream_1(stream, mediaStreamHints) native "PeerConnection00_addStream_1_Callback";
-
-  void _addStream_2(stream) native "PeerConnection00_addStream_2_Callback";
+  void addStream(MediaStream stream, [Map mediaStreamHints]) native "PeerConnection00_addStream_Callback";
 
   void close() native "PeerConnection00_close_Callback";
 
-  SessionDescription createAnswer(/*DOMString*/ offer, [/*Dictionary*/ mediaHints]) {
-    if (?mediaHints) {
-      return _createAnswer_1(offer, mediaHints);
-    }
-    return _createAnswer_2(offer);
-  }
+  SessionDescription createAnswer(String offer, [Map mediaHints]) native "PeerConnection00_createAnswer_Callback";
 
-  SessionDescription _createAnswer_1(offer, mediaHints) native "PeerConnection00_createAnswer_1_Callback";
-
-  SessionDescription _createAnswer_2(offer) native "PeerConnection00_createAnswer_2_Callback";
-
-  SessionDescription createOffer([/*Dictionary*/ mediaHints]) {
-    if (?mediaHints) {
-      return _createOffer_1(mediaHints);
-    }
-    return _createOffer_2();
-  }
-
-  SessionDescription _createOffer_1(mediaHints) native "PeerConnection00_createOffer_1_Callback";
-
-  SessionDescription _createOffer_2() native "PeerConnection00_createOffer_2_Callback";
+  SessionDescription createOffer([Map mediaHints]) native "PeerConnection00_createOffer_Callback";
 
   bool $dom_dispatchEvent(Event event) native "PeerConnection00_dispatchEvent_Callback";
 
@@ -25053,17 +25046,7 @@
 
   void setRemoteDescription(int action, SessionDescription desc) native "PeerConnection00_setRemoteDescription_Callback";
 
-  void startIce([/*Dictionary*/ iceOptions]) {
-    if (?iceOptions) {
-      _startIce_1(iceOptions);
-      return;
-    }
-    _startIce_2();
-  }
-
-  void _startIce_1(iceOptions) native "PeerConnection00_startIce_1_Callback";
-
-  void _startIce_2() native "PeerConnection00_startIce_2_Callback";
+  void startIce([Map iceOptions]) native "PeerConnection00_startIce_Callback";
 
 }
 
@@ -25851,7 +25834,7 @@
   void addIceCandidate(RTCIceCandidate candidate);
 
   /** @domName RTCPeerConnection.addStream */
-  void addStream(MediaStream stream, Map mediaConstraints);
+  void addStream(MediaStream stream, [Map mediaConstraints]);
 
   /** @domName RTCPeerConnection.close */
   void close();
@@ -25860,7 +25843,7 @@
   void createAnswer(RTCSessionDescriptionCallback successCallback, [RTCErrorCallback failureCallback, Map mediaConstraints]);
 
   /** @domName RTCPeerConnection.createDataChannel */
-  RTCDataChannel createDataChannel(String label, Map options);
+  RTCDataChannel createDataChannel(String label, [Map options]);
 
   /** @domName RTCPeerConnection.createOffer */
   void createOffer(RTCSessionDescriptionCallback successCallback, [RTCErrorCallback failureCallback, Map mediaConstraints]);
@@ -25884,7 +25867,7 @@
   void setRemoteDescription(RTCSessionDescription description, [VoidCallback successCallback, RTCErrorCallback failureCallback]);
 
   /** @domName RTCPeerConnection.updateIce */
-  void updateIce(Map configuration, Map mediaConstraints);
+  void updateIce([Map configuration, Map mediaConstraints]);
 }
 
 abstract class RTCPeerConnectionEvents implements Events {
@@ -25930,13 +25913,13 @@
 
   void addIceCandidate(RTCIceCandidate candidate) native "RTCPeerConnection_addIceCandidate_Callback";
 
-  void addStream(MediaStream stream, Map mediaConstraints) native "RTCPeerConnection_addStream_Callback";
+  void addStream(MediaStream stream, [Map mediaConstraints]) native "RTCPeerConnection_addStream_Callback";
 
   void close() native "RTCPeerConnection_close_Callback";
 
   void createAnswer(RTCSessionDescriptionCallback successCallback, [RTCErrorCallback failureCallback, Map mediaConstraints]) native "RTCPeerConnection_createAnswer_Callback";
 
-  RTCDataChannel createDataChannel(String label, Map options) native "RTCPeerConnection_createDataChannel_Callback";
+  RTCDataChannel createDataChannel(String label, [Map options]) native "RTCPeerConnection_createDataChannel_Callback";
 
   void createOffer(RTCSessionDescriptionCallback successCallback, [RTCErrorCallback failureCallback, Map mediaConstraints]) native "RTCPeerConnection_createOffer_Callback";
 
@@ -25952,7 +25935,7 @@
 
   void setRemoteDescription(RTCSessionDescription description, [VoidCallback successCallback, RTCErrorCallback failureCallback]) native "RTCPeerConnection_setRemoteDescription_Callback";
 
-  void updateIce(Map configuration, Map mediaConstraints) native "RTCPeerConnection_updateIce_Callback";
+  void updateIce([Map configuration, Map mediaConstraints]) native "RTCPeerConnection_updateIce_Callback";
 
 }
 
@@ -26364,72 +26347,6 @@
 
 // WARNING: Do not edit - generated code.
 
-/// @domName RealtimeAnalyserNode
-abstract class RealtimeAnalyserNode implements AudioNode {
-
-  /** @domName RealtimeAnalyserNode.fftSize */
-  int fftSize;
-
-  /** @domName RealtimeAnalyserNode.frequencyBinCount */
-  int get frequencyBinCount;
-
-  /** @domName RealtimeAnalyserNode.maxDecibels */
-  num maxDecibels;
-
-  /** @domName RealtimeAnalyserNode.minDecibels */
-  num minDecibels;
-
-  /** @domName RealtimeAnalyserNode.smoothingTimeConstant */
-  num smoothingTimeConstant;
-
-  /** @domName RealtimeAnalyserNode.getByteFrequencyData */
-  void getByteFrequencyData(Uint8Array array);
-
-  /** @domName RealtimeAnalyserNode.getByteTimeDomainData */
-  void getByteTimeDomainData(Uint8Array array);
-
-  /** @domName RealtimeAnalyserNode.getFloatFrequencyData */
-  void getFloatFrequencyData(Float32Array array);
-}
-// 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.
-
-class _RealtimeAnalyserNodeImpl extends _AudioNodeImpl implements RealtimeAnalyserNode {
-
-  int get fftSize native "RealtimeAnalyserNode_fftSize_Getter";
-
-  void set fftSize(int value) native "RealtimeAnalyserNode_fftSize_Setter";
-
-  int get frequencyBinCount native "RealtimeAnalyserNode_frequencyBinCount_Getter";
-
-  num get maxDecibels native "RealtimeAnalyserNode_maxDecibels_Getter";
-
-  void set maxDecibels(num value) native "RealtimeAnalyserNode_maxDecibels_Setter";
-
-  num get minDecibels native "RealtimeAnalyserNode_minDecibels_Getter";
-
-  void set minDecibels(num value) native "RealtimeAnalyserNode_minDecibels_Setter";
-
-  num get smoothingTimeConstant native "RealtimeAnalyserNode_smoothingTimeConstant_Getter";
-
-  void set smoothingTimeConstant(num value) native "RealtimeAnalyserNode_smoothingTimeConstant_Setter";
-
-  void getByteFrequencyData(Uint8Array array) native "RealtimeAnalyserNode_getByteFrequencyData_Callback";
-
-  void getByteTimeDomainData(Uint8Array array) native "RealtimeAnalyserNode_getByteTimeDomainData_Callback";
-
-  void getFloatFrequencyData(Float32Array array) native "RealtimeAnalyserNode_getFloatFrequencyData_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.
-
 /// @domName Rect
 abstract class Rect {
 
@@ -26810,15 +26727,7 @@
 
   SVGAnimatedString get target native "SVGAElement_target_Getter";
 
-  SVGAnimatedString get href native "SVGAElement_href_Getter";
-
-  SVGStringList get requiredExtensions native "SVGAElement_requiredExtensions_Getter";
-
-  SVGStringList get requiredFeatures native "SVGAElement_requiredFeatures_Getter";
-
-  SVGStringList get systemLanguage native "SVGAElement_systemLanguage_Getter";
-
-  bool hasExtension(String extension) native "SVGAElement_hasExtension_Callback";
+  SVGAnimatedBoolean get externalResourcesRequired native "SVGAElement_externalResourcesRequired_Getter";
 
   String get xmllang native "SVGAElement_xmllang_Getter";
 
@@ -26828,16 +26737,6 @@
 
   void set xmlspace(String value) native "SVGAElement_xmlspace_Setter";
 
-  SVGAnimatedBoolean get externalResourcesRequired native "SVGAElement_externalResourcesRequired_Getter";
-
-  SVGAnimatedString get $dom_svgClassName native "SVGAElement_className_Getter";
-
-  CSSStyleDeclaration get style native "SVGAElement_style_Getter";
-
-  CSSValue getPresentationAttribute(String name) native "SVGAElement_getPresentationAttribute_Callback";
-
-  SVGAnimatedTransformList get transform native "SVGAElement_transform_Getter";
-
   SVGElement get farthestViewportElement native "SVGAElement_farthestViewportElement_Getter";
 
   SVGElement get nearestViewportElement native "SVGAElement_nearestViewportElement_Getter";
@@ -26850,6 +26749,24 @@
 
   SVGMatrix getTransformToElement(SVGElement element) native "SVGAElement_getTransformToElement_Callback";
 
+  SVGAnimatedString get $dom_svgClassName native "SVGAElement_className_Getter";
+
+  CSSStyleDeclaration get style native "SVGAElement_style_Getter";
+
+  CSSValue getPresentationAttribute(String name) native "SVGAElement_getPresentationAttribute_Callback";
+
+  SVGStringList get requiredExtensions native "SVGAElement_requiredExtensions_Getter";
+
+  SVGStringList get requiredFeatures native "SVGAElement_requiredFeatures_Getter";
+
+  SVGStringList get systemLanguage native "SVGAElement_systemLanguage_Getter";
+
+  bool hasExtension(String extension) native "SVGAElement_hasExtension_Callback";
+
+  SVGAnimatedTransformList get transform native "SVGAElement_transform_Getter";
+
+  SVGAnimatedString get href native "SVGAElement_href_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
@@ -27689,16 +27606,6 @@
 
   num getStartTime() native "SVGAnimationElement_getStartTime_Callback";
 
-  SVGStringList get requiredExtensions native "SVGAnimationElement_requiredExtensions_Getter";
-
-  SVGStringList get requiredFeatures native "SVGAnimationElement_requiredFeatures_Getter";
-
-  SVGStringList get systemLanguage native "SVGAnimationElement_systemLanguage_Getter";
-
-  bool hasExtension(String extension) native "SVGAnimationElement_hasExtension_Callback";
-
-  SVGAnimatedBoolean get externalResourcesRequired native "SVGAnimationElement_externalResourcesRequired_Getter";
-
   void beginElement() native "SVGAnimationElement_beginElement_Callback";
 
   void beginElementAt(num offset) native "SVGAnimationElement_beginElementAt_Callback";
@@ -27707,6 +27614,16 @@
 
   void endElementAt(num offset) native "SVGAnimationElement_endElementAt_Callback";
 
+  SVGAnimatedBoolean get externalResourcesRequired native "SVGAnimationElement_externalResourcesRequired_Getter";
+
+  SVGStringList get requiredExtensions native "SVGAnimationElement_requiredExtensions_Getter";
+
+  SVGStringList get requiredFeatures native "SVGAnimationElement_requiredFeatures_Getter";
+
+  SVGStringList get systemLanguage native "SVGAnimationElement_systemLanguage_Getter";
+
+  bool hasExtension(String extension) native "SVGAnimationElement_hasExtension_Callback";
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -27740,13 +27657,7 @@
 
   SVGAnimatedLength get r native "SVGCircleElement_r_Getter";
 
-  SVGStringList get requiredExtensions native "SVGCircleElement_requiredExtensions_Getter";
-
-  SVGStringList get requiredFeatures native "SVGCircleElement_requiredFeatures_Getter";
-
-  SVGStringList get systemLanguage native "SVGCircleElement_systemLanguage_Getter";
-
-  bool hasExtension(String extension) native "SVGCircleElement_hasExtension_Callback";
+  SVGAnimatedBoolean get externalResourcesRequired native "SVGCircleElement_externalResourcesRequired_Getter";
 
   String get xmllang native "SVGCircleElement_xmllang_Getter";
 
@@ -27756,16 +27667,6 @@
 
   void set xmlspace(String value) native "SVGCircleElement_xmlspace_Setter";
 
-  SVGAnimatedBoolean get externalResourcesRequired native "SVGCircleElement_externalResourcesRequired_Getter";
-
-  SVGAnimatedString get $dom_svgClassName native "SVGCircleElement_className_Getter";
-
-  CSSStyleDeclaration get style native "SVGCircleElement_style_Getter";
-
-  CSSValue getPresentationAttribute(String name) native "SVGCircleElement_getPresentationAttribute_Callback";
-
-  SVGAnimatedTransformList get transform native "SVGCircleElement_transform_Getter";
-
   SVGElement get farthestViewportElement native "SVGCircleElement_farthestViewportElement_Getter";
 
   SVGElement get nearestViewportElement native "SVGCircleElement_nearestViewportElement_Getter";
@@ -27778,6 +27679,22 @@
 
   SVGMatrix getTransformToElement(SVGElement element) native "SVGCircleElement_getTransformToElement_Callback";
 
+  SVGAnimatedString get $dom_svgClassName native "SVGCircleElement_className_Getter";
+
+  CSSStyleDeclaration get style native "SVGCircleElement_style_Getter";
+
+  CSSValue getPresentationAttribute(String name) native "SVGCircleElement_getPresentationAttribute_Callback";
+
+  SVGStringList get requiredExtensions native "SVGCircleElement_requiredExtensions_Getter";
+
+  SVGStringList get requiredFeatures native "SVGCircleElement_requiredFeatures_Getter";
+
+  SVGStringList get systemLanguage native "SVGCircleElement_systemLanguage_Getter";
+
+  bool hasExtension(String extension) native "SVGCircleElement_hasExtension_Callback";
+
+  SVGAnimatedTransformList get transform native "SVGCircleElement_transform_Getter";
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -27801,13 +27718,7 @@
 
   SVGAnimatedEnumeration get clipPathUnits native "SVGClipPathElement_clipPathUnits_Getter";
 
-  SVGStringList get requiredExtensions native "SVGClipPathElement_requiredExtensions_Getter";
-
-  SVGStringList get requiredFeatures native "SVGClipPathElement_requiredFeatures_Getter";
-
-  SVGStringList get systemLanguage native "SVGClipPathElement_systemLanguage_Getter";
-
-  bool hasExtension(String extension) native "SVGClipPathElement_hasExtension_Callback";
+  SVGAnimatedBoolean get externalResourcesRequired native "SVGClipPathElement_externalResourcesRequired_Getter";
 
   String get xmllang native "SVGClipPathElement_xmllang_Getter";
 
@@ -27817,16 +27728,6 @@
 
   void set xmlspace(String value) native "SVGClipPathElement_xmlspace_Setter";
 
-  SVGAnimatedBoolean get externalResourcesRequired native "SVGClipPathElement_externalResourcesRequired_Getter";
-
-  SVGAnimatedString get $dom_svgClassName native "SVGClipPathElement_className_Getter";
-
-  CSSStyleDeclaration get style native "SVGClipPathElement_style_Getter";
-
-  CSSValue getPresentationAttribute(String name) native "SVGClipPathElement_getPresentationAttribute_Callback";
-
-  SVGAnimatedTransformList get transform native "SVGClipPathElement_transform_Getter";
-
   SVGElement get farthestViewportElement native "SVGClipPathElement_farthestViewportElement_Getter";
 
   SVGElement get nearestViewportElement native "SVGClipPathElement_nearestViewportElement_Getter";
@@ -27839,6 +27740,22 @@
 
   SVGMatrix getTransformToElement(SVGElement element) native "SVGClipPathElement_getTransformToElement_Callback";
 
+  SVGAnimatedString get $dom_svgClassName native "SVGClipPathElement_className_Getter";
+
+  CSSStyleDeclaration get style native "SVGClipPathElement_style_Getter";
+
+  CSSValue getPresentationAttribute(String name) native "SVGClipPathElement_getPresentationAttribute_Callback";
+
+  SVGStringList get requiredExtensions native "SVGClipPathElement_requiredExtensions_Getter";
+
+  SVGStringList get requiredFeatures native "SVGClipPathElement_requiredFeatures_Getter";
+
+  SVGStringList get systemLanguage native "SVGClipPathElement_systemLanguage_Getter";
+
+  bool hasExtension(String extension) native "SVGClipPathElement_hasExtension_Callback";
+
+  SVGAnimatedTransformList get transform native "SVGClipPathElement_transform_Getter";
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -27983,7 +27900,7 @@
 
   SVGAnimatedLength get y native "SVGCursorElement_y_Getter";
 
-  SVGAnimatedString get href native "SVGCursorElement_href_Getter";
+  SVGAnimatedBoolean get externalResourcesRequired native "SVGCursorElement_externalResourcesRequired_Getter";
 
   SVGStringList get requiredExtensions native "SVGCursorElement_requiredExtensions_Getter";
 
@@ -27993,7 +27910,7 @@
 
   bool hasExtension(String extension) native "SVGCursorElement_hasExtension_Callback";
 
-  SVGAnimatedBoolean get externalResourcesRequired native "SVGCursorElement_externalResourcesRequired_Getter";
+  SVGAnimatedString get href native "SVGCursorElement_href_Getter";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -28013,13 +27930,7 @@
 
 class _SVGDefsElementImpl extends _SVGElementImpl implements SVGDefsElement {
 
-  SVGStringList get requiredExtensions native "SVGDefsElement_requiredExtensions_Getter";
-
-  SVGStringList get requiredFeatures native "SVGDefsElement_requiredFeatures_Getter";
-
-  SVGStringList get systemLanguage native "SVGDefsElement_systemLanguage_Getter";
-
-  bool hasExtension(String extension) native "SVGDefsElement_hasExtension_Callback";
+  SVGAnimatedBoolean get externalResourcesRequired native "SVGDefsElement_externalResourcesRequired_Getter";
 
   String get xmllang native "SVGDefsElement_xmllang_Getter";
 
@@ -28029,16 +27940,6 @@
 
   void set xmlspace(String value) native "SVGDefsElement_xmlspace_Setter";
 
-  SVGAnimatedBoolean get externalResourcesRequired native "SVGDefsElement_externalResourcesRequired_Getter";
-
-  SVGAnimatedString get $dom_svgClassName native "SVGDefsElement_className_Getter";
-
-  CSSStyleDeclaration get style native "SVGDefsElement_style_Getter";
-
-  CSSValue getPresentationAttribute(String name) native "SVGDefsElement_getPresentationAttribute_Callback";
-
-  SVGAnimatedTransformList get transform native "SVGDefsElement_transform_Getter";
-
   SVGElement get farthestViewportElement native "SVGDefsElement_farthestViewportElement_Getter";
 
   SVGElement get nearestViewportElement native "SVGDefsElement_nearestViewportElement_Getter";
@@ -28051,6 +27952,22 @@
 
   SVGMatrix getTransformToElement(SVGElement element) native "SVGDefsElement_getTransformToElement_Callback";
 
+  SVGAnimatedString get $dom_svgClassName native "SVGDefsElement_className_Getter";
+
+  CSSStyleDeclaration get style native "SVGDefsElement_style_Getter";
+
+  CSSValue getPresentationAttribute(String name) native "SVGDefsElement_getPresentationAttribute_Callback";
+
+  SVGStringList get requiredExtensions native "SVGDefsElement_requiredExtensions_Getter";
+
+  SVGStringList get requiredFeatures native "SVGDefsElement_requiredFeatures_Getter";
+
+  SVGStringList get systemLanguage native "SVGDefsElement_systemLanguage_Getter";
+
+  bool hasExtension(String extension) native "SVGDefsElement_hasExtension_Callback";
+
+  SVGAnimatedTransformList get transform native "SVGDefsElement_transform_Getter";
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -28573,13 +28490,7 @@
 
   SVGAnimatedLength get ry native "SVGEllipseElement_ry_Getter";
 
-  SVGStringList get requiredExtensions native "SVGEllipseElement_requiredExtensions_Getter";
-
-  SVGStringList get requiredFeatures native "SVGEllipseElement_requiredFeatures_Getter";
-
-  SVGStringList get systemLanguage native "SVGEllipseElement_systemLanguage_Getter";
-
-  bool hasExtension(String extension) native "SVGEllipseElement_hasExtension_Callback";
+  SVGAnimatedBoolean get externalResourcesRequired native "SVGEllipseElement_externalResourcesRequired_Getter";
 
   String get xmllang native "SVGEllipseElement_xmllang_Getter";
 
@@ -28589,16 +28500,6 @@
 
   void set xmlspace(String value) native "SVGEllipseElement_xmlspace_Setter";
 
-  SVGAnimatedBoolean get externalResourcesRequired native "SVGEllipseElement_externalResourcesRequired_Getter";
-
-  SVGAnimatedString get $dom_svgClassName native "SVGEllipseElement_className_Getter";
-
-  CSSStyleDeclaration get style native "SVGEllipseElement_style_Getter";
-
-  CSSValue getPresentationAttribute(String name) native "SVGEllipseElement_getPresentationAttribute_Callback";
-
-  SVGAnimatedTransformList get transform native "SVGEllipseElement_transform_Getter";
-
   SVGElement get farthestViewportElement native "SVGEllipseElement_farthestViewportElement_Getter";
 
   SVGElement get nearestViewportElement native "SVGEllipseElement_nearestViewportElement_Getter";
@@ -28611,6 +28512,22 @@
 
   SVGMatrix getTransformToElement(SVGElement element) native "SVGEllipseElement_getTransformToElement_Callback";
 
+  SVGAnimatedString get $dom_svgClassName native "SVGEllipseElement_className_Getter";
+
+  CSSStyleDeclaration get style native "SVGEllipseElement_style_Getter";
+
+  CSSValue getPresentationAttribute(String name) native "SVGEllipseElement_getPresentationAttribute_Callback";
+
+  SVGStringList get requiredExtensions native "SVGEllipseElement_requiredExtensions_Getter";
+
+  SVGStringList get requiredFeatures native "SVGEllipseElement_requiredFeatures_Getter";
+
+  SVGStringList get systemLanguage native "SVGEllipseElement_systemLanguage_Getter";
+
+  bool hasExtension(String extension) native "SVGEllipseElement_hasExtension_Callback";
+
+  SVGAnimatedTransformList get transform native "SVGEllipseElement_transform_Getter";
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -29414,16 +29331,6 @@
 
   SVGAnimatedPreserveAspectRatio get preserveAspectRatio native "SVGFEImageElement_preserveAspectRatio_Getter";
 
-  SVGAnimatedString get href native "SVGFEImageElement_href_Getter";
-
-  String get xmllang native "SVGFEImageElement_xmllang_Getter";
-
-  void set xmllang(String value) native "SVGFEImageElement_xmllang_Setter";
-
-  String get xmlspace native "SVGFEImageElement_xmlspace_Getter";
-
-  void set xmlspace(String value) native "SVGFEImageElement_xmlspace_Setter";
-
   SVGAnimatedBoolean get externalResourcesRequired native "SVGFEImageElement_externalResourcesRequired_Getter";
 
   SVGAnimatedLength get height native "SVGFEImageElement_height_Getter";
@@ -29436,12 +29343,22 @@
 
   SVGAnimatedLength get y native "SVGFEImageElement_y_Getter";
 
+  String get xmllang native "SVGFEImageElement_xmllang_Getter";
+
+  void set xmllang(String value) native "SVGFEImageElement_xmllang_Setter";
+
+  String get xmlspace native "SVGFEImageElement_xmlspace_Getter";
+
+  void set xmlspace(String value) native "SVGFEImageElement_xmlspace_Setter";
+
   SVGAnimatedString get $dom_svgClassName native "SVGFEImageElement_className_Getter";
 
   CSSStyleDeclaration get style native "SVGFEImageElement_style_Getter";
 
   CSSValue getPresentationAttribute(String name) native "SVGFEImageElement_getPresentationAttribute_Callback";
 
+  SVGAnimatedString get href native "SVGFEImageElement_href_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
@@ -29936,7 +29853,7 @@
 
   void setFilterRes(int filterResX, int filterResY) native "SVGFilterElement_setFilterRes_Callback";
 
-  SVGAnimatedString get href native "SVGFilterElement_href_Getter";
+  SVGAnimatedBoolean get externalResourcesRequired native "SVGFilterElement_externalResourcesRequired_Getter";
 
   String get xmllang native "SVGFilterElement_xmllang_Getter";
 
@@ -29946,14 +29863,14 @@
 
   void set xmlspace(String value) native "SVGFilterElement_xmlspace_Setter";
 
-  SVGAnimatedBoolean get externalResourcesRequired native "SVGFilterElement_externalResourcesRequired_Getter";
-
   SVGAnimatedString get $dom_svgClassName native "SVGFilterElement_className_Getter";
 
   CSSStyleDeclaration get style native "SVGFilterElement_style_Getter";
 
   CSSValue getPresentationAttribute(String name) native "SVGFilterElement_getPresentationAttribute_Callback";
 
+  SVGAnimatedString get href native "SVGFilterElement_href_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
@@ -30139,13 +30056,7 @@
 
   SVGAnimatedLength get y native "SVGForeignObjectElement_y_Getter";
 
-  SVGStringList get requiredExtensions native "SVGForeignObjectElement_requiredExtensions_Getter";
-
-  SVGStringList get requiredFeatures native "SVGForeignObjectElement_requiredFeatures_Getter";
-
-  SVGStringList get systemLanguage native "SVGForeignObjectElement_systemLanguage_Getter";
-
-  bool hasExtension(String extension) native "SVGForeignObjectElement_hasExtension_Callback";
+  SVGAnimatedBoolean get externalResourcesRequired native "SVGForeignObjectElement_externalResourcesRequired_Getter";
 
   String get xmllang native "SVGForeignObjectElement_xmllang_Getter";
 
@@ -30155,16 +30066,6 @@
 
   void set xmlspace(String value) native "SVGForeignObjectElement_xmlspace_Setter";
 
-  SVGAnimatedBoolean get externalResourcesRequired native "SVGForeignObjectElement_externalResourcesRequired_Getter";
-
-  SVGAnimatedString get $dom_svgClassName native "SVGForeignObjectElement_className_Getter";
-
-  CSSStyleDeclaration get style native "SVGForeignObjectElement_style_Getter";
-
-  CSSValue getPresentationAttribute(String name) native "SVGForeignObjectElement_getPresentationAttribute_Callback";
-
-  SVGAnimatedTransformList get transform native "SVGForeignObjectElement_transform_Getter";
-
   SVGElement get farthestViewportElement native "SVGForeignObjectElement_farthestViewportElement_Getter";
 
   SVGElement get nearestViewportElement native "SVGForeignObjectElement_nearestViewportElement_Getter";
@@ -30177,6 +30078,22 @@
 
   SVGMatrix getTransformToElement(SVGElement element) native "SVGForeignObjectElement_getTransformToElement_Callback";
 
+  SVGAnimatedString get $dom_svgClassName native "SVGForeignObjectElement_className_Getter";
+
+  CSSStyleDeclaration get style native "SVGForeignObjectElement_style_Getter";
+
+  CSSValue getPresentationAttribute(String name) native "SVGForeignObjectElement_getPresentationAttribute_Callback";
+
+  SVGStringList get requiredExtensions native "SVGForeignObjectElement_requiredExtensions_Getter";
+
+  SVGStringList get requiredFeatures native "SVGForeignObjectElement_requiredFeatures_Getter";
+
+  SVGStringList get systemLanguage native "SVGForeignObjectElement_systemLanguage_Getter";
+
+  bool hasExtension(String extension) native "SVGForeignObjectElement_hasExtension_Callback";
+
+  SVGAnimatedTransformList get transform native "SVGForeignObjectElement_transform_Getter";
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -30195,13 +30112,7 @@
 
 class _SVGGElementImpl extends _SVGElementImpl implements SVGGElement {
 
-  SVGStringList get requiredExtensions native "SVGGElement_requiredExtensions_Getter";
-
-  SVGStringList get requiredFeatures native "SVGGElement_requiredFeatures_Getter";
-
-  SVGStringList get systemLanguage native "SVGGElement_systemLanguage_Getter";
-
-  bool hasExtension(String extension) native "SVGGElement_hasExtension_Callback";
+  SVGAnimatedBoolean get externalResourcesRequired native "SVGGElement_externalResourcesRequired_Getter";
 
   String get xmllang native "SVGGElement_xmllang_Getter";
 
@@ -30211,16 +30122,6 @@
 
   void set xmlspace(String value) native "SVGGElement_xmlspace_Setter";
 
-  SVGAnimatedBoolean get externalResourcesRequired native "SVGGElement_externalResourcesRequired_Getter";
-
-  SVGAnimatedString get $dom_svgClassName native "SVGGElement_className_Getter";
-
-  CSSStyleDeclaration get style native "SVGGElement_style_Getter";
-
-  CSSValue getPresentationAttribute(String name) native "SVGGElement_getPresentationAttribute_Callback";
-
-  SVGAnimatedTransformList get transform native "SVGGElement_transform_Getter";
-
   SVGElement get farthestViewportElement native "SVGGElement_farthestViewportElement_Getter";
 
   SVGElement get nearestViewportElement native "SVGGElement_nearestViewportElement_Getter";
@@ -30233,6 +30134,22 @@
 
   SVGMatrix getTransformToElement(SVGElement element) native "SVGGElement_getTransformToElement_Callback";
 
+  SVGAnimatedString get $dom_svgClassName native "SVGGElement_className_Getter";
+
+  CSSStyleDeclaration get style native "SVGGElement_style_Getter";
+
+  CSSValue getPresentationAttribute(String name) native "SVGGElement_getPresentationAttribute_Callback";
+
+  SVGStringList get requiredExtensions native "SVGGElement_requiredExtensions_Getter";
+
+  SVGStringList get requiredFeatures native "SVGGElement_requiredFeatures_Getter";
+
+  SVGStringList get systemLanguage native "SVGGElement_systemLanguage_Getter";
+
+  bool hasExtension(String extension) native "SVGGElement_hasExtension_Callback";
+
+  SVGAnimatedTransformList get transform native "SVGGElement_transform_Getter";
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -30311,14 +30228,14 @@
 
   void set y(num value) native "SVGGlyphRefElement_y_Setter";
 
-  SVGAnimatedString get href native "SVGGlyphRefElement_href_Getter";
-
   SVGAnimatedString get $dom_svgClassName native "SVGGlyphRefElement_className_Getter";
 
   CSSStyleDeclaration get style native "SVGGlyphRefElement_style_Getter";
 
   CSSValue getPresentationAttribute(String name) native "SVGGlyphRefElement_getPresentationAttribute_Callback";
 
+  SVGAnimatedString get href native "SVGGlyphRefElement_href_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
@@ -30360,8 +30277,6 @@
 
   SVGAnimatedEnumeration get spreadMethod native "SVGGradientElement_spreadMethod_Getter";
 
-  SVGAnimatedString get href native "SVGGradientElement_href_Getter";
-
   SVGAnimatedBoolean get externalResourcesRequired native "SVGGradientElement_externalResourcesRequired_Getter";
 
   SVGAnimatedString get $dom_svgClassName native "SVGGradientElement_className_Getter";
@@ -30370,6 +30285,8 @@
 
   CSSValue getPresentationAttribute(String name) native "SVGGradientElement_getPresentationAttribute_Callback";
 
+  SVGAnimatedString get href native "SVGGradientElement_href_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
@@ -30431,15 +30348,7 @@
 
   SVGAnimatedLength get y native "SVGImageElement_y_Getter";
 
-  SVGAnimatedString get href native "SVGImageElement_href_Getter";
-
-  SVGStringList get requiredExtensions native "SVGImageElement_requiredExtensions_Getter";
-
-  SVGStringList get requiredFeatures native "SVGImageElement_requiredFeatures_Getter";
-
-  SVGStringList get systemLanguage native "SVGImageElement_systemLanguage_Getter";
-
-  bool hasExtension(String extension) native "SVGImageElement_hasExtension_Callback";
+  SVGAnimatedBoolean get externalResourcesRequired native "SVGImageElement_externalResourcesRequired_Getter";
 
   String get xmllang native "SVGImageElement_xmllang_Getter";
 
@@ -30449,16 +30358,6 @@
 
   void set xmlspace(String value) native "SVGImageElement_xmlspace_Setter";
 
-  SVGAnimatedBoolean get externalResourcesRequired native "SVGImageElement_externalResourcesRequired_Getter";
-
-  SVGAnimatedString get $dom_svgClassName native "SVGImageElement_className_Getter";
-
-  CSSStyleDeclaration get style native "SVGImageElement_style_Getter";
-
-  CSSValue getPresentationAttribute(String name) native "SVGImageElement_getPresentationAttribute_Callback";
-
-  SVGAnimatedTransformList get transform native "SVGImageElement_transform_Getter";
-
   SVGElement get farthestViewportElement native "SVGImageElement_farthestViewportElement_Getter";
 
   SVGElement get nearestViewportElement native "SVGImageElement_nearestViewportElement_Getter";
@@ -30471,6 +30370,24 @@
 
   SVGMatrix getTransformToElement(SVGElement element) native "SVGImageElement_getTransformToElement_Callback";
 
+  SVGAnimatedString get $dom_svgClassName native "SVGImageElement_className_Getter";
+
+  CSSStyleDeclaration get style native "SVGImageElement_style_Getter";
+
+  CSSValue getPresentationAttribute(String name) native "SVGImageElement_getPresentationAttribute_Callback";
+
+  SVGStringList get requiredExtensions native "SVGImageElement_requiredExtensions_Getter";
+
+  SVGStringList get requiredFeatures native "SVGImageElement_requiredFeatures_Getter";
+
+  SVGStringList get systemLanguage native "SVGImageElement_systemLanguage_Getter";
+
+  bool hasExtension(String extension) native "SVGImageElement_hasExtension_Callback";
+
+  SVGAnimatedTransformList get transform native "SVGImageElement_transform_Getter";
+
+  SVGAnimatedString get href native "SVGImageElement_href_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
@@ -30741,13 +30658,7 @@
 
   SVGAnimatedLength get y2 native "SVGLineElement_y2_Getter";
 
-  SVGStringList get requiredExtensions native "SVGLineElement_requiredExtensions_Getter";
-
-  SVGStringList get requiredFeatures native "SVGLineElement_requiredFeatures_Getter";
-
-  SVGStringList get systemLanguage native "SVGLineElement_systemLanguage_Getter";
-
-  bool hasExtension(String extension) native "SVGLineElement_hasExtension_Callback";
+  SVGAnimatedBoolean get externalResourcesRequired native "SVGLineElement_externalResourcesRequired_Getter";
 
   String get xmllang native "SVGLineElement_xmllang_Getter";
 
@@ -30757,16 +30668,6 @@
 
   void set xmlspace(String value) native "SVGLineElement_xmlspace_Setter";
 
-  SVGAnimatedBoolean get externalResourcesRequired native "SVGLineElement_externalResourcesRequired_Getter";
-
-  SVGAnimatedString get $dom_svgClassName native "SVGLineElement_className_Getter";
-
-  CSSStyleDeclaration get style native "SVGLineElement_style_Getter";
-
-  CSSValue getPresentationAttribute(String name) native "SVGLineElement_getPresentationAttribute_Callback";
-
-  SVGAnimatedTransformList get transform native "SVGLineElement_transform_Getter";
-
   SVGElement get farthestViewportElement native "SVGLineElement_farthestViewportElement_Getter";
 
   SVGElement get nearestViewportElement native "SVGLineElement_nearestViewportElement_Getter";
@@ -30779,6 +30680,22 @@
 
   SVGMatrix getTransformToElement(SVGElement element) native "SVGLineElement_getTransformToElement_Callback";
 
+  SVGAnimatedString get $dom_svgClassName native "SVGLineElement_className_Getter";
+
+  CSSStyleDeclaration get style native "SVGLineElement_style_Getter";
+
+  CSSValue getPresentationAttribute(String name) native "SVGLineElement_getPresentationAttribute_Callback";
+
+  SVGStringList get requiredExtensions native "SVGLineElement_requiredExtensions_Getter";
+
+  SVGStringList get requiredFeatures native "SVGLineElement_requiredFeatures_Getter";
+
+  SVGStringList get systemLanguage native "SVGLineElement_systemLanguage_Getter";
+
+  bool hasExtension(String extension) native "SVGLineElement_hasExtension_Callback";
+
+  SVGAnimatedTransformList get transform native "SVGLineElement_transform_Getter";
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -30862,10 +30779,10 @@
 
 class _SVGMPathElementImpl extends _SVGElementImpl implements SVGMPathElement {
 
-  SVGAnimatedString get href native "SVGMPathElement_href_Getter";
-
   SVGAnimatedBoolean get externalResourcesRequired native "SVGMPathElement_externalResourcesRequired_Getter";
 
+  SVGAnimatedString get href native "SVGMPathElement_href_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
@@ -30941,6 +30858,12 @@
 
   void setOrientToAuto() native "SVGMarkerElement_setOrientToAuto_Callback";
 
+  SVGAnimatedBoolean get externalResourcesRequired native "SVGMarkerElement_externalResourcesRequired_Getter";
+
+  SVGAnimatedPreserveAspectRatio get preserveAspectRatio native "SVGMarkerElement_preserveAspectRatio_Getter";
+
+  SVGAnimatedRect get viewBox native "SVGMarkerElement_viewBox_Getter";
+
   String get xmllang native "SVGMarkerElement_xmllang_Getter";
 
   void set xmllang(String value) native "SVGMarkerElement_xmllang_Setter";
@@ -30949,18 +30872,12 @@
 
   void set xmlspace(String value) native "SVGMarkerElement_xmlspace_Setter";
 
-  SVGAnimatedBoolean get externalResourcesRequired native "SVGMarkerElement_externalResourcesRequired_Getter";
-
   SVGAnimatedString get $dom_svgClassName native "SVGMarkerElement_className_Getter";
 
   CSSStyleDeclaration get style native "SVGMarkerElement_style_Getter";
 
   CSSValue getPresentationAttribute(String name) native "SVGMarkerElement_getPresentationAttribute_Callback";
 
-  SVGAnimatedPreserveAspectRatio get preserveAspectRatio native "SVGMarkerElement_preserveAspectRatio_Getter";
-
-  SVGAnimatedRect get viewBox native "SVGMarkerElement_viewBox_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
@@ -31009,13 +30926,7 @@
 
   SVGAnimatedLength get y native "SVGMaskElement_y_Getter";
 
-  SVGStringList get requiredExtensions native "SVGMaskElement_requiredExtensions_Getter";
-
-  SVGStringList get requiredFeatures native "SVGMaskElement_requiredFeatures_Getter";
-
-  SVGStringList get systemLanguage native "SVGMaskElement_systemLanguage_Getter";
-
-  bool hasExtension(String extension) native "SVGMaskElement_hasExtension_Callback";
+  SVGAnimatedBoolean get externalResourcesRequired native "SVGMaskElement_externalResourcesRequired_Getter";
 
   String get xmllang native "SVGMaskElement_xmllang_Getter";
 
@@ -31025,14 +30936,20 @@
 
   void set xmlspace(String value) native "SVGMaskElement_xmlspace_Setter";
 
-  SVGAnimatedBoolean get externalResourcesRequired native "SVGMaskElement_externalResourcesRequired_Getter";
-
   SVGAnimatedString get $dom_svgClassName native "SVGMaskElement_className_Getter";
 
   CSSStyleDeclaration get style native "SVGMaskElement_style_Getter";
 
   CSSValue getPresentationAttribute(String name) native "SVGMaskElement_getPresentationAttribute_Callback";
 
+  SVGStringList get requiredExtensions native "SVGMaskElement_requiredExtensions_Getter";
+
+  SVGStringList get requiredFeatures native "SVGMaskElement_requiredFeatures_Getter";
+
+  SVGStringList get systemLanguage native "SVGMaskElement_systemLanguage_Getter";
+
+  bool hasExtension(String extension) native "SVGMaskElement_hasExtension_Callback";
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -31561,13 +31478,7 @@
 
   num getTotalLength() native "SVGPathElement_getTotalLength_Callback";
 
-  SVGStringList get requiredExtensions native "SVGPathElement_requiredExtensions_Getter";
-
-  SVGStringList get requiredFeatures native "SVGPathElement_requiredFeatures_Getter";
-
-  SVGStringList get systemLanguage native "SVGPathElement_systemLanguage_Getter";
-
-  bool hasExtension(String extension) native "SVGPathElement_hasExtension_Callback";
+  SVGAnimatedBoolean get externalResourcesRequired native "SVGPathElement_externalResourcesRequired_Getter";
 
   String get xmllang native "SVGPathElement_xmllang_Getter";
 
@@ -31577,16 +31488,6 @@
 
   void set xmlspace(String value) native "SVGPathElement_xmlspace_Setter";
 
-  SVGAnimatedBoolean get externalResourcesRequired native "SVGPathElement_externalResourcesRequired_Getter";
-
-  SVGAnimatedString get $dom_svgClassName native "SVGPathElement_className_Getter";
-
-  CSSStyleDeclaration get style native "SVGPathElement_style_Getter";
-
-  CSSValue getPresentationAttribute(String name) native "SVGPathElement_getPresentationAttribute_Callback";
-
-  SVGAnimatedTransformList get transform native "SVGPathElement_transform_Getter";
-
   SVGElement get farthestViewportElement native "SVGPathElement_farthestViewportElement_Getter";
 
   SVGElement get nearestViewportElement native "SVGPathElement_nearestViewportElement_Getter";
@@ -31599,6 +31500,22 @@
 
   SVGMatrix getTransformToElement(SVGElement element) native "SVGPathElement_getTransformToElement_Callback";
 
+  SVGAnimatedString get $dom_svgClassName native "SVGPathElement_className_Getter";
+
+  CSSStyleDeclaration get style native "SVGPathElement_style_Getter";
+
+  CSSValue getPresentationAttribute(String name) native "SVGPathElement_getPresentationAttribute_Callback";
+
+  SVGStringList get requiredExtensions native "SVGPathElement_requiredExtensions_Getter";
+
+  SVGStringList get requiredFeatures native "SVGPathElement_requiredFeatures_Getter";
+
+  SVGStringList get systemLanguage native "SVGPathElement_systemLanguage_Getter";
+
+  bool hasExtension(String extension) native "SVGPathElement_hasExtension_Callback";
+
+  SVGAnimatedTransformList get transform native "SVGPathElement_transform_Getter";
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -32609,15 +32526,11 @@
 
   SVGAnimatedLength get y native "SVGPatternElement_y_Getter";
 
-  SVGAnimatedString get href native "SVGPatternElement_href_Getter";
+  SVGAnimatedBoolean get externalResourcesRequired native "SVGPatternElement_externalResourcesRequired_Getter";
 
-  SVGStringList get requiredExtensions native "SVGPatternElement_requiredExtensions_Getter";
+  SVGAnimatedPreserveAspectRatio get preserveAspectRatio native "SVGPatternElement_preserveAspectRatio_Getter";
 
-  SVGStringList get requiredFeatures native "SVGPatternElement_requiredFeatures_Getter";
-
-  SVGStringList get systemLanguage native "SVGPatternElement_systemLanguage_Getter";
-
-  bool hasExtension(String extension) native "SVGPatternElement_hasExtension_Callback";
+  SVGAnimatedRect get viewBox native "SVGPatternElement_viewBox_Getter";
 
   String get xmllang native "SVGPatternElement_xmllang_Getter";
 
@@ -32627,17 +32540,21 @@
 
   void set xmlspace(String value) native "SVGPatternElement_xmlspace_Setter";
 
-  SVGAnimatedBoolean get externalResourcesRequired native "SVGPatternElement_externalResourcesRequired_Getter";
-
   SVGAnimatedString get $dom_svgClassName native "SVGPatternElement_className_Getter";
 
   CSSStyleDeclaration get style native "SVGPatternElement_style_Getter";
 
   CSSValue getPresentationAttribute(String name) native "SVGPatternElement_getPresentationAttribute_Callback";
 
-  SVGAnimatedPreserveAspectRatio get preserveAspectRatio native "SVGPatternElement_preserveAspectRatio_Getter";
+  SVGStringList get requiredExtensions native "SVGPatternElement_requiredExtensions_Getter";
 
-  SVGAnimatedRect get viewBox native "SVGPatternElement_viewBox_Getter";
+  SVGStringList get requiredFeatures native "SVGPatternElement_requiredFeatures_Getter";
+
+  SVGStringList get systemLanguage native "SVGPatternElement_systemLanguage_Getter";
+
+  bool hasExtension(String extension) native "SVGPatternElement_hasExtension_Callback";
+
+  SVGAnimatedString get href native "SVGPatternElement_href_Getter";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -32762,13 +32679,7 @@
 
   SVGPointList get points native "SVGPolygonElement_points_Getter";
 
-  SVGStringList get requiredExtensions native "SVGPolygonElement_requiredExtensions_Getter";
-
-  SVGStringList get requiredFeatures native "SVGPolygonElement_requiredFeatures_Getter";
-
-  SVGStringList get systemLanguage native "SVGPolygonElement_systemLanguage_Getter";
-
-  bool hasExtension(String extension) native "SVGPolygonElement_hasExtension_Callback";
+  SVGAnimatedBoolean get externalResourcesRequired native "SVGPolygonElement_externalResourcesRequired_Getter";
 
   String get xmllang native "SVGPolygonElement_xmllang_Getter";
 
@@ -32778,16 +32689,6 @@
 
   void set xmlspace(String value) native "SVGPolygonElement_xmlspace_Setter";
 
-  SVGAnimatedBoolean get externalResourcesRequired native "SVGPolygonElement_externalResourcesRequired_Getter";
-
-  SVGAnimatedString get $dom_svgClassName native "SVGPolygonElement_className_Getter";
-
-  CSSStyleDeclaration get style native "SVGPolygonElement_style_Getter";
-
-  CSSValue getPresentationAttribute(String name) native "SVGPolygonElement_getPresentationAttribute_Callback";
-
-  SVGAnimatedTransformList get transform native "SVGPolygonElement_transform_Getter";
-
   SVGElement get farthestViewportElement native "SVGPolygonElement_farthestViewportElement_Getter";
 
   SVGElement get nearestViewportElement native "SVGPolygonElement_nearestViewportElement_Getter";
@@ -32800,6 +32701,22 @@
 
   SVGMatrix getTransformToElement(SVGElement element) native "SVGPolygonElement_getTransformToElement_Callback";
 
+  SVGAnimatedString get $dom_svgClassName native "SVGPolygonElement_className_Getter";
+
+  CSSStyleDeclaration get style native "SVGPolygonElement_style_Getter";
+
+  CSSValue getPresentationAttribute(String name) native "SVGPolygonElement_getPresentationAttribute_Callback";
+
+  SVGStringList get requiredExtensions native "SVGPolygonElement_requiredExtensions_Getter";
+
+  SVGStringList get requiredFeatures native "SVGPolygonElement_requiredFeatures_Getter";
+
+  SVGStringList get systemLanguage native "SVGPolygonElement_systemLanguage_Getter";
+
+  bool hasExtension(String extension) native "SVGPolygonElement_hasExtension_Callback";
+
+  SVGAnimatedTransformList get transform native "SVGPolygonElement_transform_Getter";
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -32828,13 +32745,7 @@
 
   SVGPointList get points native "SVGPolylineElement_points_Getter";
 
-  SVGStringList get requiredExtensions native "SVGPolylineElement_requiredExtensions_Getter";
-
-  SVGStringList get requiredFeatures native "SVGPolylineElement_requiredFeatures_Getter";
-
-  SVGStringList get systemLanguage native "SVGPolylineElement_systemLanguage_Getter";
-
-  bool hasExtension(String extension) native "SVGPolylineElement_hasExtension_Callback";
+  SVGAnimatedBoolean get externalResourcesRequired native "SVGPolylineElement_externalResourcesRequired_Getter";
 
   String get xmllang native "SVGPolylineElement_xmllang_Getter";
 
@@ -32844,16 +32755,6 @@
 
   void set xmlspace(String value) native "SVGPolylineElement_xmlspace_Setter";
 
-  SVGAnimatedBoolean get externalResourcesRequired native "SVGPolylineElement_externalResourcesRequired_Getter";
-
-  SVGAnimatedString get $dom_svgClassName native "SVGPolylineElement_className_Getter";
-
-  CSSStyleDeclaration get style native "SVGPolylineElement_style_Getter";
-
-  CSSValue getPresentationAttribute(String name) native "SVGPolylineElement_getPresentationAttribute_Callback";
-
-  SVGAnimatedTransformList get transform native "SVGPolylineElement_transform_Getter";
-
   SVGElement get farthestViewportElement native "SVGPolylineElement_farthestViewportElement_Getter";
 
   SVGElement get nearestViewportElement native "SVGPolylineElement_nearestViewportElement_Getter";
@@ -32866,6 +32767,22 @@
 
   SVGMatrix getTransformToElement(SVGElement element) native "SVGPolylineElement_getTransformToElement_Callback";
 
+  SVGAnimatedString get $dom_svgClassName native "SVGPolylineElement_className_Getter";
+
+  CSSStyleDeclaration get style native "SVGPolylineElement_style_Getter";
+
+  CSSValue getPresentationAttribute(String name) native "SVGPolylineElement_getPresentationAttribute_Callback";
+
+  SVGStringList get requiredExtensions native "SVGPolylineElement_requiredExtensions_Getter";
+
+  SVGStringList get requiredFeatures native "SVGPolylineElement_requiredFeatures_Getter";
+
+  SVGStringList get systemLanguage native "SVGPolylineElement_systemLanguage_Getter";
+
+  bool hasExtension(String extension) native "SVGPolylineElement_hasExtension_Callback";
+
+  SVGAnimatedTransformList get transform native "SVGPolylineElement_transform_Getter";
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -33043,13 +32960,7 @@
 
   SVGAnimatedLength get y native "SVGRectElement_y_Getter";
 
-  SVGStringList get requiredExtensions native "SVGRectElement_requiredExtensions_Getter";
-
-  SVGStringList get requiredFeatures native "SVGRectElement_requiredFeatures_Getter";
-
-  SVGStringList get systemLanguage native "SVGRectElement_systemLanguage_Getter";
-
-  bool hasExtension(String extension) native "SVGRectElement_hasExtension_Callback";
+  SVGAnimatedBoolean get externalResourcesRequired native "SVGRectElement_externalResourcesRequired_Getter";
 
   String get xmllang native "SVGRectElement_xmllang_Getter";
 
@@ -33059,16 +32970,6 @@
 
   void set xmlspace(String value) native "SVGRectElement_xmlspace_Setter";
 
-  SVGAnimatedBoolean get externalResourcesRequired native "SVGRectElement_externalResourcesRequired_Getter";
-
-  SVGAnimatedString get $dom_svgClassName native "SVGRectElement_className_Getter";
-
-  CSSStyleDeclaration get style native "SVGRectElement_style_Getter";
-
-  CSSValue getPresentationAttribute(String name) native "SVGRectElement_getPresentationAttribute_Callback";
-
-  SVGAnimatedTransformList get transform native "SVGRectElement_transform_Getter";
-
   SVGElement get farthestViewportElement native "SVGRectElement_farthestViewportElement_Getter";
 
   SVGElement get nearestViewportElement native "SVGRectElement_nearestViewportElement_Getter";
@@ -33081,6 +32982,22 @@
 
   SVGMatrix getTransformToElement(SVGElement element) native "SVGRectElement_getTransformToElement_Callback";
 
+  SVGAnimatedString get $dom_svgClassName native "SVGRectElement_className_Getter";
+
+  CSSStyleDeclaration get style native "SVGRectElement_style_Getter";
+
+  CSSValue getPresentationAttribute(String name) native "SVGRectElement_getPresentationAttribute_Callback";
+
+  SVGStringList get requiredExtensions native "SVGRectElement_requiredExtensions_Getter";
+
+  SVGStringList get requiredFeatures native "SVGRectElement_requiredFeatures_Getter";
+
+  SVGStringList get systemLanguage native "SVGRectElement_systemLanguage_Getter";
+
+  bool hasExtension(String extension) native "SVGRectElement_hasExtension_Callback";
+
+  SVGAnimatedTransformList get transform native "SVGRectElement_transform_Getter";
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -33352,13 +33269,11 @@
 
   void unsuspendRedrawAll() native "SVGSVGElement_unsuspendRedrawAll_Callback";
 
-  SVGStringList get requiredExtensions native "SVGSVGElement_requiredExtensions_Getter";
+  SVGAnimatedBoolean get externalResourcesRequired native "SVGSVGElement_externalResourcesRequired_Getter";
 
-  SVGStringList get requiredFeatures native "SVGSVGElement_requiredFeatures_Getter";
+  SVGAnimatedPreserveAspectRatio get preserveAspectRatio native "SVGSVGElement_preserveAspectRatio_Getter";
 
-  SVGStringList get systemLanguage native "SVGSVGElement_systemLanguage_Getter";
-
-  bool hasExtension(String extension) native "SVGSVGElement_hasExtension_Callback";
+  SVGAnimatedRect get viewBox native "SVGSVGElement_viewBox_Getter";
 
   String get xmllang native "SVGSVGElement_xmllang_Getter";
 
@@ -33368,14 +33283,6 @@
 
   void set xmlspace(String value) native "SVGSVGElement_xmlspace_Setter";
 
-  SVGAnimatedBoolean get externalResourcesRequired native "SVGSVGElement_externalResourcesRequired_Getter";
-
-  SVGAnimatedString get $dom_svgClassName native "SVGSVGElement_className_Getter";
-
-  CSSStyleDeclaration get style native "SVGSVGElement_style_Getter";
-
-  CSSValue getPresentationAttribute(String name) native "SVGSVGElement_getPresentationAttribute_Callback";
-
   SVGElement get farthestViewportElement native "SVGSVGElement_farthestViewportElement_Getter";
 
   SVGElement get nearestViewportElement native "SVGSVGElement_nearestViewportElement_Getter";
@@ -33388,9 +33295,19 @@
 
   SVGMatrix getTransformToElement(SVGElement element) native "SVGSVGElement_getTransformToElement_Callback";
 
-  SVGAnimatedPreserveAspectRatio get preserveAspectRatio native "SVGSVGElement_preserveAspectRatio_Getter";
+  SVGAnimatedString get $dom_svgClassName native "SVGSVGElement_className_Getter";
 
-  SVGAnimatedRect get viewBox native "SVGSVGElement_viewBox_Getter";
+  CSSStyleDeclaration get style native "SVGSVGElement_style_Getter";
+
+  CSSValue getPresentationAttribute(String name) native "SVGSVGElement_getPresentationAttribute_Callback";
+
+  SVGStringList get requiredExtensions native "SVGSVGElement_requiredExtensions_Getter";
+
+  SVGStringList get requiredFeatures native "SVGSVGElement_requiredFeatures_Getter";
+
+  SVGStringList get systemLanguage native "SVGSVGElement_systemLanguage_Getter";
+
+  bool hasExtension(String extension) native "SVGSVGElement_hasExtension_Callback";
 
   int get zoomAndPan native "SVGSVGElement_zoomAndPan_Getter";
 
@@ -33421,10 +33338,10 @@
 
   void set type(String value) native "SVGScriptElement_type_Setter";
 
-  SVGAnimatedString get href native "SVGScriptElement_href_Getter";
-
   SVGAnimatedBoolean get externalResourcesRequired native "SVGScriptElement_externalResourcesRequired_Getter";
 
+  SVGAnimatedString get href native "SVGScriptElement_href_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
@@ -33703,13 +33620,7 @@
 
 class _SVGSwitchElementImpl extends _SVGElementImpl implements SVGSwitchElement {
 
-  SVGStringList get requiredExtensions native "SVGSwitchElement_requiredExtensions_Getter";
-
-  SVGStringList get requiredFeatures native "SVGSwitchElement_requiredFeatures_Getter";
-
-  SVGStringList get systemLanguage native "SVGSwitchElement_systemLanguage_Getter";
-
-  bool hasExtension(String extension) native "SVGSwitchElement_hasExtension_Callback";
+  SVGAnimatedBoolean get externalResourcesRequired native "SVGSwitchElement_externalResourcesRequired_Getter";
 
   String get xmllang native "SVGSwitchElement_xmllang_Getter";
 
@@ -33719,16 +33630,6 @@
 
   void set xmlspace(String value) native "SVGSwitchElement_xmlspace_Setter";
 
-  SVGAnimatedBoolean get externalResourcesRequired native "SVGSwitchElement_externalResourcesRequired_Getter";
-
-  SVGAnimatedString get $dom_svgClassName native "SVGSwitchElement_className_Getter";
-
-  CSSStyleDeclaration get style native "SVGSwitchElement_style_Getter";
-
-  CSSValue getPresentationAttribute(String name) native "SVGSwitchElement_getPresentationAttribute_Callback";
-
-  SVGAnimatedTransformList get transform native "SVGSwitchElement_transform_Getter";
-
   SVGElement get farthestViewportElement native "SVGSwitchElement_farthestViewportElement_Getter";
 
   SVGElement get nearestViewportElement native "SVGSwitchElement_nearestViewportElement_Getter";
@@ -33741,6 +33642,22 @@
 
   SVGMatrix getTransformToElement(SVGElement element) native "SVGSwitchElement_getTransformToElement_Callback";
 
+  SVGAnimatedString get $dom_svgClassName native "SVGSwitchElement_className_Getter";
+
+  CSSStyleDeclaration get style native "SVGSwitchElement_style_Getter";
+
+  CSSValue getPresentationAttribute(String name) native "SVGSwitchElement_getPresentationAttribute_Callback";
+
+  SVGStringList get requiredExtensions native "SVGSwitchElement_requiredExtensions_Getter";
+
+  SVGStringList get requiredFeatures native "SVGSwitchElement_requiredFeatures_Getter";
+
+  SVGStringList get systemLanguage native "SVGSwitchElement_systemLanguage_Getter";
+
+  bool hasExtension(String extension) native "SVGSwitchElement_hasExtension_Callback";
+
+  SVGAnimatedTransformList get transform native "SVGSwitchElement_transform_Getter";
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -33759,6 +33676,12 @@
 
 class _SVGSymbolElementImpl extends _SVGElementImpl implements SVGSymbolElement {
 
+  SVGAnimatedBoolean get externalResourcesRequired native "SVGSymbolElement_externalResourcesRequired_Getter";
+
+  SVGAnimatedPreserveAspectRatio get preserveAspectRatio native "SVGSymbolElement_preserveAspectRatio_Getter";
+
+  SVGAnimatedRect get viewBox native "SVGSymbolElement_viewBox_Getter";
+
   String get xmllang native "SVGSymbolElement_xmllang_Getter";
 
   void set xmllang(String value) native "SVGSymbolElement_xmllang_Setter";
@@ -33767,18 +33690,12 @@
 
   void set xmlspace(String value) native "SVGSymbolElement_xmlspace_Setter";
 
-  SVGAnimatedBoolean get externalResourcesRequired native "SVGSymbolElement_externalResourcesRequired_Getter";
-
   SVGAnimatedString get $dom_svgClassName native "SVGSymbolElement_className_Getter";
 
   CSSStyleDeclaration get style native "SVGSymbolElement_style_Getter";
 
   CSSValue getPresentationAttribute(String name) native "SVGSymbolElement_getPresentationAttribute_Callback";
 
-  SVGAnimatedPreserveAspectRatio get preserveAspectRatio native "SVGSymbolElement_preserveAspectRatio_Getter";
-
-  SVGAnimatedRect get viewBox native "SVGSymbolElement_viewBox_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
@@ -33917,13 +33834,7 @@
 
   void selectSubString(int offset, int length) native "SVGTextContentElement_selectSubString_Callback";
 
-  SVGStringList get requiredExtensions native "SVGTextContentElement_requiredExtensions_Getter";
-
-  SVGStringList get requiredFeatures native "SVGTextContentElement_requiredFeatures_Getter";
-
-  SVGStringList get systemLanguage native "SVGTextContentElement_systemLanguage_Getter";
-
-  bool hasExtension(String extension) native "SVGTextContentElement_hasExtension_Callback";
+  SVGAnimatedBoolean get externalResourcesRequired native "SVGTextContentElement_externalResourcesRequired_Getter";
 
   String get xmllang native "SVGTextContentElement_xmllang_Getter";
 
@@ -33933,14 +33844,20 @@
 
   void set xmlspace(String value) native "SVGTextContentElement_xmlspace_Setter";
 
-  SVGAnimatedBoolean get externalResourcesRequired native "SVGTextContentElement_externalResourcesRequired_Getter";
-
   SVGAnimatedString get $dom_svgClassName native "SVGTextContentElement_className_Getter";
 
   CSSStyleDeclaration get style native "SVGTextContentElement_style_Getter";
 
   CSSValue getPresentationAttribute(String name) native "SVGTextContentElement_getPresentationAttribute_Callback";
 
+  SVGStringList get requiredExtensions native "SVGTextContentElement_requiredExtensions_Getter";
+
+  SVGStringList get requiredFeatures native "SVGTextContentElement_requiredFeatures_Getter";
+
+  SVGStringList get systemLanguage native "SVGTextContentElement_systemLanguage_Getter";
+
+  bool hasExtension(String extension) native "SVGTextContentElement_hasExtension_Callback";
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -33959,8 +33876,6 @@
 
 class _SVGTextElementImpl extends _SVGTextPositioningElementImpl implements SVGTextElement {
 
-  SVGAnimatedTransformList get transform native "SVGTextElement_transform_Getter";
-
   SVGElement get farthestViewportElement native "SVGTextElement_farthestViewportElement_Getter";
 
   SVGElement get nearestViewportElement native "SVGTextElement_nearestViewportElement_Getter";
@@ -33973,6 +33888,8 @@
 
   SVGMatrix getTransformToElement(SVGElement element) native "SVGTextElement_getTransformToElement_Callback";
 
+  SVGAnimatedTransformList get transform native "SVGTextElement_transform_Getter";
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -34419,15 +34336,7 @@
 
   SVGAnimatedLength get y native "SVGUseElement_y_Getter";
 
-  SVGAnimatedString get href native "SVGUseElement_href_Getter";
-
-  SVGStringList get requiredExtensions native "SVGUseElement_requiredExtensions_Getter";
-
-  SVGStringList get requiredFeatures native "SVGUseElement_requiredFeatures_Getter";
-
-  SVGStringList get systemLanguage native "SVGUseElement_systemLanguage_Getter";
-
-  bool hasExtension(String extension) native "SVGUseElement_hasExtension_Callback";
+  SVGAnimatedBoolean get externalResourcesRequired native "SVGUseElement_externalResourcesRequired_Getter";
 
   String get xmllang native "SVGUseElement_xmllang_Getter";
 
@@ -34437,16 +34346,6 @@
 
   void set xmlspace(String value) native "SVGUseElement_xmlspace_Setter";
 
-  SVGAnimatedBoolean get externalResourcesRequired native "SVGUseElement_externalResourcesRequired_Getter";
-
-  SVGAnimatedString get $dom_svgClassName native "SVGUseElement_className_Getter";
-
-  CSSStyleDeclaration get style native "SVGUseElement_style_Getter";
-
-  CSSValue getPresentationAttribute(String name) native "SVGUseElement_getPresentationAttribute_Callback";
-
-  SVGAnimatedTransformList get transform native "SVGUseElement_transform_Getter";
-
   SVGElement get farthestViewportElement native "SVGUseElement_farthestViewportElement_Getter";
 
   SVGElement get nearestViewportElement native "SVGUseElement_nearestViewportElement_Getter";
@@ -34459,6 +34358,24 @@
 
   SVGMatrix getTransformToElement(SVGElement element) native "SVGUseElement_getTransformToElement_Callback";
 
+  SVGAnimatedString get $dom_svgClassName native "SVGUseElement_className_Getter";
+
+  CSSStyleDeclaration get style native "SVGUseElement_style_Getter";
+
+  CSSValue getPresentationAttribute(String name) native "SVGUseElement_getPresentationAttribute_Callback";
+
+  SVGStringList get requiredExtensions native "SVGUseElement_requiredExtensions_Getter";
+
+  SVGStringList get requiredFeatures native "SVGUseElement_requiredFeatures_Getter";
+
+  SVGStringList get systemLanguage native "SVGUseElement_systemLanguage_Getter";
+
+  bool hasExtension(String extension) native "SVGUseElement_hasExtension_Callback";
+
+  SVGAnimatedTransformList get transform native "SVGUseElement_transform_Getter";
+
+  SVGAnimatedString get href native "SVGUseElement_href_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
@@ -34777,6 +34694,48 @@
 
 // WARNING: Do not edit - generated code.
 
+/// @domName ScriptProcessorNode
+abstract class ScriptProcessorNode implements AudioNode, EventTarget {
+
+  /**
+   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
+   */
+  ScriptProcessorNodeEvents get on;
+
+  /** @domName ScriptProcessorNode.bufferSize */
+  int get bufferSize;
+}
+
+abstract class ScriptProcessorNodeEvents implements Events {
+
+  EventListenerList get audioProcess;
+}
+// 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.
+
+class _ScriptProcessorNodeImpl extends _AudioNodeImpl implements ScriptProcessorNode {
+
+  _ScriptProcessorNodeEventsImpl get on =>
+    new _ScriptProcessorNodeEventsImpl(this);
+
+  int get bufferSize native "ScriptProcessorNode_bufferSize_Getter";
+
+}
+
+class _ScriptProcessorNodeEventsImpl extends _EventsImpl implements ScriptProcessorNodeEvents {
+  _ScriptProcessorNodeEventsImpl(_ptr) : super(_ptr);
+
+  EventListenerList get audioProcess => this['audioprocess'];
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
 /// @domName ScriptProfile
 abstract class ScriptProfile {
 
@@ -37138,6 +37097,9 @@
   /** @domName HTMLTextAreaElement.defaultValue */
   String defaultValue;
 
+  /** @domName HTMLTextAreaElement.dirName */
+  String dirName;
+
   /** @domName HTMLTextAreaElement.disabled */
   bool disabled;
 
@@ -37204,6 +37166,9 @@
   /** @domName HTMLTextAreaElement.setCustomValidity */
   void setCustomValidity(String error);
 
+  /** @domName HTMLTextAreaElement.setRangeText */
+  void setRangeText(String replacement, [int start, int end, String selectionMode]);
+
   /** @domName HTMLTextAreaElement.setSelectionRange */
   void setSelectionRange(int start, int end, [String direction]);
 }
@@ -37227,6 +37192,10 @@
 
   void set defaultValue(String value) native "HTMLTextAreaElement_defaultValue_Setter";
 
+  String get dirName native "HTMLTextAreaElement_dirName_Getter";
+
+  void set dirName(String value) native "HTMLTextAreaElement_dirName_Setter";
+
   bool get disabled native "HTMLTextAreaElement_disabled_Getter";
 
   void set disabled(bool value) native "HTMLTextAreaElement_disabled_Setter";
@@ -37295,6 +37264,22 @@
 
   void setCustomValidity(String error) native "HTMLTextAreaElement_setCustomValidity_Callback";
 
+  void setRangeText(/*DOMString*/ replacement, [/*unsigned long*/ start, /*unsigned long*/ end, /*DOMString*/ selectionMode]) {
+    if ((replacement is String || replacement == null) && !?start && !?end && !?selectionMode) {
+      _setRangeText_1(replacement);
+      return;
+    }
+    if ((replacement is String || replacement == null) && (start is int || start == null) && (end is int || end == null) && (selectionMode is String || selectionMode == null)) {
+      _setRangeText_2(replacement, start, end, selectionMode);
+      return;
+    }
+    throw "Incorrect number or type of arguments";
+  }
+
+  void _setRangeText_1(replacement) native "HTMLTextAreaElement_setRangeText_1_Callback";
+
+  void _setRangeText_2(replacement, start, end, selectionMode) native "HTMLTextAreaElement_setRangeText_2_Callback";
+
   void setSelectionRange(/*long*/ start, /*long*/ end, [/*DOMString*/ direction]) {
     if (?direction) {
       _setSelectionRange_1(start, end, direction);
@@ -40264,7 +40249,7 @@
   int getError();
 
   /** @domName WebGLRenderingContext.getExtension */
-  void getExtension(String name);
+  Object getExtension(String name);
 
   /** @domName WebGLRenderingContext.getFramebufferAttachmentParameter */
   Object getFramebufferAttachmentParameter(int target, int attachment, int pname);
@@ -40659,7 +40644,7 @@
 
   int getError() native "WebGLRenderingContext_getError_Callback";
 
-  void getExtension(String name) native "WebGLRenderingContext_getExtension_Callback";
+  Object getExtension(String name) native "WebGLRenderingContext_getExtension_Callback";
 
   Object getFramebufferAttachmentParameter(int target, int attachment, int pname) native "WebGLRenderingContext_getFramebufferAttachmentParameter_Callback";
 
@@ -41972,56 +41957,49 @@
 // BSD-style license that can be found in the LICENSE file.
 
 class _ArrayBufferFactoryProvider {
-  static ArrayBuffer createArrayBuffer(int length) => _createArrayBuffer(length);
-  static ArrayBuffer _createArrayBuffer(int length) native "ArrayBuffer_constructor_Callback";
+  static ArrayBuffer createArrayBuffer(int length) native "ArrayBuffer_constructor_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.
 
 class _AudioElementFactoryProvider {
-  static AudioElement createAudioElement([String src]) => _createAudioElement(src);
-  static AudioElement _createAudioElement([String src]) native "HTMLAudioElement_constructor_Callback";
+  static AudioElement createAudioElement([String src]) native "HTMLAudioElement_constructor_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.
 
 class _BlobFactoryProvider {
-  static Blob createBlob(List blobParts, [String type, String endings]) => _createBlob(blobParts, type, endings);
-  static Blob _createBlob(List blobParts, [String type, String endings]) native "Blob_constructor_Callback";
+  static Blob createBlob(List blobParts, [String type, String endings]) native "Blob_constructor_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.
 
 class _CSSMatrixFactoryProvider {
-  static CSSMatrix createCSSMatrix([String cssValue]) => _createCSSMatrix(cssValue);
-  static CSSMatrix _createCSSMatrix([String cssValue]) native "WebKitCSSMatrix_constructor_Callback";
+  static CSSMatrix createCSSMatrix([String cssValue]) native "WebKitCSSMatrix_constructor_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.
 
 class _DOMParserFactoryProvider {
-  static DOMParser createDOMParser() => _createDOMParser();
-  static DOMParser _createDOMParser() native "DOMParser_constructor_Callback";
+  static DOMParser createDOMParser() native "DOMParser_constructor_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.
 
 class _DOMURLFactoryProvider {
-  static DOMURL createDOMURL() => _createDOMURL();
-  static DOMURL _createDOMURL() native "DOMURL_constructor_Callback";
+  static DOMURL createDOMURL() native "DOMURL_constructor_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.
 
 class _DataViewFactoryProvider {
-  static DataView createDataView(ArrayBuffer buffer, [int byteOffset, int byteLength]) => _createDataView(buffer, byteOffset, byteLength);
-  static DataView _createDataView(ArrayBuffer buffer, [int byteOffset, int byteLength]) native "DataView_constructor_Callback";
+  static DataView createDataView(ArrayBuffer buffer, [int byteOffset, int byteLength]) native "DataView_constructor_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
@@ -42333,32 +42311,28 @@
 // BSD-style license that can be found in the LICENSE file.
 
 class _EventSourceFactoryProvider {
-  static EventSource createEventSource(String scriptUrl) => _createEventSource(scriptUrl);
-  static EventSource _createEventSource(String scriptUrl) native "EventSource_constructor_Callback";
+  static EventSource createEventSource(String scriptUrl) native "EventSource_constructor_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.
 
 class _FileReaderFactoryProvider {
-  static FileReader createFileReader() => _createFileReader();
-  static FileReader _createFileReader() native "FileReader_constructor_Callback";
+  static FileReader createFileReader() native "FileReader_constructor_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.
 
 class _FileReaderSyncFactoryProvider {
-  static FileReaderSync createFileReaderSync() => _createFileReaderSync();
-  static FileReaderSync _createFileReaderSync() native "FileReaderSync_constructor_Callback";
+  static FileReaderSync createFileReaderSync() native "FileReaderSync_constructor_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.
 
 class _FormDataFactoryProvider {
-  static FormData createFormData([FormElement form]) => _createFormData(form);
-  static FormData _createFormData([FormElement form]) native "DOMFormData_constructor_Callback";
+  static FormData createFormData([FormElement form]) native "DOMFormData_constructor_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
@@ -42381,184 +42355,161 @@
 // BSD-style license that can be found in the LICENSE file.
 
 class _IceCandidateFactoryProvider {
-  static IceCandidate createIceCandidate(String label, String candidateLine) => _createIceCandidate(label, candidateLine);
-  static IceCandidate _createIceCandidate(String label, String candidateLine) native "IceCandidate_constructor_Callback";
+  static IceCandidate createIceCandidate(String label, String candidateLine) native "IceCandidate_constructor_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.
 
 class _MediaControllerFactoryProvider {
-  static MediaController createMediaController() => _createMediaController();
-  static MediaController _createMediaController() native "MediaController_constructor_Callback";
+  static MediaController createMediaController() native "MediaController_constructor_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.
 
 class _MediaSourceFactoryProvider {
-  static MediaSource createMediaSource() => _createMediaSource();
-  static MediaSource _createMediaSource() native "MediaSource_constructor_Callback";
+  static MediaSource createMediaSource() native "MediaSource_constructor_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.
 
 class _MediaStreamFactoryProvider {
-  static MediaStream createMediaStream(MediaStreamTrackList audioTracks, MediaStreamTrackList videoTracks) => _createMediaStream(audioTracks, videoTracks);
-  static MediaStream _createMediaStream(MediaStreamTrackList audioTracks, MediaStreamTrackList videoTracks) native "MediaStream_constructor_Callback";
+  static MediaStream createMediaStream(MediaStreamTrackList audioTracks, MediaStreamTrackList videoTracks) native "MediaStream_constructor_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.
 
 class _MessageChannelFactoryProvider {
-  static MessageChannel createMessageChannel() => _createMessageChannel();
-  static MessageChannel _createMessageChannel() native "MessageChannel_constructor_Callback";
+  static MessageChannel createMessageChannel() native "MessageChannel_constructor_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.
 
 class _MutationObserverFactoryProvider {
-  static MutationObserver createMutationObserver(MutationCallback callback) => _createMutationObserver(callback);
-  static MutationObserver _createMutationObserver(MutationCallback callback) native "MutationObserver_constructor_Callback";
+  static MutationObserver createMutationObserver(MutationCallback callback) native "MutationObserver_constructor_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.
 
 class _NotificationFactoryProvider {
-  static Notification createNotification(String title, [Map options]) => _createNotification(title, options);
-  static Notification _createNotification(String title, [Map options]) native "Notification_constructor_Callback";
+  static Notification createNotification(String title, [Map options]) native "Notification_constructor_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.
 
 class _OptionElementFactoryProvider {
-  static OptionElement createOptionElement([String data, String value, bool defaultSelected, bool selected]) => _createOptionElement(data, value, defaultSelected, selected);
-  static OptionElement _createOptionElement([String data, String value, bool defaultSelected, bool selected]) native "HTMLOptionElement_constructor_Callback";
+  static OptionElement createOptionElement([String data, String value, bool defaultSelected, bool selected]) native "HTMLOptionElement_constructor_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.
 
 class _PeerConnection00FactoryProvider {
-  static PeerConnection00 createPeerConnection00(String serverConfiguration, IceCallback iceCallback) => _createPeerConnection00(serverConfiguration, iceCallback);
-  static PeerConnection00 _createPeerConnection00(String serverConfiguration, IceCallback iceCallback) native "PeerConnection00_constructor_Callback";
+  static PeerConnection00 createPeerConnection00(String serverConfiguration, IceCallback iceCallback) native "PeerConnection00_constructor_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.
 
 class _RTCIceCandidateFactoryProvider {
-  static RTCIceCandidate createRTCIceCandidate(Map dictionary) => _createRTCIceCandidate(dictionary);
-  static RTCIceCandidate _createRTCIceCandidate(Map dictionary) native "RTCIceCandidate_constructor_Callback";
+  static RTCIceCandidate createRTCIceCandidate(Map dictionary) native "RTCIceCandidate_constructor_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.
 
 class _RTCPeerConnectionFactoryProvider {
-  static RTCPeerConnection createRTCPeerConnection(Map rtcIceServers, [Map mediaConstraints]) => _createRTCPeerConnection(rtcIceServers, mediaConstraints);
-  static RTCPeerConnection _createRTCPeerConnection(Map rtcIceServers, [Map mediaConstraints]) native "RTCPeerConnection_constructor_Callback";
+  static RTCPeerConnection createRTCPeerConnection(Map rtcIceServers, [Map mediaConstraints]) native "RTCPeerConnection_constructor_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.
 
 class _RTCSessionDescriptionFactoryProvider {
-  static RTCSessionDescription createRTCSessionDescription(Map dictionary) => _createRTCSessionDescription(dictionary);
-  static RTCSessionDescription _createRTCSessionDescription(Map dictionary) native "RTCSessionDescription_constructor_Callback";
+  static RTCSessionDescription createRTCSessionDescription(Map dictionary) native "RTCSessionDescription_constructor_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.
 
 class _SessionDescriptionFactoryProvider {
-  static SessionDescription createSessionDescription(String sdp) => _createSessionDescription(sdp);
-  static SessionDescription _createSessionDescription(String sdp) native "SessionDescription_constructor_Callback";
+  static SessionDescription createSessionDescription(String sdp) native "SessionDescription_constructor_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.
 
 class _ShadowRootFactoryProvider {
-  static ShadowRoot createShadowRoot(Element host) => _createShadowRoot(host);
-  static ShadowRoot _createShadowRoot(Element host) native "ShadowRoot_constructor_Callback";
+  static ShadowRoot createShadowRoot(Element host) native "ShadowRoot_constructor_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.
 
 class _SharedWorkerFactoryProvider {
-  static SharedWorker createSharedWorker(String scriptURL, [String name]) => _createSharedWorker(scriptURL, name);
-  static SharedWorker _createSharedWorker(String scriptURL, [String name]) native "SharedWorker_constructor_Callback";
+  static SharedWorker createSharedWorker(String scriptURL, [String name]) native "SharedWorker_constructor_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.
 
 class _SpeechGrammarFactoryProvider {
-  static SpeechGrammar createSpeechGrammar() => _createSpeechGrammar();
-  static SpeechGrammar _createSpeechGrammar() native "SpeechGrammar_constructor_Callback";
+  static SpeechGrammar createSpeechGrammar() native "SpeechGrammar_constructor_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.
 
 class _SpeechGrammarListFactoryProvider {
-  static SpeechGrammarList createSpeechGrammarList() => _createSpeechGrammarList();
-  static SpeechGrammarList _createSpeechGrammarList() native "SpeechGrammarList_constructor_Callback";
+  static SpeechGrammarList createSpeechGrammarList() native "SpeechGrammarList_constructor_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.
 
 class _SpeechRecognitionFactoryProvider {
-  static SpeechRecognition createSpeechRecognition() => _createSpeechRecognition();
-  static SpeechRecognition _createSpeechRecognition() native "SpeechRecognition_constructor_Callback";
+  static SpeechRecognition createSpeechRecognition() native "SpeechRecognition_constructor_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.
 
 class _TextTrackCueFactoryProvider {
-  static TextTrackCue createTextTrackCue(num startTime, num endTime, String text) => _createTextTrackCue(startTime, endTime, text);
-  static TextTrackCue _createTextTrackCue(num startTime, num endTime, String text) native "TextTrackCue_constructor_Callback";
+  static TextTrackCue createTextTrackCue(num startTime, num endTime, String text) native "TextTrackCue_constructor_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.
 
 class _WorkerFactoryProvider {
-  static Worker createWorker(String scriptUrl) => _createWorker(scriptUrl);
-  static Worker _createWorker(String scriptUrl) native "Worker_constructor_Callback";
+  static Worker createWorker(String scriptUrl) native "Worker_constructor_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.
 
 class _XMLSerializerFactoryProvider {
-  static XMLSerializer createXMLSerializer() => _createXMLSerializer();
-  static XMLSerializer _createXMLSerializer() native "XMLSerializer_constructor_Callback";
+  static XMLSerializer createXMLSerializer() native "XMLSerializer_constructor_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.
 
 class _XPathEvaluatorFactoryProvider {
-  static XPathEvaluator createXPathEvaluator() => _createXPathEvaluator();
-  static XPathEvaluator _createXPathEvaluator() native "XPathEvaluator_constructor_Callback";
+  static XPathEvaluator createXPathEvaluator() native "XPathEvaluator_constructor_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.
 
 class _XSLTProcessorFactoryProvider {
-  static XSLTProcessor createXSLTProcessor() => _createXSLTProcessor();
-  static XSLTProcessor _createXSLTProcessor() native "XSLTProcessor_constructor_Callback";
+  static XSLTProcessor createXSLTProcessor() native "XSLTProcessor_constructor_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
@@ -44263,14 +44214,13 @@
    * [:start + length:].
    * Returns an empty list if [length] is 0.
    * Throws an [ArgumentError] if [length] is negative.
-   * Throws an [IndexOutOfRangeException] if [start] or
-   * [:start + length:] are out of range.
+   * Throws a [RangeError] if [start] or [:start + length:] are out of range.
    */
   static List getRange(List a, int start, int length, List accumulator) {
     if (length < 0) throw new ArgumentError('length');
-    if (start < 0) throw new IndexOutOfRangeException(start);
+    if (start < 0) throw new RangeError.value(start);
     int end = start + length;
-    if (end > a.length) throw new IndexOutOfRangeException(end);
+    if (end > a.length) throw new RangeError.value(end);
     for (int i = start; i < end; i++) {
       accumulator.add(a[i]);
     }
diff --git a/lib/html/idl/dart/dart.idl b/lib/html/idl/dart/dart.idl
index 0790ad1..9fa23a0 100644
--- a/lib/html/idl/dart/dart.idl
+++ b/lib/html/idl/dart/dart.idl
@@ -117,7 +117,9 @@
     // TBD
     // void glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision);
 
-    DOMString[] getSupportedExtensions();
+    [Custom] any getExtension(DOMString name);
+    [Suppressed, StrictTypeChecking, Custom] void getExtension(DOMString name);
+    [Custom] DOMString[] getSupportedExtensions();
     [Suppressed, StrictTypeChecking, Custom] void getSupportedExtensions();
 
     [Custom] any getTexParameter(in unsigned long target, in unsigned long pname) raises(DOMException);
diff --git a/lib/html/scripts/htmlrenamer.py b/lib/html/scripts/htmlrenamer.py
index 83057fe..79f187d 100644
--- a/lib/html/scripts/htmlrenamer.py
+++ b/lib/html/scripts/htmlrenamer.py
@@ -215,12 +215,10 @@
     "HtmlElement.manifest",
     "Document.version",
     "Document.manifest",
-    "InputElement.dirName",
     "HTMLIsIndexElement.*",
     "HTMLOptionsCollection.*",
     "HTMLPropertiesCollection.*",
     "SelectElement.remove",
-    "TextAreaElement.dirName",
     "NamedNodeMap.*",
     "Node.isEqualNode",
     "Node.get:TEXT_NODE",
diff --git a/lib/html/scripts/systemhtml.py b/lib/html/scripts/systemhtml.py
index 1528ccf..44553c4 100644
--- a/lib/html/scripts/systemhtml.py
+++ b/lib/html/scripts/systemhtml.py
@@ -410,7 +410,7 @@
     # defined in the current interface as well as a parent.  In that case we
     # avoid making a duplicate definition and pray that the signatures match.
     secondary_parents = self._TransitiveSecondaryParents(interface)
-    for parent_interface in secondary_parents:
+    for parent_interface in sorted(secondary_parents):
       if isinstance(parent_interface, str):  # IsDartCollectionType(parent_interface)
         continue
       for attr in sorted(parent_interface.attributes, ConstantOutputOrder):
@@ -554,11 +554,16 @@
     """
     def walk(parents):
       for parent in parents:
-        if IsDartCollectionType(parent.type.id):
-          result.append(parent.type.id)
+        parent_name = parent.type.id
+        if parent_name == 'EventTarget':
+          # Currently EventTarget is implemented as a mixin, not a proper
+          # super interface---ignore its members.
           continue
-        if self._database.HasInterface(parent.type.id):
-          parent_interface = self._database.GetInterface(parent.type.id)
+        if IsDartCollectionType(parent_name):
+          result.append(parent_name)
+          continue
+        if self._database.HasInterface(parent_name):
+          parent_interface = self._database.GetInterface(parent_name)
           result.append(parent_interface)
           walk(parent_interface.parents)
 
@@ -910,7 +915,6 @@
     temp_version = [0]
 
     def GenerateCall(operation, argument_count, checks):
-      checks = filter(lambda e: e != 'true', checks)
       if checks:
         (stmts_emitter, call_emitter) = body.Emit(
             '    if ($CHECKS) {\n$!STMTS$!CALL    }\n',
@@ -976,18 +980,17 @@
           NATIVE=info.declared_name)
 
     def GenerateChecksAndCall(operation, argument_count):
-      checks = ['!?%s' % name for name in parameter_names]
+      checks = []
       for i in range(0, argument_count):
         argument = operation.arguments[i]
         parameter_name = parameter_names[i]
         test_type = self._DartType(argument.type.id)
         if test_type in ['dynamic', 'Object']:
-          checks[i] = '?%s' % parameter_name
-        elif test_type == parameter_types[i]:
-          checks[i] = 'true'
-        else:
-          checks[i] = '(%s is %s || %s == null)' % (
-              parameter_name, test_type, parameter_name)
+          checks.append('?%s' % parameter_name)
+        elif test_type != parameter_types[i]:
+          checks.append('(%s is %s || %s == null)' % (
+              parameter_name, test_type, parameter_name))
+      checks.extend(['!?%s' % name for name in parameter_names[argument_count:]])
       # There can be multiple presence checks.  We need them all since a later
       # optional argument could have been passed by name, leaving 'holes'.
       GenerateCall(operation, argument_count, checks)
diff --git a/lib/html/scripts/systemnative.py b/lib/html/scripts/systemnative.py
index 5b8c5b6..55477de 100644
--- a/lib/html/scripts/systemnative.py
+++ b/lib/html/scripts/systemnative.py
@@ -68,7 +68,7 @@
           '{\n'
           '    if (!m_callback.isIsolateAlive())\n'
           '        return false;\n'
-          '    DartIsolate::Scope scope(m_callback.isolate());\n'
+          '    DartIsolateScope scope(m_callback.isolate());\n'
           '    DartApiScope apiScope;\n'
           '    $ARGUMENTS_DECLARATION;\n'
           '    return m_callback.handleEvent($ARGUMENT_COUNT, arguments);\n'
@@ -499,12 +499,14 @@
       self._GenerateOperationNativeCallback(operation, operation.arguments[:argument_count], cpp_callback_name)
 
     def GenerateChecksAndCall(operation, argument_count):
-      checks = ['!?%s' % name for name in argument_names]
+      checks = []
       for i in range(0, argument_count):
         argument = operation.arguments[i]
         argument_name = argument_names[i]
-        checks[i] = '(%s is %s || %s == null)' % (
-            argument_name, self._DartType(argument.type.id), argument_name)
+        type = self._DartType(argument.type.id)
+        if type not in ['dynamic', 'Object']:
+          checks.append('(%s is %s || %s == null)' % (argument_name, type, argument_name))
+      checks.extend(['!?%s' % name for name in argument_names[argument_count:]])
       GenerateCall(operation, argument_count, checks)
 
     # TODO: Optimize the dispatch to avoid repeated checks.
@@ -600,7 +602,7 @@
       self._cpp_impl_includes.add('"DOMWindow.h"')
       runtime_check = emitter.Format(
           '        if (!ContextFeatures::$(FEATURE)Enabled(DartUtilities::domWindowForCurrentIsolate()->document())) {\n'
-          '            exception = Dart_NewString("Feature $FEATURE is not enabled");\n'
+          '            exception = Dart_NewStringFromCString("Feature $FEATURE is not enabled");\n'
           '            goto fail;\n'
           '        }',
           FEATURE=v8EnabledPerContext)
@@ -610,7 +612,7 @@
       self._cpp_impl_includes.add('"RuntimeEnabledFeatures.h"')
       runtime_check = emitter.Format(
           '        if (!RuntimeEnabledFeatures::$(FEATURE)Enabled()) {\n'
-          '            exception = Dart_NewString("Feature $FEATURE is not enabled");\n'
+          '            exception = Dart_NewStringFromCString("Feature $FEATURE is not enabled");\n'
           '            goto fail;\n'
           '        }',
           FEATURE=self._ToWebKitName(v8EnabledAtRuntime))
@@ -652,7 +654,7 @@
       body_emitter.Emit(
           '        ScriptExecutionContext* context = DartUtilities::scriptExecutionContext();\n'
           '        if (!context) {\n'
-          '            exception = Dart_NewString("Failed to retrieve a context");\n'
+          '            exception = Dart_NewStringFromCString("Failed to retrieve a context");\n'
           '            goto fail;\n'
           '        }\n\n')
 
@@ -661,7 +663,7 @@
       body_emitter.Emit(
           '        DOMWindow* domWindow = DartUtilities::domWindowForCurrentIsolate();\n'
           '        if (!domWindow) {\n'
-          '            exception = Dart_NewString("Failed to fetch domWindow");\n'
+          '            exception = Dart_NewStringFromCString("Failed to fetch domWindow");\n'
           '            goto fail;\n'
           '        }\n'
           '        Document* document = domWindow->document();\n')
@@ -805,6 +807,8 @@
     # as it's a single instance.
     if self._interface.id == 'CSSStyleDeclaration' and operation.id == 'setProperty' and argument.id == 'priority':
       return False
+    if argument.type.id == 'Dictionary':
+      return False
     return True
 
   def _GenerateCPPIncludes(self, includes):
diff --git a/lib/html/src/_Lists.dart b/lib/html/src/_Lists.dart
index 712600c..75d7905 100644
--- a/lib/html/src/_Lists.dart
+++ b/lib/html/src/_Lists.dart
@@ -52,14 +52,13 @@
    * [:start + length:].
    * Returns an empty list if [length] is 0.
    * Throws an [ArgumentError] if [length] is negative.
-   * Throws an [IndexOutOfRangeException] if [start] or
-   * [:start + length:] are out of range.
+   * Throws a [RangeError] if [start] or [:start + length:] are out of range.
    */
   static List getRange(List a, int start, int length, List accumulator) {
     if (length < 0) throw new ArgumentError('length');
-    if (start < 0) throw new IndexOutOfRangeException(start);
+    if (start < 0) throw new RangeError.value(start);
     int end = start + length;
-    if (end > a.length) throw new IndexOutOfRangeException(end);
+    if (end > a.length) throw new RangeError.value(end);
     for (int i = start; i < end; i++) {
       accumulator.add(a[i]);
     }
diff --git a/lib/html/templates/html/dartium/factoryprovider.darttemplate b/lib/html/templates/html/dartium/factoryprovider.darttemplate
index 1b0b5d5..d36e7f4 100644
--- a/lib/html/templates/html/dartium/factoryprovider.darttemplate
+++ b/lib/html/templates/html/dartium/factoryprovider.darttemplate
@@ -3,6 +3,5 @@
 // BSD-style license that can be found in the LICENSE file.
 
 class $FACTORYPROVIDER {
-  static $INTERFACE create$INTERFACE($PARAMETERS) => _create$INTERFACE($ARGUMENTS);
-  static $INTERFACE _create$INTERFACE($PARAMETERS) native "$NATIVE_NAME";
+  static $INTERFACE create$INTERFACE($PARAMETERS) native "$NATIVE_NAME";
 }
diff --git a/lib/html/templates/html/impl/impl_Element.darttemplate b/lib/html/templates/html/impl/impl_Element.darttemplate
index 6be2882..e8b9ed5 100644
--- a/lib/html/templates/html/impl/impl_Element.darttemplate
+++ b/lib/html/templates/html/impl/impl_Element.darttemplate
@@ -738,11 +738,18 @@
   var xtag;
 
 $if DARTIUM
-  noSuchMethod(String name, List args) {
+  noSuchMethod(InvocationMirror invocation) {
     if (dynamicUnknownElementDispatcher == null) {
-      throw new NoSuchMethodError(this, name, args);
+      throw new NoSuchMethodError(this, invocation.memberName,
+                                        invocation.positionalArguments,
+                                        invocation.namedArguments);
     } else {
-      return dynamicUnknownElementDispatcher(this, name, args);
+      String hackedName = invocation.memberName;
+      if (invocation.isGetter) hackedName = "get:$hackedName";
+      if (invocation.isSetter) hackedName = "set:$hackedName";
+      return dynamicUnknownElementDispatcher(this,
+                                             hackedName,
+                                             invocation.positionalArguments);
     }
   }
 $else
diff --git a/lib/html/templates/html/interface/interface_HttpRequest.darttemplate b/lib/html/templates/html/interface/interface_HttpRequest.darttemplate
index faea09e..5faa590 100644
--- a/lib/html/templates/html/interface/interface_HttpRequest.darttemplate
+++ b/lib/html/templates/html/interface/interface_HttpRequest.darttemplate
@@ -12,5 +12,5 @@
       _$(ID)FactoryProvider.create$(ID)_get(url, onSuccess);
 
   factory $ID.getWithCredentials(String url, onSuccess($ID request)) =>
-      _$(ID)FactoryProvider.create$(ID)getWithCredentials(url, onSuccess);
+      _$(ID)FactoryProvider.create$(ID)_getWithCredentials(url, onSuccess);
 $!MEMBERS}
diff --git a/runtime/bin/base64.dart b/lib/io/base64.dart
similarity index 97%
rename from runtime/bin/base64.dart
rename to lib/io/base64.dart
index 14ef242..905d177 100644
--- a/runtime/bin/base64.dart
+++ b/lib/io/base64.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 class _Base64 {
-  static const List<int> _encodingTable = const [
+  static const List<String> _encodingTable = const [
       'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
       'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd',
       'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's',
diff --git a/runtime/bin/buffer_list.dart b/lib/io/buffer_list.dart
similarity index 100%
rename from runtime/bin/buffer_list.dart
rename to lib/io/buffer_list.dart
diff --git a/runtime/bin/chunked_stream.dart b/lib/io/chunked_stream.dart
similarity index 100%
rename from runtime/bin/chunked_stream.dart
rename to lib/io/chunked_stream.dart
diff --git a/runtime/bin/common.dart b/lib/io/common.dart
similarity index 83%
rename from runtime/bin/common.dart
rename to lib/io/common.dart
index 33ce2a5..687d2ed 100644
--- a/runtime/bin/common.dart
+++ b/lib/io/common.dart
@@ -55,12 +55,6 @@
 }
 
 
-// Check if a List is a builtin VM List type. Returns true
-// if the List is a builtin VM List type and false if it is
-// a user defined List type.
-bool _isBuiltinList(List buffer) native "Common_IsBuiltinList";
-
-
 // Object for holding a buffer and an offset.
 class _BufferAndOffset {
   _BufferAndOffset(List this.buffer, int this.offset);
@@ -68,14 +62,13 @@
   int offset;
 }
 
-
 // Ensure that the input List can be serialized through a native port.
 // Only builtin Lists can be serialized through. If user-defined Lists
 // get here, the contents is copied to a Uint8List. This has the added
 // benefit that it is faster to access from the C code as well.
 _BufferAndOffset _ensureFastAndSerializableBuffer(
     List buffer, int offset, int bytes) {
-  if (buffer is Uint8List || _isBuiltinList(buffer)) {
+  if (buffer is Uint8List || _BufferUtils._isBuiltinList(buffer)) {
     return new _BufferAndOffset(buffer, offset);
   }
   var newBuffer = new Uint8List(bytes);
@@ -83,10 +76,20 @@
   for (int i = 0; i < bytes; i++) {
     int value = buffer[j];
     if (value is! int) {
-      throw new FileIOException("List element is not an integer at index $j");
+      throw new ArgumentError("List element is not an integer at index $j");
     }
     newBuffer[i] = value;
     j++;
   }
   return new _BufferAndOffset(newBuffer, 0);
 }
+
+
+// TODO(ager): The only reason for the class here is that
+// we cannot patch a top-level function.
+class _BufferUtils {
+  // Check if a List is a builtin VM List type. Returns true
+  // if the List is a builtin VM List type and false if it is
+  // a user defined List type.
+  external static bool _isBuiltinList(List buffer);
+}
diff --git a/runtime/bin/directory.dart b/lib/io/directory.dart
similarity index 100%
rename from runtime/bin/directory.dart
rename to lib/io/directory.dart
diff --git a/runtime/bin/directory_impl.dart b/lib/io/directory_impl.dart
similarity index 89%
rename from runtime/bin/directory_impl.dart
rename to lib/io/directory_impl.dart
index f4b43f1..cbfa945 100644
--- a/runtime/bin/directory_impl.dart
+++ b/lib/io/directory_impl.dart
@@ -19,13 +19,13 @@
   _Directory.fromPath(Path path) : this(path.toNativePath());
   _Directory.current() : this(_current());
 
-  static String _current() native "Directory_Current";
-  static _createTemp(String template) native "Directory_CreateTemp";
-  static int _exists(String path) native "Directory_Exists";
-  static _create(String path) native "Directory_Create";
-  static _delete(String path, bool recursive) native "Directory_Delete";
-  static _rename(String path, String newPath) native "Directory_Rename";
-  static SendPort _newServicePort() native "Directory_NewServicePort";
+  external static String _current();
+  external static _createTemp(String template);
+  external static int _exists(String path);
+  external static _create(String path);
+  external static _delete(String path, bool recursive);
+  external static _rename(String path, String newPath);
+  external static SendPort _newServicePort();
 
   Future<bool> exists() {
     _ensureDirectoryService();
@@ -34,7 +34,7 @@
     request[1] = _path;
     return _directoryService.call(request).transform((response) {
       if (_isErrorResponse(response)) {
-        throw _exceptionFromResponse(response, "Exists failed");
+        throw _exceptionOrErrorFromResponse(response, "Exists failed");
       }
       return response == 1;
     });
@@ -58,7 +58,7 @@
     request[1] = _path;
     return _directoryService.call(request).transform((response) {
       if (_isErrorResponse(response)) {
-        throw _exceptionFromResponse(response, "Creation failed");
+        throw _exceptionOrErrorFromResponse(response, "Creation failed");
       }
       return this;
     });
@@ -81,8 +81,8 @@
     request[1] = _path;
     return _directoryService.call(request).transform((response) {
       if (_isErrorResponse(response)) {
-        throw _exceptionFromResponse(response,
-                                     "Creation of temporary directory failed");
+        throw _exceptionOrErrorFromResponse(response,
+                                      "Creation of temporary directory failed");
       }
       return new Directory(response);
     });
@@ -109,11 +109,10 @@
     request[2] = recursive;
     return _directoryService.call(request).transform((response) {
       if (_isErrorResponse(response)) {
-        throw _exceptionFromResponse(response, errorMsg);
+        throw _exceptionOrErrorFromResponse(response, errorMsg);
       }
       return this;
     });
-    return completer.future;
   }
 
   Future<Directory> delete() {
@@ -152,7 +151,7 @@
     request[2] = newPath;
     return _directoryService.call(request).transform((response) {
       if (_isErrorResponse(response)) {
-        throw _exceptionFromResponse(response, "Rename failed");
+        throw _exceptionOrErrorFromResponse(response, "Rename failed");
       }
       return new Directory(newPath);
     });
@@ -179,7 +178,7 @@
     return response is List && response[0] != _SUCCESS_RESPONSE;
   }
 
-  Exception _exceptionFromResponse(response, String message) {
+  _exceptionOrErrorFromResponse(response, String message) {
     assert(_isErrorResponse(response));
     switch (response[_ERROR_RESPONSE_ERROR_TYPE]) {
       case _ILLEGAL_ARGUMENT_RESPONSE:
diff --git a/lib/io/eventhandler.dart b/lib/io/eventhandler.dart
new file mode 100644
index 0000000..f925b01
--- /dev/null
+++ b/lib/io/eventhandler.dart
@@ -0,0 +1,8 @@
+// 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.
+
+class _EventHandler {
+  external static void _start();
+  external static _sendData(Object sender, ReceivePort receivePort, int data);
+}
diff --git a/runtime/bin/file.dart b/lib/io/file.dart
similarity index 100%
rename from runtime/bin/file.dart
rename to lib/io/file.dart
diff --git a/runtime/bin/file_impl.dart b/lib/io/file_impl.dart
similarity index 91%
rename from runtime/bin/file_impl.dart
rename to lib/io/file_impl.dart
index 0aa31fb..05126a8 100644
--- a/runtime/bin/file_impl.dart
+++ b/lib/io/file_impl.dart
@@ -198,7 +198,7 @@
     // A copy is required by the interface.
     var length = buffer.length - offset;
     if (len != null) {
-      if (len > length) throw new IndexOutOfRangeException(len);
+      if (len > length) throw new RangeError.value(len);
       length = len;
     }
     var copy = new Uint8List(length);
@@ -321,7 +321,6 @@
 const int _WRITE_BYTE_REQUEST = 15;
 const int _READ_LIST_REQUEST = 16;
 const int _WRITE_LIST_REQUEST = 17;
-const int _WRITE_STRING_REQUEST = 18;
 
 // Base class for _File and _RandomAccessFile with shared functions.
 class _FileBase {
@@ -329,7 +328,7 @@
     return response is List && response[0] != _SUCCESS_RESPONSE;
   }
 
-  Exception _exceptionFromResponse(response, String message) {
+  _exceptionFromResponse(response, String message) {
     assert(_isErrorResponse(response));
     switch (response[_ERROR_RESPONSE_ERROR_TYPE]) {
       case _ILLEGAL_ARGUMENT_RESPONSE:
@@ -346,7 +345,12 @@
   }
 }
 
-SendPort _newServicePort() native "File_NewServicePort";
+// TODO(ager): The only reason for this class is that the patching
+// mechanism doesn't seem to like patching a private top level
+// function.
+class _FileUtils {
+  external static SendPort _newServicePort();
+}
 
 // Class for encapsulating the native implementation of files.
 class _File extends _FileBase implements File {
@@ -374,8 +378,7 @@
     });
   }
 
-
-  static _exists(String name) native "File_Exists";
+  external static _exists(String name);
 
   bool existsSync() {
     var result = _exists(_name);
@@ -396,7 +399,7 @@
     });
   }
 
-  static _create(String name) native "File_Create";
+  external static _create(String name);
 
   void createSync() {
     var result = _create(_name);
@@ -416,7 +419,7 @@
     });
   }
 
-  static _delete(String name) native "File_Delete";
+  external static _delete(String name);
 
   void deleteSync() {
     var result = _delete(_name);
@@ -438,7 +441,7 @@
     });
   }
 
-  static _directory(String name) native "File_Directory";
+  external static _directory(String name);
 
   Directory directorySync() {
     var result = _directory(name);
@@ -485,7 +488,7 @@
   }
 
 
-  static _lengthFromName(String name) native "File_LengthFromName";
+  external static _lengthFromName(String name);
 
   int lengthSync() {
     var result = _lengthFromName(_name);
@@ -508,7 +511,7 @@
     });
   }
 
-  static _lastModified(String name) native "File_LastModified";
+  external static _lastModified(String name);
 
   Date lastModifiedSync() {
     var ms = _lastModified(name);
@@ -516,7 +519,7 @@
     return new Date.fromMillisecondsSinceEpoch(ms);
   }
 
-  static _open(String name, int mode) native "File_Open";
+  external static _open(String name, int mode);
 
   RandomAccessFile openSync([FileMode mode = FileMode.READ]) {
     if (mode != FileMode.READ &&
@@ -530,7 +533,7 @@
     return new _RandomAccessFile(id, _name);
   }
 
-  static int _openStdio(int fd) native "File_OpenStdio";
+  external static int _openStdio(int fd);
 
   static RandomAccessFile _openStdioSync(int fd) {
     var id = _openStdio(fd);
@@ -555,7 +558,7 @@
     });
   }
 
-  static _fullPath(String name) native "File_FullPath";
+  external static _fullPath(String name);
 
   String fullPathSync() {
     var result = _fullPath(_name);
@@ -661,7 +664,7 @@
 
   void _ensureFileService() {
     if (_fileService == null) {
-      _fileService = _newServicePort();
+      _fileService = _FileUtils._newServicePort();
     }
   }
 
@@ -700,7 +703,7 @@
     });
   }
 
-  static int _close(int id) native "File_Close";
+  external static int _close(int id);
 
   void closeSync() {
     _checkNotClosed();
@@ -727,7 +730,7 @@
     });
   }
 
-  static _readByte(int id) native "File_ReadByte";
+  external static _readByte(int id);
 
   int readByteSync() {
     _checkNotClosed();
@@ -769,15 +772,14 @@
   }
 
   static void _checkReadWriteListArguments(int length, int offset, int bytes) {
-    if (offset < 0) throw new IndexOutOfRangeException(offset);
-    if (bytes < 0) throw new IndexOutOfRangeException(bytes);
+    if (offset < 0) throw new RangeError.value(offset);
+    if (bytes < 0) throw new RangeError.value(bytes);
     if ((offset + bytes) > length) {
-      throw new IndexOutOfRangeException(offset + bytes);
+      throw new RangeError.value(offset + bytes);
     }
   }
 
-  static _readList(int id, List<int> buffer, int offset, int bytes)
-      native "File_ReadList";
+  external static _readList(int id, List<int> buffer, int offset, int bytes);
 
   int readListSync(List<int> buffer, int offset, int bytes) {
     _checkNotClosed();
@@ -822,7 +824,7 @@
     });
   }
 
-  static _writeByte(int id, int value) native "File_WriteByte";
+  external static _writeByte(int id, int value);
 
   int writeByteSync(int value) {
     _checkNotClosed();
@@ -879,8 +881,7 @@
     });
   }
 
-  static _writeList(int id, List<int> buffer, int offset, int bytes)
-      native "File_WriteList";
+  external static _writeList(int id, List<int> buffer, int offset, int bytes);
 
   int writeListSync(List<int> buffer, int offset, int bytes) {
     _checkNotClosed();
@@ -902,32 +903,25 @@
 
   Future<RandomAccessFile> writeString(String string,
                                        [Encoding encoding = Encoding.UTF_8]) {
-    _ensureFileService();
-    Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>();
-    if (closed) return _completeWithClosedException(completer);
-    List request = new List(3);
-    request[0] = _WRITE_STRING_REQUEST;
-    request[1] = _id;
-    request[2] = string;
-    return _fileService.call(request).transform((response) {
-      if (_isErrorResponse(response)) {
-        throw _exceptionFromResponse(response,
-                                     "writeString failed for file '$_name'");
-      }
-      return this;
-    });
+    if (encoding is! Encoding) {
+      var completer = new Completer();
+      new Timer(0, (t) {
+        completer.completeException(new FileIOException(
+            "Invalid encoding in writeString: $encoding"));
+      });
+      return completer.future;
+    }
+    var data = _StringEncoders.encoder(encoding).encodeString(string);
+    return writeList(data, 0, data.length);
   }
 
-  static _writeString(int id, String string) native "File_WriteString";
-
   int writeStringSync(String string, [Encoding encoding = Encoding.UTF_8]) {
-    _checkNotClosed();
-    if (string is !String) throw new ArgumentError();
-    var result = _writeString(_id, string);
-    if (result is OSError) {
-      throw new FileIOException("writeString failed for file '$_name'");
+    if (encoding is! Encoding) {
+      throw new FileIOException(
+          "Invalid encoding in writeStringSync: $encoding");
     }
-    return result;
+    var data = _StringEncoders.encoder(encoding).encodeString(string);
+    return writeListSync(data, 0, data.length);
   }
 
   Future<int> position() {
@@ -946,7 +940,7 @@
     });
   }
 
-  static _position(int id) native "File_Position";
+  external static _position(int id);
 
   int positionSync() {
     _checkNotClosed();
@@ -974,7 +968,7 @@
     });
   }
 
-  static _setPosition(int id, int position) native "File_SetPosition";
+  external static _setPosition(int id, int position);
 
   void setPositionSync(int position) {
     _checkNotClosed();
@@ -1001,7 +995,7 @@
     });
   }
 
-  static _truncate(int id, int length) native "File_Truncate";
+  external static _truncate(int id, int length);
 
   void truncateSync(int length) {
     _checkNotClosed();
@@ -1027,7 +1021,7 @@
     });
   }
 
-  static _length(int id) native "File_Length";
+  external static _length(int id);
 
   int lengthSync() {
     _checkNotClosed();
@@ -1054,7 +1048,7 @@
     });
   }
 
-  static _flush(int id) native "File_Flush";
+  external static _flush(int id);
 
   void flushSync() {
     _checkNotClosed();
@@ -1068,7 +1062,7 @@
 
   void _ensureFileService() {
     if (_fileService == null) {
-      _fileService = _newServicePort();
+      _fileService = _FileUtils._newServicePort();
     }
   }
 
diff --git a/runtime/bin/http.dart b/lib/io/http.dart
similarity index 93%
rename from runtime/bin/http.dart
rename to lib/io/http.dart
index 13b28dc..79d16af 100644
--- a/runtime/bin/http.dart
+++ b/lib/io/http.dart
@@ -66,7 +66,7 @@
    * setup. See [addRequestHandler] and [defaultRequestHandler] for
    * information on how incoming HTTP requests are handled.
    */
-  void listen(String host, int port, [int backlog]);
+  void listen(String host, int port, {int backlog: 128});
 
   /**
    * Attach the HTTP server to an existing [:ServerSocket:]. If the
@@ -116,7 +116,7 @@
    * Set the timeout, in seconds, for sessions of this HTTP server. Default
    * is 20 minutes.
    */
-  int set sessionTimeout(int timeout);
+  set sessionTimeout(int timeout);
 }
 
 
@@ -370,8 +370,10 @@
    * Creates a new header value object from parsing a header value
    * string with both value and optional parameters.
    */
-  factory HeaderValue.fromString(String value) {
-    return new _HeaderValue.fromString(value);
+  factory HeaderValue.fromString(String value,
+                                 {String parameterSeparator: ";"}) {
+    return new _HeaderValue.fromString(
+        value, parameterSeparator: parameterSeparator);
   }
 
   /**
@@ -401,7 +403,7 @@
   /**
    * Access the user-data associated with the session.
    */
-  Dynamic data;
+  dynamic data;
 
   /**
    * Destroy the session. This will terminate the session and any further
@@ -747,6 +749,29 @@
   HttpClientConnection postUrl(Uri url);
 
   /**
+   * Sets the function to be called when a site is requesting
+   * authentication. The URL requested and the security realm from the
+   * server are passed in the arguments [url] and [realm].
+   *
+   * The function returns a [Future] which should complete when the
+   * authentication has been resolved. If credentials cannot be
+   * provided the [Future] should complete with [false]. If
+   * credentials are available the function should add these using
+   * [addCredentials] before completing the [Future] with the value
+   * [true].
+   *
+   * If the [Future] completes with true the request will be retried
+   * using the updated credentials. Otherwise response processing will
+   * continue normally.
+   */
+  set authenticate(Future<bool> f(Uri url, String scheme, String realm));
+
+  /**
+   * Add credentials to be used for authorizing HTTP requests.
+   */
+  void addCredentials(Uri url, String realm, HttpClientCredentials credentials);
+
+  /**
    * Sets the function used to resolve the proxy server to be used for
    * opening a HTTP connection to the specified [url]. If this
    * function is not set, direct connections will always be used.
@@ -942,6 +967,28 @@
   InputStream get inputStream;
 }
 
+
+abstract class HttpClientCredentials { }
+
+
+/**
+ * Represent credentials for basic authentication.
+ */
+abstract class HttpClientBasicCredentials extends HttpClientCredentials {
+  factory HttpClientBasicCredentials(String username, String password) =>
+      new _HttpClientBasicCredentials(username, password);
+}
+
+
+/**
+ * Represent credentials for digest authentication.
+ */
+abstract class HttpClientDigestCredentials extends HttpClientCredentials {
+  factory HttpClientDigestCredentials(String username, String password) =>
+      new _HttpClientDigestCredentials(username, password);
+}
+
+
 /**
  * Connection information.
  */
diff --git a/runtime/bin/http_impl.dart b/lib/io/http_impl.dart
similarity index 87%
rename from runtime/bin/http_impl.dart
rename to lib/io/http_impl.dart
index 68e2f52..740dc36 100644
--- a/runtime/bin/http_impl.dart
+++ b/lib/io/http_impl.dart
@@ -308,7 +308,7 @@
 class _HeaderValue implements HeaderValue {
   _HeaderValue([String this.value = ""]);
 
-  _HeaderValue.fromString(String value) {
+  _HeaderValue.fromString(String value, {this.parameterSeparator: ";"}) {
     // Parse the string.
     _parse(value);
   }
@@ -347,20 +347,25 @@
     String parseValue() {
       int start = index;
       while (!done()) {
-        if (s[index] == " " || s[index] == "\t" || s[index] == ";") break;
+        if (s[index] == " " ||
+            s[index] == "\t" ||
+            s[index] == parameterSeparator) break;
         index++;
       }
       return s.substring(start, index).toLowerCase();
     }
 
     void expect(String expected) {
-      if (done()) throw new HttpException("Failed to parse header value [$s]");
-      if (s[index] != expected) {
-        throw new HttpException("Failed to parse header value [$s]");
+      if (done() || s[index] != expected) {
+        throw new HttpException("Failed to parse header value");
       }
       index++;
     }
 
+    void maybeExpect(String expected) {
+      if (s[index] == expected) index++;
+    }
+
     void parseParameters() {
       _parameters = new Map<String, String>();
 
@@ -381,7 +386,7 @@
           while (!done()) {
             if (s[index] == "\\") {
               if (index + 1 == s.length) {
-                throw new HttpException("Failed to parse header value [$s]");
+                throw new HttpException("Failed to parse header value");
               }
               index++;
             } else if (s[index] == "\"") {
@@ -409,7 +414,7 @@
         _parameters[name] = value;
         skipWS();
         if (done()) return;
-        expect(";");
+        expect(parameterSeparator);
       }
     }
 
@@ -417,11 +422,12 @@
     value = parseValue();
     skipWS();
     if (done()) return;
-    expect(";");
+    maybeExpect(parameterSeparator);
     parseParameters();
   }
 
   String value;
+  String parameterSeparator;
   Map<String, String> _parameters;
 }
 
@@ -642,7 +648,7 @@
 
 
   bool _write(List<int> data, bool copyBuffer) {
-    if (_headResponse) return;
+    if (_headResponse) return true;
     _ensureHeadersSent();
     bool allWritten = true;
     if (data.length > 0) {
@@ -661,7 +667,7 @@
   }
 
   bool _writeList(List<int> data, int offset, int count) {
-    if (_headResponse) return;
+    if (_headResponse) return true;
     _ensureHeadersSent();
     bool allWritten = true;
     if (count > 0) {
@@ -690,9 +696,12 @@
       }
       assert(_headResponse || _bodyBytesWritten == _contentLength);
     }
-    // If we are done writing the response and the client has closed
-    // or the connection is not persistent we can close.
-    if (!persistentConnection || _httpConnection._closing) {
+    // If we are done writing the response, and either the client has
+    // closed or the connection is not persistent, we can close. Also
+    // if using HTTP 1.0 and the content length was not known we must
+    // close to indicate end of body.
+    if (!persistentConnection || _httpConnection._closing ||
+        (_protocolVersion == "1.0" && _contentLength < 0)) {
       _httpConnection._close();
     }
     return allWritten;
@@ -890,8 +899,11 @@
       }
     }
 
-    _headers._mutable = false;
+    // Get parsed content length.
+    _contentLength = _httpConnection._httpParser.contentLength;
+
     // Prepare for receiving data.
+    _headers._mutable = false;
     _buffer = new _BufferList();
   }
 
@@ -1022,6 +1034,10 @@
     return _writeList(buffer, offset, len);
   }
 
+  void _streamFlush() {
+    _httpConnection._flush();
+  }
+
   void _streamClose() {
     _responseEnd();
   }
@@ -1098,11 +1114,6 @@
   bool _writeHeader() {
     List<int> data;
 
-    // HTTP/1.0 does not support chunked.
-    if (_protocolVersion == "1.0" && _contentLength < 0) {
-      throw new HttpException("Content length required for HTTP 1.0");
-    }
-
     // Write status line.
     if (_protocolVersion == "1.1") {
       _httpConnection._write(_Const.HTTP11);
@@ -1118,10 +1129,11 @@
     _writeCRLF();
 
     // Determine the value of the "Transfer-Encoding" header based on
-    // whether the content length is known.
+    // whether the content length is known. HTTP/1.0 does not support
+    // chunked.
     if (_contentLength >= 0) {
       _headers.set(HttpHeaders.CONTENT_LENGTH, _contentLength.toString());
-    } else if (_contentLength < 0) {
+    } else if (_contentLength < 0 && _protocolVersion == "1.1") {
       _headers.set(HttpHeaders.TRANSFER_ENCODING, "chunked");
     }
 
@@ -1131,7 +1143,7 @@
       bool found = false;
       for (int i = 0; i < cookies.length; i++) {
         if (cookies[i].name.toUpperCase() == _DART_SESSION_ID) {
-          cookie.value = session.id;
+          cookies[i].value = session.id;
           found = true;
           break;
         }
@@ -1189,10 +1201,6 @@
     return result;
   }
 
-  void flush() {
-    // Nothing to do on a HTTP output stream.
-  }
-
   void _close() {
     // TODO(sgjesse): Handle this.
   }
@@ -1216,6 +1224,10 @@
     return _requestOrResponse._streamWriteFrom(buffer, offset, len);
   }
 
+  void flush() {
+    _requestOrResponse._streamFlush();
+  }
+
   void close() {
     _requestOrResponse._streamClose();
   }
@@ -1242,9 +1254,8 @@
 }
 
 
-class _HttpConnectionBase {
-  _HttpConnectionBase() : _sendBuffers = new Queue(),
-                          _httpParser = new _HttpParser(),
+abstract class _HttpConnectionBase {
+  _HttpConnectionBase() : _httpParser = new _HttpParser(),
                           hashCode = _nextHashCode {
     _nextHashCode = (_nextHashCode + 1) & 0xFFFFFFF;
   }
@@ -1272,6 +1283,10 @@
     }
   }
 
+  bool _flush() {
+    _socket.outputStream.flush();
+  }
+
   bool _close() {
     _closing = true;
     _socket.outputStream.close();
@@ -1340,8 +1355,8 @@
     return null;
   }
 
-  abstract void _onConnectionClosed(e);
-  abstract void _responseDone();
+  void _onConnectionClosed(e);
+  void _responseDone();
 
   void set _onNoPendingWrites(void callback()) {
     if (!_error) {
@@ -1354,8 +1369,6 @@
   bool _error = false;  // Is the socket closed due to an error?
   _HttpParser _httpParser;
 
-  Queue _sendBuffers;
-
   Function onDetach;
 
   // Hash code for HTTP connection. Currently this is just a counter.
@@ -1551,7 +1564,7 @@
     _onError = callback;
   }
 
-  int set sessionTimeout(int timeout) {
+  set sessionTimeout(int timeout) {
     _sessionManager.sessionTimeout = timeout;
   }
 
@@ -1642,6 +1655,10 @@
     return _writeList(buffer, offset, len);
   }
 
+  void _streamFlush() {
+    _httpConnection._flush();
+  }
+
   void _streamClose() {
     _ensureHeadersSent();
     _state = DONE;
@@ -1695,7 +1712,7 @@
 
     // Determine the value of the "Transfer-Encoding" header based on
     // whether the content length is known. If there is no content
-    // neither "Content-Length" nor "Transfer-Encoding" is set
+    // neither "Content-Length" nor "Transfer-Encoding" is set.
     if (_contentLength > 0) {
       _headers.set(HttpHeaders.CONTENT_LENGTH, _contentLength.toString());
     } else if (_contentLength < 0) {
@@ -1775,14 +1792,89 @@
 
   void _onHeaderReceived(String name, String value) {
     _headers.add(name, value);
-    if (name == "content-length") {
-      _contentLength = parseInt(value);
+  }
+
+  void _handleUnauthorized() {
+
+    void retryRequest(_Credentials cr) {
+      if (cr != null) {
+        // Drain body and retry.
+        // TODO(sgjesse): Support digest.
+        if (cr.scheme == _AuthenticationScheme.BASIC) {
+          inputStream.onData = inputStream.read;
+          inputStream.onClosed = _connection.retry;
+          return;
+        }
+      }
+
+      // Fall through to here to perform normal response handling if
+      // there is no sensible authorization handling.
+      if (_connection._onResponse != null) {
+        _connection._onResponse(this);
+      }
+    }
+
+    // Only try to authenticate if there is a challenge in the response.
+    List<String> challenge = _headers[HttpHeaders.WWW_AUTHENTICATE];
+    if (challenge != null && challenge.length == 1) {
+      _HeaderValue header =
+          new _HeaderValue.fromString(challenge[0], parameterSeparator: ",");
+      _AuthenticationScheme scheme =
+          new _AuthenticationScheme.fromString(header.value);
+      String realm = header.parameters["realm"];
+
+      // See if any credentials are available.
+      _Credentials cr =
+          _connection._client._findCredentials(
+              _connection._request._uri, scheme);
+
+      // Ask for more credentials if none found or the one found has
+      // already been used. If it has already been used it must now be
+      // invalid and is removed.
+      if (cr == null || cr.used) {
+        if (cr != null) {
+          _connection._client._removeCredentials(cr);
+        }
+        cr = null;
+        if (_connection._client._authenticate != null) {
+          Future authComplete =
+              _connection._client._authenticate(
+                  _connection._request._uri, scheme.toString(), realm);
+          authComplete.then((credsAvailable) {
+            if (credsAvailable) {
+              cr = _connection._client._findCredentials(
+                  _connection._request._uri, scheme);
+              retryRequest(cr);
+            } else {
+              if (_connection._onResponse != null) {
+                _connection._onResponse(this);
+              }
+            }
+          });
+          return;
+        }
+      } else {
+        // If credentials found prepare for retrying the request.
+        retryRequest(cr);
+        return;
+      }
+    }
+
+    // Fall through to here to perform normal response handling if
+    // there is no sensible authorization handling.
+    if (_connection._onResponse != null) {
+      _connection._onResponse(this);
     }
   }
 
   void _onHeadersComplete() {
+    // Get parsed content length.
+    _contentLength = _httpConnection._httpParser.contentLength;
+
+    // Prepare for receiving data.
     _headers._mutable = false;
     _buffer = new _BufferList();
+
     if (isRedirect && _connection.followRedirects) {
       if (_connection._redirects == null ||
           _connection._redirects.length < _connection.maxRedirects) {
@@ -1808,6 +1900,8 @@
       } else {
         throw new RedirectLimitExceededException(_connection._redirects);
       }
+    } else if (statusCode == HttpStatus.UNAUTHORIZED) {
+      _handleUnauthorized();
     } else if (_connection._onResponse != null) {
       _connection._onResponse(this);
     }
@@ -1962,6 +2056,14 @@
     _onErrorCallback = callback;
   }
 
+  void retry() {
+    if (_socketConn != null) {
+      throw new HttpException("Cannot retry with body data pending");
+    }
+    // Retry the URL using the same connection instance.
+    _client._openUrl(_method, _request._uri, this);
+  }
+
   void redirect([String method, Uri url]) {
     if (_socketConn != null) {
       throw new HttpException("Cannot redirect with body data pending");
@@ -2086,6 +2188,7 @@
 
   _HttpClient() : _openSockets = new Map(),
                   _activeSockets = new Set(),
+                  credentials = new List<_Credentials>(),
                   _shutdown = false;
 
   HttpClientConnection open(
@@ -2116,9 +2219,6 @@
     if (url.scheme != "http") {
       throw new HttpException("Unsupported URL scheme ${url.scheme}");
     }
-    if (url.userInfo != "") {
-      throw new HttpException("Unsupported user info ${url.userInfo}");
-    }
     return _open(method, url, connection);
   }
 
@@ -2134,6 +2234,15 @@
 
   HttpClientConnection postUrl(Uri url) => _openUrl("POST", url);
 
+  set authenticate(Future<bool> f(Uri url, String scheme, String realm)) {
+    _authenticate = f;
+  }
+
+  void addCredentials(
+      Uri url, String realm, HttpClientCredentials cr) {
+    credentials.add(new _Credentials(url, realm, cr));
+  }
+
   set findProxy(String f(Uri uri)) => _findProxy = f;
 
   void shutdown() {
@@ -2177,6 +2286,20 @@
         HttpClientRequest request = connection.open(method, url);
         request.headers.host = host;
         request.headers.port = port;
+        if (url.userInfo != null && !url.userInfo.isEmpty) {
+          // If the URL contains user information use that for basic
+          // authorization
+          _UTF8Encoder encoder = new _UTF8Encoder();
+          String auth =
+              CryptoUtils.bytesToBase64(encoder.encodeString(url.userInfo));
+          request.headers.set(HttpHeaders.AUTHORIZATION, "Basic $auth");
+        } else {
+          // Look for credentials.
+          _Credentials cr = _findCredentials(url);
+          if (cr != null) {
+            cr.authorize(request);
+          }
+        }
         if (connection._onRequest != null) {
           connection._onRequest(request);
         } else {
@@ -2320,11 +2443,34 @@
     sockets.addFirst(socketConn);
   }
 
+  _Credentials _findCredentials(Uri url, [_AuthenticationScheme scheme]) {
+    // Look for credentials.
+    _Credentials cr =
+        credentials.reduce(null, (_Credentials prev, _Credentials value) {
+          if (value.applies(url, scheme)) {
+            if (prev == null) return value;
+            return value.uri.path.length > prev.uri.path.length ? value : prev;
+          } else {
+            return prev;
+          }
+        });
+    return cr;
+  }
+
+  void _removeCredentials(_Credentials cr) {
+    int index = credentials.indexOf(cr);
+    if (index != -1) {
+      credentials.removeAt(index);
+    }
+  }
+
   Function _onOpen;
   Map<String, Queue<_SocketConnection>> _openSockets;
   Set<_SocketConnection> _activeSockets;
+  List<_Credentials> credentials;
   Timer _evictionTimer;
   Function _findProxy;
+  Function _authenticate;
   bool _shutdown;  // Has this HTTP client been shutdown?
 }
 
@@ -2345,6 +2491,109 @@
 }
 
 
+class _AuthenticationScheme {
+  static const UNKNOWN = const _AuthenticationScheme(-1);
+  static const BASIC = const _AuthenticationScheme(0);
+  static const DIGEST = const _AuthenticationScheme(1);
+
+  const _AuthenticationScheme(this._scheme);
+
+  factory _AuthenticationScheme.fromString(String scheme) {
+    if (scheme.toLowerCase() == "basic") return BASIC;
+    if (scheme.toLowerCase() == "digest") return DIGEST;
+    return UNKNOWN;
+  }
+
+  String toString() {
+    if (this == BASIC) return "Basic";
+    if (this == DIGEST) return "Digest";
+    return "Unknown";
+  }
+
+  final int _scheme;
+}
+
+
+class _Credentials {
+  _Credentials(this.uri, this.realm, this.credentials);
+
+  _AuthenticationScheme get scheme => credentials.scheme;
+
+  bool applies(Uri uri, _AuthenticationScheme scheme) {
+    if (scheme != null && credentials.scheme != scheme) return false;
+    if (uri.domain != this.uri.domain) return false;
+    int thisPort =
+        this.uri.port == 0 ? HttpClient.DEFAULT_HTTP_PORT : this.uri.port;
+    int otherPort = uri.port == 0 ? HttpClient.DEFAULT_HTTP_PORT : uri.port;
+    if (otherPort != thisPort) return false;
+    return uri.path.startsWith(this.uri.path);
+  }
+
+  void authorize(HttpClientRequest request) {
+    credentials.authorize(this, request);
+    used = true;
+  }
+
+  bool used = false;
+  Uri uri;
+  String realm;
+  HttpClientCredentials credentials;
+
+  // Digest specific fields.
+  String nonce;
+  String algorithm;
+  String qop;
+}
+
+
+abstract class _HttpClientCredentials implements HttpClientCredentials {
+  _AuthenticationScheme get scheme;
+  void authorize(HttpClientRequest request);
+}
+
+
+class _HttpClientBasicCredentials implements HttpClientBasicCredentials {
+  _HttpClientBasicCredentials(this.username,
+                              this.password);
+
+  _AuthenticationScheme get scheme => _AuthenticationScheme.BASIC;
+
+  void authorize(_Credentials _, HttpClientRequest request) {
+    // There is no mentioning of username/password encoding in RFC
+    // 2617. However there is an open draft for adding an additional
+    // accept-charset parameter to the WWW-Authenticate and
+    // Proxy-Authenticate headers, see
+    // http://tools.ietf.org/html/draft-reschke-basicauth-enc-06. For
+    // now always use UTF-8 encoding.
+    _UTF8Encoder encoder = new _UTF8Encoder();
+    String auth =
+        CryptoUtils.bytesToBase64(encoder.encodeString(
+            "$username:$password"));
+    request.headers.set(HttpHeaders.AUTHORIZATION, "Basic $auth");
+  }
+
+  String username;
+  String password;
+}
+
+
+class _HttpClientDigestCredentials implements HttpClientDigestCredentials {
+  _HttpClientDigestCredentials(this.username,
+                               this.password);
+
+  _AuthenticationScheme get scheme => _AuthenticationScheme.DIGEST;
+
+  void authorize(_Credentials credentials, HttpClientRequest request) {
+    // TODO(sgjesse): Implement!!!
+    throw new UnsupportedOperationException();
+  }
+
+  String username;
+  String password;
+}
+
+
+
 class _RedirectInfo implements RedirectInfo {
   const _RedirectInfo(int this.statusCode,
                       String this.method,
diff --git a/runtime/bin/http_parser.dart b/lib/io/http_parser.dart
similarity index 98%
rename from runtime/bin/http_parser.dart
rename to lib/io/http_parser.dart
index 571ce70..a5549c5 100644
--- a/runtime/bin/http_parser.dart
+++ b/lib/io/http_parser.dart
@@ -428,6 +428,14 @@
 
           case _State.HEADER_ENDING:
             _expect(byte, _CharCode.LF);
+            // If a request message has neither Content-Length nor
+            // Transfer-Encoding the message must not have a body (RFC
+            // 2616 section 4.3).
+            if (_messageType == _MessageType.REQUEST &&
+                _contentLength < 0 &&
+                _chunked == false) {
+              _contentLength = 0;
+            }
             if (_connectionUpgrade) {
               _state = _State.UPGRADED;
               _unparsedData =
@@ -439,8 +447,6 @@
                 _state = _State.CHUNK_SIZE;
                 _remainingContent = 0;
               } else if (_contentLength == 0 ||
-                         (_messageType == _MessageType.REQUEST &&
-                          _contentLength == -1) ||
                          (_messageType == _MessageType.RESPONSE &&
                           (_noMessageBody || _responseToMethod == "HEAD"))) {
                 // If there is no message body get ready to process the
diff --git a/runtime/bin/http_session.dart b/lib/io/http_session.dart
similarity index 97%
rename from runtime/bin/http_session.dart
rename to lib/io/http_session.dart
index f1d5eaf..d214613 100644
--- a/runtime/bin/http_session.dart
+++ b/lib/io/http_session.dart
@@ -154,7 +154,6 @@
   _HttpSession _tail;
   Timer _timer;
 
-  static Uint8List _getRandomBytes(int count)
-      native "Crypto_GetRandomBytes";
+  external static Uint8List _getRandomBytes(int count);
 }
 
diff --git a/runtime/bin/http_utils.dart b/lib/io/http_utils.dart
similarity index 100%
rename from runtime/bin/http_utils.dart
rename to lib/io/http_utils.dart
diff --git a/runtime/bin/input_stream.dart b/lib/io/input_stream.dart
similarity index 98%
rename from runtime/bin/input_stream.dart
rename to lib/io/input_stream.dart
index 755f54e..a59f603 100644
--- a/runtime/bin/input_stream.dart
+++ b/lib/io/input_stream.dart
@@ -60,7 +60,7 @@
    * `false` for the optional argument [close] keeps the output
    * stream open after writing all data from the input stream.
    */
-  void pipe(OutputStream output, [bool close = true]);
+  void pipe(OutputStream output, {bool close: true});
 
   /**
    * Close the underlying communication channel to avoid getting any
diff --git a/lib/io/io.dart b/lib/io/io.dart
new file mode 100644
index 0000000..92f044b
--- /dev/null
+++ b/lib/io/io.dart
@@ -0,0 +1,53 @@
+// 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.
+
+/**
+ * The IO library is used for Dart server applications,
+ * which run on a stand-alone Dart VM from the command line.
+ * *This library does not work in browser based applications.*
+ *
+ * This library allows you to work with files, directories,
+ * sockets, processes, HTTP servers and clients, and more.
+ */
+#library('dart:io');
+
+#import('dart:crypto');
+#import('dart:isolate');
+#import('dart:math');
+#import('dart:uri');
+#import('dart:utf');
+#import('dart:scalarlist');
+
+#source('base64.dart');
+#source('buffer_list.dart');
+#source('chunked_stream.dart');
+#source('common.dart');
+#source('directory.dart');
+#source('directory_impl.dart');
+#source('eventhandler.dart');
+#source('file.dart');
+#source('file_impl.dart');
+#source('http.dart');
+#source('http_impl.dart');
+#source('http_parser.dart');
+#source('http_session.dart');
+#source('http_utils.dart');
+#source('input_stream.dart');
+#source('list_stream.dart');
+#source('list_stream_impl.dart');
+#source('mime_multipart_parser.dart');
+#source('output_stream.dart');
+#source('path.dart');
+#source('path_impl.dart');
+#source('platform.dart');
+#source('platform_impl.dart');
+#source('process.dart');
+#source('socket.dart');
+#source('socket_stream_impl.dart');
+#source('stdio.dart');
+#source('stream_util.dart');
+#source('string_stream.dart');
+#source('timer_impl.dart');
+#source('websocket.dart');
+#source('websocket_impl.dart');
diff --git a/lib/io/iolib_sources.gypi b/lib/io/iolib_sources.gypi
new file mode 100644
index 0000000..55a9bcf
--- /dev/null
+++ b/lib/io/iolib_sources.gypi
@@ -0,0 +1,40 @@
+# 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.
+
+{
+  'sources': [
+    'base64.dart',
+    'buffer_list.dart',
+    'chunked_stream.dart',
+    'common.dart',
+    'directory.dart',
+    'directory_impl.dart',
+    'eventhandler.dart',
+    'file.dart',
+    'file_impl.dart',
+    'http.dart',
+    'http_impl.dart',
+    'http_parser.dart',
+    'http_session.dart',
+    'http_utils.dart',
+    'input_stream.dart',
+    'list_stream.dart',
+    'list_stream_impl.dart',
+    'mime_multipart_parser.dart',
+    'output_stream.dart',
+    'path.dart',
+    'path_impl.dart',
+    'platform.dart',
+    'platform_impl.dart',
+    'process.dart',
+    'socket.dart',
+    'socket_stream_impl.dart',
+    'stdio.dart',
+    'stream_util.dart',
+    'string_stream.dart',
+    'timer_impl.dart',
+    'websocket.dart',
+    'websocket_impl.dart',
+  ],
+}
diff --git a/runtime/bin/list_stream.dart b/lib/io/list_stream.dart
similarity index 100%
rename from runtime/bin/list_stream.dart
rename to lib/io/list_stream.dart
diff --git a/runtime/bin/list_stream_impl.dart b/lib/io/list_stream_impl.dart
similarity index 100%
rename from runtime/bin/list_stream_impl.dart
rename to lib/io/list_stream_impl.dart
diff --git a/runtime/bin/mime_multipart_parser.dart b/lib/io/mime_multipart_parser.dart
similarity index 100%
rename from runtime/bin/mime_multipart_parser.dart
rename to lib/io/mime_multipart_parser.dart
diff --git a/runtime/bin/output_stream.dart b/lib/io/output_stream.dart
similarity index 100%
rename from runtime/bin/output_stream.dart
rename to lib/io/output_stream.dart
diff --git a/runtime/bin/path.dart b/lib/io/path.dart
similarity index 100%
rename from runtime/bin/path.dart
rename to lib/io/path.dart
diff --git a/runtime/bin/path_impl.dart b/lib/io/path_impl.dart
similarity index 100%
rename from runtime/bin/path_impl.dart
rename to lib/io/path_impl.dart
diff --git a/runtime/bin/platform.dart b/lib/io/platform.dart
similarity index 100%
rename from runtime/bin/platform.dart
rename to lib/io/platform.dart
diff --git a/runtime/bin/platform_impl.dart b/lib/io/platform_impl.dart
similarity index 82%
rename from runtime/bin/platform_impl.dart
rename to lib/io/platform_impl.dart
index 8949f79..f8e0411 100644
--- a/runtime/bin/platform_impl.dart
+++ b/lib/io/platform_impl.dart
@@ -3,11 +3,11 @@
 // BSD-style license that can be found in the LICENSE file.
 
 class _Platform {
-  static int _numberOfProcessors() native "Platform_NumberOfProcessors";
-  static String _pathSeparator() native "Platform_PathSeparator";
-  static String _operatingSystem() native "Platform_OperatingSystem";
-  static _localHostname() native "Platform_LocalHostname";
-  static _environment() native "Platform_Environment";
+  external static int _numberOfProcessors();
+  external static String _pathSeparator();
+  external static String _operatingSystem();
+  external static _localHostname();
+  external static _environment();
 
   static int get numberOfProcessors {
     return _numberOfProcessors();
diff --git a/runtime/bin/process.dart b/lib/io/process.dart
similarity index 84%
rename from runtime/bin/process.dart
rename to lib/io/process.dart
index 806fe48..8d6d9f2 100644
--- a/runtime/bin/process.dart
+++ b/lib/io/process.dart
@@ -2,19 +2,25 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// TODO(ager): The only reason for this class is that we
+// cannot patch a top-level at this point.
+class _ProcessUtils {
+  external static _exit(int status);
+}
+
 /** Exit the Dart VM process with the given [status] code. */
 void exit(int status) {
   if (status is !int) {
     throw new ArgumentError("int status expected");
   }
-  _exit(status);
+  _ProcessUtils._exit(status);
 }
 
 /**
  * [Process] is used to start new processes using the static
  * [start] and [run] methods.
  */
-class Process {
+abstract class Process {
   /**
    * Starts a process running the [executable] with the specified
    * [arguments]. Returns a [:Future<Process>:] that completes with a
@@ -25,12 +31,15 @@
    *
    * An optional [ProcessOptions] object can be passed to specify
    * options other than the executable and the arguments.
+   *
+   * Users must read all data coming on the [stdout] and [stderr]
+   * streams of processes started with [:Process.start:]. If the user
+   * does not read all data on the streams the underlying system
+   * resources will not be freed since there is still pending data.
    */
-  static Future<Process> start(String executable,
-                               List<String> arguments,
-                               [ProcessOptions options]) {
-    return _Process.start(executable, arguments, options);
-  }
+  external static Future<Process> start(String executable,
+                                        List<String> arguments,
+                                        [ProcessOptions options]);
 
   /**
    * Starts a process and runs it non-interactively to completion. The
@@ -43,11 +52,9 @@
    * result of running the process, i.e., exit code, standard out and
    * standard in.
    */
-  static Future<ProcessResult> run(String executable,
-                                   List<String> arguments,
-                                   [ProcessOptions options]) {
-    return _Process.run(executable, arguments, options);
-  }
+  external static Future<ProcessResult> run(String executable,
+                                            List<String> arguments,
+                                            [ProcessOptions options]);
 
   /**
    * Returns an input stream of the process stdout.
@@ -55,7 +62,7 @@
    * Throws an [UnsupportedError] if the process is
    * non-interactive.
    */
-  abstract InputStream get stdout;
+  InputStream get stdout;
 
   /**
    * Returns an input stream of the process stderr.
@@ -63,7 +70,7 @@
    * Throws an [UnsupportedError] if the process is
    * non-interactive.
    */
-  abstract InputStream get stderr;
+  InputStream get stderr;
 
   /**
    * Returns an output stream to the process stdin.
@@ -71,7 +78,7 @@
    * Throws an [UnsupportedError] if the process is
    * non-interactive.
    */
-  abstract OutputStream get stdin;
+  OutputStream get stdin;
 
   /**
    * Sets an exit handler which gets invoked when the process
@@ -80,7 +87,7 @@
    * Throws an [UnsupportedError] if the process is
    * non-interactive.
    */
-  abstract void set onExit(void callback(int exitCode));
+  void set onExit(void callback(int exitCode));
 
   /**
    * On Windows, [kill] kills the process, ignoring the [signal]
@@ -95,18 +102,7 @@
    * a [:false:] return value from kill means that the process is
    * already dead.
    */
-  abstract bool kill([ProcessSignal signal = ProcessSignal.SIGTERM]);
-
-  /**
-   * Terminates the streams of a process. [close] must be called on a
-   * process to free the system resources associated with it if not all
-   * data on the stdout and stderr streams have been read. Usually,
-   * close should be called in [onExit], but care must be taken to actually
-   * wait on the stderr and stdout streams to close if all data is required.
-   * Once a process has been closed it can no longer be killed and [onExit]
-   * is detached so the application is not notified of process termination.
-   */
-  abstract void close();
+  bool kill([ProcessSignal signal = ProcessSignal.SIGTERM]);
 }
 
 
diff --git a/runtime/bin/socket.dart b/lib/io/socket.dart
similarity index 89%
rename from runtime/bin/socket.dart
rename to lib/io/socket.dart
index fcc1e44..19fc0eb 100644
--- a/runtime/bin/socket.dart
+++ b/lib/io/socket.dart
@@ -7,9 +7,7 @@
    * Constructs a new server socket, binds it to a given address and port,
    * and listens on it.
    */
-  factory ServerSocket(String bindAddress, int port, int backlog) {
-    return new _ServerSocket(bindAddress, port, backlog);
-  }
+  external factory ServerSocket(String bindAddress, int port, int backlog);
 
   /**
    * The connection handler gets called when there is a new incoming
@@ -40,7 +38,7 @@
    * host on the given port. The returned socket is not yet connected
    * but ready for registration of callbacks.
    */
-  factory Socket(String host, int port) => new _Socket(host, port);
+  external factory Socket(String host, int port);
 
   /**
    * Returns the number of received and non-read bytes in the socket that
@@ -49,6 +47,15 @@
   int available();
 
   /**
+   * Read up to [len] bytes from the socket. This function is
+   * non-blocking and will only return data if data is available. The
+   * number of bytes read can be less then [len] if fewer bytes are
+   * available for immediate reading. If no data is available [null]
+   * is returned.
+   */
+  List<int> read([int len]);
+
+  /**
    * Reads up to [count] bytes of data from the socket and stores them into
    * buffer after buffer offset [offset]. The number of successfully read
    * bytes is returned. This function is non-blocking and will only read data
diff --git a/runtime/bin/socket_stream_impl.dart b/lib/io/socket_stream_impl.dart
similarity index 82%
rename from runtime/bin/socket_stream_impl.dart
rename to lib/io/socket_stream_impl.dart
index c0ad221..c8799b1 100644
--- a/runtime/bin/socket_stream_impl.dart
+++ b/lib/io/socket_stream_impl.dart
@@ -2,37 +2,14 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-class _SocketInputStream implements SocketInputStream {
+class _SocketInputStream implements InputStream {
   _SocketInputStream(Socket socket) : _socket = socket {
     if (_socket._closed) _closed = true;
     _socket.onClosed = _onClosed;
   }
 
   List<int> read([int len]) {
-    int bytesToRead = available();
-    if (bytesToRead == 0) return null;
-    if (len !== null) {
-      if (len <= 0) {
-        throw new StreamException("Illegal length $len");
-      } else if (bytesToRead > len) {
-        bytesToRead = len;
-      }
-    }
-    List<int> buffer = new Uint8List(bytesToRead);
-    int bytesRead = _socket.readList(buffer, 0, bytesToRead);
-    if (bytesRead == 0) {
-      // On MacOS when reading from a tty Ctrl-D will result in one
-      // byte reported as available. Attempting to read it out will
-      // result in zero bytes read. When that happens there is no data
-      // which is indicated by a null return value.
-      return null;
-    } else if (bytesRead < bytesToRead) {
-      List<int> newBuffer = new Uint8List(bytesRead);
-      newBuffer.setRange(0, bytesRead, buffer);
-      return newBuffer;
-    } else {
-      return buffer;
-    }
+    return _socket.read(len);
   }
 
   int readInto(List<int> buffer, [int offset = 0, int len]) {
@@ -77,7 +54,7 @@
     }
   }
 
-  void _onSocketError(e) {
+  bool _onSocketError(e) {
     close();
     if (_onError != null) {
       _onError(e);
@@ -95,7 +72,7 @@
 
 
 class _SocketOutputStream
-    extends _BaseOutputStream implements SocketOutputStream {
+    extends _BaseOutputStream implements OutputStream {
   _SocketOutputStream(Socket socket)
       : _socket = socket, _pendingWrites = new _BufferList();
 
diff --git a/runtime/bin/stdio.dart b/lib/io/stdio.dart
similarity index 84%
rename from runtime/bin/stdio.dart
rename to lib/io/stdio.dart
index 727c375..e080526 100644
--- a/runtime/bin/stdio.dart
+++ b/lib/io/stdio.dart
@@ -15,12 +15,12 @@
 
 
 InputStream _getStdioInputStream() {
-  switch (_getStdioHandleType(0)) {
+  switch (_StdIOUtils._getStdioHandleType(0)) {
     case _STDIO_HANDLE_TYPE_TERMINAL:
     case _STDIO_HANDLE_TYPE_PIPE:
     case _STDIO_HANDLE_TYPE_SOCKET:
       Socket s = new _Socket._internalReadOnly();
-      _getStdioHandle(s, 0);
+      _StdIOUtils._getStdioHandle(s, 0);
       s._closed = false;
       return s.inputStream;
     case _STDIO_HANDLE_TYPE_FILE:
@@ -33,12 +33,12 @@
 
 OutputStream _getStdioOutputStream(int fd) {
   assert(fd == 1 || fd == 2);
-  switch (_getStdioHandleType(fd)) {
+  switch (_StdIOUtils._getStdioHandleType(fd)) {
     case _STDIO_HANDLE_TYPE_TERMINAL:
     case _STDIO_HANDLE_TYPE_PIPE:
     case _STDIO_HANDLE_TYPE_SOCKET:
       Socket s = new _Socket._internalWriteOnly();
-      _getStdioHandle(s, fd);
+      _StdIOUtils._getStdioHandle(s, fd);
       s._closed = false;
       return s.outputStream;
     case _STDIO_HANDLE_TYPE_FILE:
@@ -72,5 +72,8 @@
   return _stderr;
 }
 
-_getStdioHandle(Socket socket, int num) native "Socket_GetStdioHandle";
-_getStdioHandleType(int num) native "File_GetStdioHandleType";
+
+class _StdIOUtils {
+  external static _getStdioHandle(Socket socket, int num);
+  external static _getStdioHandleType(int num);
+}
diff --git a/runtime/bin/stream_util.dart b/lib/io/stream_util.dart
similarity index 97%
rename from runtime/bin/stream_util.dart
rename to lib/io/stream_util.dart
index fc6ee1f..1500181 100644
--- a/runtime/bin/stream_util.dart
+++ b/lib/io/stream_util.dart
@@ -2,8 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-class _BaseDataInputStream {
-  abstract int available();
+abstract class _BaseDataInputStream {
+  int available();
 
   List<int> read([int len]) {
     if (_closeCallbackCalled || _scheduledCloseCallback != null) return null;
@@ -65,7 +65,7 @@
     }
   }
 
-  abstract List<int> _read(int bytesToRead);
+  List<int> _read(int bytesToRead);
 
   void _dataReceived() {
     // More data has been received asynchronously. Perform the data
diff --git a/runtime/bin/string_stream.dart b/lib/io/string_stream.dart
similarity index 95%
rename from runtime/bin/string_stream.dart
rename to lib/io/string_stream.dart
index 9cb9e29..5d71af4 100644
--- a/runtime/bin/string_stream.dart
+++ b/lib/io/string_stream.dart
@@ -30,6 +30,9 @@
   // no line break is present. The line break character sequence is
   // discarded.
   String get decodedLine;
+
+  // Set the handler that will be called if an error ocurs while decoding.
+  void set onError(Function callback);
 }
 
 
@@ -61,7 +64,7 @@
 
 // Utility class for decoding UTF-8 from data delivered as a stream of
 // bytes.
-class _StringDecoderBase implements _StringDecoder {
+abstract class _StringDecoderBase implements _StringDecoder {
   _StringDecoderBase()
       : _bufferList = new _BufferList(),
         _result = new List<int>(),
@@ -154,7 +157,7 @@
     _resultOffset = 0;
   }
 
-  abstract bool _processNext();
+  bool _processNext();
 
   _BufferList _bufferList;
   int _resultOffset = 0;
@@ -166,6 +169,7 @@
   int _charOffset = 0;  // Character number of the first character in the list.
   int _charCount = 0;  // Total number of characters decoded.
   int _lastCharCode = -1;
+  Function onError;
 
   final int LF = 10;
   final int CR = 13;
@@ -221,7 +225,13 @@
     while (_bufferList.length > 0) {
       int byte = _bufferList.next();
       if (byte > 127) {
-        throw new DecoderException("Illegal ASCII character $byte");
+        var error = new DecoderException("Illegal ASCII character $byte");
+        if (onError != null) {
+          onError(error);
+          return false;
+        } else {
+          throw error;
+        }
       }
       addChar(byte);
     }
@@ -409,6 +419,11 @@
 
   void set onError(void callback(e)) {
     _input.onError = callback;
+    _decoder.onError = (e) { 
+      _clientCloseHandler = null;
+      _input.close();
+      callback(e);
+    };
   }
 
   void _onData() {
@@ -425,9 +440,8 @@
 
   void _onClosed() {
     _inputClosed = true;
-    if (_decoder.isEmpty && _clientCloseHandler != null) {
+    if (_decoder.isEmpty && _clientCloseHandler !=  null) {
       _clientCloseHandler();
-      _closed = true;
     } else {
       _checkScheduleCallback();
     }
diff --git a/runtime/bin/timer_impl.dart b/lib/io/timer_impl.dart
similarity index 100%
rename from runtime/bin/timer_impl.dart
rename to lib/io/timer_impl.dart
diff --git a/runtime/bin/websocket.dart b/lib/io/websocket.dart
similarity index 100%
rename from runtime/bin/websocket.dart
rename to lib/io/websocket.dart
diff --git a/runtime/bin/websocket_impl.dart b/lib/io/websocket_impl.dart
similarity index 99%
rename from runtime/bin/websocket_impl.dart
rename to lib/io/websocket_impl.dart
index 0d2089d..dfeb2ec 100644
--- a/runtime/bin/websocket_impl.dart
+++ b/lib/io/websocket_impl.dart
@@ -208,6 +208,7 @@
 
             // Hack - as we always do index++ below.
             index--;
+            break;
         }
 
         // Move to the next byte.
diff --git a/lib/mirrors/mirrors.dart b/lib/mirrors/mirrors.dart
index 88d9a7d..9a0fe0f 100644
--- a/lib/mirrors/mirrors.dart
+++ b/lib/mirrors/mirrors.dart
@@ -42,7 +42,7 @@
   IsolateMirror get isolate;
 
   /**
-   * A mirror on the [:Dynamic:] type.
+   * A mirror on the [:dynamic:] type.
    */
   TypeMirror get dynamicType;
 
diff --git a/lib/scalarlist/byte_arrays.dart b/lib/scalarlist/byte_arrays.dart
index cb3dd12..8789ec4 100644
--- a/lib/scalarlist/byte_arrays.dart
+++ b/lib/scalarlist/byte_arrays.dart
@@ -34,7 +34,7 @@
    * changes to the returned byte array are visible in this byte array
    * and vice-versa.
    *
-   * Throws [IndexOutOfRangeException] if [start] or [length] are negative, or
+   * Throws [RangeError] if [start] or [length] are negative, or
    * if `start + length` is greater than the length of this byte array.
    *
    * Throws [ArgumentError] if [length] is negative.
@@ -46,7 +46,7 @@
    * specified [byteOffset] in this byte array, in two's complement binary
    * representation. The return value will be between -128 and 127, inclusive.
    *
-   * Throws [IndexOutOfRangeException] if [byteOffset] is negative, or
+   * Throws [RangeError] if [byteOffset] is negative, or
    * greater than or equal to the length of this byte array.
    */
   int getInt8(int byteOffset);
@@ -61,7 +61,7 @@
    * array after the byte that was set by this call. This return value can
    * be passed as the [byteOffset] parameter to a subsequent `setXxx` call.
    *
-   * Throws [IndexOutOfRangeException] if [byteOffset] is negative, or
+   * Throws [RangeError] if [byteOffset] is negative, or
    * greater than or equal to the length of this byte array.
    *
    * Throws [ArgumentError] if [value] is less than -128 or
@@ -74,7 +74,7 @@
    * [byteOffset] in this byte array, in unsigned binary form. The
    * return value will be between 0 and 255, inclusive.
    *
-   * Throws [IndexOutOfRangeException] if [byteOffset] is negative, or
+   * Throws [RangeError] if [byteOffset] is negative, or
    * greater than or equal to the length of this byte array.
    */
   int getUint8(int byteOffset);
@@ -89,7 +89,7 @@
    * array after the byte that was set by this call. This return value can
    * be passed as the [byteOffset] parameter to a subsequent `setXxx` call.
    *
-   * Throws [IndexOutOfRangeException] if [byteOffset] is negative,
+   * Throws [RangeError] if [byteOffset] is negative,
    * or greater than or equal to the length of this byte array.
    *
    * Throws [ArgumentError] if [value] is negative or
@@ -103,7 +103,7 @@
    * form. The return value will be between 2<sup>15</sup> and 2<sup>15 - 1,
    * inclusive.
    *
-   * Throws [IndexOutOfRangeException] if [byteOffset] is negative, or
+   * Throws [RangeError] if [byteOffset] is negative, or
    * `byteOffset + 2` is greater than the length of this byte array.
    */
   int getInt16(int byteOffset);
@@ -118,7 +118,7 @@
    * array after the last byte that was set by this call. This return value can
    * be passed as the [byteOffset] parameter to a subsequent `setXxx` call.
    *
-   * Throws [IndexOutOfRangeException] if [byteOffset] is negative, or
+   * Throws [RangeError] if [byteOffset] is negative, or
    * `byteOffset + 2` is greater than the length of this byte array.
    *
    * Throws [ArgumentError] if [value] is less than 2<sup>15</sup>
@@ -131,7 +131,7 @@
    * at the specified [byteOffset] in this byte array, in unsigned binary
    * form. The return value will be between 0 and  2<sup>16 - 1, inclusive.
    *
-   * Throws [IndexOutOfRangeException] if [byteOffset] is negative, or
+   * Throws [RangeError] if [byteOffset] is negative, or
    * `byteOffset + 2` is greater than the length of this byte array.
    */
   int getUint16(int byteOffset);
@@ -146,7 +146,7 @@
    * array after the last byte that was set by this call. This return value can
    * be passed as the [byteOffset] parameter to a subsequent `setXxx` call.
    *
-   * Throws [IndexOutOfRangeException] if [byteOffset] is negative, or
+   * Throws [RangeError] if [byteOffset] is negative, or
    * `byteOffset + 2` is greater than the length of this byte array.
    *
    * Throws [ArgumentError] if [value] is negative or
@@ -160,7 +160,7 @@
    * form. The return value will be between 2<sup>31</sup> and 2<sup>31 - 1,
    * inclusive.
    *
-   * Throws [IndexOutOfRangeException] if [byteOffset] is negative, or
+   * Throws [RangeError] if [byteOffset] is negative, or
    * `byteOffset + 4` is greater than the length of this byte array.
    */
   int getInt32(int byteOffset);
@@ -175,7 +175,7 @@
    * array after the last byte that was set by this call. This return value can
    * be passed as the [byteOffset] parameter to a subsequent `setXxx` call.
    *
-   * Throws [IndexOutOfRangeException] if [byteOffset] is negative, or
+   * Throws [RangeError] if [byteOffset] is negative, or
    * `byteOffset + 4` is greater than the length of this byte array.
    *
    * Throws [ArgumentError] if [value] is less than 2<sup>31</sup>
@@ -201,7 +201,7 @@
    * array after the last byte that was set by this call. This return value can
    * be passed as the [byteOffset] parameter to a subsequent `setXxx` call.
    *
-   * Throws [IndexOutOfRangeException] if [byteOffset] is negative, or
+   * Throws [RangeError] if [byteOffset] is negative, or
    * `byteOffset + 4` is greater than the length of this byte array.
    *
    * Throws [ArgumentError] if [value] is negative or
@@ -215,7 +215,7 @@
    * form. The return value will be between 2<sup>63</sup> and 2<sup>63 - 1,
    * inclusive.
    *
-   * Throws [IndexOutOfRangeException] if [byteOffset] is negative, or
+   * Throws [RangeError] if [byteOffset] is negative, or
    * `byteOffset + 8` is greater than the length of this byte array.
    */
   int getInt64(int byteOffset);
@@ -230,7 +230,7 @@
    * array after the last byte that was set by this call. This return value can
    * be passed as the [byteOffset] parameter to a subsequent `setXxx` call.
    *
-   * Throws [IndexOutOfRangeException] if [byteOffset] is negative, or
+   * Throws [RangeError] if [byteOffset] is negative, or
    * `byteOffset + 8` is greater than the length of this byte array.
    *
    * Throws [ArgumentError] if [value] is less than 2<sup>63</sup>
@@ -243,7 +243,7 @@
    * at the specified [byteOffset] in this byte array, in unsigned binary
    * form. The return value will be between 0 and  2<sup>64 - 1, inclusive.
    *
-   * Throws [IndexOutOfRangeException] if [byteOffset] is negative, or
+   * Throws [RangeError] if [byteOffset] is negative, or
    * `byteOffset + 8` is greater than the length of this byte array.
    */
   int getUint64(int byteOffset);
@@ -258,7 +258,7 @@
    * array after the last byte that was set by this call. This return value can
    * be passed as the [byteOffset] parameter to a subsequent `setXxx` call.
    *
-   * Throws [IndexOutOfRangeException] if [byteOffset] is negative, or
+   * Throws [RangeError] if [byteOffset] is negative, or
    * `byteOffset + 8` is greater than the length of this byte array.
    *
    * Throws [ArgumentError] if [value] is negative or
@@ -271,7 +271,7 @@
    * the specified [byteOffset] in this byte array, in IEEE 754
    * single-precision binary floating-point format (binary32).
    *
-   * Throws [IndexOutOfRangeException] if [byteOffset] is negative, or
+   * Throws [RangeError] if [byteOffset] is negative, or
    * `byteOffset + 4` is greater than the length of this byte array.
    */
   double getFloat32(int byteOffset);
@@ -294,7 +294,7 @@
    * array after the last byte that was set by this call. This return value can
    * be passed as the [byteOffset] parameter to a subsequent `setXxx` call.
    *
-   * Throws [IndexOutOfRangeException] if [byteOffset] is negative, or
+   * Throws [RangeError] if [byteOffset] is negative, or
    * `byteOffset + 4` is greater than the length of this byte array.
    */
   int setFloat32(int byteOffset, double value);
@@ -304,7 +304,7 @@
    * the specified [byteOffset] in this byte array, in IEEE 754
    * double-precision binary floating-point format (binary64).
    *
-   * Throws [IndexOutOfRangeException] if [byteOffset] is negative, or
+   * Throws [RangeError] if [byteOffset] is negative, or
    * `byteOffset + 8` is greater than the length of this byte array.
    */
   double getFloat64(int byteOffset);
@@ -318,7 +318,7 @@
    * array after the last byte that was set by this call. This return value can
    * be passed as the [byteOffset] parameter to a subsequent `setXxx` call.
    *
-   * Throws [IndexOutOfRangeException] if [byteOffset] is negative, or
+   * Throws [RangeError] if [byteOffset] is negative, or
    * `byteOffset + 8` is greater than the length of this byte array.
    */
   int setFloat64(int byteOffset, double value);
diff --git a/lib/utf/utf_core.dart b/lib/utf/utf_core.dart
index 2cf5110..fb9e0e4 100644
--- a/lib/utf/utf_core.dart
+++ b/lib/utf/utf_core.dart
@@ -219,13 +219,13 @@
       this._offset = offset,
       this._length = (length == null ? source.length - offset : length) {
     if (_offset < 0 || _offset > _source.length) {
-      throw new IndexOutOfRangeException(_offset);
+      throw new RangeError.value(_offset);
     }
     if (_length != null && (_length < 0)) {
-      throw new IndexOutOfRangeException(_length);
+      throw new RangeError.value(_length);
     }
     if (_length + _offset > _source.length) {
-      throw new IndexOutOfRangeException(_length + _offset);
+      throw new RangeError.value(_length + _offset);
     }
   }
 
diff --git a/pkg/dartdoc/bin/dartdoc.dart b/pkg/dartdoc/bin/dartdoc.dart
old mode 100644
new mode 100755
index 5e7a9b0..25fc655
--- a/pkg/dartdoc/bin/dartdoc.dart
+++ b/pkg/dartdoc/bin/dartdoc.dart
@@ -14,13 +14,13 @@
  * members, finds the associated doc comments and builds crosslinked docs from
  * them.
  */
-#library('dartdoc');
+library dartdoc;
 
-#import('dart:io');
+import 'dart:io';
 
 // TODO(rnystrom): Use "package:" URL (#4968).
-#import('../lib/dartdoc.dart');
-#import('../../args/lib/args.dart');
+import '../lib/dartdoc.dart';
+import '../../args/lib/args.dart';
 
 /**
  * Run this from the `pkg/dartdoc` directory.
diff --git a/pkg/dartdoc/lib/classify.dart b/pkg/dartdoc/lib/classify.dart
index ce25044..0532a1e 100644
--- a/pkg/dartdoc/lib/classify.dart
+++ b/pkg/dartdoc/lib/classify.dart
@@ -2,11 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('classify');
+library classify;
 
-#import('../../../lib/compiler/implementation/scanner/scannerlib.dart');
+import '../../../lib/compiler/implementation/scanner/scannerlib.dart';
 // TODO(rnystrom): Use "package:" URL (#4968).
-#import('markdown.dart', prefix: 'md');
+import 'markdown.dart' as md;
 
 /**
  * Kinds of tokens that we care to highlight differently. The values of the
@@ -184,11 +184,11 @@
     // Color keyword token. Most are colored as keywords.
     case HASH_TOKEN:
     case KEYWORD_TOKEN:
-      if (token.stringValue === 'void') {
+      if (token.stringValue == 'void') {
         // Color "void" as a type.
         return Classification.TYPE_IDENTIFIER;
       }
-      if (token.stringValue === 'this' || token.stringValue === 'super') {
+      if (token.stringValue == 'this' || token.stringValue == 'super') {
         // Color "this" and "super" as identifiers.
         return Classification.SPECIAL_IDENTIFIER;
       }
diff --git a/pkg/dartdoc/lib/dartdoc.dart b/pkg/dartdoc/lib/dartdoc.dart
index 0fb159e..b4bdecb 100644
--- a/pkg/dartdoc/lib/dartdoc.dart
+++ b/pkg/dartdoc/lib/dartdoc.dart
@@ -14,27 +14,26 @@
  * members, finds the associated doc comments and builds crosslinked docs from
  * them.
  */
-#library('dartdoc');
+library dartdoc;
 
-#import('dart:io');
-#import('dart:math');
-#import('dart:uri');
-#import('dart:json');
+import 'dart:io';
+import 'dart:math';
+import 'dart:uri';
+import 'dart:json';
 
 // TODO(rnystrom): Use "package:" URL (#4968).
-#import('mirrors.dart');
-#import('mirrors_util.dart');
-#import('src/mirrors/dart2js_mirror.dart', prefix: 'dart2js');
-#import('classify.dart');
-#import('markdown.dart', prefix: 'md');
-#import('../../../lib/compiler/implementation/scanner/scannerlib.dart',
-        prefix: 'dart2js');
-#import('../../../lib/_internal/libraries.dart');
+import 'mirrors.dart';
+import 'mirrors_util.dart';
+import 'src/mirrors/dart2js_mirror.dart' as dart2js;
+import 'classify.dart';
+import 'markdown.dart' as md;
+import '../../../lib/compiler/implementation/scanner/scannerlib.dart' as dart2js;
+import '../../../lib/_internal/libraries.dart';
 
 // TODO(rnystrom): Use "package:" URL (#4968).
-#source('src/dartdoc/comment_map.dart');
-#source('src/dartdoc/nav.dart');
-#source('src/dartdoc/utils.dart');
+part 'src/dartdoc/comment_map.dart';
+part 'src/dartdoc/nav.dart';
+part 'src/dartdoc/utils.dart';
 
 /**
  * Generates completely static HTML containing everything you need to browse
@@ -227,7 +226,7 @@
   LibraryMirror _currentLibrary;
 
   /** The type that we're currently generating docs for. */
-  InterfaceMirror _currentType;
+  ClassMirror _currentType;
 
   /** The member that we're currently generating docs for. */
   MemberMirror _currentMember;
@@ -580,13 +579,13 @@
   void docLibraryNavigationJson(LibraryMirror library, List libraryList) {
     var libraryInfo = {};
     libraryInfo[NAME] = displayName(library);
-    final List members = docMembersJson(library.declaredMembers);
+    final List members = docMembersJson(library.members);
     if (!members.isEmpty) {
       libraryInfo[MEMBERS] = members;
     }
 
     final types = [];
-    for (InterfaceMirror type in orderByName(library.types.values)) {
+    for (ClassMirror type in orderByName(library.classes.values)) {
       if (!showPrivate && type.isPrivate) continue;
 
       var typeInfo = {};
@@ -599,14 +598,14 @@
         assert(type.isTypedef);
         typeInfo[KIND] = TYPEDEF;
       }
-      final List typeMembers = docMembersJson(type.declaredMembers);
+      final List typeMembers = docMembersJson(type.members);
       if (!typeMembers.isEmpty) {
         typeInfo[MEMBERS] = typeMembers;
       }
 
-      if (!type.declaration.typeVariables.isEmpty) {
+      if (!type.originalDeclaration.typeVariables.isEmpty) {
         final typeVariables = [];
-        for (final typeVariable in type.declaration.typeVariables) {
+        for (final typeVariable in type.originalDeclaration.typeVariables) {
           typeVariables.add(typeVariable.displayName);
         }
         typeInfo[ARGS] = Strings.join(typeVariables, ', ');
@@ -681,10 +680,10 @@
   /** Writes the navigation for the types contained by the given library. */
   void docLibraryNavigation(LibraryMirror library) {
     // Show the exception types separately.
-    final types = <InterfaceMirror>[];
-    final exceptions = <InterfaceMirror>[];
+    final types = <ClassMirror>[];
+    final exceptions = <ClassMirror>[];
 
-    for (InterfaceMirror type in orderByName(library.types.values)) {
+    for (ClassMirror type in orderByName(library.classes.values)) {
       if (!showPrivate && type.isPrivate) continue;
 
       if (isException(type)) {
@@ -703,7 +702,7 @@
   }
 
   /** Writes a linked navigation list item for the given type. */
-  void docTypeNavigation(InterfaceMirror type) {
+  void docTypeNavigation(ClassMirror type) {
     var icon = 'interface';
     if (type.simpleName.endsWith('Exception')) {
       icon = 'exception';
@@ -745,18 +744,23 @@
     docMembers(library);
 
     // Document the types.
-    final classes = <InterfaceMirror>[];
-    final interfaces = <InterfaceMirror>[];
+    final interfaces = <ClassMirror>[];
+    final abstractClasses = <ClassMirror>[];
+    final classes = <ClassMirror>[];
     final typedefs = <TypedefMirror>[];
-    final exceptions = <InterfaceMirror>[];
+    final exceptions = <ClassMirror>[];
 
-    for (InterfaceMirror type in orderByName(library.types.values)) {
+    for (ClassMirror type in orderByName(library.classes.values)) {
       if (!showPrivate && type.isPrivate) continue;
 
       if (isException(type)) {
         exceptions.add(type);
       } else if (type.isClass) {
-        classes.add(type);
+        if (type.isAbstract) {
+          abstractClasses.add(type);
+        } else {
+          classes.add(type);
+        }
       } else if (type.isInterface){
         interfaces.add(type);
       } else if (type is TypedefMirror) {
@@ -766,15 +770,16 @@
       }
     }
 
-    docTypes(classes, 'Classes');
     docTypes(interfaces, 'Interfaces');
+    docTypes(abstractClasses, 'Abstract Classes');
+    docTypes(classes, 'Classes');
     docTypes(typedefs, 'Typedefs');
     docTypes(exceptions, 'Exceptions');
 
     writeFooter();
     endFile();
 
-    for (final type in library.types.values) {
+    for (final type in library.classes.values) {
       if (!showPrivate && type.isPrivate) continue;
 
       docType(type);
@@ -800,7 +805,7 @@
     writeln('</div>');
   }
 
-  void docType(InterfaceMirror type) {
+  void docType(ClassMirror type) {
     if (verbose) {
       print('- ${type.simpleName}');
     }
@@ -859,7 +864,7 @@
    * an icon and the type's name. It's similar to how types appear in the
    * navigation, but is suitable for inline (as opposed to in a `<ul>`) use.
    */
-  void typeSpan(InterfaceMirror type) {
+  void typeSpan(ClassMirror type) {
     var icon = 'interface';
     if (type.simpleName.endsWith('Exception')) {
       icon = 'exception';
@@ -881,7 +886,7 @@
    * subclasses, superclasses, subinterfaces, superinferfaces, and default
    * class.
    */
-  void docInheritance(InterfaceMirror type) {
+  void docInheritance(ClassMirror type) {
     // Don't show the inheritance details for Object. It doesn't have any base
     // class (obviously) and it has too many subclasses to be useful.
     if (type.isObject) return;
@@ -940,15 +945,15 @@
       }
 
       listTypes(subtypes, 'Subclasses');
-      listTypes(type.interfaces, 'Implements');
+      listTypes(type.superinterfaces, 'Implements');
     } else {
       // Show the default class.
-      if (type.defaultType != null) {
-        listTypes([type.defaultType], 'Default class');
+      if (type.defaultFactory != null) {
+        listTypes([type.defaultFactory], 'Default class');
       }
 
       // List extended interfaces.
-      listTypes(type.interfaces, 'Extends');
+      listTypes(type.superinterfaces, 'Extends');
 
       // List subinterfaces and implementing classes.
       final subinterfaces = [];
@@ -981,7 +986,7 @@
     }
 
     write('typedef ');
-    annotateType(type, type.definition, type.simpleName);
+    annotateType(type, type.value, type.simpleName);
 
     write(''' <a class="anchor-link" href="#${type.simpleName}"
               title="Permalink to ${type.simpleName}">#</a>''');
@@ -1012,7 +1017,7 @@
     return map;
   }();
 
-  void docMembers(ObjectMirror host) {
+  void docMembers(ContainerMirror host) {
     // Collect the different kinds of members.
     final staticMethods = [];
     final staticGetters = new Map<String,MemberMirror>();
@@ -1024,7 +1029,7 @@
     final instanceSetters = new Map<String,MemberMirror>();
     final constructors = [];
 
-    host.declaredMembers.forEach((_, MemberMirror member) {
+    host.members.forEach((_, MemberMirror member) {
       if (!showPrivate && member.isPrivate) return;
       if (host is LibraryMirror || member.isStatic) {
         if (member is MethodMirror) {
@@ -1035,23 +1040,23 @@
           } else {
             staticMethods.add(member);
           }
-        } else if (member is FieldMirror) {
+        } else if (member is VariableMirror) {
           staticGetters[member.displayName] = member;
         }
       }
     });
 
-    if (host is InterfaceMirror) {
+    if (host is ClassMirror) {
       var iterable = new HierarchyIterable(host, includeType: true);
-      for (InterfaceMirror type in iterable) {
+      for (ClassMirror type in iterable) {
         if (!host.isObject && !inheritFromObject && type.isObject) continue;
 
-        type.declaredMembers.forEach((_, MemberMirror member) {
+        type.members.forEach((_, MemberMirror member) {
           if (member.isStatic) return;
           if (!showPrivate && member.isPrivate) return;
 
           bool inherit = true;
-          if (type !== host) {
+          if (type != host) {
             if (member.isPrivate) {
               // Don't inherit private members.
               inherit = false;
@@ -1083,28 +1088,28 @@
       if (member is MethodMirror) {
         if (member.isGetter) {
           instanceGetters[member.displayName] = member;
-          if (member.surroundingDeclaration == host) {
+          if (member.owner == host) {
             allPropertiesInherited = false;
           }
         } else if (member.isSetter) {
           instanceSetters[member.displayName] = member;
-          if (member.surroundingDeclaration == host) {
+          if (member.owner == host) {
             allPropertiesInherited = false;
           }
         } else if (member.isOperator) {
           instanceOperators.add(member);
-          if (member.surroundingDeclaration == host) {
+          if (member.owner == host) {
             allOperatorsInherited = false;
           }
         } else {
           instanceMethods.add(member);
-          if (member.surroundingDeclaration == host) {
+          if (member.owner == host) {
             allMethodsInherited = false;
           }
         }
-      } else if (member is FieldMirror) {
+      } else if (member is VariableMirror) {
         instanceGetters[member.displayName] = member;
-        if (member.surroundingDeclaration == host) {
+        if (member.owner == host) {
           allPropertiesInherited = false;
         }
       }
@@ -1135,7 +1140,7 @@
   /**
    * Documents fields, getters, and setters as properties.
    */
-  void docProperties(ObjectMirror host, String title,
+  void docProperties(ContainerMirror host, String title,
                      Map<String,MemberMirror> getters,
                      Map<String,MemberMirror> setters,
                      {bool allInherited}) {
@@ -1154,7 +1159,7 @@
       MemberMirror getter = getters[name];
       MemberMirror setter = setters[name];
       if (setter == null) {
-        if (getter is FieldMirror) {
+        if (getter is VariableMirror) {
           // We have a field.
           docField(host, getter);
         } else {
@@ -1169,17 +1174,17 @@
       } else {
         DocComment getterComment = getMemberComment(getter);
         DocComment setterComment = getMemberComment(setter);
-        if (getter.surroundingDeclaration !== setter.surroundingDeclaration ||
+        if (getter.owner != setter.owner ||
             getterComment != null && setterComment != null) {
           // Both have comments or are not declared in the same class
           // => Documents separately.
-          if (getter is FieldMirror) {
+          if (getter is VariableMirror) {
             // Document field as a getter (setter is inherited).
             docField(host, getter, asGetter: true);
           } else {
             docMethod(host, getter);
           }
-          if (setter is FieldMirror) {
+          if (setter is VariableMirror) {
             // Document field as a setter (getter is inherited).
             docField(host, setter, asSetter: true);
           } else {
@@ -1194,7 +1199,7 @@
     writeln('</div>');
   }
 
-  void docMethods(ObjectMirror host, String title, List<MethodMirror> methods,
+  void docMethods(ContainerMirror host, String title, List<MethodMirror> methods,
                   {bool allInherited}) {
     if (methods.length > 0) {
       writeln('<div${allInherited ? ' class="inherited"' : ''}>');
@@ -1212,14 +1217,14 @@
    * [FieldMirror] it is documented as a getter or setter depending upon the
    * value of [asGetter].
    */
-  void docMethod(ObjectMirror host, MemberMirror member,
+  void docMethod(ContainerMirror host, MemberMirror member,
                  {bool asGetter: false}) {
     _totalMembers++;
     _currentMember = member;
 
     bool isAbstract = false;
     String name = member.displayName;
-    if (member is FieldMirror) {
+    if (member is VariableMirror) {
       if (asGetter) {
         // Getter.
         name = 'get $name';
@@ -1240,7 +1245,7 @@
     }
 
     bool showCode = includeSource && !isAbstract;
-    bool inherited = host != member.surroundingDeclaration;
+    bool inherited = host != member.owner;
 
     writeln('<div class="method${inherited ? ' inherited': ''}">'
             '<h4 id="${memberAnchor(member)}">');
@@ -1251,10 +1256,10 @@
 
     if (member is MethodMirror) {
       if (member.isConstructor) {
-        if (member.isFactory) {
+        if (member.isFactoryConstructor) {
           write('factory ');
         } else {
-          write(member.isConst ? 'const ' : 'new ');
+          write(member.isConstConstructor ? 'const ' : 'new ');
         }
       } else if (member.isAbstract) {
         write('abstract ');
@@ -1264,7 +1269,7 @@
         annotateType(host, member.returnType);
       }
     } else {
-      assert(member is FieldMirror);
+      assert(member is VariableMirror);
       if (asGetter) {
         annotateType(host, member.type);
       } else {
@@ -1279,7 +1284,7 @@
         docParamList(host, member.parameters);
       }
     } else {
-      assert(member is FieldMirror);
+      assert(member is VariableMirror);
       if (!asGetter) {
         write('(');
         annotateType(host, member.type);
@@ -1294,7 +1299,7 @@
 
     if (inherited) {
       write('<div class="inherited-from">inherited from ');
-      annotateType(host, member.surroundingDeclaration);
+      annotateType(host, member.owner);
       write('</div>');
     }
 
@@ -1308,7 +1313,7 @@
     writeln('</div>');
   }
 
-  void docField(ObjectMirror host, FieldMirror field,
+  void docField(ContainerMirror host, VariableMirror field,
                 {bool asGetter: false, bool asSetter: false}) {
     if (asGetter) {
       docMethod(host, field, asGetter: true);
@@ -1325,13 +1330,13 @@
    * Otherwise, if [getter] is a [MethodMirror], the property is considered
    * final if [setter] is [:null:].
    */
-  void docProperty(ObjectMirror host,
+  void docProperty(ContainerMirror host,
                    MemberMirror getter, MemberMirror setter) {
     assert(getter != null);
     _totalMembers++;
     _currentMember = getter;
 
-    bool inherited = host != getter.surroundingDeclaration;
+    bool inherited = host != getter.owner;
 
     writeln('<div class="field${inherited ? ' inherited' : ''}">'
             '<h4 id="${memberAnchor(getter)}">');
@@ -1343,7 +1348,7 @@
     bool isConst = false;
     bool isFinal;
     TypeMirror type;
-    if (getter is FieldMirror) {
+    if (getter is VariableMirror) {
       assert(setter == null);
       isConst = getter.isConst;
       isFinal = getter.isFinal;
@@ -1374,7 +1379,7 @@
 
     if (inherited) {
       write('<div class="inherited-from">inherited from ');
-      annotateType(host, getter.surroundingDeclaration);
+      annotateType(host, getter.owner);
       write('</div>');
     }
 
@@ -1393,16 +1398,18 @@
     writeln('</div>');
   }
 
-  void docParamList(ObjectMirror enclosingType,
+  void docParamList(ContainerMirror enclosingType,
                     List<ParameterMirror> parameters) {
     write('(');
     bool first = true;
     bool inOptionals = false;
+    bool isNamed = false;
     for (final parameter in parameters) {
       if (!first) write(', ');
 
       if (!inOptionals && parameter.isOptional) {
-        write('[');
+        isNamed = parameter.isNamed;
+        write(isNamed ? '{' : '[');
         inOptionals = true;
       }
 
@@ -1410,20 +1417,22 @@
 
       // Show the default value for named optional parameters.
       if (parameter.isOptional && parameter.hasDefaultValue) {
-        write(' = ');
+        write(isNamed ? ': ' : ' = ');
         write(parameter.defaultValue);
       }
 
       first = false;
     }
 
-    if (inOptionals) write(']');
+    if (inOptionals) {
+      write(isNamed ? '}' : ']');
+    }
     write(')');
   }
 
-  void docComment(ObjectMirror host, DocComment comment) {
+  void docComment(ContainerMirror host, DocComment comment) {
     if (comment != null) {
-      if (comment.inheritedFrom !== null) {
+      if (comment.inheritedFrom != null) {
         writeln('<div class="inherited">');
         writeln(comment.html);
         write('<div class="docs-inherited-from">docs inherited from ');
@@ -1439,7 +1448,7 @@
   /**
    * Documents the source code contained within [location].
    */
-  void docCode(Location location) {
+  void docCode(SourceLocation location) {
     if (includeSource) {
       writeln('<pre class="source">');
       writeln(md.escapeHtml(unindentCode(location)));
@@ -1447,7 +1456,7 @@
     }
   }
 
-  DocComment createDocComment(String text, [InterfaceMirror inheritedFrom]) =>
+  DocComment createDocComment(String text, [ClassMirror inheritedFrom]) =>
       new DocComment(text, inheritedFrom);
 
 
@@ -1475,14 +1484,14 @@
    */
   DocComment getMemberComment(MemberMirror member) {
     String comment = _comments.find(member.location);
-    InterfaceMirror inheritedFrom = null;
+    ClassMirror inheritedFrom = null;
     if (comment == null) {
-      if (member.surroundingDeclaration is InterfaceMirror) {
+      if (member.owner is ClassMirror) {
         var iterable =
-            new HierarchyIterable(member.surroundingDeclaration,
+            new HierarchyIterable(member.owner,
                                   includeType: false);
-        for (InterfaceMirror type in iterable) {
-          var inheritedMember = type.declaredMembers[member.simpleName];
+        for (ClassMirror type in iterable) {
+          var inheritedMember = type.members[member.simpleName];
           if (inheritedMember is MemberMirror) {
             comment = _comments.find(inheritedMember.location);
             if (comment != null) {
@@ -1525,7 +1534,7 @@
   }
 
   /** Gets the URL for the documentation for [type]. */
-  String typeUrl(ObjectMirror type) {
+  String typeUrl(ContainerMirror type) {
     if (type is LibraryMirror) {
       return '${sanitize(type.simpleName)}.html';
     }
@@ -1534,12 +1543,12 @@
     // arguments. If the type isn't generic, genericType returns `this`, so it
     // works for non-generic types too.
     return '${sanitize(displayName(type.library))}/'
-           '${type.declaration.simpleName}.html';
+           '${type.originalDeclaration.simpleName}.html';
   }
 
   /** Gets the URL for the documentation for [member]. */
   String memberUrl(MemberMirror member) {
-    String url = typeUrl(member.surroundingDeclaration);
+    String url = typeUrl(member.owner);
     return '$url#${memberAnchor(member)}';
   }
 
@@ -1562,17 +1571,17 @@
   /**
    * Writes a type annotation for the given type and (optional) parameter name.
    */
-  annotateType(ObjectMirror enclosingType,
+  annotateType(ContainerMirror enclosingType,
                TypeMirror type,
                [String paramName = null]) {
     // Don't bother explicitly displaying Dynamic.
     if (type.isDynamic) {
-      if (paramName !== null) write(paramName);
+      if (paramName != null) write(paramName);
       return;
     }
 
     // For parameters, handle non-typedefed function types.
-    if (paramName !== null && type is FunctionTypeMirror) {
+    if (paramName != null && type is FunctionTypeMirror) {
       annotateType(enclosingType, type.returnType);
       write(paramName);
 
@@ -1583,11 +1592,11 @@
     linkToType(enclosingType, type);
 
     write(' ');
-    if (paramName !== null) write(paramName);
+    if (paramName != null) write(paramName);
   }
 
   /** Writes a link to a human-friendly string representation for a type. */
-  linkToType(ObjectMirror enclosingType, TypeMirror type) {
+  linkToType(ContainerMirror enclosingType, TypeMirror type) {
     if (type.isVoid) {
       // Do not generate links for void.
       // TODO(johnniwinter): Generate span for specific style?
@@ -1607,7 +1616,7 @@
       return;
     }
 
-    assert(type is InterfaceMirror);
+    assert(type is ClassMirror);
 
     // Link to the type.
     if (shouldLinkToPublicApi(type.library)) {
@@ -1618,7 +1627,7 @@
       write(type.simpleName);
     }
 
-    if (type.isDeclaration) {
+    if (type.isOriginalDeclaration) {
       // Avoid calling [:typeArguments():] on a declaration.
       return;
     }
@@ -1638,10 +1647,10 @@
   }
 
   /** Creates a linked cross reference to [type]. */
-  typeReference(InterfaceMirror type) {
+  typeReference(ClassMirror type) {
     // TODO(rnystrom): Do we need to handle ParameterTypes here like
     // annotation() does?
-    return a(typeUrl(type), typeName(type), css: 'crossref');
+    return a(typeUrl(type), typeName(type), 'crossref');
   }
 
   /** Generates a human-friendly string representation for a type. */
@@ -1652,16 +1661,16 @@
     if (type is TypeVariableMirror) {
       return type.simpleName;
     }
-    assert(type is InterfaceMirror);
+    assert(type is ClassMirror);
 
     // See if it's a generic type.
-    if (type.isDeclaration) {
+    if (type.isOriginalDeclaration) {
       final typeParams = [];
-      for (final typeParam in type.declaration.typeVariables) {
+      for (final typeParam in type.originalDeclaration.typeVariables) {
         if (showBounds &&
-            (typeParam.bound != null) &&
-            !typeParam.bound.isObject) {
-          final bound = typeName(typeParam.bound, showBounds: true);
+            (typeParam.upperBound != null) &&
+            !typeParam.upperBound.isObject) {
+          final bound = typeName(typeParam.upperBound, showBounds: true);
           typeParams.add('${typeParam.simpleName} extends $bound');
         } else {
           typeParams.add(typeParam.simpleName);
@@ -1678,7 +1687,7 @@
     final typeArgs = type.typeArguments;
     if (typeArgs.length > 0) {
       final args = Strings.join(typeArgs.map((arg) => typeName(arg)), ', ');
-      return '${type.declaration.simpleName}&lt;$args&gt;';
+      return '${type.originalDeclaration.simpleName}&lt;$args&gt;';
     }
 
     // Regular type.
@@ -1688,7 +1697,7 @@
   /**
    * Remove leading indentation to line up with first line.
    */
-  unindentCode(Location span) {
+  unindentCode(SourceLocation span) {
     final column = getLocationColumn(span);
     final lines = span.text.split('\n');
     // TODO(rnystrom): Dirty hack.
@@ -1703,7 +1712,7 @@
   /**
    * Takes a string of Dart code and turns it into sanitized HTML.
    */
-  formatCode(Location span) {
+  formatCode(SourceLocation span) {
     final code = unindentCode(span);
 
     // Syntax highlight.
@@ -1717,7 +1726,7 @@
    */
   md.Node resolveNameReference(String name,
                                {MemberMirror currentMember,
-                                ObjectMirror currentType,
+                                ContainerMirror currentType,
                                 LibraryMirror currentLibrary}) {
     makeLink(String href) {
       final anchor = new md.Element.text('a', name);
@@ -1739,7 +1748,7 @@
 
     // See if it's another member of the current type.
     if (currentType != null) {
-      final foundMember = currentType.declaredMembers[name];
+      final foundMember = currentType.members[name];
       if (foundMember != null) {
         return makeLink(memberUrl(foundMember));
       }
@@ -1754,7 +1763,7 @@
             new RegExp(r'new ([\w$]+)(?:\.([\w$]+))?').firstMatch(name);
         if (match == null) return;
         String typeName = match[1];
-        InterfaceMirror foundtype = currentLibrary.types[typeName];
+        ClassMirror foundtype = currentLibrary.classes[typeName];
         if (foundtype == null) return;
         String constructorName =
             (match[2] == null) ? typeName : '$typeName.${match[2]}';
@@ -1769,21 +1778,21 @@
       final foreignMemberLink = (() {
         final match = new RegExp(r'([\w$]+)\.([\w$]+)').firstMatch(name);
         if (match == null) return;
-        InterfaceMirror foundtype = currentLibrary.types[match[1]];
+        ClassMirror foundtype = currentLibrary.classes[match[1]];
         if (foundtype == null) return;
-        MemberMirror foundMember = foundtype.declaredMembers[match[2]];
+        MemberMirror foundMember = foundtype.members[match[2]];
         if (foundMember == null) return;
         return makeLink(memberUrl(foundMember));
       })();
       if (foreignMemberLink != null) return foreignMemberLink;
 
-      InterfaceMirror foundType = currentLibrary.types[name];
+      ClassMirror foundType = currentLibrary.classes[name];
       if (foundType != null) {
         return makeLink(typeUrl(foundType));
       }
 
       // See if it's a top-level member in the current library.
-      MemberMirror foundMember = currentLibrary.declaredMembers[name];
+      MemberMirror foundMember = currentLibrary.members[name];
       if (foundMember != null) {
         return makeLink(memberUrl(foundMember));
       }
@@ -1834,7 +1843,8 @@
    * Returns [:true:] if [type] should be regarded as an exception.
    */
   bool isException(TypeMirror type) {
-    return type.simpleName.endsWith('Exception');
+    return type.simpleName.endsWith('Exception') ||
+        type.simpleName.endsWith('Error');
   }
 }
 
@@ -1854,7 +1864,7 @@
   /**
    * Non-null if the comment is inherited from another declaration.
    */
-  final InterfaceMirror inheritedFrom;
+  final ClassMirror inheritedFrom;
 
   DocComment(this.text, [this.inheritedFrom = null]) {
     assert(text != null && !text.trim().isEmpty);
diff --git a/pkg/dartdoc/lib/markdown.dart b/pkg/dartdoc/lib/markdown.dart
index b58b1fd..8a3bd55 100644
--- a/pkg/dartdoc/lib/markdown.dart
+++ b/pkg/dartdoc/lib/markdown.dart
@@ -3,13 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 /// Parses text in a markdown-like format and renders to HTML.
-#library('markdown');
+library markdown;
 
 // TODO(rnystrom): Use "package:" URL (#4968).
-#source('src/markdown/ast.dart');
-#source('src/markdown/block_parser.dart');
-#source('src/markdown/html_renderer.dart');
-#source('src/markdown/inline_parser.dart');
+part 'src/markdown/ast.dart';
+part 'src/markdown/block_parser.dart';
+part 'src/markdown/html_renderer.dart';
+part 'src/markdown/inline_parser.dart';
 
 /// Converts the given string of markdown to HTML.
 String markdownToHtml(String markdown) {
diff --git a/pkg/dartdoc/lib/mirrors.dart b/pkg/dartdoc/lib/mirrors.dart
index d6a8010..6f49c95 100644
--- a/pkg/dartdoc/lib/mirrors.dart
+++ b/pkg/dartdoc/lib/mirrors.dart
@@ -2,18 +2,18 @@
 // for 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('mirrors');
+library mirrors;
 
-#import('dart:io');
-#import('dart:uri');
+import 'dart:io';
+import 'dart:uri';
 
 // TODO(rnystrom): Use "package:" URL (#4968).
-#import('src/mirrors/dart2js_mirror.dart');
+import 'src/mirrors/dart2js_mirror.dart';
 
 /**
  * [Compilation] encapsulates the compilation of a program.
  */
-class Compilation {
+abstract class Compilation {
   /**
    * Creates a new compilation which has [script] as its entry point.
    */
@@ -45,7 +45,7 @@
   /**
    * Returns a future for the compiled JavaScript code.
    */
-  abstract Future<String> compileToJavaScript();
+  Future<String> compileToJavaScript();
 }
 
 /**
@@ -56,6 +56,16 @@
    * Returns an unmodifiable map of all libraries in this mirror system.
    */
   Map<String, LibraryMirror> get libraries;
+
+  /**
+   * A mirror on the [:dynamic:] type.
+   */
+  TypeMirror get dynamicType;
+
+  /**
+   * A mirror on the [:void:] type.
+   */
+  TypeMirror get voidType;
 }
 
 
@@ -66,6 +76,13 @@
   static const String UNARY_MINUS = 'unary-';
 
   /**
+   * Returns the mirror system which contains this mirror.
+   */
+  MirrorSystem get mirrors;
+}
+
+abstract class DeclarationMirror implements Mirror {
+  /**
    * The simple name of the entity. The simple name is unique within the
    * scope of the entity declaration.
    *
@@ -97,41 +114,88 @@
   String get qualifiedName;
 
   /**
-   * Returns the mirror system which contains this mirror.
+   * The source location of this Dart language entity.
    */
-  MirrorSystem get system;
+  SourceLocation get location;
+
+  /**
+   * A mirror on the owner of this function. This is the declaration immediately
+   * surrounding the reflectee.
+   *
+   * Note that for libraries, the owner will be [:null:].
+   */
+  DeclarationMirror get owner;
+
+  /**
+   * Is this declaration private?
+   *
+   * Note that for libraries, this will be [:false:].
+   */
+  bool get isPrivate;
+
+  /**
+   * Is this declaration top-level?
+   *
+   * This is defined to be equivalent to:
+   *    [:mirror.owner != null && mirror.owner is LibraryMirror:]
+   */
+  bool get isTopLevel;
 }
 
 /**
- * Common interface for interface types and libraries.
+ * Common interface for classes and libraries.
  */
-abstract class ObjectMirror implements Mirror {
+abstract class ContainerMirror implements Mirror {
 
   /**
-   * Returns an unmodifiable map of the members of declared in this type or
-   * library.
+   * An immutable map from from names to mirrors for all members in this
+   * container.
    */
-  Map<String, MemberMirror> get declaredMembers;
+  Map<String, MemberMirror> get members;
 }
 
 /**
  * A library.
  */
-abstract class LibraryMirror extends ObjectMirror {
+abstract class LibraryMirror implements ContainerMirror, DeclarationMirror {
   /**
-   * The name of the library, as given in #library().
+   * An immutable map from from names to mirrors for all members in this
+   * library.
+   *
+   * The members of a library are its top-level classes, functions, variables,
+   * getters, and setters.
    */
-  String get simpleName;
+  Map<String, MemberMirror> get members;
 
   /**
-   * Returns an iterable over all types in the library.
+   * An immutable map from names to mirrors for all class
+   * declarations in this library.
    */
-  Map<String, InterfaceMirror> get types;
+  Map<String, ClassMirror> get classes;
 
   /**
-   * Returns the source location for this library.
+   * An immutable map from names to mirrors for all function, getter,
+   * and setter declarations in this library.
    */
-  Location get location;
+  Map<String, MethodMirror> get functions;
+
+  /**
+   * An immutable map from names to mirrors for all getter
+   * declarations in this library.
+   */
+  Map<String, MethodMirror> get getters;
+
+  /**
+   * An immutable map from names to mirrors for all setter
+   * declarations in this library.
+   */
+  Map<String, MethodMirror> get setters;
+
+  /**
+   * An immutable map from names to mirrors for all variable
+   * declarations in this library.
+   */
+  Map<String, VariableMirror> get variables;
 
   /**
    * Returns the canonical URI for this library.
@@ -142,12 +206,7 @@
 /**
  * Common interface for classes, interfaces, typedefs and type variables.
  */
-abstract class TypeMirror implements Mirror {
-  /**
-   * Returns the source location for this type.
-   */
-  Location get location;
-
+abstract class TypeMirror implements DeclarationMirror {
   /**
    * Returns the library in which this member resides.
    */
@@ -159,7 +218,7 @@
   bool get isObject;
 
   /**
-   * Is [:true:] iff this type is the [:Dynamic:] type.
+   * Is [:true:] iff this type is the [:dynamic:] type.
    */
   bool get isDynamic;
 
@@ -187,22 +246,28 @@
 /**
  * A class or interface type.
  */
-abstract class InterfaceMirror implements TypeMirror, ObjectMirror {
+abstract class ClassMirror implements TypeMirror, ContainerMirror {
   /**
-   * Returns the defining type, i.e. declaration of a type.
+   * A mirror on the original declaration of this type.
+   *
+   * For most classes, they are their own original declaration.  For
+   * generic classes, however, there is a distinction between the
+   * original class declaration, which has unbound type variables, and
+   * the instantiations of generic classes, which have bound type
+   * variables.
    */
-  InterfaceMirror get declaration;
+  ClassMirror get originalDeclaration;
 
   /**
    * Returns the super class of this type, or null if this type is [Object] or a
    * typedef.
    */
-  InterfaceMirror get superclass;
+  ClassMirror get superclass;
 
   /**
    * Returns a list of the interfaces directly implemented by this type.
    */
-  List<InterfaceMirror> get interfaces;
+  List<ClassMirror> get superinterfaces;
 
   /**
    * Is [:true:] iff this type is a class.
@@ -215,14 +280,15 @@
   bool get isInterface;
 
   /**
-   * Is [:true:] if this type is private.
+   * Is this the original declaration of this type?
+   *
+   * For most classes, they are their own original declaration.  For
+   * generic classes, however, there is a distinction between the
+   * original class declaration, which has unbound type variables, and
+   * the instantiations of generic classes, which have bound type
+   * variables.
    */
-  bool get isPrivate;
-
-  /**
-   * Is [:true:] if this type is the declaration of a type.
-   */
-  bool get isDeclaration;
+  bool get isOriginalDeclaration;
 
   /**
    * Is [:true:] if this class is declared abstract.
@@ -240,14 +306,52 @@
   List<TypeVariableMirror> get typeVariables;
 
   /**
-   * Returns an immutable map of the constructors in this interface.
+   * An immutable map from from names to mirrors for all members of
+   * this type.
+   *
+   * The members of a type are its methods, fields, getters, and
+   * setters.  Note that constructors and type variables are not
+   * considered to be members of a type.
+   *
+   * This does not include inherited members.
+   */
+  Map<String, MemberMirror> get members;
+
+  /**
+   * An immutable map from names to mirrors for all method,
+   * declarations for this type.  This does not include getters and
+   * setters.
+   */
+  Map<String, MethodMirror> get methods;
+
+  /**
+   * An immutable map from names to mirrors for all getter
+   * declarations for this type.
+   */
+  Map<String, MethodMirror> get getters;
+
+  /**
+   * An immutable map from names to mirrors for all setter
+   * declarations for this type.
+   */
+  Map<String, MethodMirror> get setters;
+
+  /**
+   * An immutable map from names to mirrors for all variable
+   * declarations for this type.
+   */
+  Map<String, VariableMirror> get variables;
+
+  /**
+   * An immutable map from names to mirrors for all constructor
+   * declarations for this type.
    */
   Map<String, MethodMirror> get constructors;
 
   /**
    * Returns the default type for this interface.
    */
-  InterfaceMirror get defaultType;
+  ClassMirror get defaultFactory;
 }
 
 /**
@@ -255,24 +359,15 @@
  */
 abstract class TypeVariableMirror implements TypeMirror {
   /**
-   * Return a mirror on the class, interface, or typedef that declared the
-   * type variable.
-   */
-  // Should not be called [declaration] as we then would have two [TypeMirror]
-  // subtypes ([InterfaceMirror] and [TypeVariableMirror]) which have
-  // [declaration()] methods but with different semantics.
-  InterfaceMirror get declarer;
-
-  /**
    * Returns the bound of the type parameter.
    */
-  TypeMirror get bound;
+  TypeMirror get upperBound;
 }
 
 /**
  * A function type.
  */
-abstract class FunctionTypeMirror implements InterfaceMirror {
+abstract class FunctionTypeMirror implements ClassMirror {
   /**
    * Returns the return type of this function type.
    */
@@ -292,35 +387,19 @@
 /**
  * A typedef.
  */
-abstract class TypedefMirror implements InterfaceMirror {
+abstract class TypedefMirror implements ClassMirror {
   /**
-   * Returns the defining type for this typedef. For instance [:void f(int):]
-   * for a [:typedef void f(int):].
+   * The defining type for this typedef.
+   *
+   * For instance [:void f(int):] for a [:typedef void f(int):].
    */
-  TypeMirror get definition;
+  TypeMirror get value;
 }
 
 /**
  * A member of a type, i.e. a field, method or constructor.
  */
-abstract class MemberMirror implements Mirror {
-  /**
-   * Returns the source location for this member.
-   */
-  Location get location;
-
-  /**
-   * Returns a mirror on the declaration immediately surrounding the reflectee.
-   * This could be a class, interface, library or another method or function.
-   */
-  ObjectMirror get surroundingDeclaration;
-
-  /**
-   * Returns true if this is a top level member, i.e. a member not within a
-   * type.
-   */
-  bool get isTopLevel;
-
+abstract class MemberMirror implements DeclarationMirror {
   /**
    * Returns true if this member is a constructor.
    */
@@ -337,11 +416,6 @@
   bool get isMethod;
 
   /**
-   * Returns true if this member is private.
-   */
-  bool get isPrivate;
-
-  /**
    * Returns true if this member is static.
    */
   bool get isStatic;
@@ -350,7 +424,7 @@
 /**
  * A field.
  */
-abstract class FieldMirror implements MemberMirror {
+abstract class VariableMirror implements MemberMirror {
 
   /**
    * Returns true if this field is final.
@@ -384,19 +458,38 @@
   TypeMirror get returnType;
 
   /**
-   * Is [:true:] if this method is declared abstract.
+   * Is the reflectee abstract?
    */
   bool get isAbstract;
 
   /**
-   * Is [:true:] if this method is a constant constructor.
+   * Is the reflectee a regular function or method?
+   *
+   * A function or method is regular if it is not a getter, setter, or
+   * constructor.  Note that operators, by this definition, are
+   * regular methods.
    */
-  bool get isConst;
+  bool get isRegularMethod;
 
   /**
-   * Is [:true:] if this method is a factory method.
+   * Is the reflectee a const constructor?
    */
-  bool get isFactory;
+  bool get isConstConstructor;
+
+  /**
+   * Is the reflectee a generative constructor?
+   */
+  bool get isGenerativeConstructor;
+
+  /**
+   * Is the reflectee a redirecting constructor?
+   */
+  bool get isRedirectingConstructor;
+
+  /**
+   * Is the reflectee a factory constructor?
+   */
+  bool get isFactoryConstructor;
 
   /**
    * Returns the constructor name for named constructors and factory methods,
@@ -429,7 +522,7 @@
 /**
  * A formal parameter.
  */
-abstract class ParameterMirror implements Mirror {
+abstract class ParameterMirror implements VariableMirror {
   /**
    * Returns the type of this parameter.
    */
@@ -441,16 +534,21 @@
   String get defaultValue;
 
   /**
-   * Returns true if this parameter has a default value.
+   * Does this parameter have a default value?
    */
   bool get hasDefaultValue;
 
   /**
-   * Returns true if this parameter is optional.
+   * Is this parameter optional?
    */
   bool get isOptional;
 
   /**
+   * Is this parameter named?
+   */
+  bool get isNamed;
+
+  /**
    * Returns [:true:] iff this parameter is an initializing formal of a
    * constructor. That is, if it is of the form [:this.x:] where [:x:] is a
    * field.
@@ -460,15 +558,15 @@
   /**
    * Returns the initialized field, if this parameter is an initializing formal.
    */
-  FieldMirror get initializedField;
+  VariableMirror get initializedField;
 }
 
 /**
- * A [Location] describes the span of an entity in Dart source code.
- * A [Location] should be the minimum span that encloses the declaration of the
- * mirrored entity.
+ * A [SourceLocation] describes the span of an entity in Dart source code.
+ * A [SourceLocation] should be the minimum span that encloses the declaration
+ * of the mirrored entity.
  */
-abstract class Location {
+abstract class SourceLocation {
   /**
    * The character position where the location begins.
    */
@@ -480,7 +578,7 @@
   int get end;
 
   /**
-   * Returns the [Source] in which this [Location] indexes.
+   * Returns the [Source] in which this [SourceLocation] indexes.
    * If [:loc:] is a location, [:loc.source().text()[loc.start]:] is where it
    * starts, and [:loc.source().text()[loc.end]:] is where it ends.
    */
diff --git a/pkg/dartdoc/lib/mirrors_util.dart b/pkg/dartdoc/lib/mirrors_util.dart
index 5ba6021..35fc16d 100644
--- a/pkg/dartdoc/lib/mirrors_util.dart
+++ b/pkg/dartdoc/lib/mirrors_util.dart
@@ -2,11 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('mirrors.util');
+library mirrors_util;
 
 // TODO(rnystrom): Use "package:" URL (#4968).
-#import('mirrors.dart');
-#import('../../../lib/compiler/implementation/util/characters.dart');
+import 'mirrors.dart';
+import '../../../lib/compiler/implementation/util/characters.dart';
 
 //------------------------------------------------------------------------------
 // Utility functions for using the Mirror API
@@ -16,24 +16,24 @@
  * Returns an iterable over the type declarations directly inheriting from
  * the declaration of this type.
  */
-Iterable<InterfaceMirror> computeSubdeclarations(InterfaceMirror type) {
-  type = type.declaration;
-  var subtypes = <InterfaceMirror>[];
-  type.system.libraries.forEach((_, library) {
-    for (InterfaceMirror otherType in library.types.values) {
+Iterable<ClassMirror> computeSubdeclarations(ClassMirror type) {
+  type = type.originalDeclaration;
+  var subtypes = <ClassMirror>[];
+  type.mirrors.libraries.forEach((_, library) {
+    for (ClassMirror otherType in library.classes.values) {
       var superClass = otherType.superclass;
-      if (superClass !== null) {
-        superClass = superClass.declaration;
-        if (type.library === superClass.library) {
+      if (superClass != null) {
+        superClass = superClass.originalDeclaration;
+        if (type.library == superClass.library) {
           if (superClass == type) {
              subtypes.add(otherType);
           }
         }
       }
-      final superInterfaces = otherType.interfaces;
-      for (InterfaceMirror superInterface in superInterfaces) {
-        superInterface = superInterface.declaration;
-        if (type.library === superInterface.library) {
+      final superInterfaces = otherType.superinterfaces;
+      for (ClassMirror superInterface in superInterfaces) {
+        superInterface = superInterface.originalDeclaration;
+        if (type.library == superInterface.library) {
           if (superInterface == type) {
             subtypes.add(otherType);
           }
@@ -45,7 +45,7 @@
 }
 
 LibraryMirror findLibrary(MemberMirror member) {
-  ObjectMirror owner = member.surroundingDeclaration;
+  ContainerMirror owner = member.owner;
   if (owner is LibraryMirror) {
     return owner;
   } else if (owner is TypeMirror) {
@@ -58,7 +58,7 @@
 /**
  * Returns the column of the start of a location.
  */
-int getLocationColumn(Location location) {
+int getLocationColumn(SourceLocation location) {
   String text = location.source.text;
   int index = location.start-1;
   var column = 0;
@@ -73,14 +73,14 @@
   return column;
 }
 
-class HierarchyIterable implements Iterable<InterfaceMirror> {
+class HierarchyIterable implements Iterable<ClassMirror> {
   final bool includeType;
-  final InterfaceMirror type;
+  final ClassMirror type;
 
   HierarchyIterable(this.type, {bool includeType})
       : this.includeType = includeType;
 
-  Iterator<InterfaceMirror> iterator() =>
+  Iterator<ClassMirror> iterator() =>
       new HierarchyIterator(type, includeType: includeType);
 }
 
@@ -93,11 +93,11 @@
  * visited in breadth first order and a superinterface is visited more than once
  * if implemented through multiple supertypes.
  */
-class HierarchyIterator implements Iterator<InterfaceMirror> {
-  final Queue<InterfaceMirror> queue = new Queue<InterfaceMirror>();
-  InterfaceMirror object;
+class HierarchyIterator implements Iterator<ClassMirror> {
+  final Queue<ClassMirror> queue = new Queue<ClassMirror>();
+  ClassMirror object;
 
-  HierarchyIterator(InterfaceMirror type, {bool includeType}) {
+  HierarchyIterator(ClassMirror type, {bool includeType}) {
     if (includeType) {
       queue.add(type);
     } else {
@@ -105,22 +105,22 @@
     }
   }
 
-  InterfaceMirror push(InterfaceMirror type) {
-    if (type.superclass !== null) {
+  ClassMirror push(ClassMirror type) {
+    if (type.superclass != null) {
       if (type.superclass.isObject) {
         object = type.superclass;
       } else {
         queue.addFirst(type.superclass);
       }
     }
-    queue.addAll(type.interfaces);
+    queue.addAll(type.superinterfaces);
     return type;
   }
 
-  InterfaceMirror next() {
-    InterfaceMirror type;
+  ClassMirror next() {
+    ClassMirror type;
     if (queue.isEmpty) {
-      if (object === null) {
+      if (object == null) {
         throw new StateError("No more elements");
       }
       type = object;
@@ -131,5 +131,5 @@
     }
   }
 
-  bool get hasNext => !queue.isEmpty || object !== null;
+  bool get hasNext => !queue.isEmpty || object != null;
 }
diff --git a/pkg/dartdoc/lib/src/client/client-live-nav.dart b/pkg/dartdoc/lib/src/client/client-live-nav.dart
index b3f405c..e1e8bfc 100644
--- a/pkg/dartdoc/lib/src/client/client-live-nav.dart
+++ b/pkg/dartdoc/lib/src/client/client-live-nav.dart
@@ -3,20 +3,20 @@
 // BSD-style license that can be found in the LICENSE file.
 
 /** Provides client-side behavior for generated docs. */
-#library('client-live-nav');
+library client_live_nav;
 
-#import('dart:html');
-#import('dart:json');
-#import('../../../../../lib/compiler/implementation/source_file.dart');
+import 'dart:html';
+import 'dart:json';
+import '../../../../../lib/compiler/implementation/source_file.dart';
 // TODO(rnystrom): Use "package:" URL (#4968).
-#import('../../classify.dart');
-#import('../../markdown.dart', prefix: 'md');
+import '../../classify.dart';
+import '../../markdown.dart' as md;
 
 // TODO(rnystrom): Use "package:" URL (#4968).
-#source('dropdown.dart');
-#source('search.dart');
-#source('../dartdoc/nav.dart');
-#source('client-shared.dart');
+part 'dropdown.dart';
+part 'search.dart';
+part '../dartdoc/nav.dart';
+part 'client-shared.dart';
 
 main() {
   setup();
diff --git a/pkg/dartdoc/lib/src/client/client-shared.dart b/pkg/dartdoc/lib/src/client/client-shared.dart
index a448ae2..03bb64c 100644
--- a/pkg/dartdoc/lib/src/client/client-shared.dart
+++ b/pkg/dartdoc/lib/src/client/client-shared.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+part of client_live_nav;
+
 // Code shared between the different client-side libraries.
 
 // The names of the library and type that this page documents.
diff --git a/pkg/dartdoc/lib/src/client/client-static.dart b/pkg/dartdoc/lib/src/client/client-static.dart
index ceda35e..5bca3b2 100644
--- a/pkg/dartdoc/lib/src/client/client-static.dart
+++ b/pkg/dartdoc/lib/src/client/client-static.dart
@@ -3,20 +3,20 @@
 // BSD-style license that can be found in the LICENSE file.
 
 /** Provides client-side behavior for generated docs using the static mode. */
-#library('client-static');
+library client_static;
 
-#import('dart:html');
-#import('dart:json');
-#import('../../../../../lib/compiler/implementation/source_file.dart');
+import 'dart:html';
+import 'dart:json';
+import '../../../../../lib/compiler/implementation/source_file.dart';
 // TODO(rnystrom): Use "package:" URL (#4968).
-#import('../../classify.dart');
+import '../../classify.dart';
 
 // TODO(rnystrom): Use "package:" URL (#4968).
-#source('dropdown.dart');
-#source('search.dart');
-#source('../dartdoc/nav.dart');
-#source('client-shared.dart');
-#source('../../../tmp/nav.dart');
+part 'dropdown.dart';
+part 'search.dart';
+part '../dartdoc/nav.dart';
+part 'client-shared.dart';
+part '../../../tmp/nav.dart';
 
 main() {
   setup();
diff --git a/pkg/dartdoc/lib/src/client/dropdown.dart b/pkg/dartdoc/lib/src/client/dropdown.dart
index 30d63fe..18a2320 100644
--- a/pkg/dartdoc/lib/src/client/dropdown.dart
+++ b/pkg/dartdoc/lib/src/client/dropdown.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+part of client_live_nav;
+
 List libraryList;
 InputElement searchInput;
 DivElement dropdown;
@@ -44,7 +46,7 @@
   } else {
     // Search all entities.
     var searchText = new SearchText(text);
-    for (Map<String,Dynamic> library in libraryList)  {
+    for (Map<String,dynamic> library in libraryList)  {
       matchLibrary(results, searchText, library);
       matchLibraryMembers(results, searchText, library);
       matchTypes(results, searchText, library);
@@ -81,13 +83,13 @@
 
 void matchAllMembers(List<Result> results, String memberText) {
   var searchText = new SearchText(memberText);
-  for (Map<String,Dynamic> library in libraryList)  {
+  for (Map<String,dynamic> library in libraryList)  {
     String libraryName = library[NAME];
     if (library.containsKey(TYPES)) {
-      for (Map<String,Dynamic> type in library[TYPES]) {
+      for (Map<String,dynamic> type in library[TYPES]) {
         String typeName = type[NAME];
         if (type.containsKey(MEMBERS)) {
-          for (Map<String,Dynamic> member in type[MEMBERS]) {
+          for (Map<String,dynamic> member in type[MEMBERS]) {
             StringMatch memberMatch = obtainMatch(searchText, member[NAME]);
             if (memberMatch != null) {
               results.add(new Result(memberMatch, member[KIND],
@@ -106,15 +108,15 @@
                            String typeText, String memberText) {
   var searchText = new SearchText(typeText);
   var emptyText = new SearchText(memberText);
-  for (Map<String,Dynamic> library in libraryList)  {
+  for (Map<String,dynamic> library in libraryList)  {
     String libraryName = library[NAME];
     if (library.containsKey(TYPES)) {
-      for (Map<String,Dynamic> type in library[TYPES]) {
+      for (Map<String,dynamic> type in library[TYPES]) {
         String typeName = type[NAME];
         StringMatch typeMatch = obtainMatch(searchText, typeName);
         if (typeMatch != null) {
           if (type.containsKey(MEMBERS)) {
-            for (Map<String,Dynamic> member in type[MEMBERS]) {
+            for (Map<String,dynamic> member in type[MEMBERS]) {
               StringMatch memberMatch = obtainMatch(emptyText,
                   member[NAME]);
               results.add(new Result(memberMatch, member[KIND],
@@ -134,15 +136,15 @@
   var searchText = new SearchText(text);
   var typeSearchText = new SearchText(typeText);
   var memberSearchText = new SearchText(memberText);
-  for (Map<String,Dynamic> library in libraryList)  {
+  for (Map<String,dynamic> library in libraryList)  {
     String libraryName = library[NAME];
     if (library.containsKey(TYPES)) {
-      for (Map<String,Dynamic> type in library[TYPES]) {
+      for (Map<String,dynamic> type in library[TYPES]) {
         String typeName = type[NAME];
         StringMatch typeMatch = obtainMatch(typeSearchText, typeName);
         if (typeMatch != null) {
           if (type.containsKey(MEMBERS)) {
-            for (Map<String,Dynamic> member in type[MEMBERS]) {
+            for (Map<String,dynamic> member in type[MEMBERS]) {
               // Check for constructor match.
               StringMatch constructorMatch = obtainMatch(searchText,
                   member[NAME]);
@@ -182,7 +184,7 @@
                           Map library) {
   if (library.containsKey(MEMBERS)) {
     String libraryName = library[NAME];
-    for (Map<String,Dynamic> member in library[MEMBERS]) {
+    for (Map<String,dynamic> member in library[MEMBERS]) {
       StringMatch memberMatch = obtainMatch(searchText, member[NAME]);
       if (memberMatch != null) {
         results.add(new Result(memberMatch, member[KIND],
@@ -197,7 +199,7 @@
                 Map library) {
   if (library.containsKey(TYPES)) {
     String libraryName = library[NAME];
-    for (Map<String,Dynamic> type in library[TYPES]) {
+    for (Map<String,dynamic> type in library[TYPES]) {
       String typeName = type[NAME];
       matchType(results, searchText, libraryName, type);
       matchTypeMembers(results, searchText, libraryName, type);
@@ -220,7 +222,7 @@
                       String libraryName, Map type) {
   if (type.containsKey(MEMBERS)) {
     String typeName = type[NAME];
-    for (Map<String,Dynamic> member in type[MEMBERS]) {
+    for (Map<String,dynamic> member in type[MEMBERS]) {
       StringMatch memberMatch = obtainMatch(searchText, member[NAME]);
       if (memberMatch != null) {
         results.add(new Result(memberMatch, member[KIND],
diff --git a/pkg/dartdoc/lib/src/client/search.dart b/pkg/dartdoc/lib/src/client/search.dart
index d9b0da1..22d283d 100644
--- a/pkg/dartdoc/lib/src/client/search.dart
+++ b/pkg/dartdoc/lib/src/client/search.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+part of client_live_nav;
+
 /**
  * [SearchText] represent the search field text. The text is viewed in three
  * ways: [text] holds the original search text, used for performing
diff --git a/pkg/dartdoc/lib/src/dartdoc/comment_map.dart b/pkg/dartdoc/lib/src/dartdoc/comment_map.dart
index f4ddf5f..25240d4 100644
--- a/pkg/dartdoc/lib/src/dartdoc/comment_map.dart
+++ b/pkg/dartdoc/lib/src/dartdoc/comment_map.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+part of dartdoc;
+
 /**
  * The cached lookup-table to associate doc comments with spans. The outer map
  * is from filenames to doc comments in that file. The inner map maps from the
@@ -28,7 +30,7 @@
    *
    * If a comment is returned, it is guaranteed to be non-empty.
    */
-  String find(Location span) {
+  String find(SourceLocation span) {
     if (span == null) return null;
 
     _ensureFileParsed(span.source);
diff --git a/pkg/dartdoc/lib/src/dartdoc/nav.dart b/pkg/dartdoc/lib/src/dartdoc/nav.dart
index 9bb7668..ec9c7f9 100644
--- a/pkg/dartdoc/lib/src/dartdoc/nav.dart
+++ b/pkg/dartdoc/lib/src/dartdoc/nav.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+part of dartdoc;
+
 /*
  * Constant values used for encoding navigation info.
  *
diff --git a/pkg/dartdoc/lib/src/dartdoc/utils.dart b/pkg/dartdoc/lib/src/dartdoc/utils.dart
index c70e166..cb52f96 100644
--- a/pkg/dartdoc/lib/src/dartdoc/utils.dart
+++ b/pkg/dartdoc/lib/src/dartdoc/utils.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+part of dartdoc;
+
 // Generic utility functions.
 
 /** Turns [name] into something that's safe to use as a file name. */
@@ -29,7 +31,7 @@
   final buffer = new StringBuffer();
   for (int i = 0; i < count; i++) {
     buffer.add(text);
-    if ((i < count - 1) && (separator !== null)) buffer.add(separator);
+    if ((i < count - 1) && (separator != null)) buffer.add(separator);
   }
 
   return buffer.toString();
diff --git a/pkg/dartdoc/lib/src/markdown/ast.dart b/pkg/dartdoc/lib/src/markdown/ast.dart
index 103e46d..c966cea 100644
--- a/pkg/dartdoc/lib/src/markdown/ast.dart
+++ b/pkg/dartdoc/lib/src/markdown/ast.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+part of markdown;
+
 /// Base class for any AST item. Roughly corresponds to Node in the DOM. Will
 /// be either an Element or Text.
 abstract class Node {
diff --git a/pkg/dartdoc/lib/src/markdown/block_parser.dart b/pkg/dartdoc/lib/src/markdown/block_parser.dart
index 79d9e69..3487900 100644
--- a/pkg/dartdoc/lib/src/markdown/block_parser.dart
+++ b/pkg/dartdoc/lib/src/markdown/block_parser.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+part of markdown;
+
 /// The line contains only whitespace or is empty.
 const _RE_EMPTY = const RegExp(r'^([ \t]*)$');
 
@@ -80,7 +82,7 @@
   }
 }
 
-class BlockSyntax {
+abstract class BlockSyntax {
   /// Gets the collection of built-in block parsers. To turn a series of lines
   /// into blocks, each of these will be tried in turn. Order matters here.
   static List<BlockSyntax> get syntaxes {
@@ -114,7 +116,7 @@
     return pattern.firstMatch(parser.current) != null;
   }
 
-  abstract Node parse(BlockParser parser);
+  Node parse(BlockParser parser);
 
   List<String> parseChildLines(BlockParser parser) {
     // Grab all of the lines that form the blockquote, stripping off the ">".
@@ -259,10 +261,10 @@
 }
 
 /// Base class for both ordered and unordered lists.
-class ListSyntax extends BlockSyntax {
+abstract class ListSyntax extends BlockSyntax {
   bool get canEndBlock => false;
 
-  abstract String get listTag;
+  String get listTag;
 
   Node parse(BlockParser parser) {
     final items = <ListItem>[];
diff --git a/pkg/dartdoc/lib/src/markdown/html_renderer.dart b/pkg/dartdoc/lib/src/markdown/html_renderer.dart
index 70d4239..c25db6f 100644
--- a/pkg/dartdoc/lib/src/markdown/html_renderer.dart
+++ b/pkg/dartdoc/lib/src/markdown/html_renderer.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+part of markdown;
+
 String renderToHtml(List<Node> nodes) => new HtmlRenderer().render(nodes);
 
 /// Translates a parsed AST to HTML.
diff --git a/pkg/dartdoc/lib/src/markdown/inline_parser.dart b/pkg/dartdoc/lib/src/markdown/inline_parser.dart
index a958888..af42e3e 100644
--- a/pkg/dartdoc/lib/src/markdown/inline_parser.dart
+++ b/pkg/dartdoc/lib/src/markdown/inline_parser.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+part of markdown;
+
 /// Maintains the internal state needed to parse inline span elements in
 /// markdown.
 class InlineParser {
@@ -148,7 +150,7 @@
 }
 
 /// Represents one kind of markdown tag that can be parsed.
-class InlineSyntax {
+abstract class InlineSyntax {
   final RegExp pattern;
 
   InlineSyntax(String pattern)
@@ -168,7 +170,7 @@
     return false;
   }
 
-  abstract bool onMatch(InlineParser parser, Match match);
+  bool onMatch(InlineParser parser, Match match);
 }
 
 /// Matches stuff that should just be passed through as straight text.
diff --git a/pkg/dartdoc/lib/src/mirrors/dart2js_mirror.dart b/pkg/dartdoc/lib/src/mirrors/dart2js_mirror.dart
index 995fcba..7523ad6 100644
--- a/pkg/dartdoc/lib/src/mirrors/dart2js_mirror.dart
+++ b/pkg/dartdoc/lib/src/mirrors/dart2js_mirror.dart
@@ -42,13 +42,14 @@
   Link<Element> link = signature.requiredParameters;
   while (!link.isEmpty) {
     parameters.add(new Dart2JsParameterMirror(
-        system, method, link.head, false));
+        system, method, link.head, false, false));
     link = link.tail;
   }
   link = signature.optionalParameters;
+  bool isNamed = signature.optionalParametersAreNamed;
   while (!link.isEmpty) {
     parameters.add(new Dart2JsParameterMirror(
-        system, method, link.head, true));
+        system, method, link.head, true, isNamed));
     link = link.tail;
   }
   return parameters;
@@ -59,10 +60,10 @@
     DartType type,
     InterfaceType defaultType,
     [FunctionSignature functionSignature]) {
-  if (type === null) {
+  if (type == null) {
     return new Dart2JsInterfaceTypeMirror(system, defaultType);
   } else if (type is InterfaceType) {
-    if (type === system.compiler.types.dynamicType) {
+    if (type == system.compiler.types.dynamicType) {
       return new Dart2JsDynamicMirror(system, type);
     } else {
       return new Dart2JsInterfaceTypeMirror(system, type);
@@ -80,7 +81,7 @@
 }
 
 Collection<Dart2JsMemberMirror> _convertElementMemberToMemberMirrors(
-    Dart2JsObjectMirror library, Element element) {
+    Dart2JsContainerMirror library, Element element) {
   if (element is SynthesizedConstructorElement) {
     return const <Dart2JsMemberMirror>[];
   } else if (element is VariableElement) {
@@ -89,10 +90,10 @@
     return <Dart2JsMemberMirror>[new Dart2JsMethodMirror(library, element)];
   } else if (element is AbstractFieldElement) {
     var members = <Dart2JsMemberMirror>[];
-    if (element.getter !== null) {
+    if (element.getter != null) {
       members.add(new Dart2JsMethodMirror(library, element.getter));
     }
-    if (element.setter !== null) {
+    if (element.setter != null) {
       members.add(new Dart2JsMethodMirror(library, element.setter));
     }
     return members;
@@ -101,7 +102,7 @@
       "Unexpected member type $element ${element.kind}");
 }
 
-MethodMirror _convertElementMethodToMethodMirror(Dart2JsObjectMirror library,
+MethodMirror _convertElementMethodToMethodMirror(Dart2JsContainerMirror library,
                                                  Element element) {
   if (element is FunctionElement) {
     return new Dart2JsMethodMirror(library, element);
@@ -111,9 +112,11 @@
 }
 
 class Dart2JsMethodKind {
-  static const Dart2JsMethodKind NORMAL = const Dart2JsMethodKind("normal");
-  static const Dart2JsMethodKind CONSTRUCTOR
-      = const Dart2JsMethodKind("constructor");
+  static const Dart2JsMethodKind REGULAR = const Dart2JsMethodKind("regular");
+  static const Dart2JsMethodKind GENERATIVE =
+      const Dart2JsMethodKind("generative");
+  static const Dart2JsMethodKind REDIRECTING =
+      const Dart2JsMethodKind("redirecting");
   static const Dart2JsMethodKind CONST = const Dart2JsMethodKind("const");
   static const Dart2JsMethodKind FACTORY = const Dart2JsMethodKind("factory");
   static const Dart2JsMethodKind GETTER = const Dart2JsMethodKind("getter");
@@ -151,7 +154,7 @@
     'or': '|',
   };
   String newName = mapping[name];
-  if (newName === null) {
+  if (newName == null) {
     throw new Exception('Unhandled operator name: $name');
   }
   return newName;
@@ -317,9 +320,9 @@
                String message, diagnostics.Diagnostic kind) {
     if (isAborting) return;
     bool fatal =
-        kind === diagnostics.Diagnostic.CRASH ||
-        kind === diagnostics.Diagnostic.ERROR;
-    if (uri === null) {
+        kind == diagnostics.Diagnostic.CRASH ||
+        kind == diagnostics.Diagnostic.ERROR;
+    if (uri == null) {
       if (!fatal) {
         return;
       }
@@ -337,7 +340,7 @@
       : cwd = getCurrentDirectory(), sourceFiles = <String, SourceFile>{} {
     var libraryUri = cwd.resolve(libraryRoot.toString());
     var packageUri;
-    if (packageRoot !== null) {
+    if (packageRoot != null) {
       packageUri = cwd.resolve(packageRoot.toString());
     } else {
       packageUri = libraryUri;
@@ -354,7 +357,7 @@
       : cwd = getCurrentDirectory(), sourceFiles = <String, SourceFile>{} {
     var libraryUri = cwd.resolve(libraryRoot.toString());
     var packageUri;
-    if (packageRoot !== null) {
+    if (packageRoot != null) {
       packageUri = cwd.resolve(packageRoot.toString());
     } else {
       packageUri = libraryUri;
@@ -381,43 +384,63 @@
 //------------------------------------------------------------------------------
 
 abstract class Dart2JsMirror implements Mirror {
-  Dart2JsMirrorSystem get system;
+  Dart2JsMirrorSystem get mirrors;
 }
 
-abstract class Dart2JsMemberMirror implements Dart2JsMirror, MemberMirror {
+abstract class Dart2JsDeclarationMirror
+    implements Dart2JsMirror, DeclarationMirror {
+
+  bool get isTopLevel => owner != null && owner is LibraryMirror;
+
+  bool get isPrivate => _isPrivate(simpleName);
+}
+
+abstract class Dart2JsMemberMirror extends Dart2JsElementMirror
+    implements MemberMirror {
+
+  Dart2JsMemberMirror(Dart2JsMirrorSystem system, Element element)
+      : super(system, element);
+
+  bool get isConstructor => false;
+
+  bool get isField => false;
+
+  bool get isMethod => false;
+
+  bool get isStatic => false;
+}
+
+abstract class Dart2JsTypeMirror extends Dart2JsDeclarationMirror
+    implements TypeMirror {
 
 }
 
-abstract class Dart2JsTypeMirror implements Dart2JsMirror, TypeMirror {
-
-}
-
-abstract class Dart2JsElementMirror implements Dart2JsMirror {
-  final Dart2JsMirrorSystem system;
+abstract class Dart2JsElementMirror extends Dart2JsDeclarationMirror {
+  final Dart2JsMirrorSystem mirrors;
   final Element _element;
 
-  Dart2JsElementMirror(this.system, this._element) {
-    assert (system !== null);
-    assert (_element !== null);
+  Dart2JsElementMirror(this.mirrors, this._element) {
+    assert (mirrors != null);
+    assert (_element != null);
   }
 
   String get simpleName => _element.name.slowToString();
 
   String get displayName => simpleName;
 
-  Location get location => new Dart2JsLocation(
+  SourceLocation get location => new Dart2JsLocation(
       _element.getCompilationUnit().script,
-      system.compiler.spanFromElement(_element));
+      mirrors.compiler.spanFromElement(_element));
 
   String toString() => _element.toString();
 
   int get hashCode => qualifiedName.hashCode;
 }
 
-abstract class Dart2JsProxyMirror implements Dart2JsMirror {
-  final Dart2JsMirrorSystem system;
+abstract class Dart2JsProxyMirror extends Dart2JsDeclarationMirror {
+  final Dart2JsMirrorSystem mirrors;
 
-  Dart2JsProxyMirror(this.system);
+  Dart2JsProxyMirror(this.mirrors);
 
   String get displayName => simpleName;
 
@@ -440,7 +463,7 @@
     if (_libraries == null) {
       _libraries = <String, Dart2JsLibraryMirror>{};
       compiler.libraries.forEach((_, LibraryElement v) {
-        var mirror = new Dart2JsLibraryMirror(system, v);
+        var mirror = new Dart2JsLibraryMirror(mirrors, v);
         _libraries[mirror.simpleName] = mirror;
         _libraryMap[v] = mirror;
       });
@@ -452,30 +475,66 @@
     return new ImmutableMapWrapper<String, LibraryMirror>(_libraries);
   }
 
-  Dart2JsLibraryMirror getLibrary(LibraryElement element) {
-    return _libraryMap[element];
+  Dart2JsLibraryMirror _getLibrary(LibraryElement element) =>
+      _libraryMap[element];
+
+  Dart2JsMirrorSystem get mirrors => this;
+
+  TypeMirror get dynamicType =>
+      _convertTypeToTypeMirror(this, compiler.types.dynamicType, null);
+
+  TypeMirror get voidType =>
+      _convertTypeToTypeMirror(this, compiler.types.voidType, null);
+}
+
+abstract class Dart2JsContainerMirror extends Dart2JsElementMirror
+    implements ContainerMirror {
+  Map<String, MemberMirror> _members;
+
+  Dart2JsContainerMirror(Dart2JsMirrorSystem system, Element element)
+      : super(system, element);
+
+  void _ensureMembers();
+
+  Map<String, MemberMirror> get members {
+    _ensureMembers();
+    return new ImmutableMapWrapper<String, MemberMirror>(_members);
   }
 
-  Dart2JsMirrorSystem get system => this;
+  Map<String, MethodMirror> get functions {
+    _ensureMembers();
+    return new AsFilteredImmutableMap<String, MemberMirror, MethodMirror>(
+        _members,
+        (MemberMirror member) => member is MethodMirror);
+  }
 
-  String get simpleName => "mirror";
-  String get displayName => simpleName;
-  String get qualifiedName => simpleName;
+  Map<String, MethodMirror> get getters {
+    _ensureMembers();
+    return new AsFilteredImmutableMap<String, MemberMirror, MethodMirror>(
+        _members,
+        (MemberMirror member) =>
+            member is MethodMirror && (member as MethodMirror).isGetter);
+  }
 
-  // TODO(johnniwinther): Hack! Dart2JsMirrorSystem need not be a Mirror.
-  int get hashCode => qualifiedName.hashCode;
+  Map<String, MethodMirror> get setters {
+    _ensureMembers();
+    return new AsFilteredImmutableMap<String, MemberMirror, MethodMirror>(
+        _members,
+        (MemberMirror member) =>
+            member is MethodMirror && (member as MethodMirror).isSetter);
+  }
+
+  Map<String, VariableMirror> get variables {
+    _ensureMembers();
+    return new AsFilteredImmutableMap<String, MemberMirror, VariableMirror>(
+        _members,
+        (MemberMirror member) => member is VariableMirror);
+  }
 }
 
-abstract class Dart2JsObjectMirror extends Dart2JsElementMirror
-    implements ObjectMirror {
-  Dart2JsObjectMirror(Dart2JsMirrorSystem system, Element element)
-      : super(system, element);
-}
-
-class Dart2JsLibraryMirror extends Dart2JsObjectMirror
+class Dart2JsLibraryMirror extends Dart2JsContainerMirror
     implements LibraryMirror {
-  Map<String, InterfaceMirror> _types;
-  Map<String, MemberMirror> _members;
+  Map<String, ClassMirror> _classes;
 
   Dart2JsLibraryMirror(Dart2JsMirrorSystem system, LibraryElement library)
       : super(system, library);
@@ -484,6 +543,10 @@
 
   Uri get uri => _library.uri;
 
+  DeclarationMirror get owner => null;
+
+  bool get isPrivate => false;
+
   LibraryMirror library() => this;
 
   /**
@@ -492,10 +555,10 @@
    * provide a 'library name' for scripts, to use for instance in dartdoc.
    */
   String get simpleName {
-    if (_library.libraryTag !== null) {
+    if (_library.libraryTag != null) {
       // TODO(ahe): Remove StringNode check when old syntax is removed.
       StringNode name = _library.libraryTag.name.asStringNode();
-      if (name !== null) {
+      if (name != null) {
         return name.dartString.slowToString();
       } else {
         return _library.libraryTag.name.toString();
@@ -509,24 +572,25 @@
 
   String get qualifiedName => simpleName;
 
-  void _ensureTypes() {
-    if (_types == null) {
-      _types = <String, InterfaceMirror>{};
+  void _ensureClasses() {
+    if (_classes == null) {
+      _classes = <String, ClassMirror>{};
       _library.forEachLocalMember((Element e) {
         if (e.isClass()) {
-          e.ensureResolved(system.compiler);
-          var type = new Dart2JsInterfaceMirror.fromLibrary(this, e);
-          assert(invariant(_library, !_types.containsKey(type.simpleName),
+          ClassElement classElement = e;
+          classElement.ensureResolved(mirrors.compiler);
+          var type = new Dart2JsClassMirror.fromLibrary(this, classElement);
+          assert(invariant(_library, !_classes.containsKey(type.simpleName),
               message: "Type name '${type.simpleName}' "
                        "is not unique in $_library."));
-          _types[type.simpleName] = type;
+          _classes[type.simpleName] = type;
         } else if (e.isTypedef()) {
           var type = new Dart2JsTypedefMirror.fromLibrary(this,
-              e.computeType(system.compiler));
-          assert(invariant(_library, !_types.containsKey(type.simpleName),
+              e.computeType(mirrors.compiler));
+          assert(invariant(_library, !_classes.containsKey(type.simpleName),
               message: "Type name '${type.simpleName}' "
                        "is not unique in $_library."));
-          _types[type.simpleName] = type;
+          _classes[type.simpleName] = type;
         }
       });
     }
@@ -546,17 +610,12 @@
     }
   }
 
-  Map<String, MemberMirror> get declaredMembers {
-    _ensureMembers();
-    return new ImmutableMapWrapper<String, MemberMirror>(_members);
+  Map<String, ClassMirror> get classes {
+    _ensureClasses();
+    return new ImmutableMapWrapper<String, ClassMirror>(_classes);
   }
 
-  Map<String, InterfaceMirror> get types {
-    _ensureTypes();
-    return new ImmutableMapWrapper<String, InterfaceMirror>(_types);
-  }
-
-  Location get location {
+  SourceLocation get location {
     var script = _library.getCompilationUnit().script;
     return new Dart2JsLocation(
         script,
@@ -564,7 +623,7 @@
   }
 }
 
-class Dart2JsLocation implements Location {
+class Dart2JsLocation implements SourceLocation {
   Script _script;
   SourceSpan _span;
 
@@ -589,38 +648,48 @@
   String get text => _script.text;
 }
 
-class Dart2JsParameterMirror extends Dart2JsElementMirror
+class Dart2JsParameterMirror extends Dart2JsMemberMirror
     implements ParameterMirror {
   final MethodMirror _method;
   final bool isOptional;
+  final bool isNamed;
 
   factory Dart2JsParameterMirror(Dart2JsMirrorSystem system,
                                  MethodMirror method,
                                  VariableElement element,
-                                 bool isOptional) {
+                                 bool isOptional,
+                                 bool isNamed) {
     if (element is FieldParameterElement) {
       return new Dart2JsFieldParameterMirror(system,
-                                             method, element, isOptional);
+          method, element, isOptional, isNamed);
     }
     return new Dart2JsParameterMirror._normal(system,
-                                              method, element, isOptional);
+        method, element, isOptional, isNamed);
   }
 
   Dart2JsParameterMirror._normal(Dart2JsMirrorSystem system,
                          this._method,
                          VariableElement element,
-                         this.isOptional)
+                         this.isOptional,
+                         this.isNamed)
     : super(system, element);
 
+  DeclarationMirror get owner => _method;
+
   VariableElement get _variableElement => _element;
 
   String get qualifiedName => '${_method.qualifiedName}#${simpleName}';
 
-  TypeMirror get type => _convertTypeToTypeMirror(system,
-      _variableElement.computeType(system.compiler),
-      system.compiler.types.dynamicType,
+  TypeMirror get type => _convertTypeToTypeMirror(mirrors,
+      _variableElement.computeType(mirrors.compiler),
+      mirrors.compiler.types.dynamicType,
       _variableElement.variables.functionSignature);
 
+
+  bool get isFinal => false;
+
+  bool get isConst => false;
+
   String get defaultValue {
     if (hasDefaultValue) {
       SendSet expression = _variableElement.cachedNode.asSendSet();
@@ -628,14 +697,15 @@
     }
     return null;
   }
+
   bool get hasDefaultValue {
-    return _variableElement.cachedNode !== null &&
+    return _variableElement.cachedNode != null &&
         _variableElement.cachedNode is SendSet;
   }
 
   bool get isInitializingFormal => false;
 
-  FieldMirror get initializedField => null;
+  VariableMirror get initializedField => null;
 }
 
 class Dart2JsFieldParameterMirror extends Dart2JsParameterMirror {
@@ -643,55 +713,57 @@
   Dart2JsFieldParameterMirror(Dart2JsMirrorSystem system,
                               MethodMirror method,
                               FieldParameterElement element,
-                              bool isOptional)
-      : super._normal(system, method, element, isOptional);
+                              bool isOptional,
+                              bool isNamed)
+      : super._normal(system, method, element, isOptional, isNamed);
 
   FieldParameterElement get _fieldParameterElement => _element;
 
   TypeMirror get type {
-    if (_fieldParameterElement.variables.cachedNode.type !== null) {
+    if (_fieldParameterElement.variables.cachedNode.type != null) {
       return super.type;
     }
-    return _convertTypeToTypeMirror(system,
-      _fieldParameterElement.fieldElement.computeType(system.compiler),
-      system.compiler.types.dynamicType,
+    return _convertTypeToTypeMirror(mirrors,
+      _fieldParameterElement.fieldElement.computeType(mirrors.compiler),
+      mirrors.compiler.types.dynamicType,
       _variableElement.variables.functionSignature);
   }
 
   bool get isInitializingFormal => true;
 
-  FieldMirror get initializedField => new Dart2JsFieldMirror(
-      _method.surroundingDeclaration, _fieldParameterElement.fieldElement);
+  VariableMirror get initializedField => new Dart2JsFieldMirror(
+      _method.owner, _fieldParameterElement.fieldElement);
 }
 
 //------------------------------------------------------------------------------
 // Declarations
 //------------------------------------------------------------------------------
-class Dart2JsInterfaceMirror extends Dart2JsObjectMirror
-    implements Dart2JsTypeMirror, InterfaceMirror {
+class Dart2JsClassMirror extends Dart2JsContainerMirror
+    implements Dart2JsTypeMirror, ClassMirror {
   final Dart2JsLibraryMirror library;
-  Map<String, Dart2JsMemberMirror> _members;
   List<TypeVariableMirror> _typeVariables;
 
-  Dart2JsInterfaceMirror(Dart2JsMirrorSystem system, ClassElement _class)
-      : this.library = system.getLibrary(_class.getLibrary()),
+  Dart2JsClassMirror(Dart2JsMirrorSystem system, ClassElement _class)
+      : this.library = system._getLibrary(_class.getLibrary()),
         super(system, _class);
 
   ClassElement get _class => _element;
 
-  Dart2JsInterfaceMirror.fromLibrary(Dart2JsLibraryMirror library,
+  Dart2JsClassMirror.fromLibrary(Dart2JsLibraryMirror library,
                                  ClassElement _class)
       : this.library = library,
-        super(library.system, _class);
+        super(library.mirrors, _class);
+
+  DeclarationMirror get owner => library;
 
   String get qualifiedName => '${library.qualifiedName}.${simpleName}';
 
-  Location get location {
+  SourceLocation get location {
     if (_class is PartialClassElement) {
-      var node = _class.parseNode(system.compiler);
-      if (node !== null) {
+      var node = _class.parseNode(mirrors.compiler);
+      if (node != null) {
         var script = _class.getCompilationUnit().script;
-        var span = system.compiler.spanFromNode(node, script.uri);
+        var span = mirrors.compiler.spanFromNode(node, script.uri);
         return new Dart2JsLocation(script, span);
       }
     }
@@ -710,12 +782,15 @@
     }
   }
 
-  Map<String, MemberMirror> get declaredMembers {
+  Map<String, MethodMirror> get methods => functions;
+
+  Map<String, MethodMirror> get constructors {
     _ensureMembers();
-    return new ImmutableMapWrapper<String, MemberMirror>(_members);
+    return new AsFilteredImmutableMap<String, MemberMirror, MethodMirror>(
+        _members, (m) => m.isConstructor ? m : null);
   }
 
-  bool get isObject => _class == system.compiler.objectClass;
+  bool get isObject => _class == mirrors.compiler.objectClass;
 
   bool get isDynamic => false;
 
@@ -727,21 +802,21 @@
 
   bool get isFunction => false;
 
-  InterfaceMirror get declaration => this;
+  ClassMirror get originalDeclaration => this;
 
-  InterfaceMirror get superclass {
+  ClassMirror get superclass {
     if (_class.supertype != null) {
-      return new Dart2JsInterfaceTypeMirror(system, _class.supertype);
+      return new Dart2JsInterfaceTypeMirror(mirrors, _class.supertype);
     }
     return null;
   }
 
-  List<InterfaceMirror> get interfaces {
-    var list = <InterfaceMirror>[];
+  List<ClassMirror> get superinterfaces {
+    var list = <ClassMirror>[];
     Link<DartType> link = _class.interfaces;
     while (!link.isEmpty) {
-      var type = _convertTypeToTypeMirror(system, link.head,
-                                          system.compiler.types.dynamicType);
+      var type = _convertTypeToTypeMirror(mirrors, link.head,
+                                          mirrors.compiler.types.dynamicType);
       list.add(type);
       link = link.tail;
     }
@@ -754,9 +829,7 @@
 
   bool get isAbstract => _class.modifiers.isAbstract();
 
-  bool get isPrivate => _isPrivate(simpleName);
-
-  bool get isDeclaration => true;
+  bool get isOriginalDeclaration => true;
 
   List<TypeMirror> get typeArguments {
     throw new UnsupportedError(
@@ -766,42 +839,36 @@
   List<TypeVariableMirror> get typeVariables {
     if (_typeVariables == null) {
       _typeVariables = <TypeVariableMirror>[];
-      _class.ensureResolved(system.compiler);
+      _class.ensureResolved(mirrors.compiler);
       for (TypeVariableType typeVariable in _class.typeVariables) {
         _typeVariables.add(
-            new Dart2JsTypeVariableMirror(system, typeVariable));
+            new Dart2JsTypeVariableMirror(mirrors, typeVariable));
       }
     }
     return _typeVariables;
   }
 
-  Map<String, MethodMirror> get constructors {
-    _ensureMembers();
-    return new AsFilteredImmutableMap<String, MemberMirror, MethodMirror>(
-        _members, (m) => m.isConstructor ? m : null);
-  }
-
   /**
    * Returns the default type for this interface.
    */
-  InterfaceMirror get defaultType {
+  ClassMirror get defaultFactory {
     if (_class.defaultClass != null) {
-      return new Dart2JsInterfaceTypeMirror(system, _class.defaultClass);
+      return new Dart2JsInterfaceTypeMirror(mirrors, _class.defaultClass);
     }
     return null;
   }
 
   bool operator ==(Object other) {
-    if (this === other) {
+    if (identical(this, other)) {
       return true;
     }
-    if (other is! InterfaceMirror) {
+    if (other is! ClassMirror) {
       return false;
     }
     if (library != other.library) {
       return false;
     }
-    if (isDeclaration !== other.isDeclaration) {
+    if (!identical(isOriginalDeclaration, other.isOriginalDeclaration)) {
       return false;
     }
     return qualifiedName == other.qualifiedName;
@@ -815,23 +882,23 @@
   TypeMirror _definition;
 
   Dart2JsTypedefMirror(Dart2JsMirrorSystem system, TypedefType _typedef)
-      : this._library = system.getLibrary(_typedef.element.getLibrary()),
+      : this._library = system._getLibrary(_typedef.element.getLibrary()),
         super(system, _typedef);
 
   Dart2JsTypedefMirror.fromLibrary(Dart2JsLibraryMirror library,
                                    TypedefType _typedef)
       : this._library = library,
-        super(library.system, _typedef);
+        super(library.mirrors, _typedef);
 
   TypedefType get _typedef => _type;
 
   String get qualifiedName => '${library.qualifiedName}.${simpleName}';
 
-  Location get location {
+  SourceLocation get location {
     var node = _typedef.element.parseNode(_diagnosticListener);
-    if (node !== null) {
+    if (node != null) {
       var script = _typedef.element.getCompilationUnit().script;
-      var span = system.compiler.spanFromNode(node, script.uri);
+      var span = mirrors.compiler.spanFromNode(node, script.uri);
       return new Dart2JsLocation(script, span);
     }
     return super.location;
@@ -851,75 +918,65 @@
       _typeVariables = <TypeVariableMirror>[];
       for (TypeVariableType typeVariable in _typedef.typeArguments) {
         _typeVariables.add(
-            new Dart2JsTypeVariableMirror(system, typeVariable));
+            new Dart2JsTypeVariableMirror(mirrors, typeVariable));
       }
     }
     return _typeVariables;
   }
 
-  TypeMirror get definition {
-    if (_definition === null) {
+  TypeMirror get value {
+    if (_definition == null) {
       // TODO(johnniwinther): Should be [ensureResolved].
-      system.compiler.resolveTypedef(_typedef.element);
+      mirrors.compiler.resolveTypedef(_typedef.element);
       _definition = _convertTypeToTypeMirror(
-          system,
+          mirrors,
           _typedef.element.alias,
-          system.compiler.types.dynamicType,
+          mirrors.compiler.types.dynamicType,
           _typedef.element.functionSignature);
     }
     return _definition;
   }
 
-  Map<String, MemberMirror> get declaredMembers =>
-      const <String, MemberMirror>{};
-
-  InterfaceMirror get declaration => this;
+  ClassMirror get originalDeclaration => this;
 
   // TODO(johnniwinther): How should a typedef respond to these?
-  InterfaceMirror get superclass => null;
+  ClassMirror get superclass => null;
 
-  List<InterfaceMirror> get interfaces => const <InterfaceMirror>[];
+  List<ClassMirror> get superinterfaces => const <ClassMirror>[];
 
   bool get isClass => false;
 
   bool get isInterface => false;
 
-  bool get isPrivate => _isPrivate(simpleName);
-
-  bool get isDeclaration => true;
+  bool get isOriginalDeclaration => true;
 
   bool get isAbstract => false;
-
-  Map<String, MethodMirror> get constructors =>
-      const <String, MethodMirror>{};
-
-  InterfaceMirror get defaultType => null;
 }
 
 class Dart2JsTypeVariableMirror extends Dart2JsTypeElementMirror
     implements TypeVariableMirror {
   final TypeVariableType _typeVariableType;
-  InterfaceMirror _declarer;
+  ClassMirror _declarer;
 
   Dart2JsTypeVariableMirror(Dart2JsMirrorSystem system,
                             TypeVariableType typeVariableType)
     : this._typeVariableType = typeVariableType,
       super(system, typeVariableType) {
-      assert(_typeVariableType !== null);
+      assert(_typeVariableType != null);
   }
 
 
   String get qualifiedName => '${declarer.qualifiedName}.${simpleName}';
 
-  InterfaceMirror get declarer {
-    if (_declarer === null) {
+  ClassMirror get declarer {
+    if (_declarer == null) {
       if (_typeVariableType.element.enclosingElement.isClass()) {
-        _declarer = new Dart2JsInterfaceMirror(system,
+        _declarer = new Dart2JsClassMirror(mirrors,
             _typeVariableType.element.enclosingElement);
       } else if (_typeVariableType.element.enclosingElement.isTypedef()) {
-        _declarer = new Dart2JsTypedefMirror(system,
+        _declarer = new Dart2JsTypedefMirror(mirrors,
             _typeVariableType.element.enclosingElement.computeType(
-                system.compiler));
+                mirrors.compiler));
       }
     }
     return _declarer;
@@ -927,15 +984,17 @@
 
   LibraryMirror get library => declarer.library;
 
+  DeclarationMirror get owner => declarer;
+
   bool get isTypeVariable => true;
 
-  TypeMirror get bound => _convertTypeToTypeMirror(
-      system,
+  TypeMirror get upperBound => _convertTypeToTypeMirror(
+      mirrors,
       _typeVariableType.element.bound,
-      system.compiler.objectClass.computeType(system.compiler));
+      mirrors.compiler.objectClass.computeType(mirrors.compiler));
 
   bool operator ==(Object other) {
-    if (this === other) {
+    if (identical(this, other)) {
       return true;
     }
     if (other is! TypeVariableMirror) {
@@ -962,14 +1021,16 @@
 
   String get simpleName => _type.name.slowToString();
 
-  Location get location {
+  SourceLocation get location {
     var script = _type.element.getCompilationUnit().script;
     return new Dart2JsLocation(script,
-                               system.compiler.spanFromElement(_type.element));
+                               mirrors.compiler.spanFromElement(_type.element));
   }
 
+  DeclarationMirror get owner => library;
+
   LibraryMirror get library {
-    return system.getLibrary(_type.element.getLibrary());
+    return mirrors._getLibrary(_type.element.getLibrary());
   }
 
   bool get isObject => false;
@@ -985,10 +1046,24 @@
   bool get isFunction => false;
 
   String toString() => _type.element.toString();
+
+  Map<String, MemberMirror> get members => const <String, MemberMirror>{};
+
+  Map<String, MethodMirror> get constructors => const <String, MethodMirror>{};
+
+  Map<String, MethodMirror> get methods => const <String, MethodMirror>{};
+
+  Map<String, MethodMirror> get getters => const <String, MethodMirror>{};
+
+  Map<String, MethodMirror> get setters => const <String, MethodMirror>{};
+
+  Map<String, VariableMirror> get variables => const <String, VariableMirror>{};
+
+  ClassMirror get defaultFactory => null;
 }
 
 class Dart2JsInterfaceTypeMirror extends Dart2JsTypeElementMirror
-    implements InterfaceMirror {
+    implements ClassMirror {
   List<TypeMirror> _typeArguments;
 
   Dart2JsInterfaceTypeMirror(Dart2JsMirrorSystem system,
@@ -997,66 +1072,80 @@
 
   InterfaceType get _interfaceType => _type;
 
-  String get qualifiedName => declaration.qualifiedName;
+  String get qualifiedName => originalDeclaration.qualifiedName;
 
   // TODO(johnniwinther): Substitute type arguments for type variables.
-  Map<String, MemberMirror> get declaredMembers => declaration.declaredMembers;
+  Map<String, MemberMirror> get members => originalDeclaration.members;
 
-  bool get isObject => system.compiler.objectClass == _type.element;
+  bool get isObject => mirrors.compiler.objectClass == _type.element;
 
-  bool get isDynamic => system.compiler.dynamicClass == _type.element;
+  bool get isDynamic => mirrors.compiler.dynamicClass == _type.element;
 
-  InterfaceMirror get declaration
-      => new Dart2JsInterfaceMirror(system, _type.element);
+  ClassMirror get originalDeclaration
+      => new Dart2JsClassMirror(mirrors, _type.element);
 
   // TODO(johnniwinther): Substitute type arguments for type variables.
-  InterfaceMirror get superclass => declaration.superclass;
+  ClassMirror get superclass => originalDeclaration.superclass;
 
   // TODO(johnniwinther): Substitute type arguments for type variables.
-  List<InterfaceMirror> get interfaces => declaration.interfaces;
+  List<ClassMirror> get superinterfaces => originalDeclaration.superinterfaces;
 
-  bool get isClass => declaration.isClass;
+  bool get isClass => originalDeclaration.isClass;
 
-  bool get isInterface => declaration.isInterface;
+  bool get isInterface => originalDeclaration.isInterface;
 
-  bool get isAbstract => declaration.isAbstract;
+  bool get isAbstract => originalDeclaration.isAbstract;
 
-  bool get isPrivate => declaration.isPrivate;
+  bool get isPrivate => originalDeclaration.isPrivate;
 
-  bool get isDeclaration => false;
+  bool get isOriginalDeclaration => false;
 
   List<TypeMirror> get typeArguments {
     if (_typeArguments == null) {
       _typeArguments = <TypeMirror>[];
       Link<DartType> type = _interfaceType.arguments;
       while (type != null && type.head != null) {
-        _typeArguments.add(_convertTypeToTypeMirror(system, type.head,
-            system.compiler.types.dynamicType));
+        _typeArguments.add(_convertTypeToTypeMirror(mirrors, type.head,
+            mirrors.compiler.types.dynamicType));
         type = type.tail;
       }
     }
     return _typeArguments;
   }
 
-  List<TypeVariableMirror> get typeVariables => declaration.typeVariables;
+  List<TypeVariableMirror> get typeVariables =>
+      originalDeclaration.typeVariables;
 
   // TODO(johnniwinther): Substitute type arguments for type variables.
-  Map<String, MethodMirror> get constructors => declaration.constructors;
+  Map<String, MethodMirror> get constructors =>
+      originalDeclaration.constructors;
+
+  // TODO(johnniwinther): Substitute type arguments for type variables.
+  Map<String, MethodMirror> get methods => originalDeclaration.methods;
+
+  // TODO(johnniwinther): Substitute type arguments for type variables.
+  Map<String, MethodMirror> get setters => originalDeclaration.setters;
+
+  // TODO(johnniwinther): Substitute type arguments for type variables.
+  Map<String, MethodMirror> get getters => originalDeclaration.getters;
+
+  // TODO(johnniwinther): Substitute type arguments for type variables.
+  Map<String, VariableMirror> get variables => originalDeclaration.variables;
 
   // TODO(johnniwinther): Substitute type arguments for type variables?
-  InterfaceMirror get defaultType => declaration.defaultType;
+  ClassMirror get defaultFactory => originalDeclaration.defaultFactory;
 
   bool operator ==(Object other) {
-    if (this === other) {
+    if (identical(this, other)) {
       return true;
     }
-    if (other is! InterfaceMirror) {
+    if (other is! ClassMirror) {
       return false;
     }
-    if (other.isDeclaration) {
+    if (other.isOriginalDeclaration) {
       return false;
     }
-    if (declaration != other.declaration) {
+    if (originalDeclaration != other.originalDeclaration) {
       return false;
     }
     var thisTypeArguments = typeArguments.iterator();
@@ -1079,69 +1168,66 @@
   Dart2JsFunctionTypeMirror(Dart2JsMirrorSystem system,
                              FunctionType functionType, this._functionSignature)
       : super(system, functionType) {
-    assert (_functionSignature !== null);
+    assert (_functionSignature != null);
   }
 
   FunctionType get _functionType => _type;
 
   // TODO(johnniwinther): Is this the qualified name of a function type?
-  String get qualifiedName => declaration.qualifiedName;
+  String get qualifiedName => originalDeclaration.qualifiedName;
 
   // TODO(johnniwinther): Substitute type arguments for type variables.
-  Map<String, MemberMirror> get declaredMembers {
+  Map<String, MemberMirror> get members {
     var method = callMethod;
-    if (method !== null) {
+    if (method != null) {
       var map = new Map<String, MemberMirror>.from(
-          declaration.declaredMembers);
+          originalDeclaration.members);
       var name = method.qualifiedName;
       assert(!map.containsKey(name));
       map[name] = method;
       return new ImmutableMapWrapper<String, MemberMirror>(map);
     }
-    return declaration.declaredMembers;
+    return originalDeclaration.members;
   }
 
   bool get isFunction => true;
 
   MethodMirror get callMethod => _convertElementMethodToMethodMirror(
-      system.getLibrary(_functionType.element.getLibrary()),
+      mirrors._getLibrary(_functionType.element.getLibrary()),
       _functionType.element);
 
-  InterfaceMirror get declaration
-      => new Dart2JsInterfaceMirror(system, system.compiler.functionClass);
+  ClassMirror get originalDeclaration
+      => new Dart2JsClassMirror(mirrors, mirrors.compiler.functionClass);
 
   // TODO(johnniwinther): Substitute type arguments for type variables.
-  InterfaceMirror get superclass => declaration.superclass;
+  ClassMirror get superclass => originalDeclaration.superclass;
 
   // TODO(johnniwinther): Substitute type arguments for type variables.
-  List<InterfaceMirror> get interfaces => declaration.interfaces;
+  List<ClassMirror> get superinterfaces => originalDeclaration.superinterfaces;
 
-  bool get isClass => declaration.isClass;
+  bool get isClass => originalDeclaration.isClass;
 
-  bool get isInterface => declaration.isInterface;
+  bool get isInterface => originalDeclaration.isInterface;
 
-  bool get isPrivate => declaration.isPrivate;
+  bool get isPrivate => originalDeclaration.isPrivate;
 
-  bool get isDeclaration => false;
+  bool get isOriginalDeclaration => false;
 
   bool get isAbstract => false;
 
   List<TypeMirror> get typeArguments => const <TypeMirror>[];
 
-  List<TypeVariableMirror> get typeVariables => declaration.typeVariables;
-
-  Map<String, MethodMirror> get constructors => <String, MethodMirror>{};
-
-  InterfaceMirror get defaultType => null;
+  List<TypeVariableMirror> get typeVariables =>
+      originalDeclaration.typeVariables;
 
   TypeMirror get returnType {
-    return _convertTypeToTypeMirror(system, _functionType.returnType,
-                                    system.compiler.types.dynamicType);
+    return _convertTypeToTypeMirror(mirrors, _functionType.returnType,
+                                    mirrors.compiler.types.dynamicType);
   }
 
   List<ParameterMirror> get parameters {
-    if (_parameters === null) {
-      _parameters = _parametersFromFunctionSignature(system, callMethod,
+    if (_parameters == null) {
+      _parameters = _parametersFromFunctionSignature(mirrors, callMethod,
                                                      _functionSignature);
     }
     return _parameters;
@@ -1160,7 +1246,7 @@
   /**
    * The void type has no location.
    */
-  Location get location => null;
+  SourceLocation get location => null;
 
   /**
    * The void type has no library.
@@ -1170,7 +1256,7 @@
   bool get isVoid => true;
 
   bool operator ==(Object other) {
-    if (this === other) {
+    if (identical(this, other)) {
       return true;
     }
     if (other is! TypeMirror) {
@@ -1192,7 +1278,7 @@
   /**
    * The dynamic type has no location.
    */
-  Location get location => null;
+  SourceLocation get location => null;
 
   /**
    * The dynamic type has no library.
@@ -1202,7 +1288,7 @@
   bool get isDynamic => true;
 
   bool operator ==(Object other) {
-    if (this === other) {
+    if (identical(this, other)) {
       return true;
     }
     if (other is! TypeMirror) {
@@ -1216,19 +1302,19 @@
 // Member mirrors implementation.
 //------------------------------------------------------------------------------
 
-class Dart2JsMethodMirror extends Dart2JsElementMirror
-    implements Dart2JsMemberMirror, MethodMirror {
-  final Dart2JsObjectMirror _objectMirror;
+class Dart2JsMethodMirror extends Dart2JsMemberMirror
+    implements MethodMirror {
+  final Dart2JsContainerMirror _objectMirror;
   String _simpleName;
   String _displayName;
   String _constructorName;
   String _operatorName;
   Dart2JsMethodKind _kind;
 
-  Dart2JsMethodMirror(Dart2JsObjectMirror objectMirror,
+  Dart2JsMethodMirror(Dart2JsContainerMirror objectMirror,
                       FunctionElement function)
       : this._objectMirror = objectMirror,
-        super(objectMirror.system, function) {
+        super(objectMirror.mirrors, function) {
     _simpleName = _element.name.slowToString();
     if (_function.kind == ElementKind.GETTER) {
       _kind = Dart2JsMethodKind.GETTER;
@@ -1238,6 +1324,7 @@
       _displayName = _simpleName;
       _simpleName = '$_simpleName=';
     } else if (_function.kind == ElementKind.GENERATIVE_CONSTRUCTOR) {
+      // TODO(johnniwinther): Support detection of redirecting constructors.
       _constructorName = '';
       int dollarPos = _simpleName.indexOf('\$');
       if (dollarPos != -1) {
@@ -1251,7 +1338,7 @@
       if (_function.modifiers.isConst()) {
         _kind = Dart2JsMethodKind.CONST;
       } else {
-        _kind = Dart2JsMethodKind.CONSTRUCTOR;
+        _kind = Dart2JsMethodKind.GENERATIVE;
       }
       _displayName = _simpleName;
     } else if (_function.modifiers.isFactory()) {
@@ -1282,7 +1369,7 @@
       // Display name is 'operator operatorName'.
       _displayName = 'operator $_operatorName';
     } else {
-      _kind = Dart2JsMethodKind.NORMAL;
+      _kind = Dart2JsMethodKind.REGULAR;
       _displayName = _simpleName;
     }
   }
@@ -1294,16 +1381,15 @@
   String get displayName => _displayName;
 
   String get qualifiedName
-      => '${surroundingDeclaration.qualifiedName}.$simpleName';
+      => '${owner.qualifiedName}.$simpleName';
 
-  ObjectMirror get surroundingDeclaration => _objectMirror;
+  DeclarationMirror get owner => _objectMirror;
 
   bool get isTopLevel => _objectMirror is LibraryMirror;
 
   bool get isConstructor
-      => _kind == Dart2JsMethodKind.CONSTRUCTOR || isConst || isFactory;
-
-  bool get isField => false;
+      => isGenerativeConstructor || isConstConstructor ||
+         isFactoryConstructor || isRedirectingConstructor;
 
   bool get isMethod => !isConstructor;
 
@@ -1313,19 +1399,25 @@
   bool get isStatic => _function.modifiers.isStatic();
 
   List<ParameterMirror> get parameters {
-    return _parametersFromFunctionSignature(system, this,
-        _function.computeSignature(system.compiler));
+    return _parametersFromFunctionSignature(mirrors, this,
+        _function.computeSignature(mirrors.compiler));
   }
 
   TypeMirror get returnType => _convertTypeToTypeMirror(
-      system, _function.computeSignature(system.compiler).returnType,
-      system.compiler.types.dynamicType);
+      mirrors, _function.computeSignature(mirrors.compiler).returnType,
+      mirrors.compiler.types.dynamicType);
 
-  bool get isAbstract => _function.modifiers.isAbstract();
+  bool get isAbstract => _function.isAbstract(mirrors.compiler);
 
-  bool get isConst => _kind == Dart2JsMethodKind.CONST;
+  bool get isRegularMethod => !(isGetter || isSetter || isConstructor);
 
-  bool get isFactory => _kind == Dart2JsMethodKind.FACTORY;
+  bool get isConstConstructor => _kind == Dart2JsMethodKind.CONST;
+
+  bool get isGenerativeConstructor => _kind == Dart2JsMethodKind.GENERATIVE;
+
+  bool get isRedirectingConstructor => _kind == Dart2JsMethodKind.REDIRECTING;
+
+  bool get isFactoryConstructor => _kind == Dart2JsMethodKind.FACTORY;
 
   String get constructorName => _constructorName;
 
@@ -1337,11 +1429,11 @@
 
   String get operatorName => _operatorName;
 
-  Location get location {
+  SourceLocation get location {
     var node = _function.parseNode(_diagnosticListener);
-    if (node !== null) {
+    if (node != null) {
       var script = _function.getCompilationUnit().script;
-      var span = system.compiler.spanFromNode(node, script.uri);
+      var span = mirrors.compiler.spanFromNode(node, script.uri);
       return new Dart2JsLocation(script, span);
     }
     return super.location;
@@ -1349,50 +1441,43 @@
 
 }
 
-class Dart2JsFieldMirror extends Dart2JsElementMirror
-    implements Dart2JsMemberMirror, FieldMirror {
-  Dart2JsObjectMirror _objectMirror;
+class Dart2JsFieldMirror extends Dart2JsMemberMirror implements VariableMirror {
+  Dart2JsContainerMirror _objectMirror;
   VariableElement _variable;
 
-  Dart2JsFieldMirror(Dart2JsObjectMirror objectMirror,
+  Dart2JsFieldMirror(Dart2JsContainerMirror objectMirror,
                      VariableElement variable)
       : this._objectMirror = objectMirror,
         this._variable = variable,
-        super(objectMirror.system, variable);
+        super(objectMirror.mirrors, variable);
 
   String get qualifiedName
-      => '${surroundingDeclaration.qualifiedName}.$simpleName';
+      => '${owner.qualifiedName}.$simpleName';
 
-  ObjectMirror get surroundingDeclaration => _objectMirror;
+  DeclarationMirror get owner => _objectMirror;
 
   bool get isTopLevel => _objectMirror is LibraryMirror;
 
-  bool get isConstructor => false;
-
   bool get isField => true;
 
-  bool get isMethod => false;
-
-  bool get isPrivate => _isPrivate(simpleName);
-
   bool get isStatic => _variable.modifiers.isStatic();
 
   bool get isFinal => _variable.modifiers.isFinal();
 
   bool get isConst => _variable.modifiers.isConst();
 
-  TypeMirror get type => _convertTypeToTypeMirror(system,
-      _variable.computeType(system.compiler),
-      system.compiler.types.dynamicType);
+  TypeMirror get type => _convertTypeToTypeMirror(mirrors,
+      _variable.computeType(mirrors.compiler),
+      mirrors.compiler.types.dynamicType);
 
-  Location get location {
+  SourceLocation get location {
     var script = _variable.getCompilationUnit().script;
     var node = _variable.variables.parseNode(_diagnosticListener);
-    if (node !== null) {
-      var span = system.compiler.spanFromNode(node, script.uri);
+    if (node != null) {
+      var span = mirrors.compiler.spanFromNode(node, script.uri);
       return new Dart2JsLocation(script, span);
     } else {
-      var span = system.compiler.spanFromElement(_variable);
+      var span = mirrors.compiler.spanFromElement(_variable);
       return new Dart2JsLocation(script, span);
     }
   }
diff --git a/pkg/dartdoc/lib/src/mirrors/util.dart b/pkg/dartdoc/lib/src/mirrors/util.dart
index 755b78f..3470211 100644
--- a/pkg/dartdoc/lib/src/mirrors/util.dart
+++ b/pkg/dartdoc/lib/src/mirrors/util.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('util');
+library util;
 
 /**
  * An abstract map implementation. This class can be used as a superclass for
diff --git a/pkg/intl/example/basic/basic_example.dart b/pkg/intl/example/basic/basic_example.dart
index 87223d0..76380e9 100644
--- a/pkg/intl/example/basic/basic_example.dart
+++ b/pkg/intl/example/basic/basic_example.dart
@@ -15,14 +15,14 @@
  * formatted appropriately for the locale.
  */
 
-#library('intl_basic_example');
+library intl_basic_example;
 // These can be replaced with package:intl/... references if using this in
 // a separate package.
 // TODO(alanknight): Replace these with package: once pub works in buildbots.
-#import('../../lib/date_symbol_data_local.dart');
-#import('../../lib/intl.dart');
-#import('../../lib/message_lookup_local.dart');
-#import('messages_all.dart');
+import '../../lib/date_symbol_data_local.dart';
+import '../../lib/intl.dart';
+import '../../lib/message_lookup_local.dart';
+import 'messages_all.dart';
 
 Function doThisWithTheOutput;
 
diff --git a/pkg/intl/example/basic/basic_example_runner.dart b/pkg/intl/example/basic/basic_example_runner.dart
index 004a5b2..91bbfdd 100644
--- a/pkg/intl/example/basic/basic_example_runner.dart
+++ b/pkg/intl/example/basic/basic_example_runner.dart
@@ -7,7 +7,7 @@
  * that as a library that can also be run by tests.
  */
 
-#import('basic_example.dart');
+import 'basic_example.dart';
 
 main() {
   setup(runProgram, print);
diff --git a/pkg/intl/example/basic/messages_all.dart b/pkg/intl/example/basic/messages_all.dart
index 7fc412b..43629f2 100644
--- a/pkg/intl/example/basic/messages_all.dart
+++ b/pkg/intl/example/basic/messages_all.dart
@@ -8,7 +8,7 @@
  * all of them. In this example there's only one program file, so it doesn't
  * make very much difference.
  */
-#library('messages_all.dart');
+library messages_all;
 
-#import('messages_th_th.dart', prefix: 'th_TH');
-#import('messages_de.dart', prefix: 'de');
+import 'messages_th_th.dart' as th_TH;
+import 'messages_de.dart' as de;
diff --git a/pkg/intl/example/basic/messages_de.dart b/pkg/intl/example/basic/messages_de.dart
index 98fcc75..07e8331 100644
--- a/pkg/intl/example/basic/messages_de.dart
+++ b/pkg/intl/example/basic/messages_de.dart
@@ -9,8 +9,8 @@
  * up based on a naming convention.
  */
 
-#library('messages_de');
-#import('../../lib/intl.dart');
+library messages_de;
+import '../../lib/intl.dart';
 
 runAt(time, day) => Intl.message('Ausgedruckt am $time am $day.', name: 'runAt',
     args: [time, day]);
diff --git a/pkg/intl/example/basic/messages_th_th.dart b/pkg/intl/example/basic/messages_th_th.dart
index ef29df0..899399d 100644
--- a/pkg/intl/example/basic/messages_th_th.dart
+++ b/pkg/intl/example/basic/messages_th_th.dart
@@ -9,8 +9,8 @@
  * up based on a naming convention.
  */
 
-#library('messages_th_TH');
-#import('../../lib/intl.dart');
+library messages_th_TH;
+import '../../lib/intl.dart';
 
 runAt(time, day) =>
     Intl.message('วิ่ง $time on $day.', name: 'runAt', args: [time, day]);
diff --git a/pkg/intl/lib/bidi_formatter.dart b/pkg/intl/lib/bidi_formatter.dart
index 7a52fac..ae7b908 100644
--- a/pkg/intl/lib/bidi_formatter.dart
+++ b/pkg/intl/lib/bidi_formatter.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+part of intl;
+
 /**
  * Bidi stands for Bi-directional text.
  * According to [Wikipedia](http://en.wikipedia.org/wiki/Bi-directional_text):
diff --git a/pkg/intl/lib/bidi_utils.dart b/pkg/intl/lib/bidi_utils.dart
index e456c32..782148b 100644
--- a/pkg/intl/lib/bidi_utils.dart
+++ b/pkg/intl/lib/bidi_utils.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+part of intl;
+
 /**
  * Bidi stands for Bi-directional text.
  * According to http://en.wikipedia.org/wiki/Bi-directional_text:
@@ -357,7 +359,7 @@
     int index = 0;
     while (sum >= 0 || index > str.length) {
       int char = str.charCodeAt(index);
-      if (char == '('.charCodeAt(0)) sum++;
+      if (char == '('.charCodeAt(0))  sum++;
       else if (char == ')'.charCodeAt(0)) sum--;
       index++;
     }
diff --git a/pkg/intl/lib/date_format.dart b/pkg/intl/lib/date_format.dart
index f387f06..7a5ccdb 100644
--- a/pkg/intl/lib/date_format.dart
+++ b/pkg/intl/lib/date_format.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+part of intl;
+
 /**
  * DateFormat is for formatting and parsing dates in a locale-sensitive
  * manner.
diff --git a/pkg/intl/lib/date_symbol_data_file.dart b/pkg/intl/lib/date_symbol_data_file.dart
index 1071ebb..2a5e200 100644
--- a/pkg/intl/lib/date_symbol_data_file.dart
+++ b/pkg/intl/lib/date_symbol_data_file.dart
@@ -7,15 +7,15 @@
  * locale data from files in the file system.
  */
 
-#library('date_symbol_data_json');
+library date_symbol_data_json;
 
-#import("date_symbols.dart");
-#import("src/lazy_locale_data.dart");
-#import('src/date_format_internal.dart');
-#import('src/file_data_reader.dart');
-#import('dart:io');
+import "date_symbols.dart";
+import "src/lazy_locale_data.dart";
+import 'src/date_format_internal.dart';
+import 'src/file_data_reader.dart';
+import 'dart:io';
 
-#source("src/data/dates/localeList.dart");
+part "src/data/dates/localeList.dart";
 
 /**
  * This should be called for at least one [locale] before any date formatting
diff --git a/pkg/intl/lib/date_symbol_data_http_request.dart b/pkg/intl/lib/date_symbol_data_http_request.dart
index 8214c8f..b56c990 100644
--- a/pkg/intl/lib/date_symbol_data_http_request.dart
+++ b/pkg/intl/lib/date_symbol_data_http_request.dart
@@ -6,14 +6,14 @@
  * This file should be imported, along with date_format.dart in order to read
  * locale data via http requests to a web server..
  */
-#library('date_symbol_data_json');
+library date_symbol_data_json;
 
-#import("date_symbols.dart");
-#import("src/lazy_locale_data.dart");
-#import('src/date_format_internal.dart');
-#import('src/http_request_data_reader.dart');
+import "date_symbols.dart";
+import "src/lazy_locale_data.dart";
+import 'src/date_format_internal.dart';
+import 'src/http_request_data_reader.dart';
 
-#source("src/data/dates/localeList.dart");
+part "src/data/dates/localeList.dart";
 
 /**
  * This should be called for at least one [locale] before any date formatting
diff --git a/pkg/intl/lib/date_symbol_data_local.dart b/pkg/intl/lib/date_symbol_data_local.dart
index 264ac54..6474b5a 100644
--- a/pkg/intl/lib/date_symbol_data_local.dart
+++ b/pkg/intl/lib/date_symbol_data_local.dart
@@ -14,10 +14,10 @@
  * removed after those changes land to CLDR.
  */
 
-#library("date_symbol_data");
-#import("date_symbols.dart");
-#import("src/date_format_internal.dart");
-#import("date_time_patterns.dart");
+library date_symbol_data;
+import "date_symbols.dart";
+import "src/date_format_internal.dart";
+import "date_time_patterns.dart";
 
 /**
  * This should be called for at least one [locale] before any date
diff --git a/pkg/intl/lib/date_symbols.dart b/pkg/intl/lib/date_symbols.dart
index 5c2f8df..acbd988 100644
--- a/pkg/intl/lib/date_symbols.dart
+++ b/pkg/intl/lib/date_symbols.dart
@@ -1,7 +1,7 @@
 // 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("date_symbols");
+library date_symbols;
 
 /**
  * This holds onto information about how a particular locale formats dates. It
diff --git a/pkg/intl/lib/date_time_patterns.dart b/pkg/intl/lib/date_time_patterns.dart
index 5a8c157..8c92c70 100644
--- a/pkg/intl/lib/date_time_patterns.dart
+++ b/pkg/intl/lib/date_time_patterns.dart
@@ -9,7 +9,7 @@
  * 'http://go/generate_datetime_pattern_dart.cc' (Google internal)
  */
 
-#library('date_time_patterns');
+library date_time_patterns;
 
 /**
  * Returns a Map from locale names to another Map that goes from skeletons
diff --git a/pkg/intl/lib/intl.dart b/pkg/intl/lib/intl.dart
index 3b6c5b8..e2cd831 100644
--- a/pkg/intl/lib/intl.dart
+++ b/pkg/intl/lib/intl.dart
@@ -14,18 +14,18 @@
  * There is also a simple example application that can be found in the
  * `example/basic` directory.
  */
-#library('intl');
+library intl;
 
-#import('src/intl_helpers.dart');
-#import('dart:math');
-#import('date_symbols.dart');
-#import('src/date_format_internal.dart');
+import 'src/intl_helpers.dart';
+import 'dart:math';
+import 'date_symbols.dart';
+import 'src/date_format_internal.dart';
 
-#source('date_format.dart');
-#source('src/date_format_field.dart');
-#source('src/date_format_helpers.dart');
-#source('bidi_formatter.dart');
-#source('bidi_utils.dart');
+part 'date_format.dart';
+part 'src/date_format_field.dart';
+part 'src/date_format_helpers.dart';
+part 'bidi_formatter.dart';
+part 'bidi_utils.dart';
 
 /**
  * The Intl class provides a common entry point for internationalization
diff --git a/pkg/intl/lib/intl_browser.dart b/pkg/intl/lib/intl_browser.dart
index c0dc952..f0af08d 100644
--- a/pkg/intl/lib/intl_browser.dart
+++ b/pkg/intl/lib/intl_browser.dart
@@ -9,10 +9,10 @@
  * ability to find the default locale from the browser.
  */
 
-#library("intl_browser");
+library intl_browser;
 
-#import("dart:html");
-#import("intl.dart");
+import "dart:html";
+import "intl.dart";
 
 // TODO(alanknight): The need to do this by forcing the user to specially
 // import a particular library is a horrible hack, only done because there
diff --git a/pkg/intl/lib/intl_standalone.dart b/pkg/intl/lib/intl_standalone.dart
index ecede7a..6d42b5e 100644
--- a/pkg/intl/lib/intl_standalone.dart
+++ b/pkg/intl/lib/intl_standalone.dart
@@ -9,10 +9,10 @@
  * the operating system locale.
  */
 
-#library("intl_standalone");
+library intl_standalone;
 
-#import("dart:io");
-#import("intl.dart");
+import "dart:io";
+import "intl.dart";
 
 // TODO(alanknight): The need to do this by forcing the user to specially
 // import a particular library is a horrible hack, only done because there
diff --git a/pkg/intl/lib/message_lookup_local.dart b/pkg/intl/lib/message_lookup_local.dart
index 1871c87..9c62fb3 100644
--- a/pkg/intl/lib/message_lookup_local.dart
+++ b/pkg/intl/lib/message_lookup_local.dart
@@ -13,11 +13,11 @@
  */
  //TODO(efortuna): documentation example involving the offset parameter?
 
-#library('message_lookup_local');
+library message_lookup_local;
 
-#import('intl.dart');
-#import('src/intl_helpers.dart');
-#import('dart:mirrors');
+import 'intl.dart';
+import 'src/intl_helpers.dart';
+import 'dart:mirrors';
 
 /**
  * Initialize the user messages for [localeName]. Note that this is an ASYNC
diff --git a/pkg/intl/lib/number_format.dart b/pkg/intl/lib/number_format.dart
index 00373d2..4f75d63 100644
--- a/pkg/intl/lib/number_format.dart
+++ b/pkg/intl/lib/number_format.dart
@@ -2,13 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library("number_format");
+library number_format;
 
-#import('dart:math');
+import 'dart:math';
 
-#import("intl.dart");
-#import("number_symbols.dart");
-#import("number_symbols_data.dart");
+import "intl.dart";
+import "number_symbols.dart";
+import "number_symbols_data.dart";
 
 class NumberFormat {
   /** Variables to determine how number printing behaves. */
diff --git a/pkg/intl/lib/number_symbols.dart b/pkg/intl/lib/number_symbols.dart
index 2d51362..6b2e616 100644
--- a/pkg/intl/lib/number_symbols.dart
+++ b/pkg/intl/lib/number_symbols.dart
@@ -1,7 +1,7 @@
 // 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("number_symbols");
+library number_symbols;
 
 /**
  * This holds onto information about how a particular locale formats numbers. It
diff --git a/pkg/intl/lib/number_symbols_data.dart b/pkg/intl/lib/number_symbols_data.dart
index e555c95..1c11791 100644
--- a/pkg/intl/lib/number_symbols_data.dart
+++ b/pkg/intl/lib/number_symbols_data.dart
@@ -14,8 +14,8 @@
  * removed after those changes land to CLDR.
  */
 
-#library("number_symbol_data");
-#import("number_symbols.dart");
+library number_symbol_data;
+import "number_symbols.dart";
 
 Map numberFormatSymbols = const {
   /**
diff --git a/pkg/intl/lib/src/data/dates/localeList.dart b/pkg/intl/lib/src/data/dates/localeList.dart
index 67e2b4d..6325924 100644
--- a/pkg/intl/lib/src/data/dates/localeList.dart
+++ b/pkg/intl/lib/src/data/dates/localeList.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this sourcecode is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+part of date_symbol_data_json;
+
 /// Hard-coded list of all available locales for dates.
 final availableLocalesForDateFormatting = const ["en_ISO",
     "af",
diff --git a/pkg/intl/lib/src/date_format_field.dart b/pkg/intl/lib/src/date_format_field.dart
index 489e4f8..3e7c6cf 100644
--- a/pkg/intl/lib/src/date_format_field.dart
+++ b/pkg/intl/lib/src/date_format_field.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+part of intl;
+
 /**
  * This is a private class internal to DateFormat which is used for formatting
  * particular fields in a template. e.g. if the format is hh:mm:ss then the
diff --git a/pkg/intl/lib/src/date_format_helpers.dart b/pkg/intl/lib/src/date_format_helpers.dart
index 3478d0b..7def10b 100644
--- a/pkg/intl/lib/src/date_format_helpers.dart
+++ b/pkg/intl/lib/src/date_format_helpers.dart
@@ -2,6 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+
+part of intl;
+
 /**
  * A class for holding onto the data for a date so that it can be built
  * up incrementally.
@@ -71,7 +74,7 @@
 
   bool atEnd() => index >= contents.length;
 
-  Dynamic next() => contents[index++];
+  next() => contents[index++];
 
   /**
    * Return the next [howMany] items, or as many as there are remaining.
diff --git a/pkg/intl/lib/src/date_format_internal.dart b/pkg/intl/lib/src/date_format_internal.dart
index 54c45fc..9205dfb 100644
--- a/pkg/intl/lib/src/date_format_internal.dart
+++ b/pkg/intl/lib/src/date_format_internal.dart
@@ -12,8 +12,8 @@
  * `initializeDateFormatting` method exposed there.
  */
 
-#library('date_format_internal');
-#import('intl_helpers.dart');
+library date_format_internal;
+import 'intl_helpers.dart';
 
 /**
  * This holds the symbols to be used for date/time formatting, indexed
diff --git a/pkg/intl/lib/src/file_data_reader.dart b/pkg/intl/lib/src/file_data_reader.dart
index b6c7e96..e5d3e51 100644
--- a/pkg/intl/lib/src/file_data_reader.dart
+++ b/pkg/intl/lib/src/file_data_reader.dart
@@ -7,10 +7,10 @@
  * be run in the browser.
  */
 
-#library('file_data_reader');
+library file_data_reader;
 
-#import('dart:io');
-#import('intl_helpers.dart');
+import 'dart:io';
+import 'intl_helpers.dart';
 
 class FileDataReader implements LocaleDataReader {
 
diff --git a/pkg/intl/lib/src/http_request_data_reader.dart b/pkg/intl/lib/src/http_request_data_reader.dart
index c79569d..b6d2e35 100644
--- a/pkg/intl/lib/src/http_request_data_reader.dart
+++ b/pkg/intl/lib/src/http_request_data_reader.dart
@@ -7,10 +7,10 @@
  * facility, and thus works only in the web browser.
  */
 
-#library('http_request_data_reader');
+library http_request_data_reader;
 
-#import('dart:html');
-#import('intl_helpers.dart');
+import 'dart:html';
+import 'intl_helpers.dart';
 
 class HTTPRequestDataReader implements LocaleDataReader {
 
diff --git a/pkg/intl/lib/src/intl_helpers.dart b/pkg/intl/lib/src/intl_helpers.dart
index 95facfd..128acd8 100644
--- a/pkg/intl/lib/src/intl_helpers.dart
+++ b/pkg/intl/lib/src/intl_helpers.dart
@@ -7,7 +7,7 @@
  * rather than confined to specific parts of it.
  */
 
-#library("intl_helpers");
+library intl_helpers;
 
 /**
  * This is used as a marker for a locale data map that hasn't been initialized,
@@ -39,7 +39,7 @@
  *  An abstract superclass for data readers to keep the type system happy.
  */
 abstract class LocaleDataReader {
-  abstract Future read(String locale);
+  Future read(String locale);
 }
 
 /**
diff --git a/pkg/intl/lib/src/lazy_locale_data.dart b/pkg/intl/lib/src/lazy_locale_data.dart
index 6a42025..66acbdf 100644
--- a/pkg/intl/lib/src/lazy_locale_data.dart
+++ b/pkg/intl/lib/src/lazy_locale_data.dart
@@ -8,10 +8,10 @@
  * local files or via HTTP request.
  */
 
-#library('lazy_locale_data');
-#import('dart:uri');
-#import('intl_helpers.dart');
-#import('dart:json');
+library lazy_locale_data;
+import 'dart:uri';
+import 'intl_helpers.dart';
+import 'dart:json';
 
 /**
  * This implements the very basic map-type operations which are used
diff --git a/pkg/intl/test/bidi_format_test.dart b/pkg/intl/test/bidi_format_test.dart
index 1aa77ab..6b26672 100644
--- a/pkg/intl/test/bidi_format_test.dart
+++ b/pkg/intl/test/bidi_format_test.dart
@@ -3,10 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-#library('bidi_format_test');
+library bidi_format_test;
 
-#import('../lib/intl.dart');
-#import('../../../pkg/unittest/unittest.dart');
+import '../lib/intl.dart';
+import '../../../pkg/unittest/unittest.dart';
 
 /**
  * Tests the bidirectional text formatting library.
diff --git a/pkg/intl/test/bidi_utils_test.dart b/pkg/intl/test/bidi_utils_test.dart
index 027e54c..e65a241 100644
--- a/pkg/intl/test/bidi_utils_test.dart
+++ b/pkg/intl/test/bidi_utils_test.dart
@@ -3,10 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-#library('bidi_utils_test');
+library bidi_utils_test;
 
-#import('../lib/intl.dart');
-#import('../../../pkg/unittest/unittest.dart');
+import '../lib/intl.dart';
+import '../../../pkg/unittest/unittest.dart';
 
 /**
  * Tests the bidi utilities library.
diff --git a/pkg/intl/test/data_directory.dart b/pkg/intl/test/data_directory.dart
index e75a466..b2e23da 100644
--- a/pkg/intl/test/data_directory.dart
+++ b/pkg/intl/test/data_directory.dart
@@ -7,9 +7,9 @@
  * simple cases) for file-dependent programs being run from different
  * directories.
  */
-#library('data_directory');
+library data_directory;
 
-#import('dart:io');
+import 'dart:io';
 
 String get _sep => Platform.pathSeparator;
 
diff --git a/pkg/intl/test/date_time_format_file_even_test.dart b/pkg/intl/test/date_time_format_file_even_test.dart
index 1070f1e..ca9daee 100644
--- a/pkg/intl/test/date_time_format_file_even_test.dart
+++ b/pkg/intl/test/date_time_format_file_even_test.dart
@@ -8,9 +8,9 @@
  * of them takes long enough that it may cause timeouts in the test bots.
  */
 
-#library('date_time_format_file_test_2');
-#import('date_time_format_file_test_stub.dart');
-#import('date_time_format_test_core.dart');
+library date_time_format_file_test_2;
+import 'date_time_format_file_test_stub.dart';
+import 'date_time_format_test_core.dart';
 
 main() {
   runWith(evenLocales);
diff --git a/pkg/intl/test/date_time_format_file_odd_test.dart b/pkg/intl/test/date_time_format_file_odd_test.dart
index 10c957e..fbf05bd 100644
--- a/pkg/intl/test/date_time_format_file_odd_test.dart
+++ b/pkg/intl/test/date_time_format_file_odd_test.dart
@@ -8,9 +8,9 @@
  * of them takes long enough that it may cause timeouts in the test bots.
  */
 
-#library('date_time_format_file_test_1');
-#import('date_time_format_file_test_stub.dart');
-#import('date_time_format_test_core.dart');
+library date_time_format_file_test_1;
+import 'date_time_format_file_test_stub.dart';
+import 'date_time_format_test_core.dart';
 
 main() {
   runWith(oddLocales);
diff --git a/pkg/intl/test/date_time_format_file_test_stub.dart b/pkg/intl/test/date_time_format_file_test_stub.dart
index 480f95c..4a09ccf 100644
--- a/pkg/intl/test/date_time_format_file_test_stub.dart
+++ b/pkg/intl/test/date_time_format_file_test_stub.dart
@@ -7,14 +7,14 @@
  * local file system.
  */
 
-#library('date_time_format_file_test');
+library date_time_format_file_test;
 
-#import('../lib/intl.dart');
-#import('../lib/date_symbol_data_file.dart');
-#import('dart:io');
-#import('date_time_format_test_core.dart');
-#import('data_directory.dart');
-#import('../../../pkg/unittest/unittest.dart');
+import '../lib/intl.dart';
+import '../lib/date_symbol_data_file.dart';
+import 'dart:io';
+import 'date_time_format_test_core.dart';
+import 'data_directory.dart';
+import '../../../pkg/unittest/unittest.dart';
 
 runWith([Function getSubset]) {
   // Initialize one locale just so we know what the list is.
diff --git a/pkg/intl/test/date_time_format_http_request_test.dart b/pkg/intl/test/date_time_format_http_request_test.dart
index be7c93e..d0b9062 100644
--- a/pkg/intl/test/date_time_format_http_request_test.dart
+++ b/pkg/intl/test/date_time_format_http_request_test.dart
@@ -7,13 +7,13 @@
  * to a server.
  */
 
-#library('date_time_format_http_request_test');
+library date_time_format_http_request_test;
 
-#import('../lib/intl.dart');
-#import('../lib/date_symbol_data_http_request.dart');
-#import('date_time_format_test_core.dart');
-#import('dart:html');
-#import('../../../pkg/unittest/unittest.dart');
+import '../lib/intl.dart';
+import '../lib/date_symbol_data_http_request.dart';
+import 'date_time_format_test_core.dart';
+import 'dart:html';
+import '../../../pkg/unittest/unittest.dart';
 
 var url = "http://localhost:9876/pkg/intl/lib/src/data/dates/";
 
diff --git a/pkg/intl/test/date_time_format_local_even_test.dart b/pkg/intl/test/date_time_format_local_even_test.dart
index c22967a..3516cda 100644
--- a/pkg/intl/test/date_time_format_local_even_test.dart
+++ b/pkg/intl/test/date_time_format_local_even_test.dart
@@ -9,9 +9,9 @@
  * the test bots.
  */
 
-#library('date_time_format_test_2');
-#import('date_time_format_local_test_stub.dart');
-#import('date_time_format_test_core.dart');
+library date_time_format_test_2;
+import 'date_time_format_local_test_stub.dart';
+import 'date_time_format_test_core.dart';
 
 main() {
   runWith(evenLocales);
diff --git a/pkg/intl/test/date_time_format_local_odd_test.dart b/pkg/intl/test/date_time_format_local_odd_test.dart
index fd2d042..ef55b44 100644
--- a/pkg/intl/test/date_time_format_local_odd_test.dart
+++ b/pkg/intl/test/date_time_format_local_odd_test.dart
@@ -9,9 +9,9 @@
  * the test bots.
  */
 
-#library('date_time_format_test_1');
-#import('date_time_format_local_test_stub.dart');
-#import('date_time_format_test_core.dart');
+library date_time_format_test_1;
+import 'date_time_format_local_test_stub.dart';
+import 'date_time_format_test_core.dart';
 
 main() {
   runWith(oddLocales);
diff --git a/pkg/intl/test/date_time_format_local_test_stub.dart b/pkg/intl/test/date_time_format_local_test_stub.dart
index 08fdd09..862832e 100644
--- a/pkg/intl/test/date_time_format_local_test_stub.dart
+++ b/pkg/intl/test/date_time_format_local_test_stub.dart
@@ -7,12 +7,12 @@
  * directly in the program as a constant.
  */
 
-#library('date_time_format_test');
+library date_time_format_test;
 
-#import('../lib/intl.dart');
-#import('../lib/date_time_patterns.dart');
-#import('../lib/date_symbol_data_local.dart');
-#import('date_time_format_test_core.dart');
+import '../lib/intl.dart';
+import '../lib/date_time_patterns.dart';
+import '../lib/date_symbol_data_local.dart';
+import 'date_time_format_test_core.dart';
 
 runWith([Function getSubset]) {
   // Initialize one locale just so we know what the list is.
diff --git a/pkg/intl/test/date_time_format_test_core.dart b/pkg/intl/test/date_time_format_test_core.dart
index 36d35b9..8be3aab 100644
--- a/pkg/intl/test/date_time_format_test_core.dart
+++ b/pkg/intl/test/date_time_format_test_core.dart
@@ -8,12 +8,12 @@
  * be run on its own, but rather to be imported and run from another test file.
  */
 
-#library('date_time_format_tests');
+library date_time_format_tests;
 
-#import('../../../pkg/unittest/unittest.dart');
-#import('date_time_format_test_data.dart');
-#import('../lib/intl.dart');
-#import('../lib/src/date_format_internal.dart');
+import '../../../pkg/unittest/unittest.dart';
+import 'date_time_format_test_data.dart';
+import '../lib/intl.dart';
+import '../lib/src/date_format_internal.dart';
 
 var formatsToTest = const [
   DateFormat.DAY,
@@ -258,8 +258,9 @@
     // Workaround for a dartj2 issue that treats the keys as immutable
     symbols = new List.from(symbols);
     symbols.sort(compare);
-    for (var i = 0; i < patterns.length; i++)
+    for (var i = 0; i < patterns.length; i++) {
       expect(patterns[i], equals(symbols[i]));
+    }
     expect(patterns.length, equals(symbols.length));
   });
 
diff --git a/pkg/intl/test/date_time_format_test_data.dart b/pkg/intl/test/date_time_format_test_data.dart
index ee542cc..eae473c 100644
--- a/pkg/intl/test/date_time_format_test_data.dart
+++ b/pkg/intl/test/date_time_format_test_data.dart
@@ -11,7 +11,7 @@
 // TODO(alanknight): Test more locales and a wider variety of test data,
 // possibly by generating test data out of ICU.
 
-#library('date_time_format_test_data');
+library date_time_format_test_data;
 
 var English = const {
   "DAY" : "27",
diff --git a/pkg/intl/test/find_default_locale_browser_test.dart b/pkg/intl/test/find_default_locale_browser_test.dart
index b44a347..29b6523 100644
--- a/pkg/intl/test/find_default_locale_browser_test.dart
+++ b/pkg/intl/test/find_default_locale_browser_test.dart
@@ -2,11 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('find_default_locale_browser_test');
+library find_default_locale_browser_test;
 
-#import('../lib/intl.dart');
-#import('../lib/intl_browser.dart');
-#import('../../unittest/unittest.dart');
+import '../lib/intl.dart';
+import '../lib/intl_browser.dart';
+import '../../unittest/unittest.dart';
 
 main() {
   test("Find system locale in browser", () {
diff --git a/pkg/intl/test/find_default_locale_standalone_test.dart b/pkg/intl/test/find_default_locale_standalone_test.dart
index f0d231e..0e3a150 100644
--- a/pkg/intl/test/find_default_locale_standalone_test.dart
+++ b/pkg/intl/test/find_default_locale_standalone_test.dart
@@ -2,11 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('find_default_locale_browser_test');
+library find_default_locale_browser_test;
 
-#import('../lib/intl.dart');
-#import('../lib/intl_standalone.dart');
-#import('../../unittest/unittest.dart');
+import '../lib/intl.dart';
+import '../lib/intl_standalone.dart';
+import '../../unittest/unittest.dart';
 
 main() {
   test("Find system locale standalone", () {
diff --git a/pkg/intl/test/intl_message_basic_example_test.dart b/pkg/intl/test/intl_message_basic_example_test.dart
index 47c1817..3bf4ce6 100644
--- a/pkg/intl/test/intl_message_basic_example_test.dart
+++ b/pkg/intl/test/intl_message_basic_example_test.dart
@@ -5,13 +5,13 @@
 /**
  * Tests internationalization of messages using the basic example as a template.
  */
-#library('intl_message_test_2');
+library intl_message_test_2;
 
-#import('../lib/date_symbol_data_local.dart');
-#import('../lib/intl.dart');
-#import('../lib/message_lookup_local.dart');
-#import('../example/basic/basic_example.dart');
-#import('../../unittest/unittest.dart');
+import '../lib/date_symbol_data_local.dart';
+import '../lib/intl.dart';
+import '../lib/message_lookup_local.dart';
+import '../example/basic/basic_example.dart';
+import '../../unittest/unittest.dart';
 
 List list;
 
diff --git a/pkg/intl/test/intl_message_test.dart b/pkg/intl/test/intl_message_test.dart
index 62ddde5..c15ee5b 100644
--- a/pkg/intl/test/intl_message_test.dart
+++ b/pkg/intl/test/intl_message_test.dart
@@ -2,11 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('intl_message_test');
+library intl_message_test;
 
-#import('../lib/intl.dart');
-#import('../../unittest/unittest.dart');
-#import('../lib/message_lookup_local.dart');
+import '../lib/intl.dart';
+import '../../unittest/unittest.dart';
+import '../lib/message_lookup_local.dart';
 
 /** Tests the MessageFormat library in dart. */
 
diff --git a/pkg/intl/test/intl_test.dart b/pkg/intl/test/intl_test.dart
index acf959a..519497d 100644
--- a/pkg/intl/test/intl_test.dart
+++ b/pkg/intl/test/intl_test.dart
@@ -2,12 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('intl_test');
+library intl_test;
 
-#import('../lib/intl.dart');
+import '../lib/intl.dart';
 // TODO(rnystrom): Use "package:" import when test.dart supports it (#4968).
-#import('../../unittest/unittest.dart');
-#import('../lib/date_symbol_data_local.dart');
+import '../../unittest/unittest.dart';
+import '../lib/date_symbol_data_local.dart';
 
 main() {
   test("Locale setting doesn't verify the core locale", () {
diff --git a/pkg/intl/test/number_format_test.dart b/pkg/intl/test/number_format_test.dart
index 2504ae9..b0baf21 100644
--- a/pkg/intl/test/number_format_test.dart
+++ b/pkg/intl/test/number_format_test.dart
@@ -4,11 +4,11 @@
  * BSD-style license that can be found in the LICENSE file.
  */
 
-#library('number_format_test');
+library number_format_test;
 
-#import('../../../pkg/unittest/unittest.dart');
-#import('../lib/number_format.dart');
-#import('../lib/intl.dart');
+import '../../../pkg/unittest/unittest.dart';
+import '../lib/number_format.dart';
+import '../lib/intl.dart';
 
 /**
  * Tests the Numeric formatting library in dart.
diff --git a/pkg/intl/tool/generate_locale_data_files.dart b/pkg/intl/tool/generate_locale_data_files.dart
index 6cec6ac..81521f9 100644
--- a/pkg/intl/tool/generate_locale_data_files.dart
+++ b/pkg/intl/tool/generate_locale_data_files.dart
@@ -12,13 +12,13 @@
  * which is sourced by the date_symbol_data... files.
  */
 
-#import('../lib/date_symbols.dart');
-#import('../lib/date_symbol_data_local.dart');
-#import('../lib/date_time_patterns.dart');
-#import('../lib/intl.dart');
-#import('dart:io');
-#import('dart:json');
-#import('../test/data_directory.dart');
+import '../lib/date_symbols.dart';
+import '../lib/date_symbol_data_local.dart';
+import '../lib/date_time_patterns.dart';
+import '../lib/intl.dart';
+import 'dart:io';
+import 'dart:json';
+import '../test/data_directory.dart';
 
 main() {
   initializeDateFormatting("en_IGNORED", null);
@@ -72,6 +72,6 @@
   outputStream.close();
 }
 
-void writeToJSON(Dynamic data, OutputStream out) {
+void writeToJSON(dynamic data, OutputStream out) {
   out.writeString(JSON.stringify(data.serializeToMap()));
 }
\ No newline at end of file
diff --git a/pkg/logging/test/logging_test.dart b/pkg/logging/test/logging_test.dart
index e975dbd..a3e1cd5d 100644
--- a/pkg/logging/test/logging_test.dart
+++ b/pkg/logging/test/logging_test.dart
@@ -12,21 +12,21 @@
 main() {
   test('level comparison is a valid comparator', () {
     var level1 = const Level('NOT_REAL1', 253);
-    expect(level1 == level1);
-    expect(level1 <= level1);
-    expect(level1 >= level1);
+    expect(level1 == level1, isTrue);
+    expect(level1 <= level1, isTrue);
+    expect(level1 >= level1, isTrue);
     expect(level1 < level1, isFalse);
     expect(level1 > level1, isFalse);
 
     var level2 = const Level('NOT_REAL2', 455);
-    expect(level1 <= level2);
-    expect(level1 < level2);
-    expect(level2 >= level1);
-    expect(level2 > level1);
+    expect(level1 <= level2, isTrue);
+    expect(level1 < level2, isTrue);
+    expect(level2 >= level1, isTrue);
+    expect(level2 > level1, isTrue);
 
     var level3 = const Level('NOT_REAL3', 253);
-    expect(level1 !== level3); // different instances
-    expect(level1 == level3); // same value.
+    expect(level1 !== level3, isTrue); // different instances
+    expect(level1 == level3, isTrue); // same value.
   });
 
   test('default levels are in order', () {
@@ -37,7 +37,7 @@
 
     for (int i = 0; i < levels.length; i++) {
       for (int j = i + 1; j < levels.length; j++) {
-        expect(levels[i] < levels[j]);
+        expect(levels[i] < levels[j], isTrue);
       }
     }
   });
@@ -91,10 +91,10 @@
     Logger a = new Logger('a');
     Logger b = new Logger('a.b');
     Logger c = new Logger('a.c');
-    expect(a == b.parent);
-    expect(a == c.parent);
-    expect(a.children['b'] == b);
-    expect(a.children['c'] == c);
+    expect(a == b.parent, isTrue);
+    expect(a == c.parent, isTrue);
+    expect(a.children['b'] == b, isTrue);
+    expect(a.children['c'] == c, isTrue);
   });
 
   test('loggers are singletons', () {
@@ -102,10 +102,10 @@
     Logger a2 = new Logger('a');
     Logger b = new Logger('a.b');
     Logger root = Logger.root;
-    expect(a1 === a2);
-    expect(a1 === b.parent);
-    expect(root === a1.parent);
-    expect(root === new Logger(''));
+    expect(a1 === a2, isTrue);
+    expect(a1 === b.parent, isTrue);
+    expect(root === a1.parent, isTrue);
+    expect(root === new Logger(''), isTrue);
   });
 
   group('mutating levels', () {
@@ -172,12 +172,12 @@
       c.level = Level.ALL;
       e.level = Level.OFF;
 
-      expect(root.isLoggable(Level.SHOUT));
-      expect(root.isLoggable(Level.SEVERE));
-      expect(!root.isLoggable(Level.WARNING));
-      expect(c.isLoggable(Level.FINEST));
-      expect(c.isLoggable(Level.FINE));
-      expect(!e.isLoggable(Level.SHOUT));
+      expect(root.isLoggable(Level.SHOUT), isTrue);
+      expect(root.isLoggable(Level.SEVERE), isTrue);
+      expect(root.isLoggable(Level.WARNING), isFalse);
+      expect(c.isLoggable(Level.FINEST), isTrue);
+      expect(c.isLoggable(Level.FINE), isTrue);
+      expect(!e.isLoggable(Level.SHOUT), isTrue);
     });
 
     test('add/remove handlers - no hierarchy', () {
diff --git a/pkg/pkg.status b/pkg/pkg.status
index 9c6ef9a..4d2c5e5 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -4,7 +4,7 @@
 
 # Run this test manually to verify that the fixnum library produces
 # the same results as native ints on a set of directed and random inputs.
-# Skip it when runnimng automated tests because it times out.  This
+# Skip it when running automated tests because it times out.  This
 # test only makes sense on runtimes that support 64-bit integer
 # arithmetic natively, i.e., the VM.
 fixnum/test/int_64_vm_test: Skip
@@ -26,11 +26,23 @@
 [ $runtime == vm ]
 intl/test/find_default_locale_browser_test: Skip
 intl/test/date_time_format_http_request_test: Skip
+unittest/test/mock_test: Fail  # noSuchMethod InvocationMirror not correct yet.
 
-# Skip http request tests on Dartium while resolving an odd		
-# error there that causes the tests to timeout.	      
-[ $runtime == dartium || $runtime == drt ]		
-intl/test/date_time_format_http_request_test: Skip	      
+# Skip http request tests on Dartium while resolving an odd
+# error there that causes the tests to timeout.
+[ $runtime == dartium || $runtime == drt ]
+intl/test/date_time_format_http_request_test: Skip
+
+[ $runtime == drt && $compiler == none ]
+intl/test/bidi_format_test: Fail # New import syntax is not supported by test frameowrk
+intl/test/bidi_utils_test: Fail # New import syntax is not supported by test frameowrk
+intl/test/date_time_format_local_even_test: Fail # New import syntax is not supported by test frameowrk
+intl/test/date_time_format_local_odd_test: Fail # New import syntax is not supported by test frameowrk
+intl/test/find_default_locale_browser_test: Fail # New import syntax is not supported by test frameowrk
+intl/test/intl_message_basic_example_test: Fail # New import syntax is not supported by test frameowrk
+intl/test/intl_message_test: Fail # New import syntax is not supported by test frameowrk
+intl/test/intl_test: Fail # New import syntax is not supported by test frameowrk
+intl/test/number_format_test: Fail # New import syntax is not supported by test frameowrk
 
 # Skip intl_message tests that use mirrors on dart2js until it's been
 # implemented there.
@@ -42,9 +54,17 @@
 unittest/test/mock_regexp_negative_test: Fail
 unittest/test/mock_stepwise_negative_test: Fail
 
+# pkg issue 6340
+fixnum/test/int_32_test: Fail, OK
+fixnum/test/int_64_test: Fail, OK
+unittest/test/matchers_test: Fail, OK
+
+
 [ $compiler == dart2js || $compiler == dartc ]
 unittest/test/instance_test: Skip
 
 [ $compiler == none && $runtime == drt ]
 dartdoc/test/dartdoc_test: Skip # See dartbug.com/4541.
 
+[ $compiler == none && ($runtime == dartium || $runtime == drt) ]
+unittest/test/mock_test: Fail
diff --git a/pkg/unittest/collection_matchers.dart b/pkg/unittest/collection_matchers.dart
index 9fe854f..4f8de3b 100644
--- a/pkg/unittest/collection_matchers.dart
+++ b/pkg/unittest/collection_matchers.dart
@@ -6,6 +6,9 @@
  * Returns a matcher which matches [Collection]s in which all elements
  * match the given [matcher].
  */
+
+part of unittest;
+
 Matcher everyElement(matcher) => new _EveryElement(wrapMatcher(matcher));
 
 class _EveryElement extends _CollectionMatcher {
diff --git a/pkg/unittest/config.dart b/pkg/unittest/config.dart
index 5a8b4bc..5dda552 100644
--- a/pkg/unittest/config.dart
+++ b/pkg/unittest/config.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/** This file is sourced by unitest.dart. */
+part of unittest;
 
 /**
  * Hooks to configure the unittest library for different platforms. This class
@@ -10,6 +10,7 @@
  * advantage of the platform can create a subclass and override methods from
  * this class.
  */
+
 class Configuration {
   TestCase currentTestCase = null;
 
diff --git a/pkg/unittest/core_matchers.dart b/pkg/unittest/core_matchers.dart
index a84db59..fc40400 100644
--- a/pkg/unittest/core_matchers.dart
+++ b/pkg/unittest/core_matchers.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+part of unittest;
 
 /**
  * Returns a matcher that matches empty strings, maps or collections.
@@ -215,6 +216,11 @@
  * Type wrapper; e.g.:
  *
  *     expect(bar, new isInstanceOf<Foo>('Foo'));
+ *
+ * Note that this does not currently work in dart2js; it will
+ * match any type, and isNot(new isInstanceof<T>()) will always
+ * fail. This is because dart2js currently ignores template type
+ * parameters.
  */
 class isInstanceOf<T> extends BaseMatcher {
   final String _name;
@@ -280,7 +286,7 @@
       // completes.
       item.onComplete(expectAsync1((future) {
         if (future.hasValue) {
-          expect(false, isTrue,
+          expect(false, isTrue, reason:
               "Expected future to fail, but succeeded with '${future.value}'.");
         } else if (_matcher != null) {
           var reason;
@@ -289,7 +295,7 @@
             stackTrace = "  ${stackTrace.replaceAll("\n", "\n  ")}";
             reason = "Actual exception trace:\n$stackTrace";
           }
-          expect(future.exception, _matcher, reason);
+          expect(future.exception, _matcher, reason: reason);
         }
       }));
 
@@ -393,9 +399,9 @@
  * for each exception type.
  */
 
-abstract class ExceptionMatcher extends BaseMatcher {
+abstract class TypeMatcher extends BaseMatcher {
   final String _name;
-  const ExceptionMatcher(this._name);
+  const TypeMatcher(this._name);
   Description describe(Description description) =>
       description.add(_name);
 }
@@ -403,11 +409,11 @@
 /** A matcher for FormatExceptions. */
 const isFormatException = const _FormatException();
 
-/** A matcher for functions that throw FormatException */
+/** A matcher for functions that throw FormatException. */
 const Matcher throwsFormatException =
     const Throws(isFormatException);
 
-class _FormatException extends ExceptionMatcher {
+class _FormatException extends TypeMatcher {
   const _FormatException() : super("FormatException");
   bool matches(item, MatchState matchState) => item is FormatException;
 }
@@ -415,10 +421,10 @@
 /** A matcher for Exceptions. */
 const isException = const _Exception();
 
-/** A matcher for functions that throw Exception */
+/** A matcher for functions that throw Exception. */
 const Matcher throwsException = const Throws(isException);
 
-class _Exception extends ExceptionMatcher {
+class _Exception extends TypeMatcher {
   const _Exception() : super("Exception");
   bool matches(item, MatchState matchState) => item is Exception;
 }
@@ -426,11 +432,11 @@
 /** A matcher for ArgumentErrors. */
 const isArgumentError = const _ArgumentError();
 
-/** A matcher for functions that throw ArgumentError */
+/** A matcher for functions that throw ArgumentError. */
 const Matcher throwsArgumentError =
     const Throws(isArgumentError);
 
-class _ArgumentError extends ExceptionMatcher {
+class _ArgumentError extends TypeMatcher {
   const _ArgumentError() : super("ArgumentError");
   bool matches(item, MatchState matchState) => item is ArgumentError;
 }
@@ -438,35 +444,35 @@
 /** A matcher for IllegalJSRegExpExceptions. */
 const isIllegalJSRegExpException = const _IllegalJSRegExpException();
 
-/** A matcher for functions that throw IllegalJSRegExpException */
+/** A matcher for functions that throw IllegalJSRegExpException. */
 const Matcher throwsIllegalJSRegExpException =
     const Throws(isIllegalJSRegExpException);
 
-class _IllegalJSRegExpException extends ExceptionMatcher {
+class _IllegalJSRegExpException extends TypeMatcher {
   const _IllegalJSRegExpException() : super("IllegalJSRegExpException");
   bool matches(item, MatchState matchState) => item is IllegalJSRegExpException;
 }
 
-/** A matcher for IndexOutOfRangeExceptions. */
-const isIndexOutOfRangeException = const _IndexOutOfRangeException();
+/** A matcher for RangeErrors. */
+const isRangeError = const _RangeError();
 
-/** A matcher for functions that throw IndexOutOfRangeException */
-const Matcher throwsIndexOutOfRangeException =
-    const Throws(isIndexOutOfRangeException);
+/** A matcher for functions that throw RangeError */
+const Matcher throwsRangeError =
+    const Throws(isRangeError);
 
-class _IndexOutOfRangeException extends ExceptionMatcher {
-  const _IndexOutOfRangeException() : super("IndexOutOfRangeException");
-  bool matches(item, MatchState matchState) => item is IndexOutOfRangeException;
+class _RangeError extends TypeMatcher {
+  const _RangeError() : super("RangeError");
+  bool matches(item, MatchState matchState) => item is RangeError;
 }
 
 /** A matcher for NoSuchMethodErrors. */
 const isNoSuchMethodError = const _NoSuchMethodError();
 
-/** A matcher for functions that throw NoSuchMethodError */
+/** A matcher for functions that throw NoSuchMethodError. */
 const Matcher throwsNoSuchMethodError =
     const Throws(isNoSuchMethodError);
 
-class _NoSuchMethodError extends ExceptionMatcher {
+class _NoSuchMethodError extends TypeMatcher {
   const _NoSuchMethodError() : super("NoSuchMethodError");
   bool matches(item, MatchState matchState) => item is NoSuchMethodError;
 }
@@ -474,11 +480,11 @@
 /** A matcher for NotImplementedExceptions. */
 const isNotImplementedException = const _NotImplementedException();
 
-/** A matcher for functions that throw Exception */
+/** A matcher for functions that throw Exception. */
 const Matcher throwsNotImplementedException =
     const Throws(isNotImplementedException);
 
-class _NotImplementedException extends ExceptionMatcher {
+class _NotImplementedException extends TypeMatcher {
   const _NotImplementedException() : super("NotImplementedException");
   bool matches(item, MatchState matchState) => item is NotImplementedException;
 }
@@ -486,27 +492,41 @@
 /** A matcher for NullPointerExceptions. */
 const isNullPointerException = const _NullPointerException();
 
-/** A matcher for functions that throw NotNullPointerException */
+/** A matcher for functions that throw NotNullPointerException. */
 const Matcher throwsNullPointerException =
     const Throws(isNullPointerException);
 
-class _NullPointerException extends ExceptionMatcher {
+class _NullPointerException extends TypeMatcher {
   const _NullPointerException() : super("NullPointerException");
   bool matches(item, MatchState matchState) => item is NullPointerException;
 }
 
-/** A matcher for UnsupportedErrors. */
+/** A matcher for UnsupportedError. */
 const isUnsupportedError = const _UnsupportedError();
 
-/** A matcher for functions that throw UnsupportedError */
-const Matcher throwsUnsupportedError =
-    const Throws(isUnsupportedError);
+/** A matcher for functions that throw UnsupportedError. */
+const Matcher throwsUnsupportedError = const Throws(isUnsupportedError);
 
-class _UnsupportedError extends ExceptionMatcher {
+class _UnsupportedError extends TypeMatcher {
   const _UnsupportedError() :
       super("UnsupportedError");
-  bool matches(item, MatchState matchState) =>
-      item is UnsupportedError;
+  bool matches(item, MatchState matchState) => item is UnsupportedError;
+}
+
+/** A matcher for Map types. */
+const isMap = const _IsMap();
+
+class _IsMap extends TypeMatcher {
+  const _IsMap() : super("Map");
+  bool matches(item, MatchState matchState) => item is Map;
+}
+
+/** A matcher for List types. */
+const isList = const _IsList();
+
+class _IsList extends TypeMatcher {
+  const _IsList() : super("List");
+  bool matches(item, MatchState matchState) => item is List;
 }
 
 /**
@@ -610,7 +630,7 @@
  * Returns a matcher that uses an arbitrary function that returns
  * true or false for the actual value.
  */
-Matcher predicate(f, {description: 'satisfies function'}) =>
+Matcher predicate(f, [description ='satisfies function']) =>
     new _Predicate(f, description);
 
 class _Predicate extends BaseMatcher {
@@ -647,7 +667,7 @@
  *
  *      expect(inventoryItem, new HasPrice(greaterThan(0)));
  */
-abstract class CustomMatcher extends BaseMatcher {
+class CustomMatcher extends BaseMatcher {
   final String _featureDescription;
   final String _featureName;
   final Matcher _matcher;
@@ -655,8 +675,8 @@
   const CustomMatcher(this._featureDescription, this._featureName,
       this._matcher);
 
-  /** Implement this to extract the interesting feature.*/
-  featureValueOf(actual);
+  /** Override this to extract the interesting feature.*/
+  featureValueOf(actual) => actual;
 
   bool matches(item, MatchState matchState) {
     var f = featureValueOf(item);
diff --git a/pkg/unittest/description.dart b/pkg/unittest/description.dart
index 7b9f023..6652e6b 100644
--- a/pkg/unittest/description.dart
+++ b/pkg/unittest/description.dart
@@ -7,6 +7,8 @@
  * could be supported.
  */
 
+part of unittest;
+
 class StringDescription implements Description {
   var _out;
 
diff --git a/pkg/unittest/expect.dart b/pkg/unittest/expect.dart
index 4ef7a56..1269493 100644
--- a/pkg/unittest/expect.dart
+++ b/pkg/unittest/expect.dart
@@ -2,14 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+part of unittest;
+
 /**
  * This is the main assertion function. It asserts that [actual]
- * matches the [matcher]. [matcher] is optional and defaults to isTrue,
- * so expect can be used with a single predicate argument. [reason]
- * is optional and is typically not supplied if a reasonable matcher is
- * explicitly provided, as a reason can be generated from the matcher.
- * If [reason] is included it is appended to the reason generated
- * by the matcher.
+ * matches the [matcher]. [reason] is optional and is typically not
+ * supplied, as a reason is generated from the matcher; if [reason]
+ * is included it is appended to the reason generated by the matcher.
  *
  * [matcher] can be a value in which case it will be wrapped in an
  * [equals] matcher.
@@ -33,9 +32,8 @@
  *     [Hamcrest] http://code.google.com/p/hamcrest/
  *     [dart-matchers] https://github.com/Ladicek/dart-matchers
  */
-void expect(actual, [matcher = isTrue, String reason = null,
-            FailureHandler failureHandler = null,
-            bool verbose = false]) {
+void expect(actual, matcher, {String reason, FailureHandler failureHandler,
+            bool verbose : false}) {
   matcher = wrapMatcher(matcher);
   bool doesMatch;
   var matchState = new MatchState();
diff --git a/pkg/unittest/future_matchers.dart b/pkg/unittest/future_matchers.dart
index c72037e..87d30f2 100644
--- a/pkg/unittest/future_matchers.dart
+++ b/pkg/unittest/future_matchers.dart
@@ -11,6 +11,9 @@
  * To test that a Future completes with an exception, you can use [throws] and
  * [throwsA].
  */
+
+part of unittest;
+
 Matcher completes = const _Completes(null);
 
 /**
@@ -41,7 +44,7 @@
         reason = '$reason\nStack trace:\n$stackTrace';
       }
 
-      expect(future.hasValue, isTrue, reason);
+      expect(future.hasValue, isTrue, reason: reason);
       if (_matcher != null) expect(future.value, _matcher);
     }));
 
diff --git a/pkg/unittest/html_config.dart b/pkg/unittest/html_config.dart
index ffac7f5..e7a5dbd 100644
--- a/pkg/unittest/html_config.dart
+++ b/pkg/unittest/html_config.dart
@@ -5,7 +5,7 @@
 /**
  * A simple unit test library for running tests in a browser.
  */
-#library('unittest');
+#library('unittest_html_config');
 
 #import('dart:html');
 #import('unittest.dart');
diff --git a/pkg/unittest/html_enhanced_config.dart b/pkg/unittest/html_enhanced_config.dart
index af88f4b..65d0e47 100644
--- a/pkg/unittest/html_enhanced_config.dart
+++ b/pkg/unittest/html_enhanced_config.dart
@@ -8,7 +8,7 @@
  * Provides enhanced HTML output with collapsible group headers
  * and other at-a-glance information about the test results.
  */
-#library('unittest');
+#library('unittest_html_enhanced_config');
 
 #import('dart:html');
 #import('unittest.dart');
diff --git a/pkg/unittest/interactive_html_config.dart b/pkg/unittest/interactive_html_config.dart
index 3780ea1..f8f3a81 100644
--- a/pkg/unittest/interactive_html_config.dart
+++ b/pkg/unittest/interactive_html_config.dart
@@ -9,7 +9,7 @@
  * config that manages all the tests, and a 'child' config for the
  * IFrame that runs the individual tests.
  */
-#library('interactive_config');
+#library('unittest_interactive_html_config');
 
 // TODO(gram) - add options for: remove IFrame on done/keep
 // IFrame for failed tests/keep IFrame for all tests.
diff --git a/pkg/unittest/interfaces.dart b/pkg/unittest/interfaces.dart
index 5423efa..42c498b 100644
--- a/pkg/unittest/interfaces.dart
+++ b/pkg/unittest/interfaces.dart
@@ -13,6 +13,9 @@
  * is replaced it may be desirable to replace the [stringDescription]
  * error formatter with another.
  */
+
+part of unittest;
+
 typedef String ErrorFormatter(actual, Matcher matcher, String reason,
     MatchState matchState, bool verbose);
 
@@ -25,19 +28,19 @@
  */
 abstract class Description {
   /** Change the value of the description. */
-  abstract Description replace(String text);
+  Description replace(String text);
 
   /** This is used to add arbitrary text to the description. */
-  abstract Description add(String text);
+  Description add(String text);
 
   /** This is used to add a meaningful description of a value. */
-  abstract Description addDescriptionOf(value);
+  Description addDescriptionOf(value);
 
   /**
    * This is used to add a description of an [Iterable] [list],
    * with appropriate [start] and [end] markers and inter-element [separator].
    */
-  abstract Description addAll(String start, String separator, String end,
+  Description addAll(String start, String separator, String end,
                      Iterable list);
 }
 
@@ -56,10 +59,10 @@
    * and may be used to add details about the mismatch that are too
    * costly to determine in [describeMismatch].
    */
-  abstract bool matches(item, MatchState matchState);
+  bool matches(item, MatchState matchState);
 
   /** This builds a textual description of the matcher. */
-  abstract Description describe(Description description);
+  Description describe(Description description);
 
   /**
    * This builds a textual description of a specific mismatch. [item]
@@ -71,7 +74,7 @@
    * information that is not typically included but can be of help in
    * diagnosing failures, such as stack traces.
    */
-  abstract Description describeMismatch(item, Description mismatchDescription,
+  Description describeMismatch(item, Description mismatchDescription,
       MatchState matchState, bool verbose);
 }
 
@@ -83,7 +86,7 @@
  */
 abstract class FailureHandler {
   /** This handles failures given a textual decription */
-  abstract void fail(String reason);
+  void fail(String reason);
 
   /**
    * This handles failures given the actual [value], the [matcher]
@@ -93,7 +96,7 @@
    * these to create a detailed error message (typically by calling
    * an [ErrorFormatter]) and then call [fail] with this message.
    */
-  abstract void failMatch(actual, Matcher matcher, String reason,
+  void failMatch(actual, Matcher matcher, String reason,
                  MatchState matchState, bool verbose);
 }
 
diff --git a/pkg/unittest/map_matchers.dart b/pkg/unittest/map_matchers.dart
index 96edb34..e4b40ba 100644
--- a/pkg/unittest/map_matchers.dart
+++ b/pkg/unittest/map_matchers.dart
@@ -5,6 +5,9 @@
 /**
  * Returns a matcher which matches maps containing the given [value].
  */
+
+part of unittest;
+
 Matcher containsValue(value) => new _ContainsValue(value);
 
 class _ContainsValue extends BaseMatcher {
diff --git a/pkg/unittest/matcher.dart b/pkg/unittest/matcher.dart
index 1f910f0..1c430f1 100644
--- a/pkg/unittest/matcher.dart
+++ b/pkg/unittest/matcher.dart
@@ -13,6 +13,9 @@
  * state, if set, will typically be a [Map] with a number of key-value
  * pairs containing relevant state information.
  */
+
+part of unittest;
+
 class MatchState {
   var state = null;
 
@@ -35,13 +38,13 @@
    * [matchState] may be used to return additional info for
    * the use of [describeMismatch].
    */
-  abstract bool matches(item, MatchState matchState);
+  bool matches(item, MatchState matchState);
 
   /**
    * Creates a textual description of a matcher,
    * by appending to [mismatchDescription].
    */
-  abstract Description describe(Description mismatchDescription);
+  Description describe(Description mismatchDescription);
 
   /**
    * Generates a description of the matcher failed for a particular
diff --git a/pkg/unittest/mock.dart b/pkg/unittest/mock.dart
index dd2ae53..f0f5765 100644
--- a/pkg/unittest/mock.dart
+++ b/pkg/unittest/mock.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+part of unittest;
+
 /**
  * The error formatter for mocking is a bit different from the default one
  * for unit testing; instead of the third argument being a 'reason'
@@ -432,7 +434,7 @@
       _mockFailureHandler =
           new _MockFailureHandler(getOrCreateExpectFailureHandler());
     }
-    expect(logs, matcher, filter, _mockFailureHandler);
+    expect(logs, matcher, reason:filter, failureHandler: _mockFailureHandler);
     return this;
   }
 
@@ -1274,10 +1276,17 @@
    * return value. If we find no [Behavior] to apply an exception is
    * thrown.
    */
-  noSuchMethod(String method, List args) {
-    if (method.startsWith('get:')) {
-      method = 'get ${method.substring(4)}';
+  noSuchMethod(InvocationMirror invocation) {
+    String method = invocation.memberName;
+    // Remove this when InvocationMirror works correctly.
+    if (method.startsWith("get:")) method = method.substring(4);
+
+    if (invocation.isGetter) {
+      method = 'get $method';
     }
+    List args = invocation.positionalArguments;
+    // TODO: Handle named arguments too.
+
     bool matchedMethodName = false;
     MatchState matchState = new MatchState();
     for (String k in _behaviors.keys) {
diff --git a/pkg/unittest/numeric_matchers.dart b/pkg/unittest/numeric_matchers.dart
index 3093a1e..bb4cb96 100644
--- a/pkg/unittest/numeric_matchers.dart
+++ b/pkg/unittest/numeric_matchers.dart
@@ -6,6 +6,9 @@
  * Returns a matcher which matches if the match argument is greater
  * than the given [value].
  */
+
+part of unittest;
+
 Matcher greaterThan(value) =>
   new _OrderingComparison(value, false, false, true, 'a value greater than');
 
diff --git a/pkg/unittest/operator_matchers.dart b/pkg/unittest/operator_matchers.dart
index 5295500..183be06 100644
--- a/pkg/unittest/operator_matchers.dart
+++ b/pkg/unittest/operator_matchers.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+part of unittest;
+
 /**
  * This returns a matcher that inverts [matcher] to its logical negation.
  */
diff --git a/pkg/unittest/string_matchers.dart b/pkg/unittest/string_matchers.dart
index 40fe5a0..8899379 100644
--- a/pkg/unittest/string_matchers.dart
+++ b/pkg/unittest/string_matchers.dart
@@ -6,6 +6,9 @@
  * Returns a matcher which matches if the match argument is a string and
  * is equal to [value] when compared case-insensitively.
  */
+
+part of unittest;
+
 Matcher equalsIgnoringCase(String value) => new _IsEqualIgnoringCase(value);
 
 class _IsEqualIgnoringCase extends _StringMatcher {
@@ -127,6 +130,7 @@
  * For example, `stringContainsInOrder(["a", "e", "i", "o", "u"])` will match
  * "abcdefghijklmnopqrstuvwxyz".
  */
+
 Matcher stringContainsInOrder(substrings) =>
     new _StringContainsInOrder(substrings);
 
diff --git a/pkg/unittest/test/matchers_test.dart b/pkg/unittest/test/matchers_test.dart
index 9736c75..fe400f0 100644
--- a/pkg/unittest/test/matchers_test.dart
+++ b/pkg/unittest/test/matchers_test.dart
@@ -125,14 +125,14 @@
             "IllegalJSRegExpException.");
     });
 
-    test('throwsIndexOutOfRangeException', () {
-      shouldPass(() { throw new IndexOutOfRangeException(0); },
-          throwsIndexOutOfRangeException);
+    test('throwsRangeError', () {
+      shouldPass(() { throw new RangeError.value(0); },
+          throwsRangeError);
       shouldFail(() { throw new Exception(); },
-          throwsIndexOutOfRangeException,
-        "Expected: throws an exception which matches IndexOutOfRangeException "
+          throwsRangeError,
+        "Expected: throws an exception which matches RangeError "
         "but:  exception <Exception> does not match "
-            "IndexOutOfRangeException.");
+            "RangeError.");
     });
 
     test('throwsNoSuchMethodError', () {
@@ -170,8 +170,7 @@
           throwsUnsupportedError);
       shouldFail(() { throw new Exception(); },
           throwsUnsupportedError,
-        "Expected: throws an exception which matches "
-            "UnsupportedError "
+        "Expected: throws an exception which matches UnsupportedError "
         "but:  exception <Exception> does not match "
             "UnsupportedError.");
     });
@@ -527,11 +526,9 @@
 
   group('Predicate Matchers', () {
     test('isInstanceOf', () {
-      shouldFail(0, predicate((x) => x is String,
-                              description: "an instance of String"),
+      shouldFail(0, predicate((x) => x is String, "an instance of String"),
           "Expected: an instance of String but: was <0>.");
-      shouldPass('cow', predicate((x) => x is String,
-                                  description: "an instance of String"));
+      shouldPass('cow', predicate((x) => x is String, "an instance of String"));
     });
   });
 
diff --git a/pkg/unittest/test/unittest_test.dart b/pkg/unittest/test/unittest_test.dart
index ba85f39..ecf6c89 100644
--- a/pkg/unittest/test/unittest_test.dart
+++ b/pkg/unittest/test/unittest_test.dart
@@ -133,8 +133,8 @@
       test('testOne', () {
         var f = expectAsync0(() {});
         _defer(protectAsync0(() {
-          _defer(protectAsync0(() => expect(false)));
-          expect(false);
+          _defer(protectAsync0(() => expect(false, isTrue)));
+          expect(false, isTrue);
         }));
       });
       test('testTwo', () {
diff --git a/pkg/unittest/test_case.dart b/pkg/unittest/test_case.dart
index f39d045..bf4f1a2 100644
--- a/pkg/unittest/test_case.dart
+++ b/pkg/unittest/test_case.dart
@@ -8,6 +8,9 @@
  */
 
 /** Summarizes information about a single test case. */
+
+part of unittest;
+
 class TestCase {
   /** Identifier for this test. */
   final int id;
diff --git a/pkg/unittest/test_controller.js b/pkg/unittest/test_controller.js
index 2f46fe1..94c9f2f 100644
--- a/pkg/unittest/test_controller.js
+++ b/pkg/unittest/test_controller.js
@@ -7,6 +7,17 @@
  * DumpRenderTree.
  */
 
+// Clear the console before every test run - this is Firebug specific code.
+if (typeof console == "object" && typeof console.clear == "function") {
+  console.clear();
+}
+// Set window onerror to make sure that we catch test harness errors across all
+// browsers.
+window.onerror = function (message, url, lineNumber) {
+  showErrorAndExit("\n\n" + url + ":" + lineNumber + ":\n" + message + "\n\n");
+  window.postMessage('unittest-suite-external-error', '*');
+};
+
 if (navigator.webkitStartDart) {
   navigator.webkitStartDart();
 }
diff --git a/pkg/unittest/unittest.dart b/pkg/unittest/unittest.dart
index 29a18c8..4f7bdf0 100644
--- a/pkg/unittest/unittest.dart
+++ b/pkg/unittest/unittest.dart
@@ -5,8 +5,18 @@
 /**
  * A library for writing dart unit tests.
  *
- * To import this library, specify the relative path to
- * pkg/unittest/unittest.dart.
+ * To import this library, use the pub package manager.
+ * Create a pubspec.yaml file in your project and add
+ * a dependency on unittest with the following lines:
+ *     dependencies:
+ *       unittest:
+ *         sdk: unittest
+ *         
+ * Then run 'pub install' from your project directory or using
+ * the DartEditor.
+ *         
+ * Please see [Pub Getting Started](http://pub.dartlang.org/doc)
+ * for more details about the pub package manager.
  *
  * ##Concepts##
  *
@@ -24,7 +34,7 @@
  *
  * A trivial test:
  *
- *     #import('path-to-dart/pkg/unittest/unitest.dart');
+ *     import 'package:unittest/unittest.dart';
  *     main() {
  *       test('this is a test', () {
  *         int x = 2 + 3;
@@ -34,7 +44,7 @@
  *
  * Multiple tests:
  *
- *     #import('path-to-dart/pkg/unittest/unitest.dart');
+ *     import 'package:unittest/unittest.dart';
  *     main() {
  *       test('this is a test', () {
  *         int x = 2 + 3;
@@ -48,7 +58,7 @@
  *
  * Multiple tests, grouped by category:
  *
- *     #import('path-to-dart/pkg/unittest/unitest.dart');
+ *     import 'package:unittest/unittest.dart';
  *     main() {
  *       group('group A', () {
  *         test('test A.1', () {
@@ -74,25 +84,25 @@
  * that callback is run. A count argument can be provided to specify the number
  * of times the callback should be called (the default is 1).
  *
- *     #import('path-to-dart/pkg/unittest/unitest.dart');
- *     #import('dart:html');
+ *     import 'package:unittest/unittest.dart';
+ *     import 'dart:isolate';
  *     main() {
- *       test('calllback is executed once', () {
+ *       test('callback is executed once', () {
  *         // wrap the callback of an asynchronous call with [expectAsync0] if
  *         // the callback takes 0 arguments...
- *         window.setTimeout(expectAsync0(() {
+ *         var timer = new Timer(0, (_) => expectAsync0(() {
  *           int x = 2 + 3;
  *           expect(x, equals(5));
- *         }), 0);
+ *         }));
  *       });
  *
- *       test('calllback is executed twice', () {
- *         var callback = expectAsync0(() {
+ *       test('callback is executed twice', () {
+ *         var callback = (_) => expectAsync0(() {
  *           int x = 2 + 3;
  *           expect(x, equals(5));
  *         }, count: 2); // <-- we can indicate multiplicity to [expectAsync0]
- *         window.setTimeout(callback, 0);
- *         window.setTimeout(callback, 0);
+ *         new Timer(0, callback);
+ *         new Timer(0, callback);
  *       });
  *     }
  *
@@ -115,43 +125,44 @@
  * arguments or that take named parameters. (this is not implemented yet,
  * but will be coming here soon).
  *
- *     #import('path-to-dart/pkg/unittest/unitest.dart');
- *     #import('dart:html');
+ *     import 'package:unittest/unittest.dart';
+ *     import 'dart:isolate';
  *     main() {
- *       test('calllback is executed', () {
+ *       test('callback is executed', () {
  *         // indicate ahead of time that an async callback is expected.
  *         var async = startAsync();
- *         window.setTimeout(() {
+ *         new Timer(0, (_) {
  *           // Guard the body of the callback, so errors are propagated
- *           // correctly
+ *           // correctly.
  *           guardAsync(() {
  *             int x = 2 + 3;
  *             expect(x, equals(5));
  *           });
  *           // indicate that the asynchronous callback was invoked.
  *           async.complete();
- *         }), 0);
+ *         });
  *       });
+ *     }
  *
  */
-#library('unittest');
+library unittest;
 
-#import('dart:isolate');
+import 'dart:isolate';
 
-#source('collection_matchers.dart');
-#source('config.dart');
-#source('core_matchers.dart');
-#source('description.dart');
-#source('expect.dart');
-#source('future_matchers.dart');
-#source('interfaces.dart');
-#source('map_matchers.dart');
-#source('matcher.dart');
-#source('mock.dart');
-#source('numeric_matchers.dart');
-#source('operator_matchers.dart');
-#source('string_matchers.dart');
-#source('test_case.dart');
+part 'collection_matchers.dart';
+part 'config.dart';
+part 'core_matchers.dart';
+part 'description.dart';
+part 'expect.dart';
+part 'future_matchers.dart';
+part 'interfaces.dart';
+part 'map_matchers.dart';
+part 'matcher.dart';
+part 'mock.dart';
+part 'numeric_matchers.dart';
+part 'operator_matchers.dart';
+part 'string_matchers.dart';
+part 'test_case.dart';
 
 /** [Configuration] used by the unittest library. */
 Configuration _config = null;
@@ -366,7 +377,7 @@
 
   _after() {
     if (_isDone()) {
-      _handleCallbackFunctionComplete();
+      _handleCallbackFunctionComplete(_testNum);
     }
   }
 
@@ -635,7 +646,7 @@
  * Called when one of the callback functions is done with all expected
  * calls.
  */
-void _handleCallbackFunctionComplete() {
+void _handleCallbackFunctionComplete(testNum) {
   // TODO (gram): we defer this to give the nextBatch recursive
   // stack a chance to unwind. This is a temporary hack but
   // really a bunch of code here needs to be fixed. We have a
@@ -643,6 +654,12 @@
   // which is recursively invoked in the case of async tests that
   // run synchronously. Bad things can then happen.
   _defer(() {
+    if (_currentTest != testNum) {
+      if (_tests[testNum].result == PASS) {
+        _tests[testNum].error("Unexpected extra callbacks", '');
+      }
+      return; // Extraneous callback.
+    }
     if (_currentTest < _tests.length) {
       final testCase = _tests[_currentTest];
       --testCase.callbackFunctionsOutstanding;
@@ -672,7 +689,7 @@
  * TODO(gram) remove this when WebKit tests are working with new framework
  */
 void callbackDone() {
-  _handleCallbackFunctionComplete();
+  _handleCallbackFunctionComplete(_currentTest);
 }
 
 /**
diff --git a/pkg/unittest/vm_config.dart b/pkg/unittest/vm_config.dart
index 73bfc0e..e77f293 100644
--- a/pkg/unittest/vm_config.dart
+++ b/pkg/unittest/vm_config.dart
@@ -5,7 +5,7 @@
 /**
  * A simple unit test library for running tests on the VM.
  */
-#library('unittest');
+#library('unittest_vm_config');
 
 #import('dart:io');
 #import('unittest.dart');
diff --git a/runtime/bin/bin.gypi b/runtime/bin/bin.gypi
index 4aff04b..c851c97 100644
--- a/runtime/bin/bin.gypi
+++ b/runtime/bin/bin.gypi
@@ -6,6 +6,7 @@
   'variables': {
     'crypto_cc_file': '<(SHARED_INTERMEDIATE_DIR)/crypto_gen.cc',
     'io_cc_file': '<(SHARED_INTERMEDIATE_DIR)/io_gen.cc',
+    'io_patch_cc_file': '<(SHARED_INTERMEDIATE_DIR)/io_patch_gen.cc',
     'json_cc_file': '<(SHARED_INTERMEDIATE_DIR)/json_gen.cc',
     'uri_cc_file': '<(SHARED_INTERMEDIATE_DIR)/uri_gen.cc',
     'utf_cc_file': '<(SHARED_INTERMEDIATE_DIR)/utf_gen.cc',
@@ -79,8 +80,11 @@
     {
       'target_name': 'generate_io_cc_file',
       'type': 'none',
+      'sources': [
+        'io.dart',
+      ],
       'includes': [
-        'io_sources.gypi',
+        '../../lib/io/iolib_sources.gypi',
       ],
       'actions': [
         {
@@ -107,6 +111,36 @@
       ]
     },
     {
+      'target_name': 'generate_io_patch_cc_file',
+      'type': 'none',
+      'includes': [
+        'io_sources.gypi',
+      ],
+      'actions': [
+        {
+          'action_name': 'generate_io_patch_cc',
+          'inputs': [
+            '../tools/create_string_literal.py',
+            '<(builtin_in_cc_file)',
+            '<@(_sources)',
+          ],
+          'outputs': [
+            '<(io_patch_cc_file)',
+          ],
+          'action': [
+            'python',
+            'tools/create_string_literal.py',
+            '--output', '<(io_patch_cc_file)',
+            '--input_cc', '<(builtin_in_cc_file)',
+            '--include', 'bin/builtin.h',
+            '--var_name', 'Builtin::io_patch_',
+            '<@(_sources)',
+          ],
+          'message': 'Generating ''<(io_patch_cc_file)'' file.'
+        },
+      ]
+    },
+    {
       'target_name': 'generate_json_cc_file',
       'type': 'none',
       'includes': [
@@ -222,6 +256,7 @@
         'generate_builtin_cc_file',
         'generate_crypto_cc_file',
         'generate_io_cc_file',
+        'generate_io_patch_cc_file',
         'generate_json_cc_file',
         'generate_uri_cc_file',
         'generate_utf_cc_file',
@@ -306,6 +341,7 @@
         '<(builtin_cc_file)',
         '<(crypto_cc_file)',
         '<(io_cc_file)',
+        '<(io_patch_cc_file)',
         '<(json_cc_file)',
         '<(uri_cc_file)',
         '<(utf_cc_file)',
@@ -425,6 +461,7 @@
         '<(builtin_cc_file)',
         '<(crypto_cc_file)',
         '<(io_cc_file)',
+        '<(io_patch_cc_file)',
         '<(json_cc_file)',
         '<(uri_cc_file)',
         '<(utf_cc_file)',
@@ -463,6 +500,7 @@
         '<(builtin_cc_file)',
         '<(crypto_cc_file)',
         '<(io_cc_file)',
+        '<(io_patch_cc_file)',
         '<(json_cc_file)',
         '<(uri_cc_file)',
         '<(utf_cc_file)',
diff --git a/runtime/bin/builtin.cc b/runtime/bin/builtin.cc
index 3112628..f6d297e 100644
--- a/runtime/bin/builtin.cc
+++ b/runtime/bin/builtin.cc
@@ -11,13 +11,14 @@
 
 
 Builtin::builtin_lib_props Builtin::builtin_libraries_[] = {
-  /*      url_                    source_       has_natives_  */
-  { DartUtils::kBuiltinLibURL, builtin_source_, true  },
-  { DartUtils::kJsonLibURL,    json_source_,    false },
-  { DartUtils::kUriLibURL,     uri_source_,     false },
-  { DartUtils::kCryptoLibURL,  crypto_source_,  false },
-  { DartUtils::kIOLibURL,      io_source_,      true  },
-  { DartUtils::kUtfLibURL,     utf_source_,     false }
+  /* { url_, source_, patch_url_, patch_source_, has_natives_ } */
+  { DartUtils::kBuiltinLibURL, builtin_source_, NULL, NULL, true },
+  { DartUtils::kJsonLibURL, json_source_, NULL, NULL, false },
+  { DartUtils::kUriLibURL, uri_source_, NULL, NULL, false },
+  { DartUtils::kCryptoLibURL, crypto_source_, NULL, NULL, false },
+  { DartUtils::kIOLibURL, io_source_,
+    DartUtils::kIOLibPatchURL, io_patch_, true },
+  { DartUtils::kUtfLibURL, utf_source_, NULL, NULL, false }
 };
 
 
@@ -25,7 +26,7 @@
   ASSERT((sizeof(builtin_libraries_) / sizeof(builtin_lib_props)) ==
          kInvalidLibrary);
   ASSERT(id >= kBuiltinLibrary && id < kInvalidLibrary);
-  return Dart_NewString(builtin_libraries_[id].source_);
+  return DartUtils::NewString(builtin_libraries_[id].source_);
 }
 
 
@@ -38,7 +39,7 @@
   ASSERT((sizeof(builtin_libraries_) / sizeof(builtin_lib_props)) ==
          kInvalidLibrary);
   ASSERT(id >= kBuiltinLibrary && id < kInvalidLibrary);
-  Dart_Handle url = Dart_NewString(builtin_libraries_[id].url_);
+  Dart_Handle url = DartUtils::NewString(builtin_libraries_[id].url_);
   Dart_Handle library = Dart_LookupLibrary(url);
   if (Dart_IsError(library)) {
     library = Dart_LoadLibrary(url, Source(id));
@@ -46,6 +47,14 @@
       // Setup the native resolver for built in library functions.
       DART_CHECK_VALID(Dart_SetNativeResolver(library, NativeLookup));
     }
+    if (builtin_libraries_[id].patch_url_ != NULL) {
+      ASSERT(builtin_libraries_[id].patch_source_ != NULL);
+      Dart_Handle patch_url =
+          DartUtils::NewString(builtin_libraries_[id].patch_url_);
+      Dart_Handle patch_source =
+          DartUtils::NewString(builtin_libraries_[id].patch_source_);
+      DART_CHECK_VALID(Dart_LoadPatch(library, patch_url, patch_source));
+    }
   }
   DART_CHECK_VALID(library);
   return library;
diff --git a/runtime/bin/builtin.h b/runtime/bin/builtin.h
index 8dc8ec3..a46fbdb 100644
--- a/runtime/bin/builtin.h
+++ b/runtime/bin/builtin.h
@@ -46,6 +46,7 @@
   static const char builtin_source_[];
   static const char crypto_source_[];
   static const char io_source_[];
+  static const char io_patch_[];
   static const char json_source_[];
   static const char uri_source_[];
   static const char utf_source_[];
@@ -54,6 +55,8 @@
   typedef struct {
     const char* url_;
     const char* source_;
+    const char* patch_url_;
+    const char* patch_source_;
     bool has_natives_;
   } builtin_lib_props;
   static builtin_lib_props builtin_libraries_[];
diff --git a/runtime/bin/builtin_impl_sources.gypi b/runtime/bin/builtin_impl_sources.gypi
index 297d4b0..ad64eac 100644
--- a/runtime/bin/builtin_impl_sources.gypi
+++ b/runtime/bin/builtin_impl_sources.gypi
@@ -6,6 +6,8 @@
 # libraries.
 {
   'sources': [
+    'io_buffer.cc',
+    'io_buffer.h',
     'common.cc',
     'crypto.cc',
     'crypto_android.cc',
diff --git a/runtime/bin/builtin_natives.cc b/runtime/bin/builtin_natives.cc
index 045f800..995207c 100644
--- a/runtime/bin/builtin_natives.cc
+++ b/runtime/bin/builtin_natives.cc
@@ -32,7 +32,6 @@
   V(File_Close, 1)                                                             \
   V(File_ReadByte, 1)                                                          \
   V(File_WriteByte, 2)                                                         \
-  V(File_WriteString, 2)                                                       \
   V(File_ReadList, 4)                                                          \
   V(File_WriteList, 4)                                                         \
   V(File_Position, 1)                                                          \
@@ -61,6 +60,7 @@
   V(ServerSocket_Accept, 2)                                                    \
   V(Socket_CreateConnect, 3)                                                   \
   V(Socket_Available, 1)                                                       \
+  V(Socket_Read, 2)                                                            \
   V(Socket_ReadList, 4)                                                        \
   V(Socket_WriteList, 4)                                                       \
   V(Socket_GetPort, 1)                                                         \
@@ -103,9 +103,9 @@
 // test/debug functionality in standalone dart mode.
 
 void Builtin::PrintString(FILE* out, Dart_Handle str) {
-  const uint8_t* characters = NULL;
-  intptr_t length;
-  Dart_Handle result = Dart_StringToBytes(str, &characters, &length);
+  const char* chars = NULL;
+
+  Dart_Handle result = Dart_StringToCString(str, &chars);
   if (Dart_IsError(result)) {
     // TODO(turnidge): Consider propagating some errors here.  What if
     // an isolate gets interrupted by the embedder in the middle of
@@ -113,7 +113,8 @@
     // interrupt.
     fputs(Dart_GetError(result), out);
   } else {
-    fwrite(characters, sizeof(*characters), length, out);
+    intptr_t length = strlen(chars);
+    fwrite(chars, sizeof(*chars), length, out);
   }
   fputc('\n', out);
   fflush(out);
diff --git a/runtime/bin/builtin_nolib.cc b/runtime/bin/builtin_nolib.cc
index 1ba537b..77428c7 100644
--- a/runtime/bin/builtin_nolib.cc
+++ b/runtime/bin/builtin_nolib.cc
@@ -11,13 +11,13 @@
 
 
 Builtin::builtin_lib_props Builtin::builtin_libraries_[] = {
-  /*      url_                 source_          has_natives_  */
-  { DartUtils::kBuiltinLibURL, NULL,            true  },
-  { DartUtils::kJsonLibURL,    NULL,            false },
-  { DartUtils::kUriLibURL,     NULL,            false },
-  { DartUtils::kCryptoLibURL,  NULL,            false },
-  { DartUtils::kIOLibURL,      NULL,            true  },
-  { DartUtils::kUtfLibURL,     NULL,            false }
+  /* { url_, source_, patch_url_, patch_source_, has_natives_ } */
+  { DartUtils::kBuiltinLibURL, NULL, NULL, NULL, true },
+  { DartUtils::kJsonLibURL, NULL, NULL, NULL, false },
+  { DartUtils::kUriLibURL, NULL, NULL, NULL, false },
+  { DartUtils::kCryptoLibURL, NULL, NULL, NULL, false },
+  { DartUtils::kIOLibURL, NULL, NULL, NULL, true  },
+  { DartUtils::kUtfLibURL, NULL, NULL, NULL, false }
 };
 
 
@@ -33,7 +33,7 @@
          kInvalidLibrary);
   ASSERT(id >= kBuiltinLibrary && id < kInvalidLibrary);
   if (builtin_libraries_[id].has_natives_) {
-    Dart_Handle url = Dart_NewString(builtin_libraries_[id].url_);
+    Dart_Handle url = DartUtils::NewString(builtin_libraries_[id].url_);
     Dart_Handle library = Dart_LookupLibrary(url);
     ASSERT(!Dart_IsError(library));
     // Setup the native resolver for built in library functions.
@@ -46,7 +46,7 @@
   ASSERT((sizeof(builtin_libraries_) / sizeof(builtin_lib_props)) ==
          kInvalidLibrary);
   ASSERT(id >= kBuiltinLibrary && id < kInvalidLibrary);
-  Dart_Handle url = Dart_NewString(builtin_libraries_[id].url_);
+  Dart_Handle url = DartUtils::NewString(builtin_libraries_[id].url_);
   Dart_Handle library = Dart_LookupLibrary(url);
   if (Dart_IsError(library)) {
     ASSERT(id > kUtfLibrary);
diff --git a/runtime/bin/common.cc b/runtime/bin/common.cc
index 5a98342..261557d 100644
--- a/runtime/bin/common.cc
+++ b/runtime/bin/common.cc
@@ -23,17 +23,17 @@
   // If we have not cached the class pointers in the isolate data,
   // look them up and cache them now.
   if (object_array_class == NULL) {
-    Dart_Handle coreimpl_lib =
-        Dart_LookupLibrary(Dart_NewString("dart:coreimpl"));
-    ASSERT(!Dart_IsError(coreimpl_lib));
+    Dart_Handle core_lib =
+        Dart_LookupLibrary(Dart_NewStringFromCString("dart:core"));
+    ASSERT(!Dart_IsError(core_lib));
     object_array_class =
-        Dart_GetClass(coreimpl_lib, Dart_NewString("_ObjectArray"));
+        Dart_GetClass(core_lib, Dart_NewStringFromCString("_ObjectArray"));
     ASSERT(!Dart_IsError(object_array_class));
     immutable_array_class =
-        Dart_GetClass(coreimpl_lib, Dart_NewString("_ImmutableArray"));
+        Dart_GetClass(core_lib, Dart_NewStringFromCString("_ImmutableArray"));
     ASSERT(!Dart_IsError(immutable_array_class));
-    growable_object_array_class =
-        Dart_GetClass(coreimpl_lib, Dart_NewString("_GrowableObjectArray"));
+    growable_object_array_class = Dart_GetClass(
+        core_lib, Dart_NewStringFromCString("_GrowableObjectArray"));
     ASSERT(!Dart_IsError(growable_object_array_class));
     // Update the cache.
     isolate_data->object_array_class =
diff --git a/runtime/bin/common_patch.dart b/runtime/bin/common_patch.dart
new file mode 100644
index 0000000..1c878aa
--- /dev/null
+++ b/runtime/bin/common_patch.dart
@@ -0,0 +1,10 @@
+// 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.
+
+patch class _BufferUtils {
+  /* patch */ static bool _isBuiltinList(List buffer)
+      native "Common_IsBuiltinList";
+}
+
+
diff --git a/runtime/bin/crypto.cc b/runtime/bin/crypto.cc
index 97984a2..e4db17c 100644
--- a/runtime/bin/crypto.cc
+++ b/runtime/bin/crypto.cc
@@ -13,7 +13,8 @@
   Dart_Handle count_obj = Dart_GetNativeArgument(args, 0);
   int64_t count = 0;
   if (!DartUtils::GetInt64Value(count_obj, &count)) {
-    Dart_Handle error = Dart_NewString("Invalid argument, must be an int.");
+    Dart_Handle error =
+        DartUtils::NewString("Invalid argument, must be an int.");
     Dart_ThrowException(error);
   }
   uint8_t* buffer = new uint8_t[count];
@@ -25,7 +26,7 @@
   Dart_Handle result = Dart_NewByteArray(count);
   if (Dart_IsError(result)) {
     delete[] buffer;
-    Dart_Handle error = Dart_NewString("Failed to allocate storage.");
+    Dart_Handle error = DartUtils::NewString("Failed to allocate storage.");
     Dart_ThrowException(error);
   }
   Dart_ListSetAsBytes(result, 0, buffer, count);
@@ -33,4 +34,3 @@
   delete[] buffer;
   Dart_ExitScope();
 }
-
diff --git a/runtime/bin/dartutils.cc b/runtime/bin/dartutils.cc
index 3e40dede..3740b7e 100644
--- a/runtime/bin/dartutils.cc
+++ b/runtime/bin/dartutils.cc
@@ -19,6 +19,7 @@
 const char* DartUtils::kCoreImplLibURL = "dart:coreimpl";
 const char* DartUtils::kCryptoLibURL = "dart:crypto";
 const char* DartUtils::kIOLibURL = "dart:io";
+const char* DartUtils::kIOLibPatchURL = "dart:io-patch";
 const char* DartUtils::kJsonLibURL = "dart:json";
 const char* DartUtils::kUriLibURL = "dart:uri";
 const char* DartUtils::kUtfLibURL = "dart:utf";
@@ -98,15 +99,15 @@
                                 const char* name,
                                 intptr_t val) {
   Dart_Handle result = Dart_SetField(handle,
-                                     Dart_NewString(name),
+                                     NewString(name),
                                      Dart_NewInteger(val));
   ASSERT(!Dart_IsError(result));
 }
 
 
 intptr_t DartUtils::GetIntegerField(Dart_Handle handle,
-                                            const char* name) {
-  Dart_Handle result = Dart_GetField(handle, Dart_NewString(name));
+                                    const char* name) {
+  Dart_Handle result = Dart_GetField(handle, NewString(name));
   ASSERT(!Dart_IsError(result));
   intptr_t value = DartUtils::GetIntegerValue(result);
   return value;
@@ -116,9 +117,7 @@
 void DartUtils::SetStringField(Dart_Handle handle,
                                const char* name,
                                const char* val) {
-  Dart_Handle result = Dart_SetField(handle,
-                                     Dart_NewString(name),
-                                     Dart_NewString(val));
+  Dart_Handle result = Dart_SetField(handle, NewString(name), NewString(val));
   ASSERT(!Dart_IsError(result));
 }
 
@@ -173,7 +172,7 @@
   if (Dart_IsError(library_url)) {
     return Dart_Error("accessing library url failed");
   }
-  if (!Dart_IsString8(library_url)) {
+  if (!Dart_IsString(library_url)) {
     return Dart_Error("library url is not a string");
   }
   const char* library_url_str = NULL;
@@ -190,7 +189,7 @@
   }
   // Calculate the canonical path.
   const char* canon_url_str = GetCanonicalPath(library_url_str, url_str);
-  Dart_Handle canon_url = Dart_NewString(canon_url_str);
+  Dart_Handle canon_url = NewString(canon_url_str);
   free(const_cast<char*>(canon_url_str));
 
   return canon_url;
@@ -209,18 +208,18 @@
     return Dart_Error(error_msg);
   }
   intptr_t len = file->Length();
-  char* text_buffer = reinterpret_cast<char*>(malloc(len + 1));
+  uint8_t* text_buffer = reinterpret_cast<uint8_t*>(malloc(len));
   if (text_buffer == NULL) {
     delete file;
     return Dart_Error("Unable to allocate buffer");
   }
   if (!file->ReadFully(text_buffer, len)) {
     delete file;
+    free(text_buffer);
     return Dart_Error("Unable to fully read contents");
   }
-  text_buffer[len] = '\0';
   delete file;
-  Dart_Handle str = Dart_NewString(text_buffer);
+  Dart_Handle str = Dart_NewStringFromUTF8(text_buffer, len);
   free(text_buffer);
   return str;
 }
@@ -230,11 +229,13 @@
                                     Dart_Handle builtin_lib) {
   const int kNumArgs = 3;
   Dart_Handle dart_args[kNumArgs];
-  dart_args[0] = Dart_NewString(DartUtils::original_working_directory);
+  dart_args[0] = DartUtils::NewString(DartUtils::original_working_directory);
   dart_args[1] = script_uri;
   dart_args[2] = (IsWindowsHost() ? Dart_True() : Dart_False());
-  return Dart_Invoke(
-      builtin_lib, Dart_NewString("_resolveScriptUri"), kNumArgs, dart_args);
+  return Dart_Invoke(builtin_lib,
+                     DartUtils::NewString("_resolveScriptUri"),
+                     kNumArgs,
+                     dart_args);
 }
 
 
@@ -245,7 +246,10 @@
   dart_args[0] = script_uri;
   dart_args[1] = (IsWindowsHost() ? Dart_True() : Dart_False());
   Dart_Handle script_path = Dart_Invoke(
-      builtin_lib, Dart_NewString("_filePathFromUri"), kNumArgs, dart_args);
+      builtin_lib,
+      DartUtils::NewString("_filePathFromUri"),
+      kNumArgs,
+      dart_args);
   return script_path;
 }
 
@@ -256,7 +260,7 @@
   if (!Dart_IsLibrary(library)) {
     return Dart_Error("not a library");
   }
-  if (!Dart_IsString8(url)) {
+  if (!Dart_IsString(url)) {
     return Dart_Error("url is not a string");
   }
   const char* url_string = NULL;
@@ -284,7 +288,7 @@
     dart_args[0] = library_url;
     dart_args[1] = url;
     return Dart_Invoke(
-        builtin_lib, Dart_NewString("_resolveUri"), kNumArgs, dart_args);
+        builtin_lib, NewString("_resolveUri"), kNumArgs, dart_args);
   }
   if (is_dart_scheme_url) {
     ASSERT(tag == kImportTag);
@@ -345,8 +349,7 @@
 Dart_Handle DartUtils::LoadScript(const char* script_uri,
                                   Dart_Handle builtin_lib) {
   Dart_Handle resolved_script_uri;
-  resolved_script_uri = ResolveScriptUri(Dart_NewString(script_uri),
-                                         builtin_lib);
+  resolved_script_uri = ResolveScriptUri(NewString(script_uri), builtin_lib);
   if (Dart_IsError(resolved_script_uri)) {
     return resolved_script_uri;
   }
@@ -391,35 +394,35 @@
 Dart_Handle DartUtils::PrepareForScriptLoading(const char* package_root,
                                                Dart_Handle builtin_lib) {
   // Setup the corelib 'print' function.
-  Dart_Handle print =
-      Dart_Invoke(builtin_lib, Dart_NewString("_getPrintClosure"), 0, 0);
-  Dart_Handle corelib = Dart_LookupLibrary(Dart_NewString("dart:core"));
+  Dart_Handle print = Dart_Invoke(
+      builtin_lib, NewString("_getPrintClosure"), 0, 0);
+  Dart_Handle corelib = Dart_LookupLibrary(NewString("dart:core"));
   Dart_Handle result = Dart_SetField(corelib,
-                                     Dart_NewString("_printClosure"), print);
+                                     NewString("_printClosure"),
+                                     print);
 
   // Setup the 'timer' factory.
-  Dart_Handle url = Dart_NewString(kIsolateLibURL);
+  Dart_Handle url = NewString(kIsolateLibURL);
   DART_CHECK_VALID(url);
   Dart_Handle isolate_lib = Dart_LookupLibrary(url);
   DART_CHECK_VALID(isolate_lib);
   Dart_Handle io_lib = Builtin::LoadAndCheckLibrary(Builtin::kIOLibrary);
   Dart_Handle timer_closure =
-      Dart_Invoke(io_lib, Dart_NewString("_getTimerFactoryClosure"), 0, NULL);
+      Dart_Invoke(io_lib, NewString("_getTimerFactoryClosure"), 0, NULL);
   Dart_Handle args[1];
   args[0] = timer_closure;
-  DART_CHECK_VALID(Dart_Invoke(isolate_lib,
-                               Dart_NewString("_setTimerFactoryClosure"),
-                               1, args));
+  DART_CHECK_VALID(Dart_Invoke(
+      isolate_lib, NewString("_setTimerFactoryClosure"), 1, args));
 
   // Set up package root if specified.
   if (package_root != NULL) {
-    result = Dart_NewString(package_root);
+    result = NewString(package_root);
     if (!Dart_IsError(result)) {
       const int kNumArgs = 1;
       Dart_Handle dart_args[kNumArgs];
       dart_args[0] = result;
       return Dart_Invoke(builtin_lib,
-                         Dart_NewString("_setPackageRoot"),
+                         NewString("_setPackageRoot"),
                          kNumArgs,
                          dart_args);
     }
@@ -491,16 +494,16 @@
 
 Dart_Handle DartUtils::NewDartOSError(OSError* os_error) {
   // Create a Dart OSError object with the information retrieved from the OS.
-  Dart_Handle url = Dart_NewString("dart:io");
+  Dart_Handle url = NewString("dart:io");
   if (Dart_IsError(url)) return url;
   Dart_Handle lib = Dart_LookupLibrary(url);
   if (Dart_IsError(lib)) return lib;
-  Dart_Handle class_name = Dart_NewString("OSError");
+  Dart_Handle class_name = NewString("OSError");
   if (Dart_IsError(class_name)) return class_name;
   Dart_Handle clazz = Dart_GetClass(lib, class_name);
   if (Dart_IsError(clazz)) return clazz;
   Dart_Handle args[2];
-  args[0] = Dart_NewString(os_error->message());
+  args[0] = NewString(os_error->message());
   if (Dart_IsError(args[0])) return args[0];
   args[1] = Dart_NewInteger(os_error->code());
   if (Dart_IsError(args[1])) return args[1];
diff --git a/runtime/bin/dartutils.h b/runtime/bin/dartutils.h
index 57f168f..93f7001 100644
--- a/runtime/bin/dartutils.h
+++ b/runtime/bin/dartutils.h
@@ -110,6 +110,13 @@
   // Create a new Dart OSError object with the provided OS error.
   static Dart_Handle NewDartOSError(OSError* os_error);
 
+  // Create a new Dart String object from a C String.
+  static Dart_Handle NewString(const char* str) {
+    ASSERT((str != NULL) && (strlen(str) != 0));
+    return Dart_NewStringFromUTF8(reinterpret_cast<const uint8_t*>(str),
+                                  strlen(str));
+  }
+
   static void SetOriginalWorkingDirectory();
 
   // Global state that stores the original working directory..
@@ -122,6 +129,7 @@
   static const char* kCoreImplLibURL;
   static const char* kCryptoLibURL;
   static const char* kIOLibURL;
+  static const char* kIOLibPatchURL;
   static const char* kJsonLibURL;
   static const char* kUriLibURL;
   static const char* kUtfLibURL;
diff --git a/runtime/bin/dbg_message.cc b/runtime/bin/dbg_message.cc
index ae7edf5..43fa850 100644
--- a/runtime/bin/dbg_message.cc
+++ b/runtime/bin/dbg_message.cc
@@ -109,11 +109,11 @@
   intptr_t str_len = 0;
   Dart_Handle res = Dart_StringLength(str, &str_len);
   ASSERT_NOT_ERROR(res);
-  uint32_t* codepoints =
-      reinterpret_cast<uint32_t*>(malloc(str_len * sizeof(uint32_t)));
+  uint16_t* codepoints =
+      reinterpret_cast<uint16_t*>(malloc(str_len * sizeof(uint16_t)));
   ASSERT(codepoints != NULL);
   intptr_t actual_len = str_len;
-  res = Dart_StringGet32(str, codepoints, &actual_len);
+  res = Dart_StringToUTF16(str, codepoints, &actual_len);
   ASSERT_NOT_ERROR(res);
   ASSERT(str_len == actual_len);
   buf->AddChar('\"');
@@ -692,7 +692,7 @@
   intptr_t lib_id = msg_parser.GetIntParam("libraryId");
   char* url_chars = msg_parser.GetStringParam("url");
   ASSERT(url_chars != NULL);
-  Dart_Handle url = Dart_NewString(url_chars);
+  Dart_Handle url = DartUtils::NewString(url_chars);
   ASSERT_NOT_ERROR(url);
   free(url_chars);
   url_chars = NULL;
@@ -732,7 +732,7 @@
   int msg_id = msg_parser.MessageId();
   char* url_chars = msg_parser.GetStringParam("url");
   ASSERT(url_chars != NULL);
-  Dart_Handle url = Dart_NewString(url_chars);
+  Dart_Handle url = DartUtils::NewString(url_chars);
   ASSERT_NOT_ERROR(url);
   free(url_chars);
   url_chars = NULL;
diff --git a/runtime/bin/directory.cc b/runtime/bin/directory.cc
index 9f82527..cc37c28 100644
--- a/runtime/bin/directory.cc
+++ b/runtime/bin/directory.cc
@@ -18,7 +18,7 @@
   Dart_EnterScope();
   char* current = Directory::Current();
   if (current != NULL) {
-    Dart_SetReturnValue(args, Dart_NewString(current));
+    Dart_SetReturnValue(args, DartUtils::NewString(current));
     free(current);
   }
   Dart_ExitScope();
@@ -64,7 +64,7 @@
   Dart_Handle path = Dart_GetNativeArgument(args, 0);
   char* result = Directory::CreateTemp(DartUtils::GetStringValue(path));
   if (result != NULL) {
-    Dart_SetReturnValue(args, Dart_NewString(result));
+    Dart_SetReturnValue(args, DartUtils::NewString(result));
     free(result);
   } else {
     Dart_Handle err = DartUtils::NewDartOSError();
diff --git a/runtime/bin/directory_patch.dart b/runtime/bin/directory_patch.dart
new file mode 100644
index 0000000..6d42f8b
--- /dev/null
+++ b/runtime/bin/directory_patch.dart
@@ -0,0 +1,16 @@
+// 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.
+
+patch class _Directory {
+  /* patch */ static String _current() native "Directory_Current";
+  /* patch */ static _createTemp(String template) native "Directory_CreateTemp";
+  /* patch */ static int _exists(String path) native "Directory_Exists";
+  /* patch */ static _create(String path) native "Directory_Create";
+  /* patch */ static _delete(String path, bool recursive)
+      native "Directory_Delete";
+  /* patch */ static _rename(String path, String newPath)
+      native "Directory_Rename";
+  /* patch */ static SendPort _newServicePort()
+      native "Directory_NewServicePort";
+}
diff --git a/runtime/bin/eventhandler.dart b/runtime/bin/eventhandler.dart
deleted file mode 100644
index 2e0a8fc..0000000
--- a/runtime/bin/eventhandler.dart
+++ /dev/null
@@ -1,27 +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.
-
-class _EventHandler extends NativeFieldWrapperClass1 {
-  _EventHandler() { }
-
-  static void _start() {
-    if (_eventHandler === null) {
-      _eventHandler = new _EventHandler();
-      _eventHandler._doStart();
-    }
-  }
-
-  void _doStart() native "EventHandler_Start";
-
-  static _sendData(Object sender, ReceivePort receivePort, int data) {
-    if (_eventHandler !== null) {
-      _eventHandler._doSendData(sender, receivePort, data);
-    }
-  }
-
-  void _doSendData(Object sender, ReceivePort receivePort, int data)
-      native "EventHandler_SendData";
-
-  static _EventHandler _eventHandler;
-}
diff --git a/runtime/bin/eventhandler_patch.dart b/runtime/bin/eventhandler_patch.dart
new file mode 100644
index 0000000..f1e3a25
--- /dev/null
+++ b/runtime/bin/eventhandler_patch.dart
@@ -0,0 +1,30 @@
+// 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.
+
+patch class _EventHandler {
+  /* patch */ static void _start() {
+    if (_eventHandler === null) {
+      _eventHandler = new _EventHandlerImpl();
+      _eventHandler._start();
+    }
+  }
+
+  /* patch */ static _sendData(Object sender,
+                               ReceivePort receivePort,
+                               int data) {
+    if (_eventHandler !== null) {
+      _eventHandler._sendData(sender, receivePort, data);
+    }
+  }
+
+  static _EventHandlerImpl _eventHandler;
+}
+
+
+class _EventHandlerImpl extends NativeFieldWrapperClass1 {
+  _EventHandlerImpl() { }
+  void _start() native "EventHandler_Start";
+  void _sendData(Object sender, ReceivePort receivePort, int data)
+      native "EventHandler_SendData";
+}
diff --git a/runtime/bin/file.cc b/runtime/bin/file.cc
index d74dced..88d0ef4 100644
--- a/runtime/bin/file.cc
+++ b/runtime/bin/file.cc
@@ -158,27 +158,6 @@
 }
 
 
-void FUNCTION_NAME(File_WriteString)(Dart_NativeArguments args) {
-  Dart_EnterScope();
-  intptr_t value =
-      DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 0));
-  File* file = reinterpret_cast<File*>(value);
-  ASSERT(file != NULL);
-  const char* str =
-      DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1));
-  int bytes_written = file->Write(reinterpret_cast<const void*>(str),
-                                  strlen(str));
-  if (bytes_written >= 0) {
-    Dart_SetReturnValue(args, Dart_NewInteger(bytes_written));
-  } else {
-    Dart_Handle err = DartUtils::NewDartOSError();
-    if (Dart_IsError(err)) Dart_PropagateError(err);
-    Dart_SetReturnValue(args, err);
-  }
-  Dart_ExitScope();
-}
-
-
 void FUNCTION_NAME(File_ReadList)(Dart_NativeArguments args) {
   Dart_EnterScope();
   intptr_t value =
@@ -432,7 +411,7 @@
   char* path = File::GetContainingDirectory(str_copy);
   free(str_copy);
   if (path != NULL) {
-    Dart_SetReturnValue(args, Dart_NewString(path));
+    Dart_SetReturnValue(args, DartUtils::NewString(path));
     free(path);
   } else {
     Dart_Handle err = DartUtils::NewDartOSError();
@@ -449,7 +428,7 @@
       DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0));
   char* path = File::GetCanonicalPath(str);
   if (path != NULL) {
-    Dart_SetReturnValue(args, Dart_NewString(path));
+    Dart_SetReturnValue(args, DartUtils::NewString(path));
     free(path);
   } else {
     Dart_Handle err = DartUtils::NewDartOSError();
@@ -861,25 +840,6 @@
 }
 
 
-static CObject* FileWriteStringRequest(const CObjectArray& request) {
-  if (request.Length() == 3 &&
-      request[1]->IsIntptr() &&
-      request[2]->IsString()) {
-    File* file = CObjectToFilePointer(request[1]);
-    ASSERT(file != NULL);
-    if (!file->IsClosed()) {
-      CObjectString str(request[2]);
-      const void* buffer = reinterpret_cast<const void*>(str.CString());
-      int64_t bytes_written = file->Write(buffer, str.Length());
-      return new CObjectInt64(CObject::NewInt64(bytes_written));
-    } else {
-      return CObject::FileClosedError();
-    }
-  }
-  return CObject::IllegalArgumentError();
-}
-
-
 void FileService(Dart_Port dest_port_id,
                  Dart_Port reply_port_id,
                  Dart_CObject* message) {
@@ -943,9 +903,6 @@
         case File::kWriteListRequest:
           response = FileWriteListRequest(request);
           break;
-        case File::kWriteStringRequest:
-          response = FileWriteStringRequest(request);
-          break;
         default:
           UNREACHABLE();
       }
diff --git a/runtime/bin/file.h b/runtime/bin/file.h
index 7b6ea8c..4fbd9cf 100644
--- a/runtime/bin/file.h
+++ b/runtime/bin/file.h
@@ -68,8 +68,7 @@
     kReadByteRequest = 14,
     kWriteByteRequest = 15,
     kReadListRequest = 16,
-    kWriteListRequest = 17,
-    kWriteStringRequest = 18
+    kWriteListRequest = 17
   };
 
   ~File();
@@ -109,8 +108,6 @@
   // Returns whether the file has been closed.
   bool IsClosed();
 
-  const char* name() const { return name_; }
-
   // Open the file with the given name. The file is always opened for
   // reading. If mode contains kWrite the file is opened for both
   // reading and writing. If mode contains kWrite and the file does
@@ -139,12 +136,11 @@
   static Dart_Port GetServicePort();
 
  private:
-  File(const char* name, FileHandle* handle) : name_(name), handle_(handle) { }
+  explicit File(FileHandle* handle) : handle_(handle) { }
   void Close();
 
   static const int kClosedFd = -1;
 
-  const char* name_;
   // FileHandle is an OS specific class which stores data about the file.
   FileHandle* handle_;  // OS specific handle for the file.
 
diff --git a/runtime/bin/file_android.cc b/runtime/bin/file_android.cc
index a6f04d4..77665e6 100644
--- a/runtime/bin/file_android.cc
+++ b/runtime/bin/file_android.cc
@@ -125,13 +125,13 @@
       return NULL;
     }
   }
-  return new File(name, new FileHandle(fd));
+  return new File(new FileHandle(fd));
 }
 
 
 File* File::OpenStdio(int fd) {
   if (fd < 0 || 2 < fd) return NULL;
-  return new File(NULL, new FileHandle(fd));
+  return new File(new FileHandle(fd));
 }
 
 
diff --git a/runtime/bin/file_linux.cc b/runtime/bin/file_linux.cc
index a6f04d4..77665e6 100644
--- a/runtime/bin/file_linux.cc
+++ b/runtime/bin/file_linux.cc
@@ -125,13 +125,13 @@
       return NULL;
     }
   }
-  return new File(name, new FileHandle(fd));
+  return new File(new FileHandle(fd));
 }
 
 
 File* File::OpenStdio(int fd) {
   if (fd < 0 || 2 < fd) return NULL;
-  return new File(NULL, new FileHandle(fd));
+  return new File(new FileHandle(fd));
 }
 
 
diff --git a/runtime/bin/file_macos.cc b/runtime/bin/file_macos.cc
index 835b441..09138cf 100644
--- a/runtime/bin/file_macos.cc
+++ b/runtime/bin/file_macos.cc
@@ -126,13 +126,13 @@
       return NULL;
     }
   }
-  return new File(name, new FileHandle(fd));
+  return new File(new FileHandle(fd));
 }
 
 
 File* File::OpenStdio(int fd) {
   if (fd < 0 || 2 < fd) return NULL;
-  return new File(NULL, new FileHandle(fd));
+  return new File(new FileHandle(fd));
 }
 
 
diff --git a/runtime/bin/file_patch.dart b/runtime/bin/file_patch.dart
new file mode 100644
index 0000000..4ca5733
--- /dev/null
+++ b/runtime/bin/file_patch.dart
@@ -0,0 +1,35 @@
+// 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.
+
+patch class _FileUtils {
+  /* patch */ static SendPort _newServicePort() native "File_NewServicePort";
+}
+
+patch class _File {
+  /* patch */ static _exists(String name) native "File_Exists";
+  /* patch */ static _create(String name) native "File_Create";
+  /* patch */ static _delete(String name) native "File_Delete";
+  /* patch */ static _directory(String name) native "File_Directory";
+  /* patch */ static _lengthFromName(String name) native "File_LengthFromName";
+  /* patch */ static _lastModified(String name) native "File_LastModified";
+  /* patch */ static _open(String name, int mode) native "File_Open";
+  /* patch */ static int _openStdio(int fd) native "File_OpenStdio";
+  /* patch */ static _fullPath(String name) native "File_FullPath";
+}
+
+patch class _RandomAccessFile {
+  /* patch */ static int _close(int id) native "File_Close";
+  /* patch */ static _readByte(int id) native "File_ReadByte";
+  /* patch */ static _readList(int id, List<int> buffer, int offset, int bytes)
+      native "File_ReadList";
+  /* patch */ static _writeByte(int id, int value) native "File_WriteByte";
+  /* patch */ static _writeList(int id, List<int> buffer, int offset, int bytes)
+      native "File_WriteList";
+  /* patch */ static _position(int id) native "File_Position";
+  /* patch */ static _setPosition(int id, int position)
+      native "File_SetPosition";
+  /* patch */ static _truncate(int id, int length) native "File_Truncate";
+  /* patch */ static _length(int id) native "File_Length";
+  /* patch */ static _flush(int id) native "File_Flush";
+}
diff --git a/runtime/bin/file_test.cc b/runtime/bin/file_test.cc
index da97b24..5765cf2 100644
--- a/runtime/bin/file_test.cc
+++ b/runtime/bin/file_test.cc
@@ -24,7 +24,6 @@
   const char* kFilename = GetFileName("runtime/bin/file_test.cc");
   File* file = File::Open(kFilename, File::kRead);
   EXPECT(file != NULL);
-  EXPECT_STREQ(kFilename, file->name());
   char buffer[16];
   buffer[0] = '\0';
   EXPECT(file->ReadFully(buffer, 13));  // ReadFully returns true.
diff --git a/runtime/bin/file_win.cc b/runtime/bin/file_win.cc
index 9076d7a..d32d107 100644
--- a/runtime/bin/file_win.cc
+++ b/runtime/bin/file_win.cc
@@ -114,7 +114,7 @@
       return NULL;
     }
   }
-  return new File(name, new FileHandle(fd));
+  return new File(new FileHandle(fd));
 }
 
 
diff --git a/runtime/bin/gen_snapshot.cc b/runtime/bin/gen_snapshot.cc
index 6e2e6c7..b3513e4 100644
--- a/runtime/bin/gen_snapshot.cc
+++ b/runtime/bin/gen_snapshot.cc
@@ -153,7 +153,7 @@
   if (!Dart_IsLibrary(library)) {
     return Dart_Error("not a library");
   }
-  if (!Dart_IsString8(url)) {
+  if (!Dart_IsString(url)) {
     return Dart_Error("url is not a string");
   }
   const char* url_string = NULL;
@@ -183,7 +183,7 @@
   if (Dart_IsError(source)) {
     return source;  // source contains the error string.
   }
-  Dart_Handle url = Dart_NewString(script_name);
+  Dart_Handle url = DartUtils::NewString(script_name);
 
   return Dart_LoadScript(url, source);
 }
diff --git a/runtime/bin/http_patch.dart b/runtime/bin/http_patch.dart
new file mode 100644
index 0000000..fc3da60
--- /dev/null
+++ b/runtime/bin/http_patch.dart
@@ -0,0 +1,8 @@
+// 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.
+
+patch class _HttpSessionManager {
+  /* patch */ static Uint8List _getRandomBytes(int count)
+      native "Crypto_GetRandomBytes";
+}
diff --git a/runtime/bin/io.dart b/runtime/bin/io.dart
index 36d02bb..f260f68 100644
--- a/runtime/bin/io.dart
+++ b/runtime/bin/io.dart
@@ -2,11 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// The dart:io library is the concatenation of all the files in
-// io_sources.gypi. This file needs to be the first file in that
-// concatenation.
+// We should be able to get rid of this file. This is used to set up
+// the dart:io library for the VM because it cannot use the actual library
+// file which is in lib/io/io.dart.
 
-#library("io");
+#library("dart:io");
 #import("dart:coreimpl");
 #import("dart:crypto");
 #import("dart:isolate");
diff --git a/runtime/bin/io_buffer.cc b/runtime/bin/io_buffer.cc
new file mode 100644
index 0000000..8ff95a0
--- /dev/null
+++ b/runtime/bin/io_buffer.cc
@@ -0,0 +1,26 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "bin/io_buffer.h"
+
+static void BufferFree(void* buffer) {
+  delete[] reinterpret_cast<uint8_t*>(buffer);
+}
+
+
+Dart_Handle IOBuffer::Allocate(intptr_t size, uint8_t **buffer) {
+  uint8_t* data = new uint8_t[size];
+  Dart_Handle result = Dart_NewExternalByteArray(data,
+                                                 size,
+                                                 data,
+                                                 BufferFree);
+  if (Dart_IsError(result)) {
+    BufferFree(data);
+    Dart_PropagateError(result);
+  }
+  if (buffer != NULL) {
+    *buffer = data;
+  }
+  return result;
+}
diff --git a/runtime/bin/io_buffer.h b/runtime/bin/io_buffer.h
new file mode 100644
index 0000000..c9a7287
--- /dev/null
+++ b/runtime/bin/io_buffer.h
@@ -0,0 +1,21 @@
+// 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.
+
+#ifndef IO_BUFFER_H_
+#define IO_BUFFER_H_
+
+#include "platform/globals.h"
+
+#include "include/dart_api.h"
+
+class IOBuffer {
+ public:
+  static Dart_Handle Allocate(intptr_t size, uint8_t **buffer);
+
+ private:
+  DISALLOW_ALLOCATION();
+  DISALLOW_IMPLICIT_CONSTRUCTORS(IOBuffer);
+};
+
+#endif  // IO_BUFFER_H_
diff --git a/runtime/bin/io_sources.gypi b/runtime/bin/io_sources.gypi
index 435c254..f74d58d 100644
--- a/runtime/bin/io_sources.gypi
+++ b/runtime/bin/io_sources.gypi
@@ -5,46 +5,14 @@
 # This file contains all sources for the dart:io library.
 {
   'sources': [
-    # The io.dart file needs to be the first source file. It contains
-    # the library and import directives for the dart:io library. The
-    # dart:io library is created by concatenating the files listed here
-    # in the order they are listed.
-    'io.dart',
-
-    'base64.dart',
-    'buffer_list.dart',
-    'chunked_stream.dart',
-    'common.dart',
-    'directory.dart',
-    'directory_impl.dart',
-    'eventhandler.dart',
-    'file.dart',
-    'file_impl.dart',
-    'http.dart',
-    'http_impl.dart',
-    'http_parser.dart',
-    'http_session.dart',
-    'http_utils.dart',
-    'input_stream.dart',
-    'list_stream.dart',
-    'list_stream_impl.dart',
-    'mime_multipart_parser.dart',
-    'output_stream.dart',
-    'path.dart',
-    'path_impl.dart',
-    'platform.dart',
-    'platform_impl.dart',
-    'process.dart',
-    'process_impl.dart',
-    'socket.dart',
-    'socket_impl.dart',
-    'socket_stream.dart',
-    'socket_stream_impl.dart',
-    'stdio.dart',
-    'stream_util.dart',
-    'string_stream.dart',
-    'timer_impl.dart',
-    'websocket.dart',
-    'websocket_impl.dart',
+    'common_patch.dart',
+    'directory_patch.dart',
+    'eventhandler_patch.dart',
+    'file_patch.dart',
+    'http_patch.dart',
+    'platform_patch.dart',
+    'process_patch.dart',
+    'socket_patch.dart',
+    'stdio_patch.dart',
   ],
 }
diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
index 3c4a8c8..7cc8f0c 100644
--- a/runtime/bin/main.cc
+++ b/runtime/bin/main.cc
@@ -300,11 +300,11 @@
                                        const char* executable_name,
                                        const char* script_name) {
   int options_count = options->count();
-  Dart_Handle dart_executable = Dart_NewString(executable_name);
+  Dart_Handle dart_executable = DartUtils::NewString(executable_name);
   if (Dart_IsError(dart_executable)) {
     return dart_executable;
   }
-  Dart_Handle dart_script = Dart_NewString(script_name);
+  Dart_Handle dart_script = DartUtils::NewString(script_name);
   if (Dart_IsError(dart_script)) {
     return dart_script;
   }
@@ -313,7 +313,8 @@
     return dart_arguments;
   }
   for (int i = 0; i < options_count; i++) {
-    Dart_Handle argument_value = Dart_NewString(options->GetArgument(i));
+    Dart_Handle argument_value =
+        DartUtils::NewString(options->GetArgument(i));
     if (Dart_IsError(argument_value)) {
       return argument_value;
     }
@@ -322,7 +323,7 @@
       return result;
     }
   }
-  Dart_Handle core_lib_url = Dart_NewString("dart:core");
+  Dart_Handle core_lib_url = DartUtils::NewString("dart:core");
   if (Dart_IsError(core_lib_url)) {
     return core_lib_url;
   }
@@ -330,7 +331,8 @@
   if (Dart_IsError(core_lib)) {
     return core_lib;
   }
-  Dart_Handle runtime_options_class_name = Dart_NewString("_OptionsImpl");
+  Dart_Handle runtime_options_class_name =
+      DartUtils::NewString("_OptionsImpl");
   if (Dart_IsError(runtime_options_class_name)) {
     return runtime_options_class_name;
   }
@@ -339,7 +341,8 @@
   if (Dart_IsError(runtime_options_class)) {
     return runtime_options_class;
   }
-  Dart_Handle executable_name_name = Dart_NewString("_nativeExecutable");
+  Dart_Handle executable_name_name =
+      DartUtils::NewString("_nativeExecutable");
   if (Dart_IsError(executable_name_name)) {
     return executable_name_name;
   }
@@ -350,7 +353,7 @@
   if (Dart_IsError(set_executable_name)) {
     return set_executable_name;
   }
-  Dart_Handle script_name_name = Dart_NewString("_nativeScript");
+  Dart_Handle script_name_name = DartUtils::NewString("_nativeScript");
   if (Dart_IsError(script_name_name)) {
     return script_name_name;
   }
@@ -359,7 +362,7 @@
   if (Dart_IsError(set_script_name)) {
     return set_script_name;
   }
-  Dart_Handle native_name = Dart_NewString("_nativeArguments");
+  Dart_Handle native_name = DartUtils::NewString("_nativeArguments");
   if (Dart_IsError(native_name)) {
     return native_name;
   }
@@ -554,7 +557,7 @@
     char* colon = strchr(bpt_line, ':');
     ASSERT(colon != NULL);
     *colon = '\0';
-    Dart_Handle url = Dart_NewString(bpt_line);
+    Dart_Handle url = DartUtils::NewString(bpt_line);
     Dart_Handle line_number = Dart_NewInteger(atoi(colon + 1));
     free(bpt_line);
     Dart_Breakpoint bpt;
@@ -565,12 +568,12 @@
     Dart_Handle function_name;
     char* dot = strchr(bpt_function, '.');
     if (dot == NULL) {
-      class_name = Dart_NewString("");
-      function_name = Dart_NewString(breakpoint_at);
+      class_name = DartUtils::NewString("");
+      function_name = DartUtils::NewString(breakpoint_at);
     } else {
       *dot = '\0';
-      class_name = Dart_NewString(bpt_function);
-      function_name = Dart_NewString(dot + 1);
+      class_name = DartUtils::NewString(bpt_function);
+      function_name = DartUtils::NewString(dot + 1);
     }
     free(bpt_function);
     Dart_Breakpoint bpt;
@@ -727,7 +730,7 @@
   }
 
   // Lookup and invoke the top level main function.
-  result = Dart_Invoke(library, Dart_NewString("main"), 0, NULL);
+  result = Dart_Invoke(library, DartUtils::NewString("main"), 0, NULL);
   if (Dart_IsError(result)) {
     return ErrorExit("%s\n", Dart_GetError(result));
   }
diff --git a/runtime/bin/platform.cc b/runtime/bin/platform.cc
index 34c2910..80ed277 100644
--- a/runtime/bin/platform.cc
+++ b/runtime/bin/platform.cc
@@ -16,14 +16,15 @@
 
 void FUNCTION_NAME(Platform_OperatingSystem)(Dart_NativeArguments args) {
   Dart_EnterScope();
-  Dart_SetReturnValue(args, Dart_NewString(Platform::OperatingSystem()));
+  Dart_SetReturnValue(args,
+                      Dart_NewStringFromCString(Platform::OperatingSystem()));
   Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(Platform_PathSeparator)(Dart_NativeArguments args) {
   Dart_EnterScope();
-  Dart_SetReturnValue(args, Dart_NewString(File::PathSeparator()));
+  Dart_SetReturnValue(args, Dart_NewStringFromCString(File::PathSeparator()));
   Dart_ExitScope();
 }
 
@@ -33,7 +34,7 @@
   const intptr_t HOSTNAME_LENGTH = 256;
   char hostname[HOSTNAME_LENGTH];
   if (Platform::LocalHostname(hostname, HOSTNAME_LENGTH)) {
-    Dart_SetReturnValue(args, Dart_NewString(hostname));
+    Dart_SetReturnValue(args, Dart_NewStringFromCString(hostname));
   } else {
     Dart_SetReturnValue(args, DartUtils::NewDartOSError());
   }
@@ -56,7 +57,7 @@
       Dart_PropagateError(result);
     }
     for (intptr_t i = 0; i < count; i++) {
-      Dart_Handle str = Dart_NewString(env[i]);
+      Dart_Handle str = Dart_NewStringFromCString(env[i]);
       if (Dart_IsError(str)) {
         Dart_PropagateError(str);
       }
diff --git a/runtime/bin/platform_patch.dart b/runtime/bin/platform_patch.dart
new file mode 100644
index 0000000..02ba129
--- /dev/null
+++ b/runtime/bin/platform_patch.dart
@@ -0,0 +1,13 @@
+// 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.
+
+patch class _Platform {
+  /* patch */ static int _numberOfProcessors()
+      native "Platform_NumberOfProcessors";
+  /* patch */ static String _pathSeparator() native "Platform_PathSeparator";
+  /* patch */ static String _operatingSystem()
+      native "Platform_OperatingSystem";
+  /* patch */ static _localHostname() native "Platform_LocalHostname";
+  /* patch */ static _environment() native "Platform_Environment";
+}
diff --git a/runtime/bin/process_linux.cc b/runtime/bin/process_linux.cc
index bfaf4d4..ffc5c88 100644
--- a/runtime/bin/process_linux.cc
+++ b/runtime/bin/process_linux.cc
@@ -17,6 +17,7 @@
 #include "bin/fdutils.h"
 #include "bin/thread.h"
 
+extern char **environ;
 
 // ProcessInfo is used to map a process id to the file descriptor for
 // the pipe used to communicate the exit code of the process to Dart.
@@ -461,15 +462,13 @@
       ReportChildError(exec_control[1]);
     }
 
-    if (environment != NULL) {
-      TEMP_FAILURE_RETRY(
-          execve(path,
-                 const_cast<char* const*>(program_arguments),
-                 program_environment));
-    } else {
-      TEMP_FAILURE_RETRY(
-          execvp(path, const_cast<char* const*>(program_arguments)));
+    if (program_environment != NULL) {
+      environ = program_environment;
     }
+
+    TEMP_FAILURE_RETRY(
+        execvp(path, const_cast<char* const*>(program_arguments)));
+
     ReportChildError(exec_control[1]);
   }
 
diff --git a/runtime/bin/process_macos.cc b/runtime/bin/process_macos.cc
index b23ab16..11aac9f 100644
--- a/runtime/bin/process_macos.cc
+++ b/runtime/bin/process_macos.cc
@@ -16,6 +16,7 @@
 #include "bin/fdutils.h"
 #include "bin/thread.h"
 
+extern char **environ;
 
 // ProcessInfo is used to map a process id to the file descriptor for
 // the pipe used to communicate the exit code of the process to Dart.
@@ -460,15 +461,13 @@
       ReportChildError(exec_control[1]);
     }
 
-    if (environment != NULL) {
-      TEMP_FAILURE_RETRY(
-          execve(path,
-                 const_cast<char* const*>(program_arguments),
-                 program_environment));
-    } else {
-      TEMP_FAILURE_RETRY(
-          execvp(path, const_cast<char* const*>(program_arguments)));
+    if (program_environment != NULL) {
+      environ = program_environment;
     }
+
+    TEMP_FAILURE_RETRY(
+        execvp(path, const_cast<char* const*>(program_arguments)));
+
     ReportChildError(exec_control[1]);
   }
 
diff --git a/runtime/bin/process_impl.dart b/runtime/bin/process_patch.dart
similarity index 88%
rename from runtime/bin/process_impl.dart
rename to runtime/bin/process_patch.dart
index 48670e4..1dd8bf6 100644
--- a/runtime/bin/process_impl.dart
+++ b/runtime/bin/process_patch.dart
@@ -2,7 +2,26 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-_exit(int status) native "Exit";
+patch class Process {
+  /* patch */ static Future<Process> start(String executable,
+                                           List<String> arguments,
+                                           [ProcessOptions options]) {
+    _ProcessImpl process = new _ProcessImpl(executable, arguments, options);
+    return process._start();
+  }
+
+  /* patch */ static Future<ProcessResult> run(String executable,
+                                               List<String> arguments,
+                                               [ProcessOptions options]) {
+    return new _NonInteractiveProcess(executable, arguments, options)._result;
+  }
+}
+
+
+patch class _ProcessUtils {
+  /* patch */ static _exit(int status) native "Exit";
+}
+
 
 class _ProcessStartStatus {
   int _errorCode;  // Set to OS error code if process start failed.
@@ -10,21 +29,8 @@
 }
 
 
-class _Process extends NativeFieldWrapperClass1 implements Process {
-  static Future<ProcessResult> run(String path,
-                                   List<String> arguments,
-                                   [ProcessOptions options]) {
-    return new _NonInteractiveProcess(path, arguments, options)._result;
-  }
-
-  static Future<Process> start(String path,
-                               List<String> arguments,
-                               ProcessOptions options) {
-    _Process process = new _Process(path, arguments, options);
-    return process._start();
-  }
-
-  _Process(String path, List<String> arguments, ProcessOptions options) {
+class _ProcessImpl extends NativeFieldWrapperClass1 implements Process {
+  _ProcessImpl(String path, List<String> arguments, ProcessOptions options) {
     if (path is !String) {
       throw new ArgumentError("Path is not a String: $path");
     }
@@ -73,7 +79,6 @@
     _out = new _Socket._internalWriteOnly();  // stdin going to process.
     _err = new _Socket._internalReadOnly();  // stderr coming from process.
     _exitHandler = new _Socket._internalReadOnly();
-    _closed = false;
     _ended = false;
     _started = false;
     _onExit = null;
@@ -148,7 +153,10 @@
                                   _exitHandler,
                                   status);
       if (!success) {
-        close();
+        _in.close();
+        _out.close();
+        _err.close();
+        _exitHandler.close();
         completer.completeException(
             new ProcessException(status._errorMessage, status._errorCode));
         return;
@@ -185,11 +193,15 @@
           if (_onExit !== null) {
             _onExit(exitCode(exitDataBuffer));
           }
+          _out.close();
         }
 
         exitDataRead += _exitHandler.inputStream.readInto(
             exitDataBuffer, exitDataRead, EXIT_DATA_SIZE - exitDataRead);
-        if (exitDataRead == EXIT_DATA_SIZE) handleExit();
+        if (exitDataRead == EXIT_DATA_SIZE) {
+          _exitHandler.close();
+          handleExit();
+        }
       };
 
       completer.complete(this);
@@ -208,23 +220,14 @@
                     _ProcessStartStatus status) native "Process_Start";
 
   InputStream get stdout {
-    if (_closed) {
-      throw new ProcessException("Process closed");
-    }
     return _in.inputStream;
   }
 
   InputStream get stderr {
-    if (_closed) {
-      throw new ProcessException("Process closed");
-    }
     return _err.inputStream;
   }
 
   OutputStream get stdin {
-    if (_closed) {
-      throw new ProcessException("Process closed");
-    }
     return _out.outputStream;
   }
 
@@ -240,21 +243,7 @@
 
   bool _kill(Process p, int signal) native "Process_Kill";
 
-  void close() {
-    if (_closed) {
-      throw new ProcessException("Process closed");
-    }
-    _in.close();
-    _out.close();
-    _err.close();
-    _exitHandler.close();
-    _closed = true;
-  }
-
   void set onExit(void callback(int exitCode)) {
-    if (_closed) {
-      throw new ProcessException("Process closed");
-    }
     if (_ended) {
       throw new ProcessException("Process killed");
     }
@@ -270,7 +259,6 @@
   _Socket _out;
   _Socket _err;
   Socket _exitHandler;
-  bool _closed;
   bool _ended;
   bool _started;
   Function _onExit;
@@ -307,7 +295,7 @@
     }
 
     // Start the underlying process.
-    var processFuture = new _Process(path, arguments, options)._start();
+    var processFuture = new _ProcessImpl(path, arguments, options)._start();
 
     processFuture.then((Process p) {
       // Make sure the process stdin is closed.
diff --git a/runtime/bin/socket.cc b/runtime/bin/socket.cc
index 0f1c99a..8f8d4c9 100644
--- a/runtime/bin/socket.cc
+++ b/runtime/bin/socket.cc
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+#include "bin/io_buffer.h"
 #include "bin/socket.h"
 #include "bin/dartutils.h"
 #include "bin/thread.h"
@@ -58,6 +59,52 @@
 }
 
 
+void FUNCTION_NAME(Socket_Read)(Dart_NativeArguments args) {
+  Dart_EnterScope();
+  Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0);
+  intptr_t socket = 0;
+  Socket::GetSocketIdNativeField(socket_obj, &socket);
+  intptr_t available = Socket::Available(socket);
+  if (available > 0) {
+    int64_t length = 0;
+    Dart_Handle length_obj = Dart_GetNativeArgument(args, 1);
+    if (DartUtils::GetInt64Value(length_obj, &length)) {
+      if (length == -1 || available < length) {
+        length = available;
+      }
+      uint8_t* buffer = NULL;
+      Dart_Handle result = IOBuffer::Allocate(length, &buffer);
+      if (Dart_IsError(result)) Dart_PropagateError(result);
+      ASSERT(buffer != NULL);
+      intptr_t bytes_read = Socket::Read(socket, buffer, length);
+      if (bytes_read == length) {
+        Dart_SetReturnValue(args, result);
+      } else if (bytes_read == 0) {
+        // On MacOS when reading from a tty Ctrl-D will result in one
+        // byte reported as available. Attempting to read it out will
+        // result in zero bytes read. When that happens there is no
+        // data which is indicated by a null return value.
+        Dart_SetReturnValue(args, Dart_Null());
+      } else {
+        ASSERT(bytes_read == -1);
+        Dart_SetReturnValue(args, DartUtils::NewDartOSError());
+      }
+    } else {
+      OSError os_error(-1, "Invalid argument", OSError::kUnknown);
+      Dart_Handle err = DartUtils::NewDartOSError(&os_error);
+      if (Dart_IsError(err)) Dart_PropagateError(err);
+      Dart_SetReturnValue(args, err);
+    }
+  } else if (available == 0) {
+    Dart_SetReturnValue(args, Dart_Null());
+  } else {
+    Dart_SetReturnValue(args, DartUtils::NewDartOSError());
+  }
+
+  Dart_ExitScope();
+}
+
+
 void FUNCTION_NAME(Socket_ReadList)(Dart_NativeArguments args) {
   Dart_EnterScope();
   Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0);
@@ -129,28 +176,38 @@
     length = (length + 1) / 2;
   }
 
-  // Send data in chunks of maximum 16KB.
-  const intptr_t max_chunk_length =
-      dart::Utils::Minimum(length, static_cast<intptr_t>(16 * KB));
-  uint8_t* buffer = new uint8_t[max_chunk_length];
   intptr_t total_bytes_written = 0;
   intptr_t bytes_written = 0;
-  do {
-    intptr_t chunk_length =
-        dart::Utils::Minimum(max_chunk_length, length - total_bytes_written);
-    result = Dart_ListGetAsBytes(buffer_obj,
-                                 offset + total_bytes_written,
-                                 buffer,
-                                 chunk_length);
+  if (Dart_IsByteArrayExternal(buffer_obj)) {
+    void* buffer = NULL;
+    result = Dart_ExternalByteArrayGetData(buffer_obj, &buffer);
     if (Dart_IsError(result)) {
-      delete[] buffer;
       Dart_PropagateError(result);
     }
-    bytes_written =
-        Socket::Write(socket, reinterpret_cast<void*>(buffer), chunk_length);
-    total_bytes_written += bytes_written;
-  } while (bytes_written > 0 && total_bytes_written < length);
-  delete[] buffer;
+    bytes_written = Socket::Write(socket, buffer, length);
+    total_bytes_written = bytes_written;
+  } else {
+    // Send data in chunks of maximum 16KB.
+    const intptr_t max_chunk_length =
+        dart::Utils::Minimum(length, static_cast<intptr_t>(16 * KB));
+    uint8_t* buffer = new uint8_t[max_chunk_length];
+    do {
+      intptr_t chunk_length =
+          dart::Utils::Minimum(max_chunk_length, length - total_bytes_written);
+      result = Dart_ListGetAsBytes(buffer_obj,
+                                   offset + total_bytes_written,
+                                   buffer,
+                                   chunk_length);
+      if (Dart_IsError(result)) {
+        delete[] buffer;
+        Dart_PropagateError(result);
+      }
+      bytes_written =
+          Socket::Write(socket, reinterpret_cast<void*>(buffer), chunk_length);
+      total_bytes_written += bytes_written;
+    } while (bytes_written > 0 && total_bytes_written < length);
+    delete[] buffer;
+  }
   if (bytes_written >= 0) {
     Dart_SetReturnValue(args, Dart_NewInteger(total_bytes_written));
   } else {
@@ -186,7 +243,7 @@
   char host[INET_ADDRSTRLEN];
   if (Socket::GetRemotePeer(socket, host, &port)) {
     Dart_Handle list = Dart_NewList(2);
-    Dart_ListSetAt(list, 0, Dart_NewString(host));
+    Dart_ListSetAt(list, 0, Dart_NewStringFromCString(host));
     Dart_ListSetAt(list, 1, Dart_NewInteger(port));
     Dart_SetReturnValue(args, list);
   } else {
diff --git a/runtime/bin/socket_impl.dart b/runtime/bin/socket_patch.dart
similarity index 93%
rename from runtime/bin/socket_impl.dart
rename to runtime/bin/socket_patch.dart
index b262cee..2b22877 100644
--- a/runtime/bin/socket_impl.dart
+++ b/runtime/bin/socket_patch.dart
@@ -2,6 +2,17 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+patch class ServerSocket {
+  /* patch */ factory ServerSocket(String bindAddress, int port, int backlog) {
+    return new _ServerSocket(bindAddress, port, backlog);
+  }
+}
+
+
+patch class Socket {
+  /* patch */ factory Socket(String host, int port) => new _Socket(host, port);
+}
+
 
 class _SocketBase extends NativeFieldWrapperClass1 {
   // Bit flags used when communicating between the eventhandler and
@@ -97,6 +108,7 @@
   }
 
   OSError _getError() native "Socket_GetError";
+ 
   int _getPort() native "Socket_GetPort";
 
   void set onError(void callback(e)) {
@@ -363,19 +375,33 @@
 
   _available() native "Socket_Available";
 
+  List<int> read([int len]) {
+    if (len != null && len <= 0) {
+      throw new SocketIOException("Illegal length $len");
+    }
+    var result = _read(len == null ? -1 : len);
+    if (result is OSError) {
+      _reportError(result, "Read failed");
+      return null;
+    }
+    return result;
+  }
+
+  _read(int len) native "Socket_Read";
+
   int readList(List<int> buffer, int offset, int bytes) {
     if (!_closed) {
       if (bytes == 0) {
         return 0;
       }
       if (offset < 0) {
-        throw new IndexOutOfRangeException(offset);
+        throw new RangeError.value(offset);
       }
       if (bytes < 0) {
-        throw new IndexOutOfRangeException(bytes);
+        throw new RangeError.value(bytes);
       }
       if ((offset + bytes) > buffer.length) {
-        throw new IndexOutOfRangeException(offset + bytes);
+        throw new RangeError.value(offset + bytes);
       }
       var result = _readList(buffer, offset, bytes);
       if (result is OSError) {
@@ -400,13 +426,13 @@
         return 0;
       }
       if (offset < 0) {
-        throw new IndexOutOfRangeException(offset);
+        throw new RangeError.value(offset);
       }
       if (bytes < 0) {
-        throw new IndexOutOfRangeException(bytes);
+        throw new RangeError.value(bytes);
       }
       if ((offset + bytes) > buffer.length) {
-        throw new IndexOutOfRangeException(offset + bytes);
+        throw new RangeError.value(offset + bytes);
       }
       _BufferAndOffset bufferAndOffset =
           _ensureFastAndSerializableBuffer(buffer, offset, bytes);
@@ -423,8 +449,7 @@
     throw new SocketIOException("writeList failed - invalid socket handle");
   }
 
-  _writeList(List<int> buffer, int offset, int bytes)
-      native "Socket_WriteList";
+  _writeList(List<int> buffer, int offset, int bytes) native "Socket_WriteList";
 
   bool _isErrorResponse(response) {
     return response is List && response[0] != _SUCCESS_RESPONSE;
@@ -475,7 +500,7 @@
         throw new StreamException(
             "Cannot get input stream when socket handlers are used");
       }
-      _inputStream = new SocketInputStream(this);
+      _inputStream = new _SocketInputStream(this);
     }
     return _inputStream;
   }
@@ -486,7 +511,7 @@
         throw new StreamException(
             "Cannot get input stream when socket handlers are used");
       }
-      _outputStream = new SocketOutputStream(this);
+      _outputStream = new _SocketOutputStream(this);
     }
     return _outputStream;
   }
@@ -574,8 +599,8 @@
   bool _pipe = false;
   Function _clientConnectHandler;
   Function _clientWriteHandler;
-  SocketInputStream _inputStream;
-  SocketOutputStream _outputStream;
+  _SocketInputStream _inputStream;
+  _SocketOutputStream _outputStream;
   String _remoteHost;
   int _remotePort;
   static SendPort _socketService;
diff --git a/runtime/bin/socket_stream.dart b/runtime/bin/socket_stream.dart
deleted file mode 100644
index 668cfe0..0000000
--- a/runtime/bin/socket_stream.dart
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/**
- * [SocketInputStream] makes it possible to stream over data received
- * from a [Socket].
- */
-abstract class SocketInputStream implements InputStream {
-  /**
-   * Create a [SocketInputStream] for streaming from a [Socket].
-   */
-  factory SocketInputStream(Socket socket) => new _SocketInputStream(socket);
-}
-
-/**
- * [SocketOutputStream] makes it possible to stream data to a
- * [Socket].
- */
-abstract class SocketOutputStream implements OutputStream {
-  /**
-   * Create a [SocketOutputStream] for streaming to a [Socket].
-   */
-  factory SocketOutputStream(Socket socket) => new _SocketOutputStream(socket);
-}
diff --git a/runtime/bin/stdio_patch.dart b/runtime/bin/stdio_patch.dart
new file mode 100644
index 0000000..bcdc671
--- /dev/null
+++ b/runtime/bin/stdio_patch.dart
@@ -0,0 +1,10 @@
+// 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.
+
+patch class _StdIOUtils {
+  /* patch */ static _getStdioHandle(Socket socket, int num)
+      native "Socket_GetStdioHandle";
+  /* patch */ static _getStdioHandleType(int num)
+      native "File_GetStdioHandleType";
+}
diff --git a/runtime/bin/test_extension.cc b/runtime/bin/test_extension.cc
index 623e151..000728f 100644
--- a/runtime/bin/test_extension.cc
+++ b/runtime/bin/test_extension.cc
@@ -26,7 +26,7 @@
 }
 
 Dart_NativeFunction ResolveName(Dart_Handle name, int argc) {
-  assert(Dart_IsString8(name));
+  assert(Dart_IsString(name));
   const char* cname;
   Dart_Handle check_error;
 
diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h
index be97d76..17c2dc0 100755
--- a/runtime/include/dart_api.h
+++ b/runtime/include/dart_api.h
@@ -1324,14 +1324,9 @@
 DART_EXPORT bool Dart_IsString(Dart_Handle object);
 
 /**
- * Is this object a String whose codepoints all fit into 8 bits?
+ * Is this object an ASCII String?
  */
-DART_EXPORT bool Dart_IsString8(Dart_Handle object);
-
-/**
- * Is this object a String whose codepoints all fit into 16 bits?
- */
-DART_EXPORT bool Dart_IsString16(Dart_Handle object);
+DART_EXPORT bool Dart_IsAsciiString(Dart_Handle object);
 
 /**
  * Gets the length of a String.
@@ -1345,51 +1340,54 @@
 
 /**
  * Returns a String built from the provided C string
+ * (There is an implicit assumption that the C string passed in contains
+ *  UTF-8 encoded characters and '\0' is considered as a termination
+ *  character).
  *
  * \param value A C String
  *
  * \return The String object if no error occurs. Otherwise returns
  *   an error handle.
  */
-DART_EXPORT Dart_Handle Dart_NewString(const char* str);
+DART_EXPORT Dart_Handle Dart_NewStringFromCString(const char* str);
 // TODO(turnidge): Document what happens when we run out of memory
 // during this call.
 
 /**
- * Returns a String built from an array of 8-bit codepoints.
+ * Returns a String built from an array of UTF-8 encoded characters.
  *
- * \param value An array of 8-bit codepoints.
+ * \param utf8_array An array of UTF-8 encoded characters.
  * \param length The length of the codepoints array.
  *
  * \return The String object if no error occurs. Otherwise returns
  *   an error handle.
  */
-DART_EXPORT Dart_Handle Dart_NewString8(const uint8_t* codepoints,
-                                        intptr_t length);
+DART_EXPORT Dart_Handle Dart_NewStringFromUTF8(const uint8_t* utf8_array,
+                                               intptr_t length);
 
 /**
- * Returns a String built from an array of 16-bit codepoints.
+ * Returns a String built from an array of UTF-16 encoded characters.
  *
- * \param value An array of 16-bit codepoints.
+ * \param utf16_array An array of UTF-16 encoded characters.
  * \param length The length of the codepoints array.
  *
  * \return The String object if no error occurs. Otherwise returns
  *   an error handle.
  */
-DART_EXPORT Dart_Handle Dart_NewString16(const uint16_t* codepoints,
-                                         intptr_t length);
+DART_EXPORT Dart_Handle Dart_NewStringFromUTF16(const uint16_t* utf16_array,
+                                                intptr_t length);
 
 /**
- * Returns a String built from an array of 32-bit codepoints.
+ * Returns a String built from an array of UTF-32 encoded characters.
  *
- * \param value An array of 32-bit codepoints.
+ * \param utf32_array An array of UTF-32 encoded characters.
  * \param length The length of the codepoints array.
  *
  * \return The String object if no error occurs. Otherwise returns
  *   an error handle.
  */
-DART_EXPORT Dart_Handle Dart_NewString32(const uint32_t* codepoints,
-                                         intptr_t length);
+DART_EXPORT Dart_Handle Dart_NewStringFromUTF32(const uint32_t* utf32_array,
+                                                intptr_t length);
 
 /**
  * Is this object an external String?
@@ -1405,136 +1403,85 @@
 DART_EXPORT Dart_Handle Dart_ExternalStringGetPeer(Dart_Handle object,
                                                    void** peer);
 
-
 /**
- * Returns a String which references an external array of 8-bit codepoints.
+ * Returns a String which references an external array of UTF-8 encoded
+ * characters.
  *
- * \param value An array of 8-bit codepoints. This array must not move.
- * \param length The length of the codepoints array.
+ * \param utf8_array An array of UTF-8 encoded characters. This must not move.
+ * \param length The length of the characters array.
  * \param peer An external pointer to associate with this string.
- * \param callback A callback to be called when this string is finalized.
+ * \param cback A callback to be called when this string is finalized.
  *
  * \return The String object if no error occurs. Otherwise returns
  *   an error handle.
  */
-DART_EXPORT Dart_Handle Dart_NewExternalString8(const uint8_t* codepoints,
-                                                intptr_t length,
-                                                void* peer,
-                                                Dart_PeerFinalizer callback);
+DART_EXPORT Dart_Handle Dart_NewExternalUTF8String(const uint8_t* utf8_array,
+                                                   intptr_t length,
+                                                   void* peer,
+                                                   Dart_PeerFinalizer cback);
 
 /**
- * Returns a String which references an external array of 16-bit codepoints.
+ * Returns a String which references an external array of UTF-16 encoded
+ * characters.
  *
- * \param value An array of 16-bit codepoints. This array must not move.
- * \param length The length of the codepoints array.
+ * \param utf16_array An array of UTF-16 encoded characters. This must not move.
+ * \param length The length of the characters array.
  * \param peer An external pointer to associate with this string.
- * \param callback A callback to be called when this string is finalized.
+ * \param cback A callback to be called when this string is finalized.
  *
  * \return The String object if no error occurs. Otherwise returns
  *   an error handle.
  */
-DART_EXPORT Dart_Handle Dart_NewExternalString16(const uint16_t* codepoints,
-                                                 intptr_t length,
-                                                 void* peer,
-                                                 Dart_PeerFinalizer callback);
+DART_EXPORT Dart_Handle Dart_NewExternalUTF16String(const uint16_t* utf16_array,
+                                                    intptr_t length,
+                                                    void* peer,
+                                                    Dart_PeerFinalizer cback);
 
 /**
- * Returns a String which references an external array of 32-bit codepoints.
- *
- * \param value An array of 32-bit codepoints. This array must not move.
- * \param length The length of the codepoints array.
- * \param peer An external pointer to associate with this string.
- * \param callback A callback to be called when this string is finalized.
- *
- * \return The String object if no error occurs. Otherwise returns
- *   an error handle.
- */
-DART_EXPORT Dart_Handle Dart_NewExternalString32(const uint32_t* codepoints,
-                                                 intptr_t length,
-                                                 void* peer,
-                                                 Dart_PeerFinalizer callback);
-
-/**
- * Gets the codepoints from a String.
- *
- * This function is only valid on strings for which Dart_IsString8 is
- * true. Otherwise an error occurs.
+ * Gets the C string representation of a String.
+ * (It is a sequence of UTF-8 encoded values with a '\0' termination.)
  *
  * \param str A string.
- * \param codepoints An array allocated by the caller, used to return
- *   the array of codepoints.
- * \param length Used to pass in the length of the provided array.
- *   Used to return the length of the array which was actually used.
- *
- * \return A valid handle if no error occurs during the operation.
- */
-DART_EXPORT Dart_Handle Dart_StringGet8(Dart_Handle str,
-                                        uint8_t* codepoints,
-                                        intptr_t* length);
-// TODO(turnidge): Rename to GetString8 to be consistent with the Is*
-// and New* functions above?
-
-/**
- * Gets the codepoints from a String.
- *
- * This function is only valid on strings for which Dart_IsString8 or
- * Dart_IsString16 is true. Otherwise an error occurs.
- *
- * \param str A string.
- * \param codepoints An array allocated by the caller, used to return
- *   the array of codepoints.
- * \param length Used to pass in the length of the provided array.
- *   Used to return the length of the array which was actually used.
- *
- * \return A valid handle if no error occurs during the operation.
- */
-DART_EXPORT Dart_Handle Dart_StringGet16(Dart_Handle str,
-                                         uint16_t* codepoints,
-                                         intptr_t* length);
-
-/**
- * Gets the codepoints from a String
- *
- * \param str A string.
- * \param codepoints An array allocated by the caller, used to return
- *   the array of codepoints.
- * \param length Used to pass in the length of the provided array.
- *   Used to return the length of the array which was actually used.
- *
- * \return A valid handle if no error occurs during the operation.
- */
-DART_EXPORT Dart_Handle Dart_StringGet32(Dart_Handle str,
-                                         uint32_t* codepoints,
-                                         intptr_t* length);
-
-/**
- * Gets the utf8 encoded representation of a String.
- *
- * \param str A string.
- * \param utf8 Returns the String represented as a utf8 encoded C
- *   string. This C string is scope allocated and is only valid until
+ * \param cstr Returns the String represented as a C string.
+ *   This C string is scope allocated and is only valid until
  *   the next call to Dart_ExitScope.
  *
  * \return A valid handle if no error occurs during the operation.
  */
 DART_EXPORT Dart_Handle Dart_StringToCString(Dart_Handle str,
-                                             const char** utf8);
+                                             const char** cstr);
 
 /**
  * Gets a UTF-8 encoded representation of a String.
  *
  * \param str A string.
- * \param bytes Returns the String represented as an array of UTF-8
- *   code units. This array is scope allocated and is only valid until
- *   the next call to Dart_ExitScope.
- * \param length Returns the length of the code units array, in bytes.
+ * \param utf8_array An array allocated by the caller, used to return
+ *   the array of UTF-8 encoded characters.
+ * \param length Used to pass in the length of the provided array.
+ *   Used to return the length of the array which was actually used.
  *
  * \return A valid handle if no error occurs during the operation.
  */
-DART_EXPORT Dart_Handle Dart_StringToBytes(Dart_Handle str,
-                                           const uint8_t** bytes,
+DART_EXPORT Dart_Handle Dart_StringToUTF8(Dart_Handle str,
+                                          uint8_t* utf8_array,
+                                          intptr_t* length);
+
+/**
+ * Gets the UTF-16 encoded representation of a string.
+ *
+ * \param str A string.
+ * \param utf16_array An array allocated by the caller, used to return
+ *   the array of UTF-16 encoded characters.
+ * \param length Used to pass in the length of the provided array.
+ *   Used to return the length of the array which was actually used.
+ *
+ * \return A valid handle if no error occurs during the operation.
+ */
+DART_EXPORT Dart_Handle Dart_StringToUTF16(Dart_Handle str,
+                                           uint16_t* utf16_array,
                                            intptr_t* length);
 
+
 // --- Lists ---
 
 /**
@@ -1621,6 +1568,14 @@
 DART_EXPORT bool Dart_IsByteArray(Dart_Handle object);
 
 /**
+ * Is this object an external ByteArray?
+ *
+ * An external ByteArray is a ByteArray which references a fixed array of
+ * bytes which is external to the Dart heap.
+ */
+DART_EXPORT bool Dart_IsByteArrayExternal(Dart_Handle object);
+
+/**
  * Returns a ByteArray of the desired length.
  *
  * \param length The length of the array.
@@ -1646,6 +1601,12 @@
                                                   Dart_PeerFinalizer callback);
 
 /**
+ * Retrieves the data pointer associated with an external ByteArray.
+ */
+DART_EXPORT Dart_Handle Dart_ExternalByteArrayGetData(Dart_Handle object,
+                                                      void** data);
+
+/**
  * Retrieves the peer pointer associated with an external ByteArray.
  */
 DART_EXPORT Dart_Handle Dart_ExternalByteArrayGetPeer(Dart_Handle object,
diff --git a/runtime/lib/array.cc b/runtime/lib/array.cc
index 67d2363..4d96793 100644
--- a/runtime/lib/array.cc
+++ b/runtime/lib/array.cc
@@ -39,7 +39,7 @@
   if ((index.Value() < 0) || (index.Value() >= array.Length())) {
     GrowableArray<const Object*> arguments;
     arguments.Add(&index);
-    Exceptions::ThrowByType(Exceptions::kIndexOutOfRange, arguments);
+    Exceptions::ThrowByType(Exceptions::kRange, arguments);
   }
   return array.At(index.Value());
 }
@@ -52,7 +52,7 @@
   if ((index.Value() < 0) || (index.Value() >= array.Length())) {
     GrowableArray<const Object*> arguments;
     arguments.Add(&index);
-    Exceptions::ThrowByType(Exceptions::kIndexOutOfRange, arguments);
+    Exceptions::ThrowByType(Exceptions::kRange, arguments);
   }
   array.SetAt(index.Value(), value);
   return Object::null();
@@ -85,12 +85,12 @@
   if ((isrc_start < 0) || ((isrc_start + icount) > source.Length())) {
     GrowableArray<const Object*> arguments;
     arguments.Add(&src_start);
-    Exceptions::ThrowByType(Exceptions::kIndexOutOfRange, arguments);
+    Exceptions::ThrowByType(Exceptions::kRange, arguments);
   }
   if ((idst_start < 0) || ((idst_start + icount) > dest.Length())) {
     GrowableArray<const Object*> arguments;
     arguments.Add(&dst_start);
-    Exceptions::ThrowByType(Exceptions::kIndexOutOfRange, arguments);
+    Exceptions::ThrowByType(Exceptions::kRange, arguments);
   }
 
   Object& src_obj = Object::Handle();
diff --git a/runtime/lib/array_patch.dart b/runtime/lib/array_patch.dart
index b84904b..08ef482 100644
--- a/runtime/lib/array_patch.dart
+++ b/runtime/lib/array_patch.dart
@@ -5,7 +5,7 @@
 // Note that the optimizing compiler depends on the algorithm which
 // returns a _GrowableObjectArray if length is null, otherwise returns
 // fixed size array.
-patch class ListImplementation<E> {
+patch class _ListImpl<E> {
   /* patch */ factory List([int length = null]) {
     if (length === null) {
       return new _GrowableObjectArray<E>();
@@ -14,8 +14,8 @@
     }
   }
 
-  /* patch */ static _from(Iterable other) {
-    _GrowableObjectArray list = new _GrowableObjectArray();
+  /* patch */ factory List.from(Iterable<E> other) {
+    _GrowableObjectArray<E> list = new _GrowableObjectArray<E>();
     for (final e in other) {
       list.add(e);
     }
diff --git a/runtime/lib/byte_array.cc b/runtime/lib/byte_array.cc
index 10d9a89..06efeee 100644
--- a/runtime/lib/byte_array.cc
+++ b/runtime/lib/byte_array.cc
@@ -15,7 +15,7 @@
 
 // Checks to see if (index * num_bytes) is in the range
 // [0..array.ByteLength()).  without the risk of integer overflow.  If
-// the index is out of range, then an IndexOutOfRangeException is thrown.
+// the index is out of range, then a RangeError is thrown.
 static void RangeCheck(const ByteArray& array,
                        intptr_t index,
                        intptr_t num_bytes) {
@@ -25,7 +25,7 @@
         index, (array.ByteLength() / num_bytes)));
     GrowableArray<const Object*> args;
     args.Add(&error);
-    Exceptions::ThrowByType(Exceptions::kIndexOutOfRange, args);
+    Exceptions::ThrowByType(Exceptions::kRange, args);
   }
 }
 
diff --git a/runtime/lib/byte_array.dart b/runtime/lib/byte_array.dart
index cec964c..a455050 100644
--- a/runtime/lib/byte_array.dart
+++ b/runtime/lib/byte_array.dart
@@ -308,13 +308,13 @@
 
 void _rangeCheck(int listLength, int start, int length) {
   if (length < 0) {
-    throw new IndexOutOfRangeException(length);
+    throw new RangeError.value(length);
   }
   if (start < 0) {
-    throw new IndexOutOfRangeException(start);
+    throw new RangeError.value(start);
   }
   if (start + length > listLength) {
-    throw new IndexOutOfRangeException(start + length);
+    throw new RangeError.value(start + length);
   }
 }
 
@@ -1717,7 +1717,7 @@
   int operator[](int index) {
     if (index < 0 || index >= _length) {
       String message = "$index must be in the range [0..$_length)";
-      throw new IndexOutOfRangeException(message);
+      throw new RangeError(message);
     }
     return _array.getInt8(_offset + (index * _BYTES_PER_ELEMENT));
   }
@@ -1725,7 +1725,7 @@
   void operator[]=(int index, int value) {
     if (index < 0 || index >= _length) {
       String message = "$index must be in the range [0..$_length)";
-      throw new IndexOutOfRangeException(message);
+      throw new RangeError(message);
     }
     _array.setInt8(_offset + (index * _BYTES_PER_ELEMENT), _toInt8(value));
   }
@@ -1789,7 +1789,7 @@
   int operator[](int index) {
     if (index < 0 || index >= _length) {
       String message = "$index must be in the range [0..$_length)";
-      throw new IndexOutOfRangeException(message);
+      throw new RangeError(message);
     }
     return _array.getUint8(_offset + (index * _BYTES_PER_ELEMENT));
   }
@@ -1797,7 +1797,7 @@
   void operator[]=(int index, int value) {
     if (index < 0 || index >= _length) {
       String message = "$index must be in the range [0..$_length)";
-      throw new IndexOutOfRangeException(message);
+      throw new RangeError(message);
     }
     _array.setUint8(_offset + (index * _BYTES_PER_ELEMENT), _toUint8(value));
   }
@@ -1861,7 +1861,7 @@
   int operator[](int index) {
     if (index < 0 || index >= _length) {
       String message = "$index must be in the range [0..$_length)";
-      throw new IndexOutOfRangeException(message);
+      throw new RangeError(message);
     }
     return _array.getInt16(_offset + (index * _BYTES_PER_ELEMENT));
   }
@@ -1869,7 +1869,7 @@
   void operator[]=(int index, int value) {
     if (index < 0 || index >= _length) {
       String message = "$index must be in the range [0..$_length)";
-      throw new IndexOutOfRangeException(message);
+      throw new RangeError(message);
     }
     _array.setInt16(_offset + (index * _BYTES_PER_ELEMENT), _toInt16(value));
   }
@@ -1933,7 +1933,7 @@
   int operator[](int index) {
     if (index < 0 || index >= _length) {
       String message = "$index must be in the range [0..$_length)";
-      throw new IndexOutOfRangeException(message);
+      throw new RangeError(message);
     }
     return _array.getUint16(_offset + (index * _BYTES_PER_ELEMENT));
   }
@@ -1941,7 +1941,7 @@
   void operator[]=(int index, int value) {
     if (index < 0 || index >= _length) {
       String message = "$index must be in the range [0..$_length)";
-      throw new IndexOutOfRangeException(message);
+      throw new RangeError(message);
     }
     _array.setUint16(_offset + (index * _BYTES_PER_ELEMENT), _toUint16(value));
   }
@@ -2005,7 +2005,7 @@
   int operator[](int index) {
     if (index < 0 || index >= _length) {
       String message = "$index must be in the range [0..$_length)";
-      throw new IndexOutOfRangeException(message);
+      throw new RangeError(message);
     }
     return _array.getInt32(_offset + (index * _BYTES_PER_ELEMENT));
   }
@@ -2013,7 +2013,7 @@
   void operator[]=(int index, int value) {
     if (index < 0 || index >= _length) {
       String message = "$index must be in the range [0..$_length)";
-      throw new IndexOutOfRangeException(message);
+      throw new RangeError(message);
     }
     _array.setInt32(_offset + (index * _BYTES_PER_ELEMENT), _toInt32(value));
   }
@@ -2077,7 +2077,7 @@
   int operator[](int index) {
     if (index < 0 || index >= _length) {
       String message = "$index must be in the range [0..$_length)";
-      throw new IndexOutOfRangeException(message);
+      throw new RangeError(message);
     }
     return _array.getUint32(_offset + (index * _BYTES_PER_ELEMENT));
   }
@@ -2085,7 +2085,7 @@
   void operator[]=(int index, int value) {
     if (index < 0 || index >= _length) {
       String message = "$index must be in the range [0..$_length)";
-      throw new IndexOutOfRangeException(message);
+      throw new RangeError(message);
     }
     _array.setUint32(_offset + (index * _BYTES_PER_ELEMENT), _toUint32(value));
   }
@@ -2149,7 +2149,7 @@
   int operator[](int index) {
     if (index < 0 || index >= _length) {
       String message = "$index must be in the range [0..$_length)";
-      throw new IndexOutOfRangeException(message);
+      throw new RangeError(message);
     }
     return _array.getInt64(_offset + (index * _BYTES_PER_ELEMENT));
   }
@@ -2157,7 +2157,7 @@
   void operator[]=(int index, int value) {
     if (index < 0 || index >= _length) {
       String message = "$index must be in the range [0..$_length)";
-      throw new IndexOutOfRangeException(message);
+      throw new RangeError(message);
     }
     _array.setInt64(_offset + (index * _BYTES_PER_ELEMENT), _toInt64(value));
   }
@@ -2221,7 +2221,7 @@
   int operator[](int index) {
     if (index < 0 || index >= _length) {
       String message = "$index must be in the range [0..$_length)";
-      throw new IndexOutOfRangeException(message);
+      throw new RangeError(message);
     }
     return _array.getUint64(_offset + (index * _BYTES_PER_ELEMENT));
   }
@@ -2229,7 +2229,7 @@
   void operator[]=(int index, int value) {
     if (index < 0 || index >= _length) {
       String message = "$index must be in the range [0..$_length)";
-      throw new IndexOutOfRangeException(message);
+      throw new RangeError(message);
     }
     _array.setUint64(_offset + (index * _BYTES_PER_ELEMENT), _toUint64(value));
   }
@@ -2293,7 +2293,7 @@
   double operator[](int index) {
     if (index < 0 || index >= _length) {
       String message = "$index must be in the range [0..$_length)";
-      throw new IndexOutOfRangeException(message);
+      throw new RangeError(message);
     }
     return _array.getFloat32(_offset + (index * _BYTES_PER_ELEMENT));
   }
@@ -2301,7 +2301,7 @@
   void operator[]=(int index, double value) {
     if (index < 0 || index >= _length) {
       String message = "$index must be in the range [0..$_length)";
-      throw new IndexOutOfRangeException(message);
+      throw new RangeError(message);
     }
     _array.setFloat32(_offset + (index * _BYTES_PER_ELEMENT), value);
   }
@@ -2365,7 +2365,7 @@
   double operator[](int index) {
     if (index < 0 || index >= _length) {
       String message = "$index must be in the range [0..$_length)";
-      throw new IndexOutOfRangeException(message);
+      throw new RangeError(message);
     }
     return _array.getFloat64(_offset + (index * _BYTES_PER_ELEMENT));
   }
@@ -2373,7 +2373,7 @@
   void operator[]=(int index, double value) {
     if (index < 0 || index >= _length) {
       String message = "$index must be in the range [0..$_length)";
-      throw new IndexOutOfRangeException(message);
+      throw new RangeError(message);
     }
     _array.setFloat64(_offset + (index * _BYTES_PER_ELEMENT), value);
   }
diff --git a/runtime/lib/errors_patch.dart b/runtime/lib/errors_patch.dart
index 7894ae3..d09dc3d 100644
--- a/runtime/lib/errors_patch.dart
+++ b/runtime/lib/errors_patch.dart
@@ -8,15 +8,3 @@
   }
 }
 
-// Exceptions that should be NoSuchMethodError instead.
-
-class _ClosureArgumentMismatchException implements Exception {
-  const _ClosureArgumentMismatchException();
-  String toString() => "Closure argument mismatch";
-}
-
-
-class _ObjectNotClosureException implements Exception {
-  const _ObjectNotClosureException();
-  String toString() => "Object is not closure";
-}
diff --git a/runtime/lib/growable_array.cc b/runtime/lib/growable_array.cc
index 8ffd3d2..c3b6f5e 100644
--- a/runtime/lib/growable_array.cc
+++ b/runtime/lib/growable_array.cc
@@ -22,7 +22,7 @@
     const Integer& index = Integer::Handle(Integer::New(data.Length()));
     GrowableArray<const Object*> args;
     args.Add(&index);
-    Exceptions::ThrowByType(Exceptions::kIndexOutOfRange, args);
+    Exceptions::ThrowByType(Exceptions::kRange, args);
   }
   const GrowableObjectArray& new_array =
       GrowableObjectArray::Handle(GrowableObjectArray::New(data));
@@ -38,7 +38,7 @@
   if ((index.Value() < 0) || (index.Value() >= array.Length())) {
     GrowableArray<const Object*> args;
     args.Add(&index);
-    Exceptions::ThrowByType(Exceptions::kIndexOutOfRange, args);
+    Exceptions::ThrowByType(Exceptions::kRange, args);
   }
   const Instance& obj = Instance::CheckedHandle(array.At(index.Value()));
   return obj.raw();
@@ -52,7 +52,7 @@
   if ((index.Value() < 0) || (index.Value() >= array.Length())) {
     GrowableArray<const Object*> args;
     args.Add(&index);
-    Exceptions::ThrowByType(Exceptions::kIndexOutOfRange, args);
+    Exceptions::ThrowByType(Exceptions::kRange, args);
   }
   GET_NATIVE_ARGUMENT(Instance, value, arguments->At(2));
   array.SetAt(index.Value(), value);
@@ -81,7 +81,7 @@
   if ((length.Value() < 0) || (length.Value() > array.Capacity())) {
     GrowableArray<const Object*> args;
     args.Add(&length);
-    Exceptions::ThrowByType(Exceptions::kIndexOutOfRange, args);
+    Exceptions::ThrowByType(Exceptions::kRange, args);
   }
   array.SetLength(length.Value());
   return Object::null();
diff --git a/runtime/lib/growable_array.dart b/runtime/lib/growable_array.dart
index c648fb5..a8462a3 100644
--- a/runtime/lib/growable_array.dart
+++ b/runtime/lib/growable_array.dart
@@ -49,7 +49,7 @@
       throw new ArgumentError("invalid length specified $length");
     }
     if (start < 0 || start > this.length) {
-      throw new IndexOutOfRangeException(start);
+      throw new RangeError.value(start);
     }
     var old_length = this.length;
     this.length = old_length + length;  // Will expand if needed.
diff --git a/runtime/lib/invocation_mirror_patch.dart b/runtime/lib/invocation_mirror_patch.dart
index 5bf4e42..5eedca0 100644
--- a/runtime/lib/invocation_mirror_patch.dart
+++ b/runtime/lib/invocation_mirror_patch.dart
@@ -7,13 +7,17 @@
   static final int GETTER = 1;
   static final int SETTER = 2;
 
-  final String methodName;
+  final String memberName;
   final List positionalArguments;
   final Map<String,dynamic> namedArguments = null;
 
   final int _type;
 
-  _InvocationMirror(this.methodName, this._type, this.positionalArguments);
+  _InvocationMirror(this.memberName, this._type, this.positionalArguments);
+
+  static _allocateInvocationMirror(name, arguments) {
+    return new _InvocationMirror(name, METHOD, arguments);
+  }
 
   bool get isMethod => _type == METHOD;
   bool get isAccessor => _type != METHOD;
diff --git a/runtime/lib/lib_impl_sources.gypi b/runtime/lib/lib_impl_sources.gypi
index 090635d..9df2c1a 100644
--- a/runtime/lib/lib_impl_sources.gypi
+++ b/runtime/lib/lib_impl_sources.gypi
@@ -6,13 +6,6 @@
 
 {
   'sources': [
-    'array.cc',
-    'array.dart',
-    'array_patch.dart',
-    'growable_array.cc',
-    'growable_array.dart',
-    'immutable_map.dart',
-    'literal_factory.dart',
     'math.dart',
     'math.cc',
     'object.cc',
@@ -20,9 +13,5 @@
     'regexp_jsc.cc',
     'regexp_jsc.h',
     'regexp_patch.dart',
-    'stopwatch_patch.dart',
-    'string.cc',
-    'string_base.dart',
-    'string_patch.dart',
   ],
 }
diff --git a/runtime/lib/lib_sources.gypi b/runtime/lib/lib_sources.gypi
index 9ddcd3b..3d3cf07 100644
--- a/runtime/lib/lib_sources.gypi
+++ b/runtime/lib/lib_sources.gypi
@@ -8,6 +8,9 @@
   'sources': [
     'date.cc',
     'date_patch.dart',
+    'array.cc',
+    'array.dart',
+    'array_patch.dart',
     'double.cc',
     'double.dart',
     'double_patch.dart',
@@ -17,13 +20,21 @@
     'error.h',
     'expando_patch.dart',
     'function_patch.dart',
+    'growable_array.cc',
+    'growable_array.dart',
+    'immutable_map.dart',
     'integers.cc',
     'integers.dart',
     'integers_patch.dart',
     'invocation_mirror_patch.dart',
+    'literal_factory.dart',
     'object_patch.dart',
     'print_patch.dart',
+    'stopwatch_patch.dart',
     'stopwatch.cc',
+    'string.cc',
+    'string_base.dart',
+    'string_patch.dart',
     'type_patch.dart',
     'weak_property.dart',
     'weak_property.cc',
diff --git a/runtime/lib/math_patch.dart b/runtime/lib/math_patch.dart
index 9327560..0612d3d 100644
--- a/runtime/lib/math_patch.dart
+++ b/runtime/lib/math_patch.dart
@@ -33,16 +33,20 @@
 
 class _Random implements Random {
   // Internal state of the random number generator.
-  var _state;
+  var _state_lo;
+  var _state_hi;
 
-  _Random._internal(this._state);
+  _Random._internal(state)
+      : _state_lo = (state & _MASK_32), _state_hi = (state >> 32);
 
   // The algorithm used here is Multiply with Carry (MWC) with a Base b = 2^32.
   // http://en.wikipedia.org/wiki/Multiply-with-carry
   // The constant A is selected from "Numerical Recipes 3rd Edition" p.348 B1.
   int _nextInt32() {
-    _state = ((_A * (_state & _MASK_32)) + (_state >> 32)) & _MASK_64;
-    return _state & _MASK_32;
+    var state = ((_A * (_state_lo)) + _state_hi) & _MASK_64;
+    _state_lo = state & _MASK_32;
+    _state_hi = state >> 32;
+    return _state_lo;
   }
 
   int nextInt(int max) {
@@ -89,7 +93,6 @@
       _prng = new Random(new Date.now().millisecondsSinceEpoch);
     }
     // Trigger the PRNG once to change the internal state.
-    _prng._nextInt32();
-    return _prng._state;
+    return _prng._nextInt32();
   }
 }
diff --git a/runtime/lib/mirrors.cc b/runtime/lib/mirrors.cc
index 179264b..c7990b4 100644
--- a/runtime/lib/mirrors.cc
+++ b/runtime/lib/mirrors.cc
@@ -14,6 +14,11 @@
 
 namespace dart {
 
+inline Dart_Handle NewString(const char* str) {
+  return Dart_NewStringFromCString(str);
+}
+
+
 DEFINE_NATIVE_ENTRY(Mirrors_isLocalPort, 1) {
   GET_NATIVE_ARGUMENT(Instance, port, arguments->At(0));
 
@@ -34,14 +39,14 @@
 // TODO(turnidge): Add Map support to the dart embedding api instead
 // of implementing it here.
 static Dart_Handle CoreLib() {
-  Dart_Handle core_lib_name = Dart_NewString("dart:core");
+  Dart_Handle core_lib_name = NewString("dart:core");
   return Dart_LookupLibrary(core_lib_name);
 }
 
 
 static Dart_Handle MapNew() {
   // TODO(turnidge): Switch to an order-preserving map type.
-  Dart_Handle cls = Dart_GetClass(CoreLib(), Dart_NewString("Map"));
+  Dart_Handle cls = Dart_GetClass(CoreLib(), NewString("Map"));
   if (Dart_IsError(cls)) {
     return cls;
   }
@@ -51,18 +56,18 @@
 
 static Dart_Handle MapAdd(Dart_Handle map, Dart_Handle key, Dart_Handle value) {
   Dart_Handle args[] = { key, value };
-  return Dart_Invoke(map, Dart_NewString("[]="), ARRAY_SIZE(args), args);
+  return Dart_Invoke(map, NewString("[]="), ARRAY_SIZE(args), args);
 }
 
 
 static Dart_Handle MirrorLib() {
-  Dart_Handle mirror_lib_name = Dart_NewString("dart:mirrors");
+  Dart_Handle mirror_lib_name = NewString("dart:mirrors");
   return Dart_LookupLibrary(mirror_lib_name);
 }
 
 
 static Dart_Handle IsMirror(Dart_Handle object, bool* is_mirror) {
-  Dart_Handle cls_name = Dart_NewString("Mirror");
+  Dart_Handle cls_name = NewString("Mirror");
   Dart_Handle cls = Dart_GetClass(MirrorLib(), cls_name);
   if (Dart_IsError(cls)) {
     return cls;
@@ -92,7 +97,7 @@
 
 static Dart_Handle CreateVMReference(Dart_Handle handle) {
   // Create the VMReference object.
-  Dart_Handle cls_name = Dart_NewString("VMReference");
+  Dart_Handle cls_name = NewString("VMReference");
   Dart_Handle cls = Dart_GetClass(MirrorLib(), cls_name);
   if (Dart_IsError(cls)) {
     return cls;
@@ -148,7 +153,7 @@
 
 
 static Dart_Handle UnwrapMirror(Dart_Handle mirror) {
-  Dart_Handle field_name = Dart_NewString("_reference");
+  Dart_Handle field_name = NewString("_reference");
   Dart_Handle vm_ref = Dart_GetField(mirror, field_name);
   if (Dart_IsError(vm_ref)) {
     return vm_ref;
@@ -213,7 +218,7 @@
     return result;
   }
 
-  Dart_Handle param_cls_name = Dart_NewString("_LocalParameterMirrorImpl");
+  Dart_Handle param_cls_name = NewString("_LocalParameterMirrorImpl");
   Dart_Handle param_cls = Dart_GetClass(MirrorLib(), param_cls_name);
   if (Dart_IsError(param_cls)) {
     return param_cls;
@@ -248,7 +253,7 @@
   }
 
   if (Dart_IsLibrary(target)) {
-    Dart_Handle cls_name = Dart_NewString("_LazyLibraryMirror");
+    Dart_Handle cls_name = NewString("_LazyLibraryMirror");
     Dart_Handle cls = Dart_GetClass(MirrorLib(), cls_name);
     Dart_Handle args[] = { Dart_LibraryName(target) };
     return Dart_New(cls, Dart_Null(), ARRAY_SIZE(args), args);
@@ -256,7 +261,7 @@
 
   if (Dart_IsClass(target) || Dart_IsInterface(target)) {
     if (Dart_ClassIsFunctionType(target)) {
-      Dart_Handle cls_name = Dart_NewString("_LazyFunctionTypeMirror");
+      Dart_Handle cls_name = NewString("_LazyFunctionTypeMirror");
       Dart_Handle cls = Dart_GetClass(MirrorLib(), cls_name);
 
       Dart_Handle sig = Dart_ClassGetFunctionTypeSignature(target);
@@ -271,7 +276,7 @@
       };
       return Dart_New(cls, Dart_Null(), ARRAY_SIZE(args), args);
     } else {
-      Dart_Handle cls_name = Dart_NewString("_LazyTypeMirror");
+      Dart_Handle cls_name = NewString("_LazyTypeMirror");
       Dart_Handle cls = Dart_GetClass(MirrorLib(), cls_name);
       Dart_Handle lib = Dart_ClassGetLibrary(target);
       Dart_Handle lib_name;
@@ -290,7 +295,7 @@
     Dart_Handle owner = Dart_TypeVariableOwner(target);
     Dart_Handle owner_mirror = CreateLazyMirror(owner);
 
-    Dart_Handle cls_name = Dart_NewString("_LazyTypeVariableMirror");
+    Dart_Handle cls_name = NewString("_LazyTypeVariableMirror");
     Dart_Handle cls = Dart_GetClass(MirrorLib(), cls_name);
 
     Dart_Handle args[] = { var_name, owner_mirror };
@@ -336,7 +341,7 @@
                                             Dart_Handle type_var_name,
                                             Dart_Handle owner_mirror) {
   ASSERT(Dart_IsTypeVariable(type_var));
-  Dart_Handle cls_name = Dart_NewString("_LocalTypeVariableMirrorImpl");
+  Dart_Handle cls_name = NewString("_LocalTypeVariableMirrorImpl");
   Dart_Handle cls = Dart_GetClass(MirrorLib(), cls_name);
   if (Dart_IsError(cls)) {
     return cls;
@@ -400,7 +405,7 @@
                                        Dart_Handle cls_name,
                                        Dart_Handle owner,
                                        Dart_Handle owner_mirror) {
-  Dart_Handle mirror_cls_name = Dart_NewString("_LocalTypedefMirrorImpl");
+  Dart_Handle mirror_cls_name = NewString("_LocalTypedefMirrorImpl");
   Dart_Handle mirror_cls = Dart_GetClass(MirrorLib(), mirror_cls_name);
   if (Dart_IsError(mirror_cls)) {
     return mirror_cls;
@@ -438,7 +443,7 @@
     return CreateTypedefMirror(intf, intf_name, lib, lib_mirror);
   }
 
-  Dart_Handle cls_name = Dart_NewString("_LocalClassMirrorImpl");
+  Dart_Handle cls_name = NewString("_LocalClassMirrorImpl");
   Dart_Handle cls = Dart_GetClass(MirrorLib(), cls_name);
   if (Dart_IsError(cls)) {
     return cls;
@@ -447,7 +452,7 @@
   // TODO(turnidge): Why am I getting Null when I expect Object?
   Dart_Handle super_class = Dart_GetSuperclass(intf);
   if (Dart_IsNull(super_class)) {
-    super_class = Dart_GetClass(CoreLib(), Dart_NewString("Object"));
+    super_class = Dart_GetClass(CoreLib(), NewString("Object"));
   }
   Dart_Handle default_class = Dart_ClassGetDefault(intf);
 
@@ -489,7 +494,7 @@
                                       Dart_Handle func_name,
                                       Dart_Handle owner_mirror) {
   ASSERT(Dart_IsFunction(func));
-  Dart_Handle mirror_cls_name = Dart_NewString("_LocalMethodMirrorImpl");
+  Dart_Handle mirror_cls_name = NewString("_LocalMethodMirrorImpl");
   Dart_Handle mirror_cls = Dart_GetClass(MirrorLib(), mirror_cls_name);
   if (Dart_IsError(mirror_cls)) {
     return mirror_cls;
@@ -562,7 +567,7 @@
                                         Dart_Handle var_name,
                                         Dart_Handle lib_mirror) {
   ASSERT(Dart_IsVariable(var));
-  Dart_Handle cls_name = Dart_NewString("_LocalVariableMirrorImpl");
+  Dart_Handle cls_name = NewString("_LocalVariableMirrorImpl");
   Dart_Handle cls = Dart_GetClass(MirrorLib(), cls_name);
   if (Dart_IsError(cls)) {
     return cls;
@@ -795,7 +800,7 @@
 
 
 static Dart_Handle CreateLibraryMirror(Dart_Handle lib) {
-  Dart_Handle cls_name = Dart_NewString("_LocalLibraryMirrorImpl");
+  Dart_Handle cls_name = NewString("_LocalLibraryMirrorImpl");
   Dart_Handle cls = Dart_GetClass(MirrorLib(), cls_name);
   if (Dart_IsError(cls)) {
     return cls;
@@ -855,7 +860,7 @@
 
 
 static Dart_Handle CreateIsolateMirror() {
-  Dart_Handle cls_name = Dart_NewString("_LocalIsolateMirrorImpl");
+  Dart_Handle cls_name = NewString("_LocalIsolateMirrorImpl");
   Dart_Handle cls = Dart_GetClass(MirrorLib(), cls_name);
   if (Dart_IsError(cls)) {
     return cls;
@@ -869,7 +874,7 @@
 
 
 static Dart_Handle CreateMirrorSystem() {
-  Dart_Handle cls_name = Dart_NewString("_LocalMirrorSystemImpl");
+  Dart_Handle cls_name = NewString("_LocalMirrorSystemImpl");
   Dart_Handle cls = Dart_GetClass(MirrorLib(), cls_name);
   if (Dart_IsError(cls)) {
     return cls;
@@ -894,14 +899,14 @@
 
 
 static Dart_Handle CreateNullMirror() {
-  Dart_Handle cls_name = Dart_NewString("_LocalInstanceMirrorImpl");
+  Dart_Handle cls_name = NewString("_LocalInstanceMirrorImpl");
   Dart_Handle cls = Dart_GetClass(MirrorLib(), cls_name);
   if (Dart_IsError(cls)) {
     return cls;
   }
 
   // TODO(turnidge): This is wrong.  The Null class is distinct from object.
-  Dart_Handle object_class = Dart_GetClass(CoreLib(), Dart_NewString("Object"));
+  Dart_Handle object_class = Dart_GetClass(CoreLib(), NewString("Object"));
 
   Dart_Handle args[] = {
     CreateVMReference(Dart_Null()),
@@ -925,7 +930,7 @@
   }
 
   if (Dart_IsClosure(instance)) {
-    Dart_Handle cls_name = Dart_NewString("_LocalClosureMirrorImpl");
+    Dart_Handle cls_name = NewString("_LocalClosureMirrorImpl");
     Dart_Handle cls = Dart_GetClass(MirrorLib(), cls_name);
     if (Dart_IsError(cls)) {
       return cls;
@@ -938,7 +943,7 @@
     }
 
     // TODO(turnidge): Why not use the real function name here?
-    Dart_Handle func_name = Dart_NewString("call");
+    Dart_Handle func_name = NewString("call");
     Dart_Handle func_owner = Dart_FunctionOwner(func);
     if (Dart_IsError(func_owner)) {
       return func_owner;
@@ -960,7 +965,7 @@
     return Dart_New(cls, Dart_Null(), ARRAY_SIZE(args), args);
 
   } else {
-    Dart_Handle cls_name = Dart_NewString("_LocalInstanceMirrorImpl");
+    Dart_Handle cls_name = NewString("_LocalInstanceMirrorImpl");
     Dart_Handle cls = Dart_GetClass(MirrorLib(), cls_name);
     if (Dart_IsError(cls)) {
       return cls;
@@ -995,7 +1000,7 @@
     if (Dart_IsError(stack)) {
       return stack;
     }
-    Dart_Handle cls_name = Dart_NewString("MirroredUncaughtExceptionError");
+    Dart_Handle cls_name = NewString("MirroredUncaughtExceptionError");
     Dart_Handle cls = Dart_GetClass(MirrorLib(), cls_name);
     Dart_Handle args[] = {
       CreateInstanceMirror(exc),
@@ -1007,9 +1012,9 @@
     return Dart_NewUnhandledExceptionError(mirrored_exc);
   } else if (Dart_IsApiError(error) ||
              Dart_IsCompilationError(error)) {
-    Dart_Handle cls_name = Dart_NewString("MirroredCompilationError");
+    Dart_Handle cls_name = NewString("MirroredCompilationError");
     Dart_Handle cls = Dart_GetClass(MirrorLib(), cls_name);
-    Dart_Handle args[] = { Dart_NewString(Dart_GetError(error)) };
+    Dart_Handle args[] = { NewString(Dart_GetError(error)) };
     Dart_Handle mirrored_exc =
         Dart_New(cls, Dart_Null(), ARRAY_SIZE(args), args);
     return Dart_NewUnhandledExceptionError(mirrored_exc);
diff --git a/runtime/lib/object.cc b/runtime/lib/object.cc
index 9593ba0..24b4dfb 100644
--- a/runtime/lib/object.cc
+++ b/runtime/lib/object.cc
@@ -27,10 +27,12 @@
     args.Add(&func_args);
     Exceptions::ThrowByType(Exceptions::kNullPointer, args);
   }
+  const Object& null_object = Object::Handle(Object::null());
   GrowableArray<const Object*> dart_arguments(3);
   dart_arguments.Add(&instance);
   dart_arguments.Add(&function_name);
   dart_arguments.Add(&func_args);
+  dart_arguments.Add(&null_object);
 
   // Report if a function with same name (but different arguments) has been
   // found.
diff --git a/runtime/lib/object_patch.dart b/runtime/lib/object_patch.dart
index 603e14e..401d94f 100644
--- a/runtime/lib/object_patch.dart
+++ b/runtime/lib/object_patch.dart
@@ -23,8 +23,14 @@
   // A statically dispatched version of Object.toString.
   static String _toString(obj) native "Object_toString";
 
-  /* patch */ Dynamic noSuchMethod(String functionName, List args)
+  dynamic _noSuchMethod(String functionName, List args)
       native "Object_noSuchMethod";
 
+  /* patch */ dynamic noSuchMethod(InvocationMirror invocation) {
+    var methodName = invocation.memberName;
+    var args = invocation.positionalArguments;
+    return _noSuchMethod(methodName, args);
+  }
+
   /* patch */ Type get runtimeType native "Object_runtimeType";
 }
diff --git a/runtime/lib/regexp_patch.dart b/runtime/lib/regexp_patch.dart
index 936a7fe..115dd45 100644
--- a/runtime/lib/regexp_patch.dart
+++ b/runtime/lib/regexp_patch.dart
@@ -18,7 +18,7 @@
 
   String group(int groupIdx) {
     if (groupIdx < 0 || groupIdx > regexp._groupCount) {
-      throw new IndexOutOfRangeException(groupIdx);
+      throw new RangeError.value(groupIdx);
     }
     int startIndex = _start(groupIdx);
     int endIndex = _end(groupIdx);
@@ -26,7 +26,8 @@
       assert(endIndex == -1);
       return null;
     }
-    return str._substringUnchecked(startIndex, endIndex);
+    // TODO(ajohnsen): Use _substringUnchecked when regexp is in core.
+    return str.substring(startIndex, endIndex);
   }
 
   String operator [](int groupIdx) {
@@ -98,7 +99,8 @@
     if (match === null) {
       return null;
     }
-    return str._substringUnchecked(match[0], match[1]);
+    // TODO(ajohnsen): Use _substringUnchecked when regexp is in core.
+    return str.substring(match[0], match[1]);
   }
 
   /* patch */ String get pattern native "JSSyntaxRegExp_getPattern";
diff --git a/runtime/lib/stopwatch_patch.dart b/runtime/lib/stopwatch_patch.dart
index b81b8b0..19645d1 100644
--- a/runtime/lib/stopwatch_patch.dart
+++ b/runtime/lib/stopwatch_patch.dart
@@ -4,7 +4,7 @@
 
 // A VM patch of the stopwatch part of dart:core.
 
-patch class StopwatchImplementation {
+patch class _StopwatchImpl {
   // Returns the current clock tick.
   /* patch */ static int _now() native "Stopwatch_now";
 
diff --git a/runtime/lib/string.cc b/runtime/lib/string.cc
index 2d5bd91..7707ed6 100644
--- a/runtime/lib/string.cc
+++ b/runtime/lib/string.cc
@@ -15,14 +15,14 @@
   GET_NATIVE_ARGUMENT(Array, a, arguments->At(0));
   // TODO(srdjan): Check that parameterized type is an int.
   Zone* zone = isolate->current_zone();
-  intptr_t len = a.Length();
+  intptr_t array_len = a.Length();
 
   // Unbox the array and determine the maximum element width.
   bool is_one_byte_string = true;
-  bool is_two_byte_string = true;
-  uint32_t* temp = zone->Alloc<uint32_t>(len);
+  intptr_t utf16_len = array_len;
+  uint32_t* utf32_array = zone->Alloc<uint32_t>(array_len);
   Object& index_object = Object::Handle(isolate);
-  for (intptr_t i = 0; i < len; i++) {
+  for (intptr_t i = 0; i < array_len; i++) {
     index_object = a.At(i);
     if (!index_object.IsSmi()) {
       GrowableArray<const Object*> args;
@@ -33,21 +33,20 @@
     if (value < 0) {
       GrowableArray<const Object*> args;
       Exceptions::ThrowByType(Exceptions::kArgument, args);
-    } else if (value > 0xFFFF) {
-      is_one_byte_string = false;
-      is_two_byte_string = false;
-    } else if (value > 0xFF) {
-      is_one_byte_string = false;
+    } else {
+      if (value > 0x7F) {
+        is_one_byte_string = false;
+      }
+      if (value > 0xFFFF) {
+        utf16_len += 1;
+      }
     }
-    temp[i] = value;
+    utf32_array[i] = value;
   }
   if (is_one_byte_string) {
-    return OneByteString::New(temp, len, Heap::kNew);
-  } else if (is_two_byte_string) {
-    return TwoByteString::New(temp, len, Heap::kNew);
-  } else {
-    return FourByteString::New(temp, len, Heap::kNew);
+    return OneByteString::New(utf32_array, array_len, Heap::kNew);
   }
+  return TwoByteString::New(utf16_len, utf32_array, array_len, Heap::kNew);
 }
 
 
@@ -85,14 +84,14 @@
     if ((index < 0) || (index >= str.Length())) {
       GrowableArray<const Object*> arguments;
       arguments.Add(&smi);
-      Exceptions::ThrowByType(Exceptions::kIndexOutOfRange, arguments);
+      Exceptions::ThrowByType(Exceptions::kRange, arguments);
     }
     return str.CharAt(index);
   } else {
     // An index larger than Smi is always illegal.
     GrowableArray<const Object*> arguments;
     arguments.Add(&index);
-    Exceptions::ThrowByType(Exceptions::kIndexOutOfRange, arguments);
+    Exceptions::ThrowByType(Exceptions::kRange, arguments);
     return 0;
   }
 }
diff --git a/runtime/lib/string_base.dart b/runtime/lib/string_base.dart
index 792940d..11b594e 100644
--- a/runtime/lib/string_base.dart
+++ b/runtime/lib/string_base.dart
@@ -33,7 +33,7 @@
     return _createFromCodePoints(objectArray);
   }
 
-  static String _createFromCodePoints(_ObjectArray<int> codePoints)
+  static String _createFromCodePoints(List<int> codePoints)
       native "StringBase_createFromCodePoints";
 
   String operator [](int index) native "String_charAt";
@@ -144,13 +144,13 @@
     if (endIndex === null) endIndex = this.length;
 
     if ((startIndex < 0) || (startIndex > this.length)) {
-      throw new IndexOutOfRangeException(startIndex);
+      throw new RangeError.value(startIndex);
     }
     if ((endIndex < 0) || (endIndex > this.length)) {
-      throw new IndexOutOfRangeException(endIndex);
+      throw new RangeError.value(endIndex);
     }
     if (startIndex > endIndex) {
-      throw new IndexOutOfRangeException(startIndex);
+      throw new RangeError.value(startIndex);
     }
     return _substringUnchecked(startIndex, endIndex);
   }
@@ -232,7 +232,7 @@
    */
   static String _interpolate(List values) {
     int numValues = values.length;
-    var stringList = new _ObjectArray(numValues);
+    var stringList = new List(numValues);
     for (int i = 0; i < numValues; i++) {
       stringList[i] = values[i].toString();
     }
@@ -349,7 +349,7 @@
     return _concatAll(stringsArray);
   }
 
-  static String _concatAll(_ObjectArray<String> strings)
+  static String _concatAll(List<String> strings)
       native "Strings_concatAll";
 }
 
@@ -468,7 +468,7 @@
 
   String group(int group) {
     if (group != 0) {
-      throw new IndexOutOfRangeException(group);
+      throw new RangeError.value(group);
     }
     return pattern;
   }
diff --git a/runtime/lib/string_patch.dart b/runtime/lib/string_patch.dart
index b59e06a..2704c5f 100644
--- a/runtime/lib/string_patch.dart
+++ b/runtime/lib/string_patch.dart
@@ -2,8 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-patch class StringImplementation {
-  /* patch */ static String _fromCharCodes(List<int> charCodes) {
+patch class _StringImpl {
+  /* patch */ factory String.fromCharCodes(List<int> charCodes) {
     return _StringBase.createFromCharCodes(charCodes);
   }
 
diff --git a/runtime/tests/vm/dart/byte_array_test.dart b/runtime/tests/vm/dart/byte_array_test.dart
index 701669a..d148888 100644
--- a/runtime/tests/vm/dart/byte_array_test.dart
+++ b/runtime/tests/vm/dart/byte_array_test.dart
@@ -20,13 +20,13 @@
                        0, 0, 0, 0, 0],
                       array);
     Expect.throws(() { array[-1] = 0; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { return array[-1]; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { array[10]; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { array[10] = 0; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { array.add(0); },
                   (e) { return e is UnsupportedError; });
     Expect.throws(() { array.addAll([0]); },
@@ -104,13 +104,13 @@
                        0, 0, 0, 0, 0],
                       array);
     Expect.throws(() { array[-1] = 0; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { return array[-1]; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { array[10]; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { array[10] = 0; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { array.add(0); },
                   (e) { return e is UnsupportedError; });
     Expect.throws(() { array.addAll([0]); },
@@ -176,13 +176,13 @@
                        0, 0, 0, 0, 0],
                       array);
     Expect.throws(() { array[-1] = 0; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { return array[-1]; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { array[10]; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { array[10] = 0; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { array.add(0); },
                   (e) { return e is UnsupportedError; });
     Expect.throws(() { array.addAll([0]); },
@@ -260,13 +260,13 @@
                        0, 0, 0, 0, 0],
                       array);
     Expect.throws(() { array[-1] = 0; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { return array[-1]; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { array[10]; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { array[10] = 0; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { array.add(0); },
                   (e) { return e is UnsupportedError; });
     Expect.throws(() { array.addAll([0]); },
@@ -332,13 +332,13 @@
                        0, 0, 0, 0, 0],
                       array);
     Expect.throws(() { array[-1] = 0; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { return array[-1]; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { array[10]; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { array[10] = 0; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { array.add(0); },
                   (e) { return e is UnsupportedError; });
     Expect.throws(() { array.addAll([0]); },
@@ -422,13 +422,13 @@
                        0, 0, 0, 0, 0],
                       array);
     Expect.throws(() { array[-1] = 0; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { return array[-1]; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { array[10]; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { array[10] = 0; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { array.add(0); },
                   (e) { return e is UnsupportedError; });
     Expect.throws(() { array.addAll([0]); },
@@ -497,13 +497,13 @@
                        0, 0, 0, 0, 0],
                       array);
     Expect.throws(() { array[-1] = 0; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { return array[-1]; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { array[10]; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { array[10] = 0; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { array.add(0); },
                   (e) { return e is UnsupportedError; });
     Expect.throws(() { array.addAll([0]); },
@@ -588,13 +588,13 @@
                        0, 0, 0, 0, 0],
                       array);
     Expect.throws(() { array[-1] = 0; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { return array[-1]; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { array[10]; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { array[10] = 0; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { array.add(0); },
                   (e) { return e is UnsupportedError; });
     Expect.throws(() { array.addAll([0]); },
@@ -663,13 +663,13 @@
                        0.0, 0.0, 0.0, 0.0, 0.0],
                       array);
     Expect.throws(() { array[-1] = 0.0; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { return array[-1]; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { array[10]; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { array[10] = 0.0; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { array.add(0.0); },
                   (e) { return e is UnsupportedError; });
     Expect.throws(() { array.addAll([0]); },
@@ -725,13 +725,13 @@
                        0.0, 0.0, 0.0, 0.0, 0.0],
                       array);
     Expect.throws(() { array[-1] = 0.0; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { return array[-1]; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { array[10]; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { array[10] = 0.0; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { array.add(0.0); },
                   (e) { return e is UnsupportedError; });
     Expect.throws(() { array.addAll([0]); },
@@ -782,85 +782,85 @@
     var byte_array = array.asByteArray(0, array.lengthInBytes());
     Expect.equals(8, byte_array.lengthInBytes());
     Expect.throws(() { byte_array.getInt8(-1); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { byte_array.getUint8(-1); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { byte_array.getInt16(-1); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { byte_array.getUint16(-1); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { byte_array.getInt32(-1); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { byte_array.getUint32(-1); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { byte_array.getInt64(-1); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { byte_array.getUint64(-1); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { byte_array.getFloat32(-1); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { byte_array.getFloat64(-1); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { byte_array.setInt8(-1, 0); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { byte_array.setUint8(-1, 0); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { byte_array.setInt16(-1, 0); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { byte_array.setUint16(-1, 0); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { byte_array.setInt32(-1, 0); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { byte_array.setUint32(-1, 0); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { byte_array.setInt64(-1, 0); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { byte_array.setUint64(-1, 0); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { byte_array.setFloat32(-1, 0.0); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { byte_array.setFloat64(-1, 0.0); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { byte_array.getInt8(8); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { byte_array.getUint8(8); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { byte_array.getInt16(8); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { byte_array.getUint16(8); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { byte_array.getInt32(8); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { byte_array.getUint32(8); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { byte_array.getInt64(8); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { byte_array.getUint64(8); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { byte_array.getFloat32(8); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { byte_array.getFloat64(8); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { byte_array.setInt8(8, 0); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { byte_array.setUint8(8, 0); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { byte_array.setInt16(8, 0); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { byte_array.setUint16(8, 0); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { byte_array.setInt32(8, 0); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { byte_array.setUint32(8, 0); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { byte_array.setInt64(8, 0); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { byte_array.setUint64(8, 0); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { byte_array.setFloat32(8, 0.0); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { byte_array.setFloat64(8, 0.0); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.equals(0, byte_array.getInt8(0));
     Expect.equals(0, byte_array.getUint8(0));
     Expect.equals(0, byte_array.getInt16(0));
@@ -929,18 +929,18 @@
       array[i] = 0xFF;
     }
     Expect.throws(() { new Int8List.view(array.asByteArray(), -1); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { new Int8List.view(array.asByteArray(), 0, -1); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { new Int8List.view(array.asByteArray(),
                                          array.lengthInBytes() + 1); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { new Int8List.view(array.asByteArray(),
                                          0, array.length + 1); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { new Int8List.view(array.asByteArray(),
                                          array.length - 1, 2); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     var empty = new Int8List.view(array.asByteArray(),
                                   array.lengthInBytes());
     Expect.isTrue(empty is List<int>);
@@ -960,13 +960,13 @@
                        -1, -1, -1, -1, -1],
                       view);
     Expect.throws(() { view[-1] = 0; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { return view[-1]; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { view[view.length]; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { view[10] = 0; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { view.add(0); },
                   (e) { return e is UnsupportedError; });
     Expect.throws(() { view.addAll([0]); },
@@ -1057,18 +1057,18 @@
       array[i] = -1;
     }
     Expect.throws(() { new Uint8List.view(array.asByteArray(), -1); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { new Uint8List.view(array.asByteArray(), 0, -1); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { new Uint8List.view(array.asByteArray(),
                                           array.lengthInBytes() + 1); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { new Uint8List.view(array.asByteArray(),
                                           0, array.length + 1); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { new Uint8List.view(array.asByteArray(),
                                           array.length - 1, 2); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     var empty = new Uint8List.view(array.asByteArray(),
                                    array.lengthInBytes());
     Expect.isTrue(empty is List<int>);
@@ -1088,13 +1088,13 @@
                        0xFF, 0xFF, 0xFF, 0xFF, 0xFF],
                       view);
     Expect.throws(() { view[-1] = 0; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { return view[-1]; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { view[view.length]; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { view[view.length] = 0; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { view.add(0); },
                   (e) { return e is UnsupportedError; });
     Expect.throws(() { view.addAll([0]); },
@@ -1164,18 +1164,18 @@
       array[i] = 0xFF;
     }
     Expect.throws(() { new Int16List.view(array.asByteArray(), -1); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { new Int16List.view(array.asByteArray(), 0, -1); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { new Int16List.view(array.asByteArray(),
                                           array.lengthInBytes() + 1); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { new Int16List.view(array.asByteArray(),
                                            0, array.length + 1); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { new Int16List.view(array.asByteArray(),
                                            array.length - 1, 2); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     var empty = new Int16List.view(array.asByteArray(),
                                    array.lengthInBytes());
     Expect.isTrue(empty is List<int>);
@@ -1195,13 +1195,13 @@
                        -1, -1, -1, -1, -1],
                       view);
     Expect.throws(() { view[-1] = 0; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { return view[-1]; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { view[view.length]; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { view[10] = 0; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { view.add(0); },
                   (e) { return e is UnsupportedError; });
     Expect.throws(() { view.addAll([0]); },
@@ -1299,18 +1299,18 @@
       array[i] = -1;
     }
     Expect.throws(() { new Uint16List.view(array.asByteArray(), -1); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { new Uint16List.view(array.asByteArray(), 0, -1); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { new Uint16List.view(array.asByteArray(),
                                            array.lengthInBytes() + 1); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { new Uint16List.view(array.asByteArray(),
                                            0, array.length + 1); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { new Uint16List.view(array.asByteArray(),
                                            array.length - 1, 2); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     var empty = new Uint16List.view(array.asByteArray(),
                                     array.lengthInBytes());
     Expect.isTrue(empty is List<int>);
@@ -1330,13 +1330,13 @@
                        0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF],
                       view);
     Expect.throws(() { view[-1] = 0; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { return view[-1]; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { view[view.length]; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { view[view.length] = 0; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { view.add(0); },
                   (e) { return e is UnsupportedError; });
     Expect.throws(() { view.addAll([0]); },
@@ -1411,18 +1411,18 @@
       array[i] = 0xFF;
     }
     Expect.throws(() { new Int32List.view(array.asByteArray(), -1); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { new Int32List.view(array.asByteArray(), 0, -1); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { new Int32List.view(array.asByteArray(),
                                           array.lengthInBytes() + 1); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { new Int32List.view(array.asByteArray(),
                                           0, array.length + 1); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { new Int32List.view(array.asByteArray(),
                                           array.length - 1, 2); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     var empty = new Int32List.view(array.asByteArray(),
                                    array.lengthInBytes());
     Expect.isTrue(empty is List<int>);
@@ -1442,13 +1442,13 @@
                        -1, -1, -1, -1, -1],
                       view);
     Expect.throws(() { view[-1] = 0; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { return view[-1]; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { view[view.length]; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { view[10] = 0; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { view.add(0); },
                   (e) { return e is UnsupportedError; });
     Expect.throws(() { view.addAll([0]); },
@@ -1570,18 +1570,18 @@
       array[i] = -1;
     }
     Expect.throws(() { new Uint32List.view(array.asByteArray(), -1); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { new Uint32List.view(array.asByteArray(), 0, -1); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { new Uint32List.view(array.asByteArray(),
                                            array.lengthInBytes() + 1); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { new Uint32List.view(array.asByteArray(),
                                            0, array.length + 1); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { new Uint32List.view(array.asByteArray(),
                                            array.length - 1, 2); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     var empty = new Uint32List.view(array.asByteArray(),
                                     array.lengthInBytes());
     Expect.isTrue(empty is List<int>);
@@ -1601,13 +1601,13 @@
                        0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF],
                       view);
     Expect.throws(() { view[-1] = 0; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { return view[-1]; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { view[view.length]; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { view[view.length] = 0; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { view.add(0); },
                   (e) { return e is UnsupportedError; });
     Expect.throws(() { view.addAll([0]); },
@@ -1699,18 +1699,18 @@
       array[i] = 0xFF;
     }
     Expect.throws(() { new Int64List.view(array.asByteArray(), -1); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { new Int64List.view(array.asByteArray(), 0, -1); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { new Int64List.view(array.asByteArray(),
                                           array.lengthInBytes() + 1); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { new Int64List.view(array.asByteArray(),
                                           0, array.length + 1); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { new Int64List.view(array.asByteArray(),
                                           array.length - 1, 2); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     var empty = new Int64List.view(array.asByteArray(),
                                    array.lengthInBytes());
     Expect.isTrue(empty is List<int>);
@@ -1730,13 +1730,13 @@
                        -1, -1, -1, -1, -1],
                       view);
     Expect.throws(() { view[-1] = 0; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { return view[-1]; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { view[view.length]; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { view[10] = 0; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { view.add(0); },
                   (e) { return e is UnsupportedError; });
     Expect.throws(() { view.addAll([0]); },
@@ -1895,18 +1895,18 @@
       array[i] = -1;
     }
     Expect.throws(() { new Uint64List.view(array.asByteArray(), -1); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { new Uint64List.view(array.asByteArray(), 0, -1); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { new Uint64List.view(array.asByteArray(),
                                            array.lengthInBytes() + 1); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { new Uint64List.view(array.asByteArray(),
                                            0, array.length + 1); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { new Uint64List.view(array.asByteArray(),
                                            array.length - 1, 2); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     var empty = new Uint64List.view(array.asByteArray(),
                                     array.lengthInBytes());
     Expect.isTrue(empty is List<int>);
@@ -1929,13 +1929,13 @@
                        0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF],
                       view);
     Expect.throws(() { view[-1] = 0; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { return view[-1]; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { view[view.length]; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { view[view.length] = 0; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { view.add(0); },
                   (e) { return e is UnsupportedError; });
     Expect.throws(() { view.addAll([0]); },
@@ -2052,18 +2052,18 @@
       array[i] = 0xBF800000;
     }
     Expect.throws(() { new Float32List.view(array.asByteArray(), -1); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { new Float32List.view(array.asByteArray(), 0, -1); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { new Float32List.view(array.asByteArray(),
                                             array.lengthInBytes() + 1); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { new Float32List.view(array.asByteArray(),
                                             0, array.lengthInBytes() + 1); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { new Float32List.view(array.asByteArray(),
                                             array.lengthInBytes() - 1, 2); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     var empty = new Float32List.view(array.asByteArray(),
                                      array.lengthInBytes());
     Expect.isTrue(empty is List<double>);
@@ -2083,13 +2083,13 @@
                        -1.0, -1.0, -1.0, -1.0, -1.0],
                       view);
     Expect.throws(() { view[-1] = 0.0; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { return view[-1]; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { view[10]; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { view[10] = 0.0; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { array.add(0.0); },
                   (e) { return e is UnsupportedError; });
     Expect.throws(() { array.addAll([0]); },
@@ -2155,18 +2155,18 @@
       array[i] = 0xBFF0000000000000;
     }
     Expect.throws(() { new Float64List.view(array.asByteArray(), -1); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { new Float64List.view(array.asByteArray(), 0, -1); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { new Float64List.view(array.asByteArray(),
                                             array.lengthInBytes() + 1); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { new Float64List.view(array.asByteArray(),
                                             0, array.lengthInBytes() + 1); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { new Float64List.view(array.asByteArray(),
                                             array.lengthInBytes() - 1, 2); },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     var empty = new Float64List.view(array.asByteArray(),
                                      array.lengthInBytes());
     Expect.isTrue(empty is List<double>);
@@ -2186,13 +2186,13 @@
                        -1.0, -1.0, -1.0, -1.0, -1.0],
                       view);
     Expect.throws(() { view[-1] = 0.0; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { return view[-1]; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { view[10]; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { view[10] = 0.0; },
-                  (e) { return e is IndexOutOfRangeException; });
+                  (e) { return e is RangeError; });
     Expect.throws(() { array.add(0.0); },
                   (e) { return e is UnsupportedError; });
     Expect.throws(() { array.addAll([0]); },
diff --git a/runtime/tests/vm/dart/isolate_mirror_local_test.dart b/runtime/tests/vm/dart/isolate_mirror_local_test.dart
index 185e043..a34c4e2 100644
--- a/runtime/tests/vm/dart/isolate_mirror_local_test.dart
+++ b/runtime/tests/vm/dart/isolate_mirror_local_test.dart
@@ -304,7 +304,7 @@
   Expect.equals('dart:core.List', list_intf.qualifiedName);
   Expect.isFalse(list_intf.isPrivate);
   Expect.equals('Object', list_intf.superclass.simpleName);
-  Expect.equals('ListImplementation', list_intf.defaultFactory.simpleName);
+  Expect.equals('_ListImpl', list_intf.defaultFactory.simpleName);
   Expect.equals('dart:core', list_intf.owner.simpleName);
   Expect.isFalse(list_intf.isClass);
   Expect.equals('Collection', list_intf.superinterfaces[0].simpleName);
diff --git a/runtime/tools/android_finder.py b/runtime/tools/android_finder.py
index 48d5517..93c53fc 100755
--- a/runtime/tools/android_finder.py
+++ b/runtime/tools/android_finder.py
@@ -174,7 +174,9 @@
         continue
       match = line_re.match(line)
       if match is None:
-        raise utils.Error('Match failed')
+        sys.stderr.write('Match fail %s\n' % str(line))
+        continue
+        #raise utils.Error('Match failed')
       entry[match.group(1)] = match.group(2)
     if len(entry) > 0:
       result.append(entry)
diff --git a/runtime/tools/make_version.py b/runtime/tools/make_version.py
index e3d8a70..3066873 100644
--- a/runtime/tools/make_version.py
+++ b/runtime/tools/make_version.py
@@ -20,37 +20,29 @@
 
 def getVersionPart(version_file, part):
   command = ['awk', '$1 == "%s" {print $2}' % (part), version_file]
-  debugLog("Getting version part: %s Running command %s" % (part, command))
   proc = subprocess.Popen(command,
                           stdout=subprocess.PIPE,
                           stderr=subprocess.STDOUT)
   result = proc.communicate()[0].split('\n')[0]
-  debugLog("Got result: %s" % result)
   return result
 
 def getRevision():
-  debugLog("Getting revision")
   is_svn = True
   if os.path.exists('.svn'):
-    debugLog("Using svn to get revision")
     cmd = ['svn', 'info']
   else:
     git_proc = subprocess.Popen(
         ['git', 'branch', '-r'],
         stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
     if 'git-svn' in git_proc.communicate()[0]:
-      debugLog("Using git svn to get revision")
       cmd = ['git', 'svn', 'info']
     else:
       # Cannot get revision because we are not in svn or
       # git svn checkout.
-      debugLog("Could not get revision: not an svn or git-svn checkout?")
       return ''
-  debugLog("Running command to get revision: %s" % cmd)
   proc = subprocess.Popen(cmd,
                           stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
   revision = proc.communicate()[0].split('\n')[4].split(' ')[1]
-  debugLog("Got revision: %s" % revision)
   return revision
 
 def makeVersionString(version_file):
@@ -73,14 +65,11 @@
   return version_string
 
 def makeFile(output_file, input_file, version_file):
-  debugLog("Making version file")
   version_cc_text = open(input_file).read()
   version_string = makeVersionString(version_file)
-  debugLog("Writing version to version_cc file: %s" % version_string)
   version_cc_text = version_cc_text.replace("{{VERSION_STR}}",
                                             version_string)
   version_time = time.ctime(time.time())
-  debugLog("Writing time to version_cc file: %s" % version_time)
   version_cc_text = version_cc_text.replace("{{BUILD_TIME}}",
                                             version_time)
   open(output_file, 'w').write(version_cc_text)
@@ -126,7 +115,5 @@
     return -1
 
 if __name__ == '__main__':
-  debugLog('starting make_version.py')
   exit_code = main(sys.argv)
-  debugLog('exiting make_version.py (exit code: %s)' % exit_code)
   sys.exit(exit_code)
diff --git a/runtime/vm/ast.cc b/runtime/vm/ast.cc
index d63dd7f..9c68a9b 100644
--- a/runtime/vm/ast.cc
+++ b/runtime/vm/ast.cc
@@ -315,6 +315,9 @@
 
 
 AstNode* LoadStaticFieldNode::MakeAssignmentNode(AstNode* rhs) {
+  if (field().is_final()) {
+    return NULL;
+  }
   return new StoreStaticFieldNode(token_pos(), field(), rhs);
 }
 
@@ -325,7 +328,8 @@
 
 
 AstNode* LoadIndexedNode::MakeAssignmentNode(AstNode* rhs) {
-  return new StoreIndexedNode(token_pos(), array(), index_expr(), rhs);
+  return new StoreIndexedNode(token_pos(), array(), index_expr(),
+                              rhs, super_class());
 }
 
 
@@ -361,6 +365,9 @@
     const Field& field =
         Field::ZoneHandle(cls().LookupStaticField(field_name()));
     if (!field.IsNull()) {
+      if (field.is_final()) {
+        return NULL;
+      }
 #if defined(DEBUG)
       const String& getter_name =
           String::Handle(Field::GetterName(field_name()));
diff --git a/runtime/vm/ast.h b/runtime/vm/ast.h
index 83182c0..96ff9af 100644
--- a/runtime/vm/ast.h
+++ b/runtime/vm/ast.h
@@ -458,6 +458,10 @@
 
   const Object& primary() const { return primary_; }
 
+  bool IsSuper() const {
+    return primary().IsString() && (primary().raw() == Symbols::Super());
+  }
+
   virtual void VisitChildren(AstNodeVisitor* visitor) const;
 
   DECLARE_COMMON_NODE_FUNCTIONS(PrimaryNode);
@@ -1114,14 +1118,23 @@
 
 class LoadIndexedNode : public AstNode {
  public:
-  LoadIndexedNode(intptr_t token_pos, AstNode* array, AstNode* index)
-      : AstNode(token_pos), array_(array), index_expr_(index) {
+  LoadIndexedNode(intptr_t token_pos,
+                  AstNode* array,
+                  AstNode* index,
+                  const Class& super_class)
+      : AstNode(token_pos),
+        array_(array),
+        index_expr_(index),
+        super_class_(super_class) {
     ASSERT(array_ != NULL);
     ASSERT(index_expr_ != NULL);
+    ASSERT(super_class_.IsZoneHandle());
   }
 
   AstNode* array() const { return array_; }
   AstNode* index_expr() const { return index_expr_; }
+  const Class& super_class() const { return super_class_; }
+  bool IsSuperLoad() const { return !super_class_.IsNull(); }
 
   virtual void VisitChildren(AstNodeVisitor* visitor) const {
     array()->Visit(visitor);
@@ -1135,6 +1148,7 @@
  private:
   AstNode* array_;
   AstNode* index_expr_;
+  const Class& super_class_;
   DISALLOW_IMPLICIT_CONSTRUCTORS(LoadIndexedNode);
 };
 
@@ -1142,16 +1156,26 @@
 class StoreIndexedNode : public AstNode {
  public:
   StoreIndexedNode(intptr_t token_pos,
-                   AstNode* array, AstNode* index, AstNode* value)
-    : AstNode(token_pos), array_(array), index_expr_(index), value_(value) {
+                   AstNode* array,
+                   AstNode* index,
+                   AstNode* value,
+                   const Class& super_class)
+    : AstNode(token_pos),
+      array_(array),
+      index_expr_(index),
+      value_(value),
+      super_class_(super_class) {
     ASSERT(array_ != NULL);
     ASSERT(index_expr_ != NULL);
     ASSERT(value_ != NULL);
+    ASSERT(super_class_.IsZoneHandle());
   }
 
   AstNode* array() const { return array_; }
   AstNode* index_expr() const { return index_expr_; }
   AstNode* value() const { return value_; }
+  const Class& super_class() const { return super_class_; }
+  bool IsSuperStore() const { return !super_class_.IsNull(); }
 
   virtual void VisitChildren(AstNodeVisitor* visitor) const {
     array()->Visit(visitor);
@@ -1165,6 +1189,7 @@
   AstNode* array_;
   AstNode* index_expr_;
   AstNode* value_;
+  const Class& super_class_;
   DISALLOW_IMPLICIT_CONSTRUCTORS(StoreIndexedNode);
 };
 
diff --git a/runtime/vm/ast_printer.cc b/runtime/vm/ast_printer.cc
index e286325..d4d3c32 100644
--- a/runtime/vm/ast_printer.cc
+++ b/runtime/vm/ast_printer.cc
@@ -326,12 +326,16 @@
 
 
 void AstPrinter::VisitLoadIndexedNode(LoadIndexedNode* node) {
-  VisitGenericAstNode(node);
+  OS::Print("(%s%s ", node->Name(), node->IsSuperLoad() ? " super" : "");
+  node->VisitChildren(this);
+  OS::Print(")");
 }
 
 
 void AstPrinter::VisitStoreIndexedNode(StoreIndexedNode* node) {
-  VisitGenericAstNode(node);
+  OS::Print("(%s%s ", node->Name(), node->IsSuperStore() ? " super" : "");
+  node->VisitChildren(this);
+  OS::Print(")");
 }
 
 
diff --git a/runtime/vm/benchmark_test.cc b/runtime/vm/benchmark_test.cc
index c23c54e..ccc840c 100644
--- a/runtime/vm/benchmark_test.cc
+++ b/runtime/vm/benchmark_test.cc
@@ -173,26 +173,18 @@
 
   // Create a native wrapper class with native fields.
   Dart_Handle result = Dart_CreateNativeWrapperClass(
-      lib,
-      Dart_NewString("NativeFieldsWrapper"),
-      1);
+      lib, NewString("NativeFieldsWrapper"), 1);
   EXPECT_VALID(result);
 
   Dart_Handle args[1];
   args[0] = Dart_NewInteger(kNumIterations);
 
   // Warmup first to avoid compilation jitters.
-  Dart_Invoke(lib,
-              Dart_NewString("benchmark"),
-              1,
-              args);
+  Dart_Invoke(lib, NewString("benchmark"), 1, args);
 
   Timer timer(true, "UseDartApi benchmark");
   timer.Start();
-  Dart_Invoke(lib,
-              Dart_NewString("benchmark"),
-              1,
-              args);
+  Dart_Invoke(lib, NewString("benchmark"), 1, args);
   timer.Stop();
   int64_t elapsed_time = timer.TotalElapsedTime();
   benchmark->set_score(elapsed_time);
@@ -211,17 +203,15 @@
   // Create strings.
   uint8_t data8[] = { 'o', 'n', 'e', 0xFF };
   int external_peer_data = 123;
-  Dart_Handle external_string = Dart_NewExternalString8(data8,
-                                                        ARRAY_SIZE(data8),
-                                                        &external_peer_data,
-                                                        NULL);
-  Dart_Handle internal_string = Dart_NewString("two");
+  Dart_Handle external_string = Dart_NewExternalUTF8String(data8,
+                                                           ARRAY_SIZE(data8),
+                                                           &external_peer_data,
+                                                           NULL);
+  Dart_Handle internal_string = NewString("two");
 
   // Run benchmark.
   for (int64_t i = 0; i < kNumIterations; i++) {
     EXPECT(Dart_IsString(internal_string));
-    EXPECT(Dart_IsString8(internal_string));
-    EXPECT(Dart_IsString16(internal_string));
     EXPECT(!Dart_IsExternalString(internal_string));
     EXPECT_VALID(external_string);
     EXPECT(Dart_IsExternalString(external_string));
@@ -387,8 +377,8 @@
   Dart_Handle lib = TestCase::LoadTestScript(
       kScriptChars,
       reinterpret_cast<Dart_NativeEntryResolver>(StackFrameNativeResolver));
-  Dart_Handle cls = Dart_GetClass(lib, Dart_NewString("StackFrameTest"));
-  Dart_Handle result = Dart_Invoke(cls, Dart_NewString("testMain"), 0, NULL);
+  Dart_Handle cls = Dart_GetClass(lib, NewString("StackFrameTest"));
+  Dart_Handle result = Dart_Invoke(cls, NewString("testMain"), 0, NULL);
   EXPECT_VALID(result);
   int64_t elapsed_time = 0;
   result = Dart_IntegerToInt64(result, &elapsed_time);
diff --git a/runtime/vm/benchmark_test.h b/runtime/vm/benchmark_test.h
index 91043b7..ce7f2d0 100644
--- a/runtime/vm/benchmark_test.h
+++ b/runtime/vm/benchmark_test.h
@@ -35,6 +35,11 @@
   static void Dart_BenchmarkHelper##name(Benchmark* benchmark)
 
 
+inline Dart_Handle NewString(const char* str) {
+  return Dart_NewStringFromCString(str);
+}
+
+
 class Benchmark {
  public:
   typedef void (RunEntry)(Benchmark* benchmark);
diff --git a/runtime/vm/bootstrap.cc b/runtime/vm/bootstrap.cc
index 1e1ddd7..f71cf5a 100644
--- a/runtime/vm/bootstrap.cc
+++ b/runtime/vm/bootstrap.cc
@@ -42,6 +42,13 @@
 }
 
 
+RawScript* Bootstrap::LoadCollectionScript(bool patch) {
+  const char* url = patch ? "dart:collection-patch" : "dart:collection";
+  const char* source = patch ? collection_source_ : collection_source_;
+  return LoadScript(url, source, patch);
+}
+
+
 RawScript* Bootstrap::LoadMathScript(bool patch) {
   const char* url = patch ? "dart:math-patch" : "dart:math";
   const char* source = patch ? math_patch_ : math_source_;
diff --git a/runtime/vm/bootstrap.h b/runtime/vm/bootstrap.h
index 0b7412a..9f7f4e1 100644
--- a/runtime/vm/bootstrap.h
+++ b/runtime/vm/bootstrap.h
@@ -19,6 +19,7 @@
  public:
   static RawScript* LoadCoreScript(bool patch);
   static RawScript* LoadCoreImplScript(bool patch);
+  static RawScript* LoadCollectionScript(bool patch);
   static RawScript* LoadMathScript(bool patch);
   static RawScript* LoadIsolateScript(bool patch);
   static RawScript* LoadMirrorsScript(bool patch);
@@ -33,6 +34,7 @@
   static const char corelib_patch_[];
   static const char corelib_impl_source_[];
   static const char corelib_impl_patch_[];
+  static const char collection_source_[];
   static const char math_source_[];
   static const char math_patch_[];
   static const char isolate_source_[];
diff --git a/runtime/vm/bootstrap_natives.cc b/runtime/vm/bootstrap_natives.cc
index fa368b6..319a0cc 100644
--- a/runtime/vm/bootstrap_natives.cc
+++ b/runtime/vm/bootstrap_natives.cc
@@ -64,6 +64,10 @@
   ASSERT(!library.IsNull());
   library.set_native_entry_resolver(resolver);
 
+  library = Library::CollectionLibrary();
+  ASSERT(!library.IsNull());
+  library.set_native_entry_resolver(resolver);
+
   library = Library::MirrorsLibrary();
   ASSERT(!library.IsNull());
   library.set_native_entry_resolver(resolver);
diff --git a/runtime/vm/bootstrap_nocorelib.cc b/runtime/vm/bootstrap_nocorelib.cc
index dca7e2e..26847f4 100644
--- a/runtime/vm/bootstrap_nocorelib.cc
+++ b/runtime/vm/bootstrap_nocorelib.cc
@@ -27,6 +27,12 @@
 }
 
 
+RawScript* Bootstrap::LoadCollectionScript(bool is_patch) {
+  UNREACHABLE();
+  return Script::null();
+}
+
+
 RawScript* Bootstrap::LoadMathScript(bool is_patch) {
   UNREACHABLE();
   return Script::null();
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index ce87b6b..dec72be 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -127,14 +127,10 @@
   ASSERT(OneByteString::InstanceSize() == cls.instance_size());
   cls = object_store->two_byte_string_class();
   ASSERT(TwoByteString::InstanceSize() == cls.instance_size());
-  cls = object_store->four_byte_string_class();
-  ASSERT(FourByteString::InstanceSize() == cls.instance_size());
   cls = object_store->external_one_byte_string_class();
   ASSERT(ExternalOneByteString::InstanceSize() == cls.instance_size());
   cls = object_store->external_two_byte_string_class();
   ASSERT(ExternalTwoByteString::InstanceSize() == cls.instance_size());
-  cls = object_store->external_four_byte_string_class();
-  ASSERT(ExternalFourByteString::InstanceSize() == cls.instance_size());
   cls = object_store->double_class();
   ASSERT(Double::InstanceSize() == cls.instance_size());
   cls = object_store->bool_class();
@@ -269,10 +265,8 @@
       case kDoubleCid:
       case kOneByteStringCid:
       case kTwoByteStringCid:
-      case kFourByteStringCid:
       case kExternalOneByteStringCid:
       case kExternalTwoByteStringCid:
-      case kExternalFourByteStringCid:
       case kBoolCid:
       case kArrayCid:
       case kImmutableArrayCid:
diff --git a/runtime/vm/code_generator.cc b/runtime/vm/code_generator.cc
index 90a9813..718e9a4 100644
--- a/runtime/vm/code_generator.cc
+++ b/runtime/vm/code_generator.cc
@@ -1190,7 +1190,46 @@
       return;  // Return closure object.
     }
   }
-  Exceptions::ThrowByType(Exceptions::kObjectNotClosure, invoke_arguments);
+  // The result instance is not a closure, try to invoke method "call" before
+  // throwing a NoSuchMethodError.
+
+  // TODO(regis): Factorize the following code.
+
+  // TODO(regis): Args should be passed.
+  const Array& function_args = Array::Handle();
+  const String& function_name = String::Handle(Symbols::Call());
+  GrowableArray<const Object*> dart_arguments(5);
+
+  // TODO(regis): Resolve and invoke "call" method, if existing.
+
+  const Object& null_object = Object::Handle();
+  dart_arguments.Add(&result);
+  dart_arguments.Add(&function_name);
+  dart_arguments.Add(&function_args);
+  dart_arguments.Add(&null_object);
+
+  // Report if a function "call" with different arguments has been found.
+  {
+    Class& instance_class = Class::Handle(result.clazz());
+    Function& function =
+        Function::Handle(instance_class.LookupDynamicFunction(function_name));
+    while (function.IsNull()) {
+      instance_class = instance_class.SuperClass();
+      if (instance_class.IsNull()) break;
+      function = instance_class.LookupDynamicFunction(function_name);
+    }
+    if (!function.IsNull()) {
+      const int total_num_parameters = function.NumParameters();
+      const Array& array = Array::Handle(Array::New(total_num_parameters - 1));
+      // Skip receiver.
+      for (int i = 1; i < total_num_parameters; i++) {
+        array.SetAt(i - 1, String::Handle(function.ParameterNameAt(i)));
+      }
+      dart_arguments.Add(&array);
+    }
+  }
+  Exceptions::ThrowByType(Exceptions::kNoSuchMethod, dart_arguments);
+  UNREACHABLE();
 }
 
 
@@ -1244,7 +1283,7 @@
     named_arg_pos = Smi::New(named_arg_pos.Value() - 1);
     adjusted_arg_descriptor.SetAt(index + 1, named_arg_pos);
   }
-  adjusted_arg_descriptor.SetAt(len - 1, Object::Handle(Object::null()));
+  adjusted_arg_descriptor.SetAt(len - 1, Object::Handle());
   // It is too late to share the descriptor by canonicalizing it. However, it is
   // important that the argument names are canonicalized (i.e. are symbols).
 
@@ -1282,23 +1321,43 @@
   const String& original_function_name = String::Handle(ic_data.target_name());
   ASSERT(!Array::CheckedHandle(arguments.At(2)).IsNull());
   const Array& orig_arguments = Array::CheckedHandle(arguments.At(3));
-  // TODO(regis): The signature of the "noSuchMethod" method has to change from
-  // noSuchMethod(String name, Array arguments) to something like
-  // noSuchMethod(InvocationMirror call).
-  const int kNumArguments = 3;
-  const int kNumNamedArguments = 0;
+  // Allocate an InvocationMirror object.
+  // TODO(regis): Fill in the InvocationMirror object correctly at
+  // this point we do not deal with named arguments and treat them
+  // all as positional.
+  const Library& core_lib = Library::Handle(Library::CoreLibrary());
+  const String& invocation_mirror_name = String::Handle(
+      Symbols::InvocationMirror());
+  Class& invocation_mirror_class = Class::Handle(
+      core_lib.LookupClassAllowPrivate(invocation_mirror_name));
+  ASSERT(!invocation_mirror_class.IsNull());
+  const String& allocation_function_name = String::Handle(
+      Symbols::AllocateInvocationMirror());
+  const Function& allocation_function = Function::ZoneHandle(
+      Resolver::ResolveStaticByName(invocation_mirror_class,
+                                    allocation_function_name,
+                                    Resolver::kIsQualified));
+  ASSERT(!allocation_function.IsNull());
+  GrowableArray<const Object*> allocation_arguments(2);
+  allocation_arguments.Add(&original_function_name);
+  allocation_arguments.Add(&orig_arguments);
   const Array& kNoArgumentNames = Array::Handle();
-  const String& function_name =
-      String::Handle(Symbols::NoSuchMethod());
+  const Object& invocation_mirror = Object::Handle(
+      DartEntry::InvokeStatic(allocation_function,
+                              allocation_arguments,
+                              kNoArgumentNames));
+
+  const int kNumArguments = 2;
+  const int kNumNamedArguments = 0;
+  const String& function_name = String::Handle(Symbols::NoSuchMethod());
   const Function& function = Function::ZoneHandle(
       Resolver::ResolveDynamic(receiver,
                                function_name,
                                kNumArguments,
                                kNumNamedArguments));
   ASSERT(!function.IsNull());
-  GrowableArray<const Object*> invoke_arguments(2);
-  invoke_arguments.Add(&original_function_name);
-  invoke_arguments.Add(&orig_arguments);
+  GrowableArray<const Object*> invoke_arguments(1);
+  invoke_arguments.Add(&invocation_mirror);
   const Object& result = Object::Handle(
       DartEntry::InvokeDynamic(receiver,
                                function,
@@ -1309,27 +1368,73 @@
 }
 
 
-// Report that an object is not a closure.
+// A non-closure object was invoked as a closure, so call the "call" method
+// on it.
 // Arg0: non-closure object.
 // Arg1: arguments array.
+// TODO(regis): Rename this entry?
 DEFINE_RUNTIME_ENTRY(ReportObjectNotClosure, 2) {
   ASSERT(arguments.Count() ==
          kReportObjectNotClosureRuntimeEntry.argument_count());
-  const Instance& bad_closure = Instance::CheckedHandle(arguments.At(0));
-  if (bad_closure.IsNull()) {
-    GrowableArray<const Object*> args;
-    Exceptions::ThrowByType(Exceptions::kObjectNotClosure, args);
+  const Instance& instance = Instance::CheckedHandle(arguments.At(0));
+  const Array& function_args = Array::CheckedHandle(arguments.At(1));
+  const String& function_name = String::Handle(Symbols::Call());
+  GrowableArray<const Object*> dart_arguments(5);
+  if (instance.IsNull()) {
+    dart_arguments.Add(&function_name);
+    dart_arguments.Add(&function_args);
+    Exceptions::ThrowByType(Exceptions::kNullPointer, dart_arguments);
+    UNREACHABLE();
   }
-  GrowableArray<const Object*> args;
-  Exceptions::ThrowByType(Exceptions::kObjectNotClosure, args);
+
+  // TODO(regis): Resolve and invoke "call" method, if existing.
+
+  const Object& null_object = Object::Handle();
+  dart_arguments.Add(&instance);
+  dart_arguments.Add(&function_name);
+  dart_arguments.Add(&function_args);
+  dart_arguments.Add(&null_object);
+
+  // Report if a function "call" with different arguments has been found.
+  Class& instance_class = Class::Handle(instance.clazz());
+  Function& function =
+      Function::Handle(instance_class.LookupDynamicFunction(function_name));
+  while (function.IsNull()) {
+    instance_class = instance_class.SuperClass();
+    if (instance_class.IsNull()) break;
+    function = instance_class.LookupDynamicFunction(function_name);
+  }
+  if (!function.IsNull()) {
+    const int total_num_parameters = function.NumParameters();
+    const Array& array = Array::Handle(Array::New(total_num_parameters - 1));
+    // Skip receiver.
+    for (int i = 1; i < total_num_parameters; i++) {
+      array.SetAt(i - 1, String::Handle(function.ParameterNameAt(i)));
+    }
+    dart_arguments.Add(&array);
+  }
+  Exceptions::ThrowByType(Exceptions::kNoSuchMethod, dart_arguments);
+  UNREACHABLE();
 }
 
 
+// A closure object was invoked with incompatible arguments.
+// TODO(regis): Deprecated. This case should be handled by a noSuchMethod call.
 DEFINE_RUNTIME_ENTRY(ClosureArgumentMismatch, 0) {
   ASSERT(arguments.Count() ==
          kClosureArgumentMismatchRuntimeEntry.argument_count());
-  GrowableArray<const Object*> args;
-  Exceptions::ThrowByType(Exceptions::kClosureArgumentMismatch, args);
+  const Instance& instance = Instance::Handle();  // Incorrect. OK for now.
+  const Array& function_args = Array::Handle();  // Incorrect. OK for now.
+  const String& function_name = String::Handle(Symbols::Call());
+  GrowableArray<const Object*> dart_arguments(5);
+
+  const Object& null_object = Object::Handle();
+  dart_arguments.Add(&instance);
+  dart_arguments.Add(&function_name);
+  dart_arguments.Add(&function_args);
+  dart_arguments.Add(&null_object);
+  Exceptions::ThrowByType(Exceptions::kNoSuchMethod, dart_arguments);
+  UNREACHABLE();
 }
 
 
@@ -1664,7 +1769,7 @@
   const intptr_t num_args =
       function.HasOptionalParameters() ? 0 : function.num_fixed_parameters();
   intptr_t unoptimized_stack_size =
-      + deopt_info.Length() - num_args
+      + deopt_info.TranslationLength() - num_args
       - 2;  // Subtract caller FP and PC.
   return unoptimized_stack_size * kWordSize;
 }
@@ -1675,12 +1780,11 @@
 static intptr_t DeoptimizeWithDeoptInfo(const Code& code,
                                         const DeoptInfo& deopt_info,
                                         const StackFrame& caller_frame) {
-  const intptr_t len = deopt_info.Length();
+  const intptr_t len = deopt_info.TranslationLength();
   GrowableArray<DeoptInstr*> deopt_instructions(len);
-  for (intptr_t i = 0; i < len; i++) {
-    deopt_instructions.Add(DeoptInstr::Create(deopt_info.Instruction(i),
-                                              deopt_info.FromIndex(i)));
-  }
+  const Array& deopt_table = Array::Handle(code.deopt_info_array());
+  ASSERT(!deopt_table.IsNull());
+  deopt_info.ToInstructions(deopt_table, &deopt_instructions);
 
   intptr_t* start = reinterpret_cast<intptr_t*>(caller_frame.sp() - kWordSize);
   const Function& function = Function::Handle(code.function());
diff --git a/runtime/vm/compiler.cc b/runtime/vm/compiler.cc
index 13cbfc0..7007b6a 100644
--- a/runtime/vm/compiler.cc
+++ b/runtime/vm/compiler.cc
@@ -353,7 +353,8 @@
     Smi& reason = Smi::Handle();
     for (intptr_t i = 0; i < deopt_table_length; ++i) {
       DeoptTable::GetEntry(deopt_table, i, &offset, &info, &reason);
-      OS::Print("0x%"Px"  %s  (%s)\n",
+      OS::Print("%4"Pd": 0x%"Px"  %s  (%s)\n",
+                i,
                 start + offset.Value(),
                 info.ToCString(),
                 DeoptReasonToText(reason.Value()));
diff --git a/runtime/vm/custom_isolate_test.cc b/runtime/vm/custom_isolate_test.cc
index d767b30..2090a7d 100644
--- a/runtime/vm/custom_isolate_test.cc
+++ b/runtime/vm/custom_isolate_test.cc
@@ -179,10 +179,10 @@
 
   Dart_Handle recv_port = Dart_GetReceivePort(Dart_GetMainPortId());
   EXPECT_VALID(recv_port);
-  result = Dart_SetField(lib, Dart_NewString("mainPort"), recv_port);
+  result = Dart_SetField(lib, NewString("mainPort"), recv_port);
   EXPECT_VALID(result);
 
-  result = Dart_Invoke(lib, Dart_NewString(main_), 0, NULL);
+  result = Dart_Invoke(lib, NewString(main_), 0, NULL);
   EXPECT_VALID(result);
   free(const_cast<char*>(main_));
   main_ = NULL;
@@ -317,7 +317,7 @@
   EXPECT_VALID(lib);
 
   // Run main.
-  result = Dart_Invoke(lib, Dart_NewString("main"), 0, NULL);
+  result = Dart_Invoke(lib, NewString("main"), 0, NULL);
   EXPECT_VALID(result);
   EXPECT(Dart_IsString(result));
   const char* result_str = NULL;
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index f1acf1c..7194b57 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -273,13 +273,6 @@
       *peer = data->peer();
       return true;
     }
-    case kExternalFourByteStringCid: {
-      RawExternalFourByteString* raw_string =
-          reinterpret_cast<RawExternalFourByteString*>(raw_obj)->ptr();
-      ExternalStringData<uint32_t>* data = raw_string->external_data_;
-      *peer = data->peer();
-      return true;
-    }
   }
   return false;
 }
@@ -1522,16 +1515,11 @@
 }
 
 
-DART_EXPORT bool Dart_IsString8(Dart_Handle object) {
+DART_EXPORT bool Dart_IsAsciiString(Dart_Handle object) {
   return RawObject::IsOneByteStringClassId(Api::ClassId(object));
 }
 
 
-DART_EXPORT bool Dart_IsString16(Dart_Handle object) {
-  return RawObject::IsTwoByteStringClassId(Api::ClassId(object));
-}
-
-
 DART_EXPORT Dart_Handle Dart_StringLength(Dart_Handle str, intptr_t* len) {
   Isolate* isolate = Isolate::Current();
   DARTSCOPE(isolate);
@@ -1544,53 +1532,53 @@
 }
 
 
-DART_EXPORT Dart_Handle Dart_NewString(const char* str) {
+DART_EXPORT Dart_Handle Dart_NewStringFromCString(const char* str) {
   Isolate* isolate = Isolate::Current();
   DARTSCOPE(isolate);
   if (str == NULL) {
     RETURN_NULL_ERROR(str);
   }
-  if (!Utf8::IsValid(str)) {
-    return Api::NewError("%s expects argument 'str' to be valid UTF-8.",
-                         CURRENT_FUNC);
-  }
   return Api::NewHandle(isolate, String::New(str));
 }
 
 
-DART_EXPORT Dart_Handle Dart_NewString8(const uint8_t* codepoints,
-                                        intptr_t length) {
+DART_EXPORT Dart_Handle Dart_NewStringFromUTF8(const uint8_t* utf8_array,
+                                               intptr_t length) {
   Isolate* isolate = Isolate::Current();
   DARTSCOPE(isolate);
-  if (codepoints == NULL && length != 0) {
-    RETURN_NULL_ERROR(codepoints);
+  if (utf8_array == NULL && length != 0) {
+    RETURN_NULL_ERROR(utf8_array);
   }
   CHECK_LENGTH(length, String::kMaxElements);
-  return Api::NewHandle(isolate, String::New(codepoints, length));
+  if (!Utf8::IsValid(utf8_array, length)) {
+    return Api::NewError("%s expects argument 'str' to be valid UTF-8.",
+                         CURRENT_FUNC);
+  }
+  return Api::NewHandle(isolate, String::New(utf8_array, length));
 }
 
 
-DART_EXPORT Dart_Handle Dart_NewString16(const uint16_t* codepoints,
-                                         intptr_t length) {
+DART_EXPORT Dart_Handle Dart_NewStringFromUTF16(const uint16_t* utf16_array,
+                                                intptr_t length) {
   Isolate* isolate = Isolate::Current();
   DARTSCOPE(isolate);
-  if (codepoints == NULL && length != 0) {
-    RETURN_NULL_ERROR(codepoints);
+  if (utf16_array == NULL && length != 0) {
+    RETURN_NULL_ERROR(utf16_array);
   }
   CHECK_LENGTH(length, String::kMaxElements);
-  return Api::NewHandle(isolate, String::New(codepoints, length));
+  return Api::NewHandle(isolate, String::New(utf16_array, length));
 }
 
 
-DART_EXPORT Dart_Handle Dart_NewString32(const uint32_t* codepoints,
-                                         intptr_t length) {
+DART_EXPORT Dart_Handle Dart_NewStringFromUTF32(const uint32_t* utf32_array,
+                                                intptr_t length) {
   Isolate* isolate = Isolate::Current();
   DARTSCOPE(isolate);
-  if (codepoints == NULL && length != 0) {
-    RETURN_NULL_ERROR(codepoints);
+  if (utf32_array == NULL && length != 0) {
+    RETURN_NULL_ERROR(utf32_array);
   }
   CHECK_LENGTH(length, String::kMaxElements);
-  return Api::NewHandle(isolate, String::New(codepoints, length));
+  return Api::NewHandle(isolate, String::New(utf32_array, length));
 }
 
 
@@ -1610,8 +1598,6 @@
   }
 
   // It's not an external string, return appropriate error.
-  // Note: this is invoked outside of the NoGCScope'd block above, since
-  // error messages allocate new handles.
   if (!RawObject::IsStringClassId(Api::ClassId(object))) {
     RETURN_TYPE_ERROR(Isolate::Current(), object, String);
   } else {
@@ -1623,113 +1609,38 @@
 }
 
 
-DART_EXPORT Dart_Handle Dart_NewExternalString8(const uint8_t* codepoints,
-                                                intptr_t length,
-                                                void* peer,
-                                                Dart_PeerFinalizer callback) {
+DART_EXPORT Dart_Handle Dart_NewExternalUTF8String(const uint8_t* utf8_array,
+                                                   intptr_t length,
+                                                   void* peer,
+                                                   Dart_PeerFinalizer cback) {
   Isolate* isolate = Isolate::Current();
   DARTSCOPE(isolate);
-  if (codepoints == NULL && length != 0) {
-    RETURN_NULL_ERROR(codepoints);
+  if (utf8_array == NULL && length != 0) {
+    RETURN_NULL_ERROR(utf8_array);
   }
   CHECK_LENGTH(length, String::kMaxElements);
-  return Api::NewHandle(
-      isolate, String::NewExternal(codepoints, length, peer, callback));
+  return Api::NewHandle(isolate,
+                        String::NewExternal(utf8_array, length, peer, cback));
 }
 
 
-DART_EXPORT Dart_Handle Dart_NewExternalString16(const uint16_t* codepoints,
-                                                 intptr_t length,
-                                                 void* peer,
-                                                 Dart_PeerFinalizer callback) {
+DART_EXPORT Dart_Handle Dart_NewExternalUTF16String(const uint16_t* utf16_array,
+                                                    intptr_t length,
+                                                    void* peer,
+                                                    Dart_PeerFinalizer cback) {
   Isolate* isolate = Isolate::Current();
   DARTSCOPE(isolate);
-  if (codepoints == NULL && length != 0) {
-    RETURN_NULL_ERROR(codepoints);
+  if (utf16_array == NULL && length != 0) {
+    RETURN_NULL_ERROR(utf16_array);
   }
   CHECK_LENGTH(length, String::kMaxElements);
-  return Api::NewHandle(
-      isolate, String::NewExternal(codepoints, length, peer, callback));
-}
-
-
-DART_EXPORT Dart_Handle Dart_NewExternalString32(const uint32_t* codepoints,
-                                                 intptr_t length,
-                                                 void* peer,
-                                                 Dart_PeerFinalizer callback) {
-  Isolate* isolate = Isolate::Current();
-  DARTSCOPE(isolate);
-  if (codepoints == NULL && length != 0) {
-    RETURN_NULL_ERROR(codepoints);
-  }
-  CHECK_LENGTH(length, String::kMaxElements);
-  return Api::NewHandle(
-      isolate, String::NewExternal(codepoints, length, peer, callback));
-}
-
-
-DART_EXPORT Dart_Handle Dart_StringGet8(Dart_Handle str,
-                                        uint8_t* codepoints,
-                                        intptr_t* length) {
-  Isolate* isolate = Isolate::Current();
-  DARTSCOPE(isolate);
-  const OneByteString& str_obj = Api::UnwrapOneByteStringHandle(isolate, str);
-  if (str_obj.IsNull()) {
-    RETURN_TYPE_ERROR(isolate, str, String8);
-  }
-  intptr_t str_len = str_obj.Length();
-  intptr_t copy_len = (str_len > *length) ? *length : str_len;
-  for (intptr_t i = 0; i < copy_len; i++) {
-    codepoints[i] = static_cast<uint8_t>(str_obj.CharAt(i));
-  }
-  *length= copy_len;
-  return Api::Success(isolate);
-}
-
-
-DART_EXPORT Dart_Handle Dart_StringGet16(Dart_Handle str,
-                                         uint16_t* codepoints,
-                                         intptr_t* length) {
-  Isolate* isolate = Isolate::Current();
-  DARTSCOPE(isolate);
-  const String& str_obj = Api::UnwrapStringHandle(isolate, str);
-  if (str_obj.IsNull()) {
-    RETURN_TYPE_ERROR(isolate, str, String);
-  }
-  if (str_obj.CharSize() > String::kTwoByteChar) {
-    return Api::NewError("Object is not a String16 or String8");
-  }
-  intptr_t str_len = str_obj.Length();
-  intptr_t copy_len = (str_len > *length) ? *length : str_len;
-  for (intptr_t i = 0; i < copy_len; i++) {
-    codepoints[i] = static_cast<uint16_t>(str_obj.CharAt(i));
-  }
-  *length = copy_len;
-  return Api::Success(isolate);
-}
-
-
-DART_EXPORT Dart_Handle Dart_StringGet32(Dart_Handle str,
-                                         uint32_t* codepoints,
-                                         intptr_t* length) {
-  Isolate* isolate = Isolate::Current();
-  DARTSCOPE(isolate);
-  const String& str_obj = Api::UnwrapStringHandle(isolate, str);
-  if (str_obj.IsNull()) {
-    RETURN_TYPE_ERROR(isolate, str, String);
-  }
-  intptr_t str_len = str_obj.Length();
-  intptr_t copy_len = (str_len > *length) ? *length : str_len;
-  for (intptr_t i = 0; i < copy_len; i++) {
-    codepoints[i] = static_cast<uint32_t>(str_obj.CharAt(i));
-  }
-  *length = copy_len;
-  return Api::Success(isolate);
+  return Api::NewHandle(isolate,
+                        String::NewExternal(utf16_array, length, peer, cback));
 }
 
 
 DART_EXPORT Dart_Handle Dart_StringToCString(Dart_Handle object,
-                                             const char** result) {
+                                             const char** cstr) {
   Isolate* isolate = Isolate::Current();
   DARTSCOPE(isolate);
   const String& str_obj = Api::UnwrapStringHandle(isolate, object);
@@ -1744,34 +1655,45 @@
   const char* string_value = str_obj.ToCString();
   memmove(res, string_value, string_length + 1);
   ASSERT(res[string_length] == '\0');
-  *result = res;
+  *cstr = res;
   return Api::Success(isolate);
 }
 
 
-DART_EXPORT Dart_Handle Dart_StringToBytes(Dart_Handle object,
-                                           const uint8_t** bytes,
-                                           intptr_t *length) {
+DART_EXPORT Dart_Handle Dart_StringToUTF8(Dart_Handle str,
+                                          uint8_t* utf8_array,
+                                          intptr_t* length) {
   Isolate* isolate = Isolate::Current();
   DARTSCOPE(isolate);
-  const String& str = Api::UnwrapStringHandle(isolate, object);
-  if (str.IsNull()) {
-    RETURN_TYPE_ERROR(isolate, object, String);
+  const String& str_obj = Api::UnwrapStringHandle(isolate, str);
+  if (str_obj.IsNull()) {
+    RETURN_TYPE_ERROR(isolate, str, String);
   }
-  if (bytes == NULL) {
-    RETURN_NULL_ERROR(bytes);
+  intptr_t str_len = str_obj.Length();
+  if (str_len > *length) {
+    return Api::NewError("Input array is not large enough to hold the result");
   }
-  if (length == NULL) {
-    RETURN_NULL_ERROR(length);
+  str_obj.ToUTF8(utf8_array, str_len);
+  *length= str_len;
+  return Api::Success(isolate);
+}
+
+
+DART_EXPORT Dart_Handle Dart_StringToUTF16(Dart_Handle str,
+                                           uint16_t* utf16_array,
+                                           intptr_t* length) {
+  Isolate* isolate = Isolate::Current();
+  DARTSCOPE(isolate);
+  const String& str_obj = Api::UnwrapStringHandle(isolate, str);
+  if (str_obj.IsNull()) {
+    RETURN_TYPE_ERROR(isolate, str, String);
   }
-  const char* cstring = str.ToCString();
-  *length = Utf8::Length(str);
-  uint8_t* result = Api::TopScope(isolate)->zone()->Alloc<uint8_t>(*length);
-  if (result == NULL) {
-    return Api::NewError("Unable to allocate memory");
+  intptr_t str_len = str_obj.Length();
+  intptr_t copy_len = (str_len > *length) ? *length : str_len;
+  for (intptr_t i = 0; i < copy_len; i++) {
+    utf16_array[i] = static_cast<uint16_t>(str_obj.CharAt(i));
   }
-  memmove(result, cstring, *length);
-  *bytes = result;
+  *length = copy_len;
   return Api::Success(isolate);
 }
 
@@ -2171,6 +2093,11 @@
 }
 
 
+DART_EXPORT bool Dart_IsByteArrayExternal(Dart_Handle object) {
+  return RawObject::IsExternalByteArrayClassId(Api::ClassId(object));
+}
+
+
 DART_EXPORT Dart_Handle Dart_NewByteArray(intptr_t length) {
   Isolate* isolate = Isolate::Current();
   DARTSCOPE(isolate);
@@ -2194,6 +2121,23 @@
 }
 
 
+DART_EXPORT Dart_Handle Dart_ExternalByteArrayGetData(Dart_Handle object,
+                                                      void** data) {
+  Isolate* isolate = Isolate::Current();
+  DARTSCOPE(isolate);
+  const ExternalUint8Array& array =
+      Api::UnwrapExternalUint8ArrayHandle(isolate, object);
+  if (array.IsNull()) {
+    RETURN_TYPE_ERROR(isolate, object, ExternalUint8Array);
+  }
+  if (data == NULL) {
+    RETURN_NULL_ERROR(data);
+  }
+  *data = array.GetData();
+  return Api::Success(isolate);
+}
+
+
 DART_EXPORT Dart_Handle Dart_ExternalByteArrayGetPeer(Dart_Handle object,
                                                       void** peer) {
   Isolate* isolate = Isolate::Current();
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index fe8c400..8ab263a 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -31,7 +31,7 @@
   Dart_Handle instance = Dart_True();
   Dart_Handle error = Api::NewError("myerror");
   Dart_Handle exception = Dart_Invoke(lib,
-                                      Dart_NewString("testMain"),
+                                      NewString("testMain"),
                                       0,
                                       NULL);
 
@@ -66,10 +66,10 @@
   const String& compile_message = String::Handle(String::New("CompileError"));
   const String& fatal_message = String::Handle(String::New("FatalError"));
 
-  Dart_Handle not_error = Dart_NewString("NotError");
+  Dart_Handle not_error = NewString("NotError");
   Dart_Handle api_error = Dart_NewApiError("Api%s", "Error");
   Dart_Handle exception_error =
-      Dart_NewUnhandledExceptionError(Dart_NewString("ExceptionError"));
+      Dart_NewUnhandledExceptionError(NewString("ExceptionError"));
   Dart_Handle compile_error =
       Api::NewHandle(isolate, LanguageError::New(compile_message));
   Dart_Handle fatal_error =
@@ -155,12 +155,12 @@
       kScriptChars, &PropagateError_native_lookup);
   Dart_Handle result;
 
-  result = Dart_Invoke(lib, Dart_NewString("Func1"), 0, NULL);
+  result = Dart_Invoke(lib, NewString("Func1"), 0, NULL);
   EXPECT(Dart_IsError(result));
   EXPECT(!Dart_ErrorHasException(result));
   EXPECT_SUBSTRING("semicolon expected", Dart_GetError(result));
 
-  result = Dart_Invoke(lib, Dart_NewString("Func2"), 0, NULL);
+  result = Dart_Invoke(lib, NewString("Func2"), 0, NULL);
   EXPECT(Dart_IsError(result));
   EXPECT(Dart_ErrorHasException(result));
   EXPECT_SUBSTRING("myException", Dart_GetError(result));
@@ -181,16 +181,16 @@
   EXPECT_VALID(null);
   EXPECT(Dart_IsNull(null));
 
-  Dart_Handle str = Dart_NewString("test");
+  Dart_Handle str = NewString("test");
   EXPECT_VALID(str);
   EXPECT(!Dart_IsNull(str));
 }
 
 
 TEST_CASE(IdentityEquals) {
-  Dart_Handle five = Dart_NewString("5");
-  Dart_Handle five_again = Dart_NewString("5");
-  Dart_Handle seven = Dart_NewString("7");
+  Dart_Handle five = NewString("5");
+  Dart_Handle five_again = NewString("5");
+  Dart_Handle seven = NewString("7");
 
   // Same objects.
   EXPECT(Dart_IdentityEquals(five, five));
@@ -220,9 +220,9 @@
 
 TEST_CASE(ObjectEquals) {
   bool equal = false;
-  Dart_Handle five = Dart_NewString("5");
-  Dart_Handle five_again = Dart_NewString("5");
-  Dart_Handle seven = Dart_NewString("7");
+  Dart_Handle five = NewString("5");
+  Dart_Handle five_again = NewString("5");
+  Dart_Handle seven = NewString("7");
 
   // Same objects.
   EXPECT_VALID(Dart_ObjectEquals(five, five, &equal));
@@ -241,7 +241,7 @@
 
 
 TEST_CASE(InstanceValues) {
-  EXPECT(Dart_IsInstance(Dart_NewString("test")));
+  EXPECT(Dart_IsInstance(NewString("test")));
   EXPECT(Dart_IsInstance(Dart_True()));
 
   // By convention, our Is*() functions exclude null.
@@ -276,7 +276,7 @@
 
 
 TEST_CASE(BooleanValues) {
-  Dart_Handle str = Dart_NewString("test");
+  Dart_Handle str = NewString("test");
   EXPECT(!Dart_IsBoolean(str));
 
   bool value = false;
@@ -351,22 +351,22 @@
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
 
   // Check int case.
-  result = Dart_Invoke(lib, Dart_NewString("getInt"), 0, NULL);
+  result = Dart_Invoke(lib, NewString("getInt"), 0, NULL);
   EXPECT_VALID(result);
   EXPECT(Dart_IsNumber(result));
 
   // Check double case.
-  result = Dart_Invoke(lib, Dart_NewString("getDouble"), 0, NULL);
+  result = Dart_Invoke(lib, NewString("getDouble"), 0, NULL);
   EXPECT_VALID(result);
   EXPECT(Dart_IsNumber(result));
 
   // Check bool case.
-  result = Dart_Invoke(lib, Dart_NewString("getBool"), 0, NULL);
+  result = Dart_Invoke(lib, NewString("getBool"), 0, NULL);
   EXPECT_VALID(result);
   EXPECT(!Dart_IsNumber(result));
 
   // Check null case.
-  result = Dart_Invoke(lib, Dart_NewString("getNull"), 0, NULL);
+  result = Dart_Invoke(lib, NewString("getNull"), 0, NULL);
   EXPECT_VALID(result);
   EXPECT(!Dart_IsNumber(result));
 }
@@ -478,7 +478,7 @@
 
 TEST_CASE(ArrayValues) {
   const int kArrayLength = 10;
-  Dart_Handle str = Dart_NewString("test");
+  Dart_Handle str = NewString("test");
   EXPECT(!Dart_IsList(str));
   Dart_Handle val = Dart_NewList(kArrayLength);
   EXPECT(Dart_IsList(val));
@@ -513,76 +513,61 @@
 
 
 TEST_CASE(IsString) {
-  uint8_t data8[] = { 'o', 'n', 'e', 0xFF };
+  uint8_t data8[] = { 'o', 'n', 'e', 0x7F };
 
-  Dart_Handle str8 = Dart_NewString8(data8, ARRAY_SIZE(data8));
+  Dart_Handle str8 = Dart_NewStringFromUTF8(data8, ARRAY_SIZE(data8));
   EXPECT_VALID(str8);
   EXPECT(Dart_IsString(str8));
-  EXPECT(Dart_IsString8(str8));
-  EXPECT(Dart_IsString16(str8));
+  EXPECT(Dart_IsAsciiString(str8));
   EXPECT(!Dart_IsExternalString(str8));
 
-  Dart_Handle ext8 = Dart_NewExternalString8(data8, ARRAY_SIZE(data8),
-                                             NULL, NULL);
+  Dart_Handle ext8 = Dart_NewExternalUTF8String(data8, ARRAY_SIZE(data8),
+                                                NULL, NULL);
   EXPECT_VALID(ext8);
   EXPECT(Dart_IsString(ext8));
-  EXPECT(Dart_IsString8(ext8));
-  EXPECT(Dart_IsString16(ext8));
   EXPECT(Dart_IsExternalString(ext8));
 
   uint16_t data16[] = { 't', 'w', 'o', 0xFFFF };
 
-  Dart_Handle str16 = Dart_NewString16(data16, ARRAY_SIZE(data16));
+  Dart_Handle str16 = Dart_NewStringFromUTF16(data16, ARRAY_SIZE(data16));
   EXPECT_VALID(str16);
   EXPECT(Dart_IsString(str16));
-  EXPECT(!Dart_IsString8(str16));
-  EXPECT(Dart_IsString16(str16));
+  EXPECT(!Dart_IsAsciiString(str16));
   EXPECT(!Dart_IsExternalString(str16));
 
-  Dart_Handle ext16 = Dart_NewExternalString16(data16, ARRAY_SIZE(data16),
-                                               NULL, NULL);
+  Dart_Handle ext16 = Dart_NewExternalUTF16String(data16, ARRAY_SIZE(data16),
+                                                  NULL, NULL);
   EXPECT_VALID(ext16);
   EXPECT(Dart_IsString(ext16));
-  EXPECT(!Dart_IsString8(ext16));
-  EXPECT(Dart_IsString16(ext16));
   EXPECT(Dart_IsExternalString(ext16));
 
   uint32_t data32[] = { 'f', 'o', 'u', 'r', 0x10FFFF };
 
-  Dart_Handle str32 = Dart_NewString32(data32, ARRAY_SIZE(data32));
+  Dart_Handle str32 = Dart_NewStringFromUTF32(data32, ARRAY_SIZE(data32));
   EXPECT_VALID(str32);
   EXPECT(Dart_IsString(str32));
-  EXPECT(!Dart_IsString8(str32));
-  EXPECT(!Dart_IsString16(str32));
   EXPECT(!Dart_IsExternalString(str32));
-
-  Dart_Handle ext32 = Dart_NewExternalString32(data32, ARRAY_SIZE(data32),
-                                               NULL, NULL);
-  EXPECT_VALID(ext32);
-  EXPECT(Dart_IsString(ext32));
-  EXPECT(!Dart_IsString8(ext32));
-  EXPECT(!Dart_IsString16(ext32));
-  EXPECT(Dart_IsExternalString(ext32));
 }
 
 
 TEST_CASE(NewString) {
   const char* ascii = "string";
-  Dart_Handle ascii_str = Dart_NewString(ascii);
+  Dart_Handle ascii_str = NewString(ascii);
   EXPECT_VALID(ascii_str);
   EXPECT(Dart_IsString(ascii_str));
 
   const char* null = NULL;
-  Dart_Handle null_str = Dart_NewString(null);
+  Dart_Handle null_str = NewString(null);
   EXPECT(Dart_IsError(null_str));
 
-  const char* utf8 = "\xE4\xBA\x8C";  // U+4E8C
-  Dart_Handle utf8_str = Dart_NewString(utf8);
+  uint8_t data[] = { 0xE4, 0xBA, 0x8c };  // U+4E8C.
+  Dart_Handle utf8_str = Dart_NewStringFromUTF8(data, ARRAY_SIZE(data));
   EXPECT_VALID(utf8_str);
   EXPECT(Dart_IsString(utf8_str));
 
-  const char* invalid = "\xE4\xBA";  // underflow
-  Dart_Handle invalid_str = Dart_NewString(invalid);
+  uint8_t invalid[] = { 0xE4, 0xBA };  // underflow.
+  Dart_Handle invalid_str = Dart_NewStringFromUTF8(invalid,
+                                                   ARRAY_SIZE(invalid));
   EXPECT(Dart_IsError(invalid_str));
 }
 
@@ -590,13 +575,13 @@
 TEST_CASE(ExternalStringGetPeer) {
   Dart_Handle result;
 
-  uint8_t data8[] = { 'o', 'n', 'e', 0xFF };
+  uint8_t data8[] = { 'o', 'n', 'e', 0x7F };
   int peer_data = 123;
   void* peer = NULL;
 
   // Success.
-  Dart_Handle ext8 = Dart_NewExternalString8(data8, ARRAY_SIZE(data8),
-                                             &peer_data, NULL);
+  Dart_Handle ext8 = Dart_NewExternalUTF8String(data8, ARRAY_SIZE(data8),
+                                                &peer_data, NULL);
   EXPECT_VALID(ext8);
 
   result = Dart_ExternalStringGetPeer(ext8, &peer);
@@ -611,7 +596,7 @@
 
   // String is not external.
   peer = NULL;
-  Dart_Handle str8 = Dart_NewString8(data8, ARRAY_SIZE(data8));
+  Dart_Handle str8 = Dart_NewStringFromUTF8(data8, ARRAY_SIZE(data8));
   EXPECT_VALID(str8);
   result = Dart_ExternalStringGetPeer(str8, &peer);
   EXPECT(Dart_IsError(result));
@@ -640,13 +625,12 @@
 TEST_CASE(ExternalStringCallback) {
   int peer8 = 40;
   int peer16 = 41;
-  int peer32 = 42;
 
   {
     Dart_EnterScope();
 
     uint8_t data8[] = { 'h', 'e', 'l', 'l', 'o' };
-    Dart_Handle obj8 = Dart_NewExternalString8(
+    Dart_Handle obj8 = Dart_NewExternalUTF8String(
         data8,
         ARRAY_SIZE(data8),
         &peer8,
@@ -657,7 +641,7 @@
     EXPECT_EQ(api_peer8, &peer8);
 
     uint16_t data16[] = { 'h', 'e', 'l', 'l', 'o' };
-    Dart_Handle obj16 = Dart_NewExternalString16(
+    Dart_Handle obj16 = Dart_NewExternalUTF16String(
         data16,
         ARRAY_SIZE(data16),
         &peer16,
@@ -667,31 +651,17 @@
     EXPECT_VALID(Dart_ExternalStringGetPeer(obj16, &api_peer16));
     EXPECT_EQ(api_peer16, &peer16);
 
-    uint32_t data32[] = { 'h', 'e', 'l', 'l', 'o' };
-    Dart_Handle obj32 = Dart_NewExternalString32(
-        data32,
-        ARRAY_SIZE(data32),
-        &peer32,
-        ExternalStringCallbackFinalizer);
-    EXPECT_VALID(obj32);
-    void* api_peer32 = NULL;
-    EXPECT_VALID(Dart_ExternalStringGetPeer(obj32, &api_peer32));
-    EXPECT_EQ(api_peer32, &peer32);
-
     Dart_ExitScope();
   }
 
   EXPECT_EQ(40, peer8);
   EXPECT_EQ(41, peer16);
-  EXPECT_EQ(42, peer32);
   Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
   EXPECT_EQ(40, peer8);
   EXPECT_EQ(41, peer16);
-  EXPECT_EQ(42, peer32);
   Isolate::Current()->heap()->CollectGarbage(Heap::kNew);
   EXPECT_EQ(80, peer8);
   EXPECT_EQ(82, peer16);
-  EXPECT_EQ(84, peer32);
 }
 
 
@@ -710,7 +680,7 @@
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
 
   // Invoke a function which returns an object of type List.
-  result = Dart_Invoke(lib, Dart_NewString("testMain"), 0, NULL);
+  result = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
   EXPECT_VALID(result);
 
   // First ensure that the returned object is an array.
@@ -810,6 +780,7 @@
   Dart_Handle byte_array1 = Dart_NewByteArray(10);
   EXPECT_VALID(byte_array1);
   EXPECT(Dart_IsByteArray(byte_array1));
+  EXPECT(!Dart_IsByteArrayExternal(byte_array1));
   EXPECT(Dart_IsList(byte_array1));
 
   intptr_t length = 0;
@@ -1103,8 +1074,13 @@
   Dart_Handle obj = Dart_NewExternalByteArray(data, data_length, NULL, NULL);
   EXPECT_VALID(obj);
   EXPECT(Dart_IsByteArray(obj));
+  EXPECT(Dart_IsByteArrayExternal(obj));
   EXPECT(Dart_IsList(obj));
 
+  void* raw_data = NULL;
+  EXPECT_VALID(Dart_ExternalByteArrayGetData(obj, &raw_data));
+  EXPECT(raw_data == data);
+
   void* peer = &data;  // just a non-NULL value
   EXPECT_VALID(Dart_ExternalByteArrayGetPeer(obj, &peer));
   EXPECT(peer == NULL);
@@ -1327,7 +1303,7 @@
     Dart_EnterScope();
 
     // Create an object in new space.
-    Dart_Handle new_ref = Dart_NewString("new string");
+    Dart_Handle new_ref = NewString("new string");
     EXPECT_VALID(new_ref);
 
     // Create an object in old space.
@@ -1425,7 +1401,7 @@
   int peer = 0;
   {
     Dart_EnterScope();
-    Dart_Handle obj = Dart_NewString("new string");
+    Dart_Handle obj = NewString("new string");
     EXPECT_VALID(obj);
     weak_ref = Dart_NewWeakPersistentHandle(obj, &peer,
                                             WeakPersistentHandlePeerFinalizer);
@@ -1447,7 +1423,7 @@
   int peer = 0;
   {
     Dart_EnterScope();
-    Dart_Handle obj = Dart_NewString("new string");
+    Dart_Handle obj = NewString("new string");
     EXPECT_VALID(obj);
     weak_ref = Dart_NewWeakPersistentHandle(obj, &peer,
                                             WeakPersistentHandlePeerFinalizer);
@@ -2364,8 +2340,8 @@
       "interface MyInterface default MyDefault {\n"
       "}\n";
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
-  Dart_Handle cls = Dart_GetClass(lib, Dart_NewString("MyClass"));
-  Dart_Handle interface = Dart_GetClass(lib, Dart_NewString("MyInterface"));
+  Dart_Handle cls = Dart_GetClass(lib, NewString("MyClass"));
+  Dart_Handle interface = Dart_GetClass(lib, NewString("MyInterface"));
 
   // Test Dart_IsClass and Dart_IsInterface.
   EXPECT(Dart_IsClass(cls));
@@ -2434,9 +2410,9 @@
       "typedef void SomeHandler(String a);\n";
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
   EXPECT_VALID(lib);
-  Dart_Handle normal_cls = Dart_GetClass(lib, Dart_NewString("SomeClass"));
+  Dart_Handle normal_cls = Dart_GetClass(lib, NewString("SomeClass"));
   EXPECT_VALID(normal_cls);
-  Dart_Handle typedef_cls = Dart_GetClass(lib, Dart_NewString("SomeHandler"));
+  Dart_Handle typedef_cls = Dart_GetClass(lib, NewString("SomeHandler"));
   EXPECT_VALID(typedef_cls);
 
   EXPECT(Dart_IsClass(normal_cls));
@@ -2506,11 +2482,11 @@
       "}\n";
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
 
-  Dart_Handle cls0 = Dart_GetClass(lib, Dart_NewString("MyClass0"));
-  Dart_Handle cls1 = Dart_GetClass(lib, Dart_NewString("MyClass1"));
-  Dart_Handle cls2 = Dart_GetClass(lib, Dart_NewString("MyClass2"));
-  Dart_Handle intf0 = Dart_GetClass(lib, Dart_NewString("MyInterface0"));
-  Dart_Handle intf1 = Dart_GetClass(lib, Dart_NewString("MyInterface1"));
+  Dart_Handle cls0 = Dart_GetClass(lib, NewString("MyClass0"));
+  Dart_Handle cls1 = Dart_GetClass(lib, NewString("MyClass1"));
+  Dart_Handle cls2 = Dart_GetClass(lib, NewString("MyClass2"));
+  Dart_Handle intf0 = Dart_GetClass(lib, NewString("MyInterface0"));
+  Dart_Handle intf1 = Dart_GetClass(lib, NewString("MyInterface1"));
 
   intptr_t len = -1;
   EXPECT_VALID(Dart_ClassGetInterfaceCount(cls0, &len));
@@ -2574,7 +2550,7 @@
   OS::SNPrint(buffer, 256, "Expected%d", ++counter);
 
   // Try to change the field value.
-  result = Dart_SetField(container, name, Dart_NewString(buffer));
+  result = Dart_SetField(container, name, NewString(buffer));
   if (final) {
     EXPECT(Dart_IsError(result));
   } else {
@@ -2687,163 +2663,163 @@
 
   // Shared setup.
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
-  Dart_Handle cls = Dart_GetClass(lib, Dart_NewString("Fields"));
+  Dart_Handle cls = Dart_GetClass(lib, NewString("Fields"));
   EXPECT_VALID(cls);
-  Dart_Handle instance = Dart_Invoke(lib, Dart_NewString("test"), 0, NULL);
+  Dart_Handle instance = Dart_Invoke(lib, NewString("test"), 0, NULL);
   EXPECT_VALID(instance);
   Dart_Handle name;
 
   // Load imported lib.
-  Dart_Handle url = Dart_NewString("library_url");
-  Dart_Handle source = Dart_NewString(kImportedScriptChars);
+  Dart_Handle url = NewString("library_url");
+  Dart_Handle source = NewString(kImportedScriptChars);
   Dart_Handle imported_lib = Dart_LoadLibrary(url, source);
-  Dart_Handle prefix = Dart_NewString("");
+  Dart_Handle prefix = NewString("");
   EXPECT_VALID(imported_lib);
   Dart_Handle result = Dart_LibraryImportLibrary(lib, imported_lib, prefix);
   EXPECT_VALID(result);
-  result = Dart_Invoke(imported_lib, Dart_NewString("test2"), 0, NULL);
+  result = Dart_Invoke(imported_lib, NewString("test2"), 0, NULL);
   EXPECT_VALID(result);
 
   // Instance field.
-  name = Dart_NewString("instance_fld");
+  name = NewString("instance_fld");
   TestFieldNotFound(lib, name);
   TestFieldNotFound(cls, name);
   TestFieldOk(instance, name, false, "instance");
 
   // Hidden instance field.
-  name = Dart_NewString("_instance_fld");
+  name = NewString("_instance_fld");
   TestFieldNotFound(lib, name);
   TestFieldNotFound(cls, name);
   TestFieldOk(instance, name, false, "hidden instance");
 
   // Final instance field.
-  name = Dart_NewString("final_instance_fld");
+  name = NewString("final_instance_fld");
   TestFieldNotFound(lib, name);
   TestFieldNotFound(cls, name);
   TestFieldOk(instance, name, true, "final instance");
 
   // Hidden final instance field.
-  name = Dart_NewString("_final_instance_fld");
+  name = NewString("_final_instance_fld");
   TestFieldNotFound(lib, name);
   TestFieldNotFound(cls, name);
   TestFieldOk(instance, name, true, "hidden final instance");
 
   // Inherited field.
-  name = Dart_NewString("inherited_fld");
+  name = NewString("inherited_fld");
   TestFieldNotFound(lib, name);
   TestFieldNotFound(cls, name);
   TestFieldOk(instance, name, false, "inherited");
 
   // Instance get/set field.
-  name = Dart_NewString("instance_getset_fld");
+  name = NewString("instance_getset_fld");
   TestFieldNotFound(lib, name);
   TestFieldNotFound(cls, name);
   TestFieldOk(instance, name, false, "instance getset");
 
   // Hidden instance get/set field.
-  name = Dart_NewString("_instance_getset_fld");
+  name = NewString("_instance_getset_fld");
   TestFieldNotFound(lib, name);
   TestFieldNotFound(cls, name);
   TestFieldOk(instance, name, false, "hidden instance getset");
 
   // Static field.
-  name = Dart_NewString("static_fld");
+  name = NewString("static_fld");
   TestFieldNotFound(lib, name);
   TestFieldNotFound(instance, name);
   TestFieldOk(cls, name, false, "static");
 
   // Hidden static field.
-  name = Dart_NewString("_static_fld");
+  name = NewString("_static_fld");
   TestFieldNotFound(lib, name);
   TestFieldNotFound(instance, name);
   TestFieldOk(cls, name, false, "hidden static");
 
   // Static final field.
-  name = Dart_NewString("const_static_fld");
+  name = NewString("const_static_fld");
   TestFieldNotFound(lib, name);
   TestFieldNotFound(instance, name);
   TestFieldOk(cls, name, true, "const static");
 
   // Hidden static const field.
-  name = Dart_NewString("_const_static_fld");
+  name = NewString("_const_static_fld");
   TestFieldNotFound(lib, name);
   TestFieldNotFound(instance, name);
   TestFieldOk(cls, name, true, "hidden const static");
 
   // Static non-inherited field.  Not found at any level.
-  name = Dart_NewString("non_inherited_fld");
+  name = NewString("non_inherited_fld");
   TestFieldNotFound(lib, name);
   TestFieldNotFound(instance, name);
   TestFieldNotFound(cls, name);
 
   // Static get/set field.
-  name = Dart_NewString("static_getset_fld");
+  name = NewString("static_getset_fld");
   TestFieldNotFound(lib, name);
   TestFieldNotFound(instance, name);
   TestFieldOk(cls, name, false, "static getset");
 
   // Hidden static get/set field.
-  name = Dart_NewString("_static_getset_fld");
+  name = NewString("_static_getset_fld");
   TestFieldNotFound(lib, name);
   TestFieldNotFound(instance, name);
   TestFieldOk(cls, name, false, "hidden static getset");
 
   // Top-Level field.
-  name = Dart_NewString("top_fld");
+  name = NewString("top_fld");
   TestFieldNotFound(cls, name);
   TestFieldNotFound(instance, name);
   TestFieldOk(lib, name, false, "top");
 
   // Hidden top-level field.
-  name = Dart_NewString("_top_fld");
+  name = NewString("_top_fld");
   TestFieldNotFound(cls, name);
   TestFieldNotFound(instance, name);
   TestFieldOk(lib, name, false, "hidden top");
 
   // Top-Level final field.
-  name = Dart_NewString("const_top_fld");
+  name = NewString("const_top_fld");
   TestFieldNotFound(cls, name);
   TestFieldNotFound(instance, name);
   TestFieldOk(lib, name, true, "const top");
 
   // Hidden top-level final field.
-  name = Dart_NewString("_const_top_fld");
+  name = NewString("_const_top_fld");
   TestFieldNotFound(cls, name);
   TestFieldNotFound(instance, name);
   TestFieldOk(lib, name, true, "hidden const top");
 
   // Top-Level get/set field.
-  name = Dart_NewString("top_getset_fld");
+  name = NewString("top_getset_fld");
   TestFieldNotFound(cls, name);
   TestFieldNotFound(instance, name);
   TestFieldOk(lib, name, false, "top getset");
 
   // Hidden top-level get/set field.
-  name = Dart_NewString("_top_getset_fld");
+  name = NewString("_top_getset_fld");
   TestFieldNotFound(cls, name);
   TestFieldNotFound(instance, name);
   TestFieldOk(lib, name, false, "hidden top getset");
 
   // Imported top-Level field.
-  name = Dart_NewString("imported_fld");
+  name = NewString("imported_fld");
   TestFieldNotFound(cls, name);
   TestFieldNotFound(instance, name);
   TestFieldOk(lib, name, false, "imported");
 
   // Hidden imported top-level field.  Not found at any level.
-  name = Dart_NewString("_imported_fld");
+  name = NewString("_imported_fld");
   TestFieldNotFound(cls, name);
   TestFieldNotFound(instance, name);
   TestFieldNotFound(lib, name);
 
   // Imported top-Level get/set field.
-  name = Dart_NewString("imported_getset_fld");
+  name = NewString("imported_getset_fld");
   TestFieldNotFound(cls, name);
   TestFieldNotFound(instance, name);
   TestFieldOk(lib, name, false, "imported getset");
 
   // Hidden imported top-level get/set field.  Not found at any level.
-  name = Dart_NewString("_imported_getset_fld");
+  name = NewString("_imported_getset_fld");
   TestFieldNotFound(cls, name);
   TestFieldNotFound(instance, name);
   TestFieldNotFound(lib, name);
@@ -2855,7 +2831,7 @@
       "var top;\n";
 
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
-  Dart_Handle name = Dart_NewString("top");
+  Dart_Handle name = NewString("top");
   bool value;
 
   // Test that you can set the field to a good value.
@@ -2920,13 +2896,13 @@
   // Create a native wrapper class with native fields.
   result = Dart_CreateNativeWrapperClass(
       lib,
-      Dart_NewString("NativeFieldsWrapper"),
+      NewString("NativeFieldsWrapper"),
       kNumNativeFields);
 
   // Load up a test script in the test library.
 
   // Invoke a function which returns an object of type NativeFields.
-  result = Dart_Invoke(lib, Dart_NewString("testMain"), 0, NULL);
+  result = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
   EXPECT_VALID(result);
   DARTSCOPE_NOCHECKS(Isolate::Current());
   Instance& obj = Instance::Handle();
@@ -2963,7 +2939,7 @@
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
 
   // Invoke a function which returns an object of type NativeFields.
-  result = Dart_Invoke(lib, Dart_NewString("testMain"), 0, NULL);
+  result = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
 
   // We expect this to fail as class "NativeFields" extends
   // "NativeFieldsWrapper" and there is no definition of it either
@@ -2994,7 +2970,7 @@
                                              native_field_lookup);
 
   // Invoke a function which returns an object of type NativeFields.
-  result = Dart_Invoke(lib, Dart_NewString("testMain"), 0, NULL);
+  result = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
   EXPECT_VALID(result);
   DARTSCOPE_NOCHECKS(Isolate::Current());
   Instance& obj = Instance::Handle();
@@ -3032,7 +3008,7 @@
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
 
   // Invoke a function which returns an object of type NativeFields.
-  result = Dart_Invoke(lib, Dart_NewString("testMain"), 0, NULL);
+  result = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
 
   // We expect the test script to fail finalization with the error below:
   EXPECT(Dart_IsError(result));
@@ -3064,7 +3040,7 @@
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, native_field_lookup);
 
   // Invoke a function which returns an object of type NativeFields.
-  result = Dart_Invoke(lib, Dart_NewString("testMain"), 0, NULL);
+  result = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
 
   EXPECT_VALID(result);
   EXPECT(Dart_IsInteger(result));
@@ -3077,29 +3053,29 @@
 
 static void TestNativeFields(Dart_Handle retobj) {
   // Access and set various instance fields of the object.
-  Dart_Handle result = Dart_GetField(retobj, Dart_NewString("fld3"));
+  Dart_Handle result = Dart_GetField(retobj, NewString("fld3"));
   EXPECT(Dart_IsError(result));
-  result = Dart_GetField(retobj, Dart_NewString("fld0"));
+  result = Dart_GetField(retobj, NewString("fld0"));
   EXPECT_VALID(result);
   EXPECT(Dart_IsNull(result));
-  result = Dart_GetField(retobj, Dart_NewString("fld1"));
+  result = Dart_GetField(retobj, NewString("fld1"));
   EXPECT_VALID(result);
   int64_t value = 0;
   result = Dart_IntegerToInt64(result, &value);
   EXPECT_EQ(10, value);
-  result = Dart_GetField(retobj, Dart_NewString("fld2"));
+  result = Dart_GetField(retobj, NewString("fld2"));
   EXPECT_VALID(result);
   result = Dart_IntegerToInt64(result, &value);
   EXPECT_EQ(20, value);
   result = Dart_SetField(retobj,
-                         Dart_NewString("fld2"),
+                         NewString("fld2"),
                          Dart_NewInteger(40));
   EXPECT(Dart_IsError(result));
   result = Dart_SetField(retobj,
-                         Dart_NewString("fld1"),
+                         NewString("fld1"),
                          Dart_NewInteger(40));
   EXPECT_VALID(result);
-  result = Dart_GetField(retobj, Dart_NewString("fld1"));
+  result = Dart_GetField(retobj, NewString("fld1"));
   EXPECT_VALID(result);
   result = Dart_IntegerToInt64(result, &value);
   EXPECT_EQ(40, value);
@@ -3144,11 +3120,11 @@
 
   // Now re-access various dart instance fields of the returned object
   // to ensure that there was no corruption while setting native fields.
-  result = Dart_GetField(retobj, Dart_NewString("fld1"));
+  result = Dart_GetField(retobj, NewString("fld1"));
   EXPECT_VALID(result);
   result = Dart_IntegerToInt64(result, &value);
   EXPECT_EQ(40, value);
-  result = Dart_GetField(retobj, Dart_NewString("fld2"));
+  result = Dart_GetField(retobj, NewString("fld2"));
   EXPECT_VALID(result);
   result = Dart_IntegerToInt64(result, &value);
   EXPECT_EQ(20, value);
@@ -3178,14 +3154,14 @@
   // Create a native wrapper class with native fields.
   Dart_Handle result = Dart_CreateNativeWrapperClass(
       lib,
-      Dart_NewString("NativeFieldsWrapper"),
+      NewString("NativeFieldsWrapper"),
       kNumNativeFields);
   EXPECT_VALID(result);
 
   // Load up a test script in it.
 
   // Invoke a function which returns an object of type NativeFields.
-  Dart_Handle retobj = Dart_Invoke(lib, Dart_NewString("testMain"), 0, NULL);
+  Dart_Handle retobj = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
   EXPECT_VALID(retobj);
 
   // Now access and set various instance fields of the returned object.
@@ -3225,7 +3201,7 @@
                                              native_field_lookup);
 
   // Invoke a function which returns an object of type NativeFields.
-  Dart_Handle retobj = Dart_Invoke(lib, Dart_NewString("testMain"), 0, NULL);
+  Dart_Handle retobj = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
   EXPECT_VALID(retobj);
 
   // Now access and set various instance fields of the returned object.
@@ -3256,7 +3232,7 @@
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
 
   // Invoke a function which returns an object of type NativeFields.
-  Dart_Handle retobj = Dart_Invoke(lib, Dart_NewString("testMain1"), 0, NULL);
+  Dart_Handle retobj = Dart_Invoke(lib, NewString("testMain1"), 0, NULL);
   EXPECT_VALID(retobj);
 
   // Now access and set various native instance fields of the returned object.
@@ -3284,7 +3260,7 @@
   EXPECT(Dart_IsError(result));
 
   // Invoke a function which returns a closure object.
-  retobj = Dart_Invoke(lib, Dart_NewString("testMain2"), 0, NULL);
+  retobj = Dart_Invoke(lib, NewString("testMain2"), 0, NULL);
   EXPECT_VALID(retobj);
 
   result = Dart_GetNativeInstanceField(retobj, kNativeFld4, &value);
@@ -3315,33 +3291,33 @@
   Dart_Handle result;
   // Create a test library and Load up a test script in it.
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
-  Dart_Handle cls = Dart_GetClass(lib, Dart_NewString("TestClass"));
+  Dart_Handle cls = Dart_GetClass(lib, NewString("TestClass"));
   EXPECT_VALID(cls);
 
   // Invoke a function which returns an object.
-  result = Dart_Invoke(cls, Dart_NewString("testMain"), 0, NULL);
+  result = Dart_Invoke(cls, NewString("testMain"), 0, NULL);
   EXPECT_VALID(result);
 
   // For uninitialized fields, the getter is returned
-  result = Dart_GetField(cls, Dart_NewString("fld1"));
+  result = Dart_GetField(cls, NewString("fld1"));
   EXPECT_VALID(result);
   int64_t value = 0;
   result = Dart_IntegerToInt64(result, &value);
   EXPECT_EQ(7, value);
 
-  result = Dart_GetField(cls, Dart_NewString("fld2"));
+  result = Dart_GetField(cls, NewString("fld2"));
   EXPECT_VALID(result);
   result = Dart_IntegerToInt64(result, &value);
   EXPECT_EQ(11, value);
 
   // Overwrite fld2
   result = Dart_SetField(cls,
-                         Dart_NewString("fld2"),
+                         NewString("fld2"),
                          Dart_NewInteger(13));
   EXPECT_VALID(result);
 
   // We now get the new value for fld2, not the initializer
-  result = Dart_GetField(cls, Dart_NewString("fld2"));
+  result = Dart_GetField(cls, NewString("fld2"));
   EXPECT_VALID(result);
   result = Dart_IntegerToInt64(result, &value);
   EXPECT_EQ(13, value);
@@ -3392,13 +3368,13 @@
       "}\n";
 
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
-  Dart_Handle cls = Dart_GetClass(lib, Dart_NewString("MyClass"));
+  Dart_Handle cls = Dart_GetClass(lib, NewString("MyClass"));
   EXPECT_VALID(cls);
-  Dart_Handle cls2 = Dart_GetClass(lib, Dart_NewString("MyClass2"));
+  Dart_Handle cls2 = Dart_GetClass(lib, NewString("MyClass2"));
   EXPECT_VALID(cls2);
-  Dart_Handle intf = Dart_GetClass(lib, Dart_NewString("MyInterface"));
+  Dart_Handle intf = Dart_GetClass(lib, NewString("MyInterface"));
   EXPECT_VALID(intf);
-  Dart_Handle intf2 = Dart_GetClass(lib, Dart_NewString("MyInterface2"));
+  Dart_Handle intf2 = Dart_GetClass(lib, NewString("MyInterface2"));
   EXPECT_VALID(intf2);
   Dart_Handle args[1];
   args[0] = Dart_NewInteger(11);
@@ -3412,79 +3388,79 @@
   EXPECT_VALID(Dart_ObjectIsType(result, cls, &instanceof));
   EXPECT(instanceof);
   int64_t int_value = 0;
-  Dart_Handle foo = Dart_GetField(result, Dart_NewString("foo"));
+  Dart_Handle foo = Dart_GetField(result, NewString("foo"));
   EXPECT_VALID(Dart_IntegerToInt64(foo, &int_value));
   EXPECT_EQ(7, int_value);
 
   // Invoke the unnamed constructor with an empty string.
-  result = Dart_New(cls, Dart_NewString(""), 0, NULL);
+  result = Dart_New(cls, NewString(""), 0, NULL);
   EXPECT_VALID(result);
   instanceof = false;
   EXPECT_VALID(Dart_ObjectIsType(result, cls, &instanceof));
   EXPECT(instanceof);
   int_value = 0;
-  foo = Dart_GetField(result, Dart_NewString("foo"));
+  foo = Dart_GetField(result, NewString("foo"));
   EXPECT_VALID(Dart_IntegerToInt64(foo, &int_value));
   EXPECT_EQ(7, int_value);
 
   // Invoke a named constructor.
-  result = Dart_New(cls, Dart_NewString("named"), 1, args);
+  result = Dart_New(cls, NewString("named"), 1, args);
   EXPECT_VALID(result);
   EXPECT_VALID(Dart_ObjectIsType(result, cls, &instanceof));
   EXPECT(instanceof);
   int_value = 0;
-  foo = Dart_GetField(result, Dart_NewString("foo"));
+  foo = Dart_GetField(result, NewString("foo"));
   EXPECT_VALID(Dart_IntegerToInt64(foo, &int_value));
   EXPECT_EQ(11, int_value);
 
   // Invoke a hidden named constructor.
-  result = Dart_New(cls, Dart_NewString("_hidden"), 1, args);
+  result = Dart_New(cls, NewString("_hidden"), 1, args);
   EXPECT_VALID(result);
   EXPECT_VALID(Dart_ObjectIsType(result, cls, &instanceof));
   EXPECT(instanceof);
   int_value = 0;
-  foo = Dart_GetField(result, Dart_NewString("foo"));
+  foo = Dart_GetField(result, NewString("foo"));
   EXPECT_VALID(Dart_IntegerToInt64(foo, &int_value));
   EXPECT_EQ(-11, int_value);
 
   // Invoke a factory constructor.
-  result = Dart_New(cls, Dart_NewString("multiply"), 1, args);
+  result = Dart_New(cls, NewString("multiply"), 1, args);
   EXPECT_VALID(result);
   EXPECT_VALID(Dart_ObjectIsType(result, cls, &instanceof));
   EXPECT(instanceof);
   int_value = 0;
-  foo = Dart_GetField(result, Dart_NewString("foo"));
+  foo = Dart_GetField(result, NewString("foo"));
   EXPECT_VALID(Dart_IntegerToInt64(foo, &int_value));
   EXPECT_EQ(1100, int_value);
 
   // Invoke a factory constructor which returns null.
-  result = Dart_New(cls, Dart_NewString("nullo"), 0, NULL);
+  result = Dart_New(cls, NewString("nullo"), 0, NULL);
   EXPECT_VALID(result);
   EXPECT(Dart_IsNull(result));
 
   // Pass an error class object.  Error is passed through.
-  result = Dart_New(Dart_Error("myerror"), Dart_NewString("named"), 1, args);
+  result = Dart_New(Dart_Error("myerror"), NewString("named"), 1, args);
   EXPECT_ERROR(result, "myerror");
 
   // Pass a bad class object.
-  result = Dart_New(Dart_Null(), Dart_NewString("named"), 1, args);
+  result = Dart_New(Dart_Null(), NewString("named"), 1, args);
   EXPECT_ERROR(result, "Dart_New expects argument 'clazz' to be non-null.");
 
   // Pass a negative arg count.
-  result = Dart_New(cls, Dart_NewString("named"), -1, args);
+  result = Dart_New(cls, NewString("named"), -1, args);
   EXPECT_ERROR(
       result,
       "Dart_New expects argument 'number_of_arguments' to be non-negative.");
 
   // Pass the wrong arg count.
-  result = Dart_New(cls, Dart_NewString("named"), 0, NULL);
+  result = Dart_New(cls, NewString("named"), 0, NULL);
   EXPECT_ERROR(
       result,
       "Dart_New: wrong argument count for constructor 'MyClass.named': "
       "0 passed, 1 expected.");
 
   // Pass a bad argument.  Error is passed through.
-  result = Dart_New(cls, Dart_NewString("named"), 1, bad_args);
+  result = Dart_New(cls, NewString("named"), 1, bad_args);
   EXPECT_ERROR(result, "myerror");
 
   // Pass a bad constructor name.
@@ -3494,12 +3470,12 @@
       "Dart_New expects argument 'constructor_name' to be of type String.");
 
   // Invoke a missing constructor.
-  result = Dart_New(cls, Dart_NewString("missing"), 1, args);
+  result = Dart_New(cls, NewString("missing"), 1, args);
   EXPECT_ERROR(result,
                "Dart_New: could not find constructor 'MyClass.missing'.");
 
   // Invoke a constructor which throws an exception.
-  result = Dart_New(cls, Dart_NewString("exception"), 1, args);
+  result = Dart_New(cls, NewString("exception"), 1, args);
   EXPECT_ERROR(result, "ConstructorDeath");
 
   // MyInterface has default class MyClass.
@@ -3515,23 +3491,23 @@
   //   MyClass.foo() from the class MyClass.
 
   // Invoke an interface constructor.
-  result = Dart_New(intf, Dart_NewString("named"), 1, args);
+  result = Dart_New(intf, NewString("named"), 1, args);
   EXPECT_VALID(result);
   EXPECT_VALID(Dart_ObjectIsType(result, cls, &instanceof));
   EXPECT(instanceof);
   int_value = 0;
-  foo = Dart_GetField(result, Dart_NewString("foo"));
+  foo = Dart_GetField(result, NewString("foo"));
   EXPECT_VALID(Dart_IntegerToInt64(foo, &int_value));
   EXPECT_EQ(11, int_value);
 
   // Invoke an interface constructor which in turn calls a factory
   // constructor.
-  result = Dart_New(intf, Dart_NewString("multiply"), 1, args);
+  result = Dart_New(intf, NewString("multiply"), 1, args);
   EXPECT_VALID(result);
   EXPECT_VALID(Dart_ObjectIsType(result, cls, &instanceof));
   EXPECT(instanceof);
   int_value = 0;
-  foo = Dart_GetField(result, Dart_NewString("foo"));
+  foo = Dart_GetField(result, NewString("foo"));
   EXPECT_VALID(Dart_IntegerToInt64(foo, &int_value));
   EXPECT_EQ(1100, int_value);
 
@@ -3543,7 +3519,7 @@
 
   // Invoke a constructor that is present in the interface but missing
   // in the default class.
-  result = Dart_New(intf, Dart_NewString("notfound"), 1, args);
+  result = Dart_New(intf, NewString("notfound"), 1, args);
   EXPECT_ERROR(result,
                "Dart_New: could not find constructor 'MyClass.notfound'.");
 
@@ -3561,24 +3537,24 @@
 
   // Invoke an interface constructor which in turn calls a factory
   // constructor.
-  result = Dart_New(intf2, Dart_NewString("multiply"), 1, args);
+  result = Dart_New(intf2, NewString("multiply"), 1, args);
   EXPECT_VALID(result);
   EXPECT_VALID(Dart_ObjectIsType(result, cls2, &instanceof));
   EXPECT(instanceof);
   int_value = 0;
-  Dart_Handle bar = Dart_GetField(result, Dart_NewString("bar"));
+  Dart_Handle bar = Dart_GetField(result, NewString("bar"));
   EXPECT_VALID(Dart_IntegerToInt64(bar, &int_value));
   EXPECT_EQ(110000, int_value);
 
   // Invoke a constructor that is missing in the interface but present
   // in the default class.
-  result = Dart_New(intf2, Dart_NewString("unused"), 1, args);
+  result = Dart_New(intf2, NewString("unused"), 1, args);
   EXPECT_ERROR(result,
                "Dart_New: could not find constructor 'MyInterface2.unused'.");
 
   // Invoke a constructor that is present in the interface but missing
   // in the default class.
-  result = Dart_New(intf2, Dart_NewString("notfound"), 1, args);
+  result = Dart_New(intf2, NewString("notfound"), 1, args);
   EXPECT_ERROR(result,
                "Dart_New: could not find factory 'MyInterface2.notfound' "
                "in class 'MyClass'.");
@@ -3589,9 +3565,9 @@
   // Issue 2971: We were unable to use Dart_New to construct an
   // instance of List, due to problems implementing interface
   // factories.
-  Dart_Handle core_lib = Dart_LookupLibrary(Dart_NewString("dart:core"));
+  Dart_Handle core_lib = Dart_LookupLibrary(NewString("dart:core"));
   EXPECT_VALID(core_lib);
-  Dart_Handle list_class = Dart_GetClass(core_lib, Dart_NewString("List"));
+  Dart_Handle list_class = Dart_GetClass(core_lib, NewString("List"));
   EXPECT_VALID(list_class);
 
   const int kNumArgs = 1;
@@ -3626,21 +3602,21 @@
 
   // Shared setup.
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
-  Dart_Handle cls = Dart_GetClass(lib, Dart_NewString("Methods"));
+  Dart_Handle cls = Dart_GetClass(lib, NewString("Methods"));
   EXPECT_VALID(cls);
-  Dart_Handle instance = Dart_Invoke(lib, Dart_NewString("test"), 0, NULL);
+  Dart_Handle instance = Dart_Invoke(lib, NewString("test"), 0, NULL);
   EXPECT_VALID(instance);
   Dart_Handle args[1];
-  args[0] = Dart_NewString("!!!");
+  args[0] = NewString("!!!");
   Dart_Handle bad_args[2];
-  bad_args[0] = Dart_NewString("bad1");
-  bad_args[1] = Dart_NewString("bad2");
+  bad_args[0] = NewString("bad1");
+  bad_args[1] = NewString("bad2");
   Dart_Handle result;
   Dart_Handle name;
   const char* str;
 
   // Instance method.
-  name = Dart_NewString("instanceMethod");
+  name = NewString("instanceMethod");
   EXPECT(Dart_IsError(Dart_Invoke(lib, name, 1, args)));
   EXPECT(Dart_IsError(Dart_Invoke(cls, name, 1, args)));
   result = Dart_Invoke(instance, name, 1, args);
@@ -3653,7 +3629,7 @@
                "did not find instance method 'Methods.instanceMethod'");
 
   // Hidden instance method.
-  name = Dart_NewString("_instanceMethod");
+  name = NewString("_instanceMethod");
   EXPECT(Dart_IsError(Dart_Invoke(lib, name, 1, args)));
   EXPECT(Dart_IsError(Dart_Invoke(cls, name, 1, args)));
   result = Dart_Invoke(instance, name, 1, args);
@@ -3662,7 +3638,7 @@
   EXPECT_STREQ("hidden instance !!!", str);
 
   // Inherited method.
-  name = Dart_NewString("inheritedMethod");
+  name = NewString("inheritedMethod");
   EXPECT(Dart_IsError(Dart_Invoke(lib, name, 1, args)));
   EXPECT(Dart_IsError(Dart_Invoke(cls, name, 1, args)));
   result = Dart_Invoke(instance, name, 1, args);
@@ -3671,7 +3647,7 @@
   EXPECT_STREQ("inherited !!!", str);
 
   // Static method.
-  name = Dart_NewString("staticMethod");
+  name = NewString("staticMethod");
   EXPECT(Dart_IsError(Dart_Invoke(lib, name, 1, args)));
   EXPECT(Dart_IsError(Dart_Invoke(instance, name, 1, args)));
   result = Dart_Invoke(cls, name, 1, args);
@@ -3684,7 +3660,7 @@
                "did not find static method 'Methods.staticMethod'");
 
   // Hidden static method.
-  name = Dart_NewString("_staticMethod");
+  name = NewString("_staticMethod");
   EXPECT(Dart_IsError(Dart_Invoke(lib, name, 1, args)));
   EXPECT(Dart_IsError(Dart_Invoke(instance, name, 1, args)));
   result = Dart_Invoke(cls, name, 1, args);
@@ -3693,13 +3669,13 @@
   EXPECT_STREQ("hidden static !!!", str);
 
   // Static non-inherited method.  Not found at any level.
-  name = Dart_NewString("non_inheritedMethod");
+  name = NewString("non_inheritedMethod");
   EXPECT(Dart_IsError(Dart_Invoke(lib, name, 1, args)));
   EXPECT(Dart_IsError(Dart_Invoke(instance, name, 1, args)));
   EXPECT(Dart_IsError(Dart_Invoke(cls, name, 1, args)));
 
   // Top-Level method.
-  name = Dart_NewString("topMethod");
+  name = NewString("topMethod");
   EXPECT(Dart_IsError(Dart_Invoke(cls, name, 1, args)));
   EXPECT(Dart_IsError(Dart_Invoke(instance, name, 1, args)));
   result = Dart_Invoke(lib, name, 1, args);
@@ -3713,7 +3689,7 @@
                "2 passed, 1 expected.");
 
   // Hidden top-level method.
-  name = Dart_NewString("_topMethod");
+  name = NewString("_topMethod");
   EXPECT(Dart_IsError(Dart_Invoke(cls, name, 1, args)));
   EXPECT(Dart_IsError(Dart_Invoke(instance, name, 1, args)));
   result = Dart_Invoke(lib, name, 1, args);
@@ -3728,12 +3704,12 @@
       "test(arg) => 'hello $arg';\n";
 
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
-  Dart_Handle func_name = Dart_NewString("test");
+  Dart_Handle func_name = NewString("test");
   Dart_Handle args[1];
   const char* str;
 
   // Make sure that valid args yield valid results.
-  args[0] = Dart_NewString("!!!");
+  args[0] = NewString("!!!");
   Dart_Handle result = Dart_Invoke(lib, func_name, 1, args);
   EXPECT_VALID(result);
   result = Dart_StringToCString(result, &str);
@@ -3774,7 +3750,7 @@
 
 TEST_CASE(Invoke_Null) {
   Dart_Handle result = Dart_Invoke(Dart_Null(),
-                                   Dart_NewString("toString"),
+                                   NewString("toString"),
                                    0,
                                    NULL);
   EXPECT_VALID(result);
@@ -3786,7 +3762,7 @@
 
   // Should throw a NullPointerException. Disabled due to bug 5415268.
   /*
-    Dart_Handle function_name2 = Dart_NewString("NoNoNo");
+    Dart_Handle function_name2 = NewString("NoNoNo");
     result = Dart_Invoke(null_receiver,
     function_name2,
     number_of_arguments,
@@ -3807,14 +3783,14 @@
       "void _imported() {}\n";
 
   // Load lib1
-  Dart_Handle url = Dart_NewString("library1_url");
-  Dart_Handle source = Dart_NewString(kLibrary1Chars);
+  Dart_Handle url = NewString("library1_url");
+  Dart_Handle source = NewString(kLibrary1Chars);
   Dart_Handle lib1 = Dart_LoadLibrary(url, source);
   EXPECT_VALID(lib1);
 
   // Load lib2
-  url = Dart_NewString("library2_url");
-  source = Dart_NewString(kLibrary2Chars);
+  url = NewString("library2_url");
+  source = NewString(kLibrary2Chars);
   Dart_Handle lib2 = Dart_LoadLibrary(url, source);
   EXPECT_VALID(lib2);
 
@@ -3823,12 +3799,12 @@
   EXPECT_VALID(result);
 
   // We can invoke both private and non-private local functions.
-  EXPECT_VALID(Dart_Invoke(lib1, Dart_NewString("local"), 0, NULL));
-  EXPECT_VALID(Dart_Invoke(lib1, Dart_NewString("_local"), 0, NULL));
+  EXPECT_VALID(Dart_Invoke(lib1, NewString("local"), 0, NULL));
+  EXPECT_VALID(Dart_Invoke(lib1, NewString("_local"), 0, NULL));
 
   // We can only invoke non-private imported functions.
-  EXPECT_VALID(Dart_Invoke(lib1, Dart_NewString("imported"), 0, NULL));
-  EXPECT_ERROR(Dart_Invoke(lib1, Dart_NewString("_imported"), 0, NULL),
+  EXPECT_VALID(Dart_Invoke(lib1, NewString("imported"), 0, NULL));
+  EXPECT_ERROR(Dart_Invoke(lib1, NewString("_imported"), 0, NULL),
                "did not find top-level function '_imported'");
 }
 
@@ -3871,11 +3847,11 @@
   // Create a test library and Load up a test script in it.
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
   EXPECT_VALID(lib);
-  Dart_Handle cls = Dart_GetClass(lib, Dart_NewString("Foo"));
+  Dart_Handle cls = Dart_GetClass(lib, NewString("Foo"));
   EXPECT_VALID(cls);
 
   // Invoke a function which returns a closure.
-  Dart_Handle retobj = Dart_Invoke(lib, Dart_NewString("getClosure"), 0, NULL);
+  Dart_Handle retobj = Dart_Invoke(lib, NewString("getClosure"), 0, NULL);
   EXPECT_VALID(retobj);
 
   EXPECT(Dart_IsClosure(retobj));
@@ -3887,7 +3863,7 @@
   EXPECT(Dart_IsFunction(result));
   owner = Dart_FunctionOwner(result);
   EXPECT_VALID(owner);
-  defining_function = Dart_LookupFunction(lib, Dart_NewString("getClosure"));
+  defining_function = Dart_LookupFunction(lib, NewString("getClosure"));
   EXPECT(Dart_IdentityEquals(owner, defining_function));
   int64_t fixed_param_count = -999;
   int64_t opt_param_count = -999;
@@ -3903,7 +3879,7 @@
   EXPECT(Dart_IsError(result));
 
   // Invoke a function which returns an "instance" closure.
-  retobj = Dart_Invoke(lib, Dart_NewString("getInstanceClosure"), 0, NULL);
+  retobj = Dart_Invoke(lib, NewString("getInstanceClosure"), 0, NULL);
   EXPECT_VALID(retobj);
   EXPECT(Dart_IsClosure(retobj));
 
@@ -3914,7 +3890,7 @@
   owner = Dart_FunctionOwner(result);
   EXPECT_VALID(owner);
   defining_function = Dart_LookupFunction(cls,
-                                          Dart_NewString("getInstanceClosure"));
+                                          NewString("getInstanceClosure"));
   EXPECT(Dart_IdentityEquals(owner, defining_function));
   // -999: We want to distinguish between a non-answer and a wrong answer, and
   // -1 has been a previous wrong answer
@@ -3929,7 +3905,7 @@
 
   // Invoke a function which returns an "instance" closure with arguments.
   retobj = Dart_Invoke(lib,
-                       Dart_NewString("getInstanceClosureWithArgs"),
+                       NewString("getInstanceClosureWithArgs"),
                        0,
                        NULL);
   EXPECT_VALID(retobj);
@@ -3942,7 +3918,7 @@
   owner = Dart_FunctionOwner(result);
   EXPECT_VALID(owner);
   defining_function =
-      Dart_LookupFunction(cls, Dart_NewString("getInstanceClosureWithArgs"));
+      Dart_LookupFunction(cls, NewString("getInstanceClosureWithArgs"));
   EXPECT(Dart_IdentityEquals(owner, defining_function));
   // -999: We want to distinguish between a non-answer and a wrong answer, and
   // -1 has been a previous wrong answer
@@ -3956,7 +3932,7 @@
   EXPECT_EQ(1, opt_param_count);
 
   // Invoke a function which returns a "static" closure.
-  retobj = Dart_Invoke(lib, Dart_NewString("getStaticClosure"), 0, NULL);
+  retobj = Dart_Invoke(lib, NewString("getStaticClosure"), 0, NULL);
   EXPECT_VALID(retobj);
   EXPECT(Dart_IsClosure(retobj));
 
@@ -3967,7 +3943,7 @@
   owner = Dart_FunctionOwner(result);
   EXPECT_VALID(owner);
   defining_function = Dart_LookupFunction(cls,
-                                          Dart_NewString("getStaticClosure"));
+                                          NewString("getStaticClosure"));
   EXPECT(Dart_IdentityEquals(owner, defining_function));
   // -999: We want to distinguish between a non-answer and a wrong answer, and
   // -1 has been a previous wrong answer
@@ -3983,7 +3959,7 @@
 
   // Invoke a function which returns a "static" closure with arguments.
   retobj = Dart_Invoke(lib,
-                       Dart_NewString("getStaticClosureWithArgs"),
+                       NewString("getStaticClosureWithArgs"),
                        0,
                        NULL);
   EXPECT_VALID(retobj);
@@ -3996,7 +3972,7 @@
   owner = Dart_FunctionOwner(result);
   EXPECT_VALID(owner);
   defining_function =
-      Dart_LookupFunction(cls, Dart_NewString("getStaticClosureWithArgs"));
+      Dart_LookupFunction(cls, NewString("getStaticClosureWithArgs"));
   EXPECT(Dart_IdentityEquals(owner, defining_function));
   // -999: We want to distinguish between a non-answer and a wrong answer, and
   // -1 has been a previous wrong answer
@@ -4040,7 +4016,7 @@
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
 
   // Invoke a function which returns a closure.
-  Dart_Handle retobj = Dart_Invoke(lib, Dart_NewString("testMain1"), 0, NULL);
+  Dart_Handle retobj = Dart_Invoke(lib, NewString("testMain1"), 0, NULL);
   EXPECT_VALID(retobj);
 
   EXPECT(Dart_IsClosure(retobj));
@@ -4062,11 +4038,11 @@
   EXPECT(Dart_ErrorHasException(result));
 
   // Invoke a function which returns a closure.
-  retobj = Dart_Invoke(lib, Dart_NewString("testMain2"), 0, NULL);
+  retobj = Dart_Invoke(lib, NewString("testMain2"), 0, NULL);
   EXPECT_VALID(retobj);
 
   EXPECT(Dart_IsClosure(retobj));
-  EXPECT(!Dart_IsClosure(Dart_NewString("abcdef")));
+  EXPECT(!Dart_IsClosure(NewString("abcdef")));
 
   // Now invoke the closure and check the result (should be an exception).
   dart_arguments[0] = Dart_NewInteger(1);
@@ -4078,7 +4054,7 @@
 
 void ExceptionNative(Dart_NativeArguments args) {
   Dart_EnterScope();
-  Dart_ThrowException(Dart_NewString("Hello from ExceptionNative!"));
+  Dart_ThrowException(NewString("Hello from ExceptionNative!"));
   UNREACHABLE();
 }
 
@@ -4105,12 +4081,12 @@
       reinterpret_cast<Dart_NativeEntryResolver>(native_lookup));
 
   // Throwing an exception here should result in an error.
-  result = Dart_ThrowException(Dart_NewString("This doesn't work"));
+  result = Dart_ThrowException(NewString("This doesn't work"));
   EXPECT_ERROR(result, "No Dart frames on stack, cannot throw exception");
   EXPECT(!Dart_ErrorHasException(result));
 
   // Invoke 'test' and check for an uncaught exception.
-  result = Dart_Invoke(lib, Dart_NewString("test"), 0, NULL);
+  result = Dart_Invoke(lib, NewString("test"), 0, NULL);
   EXPECT_ERROR(result, "Hello from ExceptionNative!");
   EXPECT(Dart_ErrorHasException(result));
 
@@ -4146,7 +4122,7 @@
       kScriptChars,
       reinterpret_cast<Dart_NativeEntryResolver>(gnac_lookup));
 
-  Dart_Handle result = Dart_Invoke(lib, Dart_NewString("testMain"), 0, NULL);
+  Dart_Handle result = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
   EXPECT_VALID(result);
   EXPECT(Dart_IsInteger(result));
 
@@ -4170,31 +4146,31 @@
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
 
   // Lookup a class.
-  Dart_Handle cls = Dart_GetClass(lib, Dart_NewString("Class"));
+  Dart_Handle cls = Dart_GetClass(lib, NewString("Class"));
   EXPECT_VALID(cls);
-  Dart_Handle name = Dart_GetField(cls, Dart_NewString("name"));
+  Dart_Handle name = Dart_GetField(cls, NewString("name"));
   EXPECT_VALID(name);
   const char* name_cstr = "";
   EXPECT_VALID(Dart_StringToCString(name, &name_cstr));
   EXPECT_STREQ("Class", name_cstr);
 
   // Lookup a private class.
-  cls = Dart_GetClass(lib, Dart_NewString("_Class"));
+  cls = Dart_GetClass(lib, NewString("_Class"));
   EXPECT_VALID(cls);
-  name = Dart_GetField(cls, Dart_NewString("name"));
+  name = Dart_GetField(cls, NewString("name"));
   EXPECT_VALID(name);
   name_cstr = "";
   EXPECT_VALID(Dart_StringToCString(name, &name_cstr));
   EXPECT_STREQ("_Class", name_cstr);
 
   // Lookup a class that does not exist.
-  cls = Dart_GetClass(lib, Dart_NewString("DoesNotExist"));
+  cls = Dart_GetClass(lib, NewString("DoesNotExist"));
   EXPECT(Dart_IsError(cls));
   EXPECT_STREQ("Class 'DoesNotExist' not found in library 'dart:test-lib'.",
                Dart_GetError(cls));
 
   // Lookup a class from an error library.  The error propagates.
-  cls = Dart_GetClass(Api::NewError("myerror"), Dart_NewString("Class"));
+  cls = Dart_GetClass(Api::NewError("myerror"), NewString("Class"));
   EXPECT(Dart_IsError(cls));
   EXPECT_STREQ("myerror", Dart_GetError(cls));
 
@@ -4292,14 +4268,14 @@
 
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
   EXPECT_VALID(lib);
-  Dart_Handle cls = Dart_GetClass(lib, Dart_NewString("MyClass"));
+  Dart_Handle cls = Dart_GetClass(lib, NewString("MyClass"));
   EXPECT_VALID(cls);
-  Dart_Handle private_cls = Dart_GetClass(lib, Dart_NewString("_PrivateClass"));
+  Dart_Handle private_cls = Dart_GetClass(lib, NewString("_PrivateClass"));
   EXPECT_VALID(private_cls);
   TextBuffer buffer(128);
 
   // Lookup a top-level function.
-  Dart_Handle func = Dart_LookupFunction(lib, Dart_NewString("a"));
+  Dart_Handle func = Dart_LookupFunction(lib, NewString("a"));
   EXPECT_VALID(func);
   EXPECT(Dart_IsFunction(func));
   BuildFunctionDescription(&buffer, func);
@@ -4310,7 +4286,7 @@
   EXPECT(Dart_IdentityEquals(owner, lib));
 
   // Lookup a private top-level function.
-  func = Dart_LookupFunction(lib, Dart_NewString("_b"));
+  func = Dart_LookupFunction(lib, NewString("_b"));
   EXPECT_VALID(func);
   EXPECT(Dart_IsFunction(func));
   BuildFunctionDescription(&buffer, func);
@@ -4320,7 +4296,7 @@
   EXPECT(Dart_IdentityEquals(owner, lib));
 
   // Lookup a top-level getter.
-  func = Dart_LookupFunction(lib, Dart_NewString("c"));
+  func = Dart_LookupFunction(lib, NewString("c"));
   EXPECT_VALID(func);
   EXPECT(Dart_IsFunction(func));
   BuildFunctionDescription(&buffer, func);
@@ -4330,7 +4306,7 @@
   EXPECT(Dart_IdentityEquals(owner, lib));
 
   // Lookup a top-level setter.
-  func = Dart_LookupFunction(lib, Dart_NewString("d="));
+  func = Dart_LookupFunction(lib, NewString("d="));
   EXPECT_VALID(func);
   EXPECT(Dart_IsFunction(func));
   BuildFunctionDescription(&buffer, func);
@@ -4340,7 +4316,7 @@
   EXPECT(Dart_IdentityEquals(owner, lib));
 
   // Lookup a private top-level getter.
-  func = Dart_LookupFunction(lib, Dart_NewString("_e"));
+  func = Dart_LookupFunction(lib, NewString("_e"));
   EXPECT_VALID(func);
   EXPECT(Dart_IsFunction(func));
   BuildFunctionDescription(&buffer, func);
@@ -4350,7 +4326,7 @@
   EXPECT(Dart_IdentityEquals(owner, lib));
 
   // Lookup a private top-level setter.
-  func = Dart_LookupFunction(lib, Dart_NewString("_f="));
+  func = Dart_LookupFunction(lib, NewString("_f="));
   EXPECT_VALID(func);
   EXPECT(Dart_IsFunction(func));
   BuildFunctionDescription(&buffer, func);
@@ -4360,7 +4336,7 @@
   EXPECT(Dart_IdentityEquals(owner, lib));
 
   // Lookup an unnamed constructor
-  func = Dart_LookupFunction(cls, Dart_NewString("MyClass"));
+  func = Dart_LookupFunction(cls, NewString("MyClass"));
   EXPECT_VALID(func);
   EXPECT(Dart_IsFunction(func));
   BuildFunctionDescription(&buffer, func);
@@ -4370,7 +4346,7 @@
   EXPECT(Dart_IdentityEquals(owner, cls));
 
   // Lookup a named constructor
-  func = Dart_LookupFunction(cls, Dart_NewString("MyClass.named"));
+  func = Dart_LookupFunction(cls, NewString("MyClass.named"));
   EXPECT_VALID(func);
   EXPECT(Dart_IsFunction(func));
   BuildFunctionDescription(&buffer, func);
@@ -4380,7 +4356,7 @@
   EXPECT(Dart_IdentityEquals(owner, cls));
 
   // Lookup an private unnamed constructor
-  func = Dart_LookupFunction(private_cls, Dart_NewString("_PrivateClass"));
+  func = Dart_LookupFunction(private_cls, NewString("_PrivateClass"));
   EXPECT_VALID(func);
   EXPECT(Dart_IsFunction(func));
   BuildFunctionDescription(&buffer, func);
@@ -4391,7 +4367,7 @@
 
   // Lookup a private named constructor
   func = Dart_LookupFunction(private_cls,
-                             Dart_NewString("_PrivateClass.named"));
+                             NewString("_PrivateClass.named"));
   EXPECT_VALID(func);
   EXPECT(Dart_IsFunction(func));
   BuildFunctionDescription(&buffer, func);
@@ -4401,7 +4377,7 @@
   EXPECT(Dart_IdentityEquals(owner, private_cls));
 
   // Lookup a method.
-  func = Dart_LookupFunction(cls, Dart_NewString("a"));
+  func = Dart_LookupFunction(cls, NewString("a"));
   EXPECT_VALID(func);
   EXPECT(Dart_IsFunction(func));
   BuildFunctionDescription(&buffer, func);
@@ -4411,7 +4387,7 @@
   EXPECT(Dart_IdentityEquals(owner, cls));
 
   // Lookup a private method.
-  func = Dart_LookupFunction(cls, Dart_NewString("_b"));
+  func = Dart_LookupFunction(cls, NewString("_b"));
   EXPECT_VALID(func);
   EXPECT(Dart_IsFunction(func));
   BuildFunctionDescription(&buffer, func);
@@ -4421,7 +4397,7 @@
   EXPECT(Dart_IdentityEquals(owner, cls));
 
   // Lookup a instance getter.
-  func = Dart_LookupFunction(cls, Dart_NewString("c"));
+  func = Dart_LookupFunction(cls, NewString("c"));
   EXPECT_VALID(func);
   EXPECT(Dart_IsFunction(func));
   BuildFunctionDescription(&buffer, func);
@@ -4431,7 +4407,7 @@
   EXPECT(Dart_IdentityEquals(owner, cls));
 
   // Lookup a instance setter.
-  func = Dart_LookupFunction(cls, Dart_NewString("d="));
+  func = Dart_LookupFunction(cls, NewString("d="));
   EXPECT_VALID(func);
   EXPECT(Dart_IsFunction(func));
   BuildFunctionDescription(&buffer, func);
@@ -4441,7 +4417,7 @@
   EXPECT(Dart_IdentityEquals(owner, cls));
 
   // Lookup a private instance getter.
-  func = Dart_LookupFunction(cls, Dart_NewString("_e"));
+  func = Dart_LookupFunction(cls, NewString("_e"));
   EXPECT_VALID(func);
   EXPECT(Dart_IsFunction(func));
   BuildFunctionDescription(&buffer, func);
@@ -4451,7 +4427,7 @@
   EXPECT(Dart_IdentityEquals(owner, cls));
 
   // Lookup a private instance setter.
-  func = Dart_LookupFunction(cls, Dart_NewString("_f="));
+  func = Dart_LookupFunction(cls, NewString("_f="));
   EXPECT_VALID(func);
   EXPECT(Dart_IsFunction(func));
   BuildFunctionDescription(&buffer, func);
@@ -4461,7 +4437,7 @@
   EXPECT(Dart_IdentityEquals(owner, cls));
 
   // Lookup a static method.
-  func = Dart_LookupFunction(cls, Dart_NewString("g"));
+  func = Dart_LookupFunction(cls, NewString("g"));
   EXPECT_VALID(func);
   EXPECT(Dart_IsFunction(func));
   BuildFunctionDescription(&buffer, func);
@@ -4471,7 +4447,7 @@
   EXPECT(Dart_IdentityEquals(owner, cls));
 
   // Lookup a private static method.
-  func = Dart_LookupFunction(cls, Dart_NewString("_h"));
+  func = Dart_LookupFunction(cls, NewString("_h"));
   EXPECT_VALID(func);
   EXPECT(Dart_IsFunction(func));
   BuildFunctionDescription(&buffer, func);
@@ -4481,7 +4457,7 @@
   EXPECT(Dart_IdentityEquals(owner, cls));
 
   // Lookup a static getter.
-  func = Dart_LookupFunction(cls, Dart_NewString("i"));
+  func = Dart_LookupFunction(cls, NewString("i"));
   EXPECT_VALID(func);
   EXPECT(Dart_IsFunction(func));
   BuildFunctionDescription(&buffer, func);
@@ -4491,7 +4467,7 @@
   EXPECT(Dart_IdentityEquals(owner, cls));
 
   // Lookup a static setter.
-  func = Dart_LookupFunction(cls, Dart_NewString("j="));
+  func = Dart_LookupFunction(cls, NewString("j="));
   EXPECT_VALID(func);
   EXPECT(Dart_IsFunction(func));
   BuildFunctionDescription(&buffer, func);
@@ -4501,7 +4477,7 @@
   EXPECT(Dart_IdentityEquals(owner, cls));
 
   // Lookup a private static getter.
-  func = Dart_LookupFunction(cls, Dart_NewString("_k"));
+  func = Dart_LookupFunction(cls, NewString("_k"));
   EXPECT_VALID(func);
   EXPECT(Dart_IsFunction(func));
   BuildFunctionDescription(&buffer, func);
@@ -4511,7 +4487,7 @@
   EXPECT(Dart_IdentityEquals(owner, cls));
 
   // Lookup a private static setter.
-  func = Dart_LookupFunction(cls, Dart_NewString("_l="));
+  func = Dart_LookupFunction(cls, NewString("_l="));
   EXPECT_VALID(func);
   EXPECT(Dart_IsFunction(func));
   BuildFunctionDescription(&buffer, func);
@@ -4521,7 +4497,7 @@
   EXPECT(Dart_IdentityEquals(owner, cls));
 
   // Lookup an abstract method.
-  func = Dart_LookupFunction(cls, Dart_NewString("m"));
+  func = Dart_LookupFunction(cls, NewString("m"));
   EXPECT_VALID(func);
   EXPECT(Dart_IsFunction(func));
   BuildFunctionDescription(&buffer, func);
@@ -4531,7 +4507,7 @@
   EXPECT(Dart_IdentityEquals(owner, cls));
 
   // Lookup a private abstract method.
-  func = Dart_LookupFunction(cls, Dart_NewString("_n"));
+  func = Dart_LookupFunction(cls, NewString("_n"));
   EXPECT_VALID(func);
   EXPECT(Dart_IsFunction(func));
   BuildFunctionDescription(&buffer, func);
@@ -4541,7 +4517,7 @@
   EXPECT(Dart_IdentityEquals(owner, cls));
 
   // Lookup a abstract getter.
-  func = Dart_LookupFunction(cls, Dart_NewString("o"));
+  func = Dart_LookupFunction(cls, NewString("o"));
   EXPECT_VALID(func);
   EXPECT(Dart_IsFunction(func));
   BuildFunctionDescription(&buffer, func);
@@ -4551,7 +4527,7 @@
   EXPECT(Dart_IdentityEquals(owner, cls));
 
   // Lookup a abstract setter.
-  func = Dart_LookupFunction(cls, Dart_NewString("p="));
+  func = Dart_LookupFunction(cls, NewString("p="));
   EXPECT_VALID(func);
   EXPECT(Dart_IsFunction(func));
   BuildFunctionDescription(&buffer, func);
@@ -4561,7 +4537,7 @@
   EXPECT(Dart_IdentityEquals(owner, cls));
 
   // Lookup a private abstract getter.
-  func = Dart_LookupFunction(cls, Dart_NewString("_q"));
+  func = Dart_LookupFunction(cls, NewString("_q"));
   EXPECT_VALID(func);
   EXPECT(Dart_IsFunction(func));
   BuildFunctionDescription(&buffer, func);
@@ -4571,7 +4547,7 @@
   EXPECT(Dart_IdentityEquals(owner, cls));
 
   // Lookup a private abstract setter.
-  func = Dart_LookupFunction(cls, Dart_NewString("_r="));
+  func = Dart_LookupFunction(cls, NewString("_r="));
   EXPECT_VALID(func);
   EXPECT(Dart_IsFunction(func));
   BuildFunctionDescription(&buffer, func);
@@ -4581,7 +4557,7 @@
   EXPECT(Dart_IdentityEquals(owner, cls));
 
   // Lookup a method with fixed and optional parameters.
-  func = Dart_LookupFunction(cls, Dart_NewString("s"));
+  func = Dart_LookupFunction(cls, NewString("s"));
   EXPECT_VALID(func);
   EXPECT(Dart_IsFunction(func));
   BuildFunctionDescription(&buffer, func);
@@ -4591,7 +4567,7 @@
   EXPECT(Dart_IdentityEquals(owner, cls));
 
   // Lookup a method with only optional parameters.
-  func = Dart_LookupFunction(cls, Dart_NewString("t"));
+  func = Dart_LookupFunction(cls, NewString("t"));
   EXPECT_VALID(func);
   EXPECT(Dart_IsFunction(func));
   BuildFunctionDescription(&buffer, func);
@@ -4601,7 +4577,7 @@
   EXPECT(Dart_IdentityEquals(owner, cls));
 
   // Lookup an operator
-  func = Dart_LookupFunction(cls, Dart_NewString("=="));
+  func = Dart_LookupFunction(cls, NewString("=="));
   EXPECT_VALID(func);
   EXPECT(Dart_IsFunction(func));
   BuildFunctionDescription(&buffer, func);
@@ -4611,11 +4587,11 @@
   EXPECT(Dart_IdentityEquals(owner, cls));
 
   // Lookup a function that does not exist from a library.
-  func = Dart_LookupFunction(lib, Dart_NewString("DoesNotExist"));
+  func = Dart_LookupFunction(lib, NewString("DoesNotExist"));
   EXPECT(Dart_IsNull(func));
 
   // Lookup a function that does not exist from a class.
-  func = Dart_LookupFunction(cls, Dart_NewString("DoesNotExist"));
+  func = Dart_LookupFunction(cls, NewString("DoesNotExist"));
   EXPECT(Dart_IsNull(func));
 
   // Lookup a class using an error class name.  The error propagates.
@@ -4623,7 +4599,7 @@
   EXPECT_ERROR(func, "myerror");
 
   // Lookup a class from an error library.  The error propagates.
-  func = Dart_LookupFunction(Api::NewError("myerror"), Dart_NewString("foo"));
+  func = Dart_LookupFunction(Api::NewError("myerror"), NewString("foo"));
   EXPECT_ERROR(func, "myerror");
 }
 
@@ -4635,7 +4611,7 @@
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
   EXPECT_VALID(lib);
 
-  Dart_Handle func = Dart_LookupFunction(lib, Dart_NewString("func"));
+  Dart_Handle func = Dart_LookupFunction(lib, NewString("func"));
   EXPECT_VALID(func);
   EXPECT(Dart_IsFunction(func));
 
@@ -4664,7 +4640,7 @@
   EXPECT_VALID(Dart_StringToCString(cls_name, &cls_name_cstr));
   EXPECT_STREQ("String", cls_name_cstr);
 
-  Dart_Handle var = Dart_LookupVariable(lib, Dart_NewString("variable"));
+  Dart_Handle var = Dart_LookupVariable(lib, NewString("variable"));
   EXPECT_VALID(var);
   EXPECT(Dart_IsVariable(var));
 
@@ -4722,104 +4698,104 @@
 
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
   EXPECT_VALID(lib);
-  Dart_Handle cls = Dart_GetClass(lib, Dart_NewString("MyClass"));
+  Dart_Handle cls = Dart_GetClass(lib, NewString("MyClass"));
   EXPECT_VALID(cls);
   TextBuffer buffer(128);
 
   // Lookup a top-level variable.
-  Dart_Handle var = Dart_LookupVariable(lib, Dart_NewString("a"));
+  Dart_Handle var = Dart_LookupVariable(lib, NewString("a"));
   EXPECT_VALID(var);
   EXPECT(Dart_IsVariable(var));
   BuildVariableDescription(&buffer, var);
   EXPECT_STREQ("a static", buffer.buf());
 
   // Lookup a private top-level variable.
-  var = Dart_LookupVariable(lib, Dart_NewString("_b"));
+  var = Dart_LookupVariable(lib, NewString("_b"));
   EXPECT_VALID(var);
   EXPECT(Dart_IsVariable(var));
   BuildVariableDescription(&buffer, var);
   EXPECT_STREQ("_b static", buffer.buf());
 
   // Lookup a const top-level variable.
-  var = Dart_LookupVariable(lib, Dart_NewString("c"));
+  var = Dart_LookupVariable(lib, NewString("c"));
   EXPECT_VALID(var);
   EXPECT(Dart_IsVariable(var));
   BuildVariableDescription(&buffer, var);
   EXPECT_STREQ("c static final", buffer.buf());
 
   // Lookup a private const top-level variable.
-  var = Dart_LookupVariable(lib, Dart_NewString("_d"));
+  var = Dart_LookupVariable(lib, NewString("_d"));
   EXPECT_VALID(var);
   EXPECT(Dart_IsVariable(var));
   BuildVariableDescription(&buffer, var);
   EXPECT_STREQ("_d static final", buffer.buf());
 
   // Lookup a instance variable.
-  var = Dart_LookupVariable(cls, Dart_NewString("a"));
+  var = Dart_LookupVariable(cls, NewString("a"));
   EXPECT_VALID(var);
   EXPECT(Dart_IsVariable(var));
   BuildVariableDescription(&buffer, var);
   EXPECT_STREQ("a", buffer.buf());
 
   // Lookup a private instance variable.
-  var = Dart_LookupVariable(cls, Dart_NewString("_b"));
+  var = Dart_LookupVariable(cls, NewString("_b"));
   EXPECT_VALID(var);
   EXPECT(Dart_IsVariable(var));
   BuildVariableDescription(&buffer, var);
   EXPECT_STREQ("_b", buffer.buf());
 
   // Lookup a final instance variable.
-  var = Dart_LookupVariable(cls, Dart_NewString("c"));
+  var = Dart_LookupVariable(cls, NewString("c"));
   EXPECT_VALID(var);
   EXPECT(Dart_IsVariable(var));
   BuildVariableDescription(&buffer, var);
   EXPECT_STREQ("c final", buffer.buf());
 
   // Lookup a private final instance variable.
-  var = Dart_LookupVariable(cls, Dart_NewString("_d"));
+  var = Dart_LookupVariable(cls, NewString("_d"));
   EXPECT_VALID(var);
   EXPECT(Dart_IsVariable(var));
   BuildVariableDescription(&buffer, var);
   EXPECT_STREQ("_d final", buffer.buf());
 
   // Lookup a static variable.
-  var = Dart_LookupVariable(cls, Dart_NewString("e"));
+  var = Dart_LookupVariable(cls, NewString("e"));
   EXPECT_VALID(var);
   EXPECT(Dart_IsVariable(var));
   BuildVariableDescription(&buffer, var);
   EXPECT_STREQ("e static", buffer.buf());
 
   // Lookup a private static variable.
-  var = Dart_LookupVariable(cls, Dart_NewString("_f"));
+  var = Dart_LookupVariable(cls, NewString("_f"));
   EXPECT_VALID(var);
   EXPECT(Dart_IsVariable(var));
   BuildVariableDescription(&buffer, var);
   EXPECT_STREQ("_f static", buffer.buf());
 
   // Lookup a const static variable.
-  var = Dart_LookupVariable(cls, Dart_NewString("g"));
+  var = Dart_LookupVariable(cls, NewString("g"));
   EXPECT_VALID(var);
   EXPECT(Dart_IsVariable(var));
   BuildVariableDescription(&buffer, var);
   EXPECT_STREQ("g static final", buffer.buf());
 
   // Lookup a private const static variable.
-  var = Dart_LookupVariable(cls, Dart_NewString("_h"));
+  var = Dart_LookupVariable(cls, NewString("_h"));
   EXPECT_VALID(var);
   EXPECT(Dart_IsVariable(var));
   BuildVariableDescription(&buffer, var);
   EXPECT_STREQ("_h static final", buffer.buf());
 
   // Lookup a variable that does not exist from a library.
-  var = Dart_LookupVariable(lib, Dart_NewString("DoesNotExist"));
+  var = Dart_LookupVariable(lib, NewString("DoesNotExist"));
   EXPECT(Dart_IsNull(var));
 
   // Lookup a variable that does not exist from a class.
-  var = Dart_LookupVariable(cls, Dart_NewString("DoesNotExist"));
+  var = Dart_LookupVariable(cls, NewString("DoesNotExist"));
   EXPECT(Dart_IsNull(var));
 
   // Lookup a class from an error library.  The error propagates.
-  var = Dart_LookupVariable(Api::NewError("myerror"), Dart_NewString("foo"));
+  var = Dart_LookupVariable(Api::NewError("myerror"), NewString("foo"));
   EXPECT_ERROR(var, "myerror");
 
   // Lookup a class using an error class name.  The error propagates.
@@ -4837,7 +4813,7 @@
       "}\n";
 
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
-  Dart_Handle cls = Dart_GetClass(lib, Dart_NewString("GenericClass"));
+  Dart_Handle cls = Dart_GetClass(lib, NewString("GenericClass"));
   EXPECT_VALID(cls);
 
   // Test Dart_GetTypeVariableNames.
@@ -4850,7 +4826,7 @@
   EXPECT_STREQ("[U, T]", cstr);
 
   // Test variable U.
-  Dart_Handle type_var = Dart_LookupTypeVariable(cls, Dart_NewString("U"));
+  Dart_Handle type_var = Dart_LookupTypeVariable(cls, NewString("U"));
   EXPECT_VALID(type_var);
   EXPECT(Dart_IsTypeVariable(type_var));
   Dart_Handle type_var_name = Dart_TypeVariableName(type_var);
@@ -4866,7 +4842,7 @@
   EXPECT_STREQ("Object", cstr);
 
   // Test variable T.
-  type_var = Dart_LookupTypeVariable(cls, Dart_NewString("T"));
+  type_var = Dart_LookupTypeVariable(cls, NewString("T"));
   EXPECT_VALID(type_var);
   EXPECT(Dart_IsTypeVariable(type_var));
   type_var_name = Dart_TypeVariableName(type_var);
@@ -4899,12 +4875,12 @@
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
 
   // Fetch InstanceOfTest class.
-  Dart_Handle cls = Dart_GetClass(lib, Dart_NewString("InstanceOfTest"));
+  Dart_Handle cls = Dart_GetClass(lib, NewString("InstanceOfTest"));
   EXPECT_VALID(cls);
 
   // Invoke a function which returns an object of type InstanceOf..
   Dart_Handle instanceOfTestObj =
-      Dart_Invoke(cls, Dart_NewString("testMain"), 0, NULL);
+      Dart_Invoke(cls, NewString("testMain"), 0, NULL);
   EXPECT_VALID(instanceOfTestObj);
 
   // Now check instanceOfTestObj reported as an instance of
@@ -4915,7 +4891,7 @@
   EXPECT(is_instance);
 
   // Fetch OtherClass and check if instanceOfTestObj is instance of it.
-  Dart_Handle otherClass = Dart_GetClass(lib, Dart_NewString("OtherClass"));
+  Dart_Handle otherClass = Dart_GetClass(lib, NewString("OtherClass"));
   EXPECT_VALID(otherClass);
 
   result = Dart_ObjectIsType(instanceOfTestObj, otherClass, &is_instance);
@@ -4923,7 +4899,7 @@
   EXPECT(!is_instance);
 
   // Check that primitives are not instances of InstanceOfTest class.
-  result = Dart_ObjectIsType(Dart_NewString("a string"), otherClass,
+  result = Dart_ObjectIsType(NewString("a string"), otherClass,
                              &is_instance);
   EXPECT_VALID(result);
   EXPECT(!is_instance);
@@ -4938,7 +4914,7 @@
 
   // Check that null is not an instance of InstanceOfTest class.
   Dart_Handle null = Dart_Invoke(otherClass,
-                                 Dart_NewString("returnNull"),
+                                 NewString("returnNull"),
                                  0,
                                  NULL);
   EXPECT_VALID(null);
@@ -4968,8 +4944,8 @@
       "main() {"
       "  return 12345;"
       "}";
-  Dart_Handle url = Dart_NewString(TestCase::url());
-  Dart_Handle source = Dart_NewString(kScriptChars);
+  Dart_Handle url = NewString(TestCase::url());
+  Dart_Handle source = NewString(kScriptChars);
   Dart_Handle error = Dart_Error("incoming error");
   Dart_Handle result;
 
@@ -5009,7 +4985,7 @@
   result = Dart_LoadScript(url, source);
   EXPECT_VALID(result);
 
-  result = Dart_Invoke(result, Dart_NewString("main"), 0, NULL);
+  result = Dart_Invoke(result, NewString("main"), 0, NULL);
   EXPECT_VALID(result);
   EXPECT(Dart_IsInteger(result));
   int64_t value = 0;
@@ -5036,8 +5012,8 @@
   EXPECT(Dart_IsNull(root_lib));
 
   // Load a script.
-  Dart_Handle url = Dart_NewString(TestCase::url());
-  Dart_Handle source = Dart_NewString(kScriptChars);
+  Dart_Handle url = NewString(TestCase::url());
+  Dart_Handle source = NewString(kScriptChars);
   EXPECT_VALID(Dart_LoadScript(url, source));
 
   root_lib = Dart_RootLibrary();
@@ -5090,8 +5066,8 @@
 TEST_CASE(LoadScript_CompileError) {
   const char* kScriptChars =
       ")";
-  Dart_Handle url = Dart_NewString(TestCase::url());
-  Dart_Handle source = Dart_NewString(kScriptChars);
+  Dart_Handle url = NewString(TestCase::url());
+  Dart_Handle source = NewString(kScriptChars);
   Dart_Handle result = Dart_SetLibraryTagHandler(import_library_handler);
   EXPECT_VALID(result);
   result = Dart_LoadScript(url, source);
@@ -5109,15 +5085,15 @@
       "#import('library2.dart');";
 
   // Create a test library and Load up a test script in it.
-  Dart_Handle url = Dart_NewString(TestCase::url());
-  Dart_Handle source = Dart_NewString(kScriptChars);
+  Dart_Handle url = NewString(TestCase::url());
+  Dart_Handle source = NewString(kScriptChars);
   Dart_Handle result = Dart_SetLibraryTagHandler(library_handler);
   EXPECT_VALID(result);
   result = Dart_LoadScript(url, source);
   EXPECT_VALID(result);
 
-  url = Dart_NewString("library1.dart");
-  source = Dart_NewString(kLibrary1Chars);
+  url = NewString("library1.dart");
+  source = NewString(kLibrary1Chars);
   result = Dart_LoadLibrary(url, source);
   EXPECT_VALID(result);
 
@@ -5139,7 +5115,7 @@
   EXPECT(Dart_IsError(result));
   EXPECT_STREQ("incoming error", Dart_GetError(result));
 
-  url = Dart_NewString("noodles.dart");
+  url = NewString("noodles.dart");
   result = Dart_LookupLibrary(url);
   EXPECT(Dart_IsError(result));
   EXPECT_STREQ("Dart_LookupLibrary: library 'noodles.dart' not found.",
@@ -5150,8 +5126,8 @@
 TEST_CASE(LibraryName) {
   const char* kLibrary1Chars =
       "#library('library1_name');";
-  Dart_Handle url = Dart_NewString("library1_url");
-  Dart_Handle source = Dart_NewString(kLibrary1Chars);
+  Dart_Handle url = NewString("library1_url");
+  Dart_Handle source = NewString(kLibrary1Chars);
   Dart_Handle lib = Dart_LoadLibrary(url, source);
   Dart_Handle error = Dart_Error("incoming error");
   EXPECT_VALID(lib);
@@ -5183,8 +5159,8 @@
 TEST_CASE(LibraryUrl) {
   const char* kLibrary1Chars =
       "#library('library1_name');";
-  Dart_Handle url = Dart_NewString("library1_url");
-  Dart_Handle source = Dart_NewString(kLibrary1Chars);
+  Dart_Handle url = NewString("library1_url");
+  Dart_Handle source = NewString(kLibrary1Chars);
   Dart_Handle lib = Dart_LoadLibrary(url, source);
   Dart_Handle error = Dart_Error("incoming error");
   EXPECT_VALID(lib);
@@ -5227,8 +5203,8 @@
       "_compare(String a, String b) => a.compareTo(b);\n"
       "sort(list) => list.sort(_compare);\n";
 
-  Dart_Handle url = Dart_NewString("library_url");
-  Dart_Handle source = Dart_NewString(kLibraryChars);
+  Dart_Handle url = NewString("library_url");
+  Dart_Handle source = NewString(kLibraryChars);
   Dart_Handle lib = Dart_LoadLibrary(url, source);
   EXPECT_VALID(lib);
 
@@ -5240,7 +5216,7 @@
   const int kNumArgs = 1;
   Dart_Handle args[1];
   args[0] = list;
-  EXPECT_VALID(Dart_Invoke(lib, Dart_NewString("sort"), kNumArgs, args));
+  EXPECT_VALID(Dart_Invoke(lib, NewString("sort"), kNumArgs, args));
 
   Dart_Handle list_string = Dart_ToString(list);
   EXPECT_VALID(list_string);
@@ -5278,8 +5254,8 @@
       "sort(list) => list.sort(_compare);\n";
 
   // Get the functions from a library.
-  Dart_Handle url = Dart_NewString("library_url");
-  Dart_Handle source = Dart_NewString(kLibraryChars);
+  Dart_Handle url = NewString("library_url");
+  Dart_Handle source = NewString(kLibraryChars);
   Dart_Handle lib = Dart_LoadLibrary(url, source);
   EXPECT_VALID(lib);
 
@@ -5291,7 +5267,7 @@
   const int kNumArgs = 1;
   Dart_Handle args[1];
   args[0] = list;
-  EXPECT_VALID(Dart_Invoke(lib, Dart_NewString("sort"), kNumArgs, args));
+  EXPECT_VALID(Dart_Invoke(lib, NewString("sort"), kNumArgs, args));
 
   Dart_Handle list_string = Dart_ToString(list);
   EXPECT_VALID(list_string);
@@ -5300,7 +5276,7 @@
   EXPECT_STREQ("[A, B, C=, _A, _B, _C=, _compare, sort]", list_cstr);
 
   // Get the functions from a class.
-  Dart_Handle cls = Dart_GetClass(lib, Dart_NewString("MyClass"));
+  Dart_Handle cls = Dart_GetClass(lib, NewString("MyClass"));
   EXPECT_VALID(cls);
 
   list = Dart_GetFunctionNames(cls);
@@ -5309,7 +5285,7 @@
 
   // Sort the list.
   args[0] = list;
-  EXPECT_VALID(Dart_Invoke(lib, Dart_NewString("sort"), kNumArgs, args));
+  EXPECT_VALID(Dart_Invoke(lib, NewString("sort"), kNumArgs, args));
 
   // Check list contents.
   list_string = Dart_ToString(list);
@@ -5342,8 +5318,8 @@
       "sort(list) => list.sort(_compare);\n";
 
   // Get the variables from a library.
-  Dart_Handle url = Dart_NewString("library_url");
-  Dart_Handle source = Dart_NewString(kLibraryChars);
+  Dart_Handle url = NewString("library_url");
+  Dart_Handle source = NewString(kLibraryChars);
   Dart_Handle lib = Dart_LoadLibrary(url, source);
   EXPECT_VALID(lib);
 
@@ -5355,7 +5331,7 @@
   const int kNumArgs = 1;
   Dart_Handle args[1];
   args[0] = list;
-  EXPECT_VALID(Dart_Invoke(lib, Dart_NewString("sort"), kNumArgs, args));
+  EXPECT_VALID(Dart_Invoke(lib, NewString("sort"), kNumArgs, args));
 
   // Check list contents.
   Dart_Handle list_string = Dart_ToString(list);
@@ -5365,7 +5341,7 @@
   EXPECT_STREQ("[A, _A]", list_cstr);
 
   // Get the variables from a class.
-  Dart_Handle cls = Dart_GetClass(lib, Dart_NewString("MyClass"));
+  Dart_Handle cls = Dart_GetClass(lib, NewString("MyClass"));
   EXPECT_VALID(cls);
 
   list = Dart_GetVariableNames(cls);
@@ -5374,7 +5350,7 @@
 
   // Sort the list.
   args[0] = list;
-  EXPECT_VALID(Dart_Invoke(lib, Dart_NewString("sort"), kNumArgs, args));
+  EXPECT_VALID(Dart_Invoke(lib, NewString("sort"), kNumArgs, args));
 
   // Check list contents.
   list_string = Dart_ToString(list);
@@ -5393,13 +5369,13 @@
   Dart_Handle error = Dart_Error("incoming error");
   Dart_Handle result;
 
-  Dart_Handle url = Dart_NewString("library1_url");
-  Dart_Handle source = Dart_NewString(kLibrary1Chars);
+  Dart_Handle url = NewString("library1_url");
+  Dart_Handle source = NewString(kLibrary1Chars);
   Dart_Handle lib1 = Dart_LoadLibrary(url, source);
   EXPECT_VALID(lib1);
 
-  url = Dart_NewString("library2_url");
-  source = Dart_NewString(kLibrary2Chars);
+  url = NewString("library2_url");
+  source = NewString(kLibrary2Chars);
   Dart_Handle lib2 = Dart_LoadLibrary(url, source);
   EXPECT_VALID(lib2);
 
@@ -5444,8 +5420,8 @@
   const char* kLibrary1Chars =
       "#library('library1_name');"
       "int bar() => 42;";
-  Dart_Handle url1 = Dart_NewString("library1_url");
-  Dart_Handle source1 = Dart_NewString(kLibrary1Chars);
+  Dart_Handle url1 = NewString("library1_url");
+  Dart_Handle source1 = NewString(kLibrary1Chars);
   Dart_Handle lib1 = Dart_LoadLibrary(url1, source1);
   EXPECT_VALID(lib1);
   EXPECT(Dart_IsLibrary(lib1));
@@ -5453,24 +5429,24 @@
   const char* kLibrary2Chars =
       "#library('library2_name');"
       "int foobar() => foo.bar();";
-  Dart_Handle url2 = Dart_NewString("library2_url");
-  Dart_Handle source2 = Dart_NewString(kLibrary2Chars);
+  Dart_Handle url2 = NewString("library2_url");
+  Dart_Handle source2 = NewString(kLibrary2Chars);
   Dart_Handle lib2 = Dart_LoadLibrary(url2, source2);
   EXPECT_VALID(lib2);
   EXPECT(Dart_IsLibrary(lib2));
 
-  Dart_Handle prefix = Dart_NewString("foo");
+  Dart_Handle prefix = NewString("foo");
   Dart_Handle result = Dart_LibraryImportLibrary(lib2, lib1, prefix);
   EXPECT_VALID(result);
 
   // Lib1 is imported under a library prefix and therefore 'foo' should
   // not be found directly in lib2.
-  Dart_Handle method_name = Dart_NewString("foo");
+  Dart_Handle method_name = NewString("foo");
   result = Dart_Invoke(lib2, method_name, 0, NULL);
   EXPECT_ERROR(result, "Dart_Invoke: did not find top-level function 'foo'");
 
   // Check that lib1 is available under the prefix in lib2.
-  method_name = Dart_NewString("foobar");
+  method_name = NewString("foobar");
   result = Dart_Invoke(lib2, method_name, 0, NULL);
   EXPECT_VALID(result);
   EXPECT(Dart_IsInteger(result));
@@ -5487,8 +5463,8 @@
   Dart_Handle error = Dart_Error("incoming error");
   Dart_Handle result;
 
-  Dart_Handle url = Dart_NewString("library1_url");
-  Dart_Handle source = Dart_NewString(kLibrary1Chars);
+  Dart_Handle url = NewString("library1_url");
+  Dart_Handle source = NewString(kLibrary1Chars);
 
   result = Dart_LoadLibrary(Dart_Null(), source);
   EXPECT(Dart_IsError(result));
@@ -5537,8 +5513,8 @@
   const char* kLibrary1Chars =
       "#library('library1_name');"
       ")";
-  Dart_Handle url = Dart_NewString("library1_url");
-  Dart_Handle source = Dart_NewString(kLibrary1Chars);
+  Dart_Handle url = NewString("library1_url");
+  Dart_Handle source = NewString(kLibrary1Chars);
   Dart_Handle result = Dart_LoadLibrary(url, source);
   EXPECT(Dart_IsError(result));
   EXPECT(strstr(Dart_GetError(result), "unexpected token ')'"));
@@ -5556,14 +5532,14 @@
   Dart_Handle result;
 
   // Load up a library.
-  Dart_Handle url = Dart_NewString("library1_url");
-  Dart_Handle source = Dart_NewString(kLibrary1Chars);
+  Dart_Handle url = NewString("library1_url");
+  Dart_Handle source = NewString(kLibrary1Chars);
   Dart_Handle lib = Dart_LoadLibrary(url, source);
   EXPECT_VALID(lib);
   EXPECT(Dart_IsLibrary(lib));
 
-  url = Dart_NewString("source_url");
-  source = Dart_NewString(kSourceChars);
+  url = NewString("source_url");
+  source = NewString(kSourceChars);
 
   result = Dart_LoadSource(Dart_Null(), url, source);
   EXPECT(Dart_IsError(result));
@@ -5622,7 +5598,7 @@
   EXPECT(Dart_IdentityEquals(lib, result));
 
   // Language errors are detected.
-  source = Dart_NewString(kBadSourceChars);
+  source = NewString(kBadSourceChars);
   result = Dart_LoadSource(lib, url, source);
   EXPECT(Dart_IsError(result));
 }
@@ -5638,17 +5614,17 @@
       "class NewClass extends OldClass{\n"
       "  bar() => 'bar';\n"
       "}\n";
-  Dart_Handle url = Dart_NewString("library1_url");
-  Dart_Handle source = Dart_NewString(kLibrary1Chars);
+  Dart_Handle url = NewString("library1_url");
+  Dart_Handle source = NewString(kLibrary1Chars);
   Dart_Handle lib = Dart_LoadLibrary(url, source);
   EXPECT_VALID(lib);
   EXPECT(Dart_IsLibrary(lib));
 
   // Call a dynamic function on OldClass.
-  Dart_Handle cls = Dart_GetClass(lib, Dart_NewString("OldClass"));
+  Dart_Handle cls = Dart_GetClass(lib, NewString("OldClass"));
   EXPECT_VALID(cls);
   Dart_Handle recv = Dart_New(cls, Dart_Null(), 0, NULL);
-  Dart_Handle result = Dart_Invoke(recv, Dart_NewString("foo"), 0, NULL);
+  Dart_Handle result = Dart_Invoke(recv, NewString("foo"), 0, NULL);
   EXPECT_VALID(result);
   EXPECT(Dart_IsString(result));
   const char* result_cstr = "";
@@ -5656,15 +5632,15 @@
   EXPECT_STREQ("foo", result_cstr);
 
   // Load a source file late.
-  url = Dart_NewString("source_url");
-  source = Dart_NewString(kSourceChars);
+  url = NewString("source_url");
+  source = NewString(kSourceChars);
   EXPECT_VALID(Dart_LoadSource(lib, url, source));
 
   // Call a dynamic function on NewClass in the updated library.
-  cls = Dart_GetClass(lib, Dart_NewString("NewClass"));
+  cls = Dart_GetClass(lib, NewString("NewClass"));
   EXPECT_VALID(cls);
   recv = Dart_New(cls, Dart_Null(), 0, NULL);
-  result = Dart_Invoke(recv, Dart_NewString("bar"), 0, NULL);
+  result = Dart_Invoke(recv, NewString("bar"), 0, NULL);
   EXPECT_VALID(result);
   EXPECT(Dart_IsString(result));
   result_cstr = "";
@@ -5682,25 +5658,25 @@
       "patch int foo() => 42;";
 
   // Load up a library.
-  Dart_Handle url = Dart_NewString("library1_url");
-  Dart_Handle source = Dart_NewString(kLibrary1Chars);
+  Dart_Handle url = NewString("library1_url");
+  Dart_Handle source = NewString(kLibrary1Chars);
   Dart_Handle lib = Dart_LoadLibrary(url, source);
   EXPECT_VALID(lib);
   EXPECT(Dart_IsLibrary(lib));
 
-  url = Dart_NewString("source_url");
-  source = Dart_NewString(kSourceChars);
+  url = NewString("source_url");
+  source = NewString(kSourceChars);
 
   Dart_Handle result = Dart_LoadSource(lib, url, source);
   EXPECT_VALID(result);
 
-  url = Dart_NewString("patch_url");
-  source = Dart_NewString(kPatchChars);
+  url = NewString("patch_url");
+  source = NewString(kPatchChars);
 
   result = Dart_LoadPatch(lib, url, source);
   EXPECT_VALID(result);
 
-  result = Dart_Invoke(lib, Dart_NewString("foo"), 0, NULL);
+  result = Dart_Invoke(lib, NewString("foo"), 0, NULL);
   EXPECT_VALID(result);
   EXPECT(Dart_IsInteger(result));
   int64_t value = 0;
@@ -5789,8 +5765,8 @@
   Dart_Handle result = Dart_SetLibraryTagHandler(library_handler);
   EXPECT_VALID(result);
 
-  Dart_Handle url = Dart_NewString("theLibrary");
-  Dart_Handle source = Dart_NewString(kLibraryChars);
+  Dart_Handle url = NewString("theLibrary");
+  Dart_Handle source = NewString(kLibraryChars);
   result = Dart_LoadLibrary(url, source);
   EXPECT_VALID(result);
 
@@ -5809,8 +5785,8 @@
   result = Dart_SetNativeResolver(result, &PatchNativeResolver);
   EXPECT_VALID(result);
 
-  Dart_Handle script_url = Dart_NewString("theScript");
-  source = Dart_NewString(kScriptChars);
+  Dart_Handle script_url = NewString("theScript");
+  source = NewString(kScriptChars);
   Dart_Handle test_script = Dart_LoadScript(script_url, source);
   EXPECT_VALID(test_script);
 
@@ -5818,43 +5794,43 @@
   result = Dart_CompileAll();
   EXPECT_VALID(result);
 
-  result = Dart_Invoke(test_script, Dart_NewString("e1"), 0, NULL);
+  result = Dart_Invoke(test_script, NewString("e1"), 0, NULL);
   EXPECT_ERROR(result, "No such method: 'unpatched'");
 
   int64_t value = 0;
-  result = Dart_Invoke(test_script, Dart_NewString("m1"), 0, NULL);
+  result = Dart_Invoke(test_script, NewString("m1"), 0, NULL);
   EXPECT_VALID(result);
   EXPECT(Dart_IsInteger(result));
   EXPECT_VALID(Dart_IntegerToInt64(result, &value));
   EXPECT_EQ(4, value);
 
   value = 0;
-  result = Dart_Invoke(test_script, Dart_NewString("m2"), 0, NULL);
+  result = Dart_Invoke(test_script, NewString("m2"), 0, NULL);
   EXPECT_VALID(result);
   EXPECT(Dart_IsInteger(result));
   EXPECT_VALID(Dart_IntegerToInt64(result, &value));
   EXPECT_EQ(40, value);
 
   value = 0;
-  result = Dart_Invoke(test_script, Dart_NewString("m3"), 0, NULL);
+  result = Dart_Invoke(test_script, NewString("m3"), 0, NULL);
   EXPECT_VALID(result);
   EXPECT(Dart_IsInteger(result));
   EXPECT_VALID(Dart_IntegerToInt64(result, &value));
   EXPECT_EQ(21, value);
 
   value = 0;
-  result = Dart_Invoke(test_script, Dart_NewString("m4"), 0, NULL);
+  result = Dart_Invoke(test_script, NewString("m4"), 0, NULL);
   EXPECT_VALID(result);
   EXPECT(Dart_IsInteger(result));
   EXPECT_VALID(Dart_IntegerToInt64(result, &value));
   EXPECT_EQ(-25, value);
 
-  result = Dart_Invoke(test_script, Dart_NewString("m5"), 0, NULL);
+  result = Dart_Invoke(test_script, NewString("m5"), 0, NULL);
   EXPECT_VALID(result);
   EXPECT(Dart_IsNull(result));
 
   value = 0;
-  result = Dart_Invoke(test_script, Dart_NewString("m6"), 0, NULL);
+  result = Dart_Invoke(test_script, NewString("m6"), 0, NULL);
   EXPECT_VALID(result);
   EXPECT(Dart_IsInteger(result));
   EXPECT_VALID(Dart_IntegerToInt64(result, &value));
@@ -5899,14 +5875,14 @@
   Dart_Handle result;
 
   // Load a test script.
-  Dart_Handle url = Dart_NewString(TestCase::url());
-  Dart_Handle source = Dart_NewString(kScriptChars);
+  Dart_Handle url = NewString(TestCase::url());
+  Dart_Handle source = NewString(kScriptChars);
   result = Dart_SetLibraryTagHandler(library_handler);
   EXPECT_VALID(result);
   Dart_Handle lib = Dart_LoadScript(url, source);
   EXPECT_VALID(lib);
   EXPECT(Dart_IsLibrary(lib));
-  Dart_Handle cls = Dart_GetClass(lib, Dart_NewString("Test"));
+  Dart_Handle cls = Dart_GetClass(lib, NewString("Test"));
   EXPECT_VALID(cls);
 
   result = Dart_SetNativeResolver(Dart_Null(), &MyNativeResolver1);
@@ -5929,7 +5905,7 @@
   EXPECT_VALID(result);
 
   // Call a function and make sure native resolution works.
-  result = Dart_Invoke(cls, Dart_NewString("foo"), 0, NULL);
+  result = Dart_Invoke(cls, NewString("foo"), 0, NULL);
   EXPECT_VALID(result);
   EXPECT(Dart_IsInteger(result));
   int64_t value = 0;
@@ -5941,7 +5917,7 @@
   EXPECT_VALID(result);
 
   // 'foo' has already been resolved so gets the old value.
-  result = Dart_Invoke(cls, Dart_NewString("foo"), 0, NULL);
+  result = Dart_Invoke(cls, NewString("foo"), 0, NULL);
   EXPECT_VALID(result);
   EXPECT(Dart_IsInteger(result));
   value = 0;
@@ -5949,7 +5925,7 @@
   EXPECT_EQ(654321, value);
 
   // 'bar' has not yet been resolved so gets the new value.
-  result = Dart_Invoke(cls, Dart_NewString("bar"), 0, NULL);
+  result = Dart_Invoke(cls, NewString("bar"), 0, NULL);
   EXPECT_VALID(result);
   EXPECT(Dart_IsInteger(result));
   value = 0;
@@ -5960,7 +5936,7 @@
   result = Dart_SetNativeResolver(lib, NULL);
   EXPECT_VALID(result);
 
-  EXPECT_ERROR(Dart_Invoke(cls, Dart_NewString("baz"), 0, NULL),
+  EXPECT_ERROR(Dart_Invoke(cls, NewString("baz"), 0, NULL),
                "native function 'SomeNativeFunction3' cannot be found");
 }
 
@@ -5982,21 +5958,21 @@
       "var foo;\n";
   Dart_Handle result;
   // Create a test library and Load up a test script in it.
-  Dart_Handle url = Dart_NewString(TestCase::url());
-  Dart_Handle source = Dart_NewString(kScriptChars);
+  Dart_Handle url = NewString(TestCase::url());
+  Dart_Handle source = NewString(kScriptChars);
   result = Dart_SetLibraryTagHandler(library_handler);
   EXPECT_VALID(result);
   result = Dart_LoadScript(url, source);
 
-  url = Dart_NewString("library1.dart");
-  source = Dart_NewString(kLibrary1Chars);
+  url = NewString("library1.dart");
+  source = NewString(kLibrary1Chars);
   Dart_LoadLibrary(url, source);
 
-  url = Dart_NewString("library2.dart");
-  source = Dart_NewString(kLibrary2Chars);
+  url = NewString("library2.dart");
+  source = NewString(kLibrary2Chars);
   Dart_LoadLibrary(url, source);
 
-  result = Dart_Invoke(result, Dart_NewString("main"), 0, NULL);
+  result = Dart_Invoke(result, NewString("main"), 0, NULL);
   EXPECT_VALID(result);
 }
 
@@ -6018,22 +5994,22 @@
   Dart_Handle result;
 
   // Create a test library and Load up a test script in it.
-  Dart_Handle url = Dart_NewString(TestCase::url());
-  Dart_Handle source = Dart_NewString(kScriptChars);
+  Dart_Handle url = NewString(TestCase::url());
+  Dart_Handle source = NewString(kScriptChars);
   result = Dart_SetLibraryTagHandler(library_handler);
   EXPECT_VALID(result);
   result = Dart_LoadScript(url, source);
   EXPECT_VALID(result);
 
-  url = Dart_NewString("library2.dart");
-  source = Dart_NewString(kLibrary2Chars);
+  url = NewString("library2.dart");
+  source = NewString(kLibrary2Chars);
   Dart_LoadLibrary(url, source);
 
-  url = Dart_NewString("library1.dart");
-  source = Dart_NewString(kLibrary1Chars);
+  url = NewString("library1.dart");
+  source = NewString(kLibrary1Chars);
   Dart_LoadLibrary(url, source);
 
-  result = Dart_Invoke(result, Dart_NewString("main"), 0, NULL);
+  result = Dart_Invoke(result, NewString("main"), 0, NULL);
   EXPECT(Dart_IsError(result));
   EXPECT_SUBSTRING("ambiguous reference: 'foo'", Dart_GetError(result));
 }
@@ -6055,22 +6031,22 @@
   Dart_Handle result;
 
   // Create a test library and Load up a test script in it.
-  Dart_Handle url = Dart_NewString(TestCase::url());
-  Dart_Handle source = Dart_NewString(kScriptChars);
+  Dart_Handle url = NewString(TestCase::url());
+  Dart_Handle source = NewString(kScriptChars);
   result = Dart_SetLibraryTagHandler(library_handler);
   EXPECT_VALID(result);
   result = Dart_LoadScript(url, source);
   EXPECT_VALID(result);
 
-  url = Dart_NewString("library2.dart");
-  source = Dart_NewString(kLibrary2Chars);
+  url = NewString("library2.dart");
+  source = NewString(kLibrary2Chars);
   Dart_LoadLibrary(url, source);
 
-  url = Dart_NewString("library1.dart");
-  source = Dart_NewString(kLibrary1Chars);
+  url = NewString("library1.dart");
+  source = NewString(kLibrary1Chars);
   Dart_LoadLibrary(url, source);
 
-  result = Dart_Invoke(result, Dart_NewString("main"), 0, NULL);
+  result = Dart_Invoke(result, NewString("main"), 0, NULL);
   EXPECT_VALID(result);
 }
 
@@ -6090,17 +6066,17 @@
   Dart_Handle result;
 
   // Create a test library and Load up a test script in it.
-  Dart_Handle url = Dart_NewString(TestCase::url());
-  Dart_Handle source = Dart_NewString(kScriptChars);
+  Dart_Handle url = NewString(TestCase::url());
+  Dart_Handle source = NewString(kScriptChars);
   result = Dart_SetLibraryTagHandler(library_handler);
   EXPECT_VALID(result);
   result = Dart_LoadScript(url, source);
 
-  url = Dart_NewString("lib.dart");
-  source = Dart_NewString(kLibraryChars);
+  url = NewString("lib.dart");
+  source = NewString(kLibraryChars);
   Dart_LoadLibrary(url, source);
 
-  result = Dart_Invoke(result, Dart_NewString("main"), 0, NULL);
+  result = Dart_Invoke(result, NewString("main"), 0, NULL);
   EXPECT_VALID(result);
 }
 
@@ -6170,7 +6146,7 @@
   Dart_Handle dart_args[1];
   dart_args[0] = send_port1;
   Dart_Handle result =
-      Dart_Invoke(lib, Dart_NewString("callPort"), 1, dart_args);
+      Dart_Invoke(lib, NewString("callPort"), 1, dart_args);
   EXPECT_VALID(result);
   result = Dart_RunLoop();
   EXPECT(Dart_IsError(result));
@@ -6179,7 +6155,7 @@
 
   // result second port.
   dart_args[0] = send_port2;
-  result = Dart_Invoke(lib, Dart_NewString("callPort"), 1, dart_args);
+  result = Dart_Invoke(lib, NewString("callPort"), 1, dart_args);
   EXPECT_VALID(result);
   result = Dart_RunLoop();
   EXPECT(Dart_IsError(result));
@@ -6226,8 +6202,8 @@
   Dart_Isolate isolate = TestCase::CreateTestIsolate();
   ASSERT(isolate != NULL);
   Dart_EnterScope();
-  Dart_Handle url = Dart_NewString(TestCase::url());
-  Dart_Handle source = Dart_NewString(kScriptChars);
+  Dart_Handle url = NewString(TestCase::url());
+  Dart_Handle source = NewString(kScriptChars);
   Dart_Handle result = Dart_SetLibraryTagHandler(TestCase::library_handler);
   EXPECT_VALID(result);
   Dart_Handle lib = Dart_LoadScript(url, source);
@@ -6245,14 +6221,14 @@
   RunLoopTestCallback(NULL, NULL, NULL, NULL);
 
   Dart_EnterScope();
-  Dart_Handle lib = Dart_LookupLibrary(Dart_NewString(TestCase::url()));
+  Dart_Handle lib = Dart_LookupLibrary(NewString(TestCase::url()));
   EXPECT_VALID(lib);
 
   Dart_Handle result;
   Dart_Handle args[2];
   args[0] = (throw_exception_child ? Dart_True() : Dart_False());
   args[1] = (throw_exception_parent ? Dart_True() : Dart_False());
-  result = Dart_Invoke(lib, Dart_NewString("main"), 2, args);
+  result = Dart_Invoke(lib, NewString("main"), 2, args);
   EXPECT_VALID(result);
   result = Dart_RunLoop();
   if (throw_exception_parent) {
@@ -6329,8 +6305,8 @@
     shared_isolate = Dart_CreateIsolate(NULL, NULL, NULL, NULL, &error);
     EXPECT(shared_isolate != NULL);
     Dart_EnterScope();
-    Dart_Handle url = Dart_NewString(TestCase::url());
-    Dart_Handle source = Dart_NewString(kScriptChars);
+    Dart_Handle url = NewString(TestCase::url());
+    Dart_Handle source = NewString(kScriptChars);
     Dart_Handle result = Dart_SetLibraryTagHandler(TestCase::library_handler);
     EXPECT_VALID(result);
     lib = Dart_LoadScript(url, source);
@@ -6342,7 +6318,7 @@
     sync->Exit();
   }
 
-  Dart_Handle result = Dart_Invoke(lib, Dart_NewString("main"), 0, NULL);
+  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
   EXPECT(Dart_IsError(result));
   EXPECT(Dart_ErrorHasException(result));
   EXPECT_SUBSTRING("Unhandled exception:\nfoo\n",
@@ -6374,9 +6350,9 @@
   }
   if (interrupt_count == kInterruptCount) {
     Dart_EnterScope();
-    Dart_Handle lib = Dart_LookupLibrary(Dart_NewString(TestCase::url()));
+    Dart_Handle lib = Dart_LookupLibrary(NewString(TestCase::url()));
     EXPECT_VALID(lib);
-    Dart_Handle exc = Dart_NewString("foo");
+    Dart_Handle exc = NewString("foo");
     EXPECT_VALID(exc);
     Dart_Handle result = Dart_ThrowException(exc);
     EXPECT_VALID(result);
@@ -6597,8 +6573,8 @@
   Dart_Handle result;
 
   // Load a test script.
-  Dart_Handle url = Dart_NewString(TestCase::url());
-  Dart_Handle source = Dart_NewString(kScriptChars);
+  Dart_Handle url = NewString(TestCase::url());
+  Dart_Handle source = NewString(kScriptChars);
   result = Dart_SetLibraryTagHandler(library_handler);
   EXPECT_VALID(result);
   Dart_Handle lib = Dart_LoadScript(url, source);
@@ -6607,7 +6583,7 @@
   result = Dart_SetNativeResolver(lib, &MyNativeClosureResolver);
   EXPECT_VALID(result);
 
-  result = Dart_Invoke(lib, Dart_NewString("testMain"), 0, NULL);
+  result = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
   EXPECT_VALID(result);
   EXPECT(Dart_IsInteger(result));
   int64_t value = 0;
@@ -6735,8 +6711,8 @@
   Dart_Handle result;
 
   // Load a test script.
-  Dart_Handle url = Dart_NewString(TestCase::url());
-  Dart_Handle source = Dart_NewString(kScriptChars);
+  Dart_Handle url = NewString(TestCase::url());
+  Dart_Handle source = NewString(kScriptChars);
   result = Dart_SetLibraryTagHandler(library_handler);
   EXPECT_VALID(result);
   Dart_Handle lib = Dart_LoadScript(url, source);
@@ -6745,7 +6721,7 @@
   result = Dart_SetNativeResolver(lib, &MyStaticNativeClosureResolver);
   EXPECT_VALID(result);
 
-  result = Dart_Invoke(lib, Dart_NewString("testMain"), 0, NULL);
+  result = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
   EXPECT_VALID(result);
   EXPECT(Dart_IsInteger(result));
   int64_t value = 0;
@@ -6763,37 +6739,37 @@
                "expects argument 'length' to be in the range");
   EXPECT_ERROR(Dart_NewList(Array::kMaxElements+1),
                "expects argument 'length' to be in the range");
-  EXPECT_ERROR(Dart_NewString8(chars8, -1),
+  EXPECT_ERROR(Dart_NewStringFromUTF8(chars8, -1),
                "expects argument 'length' to be in the range");
-  EXPECT_ERROR(Dart_NewString8(chars8, OneByteString::kMaxElements+1),
+  EXPECT_ERROR(Dart_NewStringFromUTF8(chars8, OneByteString::kMaxElements+1),
                "expects argument 'length' to be in the range");
-  EXPECT_ERROR(Dart_NewString16(chars16, -1),
+  EXPECT_ERROR(Dart_NewStringFromUTF16(chars16, -1),
                "expects argument 'length' to be in the range");
-  EXPECT_ERROR(Dart_NewString16(chars16, TwoByteString::kMaxElements+1),
+  EXPECT_ERROR(Dart_NewStringFromUTF16(chars16, TwoByteString::kMaxElements+1),
                "expects argument 'length' to be in the range");
-  EXPECT_ERROR(Dart_NewString32(chars32, -1),
+  EXPECT_ERROR(Dart_NewStringFromUTF32(chars32, -1),
                "expects argument 'length' to be in the range");
-  EXPECT_ERROR(Dart_NewString32(chars32, FourByteString::kMaxElements+1),
+  EXPECT_ERROR(Dart_NewStringFromUTF32(chars32, TwoByteString::kMaxElements+1),
                "expects argument 'length' to be in the range");
 }
 
 
 TEST_CASE(NewString_Null) {
-  Dart_Handle str = Dart_NewString8(NULL, 0);
+  Dart_Handle str = Dart_NewStringFromUTF8(NULL, 0);
   EXPECT_VALID(str);
   EXPECT(Dart_IsString(str));
   intptr_t len = -1;
   EXPECT_VALID(Dart_StringLength(str, &len));
   EXPECT_EQ(0, len);
 
-  str = Dart_NewString16(NULL, 0);
+  str = Dart_NewStringFromUTF16(NULL, 0);
   EXPECT_VALID(str);
   EXPECT(Dart_IsString(str));
   len = -1;
   EXPECT_VALID(Dart_StringLength(str, &len));
   EXPECT_EQ(0, len);
 
-  str = Dart_NewString32(NULL, 0);
+  str = Dart_NewStringFromUTF32(NULL, 0);
   EXPECT_VALID(str);
   EXPECT(Dart_IsString(str));
   len = -1;
@@ -6839,7 +6815,7 @@
 // by one.
 TEST_CASE(OneNewSpacePeer) {
   Isolate* isolate = Isolate::Current();
-  Dart_Handle str = Dart_NewString("a string");
+  Dart_Handle str = NewString("a string");
   EXPECT_VALID(str);
   EXPECT(Dart_IsString(str));
   EXPECT_EQ(0, isolate->heap()->PeerCount());
@@ -6868,7 +6844,7 @@
   Dart_EnterScope();
   {
     DARTSCOPE_NOCHECKS(isolate);
-    Dart_Handle str = Dart_NewString("a string");
+    Dart_Handle str = NewString("a string");
     EXPECT_VALID(str);
     EXPECT(Dart_IsString(str));
     EXPECT_EQ(0, isolate->heap()->PeerCount());
@@ -6898,7 +6874,7 @@
 // by two.
 TEST_CASE(TwoNewSpacePeers) {
   Isolate* isolate = Isolate::Current();
-  Dart_Handle s1 = Dart_NewString("s1");
+  Dart_Handle s1 = NewString("s1");
   EXPECT_VALID(s1);
   EXPECT(Dart_IsString(s1));
   void* o1 = &o1;
@@ -6910,7 +6886,7 @@
   EXPECT_EQ(1, isolate->heap()->PeerCount());
   EXPECT_VALID(Dart_GetPeer(s1, &o1));
   EXPECT(o1 == reinterpret_cast<void*>(&p1));
-  Dart_Handle s2 = Dart_NewString("a string");
+  Dart_Handle s2 = NewString("a string");
   EXPECT_VALID(s2);
   EXPECT(Dart_IsString(s2));
   EXPECT_EQ(1, isolate->heap()->PeerCount());
@@ -6941,7 +6917,7 @@
   Dart_EnterScope();
   {
     DARTSCOPE_NOCHECKS(isolate);
-    Dart_Handle s1 = Dart_NewString("s1");
+    Dart_Handle s1 = NewString("s1");
     EXPECT_VALID(s1);
     EXPECT(Dart_IsString(s1));
     EXPECT_EQ(0, isolate->heap()->PeerCount());
@@ -6953,7 +6929,7 @@
     EXPECT_EQ(1, isolate->heap()->PeerCount());
     EXPECT_VALID(Dart_GetPeer(s1, &o1));
     EXPECT(o1 == reinterpret_cast<void*>(&p1));
-    Dart_Handle s2 = Dart_NewString("s2");
+    Dart_Handle s2 = NewString("s2");
     EXPECT_VALID(s2);
     EXPECT(Dart_IsString(s2));
     EXPECT_EQ(1, isolate->heap()->PeerCount());
@@ -6979,7 +6955,7 @@
   Isolate* isolate = Isolate::Current();
   Dart_Handle s[kPeerCount];
   for (int i = 0; i < kPeerCount; ++i) {
-    s[i] = Dart_NewString("a string");
+    s[i] = NewString("a string");
     EXPECT_VALID(s[i]);
     EXPECT(Dart_IsString(s[i]));
     void* o = &o;
@@ -7008,7 +6984,7 @@
 // of peer objects is decremented by one.
 TEST_CASE(OnePromotedPeer) {
   Isolate* isolate = Isolate::Current();
-  Dart_Handle str = Dart_NewString("a string");
+  Dart_Handle str = NewString("a string");
   EXPECT_VALID(str);
   EXPECT(Dart_IsString(str));
   EXPECT_EQ(0, isolate->heap()->PeerCount());
diff --git a/runtime/vm/dart_api_message.cc b/runtime/vm/dart_api_message.cc
index 9c12280..7541536 100644
--- a/runtime/vm/dart_api_message.cc
+++ b/runtime/vm/dart_api_message.cc
@@ -358,9 +358,6 @@
     case kTwoByteStringCid:
       // Two byte strings not supported.
       return AllocateDartCObjectUnsupported();
-    case kFourByteStringCid:
-      // Four byte strings not supported.
-      return AllocateDartCObjectUnsupported();
     case kUint8ArrayCid: {
       intptr_t len = ReadSmiValue();
       Dart_CObject* object = AllocateDartCObjectUint8Array(len);
diff --git a/runtime/vm/debugger_api_impl_test.cc b/runtime/vm/debugger_api_impl_test.cc
index 3a3a366..4bf3e9c 100644
--- a/runtime/vm/debugger_api_impl_test.cc
+++ b/runtime/vm/debugger_api_impl_test.cc
@@ -31,8 +31,8 @@
   ASSERT(Dart_IsLibrary(script_lib));
   Dart_Breakpoint bpt;
   Dart_Handle res = Dart_SetBreakpointAtEntry(script_lib,
-                        Dart_NewString(cname),
-                        Dart_NewString(fname),
+                        NewString(cname),
+                        NewString(fname),
                         &bpt);
   EXPECT_VALID(res);
 }
@@ -42,7 +42,7 @@
   ASSERT(script_lib != NULL);
   ASSERT(!Dart_IsError(script_lib));
   ASSERT(Dart_IsLibrary(script_lib));
-  return Dart_Invoke(script_lib, Dart_NewString(func_name), 0, NULL);
+  return Dart_Invoke(script_lib, NewString(func_name), 0, NULL);
 }
 
 
@@ -632,9 +632,9 @@
                                          Dart_StackTrace trace) {
   static const char* expected_trace[] = {"add", "main"};
   Dart_Handle add_locals = Dart_NewList(4);
-  Dart_ListSetAt(add_locals, 0, Dart_NewString("a"));
+  Dart_ListSetAt(add_locals, 0, NewString("a"));
   Dart_ListSetAt(add_locals, 1, Dart_NewInteger(10));
-  Dart_ListSetAt(add_locals, 2, Dart_NewString("b"));
+  Dart_ListSetAt(add_locals, 2, NewString("b"));
   Dart_ListSetAt(add_locals, 3, Dart_NewInteger(20));
   Dart_Handle expected_locals[] = {add_locals, Dart_Null()};
   breakpoint_hit_counter++;
@@ -657,7 +657,7 @@
   LoadScript(kScriptChars);
   Dart_SetBreakpointHandler(&ExprClosureBreakpointHandler);
 
-  Dart_Handle script_url = Dart_NewString(TestCase::url());
+  Dart_Handle script_url = NewString(TestCase::url());
   intptr_t line_no = 5;  // In closure 'add'.
   Dart_Handle res = Dart_SetBreakpoint(script_url, line_no);
   EXPECT_VALID(res);
@@ -723,7 +723,7 @@
 
   LoadScript(kScriptChars);
 
-  Dart_Handle script_url = Dart_NewString(TestCase::url());
+  Dart_Handle script_url = NewString(TestCase::url());
   intptr_t line_no = 4;  // In function 'foo'.
 
   Dart_SetBreakpointHandler(&DeleteBreakpointHandler);
@@ -751,7 +751,7 @@
   ASSERT(script_lib != NULL);
   ASSERT(!Dart_IsError(script_lib));
   ASSERT(Dart_IsLibrary(script_lib));
-  Dart_Handle class_A = Dart_GetClass(script_lib, Dart_NewString("A"));
+  Dart_Handle class_A = Dart_GetClass(script_lib, NewString("A"));
   EXPECT_VALID(class_A);
 
   const int expected_num_fields = 2;
@@ -1015,7 +1015,7 @@
     }
   }
 
-  Dart_Handle lib_url = Dart_NewString(TestCase::url());
+  Dart_Handle lib_url = NewString(TestCase::url());
   Dart_Handle source = Dart_GetScriptSource(lib_url, lib_url);
   EXPECT(Dart_IsString(source));
   char const* source_chars;
@@ -1040,8 +1040,8 @@
   EXPECT_NOTSUBSTRING(TestCase::url(), list_cstr);
 
   // Load a script.
-  Dart_Handle url = Dart_NewString(TestCase::url());
-  Dart_Handle source = Dart_NewString(kScriptChars);
+  Dart_Handle url = NewString(TestCase::url());
+  Dart_Handle source = NewString(kScriptChars);
   EXPECT_VALID(Dart_LoadScript(url, source));
 
   lib_list = Dart_GetLibraryURLs();
diff --git a/runtime/vm/deopt_instructions.cc b/runtime/vm/deopt_instructions.cc
index bb15671..9442a46 100644
--- a/runtime/vm/deopt_instructions.cc
+++ b/runtime/vm/deopt_instructions.cc
@@ -11,6 +11,9 @@
 
 namespace dart {
 
+DEFINE_FLAG(bool, compress_deopt_info, true,
+            "Compress the size of the deoptimization info for optimized code.");
+
 DeoptimizationContext::DeoptimizationContext(intptr_t* to_frame_start,
                                              intptr_t to_frame_size,
                                              const Array& object_table,
@@ -61,7 +64,7 @@
   }
 
   virtual intptr_t from_index() const { return stack_slot_index_; }
-  virtual DeoptInstr::Kind kind() const { return kCopyStackSlot; }
+  virtual DeoptInstr::Kind kind() const { return kStackSlot; }
 
   virtual const char* ToCString() const {
     const char* format = "s%"Pd"";
@@ -94,7 +97,7 @@
   }
 
   virtual intptr_t from_index() const { return stack_slot_index_; }
-  virtual DeoptInstr::Kind kind() const { return kCopyDoubleStackSlot; }
+  virtual DeoptInstr::Kind kind() const { return kDoubleStackSlot; }
 
   virtual const char* ToCString() const {
     const char* format = "ds%"Pd"";
@@ -130,7 +133,7 @@
   }
 
   virtual intptr_t from_index() const { return stack_slot_index_; }
-  virtual DeoptInstr::Kind kind() const { return kCopyInt64StackSlot; }
+  virtual DeoptInstr::Kind kind() const { return kInt64StackSlot; }
 
   virtual const char* ToCString() const {
     const char* format = "ms%"Pd"";
@@ -166,15 +169,15 @@
 // Deoptimization instruction creating return address using function and
 // deopt-id stored at 'object_table_index'. Uses the deopt-after
 // continuation point.
-class DeoptRetAddrAfterInstr : public DeoptInstr {
+class DeoptRetAfterAddressInstr : public DeoptInstr {
  public:
-  DeoptRetAddrAfterInstr(intptr_t object_table_index, intptr_t deopt_id)
+  DeoptRetAfterAddressInstr(intptr_t object_table_index, intptr_t deopt_id)
       : object_table_index_(object_table_index), deopt_id_(deopt_id) {
     ASSERT(object_table_index >= 0);
     ASSERT(deopt_id >= 0);
   }
 
-  explicit DeoptRetAddrAfterInstr(intptr_t from_index)
+  explicit DeoptRetAfterAddressInstr(intptr_t from_index)
       : object_table_index_(ObjectTableIndex::decode(from_index)),
         deopt_id_(DeoptId::decode(from_index)) {
   }
@@ -183,7 +186,7 @@
     return ObjectTableIndex::encode(object_table_index_) |
         DeoptId::encode(deopt_id_);
   }
-  virtual DeoptInstr::Kind kind() const { return kSetRetAfterAddress; }
+  virtual DeoptInstr::Kind kind() const { return kRetAfterAddress; }
 
   virtual const char* ToCString() const {
     const char* format = "ret aft oti:%"Pd"(%"Pd")";
@@ -211,22 +214,22 @@
   const intptr_t object_table_index_;
   const intptr_t deopt_id_;
 
-  DISALLOW_COPY_AND_ASSIGN(DeoptRetAddrAfterInstr);
+  DISALLOW_COPY_AND_ASSIGN(DeoptRetAfterAddressInstr);
 };
 
 
 // Deoptimization instruction creating return address using function and
 // deopt-id stored at 'object_table_index'. Uses the deopt-before
 // continuation point.
-class DeoptRetAddrBeforeInstr : public DeoptInstr {
+class DeoptRetBeforeAddressInstr : public DeoptInstr {
  public:
-  DeoptRetAddrBeforeInstr(intptr_t object_table_index, intptr_t deopt_id)
+  DeoptRetBeforeAddressInstr(intptr_t object_table_index, intptr_t deopt_id)
       : object_table_index_(object_table_index), deopt_id_(deopt_id) {
     ASSERT(object_table_index >= 0);
-    ASSERT(deopt_id_ >= 0);
+    ASSERT(deopt_id >= 0);
   }
 
-  explicit DeoptRetAddrBeforeInstr(intptr_t from_index)
+  explicit DeoptRetBeforeAddressInstr(intptr_t from_index)
       : object_table_index_(ObjectTableIndex::decode(from_index)),
         deopt_id_(DeoptId::decode(from_index)) {
   }
@@ -235,7 +238,7 @@
     return ObjectTableIndex::encode(object_table_index_) |
         DeoptId::encode(deopt_id_);
   }
-  virtual DeoptInstr::Kind kind() const { return kSetRetBeforeAddress; }
+  virtual DeoptInstr::Kind kind() const { return kRetBeforeAddress; }
 
   virtual const char* ToCString() const {
     const char* format = "ret bef oti:%"Pd"(%"Pd")";
@@ -263,7 +266,7 @@
   const intptr_t object_table_index_;
   const intptr_t deopt_id_;
 
-  DISALLOW_COPY_AND_ASSIGN(DeoptRetAddrBeforeInstr);
+  DISALLOW_COPY_AND_ASSIGN(DeoptRetBeforeAddressInstr);
 };
 
 
@@ -276,7 +279,7 @@
   }
 
   virtual intptr_t from_index() const { return object_table_index_; }
-  virtual DeoptInstr::Kind kind() const { return kCopyConstant; }
+  virtual DeoptInstr::Kind kind() const { return kConstant; }
 
   virtual const char* ToCString() const {
     const char* format = "const oti:%"Pd"";
@@ -308,7 +311,7 @@
       : reg_(static_cast<Register>(reg_as_int)) {}
 
   virtual intptr_t from_index() const { return static_cast<intptr_t>(reg_); }
-  virtual DeoptInstr::Kind kind() const { return kCopyRegister; }
+  virtual DeoptInstr::Kind kind() const { return kRegister; }
 
   virtual const char* ToCString() const {
     return Assembler::RegisterName(reg_);
@@ -334,7 +337,7 @@
       : reg_(static_cast<XmmRegister>(reg_as_int)) {}
 
   virtual intptr_t from_index() const { return static_cast<intptr_t>(reg_); }
-  virtual DeoptInstr::Kind kind() const { return kCopyXmmRegister; }
+  virtual DeoptInstr::Kind kind() const { return kXmmRegister; }
 
   virtual const char* ToCString() const {
     return Assembler::XmmRegisterName(reg_);
@@ -361,7 +364,7 @@
       : reg_(static_cast<XmmRegister>(reg_as_int)) {}
 
   virtual intptr_t from_index() const { return static_cast<intptr_t>(reg_); }
-  virtual DeoptInstr::Kind kind() const { return kCopyInt64XmmRegister; }
+  virtual DeoptInstr::Kind kind() const { return kInt64XmmRegister; }
 
   virtual const char* ToCString() const {
     const char* format = "%s(m)";
@@ -402,7 +405,7 @@
   }
 
   virtual intptr_t from_index() const { return object_table_index_; }
-  virtual DeoptInstr::Kind kind() const { return kSetPcMarker; }
+  virtual DeoptInstr::Kind kind() const { return kPcMarker; }
 
   virtual const char* ToCString() const {
     const char* format = "pcmark oti:%"Pd"";
@@ -444,7 +447,7 @@
   DeoptCallerFpInstr() {}
 
   virtual intptr_t from_index() const { return 0; }
-  virtual DeoptInstr::Kind kind() const { return kSetCallerFp; }
+  virtual DeoptInstr::Kind kind() const { return kCallerFp; }
 
   virtual const char* ToCString() const {
     return "callerfp";
@@ -469,7 +472,7 @@
   DeoptCallerPcInstr() {}
 
   virtual intptr_t from_index() const { return 0; }
-  virtual DeoptInstr::Kind kind() const { return kSetCallerPc; }
+  virtual DeoptInstr::Kind kind() const { return kCallerPc; }
 
   virtual const char* ToCString() const {
     return "callerpc";
@@ -486,28 +489,128 @@
 };
 
 
+// Deoptimization instruction that indicates the rest of this DeoptInfo is a
+// suffix of another one.  The suffix contains the info number (0 based
+// index in the deopt table of the DeoptInfo to share) and the length of the
+// suffix.
+class DeoptSuffixInstr : public DeoptInstr {
+ public:
+  DeoptSuffixInstr(intptr_t info_number, intptr_t suffix_length)
+      : info_number_(info_number), suffix_length_(suffix_length) {
+    ASSERT(info_number >= 0);
+    ASSERT(suffix_length >= 0);
+  }
+
+  explicit DeoptSuffixInstr(intptr_t from_index)
+      : info_number_(InfoNumber::decode(from_index)),
+        suffix_length_(SuffixLength::decode(from_index)) {
+  }
+
+  virtual intptr_t from_index() const {
+    return InfoNumber::encode(info_number_) |
+        SuffixLength::encode(suffix_length_);
+  }
+  virtual DeoptInstr::Kind kind() const { return kSuffix; }
+
+  virtual const char* ToCString() const {
+    const char* format = "suffix %"Pd":%"Pd;
+    intptr_t len = OS::SNPrint(NULL, 0, format, info_number_, suffix_length_);
+    char* chars = Isolate::Current()->current_zone()->Alloc<char>(len + 1);
+    OS::SNPrint(chars, len + 1, format, info_number_, suffix_length_);
+    return chars;
+  }
+
+  void Execute(DeoptimizationContext* deopt_context, intptr_t to_index) {
+    // The deoptimization info is uncompresses by translating away suffixes
+    // before executing the instructions.
+    UNREACHABLE();
+  }
+
+ private:
+  // Static decoder functions in DeoptInstr have access to the bitfield
+  // definitions.
+  friend class DeoptInstr;
+
+  static const intptr_t kFieldWidth = kBitsPerWord / 2;
+  class InfoNumber : public BitField<intptr_t, 0, kFieldWidth> { };
+  class SuffixLength : public BitField<intptr_t, kFieldWidth, kFieldWidth> { };
+
+  const intptr_t info_number_;
+  const intptr_t suffix_length_;
+
+  DISALLOW_COPY_AND_ASSIGN(DeoptSuffixInstr);
+};
+
+
+intptr_t DeoptInstr::DecodeSuffix(intptr_t from_index, intptr_t* info_number) {
+  *info_number = DeoptSuffixInstr::InfoNumber::decode(from_index);
+  return DeoptSuffixInstr::SuffixLength::decode(from_index);
+}
+
+
 DeoptInstr* DeoptInstr::Create(intptr_t kind_as_int, intptr_t from_index) {
   Kind kind = static_cast<Kind>(kind_as_int);
   switch (kind) {
-    case kCopyStackSlot: return new DeoptStackSlotInstr(from_index);
-    case kCopyDoubleStackSlot: return new DeoptDoubleStackSlotInstr(from_index);
-    case kCopyInt64StackSlot: return new DeoptInt64StackSlotInstr(from_index);
-    case kSetRetAfterAddress: return new DeoptRetAddrAfterInstr(from_index);
-    case kSetRetBeforeAddress:  return new DeoptRetAddrBeforeInstr(from_index);
-    case kCopyConstant:  return new DeoptConstantInstr(from_index);
-    case kCopyRegister:  return new DeoptRegisterInstr(from_index);
-    case kCopyXmmRegister: return new DeoptXmmRegisterInstr(from_index);
-    case kCopyInt64XmmRegister:
-        return new DeoptInt64XmmRegisterInstr(from_index);
-    case kSetPcMarker:   return new DeoptPcMarkerInstr(from_index);
-    case kSetCallerFp:   return new DeoptCallerFpInstr();
-    case kSetCallerPc:   return new DeoptCallerPcInstr();
+    case kStackSlot: return new DeoptStackSlotInstr(from_index);
+    case kDoubleStackSlot: return new DeoptDoubleStackSlotInstr(from_index);
+    case kInt64StackSlot: return new DeoptInt64StackSlotInstr(from_index);
+    case kRetAfterAddress: return new DeoptRetAfterAddressInstr(from_index);
+    case kRetBeforeAddress: return new DeoptRetBeforeAddressInstr(from_index);
+    case kConstant: return new DeoptConstantInstr(from_index);
+    case kRegister: return new DeoptRegisterInstr(from_index);
+    case kXmmRegister: return new DeoptXmmRegisterInstr(from_index);
+    case kInt64XmmRegister: return new DeoptInt64XmmRegisterInstr(from_index);
+    case kPcMarker: return new DeoptPcMarkerInstr(from_index);
+    case kCallerFp: return new DeoptCallerFpInstr();
+    case kCallerPc: return new DeoptCallerPcInstr();
+    case kSuffix: return new DeoptSuffixInstr(from_index);
   }
   UNREACHABLE();
   return NULL;
 }
 
 
+class DeoptInfoBuilder::TrieNode : public ZoneAllocated {
+ public:
+  // Construct the root node representing the implicit "shared" terminator
+  // at the end of each deopt info.
+  TrieNode() : instruction_(NULL), info_number_(-1), children_(16) { }
+
+  // Construct a node representing a written instruction.
+  TrieNode(DeoptInstr* instruction, intptr_t info_number)
+      : instruction_(instruction), info_number_(info_number), children_(4) { }
+
+  intptr_t info_number() const { return info_number_; }
+
+  void AddChild(TrieNode* child) {
+    if (child != NULL) children_.Add(child);
+  }
+
+  TrieNode* FindChild(const DeoptInstr& instruction) {
+    for (intptr_t i = 0; i < children_.length(); ++i) {
+      TrieNode* child = children_[i];
+      if (child->instruction_->Equals(instruction)) return child;
+    }
+    return NULL;
+  }
+
+ private:
+  const DeoptInstr* instruction_;  // Instruction that was written.
+  const intptr_t info_number_;  // Index of the deopt info it was written to.
+
+  GrowableArray<TrieNode*> children_;
+};
+
+
+DeoptInfoBuilder::DeoptInfoBuilder(const intptr_t num_args)
+    : instructions_(),
+      object_table_(GrowableObjectArray::Handle(GrowableObjectArray::New())),
+      num_args_(num_args),
+      trie_root_(new TrieNode()),
+      current_info_number_(0) {
+}
+
+
 intptr_t DeoptInfoBuilder::FindOrAddObjectInTable(const Object& obj) const {
   for (intptr_t i = 0; i < object_table_.Length(); i++) {
     if (object_table_.At(i) == obj.raw()) {
@@ -526,7 +629,8 @@
                                               intptr_t to_index) {
   const intptr_t object_table_index = FindOrAddObjectInTable(function);
   ASSERT(to_index == instructions_.length());
-  instructions_.Add(new DeoptRetAddrBeforeInstr(object_table_index, deopt_id));
+  instructions_.Add(new DeoptRetBeforeAddressInstr(object_table_index,
+                                                   deopt_id));
 }
 
 
@@ -535,7 +639,8 @@
                                              intptr_t to_index) {
   const intptr_t object_table_index = FindOrAddObjectInTable(function);
   ASSERT(to_index == instructions_.length());
-  instructions_.Add(new DeoptRetAddrAfterInstr(object_table_index, deopt_id));
+  instructions_.Add(new DeoptRetAfterAddressInstr(object_table_index,
+                                                  deopt_id));
 }
 
 
@@ -601,13 +706,47 @@
 }
 
 
-RawDeoptInfo* DeoptInfoBuilder::CreateDeoptInfo() const {
-  const intptr_t len = instructions_.length();
-  const DeoptInfo& deopt_info = DeoptInfo::Handle(DeoptInfo::New(len));
-  for (intptr_t i = 0; i < len; i++) {
+RawDeoptInfo* DeoptInfoBuilder::CreateDeoptInfo() {
+  intptr_t length = instructions_.length();
+
+  // Count the number of instructions that are a shared suffix of some deopt
+  // info already written.
+  TrieNode* suffix = trie_root_;
+  intptr_t suffix_length = 0;
+  if (FLAG_compress_deopt_info) {
+    for (intptr_t i = length - 1; i >= 0; --i) {
+      TrieNode* node = suffix->FindChild(*instructions_[i]);
+      if (node == NULL) break;
+      suffix = node;
+      ++suffix_length;
+    }
+  }
+
+  // Allocate space for the translation.  If the shared suffix is longer
+  // than one instruction, we replace it with a single suffix instruction.
+  if (suffix_length > 1) length -= (suffix_length - 1);
+  const DeoptInfo& deopt_info = DeoptInfo::Handle(DeoptInfo::New(length));
+
+  // Write the unshared instructions and build their sub-tree.
+  TrieNode* node = NULL;
+  intptr_t write_count = (suffix_length > 1) ? length - 1 : length;
+  for (intptr_t i = 0; i < write_count; ++i) {
     DeoptInstr* instr = instructions_[i];
     deopt_info.SetAt(i, instr->kind(), instr->from_index());
+    TrieNode* child = node;
+    node = new TrieNode(instr, current_info_number_);
+    node->AddChild(child);
   }
+  suffix->AddChild(node);
+
+  if (suffix_length > 1) {
+    DeoptInstr* instr =
+        new DeoptSuffixInstr(suffix->info_number(), suffix_length);
+    deopt_info.SetAt(length - 1, instr->kind(), instr->from_index());
+  }
+
+  instructions_.Clear();
+  ++current_info_number_;
   return deopt_info.raw();
 }
 
diff --git a/runtime/vm/deopt_instructions.h b/runtime/vm/deopt_instructions.h
index 603fab2..79c9f23 100644
--- a/runtime/vm/deopt_instructions.h
+++ b/runtime/vm/deopt_instructions.h
@@ -84,6 +84,22 @@
 // the deopt-info array.
 class DeoptInstr : public ZoneAllocated {
  public:
+  enum Kind {
+    kRetAfterAddress,
+    kRetBeforeAddress,
+    kConstant,
+    kRegister,
+    kXmmRegister,
+    kInt64XmmRegister,
+    kStackSlot,
+    kDoubleStackSlot,
+    kInt64StackSlot,
+    kPcMarker,
+    kCallerFp,
+    kCallerPc,
+    kSuffix,
+  };
+
   static DeoptInstr* Create(intptr_t kind_as_int, intptr_t from_index);
 
   DeoptInstr() {}
@@ -94,22 +110,15 @@
   virtual void Execute(DeoptimizationContext* deopt_context,
                        intptr_t to_index) = 0;
 
- protected:
-  enum Kind {
-    kSetRetAfterAddress,
-    kSetRetBeforeAddress,
-    kCopyConstant,
-    kCopyRegister,
-    kCopyXmmRegister,
-    kCopyInt64XmmRegister,
-    kCopyStackSlot,
-    kCopyDoubleStackSlot,
-    kCopyInt64StackSlot,
-    kSetPcMarker,
-    kSetCallerFp,
-    kSetCallerPc,
-  };
+  bool Equals(const DeoptInstr& other) const {
+    return (kind() == other.kind()) && (from_index() == other.from_index());
+  }
 
+  // Decode the payload of a suffix command.  Return the suffix length and
+  // set the output parameter info_number to the index of the shared suffix.
+  static intptr_t DecodeSuffix(intptr_t from_index, intptr_t* info_number);
+
+ protected:
   virtual DeoptInstr::Kind kind() const = 0;
   virtual intptr_t from_index() const = 0;
 
@@ -120,18 +129,18 @@
 };
 
 
-// Builds one instance of DeoptInfo. Call AddXXX methods in the order of
-// their target, starting wih deoptimized code continuation pc and ending with
-// the first argument of the deoptimized code.
+// Builds a deoptimization info table, one DeoptInfo at a time.  Call AddXXX
+// methods in the order of their target, starting wih deoptimized code
+// continuation pc and ending with the first argument of the deoptimized
+// code.  Call CreateDeoptInfo to write the accumulated instructions into
+// the heap and reset the builder's internal state for the next DeoptInfo.
 class DeoptInfoBuilder : public ValueObject {
  public:
+  explicit DeoptInfoBuilder(const intptr_t num_args);
+
   // 'object_table' holds all objects referred to by DeoptInstr in
   // all DeoptInfo instances for a single Code object.
-  DeoptInfoBuilder(const GrowableObjectArray& object_table,
-                   const intptr_t num_args)
-      : instructions_(),
-        object_table_(object_table),
-        num_args_(num_args) {}
+  const GrowableObjectArray& object_table() { return object_table_; }
 
   // Return address before instruction.
   void AddReturnAddressBefore(const Function& function,
@@ -151,15 +160,21 @@
   void AddCallerFp(intptr_t to_index);
   void AddCallerPc(intptr_t to_index);
 
-  RawDeoptInfo* CreateDeoptInfo() const;
+  RawDeoptInfo* CreateDeoptInfo();
 
  private:
+  class TrieNode;
+
   intptr_t FindOrAddObjectInTable(const Object& obj) const;
 
   GrowableArray<DeoptInstr*> instructions_;
   const GrowableObjectArray& object_table_;
   const intptr_t num_args_;
 
+  // Used to compress entries by sharing suffixes.
+  TrieNode* trie_root_;
+  intptr_t current_info_number_;
+
   DISALLOW_COPY_AND_ASSIGN(DeoptInfoBuilder);
 };
 
diff --git a/runtime/vm/exceptions.cc b/runtime/vm/exceptions.cc
index 9ec5686..2a77c53 100644
--- a/runtime/vm/exceptions.cc
+++ b/runtime/vm/exceptions.cc
@@ -396,9 +396,9 @@
   Library& library = Library::Handle();
   String& class_name = String::Handle();
   switch (type) {
-    case kIndexOutOfRange:
+    case kRange:
       library = Library::CoreLibrary();
-      class_name = Symbols::New("IndexOutOfRangeException");
+      class_name = Symbols::New("RangeError");
       break;
     case kArgument:
       library = Library::CoreLibrary();
@@ -408,14 +408,6 @@
       library = Library::CoreLibrary();
       class_name = Symbols::New("NoSuchMethodError");
       break;
-    case kClosureArgumentMismatch:
-      library = Library::CoreLibrary();
-      class_name = Symbols::New("_ClosureArgumentMismatchException");
-      break;
-    case kObjectNotClosure:
-      library = Library::CoreLibrary();
-      class_name = Symbols::New("_ObjectNotClosureException");
-      break;
     case kFormat:
       library = Library::CoreLibrary();
       class_name = Symbols::New("FormatException");
diff --git a/runtime/vm/exceptions.h b/runtime/vm/exceptions.h
index edb3c2c..50500f9 100644
--- a/runtime/vm/exceptions.h
+++ b/runtime/vm/exceptions.h
@@ -48,11 +48,9 @@
                                       const String& malformed_error);
 
   enum ExceptionType {
-    kIndexOutOfRange,
+    kRange,
     kArgument,
     kNoSuchMethod,
-    kClosureArgumentMismatch,
-    kObjectNotClosure,
     kFormat,
     kStackOverflow,
     kOutOfMemory,
diff --git a/runtime/vm/exceptions_test.cc b/runtime/vm/exceptions_test.cc
index 9111615..ef319de 100644
--- a/runtime/vm/exceptions_test.cc
+++ b/runtime/vm/exceptions_test.cc
@@ -30,9 +30,9 @@
 
 void FUNCTION_NAME(Unhandled_invoke)(Dart_NativeArguments args) {
   // Invoke the specified entry point.
-  Dart_Handle cls = Dart_GetClass(TestCase::lib(), Dart_NewString("Second"));
+  Dart_Handle cls = Dart_GetClass(TestCase::lib(), NewString("Second"));
   Dart_Handle result = Dart_Invoke(cls,
-                                   Dart_NewString("method2"),
+                                   NewString("method2"),
                                    0,
                                    NULL);
   ASSERT(Dart_IsError(result));
@@ -43,9 +43,9 @@
 
 void FUNCTION_NAME(Unhandled_invoke2)(Dart_NativeArguments args) {
   // Invoke the specified entry point.
-  Dart_Handle cls = Dart_GetClass(TestCase::lib(), Dart_NewString("Second"));
+  Dart_Handle cls = Dart_GetClass(TestCase::lib(), NewString("Second"));
   Dart_Handle result = Dart_Invoke(cls,
-                                   Dart_NewString("method2"),
+                                   NewString("method2"),
                                    0,
                                    NULL);
   ASSERT(Dart_IsError(result));
@@ -127,7 +127,7 @@
   Dart_Handle lib = TestCase::LoadTestScript(
       kScriptChars,
       reinterpret_cast<Dart_NativeEntryResolver>(native_lookup));
-  EXPECT_VALID(Dart_Invoke(lib, Dart_NewString("testMain"), 0, NULL));
+  EXPECT_VALID(Dart_Invoke(lib, NewString("testMain"), 0, NULL));
 }
 #endif  // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64).
 
diff --git a/runtime/vm/flow_graph.cc b/runtime/vm/flow_graph.cc
index 95961cb..26e2eb1 100644
--- a/runtime/vm/flow_graph.cc
+++ b/runtime/vm/flow_graph.cc
@@ -475,8 +475,7 @@
     }
 
     while (!worklist.is_empty()) {
-      BlockEntryInstr* current = worklist.Last();
-      worklist.RemoveLast();
+      BlockEntryInstr* current = worklist.RemoveLast();
       // Ensure a phi for each block in the dominance frontier of current.
       for (BitVector::Iterator it(dom_frontier[current->preorder_number()]);
            !it.Done();
@@ -584,8 +583,7 @@
       // Update expression stack.
       ASSERT(env->length() > variable_count());
 
-      Definition* reaching_defn = env->Last();
-      env->RemoveLast();
+      Definition* reaching_defn = env->RemoveLast();
 
       Definition* input_defn = v->definition();
       if (input_defn->IsLoadLocal() || input_defn->IsStoreLocal()) {
@@ -682,8 +680,7 @@
 
 void FlowGraph::MarkLivePhis(GrowableArray<PhiInstr*>* live_phis) {
   while (!live_phis->is_empty()) {
-    PhiInstr* phi = live_phis->Last();
-    live_phis->RemoveLast();
+    PhiInstr* phi = live_phis->RemoveLast();
     for (intptr_t i = 0; i < phi->InputCount(); i++) {
       Value* val = phi->InputAt(i);
       PhiInstr* used_phi = val->definition()->AsPhi();
@@ -712,8 +709,7 @@
   }
 
   while (!stack.is_empty()) {
-    BlockEntryInstr* p = stack.Last();
-    stack.RemoveLast();
+    BlockEntryInstr* p = stack.RemoveLast();
     for (intptr_t i = 0; i < p->PredecessorCount(); ++i) {
       BlockEntryInstr* q = p->PredecessorAt(i);
       if (!loop->Contains(q->preorder_number())) {
diff --git a/runtime/vm/flow_graph_allocator.cc b/runtime/vm/flow_graph_allocator.cc
index ccc22c2..0097c72 100644
--- a/runtime/vm/flow_graph_allocator.cc
+++ b/runtime/vm/flow_graph_allocator.cc
@@ -1982,8 +1982,7 @@
 #endif
 
   while (!unallocated_.is_empty()) {
-    LiveRange* range = unallocated_.Last();
-    unallocated_.RemoveLast();
+    LiveRange* range = unallocated_.RemoveLast();
     const intptr_t start = range->Start();
     TRACE_ALLOC(OS::Print("Processing live range for vreg %"Pd" "
                           "starting at %"Pd"\n",
diff --git a/runtime/vm/flow_graph_builder.cc b/runtime/vm/flow_graph_builder.cc
index 856ee44..5684503 100644
--- a/runtime/vm/flow_graph_builder.cc
+++ b/runtime/vm/flow_graph_builder.cc
@@ -1668,22 +1668,52 @@
 }
 
 
-static intptr_t GetResultCidOfConstructor(ConstructorCallNode* node) {
-  if (node->constructor().IsFactory()) {
-    const Function& function = node->constructor();
-    const Library& core_impl_lib = Library::Handle(Library::CoreImplLibrary());
-    const Class& function_class = Class::Handle(function.Owner());
+static bool IsRecognizedConstructor(const Function& function,
+                                    const String& expected) {
+  const Class& clazz = Class::Handle(function.Owner());
+  const Library& lib = Library::Handle(clazz.library());
 
-    if (function_class.library() == core_impl_lib.raw()) {
-      if (function_class.Name() == Symbols::ListImplementation()) {
-        if (function.name() == Symbols::ListFactory()) {
-          if (node->arguments()->length() == 0) {
-            return kGrowableObjectArrayCid;
-          } else {
-            ASSERT(node->arguments()->length() == 1);
-            return kArrayCid;
-          }
-        }
+  const String& expected_class_name =
+      String::Handle(lib.PrivateName(expected));
+  if (!String::Handle(clazz.Name()).Equals(expected_class_name)) {
+    return false;
+  }
+
+  const String& function_name = String::Handle(function.name());
+  const String& expected_function_name = String::Handle(
+      String::Concat(expected_class_name, String::Handle(Symbols::Dot())));
+  return function_name.Equals(expected_function_name);
+}
+
+
+static intptr_t GetResultCidOfConstructor(ConstructorCallNode* node) {
+  const Function& function = node->constructor();
+  const Class& function_class = Class::Handle(function.Owner());
+  const Library& core_lib = Library::Handle(Library::CoreLibrary());
+
+  if (function_class.library() != core_lib.raw()) {
+    return kDynamicCid;
+  }
+
+  if (node->constructor().IsFactory()) {
+    if ((function_class.Name() == Symbols::ListImplementation()) &&
+        (function.name() == Symbols::ListFactory())) {
+      // If there are no arguments then the result is guaranteed to be a
+      // GrowableObjectArray. However if there is an argument the result
+      // is not guaranteed to be a fixed size array because the argument
+      // can be null.
+      if (node->arguments()->length() == 0) {
+        return kGrowableObjectArrayCid;
+      }
+    } else {
+      if (IsRecognizedConstructor(function,
+                                  String::Handle(Symbols::ObjectArray())) &&
+          (node->arguments()->length() == 1)) {
+        return kArrayCid;
+      } else if (IsRecognizedConstructor(function,
+                     String::Handle(Symbols::GrowableObjectArray())) &&
+                 (node->arguments()->length() == 0)) {
+        return kGrowableObjectArrayCid;
       }
     }
   }
@@ -1707,7 +1737,9 @@
                             node->arguments()->names(),
                             arguments);
     // List factories return kArrayCid or kGrowableObjectArrayCid.
-    call->set_result_cid(GetResultCidOfConstructor(node));
+    const intptr_t result_cid = GetResultCidOfConstructor(node);
+    call->set_result_cid(result_cid);
+    call->set_is_known_constructor(result_cid != kDynamicCid);
     ReturnDefinition(call);
     return;
   }
@@ -2002,7 +2034,7 @@
   if (node->is_super_getter()) {
     // Statically resolved instance getter, i.e. "super getter".
     getter_function =
-    Resolver::ResolveDynamicAnyArgs(node->cls(), getter_name);
+        Resolver::ResolveDynamicAnyArgs(node->cls(), getter_name);
     ASSERT(!getter_function.IsNull());
     ASSERT(node->receiver() != NULL);
     ValueGraphVisitor receiver_value(owner(), temp_index());
@@ -2037,7 +2069,7 @@
       const String& cls_name = String::Handle(Symbols::NoSuchMethodError());
       const String& func_name = String::Handle(Symbols::ThrowNew());
       const Class& cls = Class::Handle(
-          Library::Handle(Library::CoreImplLibrary()).LookupClass(cls_name));
+          Library::Handle(Library::CoreLibrary()).LookupClass(cls_name));
       ASSERT(!cls.IsNull());
       getter_function = Resolver::ResolveStatic(cls,
                                                 func_name,
@@ -2265,6 +2297,28 @@
 
 
 void EffectGraphVisitor::VisitLoadIndexedNode(LoadIndexedNode* node) {
+  Function* super_function = NULL;
+  if (node->IsSuperLoad()) {
+    // Resolve the load indexed operator in the super class.
+    const String& index_operator_name =
+        String::ZoneHandle(Symbols::IndexToken());
+    super_function = &Function::ZoneHandle(
+          Resolver::ResolveDynamicAnyArgs(node->super_class(),
+                                          index_operator_name));
+    if (super_function->IsNull()) {
+      // Could not resolve super operator. Generate call noSuchMethod() of the
+      // super class instead.
+      ArgumentListNode* arguments = new ArgumentListNode(node->token_pos());
+      arguments->Add(node->index_expr());
+      StaticCallInstr* call =
+          BuildStaticNoSuchMethodCall(node->super_class(),
+                                      node->array(),
+                                      index_operator_name,
+                                      arguments);
+      ReturnDefinition(call);
+      return;
+    }
+  }
   ZoneGrowableArray<PushArgumentInstr*>* arguments =
       new ZoneGrowableArray<PushArgumentInstr*>(2);
   ValueGraphVisitor for_array(owner(), temp_index());
@@ -2277,22 +2331,67 @@
   Append(for_index);
   arguments->Add(PushArgument(for_index.value()));
 
-  const intptr_t checked_argument_count = 1;
-  const String& name =
-      String::ZoneHandle(Symbols::New(Token::Str(Token::kINDEX)));
-  InstanceCallInstr* load = new InstanceCallInstr(node->token_pos(),
-                                                  name,
-                                                  Token::kINDEX,
-                                                  arguments,
-                                                  Array::ZoneHandle(),
-                                                  checked_argument_count);
-  ReturnDefinition(load);
+  if (super_function != NULL) {
+    // Generate static call to super operator.
+    StaticCallInstr* load = new StaticCallInstr(node->token_pos(),
+                                                *super_function,
+                                                Array::ZoneHandle(),
+                                                arguments);
+    ReturnDefinition(load);
+  } else {
+    // Generate dynamic call to index operator.
+    const intptr_t checked_argument_count = 1;
+    const String& name = String::ZoneHandle(Symbols::IndexToken());
+    InstanceCallInstr* load = new InstanceCallInstr(node->token_pos(),
+                                                    name,
+                                                    Token::kINDEX,
+                                                    arguments,
+                                                    Array::ZoneHandle(),
+                                                    checked_argument_count);
+    ReturnDefinition(load);
+  }
 }
 
 
 Definition* EffectGraphVisitor::BuildStoreIndexedValues(
     StoreIndexedNode* node,
     bool result_is_needed) {
+  Function* super_function = NULL;
+  if (node->IsSuperStore()) {
+    // Resolve the store indexed operator in the super class.
+    const String& store_index_op_name =
+        String::ZoneHandle(Symbols::AssignIndexToken());
+    super_function = &Function::ZoneHandle(
+        Resolver::ResolveDynamicAnyArgs(node->super_class(),
+                                        store_index_op_name));
+    if (super_function->IsNull()) {
+      // Could not resolve super operator. Generate call noSuchMethod() of the
+      // super class instead.
+      if (result_is_needed) {
+        // Even though noSuchMethod most likely does not return,
+        // we save the stored value if the result is needed.
+        ValueGraphVisitor for_value(owner(), temp_index());
+        node->value()->Visit(&for_value);
+        Append(for_value);
+        Bind(BuildStoreExprTemp(for_value.value()));
+      }
+      ArgumentListNode* arguments = new ArgumentListNode(node->token_pos());
+      arguments->Add(node->index_expr());
+      arguments->Add(node->value());
+      StaticCallInstr* call =
+          BuildStaticNoSuchMethodCall(node->super_class(),
+                                      node->array(),
+                                      store_index_op_name,
+                                      arguments);
+      if (result_is_needed) {
+        Do(call);
+        return BuildLoadExprTemp();
+      } else {
+        return call;
+      }
+    }
+  }
+
   ZoneGrowableArray<PushArgumentInstr*>* arguments =
       new ZoneGrowableArray<PushArgumentInstr*>(3);
   ValueGraphVisitor for_array(owner(), temp_index());
@@ -2316,20 +2415,38 @@
   }
   arguments->Add(PushArgument(value));
 
-  const intptr_t checked_argument_count = 3;
-  const String& name =
-      String::ZoneHandle(Symbols::New(Token::Str(Token::kASSIGN_INDEX)));
-  InstanceCallInstr* store = new InstanceCallInstr(node->token_pos(),
-                                                   name,
-                                                   Token::kASSIGN_INDEX,
-                                                   arguments,
-                                                   Array::ZoneHandle(),
-                                                   checked_argument_count);
-  if (result_is_needed) {
-    Do(store);
-    return BuildLoadExprTemp();
+  if (super_function != NULL) {
+    // Generate static call to super operator []=.
+
+    StaticCallInstr* store =
+        new StaticCallInstr(node->token_pos(),
+                            *super_function,
+                            Array::ZoneHandle(),
+                            arguments);
+    if (result_is_needed) {
+      Do(store);
+      return BuildLoadExprTemp();
+    } else {
+      return store;
+    }
   } else {
-    return store;
+    // Generate dynamic call to operator []=.
+    const intptr_t checked_argument_count = 3;
+    const String& name =
+        String::ZoneHandle(Symbols::New(Token::Str(Token::kASSIGN_INDEX)));
+    InstanceCallInstr* store =
+        new InstanceCallInstr(node->token_pos(),
+                              name,
+                              Token::kASSIGN_INDEX,
+                              arguments,
+                              Array::ZoneHandle(),
+                              checked_argument_count);
+    if (result_is_needed) {
+      Do(store);
+      return BuildLoadExprTemp();
+    } else {
+      return store;
+    }
   }
 }
 
@@ -2583,6 +2700,75 @@
 }
 
 
+// Looks up dynamic method noSuchMethod in target_class
+// (including its super class chain) and builds a static call to it.
+StaticCallInstr* EffectGraphVisitor::BuildStaticNoSuchMethodCall(
+    const Class& target_class,
+    AstNode* receiver,
+    const String& method_name,
+    ArgumentListNode* method_arguments) {
+  // Build the graph to allocate an InvocationMirror object by calling
+  // the static allocation method.
+  const String& mirror_name = String::Handle(Symbols::InvocationMirror());
+  const Library& corelib = Library::Handle(Library::CoreLibrary());
+  const Class& mirror_class = Class::Handle(
+      corelib.LookupClassAllowPrivate(mirror_name));
+  ASSERT(!mirror_class.IsNull());
+  const String& function_name = String::Handle(
+      Symbols::AllocateInvocationMirror());
+  const Function& allocation_function = Function::ZoneHandle(
+      Resolver::ResolveStaticByName(mirror_class,
+                                    function_name,
+                                    Resolver::kIsQualified));
+  ASSERT(!allocation_function.IsNull());
+
+  // Evaluate the receiver before the arguments. This will be used
+  // as an argument to the noSuchMethod call.
+  ValueGraphVisitor for_receiver(owner(), temp_index());
+  receiver->Visit(&for_receiver);
+  Append(for_receiver);
+  PushArgumentInstr* push_receiver = PushArgument(for_receiver.value());
+
+  // Allocate the arguments and pass them into the construction
+  // of the InvocationMirror.
+  const intptr_t args_pos = method_arguments->token_pos();
+  ArgumentListNode* arguments = new ArgumentListNode(args_pos);
+  // The first argument is the original method name.
+  arguments->Add(new LiteralNode(args_pos, method_name));
+  // The second argument is an array containing the original method arguments.
+  ArrayNode* args_array =
+      new ArrayNode(args_pos, Type::ZoneHandle(Type::ListInterface()));
+  for (intptr_t i = 0; i < method_arguments->length(); i++) {
+    args_array->AddElement(method_arguments->NodeAt(i));
+  }
+  arguments->Add(args_array);
+  ZoneGrowableArray<PushArgumentInstr*>* allocation_args =
+      new ZoneGrowableArray<PushArgumentInstr*>(arguments->length());
+  BuildPushArguments(*arguments, allocation_args);
+  StaticCallInstr* allocation = new StaticCallInstr(args_pos,
+                                                    allocation_function,
+                                                    Array::ZoneHandle(),
+                                                    allocation_args);
+  Value* invocation_mirror = Bind(allocation);
+  PushArgumentInstr* push_invocation_mirror = PushArgument(invocation_mirror);
+  // Lookup noSuchMethod and call it with the receiver and the InvocationMirror.
+  const String& no_such_method_name =
+      String::ZoneHandle(Symbols::NoSuchMethod());
+  const Function& no_such_method_func = Function::ZoneHandle(
+      Resolver::ResolveDynamicAnyArgs(target_class, no_such_method_name));
+  // We are guaranteed to find noSuchMethod of class Object.
+  ASSERT(!no_such_method_func.IsNull());
+  ZoneGrowableArray<PushArgumentInstr*>* args =
+      new ZoneGrowableArray<PushArgumentInstr*>(2);
+  args->Add(push_receiver);
+  args->Add(push_invocation_mirror);
+  return new StaticCallInstr(args_pos,
+                             no_such_method_func,
+                             Array::ZoneHandle(),
+                             args);
+}
+
+
 void EffectGraphVisitor::BuildThrowNode(ThrowNode* node) {
   // TODO(kmillikin) non-local control flow is not handled correctly
   // by the inliner.
diff --git a/runtime/vm/flow_graph_builder.h b/runtime/vm/flow_graph_builder.h
index 7c93796..9c675af 100644
--- a/runtime/vm/flow_graph_builder.h
+++ b/runtime/vm/flow_graph_builder.h
@@ -252,6 +252,12 @@
 
   void BuildThrowNode(ThrowNode* node);
 
+  StaticCallInstr* BuildStaticNoSuchMethodCall(
+      const Class& target_class,
+      AstNode* receiver,
+      const String& method_name,
+      ArgumentListNode* method_arguments);
+
   void BuildStaticSetter(StaticSetterNode* node, bool result_is_needed);
   Definition* BuildStoreStaticField(StoreStaticFieldNode* node,
                                     bool result_is_needed);
diff --git a/runtime/vm/flow_graph_compiler.cc b/runtime/vm/flow_graph_compiler.cc
index b26df19..57e02d4 100644
--- a/runtime/vm/flow_graph_compiler.cc
+++ b/runtime/vm/flow_graph_compiler.cc
@@ -26,11 +26,11 @@
 DECLARE_FLAG(bool, code_comments);
 DECLARE_FLAG(bool, enable_type_checks);
 DECLARE_FLAG(bool, intrinsify);
+DECLARE_FLAG(bool, propagate_ic_data);
 DECLARE_FLAG(bool, report_usage_count);
 DECLARE_FLAG(bool, trace_functions);
 DECLARE_FLAG(int, optimization_counter_threshold);
 
-
 void CompilerDeoptInfo::BuildReturnAddress(DeoptInfoBuilder* builder,
                                            const Function& function,
                                            intptr_t slot_ix) {
@@ -62,77 +62,73 @@
 }
 
 
-RawDeoptInfo* CompilerDeoptInfo::CreateDeoptInfo(FlowGraphCompiler* compiler) {
+RawDeoptInfo* CompilerDeoptInfo::CreateDeoptInfo(FlowGraphCompiler* compiler,
+                                                 DeoptInfoBuilder* builder) {
   if (deoptimization_env_ == NULL) return DeoptInfo::null();
 
   intptr_t stack_height = compiler->StackSize();
   AllocateIncomingParametersRecursive(deoptimization_env_, &stack_height);
 
-  const Function& function = compiler->parsed_function().function();
-  // For functions with optional arguments, all incoming arguments are copied
-  // to spill slots. The deoptimization environment does not track them.
-  const intptr_t incoming_arg_count =
-      function.HasOptionalParameters() ? 0 : function.num_fixed_parameters();
-  DeoptInfoBuilder builder(compiler->object_table(), incoming_arg_count);
-
   intptr_t slot_ix = 0;
-  Environment* inner = deoptimization_env_;
+  Environment* current = deoptimization_env_;
 
   // For the innermost environment, call the virtual return builder.
-  BuildReturnAddress(&builder, inner->function(), slot_ix++);
+  BuildReturnAddress(builder, current->function(), slot_ix++);
 
   // For the innermost environment, set outgoing arguments and the locals.
-  for (intptr_t i = inner->Length() - 1;
-       i >= inner->fixed_parameter_count();
+  for (intptr_t i = current->Length() - 1;
+       i >= current->fixed_parameter_count();
        i--) {
-    builder.AddCopy(inner->LocationAt(i), *inner->ValueAt(i), slot_ix++);
+    builder->AddCopy(current->LocationAt(i), *current->ValueAt(i), slot_ix++);
   }
 
   // PC marker and caller FP.
-  builder.AddPcMarker(inner->function(), slot_ix++);
-  builder.AddCallerFp(slot_ix++);
+  builder->AddPcMarker(current->function(), slot_ix++);
+  builder->AddCallerFp(slot_ix++);
 
-  while (inner->outer() != NULL) {
-    // Write the frame for an outer environment.
-    const Environment* current = inner->outer();
-
+  Environment* previous = current;
+  current = current->outer();
+  while (current != NULL) {
     // For any outer environment the deopt id is that of the call instruction
     // which is recorded in the outer environment.
-    builder.AddReturnAddressAfter(current->function(),
-                                  current->deopt_id(),
-                                  slot_ix++);
+    builder->AddReturnAddressAfter(current->function(),
+                                   current->deopt_id(),
+                                   slot_ix++);
 
     // The values of outgoing arguments can be changed from the inlined call so
-    // we must read them from the inner environment.
-    for (intptr_t i = inner->fixed_parameter_count() - 1; i >= 0; i--) {
-      builder.AddCopy(inner->LocationAt(i), *inner->ValueAt(i), slot_ix++);
+    // we must read them from the previous environment.
+    for (intptr_t i = previous->fixed_parameter_count() - 1; i >= 0; i--) {
+      builder->AddCopy(previous->LocationAt(i), *previous->ValueAt(i),
+                       slot_ix++);
     }
 
     // Set the locals, note that outgoing arguments are not in the environment.
     for (intptr_t i = current->Length() - 1;
          i >= current->fixed_parameter_count();
          i--) {
-      builder.AddCopy(current->LocationAt(i), *current->ValueAt(i), slot_ix++);
+      builder->AddCopy(current->LocationAt(i), *current->ValueAt(i), slot_ix++);
     }
 
     // PC marker and caller FP.
-    builder.AddPcMarker(current->function(), slot_ix++);
-    builder.AddCallerFp(slot_ix++);
+    builder->AddPcMarker(current->function(), slot_ix++);
+    builder->AddCallerFp(slot_ix++);
 
     // Iterate on the outer environment.
-    inner = inner->outer();
+    previous = current;
+    current = current->outer();
   }
-  ASSERT(inner != NULL);  // The inner pointer is now the outermost environment.
+  // The previous pointer is now the outermost environment.
+  ASSERT(previous != NULL);
 
   // For the outermost environment, set caller PC.
-  builder.AddCallerPc(slot_ix++);
+  builder->AddCallerPc(slot_ix++);
 
   // For the outermost environment, set the incoming arguments.
-  for (intptr_t i = inner->fixed_parameter_count() - 1; i >= 0; i--) {
-    builder.AddCopy(inner->LocationAt(i), *inner->ValueAt(i), slot_ix++);
+  for (intptr_t i = previous->fixed_parameter_count() - 1; i >= 0; i--) {
+    builder->AddCopy(previous->LocationAt(i), *previous->ValueAt(i), slot_ix++);
   }
 
-  const DeoptInfo& deopt_info = DeoptInfo::Handle(builder.CreateDeoptInfo());
+  const DeoptInfo& deopt_info = DeoptInfo::Handle(builder->CreateDeoptInfo());
   return deopt_info.raw();
 }
 
@@ -150,7 +146,6 @@
           is_optimizing ? new StackmapTableBuilder() : NULL),
       block_info_(block_order_.length()),
       deopt_infos_(),
-      object_table_(GrowableObjectArray::Handle(GrowableObjectArray::New())),
       is_optimizing_(is_optimizing),
       bool_true_(Bool::ZoneHandle(Bool::True())),
       bool_false_(Bool::ZoneHandle(Bool::False())),
@@ -380,6 +375,13 @@
 
 
 void FlowGraphCompiler::FinalizeDeoptInfo(const Code& code) {
+  // For functions with optional arguments, all incoming arguments are copied
+  // to spill slots. The deoptimization environment does not track them.
+  const Function& function = parsed_function().function();
+  const intptr_t incoming_arg_count =
+      function.HasOptionalParameters() ? 0 : function.num_fixed_parameters();
+  DeoptInfoBuilder builder(incoming_arg_count);
+
   const Array& array =
       Array::Handle(Array::New(DeoptTable::SizeFor(deopt_infos_.length()),
                                Heap::kOld));
@@ -388,12 +390,13 @@
   Smi& reason = Smi::Handle();
   for (intptr_t i = 0; i < deopt_infos_.length(); i++) {
     offset = Smi::New(deopt_infos_[i]->pc_offset());
-    info = deopt_infos_[i]->CreateDeoptInfo(this);
+    info = deopt_infos_[i]->CreateDeoptInfo(this, &builder);
     reason = Smi::New(deopt_infos_[i]->reason());
     DeoptTable::SetEntry(array, i, offset, info, reason);
   }
   code.set_deopt_info_array(array);
-  const Array& object_array = Array::Handle(Array::MakeArray(object_table()));
+  const Array& object_array =
+      Array::Handle(Array::MakeArray(builder.object_table()));
   code.set_object_table(object_array);
 }
 
@@ -465,23 +468,21 @@
 }
 
 
-const ICData& FlowGraphCompiler::GenerateInstanceCall(
+void FlowGraphCompiler::GenerateInstanceCall(
     intptr_t deopt_id,
     intptr_t token_pos,
-    const String& function_name,
     intptr_t argument_count,
     const Array& argument_names,
-    intptr_t checked_argument_count,
-    LocationSummary* locs) {
-  ICData& ic_data =
-      ICData::ZoneHandle(ICData::New(parsed_function().function(),
-                                     function_name,
-                                     deopt_id,
-                                     checked_argument_count));
+    LocationSummary* locs,
+    const ICData& ic_data) {
+  ASSERT(!ic_data.IsNull());
+  ASSERT(FLAG_propagate_ic_data || (ic_data.NumberOfChecks() == 0));
+  // Because optimized code should not waste time.
+  ASSERT(!is_optimizing() || ic_data.num_args_tested() == 1);
   const Array& arguments_descriptor =
       DartEntry::ArgumentsDescriptor(argument_count, argument_names);
   uword label_address = 0;
-  switch (checked_argument_count) {
+  switch (ic_data.num_args_tested()) {
     case 1:
       label_address = StubCode::OneArgCheckInlineCacheEntryPoint();
       break;
@@ -498,7 +499,6 @@
 
   EmitInstanceCall(&target_label, ic_data, arguments_descriptor, argument_count,
                    deopt_id, token_pos, locs);
-  return ic_data;
 }
 
 
@@ -540,10 +540,8 @@
   GrowableArray<intptr_t> args;
   args.Add(kOneByteStringCid);
   args.Add(kTwoByteStringCid);
-  args.Add(kFourByteStringCid);
   args.Add(kExternalOneByteStringCid);
   args.Add(kExternalTwoByteStringCid);
-  args.Add(kExternalFourByteStringCid);
   CheckClassIds(kClassIdReg, args, is_instance_lbl, is_not_instance_lbl);
 }
 
diff --git a/runtime/vm/flow_graph_compiler.h b/runtime/vm/flow_graph_compiler.h
index 8caf5b7..1a12f6f 100644
--- a/runtime/vm/flow_graph_compiler.h
+++ b/runtime/vm/flow_graph_compiler.h
@@ -67,7 +67,8 @@
         reason_(reason),
         deoptimization_env_(NULL) {}
 
-  RawDeoptInfo* CreateDeoptInfo(FlowGraphCompiler* compiler);
+  RawDeoptInfo* CreateDeoptInfo(FlowGraphCompiler* compiler,
+                                DeoptInfoBuilder* builder);
 
   void AllocateIncomingParametersRecursive(Environment* env,
                                            intptr_t* stack_height);
diff --git a/runtime/vm/flow_graph_compiler_ia32.cc b/runtime/vm/flow_graph_compiler_ia32.cc
index babcc50..06d767e 100644
--- a/runtime/vm/flow_graph_compiler_ia32.cc
+++ b/runtime/vm/flow_graph_compiler_ia32.cc
@@ -20,7 +20,6 @@
 
 DECLARE_FLAG(bool, print_ast);
 DECLARE_FLAG(bool, print_scopes);
-DECLARE_FLAG(bool, reject_named_argument_as_positional);
 DECLARE_FLAG(bool, trace_functions);
 DEFINE_FLAG(bool, trap_on_deoptimization, false, "Trap on deoptimization.");
 DEFINE_FLAG(bool, unbox_mints, true, "Optimize 64-bit integer arithmetic.");
@@ -695,11 +694,6 @@
   __ j(POSITIVE, &loop, Assembler::kNearJump);
 
   // Copy or initialize optional named arguments.
-
-  if (!FLAG_reject_named_argument_as_positional) {
-    // Treat optional positional parameters as optional named parameters.
-    num_opt_named_params += num_opt_pos_params;
-  }
   const Immediate raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   Label all_arguments_processed;
@@ -735,13 +729,6 @@
     for (int i = 0; i < num_opt_named_params; i++) {
       Label load_default_value, assign_optional_parameter, next_parameter;
       const int param_pos = opt_param_position[i];
-      if (!FLAG_reject_named_argument_as_positional) {
-        // Handle this optional parameter only if k or fewer positional
-        // arguments have been passed, where k is the position of this optional
-        // parameter in the formal parameter list.
-        __ cmpl(ECX, Immediate(param_pos));
-        __ j(GREATER, &next_parameter, Assembler::kNearJump);
-      }
       // Check if this named parameter was passed in.
       __ movl(EAX, Address(EDI, 0));  // Load EAX with the name of the argument.
       ASSERT(opt_param[i]->name().IsSymbol());
@@ -778,7 +765,6 @@
     __ cmpl(Address(EDI, 0), raw_null);
     __ j(EQUAL, &all_arguments_processed, Assembler::kNearJump);
   } else if (num_opt_pos_params > 0) {
-    ASSERT(FLAG_reject_named_argument_as_positional);
     // Number of positional args is the second Smi in descriptor array (EDX).
     __ movl(ECX, FieldAddress(EDX, Array::data_offset() + (1 * kWordSize)));
     __ SmiUntag(ECX);
@@ -826,6 +812,7 @@
   // dropped the spill slots.
   BitmapBuilder* empty_stack_bitmap = new BitmapBuilder();
   if (function.IsClosureFunction()) {
+    // TODO(regis): Call NoSuchMethod with "call" as name of original function.
     // We do not use GenerateCallRuntime because of the non-standard (empty)
     // stackmap used here.
     __ CallRuntime(kClosureArgumentMismatchRuntimeEntry);
@@ -973,6 +960,8 @@
       __ cmpl(EAX, Immediate(Smi::RawValue(num_fixed_params)));
       __ j(EQUAL, &argc_in_range, Assembler::kNearJump);
       if (function.IsClosureFunction()) {
+        // TODO(regis): Call NoSuchMethod with "call" as name of original
+        // function.
         GenerateCallRuntime(function.token_pos(),
                             kClosureArgumentMismatchRuntimeEntry,
                             prologue_locs);
diff --git a/runtime/vm/flow_graph_compiler_ia32.h b/runtime/vm/flow_graph_compiler_ia32.h
index c15ac7b..9e75d91 100644
--- a/runtime/vm/flow_graph_compiler_ia32.h
+++ b/runtime/vm/flow_graph_compiler_ia32.h
@@ -42,9 +42,6 @@
   DescriptorList* pc_descriptors_list() const {
     return pc_descriptors_list_;
   }
-  const GrowableObjectArray& object_table() {
-    return object_table_;
-  }
   BlockEntryInstr* current_block() const { return current_block_; }
   void set_current_block(BlockEntryInstr* value) {
     current_block_ = value;
@@ -102,14 +99,12 @@
                           bool negate_result,
                           LocationSummary* locs);
 
-  // Returns ICData used in the instance call.
-  const ICData& GenerateInstanceCall(intptr_t deopt_id,
-                                     intptr_t token_pos,
-                                     const String& function_name,
-                                     intptr_t argument_count,
-                                     const Array& argument_names,
-                                     intptr_t checked_argument_count,
-                                     LocationSummary* locs);
+  void GenerateInstanceCall(intptr_t deopt_id,
+                            intptr_t token_pos,
+                            intptr_t argument_count,
+                            const Array& argument_names,
+                            LocationSummary* locs,
+                            const ICData& ic_data);
 
   void GenerateStaticCall(intptr_t deopt_id,
                           intptr_t token_pos,
@@ -315,7 +310,6 @@
   GrowableArray<BlockInfo*> block_info_;
   GrowableArray<CompilerDeoptInfo*> deopt_infos_;
   GrowableArray<SlowPathCode*> slow_path_code_;
-  const GrowableObjectArray& object_table_;
   const bool is_optimizing_;
 
   const Bool& bool_true_;
diff --git a/runtime/vm/flow_graph_compiler_x64.cc b/runtime/vm/flow_graph_compiler_x64.cc
index 62b01d6..9aa1a06 100644
--- a/runtime/vm/flow_graph_compiler_x64.cc
+++ b/runtime/vm/flow_graph_compiler_x64.cc
@@ -20,7 +20,6 @@
 
 DECLARE_FLAG(bool, print_ast);
 DECLARE_FLAG(bool, print_scopes);
-DECLARE_FLAG(bool, reject_named_argument_as_positional);
 DECLARE_FLAG(bool, trace_functions);
 DECLARE_FLAG(bool, use_sse41);
 DEFINE_FLAG(bool, trap_on_deoptimization, false, "Trap on deoptimization.");
@@ -698,11 +697,6 @@
   __ j(POSITIVE, &loop, Assembler::kNearJump);
 
   // Copy or initialize optional named arguments.
-
-  if (!FLAG_reject_named_argument_as_positional) {
-    // Treat optional positional parameters as optional named parameters.
-    num_opt_named_params += num_opt_pos_params;
-  }
   const Immediate raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   Label all_arguments_processed;
@@ -738,13 +732,6 @@
     for (int i = 0; i < num_opt_named_params; i++) {
       Label load_default_value, assign_optional_parameter, next_parameter;
       const int param_pos = opt_param_position[i];
-      if (!FLAG_reject_named_argument_as_positional) {
-        // Handle this optional parameter only if k or fewer positional
-        // arguments have been passed, where k is the position of this optional
-        // parameter in the formal parameter list.
-        __ cmpq(RCX, Immediate(param_pos));
-        __ j(GREATER, &next_parameter, Assembler::kNearJump);
-      }
       // Check if this named parameter was passed in.
       __ movq(RAX, Address(RDI, 0));  // Load RAX with the name of the argument.
       ASSERT(opt_param[i]->name().IsSymbol());
@@ -781,7 +768,6 @@
     __ cmpq(Address(RDI, 0), raw_null);
     __ j(EQUAL, &all_arguments_processed, Assembler::kNearJump);
   } else if (num_opt_pos_params > 0) {
-    ASSERT(FLAG_reject_named_argument_as_positional);
     // Number of positional args is the second Smi in descriptor array (R10).
     __ movq(RCX, FieldAddress(R10, Array::data_offset() + (1 * kWordSize)));
     __ SmiUntag(RCX);
@@ -829,6 +815,7 @@
   // dropped the spill slots.
   BitmapBuilder* empty_stack_bitmap = new BitmapBuilder();
   if (function.IsClosureFunction()) {
+    // TODO(regis): Call NoSuchMethod with "call" as name of original function.
     // We do not use GenerateCallRuntime because of the non-standard (empty)
     // stackmap used here.
     __ CallRuntime(kClosureArgumentMismatchRuntimeEntry);
@@ -977,6 +964,8 @@
       __ cmpq(RAX, Immediate(Smi::RawValue(num_fixed_params)));
       __ j(EQUAL, &argc_in_range, Assembler::kNearJump);
       if (function.IsClosureFunction()) {
+        // TODO(regis): Call NoSuchMethod with "call" as name of original
+        // function.
         GenerateCallRuntime(function.token_pos(),
                             kClosureArgumentMismatchRuntimeEntry,
                             prologue_locs);
diff --git a/runtime/vm/flow_graph_compiler_x64.h b/runtime/vm/flow_graph_compiler_x64.h
index 54ca7e4..8bda052 100644
--- a/runtime/vm/flow_graph_compiler_x64.h
+++ b/runtime/vm/flow_graph_compiler_x64.h
@@ -42,9 +42,6 @@
   DescriptorList* pc_descriptors_list() const {
     return pc_descriptors_list_;
   }
-  const GrowableObjectArray& object_table() {
-    return object_table_;
-  }
   BlockEntryInstr* current_block() const { return current_block_; }
   void set_current_block(BlockEntryInstr* value) {
     current_block_ = value;
@@ -102,14 +99,12 @@
                           bool negate_result,
                           LocationSummary* locs);
 
-  // Returns ICData used in the instance call.
-  const ICData& GenerateInstanceCall(intptr_t deopt_id,
-                                     intptr_t token_pos,
-                                     const String& function_name,
-                                     intptr_t argument_count,
-                                     const Array& argument_names,
-                                     intptr_t checked_argument_count,
-                                     LocationSummary* locs);
+  void GenerateInstanceCall(intptr_t deopt_id,
+                            intptr_t token_pos,
+                            intptr_t argument_count,
+                            const Array& argument_names,
+                            LocationSummary* locs,
+                            const ICData& ic_data);
 
   void GenerateStaticCall(intptr_t deopt_id,
                           intptr_t token_pos,
@@ -315,7 +310,6 @@
   GrowableArray<BlockInfo*> block_info_;
   GrowableArray<CompilerDeoptInfo*> deopt_infos_;
   GrowableArray<SlowPathCode*> slow_path_code_;
-  const GrowableObjectArray& object_table_;
   const bool is_optimizing_;
 
   const Bool& bool_true_;
diff --git a/runtime/vm/flow_graph_inliner.cc b/runtime/vm/flow_graph_inliner.cc
index 6aee0ad..74cc804 100644
--- a/runtime/vm/flow_graph_inliner.cc
+++ b/runtime/vm/flow_graph_inliner.cc
@@ -29,7 +29,6 @@
 DECLARE_FLAG(int, deoptimization_counter_threshold);
 DECLARE_FLAG(bool, verify_compiler);
 DECLARE_FLAG(bool, compiler_stats);
-DECLARE_FLAG(bool, reject_named_argument_as_positional);
 
 #define TRACE_INLINING(statement)                                              \
   do {                                                                         \
@@ -280,16 +279,6 @@
       return false;
     }
 
-    // Abort if we are running legacy support for optional parameters.
-    if (!FLAG_reject_named_argument_as_positional &&
-        function.HasOptionalPositionalParameters() &&
-        (!argument_names.IsNull() && (argument_names.Length() > 0))) {
-      function.set_is_inlinable(false);
-      TRACE_INLINING(OS::Print(
-          "     Bailout: named optional positional parameter\n"));
-      return false;
-    }
-
     Isolate* isolate = Isolate::Current();
     // Save and clear IC data.
     const Array& prev_ic_data = Array::Handle(isolate->ic_data_array());
diff --git a/runtime/vm/flow_graph_optimizer.cc b/runtime/vm/flow_graph_optimizer.cc
index cc887c7..e82a9e4 100644
--- a/runtime/vm/flow_graph_optimizer.cc
+++ b/runtime/vm/flow_graph_optimizer.cc
@@ -27,9 +27,11 @@
 DEFINE_FLAG(bool, load_cse, true, "Use redundant load elimination.");
 DEFINE_FLAG(bool, trace_range_analysis, false, "Trace range analysis progress");
 DEFINE_FLAG(bool, trace_constant_propagation, false,
-            "Print constant propagation and useless code elimination.");
+    "Print constant propagation and useless code elimination.");
 DEFINE_FLAG(bool, array_bounds_check_elimination, true,
-            "Eliminate redundant bounds checks.");
+    "Eliminate redundant bounds checks.");
+DEFINE_FLAG(int, max_polymorphic_checks, 4,
+    "Maximum number of polymorphic check, otherwise it is megamorphic.");
 
 
 void FlowGraphOptimizer::ApplyICData() {
@@ -1121,60 +1123,67 @@
 // Tries to optimize instance call by replacing it with a faster instruction
 // (e.g, binary op, field load, ..).
 void FlowGraphOptimizer::VisitInstanceCall(InstanceCallInstr* instr) {
-  if (instr->HasICData() && (instr->ic_data()->NumberOfChecks() > 0)) {
-    const Token::Kind op_kind = instr->token_kind();
-    if ((op_kind == Token::kASSIGN_INDEX) &&
-        TryReplaceWithStoreIndexed(instr)) {
-      return;
-    }
-    if ((op_kind == Token::kINDEX) && TryReplaceWithLoadIndexed(instr)) {
-      return;
-    }
-    if (Token::IsBinaryOperator(op_kind) &&
-        TryReplaceWithBinaryOp(instr, op_kind)) {
-      return;
-    }
-    if (Token::IsPrefixOperator(op_kind) &&
-        TryReplaceWithUnaryOp(instr, op_kind)) {
-      return;
-    }
-    if ((op_kind == Token::kGET) && TryInlineInstanceGetter(instr)) {
-      return;
-    }
-    if ((op_kind == Token::kSET) && TryInlineInstanceSetter(instr)) {
-      return;
-    }
-    if (TryInlineInstanceMethod(instr)) {
-      return;
-    }
-    const ICData& unary_checks =
-        ICData::ZoneHandle(instr->ic_data()->AsUnaryClassChecks());
-    if (!InstanceCallNeedsClassCheck(instr)) {
-      const bool call_with_checks = false;
-      PolymorphicInstanceCallInstr* call =
-          new PolymorphicInstanceCallInstr(instr, unary_checks,
-                                           call_with_checks);
-      instr->ReplaceWith(call, current_iterator());
-      return;
-    }
-    const intptr_t kMaxChecks = 4;
-    if (instr->ic_data()->NumberOfChecks() <= kMaxChecks) {
-      bool call_with_checks;
-      if (unary_checks.HasOneTarget()) {
-        // Type propagation has not run yet, we cannot eliminate the check.
-        AddCheckClass(instr, instr->ArgumentAt(0)->value()->Copy());
-        // Call can still deoptimize, do not detach environment from instr.
-        call_with_checks = false;
-      } else {
-        call_with_checks = true;
-      }
-      PolymorphicInstanceCallInstr* call =
-          new PolymorphicInstanceCallInstr(instr, unary_checks,
-                                           call_with_checks);
-      instr->ReplaceWith(call, current_iterator());
-    }
+  if (!instr->HasICData() || (instr->ic_data()->NumberOfChecks() == 0)) {
+    // An instance call without ICData will trigger deoptimization.
+    return;
   }
-  // An instance call without ICData will trigger deoptimization.
+
+  const ICData& unary_checks =
+      ICData::ZoneHandle(instr->ic_data()->AsUnaryClassChecks());
+  if ((unary_checks.NumberOfChecks() > FLAG_max_polymorphic_checks) &&
+      InstanceCallNeedsClassCheck(instr)) {
+    // Too many checks, leave it megamorphic.
+    return;
+  }
+
+  const Token::Kind op_kind = instr->token_kind();
+  if ((op_kind == Token::kASSIGN_INDEX) &&
+      TryReplaceWithStoreIndexed(instr)) {
+    return;
+  }
+  if ((op_kind == Token::kINDEX) && TryReplaceWithLoadIndexed(instr)) {
+    return;
+  }
+  if (Token::IsBinaryOperator(op_kind) &&
+      TryReplaceWithBinaryOp(instr, op_kind)) {
+    return;
+  }
+  if (Token::IsPrefixOperator(op_kind) &&
+      TryReplaceWithUnaryOp(instr, op_kind)) {
+    return;
+  }
+  if ((op_kind == Token::kGET) && TryInlineInstanceGetter(instr)) {
+    return;
+  }
+  if ((op_kind == Token::kSET) && TryInlineInstanceSetter(instr)) {
+    return;
+  }
+  if (TryInlineInstanceMethod(instr)) {
+    return;
+  }
+  if (!InstanceCallNeedsClassCheck(instr)) {
+    const bool call_with_checks = false;
+    PolymorphicInstanceCallInstr* call =
+        new PolymorphicInstanceCallInstr(instr, unary_checks,
+                                         call_with_checks);
+    instr->ReplaceWith(call, current_iterator());
+    return;
+  }
+  if (unary_checks.NumberOfChecks() <= FLAG_max_polymorphic_checks) {
+    bool call_with_checks;
+    if (unary_checks.HasOneTarget()) {
+      // Type propagation has not run yet, we cannot eliminate the check.
+      AddCheckClass(instr, instr->ArgumentAt(0)->value()->Copy());
+      // Call can still deoptimize, do not detach environment from instr.
+      call_with_checks = false;
+    } else {
+      call_with_checks = true;
+    }
+    PolymorphicInstanceCallInstr* call =
+        new PolymorphicInstanceCallInstr(instr, unary_checks,
+                                         call_with_checks);
+    instr->ReplaceWith(call, current_iterator());
+  }
 }
 
 
@@ -1251,33 +1260,39 @@
 static void HandleRelationalOp(FlowGraphOptimizer* optimizer,
                                RelationalOpInstr* comp,
                                Instruction* instr) {
-  if (!comp->HasICData()) return;
-
+  if (!comp->HasICData() || (comp->ic_data()->NumberOfChecks() == 0)) {
+    return;
+  }
   const ICData& ic_data = *comp->ic_data();
-  if (ic_data.NumberOfChecks() == 0) return;
-  // TODO(srdjan): Add multiple receiver type support.
-  if (ic_data.NumberOfChecks() != 1) return;
-  ASSERT(ic_data.HasOneTarget());
-
-  if (HasOnlyTwoSmis(ic_data)) {
-    optimizer->InsertBefore(
-        instr,
-        new CheckSmiInstr(comp->left()->Copy(), comp->deopt_id()),
-        instr->env(),
-        Definition::kEffect);
-    optimizer->InsertBefore(
-        instr,
-        new CheckSmiInstr(comp->right()->Copy(), comp->deopt_id()),
-        instr->env(),
-        Definition::kEffect);
-    comp->set_operands_class_id(kSmiCid);
-  } else if (ShouldSpecializeForDouble(ic_data)) {
-    comp->set_operands_class_id(kDoubleCid);
-  } else if (comp->ic_data()->AllReceiversAreNumbers()) {
-    comp->set_operands_class_id(kNumberCid);
+  if (ic_data.NumberOfChecks() == 1) {
+    ASSERT(ic_data.HasOneTarget());
+    if (HasOnlyTwoSmis(ic_data)) {
+      optimizer->InsertBefore(
+          instr,
+          new CheckSmiInstr(comp->left()->Copy(), comp->deopt_id()),
+          instr->env(),
+          Definition::kEffect);
+      optimizer->InsertBefore(
+          instr,
+          new CheckSmiInstr(comp->right()->Copy(), comp->deopt_id()),
+          instr->env(),
+          Definition::kEffect);
+      comp->set_operands_class_id(kSmiCid);
+    } else if (ShouldSpecializeForDouble(ic_data)) {
+      comp->set_operands_class_id(kDoubleCid);
+    } else if (HasTwoMintOrSmi(*comp->ic_data()) &&
+               FlowGraphCompiler::SupportsUnboxedMints()) {
+      comp->set_operands_class_id(kMintCid);
+    } else {
+      ASSERT(comp->operands_class_id() == kIllegalCid);
+    }
+  } else if (HasTwoMintOrSmi(*comp->ic_data()) &&
+             FlowGraphCompiler::SupportsUnboxedMints()) {
+    comp->set_operands_class_id(kMintCid);
   }
 }
 
+
 void FlowGraphOptimizer::VisitRelationalOp(RelationalOpInstr* instr) {
   HandleRelationalOp(this, instr, instr);
 }
@@ -1333,8 +1348,6 @@
   } else if (HasTwoMintOrSmi(*comp->ic_data()) &&
              FlowGraphCompiler::SupportsUnboxedMints()) {
     comp->set_receiver_class_id(kMintCid);
-  } else if (comp->ic_data()->AllReceiversAreNumbers()) {
-    comp->set_receiver_class_id(kNumberCid);
   }
 
   if (comp->receiver_class_id() != kIllegalCid) {
@@ -1455,9 +1468,8 @@
 
 
 PhiInstr* SminessPropagator::RemoveLastFromWorklist() {
-  PhiInstr* phi = worklist_.Last();
+  PhiInstr* phi = worklist_.RemoveLast();
   ASSERT(in_worklist_->Contains(phi->ssa_temp_index()));
-  worklist_.RemoveLast();
   in_worklist_->Remove(phi->ssa_temp_index());
   return phi;
 }
@@ -1618,6 +1630,13 @@
                                        Range* constraint,
                                        Instruction* after);
 
+  void ConstrainValueAfterBranch(Definition* defn, Value* use);
+  void ConstrainValueAfterCheckArrayBound(Definition* defn,
+                                          CheckArrayBoundInstr* check);
+  Definition* LoadArrayLength(CheckArrayBoundInstr* check);
+
+
+
   // Replace uses of the definition def that are dominated by instruction dom
   // with uses of other definition.
   void RenameDominatedUses(Definition* def,
@@ -1676,6 +1695,42 @@
   GrowableArray<Definition*> worklist_;
   BitVector* marked_defns_;
 
+  class ArrayLengthData : public ValueObject {
+   public:
+    ArrayLengthData(Definition* array, Definition* array_length)
+        : array_(array), array_length_(array_length) { }
+
+    Definition* array() const { return array_; }
+    Definition* array_length() const { return array_length_; }
+
+    typedef Definition* Value;
+    typedef Definition* Key;
+    typedef class ArrayLengthData Pair;
+
+    // KeyValueTrait members.
+    static Key KeyOf(const ArrayLengthData& data) {
+      return data.array();
+    }
+
+    static Value ValueOf(const ArrayLengthData& data) {
+      return data.array_length();
+    }
+
+    static inline intptr_t Hashcode(Key key) {
+      return reinterpret_cast<intptr_t>(key);
+    }
+
+    static inline bool IsKeyEqual(const ArrayLengthData& kv, Key key) {
+      return kv.array() == key;
+    }
+
+   private:
+    Definition* array_;
+    Definition* array_length_;
+  };
+
+  DirectChainedHashMap<ArrayLengthData> array_lengths_;
+
   DISALLOW_COPY_AND_ASSIGN(RangeAnalysis);
 };
 
@@ -1864,53 +1919,111 @@
 }
 
 
+void RangeAnalysis::ConstrainValueAfterBranch(Definition* defn, Value* use) {
+  BranchInstr* branch = use->instruction()->AsBranch();
+  RelationalOpInstr* rel_op = branch->comparison()->AsRelationalOp();
+  if ((rel_op != NULL) && (rel_op->operands_class_id() == kSmiCid)) {
+    // Found comparison of two smis. Constrain defn at true and false
+    // successors using the other operand as a boundary.
+    Definition* boundary;
+    Token::Kind op_kind;
+    if (use->use_index() == 0) {  // Left operand.
+      boundary = rel_op->InputAt(1)->definition();
+      op_kind = rel_op->kind();
+    } else {
+      ASSERT(use->use_index() == 1);  // Right operand.
+      boundary = rel_op->InputAt(0)->definition();
+      // InsertConstraintFor assumes that defn is left operand of a
+      // comparison if it is right operand flip the comparison.
+      op_kind = FlipComparison(rel_op->kind());
+    }
+
+    // Constrain definition at the true successor.
+    ConstraintInstr* true_constraint =
+        InsertConstraintFor(defn,
+                            ConstraintRange(op_kind, boundary),
+                            branch->true_successor());
+    // Mark true_constraint an artificial use of boundary. This ensures
+    // that constraint's range is recalculated if boundary's range changes.
+    if (true_constraint != NULL) true_constraint->AddDependency(boundary);
+
+    // Constrain definition with a negated condition at the false successor.
+    ConstraintInstr* false_constraint =
+        InsertConstraintFor(
+            defn,
+            ConstraintRange(NegateComparison(op_kind), boundary),
+            branch->false_successor());
+    // Mark false_constraint an artificial use of boundary. This ensures
+    // that constraint's range is recalculated if boundary's range changes.
+    if (false_constraint != NULL) false_constraint->AddDependency(boundary);
+  }
+}
+
 void RangeAnalysis::InsertConstraintsFor(Definition* defn) {
   for (Value* use = defn->input_use_list();
        use != NULL;
        use = use->next_use()) {
     if (use->instruction()->IsBranch()) {
-      BranchInstr* branch = use->instruction()->AsBranch();
-      RelationalOpInstr* rel_op = branch->comparison()->AsRelationalOp();
-      if ((rel_op != NULL) && (rel_op->operands_class_id() == kSmiCid)) {
-        // Found comparison of two smis. Constrain defn at true and false
-        // successors using the other operand as a boundary.
-        Definition* boundary;
-        Token::Kind op_kind;
-        if (use->use_index() == 0) {  // Left operand.
-          boundary = rel_op->InputAt(1)->definition();
-          op_kind = rel_op->kind();
-        } else {
-          ASSERT(use->use_index() == 1);  // Right operand.
-          boundary = rel_op->InputAt(0)->definition();
-          // InsertConstraintFor assumes that defn is left operand of a
-          // comparison if it is right operand flip the comparison.
-          op_kind = FlipComparison(rel_op->kind());
-        }
-
-        // Constrain definition at the true successor.
-        ConstraintInstr* true_constraint =
-            InsertConstraintFor(defn,
-                                ConstraintRange(op_kind, boundary),
-                                branch->true_successor());
-        // Mark true_constraint an artificial use of boundary. This ensures
-        // that constraint's range is recalculated if boundary's range changes.
-        if (true_constraint != NULL) true_constraint->AddDependency(boundary);
-
-        // Constrain definition with a negated condition at the false successor.
-        ConstraintInstr* false_constraint =
-            InsertConstraintFor(
-                defn,
-                ConstraintRange(NegateComparison(op_kind), boundary),
-                branch->false_successor());
-        // Mark false_constraint an artificial use of boundary. This ensures
-        // that constraint's range is recalculated if boundary's range changes.
-        if (false_constraint != NULL) false_constraint->AddDependency(boundary);
-      }
+      ConstrainValueAfterBranch(defn, use);
+    } else if (use->instruction()->IsCheckArrayBound()) {
+      ConstrainValueAfterCheckArrayBound(
+          defn,
+          use->instruction()->AsCheckArrayBound());
     }
   }
 }
 
 
+Definition* RangeAnalysis::LoadArrayLength(CheckArrayBoundInstr* check) {
+  Definition* array = check->array()->definition();
+
+  Definition* length = array_lengths_.Lookup(array);
+  if (length != NULL) return length;
+
+  StaticCallInstr* allocation = array->AsStaticCall();
+  if ((allocation != NULL) &&
+      allocation->is_known_constructor() &&
+      (allocation->ResultCid() == kArrayCid)) {
+    // For fixed length arrays check if array is the result of a constructor
+    // call. In this case we can use the length passed to the constructor
+    // instead of loading it from array itself.
+    length = allocation->ArgumentAt(1)->value()->definition();
+  } else {
+    // Load length from the array. Do not insert instruction into the graph.
+    // It will only be used in range boundaries.
+    LoadFieldInstr* length_load = new LoadFieldInstr(
+        check->array()->Copy(),
+        Array::length_offset(),
+        Type::ZoneHandle(Type::SmiType()),
+        true);  // Immutable.
+    length_load->set_recognized_kind(MethodRecognizer::kObjectArrayLength);
+    length_load->set_result_cid(kSmiCid);
+    length_load->set_ssa_temp_index(flow_graph_->alloc_ssa_temp_index());
+    length = length_load;
+  }
+
+  ASSERT(length != NULL);
+  array_lengths_.Insert(ArrayLengthData(array, length));
+  return length;
+}
+
+
+void RangeAnalysis::ConstrainValueAfterCheckArrayBound(
+    Definition* defn, CheckArrayBoundInstr* check) {
+  if ((check->array_type() != kArrayCid) &&
+      (check->array_type() != kImmutableArrayCid)) {
+    return;
+  }
+
+  Definition* length = LoadArrayLength(check);
+
+  Range* constraint_range = new Range(
+      RangeBoundary::FromConstant(0),
+      RangeBoundary::FromDefinition(length, -1));
+  InsertConstraintFor(defn, constraint_range, check);
+}
+
+
 void RangeAnalysis::InsertConstraints() {
   for (intptr_t i = 0; i < smi_checks_.length(); i++) {
     CheckSmiInstr* check = smi_checks_[i];
@@ -1978,8 +2091,7 @@
   ResetWorklist();
   MarkDefinition(var);
   while (!worklist_.is_empty()) {
-    Definition* defn = worklist_.Last();
-    worklist_.RemoveLast();
+    Definition* defn = worklist_.RemoveLast();
 
     if (defn->IsPhi()) {
       PhiInstr* phi = defn->AsPhi();
@@ -2097,9 +2209,11 @@
         smi_definitions_->Contains(defn->ssa_temp_index())) {
       defn->InferRange();
     } else if (FLAG_array_bounds_check_elimination &&
-               current->IsCheckArrayBound() &&
-               current->AsCheckArrayBound()->IsRedundant()) {
-      it.RemoveCurrentFromGraph();
+               current->IsCheckArrayBound()) {
+      CheckArrayBoundInstr* check = current->AsCheckArrayBound();
+      RangeBoundary array_length =
+          RangeBoundary::FromDefinition(LoadArrayLength(check));
+      if (check->IsRedundant(array_length)) it.RemoveCurrentFromGraph();
     }
   }
 
@@ -2547,7 +2661,7 @@
 
 
 static intptr_t NumberLoadExpressions(FlowGraph* graph) {
-  DirectChainedHashMap<Definition*> map;
+  DirectChainedHashMap<PointerKeyValueTrait<Definition> > map;
   intptr_t expr_id = 0;
   for (BlockIterator it = graph->reverse_postorder_iterator();
        !it.Done();
@@ -2737,7 +2851,7 @@
     }
   }
 
-  DirectChainedHashMap<Instruction*> map;
+  DirectChainedHashMap<PointerKeyValueTrait<Instruction> > map;
   changed = OptimizeRecursive(graph->graph_entry(), &map) || changed;
 
   return changed;
@@ -2746,7 +2860,7 @@
 
 bool DominatorBasedCSE::OptimizeRecursive(
     BlockEntryInstr* block,
-    DirectChainedHashMap<Instruction*>* map) {
+    DirectChainedHashMap<PointerKeyValueTrait<Instruction> >* map) {
   bool changed = false;
   for (ForwardInstructionIterator it(block); !it.Done(); it.Advance()) {
     Instruction* current = it.Current();
@@ -2766,7 +2880,8 @@
   for (intptr_t i = 0; i < num_children; ++i) {
     BlockEntryInstr* child = block->dominated_blocks()[i];
     if (i  < num_children - 1) {
-      DirectChainedHashMap<Instruction*> child_map(*map);  // Copy map.
+      // Copy map.
+      DirectChainedHashMap<PointerKeyValueTrait<Instruction> > child_map(*map);
       changed = OptimizeRecursive(child, &child_map) || changed;
     } else {
       // Reuse map for the last child.
@@ -3066,8 +3181,18 @@
 void ConstantPropagator::VisitStrictCompare(StrictCompareInstr* instr) {
   const Object& left = instr->left()->definition()->constant_value();
   const Object& right = instr->right()->definition()->constant_value();
+
   if (IsNonConstant(left) || IsNonConstant(right)) {
-    SetValue(instr, non_constant_);
+    // TODO(vegorov): incorporate nullability information into the lattice.
+    if ((left.IsNull() && (instr->right()->ResultCid() != kDynamicCid)) ||
+        (right.IsNull() && (instr->left()->ResultCid() != kDynamicCid))) {
+      bool result = left.IsNull() ? (instr->right()->ResultCid() == kNullCid)
+                                  : (instr->left()->ResultCid() == kNullCid);
+      if (instr->kind() == Token::kNE_STRICT) result = !result;
+      SetValue(instr, Bool::ZoneHandle(Bool::Get(result)));
+    } else {
+      SetValue(instr, non_constant_);
+    }
   } else if (IsConstant(left) && IsConstant(right)) {
     bool result = (left.raw() == right.raw());
     if (instr->kind() == Token::kNE_STRICT) result = !result;
@@ -3380,8 +3505,7 @@
   while (true) {
     if (block_worklist_.is_empty()) {
       if (definition_worklist_.is_empty()) break;
-      Definition* definition = definition_worklist_.Last();
-      definition_worklist_.RemoveLast();
+      Definition* definition = definition_worklist_.RemoveLast();
       definition_marks_->Remove(definition->ssa_temp_index());
       Value* use = definition->input_use_list();
       while (use != NULL) {
@@ -3389,8 +3513,7 @@
         use = use->next_use();
       }
     } else {
-      BlockEntryInstr* block = block_worklist_.Last();
-      block_worklist_.RemoveLast();
+      BlockEntryInstr* block = block_worklist_.RemoveLast();
       block->Accept(this);
     }
   }
@@ -3404,6 +3527,8 @@
     printer.PrintBlocks();
   }
 
+  GrowableArray<PhiInstr*> redundant_phis(10);
+
   // We will recompute dominators, block ordering, block ids, block last
   // instructions, previous pointers, predecessors, etc. after eliminating
   // unreachable code.  We do not maintain those properties during the
@@ -3446,6 +3571,7 @@
             PhiInstr* phi = (*phis)[phi_idx];
             if (phi == NULL) continue;
             phi->inputs_.TruncateTo(live_count);
+            if (live_count == 1) redundant_phis.Add(phi);
           }
         }
       }
@@ -3521,6 +3647,12 @@
   graph_->ComputeDominators(&dominance_frontier);
   graph_->ComputeUseLists();
 
+  for (intptr_t i = 0; i < redundant_phis.length(); i++) {
+    PhiInstr* phi = redundant_phis[i];
+    phi->ReplaceUsesWith(phi->InputAt(0)->definition());
+    phi->mark_dead();
+  }
+
   if (FLAG_trace_constant_propagation) {
     OS::Print("\n==== After constant propagation ====\n");
     FlowGraphPrinter printer(*graph_);
diff --git a/runtime/vm/flow_graph_optimizer.h b/runtime/vm/flow_graph_optimizer.h
index 7d86ac1..cd0cda1 100644
--- a/runtime/vm/flow_graph_optimizer.h
+++ b/runtime/vm/flow_graph_optimizer.h
@@ -12,6 +12,7 @@
 
 template <typename T> class GrowableArray;
 template <typename T> class DirectChainedHashMap;
+template <typename T> class PointerKeyValueTrait;
 
 class FlowGraphOptimizer : public FlowGraphVisitor {
  public:
@@ -163,7 +164,7 @@
  private:
   static bool OptimizeRecursive(
       BlockEntryInstr* entry,
-      DirectChainedHashMap<Instruction*>* map);
+      DirectChainedHashMap<PointerKeyValueTrait<Instruction> >* map);
 };
 
 
diff --git a/runtime/vm/growable_array.h b/runtime/vm/growable_array.h
index 91c95c2..a8aa2d3 100644
--- a/runtime/vm/growable_array.h
+++ b/runtime/vm/growable_array.h
@@ -46,9 +46,11 @@
     Last() = value;
   }
 
-  void RemoveLast() {
+  T& RemoveLast() {
     ASSERT(length_ > 0);
+    T& result = operator[](length_ - 1);
     length_--;
+    return result;
   }
 
   T& operator[](int index) const {
diff --git a/runtime/vm/hash_map.h b/runtime/vm/hash_map.h
index 0c41f12..22efc32 100644
--- a/runtime/vm/hash_map.h
+++ b/runtime/vm/hash_map.h
@@ -7,7 +7,7 @@
 
 namespace dart {
 
-template <typename T>
+template <typename KeyValueTrait>
 class DirectChainedHashMap: public ValueObject {
  public:
   DirectChainedHashMap() : array_size_(0),
@@ -22,16 +22,16 @@
 
   DirectChainedHashMap(const DirectChainedHashMap& other);
 
-  void Insert(T value);
+  void Insert(typename KeyValueTrait::Pair kv);
 
-  T Lookup(T value) const;
+  typename KeyValueTrait::Value Lookup(typename KeyValueTrait::Key key) const;
 
   bool IsEmpty() const { return count_ == 0; }
 
  private:
   // A linked list of T values.  Stored in arrays.
   struct HashMapListElement {
-    T value;
+    typename KeyValueTrait::Pair kv;
     intptr_t next;  // Index in the array of the next list element.
   };
   static const intptr_t kNil = -1;  // The end of a linked list
@@ -53,15 +53,22 @@
 };
 
 
-template <typename T>
-T DirectChainedHashMap<T>::Lookup(T value) const {
-  uword hash = static_cast<uword>(value->Hashcode());
+template <typename KeyValueTrait>
+typename KeyValueTrait::Value
+    DirectChainedHashMap<KeyValueTrait>::
+        Lookup(typename KeyValueTrait::Key key) const {
+  uword hash = static_cast<uword>(KeyValueTrait::Hashcode(key));
   uword pos = Bound(hash);
-  if (array_[pos].value != NULL) {
-    if (array_[pos].value->Equals(value)) return array_[pos].value;
+  if (KeyValueTrait::ValueOf(array_[pos].kv) != NULL) {
+    if (KeyValueTrait::IsKeyEqual(array_[pos].kv, key)) {
+      return KeyValueTrait::ValueOf(array_[pos].kv);
+    }
+
     intptr_t next = array_[pos].next;
     while (next != kNil) {
-      if (lists_[next].value->Equals(value)) return lists_[next].value;
+      if (KeyValueTrait::IsKeyEqual(lists_[next].kv, key)) {
+        return KeyValueTrait::ValueOf(lists_[next].kv);
+      }
       next = lists_[next].next;
     }
   }
@@ -69,8 +76,9 @@
 }
 
 
-template <typename T>
-DirectChainedHashMap<T>::DirectChainedHashMap(const DirectChainedHashMap& other)
+template <typename KeyValueTrait>
+DirectChainedHashMap<KeyValueTrait>::
+    DirectChainedHashMap(const DirectChainedHashMap& other)
   : ValueObject(),
     array_size_(other.array_size_),
     lists_size_(other.lists_size_),
@@ -85,8 +93,8 @@
 }
 
 
-template <typename T>
-void DirectChainedHashMap<T>::Resize(intptr_t new_size) {
+template <typename KeyValueTrait>
+void DirectChainedHashMap<KeyValueTrait>::Resize(intptr_t new_size) {
   ASSERT(new_size > count_);
   // Hashing the values into the new array has no more collisions than in the
   // old hash map, so we can use the existing lists_ array, if we are careful.
@@ -111,17 +119,17 @@
   if (old_array != NULL) {
     // Iterate over all the elements in lists, rehashing them.
     for (intptr_t i = 0; i < old_size; ++i) {
-      if (old_array[i].value != NULL) {
+      if (KeyValueTrait::ValueOf(old_array[i].kv) != NULL) {
         intptr_t current = old_array[i].next;
         while (current != kNil) {
-          Insert(lists_[current].value);
+          Insert(lists_[current].kv);
           intptr_t next = lists_[current].next;
           lists_[current].next = free_list_head_;
           free_list_head_ = current;
           current = next;
         }
         // Rehash the directly stored value.
-        Insert(old_array[i].value);
+        Insert(old_array[i].kv);
       }
     }
   }
@@ -155,16 +163,18 @@
 }
 
 
-template <typename T>
-void DirectChainedHashMap<T>::Insert(T value) {
-  ASSERT(value != NULL);
+template <typename KeyValueTrait>
+void DirectChainedHashMap<KeyValueTrait>::
+    Insert(typename KeyValueTrait::Pair kv) {
+  ASSERT(KeyValueTrait::ValueOf(kv) != NULL);
   // Resizing when half of the hashtable is filled up.
   if (count_ >= array_size_ >> 1) Resize(array_size_ << 1);
   ASSERT(count_ < array_size_);
   count_++;
-  uword pos = Bound(static_cast<uword>(value->Hashcode()));
-  if (array_[pos].value == NULL) {
-    array_[pos].value = value;
+  uword pos = Bound(
+      static_cast<uword>(KeyValueTrait::Hashcode(KeyValueTrait::KeyOf(kv))));
+  if (KeyValueTrait::ValueOf(array_[pos].kv) == NULL) {
+    array_[pos].kv = kv;
     array_[pos].next = kNil;
   } else {
     if (free_list_head_ == kNil) {
@@ -173,13 +183,39 @@
     intptr_t new_element_pos = free_list_head_;
     ASSERT(new_element_pos != kNil);
     free_list_head_ = lists_[free_list_head_].next;
-    lists_[new_element_pos].value = value;
+    lists_[new_element_pos].kv = kv;
     lists_[new_element_pos].next = array_[pos].next;
-    ASSERT(array_[pos].next == kNil || lists_[array_[pos].next].value != NULL);
+    ASSERT(array_[pos].next == kNil ||
+           KeyValueTrait::ValueOf(lists_[array_[pos].next].kv) != NULL);
     array_[pos].next = new_element_pos;
   }
 }
 
+
+template<typename T>
+class PointerKeyValueTrait {
+ public:
+  typedef T* Value;
+  typedef T* Key;
+  typedef T* Pair;
+
+  static Key KeyOf(Pair kv) {
+    return kv;
+  }
+
+  static Value ValueOf(Pair kv) {
+    return kv;
+  }
+
+  static inline intptr_t Hashcode(Key key) {
+    return key->Hashcode();
+  }
+
+  static inline bool IsKeyEqual(Pair kv, Key key) {
+    return kv->Equals(key);
+  }
+};
+
 }  // namespace dart
 
 #endif  // VM_HASH_MAP_H_
diff --git a/runtime/vm/hash_map_test.cc b/runtime/vm/hash_map_test.cc
index a5b4afe..522ff7c 100644
--- a/runtime/vm/hash_map_test.cc
+++ b/runtime/vm/hash_map_test.cc
@@ -19,7 +19,7 @@
 
 
 TEST_CASE(DirectChainedHashMap) {
-  DirectChainedHashMap<TestValue*> map;
+  DirectChainedHashMap<PointerKeyValueTrait<TestValue> > map;
   EXPECT(map.IsEmpty());
   TestValue v1(0);
   TestValue v2(1);
@@ -30,7 +30,7 @@
   EXPECT(map.Lookup(&v1) == &v1);
   EXPECT(map.Lookup(&v2) == &v2);
   EXPECT(map.Lookup(&v3) == &v1);
-  DirectChainedHashMap<TestValue*> map2(map);
+  DirectChainedHashMap<PointerKeyValueTrait<TestValue> > map2(map);
   EXPECT(map2.Lookup(&v1) == &v1);
   EXPECT(map2.Lookup(&v2) == &v2);
   EXPECT(map2.Lookup(&v3) == &v1);
diff --git a/runtime/vm/heap_profiler.cc b/runtime/vm/heap_profiler.cc
index e595067..f218a81 100644
--- a/runtime/vm/heap_profiler.cc
+++ b/runtime/vm/heap_profiler.cc
@@ -278,10 +278,8 @@
     }
     case kOneByteStringCid:
     case kTwoByteStringCid:
-    case kFourByteStringCid:
     case kExternalOneByteStringCid:
-    case kExternalTwoByteStringCid:
-    case kExternalFourByteStringCid: {
+    case kExternalTwoByteStringCid: {
       WriteInstanceDump(StringId(reinterpret_cast<const RawString*>(raw_obj)));
       break;
     }
@@ -355,7 +353,8 @@
       int32_t ch = onestr->ptr()->data_[i];
       j += Utf8::Encode(ch, &characters[j]);
     }
-  } else if (class_id == kTwoByteStringCid) {
+  } else {
+    ASSERT(class_id == kTwoByteStringCid);
     const RawTwoByteString* twostr =
         reinterpret_cast<const RawTwoByteString*>(raw_string);
     for (intptr_t i = 0; i < Smi::Value(twostr->ptr()->length_); ++i) {
@@ -366,18 +365,6 @@
       int32_t ch = twostr->ptr()->data_[i];
       j += Utf8::Encode(ch, &characters[j]);
     }
-  } else {
-    ASSERT(class_id == kFourByteStringCid);
-    const RawFourByteString* fourstr =
-        reinterpret_cast<const RawFourByteString*>(raw_string);
-    for (intptr_t i = 0; i < Smi::Value(fourstr->ptr()->length_); ++i) {
-      length += Utf8::Length(fourstr->ptr()->data_[i]);
-    }
-    characters = new char[length];
-    for (intptr_t i = 0, j = 0; i < Smi::Value(fourstr->ptr()->length_); ++i) {
-      int32_t ch = fourstr->ptr()->data_[i];
-      j += Utf8::Encode(ch, &characters[j]);
-    }
   }
   Record record(kStringInUtf8, this);
   record.WritePointer(ObjectId(raw_string));
diff --git a/runtime/vm/heap_test.cc b/runtime/vm/heap_test.cc
index 440cdda..0a487e5 100644
--- a/runtime/vm/heap_test.cc
+++ b/runtime/vm/heap_test.cc
@@ -18,9 +18,7 @@
   "}\n";
   FLAG_verbose_gc = true;
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
-  Dart_Handle result = Dart_Invoke(lib,
-                                   Dart_NewString("main"),
-                                   0, NULL);
+  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
 
   EXPECT_VALID(result);
   EXPECT(!Dart_IsNull(result));
@@ -39,9 +37,7 @@
   FLAG_verbose_gc = true;
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
   Dart_EnterScope();
-  Dart_Handle result = Dart_Invoke(lib,
-                                   Dart_NewString("main"),
-                                   0, NULL);
+  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
 
   EXPECT_VALID(result);
   EXPECT(!Dart_IsNull(result));
diff --git a/runtime/vm/intermediate_language.cc b/runtime/vm/intermediate_language.cc
index a6f5fc5..97fd838 100644
--- a/runtime/vm/intermediate_language.cc
+++ b/runtime/vm/intermediate_language.cc
@@ -20,8 +20,10 @@
 
 namespace dart {
 
+DEFINE_FLAG(bool, propagate_ic_data, true,
+    "Propagate IC data from unoptimized to optimized IC calls.");
 DECLARE_FLAG(bool, enable_type_checks);
-
+DECLARE_FLAG(int, max_polymorphic_checks);
 
 Definition::Definition()
     : range_(NULL),
@@ -1074,6 +1076,13 @@
 }
 
 
+bool EqualityCompareInstr::IsPolymorphic() const {
+  return HasICData() &&
+      (ic_data()->NumberOfChecks() > 0) &&
+      (ic_data()->NumberOfChecks() <= FLAG_max_polymorphic_checks);
+}
+
+
 RawAbstractType* RelationalOpInstr::CompileType() const {
   if ((operands_class_id() == kSmiCid) ||
       (operands_class_id() == kDoubleCid) ||
@@ -1839,31 +1848,39 @@
 
 
 void InstanceCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  ICData& call_ic_data = ICData::ZoneHandle(ic_data()->raw());
+  if (!FLAG_propagate_ic_data || !compiler->is_optimizing()) {
+    call_ic_data = ICData::New(compiler->parsed_function().function(),
+                               function_name(),
+                               deopt_id(),
+                               checked_argument_count());
+  }
   if (compiler->is_optimizing()) {
     if (HasICData() && (ic_data()->NumberOfChecks() > 0)) {
+      const ICData& unary_ic_data =
+          ICData::ZoneHandle(ic_data()->AsUnaryClassChecks());
       compiler->GenerateInstanceCall(deopt_id(),
                                      token_pos(),
-                                     function_name(),
                                      ArgumentCount(),
                                      argument_names(),
-                                     checked_argument_count(),
-                                     locs());
+                                     locs(),
+                                     unary_ic_data);
     } else {
       Label* deopt =
           compiler->AddDeoptStub(deopt_id(), kDeoptInstanceCallNoICData);
       __ jmp(deopt);
     }
   } else {
+    ASSERT(!HasICData());
     compiler->AddCurrentDescriptor(PcDescriptors::kDeoptBefore,
                                    deopt_id(),
                                    token_pos());
     compiler->GenerateInstanceCall(deopt_id(),
                                    token_pos(),
-                                   function_name(),
                                    ArgumentCount(),
                                    argument_names(),
-                                   checked_argument_count(),
-                                   locs());
+                                   locs(),
+                                   call_ic_data);
   }
 }
 
@@ -2117,13 +2134,15 @@
 }
 
 
+static bool AreEqualDefinitions(Definition* a, Definition* b) {
+  return (a == b) || (!a->AffectedBySideEffect() && a->Equals(b));
+}
+
+
 // Returns true if two range boundaries refer to the same symbol.
 static bool DependOnSameSymbol(const RangeBoundary& a, const RangeBoundary& b) {
-  if (!a.IsSymbol() || !b.IsSymbol()) return false;
-  if (a.symbol() == b.symbol()) return true;
-
-  return !a.symbol()->AffectedBySideEffect() &&
-      a.symbol()->Equals(b.symbol());
+  return a.IsSymbol() && b.IsSymbol() &&
+      AreEqualDefinitions(a.symbol(), b.symbol());
 }
 
 
@@ -2449,12 +2468,6 @@
 }
 
 
-static bool IsLengthOf(Definition* defn, Definition* array) {
-  return IsArrayLength(defn) &&
-      (defn->AsLoadField()->value()->definition() == array);
-}
-
-
 void BinarySmiOpInstr::InferRange() {
   // TODO(vegorov): canonicalize BinarySmiOp to always have constant on the
   // right and a non-constant on the left.
@@ -2513,6 +2526,23 @@
       }
       break;
 
+    case Token::kBIT_AND:
+      if (Range::ConstantMin(right_range).value() >= 0) {
+        min = RangeBoundary::FromConstant(0);
+        max = Range::ConstantMax(right_range);
+        break;
+      }
+      if (Range::ConstantMin(left_range).value() >= 0) {
+        min = RangeBoundary::FromConstant(0);
+        max = Range::ConstantMax(left_range);
+        break;
+      }
+
+      if (range_ == NULL) {
+        range_ = Range::Unknown();
+      }
+      return;
+
     default:
       if (range_ == NULL) {
         range_ = Range::Unknown();
@@ -2530,7 +2560,15 @@
 }
 
 
-bool CheckArrayBoundInstr::IsRedundant() {
+// Inclusive.
+bool Range::IsWithin(intptr_t min_int, intptr_t max_int) const {
+  if (min().LowerBound().value() < min_int) return false;
+  if (max().UpperBound().value() > max_int) return false;
+  return true;
+}
+
+
+bool CheckArrayBoundInstr::IsRedundant(RangeBoundary length) {
   // Check that array has an immutable length.
   if ((array_type() != kArrayCid) && (array_type() != kImmutableArrayCid)) {
     return false;
@@ -2546,13 +2584,21 @@
 
   RangeBoundary max = CanonicalizeBoundary(index_range->max(),
                                            RangeBoundary::OverflowedMaxSmi());
+
+  if (max.Overflowed()) return false;
+
+  // Try to compare constant boundaries.
+  if (max.UpperBound().value() < length.LowerBound().value()) {
+    return true;
+  }
+
+  length = CanonicalizeBoundary(length, RangeBoundary::OverflowedMaxSmi());
+  if (length.Overflowed()) return false;
+
+  // Try symbolic comparison.
   do {
-    if (max.IsSymbol() &&
-        (max.offset() < 0) &&
-        IsLengthOf(max.symbol(), array()->definition())) {
-      return true;
-    }
-  } while (CanonicalizeMaxBoundary(&max));
+    if (DependOnSameSymbol(max, length)) return max.offset() < length.offset();
+  } while (CanonicalizeMaxBoundary(&max) || CanonicalizeMinBoundary(&length));
 
   // Failed to prove that maximum is bounded with array length.
   return false;
diff --git a/runtime/vm/intermediate_language.h b/runtime/vm/intermediate_language.h
index 646eeba..0bd4fde 100644
--- a/runtime/vm/intermediate_language.h
+++ b/runtime/vm/intermediate_language.h
@@ -1177,6 +1177,7 @@
   // Phi is alive if it reaches a non-environment use.
   bool is_alive() const { return is_alive_; }
   void mark_alive() { is_alive_ = true; }
+  void mark_dead() { is_alive_ = false; }
 
   virtual Representation RequiredInputRepresentation(intptr_t i) const {
     return representation_;
@@ -1606,7 +1607,7 @@
   static RangeBoundary Max(RangeBoundary a, RangeBoundary b);
 
   bool Overflowed() const {
-    return !Smi::IsValid(value());
+    return IsConstant() && !Smi::IsValid(value());
   }
 
   RangeBoundary Clamp() const {
@@ -1690,8 +1691,8 @@
   void PrintTo(BufferFormatter* f) const;
   static const char* ToCString(Range* range);
 
-  const RangeBoundary& min() { return min_; }
-  const RangeBoundary& max() { return max_; }
+  const RangeBoundary& min() const { return min_; }
+  const RangeBoundary& max() const { return max_; }
 
   bool Equals(Range* other) {
     return min_.Equals(other->min_) && max_.Equals(other->max_);
@@ -1707,6 +1708,9 @@
     return range->max().UpperBound();
   }
 
+  // Inclusive.
+  bool IsWithin(intptr_t min_int, intptr_t max_int) const;
+
  private:
   RangeBoundary min_;
   RangeBoundary max_;
@@ -2281,6 +2285,8 @@
     return kTagged;
   }
 
+  bool IsPolymorphic() const;
+
  private:
   const ICData* ic_data_;
   const intptr_t token_pos_;
@@ -2325,10 +2331,12 @@
 
   virtual bool CanDeoptimize() const {
     return (operands_class_id() != kDoubleCid)
+        && (operands_class_id() != kMintCid)
         && (operands_class_id() != kSmiCid);
   }
   virtual bool HasSideEffect() const {
     return (operands_class_id() != kDoubleCid)
+        && (operands_class_id() != kMintCid)
         && (operands_class_id() != kSmiCid);
   }
 
@@ -2344,7 +2352,9 @@
 
   virtual Representation RequiredInputRepresentation(intptr_t idx) const {
     ASSERT((idx == 0) || (idx == 1));
-    return (operands_class_id() == kDoubleCid) ? kUnboxedDouble : kTagged;
+    if (operands_class_id() == kDoubleCid) return kUnboxedDouble;
+    if (operands_class_id() == kMintCid) return kUnboxedMint;
+    return kTagged;
   }
 
  private:
@@ -2366,7 +2376,8 @@
         function_(function),
         argument_names_(argument_names),
         arguments_(arguments),
-        result_cid_(kDynamicCid) {
+        result_cid_(kDynamicCid),
+        is_known_constructor_(false) {
     ASSERT(function.IsZoneHandle());
     ASSERT(argument_names.IsZoneHandle());
   }
@@ -2393,6 +2404,11 @@
   virtual intptr_t ResultCid() const { return result_cid_; }
   void set_result_cid(intptr_t value) { result_cid_ = value; }
 
+  bool is_known_constructor() const { return is_known_constructor_; }
+  void set_is_known_constructor(bool is_known_constructor) {
+    is_known_constructor_ = is_known_constructor;
+  }
+
  private:
   const intptr_t token_pos_;
   const Function& function_;
@@ -2400,6 +2416,10 @@
   ZoneGrowableArray<PushArgumentInstr*>* arguments_;
   intptr_t result_cid_;  // For some library functions we know the result.
 
+  // Some library constructors have known semantics.
+  bool is_known_constructor_;
+
+
   DISALLOW_COPY_AND_ASSIGN(StaticCallInstr);
 };
 
@@ -3955,7 +3975,7 @@
 
   intptr_t array_type() const { return array_type_; }
 
-  bool IsRedundant();
+  bool IsRedundant(RangeBoundary length);
 
  private:
   intptr_t array_type_;
diff --git a/runtime/vm/intermediate_language_ia32.cc b/runtime/vm/intermediate_language_ia32.cc
index b1e67f4..cabafbe 100644
--- a/runtime/vm/intermediate_language_ia32.cc
+++ b/runtime/vm/intermediate_language_ia32.cc
@@ -21,6 +21,7 @@
 
 DECLARE_FLAG(int, optimization_counter_threshold);
 DECLARE_FLAG(bool, trace_functions);
+DECLARE_FLAG(bool, propagate_ic_data);
 
 // Generic summary for call instructions that have all arguments pushed
 // on the stack and return the result in a fixed register EAX.
@@ -310,7 +311,7 @@
     locs->set_out(Location::RequiresRegister());
     return locs;
   }
-  if (HasICData() && (ic_data()->NumberOfChecks() > 0)) {
+  if (IsPolymorphic()) {
     const intptr_t kNumTemps = 1;
     LocationSummary* locs =
         new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
@@ -335,7 +336,8 @@
                                        intptr_t deopt_id,
                                        intptr_t token_pos,
                                        Token::Kind kind,
-                                       LocationSummary* locs) {
+                                       LocationSummary* locs,
+                                       const ICData& original_ic_data) {
   if (!compiler->is_optimizing()) {
     compiler->AddCurrentDescriptor(PcDescriptors::kDeoptBefore,
                                    deopt_id,
@@ -354,27 +356,56 @@
   __ cmpl(Address(ESP, 1 * kWordSize), raw_null);
   __ j(EQUAL, &check_identity, Assembler::kNearJump);
 
-  const ICData& ic_data = compiler->GenerateInstanceCall(deopt_id,
-                                                         token_pos,
-                                                         operator_name,
-                                                         kNumberOfArguments,
-                                                         kNoArgumentNames,
-                                                         kNumArgumentsChecked,
-                                                         locs);
+  ICData& equality_ic_data = ICData::ZoneHandle();
+  if (compiler->is_optimizing() && FLAG_propagate_ic_data) {
+    ASSERT(!original_ic_data.IsNull());
+    equality_ic_data = original_ic_data.AsUnaryClassChecks();
+  } else {
+    equality_ic_data = ICData::New(compiler->parsed_function().function(),
+                                   operator_name,
+                                   deopt_id,
+                                   kNumArgumentsChecked);
+  }
+  compiler->GenerateInstanceCall(deopt_id,
+                                 token_pos,
+                                 kNumberOfArguments,
+                                 kNoArgumentNames,
+                                 locs,
+                                 equality_ic_data);
   Label check_ne;
   __ jmp(&check_ne);
 
   __ Bind(&check_identity);
-  // Call stub, load IC data in register. The stub will update ICData if
-  // necessary.
-  Register ic_data_reg = locs->temp(0).reg();
-  ASSERT(ic_data_reg == ECX);  // Stub depends on it.
-  __ LoadObject(ic_data_reg, ic_data);
-  compiler->GenerateCall(token_pos,
-                         &StubCode::EqualityWithNullArgLabel(),
-                         PcDescriptors::kOther,
-                         locs);
-  __ Drop(2);
+  Label equality_done;
+  if (compiler->is_optimizing()) {
+    // No need to update IC data.
+    Label is_true;
+    __ popl(EAX);
+    __ popl(EDX);
+    __ cmpl(EAX, EDX);
+    __ j(EQUAL, &is_true);
+    __ LoadObject(EAX, (kind == Token::kEQ) ? compiler->bool_false()
+                                            : compiler->bool_true());
+    __ jmp(&equality_done);
+    __ Bind(&is_true);
+    __ LoadObject(EAX, (kind == Token::kEQ) ? compiler->bool_true()
+                                            : compiler->bool_false());
+    if (kind == Token::kNE) {
+      // Skip not-equal result conversion.
+      __ jmp(&equality_done);
+    }
+  } else {
+    // Call stub, load IC data in register. The stub will update ICData if
+    // necessary.
+    Register ic_data_reg = locs->temp(0).reg();
+    ASSERT(ic_data_reg == ECX);  // Stub depends on it.
+    __ LoadObject(ic_data_reg, equality_ic_data);
+    compiler->GenerateCall(token_pos,
+                           &StubCode::EqualityWithNullArgLabel(),
+                           PcDescriptors::kOther,
+                           locs);
+    __ Drop(2);
+  }
   __ Bind(&check_ne);
   if (kind == Token::kNE) {
     Label false_label, true_label, done;
@@ -388,6 +419,7 @@
     __ LoadObject(EAX, compiler->bool_false());
     __ Bind(&done);
   }
+  __ Bind(&equality_done);
 }
 
 
@@ -645,8 +677,12 @@
   switch (kind) {
     case Token::kEQ: return EQUAL;
     case Token::kNE: return NOT_EQUAL;
+    case Token::kLT: return LESS;
+    case Token::kGT: return GREATER;
+    case Token::kLTE: return LESS_EQUAL;
+    case Token::kGTE: return GREATER_EQUAL;
     default:
-      UNIMPLEMENTED();
+      UNREACHABLE();
       return OVERFLOW;
   }
 }
@@ -682,6 +718,71 @@
 }
 
 
+static void EmitUnboxedMintComparisonOp(FlowGraphCompiler* compiler,
+                                        const LocationSummary& locs,
+                                        Token::Kind kind,
+                                        BranchInstr* branch) {
+  XmmRegister left = locs.in(0).xmm_reg();
+  XmmRegister right = locs.in(1).xmm_reg();
+  Register left_tmp = locs.temp(0).reg();
+  Register right_tmp = locs.temp(1).reg();
+  Register result = branch == NULL ? locs.out().reg() : kNoRegister;
+
+  Condition hi_cond = OVERFLOW, lo_cond = OVERFLOW;
+  switch (kind) {
+    case Token::kLT:
+      hi_cond = LESS;
+      lo_cond = BELOW;
+      break;
+    case Token::kGT:
+      hi_cond = GREATER;
+      lo_cond = ABOVE;
+      break;
+    case Token::kLTE:
+      hi_cond = LESS;
+      lo_cond = BELOW_EQUAL;
+      break;
+    case Token::kGTE:
+      hi_cond = GREATER;
+      lo_cond = ABOVE_EQUAL;
+      break;
+    default:
+      break;
+  }
+  ASSERT(hi_cond != OVERFLOW && lo_cond != OVERFLOW);
+  Label is_true, is_false;
+  // Compare upper halves first.
+  __ pextrd(left_tmp, left, Immediate(1));
+  __ pextrd(right_tmp, right, Immediate(1));
+  __ cmpl(left_tmp, right_tmp);
+  if (branch != NULL) {
+    __ j(hi_cond, compiler->GetBlockLabel(branch->true_successor()));
+    __ j(FlowGraphCompiler::FlipCondition(hi_cond),
+         compiler->GetBlockLabel(branch->false_successor()));
+  } else {
+    __ j(hi_cond, &is_true);
+    __ j(FlowGraphCompiler::FlipCondition(hi_cond), &is_false);
+  }
+
+  // If upper is equal, compare lower half.
+  __ pextrd(left_tmp, left, Immediate(0));
+  __ pextrd(right_tmp, right, Immediate(0));
+  __ cmpl(left_tmp, right_tmp);
+  if (branch != NULL) {
+    branch->EmitBranchOnCondition(compiler, lo_cond);
+  } else {
+    Label done;
+    __ j(lo_cond, &is_true);
+    __ Bind(&is_false);
+    __ LoadObject(result, compiler->bool_false());
+    __ jmp(&done);
+    __ Bind(&is_true);
+    __ LoadObject(result, compiler->bool_true());
+    __ Bind(&done);
+  }
+}
+
+
 static Condition TokenKindToDoubleCondition(Token::Kind kind) {
   switch (kind) {
     case Token::kEQ: return EQUAL;
@@ -738,7 +839,7 @@
                            deopt_id());
     return;
   }
-  if (HasICData() && (ic_data()->NumberOfChecks() > 0)) {
+  if (IsPolymorphic()) {
     EmitGenericEqualityCompare(compiler, locs(), kind(), kNoBranch, *ic_data(),
                                deopt_id(), token_pos());
     return;
@@ -747,7 +848,12 @@
   Register right = locs()->in(1).reg();
   __ pushl(left);
   __ pushl(right);
-  EmitEqualityAsInstanceCall(compiler, deopt_id(), token_pos(), kind(), locs());
+  EmitEqualityAsInstanceCall(compiler,
+                             deopt_id(),
+                             token_pos(),
+                             kind(),
+                             locs(),
+                             *ic_data());
   ASSERT(locs()->out().reg() == EAX);
 }
 
@@ -775,7 +881,7 @@
                            deopt_id());
     return;
   }
-  if (HasICData() && (ic_data()->NumberOfChecks() > 0)) {
+  if (IsPolymorphic()) {
     EmitGenericEqualityCompare(compiler, locs(), kind(), branch, *ic_data(),
                                deopt_id(), token_pos());
     return;
@@ -788,7 +894,8 @@
                              deopt_id(),
                              token_pos(),
                              Token::kEQ,  // kNE reverse occurs at branch.
-                             locs());
+                             locs(),
+                             *ic_data());
   if (branch->is_checked()) {
     EmitAssertBoolean(EAX, token_pos(), locs(), compiler);
   }
@@ -801,6 +908,17 @@
 LocationSummary* RelationalOpInstr::MakeLocationSummary() const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
+  if (operands_class_id() == kMintCid) {
+    const intptr_t kNumTemps = 2;
+    LocationSummary* locs =
+        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    locs->set_in(0, Location::RequiresXmmRegister());
+    locs->set_in(1, Location::RequiresXmmRegister());
+    locs->set_temp(0, Location::RequiresRegister());
+    locs->set_temp(1, Location::RequiresRegister());
+    locs->set_out(Location::RequiresRegister());
+    return locs;
+  }
   if (operands_class_id() == kDoubleCid) {
     LocationSummary* summary =
         new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
@@ -831,6 +949,10 @@
     EmitSmiComparisonOp(compiler, *locs(), kind(), NULL);
     return;
   }
+  if (operands_class_id() == kMintCid) {
+    EmitUnboxedMintComparisonOp(compiler, *locs(), kind(), NULL);
+    return;
+  }
   if (operands_class_id() == kDoubleCid) {
     EmitDoubleComparisonOp(compiler, *locs(), kind(), NULL);
     return;
@@ -874,13 +996,22 @@
   }
   const intptr_t kNumArguments = 2;
   const intptr_t kNumArgsChecked = 2;  // Type-feedback.
+  ICData& relational_ic_data = ICData::ZoneHandle(ic_data()->raw());
+  if (compiler->is_optimizing() && FLAG_propagate_ic_data) {
+    ASSERT(!ic_data()->IsNull());
+    relational_ic_data = ic_data()->AsUnaryClassChecks();
+  } else {
+    relational_ic_data = ICData::New(compiler->parsed_function().function(),
+                                     function_name,
+                                     deopt_id(),
+                                     kNumArgsChecked);
+  }
   compiler->GenerateInstanceCall(deopt_id(),
                                  token_pos(),
-                                 function_name,
                                  kNumArguments,
                                  Array::ZoneHandle(),  // No optional arguments.
-                                 kNumArgsChecked,
-                                 locs());
+                                 locs(),
+                                 relational_ic_data);
 }
 
 
@@ -890,6 +1021,10 @@
     EmitSmiComparisonOp(compiler, *locs(), kind(), branch);
     return;
   }
+  if (operands_class_id() == kMintCid) {
+    EmitUnboxedMintComparisonOp(compiler, *locs(), kind(), branch);
+    return;
+  }
   if (operands_class_id() == kDoubleCid) {
     EmitDoubleComparisonOp(compiler, *locs(), kind(), branch);
     return;
@@ -1738,9 +1873,14 @@
       Label call_method, done;
       // Check if count too large for handling it inlined.
       __ movl(temp, left);
-      __ cmpl(right,
+      Range* right_range = this->right()->definition()->range();
+      const bool right_needs_check =
+          (right_range == NULL) || !right_range->IsWithin(0, (Smi::kBits - 1));
+      if (right_needs_check) {
+        __ cmpl(right,
           Immediate(reinterpret_cast<int32_t>(Smi::New(Smi::kBits))));
-      __ j(ABOVE_EQUAL, &call_method, Assembler::kNearJump);
+        __ j(ABOVE_EQUAL, &call_method, Assembler::kNearJump);
+      }
       Register right_temp = locs()->temp(1).reg();
       ASSERT(right_temp == ECX);  // Count must be in ECX
       __ movl(right_temp, right);
@@ -2444,8 +2584,8 @@
       Label* deopt  = compiler->AddDeoptStub(deopt_id(),
                                              kDeoptBinaryMintOp);
       Label done, overflow;
-      __ pextrd(lo, right, Immediate(0));  // Lower half left
-      __ pextrd(hi, right, Immediate(1));  // Upper half left
+      __ pextrd(lo, right, Immediate(0));  // Lower half
+      __ pextrd(hi, right, Immediate(1));  // Upper half
       __ subl(ESP, Immediate(2 * kWordSize));
       __ movq(Address(ESP, 0), left);
       if (op_kind() == Token::kADD) {
diff --git a/runtime/vm/intermediate_language_x64.cc b/runtime/vm/intermediate_language_x64.cc
index be5de5f..07e4cb4 100644
--- a/runtime/vm/intermediate_language_x64.cc
+++ b/runtime/vm/intermediate_language_x64.cc
@@ -21,6 +21,7 @@
 
 DECLARE_FLAG(int, optimization_counter_threshold);
 DECLARE_FLAG(bool, trace_functions);
+DECLARE_FLAG(bool, propagate_ic_data);
 
 // Generic summary for call instructions that have all arguments pushed
 // on the stack and return the result in a fixed register RAX.
@@ -308,7 +309,7 @@
     locs->set_out(Location::RequiresRegister());
     return locs;
   }
-  if (HasICData() && (ic_data()->NumberOfChecks() > 0)) {
+  if (IsPolymorphic()) {
     const intptr_t kNumTemps = 1;
     LocationSummary* locs =
         new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
@@ -333,7 +334,8 @@
                                        intptr_t deopt_id,
                                        intptr_t token_pos,
                                        Token::Kind kind,
-                                       LocationSummary* locs) {
+                                       LocationSummary* locs,
+                                       const ICData& original_ic_data) {
   if (!compiler->is_optimizing()) {
     compiler->AddCurrentDescriptor(PcDescriptors::kDeoptBefore,
                                    deopt_id,
@@ -351,27 +353,57 @@
   __ j(EQUAL, &check_identity, Assembler::kNearJump);
   __ cmpq(Address(RSP, 1 * kWordSize), raw_null);
   __ j(EQUAL, &check_identity, Assembler::kNearJump);
-  const ICData& ic_data = compiler->GenerateInstanceCall(deopt_id,
-                                                         token_pos,
-                                                         operator_name,
-                                                         kNumberOfArguments,
-                                                         kNoArgumentNames,
-                                                         kNumArgumentsChecked,
-                                                         locs);
+
+  ICData& equality_ic_data = ICData::ZoneHandle(original_ic_data.raw());
+  if (compiler->is_optimizing() && FLAG_propagate_ic_data) {
+    ASSERT(!original_ic_data.IsNull());
+    equality_ic_data = original_ic_data.AsUnaryClassChecks();
+  } else {
+    equality_ic_data = ICData::New(compiler->parsed_function().function(),
+                                   operator_name,
+                                   deopt_id,
+                                   kNumArgumentsChecked);
+  }
+  compiler->GenerateInstanceCall(deopt_id,
+                                 token_pos,
+                                 kNumberOfArguments,
+                                 kNoArgumentNames,
+                                 locs,
+                                 equality_ic_data);
   Label check_ne;
   __ jmp(&check_ne);
 
   __ Bind(&check_identity);
-  // Call stub, load IC data in register. The stub will update ICData if
-  // necessary.
-  Register ic_data_reg = locs->temp(0).reg();
-  ASSERT(ic_data_reg == RBX);  // Stub depends on it.
-  __ LoadObject(ic_data_reg, ic_data);
-  compiler->GenerateCall(token_pos,
-                         &StubCode::EqualityWithNullArgLabel(),
-                         PcDescriptors::kOther,
-                         locs);
-  __ Drop(2);
+  Label equality_done;
+  if (compiler->is_optimizing()) {
+    // No need to update IC data.
+    Label is_true;
+    __ popq(RAX);
+    __ popq(RDX);
+    __ cmpq(RAX, RDX);
+    __ j(EQUAL, &is_true);
+    __ LoadObject(RAX, (kind == Token::kEQ) ? compiler->bool_false()
+                                            : compiler->bool_true());
+    __ jmp(&equality_done);
+    __ Bind(&is_true);
+    __ LoadObject(RAX, (kind == Token::kEQ) ? compiler->bool_true()
+                                            : compiler->bool_false());
+    if (kind == Token::kNE) {
+      // Skip not-equal result conversion.
+      __ jmp(&equality_done);
+    }
+  } else {
+    // Call stub, load IC data in register. The stub will update ICData if
+    // necessary.
+    Register ic_data_reg = locs->temp(0).reg();
+    ASSERT(ic_data_reg == RBX);  // Stub depends on it.
+    __ LoadObject(ic_data_reg, equality_ic_data);
+    compiler->GenerateCall(token_pos,
+                           &StubCode::EqualityWithNullArgLabel(),
+                           PcDescriptors::kOther,
+                           locs);
+    __ Drop(2);
+  }
   __ Bind(&check_ne);
   if (kind == Token::kNE) {
     Label false_label, true_label, done;
@@ -385,6 +417,7 @@
     __ LoadObject(RAX, compiler->bool_false());
     __ Bind(&done);
   }
+  __ Bind(&equality_done);
 }
 
 
@@ -692,7 +725,7 @@
                            deopt_id());
     return;
   }
-  if (HasICData() && (ic_data()->NumberOfChecks() > 0)) {
+  if (IsPolymorphic()) {
     EmitGenericEqualityCompare(compiler, locs(), kind(), kNoBranch, *ic_data(),
                                deopt_id(), token_pos());
     return;
@@ -705,7 +738,8 @@
                              deopt_id(),
                              token_pos(),
                              kind(),
-                             locs());
+                             locs(),
+                             *ic_data());
   ASSERT(locs()->out().reg() == RAX);
 }
 
@@ -730,7 +764,7 @@
                            deopt_id());
     return;
   }
-  if (HasICData() && (ic_data()->NumberOfChecks() > 0)) {
+  if (IsPolymorphic()) {
     EmitGenericEqualityCompare(compiler, locs(), kind(), branch, *ic_data(),
                                deopt_id(), token_pos());
     return;
@@ -743,7 +777,8 @@
                              deopt_id(),
                              token_pos(),
                              Token::kEQ,  // kNE reverse occurs at branch.
-                             locs());
+                             locs(),
+                             *ic_data());
   if (branch->is_checked()) {
     EmitAssertBoolean(RAX, token_pos(), locs(), compiler);
   }
@@ -830,13 +865,22 @@
   }
   const intptr_t kNumArguments = 2;
   const intptr_t kNumArgsChecked = 2;  // Type-feedback.
+  ICData& relational_ic_data = ICData::ZoneHandle(ic_data()->raw());
+  if (compiler->is_optimizing() && FLAG_propagate_ic_data) {
+    ASSERT(!ic_data()->IsNull());
+    relational_ic_data = ic_data()->AsUnaryClassChecks();
+  } else {
+    relational_ic_data = ICData::New(compiler->parsed_function().function(),
+                                     function_name,
+                                     deopt_id(),
+                                     kNumArgsChecked);
+  }
   compiler->GenerateInstanceCall(deopt_id(),
                                  token_pos(),
-                                 function_name,
                                  kNumArguments,
                                  Array::ZoneHandle(),  // No optional arguments.
-                                 kNumArgsChecked,
-                                 locs());
+                                 locs(),
+                                 relational_ic_data);
 }
 
 
@@ -1703,9 +1747,14 @@
       Label call_method, done;
       // Check if count too large for handling it inlined.
       __ movq(temp, left);
-      __ cmpq(right,
-          Immediate(reinterpret_cast<int64_t>(Smi::New(Smi::kBits))));
-      __ j(ABOVE_EQUAL, &call_method, Assembler::kNearJump);
+      Range* right_range = this->right()->definition()->range();
+      const bool right_needs_check =
+          (right_range == NULL) || !right_range->IsWithin(0, (Smi::kBits - 1));
+      if (right_needs_check) {
+        __ cmpq(right,
+            Immediate(reinterpret_cast<int64_t>(Smi::New(Smi::kBits))));
+        __ j(ABOVE_EQUAL, &call_method, Assembler::kNearJump);
+      }
       Register right_temp = locs()->temp(1).reg();
       ASSERT(right_temp == RCX);  // Count must be in RCX
       __ movq(right_temp, right);
diff --git a/runtime/vm/intrinsifier_ia32.cc b/runtime/vm/intrinsifier_ia32.cc
index afdfff7..cf47309 100644
--- a/runtime/vm/intrinsifier_ia32.cc
+++ b/runtime/vm/intrinsifier_ia32.cc
@@ -175,9 +175,9 @@
 
 static intptr_t ComputeObjectArrayTypeArgumentsOffset() {
   const String& class_name = String::Handle(Symbols::New("_ObjectArray"));
-  const Library& coreimpl_lib = Library::Handle(Library::CoreImplLibrary());
+  const Library& core_lib = Library::Handle(Library::CoreLibrary());
   const Class& cls =
-      Class::Handle(coreimpl_lib.LookupClassAllowPrivate(class_name));
+      Class::Handle(core_lib.LookupClassAllowPrivate(class_name));
   ASSERT(!cls.IsNull());
   ASSERT(cls.HasTypeArguments());
   ASSERT(cls.NumTypeArguments() == 1);
@@ -252,9 +252,9 @@
                                   const char* field_name_p) {
   const String& class_name = String::Handle(Symbols::New(class_name_p));
   const String& field_name = String::Handle(Symbols::New(field_name_p));
-  const Library& coreimpl_lib = Library::Handle(Library::CoreImplLibrary());
+  const Library& core_lib = Library::Handle(Library::CoreLibrary());
   const Class& cls =
-      Class::Handle(coreimpl_lib.LookupClassAllowPrivate(class_name));
+      Class::Handle(core_lib.LookupClassAllowPrivate(class_name));
   ASSERT(!cls.IsNull());
   const Field& field = Field::ZoneHandle(cls.LookupInstanceField(field_name));
   ASSERT(!field.IsNull());
diff --git a/runtime/vm/intrinsifier_x64.cc b/runtime/vm/intrinsifier_x64.cc
index affbf67..5f3f96d 100644
--- a/runtime/vm/intrinsifier_x64.cc
+++ b/runtime/vm/intrinsifier_x64.cc
@@ -1409,9 +1409,9 @@
                                   const char* field_name_p) {
   const String& class_name = String::Handle(Symbols::New(class_name_p));
   const String& field_name = String::Handle(Symbols::New(field_name_p));
-  const Library& coreimpl_lib = Library::Handle(Library::CoreImplLibrary());
+  const Library& core_lib = Library::Handle(Library::CoreLibrary());
   const Class& cls =
-      Class::Handle(coreimpl_lib.LookupClassAllowPrivate(class_name));
+      Class::Handle(core_lib.LookupClassAllowPrivate(class_name));
   ASSERT(!cls.IsNull());
   const Field& field = Field::ZoneHandle(cls.LookupInstanceField(field_name));
   ASSERT(!field.IsNull());
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index df2b538..84263f5 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -311,12 +311,12 @@
 
 ICData* Isolate::GetICDataForDeoptId(intptr_t deopt_id) const {
   if (ic_data_array() == Array::null()) {
-    return NULL;
+    return &ICData::ZoneHandle();
   }
   const Array& array_handle = Array::Handle(ic_data_array());
   if (deopt_id >= array_handle.Length()) {
     // For computations being added in the optimizing compiler.
-    return NULL;
+    return &ICData::ZoneHandle();
   }
   ICData& ic_data_handle = ICData::ZoneHandle();
   ic_data_handle ^= array_handle.At(deopt_id);
diff --git a/runtime/vm/isolate_test.cc b/runtime/vm/isolate_test.cc
index 3d626f7..2aadf6d 100644
--- a/runtime/vm/isolate_test.cc
+++ b/runtime/vm/isolate_test.cc
@@ -34,7 +34,7 @@
       "  return 0;\n"
       "}\n";
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
-  Dart_Handle result = Dart_Invoke(lib, Dart_NewString("testMain"), 0, NULL);
+  Dart_Handle result = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
   EXPECT_ERROR(result, "Null callback specified for isolate creation");
   EXPECT(Dart_ErrorHasException(result));
   Dart_Handle exception_result = Dart_ErrorGetException(result);
diff --git a/runtime/vm/message.cc b/runtime/vm/message.cc
index 7051bd9..807de7e 100644
--- a/runtime/vm/message.cc
+++ b/runtime/vm/message.cc
@@ -6,8 +6,6 @@
 
 namespace dart {
 
-DECLARE_FLAG(bool, trace_isolates);
-
 MessageQueue::MessageQueue() {
   head_ = NULL;
   tail_ = NULL;
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index b8cb196..342bbca 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -37,9 +37,6 @@
 
 DEFINE_FLAG(bool, generate_gdb_symbols, false,
     "Generate symbols of generated dart functions for debugging with GDB");
-DEFINE_FLAG(bool, reject_named_argument_as_positional, true,
-    "Enforce new rules for optional parameters and disallow passing of named "
-    "arguments to optional positional formal parameters");
 DEFINE_FLAG(bool, show_internal_names, false,
     "Show names of internal classes (e.g. \"OneByteString\") in error messages "
     "instead of showing the corresponding interface names (e.g. \"String\")");
@@ -588,12 +585,12 @@
 
   cls = object_store->array_class();  // Was allocated above.
   name = Symbols::ObjectArray();
-  RegisterPrivateClass(cls, name, core_impl_lib);
+  RegisterPrivateClass(cls, name, core_lib);
   pending_classes.Add(cls, Heap::kOld);
 
   cls = object_store->growable_object_array_class();  // Was allocated above.
   name = Symbols::GrowableObjectArray();
-  RegisterPrivateClass(cls, name, core_impl_lib);
+  RegisterPrivateClass(cls, name, core_lib);
   pending_classes.Add(cls, Heap::kOld);
 
   cls = Class::New<ImmutableArray>();
@@ -601,42 +598,30 @@
   cls.set_type_arguments_instance_field_offset(Array::type_arguments_offset());
   ASSERT(object_store->immutable_array_class() != object_store->array_class());
   name = Symbols::ImmutableArray();
-  RegisterPrivateClass(cls, name, core_impl_lib);
+  RegisterPrivateClass(cls, name, core_lib);
   pending_classes.Add(cls, Heap::kOld);
 
   cls = object_store->one_byte_string_class();  // Was allocated above.
   name = Symbols::OneByteString();
-  RegisterPrivateClass(cls, name, core_impl_lib);
+  RegisterPrivateClass(cls, name, core_lib);
   pending_classes.Add(cls, Heap::kOld);
 
   cls = Class::New<TwoByteString>();
   object_store->set_two_byte_string_class(cls);
   name = Symbols::TwoByteString();
-  RegisterPrivateClass(cls, name, core_impl_lib);
-  pending_classes.Add(cls, Heap::kOld);
-
-  cls = Class::New<FourByteString>();
-  object_store->set_four_byte_string_class(cls);
-  name = Symbols::FourByteString();
-  RegisterPrivateClass(cls, name, core_impl_lib);
+  RegisterPrivateClass(cls, name, core_lib);
   pending_classes.Add(cls, Heap::kOld);
 
   cls = Class::New<ExternalOneByteString>();
   object_store->set_external_one_byte_string_class(cls);
   name = Symbols::ExternalOneByteString();
-  RegisterPrivateClass(cls, name, core_impl_lib);
+  RegisterPrivateClass(cls, name, core_lib);
   pending_classes.Add(cls, Heap::kOld);
 
   cls = Class::New<ExternalTwoByteString>();
   object_store->set_external_two_byte_string_class(cls);
   name = Symbols::ExternalTwoByteString();
-  RegisterPrivateClass(cls, name, core_impl_lib);
-  pending_classes.Add(cls, Heap::kOld);
-
-  cls = Class::New<ExternalFourByteString>();
-  object_store->set_external_four_byte_string_class(cls);
-  name = Symbols::ExternalFourByteString();
-  RegisterPrivateClass(cls, name, core_impl_lib);
+  RegisterPrivateClass(cls, name, core_lib);
   pending_classes.Add(cls, Heap::kOld);
 
   cls = Class::New<Stacktrace>();
@@ -925,6 +910,15 @@
   if (!error.IsNull()) {
     return error.raw();
   }
+  const Script& collection_script =
+      Script::Handle(Bootstrap::LoadCollectionScript(false));
+  const Library& collection_lib =
+      Library::Handle(Library::CollectionLibrary());
+  ASSERT(!collection_lib.IsNull());
+  error = Bootstrap::Compile(collection_lib, collection_script);
+  if (!error.IsNull()) {
+    return error.raw();
+  }
   const Script& math_script = Script::Handle(Bootstrap::LoadMathScript(false));
   const Library& math_lib = Library::Handle(Library::MathLibrary());
   ASSERT(!math_lib.IsNull());
@@ -1097,18 +1091,12 @@
   cls = Class::New<TwoByteString>();
   object_store->set_two_byte_string_class(cls);
 
-  cls = Class::New<FourByteString>();
-  object_store->set_four_byte_string_class(cls);
-
   cls = Class::New<ExternalOneByteString>();
   object_store->set_external_one_byte_string_class(cls);
 
   cls = Class::New<ExternalTwoByteString>();
   object_store->set_external_two_byte_string_class(cls);
 
-  cls = Class::New<ExternalFourByteString>();
-  object_store->set_external_four_byte_string_class(cls);
-
   cls = Class::New<Bool>();
   object_store->set_bool_class(cls);
 
@@ -1241,10 +1229,8 @@
       return Symbols::New("double");
     case kOneByteStringCid:
     case kTwoByteStringCid:
-    case kFourByteStringCid:
     case kExternalOneByteStringCid:
     case kExternalTwoByteStringCid:
-    case kExternalFourByteStringCid:
       return Symbols::New("String");
     case kArrayCid:
     case kImmutableArrayCid:
@@ -3413,80 +3399,23 @@
 bool Function::AreValidArgumentCounts(int num_arguments,
                                       int num_named_arguments,
                                       String* error_message) const {
-  if (FLAG_reject_named_argument_as_positional) {
-    if (num_named_arguments > NumOptionalNamedParameters()) {
-      if (error_message != NULL) {
-        const intptr_t kMessageBufferSize = 64;
-        char message_buffer[kMessageBufferSize];
-        OS::SNPrint(message_buffer,
-                    kMessageBufferSize,
-                    "%d named passed, at most %"Pd" expected",
-                    num_named_arguments,
-                    NumOptionalNamedParameters());
-        *error_message = String::New(message_buffer);
-      }
-      return false;  // Too many named arguments.
-    }
-    const int num_pos_args = num_arguments - num_named_arguments;
-    const int num_opt_pos_params = NumOptionalPositionalParameters();
-    const int num_pos_params = num_fixed_parameters() + num_opt_pos_params;
-    if (num_pos_args > num_pos_params) {
-      if (error_message != NULL) {
-        const intptr_t kMessageBufferSize = 64;
-        char message_buffer[kMessageBufferSize];
-        // Hide implicit parameters to the user.
-        const intptr_t num_hidden_params = NumImplicitParameters();
-        OS::SNPrint(message_buffer,
-                    kMessageBufferSize,
-                    "%"Pd"%s passed, %s%"Pd" expected",
-                    num_pos_args - num_hidden_params,
-                    num_opt_pos_params > 0 ? " positional" : "",
-                    num_opt_pos_params > 0 ? "at most " : "",
-                    num_pos_params - num_hidden_params);
-        *error_message = String::New(message_buffer);
-      }
-      return false;  // Too many fixed and/or positional arguments.
-    }
-    if (num_pos_args < num_fixed_parameters()) {
-      if (error_message != NULL) {
-        const intptr_t kMessageBufferSize = 64;
-        char message_buffer[kMessageBufferSize];
-        // Hide implicit parameters to the user.
-        const intptr_t num_hidden_params = NumImplicitParameters();
-        OS::SNPrint(message_buffer,
-                    kMessageBufferSize,
-                    "%"Pd"%s passed, %s%"Pd" expected",
-                    num_pos_args - num_hidden_params,
-                    num_opt_pos_params > 0 ? " positional" : "",
-                    num_opt_pos_params > 0 ? "at least " : "",
-                    num_fixed_parameters() - num_hidden_params);
-        *error_message = String::New(message_buffer);
-      }
-      return false;  // Too few fixed and/or positional arguments.
-    }
-    return true;
-  }
-
-  // TODO(regis): Remove the following code once the flag is removed.
-
-  if (num_arguments > NumParameters()) {
+  if (num_named_arguments > NumOptionalNamedParameters()) {
     if (error_message != NULL) {
       const intptr_t kMessageBufferSize = 64;
       char message_buffer[kMessageBufferSize];
-      // Hide implicit parameters to the user.
-      const intptr_t num_hidden_params = NumImplicitParameters();
       OS::SNPrint(message_buffer,
                   kMessageBufferSize,
-                  "%"Pd" passed, %s%"Pd" expected",
-                  num_arguments - num_hidden_params,
-                  HasOptionalParameters() ? "at most " : "",
-                  NumParameters() - num_hidden_params);
+                  "%d named passed, at most %"Pd" expected",
+                  num_named_arguments,
+                  NumOptionalNamedParameters());
       *error_message = String::New(message_buffer);
     }
-    return false;  // Too many arguments.
+    return false;  // Too many named arguments.
   }
-  const int num_positional_args = num_arguments - num_named_arguments;
-  if (num_positional_args < num_fixed_parameters()) {
+  const int num_pos_args = num_arguments - num_named_arguments;
+  const int num_opt_pos_params = NumOptionalPositionalParameters();
+  const int num_pos_params = num_fixed_parameters() + num_opt_pos_params;
+  if (num_pos_args > num_pos_params) {
     if (error_message != NULL) {
       const intptr_t kMessageBufferSize = 64;
       char message_buffer[kMessageBufferSize];
@@ -3494,13 +3423,31 @@
       const intptr_t num_hidden_params = NumImplicitParameters();
       OS::SNPrint(message_buffer,
                   kMessageBufferSize,
-                  "%"Pd" %spassed, %"Pd" expected",
-                  num_positional_args - num_hidden_params,
-                  HasOptionalParameters() ? "positional " : "",
+                  "%"Pd"%s passed, %s%"Pd" expected",
+                  num_pos_args - num_hidden_params,
+                  num_opt_pos_params > 0 ? " positional" : "",
+                  num_opt_pos_params > 0 ? "at most " : "",
+                  num_pos_params - num_hidden_params);
+      *error_message = String::New(message_buffer);
+    }
+    return false;  // Too many fixed and/or positional arguments.
+  }
+  if (num_pos_args < num_fixed_parameters()) {
+    if (error_message != NULL) {
+      const intptr_t kMessageBufferSize = 64;
+      char message_buffer[kMessageBufferSize];
+      // Hide implicit parameters to the user.
+      const intptr_t num_hidden_params = NumImplicitParameters();
+      OS::SNPrint(message_buffer,
+                  kMessageBufferSize,
+                  "%"Pd"%s passed, %s%"Pd" expected",
+                  num_pos_args - num_hidden_params,
+                  num_opt_pos_params > 0 ? " positional" : "",
+                  num_opt_pos_params > 0 ? "at least " : "",
                   num_fixed_parameters() - num_hidden_params);
       *error_message = String::New(message_buffer);
     }
-    return false;  // Too few arguments.
+    return false;  // Too few fixed and/or positional arguments.
   }
   return true;
 }
@@ -3616,63 +3563,35 @@
   // compatible although it has an additional phase parameter.
   const intptr_t num_ignored_params =
       (other.IsRedirectingFactory() && IsConstructor()) ? 1 : 0;
-  if (FLAG_reject_named_argument_as_positional) {
-    // The default values of optional parameters can differ.
-    if (((num_fixed_params - num_ignored_params) != other_num_fixed_params) ||
-        (num_opt_pos_params < other_num_opt_pos_params) ||
-        (num_opt_named_params < other_num_opt_named_params)) {
-      return false;
-    }
-    if (other_num_opt_named_params == 0) {
-      return true;
-    }
-    // Check that for each optional named parameter of the other function there
-    // exists an optional named parameter of this function with an identical
-    // name.
-    // Note that SetParameterNameAt() guarantees that names are symbols, so we
-    // can compare their raw pointers.
-    const int num_params = num_fixed_params + num_opt_named_params;
-    const int other_num_params =
-        other_num_fixed_params + other_num_opt_named_params;
-    bool found_param_name;
-    String& other_param_name = String::Handle();
-    for (intptr_t i = other_num_fixed_params; i < other_num_params; i++) {
-      other_param_name = other.ParameterNameAt(i);
-      found_param_name = false;
-      for (intptr_t j = num_fixed_params; j < num_params; j++) {
-        if (ParameterNameAt(j) == other_param_name.raw()) {
-          found_param_name = true;
-          break;
-        }
-      }
-      if (!found_param_name) {
-        return false;
-      }
-    }
-    return true;
-  }
-
-  // TODO(regis): Remove the following code once the flag is removed.
-
   // The default values of optional parameters can differ.
-  const intptr_t num_opt_params = num_opt_pos_params + num_opt_named_params;
-  const intptr_t other_num_opt_params =
-      other_num_opt_pos_params + other_num_opt_named_params;
   if (((num_fixed_params - num_ignored_params) != other_num_fixed_params) ||
-      (num_opt_params < other_num_opt_params)) {
+      (num_opt_pos_params < other_num_opt_pos_params) ||
+      (num_opt_named_params < other_num_opt_named_params)) {
     return false;
   }
-  // Check that for each optional named parameter of the other function there is
-  // a corresponding optional named parameter of this function with an identical
-  // name at the same position.
-  // Note that SetParameterNameAt() guarantees that names are symbols, so we can
-  // compare their raw pointers.
-  const int other_num_params = other_num_fixed_params + other_num_opt_params;
+  if (other_num_opt_named_params == 0) {
+    return true;
+  }
+  // Check that for each optional named parameter of the other function there
+  // exists an optional named parameter of this function with an identical
+  // name.
+  // Note that SetParameterNameAt() guarantees that names are symbols, so we
+  // can compare their raw pointers.
+  const int num_params = num_fixed_params + num_opt_named_params;
+  const int other_num_params =
+      other_num_fixed_params + other_num_opt_named_params;
+  bool found_param_name;
+  String& other_param_name = String::Handle();
   for (intptr_t i = other_num_fixed_params; i < other_num_params; i++) {
-    const String& other_param_name = String::Handle(other.ParameterNameAt(i));
-    ASSERT(other_param_name.IsSymbol());
-    ASSERT(String::Handle(ParameterNameAt(i)).IsSymbol());
-    if (ParameterNameAt(i) != other_param_name.raw()) {
+    other_param_name = other.ParameterNameAt(i);
+    found_param_name = false;
+    for (intptr_t j = num_fixed_params; j < num_params; j++) {
+      if (ParameterNameAt(j) == other_param_name.raw()) {
+        found_param_name = true;
+        break;
+      }
+    }
+    if (!found_param_name) {
       return false;
     }
   }
@@ -3770,83 +3689,48 @@
       }
     }
   }
-  if (FLAG_reject_named_argument_as_positional) {
-    // Check the types of fixed and optional positional parameters.
-    for (intptr_t i = 0; i < num_fixed_params + other_num_opt_pos_params; i++) {
-      if (!TestParameterType(test_kind,
-                             i, i, type_arguments, other, other_type_arguments,
-                             malformed_error)) {
-        return false;
-      }
-    }
-    // Check the names and types of optional named parameters.
-    if (other_num_opt_named_params == 0) {
-      return true;
-    }
-    // Check that for each optional named parameter of type T of the other
-    // function type, there exists an optional named parameter of this function
-    // type with an identical name and with a type S that is a either a subtype
-    // or supertype of T (if test_kind == kIsSubtypeOf) or that is more specific
-    // than T (if test_kind == kIsMoreSpecificThan).
-    // Note that SetParameterNameAt() guarantees that names are symbols, so we
-    // can compare their raw pointers.
-    const int num_params = num_fixed_params + num_opt_named_params;
-    const int other_num_params =
-        other_num_fixed_params + other_num_opt_named_params;
-    bool found_param_name;
-    String& other_param_name = String::Handle();
-    for (intptr_t i = other_num_fixed_params; i < other_num_params; i++) {
-      other_param_name = other.ParameterNameAt(i);
-      ASSERT(other_param_name.IsSymbol());
-      found_param_name = false;
-      for (intptr_t j = num_fixed_params; j < num_params; j++) {
-        ASSERT(String::Handle(ParameterNameAt(j)).IsSymbol());
-        if (ParameterNameAt(j) == other_param_name.raw()) {
-          found_param_name = true;
-          if (!TestParameterType(test_kind,
-                                 j, i,
-                                 type_arguments, other, other_type_arguments,
-                                 malformed_error)) {
-            return false;
-          }
-          break;
-        }
-      }
-      if (!found_param_name) {
-        return false;
-      }
-    }
-  }
-
-  // TODO(regis): Remove the following code once the flag is removed.
-
-  // Check the types of fixed parameters.
-  for (intptr_t i = 0; i < num_fixed_params; i++) {
+  // Check the types of fixed and optional positional parameters.
+  for (intptr_t i = 0; i < num_fixed_params + other_num_opt_pos_params; i++) {
     if (!TestParameterType(test_kind,
                            i, i, type_arguments, other, other_type_arguments,
                            malformed_error)) {
       return false;
     }
   }
-  // Check the names and types of optional parameters.
+  // Check the names and types of optional named parameters.
+  if (other_num_opt_named_params == 0) {
+    return true;
+  }
   // Check that for each optional named parameter of type T of the other
-  // function type, there is a corresponding optional named parameter of this
-  // function at the same position with an identical name and with a type S
-  // that is a either a subtype or supertype of T (if test_kind == kIsSubtypeOf)
-  // or that is more specific than T (if test_kind == kIsMoreSpecificThan).
+  // function type, there exists an optional named parameter of this function
+  // type with an identical name and with a type S that is a either a subtype
+  // or supertype of T (if test_kind == kIsSubtypeOf) or that is more specific
+  // than T (if test_kind == kIsMoreSpecificThan).
   // Note that SetParameterNameAt() guarantees that names are symbols, so we
   // can compare their raw pointers.
-  const intptr_t other_num_params = other_num_fixed_params +
-      other_num_opt_pos_params + other_num_opt_named_params;
+  const int num_params = num_fixed_params + num_opt_named_params;
+  const int other_num_params =
+      other_num_fixed_params + other_num_opt_named_params;
+  bool found_param_name;
   String& other_param_name = String::Handle();
   for (intptr_t i = other_num_fixed_params; i < other_num_params; i++) {
     other_param_name = other.ParameterNameAt(i);
     ASSERT(other_param_name.IsSymbol());
-    ASSERT(String::Handle(ParameterNameAt(i)).IsSymbol());
-    if ((ParameterNameAt(i) != other_param_name.raw()) ||
-        !TestParameterType(test_kind,
-                           i, i, type_arguments, other, other_type_arguments,
-                           malformed_error)) {
+    found_param_name = false;
+    for (intptr_t j = num_fixed_params; j < num_params; j++) {
+      ASSERT(String::Handle(ParameterNameAt(j)).IsSymbol());
+      if (ParameterNameAt(j) == other_param_name.raw()) {
+        found_param_name = true;
+        if (!TestParameterType(test_kind,
+                               j, i,
+                               type_arguments, other, other_type_arguments,
+                               malformed_error)) {
+          return false;
+        }
+        break;
+      }
+    }
+    if (!found_param_name) {
       return false;
     }
   }
@@ -4017,14 +3901,15 @@
   const String& kCommaSpace = String::Handle(Symbols::New(", "));
   const String& kColonSpace = String::Handle(Symbols::New(": "));
   const String& kLParen = String::Handle(Symbols::New("("));
-  const String& kRParen = String::Handle(Symbols::New(") => "));
+  const String& kRParenArrow = String::Handle(Symbols::New(") => "));
   const String& kLBracket = String::Handle(Symbols::New("["));
   const String& kRBracket = String::Handle(Symbols::New("]"));
   const String& kLBrace = String::Handle(Symbols::New("{"));
   const String& kRBrace = String::Handle(Symbols::New("}"));
   String& name = String::Handle();
-  if (!instantiate && !is_static()) {
-    // Prefix the signature with its type parameters, if any (e.g. "<K, V>").
+  if (!instantiate && !is_static() && (name_visibility == kInternalName)) {
+    // Prefix the signature with its class and type parameters, if any (e.g.
+    // "Map<K, V>(K) => bool").
     // The signature of static functions cannot be type parameterized.
     const String& kSpaceExtendsSpace =
         String::Handle(Symbols::New(" extends "));
@@ -4035,6 +3920,8 @@
     const TypeArguments& type_parameters = TypeArguments::Handle(
         function_class.type_parameters());
     if (!type_parameters.IsNull()) {
+      const String& function_class_name = String::Handle(function_class.Name());
+      pieces.Add(function_class_name);
       intptr_t num_type_parameters = type_parameters.Length();
       pieces.Add(kLAngleBracket);
       TypeParameter& type_parameter = TypeParameter::Handle();
@@ -4044,7 +3931,7 @@
         name = type_parameter.name();
         pieces.Add(name);
         bound = type_parameter.bound();
-        if (!bound.IsNull() && !bound.IsDynamicType()) {
+        if (!bound.IsNull() && !bound.IsObjectType()) {
           pieces.Add(kSpaceExtendsSpace);
           name = bound.BuildName(name_visibility);
           pieces.Add(name);
@@ -4085,8 +3972,7 @@
     for (intptr_t i = num_fixed_params; i < num_params; i++) {
       // The parameter name of an optional positional parameter does not need
       // to be part of the signature, since it is not used.
-      if (!FLAG_reject_named_argument_as_positional ||
-          (num_opt_named_params > 0)) {
+      if (num_opt_named_params > 0) {
         name = ParameterNameAt(i);
         pieces.Add(name);
         pieces.Add(kColonSpace);
@@ -4108,7 +3994,7 @@
       pieces.Add(kRBrace);
     }
   }
-  pieces.Add(kRParen);
+  pieces.Add(kRParenArrow);
   AbstractType& res_type = AbstractType::Handle(result_type());
   if (instantiate && !res_type.IsInstantiated()) {
     res_type = res_type.InstantiateFrom(instantiator);
@@ -5941,8 +5827,15 @@
   const Library& math_lib = Library::Handle(Library::MathLibrary());
   const Namespace& math_ns = Namespace::Handle(
       Namespace::New(math_lib, Array::Handle(), Array::Handle()));
+  Library::InitCollectionLibrary(isolate);
+  const Library& collection_lib =
+      Library::Handle(Library::CollectionLibrary());
+  const Namespace& collection_ns = Namespace::Handle(
+      Namespace::New(collection_lib, Array::Handle(), Array::Handle()));
   core_lib.AddImport(math_ns);
   core_impl_lib.AddImport(math_ns);
+  core_lib.AddImport(collection_ns);
+  core_impl_lib.AddImport(collection_ns);
   isolate->object_store()->set_root_library(Library::Handle());
 
   // Hook up predefined classes without setting their library pointers. These
@@ -5953,6 +5846,18 @@
 }
 
 
+void Library::InitCollectionLibrary(Isolate* isolate) {
+  const String& url = String::Handle(Symbols::New("dart:collection"));
+  const Library& lib = Library::Handle(Library::NewLibraryHelper(url, true));
+  lib.Register();
+  const Library& math_lib = Library::Handle(Library::MathLibrary());
+  const Namespace& math_ns = Namespace::Handle(
+      Namespace::New(math_lib, Array::Handle(), Array::Handle()));
+  lib.AddImport(math_ns);
+  isolate->object_store()->set_collection_library(lib);
+}
+
+
 void Library::InitMathLibrary(Isolate* isolate) {
   const String& url = String::Handle(Symbols::New("dart:math"));
   const Library& lib = Library::Handle(Library::NewLibraryHelper(url, true));
@@ -5994,10 +5899,11 @@
   const String& url = String::Handle(Symbols::New("dart:scalarlist"));
   const Library& lib = Library::Handle(Library::NewLibraryHelper(url, true));
   lib.Register();
-  const Library& core_impl_lib = Library::Handle(Library::CoreImplLibrary());
-  const Namespace& impl_ns = Namespace::Handle(
-      Namespace::New(core_impl_lib, Array::Handle(), Array::Handle()));
-  lib.AddImport(impl_ns);
+  const Library& collection_lib =
+      Library::Handle(Library::CollectionLibrary());
+  const Namespace& collection_ns = Namespace::Handle(
+      Namespace::New(collection_lib, Array::Handle(), Array::Handle()));
+  lib.AddImport(collection_ns);
   isolate->object_store()->set_scalarlist_library(lib);
 }
 
@@ -6115,6 +6021,11 @@
 }
 
 
+RawLibrary* Library::CollectionLibrary() {
+  return Isolate::Current()->object_store()->collection_library();
+}
+
+
 RawLibrary* Library::MathLibrary() {
   return Isolate::Current()->object_store()->math_library();
 }
@@ -6840,6 +6751,47 @@
 }
 
 
+intptr_t DeoptInfo::TranslationLength() const {
+  intptr_t length = Length();
+  if (Instruction(length - 1) != DeoptInstr::kSuffix) return length;
+
+  // If the last command is a suffix, add in the length of the suffix and
+  // do not count the suffix command as a translation command.
+  intptr_t ignored = 0;
+  intptr_t suffix_length =
+      DeoptInstr::DecodeSuffix(FromIndex(length - 1), &ignored);
+  return length + suffix_length - 1;
+}
+
+
+void DeoptInfo::ToInstructions(const Array& table,
+                               GrowableArray<DeoptInstr*>* instructions) const {
+  ASSERT(instructions->is_empty());
+  Smi& offset = Smi::Handle();
+  DeoptInfo& info = DeoptInfo::Handle(raw());
+  Smi& reason = Smi::Handle();
+  intptr_t index = 0;
+  intptr_t length = TranslationLength();
+  while (index < length) {
+    intptr_t instruction = info.Instruction(index);
+    intptr_t from_index = info.FromIndex(index);
+    if (instruction == DeoptInstr::kSuffix) {
+      // Suffix instructions cause us to 'jump' to another translation,
+      // changing info, length and index.
+      intptr_t info_number = 0;
+      intptr_t suffix_length =
+          DeoptInstr::DecodeSuffix(from_index, &info_number);
+      DeoptTable::GetEntry(table, info_number, &offset, &info, &reason);
+      length = info.TranslationLength();
+      index = length - suffix_length;
+    } else {
+      instructions->Add(DeoptInstr::Create(instruction, from_index));
+      ++index;
+    }
+  }
+}
+
+
 const char* DeoptInfo::ToCString() const {
   if (Length() == 0) {
     return "No DeoptInfo";
@@ -9851,17 +9803,22 @@
 
 
 bool String::Equals(const char* str) const {
+  ASSERT(str != NULL);
+  intptr_t len = strlen(str);
   for (intptr_t i = 0; i < this->Length(); ++i) {
     if (*str == '\0') {
       // Lengths don't match.
       return false;
     }
     int32_t ch;
-    intptr_t consumed = Utf8::Decode(str, &ch);
+    intptr_t consumed = Utf8::Decode(reinterpret_cast<const uint8_t*>(str),
+                                     len,
+                                     &ch);
     if (consumed == 0 || this->CharAt(i) != ch) {
       return false;
     }
     str += consumed;
+    len -= consumed;
   }
   return *str == '\0';
 }
@@ -9955,76 +9912,70 @@
 
 
 RawString* String::New(const char* str, Heap::Space space) {
-  intptr_t width = 0;
-  intptr_t len = Utf8::CodePointCount(str, &width);
-  if (width == 1) {
-    const OneByteString& onestr
+  ASSERT(str != NULL);
+  intptr_t array_len = strlen(str);
+  const uint8_t* utf8_array = reinterpret_cast<const uint8_t*>(str);
+  return String::New(utf8_array, array_len, space);
+}
+
+
+RawString* String::New(const uint8_t* utf8_array,
+                       intptr_t array_len,
+                       Heap::Space space) {
+  Utf8::Type type;
+  intptr_t len = Utf8::CodePointCount(utf8_array, array_len, &type);
+  if (type == Utf8::kAscii) {
+    const OneByteString& strobj
         = OneByteString::Handle(OneByteString::New(len, space));
     if (len > 0) {
       NoGCScope no_gc;
-      Utf8::Decode(str, onestr.CharAddr(0), len);
+      Utf8::DecodeToAscii(utf8_array, array_len, strobj.CharAddr(0), len);
     }
-    return onestr.raw();
-  } else if (width == 2) {
-    const TwoByteString& twostr =
-        TwoByteString::Handle(TwoByteString::New(len, space));
-    NoGCScope no_gc;
-    Utf8::Decode(str, twostr.CharAddr(0), len);
-    return twostr.raw();
+    return strobj.raw();
   }
-  ASSERT(width == 4);
-  const FourByteString& fourstr =
-      FourByteString::Handle(FourByteString::New(len, space));
+  ASSERT((type == Utf8::kBMP) || (type == Utf8::kSMP));
+  const TwoByteString& strobj =
+      TwoByteString::Handle(TwoByteString::New(len, space));
   NoGCScope no_gc;
-  Utf8::Decode(str, fourstr.CharAddr(0), len);
-  return fourstr.raw();
+  Utf8::DecodeToUTF16(utf8_array, array_len, strobj.CharAddr(0), len);
+  return strobj.raw();
 }
 
 
-RawString* String::New(const uint8_t* characters,
-                       intptr_t len,
-                       Heap::Space space) {
-  return OneByteString::New(characters, len, space);
-}
-
-
-RawString* String::New(const uint16_t* characters,
-                       intptr_t len,
+RawString* String::New(const uint16_t* utf16_array,
+                       intptr_t array_len,
                        Heap::Space space) {
   bool is_one_byte_string = true;
-  for (intptr_t i = 0; i < len; ++i) {
-    if (characters[i] > 0xFF) {
+  for (intptr_t i = 0; i < array_len; ++i) {
+    if (utf16_array[i] > 0x7F) {
       is_one_byte_string = false;
       break;
     }
   }
   if (is_one_byte_string) {
-    return OneByteString::New(characters, len, space);
+    return OneByteString::New(utf16_array, array_len, space);
   }
-  return TwoByteString::New(characters, len, space);
+  return TwoByteString::New(utf16_array, array_len, space);
 }
 
 
-RawString* String::New(const uint32_t* characters,
-                       intptr_t len,
+RawString* String::New(const uint32_t* utf32_array,
+                       intptr_t array_len,
                        Heap::Space space) {
   bool is_one_byte_string = true;
-  bool is_two_byte_string = true;
-  for (intptr_t i = 0; i < len; ++i) {
-    if (characters[i] > 0xFFFF) {
-      is_two_byte_string = false;
+  intptr_t utf16_len = array_len;
+  for (intptr_t i = 0; i < array_len; ++i) {
+    if (utf32_array[i] > 0x7F) {
       is_one_byte_string = false;
-      break;
-    } else if (characters[i] > 0xFF) {
-      is_one_byte_string = false;
+    }
+    if (utf32_array[i] > 0xFFFF) {
+      utf16_len += 1;
     }
   }
   if (is_one_byte_string) {
-    return OneByteString::New(characters, len, space);
-  } else if (is_two_byte_string) {
-    return TwoByteString::New(characters, len, space);
+    return OneByteString::New(utf32_array, array_len, space);
   }
-  return FourByteString::New(characters, len, space);
+  return TwoByteString::New(utf16_len, utf32_array, array_len, space);
 }
 
 
@@ -10038,11 +9989,9 @@
   intptr_t char_size = str.CharSize();
   if (char_size == kOneByteChar) {
     result ^= OneByteString::New(len, space);
-  } else if (char_size == kTwoByteChar) {
-    result ^= TwoByteString::New(len, space);
   } else {
-    ASSERT(char_size == kFourByteChar);
-    result ^= FourByteString::New(len, space);
+    ASSERT(char_size == kTwoByteChar);
+    result ^= TwoByteString::New(len, space);
   }
   String::Copy(result, 0, str, 0, len);
   return result.raw();
@@ -10067,15 +10016,6 @@
 }
 
 
-RawString* String::NewExternal(const uint32_t* characters,
-                               intptr_t len,
-                               void* peer,
-                               Dart_PeerFinalizer callback,
-                               Heap::Space space) {
-  return ExternalFourByteString::New(characters, len, peer, callback, space);
-}
-
-
 void String::Copy(const String& dst, intptr_t dst_offset,
                   const uint8_t* characters,
                   intptr_t len) {
@@ -10094,73 +10034,29 @@
     for (intptr_t i = 0; i < len; ++i) {
       *twostr.CharAddr(i + dst_offset) = characters[i];
     }
-  } else {
-    ASSERT(dst.IsFourByteString());
-    const FourByteString& fourstr = FourByteString::Cast(dst);
-    NoGCScope no_gc;
-    for (intptr_t i = 0; i < len; ++i) {
-      *fourstr.CharAddr(i + dst_offset) = characters[i];
-    }
   }
 }
 
 
 void String::Copy(const String& dst, intptr_t dst_offset,
-                  const uint16_t* characters,
-                  intptr_t len) {
+                  const uint16_t* utf16_array,
+                  intptr_t array_len) {
   ASSERT(dst_offset >= 0);
-  ASSERT(len >= 0);
-  ASSERT(len <= (dst.Length() - dst_offset));
+  ASSERT(array_len >= 0);
+  ASSERT(array_len <= (dst.Length() - dst_offset));
   if (dst.IsOneByteString()) {
     const OneByteString& onestr = OneByteString::Cast(dst);
     NoGCScope no_gc;
-    for (intptr_t i = 0; i < len; ++i) {
-      ASSERT(characters[i] <= 0xFF);
-      *onestr.CharAddr(i + dst_offset) = characters[i];
-    }
-  } else if (dst.IsTwoByteString()) {
-    const TwoByteString& twostr = TwoByteString::Cast(dst);
-    NoGCScope no_gc;
-    if (len > 0) {
-      memmove(twostr.CharAddr(dst_offset), characters, len * 2);
+    for (intptr_t i = 0; i < array_len; ++i) {
+      ASSERT(utf16_array[i] <= 0x7F);
+      *onestr.CharAddr(i + dst_offset) = utf16_array[i];
     }
   } else {
-    ASSERT(dst.IsFourByteString());
-    const FourByteString& fourstr = FourByteString::Cast(dst);
-    NoGCScope no_gc;
-    for (intptr_t i = 0; i < len; ++i) {
-      *fourstr.CharAddr(i + dst_offset) = characters[i];
-    }
-  }
-}
-
-
-void String::Copy(const String& dst, intptr_t dst_offset,
-                  const uint32_t* characters,
-                  intptr_t len) {
-  ASSERT(dst_offset >= 0);
-  ASSERT(len >= 0);
-  ASSERT(len <= (dst.Length() - dst_offset));
-  if (dst.IsOneByteString()) {
-    const OneByteString& onestr = OneByteString::Cast(dst);
-    NoGCScope no_gc;
-    for (intptr_t i = 0; i < len; ++i) {
-      ASSERT(characters[i] <= 0xFF);
-      *onestr.CharAddr(i + dst_offset) = characters[i];
-    }
-  } else if (dst.IsTwoByteString()) {
+    ASSERT(dst.IsTwoByteString());
     const TwoByteString& twostr = TwoByteString::Cast(dst);
     NoGCScope no_gc;
-    for (intptr_t i = 0; i < len; ++i) {
-      ASSERT(characters[i] <= 0xFFFF);
-      *twostr.CharAddr(i + dst_offset) = characters[i];
-    }
-  } else {
-    ASSERT(dst.IsFourByteString());
-    const FourByteString& fourstr = FourByteString::Cast(dst);
-    NoGCScope no_gc;
-    if (len > 0) {
-      memmove(fourstr.CharAddr(dst_offset), characters, len * 4);
+    if (array_len > 0) {
+      memmove(twostr.CharAddr(dst_offset), utf16_array, (array_len * 2));
     }
   }
 }
@@ -10187,7 +10083,8 @@
         NoGCScope no_gc;
         String::Copy(dst, dst_offset, onestr.CharAddr(0) + src_offset, len);
       }
-    } else if (char_size == kTwoByteChar) {
+    } else {
+      ASSERT(char_size == kTwoByteChar);
       if (src.IsTwoByteString()) {
         const TwoByteString& twostr = TwoByteString::Cast(src);
         NoGCScope no_gc;
@@ -10198,19 +10095,6 @@
         NoGCScope no_gc;
         String::Copy(dst, dst_offset, twostr.CharAddr(0) + src_offset, len);
       }
-    } else {
-      ASSERT(char_size == kFourByteChar);
-      if (src.IsFourByteString()) {
-        const FourByteString& fourstr = FourByteString::Cast(src);
-        NoGCScope no_gc;
-        String::Copy(dst, dst_offset, fourstr.CharAddr(0) + src_offset, len);
-      } else {
-        ASSERT(src.IsExternalFourByteString());
-        const ExternalFourByteString& fourstr =
-            ExternalFourByteString::Cast(src);
-        NoGCScope no_gc;
-        String::Copy(dst, dst_offset, fourstr.CharAddr(0) + src_offset, len);
-      }
     }
   }
 }
@@ -10221,13 +10105,9 @@
     const OneByteString& onestr = OneByteString::Cast(str);
     return onestr.EscapeSpecialCharacters(raw_str);
   }
-  if (str.IsTwoByteString()) {
-    const TwoByteString& twostr = TwoByteString::Cast(str);
-    return twostr.EscapeSpecialCharacters(raw_str);
-  }
-  ASSERT(str.IsFourByteString());
-  const FourByteString& fourstr = FourByteString::Cast(str);
-  return fourstr.EscapeSpecialCharacters(raw_str);
+  ASSERT(str.IsTwoByteString());
+  const TwoByteString& twostr = TwoByteString::Cast(str);
+  return twostr.EscapeSpecialCharacters(raw_str);
 }
 
 
@@ -10260,9 +10140,6 @@
                           Heap::Space space) {
   ASSERT(!str1.IsNull() && !str2.IsNull());
   intptr_t char_size = Utils::Maximum(str1.CharSize(), str2.CharSize());
-  if (char_size == kFourByteChar) {
-    return FourByteString::Concat(str1, str2, space);
-  }
   if (char_size == kTwoByteChar) {
     return TwoByteString::Concat(str1, str2, space);
   }
@@ -10284,11 +10161,9 @@
   }
   if (char_size == kOneByteChar) {
     return OneByteString::ConcatAll(strings, result_len, space);
-  } else if (char_size == kTwoByteChar) {
-    return TwoByteString::ConcatAll(strings, result_len, space);
   }
-  ASSERT(char_size == kFourByteChar);
-  return FourByteString::ConcatAll(strings, result_len, space);
+  ASSERT(char_size == kTwoByteChar);
+  return TwoByteString::ConcatAll(strings, result_len, space);
 }
 
 
@@ -10318,32 +10193,19 @@
   }
   String& result = String::Handle();
   bool is_one_byte_string = true;
-  bool is_two_byte_string = true;
   intptr_t char_size = str.CharSize();
   if (char_size == kTwoByteChar) {
     for (intptr_t i = begin_index; i < begin_index + length; ++i) {
-      if (str.CharAt(i) > 0xFF) {
+      if (str.CharAt(i) > 0x7F) {
         is_one_byte_string = false;
         break;
       }
     }
-  } else if (char_size == kFourByteChar) {
-    for (intptr_t i = begin_index; i < begin_index + length; ++i) {
-      if (str.CharAt(i) > 0xFFFF) {
-        is_one_byte_string = false;
-        is_two_byte_string = false;
-        break;
-      } else if (str.CharAt(i) > 0xFF) {
-        is_one_byte_string = false;
-      }
-    }
   }
   if (is_one_byte_string) {
     result ^= OneByteString::New(length, space);
-  } else if (is_two_byte_string) {
-    result ^= TwoByteString::New(length, space);
   } else {
-    result ^= FourByteString::New(length, space);
+    result ^= TwoByteString::New(length, space);
   }
   String::Copy(result, 0, str, begin_index, length);
   return result.raw();
@@ -10353,10 +10215,24 @@
 const char* String::ToCString() const {
   intptr_t len = Utf8::Length(*this);
   Zone* zone = Isolate::Current()->current_zone();
-  char* result = zone->Alloc<char>(len + 1);
-  Utf8::Encode(*this, result, len);
+  uint8_t* result = zone->Alloc<uint8_t>(len + 1);
+  ToUTF8(result, len);
   result[len] = 0;
-  return result;
+  return reinterpret_cast<const char*>(result);
+}
+
+
+void String::ToUTF8(uint8_t* utf8_array, intptr_t array_len) const {
+  if (CharSize() == kOneByteChar) {
+    const OneByteString& obj = OneByteString::Cast(*this);
+    ASSERT(array_len >= obj.Length());
+    if (obj.Length() > 0) {
+      memmove(utf8_array, obj.CharAddr(0), obj.Length());
+    }
+  } else {
+    ASSERT(array_len >= Utf8::Length(*this));
+    Utf8::Encode(*this, reinterpret_cast<char*>(utf8_array), array_len);
+  }
 }
 
 
@@ -10379,14 +10255,11 @@
   if (!has_mapping) {
     return str.raw();
   }
-  if (dst_max <= 0xFF) {
+  if (dst_max <= 0x7F) {
     return OneByteString::Transform(mapping, str, space);
   }
-  if (dst_max <= 0xFFFF) {
-    return TwoByteString::Transform(mapping, str, space);
-  }
-  ASSERT(dst_max > 0xFFFF);
-  return FourByteString::Transform(mapping, str, space);
+  ASSERT(dst_max > 0x7F);
+  return TwoByteString::Transform(mapping, str, space);
 }
 
 
@@ -10517,7 +10390,10 @@
                                      Heap::Space space) {
   const OneByteString& result =
       OneByteString::Handle(OneByteString::New(len, space));
-  String::Copy(result, 0, characters, len);
+  if (len > 0) {
+    NoGCScope no_gc;
+    memmove(result.CharAddr(0), characters, len);
+  }
   return result.raw();
 }
 
@@ -10527,7 +10403,10 @@
                                      Heap::Space space) {
   const OneByteString& result =
       OneByteString::Handle(OneByteString::New(len, space));
-  String::Copy(result, 0, characters, len);
+  for (intptr_t i = 0; i < len; ++i) {
+    ASSERT(characters[i] <= 0x7F);
+    *result.CharAddr(i) = characters[i];
+  }
   return result.raw();
 }
 
@@ -10537,7 +10416,10 @@
                                      Heap::Space space) {
   const OneByteString& result =
       OneByteString::Handle(OneByteString::New(len, space));
-  String::Copy(result, 0, characters, len);
+  for (intptr_t i = 0; i < len; ++i) {
+    ASSERT(characters[i] <= 0x7F);
+    *result.CharAddr(i) = characters[i];
+  }
   return result.raw();
 }
 
@@ -10593,7 +10475,7 @@
       OneByteString::Handle(OneByteString::New(len, space));
   for (intptr_t i = 0; i < len; ++i) {
     int32_t ch = mapping(str.CharAt(i));
-    ASSERT(ch >= 0 && ch <= 0xFF);
+    ASSERT(ch >= 0 && ch <= 0x7F);
     *result.CharAddr(i) = ch;
   }
   return result.raw();
@@ -10659,22 +10541,42 @@
 }
 
 
-RawTwoByteString* TwoByteString::New(const uint16_t* characters,
-                                     intptr_t len,
+RawTwoByteString* TwoByteString::New(const uint16_t* utf16_array,
+                                     intptr_t array_len,
                                      Heap::Space space) {
+  ASSERT(array_len > 0);
   const TwoByteString& result =
-      TwoByteString::Handle(TwoByteString::New(len, space));
-  String::Copy(result, 0, characters, len);
+      TwoByteString::Handle(TwoByteString::New(array_len, space));
+  {
+    NoGCScope no_gc;
+    memmove(result.CharAddr(0), utf16_array, (array_len * 2));
+  }
   return result.raw();
 }
 
 
-RawTwoByteString* TwoByteString::New(const uint32_t* characters,
-                                     intptr_t len,
+RawTwoByteString* TwoByteString::New(intptr_t utf16_len,
+                                     const uint32_t* utf32_array,
+                                     intptr_t array_len,
                                      Heap::Space space) {
+  ASSERT((array_len > 0) && (utf16_len >= array_len));
   const TwoByteString& result =
-      TwoByteString::Handle(TwoByteString::New(len, space));
-  String::Copy(result, 0, characters, len);
+      TwoByteString::Handle(TwoByteString::New(utf16_len, space));
+  {
+    NoGCScope no_gc;
+    intptr_t j = 0;
+    for (intptr_t i = 0; i < array_len; ++i) {
+      if (utf32_array[i] > 0xffff) {
+        ASSERT(j < (utf16_len - 1));
+        Utf8::ConvertUTF32ToUTF16(utf32_array[i], result.CharAddr(j));
+        j += 2;
+      } else {
+        ASSERT(j < utf16_len);
+        *result.CharAddr(j) = utf32_array[i];
+        j += 1;
+      }
+    }
+  }
   return result.raw();
 }
 
@@ -10742,132 +10644,6 @@
 }
 
 
-RawFourByteString* FourByteString::EscapeSpecialCharacters(bool raw_str) const {
-  intptr_t len = Length();
-  if (len > 0) {
-    intptr_t num_escapes = 0;
-    intptr_t index = 0;
-    for (intptr_t i = 0; i < len; i++) {
-      if (IsSpecialCharacter(*CharAddr(i)) ||
-          (!raw_str && (*CharAddr(i) == '\\'))) {
-        num_escapes += 1;
-      }
-    }
-    const FourByteString& dststr = FourByteString::Handle(
-        FourByteString::New(len + num_escapes, Heap::kNew));
-    for (intptr_t i = 0; i < len; i++) {
-      if (IsSpecialCharacter(*CharAddr(i))) {
-        *(dststr.CharAddr(index)) = '\\';
-        *(dststr.CharAddr(index + 1)) = SpecialCharacter(*CharAddr(i));
-        index += 2;
-      } else if (!raw_str && (*CharAddr(i) == '\\')) {
-        *(dststr.CharAddr(index)) = '\\';
-        *(dststr.CharAddr(index + 1)) = '\\';
-        index += 2;
-      } else {
-        *(dststr.CharAddr(index)) = *CharAddr(i);
-        index += 1;
-      }
-    }
-    return dststr.raw();
-  }
-  return FourByteString::null();
-}
-
-
-RawFourByteString* FourByteString::New(intptr_t len,
-                                       Heap::Space space) {
-  ASSERT(Isolate::Current()->object_store()->four_byte_string_class() !=
-         Class::null());
-  if (len < 0 || len > kMaxElements) {
-    // This should be caught before we reach here.
-    FATAL1("Fatal error in FourByteString::New: invalid len %"Pd"\n", len);
-  }
-  FourByteString& result = FourByteString::Handle();
-  {
-    RawObject* raw = Object::Allocate(FourByteString::kClassId,
-                                      FourByteString::InstanceSize(len),
-                                      space);
-    NoGCScope no_gc;
-    result ^= raw;
-    result.SetLength(len);
-    result.SetHash(0);
-  }
-  return result.raw();
-}
-
-
-RawFourByteString* FourByteString::New(const uint32_t* characters,
-                                       intptr_t len,
-                                       Heap::Space space) {
-  const FourByteString& result =
-      FourByteString::Handle(FourByteString::New(len, space));
-  String::Copy(result, 0, characters, len);
-  return result.raw();
-}
-
-
-RawFourByteString* FourByteString::New(const FourByteString& str,
-                                       Heap::Space space) {
-  return FourByteString::New(str.CharAddr(0), str.Length(), space);
-}
-
-
-RawFourByteString* FourByteString::Concat(const String& str1,
-                                          const String& str2,
-                                          Heap::Space space) {
-  intptr_t len1 = str1.Length();
-  intptr_t len2 = str2.Length();
-  intptr_t len = len1 + len2;
-  const FourByteString& result =
-      FourByteString::Handle(FourByteString::New(len, space));
-  String::Copy(result, 0, str1, 0, len1);
-  String::Copy(result, len1, str2, 0, len2);
-  return result.raw();
-}
-
-
-RawFourByteString* FourByteString::ConcatAll(const Array& strings,
-                                             intptr_t len,
-                                             Heap::Space space) {
-  const FourByteString& result =
-      FourByteString::Handle(FourByteString::New(len, space));
-  String& str = String::Handle();
-  {
-    intptr_t strings_len = strings.Length();
-    intptr_t pos = 0;
-    for (intptr_t i = 0; i < strings_len; i++) {
-      str ^= strings.At(i);
-      intptr_t str_len = str.Length();
-      String::Copy(result, pos, str, 0, str_len);
-      pos += str_len;
-    }
-  }
-  return result.raw();
-}
-
-
-RawFourByteString* FourByteString::Transform(int32_t (*mapping)(int32_t ch),
-                                             const String& str,
-                                             Heap::Space space) {
-  ASSERT(!str.IsNull());
-  intptr_t len = str.Length();
-  const FourByteString& result =
-      FourByteString::Handle(FourByteString::New(len, space));
-  for (intptr_t i = 0; i < len; ++i) {
-    int32_t ch = mapping(str.CharAt(i));
-    ASSERT(ch >= 0 && ch <= 0x10FFFF);
-    *result.CharAddr(i) = ch;
-  }
-  return result.raw();
-}
-
-
-const char* FourByteString::ToCString() const {
-  return String::ToCString();
-}
-
-
 static void AddFinalizer(const Object& referent,
                          void* peer,
                          Dart_WeakPersistentHandleFinalizer callback) {
@@ -10976,48 +10752,6 @@
 }
 
 
-RawExternalFourByteString* ExternalFourByteString::New(
-    const uint32_t* data,
-    intptr_t len,
-    void* peer,
-    Dart_PeerFinalizer callback,
-    Heap::Space space) {
-  ASSERT(Isolate::Current()->object_store()->
-         external_four_byte_string_class() != Class::null());
-  if (len < 0 || len > kMaxElements) {
-    // This should be caught before we reach here.
-    FATAL1("Fatal error in ExternalFourByteString::New: invalid len %"Pd"\n",
-           len);
-  }
-  ExternalFourByteString& result = ExternalFourByteString::Handle();
-  ExternalStringData<uint32_t>* external_data =
-      new ExternalStringData<uint32_t>(data, peer, callback);
-  {
-    RawObject* raw = Object::Allocate(ExternalFourByteString::kClassId,
-                                      ExternalFourByteString::InstanceSize(),
-                                      space);
-    NoGCScope no_gc;
-    result ^= raw;
-    result.SetLength(len);
-    result.SetHash(0);
-    result.SetExternalData(external_data);
-  }
-  AddFinalizer(result, external_data, ExternalFourByteString::Finalize);
-  return result.raw();
-}
-
-
-void ExternalFourByteString::Finalize(Dart_Handle handle, void* peer) {
-  delete reinterpret_cast<ExternalStringData<uint32_t>*>(peer);
-  DeleteWeakPersistentHandle(handle);
-}
-
-
-const char* ExternalFourByteString::ToCString() const {
-  return String::ToCString();
-}
-
-
 RawBool* Bool::True() {
   return Isolate::Current()->object_store()->true_value();
 }
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index b8bb4dd..27dc8d1 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -29,6 +29,7 @@
 class Assembler;
 class Closure;
 class Code;
+class DeoptInstr;
 class LocalScope;
 class Symbols;
 
@@ -1061,17 +1062,18 @@
   RawString* QualifiedUserVisibleName() const;
   virtual RawString* DictionaryName() const { return name(); }
 
-  // Build a string of the form '<T, R>(T, [b: B, c: C]) => R' representing the
-  // internal signature of the given function.
+  // Build a string of the form 'C<T, R>(T, {b: B, c: C}) => R' representing the
+  // internal signature of the given function. In this example, T and R are
+  // type parameters of class C, the owner of the function.
   RawString* Signature() const {
     const bool instantiate = false;
     return BuildSignature(instantiate, kInternalName, TypeArguments::Handle());
   }
 
-  // Build a string of the form '(A, [b: B, c: C]) => D' representing the
+  // Build a string of the form '(A, {b: B, c: C}) => D' representing the
   // signature of the given function, where all generic types (e.g. '<T, R>' in
-  // '<T, R>(T, [b: B, c: C]) => R') are instantiated using the given
-  // instantiator type argument vector (e.g. '<A, D>').
+  // 'C<T, R>(T, {b: B, c: C}) => R') are instantiated using the given
+  // instantiator type argument vector of a C instance (e.g. '<A, D>').
   RawString* InstantiatedSignatureFrom(
       const AbstractTypeArguments& instantiator,
       NameVisibility name_visibility) const {
@@ -1909,6 +1911,7 @@
   static bool IsKeyUsed(intptr_t key);
 
   static void InitCoreLibrary(Isolate* isolate);
+  static void InitCollectionLibrary(Isolate* isolate);
   static void InitMathLibrary(Isolate* isolate);
   static void InitIsolateLibrary(Isolate* isolate);
   static void InitMirrorsLibrary(Isolate* isolate);
@@ -1917,6 +1920,7 @@
 
   static RawLibrary* CoreLibrary();
   static RawLibrary* CoreImplLibrary();
+  static RawLibrary* CollectionLibrary();
   static RawLibrary* MathLibrary();
   static RawLibrary* IsolateLibrary();
   static RawLibrary* MirrorsLibrary();
@@ -2328,8 +2332,13 @@
   };
 
  public:
+  // The number of instructions.
   intptr_t Length() const;
 
+  // The number of real (non-suffix) instructions needed to execute the
+  // deoptimization translation.
+  intptr_t TranslationLength() const;
+
   static RawDeoptInfo* New(intptr_t num_commands);
 
   static const intptr_t kBytesPerElement = (kNumberOfEntries * kWordSize);
@@ -2357,6 +2366,11 @@
     return index;
   }
 
+  // Unpack the entire translation into an array of deoptimization
+  // instructions.  This copies any shared suffixes into the array.
+  void ToInstructions(const Array& table,
+                      GrowableArray<DeoptInstr*>* instructions) const;
+
  private:
   intptr_t* EntryAddr(intptr_t index, intptr_t entry_offset) const {
     ASSERT((index >=0) && (index < Length()));
@@ -3612,13 +3626,12 @@
 
   static const intptr_t kOneByteChar = 1;
   static const intptr_t kTwoByteChar = 2;
-  static const intptr_t kFourByteChar = 4;
 
   // All strings share the same maximum element count to keep things
   // simple.  We choose a value that will prevent integer overflow for
-  // 4 byte strings, since it is the worst case.
+  // 2 byte strings, since it is the worst case.
   static const intptr_t kSizeofRawString = sizeof(RawObject) + (2 * kWordSize);
-  static const intptr_t kMaxElements = kSmiMax / kFourByteChar;
+  static const intptr_t kMaxElements = kSmiMax / kTwoByteChar;
 
   intptr_t Length() const { return Smi::Value(raw_ptr()->length_); }
   static intptr_t length_offset() { return OFFSET_OF(RawString, length_); }
@@ -3659,30 +3672,42 @@
     return NULL;
   }
 
-  static RawString* New(const char* str, Heap::Space space = Heap::kNew);
-  static RawString* New(const uint8_t* characters,
-                        intptr_t len,
+  void ToUTF8(uint8_t* utf8_array, intptr_t array_len) const;
+
+  // Creates a new String object from a C string that is assumed to contain
+  // UTF-8 encoded characters and '\0' is considered a termination character.
+  static RawString* New(const char* cstr, Heap::Space space = Heap::kNew);
+
+  // Creates a new String object from an array of UTF-8 encoded characters.
+  static RawString* New(const uint8_t* utf8_array,
+                        intptr_t array_len,
                         Heap::Space space = Heap::kNew);
-  static RawString* New(const uint16_t* characters,
-                        intptr_t len,
+
+  // Creates a new String object from an array of UTF-16 encoded characters.
+  static RawString* New(const uint16_t* utf16_array,
+                        intptr_t array_len,
                         Heap::Space space = Heap::kNew);
-  static RawString* New(const uint32_t* characters,
-                        intptr_t len,
+
+  // Creates a new String object from an array of UTF-32 encoded characters.
+  static RawString* New(const uint32_t* utf32_array,
+                        intptr_t array_len,
                         Heap::Space space = Heap::kNew);
+
+  // Create a new String object from another Dart String instance.
   static RawString* New(const String& str, Heap::Space space = Heap::kNew);
 
-  static RawString* NewExternal(const uint8_t* characters,
-                                intptr_t len,
+  // Creates a new External String object using the specified array of
+  // UTF-8 encoded characters as the external reference.
+  static RawString* NewExternal(const uint8_t* utf8_array,
+                                intptr_t array_len,
                                 void* peer,
                                 Dart_PeerFinalizer callback,
                                 Heap::Space = Heap::kNew);
-  static RawString* NewExternal(const uint16_t* characters,
-                                intptr_t len,
-                                void* peer,
-                                Dart_PeerFinalizer callback,
-                                Heap::Space = Heap::kNew);
-  static RawString* NewExternal(const uint32_t* characters,
-                                intptr_t len,
+
+  // Creates a new External String object using the specified array of
+  // UTF-16 encoded characters as the external reference.
+  static RawString* NewExternal(const uint16_t* utf16_array,
+                                intptr_t array_len,
                                 void* peer,
                                 Dart_PeerFinalizer callback,
                                 Heap::Space = Heap::kNew);
@@ -3697,10 +3722,6 @@
                    intptr_t len);
   static void Copy(const String& dst,
                    intptr_t dst_offset,
-                   const uint32_t* characters,
-                   intptr_t len);
-  static void Copy(const String& dst,
-                   intptr_t dst_offset,
                    const String& src,
                    intptr_t src_offset,
                    intptr_t len);
@@ -3874,7 +3895,8 @@
   static RawTwoByteString* New(const uint16_t* characters,
                                intptr_t len,
                                Heap::Space space);
-  static RawTwoByteString* New(const uint32_t* characters,
+  static RawTwoByteString* New(intptr_t utf16_len,
+                               const uint32_t* characters,
                                intptr_t len,
                                Heap::Space space);
   static RawTwoByteString* New(const TwoByteString& str,
@@ -3903,64 +3925,6 @@
 };
 
 
-class FourByteString : public String {
- public:
-  virtual int32_t CharAt(intptr_t index) const {
-    return *CharAddr(index);
-  }
-
-  virtual intptr_t CharSize() const {
-    return kFourByteChar;
-  }
-
-  RawFourByteString* EscapeSpecialCharacters(bool raw_str) const;
-
-  static const intptr_t kBytesPerElement = 4;
-  static const intptr_t kMaxElements = String::kMaxElements;
-
-  static intptr_t InstanceSize() {
-    ASSERT(sizeof(RawFourByteString) == OFFSET_OF(RawFourByteString, data_));
-    return 0;
-  }
-
-  static intptr_t InstanceSize(intptr_t len) {
-    ASSERT(sizeof(RawTwoByteString) == kSizeofRawString);
-    ASSERT(0 <= len && len <= kMaxElements);
-    return RoundedAllocationSize(
-        sizeof(RawFourByteString) + (len * kBytesPerElement));
-  }
-
-  static RawFourByteString* New(intptr_t len,
-                                Heap::Space space);
-  static RawFourByteString* New(const uint32_t* characters,
-                                intptr_t len,
-                                Heap::Space space);
-  static RawFourByteString* New(const FourByteString& str,
-                                Heap::Space space);
-
-  static RawFourByteString* Concat(const String& str1,
-                                   const String& str2,
-                                   Heap::Space space);
-  static RawFourByteString* ConcatAll(const Array& strings,
-                                      intptr_t len,
-                                      Heap::Space space);
-
-  static RawFourByteString* Transform(int32_t (*mapping)(int32_t ch),
-                                      const String& str,
-                                      Heap::Space space);
-
- private:
-  uint32_t* CharAddr(intptr_t index) const {
-    ASSERT((index >= 0) && (index < Length()));
-    return &raw_ptr()->data_[index];
-  }
-
-  HEAP_OBJECT_IMPLEMENTATION(FourByteString, String);
-  friend class Class;
-  friend class String;
-};
-
-
 class ExternalOneByteString : public String {
  public:
   virtual int32_t CharAt(intptr_t index) const {
@@ -4057,54 +4021,6 @@
 };
 
 
-class ExternalFourByteString : public String {
- public:
-  virtual int32_t CharAt(intptr_t index) const {
-    return *CharAddr(index);
-  }
-
-  virtual intptr_t CharSize() const {
-    return kFourByteChar;
-  }
-
-  virtual bool IsExternal() const { return true; }
-  virtual void* GetPeer() const {
-    return raw_ptr()->external_data_->peer();
-  }
-
-  // We use the same maximum elements for all strings.
-  static const intptr_t kBytesPerElement = 4;
-  static const intptr_t kMaxElements = String::kMaxElements;
-
-  static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawExternalFourByteString));
-  }
-
-  static RawExternalFourByteString* New(const uint32_t* characters,
-                                        intptr_t len,
-                                        void* peer,
-                                        Dart_PeerFinalizer callback,
-                                        Heap::Space space = Heap::kNew);
-
- private:
-  const uint32_t* CharAddr(intptr_t index) const {
-    // TODO(iposva): Determine if we should throw an exception here.
-    ASSERT((index >= 0) && (index < Length()));
-    return &(raw_ptr()->external_data_->data()[index]);
-  }
-
-  void SetExternalData(ExternalStringData<uint32_t>* data) {
-    raw_ptr()->external_data_ = data;
-  }
-
-  static void Finalize(Dart_Handle handle, void* peer);
-
-  HEAP_OBJECT_IMPLEMENTATION(ExternalFourByteString, String);
-  friend class Class;
-  friend class String;
-};
-
-
 // Class Bool implements Dart core class bool.
 class Bool : public Instance {
  public:
@@ -4930,6 +4846,10 @@
     raw_ptr()->external_data_->data()[index] = value;
   }
 
+  void* GetData() const {
+    return raw_ptr()->external_data_->data();
+  }
+
   void* GetPeer() const {
     return raw_ptr()->external_data_->peer();
   }
@@ -4984,6 +4904,10 @@
     raw_ptr()->external_data_->data()[index] = value;
   }
 
+  void* GetData() const {
+    return raw_ptr()->external_data_->data();
+  }
+
   void* GetPeer() const {
     return raw_ptr()->external_data_->peer();
   }
@@ -5039,6 +4963,10 @@
     raw_ptr()->external_data_->data()[index] = value;
   }
 
+  void* GetData() const {
+    return raw_ptr()->external_data_->data();
+  }
+
   void* GetPeer() const {
     return raw_ptr()->external_data_->peer();
   }
@@ -5093,6 +5021,10 @@
     raw_ptr()->external_data_->data()[index] = value;
   }
 
+  void* GetData() const {
+    return raw_ptr()->external_data_->data();
+  }
+
   void* GetPeer() const {
     return raw_ptr()->external_data_->peer();
   }
@@ -5147,6 +5079,10 @@
     raw_ptr()->external_data_->data()[index] = value;
   }
 
+  void* GetData() const {
+    return raw_ptr()->external_data_->data();
+  }
+
   void* GetPeer() const {
     return raw_ptr()->external_data_->peer();
   }
@@ -5201,6 +5137,10 @@
     raw_ptr()->external_data_->data()[index] = value;
   }
 
+  void* GetData() const {
+    return raw_ptr()->external_data_->data();
+  }
+
   void* GetPeer() const {
     return raw_ptr()->external_data_->peer();
   }
@@ -5255,6 +5195,10 @@
     raw_ptr()->external_data_->data()[index] = value;
   }
 
+  void* GetData() const {
+    return raw_ptr()->external_data_->data();
+  }
+
   void* GetPeer() const {
     return raw_ptr()->external_data_->peer();
   }
@@ -5309,6 +5253,10 @@
     raw_ptr()->external_data_->data()[index] = value;
   }
 
+  void* GetData() const {
+    return raw_ptr()->external_data_->data();
+  }
+
   void* GetPeer() const {
     return raw_ptr()->external_data_->peer();
   }
@@ -5363,6 +5311,10 @@
     raw_ptr()->external_data_->data()[index] = value;
   }
 
+  void* GetData() const {
+    return raw_ptr()->external_data_->data();
+  }
+
   void* GetPeer() const {
     return raw_ptr()->external_data_->peer();
   }
@@ -5417,6 +5369,10 @@
     raw_ptr()->external_data_->data()[index] = value;
   }
 
+  void* GetData() const {
+    return raw_ptr()->external_data_->data();
+  }
+
   void* GetPeer() const {
     return raw_ptr()->external_data_->peer();
   }
diff --git a/runtime/vm/object_store.cc b/runtime/vm/object_store.cc
index 63ea281..970ad17 100644
--- a/runtime/vm/object_store.cc
+++ b/runtime/vm/object_store.cc
@@ -30,10 +30,8 @@
     string_interface_(Type::null()),
     one_byte_string_class_(Class::null()),
     two_byte_string_class_(Class::null()),
-    four_byte_string_class_(Class::null()),
     external_one_byte_string_class_(Class::null()),
     external_two_byte_string_class_(Class::null()),
-    external_four_byte_string_class_(Class::null()),
     bool_type_(Type::null()),
     bool_class_(Class::null()),
     list_interface_(Type::null()),
diff --git a/runtime/vm/object_store.h b/runtime/vm/object_store.h
index 301293e..f59d78c 100644
--- a/runtime/vm/object_store.h
+++ b/runtime/vm/object_store.h
@@ -117,11 +117,6 @@
     two_byte_string_class_ = value.raw();
   }
 
-  RawClass* four_byte_string_class() const { return four_byte_string_class_; }
-  void set_four_byte_string_class(const Class& value) {
-    four_byte_string_class_ = value.raw();
-  }
-
   RawClass* external_one_byte_string_class() const {
     return external_one_byte_string_class_;
   }
@@ -136,13 +131,6 @@
     external_two_byte_string_class_ = value.raw();
   }
 
-  RawClass* external_four_byte_string_class() const {
-    return external_four_byte_string_class_;
-  }
-  void set_external_four_byte_string_class(const Class& value) {
-    external_four_byte_string_class_ = value.raw();
-  }
-
   RawType* bool_type() const { return bool_type_; }
   void set_bool_type(const Type& value) { bool_type_ = value.raw(); }
 
@@ -362,6 +350,13 @@
     core_impl_library_ = value.raw();
   }
 
+  RawLibrary* collection_library() const {
+    return collection_library_;
+  }
+  void set_collection_library(const Library& value) {
+    collection_library_ = value.raw();
+  }
+
   RawLibrary* math_library() const {
     return math_library_;
   }
@@ -487,10 +482,8 @@
   RawType* string_interface_;
   RawClass* one_byte_string_class_;
   RawClass* two_byte_string_class_;
-  RawClass* four_byte_string_class_;
   RawClass* external_one_byte_string_class_;
   RawClass* external_two_byte_string_class_;
-  RawClass* external_four_byte_string_class_;
   RawType* bool_type_;
   RawClass* bool_class_;
   RawType* list_interface_;
@@ -526,6 +519,7 @@
   RawArray* canonical_type_arguments_;
   RawLibrary* core_library_;
   RawLibrary* core_impl_library_;
+  RawLibrary* collection_library_;
   RawLibrary* math_library_;
   RawLibrary* isolate_library_;
   RawLibrary* mirrors_library_;
diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
index 6bcf17c..9347a56 100644
--- a/runtime/vm/object_test.cc
+++ b/runtime/vm/object_test.cc
@@ -470,7 +470,6 @@
   EXPECT(str.IsString());
   EXPECT(str.IsOneByteString());
   EXPECT(!str.IsTwoByteString());
-  EXPECT(!str.IsFourByteString());
   EXPECT(!str.IsNumber());
   EXPECT_EQ(hello_len, str.Length());
   EXPECT_EQ('H', str.CharAt(0));
@@ -515,23 +514,23 @@
   EXPECT(empty1.Equals(empty2, 0, 0));
 
   const intptr_t kCharsLen = 8;
-  const uint8_t chars[kCharsLen] = { 1, 2, 127, 128, 192, 0, 255, -1 };
+  const uint8_t chars[kCharsLen] = { 1, 2, 127, 64, 92, 0, 55, 55 };
   const String& str8 = String::Handle(String::New(chars, kCharsLen));
   EXPECT_EQ(kCharsLen, str8.Length());
   EXPECT_EQ(1, str8.CharAt(0));
   EXPECT_EQ(127, str8.CharAt(2));
-  EXPECT_EQ(128, str8.CharAt(3));
+  EXPECT_EQ(64, str8.CharAt(3));
   EXPECT_EQ(0, str8.CharAt(5));
-  EXPECT_EQ(255, str8.CharAt(6));
-  EXPECT_EQ(255, str8.CharAt(7));
+  EXPECT_EQ(55, str8.CharAt(6));
+  EXPECT_EQ(55, str8.CharAt(7));
   const intptr_t kCharsIndex = 3;
   const String& sub1 = String::Handle(String::SubString(str8, kCharsIndex));
   EXPECT_EQ((kCharsLen - kCharsIndex), sub1.Length());
-  EXPECT_EQ(128, sub1.CharAt(0));
-  EXPECT_EQ(192, sub1.CharAt(1));
+  EXPECT_EQ(64, sub1.CharAt(0));
+  EXPECT_EQ(92, sub1.CharAt(1));
   EXPECT_EQ(0, sub1.CharAt(2));
-  EXPECT_EQ(255, sub1.CharAt(3));
-  EXPECT_EQ(255, sub1.CharAt(4));
+  EXPECT_EQ(55, sub1.CharAt(3));
+  EXPECT_EQ(55, sub1.CharAt(4));
 
   const intptr_t kWideCharsLen = 7;
   uint16_t wide_chars[kWideCharsLen] = { 'H', 'e', 'l', 'l', 'o', 256, '!' };
@@ -541,7 +540,6 @@
   EXPECT(two_str.IsString());
   EXPECT(two_str.IsTwoByteString());
   EXPECT(!two_str.IsOneByteString());
-  EXPECT(!two_str.IsFourByteString());
   EXPECT_EQ(kWideCharsLen, two_str.Length());
   EXPECT_EQ('H', two_str.CharAt(0));
   EXPECT_EQ(256, two_str.CharAt(5));
@@ -564,40 +562,38 @@
   const uint32_t four_chars[] = { 'C', 0xFF, 'h', 0xFFFF, 'a', 0x10FFFF, 'r' };
   const String& four_str = String::Handle(String::New(four_chars, 7));
   EXPECT_EQ(four_str.Hash(), four_str.Hash());
-  EXPECT(!four_str.IsTwoByteString());
+  EXPECT(four_str.IsTwoByteString());
   EXPECT(!four_str.IsOneByteString());
-  EXPECT(four_str.IsFourByteString());
-  EXPECT_EQ(7, four_str.Length());
+  EXPECT_EQ(8, four_str.Length());
   EXPECT_EQ('C', four_str.CharAt(0));
   EXPECT_EQ(0xFF, four_str.CharAt(1));
   EXPECT_EQ('h', four_str.CharAt(2));
   EXPECT_EQ(0xFFFF, four_str.CharAt(3));
   EXPECT_EQ('a', four_str.CharAt(4));
-  EXPECT_EQ(0x10FFFF, four_str.CharAt(5));
-  EXPECT_EQ('r', four_str.CharAt(6));
+  EXPECT_EQ(0xDBFF, four_str.CharAt(5));
+  EXPECT_EQ(0xDFFF, four_str.CharAt(6));
+  EXPECT_EQ('r', four_str.CharAt(7));
 
   // Create a 1-byte string from an array of 2-byte elements.
   {
-    const uint16_t char16[] = { 0x00, 0x7F, 0xFF };
+    const uint16_t char16[] = { 0x00, 0x1F, 0x7F };
     const String& str8 = String::Handle(String::New(char16, 3));
     EXPECT(str8.IsOneByteString());
     EXPECT(!str8.IsTwoByteString());
-    EXPECT(!str8.IsFourByteString());
     EXPECT_EQ(0x00, str8.CharAt(0));
-    EXPECT_EQ(0x7F, str8.CharAt(1));
-    EXPECT_EQ(0xFF, str8.CharAt(2));
+    EXPECT_EQ(0x1F, str8.CharAt(1));
+    EXPECT_EQ(0x7F, str8.CharAt(2));
   }
 
   // Create a 1-byte string from an array of 4-byte elements.
   {
-    const uint32_t char32[] = { 0x00, 0x7F, 0xFF };
+    const uint32_t char32[] = { 0x00, 0x1F, 0x7F };
     const String& str8 = String::Handle(String::New(char32, 3));
     EXPECT(str8.IsOneByteString());
     EXPECT(!str8.IsTwoByteString());
-    EXPECT(!str8.IsFourByteString());
     EXPECT_EQ(0x00, str8.CharAt(0));
-    EXPECT_EQ(0x7F, str8.CharAt(1));
-    EXPECT_EQ(0xFF, str8.CharAt(2));
+    EXPECT_EQ(0x1F, str8.CharAt(1));
+    EXPECT_EQ(0x7F, str8.CharAt(2));
   }
 
   // Create a 2-byte string from an array of 4-byte elements.
@@ -606,7 +602,6 @@
     const String& str16 = String::Handle(String::New(char32, 3));
     EXPECT(!str16.IsOneByteString());
     EXPECT(str16.IsTwoByteString());
-    EXPECT(!str16.IsFourByteString());
     EXPECT_EQ(0x0000, str16.CharAt(0));
     EXPECT_EQ(0x7FFF, str16.CharAt(1));
     EXPECT_EQ(0xFFFF, str16.CharAt(2));
@@ -622,7 +617,6 @@
   EXPECT(str.IsString());
   EXPECT(str.IsOneByteString());
   EXPECT(!str.IsTwoByteString());
-  EXPECT(!str.IsFourByteString());
   EXPECT(!str.IsNumber());
   EXPECT(str.Equals(hello_str));
 }
@@ -943,7 +937,7 @@
     EXPECT(str6.Equals(two_one_two, two_one_two_len));
   }
 
-  // Concatenated emtpy and non-empty 4-byte strings.
+  // Concatenated emtpy and non-empty strings built from 4-byte elements.
   {
     const String& str1 = String::Handle(String::New(""));
     EXPECT(str1.IsOneByteString());
@@ -951,19 +945,20 @@
 
     uint32_t four[] = { 0x1D4D5, 0x1D4DE, 0x1D4E4, 0x1D4E1 };
     intptr_t four_len = sizeof(four) / sizeof(four[0]);
+    intptr_t expected_len = (four_len * 2);
     const String& str2 = String::Handle(String::New(four, four_len));
-    EXPECT(str2.IsFourByteString());
-    EXPECT_EQ(4, str2.Length());
+    EXPECT(str2.IsTwoByteString());
+    EXPECT_EQ(expected_len, str2.Length());
 
     // Concat
 
     const String& str3 = String::Handle(String::Concat(str1, str2));
-    EXPECT_EQ(four_len, str3.Length());
+    EXPECT_EQ(expected_len, str3.Length());
     EXPECT(str3.Equals(str2));
 
     const String& str4 = String::Handle(String::Concat(str2, str1));
-    EXPECT(str4.IsFourByteString());
-    EXPECT_EQ(four_len, str4.Length());
+    EXPECT(str4.IsTwoByteString());
+    EXPECT_EQ(expected_len, str4.Length());
     EXPECT(str4.Equals(str2));
 
     // ConcatAll
@@ -973,8 +968,8 @@
     array1.SetAt(0, str1);
     array1.SetAt(1, str2);
     const String& str5 = String::Handle(String::ConcatAll(array1));
-    EXPECT(str5.IsFourByteString());
-    EXPECT_EQ(four_len, str5.Length());
+    EXPECT(str5.IsTwoByteString());
+    EXPECT_EQ(expected_len, str5.Length());
     EXPECT(str5.Equals(str2));
 
     const Array& array2 = Array::Handle(Array::New(2));
@@ -982,8 +977,8 @@
     array2.SetAt(0, str1);
     array2.SetAt(1, str2);
     const String& str6 = String::Handle(String::ConcatAll(array2));
-    EXPECT(str6.IsFourByteString());
-    EXPECT_EQ(four_len, str6.Length());
+    EXPECT(str6.IsTwoByteString());
+    EXPECT_EQ(expected_len, str6.Length());
     EXPECT(str6.Equals(str2));
 
     const Array& array3 = Array::Handle(Array::New(3));
@@ -992,45 +987,51 @@
     array3.SetAt(1, str1);
     array3.SetAt(2, str2);
     const String& str7 = String::Handle(String::ConcatAll(array3));
-    EXPECT(str7.IsFourByteString());
+    EXPECT(str7.IsTwoByteString());
     uint32_t fourfour[] = { 0x1D4D5, 0x1D4DE, 0x1D4E4, 0x1D4E1,
                             0x1D4D5, 0x1D4DE, 0x1D4E4, 0x1D4E1 };
     intptr_t fourfour_len = sizeof(fourfour) / sizeof(fourfour[0]);
-    EXPECT_EQ(fourfour_len, str7.Length());
-    EXPECT(str7.Equals(fourfour, fourfour_len));
+    EXPECT_EQ((fourfour_len * 2), str7.Length());
+    const String& fourfour_str =
+        String::Handle(String::New(fourfour, fourfour_len));
+    EXPECT(str7.Equals(fourfour_str));
   }
 
-  // Concatenate non-empty 4-byte strings.
+  // Concatenate non-empty strings built from 4-byte elements.
   {
     const uint32_t one[] = { 0x105D0, 0x105D9, 0x105D9, 0x105DF };
     intptr_t one_len = sizeof(one) / sizeof(one[0]);
     const String& onestr = String::Handle(String::New(one, one_len));
-    EXPECT(onestr.IsFourByteString());
-    EXPECT_EQ(one_len, onestr.Length());
+    EXPECT(onestr.IsTwoByteString());
+    EXPECT_EQ((one_len *2), onestr.Length());
 
     const uint32_t two[] = { 0x105E6, 0x105D5, 0x105D5, 0x105D9, 0x105D9 };
     intptr_t two_len = sizeof(two) / sizeof(two[0]);
     const String& twostr = String::Handle(String::New(two, two_len));
-    EXPECT(twostr.IsFourByteString());
-    EXPECT_EQ(two_len, twostr.Length());
+    EXPECT(twostr.IsTwoByteString());
+    EXPECT_EQ((two_len * 2), twostr.Length());
 
     // Concat
 
     const String& str1 = String::Handle(String::Concat(onestr, twostr));
-    EXPECT(str1.IsFourByteString());
+    EXPECT(str1.IsTwoByteString());
     const uint32_t one_two[] = { 0x105D0, 0x105D9, 0x105D9, 0x105DF,
                                  0x105E6, 0x105D5, 0x105D5, 0x105D9, 0x105D9 };
     intptr_t one_two_len = sizeof(one_two) / sizeof(one_two[0]);
-    EXPECT_EQ(one_two_len, str1.Length());
-    EXPECT(str1.Equals(one_two, one_two_len));
+    EXPECT_EQ((one_two_len * 2), str1.Length());
+    const String& one_two_str =
+        String::Handle(String::New(one_two, one_two_len));
+    EXPECT(str1.Equals(one_two_str));
 
     const String& str2 = String::Handle(String::Concat(twostr, onestr));
-    EXPECT(str2.IsFourByteString());
+    EXPECT(str2.IsTwoByteString());
     const uint32_t two_one[] = { 0x105E6, 0x105D5, 0x105D5, 0x105D9, 0x105D9,
                                  0x105D0, 0x105D9, 0x105D9, 0x105DF };
     intptr_t two_one_len = sizeof(two_one) / sizeof(two_one[0]);
-    EXPECT_EQ(two_one_len, str2.Length());
-    EXPECT(str2.Equals(two_one, two_one_len));
+    EXPECT_EQ((two_one_len * 2), str2.Length());
+    const String& two_one_str =
+        String::Handle(String::New(two_one, two_one_len));
+    EXPECT(str2.Equals(two_one_str));
 
     // ConcatAll
 
@@ -1039,18 +1040,18 @@
     array1.SetAt(0, onestr);
     array1.SetAt(1, twostr);
     const String& str3 = String::Handle(String::ConcatAll(array1));
-    EXPECT(str3.IsFourByteString());
-    EXPECT_EQ(one_two_len, str3.Length());
-    EXPECT(str3.Equals(one_two, one_two_len));
+    EXPECT(str3.IsTwoByteString());
+    EXPECT_EQ((one_two_len * 2), str3.Length());
+    EXPECT(str3.Equals(one_two_str));
 
     const Array& array2 = Array::Handle(Array::New(2));
     EXPECT_EQ(2, array2.Length());
     array2.SetAt(0, twostr);
     array2.SetAt(1, onestr);
     const String& str4 = String::Handle(String::ConcatAll(array2));
-    EXPECT(str4.IsFourByteString());
-    EXPECT_EQ(two_one_len, str4.Length());
-    EXPECT(str4.Equals(two_one, two_one_len));
+    EXPECT(str4.IsTwoByteString());
+    EXPECT_EQ((two_one_len * 2), str4.Length());
+    EXPECT(str4.Equals(two_one_str));
 
     const Array& array3 = Array::Handle(Array::New(3));
     EXPECT_EQ(3, array3.Length());
@@ -1058,14 +1059,16 @@
     array3.SetAt(1, twostr);
     array3.SetAt(2, onestr);
     const String& str5 = String::Handle(String::ConcatAll(array3));
-    EXPECT(str5.IsFourByteString());
+    EXPECT(str5.IsTwoByteString());
     const uint32_t one_two_one[] = { 0x105D0, 0x105D9, 0x105D9, 0x105DF,
                                      0x105E6, 0x105D5, 0x105D5, 0x105D9,
                                      0x105D9,
                                      0x105D0, 0x105D9, 0x105D9, 0x105DF };
     intptr_t one_two_one_len = sizeof(one_two_one) / sizeof(one_two_one[0]);
-    EXPECT_EQ(one_two_one_len, str5.Length());
-    EXPECT(str5.Equals(one_two_one, one_two_one_len));
+    EXPECT_EQ((one_two_one_len * 2), str5.Length());
+    const String& one_two_one_str =
+        String::Handle(String::New(one_two_one, one_two_one_len));
+    EXPECT(str5.Equals(one_two_one_str));
 
     const Array& array4 = Array::Handle(Array::New(3));
     EXPECT_EQ(3, array4.Length());
@@ -1073,15 +1076,17 @@
     array4.SetAt(1, onestr);
     array4.SetAt(2, twostr);
     const String& str6 = String::Handle(String::ConcatAll(array4));
-    EXPECT(str6.IsFourByteString());
+    EXPECT(str6.IsTwoByteString());
     const uint32_t two_one_two[] = { 0x105E6, 0x105D5, 0x105D5, 0x105D9,
                                      0x105D9,
                                      0x105D0, 0x105D9, 0x105D9, 0x105DF,
                                      0x105E6, 0x105D5, 0x105D5, 0x105D9,
                                      0x105D9 };
     intptr_t two_one_two_len = sizeof(two_one_two) / sizeof(two_one_two[0]);
-    EXPECT_EQ(two_one_two_len, str6.Length());
-    EXPECT(str6.Equals(two_one_two, two_one_two_len));
+    EXPECT_EQ((two_one_two_len * 2), str6.Length());
+    const String& two_one_two_str =
+        String::Handle(String::New(two_one_two, two_one_two_len));
+    EXPECT(str6.Equals(two_one_two_str));
   }
 
   // Concatenate 1-byte strings and 2-byte strings.
@@ -1148,192 +1153,6 @@
     intptr_t two_one_two_len = sizeof(two_one_two) / sizeof(two_one_two[0]);
     EXPECT(two_one_two_str.Equals(two_one_two, two_one_two_len));
   }
-
-  // Concatenate 1-byte strings and 4-byte strings.
-  {
-    const uint8_t one[] = { 'o', 'n', 'e', ' ', 'b', 'y', 't', 'e' };
-    intptr_t one_len = sizeof(one) / sizeof(one[0]);
-    const String& onestr = String::Handle(String::New(one, one_len));
-    EXPECT(onestr.IsOneByteString());
-    EXPECT_EQ(one_len, onestr.Length());
-    EXPECT(onestr.Equals(one, one_len));
-
-    uint32_t four[] = { 0x1D4D5, 0x1D4DE, 0x1D4E4, 0x1D4E1 };
-    intptr_t four_len = sizeof(four) / sizeof(four[0]);
-    const String& fourstr = String::Handle(String::New(four, four_len));
-    EXPECT(fourstr.IsFourByteString());
-    EXPECT_EQ(four_len, fourstr.Length());
-    EXPECT(fourstr.Equals(four, four_len));
-
-    // Concat
-
-    const String& one_four_str = String::Handle(String::Concat(onestr,
-                                                               fourstr));
-    EXPECT(one_four_str.IsFourByteString());
-    uint32_t one_four[] = { 'o', 'n', 'e', ' ', 'b', 'y', 't', 'e',
-                            0x1D4D5, 0x1D4DE, 0x1D4E4, 0x1D4E1 };
-    intptr_t one_four_len = sizeof(one_four) / sizeof(one_four[0]);
-    EXPECT_EQ(one_four_len, one_four_str.Length());
-    EXPECT(one_four_str.Equals(one_four, one_four_len));
-
-    const String& four_one_str = String::Handle(String::Concat(fourstr,
-                                                               onestr));
-    EXPECT(four_one_str.IsFourByteString());
-    uint32_t four_one[] = { 0x1D4D5, 0x1D4DE, 0x1D4E4, 0x1D4E1,
-                            'o', 'n', 'e', ' ', 'b', 'y', 't', 'e' };
-    intptr_t four_one_len = sizeof(four_one) / sizeof(four_one[0]);
-    EXPECT_EQ(four_one_len, four_one_str.Length());
-    EXPECT(four_one_str.Equals(four_one, four_one_len));
-
-    // ConcatAll
-
-    const Array& array1 = Array::Handle(Array::New(3));
-    EXPECT_EQ(3, array1.Length());
-    array1.SetAt(0, onestr);
-    array1.SetAt(1, fourstr);
-    array1.SetAt(2, onestr);
-    const String& one_four_one = String::Handle(String::ConcatAll(array1));
-    EXPECT(one_four_one.IsFourByteString());
-    EXPECT_EQ(onestr.Length()*2 + fourstr.Length(), one_four_one.Length());
-
-    const Array& array2 = Array::Handle(Array::New(3));
-    EXPECT_EQ(3, array2.Length());
-    array2.SetAt(0, fourstr);
-    array2.SetAt(1, onestr);
-    array2.SetAt(2, fourstr);
-    const String& four_one_four = String::Handle(String::ConcatAll(array2));
-    EXPECT(four_one_four.IsFourByteString());
-    EXPECT_EQ(fourstr.Length()*2 + onestr.Length(), four_one_four.Length());
-  }
-
-  // Concatenate 2-byte strings and 4-byte strings.
-  {
-    uint16_t two[] = { 0x05E6, 0x05D5, 0x05D5, 0x05D9, 0x05D9 };
-    intptr_t two_len = sizeof(two) / sizeof(two[0]);
-    const String& twostr = String::Handle(String::New(two, two_len));
-    EXPECT(twostr.IsTwoByteString());
-    EXPECT_EQ(two_len, twostr.Length());
-    EXPECT(twostr.Equals(two, two_len));
-
-    uint32_t four[] = { 0x1D4D5, 0x1D4DE, 0x1D4E4, 0x1D4E1 };
-    intptr_t four_len = sizeof(four) / sizeof(four[0]);
-    const String& fourstr = String::Handle(String::New(four, four_len));
-    EXPECT(fourstr.IsFourByteString());
-    EXPECT_EQ(four_len, fourstr.Length());
-    EXPECT(fourstr.Equals(four, four_len));
-
-    // Concat
-
-    const String& two_four_str = String::Handle(String::Concat(twostr,
-                                                               fourstr));
-    EXPECT(two_four_str.IsFourByteString());
-    uint32_t two_four[] = { 0x05E6, 0x05D5, 0x05D5, 0x05D9, 0x05D9,
-                            0x1D4D5, 0x1D4DE, 0x1D4E4, 0x1D4E1 };
-    intptr_t two_four_len = sizeof(two_four) / sizeof(two_four[0]);
-    EXPECT_EQ(two_four_len, two_four_str.Length());
-    EXPECT(two_four_str.Equals(two_four, two_four_len));
-
-    const String& four_two_str = String::Handle(String::Concat(fourstr,
-                                                               twostr));
-    EXPECT(four_two_str.IsFourByteString());
-    uint32_t four_two[] = { 0x1D4D5, 0x1D4DE, 0x1D4E4, 0x1D4E1,
-                            0x05E6, 0x05D5, 0x05D5, 0x05D9, 0x05D9 };
-    intptr_t four_two_len = sizeof(four_two) / sizeof(four_two[0]);
-    EXPECT_EQ(four_two_len, four_two_str.Length());
-    EXPECT(four_two_str.Equals(four_two, four_two_len));
-
-    // ConcatAll
-
-    const Array& array1 = Array::Handle(Array::New(3));
-    EXPECT_EQ(3, array1.Length());
-    array1.SetAt(0, twostr);
-    array1.SetAt(1, fourstr);
-    array1.SetAt(2, twostr);
-    const String& two_four_two_str = String::Handle(String::ConcatAll(array1));
-    EXPECT(two_four_two_str.IsFourByteString());
-    EXPECT_EQ(twostr.Length()*2 + fourstr.Length(), two_four_two_str.Length());
-
-    const Array& array2 = Array::Handle(Array::New(3));
-    EXPECT_EQ(3, array2.Length());
-    array2.SetAt(0, fourstr);
-    array2.SetAt(1, twostr);
-    array2.SetAt(2, fourstr);
-    const String& four_two_four_str = String::Handle(String::ConcatAll(array2));
-    EXPECT(four_two_four_str.IsFourByteString());
-    EXPECT_EQ(fourstr.Length()*2 + twostr.Length(), four_two_four_str.Length());
-  }
-
-  // Concatenate 1-byte, 2-byte and 4-byte strings.
-  {
-    const uint8_t one[] = { 'o', 'n', 'e', ' ', 'b', 'y', 't', 'e' };
-    intptr_t one_len = sizeof(one) / sizeof(one[0]);
-    const String& onestr = String::Handle(String::New(one, one_len));
-    EXPECT(onestr.IsOneByteString());
-    EXPECT_EQ(one_len, onestr.Length());
-    EXPECT(onestr.Equals(one, one_len));
-
-    uint16_t two[] = { 0x05E6, 0x05D5, 0x05D5, 0x05D9, 0x05D9 };
-    intptr_t two_len = sizeof(two) / sizeof(two[0]);
-    const String& twostr = String::Handle(String::New(two, two_len));
-    EXPECT(twostr.IsTwoByteString());
-    EXPECT_EQ(two_len, twostr.Length());
-    EXPECT(twostr.Equals(two, two_len));
-
-    uint32_t four[] = { 0x1D4D5, 0x1D4DE, 0x1D4E4, 0x1D4E1 };
-    intptr_t four_len = sizeof(four) / sizeof(four[0]);
-    const String& fourstr = String::Handle(String::New(four, four_len));
-    EXPECT(fourstr.IsFourByteString());
-    EXPECT_EQ(four_len, fourstr.Length());
-    EXPECT(fourstr.Equals(four, four_len));
-
-    // Last element is a 4-byte string.
-    const Array& array1 = Array::Handle(Array::New(3));
-    EXPECT_EQ(3, array1.Length());
-    array1.SetAt(0, onestr);
-    array1.SetAt(1, twostr);
-    array1.SetAt(2, fourstr);
-    const String& one_two_four_str = String::Handle(String::ConcatAll(array1));
-    EXPECT(one_two_four_str.IsFourByteString());
-    EXPECT_EQ(onestr.Length() + twostr.Length() + fourstr.Length(),
-              one_two_four_str.Length());
-    uint32_t one_two_four[] = { 'o', 'n', 'e', ' ', 'b', 'y', 't', 'e',
-                                0x05E6, 0x05D5, 0x05D5, 0x05D9, 0x05D9,
-                                0x1D4D5, 0x1D4DE, 0x1D4E4, 0x1D4E1 };
-    intptr_t one_two_four_len = sizeof(one_two_four) / sizeof(one_two_four[0]);
-    EXPECT(one_two_four_str.Equals(one_two_four, one_two_four_len));
-
-    // Middle element is a 4-byte string.
-    const Array& array2 = Array::Handle(Array::New(3));
-    EXPECT_EQ(3, array2.Length());
-    array2.SetAt(0, onestr);
-    array2.SetAt(1, fourstr);
-    array2.SetAt(2, twostr);
-    const String& one_four_two_str = String::Handle(String::ConcatAll(array2));
-    EXPECT(one_four_two_str.IsFourByteString());
-    EXPECT_EQ(onestr.Length() + fourstr.Length() + twostr.Length(),
-              one_four_two_str.Length());
-    uint32_t one_four_two[] = { 'o', 'n', 'e', ' ', 'b', 'y', 't', 'e',
-                                0x1D4D5, 0x1D4DE, 0x1D4E4, 0x1D4E1,
-                                0x05E6, 0x05D5, 0x05D5, 0x05D9, 0x05D9 };
-    intptr_t one_four_two_len = sizeof(one_four_two) / sizeof(one_four_two[0]);
-    EXPECT(one_four_two_str.Equals(one_four_two, one_four_two_len));
-
-    // First element is a 4-byte string.
-    const Array& array3 = Array::Handle(Array::New(3));
-    EXPECT_EQ(3, array3.Length());
-    array3.SetAt(0, fourstr);
-    array3.SetAt(1, onestr);
-    array3.SetAt(2, twostr);
-    const String& four_one_two_str = String::Handle(String::ConcatAll(array3));
-    EXPECT(one_four_two_str.IsFourByteString());
-    EXPECT_EQ(onestr.Length() + fourstr.Length() + twostr.Length(),
-              one_four_two_str.Length());
-    uint32_t four_one_two[] = { 0x1D4D5, 0x1D4DE, 0x1D4E4, 0x1D4E1,
-                                'o', 'n', 'e', ' ', 'b', 'y', 't', 'e',
-                                0x05E6, 0x05D5, 0x05D5, 0x05D9, 0x05D9 };
-    intptr_t four_one_two_len = sizeof(four_one_two) / sizeof(four_one_two[0]);
-    EXPECT(four_one_two_str.Equals(four_one_two, four_one_two_len));
-  }
 }
 
 
@@ -1344,16 +1163,18 @@
 
   const String& onestr = String::Handle(String::New(onechars));
   EXPECT(!onestr.IsNull());
-  EXPECT(onestr.IsOneByteString());
+  EXPECT(!onestr.IsOneByteString());
+  EXPECT(onestr.IsTwoByteString());
 
   const String& onesub = String::Handle(String::SubString(onestr, 0));
   EXPECT(!onesub.IsNull());
-  EXPECT(onestr.IsOneByteString());
+  EXPECT(!onestr.IsOneByteString());
+  EXPECT(onestr.IsTwoByteString());
   EXPECT_EQ(onesub.Length(), 3);
 
   // Create 1- and 2-byte substrings from a 2-byte source string.
   const char* twochars =
-      "\xC3\xB6\xC3\xB1\xC3\xA9"
+      "\x1f\x2f\x3f"
       "\xE1\xB9\xAB\xE1\xBA\x85\xE1\xB9\x93";
 
   const String& twostr = String::Handle(String::New(twochars));
@@ -1370,15 +1191,15 @@
   EXPECT(twosub2.IsTwoByteString());
   EXPECT_EQ(twosub2.Length(), 3);
 
-  // Create 1-, 2-, and 4-byte substrings from a 4-byte source string.
+  // Create substrings from a string built using 1-, 2- and 4-byte elements.
   const char* fourchars =
-      "\xC3\xB6\xC3\xB1\xC3\xA9"
+      "\x1f\x2f\x3f"
       "\xE1\xB9\xAB\xE1\xBA\x85\xE1\xB9\x93"
       "\xF0\x9D\x96\xBF\xF0\x9D\x97\x88\xF0\x9D\x97\x8E\xF0\x9D\x97\x8B";
 
   const String& fourstr = String::Handle(String::New(fourchars));
   EXPECT(!fourstr.IsNull());
-  EXPECT(fourstr.IsFourByteString());
+  EXPECT(fourstr.IsTwoByteString());
 
   const String& foursub1 = String::Handle(String::SubString(fourstr, 0, 3));
   EXPECT(!foursub1.IsNull());
@@ -1391,9 +1212,9 @@
   EXPECT_EQ(foursub2.Length(), 3);
 
   const String& foursub4 = String::Handle(String::SubString(fourstr, 6));
-  EXPECT_EQ(foursub4.Length(), 4);
+  EXPECT_EQ(foursub4.Length(), 8);
   EXPECT(!foursub4.IsNull());
-  EXPECT(foursub4.IsFourByteString());
+  EXPECT(foursub4.IsTwoByteString());
 }
 
 
@@ -1440,7 +1261,7 @@
       0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF,
     };
     const String& str = String::Handle(String::New(src));
-    EXPECT(str.IsOneByteString());
+    EXPECT(str.IsTwoByteString());
     intptr_t expected_length = sizeof(expected);
     EXPECT_EQ(expected_length, str.Length());
     for (int i = 0; i < str.Length(); ++i) {
@@ -1466,7 +1287,7 @@
     }
   }
 
-  // Create a 2-byte string from UTF-8 encoded 1- and 2-byte
+  // Create a BMP 2-byte string from UTF-8 encoded 1- and 2-byte
   // characters.
   {
     const char* src =
@@ -1491,22 +1312,23 @@
     }
   }
 
-  // Create a 4-byte string from a UTF-8 string literal.
+  // Create a SMP 2-byte string from a UTF-8 string literal.
   {
     const char* src =
         "\xF0\x9D\x91\xA0\xF0\x9D\x91\xA1"
         "\xF0\x9D\x91\xA2\xF0\x9D\x91\xA3";
-    const intptr_t expected[] = { 0x1D460, 0x1D461, 0x1D462, 0x1D463 };
+    const intptr_t expected[] = { 0xd835, 0xdc60, 0xd835, 0xdc61,
+                                  0xd835, 0xdc62, 0xd835, 0xdc63 };
     const String& str = String::Handle(String::New(src));
-    EXPECT(str.IsFourByteString());
-    intptr_t expected_size = sizeof(expected) / sizeof(expected[0]);
+    EXPECT(str.IsTwoByteString());
+    intptr_t expected_size = (sizeof(expected) / sizeof(expected[0]));
     EXPECT_EQ(expected_size, str.Length());
     for (int i = 0; i < str.Length(); ++i) {
       EXPECT_EQ(expected[i], str.CharAt(i));
     }
   }
 
-  // Create a 4-byte string from UTF-8 encoded 2- and 4-byte
+  // Create a 2-byte string from UTF-8 encoded 2- and 4-byte
   // characters.
   {
     const char* src =
@@ -1519,10 +1341,11 @@
         "\xF0\x9E\x80\x80\xF0\x9F\x80\x80";
     const intptr_t expected[] = {
       0x0A00, 0x0B00, 0x0C00, 0x0D00, 0x0E00, 0x0F00, 0xA000, 0xB000, 0xC000,
-      0xD000, 0xE000, 0xF000, 0x1A000, 0x1B000, 0x1D000, 0x1E000, 0x1F000
+      0xD000, 0xE000, 0xF000, 0xD828, 0xDC00, 0xD82c, 0xDC00, 0xD834, 0xDC00,
+      0xD838, 0xDC00, 0xD83c, 0xDC00,
     };
     const String& str = String::Handle(String::New(src));
-    EXPECT(str.IsFourByteString());
+    EXPECT(str.IsTwoByteString());
     intptr_t expected_size = sizeof(expected) / sizeof(expected[0]);
     EXPECT_EQ(expected_size, str.Length());
     for (int i = 0; i < str.Length(); ++i) {
@@ -1530,7 +1353,7 @@
     }
   }
 
-  // Create a 4-byte string from UTF-8 encoded 1-, 2- and 4-byte
+  // Create a 2-byte string from UTF-8 encoded 1-, 2- and 4-byte
   // characters.
   {
     const char* src =
@@ -1548,10 +1371,11 @@
       0x000A, 0x000B, 0x000D, 0x000C, 0x000E, 0x000F, 0x00A0, 0x00B0,
       0x00C0, 0x00D0, 0x00E0, 0x00F0, 0x0A00, 0x0B00, 0x0C00, 0x0D00,
       0x0E00, 0x0F00, 0xA000, 0xB000, 0xC000, 0xD000, 0xE000, 0xF000,
-      0x1A000, 0x1B000, 0x1D000, 0x1E000, 0x1F000
+      0xD828, 0xDC00, 0xD82c, 0xDC00, 0xD834, 0xDC00, 0xD838, 0xDC00,
+      0xD83c, 0xDC00,
     };
     const String& str = String::Handle(String::New(src));
-    EXPECT(str.IsFourByteString());
+    EXPECT(str.IsTwoByteString());
     intptr_t expected_size = sizeof(expected) / sizeof(expected[0]);
     EXPECT_EQ(expected_size, str.Length());
     for (int i = 0; i < str.Length(); ++i) {
@@ -1626,42 +1450,6 @@
 }
 
 
-TEST_CASE(ExternalFourByteString) {
-  uint32_t characters[] = { 0x1D5BF, 0x1D5C8, 0x1D5CE, 0x1D5CB };
-  intptr_t len = ARRAY_SIZE(characters);
-
-  const String& str =
-      String::Handle(
-          ExternalFourByteString::New(characters, len, NULL, NULL, Heap::kNew));
-  EXPECT(!str.IsFourByteString());
-  EXPECT(str.IsExternalFourByteString());
-  EXPECT_EQ(str.Length(), len);
-  EXPECT(str.Equals("\xF0\x9D\x96\xBF\xF0\x9D\x97\x88"
-                    "\xF0\x9D\x97\x8E\xF0\x9D\x97\x8B"));
-
-  const String& copy = String::Handle(String::SubString(str, 0, len));
-  EXPECT(!copy.IsExternalFourByteString());
-  EXPECT(copy.IsFourByteString());
-  EXPECT_EQ(len, copy.Length());
-  EXPECT(copy.Equals(str));
-
-  const String& concat = String::Handle(String::Concat(str, str));
-  EXPECT(!concat.IsExternalFourByteString());
-  EXPECT(concat.IsFourByteString());
-  EXPECT_EQ(len * 2, concat.Length());
-  EXPECT(concat.Equals("\xF0\x9D\x96\xBF\xF0\x9D\x97\x88"
-                       "\xF0\x9D\x97\x8E\xF0\x9D\x97\x8B"
-                       "\xF0\x9D\x96\xBF\xF0\x9D\x97\x88"
-                       "\xF0\x9D\x97\x8E\xF0\x9D\x97\x8B"));
-
-  const String& substr = String::Handle(String::SubString(str, 1, 2));
-  EXPECT(!substr.IsExternalFourByteString());
-  EXPECT(substr.IsFourByteString());
-  EXPECT_EQ(2, substr.Length());
-  EXPECT(substr.Equals("\xF0\x9D\x97\x88\xF0\x9D\x97\x8E"));
-}
-
-
 TEST_CASE(Symbol) {
   const String& one = String::Handle(Symbols::New("Eins"));
   EXPECT(one.IsSymbol());
@@ -2846,7 +2634,7 @@
       "}\n";
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
   EXPECT_VALID(lib);
-  Dart_Handle result = Dart_Invoke(lib, Dart_NewString("main"), 0, NULL);
+  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
   EXPECT_ERROR(
       result,
       "Unhandled exception:\n"
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index ef5e8ae..49a088d 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -976,16 +976,13 @@
         token_stack.Add(token);
         break;
       case Token::kRBRACE:
-        is_match = token_stack.Last() == Token::kLBRACE;
-        token_stack.RemoveLast();
+        is_match = token_stack.RemoveLast() == Token::kLBRACE;
         break;
       case Token::kRPAREN:
-        is_match = token_stack.Last() == Token::kLPAREN;
-        token_stack.RemoveLast();
+        is_match = token_stack.RemoveLast() == Token::kLPAREN;
         break;
       case Token::kRBRACK:
-        is_match = token_stack.Last() == Token::kLBRACK;
-        token_stack.RemoveLast();
+        is_match = token_stack.RemoveLast() == Token::kLBRACK;
         break;
       case Token::kEOS:
         unexpected_token_found = true;
@@ -1302,37 +1299,61 @@
 }
 
 
-// Lookup class in the coreimpl lib which also contains various VM
+// Lookup class in the core lib which also contains various VM
 // helper methods and classes. Allow look up of private classes.
-static RawClass* LookupCoreImplClass(const String& class_name) {
-  const Library& coreimpl_lib = Library::Handle(Library::CoreImplLibrary());
+static RawClass* LookupCoreClass(const String& class_name) {
+  const Library& core_lib = Library::Handle(Library::CoreLibrary());
   String& name = String::Handle(class_name.raw());
   if (class_name.CharAt(0) == Scanner::kPrivateIdentifierStart) {
     // Private identifiers are mangled on a per script basis.
-    name = String::Concat(name, String::Handle(coreimpl_lib.private_key()));
+    name = String::Concat(name, String::Handle(core_lib.private_key()));
     name = Symbols::New(name);
   }
-  return coreimpl_lib.LookupClass(name);
+  return core_lib.LookupClass(name);
 }
 
 
-ArgumentListNode* Parser::BuildNoSuchMethodArguments(
+StaticCallNode* Parser::BuildInvocationMirrorAllocation(
+    intptr_t call_pos,
     const String& function_name,
     const ArgumentListNode& function_args) {
-  ASSERT(function_args.length() >= 1);  // The receiver is the first argument.
   const intptr_t args_pos = function_args.token_pos();
+  // Build arguments to the call to the static
+  // InvocationMirror._allocateInvocationMirror method.
   ArgumentListNode* arguments = new ArgumentListNode(args_pos);
-  arguments->Add(function_args.NodeAt(0));
-  // The second argument is the original function name.
-  // TODO(regis): This will change once mirrors are supported.
+  // The first argument is the original function name.
   arguments->Add(new LiteralNode(args_pos, function_name));
-  // The third argument is an array containing the original function arguments.
+  // The second argument is an array containing the original function arguments.
   ArrayNode* args_array = new ArrayNode(
       args_pos, Type::ZoneHandle(Type::ListInterface()));
   for (intptr_t i = 1; i < function_args.length(); i++) {
     args_array->AddElement(function_args.NodeAt(i));
   }
   arguments->Add(args_array);
+  // Lookup the static InvocationMirror._allocateInvocationMirror method.
+  const Class& mirror_class = Class::Handle(
+      LookupCoreClass(String::Handle(Symbols::InvocationMirror())));
+  ASSERT(!mirror_class.IsNull());
+  const String& allocation_function_name =
+      String::Handle(Symbols::AllocateInvocationMirror());
+  const Function& allocation_function = Function::ZoneHandle(
+      mirror_class.LookupStaticFunction(allocation_function_name));
+  ASSERT(!allocation_function.IsNull());
+  return new StaticCallNode(call_pos, allocation_function, arguments);
+}
+
+
+ArgumentListNode* Parser::BuildNoSuchMethodArguments(
+    intptr_t call_pos,
+    const String& function_name,
+    const ArgumentListNode& function_args) {
+  ASSERT(function_args.length() >= 1);  // The receiver is the first argument.
+  const intptr_t args_pos = function_args.token_pos();
+  ArgumentListNode* arguments = new ArgumentListNode(args_pos);
+  arguments->Add(function_args.NodeAt(0));
+  // The second argument is the invocation mirror.
+  arguments->Add(BuildInvocationMirrorAllocation(
+      call_pos, function_name, function_args));
   return arguments;
 }
 
@@ -1368,7 +1389,8 @@
   arguments->Add(receiver);
   ParseActualParameters(arguments, kAllowConst);
   if (is_no_such_method) {
-    arguments = BuildNoSuchMethodArguments(function_name, *arguments);
+    arguments = BuildNoSuchMethodArguments(
+        supercall_pos, function_name, *arguments);
   }
   return new StaticCallNode(supercall_pos, super_function, arguments);
 }
@@ -1386,6 +1408,38 @@
 }
 
 
+AstNode* Parser::BuildUnarySuperOperator(Token::Kind op, PrimaryNode* super) {
+  ASSERT(super->IsSuper());
+  AstNode* super_op = NULL;
+  const intptr_t super_pos = super->token_pos();
+  if ((op == Token::kNEGATE) ||
+      (op == Token::kBIT_NOT)) {
+    // Resolve the operator function in the superclass.
+    const String& operator_function_name =
+        String::ZoneHandle(Symbols::New(Token::Str(op)));
+    const bool kResolveGetter = false;
+    bool is_no_such_method = false;
+    const Function& super_operator = Function::ZoneHandle(
+        GetSuperFunction(super_pos,
+                         operator_function_name,
+                         kResolveGetter,
+                         &is_no_such_method));
+    ArgumentListNode* op_arguments = new ArgumentListNode(super_pos);
+    AstNode* receiver = LoadReceiver(super_pos);
+    op_arguments->Add(receiver);
+    CheckFunctionIsCallable(super_pos, super_operator);
+    if (is_no_such_method) {
+      op_arguments = BuildNoSuchMethodArguments(
+          super_pos, operator_function_name, *op_arguments);
+    }
+    super_op = new StaticCallNode(super_pos, super_operator, op_arguments);
+  } else {
+    ErrorMsg(super_pos, "illegal super operator call");
+  }
+  return super_op;
+}
+
+
 AstNode* Parser::ParseSuperOperator() {
   TRACE_PARSER("ParseSuperOperator");
   AstNode* super_op = NULL;
@@ -1395,74 +1449,11 @@
     ConsumeToken();
     AstNode* index_expr = ParseExpr(kAllowConst, kConsumeCascades);
     ExpectToken(Token::kRBRACK);
-
-    if (Token::IsAssignmentOperator(CurrentToken()) &&
-        (CurrentToken() != Token::kASSIGN)) {
-      // Compound assignment. Ensure side effects in index expression
-      // only execute once. If the index is not a local variable or an
-      // literal, evaluate and save in a temporary local.
-      if (!IsSimpleLocalOrLiteralNode(index_expr)) {
-        LocalVariable* temp =
-            CreateTempConstVariable(operator_pos, "lix");
-        AstNode* save = new StoreLocalNode(operator_pos, temp, index_expr);
-        current_block_->statements->Add(save);
-        index_expr = new LoadLocalNode(operator_pos, temp);
-      }
-    }
-
-    // Resolve the [] operator function in the superclass.
-    const String& index_operator_name =
-        String::ZoneHandle(Symbols::IndexToken());
-    const bool kResolveGetter = false;
-    bool is_no_such_method = false;
-    const Function& index_operator = Function::ZoneHandle(
-        GetSuperFunction(operator_pos,
-                         index_operator_name,
-                         kResolveGetter,
-                         &is_no_such_method));
-
-    ArgumentListNode* index_op_arguments = new ArgumentListNode(operator_pos);
     AstNode* receiver = LoadReceiver(operator_pos);
-    index_op_arguments->Add(receiver);
-    index_op_arguments->Add(index_expr);
-
-    if (is_no_such_method) {
-      index_op_arguments = BuildNoSuchMethodArguments(index_operator_name,
-                                                      *index_op_arguments);
-    }
-    super_op = new StaticCallNode(
-        operator_pos, index_operator, index_op_arguments);
-
-    if (Token::IsAssignmentOperator(CurrentToken())) {
-      Token::Kind assignment_op = CurrentToken();
-      ConsumeToken();
-      AstNode* value = ParseExpr(kAllowConst, kConsumeCascades);
-
-      value = ExpandAssignableOp(operator_pos, assignment_op, super_op, value);
-
-      // Resolve the []= operator function in the superclass.
-      const String& assign_index_operator_name =
-          String::ZoneHandle(Symbols::AssignIndexToken());
-      const bool kResolveGetter = false;
-      bool is_no_such_method = false;
-      const Function& assign_index_operator = Function::ZoneHandle(
-          GetSuperFunction(operator_pos,
-                           assign_index_operator_name,
-                           kResolveGetter,
-                           &is_no_such_method));
-
-      ArgumentListNode* operator_args = new ArgumentListNode(operator_pos);
-      operator_args->Add(LoadReceiver(operator_pos));
-      operator_args->Add(index_expr);
-      operator_args->Add(value);
-
-      if (is_no_such_method) {
-        operator_args = BuildNoSuchMethodArguments(assign_index_operator_name,
-                                                   *operator_args);
-      }
-      super_op = new StaticCallNode(
-          operator_pos, assign_index_operator, operator_args);
-    }
+    const Class& super_class = Class::ZoneHandle(current_class().SuperClass());
+    ASSERT(!super_class.IsNull());
+    super_op =
+        new LoadIndexedNode(operator_pos, receiver, index_expr, super_class);
   } else if (Token::CanBeOverloaded(CurrentToken()) ||
              (CurrentToken() == Token::kNE)) {
     Token::Kind op = CurrentToken();
@@ -1495,8 +1486,8 @@
 
     CheckFunctionIsCallable(operator_pos, super_operator);
     if (is_no_such_method) {
-      op_arguments = BuildNoSuchMethodArguments(operator_function_name,
-                                                *op_arguments);
+      op_arguments = BuildNoSuchMethodArguments(
+          operator_pos, operator_function_name, *op_arguments);
     }
     super_op = new StaticCallNode(operator_pos, super_operator, op_arguments);
     if (negate_result) {
@@ -3110,7 +3101,7 @@
   const intptr_t class_pos = TokenPos();
   ExpectToken(Token::kCLASS);
   const intptr_t classname_pos = TokenPos();
-  String& class_name = *ExpectClassIdentifier("class name expected");
+  String& class_name = *ExpectUserDefinedTypeIdentifier("class name expected");
   if (FLAG_trace_parser) {
     OS::Print("TopLevel parsing class '%s'\n", class_name.ToCString());
   }
@@ -3354,7 +3345,7 @@
 
   const intptr_t alias_name_pos = TokenPos();
   const String* alias_name =
-      ExpectClassIdentifier("function alias name expected");
+      ExpectUserDefinedTypeIdentifier("function alias name expected");
 
   // Parse the type parameters of the function type.
   ParseTypeParameters(alias_owner);
@@ -3436,7 +3427,8 @@
   const intptr_t interface_pos = TokenPos();
   ExpectToken(Token::kINTERFACE);
   const intptr_t interfacename_pos = TokenPos();
-  String& interface_name = *ExpectClassIdentifier("interface name expected");
+  String& interface_name =
+      *ExpectUserDefinedTypeIdentifier("interface name expected");
   if (FLAG_trace_parser) {
     OS::Print("TopLevel parsing interface '%s'\n", interface_name.ToCString());
   }
@@ -3623,21 +3615,18 @@
     do {
       ConsumeToken();
       SkipMetadata();
-      if (CurrentToken() != Token::kIDENT) {
-        ErrorMsg("type parameter name expected");
-      }
-      String& type_parameter_name = *CurrentLiteral();
       const intptr_t type_parameter_pos = TokenPos();
+      String& type_parameter_name =
+          *ExpectUserDefinedTypeIdentifier("type parameter expected");
       // Check for duplicate type parameters.
       for (intptr_t i = 0; i < index; i++) {
         existing_type_parameter ^= type_parameters_array.At(i);
         existing_type_parameter_name = existing_type_parameter.name();
         if (existing_type_parameter_name.Equals(type_parameter_name)) {
-          ErrorMsg("duplicate type parameter '%s'",
+          ErrorMsg(type_parameter_pos, "duplicate type parameter '%s'",
                    type_parameter_name.ToCString());
         }
       }
-      ConsumeToken();
       if (CurrentToken() == Token::kEXTENDS) {
         ConsumeToken();
         // A bound may refer to the owner of the type parameter it applies to,
@@ -5837,7 +5826,7 @@
 AstNode* Parser::MakeStaticCall(const String& cls_name,
                                 const String& func_name,
                                 ArgumentListNode* arguments) {
-  const Class& cls = Class::Handle(LookupImplClass(cls_name));
+  const Class& cls = Class::Handle(LookupCoreClass(cls_name));
   ASSERT(!cls.IsNull());
   const Function& func = Function::ZoneHandle(
       Resolver::ResolveStatic(cls,
@@ -6618,7 +6607,7 @@
 }
 
 
-String* Parser::ExpectClassIdentifier(const char* msg) {
+String* Parser::ExpectUserDefinedTypeIdentifier(const char* msg) {
   if (CurrentToken() != Token::kIDENT) {
     ErrorMsg("%s", msg);
   }
@@ -6720,6 +6709,10 @@
   TRACE_PARSER("ParseBinaryExpr");
   ASSERT(min_preced >= 4);
   AstNode* left_operand = ParseUnaryExpr();
+  if (left_operand->IsPrimaryNode() &&
+      (left_operand->AsPrimaryNode()->IsSuper())) {
+    ErrorMsg(left_operand->token_pos(), "illegal use of 'super'");
+  }
   if (IsLiteral("as")) {  // Not a reserved word.
     token_kind_ = Token::kAS;
   }
@@ -6783,12 +6776,13 @@
 
 
 bool Parser::IsAssignableExpr(AstNode* expr) {
-  return expr->IsPrimaryNode()
-      || (expr->IsLoadLocalNode() && !expr->AsLoadLocalNode()->HasPseudo())
+  return (expr->IsLoadLocalNode() && !expr->AsLoadLocalNode()->HasPseudo()
+          && (!expr->AsLoadLocalNode()->local().is_final()))
       || expr->IsLoadStaticFieldNode()
       || expr->IsStaticGetterNode()
       || expr->IsInstanceGetterNode()
-      || expr->IsLoadIndexedNode();
+      || expr->IsLoadIndexedNode()
+      || (expr->IsPrimaryNode() && !expr->AsPrimaryNode()->IsSuper());
 }
 
 
@@ -6936,11 +6930,14 @@
           CreateTempConstVariable(token_pos, "lia");
       StoreLocalNode* save =
           new StoreLocalNode(token_pos, temp, left_node->array());
-      left_node =
-          new LoadIndexedNode(token_pos, save, left_node->index_expr());
+      left_node = new LoadIndexedNode(token_pos,
+                                      save,
+                                      left_node->index_expr(),
+                                      left_node->super_class());
       right_node = new LoadIndexedNode(token_pos,
                                        new LoadLocalNode(token_pos, temp),
-                                       right_node->index_expr());
+                                       right_node->index_expr(),
+                                       right_node->super_class());
     }
     if (!IsSimpleLocalOrLiteralNode(left_node->index_expr())) {
       LocalVariable* temp =
@@ -6949,10 +6946,12 @@
           new StoreLocalNode(token_pos, temp, left_node->index_expr());
       left_node = new LoadIndexedNode(token_pos,
                                       left_node->array(),
-                                      save);
+                                      save,
+                                      left_node->super_class());
       right_node = new LoadIndexedNode(token_pos,
                                        right_node->array(),
-                                       new LoadLocalNode(token_pos, temp));
+                                       new LoadLocalNode(token_pos, temp),
+                                       right_node->super_class());
     }
     *expr = right_node;
     return left_node;
@@ -6989,6 +6988,9 @@
         Field::SetterSymbol(original->AsStaticGetterNode()->field_name()));
     result = ThrowNoSuchMethodError(original->token_pos(), setter_name);
   }
+  // TODO(hausner): if we decide to throw a no such method error on
+  // assignment to a final variable, we need to do the same as in the
+  // StaticGetterNode above.
   if ((result != NULL) &&
       (result->IsStoreIndexedNode() ||
        result->IsInstanceSetterNode() ||
@@ -7140,6 +7142,8 @@
         ErrorMsg(op_pos, "unexpected operator '+'");
       }
       // Expression is the literal itself.
+    } else if (expr->IsPrimaryNode() && (expr->AsPrimaryNode()->IsSuper())) {
+      expr = BuildUnarySuperOperator(unary_op, expr->AsPrimaryNode());
     } else {
       expr = UnaryOpNode::UnaryOpOrLiteral(op_pos, unary_op, expr);
     }
@@ -7160,6 +7164,7 @@
         expr,
         new LiteralNode(op_pos, Smi::ZoneHandle(Smi::New(1))));
     AstNode* store = CreateAssignmentNode(left_expr, add);
+    ASSERT(store != NULL);
     expr = store;
   } else {
     expr = ParsePostfixExpr();
@@ -7407,6 +7412,9 @@
   }
   PrimaryNode* primary = node->AsPrimaryNode();
   if (primary->primary().IsString()) {
+    if (primary->IsSuper()) {
+      return primary;
+    }
     // In a static method, evaluation of an unresolved identifier causes a
     // NoSuchMethodError to be thrown.
     // In an instance method, we convert this into a getter call
@@ -7458,6 +7466,9 @@
         if (left->AsPrimaryNode()->primary().IsFunction()) {
           left = LoadClosure(left->AsPrimaryNode());
         } else {
+          // Super field access handled in ParseSuperFieldAccess(),
+          // super calls handled in ParseSuperCall().
+          ASSERT(!left->AsPrimaryNode()->IsSuper());
           left = LoadFieldIfUnresolved(left);
         }
       }
@@ -7495,6 +7506,9 @@
         }
       }
     } else if (CurrentToken() == Token::kLBRACK) {
+      // Super index operator handled in ParseSuperOperator().
+      ASSERT(!left->IsPrimaryNode() || !left->AsPrimaryNode()->IsSuper());
+
       const intptr_t bracket_pos = TokenPos();
       ConsumeToken();
       left = LoadFieldIfUnresolved(left);
@@ -7513,7 +7527,10 @@
           UNREACHABLE();  // Internal parser error.
         }
       }
-      selector = new LoadIndexedNode(bracket_pos, array, index);
+      selector =  new LoadIndexedNode(bracket_pos,
+                                      array,
+                                      index,
+                                      Class::ZoneHandle());
     } else if (CurrentToken() == Token::kLPAREN) {
       if (left->IsPrimaryNode()) {
         PrimaryNode* primary = left->AsPrimaryNode();
@@ -7537,6 +7554,9 @@
           }
         } else if (primary->primary().IsString()) {
           // Primary is an unresolved name.
+          if (primary->IsSuper()) {
+            ErrorMsg(primary->token_pos(), "illegal use of super");
+          }
           String& name = String::CheckedZoneHandle(primary->primary().raw());
           if (current_function().is_static()) {
             selector = ThrowNoSuchMethodError(primary->token_pos(), name);
@@ -7571,6 +7591,10 @@
           ErrorMsg(left->token_pos(),
                    "illegal use of class name '%s'",
                    cls_name.ToCString());
+        } else if (primary->IsSuper()) {
+          // Return "super" to handle unary super operator calls,
+          // or to report illegal use of "super" otherwise.
+          left = primary;
         } else {
           UNREACHABLE();  // Internal parser error.
         }
@@ -8645,7 +8669,7 @@
     String& list_literal_factory_class_name = String::Handle(
         Symbols::ListLiteralFactoryClass());
     const Class& list_literal_factory_class =
-        Class::Handle(LookupCoreImplClass(list_literal_factory_class_name));
+        Class::Handle(LookupCoreClass(list_literal_factory_class_name));
     ASSERT(!list_literal_factory_class.IsNull());
     const String& list_literal_factory_name =
         String::Handle(Symbols::ListLiteralFactory());
@@ -8870,7 +8894,7 @@
     String& map_literal_factory_class_name = String::Handle(
         Symbols::MapLiteralFactoryClass());
     const Class& map_literal_factory_class =
-        Class::Handle(LookupCoreImplClass(map_literal_factory_class_name));
+        Class::Handle(LookupCoreClass(map_literal_factory_class_name));
     ASSERT(!map_literal_factory_class.IsNull());
     const String& map_literal_factory_name =
         String::Handle(Symbols::MapLiteralFactory());
@@ -9251,7 +9275,7 @@
 
 String& Parser::Interpolate(ArrayNode* values) {
   const String& class_name = String::Handle(Symbols::StringBase());
-  const Class& cls = Class::Handle(LookupImplClass(class_name));
+  const Class& cls = Class::Handle(LookupCoreClass(class_name));
   ASSERT(!cls.IsNull());
   const String& func_name = String::Handle(Symbols::Interpolate());
   const Function& func =
@@ -9509,6 +9533,10 @@
     if (current_function().is_static()) {
       ErrorMsg("cannot access superclass from static method");
     }
+    if (current_class().SuperClass() == Class::null()) {
+      ErrorMsg("class '%s' does not have a superclass",
+               String::Handle(current_class().Name()).ToCString());
+    }
     ConsumeToken();
     if (CurrentToken() == Token::kPERIOD) {
       ConsumeToken();
@@ -9523,7 +9551,8 @@
         (CurrentToken() == Token::kNE)) {
       primary = ParseSuperOperator();
     } else {
-      ErrorMsg("illegal super call");
+      primary = new PrimaryNode(TokenPos(),
+                                String::ZoneHandle(Symbols::Super()));
     }
   } else if (CurrentToken() == Token::kCONDITIONAL) {
     primary = ParseArgumentDefinitionTest();
diff --git a/runtime/vm/parser.h b/runtime/vm/parser.h
index 12c1302..69d27af 100644
--- a/runtime/vm/parser.h
+++ b/runtime/vm/parser.h
@@ -219,7 +219,7 @@
   void ExpectToken(Token::Kind token_expected);
   void ExpectSemicolon();
   void UnexpectedToken();
-  String* ExpectClassIdentifier(const char* msg);
+  String* ExpectUserDefinedTypeIdentifier(const char* msg);
   String* ExpectIdentifier(const char* msg);
   bool IsLiteral(const char* literal);
 
@@ -357,8 +357,14 @@
   void AddInterfaces(intptr_t interfaces_pos,
                      const Class& cls,
                      const Array& interfaces);
+  StaticCallNode* BuildInvocationMirrorAllocation(
+      intptr_t call_pos,
+      const String& function_name,
+      const ArgumentListNode& function_args);
   ArgumentListNode* BuildNoSuchMethodArguments(
-      const String& function_name, const ArgumentListNode& function_args);
+      intptr_t call_pos,
+      const String& function_name,
+      const ArgumentListNode& function_args);
   RawFunction* GetSuperFunction(intptr_t token_pos,
                                 const String& name,
                                 bool resolve_getter,
@@ -366,6 +372,7 @@
   AstNode* ParseSuperCall(const String& function_name);
   AstNode* ParseSuperFieldAccess(const String& field_name);
   AstNode* ParseSuperOperator();
+  AstNode* BuildUnarySuperOperator(Token::Kind op, PrimaryNode* super);
 
   static void SetupDefaultsForOptionalParams(const ParamList* params,
                                              Array& default_values);
diff --git a/runtime/vm/raw_object.cc b/runtime/vm/raw_object.cc
index 2d41d74..582c649 100644
--- a/runtime/vm/raw_object.cc
+++ b/runtime/vm/raw_object.cc
@@ -101,13 +101,6 @@
         instance_size = TwoByteString::InstanceSize(string_length);
         break;
       }
-      case kFourByteStringCid: {
-        const RawFourByteString* raw_string =
-            reinterpret_cast<const RawFourByteString*>(this);
-        intptr_t string_length = Smi::Value(raw_string->ptr()->length_);
-        instance_size = FourByteString::InstanceSize(string_length);
-        break;
-      }
       case kArrayCid:
       case kImmutableArrayCid: {
         const RawArray* raw_array = reinterpret_cast<const RawArray*>(this);
@@ -688,14 +681,6 @@
 }
 
 
-intptr_t RawFourByteString::VisitFourByteStringPointers(
-    RawFourByteString* raw_obj, ObjectPointerVisitor* visitor) {
-  intptr_t length = Smi::Value(raw_obj->ptr()->length_);
-  visitor->VisitPointers(raw_obj->from(), raw_obj->to());
-  return FourByteString::InstanceSize(length);
-}
-
-
 intptr_t RawExternalOneByteString::VisitExternalOneByteStringPointers(
     RawExternalOneByteString* raw_obj, ObjectPointerVisitor* visitor) {
   // Make sure that we got here with the tagged pointer as this.
@@ -714,15 +699,6 @@
 }
 
 
-intptr_t RawExternalFourByteString::VisitExternalFourByteStringPointers(
-    RawExternalFourByteString* raw_obj, ObjectPointerVisitor* visitor) {
-  // Make sure that we got here with the tagged pointer as this.
-  ASSERT(raw_obj->IsHeapObject());
-  visitor->VisitPointers(raw_obj->from(), raw_obj->to());
-  return ExternalFourByteString::InstanceSize();
-}
-
-
 intptr_t RawBool::VisitBoolPointers(RawBool* raw_obj,
                                     ObjectPointerVisitor* visitor) {
   // Make sure that we got here with the tagged pointer as this.
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 09a4c2c..18ae342 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -59,10 +59,8 @@
     V(String)                                                                  \
       V(OneByteString)                                                         \
       V(TwoByteString)                                                         \
-      V(FourByteString)                                                        \
       V(ExternalOneByteString)                                                 \
       V(ExternalTwoByteString)                                                 \
-      V(ExternalFourByteString)                                                \
     V(Bool)                                                                    \
     V(Array)                                                                   \
       V(ImmutableArray)                                                        \
@@ -340,6 +338,7 @@
   static bool IsExternalStringClassId(intptr_t index);
   static bool IsBuiltinListClassId(intptr_t index);
   static bool IsByteArrayClassId(intptr_t index);
+  static bool IsExternalByteArrayClassId(intptr_t index);
 
  protected:
   uword tags_;  // Various object tags (bits).
@@ -1031,7 +1030,7 @@
   }
   RawClass* parameterized_class_;
   RawString* name_;
-  RawAbstractType* bound_;  // DynamicType if no explicit bound specified.
+  RawAbstractType* bound_;  // ObjectType if no explicit bound specified.
   RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->bound_); }
   intptr_t index_;
   intptr_t token_pos_;
@@ -1125,16 +1124,6 @@
 };
 
 
-class RawFourByteString : public RawString {
-  RAW_HEAP_OBJECT_IMPLEMENTATION(FourByteString);
-
-  // Variable length data follows here.
-  uint32_t data_[0];
-
-  friend class SnapshotReader;
-};
-
-
 template<typename T>
 class ExternalStringData {
  public:
@@ -1175,14 +1164,6 @@
 };
 
 
-class RawExternalFourByteString : public RawString {
-  RAW_HEAP_OBJECT_IMPLEMENTATION(ExternalFourByteString);
-
-  ExternalStringData<uint32_t>* external_data_;
-  friend class Api;
-};
-
-
 class RawBool : public RawInstance {
   RAW_HEAP_OBJECT_IMPLEMENTATION(Bool);
 
@@ -1473,6 +1454,7 @@
   uint8_t data_[0];
 };
 
+
 class RawWeakProperty : public RawInstance {
   RAW_HEAP_OBJECT_IMPLEMENTATION(WeakProperty);
 
@@ -1491,6 +1473,7 @@
   friend class ScavengerVisitor;
 };
 
+
 // Class Id predicates.
 
 inline bool RawObject::IsErrorClassId(intptr_t index) {
@@ -1503,6 +1486,7 @@
   return (index >= kErrorCid && index < kInstanceCid);
 }
 
+
 inline bool RawObject::IsNumberClassId(intptr_t index) {
   // Make sure this function is updated when new Number types are added.
   ASSERT(kIntegerCid == kNumberCid + 1 &&
@@ -1514,6 +1498,7 @@
   return (index >= kNumberCid && index < kStringCid);
 }
 
+
 inline bool RawObject::IsIntegerClassId(intptr_t index) {
   // Make sure this function is updated when new Integer types are added.
   ASSERT(kSmiCid == kIntegerCid + 1 &&
@@ -1523,59 +1508,55 @@
   return (index >= kIntegerCid && index < kDoubleCid);
 }
 
+
 inline bool RawObject::IsStringClassId(intptr_t index) {
   // Make sure this function is updated when new StringCid types are added.
   ASSERT(kOneByteStringCid == kStringCid + 1 &&
          kTwoByteStringCid == kStringCid + 2 &&
-         kFourByteStringCid == kStringCid + 3 &&
-         kExternalOneByteStringCid == kStringCid + 4 &&
-         kExternalTwoByteStringCid == kStringCid + 5 &&
-         kExternalFourByteStringCid == kStringCid + 6 &&
-         kBoolCid == kStringCid + 7);
+         kExternalOneByteStringCid == kStringCid + 3 &&
+         kExternalTwoByteStringCid == kStringCid + 4 &&
+         kBoolCid == kStringCid + 5);
   return (index >= kStringCid && index < kBoolCid);
 }
 
+
 inline bool RawObject::IsOneByteStringClassId(intptr_t index) {
   // Make sure this function is updated when new StringCid types are added.
   ASSERT(kOneByteStringCid == kStringCid + 1 &&
          kTwoByteStringCid == kStringCid + 2 &&
-         kFourByteStringCid == kStringCid + 3 &&
-         kExternalOneByteStringCid == kStringCid + 4 &&
-         kExternalTwoByteStringCid == kStringCid + 5 &&
-         kExternalFourByteStringCid == kStringCid + 6 &&
-         kBoolCid == kStringCid + 7);
+         kExternalOneByteStringCid == kStringCid + 3 &&
+         kExternalTwoByteStringCid == kStringCid + 4 &&
+         kBoolCid == kStringCid + 5);
   return (index == kOneByteStringCid || index == kExternalOneByteStringCid);
 }
 
+
 inline bool RawObject::IsTwoByteStringClassId(intptr_t index) {
   // Make sure this function is updated when new StringCid types are added.
   ASSERT(kOneByteStringCid == kStringCid + 1 &&
          kTwoByteStringCid == kStringCid + 2 &&
-         kFourByteStringCid == kStringCid + 3 &&
-         kExternalOneByteStringCid == kStringCid + 4 &&
-         kExternalTwoByteStringCid == kStringCid + 5 &&
-         kExternalFourByteStringCid == kStringCid + 6 &&
-         kBoolCid == kStringCid + 7);
+         kExternalOneByteStringCid == kStringCid + 3 &&
+         kExternalTwoByteStringCid == kStringCid + 4 &&
+         kBoolCid == kStringCid + 5);
   return (index == kOneByteStringCid ||
           index == kTwoByteStringCid ||
           index == kExternalOneByteStringCid ||
           index == kExternalTwoByteStringCid);
 }
 
+
 inline bool RawObject::IsExternalStringClassId(intptr_t index) {
   // Make sure this function is updated when new StringCid types are added.
   ASSERT(kOneByteStringCid == kStringCid + 1 &&
          kTwoByteStringCid == kStringCid + 2 &&
-         kFourByteStringCid == kStringCid + 3 &&
-         kExternalOneByteStringCid == kStringCid + 4 &&
-         kExternalTwoByteStringCid == kStringCid + 5 &&
-         kExternalFourByteStringCid == kStringCid + 6 &&
-         kBoolCid == kStringCid + 7);
+         kExternalOneByteStringCid == kStringCid + 3 &&
+         kExternalTwoByteStringCid == kStringCid + 4 &&
+         kBoolCid == kStringCid + 5);
   return (index == kExternalOneByteStringCid ||
-          index == kExternalTwoByteStringCid ||
-          index == kExternalFourByteStringCid);
+          index == kExternalTwoByteStringCid);
 }
 
+
 inline bool RawObject::IsBuiltinListClassId(intptr_t index) {
   // Make sure this function is updated when new builtin List types are added.
   ASSERT(kImmutableArrayCid == kArrayCid + 1 &&
@@ -1585,6 +1566,7 @@
       IsByteArrayClassId(index);
 }
 
+
 inline bool RawObject::IsByteArrayClassId(intptr_t index) {
   // Make sure this function is updated when new ByteArray types are added.
   ASSERT(kInt8ArrayCid == kByteArrayCid + 1 &&
@@ -1611,6 +1593,21 @@
   return (index >= kByteArrayCid && index <= kExternalFloat64ArrayCid);
 }
 
+inline bool RawObject::IsExternalByteArrayClassId(intptr_t index) {
+  // Make sure this function is updated when new ByteArray types are added.
+  ASSERT(kExternalUint8ArrayCid == kExternalInt8ArrayCid + 1 &&
+         kExternalInt16ArrayCid == kExternalInt8ArrayCid + 2 &&
+         kExternalUint16ArrayCid == kExternalInt8ArrayCid + 3 &&
+         kExternalInt32ArrayCid == kExternalInt8ArrayCid + 4 &&
+         kExternalUint32ArrayCid == kExternalInt8ArrayCid + 5 &&
+         kExternalInt64ArrayCid == kExternalInt8ArrayCid + 6 &&
+         kExternalUint64ArrayCid == kExternalInt8ArrayCid + 7 &&
+         kExternalFloat32ArrayCid == kExternalInt8ArrayCid + 8 &&
+         kExternalFloat64ArrayCid == kExternalInt8ArrayCid + 9 &&
+         kStacktraceCid == kExternalInt8ArrayCid + 10);
+  return (index >= kExternalInt8ArrayCid && index <= kExternalFloat64ArrayCid);
+}
+
 }  // namespace dart
 
 #endif  // VM_RAW_OBJECT_H_
diff --git a/runtime/vm/raw_object_snapshot.cc b/runtime/vm/raw_object_snapshot.cc
index 842b1a5..fd67149 100644
--- a/runtime/vm/raw_object_snapshot.cc
+++ b/runtime/vm/raw_object_snapshot.cc
@@ -1715,37 +1715,6 @@
 }
 
 
-RawFourByteString* FourByteString::ReadFrom(SnapshotReader* reader,
-                                            intptr_t object_id,
-                                            intptr_t tags,
-                                            Snapshot::Kind kind) {
-  // Read the length so that we can determine instance size to allocate.
-  ASSERT(reader != NULL);
-  intptr_t len = reader->ReadSmiValue();
-  intptr_t hash = reader->ReadSmiValue();
-  FourByteString& str_obj = FourByteString::ZoneHandle(reader->isolate(),
-                                                       FourByteString::null());
-
-  if (kind == Snapshot::kFull) {
-    RawFourByteString* obj = reader->NewFourByteString(len);
-    str_obj = obj;
-    str_obj.set_tags(tags);
-    obj->ptr()->hash_ = Smi::New(hash);
-    uint32_t* raw_ptr = (len > 0)? str_obj.CharAddr(0) : NULL;
-    for (intptr_t i = 0; i < len; i++) {
-      ASSERT(str_obj.CharAddr(i) == raw_ptr);  // Will trigger assertions.
-      *raw_ptr = reader->Read<uint32_t>();
-      raw_ptr += 1;
-    }
-    ASSERT(String::Hash(str_obj, 0, str_obj.Length()) == hash);
-  } else {
-    ReadFromImpl<FourByteString, uint32_t>(reader, &str_obj, len, tags, kind);
-  }
-  reader->AddBackRef(object_id, &str_obj, kIsDeserialized);
-  return str_obj.raw();
-}
-
-
 template<typename T>
 static void StringWriteTo(SnapshotWriter* writer,
                           intptr_t object_id,
@@ -1812,20 +1781,6 @@
 }
 
 
-void RawFourByteString::WriteTo(SnapshotWriter* writer,
-                                intptr_t object_id,
-                                Snapshot::Kind kind) {
-  StringWriteTo(writer,
-                object_id,
-                kind,
-                kFourByteStringCid,
-                writer->GetObjectTags(this),
-                ptr()->length_,
-                ptr()->hash_,
-                ptr()->data_);
-}
-
-
 RawExternalOneByteString* ExternalOneByteString::ReadFrom(
     SnapshotReader* reader,
     intptr_t object_id,
@@ -1846,16 +1801,6 @@
 }
 
 
-RawExternalFourByteString* ExternalFourByteString::ReadFrom(
-    SnapshotReader* reader,
-    intptr_t object_id,
-    intptr_t tags,
-    Snapshot::Kind kind) {
-  UNREACHABLE();
-  return ExternalFourByteString::null();
-}
-
-
 void RawExternalOneByteString::WriteTo(SnapshotWriter* writer,
                                        intptr_t object_id,
                                        Snapshot::Kind kind) {
@@ -1886,21 +1831,6 @@
 }
 
 
-void RawExternalFourByteString::WriteTo(SnapshotWriter* writer,
-                                        intptr_t object_id,
-                                        Snapshot::Kind kind) {
-  // Serialize as a non-external four byte string.
-  StringWriteTo(writer,
-                object_id,
-                kind,
-                kFourByteStringCid,
-                writer->GetObjectTags(this),
-                ptr()->length_,
-                ptr()->hash_,
-                ptr()->external_data_->data());
-}
-
-
 RawBool* Bool::ReadFrom(SnapshotReader* reader,
                         intptr_t object_id,
                         intptr_t tags,
@@ -2113,13 +2043,14 @@
 #undef EXTERNALARRAY_READ_FROM
 
 
+template<typename ElementT>
 static void ByteArrayWriteTo(SnapshotWriter* writer,
                              intptr_t object_id,
                              Snapshot::Kind kind,
                              intptr_t byte_array_kind,
                              intptr_t tags,
                              RawSmi* length,
-                             uint8_t* data) {
+                             ElementT* data) {
   ASSERT(writer != NULL);
   intptr_t len = Smi::Value(length);
 
@@ -2157,7 +2088,7 @@
                    k##name##ArrayCid,                                          \
                    writer->GetObjectTags(this),                                \
                    ptr()->length_,                                             \
-                   reinterpret_cast<uint8_t*>(ptr()->data_));                  \
+                   ptr()->data_);                                              \
 }                                                                              \
 
 
@@ -2175,7 +2106,7 @@
                    k##name##ArrayCid,                                          \
                    writer->GetObjectTags(this),                                \
                    ptr()->length_,                                             \
-                   reinterpret_cast<uint8_t*>(ptr()->external_data_->data())); \
+                   ptr()->external_data_->data());                             \
 }                                                                              \
 
 
diff --git a/runtime/vm/scavenger.cc b/runtime/vm/scavenger.cc
index b5696a1..e1b4326 100644
--- a/runtime/vm/scavenger.cc
+++ b/runtime/vm/scavenger.cc
@@ -50,6 +50,21 @@
 }
 
 
+class BoolScope : public ValueObject {
+ public:
+  BoolScope(bool* addr, bool value) : _addr(addr), _value(*addr) {
+    *_addr = value;
+  }
+  ~BoolScope() {
+    *_addr = _value;
+  }
+
+ private:
+  bool* _addr;
+  bool _value;
+};
+
+
 class ScavengerVisitor : public ObjectPointerVisitor {
  public:
   explicit ScavengerVisitor(Isolate* isolate, Scavenger* scavenger)
@@ -57,7 +72,9 @@
         scavenger_(scavenger),
         heap_(scavenger->heap_),
         vm_heap_(Dart::vm_isolate()->heap()),
-        visiting_old_pointers_(false) {}
+        delayed_weak_stack_(),
+        visiting_old_pointers_(false),
+        in_scavenge_pointer_(false) {}
 
   void VisitPointers(RawObject** first, RawObject** last) {
     for (RawObject** current = first; current <= last; current++) {
@@ -65,7 +82,11 @@
     }
   }
 
-  void VisitingOldPointers(bool value) { visiting_old_pointers_ = value; }
+  GrowableArray<RawObject*>* DelayedWeakStack() {
+    return &delayed_weak_stack_;
+  }
+
+  bool* VisitingOldPointersAddr() { return &visiting_old_pointers_; }
 
   void DelayWeakProperty(RawWeakProperty* raw_weak) {
     RawObject* raw_key = raw_weak->ptr()->key_;
@@ -99,6 +120,10 @@
   }
 
   void ScavengePointer(RawObject** p) {
+    // ScavengePointer cannot be called recursively.
+    ASSERT(!in_scavenge_pointer_);
+    BoolScope bs(&in_scavenge_pointer_, true);
+
     RawObject* raw_obj = *p;
 
     // Fast exit if the raw object is a Smi or an old object.
@@ -122,26 +147,21 @@
     if (IsForwarding(header)) {
       // Get the new location of the object.
       new_addr = ForwardedAddr(header);
-    } else if (raw_obj->IsWatched()) {
-      // Forward the object by scavenging its watchers.
-      raw_obj->ClearWatchedBit();
-      std::pair<DelaySet::iterator, DelaySet::iterator> ret;
-      // Visit all elements with a key equal to raw_obj.
-      ret = delay_set_.equal_range(raw_obj);
-      for (DelaySet::iterator it = ret.first; it != ret.second; ++it) {
-        // Scavenge the delayed WeakProperty.  These objects have been
-        // forwarded but have not been scavenged because their key
-        // object was not known to be reachable.  Now that the key
-        // object is known to be reachable we can scavenge the key and
-        // value pointers.
-        it->second->VisitPointers(this);
-      }
-      delay_set_.erase(ret.first, ret.second);
-      // Reread the header word to get the new location of the object.
-      header = *reinterpret_cast<uword*>(raw_addr);
-      ASSERT(IsForwarding(header));
-      new_addr = ForwardedAddr(header);
     } else {
+      if (raw_obj->IsWatched()) {
+        raw_obj->ClearWatchedBit();
+        std::pair<DelaySet::iterator, DelaySet::iterator> ret;
+        // Visit all elements with a key equal to this raw_obj.
+        ret = delay_set_.equal_range(raw_obj);
+        for (DelaySet::iterator it = ret.first; it != ret.second; ++it) {
+          // Remember the delayed WeakProperty. These objects have been
+          // forwarded, but have not been scavenged because their key was not
+          // known to be reachable. Now that the key object is known to be
+          // reachable, we need to visit its key and value pointers.
+          delayed_weak_stack_.Add(it->second);
+        }
+        delay_set_.erase(ret.first, ret.second);
+      }
       intptr_t size = raw_obj->Size();
       // Check whether object should be promoted.
       if (scavenger_->survivor_end_ <= raw_addr) {
@@ -190,8 +210,10 @@
   Heap* vm_heap_;
   typedef std::multimap<RawObject*, RawWeakProperty*> DelaySet;
   DelaySet delay_set_;
+  GrowableArray<RawObject*> delayed_weak_stack_;
 
   bool visiting_old_pointers_;
+  bool in_scavenge_pointer_;
 
   DISALLOW_COPY_AND_ASSIGN(ScavengerVisitor);
 };
@@ -325,7 +347,7 @@
 void Scavenger::IterateStoreBuffers(Isolate* isolate,
                                     ScavengerVisitor* visitor) {
   // Iterating through the store buffers.
-  visitor->VisitingOldPointers(true);
+  BoolScope bs(visitor->VisitingOldPointersAddr(), true);
   // Grab the deduplication sets out of the store buffer.
   StoreBuffer::DedupSet* pending = isolate->store_buffer()->DedupSets();
   intptr_t entries = 0;
@@ -381,8 +403,6 @@
     OS::PrintErr("StoreBufferBlock: %"Pd", %"Pd" (entries, dups)\n",
                  entries, duplicates);
   }
-  // Done iterating through the store buffers.
-  visitor->VisitingOldPointers(false);
 }
 
 
@@ -479,8 +499,12 @@
 
 
 void Scavenger::ProcessToSpace(ScavengerVisitor* visitor) {
+  GrowableArray<RawObject*>* delayed_weak_stack = visitor->DelayedWeakStack();
+
   // Iterate until all work has been drained.
-  while ((resolved_top_ < top_) || PromotedStackHasMore()) {
+  while ((resolved_top_ < top_) ||
+         PromotedStackHasMore() ||
+         !delayed_weak_stack->is_empty()) {
     while (resolved_top_ < top_) {
       RawObject* raw_obj = RawObject::FromAddr(resolved_top_);
       intptr_t class_id = raw_obj->GetClassId();
@@ -491,15 +515,21 @@
         resolved_top_ += ProcessWeakProperty(raw_weak, visitor);
       }
     }
-    visitor->VisitingOldPointers(true);
-    while (PromotedStackHasMore()) {
-      RawObject* raw_object = RawObject::FromAddr(PopFromPromotedStack());
-      // Resolve or copy all objects referred to by the current object. This
-      // can potentially push more objects on this stack as well as add more
-      // objects to be resolved in the to space.
-      raw_object->VisitPointers(visitor);
+    {
+      BoolScope bs(visitor->VisitingOldPointersAddr(), true);
+      while (PromotedStackHasMore()) {
+        RawObject* raw_object = RawObject::FromAddr(PopFromPromotedStack());
+        // Resolve or copy all objects referred to by the current object. This
+        // can potentially push more objects on this stack as well as add more
+        // objects to be resolved in the to space.
+        raw_object->VisitPointers(visitor);
+      }
     }
-    visitor->VisitingOldPointers(false);
+    while (!delayed_weak_stack->is_empty()) {
+      // Pop the delayed weak object from the stack and visit its pointers.
+      RawObject* weak_property = delayed_weak_stack->RemoveLast();
+      weak_property->VisitPointers(visitor);
+    }
   }
 }
 
diff --git a/runtime/vm/snapshot.cc b/runtime/vm/snapshot.cc
index 12aad9e..77204f3 100644
--- a/runtime/vm/snapshot.cc
+++ b/runtime/vm/snapshot.cc
@@ -387,13 +387,6 @@
 }
 
 
-RawFourByteString* SnapshotReader::NewFourByteString(intptr_t len) {
-  ALLOC_NEW_OBJECT_WITH_LEN(FourByteString,
-                            object_store()->four_byte_string_class(),
-                            len);
-}
-
-
 RawTypeArguments* SnapshotReader::NewTypeArguments(intptr_t len) {
   ALLOC_NEW_OBJECT_WITH_LEN(TypeArguments,
                             Object::type_arguments_class(),
diff --git a/runtime/vm/snapshot.h b/runtime/vm/snapshot.h
index 44c19fe..fba122a 100644
--- a/runtime/vm/snapshot.h
+++ b/runtime/vm/snapshot.h
@@ -36,7 +36,6 @@
 class RawContext;
 class RawDouble;
 class RawField;
-class RawFourByteString;
 class RawClosureData;
 class RawRedirectionData;
 class RawFunction;
@@ -239,7 +238,6 @@
   RawImmutableArray* NewImmutableArray(intptr_t len);
   RawOneByteString* NewOneByteString(intptr_t len);
   RawTwoByteString* NewTwoByteString(intptr_t len);
-  RawFourByteString* NewFourByteString(intptr_t len);
   RawTypeArguments* NewTypeArguments(intptr_t len);
   RawTokenStream* NewTokenStream(intptr_t len);
   RawContext* NewContext(intptr_t num_variables);
diff --git a/runtime/vm/snapshot_test.cc b/runtime/vm/snapshot_test.cc
index e7d127a..3e84b59 100644
--- a/runtime/vm/snapshot_test.cc
+++ b/runtime/vm/snapshot_test.cc
@@ -627,6 +627,77 @@
 }
 
 
+#define TEST_TYPED_ARRAY(darttype, ctype)                                     \
+  {                                                                           \
+    StackZone zone(Isolate::Current());                                       \
+    uint8_t* buffer;                                                          \
+    MessageWriter writer(&buffer, &zone_allocator);                           \
+    const int kArrayLength = 127;                                             \
+    darttype& array = darttype::Handle(darttype::New(kArrayLength));          \
+    for (int i = 0; i < kArrayLength; i++) {                                  \
+      array.SetAt(i, i);                                                      \
+    }                                                                         \
+    writer.WriteMessage(array);                                               \
+    intptr_t buffer_len = writer.BytesWritten();                              \
+    SnapshotReader reader(buffer, buffer_len,                                 \
+                          Snapshot::kMessage, Isolate::Current());            \
+    darttype& serialized_array = darttype::Handle();                          \
+    serialized_array ^= reader.ReadObject();                                  \
+    for (int i = 0; i < kArrayLength; i++) {                                  \
+      EXPECT_EQ(static_cast<ctype>(i), serialized_array.At(i));               \
+    }                                                                         \
+  }
+
+
+#define TEST_EXTERNAL_TYPED_ARRAY(darttype, ctype)                            \
+  {                                                                           \
+    StackZone zone(Isolate::Current());                                       \
+    ctype data[] = { 0, 11, 22, 33, 44, 55, 66, 77 };                         \
+    intptr_t length = ARRAY_SIZE(data);                                       \
+    External##darttype& array = External##darttype::Handle(                   \
+        External##darttype::New(data, length, NULL, NULL));                   \
+    uint8_t* buffer;                                                          \
+    MessageWriter writer(&buffer, &zone_allocator);                           \
+    writer.WriteMessage(array);                                               \
+    intptr_t buffer_len = writer.BytesWritten();                              \
+    SnapshotReader reader(buffer, buffer_len,                                 \
+                          Snapshot::kMessage, Isolate::Current());            \
+    darttype& serialized_array = darttype::Handle();                          \
+    serialized_array ^= reader.ReadObject();                                  \
+    for (int i = 0; i < length; i++) {                                        \
+      EXPECT_EQ(static_cast<ctype>(data[i]), serialized_array.At(i));         \
+    }                                                                         \
+  }
+
+
+TEST_CASE(SerializeTypedArray) {
+  TEST_TYPED_ARRAY(Int8Array, int8_t);
+  TEST_TYPED_ARRAY(Uint8Array, uint8_t);
+  TEST_TYPED_ARRAY(Int16Array, int16_t);
+  TEST_TYPED_ARRAY(Uint16Array, uint16_t);
+  TEST_TYPED_ARRAY(Int32Array, int32_t);
+  TEST_TYPED_ARRAY(Uint32Array, uint32_t);
+  TEST_TYPED_ARRAY(Int64Array, int64_t);
+  TEST_TYPED_ARRAY(Uint64Array, uint64_t);
+  TEST_TYPED_ARRAY(Float32Array, float);
+  TEST_TYPED_ARRAY(Float64Array, double);
+}
+
+
+TEST_CASE(SerializeExternalTypedArray) {
+  TEST_EXTERNAL_TYPED_ARRAY(Int8Array, int8_t);
+  TEST_EXTERNAL_TYPED_ARRAY(Uint8Array, uint8_t);
+  TEST_EXTERNAL_TYPED_ARRAY(Int16Array, int16_t);
+  TEST_EXTERNAL_TYPED_ARRAY(Uint16Array, uint16_t);
+  TEST_EXTERNAL_TYPED_ARRAY(Int32Array, int32_t);
+  TEST_EXTERNAL_TYPED_ARRAY(Uint32Array, uint32_t);
+  TEST_EXTERNAL_TYPED_ARRAY(Int64Array, int64_t);
+  TEST_EXTERNAL_TYPED_ARRAY(Uint64Array, uint64_t);
+  TEST_EXTERNAL_TYPED_ARRAY(Float32Array, float);
+  TEST_EXTERNAL_TYPED_ARRAY(Float64Array, double);
+}
+
+
 TEST_CASE(SerializeEmptyByteArray) {
   StackZone zone(Isolate::Current());
 
@@ -874,8 +945,8 @@
 
     // Invoke a function which returns an object.
     Dart_Handle cls =
-        Dart_GetClass(TestCase::lib(), Dart_NewString("FieldsTest"));
-    result = Dart_Invoke(cls, Dart_NewString("testMain"), 0, NULL);
+        Dart_GetClass(TestCase::lib(), NewString("FieldsTest"));
+    result = Dart_Invoke(cls, NewString("testMain"), 0, NULL);
     EXPECT_VALID(result);
     Dart_ExitScope();
   }
@@ -916,8 +987,8 @@
     writer.WriteFullSnapshot();
 
     // Invoke a function which returns an object.
-    Dart_Handle cls = Dart_GetClass(lib, Dart_NewString("FieldsTest"));
-    Dart_Handle result = Dart_Invoke(cls, Dart_NewString("testMain"), 0, NULL);
+    Dart_Handle cls = Dart_GetClass(lib, NewString("FieldsTest"));
+    Dart_Handle result = Dart_Invoke(cls, NewString("testMain"), 0, NULL);
     EXPECT_VALID(result);
   }
 
@@ -933,8 +1004,8 @@
 
     // Invoke a function which returns an object.
     Dart_Handle cls = Dart_GetClass(TestCase::lib(),
-                                    Dart_NewString("FieldsTest"));
-    Dart_Handle result = Dart_Invoke(cls, Dart_NewString("testMain"), 0, NULL);
+                                    NewString("FieldsTest"));
+    Dart_Handle result = Dart_Invoke(cls, NewString("testMain"), 0, NULL);
     if (Dart_IsError(result)) {
       // Print the error.  It is probably an unhandled exception.
       fprintf(stderr, "%s\n", Dart_GetError(result));
@@ -1014,8 +1085,8 @@
     Dart_EnterScope();  // Start a Dart API scope for invoking API functions.
 
     // Load the library.
-    Dart_Handle import_lib = Dart_LoadLibrary(Dart_NewString("dart:import-lib"),
-                                              Dart_NewString(kLibScriptChars));
+    Dart_Handle import_lib = Dart_LoadLibrary(NewString("dart:import-lib"),
+                                              NewString(kLibScriptChars));
     EXPECT_VALID(import_lib);
 
     // Create a test library and Load up a test script in it.
@@ -1058,8 +1129,8 @@
     EXPECT_EQ(expected_num_libs, actual_num_libs);
 
     // Invoke a function which returns an object.
-    Dart_Handle cls = Dart_GetClass(result, Dart_NewString("FieldsTest"));
-    result = Dart_Invoke(cls, Dart_NewString("testMain"), 0, NULL);
+    Dart_Handle cls = Dart_GetClass(result, NewString("FieldsTest"));
+    result = Dart_Invoke(cls, NewString("testMain"), 0, NULL);
     EXPECT_VALID(result);
     Dart_ExitScope();
   }
@@ -1099,7 +1170,7 @@
 static Dart_CObject* GetDeserializedDartMessage(Dart_Handle lib,
                                                 const char* dart_function) {
   Dart_Handle result;
-  result = Dart_Invoke(lib, Dart_NewString(dart_function), 0, NULL);
+  result = Dart_Invoke(lib, NewString(dart_function), 0, NULL);
   EXPECT_VALID(result);
 
   // Serialize the list into a message.
@@ -1139,13 +1210,13 @@
                                              NULL);
   EXPECT_VALID(lib);
   Dart_Handle smi_result;
-  smi_result = Dart_Invoke(lib, Dart_NewString("getSmi"), 0, NULL);
+  smi_result = Dart_Invoke(lib, NewString("getSmi"), 0, NULL);
   EXPECT_VALID(smi_result);
   Dart_Handle bigint_result;
-  bigint_result = Dart_Invoke(lib, Dart_NewString("getBigint"), 0, NULL);
+  bigint_result = Dart_Invoke(lib, NewString("getBigint"), 0, NULL);
   EXPECT_VALID(bigint_result);
   Dart_Handle string_result;
-  string_result = Dart_Invoke(lib, Dart_NewString("getString"), 0, NULL);
+  string_result = Dart_Invoke(lib, NewString("getString"), 0, NULL);
   EXPECT_VALID(string_result);
   EXPECT(Dart_IsString(string_result));
 
@@ -1903,9 +1974,9 @@
   Dart_EnterScope();
 
   // xxx
-  Dart_Handle send_port = Dart_Invoke(lib, Dart_NewString("main"), 0, NULL);
+  Dart_Handle send_port = Dart_Invoke(lib, NewString("main"), 0, NULL);
   EXPECT_VALID(send_port);
-  Dart_Handle result = Dart_GetField(send_port, Dart_NewString("_id"));
+  Dart_Handle result = Dart_GetField(send_port, NewString("_id"));
   ASSERT(!Dart_IsError(result));
   ASSERT(Dart_IsInteger(result));
   int64_t send_port_id;
diff --git a/runtime/vm/stack_frame_test.cc b/runtime/vm/stack_frame_test.cc
index 910a1a0..4348fc6 100644
--- a/runtime/vm/stack_frame_test.cc
+++ b/runtime/vm/stack_frame_test.cc
@@ -240,8 +240,8 @@
   Dart_Handle lib = TestCase::LoadTestScript(
       kScriptChars,
       reinterpret_cast<Dart_NativeEntryResolver>(native_lookup));
-  Dart_Handle cls = Dart_GetClass(lib, Dart_NewString("StackFrameTest"));
-  EXPECT_VALID(Dart_Invoke(cls, Dart_NewString("testMain"), 0, NULL));
+  Dart_Handle cls = Dart_GetClass(lib, NewString("StackFrameTest"));
+  EXPECT_VALID(Dart_Invoke(cls, NewString("testMain"), 0, NULL));
 }
 
 
@@ -257,7 +257,7 @@
       "} "
       "class StackFrame2Test {"
       "  StackFrame2Test() {}"
-      "  noSuchMethod(var function_name, var args) {"
+      "  noSuchMethod(InvocationMirror im) {"
       "    /* We should have 8 general frames and 3 dart frames as follows:"
       "     * exit frame"
       "     * dart frame corresponding to StackFrame.frameCount"
@@ -283,8 +283,8 @@
   Dart_Handle lib = TestCase::LoadTestScript(
       kScriptChars,
       reinterpret_cast<Dart_NativeEntryResolver>(native_lookup));
-  Dart_Handle cls = Dart_GetClass(lib, Dart_NewString("StackFrame2Test"));
-  EXPECT_VALID(Dart_Invoke(cls, Dart_NewString("testMain"), 0, NULL));
+  Dart_Handle cls = Dart_GetClass(lib, NewString("StackFrame2Test"));
+  EXPECT_VALID(Dart_Invoke(cls, NewString("testMain"), 0, NULL));
 }
 #endif  // TARGET_ARCH_IA32 || TARGET_ARCH_X64.
 
diff --git a/runtime/vm/stub_code_ia32.cc b/runtime/vm/stub_code_ia32.cc
index b92645d..9be505a 100644
--- a/runtime/vm/stub_code_ia32.cc
+++ b/runtime/vm/stub_code_ia32.cc
@@ -1557,8 +1557,18 @@
 // - Match not found -> jump to IC miss.
 void StubCode::GenerateNArgsCheckInlineCacheStub(Assembler* assembler,
                                                  intptr_t num_args) {
-  const Immediate raw_null =
-      Immediate(reinterpret_cast<intptr_t>(Object::null()));
+  ASSERT(num_args > 0);
+#if defined(DEBUG)
+  { Label ok;
+    // Check that the IC data array has NumberOfArgumentsChecked() == num_args.
+    // 'num_args_tested' is stored as an untagged int.
+    __ movl(EBX, FieldAddress(ECX, ICData::num_args_tested_offset()));
+    __ cmpl(EBX, Immediate(num_args));
+    __ j(EQUAL, &ok, Assembler::kNearJump);
+    __ Stop("Incorrect stub for IC data");
+    __ Bind(&ok);
+  }
+#endif  // DEBUG
 
   __ movl(EBX, FieldAddress(ECX, ICData::function_offset()));
   Label is_hot;
@@ -1580,70 +1590,63 @@
   __ incl(FieldAddress(EBX, Function::usage_counter_offset()));
   __ Bind(&is_hot);
 
-  ASSERT(num_args > 0);
-  // Get receiver (first read number of arguments from argument descriptor array
-  // and then access the receiver from the stack).
-  __ movl(EAX, FieldAddress(EDX, Array::data_offset()));
-  __ movl(EAX, Address(ESP, EAX, TIMES_2, 0));  // EAX (argument_count) is Smi.
-
-  Label get_class_id_as_smi, ic_miss;
-  // ECX: IC data array.
-
-#if defined(DEBUG)
-  { Label ok;
-    // Check that the IC data array has NumberOfArgumentsChecked() == num_args.
-    // 'num_args_tested' is stored as an untagged int.
-    __ movl(EBX, FieldAddress(ECX, ICData::num_args_tested_offset()));
-    __ cmpl(EBX, Immediate(num_args));
-    __ j(EQUAL, &ok, Assembler::kNearJump);
-    __ Stop("Incorrect stub for IC data");
-    __ Bind(&ok);
-  }
-#endif  // DEBUG
-
   // Loop that checks if there is an IC data match.
+  Label loop, update, test, found, get_class_id_as_smi;
   // ECX: IC data object (preserved).
   __ movl(EBX, FieldAddress(ECX, ICData::ic_data_offset()));
   // EBX: ic_data_array with check entries: classes and target functions.
   __ leal(EBX, FieldAddress(EBX, Array::data_offset()));
   // EBX: points directly to the first ic data array element.
-  Label loop, found;
-  if (num_args == 1) {
-    __ call(&get_class_id_as_smi);
-    // EAX: receiver's class id Smi.
-    __ Bind(&loop);
-    __ movl(EDI, Address(EBX, 0));  // Get class id (Smi) to check.
-    __ cmpl(EAX, EDI);  // Class id match?
-    __ j(EQUAL, &found, Assembler::kNearJump);
-    __ addl(EBX, Immediate(kWordSize * 2));  // Next element (class + target).
-    __ cmpl(EDI, Immediate(Smi::RawValue(kIllegalCid)));  // Done?
-    __ j(NOT_EQUAL, &loop, Assembler::kNearJump);
-  } else {
-    Label no_match;
-    __ Bind(&loop);
-    for (int i = 0; i < num_args; i++) {
+
+  // Get the receiver's class ID (first read number of arguments from
+  // argument descriptor array and then access the receiver from the stack).
+  __ movl(EAX, FieldAddress(EDX, Array::data_offset()));
+  __ movl(EAX, Address(ESP, EAX, TIMES_2, 0));  // EAX (argument_count) is smi.
+  __ call(&get_class_id_as_smi);
+  // EAX: receiver's class ID (smi).
+  __ movl(EDI, Address(EBX, 0));  // First class id (smi) to check.
+  __ jmp(&test);
+
+  __ Bind(&loop);
+  for (int i = 0; i < num_args; i++) {
+    if (i > 0) {
+      // If not the first, load the next argument's class ID.
       __ movl(EAX, FieldAddress(EDX, Array::data_offset()));
       __ movl(EAX, Address(ESP, EAX, TIMES_2, - i * kWordSize));
       __ call(&get_class_id_as_smi);
+      // EAX: next argument class ID (smi).
       __ movl(EDI, Address(EBX, i * kWordSize));
-      __ cmpl(EAX, EDI);  // Class id match?
-      if (i < (num_args - 1)) {
-        __ j(NOT_EQUAL, &no_match);
-      } else {
-        // Last check, all checks before matched.
-        __ j(EQUAL, &found, Assembler::kNearJump);
-      }
+      // EDI: next class ID to check (smi).
     }
-    __ Bind(&no_match);
-    // Each test entry has (1 + num_args) array elements.
-    __ addl(EBX, Immediate(kWordSize * (1 + num_args)));  // Next element.
-    __ cmpl(EDI, Immediate(Smi::RawValue(kIllegalCid)));  // Done?
-    __ j(NOT_EQUAL, &loop, Assembler::kNearJump);
+    __ cmpl(EAX, EDI);  // Class id match?
+    if (i < (num_args - 1)) {
+      __ j(NOT_EQUAL, &update);  // Continue.
+    } else {
+      // Last check, all checks before matched.
+      __ j(EQUAL, &found, Assembler::kNearJump);  // Break.
+    }
   }
+  __ Bind(&update);
+  // Reload receiver class ID.  It has not been destroyed when num_args == 1.
+  if (num_args > 1) {
+    __ movl(EAX, FieldAddress(EDX, Array::data_offset()));
+    __ movl(EAX, Address(ESP, EAX, TIMES_2, 0));
+    __ call(&get_class_id_as_smi);
+  }
+  // Each test entry has (1 + num_args) array elements.
+  const intptr_t entry_size = (num_args + 1) * kWordSize;
+  __ addl(EBX, Immediate(entry_size));  // Next entry.
+  __ movl(EDI, Address(EBX, 0));  // Next class ID.
 
-  __ Bind(&ic_miss);
-  // Compute address of arguments (first read number of arguments from argument
-  // descriptor array and then compute address on the stack).
+  __ Bind(&test);
+  __ cmpl(EDI, Immediate(Smi::RawValue(kIllegalCid)));  // Done?
+  __ j(NOT_EQUAL, &loop, Assembler::kNearJump);
+
+  // IC miss.
+  const Immediate raw_null =
+      Immediate(reinterpret_cast<intptr_t>(Object::null()));
+  // Compute address of arguments (first read number of arguments from
+  // argument descriptor array and then compute address on the stack).
   __ movl(EAX, FieldAddress(EDX, Array::data_offset()));
   __ leal(EAX, Address(ESP, EAX, TIMES_2, 0));  // EAX is Smi.
   // Create a stub frame as we are pushing some objects on the stack before
diff --git a/runtime/vm/stub_code_x64.cc b/runtime/vm/stub_code_x64.cc
index 1e81cfe..a1dbf92 100644
--- a/runtime/vm/stub_code_x64.cc
+++ b/runtime/vm/stub_code_x64.cc
@@ -1537,8 +1537,21 @@
 // - Match not found -> jump to IC miss.
 void StubCode::GenerateNArgsCheckInlineCacheStub(Assembler* assembler,
                                                  intptr_t num_args) {
+  ASSERT(num_args > 0);
+#if defined(DEBUG)
+  { Label ok;
+    // Check that the IC data array has NumberOfArgumentsChecked() == num_args.
+    // 'num_args_tested' is stored as an untagged int.
+    __ movq(RCX, FieldAddress(RBX, ICData::num_args_tested_offset()));
+    __ cmpq(RCX, Immediate(num_args));
+    __ j(EQUAL, &ok, Assembler::kNearJump);
+    __ Stop("Incorrect stub for IC data");
+    __ Bind(&ok);
+  }
+#endif  // DEBUG
+
   __ movq(RCX, FieldAddress(RBX, ICData::function_offset()));
-    Label is_hot;
+  Label is_hot;
   if (FlowGraphCompiler::CanOptimize()) {
     ASSERT(FLAG_optimization_counter_threshold > 1);
     // The usage_counter is always less than FLAG_optimization_counter_threshold
@@ -1557,72 +1570,63 @@
   __ incq(FieldAddress(RCX, Function::usage_counter_offset()));
   __ Bind(&is_hot);
 
-  ASSERT(num_args > 0);
-  // Get receiver (first read number of arguments from argument descriptor array
-  // and then access the receiver from the stack).
-  __ movq(RAX, FieldAddress(R10, Array::data_offset()));
-  __ movq(RAX, Address(RSP, RAX, TIMES_4, 0));  // RAX (argument count) is Smi.
-
-  Label get_class_id_as_smi, ic_miss;
-  // RBX: IC data array.
-
-#if defined(DEBUG)
-  { Label ok;
-    // Check that the IC data array has NumberOfArgumentsChecked() == num_args.
-    // 'num_args_tested' is stored as an untagged int.
-    __ movq(RCX, FieldAddress(RBX, ICData::num_args_tested_offset()));
-    __ cmpq(RCX, Immediate(num_args));
-    __ j(EQUAL, &ok, Assembler::kNearJump);
-    __ Stop("Incorrect stub for IC data");
-    __ Bind(&ok);
-  }
-#endif  // DEBUG
-
   // Loop that checks if there is an IC data match.
+  Label loop, update, test, found, get_class_id_as_smi;
   // RBX: IC data object (preserved).
   __ movq(R12, FieldAddress(RBX, ICData::ic_data_offset()));
   // R12: ic_data_array with check entries: classes and target functions.
   __ leaq(R12, FieldAddress(R12, Array::data_offset()));
   // R12: points directly to the first ic data array element.
-  const Immediate raw_null =
-      Immediate(reinterpret_cast<intptr_t>(Object::null()));
-  Label loop, found;
-  if (num_args == 1) {
-    __ call(&get_class_id_as_smi);
-    // RAX: receiver's class id as Smi.
-    __ Bind(&loop);
-    __ movq(R13, Address(R12, 0));  // Get class if (Smi) to check.
-    __ cmpq(RAX, R13);  // Match?
-    __ j(EQUAL, &found, Assembler::kNearJump);
-    __ addq(R12, Immediate(kWordSize * 2));  // Next element (class + target).
-    __ cmpq(R13, Immediate(Smi::RawValue(kIllegalCid)));  // Done?
-    __ j(NOT_EQUAL, &loop, Assembler::kNearJump);
-  } else {
-    Label no_match;
-    __ Bind(&loop);
-    for (int i = 0; i < num_args; i++) {
+
+  // Get the receiver's class ID (first read number of arguments from
+  // argument descriptor array and then access the receiver from the stack).
+  __ movq(RAX, FieldAddress(R10, Array::data_offset()));
+  __ movq(RAX, Address(RSP, RAX, TIMES_4, 0));  // RAX (argument count) is Smi.
+  __ call(&get_class_id_as_smi);
+  // RAX: receiver's class ID as smi.
+  __ movq(R13, Address(R12, 0));  // First class ID (Smi) to check.
+  __ jmp(&test);
+
+  __ Bind(&loop);
+  for (int i = 0; i < num_args; i++) {
+    if (i > 0) {
+      // If not the first, load the next argument's class ID.
       __ movq(RAX, FieldAddress(R10, Array::data_offset()));
       __ movq(RAX, Address(RSP, RAX, TIMES_4, - i * kWordSize));
       __ call(&get_class_id_as_smi);
+      // RAX: next argument class ID (smi).
       __ movq(R13, Address(R12, i * kWordSize));
-      __ cmpq(RAX, R13);  // Class id match?
-      if (i < (num_args - 1)) {
-        __ j(NOT_EQUAL, &no_match);
-      } else {
-        // Last check, all checks before matched.
-        __ j(EQUAL, &found);
-      }
+      // R13: next class ID to check (smi).
     }
-    __ Bind(&no_match);
-    // Each test entry has (1 + num_args) array elements.
-    __ addq(R12, Immediate(kWordSize * (1 + num_args)));  // Next element.
-    __ cmpq(R13, Immediate(Smi::RawValue(kIllegalCid)));  // Done?
-    __ j(NOT_EQUAL, &loop, Assembler::kNearJump);
+    __ cmpq(RAX, R13);  // Class id match?
+    if (i < (num_args - 1)) {
+      __ j(NOT_EQUAL, &update);  // Continue.
+    } else {
+      // Last check, all checks before matched.
+      __ j(EQUAL, &found);  // Break.
+    }
   }
+  __ Bind(&update);
+  // Reload receiver class ID.  It has not been destroyed when num_args == 1.
+  if (num_args > 1) {
+    __ movq(RAX, FieldAddress(R10, Array::data_offset()));
+    __ movq(RAX, Address(RSP, RAX, TIMES_4, 0));
+    __ call(&get_class_id_as_smi);
+  }
+  // Each test entry has (1 + num_args) array elements.
+  const intptr_t entry_size = (num_args + 1) * kWordSize;
+  __ addq(R12, Immediate(entry_size));  // Next entry.
+  __ movq(R13, Address(R12, 0));  // Next class ID.
 
-  __ Bind(&ic_miss);
-  // Compute address of arguments (first read number of arguments from argument
-  // descriptor array and then compute address on the stack).
+  __ Bind(&test);
+  __ cmpq(R13, Immediate(Smi::RawValue(kIllegalCid)));  // Done?
+  __ j(NOT_EQUAL, &loop, Assembler::kNearJump);
+
+  // IC miss.
+  const Immediate raw_null =
+      Immediate(reinterpret_cast<intptr_t>(Object::null()));
+  // Compute address of arguments (first read number of arguments from
+  // argument descriptor array and then compute address on the stack).
   __ movq(RAX, FieldAddress(R10, Array::data_offset()));
   __ leaq(RAX, Address(RSP, RAX, TIMES_4, 0));  // RAX is Smi.
   AssemblerMacros::EnterStubFrame(assembler);
diff --git a/runtime/vm/symbols.cc b/runtime/vm/symbols.cc
index bfb2bea..3547f87 100644
--- a/runtime/vm/symbols.cc
+++ b/runtime/vm/symbols.cc
@@ -94,23 +94,23 @@
 
 
 RawString* Symbols::New(const char* str) {
-  intptr_t width = 0;
-  intptr_t len = Utf8::CodePointCount(str, &width);
+  ASSERT(str != NULL);
+  Utf8::Type type;
+  intptr_t str_len = strlen(str);
+  const uint8_t* utf8_array = reinterpret_cast<const uint8_t*>(str);
+  intptr_t len = Utf8::CodePointCount(utf8_array, str_len, &type);
   Zone* zone = Isolate::Current()->current_zone();
   if (len == 0) {
     return Symbols::New(reinterpret_cast<uint8_t*>(NULL), 0);
-  } else if (width == 1) {
+  }
+  if (type == Utf8::kAscii) {
     uint8_t* characters = zone->Alloc<uint8_t>(len);
-    Utf8::Decode(str, characters, len);
-    return New(characters, len);
-  } else if (width == 2) {
-    uint16_t* characters = zone->Alloc<uint16_t>(len);
-    Utf8::Decode(str, characters, len);
+    Utf8::DecodeToAscii(utf8_array, str_len, characters, len);
     return New(characters, len);
   }
-  ASSERT(width == 4);
-  uint32_t* characters = zone->Alloc<uint32_t>(len);
-  Utf8::Decode(str, characters, len);
+  ASSERT((type == Utf8::kBMP) || (type == Utf8::kSMP));
+  uint16_t* characters = zone->Alloc<uint16_t>(len);
+  Utf8::DecodeToUTF16(utf8_array, str_len, characters, len);
   return New(characters, len);
 }
 
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index 31d01d8..8fb33eb 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -25,6 +25,8 @@
   V(TopLevel, "::")                                                            \
   V(DefaultLabel, ":L")                                                        \
   V(This, "this")                                                              \
+  V(Super, "super")                                                            \
+  V(Call, "call")                                                              \
   V(HasNext, "hasNext")                                                        \
   V(Next, "next")                                                              \
   V(Value, "value")                                                            \
@@ -41,7 +43,7 @@
   V(ThrowNew, "_throwNew")                                                     \
   V(ListLiteralFactoryClass, "_ListLiteralFactory")                            \
   V(ListLiteralFactory, "List.fromLiteral")                                    \
-  V(ListImplementation, "ListImplementation")                                  \
+  V(ListImplementation, "_ListImpl")                                           \
   V(ListFactory, "List.")                                                      \
   V(MapLiteralFactoryClass, "_MapLiteralFactory")                              \
   V(MapLiteralFactory, "Map.fromLiteral")                                      \
@@ -108,10 +110,8 @@
   V(ImmutableArray, "_ImmutableArray")                                         \
   V(OneByteString, "_OneByteString")                                           \
   V(TwoByteString, "_TwoByteString")                                           \
-  V(FourByteString, "_FourByteString")                                         \
   V(ExternalOneByteString, "_ExternalOneByteString")                           \
   V(ExternalTwoByteString, "_ExternalTwoByteString")                           \
-  V(ExternalFourByteString, "_ExternalFourByteString")                         \
   V(Stacktrace, "Stacktrace")                                                  \
   V(JSSyntaxRegExp, "JSSyntaxRegExp")                                          \
   V(Object, "Object")                                                          \
@@ -136,6 +136,8 @@
   V(_ExternalFloat32Array, "_ExternalFloat32Array")                            \
   V(_ExternalFloat64Array, "_ExternalFloat64Array")                            \
   V(_WeakProperty, "_WeakProperty")                                            \
+  V(InvocationMirror, "_InvocationMirror")                                     \
+  V(AllocateInvocationMirror, "_allocateInvocationMirror")                     \
 
 // Contains a list of frequently used strings in a canonicalized form. This
 // list is kept in the vm_isolate in order to share the copy across isolates
diff --git a/runtime/vm/unicode.cc b/runtime/vm/unicode.cc
index d9dca3e..42cd426 100644
--- a/runtime/vm/unicode.cc
+++ b/runtime/vm/unicode.cc
@@ -10,7 +10,7 @@
 
 namespace dart {
 
-static const uint8_t kTrailBytes[256] = {
+static const int8_t kTrailBytes[256] = {
   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -58,6 +58,18 @@
 }
 
 
+static bool IsAsciiSequenceStart(uint8_t code_unit) {
+  // Check is codepoint is <= U+007F
+  return (code_unit <= Utf8::kMaxOneByteChar);
+}
+
+
+static bool IsSmpSequenceStart(uint8_t code_unit) {
+  // Check is codepoint is >= U+10000.
+  return (code_unit >= 0xF0);
+}
+
+
 // Returns true if the code point is a high- or low-surrogate.
 static bool IsSurrogate(uint32_t code_point) {
   return (code_point & 0xfffff800) == 0xd800;
@@ -66,7 +78,7 @@
 
 // Returns true if the code point value is above Plane 17.
 static bool IsOutOfRange(uint32_t code_point) {
-  return code_point > 0x10FFFF;
+  return (code_point > 0x10FFFF);
 }
 
 
@@ -76,47 +88,51 @@
 }
 
 
+void Utf8::ConvertUTF32ToUTF16(int32_t codepoint, uint16_t* dst) {
+  ASSERT(codepoint > kMaxBmpCodepoint);
+  ASSERT(dst != NULL);
+  dst[0] = (Utf8::kLeadOffset + (codepoint >> 10));
+  dst[1] = (0xDC00 + (codepoint & 0x3FF));
+}
+
+
 // Returns a count of the number of UTF-8 trail bytes.
-intptr_t Utf8::CodePointCount(const char* str, intptr_t* width) {
-  bool is_two_byte_string = false;
-  bool is_four_byte_string = false;
+intptr_t Utf8::CodePointCount(const uint8_t* utf8_array,
+                              intptr_t array_len,
+                              Type* type) {
   intptr_t len = 0;
-  for (; *str != '\0'; ++str) {
-    uint8_t code_unit = *str;
+  Type char_type = kAscii;
+  for (intptr_t i = 0; i < array_len; i++) {
+    uint8_t code_unit = utf8_array[i];
     if (!IsTrailByte(code_unit)) {
       ++len;
     }
-    if (code_unit > 0xC3) {  // > U+00FF
-      if (code_unit < 0xF0) {  // < U+10000
-        is_two_byte_string = true;
-      } else {
-        is_four_byte_string = true;
+    if (!IsAsciiSequenceStart(code_unit)) {  // > U+007F
+      if (IsSmpSequenceStart(code_unit)) {  // >= U+10000
+        char_type = kSMP;
+        ++len;
+      } else if (char_type == kAscii) {
+        char_type = kBMP;
       }
     }
   }
-  if (is_four_byte_string) {
-    *width = 4;
-  } else if (is_two_byte_string) {
-    *width = 2;
-  } else {
-    *width = 1;
-  }
+  *type = char_type;
   return len;
 }
 
 
 // Returns true if str is a valid NUL-terminated UTF-8 string.
-bool Utf8::IsValid(const char* str) {
+bool Utf8::IsValid(const uint8_t* utf8_array, intptr_t array_len) {
   intptr_t i = 0;
-  while (str[i] != '\0') {
-    uint32_t ch = str[i] & 0xFF;
+  while (i < array_len) {
+    uint32_t ch = utf8_array[i] & 0xFF;
     intptr_t j = 1;
     if (ch >= 0x80) {
-      uint8_t num_trail_bytes = kTrailBytes[ch];
+      int8_t num_trail_bytes = kTrailBytes[ch];
       bool is_malformed = false;
       for (; j < num_trail_bytes; ++j) {
-        if (str[i + j] != '\0') {
-          uint8_t code_unit = str[i + j];
+        if ((i + j) < array_len) {
+          uint8_t code_unit = utf8_array[i + j];
           is_malformed |= !IsTrailByte(code_unit);
           ch = (ch << 6) + code_unit;
         } else {
@@ -202,15 +218,17 @@
 }
 
 
-intptr_t Utf8::Decode(const char* src, int32_t* dst) {
-  uint32_t ch = src[0] & 0xFF;
-  uint32_t i = 1;
+intptr_t Utf8::Decode(const uint8_t* utf8_array,
+                      intptr_t array_len,
+                      int32_t* dst) {
+  uint32_t ch = utf8_array[0] & 0xFF;
+  intptr_t i = 1;
   if (ch >= 0x80) {
-    uint32_t num_trail_bytes = kTrailBytes[ch];
+    int32_t num_trail_bytes = kTrailBytes[ch];
     bool is_malformed = false;
     for (; i < num_trail_bytes; ++i) {
-      if (src[i] != '\0') {
-        uint8_t code_unit = src[i];
+      if (i < array_len) {
+        uint8_t code_unit = utf8_array[i];
         is_malformed |= !IsTrailByte(code_unit);
         ch = (ch << 6) + code_unit;
       } else {
@@ -233,38 +251,70 @@
 }
 
 
-template<typename T>
-static bool DecodeImpl(const char* src, T* dst, intptr_t len) {
+bool Utf8::DecodeToAscii(const uint8_t* utf8_array,
+                         intptr_t array_len,
+                         uint8_t* dst,
+                         intptr_t len) {
+  if (len < array_len) {
+    return false;  // output overflow
+  }
+#ifdef DEBUG
+  for (intptr_t i = 0; i < array_len; i++) {
+    ASSERT(IsAsciiSequenceStart(utf8_array[i]));
+  }
+#endif
+  memmove(dst, utf8_array, array_len);
+  return true;  // success
+}
+
+
+bool Utf8::DecodeToUTF16(const uint8_t* utf8_array,
+                         intptr_t array_len,
+                         uint16_t* dst,
+                         intptr_t len) {
   intptr_t i = 0;
   intptr_t j = 0;
   intptr_t num_bytes;
-  for (; src[i] != '\0' && j < len; i += num_bytes, ++j) {
+  for (; (i < array_len) && (j < len); i += num_bytes, ++j) {
     int32_t ch;
-    num_bytes = Utf8::Decode(&src[i], &ch);
+    bool is_smp = IsSmpSequenceStart(utf8_array[i]);
+    num_bytes = Utf8::Decode(&utf8_array[i], (array_len - i), &ch);
     if (ch == -1) {
       return false;  // invalid input
     }
-    dst[j] = ch;
+    if (is_smp) {
+      ConvertUTF32ToUTF16(ch, &(dst[j]));
+      j = j + 1;
+    } else {
+      dst[j] = ch;
+    }
   }
-  if (src[i] != '\0' && j == len) {
+  if ((i < array_len) && (j == len)) {
     return false;  // output overflow
   }
   return true;  // success
 }
 
 
-bool Utf8::Decode(const char* src, uint8_t* dst, intptr_t len) {
-  return DecodeImpl(src, dst, len);
-}
-
-
-bool Utf8::Decode(const char* src, uint16_t* dst, intptr_t len) {
-  return DecodeImpl(src, dst, len);
-}
-
-
-bool Utf8::Decode(const char* src, uint32_t* dst, intptr_t len) {
-  return DecodeImpl(src, dst, len);
+bool Utf8::DecodeToUTF32(const uint8_t* utf8_array,
+                         intptr_t array_len,
+                         uint32_t* dst,
+                         intptr_t len) {
+  intptr_t i = 0;
+  intptr_t j = 0;
+  intptr_t num_bytes;
+  for (; (i < array_len) && (j < len); i += num_bytes, ++j) {
+    int32_t ch;
+    num_bytes = Utf8::Decode(&utf8_array[i], (array_len - i), &ch);
+    if (ch == -1) {
+      return false;  // invalid input
+    }
+    dst[j] = ch;
+  }
+  if ((i < array_len) && (j == len)) {
+    return false;  // output overflow
+  }
+  return true;  // success
 }
 
 }  // namespace dart
diff --git a/runtime/vm/unicode.h b/runtime/vm/unicode.h
index ef6b1e3..ce572dc 100644
--- a/runtime/vm/unicode.h
+++ b/runtime/vm/unicode.h
@@ -14,14 +14,27 @@
 
 class Utf8 : AllStatic {
  public:
+  enum Type {
+    kAscii = 0,  // ASCII character set.
+    kBMP,  // Basic Multilingual Plane.
+    kSMP,  // Supplementary Multilingual Plane.
+  };
+
   static const intptr_t kMaxOneByteChar   = 0x7F;
   static const intptr_t kMaxTwoByteChar   = 0x7FF;
   static const intptr_t kMaxThreeByteChar = 0xFFFF;
   static const intptr_t kMaxFourByteChar  = 0x10FFFF;
+  static const intptr_t kMaxBmpCodepoint  = 0xffff;
+  static const int32_t kLeadOffset = (0xD800 - (0x10000 >> 10));
+  static const int32_t kSurrogateOffset = (0x10000 - (0xD800 << 10) - 0xDC00);
 
-  static intptr_t CodePointCount(const char* str, intptr_t* width);
+  static void ConvertUTF32ToUTF16(int32_t codepoint, uint16_t* dst);
+  static intptr_t CodePointCount(const uint8_t* utf8_array,
+                                 intptr_t array_len,
+                                 Type* type);
 
-  static bool IsValid(const char* src);
+  // Returns true if 'utf8_array' is a valid UTF-8 string.
+  static bool IsValid(const uint8_t* utf8_array, intptr_t array_len);
 
   static intptr_t Length(int32_t ch);
   static intptr_t Length(const String& str);
@@ -29,10 +42,30 @@
   static intptr_t Encode(int32_t ch, char* dst);
   static intptr_t Encode(const String& src, char* dst, intptr_t len);
 
-  static intptr_t Decode(const char*, int32_t* ch);
-  static bool Decode(const char* src, uint8_t* dst, intptr_t len);
-  static bool Decode(const char* src, uint16_t* dst, intptr_t len);
-  static bool Decode(const char* src, uint32_t* dst, intptr_t len);
+  static intptr_t Decode(const uint8_t* utf8_array,
+                         intptr_t array_len,
+                         int32_t* ch);
+
+  static bool DecodeToAscii(const uint8_t* utf8_array,
+                            intptr_t array_len,
+                            uint8_t* dst,
+                            intptr_t len);
+  static bool DecodeToUTF16(const uint8_t* utf8_array,
+                            intptr_t array_len,
+                            uint16_t* dst,
+                            intptr_t len);
+  static bool DecodeToUTF32(const uint8_t* utf8_array,
+                            intptr_t array_len,
+                            uint32_t* dst,
+                            intptr_t len);
+  static bool DecodeCStringToUTF32(const char* str,
+                                   uint32_t* dst,
+                                   intptr_t len) {
+    ASSERT(str != NULL);
+    intptr_t array_len = strlen(str);
+    const uint8_t* utf8_array = reinterpret_cast<const uint8_t*>(str);
+    return DecodeToUTF32(utf8_array, array_len, dst, len);
+  }
 };
 
 
diff --git a/runtime/vm/unicode_test.cc b/runtime/vm/unicode_test.cc
index 92c09f7..967e9ca 100644
--- a/runtime/vm/unicode_test.cc
+++ b/runtime/vm/unicode_test.cc
@@ -15,7 +15,7 @@
     uint32_t expected[] = { 0x41, 0xF1, 0x42 };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(is_valid);
     EXPECT(!memcmp(expected, dst, sizeof(expected)));
   }
@@ -25,7 +25,7 @@
     uint32_t expected[] = { 0x4D };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(is_valid);
     EXPECT(!memcmp(expected, dst, sizeof(expected)));
   }
@@ -35,7 +35,7 @@
     uint32_t expected[] = { 0x430 };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(is_valid);
     EXPECT(!memcmp(expected, dst, sizeof(expected)));
   }
@@ -45,7 +45,7 @@
     uint32_t expected[] = { 0x4E8C };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(is_valid);
     EXPECT(!memcmp(expected, dst, sizeof(expected)));
   }
@@ -55,7 +55,7 @@
     uint32_t expected[] = { 0x10302 };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(is_valid);
     EXPECT(!memcmp(expected, dst, sizeof(expected)));
   }
@@ -65,7 +65,7 @@
     uint32_t expected[] = { 0x4D, 0x430, 0x4E8C, 0x10302 };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(is_valid);
     EXPECT(!memcmp(expected, dst, sizeof(expected)));
   }
@@ -80,7 +80,7 @@
                             0x5D1, 0x5E8, 0x5DB, 0x5D4 };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(is_valid);
     EXPECT(!memcmp(expected, dst, sizeof(expected)));
   }
@@ -93,7 +93,7 @@
     uint32_t expected[] = { 0x3BA, 0x1F79, 0x3C3, 0x3BC, 0x3B5 };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(is_valid);
     EXPECT(!memcmp(expected, dst, sizeof(expected)));
   }
@@ -108,7 +108,7 @@
     uint32_t expected[] = { 0x0 };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0xFF, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(is_valid);
     EXPECT(memcmp(expected, dst, sizeof(expected)));
   }
@@ -119,7 +119,7 @@
     uint32_t expected[] = { 0x80 };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(is_valid);
     EXPECT(!memcmp(expected, dst, sizeof(expected)));
   }
@@ -130,7 +130,7 @@
     uint32_t expected[] = { 0x800 };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(is_valid);
     EXPECT(!memcmp(expected, dst, sizeof(expected)));
   }
@@ -141,7 +141,7 @@
     uint32_t expected[] = { 0x10000 };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(is_valid);
     EXPECT(!memcmp(expected, dst, sizeof(expected)));
   }
@@ -152,7 +152,7 @@
     uint32_t expected[] = { 0x200000 };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
     EXPECT(memcmp(expected, dst, sizeof(expected)));
   }
@@ -163,7 +163,7 @@
     uint32_t expected[] = { 0x400000 };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
     EXPECT(memcmp(expected, dst, sizeof(expected)));
   }
@@ -176,7 +176,7 @@
     uint32_t expected[] = { 0x7F };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(is_valid);
     EXPECT(!memcmp(expected, dst, sizeof(expected)));
   }
@@ -187,7 +187,7 @@
     uint32_t expected[] = { 0x7FF };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(is_valid);
     EXPECT(!memcmp(expected, dst, sizeof(expected)));
   }
@@ -198,7 +198,7 @@
     uint32_t expected[] = { 0xFFFF };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(is_valid);
     EXPECT(!memcmp(expected, dst, sizeof(expected)));
   }
@@ -209,7 +209,7 @@
     uint32_t expected[] = { 0x1FFFF };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
     EXPECT(memcmp(expected, dst, sizeof(expected)));
   }
@@ -220,7 +220,7 @@
     uint32_t expected[] = { 0x3FFFFFF };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
     EXPECT(memcmp(expected, dst, sizeof(expected)));
   }
@@ -231,7 +231,7 @@
     uint32_t expected[] = { 0x7FFFFFF };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
     EXPECT(memcmp(expected, dst, sizeof(expected)));
   }
@@ -244,7 +244,7 @@
     uint32_t expected[] = { 0xD7FF };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(is_valid);
     EXPECT(!memcmp(expected, dst, sizeof(expected)));
   }
@@ -255,7 +255,7 @@
     uint32_t expected[] = { 0xE000 };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(is_valid);
     EXPECT(!memcmp(expected, dst, sizeof(expected)));
   }
@@ -266,7 +266,7 @@
     uint32_t expected[] = { 0xFFFD };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(is_valid);
     EXPECT(!memcmp(expected, dst, sizeof(expected)));
   }
@@ -277,7 +277,7 @@
     uint32_t expected[] = { 0x10FFFF };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(is_valid);
     EXPECT(!memcmp(expected, dst, sizeof(expected)));
   }
@@ -288,7 +288,7 @@
     uint32_t expected[] = { 0x110000 };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
     EXPECT(memcmp(expected, dst, sizeof(expected)));
   }
@@ -303,7 +303,7 @@
     uint32_t expected[] = { 0x80 };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
     EXPECT(memcmp(expected, dst, sizeof(expected)));
   }
@@ -314,7 +314,7 @@
     uint32_t expected[] = { 0xBF };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
     EXPECT(memcmp(expected, dst, sizeof(expected)));
   }
@@ -325,7 +325,7 @@
     uint32_t expected[] = { 0x80, 0xBF };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
     EXPECT(memcmp(expected, dst, sizeof(expected)));
   }
@@ -336,7 +336,7 @@
     uint32_t expected[] = { 0x80, 0xBF, 0x80 };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
     EXPECT(memcmp(expected, dst, sizeof(expected)));
   }
@@ -347,7 +347,7 @@
     uint32_t expected[] = { 0x80, 0xBF, 0x80, 0xBF  };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
     EXPECT(memcmp(expected, dst, sizeof(expected)));
   }
@@ -358,7 +358,7 @@
     uint32_t expected[] = { 0x80, 0xBF, 0x80, 0xBF, 0x80 };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
     EXPECT(memcmp(expected, dst, sizeof(expected)));
   }
@@ -369,7 +369,7 @@
     uint32_t expected[] = { 0x80, 0xBF, 0x80, 0xBF, 0x80, 0xBF };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
     EXPECT(memcmp(expected, dst, sizeof(expected)));
   }
@@ -380,7 +380,7 @@
     uint32_t expected[] = { 0x80, 0xBF, 0x80, 0xBF, 0x80, 0xBF, 0x80 };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
     EXPECT(memcmp(expected, dst, sizeof(expected)));
   }
@@ -399,7 +399,7 @@
     uint32_t dst[ARRAY_SIZE(expected)];
     for (size_t i = 0; i < strlen(src); ++i) {
       memset(dst, 0xFF, sizeof(dst));
-      bool is_valid = Utf8::Decode(&src[i], dst, ARRAY_SIZE(dst));
+      bool is_valid = Utf8::DecodeCStringToUTF32(&src[i], dst, ARRAY_SIZE(dst));
       EXPECT(!is_valid);
       EXPECT(memcmp(expected, dst, sizeof(expected)));
     }
@@ -422,7 +422,7 @@
     uint32_t dst[ARRAY_SIZE(expected)];
     for (size_t i = 0; i < strlen(src); i += 2) {
       memset(dst, 0xFF, sizeof(dst));
-      bool is_valid = Utf8::Decode(&src[i], dst, ARRAY_SIZE(dst));
+      bool is_valid = Utf8::DecodeCStringToUTF32(&src[i], dst, ARRAY_SIZE(dst));
       EXPECT(!is_valid);
       EXPECT(memcmp(expected, dst, sizeof(expected)));
     }
@@ -439,7 +439,7 @@
     uint32_t dst[ARRAY_SIZE(expected)];
     for (size_t i = 0; i < strlen(src); i += 2) {
       memset(dst, 0xFF, sizeof(dst));
-      bool is_valid = Utf8::Decode(&src[i], dst, ARRAY_SIZE(dst));
+      bool is_valid = Utf8::DecodeCStringToUTF32(&src[i], dst, ARRAY_SIZE(dst));
       EXPECT(!is_valid);
       EXPECT(memcmp(expected, dst, sizeof(expected)));
     }
@@ -454,7 +454,7 @@
     uint32_t dst[ARRAY_SIZE(expected)];
     for (size_t i = 0; i < strlen(src); i += 2) {
       memset(dst, 0xFF, sizeof(dst));
-      bool is_valid = Utf8::Decode(&src[i], dst, ARRAY_SIZE(dst));
+      bool is_valid = Utf8::DecodeCStringToUTF32(&src[i], dst, ARRAY_SIZE(dst));
       EXPECT(!is_valid);
       EXPECT(memcmp(expected, dst, sizeof(expected)));
     }
@@ -468,7 +468,7 @@
     uint32_t dst[ARRAY_SIZE(expected)];
     for (size_t i = 0; i < strlen(src); i += 2) {
       memset(dst, 0xFF, sizeof(dst));
-      bool is_valid = Utf8::Decode(&src[i], dst, ARRAY_SIZE(dst));
+      bool is_valid = Utf8::DecodeCStringToUTF32(&src[i], dst, ARRAY_SIZE(dst));
       EXPECT(!is_valid);
       EXPECT(memcmp(expected, dst, sizeof(expected)));
     }
@@ -482,7 +482,7 @@
     uint32_t dst[ARRAY_SIZE(expected)];
     for (size_t i = 0; i < strlen(src); i += 2) {
       memset(dst, 0xFF, sizeof(dst));
-      bool is_valid = Utf8::Decode(&src[i], dst, ARRAY_SIZE(dst));
+      bool is_valid = Utf8::DecodeCStringToUTF32(&src[i], dst, ARRAY_SIZE(dst));
       EXPECT(!is_valid);
       EXPECT(memcmp(expected, dst, sizeof(expected)));
     }
@@ -496,7 +496,7 @@
     uint32_t expected[] = { 0x0 };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0xFF, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
     EXPECT(memcmp(expected, dst, sizeof(expected)));
   }
@@ -507,7 +507,7 @@
     uint32_t expected[] = { 0x0 };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0xFF, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
     EXPECT(memcmp(expected, dst, sizeof(expected)));
   }
@@ -518,7 +518,7 @@
     uint32_t expected[] = { 0x0 };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0xFF, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
     EXPECT(memcmp(expected, dst, sizeof(expected)));
   }
@@ -529,7 +529,7 @@
     uint32_t expected[] = { 0x0 };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0xFF, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
     EXPECT(memcmp(expected, dst, sizeof(expected)));
   }
@@ -541,7 +541,7 @@
     uint32_t expected[] = { 0x0 };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0xFF, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
     EXPECT(memcmp(expected, dst, sizeof(expected)));
   }
@@ -552,7 +552,7 @@
     uint32_t expected[] = { 0x0 };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0xFF, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
     EXPECT(memcmp(expected, dst, sizeof(expected)));
   }
@@ -563,7 +563,7 @@
     uint32_t expected[] = { 0x0 };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0xFF, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
     EXPECT(memcmp(expected, dst, sizeof(expected)));
   }
@@ -574,7 +574,7 @@
     uint32_t expected[] = { 0x0 };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0xFF, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
     EXPECT(memcmp(expected, dst, sizeof(expected)));
   }
@@ -586,7 +586,7 @@
     uint32_t expected[] = { 0x0 };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0xFF, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
     EXPECT(memcmp(expected, dst, sizeof(expected)));
   }
@@ -598,7 +598,7 @@
     uint32_t expected[] = { 0x0 };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0xFF, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
     EXPECT(memcmp(expected, dst, sizeof(expected)));
   }
@@ -615,7 +615,8 @@
     for (size_t i = 0; i < strlen(src); ++i) {
       for (size_t j = 1; j < (strlen(src) - i); ++j) {
         memset(dst, 0xFF, sizeof(dst));
-        bool is_valid = Utf8::Decode(&src[i], dst, ARRAY_SIZE(dst));
+        bool is_valid = Utf8::DecodeCStringToUTF32(&src[i],
+                                                   dst, ARRAY_SIZE(dst));
         EXPECT(!is_valid);
         EXPECT(memcmp(expected, dst, sizeof(expected)));
       }
@@ -630,7 +631,7 @@
     uint32_t expected[] = { 0xFE };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
     EXPECT(memcmp(expected, dst, sizeof(expected)));
   }
@@ -641,7 +642,7 @@
     uint32_t expected[] = { 0xFF };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
     EXPECT(memcmp(expected, dst, sizeof(expected)));
   }
@@ -652,7 +653,7 @@
     uint32_t expected[] = { 0xFF };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
     EXPECT(memcmp(expected, dst, sizeof(expected)));
   }
@@ -667,7 +668,7 @@
     uint32_t expected[] = { 0x2F };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
     EXPECT(memcmp(expected, dst, sizeof(expected)));
   }
@@ -678,7 +679,7 @@
     uint32_t expected[] = { 0x2F };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
     EXPECT(memcmp(expected, dst, sizeof(expected)));
   }
@@ -689,7 +690,7 @@
     uint32_t expected[] = { 0x2F };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
     EXPECT(memcmp(expected, dst, sizeof(expected)));
   }
@@ -700,7 +701,7 @@
     uint32_t expected[] = { 0x2F };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
     EXPECT(memcmp(expected, dst, sizeof(expected)));
   }
@@ -711,7 +712,7 @@
     uint32_t expected[] = { 0x2F };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
     EXPECT(memcmp(expected, dst, sizeof(expected)));
   }
@@ -724,7 +725,7 @@
     uint32_t expected[] = { 0x7F };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
     EXPECT(memcmp(expected, dst, sizeof(expected)));
   }
@@ -735,7 +736,7 @@
     uint32_t expected[] = { 0x7FF };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
     EXPECT(memcmp(expected, dst, sizeof(expected)));
   }
@@ -746,7 +747,7 @@
     uint32_t expected[] = { 0xFFFF };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
     EXPECT(memcmp(expected, dst, sizeof(expected)));
   }
@@ -757,7 +758,7 @@
     uint32_t expected[] = { 0x1FFFFF };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
     EXPECT(memcmp(expected, dst, sizeof(expected)));
   }
@@ -768,7 +769,7 @@
     uint32_t expected[] = { 0x3FFFFFF };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
     EXPECT(memcmp(expected, dst, sizeof(expected)));
   }
@@ -781,7 +782,7 @@
     uint32_t expected[] = { 0x0 };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0xFF, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
     EXPECT(memcmp(expected, dst, sizeof(expected)));
   }
@@ -792,7 +793,7 @@
     uint32_t expected[] = { 0x0 };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0xFF, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
     EXPECT(memcmp(expected, dst, sizeof(expected)));
   }
@@ -803,7 +804,7 @@
     uint32_t expected[] = { 0x0 };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0xFF, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
     EXPECT(memcmp(expected, dst, sizeof(expected)));
   }
@@ -814,7 +815,7 @@
     uint32_t expected[] = { 0x0 };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0xFF, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
     EXPECT(memcmp(expected, dst, sizeof(expected)));
   }
@@ -825,7 +826,7 @@
     uint32_t expected[] = { 0x0 };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0xFF, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
     EXPECT(memcmp(expected, dst, sizeof(expected)));
   }
@@ -838,7 +839,7 @@
     uint32_t expected[] = { 0xD800 };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
     EXPECT(memcmp(expected, dst, sizeof(expected)));
   }
@@ -849,7 +850,7 @@
     uint32_t expected[] = { 0xDB7F };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
     EXPECT(memcmp(expected, dst, sizeof(expected)));
   }
@@ -860,7 +861,7 @@
     uint32_t expected[] = { 0xDB80 };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
     EXPECT(memcmp(expected, dst, sizeof(expected)));
   }
@@ -871,7 +872,7 @@
     uint32_t expected[] = { 0xDBFF };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
     EXPECT(memcmp(expected, dst, sizeof(expected)));
   }
@@ -882,7 +883,7 @@
     uint32_t expected[] = { 0xDC00 };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
     EXPECT(memcmp(expected, dst, sizeof(expected)));
   }
@@ -893,7 +894,7 @@
     uint32_t expected[] = { 0xDF80 };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
     EXPECT(memcmp(expected, dst, sizeof(expected)));
   }
@@ -904,7 +905,7 @@
     uint32_t expected[] = { 0xDFFF };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
     EXPECT(memcmp(expected, dst, sizeof(expected)));
   }
@@ -917,7 +918,7 @@
     uint32_t expected[] = { 0xD800, 0xDC00 };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
     EXPECT(memcmp(expected, dst, sizeof(expected)));
   }
@@ -928,7 +929,7 @@
     uint32_t expected[] = { 0xD800, 0xDFFF };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
     EXPECT(memcmp(expected, dst, sizeof(expected)));
   }
@@ -939,7 +940,7 @@
     uint32_t expected[] = { 0xDB7F, 0xDC00 };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
     EXPECT(memcmp(expected, dst, sizeof(expected)));
   }
@@ -950,7 +951,7 @@
     uint32_t expected[] = { 0xDB7F, 0xDFFF };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
     EXPECT(memcmp(expected, dst, sizeof(expected)));
   }
@@ -961,7 +962,7 @@
     uint32_t expected[] = { 0xDB80, 0xDC00 };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
     EXPECT(memcmp(expected, dst, sizeof(expected)));
   }
@@ -972,7 +973,7 @@
     uint32_t expected[] = { 0xDB80, 0xDFFF };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
     EXPECT(memcmp(expected, dst, sizeof(expected)));
   }
@@ -983,7 +984,7 @@
     uint32_t expected[] = { 0xDBFF, 0xDC00 };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
     EXPECT(memcmp(expected, dst, sizeof(expected)));
   }
@@ -994,7 +995,7 @@
     uint32_t expected[] = { 0xDBFF, 0xDFFF };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
     EXPECT(memcmp(expected, dst, sizeof(expected)));
   }
@@ -1007,7 +1008,7 @@
     uint32_t expected[] = { 0xFFFE };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(is_valid);
     EXPECT(!memcmp(expected, dst, sizeof(expected)));
   }
@@ -1018,7 +1019,7 @@
     uint32_t expected[] = { 0xFFFF };
     uint32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
-    bool is_valid = Utf8::Decode(src, dst, ARRAY_SIZE(dst));
+    bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(is_valid);
     EXPECT(!memcmp(expected, dst, sizeof(expected)));
   }
diff --git a/runtime/vm/unit_test.cc b/runtime/vm/unit_test.cc
index 4f10eae..6b0594f 100644
--- a/runtime/vm/unit_test.cc
+++ b/runtime/vm/unit_test.cc
@@ -53,7 +53,7 @@
   if (!Dart_IsLibrary(library)) {
     return Dart_Error("not a library");
   }
-  if (!Dart_IsString8(url)) {
+  if (!Dart_IsString(url)) {
     return Dart_Error("url is not a string");
   }
   const char* url_chars = NULL;
@@ -100,8 +100,8 @@
 
 Dart_Handle TestCase::LoadTestScript(const char* script,
                                      Dart_NativeEntryResolver resolver) {
-  Dart_Handle url = Dart_NewString(TestCase::url());
-  Dart_Handle source = Dart_NewString(script);
+  Dart_Handle url = NewString(TestCase::url());
+  Dart_Handle source = NewString(script);
   Dart_Handle result = Dart_SetLibraryTagHandler(LibraryTagHandler);
   EXPECT_VALID(result);
   EXPECT_VALID(result);
@@ -114,7 +114,7 @@
 
 
 Dart_Handle TestCase::lib() {
-  Dart_Handle url = Dart_NewString(TestCase::url());
+  Dart_Handle url = NewString(TestCase::url());
   Dart_Handle lib = Dart_LookupLibrary(url);
   DART_CHECK_VALID(lib);
   ASSERT(Dart_IsLibrary(lib));
diff --git a/runtime/vm/unit_test.h b/runtime/vm/unit_test.h
index 1a21e38..713c272 100644
--- a/runtime/vm/unit_test.h
+++ b/runtime/vm/unit_test.h
@@ -132,6 +132,11 @@
   }
 
 
+inline Dart_Handle NewString(const char* str) {
+  return Dart_NewStringFromCString(str);
+}
+
+
 namespace dart {
 
 // Forward declarations.
diff --git a/runtime/vm/vm.gypi b/runtime/vm/vm.gypi
index 8b8776e..f84916f 100644
--- a/runtime/vm/vm.gypi
+++ b/runtime/vm/vm.gypi
@@ -9,6 +9,7 @@
     'corelib_patch_cc_file': '<(SHARED_INTERMEDIATE_DIR)/corelib_patch_gen.cc',
     'corelib_impl_cc_file': '<(SHARED_INTERMEDIATE_DIR)/corelib_impl_gen.cc',
     'corelib_impl_patch_cc_file': '<(SHARED_INTERMEDIATE_DIR)/corelib_impl_patch_gen.cc',
+    'collection_cc_file': '<(SHARED_INTERMEDIATE_DIR)/collection_gen.cc',
     'math_cc_file': '<(SHARED_INTERMEDIATE_DIR)/math_gen.cc',
     'math_patch_cc_file': '<(SHARED_INTERMEDIATE_DIR)/math_patch_gen.cc',
     'mirrors_cc_file': '<(SHARED_INTERMEDIATE_DIR)/mirrors_gen.cc',
@@ -68,6 +69,7 @@
         'generate_corelib_patch_cc_file',
         'generate_corelib_impl_cc_file',
         'generate_corelib_impl_patch_cc_file',
+        'generate_collection_cc_file',
         'generate_math_cc_file',
         'generate_math_patch_cc_file',
         'generate_isolate_cc_file',
@@ -91,6 +93,7 @@
         '<(corelib_patch_cc_file)',
         '<(corelib_impl_cc_file)',
         '<(corelib_impl_patch_cc_file)',
+        '<(collection_cc_file)',
         '<(math_cc_file)',
         '<(math_patch_cc_file)',
         '<(isolate_cc_file)',
@@ -274,6 +277,44 @@
       ]
     },
     {
+      'target_name': 'generate_collection_cc_file',
+      'type': 'none',
+      'includes': [
+        # Load the shared collection library sources.
+        '../../lib/collection/collection_sources.gypi',
+      ],
+      'sources/': [
+        # Exclude all .[cc|h] files.
+        # This is only here for reference. Excludes happen after
+        # variable expansion, so the script has to do its own
+        # exclude processing of the sources being passed.
+        ['exclude', '\\.cc|h$'],
+      ],
+      'actions': [
+        {
+          'action_name': 'generate_collection_cc',
+          'inputs': [
+            '../tools/create_string_literal.py',
+            '<(builtin_in_cc_file)',
+            '<@(_sources)',
+          ],
+          'outputs': [
+            '<(collection_cc_file)',
+          ],
+          'action': [
+            'python',
+            'tools/create_string_literal.py',
+            '--output', '<(collection_cc_file)',
+            '--input_cc', '<(builtin_in_cc_file)',
+            '--include', 'vm/bootstrap.h',
+            '--var_name', 'dart::Bootstrap::collection_source_',
+            '<@(_sources)',
+          ],
+          'message': 'Generating ''<(collection_cc_file)'' file.'
+        },
+      ]
+    },
+    {
       'target_name': 'generate_math_cc_file',
       'type': 'none',
       'includes': [
diff --git a/tests/benchmark_smoke/benchmark_smoke.status b/tests/benchmark_smoke/benchmark_smoke.status
index 52cbda4..0616efe 100644
--- a/tests/benchmark_smoke/benchmark_smoke.status
+++ b/tests/benchmark_smoke/benchmark_smoke.status
@@ -16,9 +16,3 @@
 
 [ $compiler == dart2js && $runtime == none ]
 *: Fail, Pass # TODO(ahe): Triage these tests.
-
-[ $compiler == dart2js && $runtime == drt && $checked ]
-benchmark_smoke_test: Fail # TypeError: Object #<HTMLParagraphElement> has no method 'get$text'
-
-[ $runtime == ie9 && $compiler == dart2js && $checked ]
-benchmark_smoke_test: Fail
diff --git a/tests/co19/co19-compiler.status b/tests/co19/co19-compiler.status
index 631e9a4..25470a6 100644
--- a/tests/co19/co19-compiler.status
+++ b/tests/co19/co19-compiler.status
@@ -3,6 +3,7 @@
 # BSD-style license that can be found in the LICENSE file.
 
 [ $compiler == dartc ]
+Language/03_Overview/1_Scoping_A02_t05: Fail # TODO(analyzer-team): Please triage this failure.
 Language/03_Overview/1_Scoping_A02_t06: Fail # TODO(analyzer-team): Please triage this failure.
 Language/03_Overview/2_Privacy_A01_t04: Fail # TODO(analyzer-team): Please triage this failure.
 Language/03_Overview/2_Privacy_A01_t05: Fail # TODO(analyzer-team): Please triage this failure.
@@ -10,93 +11,85 @@
 Language/03_Overview/2_Privacy_A01_t10: Fail # TODO(analyzer-team): Please triage this failure.
 Language/03_Overview/2_Privacy_A01_t19: Fail # TODO(analyzer-team): Please triage this failure.
 Language/03_Overview/2_Privacy_A01_t20: Fail # TODO(analyzer-team): Please triage this failure.
-Language/05_Variables/05_Variables_A03_t11: Fail # TODO(analyzer-team): Please triage this failure.
-Language/05_Variables/05_Variables_A03_t12: Fail # TODO(analyzer-team): Please triage this failure.
-Language/05_Variables/05_Variables_A03_t13: Fail # TODO(analyzer-team): Please triage this failure.
-Language/05_Variables/05_Variables_A03_t14: Fail # TODO(analyzer-team): Please triage this failure.
-Language/05_Variables/05_Variables_A03_t15: Fail # TODO(analyzer-team): Please triage this failure.
+Language/05_Variables/05_Variables_A05_t11: Fail # TODO(analyzer-team): Please triage this failure.
+Language/05_Variables/05_Variables_A05_t12: Fail # TODO(analyzer-team): Please triage this failure.
+Language/05_Variables/05_Variables_A05_t13: Fail # TODO(analyzer-team): Please triage this failure.
+Language/05_Variables/05_Variables_A05_t14: Fail # TODO(analyzer-team): Please triage this failure.
+Language/05_Variables/05_Variables_A05_t15: Fail # TODO(analyzer-team): Please triage this failure.
+Language/05_Variables/05_Variables_A06_t01: Fail # TODO(analyzer-team): Please triage this failure.
+Language/05_Variables/05_Variables_A11_t01: Fail # TODO(analyzer-team): Please triage this failure.
 Language/05_Variables/1_Evaluation_of_Implicit_Variable_Getters_A01_t05: Fail # TODO(analyzer-team): Please triage this failure.
 Language/06_Functions/1_Function_Declaration_A02_t03: Fail # TODO(analyzer-team): Please triage this failure.
 Language/06_Functions/1_Function_Declaration_A03_t03: Fail # TODO(analyzer-team): Please triage this failure.
 Language/06_Functions/2_Formal_Parameters_A02_t01: Fail # TODO(analyzer-team): Please triage this failure.
-Language/07_Classes/1_Instance_Methods_A02_t03: Fail # TODO(analyzer-team): Please triage this failure.
-Language/07_Classes/1_Instance_Methods_A02_t04: Fail # TODO(analyzer-team): Please triage this failure.
-Language/07_Classes/1_Instance_Methods_A02_t06: Fail # TODO(analyzer-team): Please triage this failure.
-Language/07_Classes/4_Abstract_Instance_Members_A04_t02: Fail # TODO(analyzer-team): Please triage this failure.
-Language/07_Classes/4_Abstract_Instance_Members_A04_t04: Fail # TODO(analyzer-team): Please triage this failure.
 Language/07_Classes/6_Constructors/2_Factories_A05_t02: Fail # TODO(analyzer-team): Please triage this failure.
 Language/07_Classes/6_Constructors/2_Factories_A05_t04: Fail # TODO(analyzer-team): Please triage this failure.
 Language/08_Interfaces/5_Superinterfaces_A01_t02: Fail # TODO(analyzer-team): Please triage this failure.
-Language/10_Expressions/01_Constants_A03_t01: Fail # TODO(analyzer-team): Please triage this failure.
-Language/10_Expressions/01_Constants_A05_t01: Fail # TODO(analyzer-team): Please triage this failure.
-Language/10_Expressions/01_Constants_A14_t01: Fail # TODO(analyzer-team): Please triage this failure.
-Language/10_Expressions/05_Strings/1_String_Interpolation_A01_t06: Fail # TODO(analyzer-team): Please triage this failure.
-Language/10_Expressions/05_Strings/1_String_Interpolation_A01_t07: Fail # TODO(analyzer-team): Please triage this failure.
-Language/10_Expressions/05_Strings/1_String_Interpolation_A01_t13: Fail # TODO(analyzer-team): Please triage this failure.
-Language/10_Expressions/08_Throw_A05_t01: Fail # TODO(analyzer-team): Please triage this failure.
-Language/10_Expressions/09_Function_Expressions_A03_t02: Fail # TODO(analyzer-team): Please triage this failure.
-Language/10_Expressions/09_Function_Expressions_A04_t02: Fail # TODO(analyzer-team): Please triage this failure.
-Language/10_Expressions/11_Instance_Creation/1_New_A02_t07: Fail # TODO(analyzer-team): Please triage this failure.
-Language/10_Expressions/11_Instance_Creation/1_New_A06_t06: Fail # TODO(analyzer-team): Please triage this failure.
-Language/10_Expressions/11_Instance_Creation/2_Const_A10_t01: Fail # TODO(analyzer-team): Please triage this failure.
-Language/10_Expressions/11_Instance_Creation_A02_t01: Fail # TODO(analyzer-team): Please triage this failure.
-Language/10_Expressions/17_Getter_Invocation_A02_t01: Fail # TODO(analyzer-team): Please triage this failure.
-Language/10_Expressions/17_Getter_Invocation_A02_t02: Fail # TODO(analyzer-team): Please triage this failure.
-Language/10_Expressions/18_Assignment_A05_t02: Fail # TODO(analyzer-team): Please triage this failure.
-Language/10_Expressions/18_Assignment_A05_t04: Fail # TODO(analyzer-team): Please triage this failure.
-Language/10_Expressions/18_Assignment_A05_t05: Fail # TODO(analyzer-team): Please triage this failure.
-Language/10_Expressions/18_Assignment_A08_t04: Fail # TODO(analyzer-team): Please triage this failure.
-Language/10_Expressions/19_Conditional_A01_t14: Fail # TODO(analyzer-team): Please triage this failure.
-Language/10_Expressions/19_Conditional_A01_t15: Fail # TODO(analyzer-team): Please triage this failure.
-Language/10_Expressions/20_Logical_Boolean_Expressions_A01_t14: Fail # TODO(analyzer-team): Please triage this failure.
-Language/10_Expressions/21_Bitwise_Expressions_A01_t16: Fail # TODO(analyzer-team): Please triage this failure.
-Language/10_Expressions/21_Bitwise_Expressions_A01_t17: Fail # TODO(analyzer-team): Please triage this failure.
-Language/10_Expressions/22_Equality_A01_t23: Fail # TODO(analyzer-team): Please triage this failure.
-Language/10_Expressions/22_Equality_A01_t24: Fail # TODO(analyzer-team): Please triage this failure.
-Language/10_Expressions/23_Relational_Expressions_A01_t22: Fail # TODO(analyzer-team): Please triage this failure.
-Language/10_Expressions/23_Relational_Expressions_A01_t23: Fail # TODO(analyzer-team): Please triage this failure.
-Language/10_Expressions/24_Shift_A01_t13: Fail # TODO(analyzer-team): Please triage this failure.
-Language/10_Expressions/24_Shift_A01_t14: Fail # TODO(analyzer-team): Please triage this failure.
-Language/10_Expressions/25_Additive_Expressions_A01_t11: Fail # TODO(analyzer-team): Please triage this failure.
-Language/10_Expressions/25_Additive_Expressions_A01_t12: Fail # TODO(analyzer-team): Please triage this failure.
-Language/10_Expressions/25_Additive_Expressions_A01_t13: Fail # TODO(analyzer-team): Please triage this failure.
-Language/10_Expressions/25_Additive_Expressions_A01_t14: Fail # TODO(analyzer-team): Please triage this failure.
-Language/10_Expressions/26_Multiplicative_Expressions_A01_t14: Fail # TODO(analyzer-team): Please triage this failure.
-Language/10_Expressions/26_Multiplicative_Expressions_A01_t15: Fail # TODO(analyzer-team): Please triage this failure.
-Language/10_Expressions/26_Multiplicative_Expressions_A01_t16: Fail # TODO(analyzer-team): Please triage this failure.
-Language/10_Expressions/26_Multiplicative_Expressions_A01_t17: Fail # TODO(analyzer-team): Please triage this failure.
-Language/10_Expressions/27_Unary_Expressions_A01_t04: Fail # TODO(analyzer-team): Please triage this failure.
-Language/10_Expressions/27_Unary_Expressions_A01_t05: Fail # TODO(analyzer-team): Please triage this failure.
-Language/10_Expressions/27_Unary_Expressions_A01_t17: Fail # TODO(analyzer-team): Please triage this failure.
-Language/10_Expressions/27_Unary_Expressions_A01_t18: Fail # TODO(analyzer-team): Please triage this failure.
-Language/10_Expressions/27_Unary_Expressions_A01_t19: Fail # TODO(analyzer-team): Please triage this failure.
-Language/10_Expressions/27_Unary_Expressions_A01_t20: Fail # TODO(analyzer-team): Please triage this failure.
-Language/10_Expressions/27_Unary_Expressions_A01_t21: Fail # TODO(analyzer-team): Please triage this failure.
-Language/10_Expressions/27_Unary_Expressions_A01_t22: Fail # TODO(analyzer-team): Please triage this failure.
-Language/10_Expressions/28_Postfix_Expressions_A01_t02: Fail # TODO(analyzer-team): Please triage this failure.
-Language/10_Expressions/28_Postfix_Expressions_A01_t05: Fail # TODO(analyzer-team): Please triage this failure.
-Language/10_Expressions/29_Assignable_Expressions_A01_t08: Fail # TODO(analyzer-team): Please triage this failure.
-Language/10_Expressions/29_Assignable_Expressions_A01_t09: Fail # TODO(analyzer-team): Please triage this failure.
-Language/10_Expressions/30_Identifier_Reference_A05_t04: Fail # TODO(analyzer-team): Please triage this failure.
-Language/10_Expressions/30_Identifier_Reference_A06_t02: Fail # TODO(analyzer-team): Please triage this failure.
-Language/10_Expressions/30_Identifier_Reference_A07_t01: Fail # TODO(analyzer-team): Please triage this failure.
-Language/10_Expressions/30_Identifier_Reference_A13_t01: Fail # TODO(analyzer-team): Please triage this failure.
-Language/10_Expressions/31_Type_Test_A01_t02: Fail # TODO(analyzer-team): Please triage this failure.
-Language/10_Expressions/31_Type_Test_A01_t04: Fail # TODO(analyzer-team): Please triage this failure.
-Language/10_Expressions/32_Type_Cast_A01_t04: Fail # TODO(analyzer-team): Please triage this failure.
-Language/11_Statements/02_Expression_Statements_A01_t12: Fail # TODO(analyzer-team): Please triage this failure.
-Language/11_Statements/03_Variable_Declaration_A01_t05: Fail # TODO(analyzer-team): Please triage this failure.
-Language/11_Statements/03_Variable_Declaration_A01_t06: Fail # TODO(analyzer-team): Please triage this failure.
-Language/11_Statements/03_Variable_Declaration_A01_t09: Fail # TODO(analyzer-team): Please triage this failure.
-Language/11_Statements/03_Variable_Declaration_A01_t10: Fail # TODO(analyzer-team): Please triage this failure.
-Language/11_Statements/03_Variable_Declaration_A01_t16: Fail # TODO(analyzer-team): Please triage this failure.
-Language/11_Statements/03_Variable_Declaration_A01_t17: Fail # TODO(analyzer-team): Please triage this failure.
-Language/11_Statements/03_Variable_Declaration_A01_t18: Fail # TODO(analyzer-team): Please triage this failure.
-Language/11_Statements/03_Variable_Declaration_A01_t19: Fail # TODO(analyzer-team): Please triage this failure.
-Language/11_Statements/06_For_A01_t07: Fail # TODO(analyzer-team): Please triage this failure.
-Language/11_Statements/06_For_A01_t11: Fail # TODO(analyzer-team): Please triage this failure.
-Language/11_Statements/09_Switch_A02_t03: Fail # TODO(analyzer-team): Please triage this failure.
-Language/11_Statements/09_Switch_A06_t02: Fail # TODO(analyzer-team): Please triage this failure.
+Language/09_Generics/09_Generics_A05_t01: Fail # TODO(analyzer-team): Please triage this failure.
+Language/09_Generics/09_Generics_A05_t02: Fail # TODO(analyzer-team): Please triage this failure.
+Language/11_Expressions/01_Constants_A03_t01: Fail # TODO(analyzer-team): Please triage this failure.
+Language/11_Expressions/01_Constants_A05_t01: Fail # TODO(analyzer-team): Please triage this failure.
+Language/11_Expressions/01_Constants_A14_t01: Fail # TODO(analyzer-team): Please triage this failure.
+Language/11_Expressions/05_Strings/1_String_Interpolation_A01_t06: Fail # TODO(analyzer-team): Please triage this failure.
+Language/11_Expressions/05_Strings/1_String_Interpolation_A01_t07: Fail # TODO(analyzer-team): Please triage this failure.
+Language/11_Expressions/05_Strings/1_String_Interpolation_A01_t13: Fail # TODO(analyzer-team): Please triage this failure.
+Language/11_Expressions/08_Throw_A05_t01: Fail # TODO(analyzer-team): Please triage this failure.
+Language/11_Expressions/11_Instance_Creation/1_New_A02_t07: Fail # TODO(analyzer-team): Please triage this failure.
+Language/11_Expressions/11_Instance_Creation/1_New_A06_t06: Fail # TODO(analyzer-team): Please triage this failure.
+Language/11_Expressions/11_Instance_Creation/2_Const_A10_t01: Fail # TODO(analyzer-team): Please triage this failure.
+Language/11_Expressions/11_Instance_Creation_A02_t01: Fail # TODO(analyzer-team): Please triage this failure.
+Language/11_Expressions/18_Assignment_A05_t05: Fail # TODO(analyzer-team): Please triage this failure.
+Language/11_Expressions/19_Conditional_A01_t14: Fail # TODO(analyzer-team): Please triage this failure.
+Language/11_Expressions/19_Conditional_A01_t15: Fail # TODO(analyzer-team): Please triage this failure.
+Language/11_Expressions/20_Logical_Boolean_Expressions_A01_t14: Fail # TODO(analyzer-team): Please triage this failure.
+Language/11_Expressions/21_Bitwise_Expressions_A01_t16: Fail # TODO(analyzer-team): Please triage this failure.
+Language/11_Expressions/21_Bitwise_Expressions_A01_t17: Fail # TODO(analyzer-team): Please triage this failure.
+Language/11_Expressions/22_Equality_A01_t23: Fail # TODO(analyzer-team): Please triage this failure.
+Language/11_Expressions/22_Equality_A01_t24: Fail # TODO(analyzer-team): Please triage this failure.
+Language/11_Expressions/23_Relational_Expressions_A01_t22: Fail # TODO(analyzer-team): Please triage this failure.
+Language/11_Expressions/23_Relational_Expressions_A01_t23: Fail # TODO(analyzer-team): Please triage this failure.
+Language/11_Expressions/24_Shift_A01_t13: Fail # TODO(analyzer-team): Please triage this failure.
+Language/11_Expressions/24_Shift_A01_t14: Fail # TODO(analyzer-team): Please triage this failure.
+Language/11_Expressions/25_Additive_Expressions_A01_t11: Fail # TODO(analyzer-team): Please triage this failure.
+Language/11_Expressions/25_Additive_Expressions_A01_t12: Fail # TODO(analyzer-team): Please triage this failure.
+Language/11_Expressions/25_Additive_Expressions_A01_t13: Fail # TODO(analyzer-team): Please triage this failure.
+Language/11_Expressions/25_Additive_Expressions_A01_t14: Fail # TODO(analyzer-team): Please triage this failure.
+Language/11_Expressions/26_Multiplicative_Expressions_A01_t14: Fail # TODO(analyzer-team): Please triage this failure.
+Language/11_Expressions/26_Multiplicative_Expressions_A01_t15: Fail # TODO(analyzer-team): Please triage this failure.
+Language/11_Expressions/26_Multiplicative_Expressions_A01_t16: Fail # TODO(analyzer-team): Please triage this failure.
+Language/11_Expressions/26_Multiplicative_Expressions_A01_t17: Fail # TODO(analyzer-team): Please triage this failure.
+Language/11_Expressions/27_Unary_Expressions_A01_t04: Fail # TODO(analyzer-team): Please triage this failure.
+Language/11_Expressions/27_Unary_Expressions_A01_t05: Fail # TODO(analyzer-team): Please triage this failure.
+Language/11_Expressions/27_Unary_Expressions_A01_t17: Fail # TODO(analyzer-team): Please triage this failure.
+Language/11_Expressions/27_Unary_Expressions_A01_t18: Fail # TODO(analyzer-team): Please triage this failure.
+Language/11_Expressions/27_Unary_Expressions_A01_t19: Fail # TODO(analyzer-team): Please triage this failure.
+Language/11_Expressions/27_Unary_Expressions_A01_t20: Fail # TODO(analyzer-team): Please triage this failure.
+Language/11_Expressions/27_Unary_Expressions_A01_t21: Fail # TODO(analyzer-team): Please triage this failure.
+Language/11_Expressions/27_Unary_Expressions_A01_t22: Fail # TODO(analyzer-team): Please triage this failure.
+Language/11_Expressions/28_Postfix_Expressions_A01_t02: Fail # TODO(analyzer-team): Please triage this failure.
+Language/11_Expressions/28_Postfix_Expressions_A01_t05: Fail # TODO(analyzer-team): Please triage this failure.
+Language/11_Expressions/29_Assignable_Expressions_A01_t08: Fail # TODO(analyzer-team): Please triage this failure.
+Language/11_Expressions/29_Assignable_Expressions_A01_t09: Fail # TODO(analyzer-team): Please triage this failure.
+Language/11_Expressions/30_Identifier_Reference_A05_t04: Fail # TODO(analyzer-team): Please triage this failure.
+Language/11_Expressions/30_Identifier_Reference_A06_t02: Fail # TODO(analyzer-team): Please triage this failure.
+Language/11_Expressions/30_Identifier_Reference_A07_t01: Fail # TODO(analyzer-team): Please triage this failure.
+Language/11_Expressions/30_Identifier_Reference_A13_t01: Fail # TODO(analyzer-team): Please triage this failure.
+Language/11_Expressions/31_Type_Test_A01_t02: Fail # TODO(analyzer-team): Please triage this failure.
+Language/11_Expressions/31_Type_Test_A01_t04: Fail # TODO(analyzer-team): Please triage this failure.
+Language/11_Expressions/32_Type_Cast_A01_t04: Fail # TODO(analyzer-team): Please triage this failure.
+Language/12_Statements/02_Expression_Statements_A01_t12: Fail # TODO(analyzer-team): Please triage this failure.
+Language/12_Statements/03_Variable_Declaration_A01_t05: Fail # TODO(analyzer-team): Please triage this failure.
+Language/12_Statements/03_Variable_Declaration_A01_t06: Fail # TODO(analyzer-team): Please triage this failure.
+Language/12_Statements/03_Variable_Declaration_A01_t09: Fail # TODO(analyzer-team): Please triage this failure.
+Language/12_Statements/03_Variable_Declaration_A01_t10: Fail # TODO(analyzer-team): Please triage this failure.
+Language/12_Statements/03_Variable_Declaration_A01_t16: Fail # TODO(analyzer-team): Please triage this failure.
+Language/12_Statements/03_Variable_Declaration_A01_t17: Fail # TODO(analyzer-team): Please triage this failure.
+Language/12_Statements/03_Variable_Declaration_A01_t18: Fail # TODO(analyzer-team): Please triage this failure.
+Language/12_Statements/03_Variable_Declaration_A01_t19: Fail # TODO(analyzer-team): Please triage this failure.
+Language/12_Statements/06_For_A01_t07: Fail # TODO(analyzer-team): Please triage this failure.
+Language/12_Statements/06_For_A01_t11: Fail # TODO(analyzer-team): Please triage this failure.
+Language/12_Statements/09_Switch_A02_t03: Fail # TODO(analyzer-team): Please triage this failure.
+Language/12_Statements/09_Switch_A06_t02: Fail # TODO(analyzer-team): Please triage this failure.
 Language/13_Libraries_and_Scripts/1_Imports_A01_t51: Fail # TODO(analyzer-team): Please triage this failure.
 Language/13_Libraries_and_Scripts/1_Imports_A01_t52: Fail # TODO(analyzer-team): Please triage this failure.
 Language/13_Libraries_and_Scripts/1_Imports_A02_t03: Fail # TODO(analyzer-team): Please triage this failure.
@@ -137,37 +130,36 @@
 Language/06_Functions/4_External_Functions_A01_t01: pass # http://dartbug.com/5179
 Language/07_Classes/10_Superinterfaces_A07_t01: pass # http://dartbug.com/5179
 Language/08_Interfaces/5_Superinterfaces/1_Inheritance_and_Overriding_A01_t02: pass # http://dartbug.com/5179
-Language/10_Expressions/05_Strings/1_String_Interpolation_A03_t02: pass # http://dartbug.com/5179
-Language/10_Expressions/05_Strings/1_String_Interpolation_A04_t02: pass # http://dartbug.com/5179
-Language/10_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t03: pass # http://dartbug.com/5179
-Language/10_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t04: pass # http://dartbug.com/5179
-Language/10_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t05: pass # http://dartbug.com/5179
-Language/10_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t07: pass # http://dartbug.com/5179
-Language/10_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A02_t01: pass # http://dartbug.com/5179
-Language/10_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A03_t01: pass # http://dartbug.com/5179
-Language/10_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A05_t02: pass # http://dartbug.com/5179
-Language/10_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t07: pass # http://dartbug.com/5179
-Language/10_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A08_t01: pass # http://dartbug.com/5179
-Language/10_Expressions/15_Method_Invocation/2_Cascaded_Invocation_A02_t02: pass # http://dartbug.com/5179
-Language/10_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t02: pass # http://dartbug.com/5179
-Language/10_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t03: pass # http://dartbug.com/5179
-Language/10_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t07: pass # http://dartbug.com/5179
-Language/10_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t08: pass # http://dartbug.com/5179
-Language/10_Expressions/15_Method_Invocation/3_Static_Invocation_A05_t01: pass # http://dartbug.com/5179
-Language/10_Expressions/15_Method_Invocation/3_Static_Invocation_A06_t02: pass # http://dartbug.com/5179
-Language/10_Expressions/15_Method_Invocation/4_Super_Invocation_A02_t04: pass # http://dartbug.com/5179
-Language/10_Expressions/15_Method_Invocation/4_Super_Invocation_A03_t02: pass # http://dartbug.com/5179
-Language/10_Expressions/15_Method_Invocation/4_Super_Invocation_A03_t03: pass # http://dartbug.com/5179
-Language/10_Expressions/15_Method_Invocation/4_Super_Invocation_A06_t01: pass # http://dartbug.com/5179
-Language/10_Expressions/15_Method_Invocation/4_Super_Invocation_A06_t02: pass # http://dartbug.com/5179
-Language/10_Expressions/15_Method_Invocation/4_Super_Invocation_A07_t01: pass # http://dartbug.com/5179
-Language/10_Expressions/15_Method_Invocation/4_Super_Invocation_A08_t02: pass # http://dartbug.com/5179
-Language/10_Expressions/30_Identifier_Reference_A04_t05: pass # http://dartbug.com/5179
-Language/10_Expressions/30_Identifier_Reference_A04_t07: pass # http://dartbug.com/5179
-Language/10_Expressions/30_Identifier_Reference_A05_t06: pass # http://dartbug.com/5179
+Language/11_Expressions/05_Strings/1_String_Interpolation_A03_t02: pass # http://dartbug.com/5179
+Language/11_Expressions/05_Strings/1_String_Interpolation_A04_t02: pass # http://dartbug.com/5179
+Language/11_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t03: pass # http://dartbug.com/5179
+Language/11_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t04: pass # http://dartbug.com/5179
+Language/11_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t05: pass # http://dartbug.com/5179
+Language/11_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t07: pass # http://dartbug.com/5179
+Language/11_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A02_t01: pass # http://dartbug.com/5179
+Language/11_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A03_t01: pass # http://dartbug.com/5179
+Language/11_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A05_t02: pass # http://dartbug.com/5179
+Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t07: pass # http://dartbug.com/5179
+Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A08_t01: pass # http://dartbug.com/5179
+Language/11_Expressions/15_Method_Invocation/2_Cascaded_Invocation_A02_t02: pass # http://dartbug.com/5179
+Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t02: pass # http://dartbug.com/5179
+Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t03: pass # http://dartbug.com/5179
+Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t07: pass # http://dartbug.com/5179
+Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t08: pass # http://dartbug.com/5179
+Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A05_t01: pass # http://dartbug.com/5179
+Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A06_t02: pass # http://dartbug.com/5179
+Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A02_t04: pass # http://dartbug.com/5179
+Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A03_t02: pass # http://dartbug.com/5179
+Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A03_t03: pass # http://dartbug.com/5179
+Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A06_t01: pass # http://dartbug.com/5179
+Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A06_t02: pass # http://dartbug.com/5179
+Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A07_t01: pass # http://dartbug.com/5179
+Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A08_t02: pass # http://dartbug.com/5179
+Language/11_Expressions/30_Identifier_Reference_A04_t05: pass # http://dartbug.com/5179
+Language/11_Expressions/30_Identifier_Reference_A04_t07: pass # http://dartbug.com/5179
+Language/11_Expressions/30_Identifier_Reference_A05_t06: pass # http://dartbug.com/5179
 Language/13_Libraries_and_Scripts/13_Libraries_and_Scripts_A05_t01: pass # http://dartbug.com/5179
 
-Language/07_Classes/2_Getters_A01_t05: Fail # No issue: waiting to remove old getter syntax
 Language/07_Classes/3_Setters_A04_t03: Fail, OK # getter and method with the same name
 Language/07_Classes/3_Setters_A04_t06: Fail OK # getter and method with the same name
 
@@ -175,17 +167,66 @@
 Language/07_Classes/07_Classes_A07_t03: Fail, OK
 Language/07_Classes/07_Classes_A07_t06: Fail, OK
 
+# co19 issue 298
+Language/03_Overview/1_Scoping_A03_t02: Fail, OK
+Language/03_Overview/2_Privacy_A01_t01: Fail, OK
+Language/03_Overview/2_Privacy_A01_t02: Fail, OK
+Language/03_Overview/2_Privacy_A01_t06: Fail, OK
+Language/03_Overview/2_Privacy_A01_t07: Fail, OK
+Language/03_Overview/2_Privacy_A01_t12: Fail, OK
+Language/03_Overview/2_Privacy_A01_t16: Fail, OK
+Language/07_Classes/07_Classes_A02_t01: Fail, OK
+Language/07_Classes/07_Classes_A03_t01: Fail, OK
+Language/07_Classes/07_Classes_A02_t34: Fail, OK
+Language/07_Classes/07_Classes_A03_t04: Fail, OK
+Language/07_Classes/07_Classes_A03_t10: Fail, OK
+Language/07_Classes/07_Classes_A07_t10: Fail, OK
+Language/07_Classes/1_Instance_Methods_A05_t02: Fail, OK
+Language/07_Classes/9_Superclasses/1_Inheritance_and_Overriding_A02_t04: Fail, OK
+Language/08_Interfaces/5_Superinterfaces/1_Inheritance_and_Overriding_A01_t01: Fail, OK
+Language/08_Interfaces/5_Superinterfaces/1_Inheritance_and_Overriding_A02_t05: Fail, OK
+Language/11_Expressions/15_Method_Invocation/2_Cascaded_Invocation_A01_t01: Fail, OK
+Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A03_t07: Fail, OK
+Language/11_Expressions/16_Getter_Lookup_A02_t04: Fail, OK
+Language/11_Expressions/18_Assignment_A04_t05: Fail, OK
+Language/11_Expressions/23_Relational_Expressions_A01_t01: Fail, OK
+Language/11_Expressions/24_Shift_A01_t01: Fail, OK
+Language/11_Expressions/30_Identifier_Reference_A12_t01: Fail, OK
+Language/13_Libraries_and_Scripts/13_Libraries_and_Scripts_A01_t01: Fail, OK
+Language/13_Libraries_and_Scripts/1_Imports_A02_t02: Fail, OK
+Language/13_Libraries_and_Scripts/1_Imports_A02_t01: Fail, OK
+Language/13_Libraries_and_Scripts/1_Imports_A02_t04: Fail, OK
+Language/13_Libraries_and_Scripts/1_Imports_A02_t06: Fail, OK
+Language/13_Libraries_and_Scripts/1_Imports_A02_t11: Fail, OK
+Language/13_Libraries_and_Scripts/1_Imports_A02_t14: Fail, OK
+Language/13_Libraries_and_Scripts/1_Imports_A02_t16: Fail, OK
+Language/13_Libraries_and_Scripts/1_Imports_A02_t17: Fail, OK
+Language/13_Libraries_and_Scripts/1_Imports_A02_t20: Fail, OK
+Language/13_Libraries_and_Scripts/3_Parts_A02_t04: Fail, OK
+
+
+# co19 issue 218
+Language/10_Expressions/28_Identifier_Reference_A08_t38: Fail, OK
+
+# co19 issue 270
+Language/13_Libraries_and_Scripts/3_Includes_A01_t14: Fail, OK
+Language/13_Libraries_and_Scripts/3_Includes_A02_t03: Fail, OK
+Language/13_Libraries_and_Scripts/3_Includes_A02_t04: Fail, OK
+Language/13_Libraries_and_Scripts/4_Scripts_A01_t16: Fail, OK
+
+
+
+Language/10_Expressions/30_Type_Cast_A01_t04: Fail, OK # the expected error is not specified
 Language/13_Libraries_and_Scripts/13_Libraries_and_Scripts_A05_t03: Fail, OK # contains syntax error
 Language/13_Libraries_and_Scripts/13_Libraries_and_Scripts_A05_t04: Fail, OK # contains syntax error
 Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A03_t02: Fail, OK # deprecated parameter syntax
-Language/10_Expressions/15_Method_Invocation/4_Super_Invocation_A04_t03: Fail # Issue 5294
-Language/10_Expressions/15_Method_Invocation/4_Super_Invocation_A04_t04: Fail # Issue 5294
+Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A04_t04: Fail # Issue 5294
 
 # The following tests use NoSuchMethodException instead of NoSuchMethodError.
 Language/06_Functions/4_External_Functions_A01_t01: Fail, OK # co19 issue 195
-Language/10_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t07: Fail, OK # co19 issue 195
-Language/10_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t08: Fail, OK # co19 issue 195
-Language/10_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A05_t02: Fail, OK # co19 issue 195
+Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t07: Fail, OK # co19 issue 195
+Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t08: Fail, OK # co19 issue 195
+Language/11_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A05_t02: Fail, OK # co19 issue 195
 Language/13_Libraries_and_Scripts/13_Libraries_and_Scripts_A05_t01: Fail, OK # co19 issue 195
 
 # Rename "BadNumberFormatException" to "FormatException"
@@ -193,35 +234,29 @@
 # http://code.google.com/p/co19/issues/detail?id=167 is fixed.
 
 Language/03_Overview/1_Scoping_A02_t28: Fail # language change 1031
-Language/07_Classes/2_Getters_A01_t03: Fail, OK # out of date - getters are not allowed to have parameters
 Language/07_Classes/6_Constructors/1_Generative_Constructors_A15_t07: Fail # Issue 3323
 Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t01: Fail # Issue 2477
 Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t02: Fail # Issue 2477
 Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t03: Fail # Issue 2477
-Language/10_Expressions/01_Constants_A16_t01: Fail # Issue 1473
-Language/10_Expressions/01_Constants_A16_t02: Fail # Issue 1473
-Language/10_Expressions/01_Constants_A16_t03: Fail # Issue 1473
-Language/10_Expressions/01_Constants_A17_t03: Fail # Issue 1473
-Language/10_Expressions/05_Strings/1_String_Interpolation_A01_t05: Fail # language change 3368
-Language/10_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t02: Fail # Issue 3524
-Language/10_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t03: Fail # Issue 3524
-Language/10_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t05: Fail # Issue 3524
-Language/10_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t06: Fail # Issue 3524
-Language/10_Expressions/15_Method_Invocation/4_Super_Invocation_A04_t01: Fail # Issue 3524
-Language/10_Expressions/15_Method_Invocation/4_Super_Invocation_A04_t02: Fail # Issue 3524
-Language/10_Expressions/19_Conditional_A01_t12: Fail # language change 3368
-Language/10_Expressions/19_Conditional_A01_t13: Fail # language change 3368
-Language/10_Expressions/20_Logical_Boolean_Expressions_A01_t12: Fail # language change 3368
-Language/10_Expressions/20_Logical_Boolean_Expressions_A01_t13: Fail # language change 3368
-Language/10_Expressions/21_Bitwise_Expressions_A01_t14: Fail # language change 3368
-Language/10_Expressions/21_Bitwise_Expressions_A01_t15: Fail # language change 3368
-Language/10_Expressions/22_Equality_A01_t19: Fail # language change 3368
-Language/10_Expressions/22_Equality_A01_t20: Fail # language change 3368
-Language/10_Expressions/22_Equality_A02_t03: Fail, OK # co19 issue 169
-Language/10_Expressions/23_Relational_Expressions_A01_t20: Fail # language change 3368
-Language/10_Expressions/23_Relational_Expressions_A01_t21: Fail # language change 3368
-Language/10_Expressions/24_Shift_A01_t11: Fail # language change 3368
-Language/10_Expressions/24_Shift_A01_t12: Fail # language change 3368
+Language/11_Expressions/01_Constants_A16_t01: Fail # Issue 1473
+Language/11_Expressions/01_Constants_A16_t02: Fail # Issue 1473
+Language/11_Expressions/01_Constants_A16_t03: Fail # Issue 1473
+Language/11_Expressions/01_Constants_A17_t03: Fail # Issue 1473
+Language/11_Expressions/05_Strings/1_String_Interpolation_A01_t05: Fail # language change 3368
+Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t03: Fail # Issue 3524
+Language/11_Expressions/19_Conditional_A01_t12: Fail # language change 3368
+Language/11_Expressions/19_Conditional_A01_t13: Fail # language change 3368
+Language/11_Expressions/20_Logical_Boolean_Expressions_A01_t12: Fail # language change 3368
+Language/11_Expressions/20_Logical_Boolean_Expressions_A01_t13: Fail # language change 3368
+Language/11_Expressions/21_Bitwise_Expressions_A01_t14: Fail # language change 3368
+Language/11_Expressions/21_Bitwise_Expressions_A01_t15: Fail # language change 3368
+Language/11_Expressions/22_Equality_A01_t19: Fail # language change 3368
+Language/11_Expressions/22_Equality_A01_t20: Fail # language change 3368
+Language/11_Expressions/22_Equality_A02_t03: Fail, OK # co19 issue 169
+Language/11_Expressions/23_Relational_Expressions_A01_t20: Fail # language change 3368
+Language/11_Expressions/23_Relational_Expressions_A01_t21: Fail # language change 3368
+Language/11_Expressions/24_Shift_A01_t11: Fail # language change 3368
+Language/11_Expressions/24_Shift_A01_t12: Fail # language change 3368
 
 # The following tests use hashCode() (function) instead of hashCode (getter).
 # co19 issue 273
@@ -237,50 +272,49 @@
 LibTest/core/Queue/iterator_next_A02_t01: Fail, OK # co19 issue 288
 
 Language/06_Functions/3_Type_of_a_Function_A01_t01: Fail, OK
-Language/10_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t07: Fail, OK
-Language/10_Expressions/15_Method_Invocation/4_Super_Invocation_A03_t02: Fail, OK
-Language/10_Expressions/15_Method_Invocation/3_Static_Invocation_A06_t02: Fail, OK
-Language/10_Expressions/15_Method_Invocation/4_Super_Invocation_A07_t01: Fail, OK
-Language/10_Expressions/15_Method_Invocation/3_Static_Invocation_A05_t01: Fail, OK
-Language/10_Expressions/15_Method_Invocation/4_Super_Invocation_A03_t03: Fail, OK
-Language/10_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t02: Fail, OK
-Language/10_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A08_t01: Fail, OK
-Language/10_Expressions/15_Method_Invocation/4_Super_Invocation_A06_t01: Fail, OK
-Language/10_Expressions/15_Method_Invocation/4_Super_Invocation_A08_t02: Fail, OK
-Language/10_Expressions/15_Method_Invocation/4_Super_Invocation_A06_t02: Fail, OK
-Language/10_Expressions/15_Method_Invocation/2_Cascaded_Invocation_A02_t02: Fail, OK
-Language/10_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t03: Fail, OK
-Language/10_Expressions/15_Method_Invocation/4_Super_Invocation_A02_t04: Fail, OK
-Language/10_Expressions/21_Bitwise_Expressions_A01_t15: Fail, OK
-Language/10_Expressions/19_Conditional_A01_t13: Fail, OK
-Language/10_Expressions/20_Logical_Boolean_Expressions_A01_t12: Fail, OK
-Language/10_Expressions/21_Bitwise_Expressions_A01_t14: Fail, OK
-Language/10_Expressions/23_Relational_Expressions_A01_t21: Fail, OK
-Language/10_Expressions/22_Equality_A01_t19: Fail, OK
-Language/10_Expressions/01_Constants_A17_t03: Fail, OK
-Language/10_Expressions/05_Strings/1_String_Interpolation_A04_t02: Fail, OK
-Language/10_Expressions/05_Strings/1_String_Interpolation_A03_t02: Fail, OK
-Language/10_Expressions/05_Strings/1_String_Interpolation_A01_t05: Fail, OK
-Language/10_Expressions/24_Shift_A01_t11: Fail, OK
-Language/10_Expressions/20_Logical_Boolean_Expressions_A01_t13: Fail, OK
-Language/10_Expressions/22_Equality_A01_t20: Fail, OK
-Language/10_Expressions/30_Identifier_Reference_A04_t07: Fail, OK
-Language/10_Expressions/30_Identifier_Reference_A04_t05: Fail, OK
-Language/10_Expressions/01_Constants_A16_t02: Fail, OK
-Language/10_Expressions/23_Relational_Expressions_A01_t20: Fail, OK
-Language/10_Expressions/30_Identifier_Reference_A05_t06: Fail, OK
-Language/10_Expressions/01_Constants_A15_t16: Fail, OK
-Language/10_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t04: Fail, OK
-Language/10_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t07: Fail, OK
-Language/10_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t03: Fail, OK
-Language/10_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A03_t01: Fail, OK
-Language/10_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A02_t01: Fail, OK
-Language/10_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t05: Fail, OK
-Language/10_Expressions/19_Conditional_A01_t12: Fail, OK
-Language/10_Expressions/01_Constants_A16_t03: Fail, OK
-Language/10_Expressions/01_Constants_A16_t01: Fail, OK
-Language/10_Expressions/24_Shift_A01_t12: Fail, OK
-Language/07_Classes/2_Getters_A01_t03: Fail, OK
+Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t07: Fail, OK
+Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A03_t02: Fail, OK
+Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A06_t02: Fail, OK
+Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A07_t01: Fail, OK
+Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A05_t01: Fail, OK
+Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A03_t03: Fail, OK
+Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t02: Fail, OK
+Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A08_t01: Fail, OK
+Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A06_t01: Fail, OK
+Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A08_t02: Fail, OK
+Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A06_t02: Fail, OK
+Language/11_Expressions/15_Method_Invocation/2_Cascaded_Invocation_A02_t02: Fail, OK
+Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t03: Fail, OK
+Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A02_t04: Fail, OK
+Language/11_Expressions/21_Bitwise_Expressions_A01_t15: Fail, OK
+Language/11_Expressions/19_Conditional_A01_t13: Fail, OK
+Language/11_Expressions/20_Logical_Boolean_Expressions_A01_t12: Fail, OK
+Language/11_Expressions/21_Bitwise_Expressions_A01_t14: Fail, OK
+Language/11_Expressions/23_Relational_Expressions_A01_t21: Fail, OK
+Language/11_Expressions/22_Equality_A01_t19: Fail, OK
+Language/11_Expressions/01_Constants_A17_t03: Fail, OK
+Language/11_Expressions/05_Strings/1_String_Interpolation_A04_t02: Fail, OK
+Language/11_Expressions/05_Strings/1_String_Interpolation_A03_t02: Fail, OK
+Language/11_Expressions/05_Strings/1_String_Interpolation_A01_t05: Fail, OK
+Language/11_Expressions/24_Shift_A01_t11: Fail, OK
+Language/11_Expressions/20_Logical_Boolean_Expressions_A01_t13: Fail, OK
+Language/11_Expressions/22_Equality_A01_t20: Fail, OK
+Language/11_Expressions/30_Identifier_Reference_A04_t07: Fail, OK
+Language/11_Expressions/30_Identifier_Reference_A04_t05: Fail, OK
+Language/11_Expressions/01_Constants_A16_t02: Fail, OK
+Language/11_Expressions/23_Relational_Expressions_A01_t20: Fail, OK
+Language/11_Expressions/30_Identifier_Reference_A05_t06: Fail, OK
+Language/11_Expressions/01_Constants_A15_t16: Fail, OK
+Language/11_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t04: Fail, OK
+Language/11_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t07: Fail, OK
+Language/11_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t03: Fail, OK
+Language/11_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A03_t01: Fail, OK
+Language/11_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A02_t01: Fail, OK
+Language/11_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t05: Fail, OK
+Language/11_Expressions/19_Conditional_A01_t12: Fail, OK
+Language/11_Expressions/01_Constants_A16_t03: Fail, OK
+Language/11_Expressions/01_Constants_A16_t01: Fail, OK
+Language/11_Expressions/24_Shift_A01_t12: Fail, OK
 Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t02: Fail, OK
 Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t03: Fail, OK
 Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t01: Fail, OK
diff --git a/tests/co19/co19-dart2dart.status b/tests/co19/co19-dart2dart.status
index be87353..05deb6f 100644
--- a/tests/co19/co19-dart2dart.status
+++ b/tests/co19/co19-dart2dart.status
@@ -3,15 +3,47 @@
 # BSD-style license that can be found in the LICENSE file.
 
 [ $compiler == dart2dart ]
+# Calling unresolved class constructor:
+Language/03_Overview/2_Privacy_A01_t19: Fail
+Language/03_Overview/2_Privacy_A01_t20: Fail
+Language/07_Classes/6_Constructors_A03_t03: Fail
+Language/11_Expressions/11_Instance_Creation/1_New_A06_t04: Fail
+Language/11_Expressions/11_Instance_Creation/1_New_A06_t05: Fail
+Language/11_Expressions/11_Instance_Creation/1_New_A06_t06: Fail
+
+# Renaming type from platform library:
+Language/09_Generics/09_Generics_A02_t01: Fail
+Language/14_Types/4_Interface_Types_A10_t03: Fail
+
+
 Language/13_Libraries_and_Scripts/2_Exports_A04_t02: Crash # TODO(dart2dart-team): Please triage this crash.
 Language/13_Libraries_and_Scripts/2_Exports_A04_t03: Crash # TODO(dart2dart-team): Please triage this crash.
+Language/12_Statements/10_Try_A06_t01: Fail, Pass # Fails in minified, TRIAGE
 
-Language/05_Variables/05_Variables_A03_t09: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/05_Variables/05_Variables_A03_t11: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/05_Variables/05_Variables_A03_t12: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/05_Variables/05_Variables_A03_t13: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/05_Variables/05_Variables_A03_t14: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/05_Variables/05_Variables_A03_t15: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/03_Overview/1_Scoping_A02_t05: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/05_Variables/05_Variables_A05_t04: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/05_Variables/05_Variables_A05_t05: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/05_Variables/05_Variables_A05_t06: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/05_Variables/05_Variables_A05_t07: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/05_Variables/05_Variables_A05_t08: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/05_Variables/05_Variables_A05_t09: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/05_Variables/05_Variables_A05_t10: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/05_Variables/05_Variables_A05_t11: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/05_Variables/05_Variables_A05_t12: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/05_Variables/05_Variables_A05_t13: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/05_Variables/05_Variables_A05_t14: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/05_Variables/05_Variables_A05_t15: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/05_Variables/05_Variables_A07_t01: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/05_Variables/05_Variables_A07_t02: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/05_Variables/05_Variables_A07_t03: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/05_Variables/05_Variables_A07_t04: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/05_Variables/05_Variables_A07_t05: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/05_Variables/05_Variables_A07_t06: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/05_Variables/05_Variables_A07_t07: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/05_Variables/05_Variables_A07_t08: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/05_Variables/05_Variables_A07_t10: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/05_Variables/05_Variables_A08_t01: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/05_Variables/05_Variables_A08_t02: Fail # TODO(dart2dart-team): Please triage this failure.
 Language/05_Variables/1_Evaluation_of_Implicit_Variable_Getters_A01_t02: Fail # TODO(dart2dart-team): Please triage this failure.
 Language/05_Variables/1_Evaluation_of_Implicit_Variable_Getters_A01_t05: Fail # TODO(dart2dart-team): Please triage this failure.
 Language/07_Classes/1_Instance_Methods_A06_t01: Fail # TODO(dart2dart-team): Please triage this failure.
@@ -19,52 +51,50 @@
 Language/07_Classes/6_Constructors/2_Factories_A05_t02: Fail # TODO(dart2dart-team): Please triage this failure.
 Language/07_Classes/6_Constructors/2_Factories_A05_t03: Fail # TODO(dart2dart-team): Please triage this failure.
 Language/07_Classes/6_Constructors/2_Factories_A05_t04: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/10_Expressions/01_Constants_A03_t01: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/10_Expressions/01_Constants_A20_t01: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/10_Expressions/01_Constants_A20_t02: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/10_Expressions/09_Function_Expressions_A03_t02: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/10_Expressions/09_Function_Expressions_A04_t02: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/10_Expressions/30_Identifier_Reference_A04_t09: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/10_Expressions/30_Identifier_Reference_A05_t01: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/10_Expressions/30_Identifier_Reference_A05_t04: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/10_Expressions/30_Identifier_Reference_A05_t12: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/10_Expressions/30_Identifier_Reference_A06_t01: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/10_Expressions/30_Identifier_Reference_A06_t02: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/10_Expressions/30_Identifier_Reference_A08_t02: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/10_Expressions/31_Type_Test_A01_t02: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/10_Expressions/31_Type_Test_A01_t04: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/10_Expressions/31_Type_Test_A04_t01: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/10_Expressions/32_Type_Cast_A01_t04: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/10_Expressions/32_Type_Cast_A03_t01: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/10_Expressions/32_Type_Cast_A03_t02: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/10_Expressions/32_Type_Cast_A05_t01: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/10_Expressions/32_Type_Cast_A05_t02: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/10_Expressions/32_Type_Cast_A05_t04: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/11_Statements/03_Variable_Declaration_A04_t02: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/11_Statements/03_Variable_Declaration_A04_t03: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/11_Statements/03_Variable_Declaration_A04_t04: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/11_Statements/03_Variable_Declaration_A04_t05: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/11_Statements/03_Variable_Declaration_A04_t06: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/11_Statements/04_Local_Function_Declaration_A01_t01: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/11_Statements/04_Local_Function_Declaration_A02_t02: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/11_Statements/06_For_A01_t11: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/11_Statements/06_For_A01_t12: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/11_Statements/09_Switch_A01_t02: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/11_Statements/09_Switch_A02_t01: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/11_Statements/09_Switch_A02_t02: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/11_Statements/09_Switch_A02_t03: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/11_Statements/09_Switch_A03_t01: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/11_Statements/09_Switch_A03_t02: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/11_Statements/09_Switch_A06_t02: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/11_Statements/10_Try_A07_t03: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/11_Statements/10_Try_A11_t01: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/11_Statements/11_Return_A05_t01: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/11_Statements/11_Return_A05_t02: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/11_Statements/11_Return_A05_t03: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/11_Statements/12_Labels_A01_t03: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/11_Statements/12_Labels_A03_t04: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/11_Statements/14_Continue_A02_t12: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/11_Statements/14_Continue_A02_t13: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/11_Expressions/01_Constants_A03_t01: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/11_Expressions/01_Constants_A20_t01: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/11_Expressions/01_Constants_A20_t02: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/11_Expressions/30_Identifier_Reference_A04_t09: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/11_Expressions/30_Identifier_Reference_A05_t01: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/11_Expressions/30_Identifier_Reference_A05_t04: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/11_Expressions/30_Identifier_Reference_A05_t12: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/11_Expressions/30_Identifier_Reference_A06_t01: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/11_Expressions/30_Identifier_Reference_A06_t02: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/11_Expressions/30_Identifier_Reference_A08_t02: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/11_Expressions/31_Type_Test_A01_t02: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/11_Expressions/31_Type_Test_A01_t04: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/11_Expressions/31_Type_Test_A04_t01: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/11_Expressions/32_Type_Cast_A01_t04: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/11_Expressions/32_Type_Cast_A03_t01: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/11_Expressions/32_Type_Cast_A03_t02: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/11_Expressions/32_Type_Cast_A05_t01: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/11_Expressions/32_Type_Cast_A05_t02: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/11_Expressions/32_Type_Cast_A05_t04: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/12_Statements/03_Variable_Declaration_A04_t02: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/12_Statements/03_Variable_Declaration_A04_t03: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/12_Statements/03_Variable_Declaration_A04_t04: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/12_Statements/03_Variable_Declaration_A04_t05: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/12_Statements/03_Variable_Declaration_A04_t06: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/12_Statements/04_Local_Function_Declaration_A01_t01: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/12_Statements/04_Local_Function_Declaration_A02_t02: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/12_Statements/06_For_A01_t11: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/12_Statements/06_For_A01_t12: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/12_Statements/09_Switch_A01_t02: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/12_Statements/09_Switch_A02_t01: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/12_Statements/09_Switch_A02_t02: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/12_Statements/09_Switch_A02_t03: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/12_Statements/09_Switch_A03_t01: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/12_Statements/09_Switch_A03_t02: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/12_Statements/09_Switch_A06_t02: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/12_Statements/10_Try_A07_t03: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/12_Statements/10_Try_A11_t01: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/12_Statements/11_Return_A05_t01: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/12_Statements/11_Return_A05_t02: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/12_Statements/11_Return_A05_t03: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/12_Statements/12_Labels_A01_t03: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/12_Statements/12_Labels_A03_t04: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/12_Statements/14_Continue_A02_t12: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/12_Statements/14_Continue_A02_t13: Fail # TODO(dart2dart-team): Please triage this failure.
 Language/13_Libraries_and_Scripts/1_Imports_A02_t01: Fail # TODO(dart2dart-team): Please triage this failure.
 Language/13_Libraries_and_Scripts/1_Imports_A02_t02: Fail # TODO(dart2dart-team): Please triage this failure.
 Language/13_Libraries_and_Scripts/1_Imports_A02_t16: Fail # TODO(dart2dart-team): Please triage this failure.
@@ -107,7 +137,9 @@
 
 LibTest/isolate/isolate_api/port_A01_t01: Skip # Times out.
 
-LibTest/core/String/charCodes_A01_t01: Fail, OK # co19 issue 289
+LibTest/core/String/String_class_A02_t01: Fail, OK # co19 issue 284
+LibTest/core/String/charCodeAt_A01_t01: Fail, OK # co19 issue 284
+LibTest/core/String/charCodes_A01_t01: Fail, OK # co19 issue 284
 
 LibTest/isolate/SendPort/send_A02_t02: Fail, OK # co19 issue 293
 LibTest/isolate/SendPort/send_A02_t03: Fail, OK # co19 issue 293
@@ -131,62 +163,20 @@
 LibTest/core/Stopwatch/frequency_A01_t01: Fail, OK # co19 issue 297
 
 
-LibTest/core/Match/end_A01_t01: Fail, OK # co19 issue 294
-LibTest/core/Match/group_A01_t01: Fail, OK # co19 issue 294
-LibTest/core/Match/groupCount_A01_t01: Fail, OK # co19 issue 294
 LibTest/core/Match/operator_subscript_A01_t01: Fail, OK # co19 issue 294
-LibTest/core/Match/start_A01_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/allMatches_A01_t01: Fail, OK # co19 issue 294
 LibTest/core/RegExp/firstMatch_A01_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Assertion_A03_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Assertion_A04_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Assertion_A05_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A01_t01: Fail, OK # co19 issue 294
 LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A02_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A03_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A03_t02: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A03_t03: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A04_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A05_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A06_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_AtomEscape_A01_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Disjunction_A01_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Quantifier_A01_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Quantifier_A02_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Quantifier_A03_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Quantifier_A04_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Quantifier_A05_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Quantifier_A06_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Term_A01_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Term_A02_t01: Fail, OK # co19 issue 294
 LibTest/core/RegExp/Pattern_semantics/firstMatch_Term_A03_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Term_A04_t01: Fail, OK # co19 issue 294
 
-LibTest/core/Queue/filter_A01_t04: Fail, OK # co19 issue 287
 LibTest/core/Map/getValues_A01_t02: Fail, OK # co19 issue 287
 
-LibTest/core/Queue/filter_A01_t04: Fail, OK # co19 issue 291
-LibTest/core/Queue/first_A01_t01: Fail, OK # co19 issue 291
-LibTest/core/Queue/removeFirst_A01_t01: Fail, OK # co19 issue 291
 LibTest/core/Queue/first_A02_t01: Fail, OK # co19 issue 291
-LibTest/core/Queue/addFirst_A01_t01: Fail, OK # co19 issue 291
-LibTest/core/Queue/removeLast_A01_t01: Fail, OK # co19 issue 291
-LibTest/core/Queue/add_A01_t01: Fail, OK # co19 issue 291
 LibTest/core/Queue/last_A02_t01: Fail, OK # co19 issue 291
-LibTest/core/Queue/addLast_A01_t01: Fail, OK # co19 issue 291
-LibTest/core/Queue/last_A01_t01: Fail, OK # co19 issue 291
-LibTest/core/List/last_A02_t01: Fail, OK # co19 issue 291
-LibTest/core/List/last_A01_t01: Fail, OK # co19 issue 291
 
 LibTest/isolate/isolate_api/port_A01_t01: Skip # Times out.
 
-LibTest/core/Map/putIfAbsent_A01_t08: Fail, OK # co19 issue 276
-LibTest/core/Map/putIfAbsent_A01_t06: Fail, OK # co19 issue 276
 LibTest/isolate/ReceivePort/receive_A01_t02: Fail, OK # co19 issue 276
 
-LibTest/core/UnsupportedOperationException/toString_A01_t01: Fail, OK # co19 issue 285
-LibTest/core/UnsupportedOperationException/UnsupportedOperationException_A01_t01: Fail, OK # co19 issue 285
-
 LibTest/core/List/iterator_next_A02_t01: Fail, OK # co19 issue 288
 LibTest/core/Queue/iterator_next_A02_t01: Fail, OK # co19 issue 288
 LibTest/core/Queue/first_A02_t01: Fail, OK # co19 issue 288
@@ -198,6 +188,26 @@
 LibTest/core/EmptyQueueException/EmptyQueueException_A01_t01: Fail, OK # co19 issue 288
 LibTest/core/EmptyQueueException/toString_A01_t01: Fail, OK # co19 issue 288
 
+LibTest/core/List/getRange_A04_t01: Fail, OK # co19 issue 290
+LibTest/core/List/insertRange_A06_t01: Fail, OK # co19 issue 290
+LibTest/core/List/last_A02_t01: Fail, OK # co19 issue 290
+LibTest/core/List/length_A05_t01: Fail, OK # co19 issue 290
+LibTest/core/List/List_A01_t01: Fail, OK # co19 issue 290
+LibTest/core/List/operator_subscript_A02_t01: Fail, OK # co19 issue 290
+LibTest/core/List/operator_subscripted_assignment_A02_t01: Fail, OK # co19 issue 290
+LibTest/core/List/removeLast_A01_t02: Fail, OK # co19 issue 290
+LibTest/core/List/removeRange_A05_t01: Fail, OK # co19 issue 290
+LibTest/core/List/setRange_A02_t01: Fail, OK # co19 issue 290
+LibTest/core/List/setRange_A02_t02: Fail, OK # co19 issue 290
+LibTest/core/List/setRange_A03_t01: Fail, OK # co19 issue 290
+LibTest/core/List/setRange_A03_t02: Fail, OK # co19 issue 290
+LibTest/core/Match/group_A02_t01: Fail, OK # co19 issue 290
+LibTest/core/Match/groups_A02_t01: Fail, OK # co19 issue 290
+LibTest/core/Match/operator_subscript_A02_t01: Fail, OK # co19 issue 290
+LibTest/core/String/charCodeAt_A02_t01: Fail, OK # co19 issue 290
+LibTest/core/String/operator_subscript_A02_t01: Fail, OK # co19 issue 290
+LibTest/core/String/substring_A02_t01: Fail, OK # co19 issue 290
+
 Language/03_Overview/1_Scoping_A01_t39: Fail # http://dartbug.com/5519
 Language/03_Overview/1_Scoping_A01_t40: Fail # http://dartbug.com/5519
 Language/03_Overview/1_Scoping_A01_t41: Fail # http://dartbug.com/5519
@@ -213,29 +223,7 @@
 Language/05_Variables/05_Variables_A01_t13: Fail # http://dartbug.com/5519
 Language/05_Variables/05_Variables_A01_t14: Fail # http://dartbug.com/5519
 Language/05_Variables/05_Variables_A01_t15: Fail # http://dartbug.com/5519
-Language/05_Variables/05_Variables_A03_t01: Fail # http://dartbug.com/5519
-Language/05_Variables/05_Variables_A03_t02: Fail # http://dartbug.com/5519
-Language/05_Variables/05_Variables_A03_t04: Fail # http://dartbug.com/5519
-Language/05_Variables/05_Variables_A03_t05: Fail # http://dartbug.com/5519
-Language/05_Variables/05_Variables_A03_t06: Fail # http://dartbug.com/5519
-Language/05_Variables/05_Variables_A03_t07: Fail # inherited from VM
-Language/05_Variables/05_Variables_A03_t08: Fail # http://dartbug.com/5519
-Language/05_Variables/05_Variables_A03_t09: Fail # inherited from dart2js
-Language/05_Variables/05_Variables_A03_t10: Fail # inherited from VM
-Language/05_Variables/05_Variables_A03_t11: Fail # inherited from VM
-Language/05_Variables/05_Variables_A03_t12: Fail # inherited from dart2js
-Language/05_Variables/05_Variables_A03_t13: Fail # inherited from VM
-Language/05_Variables/05_Variables_A03_t14: Fail # inherited from VM
-Language/05_Variables/05_Variables_A03_t15: Fail # inherited from VM
 Language/05_Variables/05_Variables_A04_t01: Fail # http://dartbug.com/5519
-Language/05_Variables/05_Variables_A04_t02: Fail # http://dartbug.com/5519
-Language/05_Variables/05_Variables_A04_t03: Fail # http://dartbug.com/5519
-Language/05_Variables/05_Variables_A04_t04: Fail # http://dartbug.com/5519
-Language/05_Variables/05_Variables_A04_t05: Fail # http://dartbug.com/5519
-Language/05_Variables/05_Variables_A04_t06: Fail # http://dartbug.com/5519
-Language/05_Variables/05_Variables_A04_t07: Fail # http://dartbug.com/5519
-Language/05_Variables/05_Variables_A04_t08: Fail # http://dartbug.com/5519
-Language/05_Variables/05_Variables_A04_t10: Fail # http://dartbug.com/5519
 Language/05_Variables/05_Variables_A05_t01: Fail # http://dartbug.com/5519
 Language/05_Variables/05_Variables_A05_t02: Fail # http://dartbug.com/5519
 Language/06_Functions/06_Functions_A01_t22: Fail # inherited from VM
@@ -354,193 +342,175 @@
 Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t03: Fail # inherited from VM
 Language/07_Classes/6_Constructors_A01_t01: Fail # inherited from VM
 Language/07_Classes/6_Constructors_A02_t01: Fail # http://dartbug.com/5519
-Language/09_Generics/09_Generics_A05_t01: Fail # inherited from dart2js
-Language/09_Generics/09_Generics_A05_t02: Fail # inherited from VM
-Language/10_Expressions/01_Constants_A03_t02: Fail # http://dartbug.com/5519
-Language/10_Expressions/01_Constants_A03_t03: Fail # http://dartbug.com/5519
-Language/10_Expressions/01_Constants_A03_t04: Fail # http://dartbug.com/5519
-Language/10_Expressions/01_Constants_A03_t05: Fail # http://dartbug.com/5519
-Language/10_Expressions/01_Constants_A05_t01: Fail # inherited from VM
-Language/10_Expressions/01_Constants_A05_t02: Fail # http://dartbug.com/5519
-Language/10_Expressions/01_Constants_A05_t03: Fail # http://dartbug.com/5810
-Language/10_Expressions/01_Constants_A05_t04: Fail # http://dartbug.com/5519
-Language/10_Expressions/01_Constants_A06_t01: Fail # inherited from VM
-Language/10_Expressions/01_Constants_A08_t02: Fail # http://dartbug.com/5519
-Language/10_Expressions/01_Constants_A09_t02: Fail # http://dartbug.com/5519
-Language/10_Expressions/01_Constants_A10_t02: Fail # http://dartbug.com/5519
-Language/10_Expressions/01_Constants_A10_t03: Fail # http://dartbug.com/5519
-Language/10_Expressions/01_Constants_A11_t02: Fail # http://dartbug.com/5519
-Language/10_Expressions/01_Constants_A11_t03: Fail # http://dartbug.com/5519
-Language/10_Expressions/01_Constants_A11_t04: Fail # http://dartbug.com/5519
-Language/10_Expressions/01_Constants_A12_t02: Fail # http://dartbug.com/5519
-Language/10_Expressions/01_Constants_A12_t03: Fail # http://dartbug.com/5519
-Language/10_Expressions/01_Constants_A13_t02: Fail # http://dartbug.com/5519
-Language/10_Expressions/01_Constants_A13_t03: Fail # http://dartbug.com/5519
-Language/10_Expressions/01_Constants_A13_t04: Fail # http://dartbug.com/5519
-Language/10_Expressions/01_Constants_A13_t05: Fail # http://dartbug.com/5519
-Language/10_Expressions/01_Constants_A14_t01: Fail # inherited from dart2js
-Language/10_Expressions/01_Constants_A14_t01: Fail # inherited from VM
-Language/10_Expressions/01_Constants_A15_t06: Fail # http://dartbug.com/5519
-Language/10_Expressions/01_Constants_A15_t07: Fail # http://dartbug.com/5519
-Language/10_Expressions/01_Constants_A15_t08: Fail # http://dartbug.com/5519
-Language/10_Expressions/01_Constants_A15_t09: Fail # http://dartbug.com/5519
-Language/10_Expressions/01_Constants_A15_t10: Fail # http://dartbug.com/5519
-Language/10_Expressions/01_Constants_A15_t11: Fail # http://dartbug.com/5519
-Language/10_Expressions/01_Constants_A15_t12: Fail # http://dartbug.com/5519
-Language/10_Expressions/01_Constants_A15_t13: Fail # http://dartbug.com/5519
-Language/10_Expressions/01_Constants_A15_t14: Fail # http://dartbug.com/5519
-Language/10_Expressions/01_Constants_A15_t15: Fail # http://dartbug.com/5519
-Language/10_Expressions/01_Constants_A15_t16: Fail # http://dartbug.com/5519
-Language/10_Expressions/01_Constants_A15_t17: Fail # http://dartbug.com/5519
-Language/10_Expressions/01_Constants_A15_t18: Fail # http://dartbug.com/5519
-Language/10_Expressions/01_Constants_A15_t20: Fail # http://dartbug.com/5519
-Language/10_Expressions/01_Constants_A15_t21: Fail # http://dartbug.com/5519
-Language/10_Expressions/01_Constants_A15_t31: Fail # http://dartbug.com/5519
-Language/10_Expressions/01_Constants_A16_t01: Fail # inherited from VM
-Language/10_Expressions/01_Constants_A16_t02: Crash, Pass # inherited from VM
-Language/10_Expressions/01_Constants_A16_t02: Fail # inherited from VM
-Language/10_Expressions/01_Constants_A16_t03: Fail # inherited from VM
-Language/10_Expressions/01_Constants_A17_t01: Fail # http://dartbug.com/5519
-Language/10_Expressions/01_Constants_A17_t02: Fail # http://dartbug.com/5519
-Language/10_Expressions/01_Constants_A17_t03: Crash # inherited from VM
-Language/10_Expressions/01_Constants_A17_t03: Fail # http://dartbug.com/5519
-Language/10_Expressions/01_Constants_A19_t04: Fail # http://dartbug.com/5519
-Language/10_Expressions/05_Strings/1_String_Interpolation_A01_t04: Fail # Inherited from dart2js
-Language/10_Expressions/05_Strings/1_String_Interpolation_A01_t05: Fail # Inherited from dart2js
-Language/10_Expressions/05_Strings/1_String_Interpolation_A01_t06: Fail # Inherited from dart2js
-Language/10_Expressions/05_Strings/1_String_Interpolation_A01_t09: Fail, OK # co19 issue 210
-Language/10_Expressions/05_Strings/1_String_Interpolation_A03_t02: Fail # inherited from VM
-Language/10_Expressions/05_Strings/1_String_Interpolation_A04_t02: Fail # inherited from VM
-Language/10_Expressions/05_Strings_A02_t01: Skip # co19 issue 90.
-Language/10_Expressions/05_Strings_A02_t46: Fail # inherited from VM
-Language/10_Expressions/05_Strings_A02_t48: Fail # inherited from VM
-Language/10_Expressions/05_Strings_A20_t01: Fail # inherited from VM
-Language/10_Expressions/06_Lists_A03_t01: Fail # http://dartbug.com/5519
-Language/10_Expressions/06_Lists_A03_t02: Fail # http://dartbug.com/5519
-Language/10_Expressions/06_Lists_A04_t01: Fail # http://dartbug.com/5519
-Language/10_Expressions/07_Maps_A01_t01: Skip # co19 issue 91: map literals illegal at statement beginning.
-Language/10_Expressions/07_Maps_A02_t01: Fail # http://dartbug.com/5519
-Language/10_Expressions/07_Maps_A02_t02: Fail # http://dartbug.com/5519
-Language/10_Expressions/08_Throw_A01_t01: Fail # inherited from dart2js
-Language/10_Expressions/08_Throw_A05_t01: Fail # inherited from dart2js
-Language/10_Expressions/11_Instance_Creation/1_New_A02_t03: Fail # inherited from dart2js
-Language/10_Expressions/11_Instance_Creation/1_New_A02_t05: Fail # inherited from dart2js
-Language/10_Expressions/11_Instance_Creation/1_New_A02_t06: Fail # inherited from dart2js
-Language/10_Expressions/11_Instance_Creation/1_New_A02_t07: Fail # inherited from dart2js
-Language/10_Expressions/11_Instance_Creation/1_New_A09_t09: Fail # inherited from VM
-Language/10_Expressions/11_Instance_Creation/1_New_A12_t01: Fail # co19 issue 255: unmatched bracket (same behavior in dart2js)
-Language/10_Expressions/11_Instance_Creation/1_New_A12_t02: Fail # Inherited from VM
-Language/10_Expressions/11_Instance_Creation/1_New_A13_t04: Fail # Inherited from VM
-Language/10_Expressions/11_Instance_Creation/1_New_A14_t01: Fail # Inherited from dart2js
-Language/10_Expressions/11_Instance_Creation/2_Const_A01_t02: Fail # http://dartbug.com/5519
-Language/10_Expressions/11_Instance_Creation/2_Const_A06_t01: Fail # http://dartbug.com/5519
-Language/10_Expressions/11_Instance_Creation/2_Const_A06_t02: Fail # http://dartbug.com/5519
-Language/10_Expressions/11_Instance_Creation/2_Const_A10_t01: Fail # inherited from VM
-Language/10_Expressions/14_Function_Invocation/2_Binding_Actuals_to_Formals_A04_t01: Fail # http://dartbug.com/5519
-Language/10_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t03: Fail # inherited from VM
-Language/10_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t04: Fail  # co19 issue 166
-Language/10_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t05: Fail # inherited from VM
-Language/10_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A02_t01: Fail # inherited from VM
-Language/10_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A03_t01: Fail # inherited from VM
-Language/10_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A05_t01: Fail # inherited from VM
-Language/10_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A05_t02: Fail # inherited from VM
-Language/10_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t02: Fail # inherited from VM
-Language/10_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t03: Fail # inherited from VM
-Language/10_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t05: Fail # inherited from VM
-Language/10_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t06: Fail # inherited from VM
-Language/10_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A08_t01: Fail # inherited from VM
-Language/10_Expressions/15_Method_Invocation/3_Static_Invocation_A03_t03: Fail # inherited from VM
-Language/10_Expressions/15_Method_Invocation/3_Static_Invocation_A03_t04: Fail # http://dartbug.com/5519
-Language/10_Expressions/15_Method_Invocation/3_Static_Invocation_A03_t06: Fail # inherited from VM
-Language/10_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t02: Fail # inherited from VM
-Language/10_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t03: Fail # inherited from VM
-Language/10_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t08: Fail # inherited from VM
-Language/10_Expressions/15_Method_Invocation/3_Static_Invocation_A05_t01: Fail # inherited from VM
-Language/10_Expressions/15_Method_Invocation/3_Static_Invocation_A06_t02: Fail # inherited from VM
-Language/10_Expressions/15_Method_Invocation/4_Super_Invocation_A02_t04: Fail # co19 issue 251 or issue 5732
-Language/10_Expressions/15_Method_Invocation/4_Super_Invocation_A03_t02: Fail # co19 issue 251 or issue 5732
-Language/10_Expressions/15_Method_Invocation/4_Super_Invocation_A03_t03: Fail # co19 issue 251 or issue 5732
-Language/10_Expressions/15_Method_Invocation/4_Super_Invocation_A04_t01: Fail # inherited from VM
-Language/10_Expressions/15_Method_Invocation/4_Super_Invocation_A04_t02: Fail # inherited from VM
-Language/10_Expressions/15_Method_Invocation/4_Super_Invocation_A04_t03: Fail # inherited from VM
-Language/10_Expressions/15_Method_Invocation/4_Super_Invocation_A04_t04: Fail # inherited from VM
-Language/10_Expressions/15_Method_Invocation/4_Super_Invocation_A07_t01: Fail # co19 issue 251 or issue 5732
-Language/10_Expressions/15_Method_Invocation/4_Super_Invocation_A08_t02: Fail # co19 issue 251 or issue 5732
-Language/10_Expressions/17_Getter_Invocation_A02_t01: Fail # inherited from VM
-Language/10_Expressions/17_Getter_Invocation_A02_t02: Fail # inherited from VM
-Language/10_Expressions/18_Assignment_A05_t02: Fail # inherited from VM
-Language/10_Expressions/18_Assignment_A05_t04: Fail # inherited from VM
-Language/10_Expressions/18_Assignment_A05_t05: Fail # inherited from VM
-Language/10_Expressions/18_Assignment_A08_t04: Fail # inherited from VM
-Language/10_Expressions/19_Conditional_A01_t10: Fail # Inherited from dart2js
-Language/10_Expressions/19_Conditional_A01_t11: Fail # Inherited from dart2js
-Language/10_Expressions/19_Conditional_A01_t12: Fail # Inherited from dart2js
-Language/10_Expressions/19_Conditional_A01_t13: Fail # Inherited from dart2js
-Language/10_Expressions/19_Conditional_A01_t14: Fail # Inherited from dart2js
-Language/10_Expressions/19_Conditional_A01_t15: Fail # Inherited from dart2js
-Language/10_Expressions/20_Logical_Boolean_Expressions_A01_t11: Fail # Inherited from dart2js
-Language/10_Expressions/20_Logical_Boolean_Expressions_A01_t12: Fail # http://dartbug.com/5519
-Language/10_Expressions/20_Logical_Boolean_Expressions_A01_t13: Fail # Inherited from dart2js
-Language/10_Expressions/20_Logical_Boolean_Expressions_A01_t14: Fail # Inherited from dart2js
-Language/10_Expressions/21_Bitwise_Expressions_A01_t13: Fail # Inherited from dart2js
-Language/10_Expressions/21_Bitwise_Expressions_A01_t14: Fail # http://dartbug.com/5519
-Language/10_Expressions/21_Bitwise_Expressions_A01_t15: Fail # Inherited from dart2js
-Language/10_Expressions/21_Bitwise_Expressions_A01_t16: Fail # Inherited from dart2js
-Language/10_Expressions/21_Bitwise_Expressions_A01_t17: Fail # Inherited from dart2js
-Language/10_Expressions/23_Relational_Expressions_A01_t10: Fail # http://dartbug.com/5519
-Language/10_Expressions/23_Relational_Expressions_A01_t11: Fail # http://dartbug.com/5519
-Language/10_Expressions/23_Relational_Expressions_A01_t12: Fail # http://dartbug.com/5519
-Language/10_Expressions/23_Relational_Expressions_A01_t13: Fail # http://dartbug.com/5519
-Language/10_Expressions/23_Relational_Expressions_A01_t19: Fail # Inherited from dart2js
-Language/10_Expressions/23_Relational_Expressions_A01_t20: Fail # http://dartbug.com/5519
-Language/10_Expressions/23_Relational_Expressions_A01_t21: Fail # Inherited from dart2js
-Language/10_Expressions/23_Relational_Expressions_A01_t22: Fail # Inherited from dart2js
-Language/10_Expressions/23_Relational_Expressions_A01_t23: Fail # Inherited from dart2js
-Language/10_Expressions/22_Equality_A01_t01: Fail # inherited from VM
-Language/10_Expressions/22_Equality_A01_t15: Fail # http://dartbug.com/5519
-Language/10_Expressions/22_Equality_A01_t16: Fail # http://dartbug.com/5519
-Language/10_Expressions/22_Equality_A01_t19: Fail # http://dartbug.com/5519
-Language/10_Expressions/22_Equality_A01_t23: Fail # Inherited from dart2js
-Language/10_Expressions/22_Equality_A01_t24: Fail # Inherited from dart2js
-Language/10_Expressions/22_Equality_A02_t03: Fail # inherited from VM
-Language/10_Expressions/22_Equality_A05_t01: Fail # inherited from VM
-Language/10_Expressions/24_Shift_A01_t10: Fail # Inherited from dart2js
-Language/10_Expressions/24_Shift_A01_t11: Fail # http://dartbug.com/5519
-Language/10_Expressions/24_Shift_A01_t12: Fail # Inherited from dart2js
-Language/10_Expressions/24_Shift_A01_t13: Fail # Inherited from dart2js
-Language/10_Expressions/24_Shift_A01_t14: Fail # Inherited from dart2js
-Language/10_Expressions/25_Additive_Expressions_A01_t08: Fail # Inherited from dart2js
-Language/10_Expressions/25_Additive_Expressions_A01_t11: Fail # Inherited from dart2js
-Language/10_Expressions/25_Additive_Expressions_A01_t12: Fail # Inherited from dart2js
-Language/10_Expressions/25_Additive_Expressions_A01_t13: Fail # Inherited from dart2js
-Language/10_Expressions/25_Additive_Expressions_A01_t14: Fail # Inherited from dart2js
-Language/10_Expressions/26_Multiplicative_Expressions_A01_t11: Fail # Inherited from dart2js
-Language/10_Expressions/26_Multiplicative_Expressions_A01_t14: Fail # Inherited from dart2js
-Language/10_Expressions/26_Multiplicative_Expressions_A01_t15: Fail # Inherited from dart2js
-Language/10_Expressions/26_Multiplicative_Expressions_A01_t16: Fail # Inherited from dart2js
-Language/10_Expressions/26_Multiplicative_Expressions_A01_t17: Fail # Inherited from dart2js
-Language/10_Expressions/27_Unary_Expressions_A01_t01: Fail # inherited from VM
-Language/10_Expressions/27_Unary_Expressions_A01_t02: Fail # Inherited from dart2js
-Language/10_Expressions/27_Unary_Expressions_A01_t04: Fail # Inherited from dart2js
-Language/10_Expressions/27_Unary_Expressions_A01_t05: Fail # Inherited from dart2js
-Language/10_Expressions/27_Unary_Expressions_A01_t10: Fail # inherited from VM
-Language/10_Expressions/27_Unary_Expressions_A01_t17: Fail # Inherited from dart2js
-Language/10_Expressions/27_Unary_Expressions_A01_t18: Fail # Inherited from dart2js
-Language/10_Expressions/27_Unary_Expressions_A01_t19: Fail # Inherited from dart2js
-Language/10_Expressions/27_Unary_Expressions_A01_t20: Fail # Inherited from dart2js
-Language/10_Expressions/27_Unary_Expressions_A01_t21: Fail # Inherited from dart2js
-Language/10_Expressions/27_Unary_Expressions_A01_t22: Fail # Inherited from dart2js
-Language/10_Expressions/27_Unary_Expressions_A08_t01: Fail # inherited from VM
-Language/10_Expressions/28_Postfix_Expressions_A01_t01: Fail # inherited from VM
-Language/10_Expressions/28_Postfix_Expressions_A01_t02: Fail # Inherited from dart2js
-Language/10_Expressions/28_Postfix_Expressions_A01_t03: Fail # Inherited from dart2js
-Language/10_Expressions/28_Postfix_Expressions_A01_t05: Fail # Inherited from dart2js
-Language/10_Expressions/29_Assignable_Expressions_A01_t06: Fail # Inherited from dart2js
-Language/10_Expressions/29_Assignable_Expressions_A01_t08: Fail # Inherited from dart2js
-Language/10_Expressions/29_Assignable_Expressions_A01_t09: Fail # Inherited from dart2js
-Language/10_Expressions/30_Identifier_Reference_A02_t01: Fail # Pseudo keyword "abstract".
-Language/10_Expressions/30_Identifier_Reference_A07_t01: Fail # http://dartbug.com/5519
-Language/11_Statements/03_Variable_Declaration_A04_t01: Fail # http://dartbug.com/5519
+Language/11_Expressions/01_Constants_A03_t02: Fail # http://dartbug.com/5519
+Language/11_Expressions/01_Constants_A03_t03: Fail # http://dartbug.com/5519
+Language/11_Expressions/01_Constants_A03_t04: Fail # http://dartbug.com/5519
+Language/11_Expressions/01_Constants_A03_t05: Fail # http://dartbug.com/5519
+Language/11_Expressions/01_Constants_A05_t01: Fail # inherited from VM
+Language/11_Expressions/01_Constants_A05_t02: Fail # http://dartbug.com/5519
+Language/11_Expressions/01_Constants_A05_t03: Fail # http://dartbug.com/5810
+Language/11_Expressions/01_Constants_A05_t04: Fail # http://dartbug.com/5519
+Language/11_Expressions/01_Constants_A06_t01: Fail # inherited from VM
+Language/11_Expressions/01_Constants_A08_t02: Fail # http://dartbug.com/5519
+Language/11_Expressions/01_Constants_A09_t02: Fail # http://dartbug.com/5519
+Language/11_Expressions/01_Constants_A10_t02: Fail # http://dartbug.com/5519
+Language/11_Expressions/01_Constants_A10_t03: Fail # http://dartbug.com/5519
+Language/11_Expressions/01_Constants_A11_t02: Fail # http://dartbug.com/5519
+Language/11_Expressions/01_Constants_A11_t03: Fail # http://dartbug.com/5519
+Language/11_Expressions/01_Constants_A11_t04: Fail # http://dartbug.com/5519
+Language/11_Expressions/01_Constants_A12_t02: Fail # http://dartbug.com/5519
+Language/11_Expressions/01_Constants_A12_t03: Fail # http://dartbug.com/5519
+Language/11_Expressions/01_Constants_A13_t02: Fail # http://dartbug.com/5519
+Language/11_Expressions/01_Constants_A13_t03: Fail # http://dartbug.com/5519
+Language/11_Expressions/01_Constants_A13_t04: Fail # http://dartbug.com/5519
+Language/11_Expressions/01_Constants_A13_t05: Fail # http://dartbug.com/5519
+Language/11_Expressions/01_Constants_A14_t01: Fail # inherited from dart2js
+Language/11_Expressions/01_Constants_A14_t01: Fail # inherited from VM
+Language/11_Expressions/01_Constants_A15_t06: Fail # http://dartbug.com/5519
+Language/11_Expressions/01_Constants_A15_t07: Fail # http://dartbug.com/5519
+Language/11_Expressions/01_Constants_A15_t08: Fail # http://dartbug.com/5519
+Language/11_Expressions/01_Constants_A15_t09: Fail # http://dartbug.com/5519
+Language/11_Expressions/01_Constants_A15_t10: Fail # http://dartbug.com/5519
+Language/11_Expressions/01_Constants_A15_t11: Fail # http://dartbug.com/5519
+Language/11_Expressions/01_Constants_A15_t12: Fail # http://dartbug.com/5519
+Language/11_Expressions/01_Constants_A15_t13: Fail # http://dartbug.com/5519
+Language/11_Expressions/01_Constants_A15_t14: Fail # http://dartbug.com/5519
+Language/11_Expressions/01_Constants_A15_t15: Fail # http://dartbug.com/5519
+Language/11_Expressions/01_Constants_A15_t16: Fail # http://dartbug.com/5519
+Language/11_Expressions/01_Constants_A15_t17: Fail # http://dartbug.com/5519
+Language/11_Expressions/01_Constants_A15_t18: Fail # http://dartbug.com/5519
+Language/11_Expressions/01_Constants_A15_t20: Fail # http://dartbug.com/5519
+Language/11_Expressions/01_Constants_A15_t21: Fail # http://dartbug.com/5519
+Language/11_Expressions/01_Constants_A15_t31: Fail # http://dartbug.com/5519
+Language/11_Expressions/01_Constants_A16_t01: Fail # inherited from VM
+Language/11_Expressions/01_Constants_A16_t02: Crash, Pass # inherited from VM
+Language/11_Expressions/01_Constants_A16_t02: Fail # inherited from VM
+Language/11_Expressions/01_Constants_A16_t03: Fail # inherited from VM
+Language/11_Expressions/01_Constants_A17_t01: Fail # http://dartbug.com/5519
+Language/11_Expressions/01_Constants_A17_t02: Fail # http://dartbug.com/5519
+Language/11_Expressions/01_Constants_A17_t03: Crash # inherited from VM
+Language/11_Expressions/01_Constants_A17_t03: Fail # http://dartbug.com/5519
+Language/11_Expressions/01_Constants_A19_t04: Fail # http://dartbug.com/5519
+Language/11_Expressions/05_Strings/1_String_Interpolation_A01_t04: Fail # Inherited from dart2js
+Language/11_Expressions/05_Strings/1_String_Interpolation_A01_t05: Fail # Inherited from dart2js
+Language/11_Expressions/05_Strings/1_String_Interpolation_A01_t06: Fail # Inherited from dart2js
+Language/11_Expressions/05_Strings/1_String_Interpolation_A01_t09: Fail, OK # co19 issue 210
+Language/11_Expressions/05_Strings/1_String_Interpolation_A03_t02: Fail # inherited from VM
+Language/11_Expressions/05_Strings/1_String_Interpolation_A04_t02: Fail # inherited from VM
+Language/11_Expressions/05_Strings_A02_t01: Skip # co19 issue 90.
+Language/11_Expressions/05_Strings_A02_t46: Fail # inherited from VM
+Language/11_Expressions/05_Strings_A02_t48: Fail # inherited from VM
+Language/11_Expressions/05_Strings_A20_t01: Fail # inherited from VM
+Language/11_Expressions/06_Lists_A03_t01: Fail # http://dartbug.com/5519
+Language/11_Expressions/06_Lists_A03_t02: Fail # http://dartbug.com/5519
+Language/11_Expressions/06_Lists_A04_t01: Fail # http://dartbug.com/5519
+Language/11_Expressions/07_Maps_A01_t01: Skip # co19 issue 91: map literals illegal at statement beginning.
+Language/11_Expressions/07_Maps_A02_t01: Fail # http://dartbug.com/5519
+Language/11_Expressions/07_Maps_A02_t02: Fail # http://dartbug.com/5519
+Language/11_Expressions/08_Throw_A01_t01: Fail # inherited from dart2js
+Language/11_Expressions/08_Throw_A05_t01: Fail # inherited from dart2js
+Language/11_Expressions/11_Instance_Creation/1_New_A02_t03: Fail # inherited from dart2js
+Language/11_Expressions/11_Instance_Creation/1_New_A02_t05: Fail # inherited from dart2js
+Language/11_Expressions/11_Instance_Creation/1_New_A02_t06: Fail # inherited from dart2js
+Language/11_Expressions/11_Instance_Creation/1_New_A02_t07: Fail # inherited from dart2js
+Language/11_Expressions/11_Instance_Creation/1_New_A09_t09: Fail # inherited from VM
+Language/11_Expressions/11_Instance_Creation/1_New_A12_t01: Fail # co19 issue 255: unmatched bracket (same behavior in dart2js)
+Language/11_Expressions/11_Instance_Creation/1_New_A12_t02: Fail # Inherited from VM
+Language/11_Expressions/11_Instance_Creation/1_New_A13_t04: Fail # Inherited from VM
+Language/11_Expressions/11_Instance_Creation/1_New_A14_t01: Fail # Inherited from dart2js
+Language/11_Expressions/11_Instance_Creation/2_Const_A01_t02: Fail # http://dartbug.com/5519
+Language/11_Expressions/11_Instance_Creation/2_Const_A06_t01: Fail # http://dartbug.com/5519
+Language/11_Expressions/11_Instance_Creation/2_Const_A06_t02: Fail # http://dartbug.com/5519
+Language/11_Expressions/11_Instance_Creation/2_Const_A10_t01: Fail # inherited from VM
+Language/11_Expressions/14_Function_Invocation/2_Binding_Actuals_to_Formals_A04_t01: Fail # http://dartbug.com/5519
+Language/11_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A03_t01: Fail # inherited from VM
+Language/11_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A05_t01: Fail # inherited from VM
+Language/11_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A05_t02: Fail # inherited from VM
+Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t02: Fail # inherited from VM
+Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t03: Fail # inherited from VM
+Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A03_t03: Fail # inherited from VM
+Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A03_t04: Fail # http://dartbug.com/5519
+Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A03_t06: Fail # inherited from VM
+Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t02: Fail # inherited from VM
+Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t03: Fail # inherited from VM
+Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t08: Fail # inherited from VM
+Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A05_t01: Fail # inherited from VM
+Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A06_t02: Fail # inherited from VM
+Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A02_t04: Fail # co19 issue 251 or issue 5732
+Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A03_t02: Fail # co19 issue 251 or issue 5732
+Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A03_t03: Fail # co19 issue 251 or issue 5732
+Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A07_t01: Fail # co19 issue 251 or issue 5732
+Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A08_t02: Fail # co19 issue 251 or issue 5732
+Language/11_Expressions/17_Getter_Invocation_A02_t01: Fail # inherited from VM
+Language/11_Expressions/18_Assignment_A05_t02: Fail # inherited from VM
+Language/11_Expressions/18_Assignment_A05_t04: Fail # inherited from VM
+Language/11_Expressions/18_Assignment_A05_t05: Fail # inherited from VM
+Language/11_Expressions/19_Conditional_A01_t10: Fail # Inherited from dart2js
+Language/11_Expressions/19_Conditional_A01_t11: Fail # Inherited from dart2js
+Language/11_Expressions/19_Conditional_A01_t12: Fail # Inherited from dart2js
+Language/11_Expressions/19_Conditional_A01_t13: Fail # Inherited from dart2js
+Language/11_Expressions/19_Conditional_A01_t14: Fail # Inherited from dart2js
+Language/11_Expressions/19_Conditional_A01_t15: Fail # Inherited from dart2js
+Language/11_Expressions/20_Logical_Boolean_Expressions_A01_t11: Fail # Inherited from dart2js
+Language/11_Expressions/20_Logical_Boolean_Expressions_A01_t12: Fail # http://dartbug.com/5519
+Language/11_Expressions/20_Logical_Boolean_Expressions_A01_t13: Fail # Inherited from dart2js
+Language/11_Expressions/20_Logical_Boolean_Expressions_A01_t14: Fail # Inherited from dart2js
+Language/11_Expressions/21_Bitwise_Expressions_A01_t13: Fail # Inherited from dart2js
+Language/11_Expressions/21_Bitwise_Expressions_A01_t14: Fail # http://dartbug.com/5519
+Language/11_Expressions/21_Bitwise_Expressions_A01_t15: Fail # Inherited from dart2js
+Language/11_Expressions/21_Bitwise_Expressions_A01_t16: Fail # Inherited from dart2js
+Language/11_Expressions/21_Bitwise_Expressions_A01_t17: Fail # Inherited from dart2js
+Language/11_Expressions/23_Relational_Expressions_A01_t10: Fail # http://dartbug.com/5519
+Language/11_Expressions/23_Relational_Expressions_A01_t11: Fail # http://dartbug.com/5519
+Language/11_Expressions/23_Relational_Expressions_A01_t12: Fail # http://dartbug.com/5519
+Language/11_Expressions/23_Relational_Expressions_A01_t13: Fail # http://dartbug.com/5519
+Language/11_Expressions/23_Relational_Expressions_A01_t19: Fail # Inherited from dart2js
+Language/11_Expressions/23_Relational_Expressions_A01_t20: Fail # http://dartbug.com/5519
+Language/11_Expressions/23_Relational_Expressions_A01_t21: Fail # Inherited from dart2js
+Language/11_Expressions/23_Relational_Expressions_A01_t22: Fail # Inherited from dart2js
+Language/11_Expressions/23_Relational_Expressions_A01_t23: Fail # Inherited from dart2js
+Language/11_Expressions/22_Equality_A01_t01: Fail # inherited from VM
+Language/11_Expressions/22_Equality_A01_t15: Fail # http://dartbug.com/5519
+Language/11_Expressions/22_Equality_A01_t16: Fail # http://dartbug.com/5519
+Language/11_Expressions/22_Equality_A01_t19: Fail # http://dartbug.com/5519
+Language/11_Expressions/22_Equality_A01_t23: Fail # Inherited from dart2js
+Language/11_Expressions/22_Equality_A01_t24: Fail # Inherited from dart2js
+Language/11_Expressions/22_Equality_A02_t03: Fail # inherited from VM
+Language/11_Expressions/22_Equality_A05_t01: Fail # inherited from VM
+Language/11_Expressions/24_Shift_A01_t10: Fail # Inherited from dart2js
+Language/11_Expressions/24_Shift_A01_t11: Fail # http://dartbug.com/5519
+Language/11_Expressions/24_Shift_A01_t12: Fail # Inherited from dart2js
+Language/11_Expressions/24_Shift_A01_t13: Fail # Inherited from dart2js
+Language/11_Expressions/24_Shift_A01_t14: Fail # Inherited from dart2js
+Language/11_Expressions/25_Additive_Expressions_A01_t08: Fail # Inherited from dart2js
+Language/11_Expressions/25_Additive_Expressions_A01_t11: Fail # Inherited from dart2js
+Language/11_Expressions/25_Additive_Expressions_A01_t12: Fail # Inherited from dart2js
+Language/11_Expressions/25_Additive_Expressions_A01_t13: Fail # Inherited from dart2js
+Language/11_Expressions/25_Additive_Expressions_A01_t14: Fail # Inherited from dart2js
+Language/11_Expressions/26_Multiplicative_Expressions_A01_t11: Fail # Inherited from dart2js
+Language/11_Expressions/26_Multiplicative_Expressions_A01_t14: Fail # Inherited from dart2js
+Language/11_Expressions/26_Multiplicative_Expressions_A01_t15: Fail # Inherited from dart2js
+Language/11_Expressions/26_Multiplicative_Expressions_A01_t16: Fail # Inherited from dart2js
+Language/11_Expressions/26_Multiplicative_Expressions_A01_t17: Fail # Inherited from dart2js
+Language/11_Expressions/27_Unary_Expressions_A01_t01: Fail # inherited from VM
+Language/11_Expressions/27_Unary_Expressions_A01_t02: Fail # Inherited from dart2js
+Language/11_Expressions/27_Unary_Expressions_A01_t04: Fail # Inherited from dart2js
+Language/11_Expressions/27_Unary_Expressions_A01_t05: Fail # Inherited from dart2js
+Language/11_Expressions/27_Unary_Expressions_A01_t17: Fail # Inherited from dart2js
+Language/11_Expressions/27_Unary_Expressions_A01_t18: Fail # Inherited from dart2js
+Language/11_Expressions/27_Unary_Expressions_A01_t19: Fail # Inherited from dart2js
+Language/11_Expressions/27_Unary_Expressions_A01_t20: Fail # Inherited from dart2js
+Language/11_Expressions/27_Unary_Expressions_A01_t21: Fail # Inherited from dart2js
+Language/11_Expressions/27_Unary_Expressions_A01_t22: Fail # Inherited from dart2js
+Language/11_Expressions/28_Postfix_Expressions_A01_t02: Fail # Inherited from dart2js
+Language/11_Expressions/28_Postfix_Expressions_A01_t03: Fail # Inherited from dart2js
+Language/11_Expressions/28_Postfix_Expressions_A01_t05: Fail # Inherited from dart2js
+Language/11_Expressions/29_Assignable_Expressions_A01_t06: Fail # Inherited from dart2js
+Language/11_Expressions/29_Assignable_Expressions_A01_t08: Fail # Inherited from dart2js
+Language/11_Expressions/29_Assignable_Expressions_A01_t09: Fail # Inherited from dart2js
+Language/11_Expressions/30_Identifier_Reference_A02_t01: Fail # Pseudo keyword "abstract".
+Language/11_Expressions/30_Identifier_Reference_A07_t01: Fail # http://dartbug.com/5519
+Language/12_Statements/03_Variable_Declaration_A04_t01: Fail # http://dartbug.com/5519
 Language/13_Libraries_and_Scripts/4_Scripts_A03_t01: Fail # http://dartbug.com/5519
 Language/13_Libraries_and_Scripts/4_Scripts_A03_t03: Fail # http://dartbug.com/5519
 Language/14_Types/2_Dynamic_Type_System_A02_t01: Fail # inherited from VM
@@ -559,9 +529,6 @@
 LibTest/core/Date/toString_A02_t01: Fail, OK # inherited from VM
 LibTest/core/Date/year_A01_t01: Fail, OK # inherited from VM
 LibTest/core/double/toRadixString_A01_t01: Fail # inherited from VM
-LibTest/core/Expect/throws_A02_t01: Fail, OK # Issue co19 - 42
-LibTest/core/Future/handleException_A01_t07: Fail # inherited from VM
-LibTest/core/Future/then_A01_t05: Fail # inherited from VM
 LibTest/core/int/operator_left_shift_A01_t02: Fail, OK # co19 issue 129
 LibTest/core/int/toRadixString_A01_t01: Fail # inherited from VM
 LibTest/core/Match/operator_subscript_A01_t01: Fail # inherited from VM
@@ -588,6 +555,8 @@
 
 Language/07_Classes/6_Constructors/1_Generative_Constructors_A16_t07: Fail # http://dartbug.com/6242
 
+LibTest/core/NoSuchMethodError/NoSuchMethodError_A01_t01: Fail, OK # co19 issue 300
+LibTest/core/NoSuchMethodError/toString_A01_t01: Fail, OK # co19 issue 300
 
 [ $compiler == dart2dart && $system == windows ]
 LibTest/core/double/operator_remainder_A01_t04: Fail # Result is NaN
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index 98ac7b2..9e1dc2d 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -9,13 +9,31 @@
 Language/13_Libraries_and_Scripts/2_Exports_A04_t02: Crash
 Language/13_Libraries_and_Scripts/2_Exports_A04_t03: Crash
 
+Language/03_Overview/1_Scoping_A02_t05: Fail # TODO(ahe): Please triage this failure.
 Language/03_Overview/1_Scoping_A02_t06: Fail # TODO(ahe): Please triage this failure.
-Language/05_Variables/05_Variables_A03_t09: Fail # TODO(ahe): Please triage this failure.
-Language/05_Variables/05_Variables_A03_t11: Fail # TODO(ahe): Please triage this failure.
-Language/05_Variables/05_Variables_A03_t12: Fail # TODO(ahe): Please triage this failure.
-Language/05_Variables/05_Variables_A03_t13: Fail # TODO(ahe): Please triage this failure.
-Language/05_Variables/05_Variables_A03_t14: Fail # TODO(ahe): Please triage this failure.
-Language/05_Variables/05_Variables_A03_t15: Fail # TODO(ahe): Please triage this failure.
+Language/05_Variables/05_Variables_A05_t02: Fail # TODO(ahe): Please triage this failure.
+Language/05_Variables/05_Variables_A05_t04: Fail # TODO(ahe): Please triage this failure.
+Language/05_Variables/05_Variables_A05_t05: Fail # TODO(ahe): Please triage this failure.
+Language/05_Variables/05_Variables_A05_t06: Fail # TODO(ahe): Please triage this failure.
+Language/05_Variables/05_Variables_A05_t07: Fail # TODO(ahe): Please triage this failure.
+Language/05_Variables/05_Variables_A05_t08: Fail # TODO(ahe): Please triage this failure.
+Language/05_Variables/05_Variables_A05_t09: Fail # TODO(ahe): Please triage this failure.
+Language/05_Variables/05_Variables_A05_t10: Fail # TODO(ahe): Please triage this failure.
+Language/05_Variables/05_Variables_A05_t11: Fail # TODO(ahe): Please triage this failure.
+Language/05_Variables/05_Variables_A05_t12: Fail # TODO(ahe): Please triage this failure.
+Language/05_Variables/05_Variables_A05_t13: Fail # TODO(ahe): Please triage this failure.
+Language/05_Variables/05_Variables_A05_t14: Fail # TODO(ahe): Please triage this failure.
+Language/05_Variables/05_Variables_A05_t15: Fail # TODO(ahe): Please triage this failure.
+Language/05_Variables/05_Variables_A07_t01: Fail # TODO(ahe): Please triage this failure.
+Language/05_Variables/05_Variables_A07_t02: Fail # TODO(ahe): Please triage this failure.
+Language/05_Variables/05_Variables_A07_t03: Fail # TODO(ahe): Please triage this failure.
+Language/05_Variables/05_Variables_A07_t04: Fail # TODO(ahe): Please triage this failure.
+Language/05_Variables/05_Variables_A07_t05: Fail # TODO(ahe): Please triage this failure.
+Language/05_Variables/05_Variables_A07_t06: Fail # TODO(ahe): Please triage this failure.
+Language/05_Variables/05_Variables_A07_t07: Fail # TODO(ahe): Please triage this failure.
+Language/05_Variables/05_Variables_A07_t08: Fail # TODO(ahe): Please triage this failure.
+Language/05_Variables/05_Variables_A07_t10: Fail # TODO(ahe): Please triage this failure.
+Language/05_Variables/05_Variables_A08_t01: Fail # TODO(ahe): Please triage this failure.
 Language/05_Variables/1_Evaluation_of_Implicit_Variable_Getters_A01_t05: Fail # TODO(ahe): Please triage this failure.
 Language/06_Functions/06_Functions_A01_t22: Fail # TODO(ahe): Please triage this failure.
 Language/07_Classes/07_Classes_A03_t01: Fail # TODO(ahe): Please triage this failure.
@@ -29,133 +47,130 @@
 Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t01: Fail # TODO(ahe): Please triage this failure.
 Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t03: Fail # TODO(ahe): Please triage this failure.
 Language/07_Classes/9_Superclasses/1_Inheritance_and_Overriding_A02_t03: Fail # TODO(ahe): Please triage this failure.
-Language/09_Generics/09_Generics_A05_t02: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/01_Constants_A05_t01: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/01_Constants_A13_t06: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/05_Strings/1_String_Interpolation_A01_t04: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/05_Strings/1_String_Interpolation_A01_t05: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/05_Strings/1_String_Interpolation_A01_t06: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/08_Throw_A01_t01: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/08_Throw_A05_t01: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/08_Throw_A05_t02: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/08_Throw_A05_t03: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/09_Function_Expressions_A03_t02: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/09_Function_Expressions_A04_t02: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/11_Instance_Creation/1_New_A02_t03: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/11_Instance_Creation/1_New_A02_t05: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/11_Instance_Creation/1_New_A02_t06: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/11_Instance_Creation/1_New_A02_t07: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/11_Instance_Creation/1_New_A12_t01: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/11_Instance_Creation/1_New_A12_t02: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/11_Instance_Creation/1_New_A13_t04: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/11_Instance_Creation/1_New_A14_t01: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/11_Instance_Creation/2_Const_A01_t02: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/17_Getter_Invocation_A02_t01: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/17_Getter_Invocation_A02_t02: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/18_Assignment_A05_t02: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/18_Assignment_A05_t04: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/18_Assignment_A05_t05: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/18_Assignment_A08_t04: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/19_Conditional_A01_t10: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/19_Conditional_A01_t11: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/19_Conditional_A01_t12: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/19_Conditional_A01_t13: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/19_Conditional_A01_t14: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/19_Conditional_A01_t15: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/20_Logical_Boolean_Expressions_A01_t10: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/20_Logical_Boolean_Expressions_A01_t11: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/20_Logical_Boolean_Expressions_A01_t12: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/20_Logical_Boolean_Expressions_A01_t13: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/20_Logical_Boolean_Expressions_A01_t14: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/21_Bitwise_Expressions_A01_t12: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/21_Bitwise_Expressions_A01_t13: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/21_Bitwise_Expressions_A01_t14: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/21_Bitwise_Expressions_A01_t15: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/21_Bitwise_Expressions_A01_t16: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/21_Bitwise_Expressions_A01_t17: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/22_Equality_A01_t23: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/22_Equality_A01_t24: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/22_Equality_A03_t02: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/23_Relational_Expressions_A01_t18: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/23_Relational_Expressions_A01_t19: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/23_Relational_Expressions_A01_t20: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/23_Relational_Expressions_A01_t21: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/23_Relational_Expressions_A01_t22: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/23_Relational_Expressions_A01_t23: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/24_Shift_A01_t09: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/24_Shift_A01_t10: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/24_Shift_A01_t11: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/24_Shift_A01_t12: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/24_Shift_A01_t13: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/24_Shift_A01_t14: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/25_Additive_Expressions_A01_t07: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/25_Additive_Expressions_A01_t08: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/25_Additive_Expressions_A01_t11: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/25_Additive_Expressions_A01_t12: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/25_Additive_Expressions_A01_t13: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/25_Additive_Expressions_A01_t14: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/26_Multiplicative_Expressions_A01_t10: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/26_Multiplicative_Expressions_A01_t11: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/26_Multiplicative_Expressions_A01_t14: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/26_Multiplicative_Expressions_A01_t15: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/26_Multiplicative_Expressions_A01_t16: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/26_Multiplicative_Expressions_A01_t17: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/27_Unary_Expressions_A01_t02: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/27_Unary_Expressions_A01_t04: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/27_Unary_Expressions_A01_t05: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/27_Unary_Expressions_A01_t11: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/27_Unary_Expressions_A01_t12: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/27_Unary_Expressions_A01_t13: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/27_Unary_Expressions_A01_t17: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/27_Unary_Expressions_A01_t18: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/27_Unary_Expressions_A01_t19: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/27_Unary_Expressions_A01_t20: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/27_Unary_Expressions_A01_t21: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/27_Unary_Expressions_A01_t22: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/28_Postfix_Expressions_A01_t02: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/28_Postfix_Expressions_A01_t03: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/28_Postfix_Expressions_A01_t05: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/29_Assignable_Expressions_A01_t06: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/29_Assignable_Expressions_A01_t08: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/29_Assignable_Expressions_A01_t09: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/30_Identifier_Reference_A04_t09: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/30_Identifier_Reference_A05_t01: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/30_Identifier_Reference_A05_t04: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/30_Identifier_Reference_A05_t12: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/30_Identifier_Reference_A06_t01: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/30_Identifier_Reference_A06_t02: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/31_Type_Test_A01_t02: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/31_Type_Test_A01_t04: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/31_Type_Test_A04_t01: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/32_Type_Cast_A02_t03: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/32_Type_Cast_A03_t01: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/32_Type_Cast_A03_t02: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/32_Type_Cast_A05_t01: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/32_Type_Cast_A05_t02: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/32_Type_Cast_A05_t04: Fail # TODO(ahe): Please triage this failure.
-Language/11_Statements/03_Variable_Declaration_A04_t02: Fail # TODO(ahe): Please triage this failure.
-Language/11_Statements/03_Variable_Declaration_A04_t03: Fail # TODO(ahe): Please triage this failure.
-Language/11_Statements/03_Variable_Declaration_A04_t04: Fail # TODO(ahe): Please triage this failure.
-Language/11_Statements/03_Variable_Declaration_A04_t05: Fail # TODO(ahe): Please triage this failure.
-Language/11_Statements/03_Variable_Declaration_A04_t06: Fail # TODO(ahe): Please triage this failure.
-Language/11_Statements/04_Local_Function_Declaration_A01_t01: Fail # TODO(ahe): Please triage this failure.
-Language/11_Statements/04_Local_Function_Declaration_A02_t02: Fail # TODO(ahe): Please triage this failure.
-Language/11_Statements/06_For_A01_t11: Fail # TODO(ahe): Please triage this failure.
-Language/11_Statements/06_For_A01_t12: Fail # TODO(ahe): Please triage this failure.
-Language/11_Statements/09_Switch_A02_t01: Fail # TODO(ahe): Please triage this failure.
-Language/11_Statements/09_Switch_A02_t02: Fail # TODO(ahe): Please triage this failure.
-Language/11_Statements/09_Switch_A02_t03: Fail # TODO(ahe): Please triage this failure.
-Language/11_Statements/09_Switch_A03_t01: Fail # TODO(ahe): Please triage this failure.
-Language/11_Statements/09_Switch_A03_t02: Fail # TODO(ahe): Please triage this failure.
-Language/11_Statements/09_Switch_A06_t02: Fail # TODO(ahe): Please triage this failure.
-Language/11_Statements/10_Try_A06_t01: Fail # TODO(ahe): Please triage this failure.
-Language/11_Statements/10_Try_A07_t03: Fail # TODO(ahe): Please triage this failure.
-Language/11_Statements/11_Return_A05_t01: Fail # TODO(ahe): Please triage this failure.
-Language/11_Statements/11_Return_A05_t02: Fail # TODO(ahe): Please triage this failure.
-Language/11_Statements/11_Return_A05_t03: Fail # TODO(ahe): Please triage this failure.
-Language/11_Statements/12_Labels_A03_t04: Fail # TODO(ahe): Please triage this failure.
-Language/11_Statements/14_Continue_A02_t12: Fail # TODO(ahe): Please triage this failure.
-Language/11_Statements/14_Continue_A02_t13: Fail # TODO(ahe): Please triage this failure.
+Language/09_Generics/09_Generics_A05_t01: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/01_Constants_A05_t01: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/01_Constants_A13_t06: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/05_Strings/1_String_Interpolation_A01_t04: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/05_Strings/1_String_Interpolation_A01_t05: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/05_Strings/1_String_Interpolation_A01_t06: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/08_Throw_A01_t01: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/08_Throw_A05_t01: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/08_Throw_A05_t02: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/08_Throw_A05_t03: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/11_Instance_Creation/1_New_A02_t03: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/11_Instance_Creation/1_New_A02_t05: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/11_Instance_Creation/1_New_A02_t06: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/11_Instance_Creation/1_New_A02_t07: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/11_Instance_Creation/1_New_A12_t01: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/11_Instance_Creation/1_New_A12_t02: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/11_Instance_Creation/1_New_A13_t04: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/11_Instance_Creation/1_New_A14_t01: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/11_Instance_Creation/2_Const_A01_t02: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/17_Getter_Invocation_A02_t01: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/18_Assignment_A05_t02: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/18_Assignment_A05_t04: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/18_Assignment_A05_t05: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/18_Assignment_A08_t04: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/19_Conditional_A01_t10: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/19_Conditional_A01_t11: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/19_Conditional_A01_t12: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/19_Conditional_A01_t13: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/19_Conditional_A01_t14: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/19_Conditional_A01_t15: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/20_Logical_Boolean_Expressions_A01_t10: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/20_Logical_Boolean_Expressions_A01_t11: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/20_Logical_Boolean_Expressions_A01_t12: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/20_Logical_Boolean_Expressions_A01_t13: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/20_Logical_Boolean_Expressions_A01_t14: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/21_Bitwise_Expressions_A01_t12: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/21_Bitwise_Expressions_A01_t13: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/21_Bitwise_Expressions_A01_t14: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/21_Bitwise_Expressions_A01_t15: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/21_Bitwise_Expressions_A01_t16: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/21_Bitwise_Expressions_A01_t17: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/22_Equality_A01_t23: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/22_Equality_A01_t24: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/22_Equality_A03_t02: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/23_Relational_Expressions_A01_t18: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/23_Relational_Expressions_A01_t19: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/23_Relational_Expressions_A01_t20: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/23_Relational_Expressions_A01_t21: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/23_Relational_Expressions_A01_t22: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/23_Relational_Expressions_A01_t23: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/24_Shift_A01_t09: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/24_Shift_A01_t10: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/24_Shift_A01_t11: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/24_Shift_A01_t12: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/24_Shift_A01_t13: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/24_Shift_A01_t14: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/25_Additive_Expressions_A01_t07: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/25_Additive_Expressions_A01_t08: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/25_Additive_Expressions_A01_t11: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/25_Additive_Expressions_A01_t12: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/25_Additive_Expressions_A01_t13: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/25_Additive_Expressions_A01_t14: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/26_Multiplicative_Expressions_A01_t10: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/26_Multiplicative_Expressions_A01_t11: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/26_Multiplicative_Expressions_A01_t14: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/26_Multiplicative_Expressions_A01_t15: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/26_Multiplicative_Expressions_A01_t16: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/26_Multiplicative_Expressions_A01_t17: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/27_Unary_Expressions_A01_t02: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/27_Unary_Expressions_A01_t04: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/27_Unary_Expressions_A01_t05: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/27_Unary_Expressions_A01_t11: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/27_Unary_Expressions_A01_t12: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/27_Unary_Expressions_A01_t13: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/27_Unary_Expressions_A01_t17: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/27_Unary_Expressions_A01_t18: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/27_Unary_Expressions_A01_t19: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/27_Unary_Expressions_A01_t20: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/27_Unary_Expressions_A01_t21: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/27_Unary_Expressions_A01_t22: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/28_Postfix_Expressions_A01_t02: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/28_Postfix_Expressions_A01_t03: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/28_Postfix_Expressions_A01_t05: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/29_Assignable_Expressions_A01_t06: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/29_Assignable_Expressions_A01_t08: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/29_Assignable_Expressions_A01_t09: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/30_Identifier_Reference_A04_t09: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/30_Identifier_Reference_A05_t01: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/30_Identifier_Reference_A05_t04: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/30_Identifier_Reference_A05_t12: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/30_Identifier_Reference_A06_t01: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/30_Identifier_Reference_A06_t02: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/31_Type_Test_A01_t02: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/31_Type_Test_A01_t04: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/31_Type_Test_A04_t01: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/32_Type_Cast_A02_t03: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/32_Type_Cast_A03_t01: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/32_Type_Cast_A03_t02: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/32_Type_Cast_A05_t01: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/32_Type_Cast_A05_t02: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/32_Type_Cast_A05_t04: Fail # TODO(ahe): Please triage this failure.
+Language/12_Statements/03_Variable_Declaration_A04_t02: Fail # TODO(ahe): Please triage this failure.
+Language/12_Statements/03_Variable_Declaration_A04_t03: Fail # TODO(ahe): Please triage this failure.
+Language/12_Statements/03_Variable_Declaration_A04_t04: Fail # TODO(ahe): Please triage this failure.
+Language/12_Statements/03_Variable_Declaration_A04_t05: Fail # TODO(ahe): Please triage this failure.
+Language/12_Statements/03_Variable_Declaration_A04_t06: Fail # TODO(ahe): Please triage this failure.
+Language/12_Statements/04_Local_Function_Declaration_A01_t01: Fail # TODO(ahe): Please triage this failure.
+Language/12_Statements/04_Local_Function_Declaration_A02_t02: Fail # TODO(ahe): Please triage this failure.
+Language/12_Statements/06_For_A01_t11: Fail # TODO(ahe): Please triage this failure.
+Language/12_Statements/06_For_A01_t12: Fail # TODO(ahe): Please triage this failure.
+Language/12_Statements/09_Switch_A02_t01: Fail # TODO(ahe): Please triage this failure.
+Language/12_Statements/09_Switch_A02_t02: Fail # TODO(ahe): Please triage this failure.
+Language/12_Statements/09_Switch_A02_t03: Fail # TODO(ahe): Please triage this failure.
+Language/12_Statements/09_Switch_A03_t01: Fail # TODO(ahe): Please triage this failure.
+Language/12_Statements/09_Switch_A03_t02: Fail # TODO(ahe): Please triage this failure.
+Language/12_Statements/09_Switch_A06_t02: Fail # TODO(ahe): Please triage this failure.
+Language/12_Statements/10_Try_A06_t01: Fail # TODO(ahe): Please triage this failure.
+Language/12_Statements/10_Try_A07_t03: Fail # TODO(ahe): Please triage this failure.
+Language/12_Statements/11_Return_A05_t01: Fail # TODO(ahe): Please triage this failure.
+Language/12_Statements/11_Return_A05_t02: Fail # TODO(ahe): Please triage this failure.
+Language/12_Statements/11_Return_A05_t03: Fail # TODO(ahe): Please triage this failure.
+Language/12_Statements/12_Labels_A03_t04: Fail # TODO(ahe): Please triage this failure.
+Language/12_Statements/14_Continue_A02_t12: Fail # TODO(ahe): Please triage this failure.
+Language/12_Statements/14_Continue_A02_t13: Fail # TODO(ahe): Please triage this failure.
 Language/13_Libraries_and_Scripts/1_Imports_A02_t01: Fail # TODO(ahe): Please triage this failure.
 Language/13_Libraries_and_Scripts/1_Imports_A02_t02: Fail # TODO(ahe): Please triage this failure.
 Language/13_Libraries_and_Scripts/1_Imports_A02_t16: Fail # TODO(ahe): Please triage this failure.
@@ -216,6 +231,26 @@
 LibTest/core/EmptyQueueException/EmptyQueueException_A01_t01: Fail, OK # co19 issue 288
 LibTest/core/EmptyQueueException/toString_A01_t01: Fail, OK # co19 issue 288
 
+LibTest/core/List/getRange_A04_t01: Fail, OK # co19 issue 290
+LibTest/core/List/insertRange_A06_t01: Fail, OK # co19 issue 290
+LibTest/core/List/last_A02_t01: Fail, OK # co19 issue 290
+LibTest/core/List/length_A05_t01: Fail, OK # co19 issue 290
+LibTest/core/List/List_A01_t01: Fail, OK # co19 issue 290
+LibTest/core/List/operator_subscript_A02_t01: Fail, OK # co19 issue 290
+LibTest/core/List/operator_subscripted_assignment_A02_t01: Fail, OK # co19 issue 290
+LibTest/core/List/removeLast_A01_t02: Fail, OK # co19 issue 290
+LibTest/core/List/removeRange_A05_t01: Fail, OK # co19 issue 290
+LibTest/core/List/setRange_A02_t01: Fail, OK # co19 issue 290
+LibTest/core/List/setRange_A02_t02: Fail, OK # co19 issue 290
+LibTest/core/List/setRange_A03_t01: Fail, OK # co19 issue 290
+LibTest/core/List/setRange_A03_t02: Fail, OK # co19 issue 290
+LibTest/core/Match/group_A02_t01: Fail, OK # co19 issue 290
+LibTest/core/Match/groups_A02_t01: Fail, OK # co19 issue 290
+LibTest/core/Match/operator_subscript_A02_t01: Fail, OK # co19 issue 290
+LibTest/core/String/charCodeAt_A02_t01: Fail, OK # co19 issue 290
+LibTest/core/String/operator_subscript_A02_t01: Fail, OK # co19 issue 290
+LibTest/core/String/substring_A02_t01: Fail, OK # co19 issue 290
+
 [ $compiler == dart2js && $unchecked ]
 LibTest/core/Date/Date.fromMillisecondsSinceEpoch_A03_t01: Fail # TODO(ahe): Please triage this failure.
 
@@ -241,31 +276,32 @@
 Language/07_Classes/6_Constructors/2_Factories_A06_t04: Fail # TODO(ahe): Please triage this failure.
 Language/09_Generics/09_Generics_A03_t01: Fail # TODO(ahe): Please triage this failure.
 Language/09_Generics/09_Generics_A04_t06: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/06_Lists_A09_t01: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/06_Lists_A09_t04: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/06_Lists_A09_t05: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/07_Maps_A10_t04: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/07_Maps_A10_t05: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/09_Function_Expressions_A03_t03: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/09_Function_Expressions_A04_t03: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/09_Function_Expressions_A05_t02: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/09_Function_Expressions_A05_t04: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/09_Function_Expressions_A06_t02: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/09_Function_Expressions_A06_t04: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/11_Instance_Creation/1_New_A07_t01: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/11_Instance_Creation/1_New_A11_t01: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/11_Instance_Creation/2_Const_A09_t02: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/11_Instance_Creation/2_Const_A09_t03: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/11_Instance_Creation_A05_t02: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/15_Method_Invocation/3_Static_Invocation_A03_t04: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/20_Logical_Boolean_Expressions_A03_t01: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/27_Unary_Expressions_A02_t03: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/32_Type_Cast_A05_t03: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/32_Type_Cast_A05_t05: Fail # TODO(ahe): Please triage this failure.
-Language/11_Statements/05_If_A02_t01: Fail # TODO(ahe): Please triage this failure.
-Language/11_Statements/06_For/1_For_Loop_A01_t08: Fail # TODO(ahe): Please triage this failure.
-Language/11_Statements/09_Switch_A05_t01: Fail # TODO(ahe): Please triage this failure.
-Language/11_Statements/11_Return_A04_t01: Fail # TODO(ahe): Please triage this failure.
+Language/09_Generics/09_Generics_A05_t02: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/06_Lists_A09_t01: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/06_Lists_A09_t04: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/06_Lists_A09_t05: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/07_Maps_A10_t04: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/07_Maps_A10_t05: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/09_Function_Expressions_A03_t03: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/09_Function_Expressions_A04_t03: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/09_Function_Expressions_A05_t02: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/09_Function_Expressions_A05_t04: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/09_Function_Expressions_A06_t02: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/09_Function_Expressions_A06_t04: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/11_Instance_Creation/1_New_A07_t01: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/11_Instance_Creation/1_New_A11_t01: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/11_Instance_Creation/2_Const_A09_t02: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/11_Instance_Creation/2_Const_A09_t03: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/11_Instance_Creation_A05_t02: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A03_t04: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/20_Logical_Boolean_Expressions_A03_t01: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/27_Unary_Expressions_A02_t03: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/32_Type_Cast_A05_t03: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/32_Type_Cast_A05_t05: Fail # TODO(ahe): Please triage this failure.
+Language/12_Statements/05_If_A02_t01: Fail # TODO(ahe): Please triage this failure.
+Language/12_Statements/06_For/1_For_Loop_A01_t08: Fail # TODO(ahe): Please triage this failure.
+Language/12_Statements/09_Switch_A05_t01: Fail # TODO(ahe): Please triage this failure.
+Language/12_Statements/11_Return_A04_t01: Fail # TODO(ahe): Please triage this failure.
 Language/14_Types/4_Interface_Types_A08_t03: Fail # TODO(ahe): Please triage this failure.
 Language/14_Types/8_Parameterized_Types_A02_t01: Fail # TODO(ahe): Please triage this failure.
 LibTest/core/AssertionError/column_A01_t02: Fail # TODO(ahe): Please triage this failure.
@@ -288,6 +324,13 @@
 
 Language/03_Overview/1_Scoping_A02_t30: Fail # http://dartbug.com/5348
 
+Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A04_t01: Fail # Checked mode failure for noSuchMethod type.
+Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A04_t02: Fail # Checked mode failure for noSuchMethod type.
+Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A04_t03: Fail # Checked mode failure for noSuchMethod type.
+Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A04_t04: Fail # Checked mode failure for noSuchMethod type.
+Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A06_t01: Fail # Checked mode failure for noSuchMethod type.
+Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A06_t02: Fail # Checked mode failure for noSuchMethod type.
+
 
 [ $compiler == dart2js ]
 LibTest/core/int/operator_GT_A01_t01: Fail, OK # co19 issue 200
@@ -304,7 +347,6 @@
 LibTest/core/List/setRange_A05_t01: Fail, OK
 
 # These tests need to be updated for new optional parameter syntax and semantics, co19 issue 258:
-Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A01_t01: Fail, OK
 Language/07_Classes/1_Instance_Methods_A02_t05: Fail, OK
 Language/07_Classes/6_Constructors/1_Generative_Constructors_A13_t01: Fail, OK
 Language/14_Types/5_Function_Types_A01_t21: Fail, OK
@@ -332,54 +374,16 @@
 LibTest/core/Map/getValues_A01_t02: Fail, OK # co19 issue 293
 LibTest/core/Map/getValues_A01_t01: Fail, OK # co19 issue 293
 
-LibTest/core/Match/end_A01_t01: Fail, OK # co19 issue 294
-LibTest/core/Match/group_A01_t01: Fail, OK # co19 issue 294
-LibTest/core/Match/groupCount_A01_t01: Fail, OK # co19 issue 294
-LibTest/core/Match/operator_subscript_A01_t01: Fail, OK # co19 issue 294
-LibTest/core/Match/start_A01_t01: Fail, OK # co19 issue 294
 LibTest/core/RegExp/allMatches_A01_t01: Fail, OK # co19 issue 294
 LibTest/core/RegExp/firstMatch_A01_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Assertion_A03_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Assertion_A04_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Assertion_A05_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A01_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A02_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A03_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A03_t02: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A03_t03: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A04_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A05_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A06_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_AtomEscape_A01_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Disjunction_A01_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Quantifier_A01_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Quantifier_A02_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Quantifier_A03_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Quantifier_A04_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Quantifier_A05_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Quantifier_A06_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Term_A01_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Term_A02_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Term_A03_t01: Fail, OK # co19 issue 294
 LibTest/core/RegExp/Pattern_semantics/firstMatch_Term_A04_t01: Fail, OK # co19 issue 294
 
-LibTest/core/Queue/filter_A01_t04: Fail, OK # co19 issue 291
-LibTest/core/Queue/first_A01_t01: Fail, OK # co19 issue 291
-LibTest/core/Queue/removeFirst_A01_t01: Fail, OK # co19 issue 291
-LibTest/core/Queue/addFirst_A01_t01: Fail, OK # co19 issue 291
-LibTest/core/Queue/removeLast_A01_t01: Fail, OK # co19 issue 291
-LibTest/core/Queue/add_A01_t01: Fail, OK # co19 issue 291
-LibTest/core/Queue/addLast_A01_t01: Fail, OK # co19 issue 291
-LibTest/core/Queue/last_A01_t01: Fail, OK # co19 issue 291
-LibTest/core/List/last_A02_t01: Fail, OK # co19 issue 291
-LibTest/core/List/last_A01_t01: Fail, OK # co19 issue 291
-
-LibTest/core/Queue/filter_A01_t04: Fail, OK # co19 issue 287
 LibTest/core/Map/getValues_A01_t02: Fail, OK # co19 issue 287
 
 LibTest/core/int/isOdd_A01_t01: Fail, OK # co19 issue 277
 LibTest/core/int/isEven_A01_t01: Fail, OK # co19 issue 277
 
+Language/09_Generics/09_Generics_A05_t01: Fail # co19 issue 297
 
 [ $compiler == dart2js && $system == windows && $jscl ]
 LibTest/core/double/operator_remainder_A01_t04: Fail
@@ -388,44 +392,35 @@
 Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A01_t10: Fail # TODO(ahe): Enforce optional parameter semantics.
 Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A01_t11: Fail # TODO(ahe): Enforce optional parameter semantics.
 Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A03_t03: Fail # TODO(ahe): Enforce optional parameter semantics.
+Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A01_t01: Fail # http://dartbug.com/5026
+Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A03_t04: Fail # TODO(ahe): Enforce optional parameter semantics.
+Language/06_Functions/2_Formal_Parameters_A03_t03: Fail # TODO(ahe): Enforce optional parameter semantics.
+Language/06_Functions/2_Formal_Parameters_A03_t04: Fail # TODO(ahe): Enforce optional parameter semantics.
+Language/06_Functions/2_Formal_Parameters_A03_t06: Fail # TODO(ahe): Enforce optional parameter semantics.
 
-Language/09_Generics/09_Generics_A05_t01: Fail # dart2js fails to reject type variable within static member
-
-Language/10_Expressions/14_Function_Invocation/2_Binding_Actuals_to_Formals_A06_t01: Fail # Compile-time error: Unimplemented non-matching static call
-Language/10_Expressions/14_Function_Invocation/2_Binding_Actuals_to_Formals_A06_t04: Fail # Compile-time error: Unimplemented non-matching static call
-Language/10_Expressions/14_Function_Invocation/2_Binding_Actuals_to_Formals_A06_t05: Fail # Compile-time error: Unimplemented non-matching static call
-Language/10_Expressions/14_Function_Invocation/2_Binding_Actuals_to_Formals_A06_t08: Fail # Compile-time error: Unimplemented non-matching static call
-Language/10_Expressions/14_Function_Invocation/2_Binding_Actuals_to_Formals_A07_t01: Fail # Compile-time error: Unimplemented non-matching static call
-Language/10_Expressions/14_Function_Invocation/2_Binding_Actuals_to_Formals_A07_t04: Fail # Compile-time error: Unimplemented non-matching static call
-Language/10_Expressions/01_Constants_A03_t01: Fail # Compile-time error: error: not a compile-time constant
-Language/10_Expressions/01_Constants_A11_t01: Fail # Compile-time error: error: not a compile-time constant
+Language/11_Expressions/01_Constants_A03_t01: Fail # Compile-time error: error: not a compile-time constant
+Language/11_Expressions/01_Constants_A11_t01: Fail # Compile-time error: error: not a compile-time constant
 LibTest/isolate/SendPort/send_A02_t01: Fail # Compile-time error: error: not a compile-time constant
 LibTest/isolate/SendPort/send_A02_t02: Fail # Compile-time error: error: not a compile-time constant
 LibTest/isolate/SendPort/send_A02_t03: Fail # Compile-time error: error: not a compile-time constant
 
-Language/10_Expressions/01_Constants_A18_t03: Fail # Compile-time error: unexpected token 'equals'
-Language/10_Expressions/22_Equality_A02_t03: Fail # Compile-time error: unexpected token 'equals'
-Language/10_Expressions/05_Strings_A20_t01: Fail # Runtime error: Expect.identical(expected: <abyr, abyr
+Language/11_Expressions/01_Constants_A18_t03: Fail # Compile-time error: unexpected token 'equals'
+Language/11_Expressions/22_Equality_A02_t03: Fail # Compile-time error: unexpected token 'equals'
+Language/11_Expressions/05_Strings_A20_t01: Fail # Runtime error: Expect.identical(expected: <abyr, abyr
 LibTest/isolate/isolate_api/spawnUri_A02_t01: Fail # Runtime error: Expect.throws() fails
-Language/10_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t03: Fail # Runtime error: NoSuchMethodException : method not found: '$call'
-Language/10_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t06: Fail # Runtime error: NoSuchMethodException : method not found: 'm'
-Language/10_Expressions/15_Method_Invocation/4_Super_Invocation_A04_t02: Fail # Runtime error: NoSuchMethodException : method not found: 'm'
-Language/10_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t05: Fail # Runtime error: NoSuchMethodException : method not found: 'nonExistingMethod'
-Language/10_Expressions/15_Method_Invocation/4_Super_Invocation_A04_t01: Fail # Runtime error: NoSuchMethodException : method not found: 'nonExistingMethod'
-Language/10_Expressions/05_Strings/1_String_Interpolation_A03_t02: Fail # Runtime error: TypeError: Cannot call method '$call$0' of undefined
-Language/10_Expressions/05_Strings/1_String_Interpolation_A04_t02: Fail # Runtime error: TypeError: Cannot call method '$call$0' of undefined
-Language/10_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A08_t01: Fail # Runtime error: TypeError: Cannot call method '$call$0' of undefined
-Language/10_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t02: Fail # Runtime error: TypeError: Cannot call method '$call$0' of undefined
-Language/10_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t03: Fail # Runtime error: TypeError: Cannot call method '$call$0' of undefined
-Language/10_Expressions/15_Method_Invocation/3_Static_Invocation_A05_t01: Fail # Runtime error: TypeError: Cannot call method '$call$0' of undefined
-Language/10_Expressions/15_Method_Invocation/3_Static_Invocation_A06_t02: Fail # Runtime error: TypeError: Cannot call method '$call$0' of undefined
-Language/10_Expressions/15_Method_Invocation/4_Super_Invocation_A03_t02: Fail # Runtime error: TypeError: Cannot call method '$call$0' of undefined
-Language/10_Expressions/15_Method_Invocation/4_Super_Invocation_A03_t03: Fail # Runtime error: TypeError: Cannot call method '$call$0' of undefined
-Language/10_Expressions/15_Method_Invocation/4_Super_Invocation_A07_t01: Fail # Runtime error: TypeError: Cannot call method '$call$0' of undefined
-Language/10_Expressions/15_Method_Invocation/4_Super_Invocation_A08_t02: Fail # Runtime error: TypeError: Cannot call method '$call$0' of undefined
-Language/10_Expressions/15_Method_Invocation/4_Super_Invocation_A02_t04: Fail # Runtime error: TypeError: Cannot call method '$call$2' of undefined
-Language/10_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t02: Fail # Runtime error: TypeError: Object #<A> has no method '$call$0'
-Language/10_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A03_t01: Fail # Runtime error: TypeError: Object 1 has no method '$call$0'
+Language/11_Expressions/05_Strings/1_String_Interpolation_A03_t02: Fail # Runtime error: TypeError: Cannot call method '$call$0' of undefined
+Language/11_Expressions/05_Strings/1_String_Interpolation_A04_t02: Fail # Runtime error: TypeError: Cannot call method '$call$0' of undefined
+Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A08_t01: Fail # Runtime error: TypeError: Cannot call method '$call$0' of undefined
+Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t02: Fail # Runtime error: TypeError: Cannot call method '$call$0' of undefined
+Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t03: Fail # Runtime error: TypeError: Cannot call method '$call$0' of undefined
+Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A05_t01: Fail # Runtime error: TypeError: Cannot call method '$call$0' of undefined
+Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A06_t02: Fail # Runtime error: TypeError: Cannot call method '$call$0' of undefined
+Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A03_t02: Fail # Runtime error: TypeError: Cannot call method '$call$0' of undefined
+Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A03_t03: Fail # Runtime error: TypeError: Cannot call method '$call$0' of undefined
+Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A07_t01: Fail # Runtime error: TypeError: Cannot call method '$call$0' of undefined
+Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A08_t02: Fail # Runtime error: TypeError: Cannot call method '$call$0' of undefined
+Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A02_t04: Fail # Runtime error: TypeError: Cannot call method '$call$2' of undefined
+Language/11_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A03_t01: Fail # Runtime error: TypeError: Object 1 has no method '$call$0'
 LibTest/isolate/isolate_api/spawnUri_A01_t01: Fail # Runtime error: UnsupportedError: Currently spawnUri is not supported without web workers.
 LibTest/isolate/isolate_api/spawnUri_A01_t02: Fail # Runtime error: UnsupportedError: Currently spawnUri is not supported without web workers.
 LibTest/isolate/isolate_api/spawnUri_A01_t03: Fail # Runtime error: UnsupportedError: Currently spawnUri is not supported without web workers.
@@ -464,9 +459,9 @@
 # can understand so he can file a bug later.
 #
 [ $compiler == dart2js ]
-Language/10_Expressions/22_Equality_A01_t01: Fail, OK # Function declaration takes precedence over function expression.
-Language/10_Expressions/28_Postfix_Expressions_A01_t01: Fail, OK # A map literal cannot start an expression statement.
-LibTest/core/String/String_class_A02_t01: Fail, OK # compiler cancelled: Unhandled non-BMP character: U+10000
+Language/11_Expressions/22_Equality_A01_t01: Fail, OK # Function declaration takes precedence over function expression.
+Language/11_Expressions/28_Postfix_Expressions_A01_t01: Fail, OK # A map literal cannot start an expression statement.
+LibTest/core/String/String_class_A02_t01: Pass, Fail, OK # issue 6418 compiler cancelled: Unhandled non-BMP character: U+10000
 LibTest/core/String/charCodeAt_A01_t01: Fail, OK # compiler cancelled: Unhandled non-BMP character: U+10000
 LibTest/core/String/charCodes_A01_t01: Fail, OK # compiler cancelled: Unhandled non-BMP character: U+10000
 
@@ -474,31 +469,29 @@
 Language/06_Functions/1_Function_Declaration_A03_t03: Fail, OK # co19 issue 210
 Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A01_t14: Fail, OK # co19 issue 210
 Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A01_t15: Fail, OK # co19 issue 210
-Language/10_Expressions/05_Strings/1_String_Interpolation_A01_t09: Fail, OK # co19 issue 210
+Language/11_Expressions/05_Strings/1_String_Interpolation_A01_t09: Fail, OK # co19 issue 210
 
 Language/03_Overview/1_Scoping_A01_t40: Fail, OK # co19 issue 188
 Language/03_Overview/1_Scoping_A01_t41: Fail, OK # co19 issue 188
 
-Language/07_Classes/4_Abstract_Instance_Members_A02_t02: Fail, OK # co19 issue 194
-
 Language/06_Functions/4_External_Functions_A01_t01: Fail, OK # http://dartbug.com/5021
 
-Language/07_Classes/4_Abstract_Instance_Members_A02_t01: Fail, OK # co19 issue 195
-
 Language/03_Overview/2_Privacy_A01_t09: Fail, OK # co19 issue 198
 Language/03_Overview/2_Privacy_A01_t10: Fail, OK # co19 issue 198
 
-Language/10_Expressions/11_Instance_Creation/1_New_A12_t01: Fail, OK # co19 issue 273
+Language/11_Expressions/11_Instance_Creation/1_New_A12_t01: Fail, OK # co19 issue 273
 LibTest/core/String/hashCode_A01_t01: Fail, OK # co19 issue 273
 LibTest/core/int/hashCode_A01_t01: Fail, OK # co19 issue 273
 
+LibTest/core/NoSuchMethodError/NoSuchMethodError_A01_t01: Fail, OK # co19 issue 300
+LibTest/core/NoSuchMethodError/toString_A01_t01: Fail, OK # co19 issue 300
 
 [ $compiler == dart2js && $jscl ]
 LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterClassEscape_A04_t01: Fail, Pass # issue 3333
 LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterClassEscape_A03_t01: Fail, Pass # issue 3333
 
-Language/10_Expressions/03_Numbers_A01_t06: Fail, OK # Requires bigint.
-Language/10_Expressions/03_Numbers_A01_t09: Fail, OK # Requires bigint.
+Language/11_Expressions/03_Numbers_A01_t06: Fail, OK # Requires bigint.
+Language/11_Expressions/03_Numbers_A01_t09: Fail, OK # Requires bigint.
 LibTest/core/Date/Date_A01_t03: Fail, OK # co19 issue 180
 LibTest/core/Date/year_A01_t01: Fail, OK # Requires big int.
 LibTest/core/Match/pattern_A01_t01: Fail, OK # Bad test, allMatches return an Iterable.
@@ -530,6 +523,12 @@
 Language/07_Classes/1_Instance_Methods/2_Operators_A02_t01: Fail, OK # Expects negative result from bit-operation.
 
 
+[ $compiler == dart2js && $system == macos ]
+LibTest/math/acos_A01_t01: Fail, OK # co19 issue 44
+LibTest/math/asin_A01_t01: Fail, OK # co19 issue 44
+LibTest/math/atan_A01_t01: Fail, OK # co19 issue 44
+
+
 #
 # The following tests are failing. Please add the error message
 # (either a compiler error or exception message). The error messages
@@ -544,25 +543,21 @@
 Language/03_Overview/2_Privacy_A01_t11: Fail # internal error: super property read not implemented
 Language/03_Overview/2_Privacy_A01_t14: Fail # duplicate definition of _(var _)=> _
 
-Language/10_Expressions/01_Constants_A12_t01: Fail # internal error: CompileTimeConstantEvaluator not implemented
-Language/10_Expressions/14_Function_Invocation/2_Binding_Actuals_to_Formals_A01_t01: Fail # Unimplemented non-matching static call
-Language/10_Expressions/14_Function_Invocation/2_Binding_Actuals_to_Formals_A01_t04: Fail # Unimplemented non-matching static call
-Language/10_Expressions/14_Function_Invocation/2_Binding_Actuals_to_Formals_A01_t05: Fail # Unimplemented non-matching static call
-Language/10_Expressions/22_Equality_A05_t01: Fail # != cannot be called on super
-Language/10_Expressions/27_Unary_Expressions_A01_t01: Fail # ! cannot be called on super
-Language/10_Expressions/27_Unary_Expressions_A01_t10: Fail # cannot deal with super in complex assignments
-Language/10_Expressions/30_Identifier_Reference_A02_t01: Fail # Pseudo keyword "abstract".
+Language/11_Expressions/01_Constants_A12_t01: Fail # internal error: CompileTimeConstantEvaluator not implemented
+Language/11_Expressions/22_Equality_A05_t01: Fail # != cannot be called on super
+Language/11_Expressions/27_Unary_Expressions_A01_t01: Fail # ! cannot be called on super
+Language/11_Expressions/27_Unary_Expressions_A01_t10: Fail # cannot deal with super in complex assignments
+Language/11_Expressions/30_Identifier_Reference_A02_t01: Fail # Pseudo keyword "abstract".
 
 [ $compiler == dart2js && $jscl ]
 LibTest/core/Date/Date.fromString_A03_t01: Fail # Issue co19 - 121
-LibTest/core/Expect/throws_A02_t01: Fail # reason (sdsds sd dsf) not mentioned in ExpectException message (Expect.isTrue(false) fails.)
 LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterEscape_A06_t02: Fail # IllegalJSRegExpException: '\c(' 'SyntaxError: Invalid regular expression: /\c(/: Unterminated group'
 LibTest/core/RegExp/Pattern_semantics/firstMatch_DecimalEscape_A01_t02: Fail # Expect.fail('Some exception expected')
 LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t05: Fail # Expect.fail('Some exception expected')
 LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t06: Fail # Expect.fail('Some exception expected')
 
-Language/10_Expressions/06_Lists_A07_t02: Fail # generic type information is lost during canonicalization.
-Language/10_Expressions/07_Maps_A06_t02: Fail # generic type information is lost during canonicalization.
+Language/11_Expressions/06_Lists_A07_t02: Fail # generic type information is lost during canonicalization.
+Language/11_Expressions/07_Maps_A06_t02: Fail # generic type information is lost during canonicalization.
 
 #
 # The following tests may be broken, but require further review.
@@ -586,23 +581,7 @@
 Language/05_Variables/05_Variables_A01_t13: Fail # Checks that variable declaration cannot contain both 'const' and 'final'.
 Language/05_Variables/05_Variables_A01_t14: Fail # Checks that variable declaration cannot contain 'const', 'final' and 'var' simultaneously.
 Language/05_Variables/05_Variables_A01_t15: Fail # Checks that a variable declaration cannot contain the 'abstract' keyword.
-Language/05_Variables/05_Variables_A03_t01: Fail # Checks that a compile-time error occurs if local final variable is redefined.
-Language/05_Variables/05_Variables_A03_t02: Fail # Checks that a compile-time error occurs if local final variable is not assigned.
-Language/05_Variables/05_Variables_A03_t04: Fail # Checks that a compile-time error occurs if a global final variable is not assigned.
-Language/05_Variables/05_Variables_A03_t05: Fail # Checks that a compile-time error occurs if local typed final variable is redefined.
-Language/05_Variables/05_Variables_A03_t06: Fail # Checks that a compile-time error occurs if local typed final variable is not assigned.
-Language/05_Variables/05_Variables_A03_t07: Fail # Checks that a compile-time error occurs if a global typed final variable is redefined.
-Language/05_Variables/05_Variables_A03_t08: Fail # Checks that a compile-time error occurs if a global typed final variable is not assigned.
-Language/05_Variables/05_Variables_A03_t10: Fail # Checks that assigning a final variable to the same value it already holds still produces a compile-time error.
 Language/05_Variables/05_Variables_A04_t01: Fail # Checks that a compile-time error occurs if a local constant variable is redefined.
-Language/05_Variables/05_Variables_A04_t02: Fail # Checks that a compile-time error occurs if a local typed constant variable is redefined.
-Language/05_Variables/05_Variables_A04_t03: Fail # Checks that a compile-time error occurs if a global constant variable is redefined.
-Language/05_Variables/05_Variables_A04_t04: Fail # Checks that a compile-time error occurs if a global typed constant variable is redefined.
-Language/05_Variables/05_Variables_A04_t05: Fail # Checks that a compile-time error occurs if a local constant variable is not initialized at declaration.
-Language/05_Variables/05_Variables_A04_t06: Fail # Checks that a compile-time error occurs if a local typed constant variable is not initialized at declaration.
-Language/05_Variables/05_Variables_A04_t07: Fail # Checks that a compile-time error occurs if a global constant variable is not initialized at declaration.
-Language/05_Variables/05_Variables_A04_t08: Fail # Checks that a compile-time error occurs if a global typed constant variable is not initialized at declaration.
-Language/05_Variables/05_Variables_A04_t10: Fail # Checks that assigning a constant variable to the same value it already holds still produces a compile-time error.
 Language/05_Variables/05_Variables_A05_t01: Fail # Checks that a compile-time error occurs if a constant variable is not initialized.
 Language/06_Functions/06_Functions_A01_t31: Fail # Checks that functions can't be declared as static inside of a function body.
 Language/06_Functions/1_Function_Declaration_A01_t01: Fail # Checks that it is a compile-time error to preface library function with 'static'.
@@ -619,6 +598,7 @@
 Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A03_t02: Fail # Checks that it is a compile-time error if the name of a positional optional parameter begins with an '_' character.
 Language/06_Functions/2_Formal_Parameters_A03_t01: Fail # Checks that it is a compile-time error if a required parameter is declared as a constant variable.
 Language/06_Functions/2_Formal_Parameters_A03_t02: Fail # Checks that it is a compile-time error if a required parameter is declared as a constant typed variable.
+Language/06_Functions/2_Formal_Parameters_A03_t05: Fail # Checks that it is a compile-time error if an optional named parameter is declared as a constant typed variable.
 Language/06_Functions/2_Formal_Parameters_A03_t05: Fail # Checks that it is a compile-time error if an optional positional parameter is declared as a constant variable.
 Language/07_Classes/07_Classes_A02_t02: Fail # Checks that it is a compile-time error if a constant constructor declaration includes a body.
 Language/07_Classes/07_Classes_A02_t04: Fail # Checks that it is a compile-time error if a constant constructor declaration with initializers includes a body.
@@ -636,7 +616,7 @@
 Language/07_Classes/1_Instance_Methods/2_Operators_A07_t01: Fail # Checks that a compile-time error is produced if a user-defined operator [] specifies an optional named parameter.
 Language/07_Classes/1_Instance_Methods/2_Operators_A07_t02: Fail # Checks that a compile-time error is produced if a user-defined operator [] specifies an optional named parameter in addition to the required one.
 Language/07_Classes/1_Instance_Methods/2_Operators_A07_t03: Fail # Checks that a compile-time error is produced if a user-defined operator []= specifies one optional named parameter.
-Language/07_Classes/1_Instance_Methods/2_Operators_A07_t04: Fail # Checks that a compile-time error is produced if a user-defined operator []= specifies one optional named parameter in addition to the two required ones.
+Language/07_Classes/1_Instance_Methods/2_Operators_A07_t04: Fail # Checks that a compile-time error is produced if a user-defined operator []= specifies one optional named parameter in addition to the two required ones
 Language/07_Classes/1_Instance_Methods_A02_t01: Fail # Checks that a compile-time error is produced if m1 has fewer named parameters than m2 (2 vs 3) and neither have any required parameters.
 Language/07_Classes/1_Instance_Methods_A02_t02: Fail # Checks that a compile-time error is produced if m1 has fewer named parameters than m2 (1 vs. 0) and neither have any required parameters.
 Language/07_Classes/1_Instance_Methods_A02_t05: Fail # Checks that a compile-time error is produced if m1 has almost the same set of named  parameters as m2 except for one of them having a different name.
@@ -666,20 +646,20 @@
 Language/07_Classes/6_Constructors_A01_t01: Fail # Checks that a compile-error is produced when a constructor's id coincides with the name of a field in the same class.
 Language/07_Classes/6_Constructors_A02_t01: Fail # Checks that a compile-error is produced when a named constructor definition does not begin with the name of its class.
 Language/07_Classes/6_Constructors/1_Generative_Constructors_A16_t07: Fail # http://dartbug.com/6242
-Language/10_Expressions/01_Constants_A16_t01: Fail # Checks that an IntegerDivisionByZeroException raised during evaluation  of a compile-time constant causes a compile-time error.
-Language/10_Expressions/01_Constants_A16_t02: Fail # Checks that an OutOfMemoryException raised during evaluation of a compile-time constant causes a compile-time error.
-Language/10_Expressions/05_Strings_A02_t46: Fail # Checks that multi-line strings that contain characters and sequences prohibited by this grammar, cause compile-time errors.
-Language/10_Expressions/05_Strings_A02_t48: Fail # Checks that multi-line strings that contain characters and sequences prohibited by this grammar, cause compile-time errors.
-Language/10_Expressions/06_Lists_A04_t01: Fail # Checks that it is a compile-time error if the type argument of a constant list literal includes a type variable.
-Language/10_Expressions/15_Method_Invocation/3_Static_Invocation_A03_t04: Fail # Checks that it is a static warning if interface C does not declare a static method or getter m.
-Language/10_Expressions/22_Equality_A01_t15: Fail # Checks that equality expressions cannot be operands of another equality expression.
-Language/10_Expressions/22_Equality_A01_t16: Fail # Checks that equality expressions cannot be operands of another equality expression.
-Language/10_Expressions/23_Relational_Expressions_A01_t10: Fail # Checks that a relational expression cannot be the operand of another relational expression.
-Language/10_Expressions/23_Relational_Expressions_A01_t11: Fail # Checks that a relational expression cannot be the operand of another relational expression.
-Language/10_Expressions/23_Relational_Expressions_A01_t12: Fail # Checks that a relational expression cannot be the operand of another relational expression.
-Language/10_Expressions/23_Relational_Expressions_A01_t13: Fail # Checks that a relational expression cannot be the operand of another relational expression.
-Language/10_Expressions/30_Identifier_Reference_A07_t01: Fail # Checks that it is a compile-time error when a built-in identifier "abstract" is used as a type annotation of a local variable.
-Language/11_Statements/03_Variable_Declaration_A04_t01: Fail # Checks that if the variable declaration is prefixed with the const modifier, then variable must be initialized to a constant expression.
+Language/11_Expressions/01_Constants_A16_t01: Fail # Checks that an IntegerDivisionByZeroException raised during evaluation  of a compile-time constant causes a compile-time error.
+Language/11_Expressions/01_Constants_A16_t02: Fail # Checks that an OutOfMemoryException raised during evaluation of a compile-time constant causes a compile-time error.
+Language/11_Expressions/05_Strings_A02_t46: Fail # Checks that multi-line strings that contain characters and sequences prohibited by this grammar, cause compile-time errors.
+Language/11_Expressions/05_Strings_A02_t48: Fail # Checks that multi-line strings that contain characters and sequences prohibited by this grammar, cause compile-time errors.
+Language/11_Expressions/06_Lists_A04_t01: Fail # Checks that it is a compile-time error if the type argument of a constant list literal includes a type variable.
+Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A03_t04: Fail # Checks that it is a static warning if interface C does not declare a static method or getter m.
+Language/11_Expressions/22_Equality_A01_t15: Fail # Checks that equality expressions cannot be operands of another equality expression.
+Language/11_Expressions/22_Equality_A01_t16: Fail # Checks that equality expressions cannot be operands of another equality expression.
+Language/11_Expressions/23_Relational_Expressions_A01_t10: Fail # Checks that a relational expression cannot be the operand of another relational expression.
+Language/11_Expressions/23_Relational_Expressions_A01_t11: Fail # Checks that a relational expression cannot be the operand of another relational expression.
+Language/11_Expressions/23_Relational_Expressions_A01_t12: Fail # Checks that a relational expression cannot be the operand of another relational expression.
+Language/11_Expressions/23_Relational_Expressions_A01_t13: Fail # Checks that a relational expression cannot be the operand of another relational expression.
+Language/11_Expressions/30_Identifier_Reference_A07_t01: Fail # Checks that it is a compile-time error when a built-in identifier "abstract" is used as a type annotation of a local variable.
+Language/12_Statements/03_Variable_Declaration_A04_t01: Fail # Checks that if the variable declaration is prefixed with the const modifier, then variable must be initialized to a constant expression.
 Language/14_Types/3_Type_Declarations/1_Typedef_A07_t01: Fail # Checks that self-referencing typedef is not allowed (return value type annotation has the same name as a type alias).
 Language/14_Types/3_Type_Declarations/1_Typedef_A07_t02: Fail # Checks that self-referencing typedef is not allowed (positional formal parameter type annotation has the same name as a type alias).
 Language/14_Types/3_Type_Declarations/1_Typedef_A07_t03: Fail # Checks that self-referencing typedef is not allowed (optional formal parameter type annotation has the same name as a type alias).
@@ -690,18 +670,14 @@
 # Unexpected compile-time errors.
 #
 [ $compiler == dart2js ]
-Language/10_Expressions/15_Method_Invocation/3_Static_Invocation_A03_t03: Fail # http://dartbug.com/5027
-Language/10_Expressions/15_Method_Invocation/3_Static_Invocation_A03_t06: Fail # http://dartbug.com/5027
+Language/11_Expressions/14_Function_Invocation/2_Binding_Actuals_to_Formals_A04_t01: Fail # Checks that it is a compile-time error if there are two named arguments with the same name in a function invocation expression.
+Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A03_t03: Fail # http://dartbug.com/5027
+Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A03_t06: Fail # http://dartbug.com/5027
 
 Language/14_Types/2_Dynamic_Type_System_A02_t01: Fail # http://dartbug.com/5029
 
-Language/10_Expressions/15_Method_Invocation/4_Super_Invocation_A04_t03: Fail # http://dartbug.com/3566
-Language/10_Expressions/15_Method_Invocation/4_Super_Invocation_A04_t04: Fail # http://dartbug.com/3566
-
 Language/03_Overview/03_Overview_A01_t01: Fail # http://dartbug.com/3903
 
-Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A01_t01: Fail # http://dartbug.com/5026
-
 Language/07_Classes/3_Setters_A04_t01: Fail # http://dartbug.com/5023
 Language/07_Classes/3_Setters_A04_t02: Fail # http://dartbug.com/5023
 Language/07_Classes/3_Setters_A04_t03: Fail # http://dartbug.com/5023
diff --git a/tests/co19/co19-runtime.status b/tests/co19/co19-runtime.status
index 51b34ca..0666c0c 100644
--- a/tests/co19/co19-runtime.status
+++ b/tests/co19/co19-runtime.status
@@ -26,12 +26,11 @@
 Language/13_Libraries_and_Scripts/1_Imports_A02_t21: Crash # TODO(vm-team): Please triage this crash.
 Language/13_Libraries_and_Scripts/1_Imports_A02_t22: Crash # TODO(vm-team): Please triage this crash.
 
-Language/03_Overview/1_Scoping_A02_t05: Fail # TODO(vm-team): Please triage this failure.
-Language/05_Variables/05_Variables_A03_t04: Fail # TODO(vm-team): Please triage this failure.
-Language/05_Variables/05_Variables_A03_t11: Fail # TODO(vm-team): Please triage this failure.
-Language/05_Variables/05_Variables_A03_t13: Fail # TODO(vm-team): Please triage this failure.
-Language/05_Variables/05_Variables_A03_t14: Fail # TODO(vm-team): Please triage this failure.
-Language/05_Variables/05_Variables_A03_t15: Fail # TODO(vm-team): Please triage this failure.
+Language/05_Variables/05_Variables_A05_t04: Fail # TODO(vm-team): Please triage this failure.
+Language/05_Variables/05_Variables_A05_t11: Fail # TODO(vm-team): Please triage this failure.
+Language/05_Variables/05_Variables_A05_t13: Fail # TODO(vm-team): Please triage this failure.
+Language/05_Variables/05_Variables_A05_t14: Fail # TODO(vm-team): Please triage this failure.
+Language/05_Variables/05_Variables_A05_t15: Fail # TODO(vm-team): Please triage this failure.
 Language/05_Variables/1_Evaluation_of_Implicit_Variable_Getters_A01_t02: Fail # TODO(vm-team): Please triage this failure.
 Language/05_Variables/1_Evaluation_of_Implicit_Variable_Getters_A01_t05: Fail # TODO(vm-team): Please triage this failure.
 Language/07_Classes/2_Getters_A01_t03: Fail # TODO(vm-team): Please triage this failure.
@@ -59,121 +58,111 @@
 Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t01: Fail # TODO(vm-team): Please triage this failure.
 Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t02: Fail # TODO(vm-team): Please triage this failure.
 Language/08_Interfaces/5_Superinterfaces_A01_t02: Fail # TODO(vm-team): Please triage this failure.
-Language/09_Generics/09_Generics_A05_t01: Fail # TODO(vm-team): Please triage this failure.
-Language/09_Generics/09_Generics_A05_t02: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/01_Constants_A03_t01: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/01_Constants_A05_t01: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/01_Constants_A06_t01: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/01_Constants_A14_t01: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/05_Strings/1_String_Interpolation_A01_t04: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/05_Strings/1_String_Interpolation_A01_t05: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/05_Strings/1_String_Interpolation_A01_t06: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/05_Strings_A02_t46: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/05_Strings_A02_t48: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/09_Function_Expressions_A03_t02: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/09_Function_Expressions_A04_t02: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/11_Instance_Creation/1_New_A02_t03: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/11_Instance_Creation/1_New_A02_t05: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/11_Instance_Creation/1_New_A09_t09: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/11_Instance_Creation/2_Const_A10_t01: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t03: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A03_t01: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A05_t02: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t08: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/15_Method_Invocation/4_Super_Invocation_A04_t03: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/15_Method_Invocation/4_Super_Invocation_A04_t04: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/17_Getter_Invocation_A02_t01: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/17_Getter_Invocation_A02_t02: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/18_Assignment_A05_t02: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/18_Assignment_A05_t04: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/18_Assignment_A05_t05: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/18_Assignment_A08_t04: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/19_Conditional_A01_t10: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/19_Conditional_A01_t11: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/19_Conditional_A01_t12: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/19_Conditional_A01_t13: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/19_Conditional_A01_t14: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/19_Conditional_A01_t15: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/20_Logical_Boolean_Expressions_A01_t10: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/20_Logical_Boolean_Expressions_A01_t11: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/20_Logical_Boolean_Expressions_A01_t12: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/20_Logical_Boolean_Expressions_A01_t13: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/20_Logical_Boolean_Expressions_A01_t14: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/21_Bitwise_Expressions_A01_t12: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/21_Bitwise_Expressions_A01_t13: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/21_Bitwise_Expressions_A01_t14: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/21_Bitwise_Expressions_A01_t15: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/21_Bitwise_Expressions_A01_t16: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/21_Bitwise_Expressions_A01_t17: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/22_Equality_A01_t23: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/22_Equality_A01_t24: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/23_Relational_Expressions_A01_t18: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/23_Relational_Expressions_A01_t19: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/23_Relational_Expressions_A01_t20: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/23_Relational_Expressions_A01_t21: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/23_Relational_Expressions_A01_t22: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/23_Relational_Expressions_A01_t23: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/24_Shift_A01_t09: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/24_Shift_A01_t10: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/24_Shift_A01_t11: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/24_Shift_A01_t12: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/24_Shift_A01_t13: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/24_Shift_A01_t14: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/25_Additive_Expressions_A01_t07: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/25_Additive_Expressions_A01_t08: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/25_Additive_Expressions_A01_t11: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/25_Additive_Expressions_A01_t12: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/25_Additive_Expressions_A01_t13: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/25_Additive_Expressions_A01_t14: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/26_Multiplicative_Expressions_A01_t10: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/26_Multiplicative_Expressions_A01_t11: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/26_Multiplicative_Expressions_A01_t14: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/26_Multiplicative_Expressions_A01_t15: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/26_Multiplicative_Expressions_A01_t16: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/26_Multiplicative_Expressions_A01_t17: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/27_Unary_Expressions_A01_t02: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/27_Unary_Expressions_A01_t04: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/27_Unary_Expressions_A01_t05: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/27_Unary_Expressions_A01_t11: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/27_Unary_Expressions_A01_t12: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/27_Unary_Expressions_A01_t13: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/27_Unary_Expressions_A01_t17: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/27_Unary_Expressions_A01_t18: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/27_Unary_Expressions_A01_t19: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/27_Unary_Expressions_A01_t20: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/27_Unary_Expressions_A01_t21: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/27_Unary_Expressions_A01_t22: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/28_Postfix_Expressions_A01_t02: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/28_Postfix_Expressions_A01_t03: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/28_Postfix_Expressions_A01_t05: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/29_Assignable_Expressions_A01_t06: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/29_Assignable_Expressions_A01_t08: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/29_Assignable_Expressions_A01_t09: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/30_Identifier_Reference_A04_t09: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/30_Identifier_Reference_A05_t02: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/30_Identifier_Reference_A05_t08: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/30_Identifier_Reference_A06_t01: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/30_Identifier_Reference_A06_t02: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/30_Identifier_Reference_A07_t01: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/30_Identifier_Reference_A08_t02: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/31_Type_Test_A01_t02: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/31_Type_Test_A01_t04: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/31_Type_Test_A05_t01: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/31_Type_Test_A05_t02: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/31_Type_Test_A05_t03: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/32_Type_Cast_A04_t01: Fail # TODO(vm-team): Please triage this failure.
-Language/10_Expressions/32_Type_Cast_A04_t02: Fail # TODO(vm-team): Please triage this failure.
-Language/11_Statements/04_Local_Function_Declaration_A02_t02: Fail # TODO(vm-team): Please triage this failure.
-Language/11_Statements/06_For_A01_t11: Fail # TODO(vm-team): Please triage this failure.
-Language/11_Statements/09_Switch_A01_t02: Fail # TODO(vm-team): Please triage this failure.
-Language/11_Statements/09_Switch_A02_t01: Fail # TODO(vm-team): Please triage this failure.
-Language/11_Statements/09_Switch_A02_t02: Fail # TODO(vm-team): Please triage this failure.
-Language/11_Statements/09_Switch_A02_t03: Fail # TODO(vm-team): Please triage this failure.
-Language/11_Statements/09_Switch_A03_t01: Fail # TODO(vm-team): Please triage this failure.
-Language/11_Statements/09_Switch_A03_t02: Fail # TODO(vm-team): Please triage this failure.
-Language/11_Statements/09_Switch_A06_t02: Fail # TODO(vm-team): Please triage this failure.
-Language/11_Statements/10_Try_A11_t01: Fail # TODO(vm-team): Please triage this failure.
-Language/11_Statements/12_Labels_A01_t03: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/01_Constants_A03_t01: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/01_Constants_A05_t01: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/01_Constants_A06_t01: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/01_Constants_A14_t01: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/05_Strings/1_String_Interpolation_A01_t04: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/05_Strings/1_String_Interpolation_A01_t05: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/05_Strings/1_String_Interpolation_A01_t06: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/05_Strings_A02_t46: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/05_Strings_A02_t48: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/11_Instance_Creation/1_New_A02_t03: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/11_Instance_Creation/1_New_A02_t05: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/11_Instance_Creation/1_New_A09_t09: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/11_Instance_Creation/2_Const_A10_t01: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A03_t01: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A05_t02: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t08: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/17_Getter_Invocation_A02_t01: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/18_Assignment_A05_t02: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/18_Assignment_A05_t04: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/18_Assignment_A05_t05: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/19_Conditional_A01_t10: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/19_Conditional_A01_t11: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/19_Conditional_A01_t12: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/19_Conditional_A01_t13: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/19_Conditional_A01_t14: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/19_Conditional_A01_t15: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/20_Logical_Boolean_Expressions_A01_t10: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/20_Logical_Boolean_Expressions_A01_t11: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/20_Logical_Boolean_Expressions_A01_t12: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/20_Logical_Boolean_Expressions_A01_t13: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/20_Logical_Boolean_Expressions_A01_t14: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/21_Bitwise_Expressions_A01_t12: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/21_Bitwise_Expressions_A01_t13: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/21_Bitwise_Expressions_A01_t14: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/21_Bitwise_Expressions_A01_t15: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/21_Bitwise_Expressions_A01_t16: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/21_Bitwise_Expressions_A01_t17: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/22_Equality_A01_t23: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/22_Equality_A01_t24: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/23_Relational_Expressions_A01_t18: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/23_Relational_Expressions_A01_t19: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/23_Relational_Expressions_A01_t20: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/23_Relational_Expressions_A01_t21: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/23_Relational_Expressions_A01_t22: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/23_Relational_Expressions_A01_t23: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/24_Shift_A01_t09: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/24_Shift_A01_t10: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/24_Shift_A01_t11: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/24_Shift_A01_t12: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/24_Shift_A01_t13: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/24_Shift_A01_t14: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/25_Additive_Expressions_A01_t07: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/25_Additive_Expressions_A01_t08: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/25_Additive_Expressions_A01_t11: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/25_Additive_Expressions_A01_t12: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/25_Additive_Expressions_A01_t13: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/25_Additive_Expressions_A01_t14: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/26_Multiplicative_Expressions_A01_t10: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/26_Multiplicative_Expressions_A01_t11: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/26_Multiplicative_Expressions_A01_t14: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/26_Multiplicative_Expressions_A01_t15: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/26_Multiplicative_Expressions_A01_t16: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/26_Multiplicative_Expressions_A01_t17: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/27_Unary_Expressions_A01_t02: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/27_Unary_Expressions_A01_t04: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/27_Unary_Expressions_A01_t05: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/27_Unary_Expressions_A01_t11: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/27_Unary_Expressions_A01_t12: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/27_Unary_Expressions_A01_t13: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/27_Unary_Expressions_A01_t17: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/27_Unary_Expressions_A01_t18: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/27_Unary_Expressions_A01_t19: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/27_Unary_Expressions_A01_t20: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/27_Unary_Expressions_A01_t21: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/27_Unary_Expressions_A01_t22: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/28_Postfix_Expressions_A01_t02: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/28_Postfix_Expressions_A01_t03: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/28_Postfix_Expressions_A01_t05: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/29_Assignable_Expressions_A01_t06: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/29_Assignable_Expressions_A01_t08: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/29_Assignable_Expressions_A01_t09: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/30_Identifier_Reference_A05_t02: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/30_Identifier_Reference_A05_t08: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/30_Identifier_Reference_A06_t01: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/30_Identifier_Reference_A06_t02: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/30_Identifier_Reference_A07_t01: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/30_Identifier_Reference_A08_t02: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/31_Type_Test_A01_t02: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/31_Type_Test_A01_t04: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/31_Type_Test_A05_t01: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/31_Type_Test_A05_t02: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/31_Type_Test_A05_t03: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/32_Type_Cast_A04_t01: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/32_Type_Cast_A04_t02: Fail # TODO(vm-team): Please triage this failure.
+Language/12_Statements/04_Local_Function_Declaration_A02_t02: Fail # TODO(vm-team): Please triage this failure.
+Language/12_Statements/06_For_A01_t11: Fail # TODO(vm-team): Please triage this failure.
+Language/12_Statements/09_Switch_A01_t02: Fail # TODO(vm-team): Please triage this failure.
+Language/12_Statements/09_Switch_A02_t01: Fail # TODO(vm-team): Please triage this failure.
+Language/12_Statements/09_Switch_A02_t02: Fail # TODO(vm-team): Please triage this failure.
+Language/12_Statements/09_Switch_A02_t03: Fail # TODO(vm-team): Please triage this failure.
+Language/12_Statements/09_Switch_A03_t01: Fail # TODO(vm-team): Please triage this failure.
+Language/12_Statements/09_Switch_A03_t02: Fail # TODO(vm-team): Please triage this failure.
+Language/12_Statements/09_Switch_A06_t02: Fail # TODO(vm-team): Please triage this failure.
+Language/12_Statements/10_Try_A11_t01: Fail # TODO(vm-team): Please triage this failure.
+Language/12_Statements/12_Labels_A01_t03: Fail # TODO(vm-team): Please triage this failure.
 Language/13_Libraries_and_Scripts/13_Libraries_and_Scripts_A03_t01: Fail # TODO(vm-team): Please triage this failure.
 Language/13_Libraries_and_Scripts/13_Libraries_and_Scripts_A05_t04: Fail # TODO(vm-team): Please triage this failure.
 Language/13_Libraries_and_Scripts/1_Imports_A01_t53: Fail # TODO(vm-team): Please triage this failure.
@@ -211,15 +200,16 @@
 
 LibTest/isolate/isolate_api/port_A01_t01: Skip # Times out.
 
+LibTest/core/String/String_class_A02_t01: Fail, OK # co19 issue 284
+LibTest/core/String/charCodeAt_A01_t01: Fail, OK # co19 issue 284
+LibTest/core/String/charCodes_A01_t01: Fail, OK # co19 issue 284
+
 Language/06_Functions/1_Function_Declaration_A02_t03: Fail # issue 6058
 Language/06_Functions/1_Function_Declaration_A03_t03: Fail # issue 6058
 Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A03_t01: Fail # issue 6085
 Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A03_t02: Fail # issue 6085
 Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A03_t03: Fail # issue 6085
 
-LibTest/core/Map/putIfAbsent_A01_t08: Fail, OK # co19 issue 276
-LibTest/core/Map/putIfAbsent_A01_t06: Fail, OK # co19 issue 276
-
 LibTest/core/EmptyQueueException/EmptyQueueException_A01_t01: Fail, OK # co19 issue 288
 LibTest/core/EmptyQueueException/toString_A01_t01: Fail, OK # co19 issue 288
 LibTest/core/List/iterator_next_A02_t01: Fail, OK # co19 issue 288
@@ -229,24 +219,25 @@
 LibTest/core/Queue/removeFirst_A02_t01: Fail, OK # co19 issue 288
 LibTest/core/Queue/removeLast_A02_t01: Fail, OK # co19 issue 288
 
+LibTest/core/NoSuchMethodError/NoSuchMethodError_A01_t01: Fail, OK # co19 issue 300
+LibTest/core/NoSuchMethodError/toString_A01_t01: Fail, OK # co19 issue 300
 
 [ $compiler == none && $runtime == vm && $checked ]
-Language/07_Classes/6_Constructors/2_Factories_A03_t05: Fail # TODO(vm-team): Please triage this failure.
-Language/11_Statements/05_If_A02_t01: Fail # TODO(vm-team): Please triage this failure.
-Language/11_Statements/09_Switch_A05_t01: Fail # TODO(vm-team): Please triage this failure.
-Language/11_Statements/15_Assert_A04_t04: Fail # TODO(vm-team): Please triage this failure.
+Language/12_Statements/05_If_A02_t01: Fail # TODO(vm-team): Please triage this failure.
+Language/12_Statements/09_Switch_A05_t01: Fail # TODO(vm-team): Please triage this failure.
 Language/14_Types/7_Type_Void_A04_t02: Fail # TODO(vm-team): Please triage this failure.
 Language/14_Types/7_Type_Void_A04_t03: Fail # TODO(vm-team): Please triage this failure.
 Language/14_Types/7_Type_Void_A04_t04: Fail # TODO(vm-team): Please triage this failure.
 Language/14_Types/7_Type_Void_A04_t05: Fail # TODO(vm-team): Please triage this failure.
 LibTest/core/Map/putIfAbsent_A01_t07: Fail # TODO(vm-team): Please triage this failure.
+LibTest/core/Map/putIfAbsent_A01_t08: Fail # TODO(vm-team): Please triage this failure.
 
 Language/14_Types/7_Type_Void_A04_t02: Fail, OK # co19 issue 158
 Language/14_Types/7_Type_Void_A04_t03: Fail, OK # co19 issue 158
 Language/14_Types/7_Type_Void_A04_t04: Fail, OK # co19 issue 158
 Language/14_Types/7_Type_Void_A04_t05: Fail, OK # co19 issue 158
 
-Language/10_Expressions/11_Instance_Creation_A05_t02: Fail # co19 issue 234
+Language/11_Expressions/11_Instance_Creation_A05_t02: Fail # co19 issue 234
 
 [ $compiler == none && $runtime == vm && $unchecked ]
 Language/14_Types/2_Dynamic_Type_System_A02_t01: Fail # TODO(vm-team): Please triage this failure.
@@ -255,13 +246,13 @@
 
 [ $compiler == none && $runtime == vm ]
 # Not properly reporting exception in initializer expressions
-Language/10_Expressions/01_Constants_A16_t01: Fail
-Language/10_Expressions/01_Constants_A16_t02: Fail
+Language/11_Expressions/01_Constants_A16_t01: Fail
+Language/11_Expressions/01_Constants_A16_t02: Fail
 
 Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t03: Fail # issue 392, potentially constant expression analysis
 
-Language/10_Expressions/01_Constants_A17_t03: Crash # issue 1681 (recursion in compile-time constant expression)
-Language/10_Expressions/01_Constants_A16_t02: Crash, Pass # Should result in OOM
+Language/11_Expressions/01_Constants_A17_t03: Crash # issue 1681 (recursion in compile-time constant expression)
+Language/11_Expressions/01_Constants_A16_t02: Crash, Pass # Should result in OOM
 
 # co19 issue 183 - must not instantiate an abstract class
 # Some of these tests are expected to fail for another reason. These are marked as Skip.
@@ -269,28 +260,25 @@
 Language/07_Classes/07_Classes_A02_t31: Skip # co19 issue 183
 
 # co19 175 - related to issue 4522, all need fixing, some passes because of temporary warning.
-Language/10_Expressions/07_Maps_A03_t01: Pass, Fail # co19 175
-Language/10_Expressions/07_Maps_A04_t01: Pass, Fail # co19 175
-Language/10_Expressions/07_Maps_A04_t02: Pass, Fail # co19 175
-Language/10_Expressions/07_Maps_A06_t01: Pass, Fail # co19 175
-Language/10_Expressions/07_Maps_A06_t02: Pass, Fail # co19 175
-Language/10_Expressions/07_Maps_A07_t04: Pass, Fail # co19 175
-Language/10_Expressions/07_Maps_A07_t03: Pass, Fail # co19 175
-Language/10_Expressions/07_Maps_A08_t01: Pass, Fail # co19 175
-Language/10_Expressions/07_Maps_A10_t01: Pass, Fail # co19 175
-Language/10_Expressions/07_Maps_A10_t02: Pass, Fail # co19 175
-Language/10_Expressions/07_Maps_A10_t03: Pass, Fail # co19 175
-Language/10_Expressions/07_Maps_A10_t04: Pass, Fail # co19 175
-Language/10_Expressions/07_Maps_A10_t05: Pass, Fail # co19 175
+Language/11_Expressions/07_Maps_A03_t01: Pass, Fail # co19 175
+Language/11_Expressions/07_Maps_A04_t01: Pass, Fail # co19 175
+Language/11_Expressions/07_Maps_A04_t02: Pass, Fail # co19 175
+Language/11_Expressions/07_Maps_A06_t01: Pass, Fail # co19 175
+Language/11_Expressions/07_Maps_A06_t02: Pass, Fail # co19 175
+Language/11_Expressions/07_Maps_A07_t04: Pass, Fail # co19 175
+Language/11_Expressions/07_Maps_A07_t03: Pass, Fail # co19 175
+Language/11_Expressions/07_Maps_A08_t01: Pass, Fail # co19 175
+Language/11_Expressions/07_Maps_A10_t01: Pass, Fail # co19 175
+Language/11_Expressions/07_Maps_A10_t02: Pass, Fail # co19 175
+Language/11_Expressions/07_Maps_A10_t03: Pass, Fail # co19 175
+Language/11_Expressions/07_Maps_A10_t04: Pass, Fail # co19 175
+Language/11_Expressions/07_Maps_A10_t05: Pass, Fail # co19 175
 
-Language/10_Expressions/05_Strings_A02_t01: Skip # co19 issue 90.
-Language/10_Expressions/07_Maps_A01_t01: Skip # co19 issue 91: map literals illegal at statement beginning.
+Language/11_Expressions/05_Strings_A02_t01: Skip # co19 issue 90.
+Language/11_Expressions/07_Maps_A01_t01: Skip # co19 issue 91: map literals illegal at statement beginning.
 
-Language/10_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A05_t01: Fail # issue 1604.
-Language/10_Expressions/27_Unary_Expressions_A01_t01: Fail # issue 1288 (unary super operator call)
-Language/10_Expressions/27_Unary_Expressions_A01_t10: Fail # issue 2037 (super.x is assignable)
-Language/10_Expressions/27_Unary_Expressions_A08_t01: Fail # issue 1288 (unary super operator call)
-Language/10_Expressions/28_Postfix_Expressions_A01_t01: Fail # co19 issue 91: map literals illegal at statement beginning.
+Language/11_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A05_t01: Fail # issue 1604.
+Language/11_Expressions/27_Unary_Expressions_A01_t01: Fail # issue 1288 (unary super operator call)
 
 LibTest/core/List/every_A03_t01: Skip # Promise removed (co19 issue #79)
 LibTest/core/List/filter_A03_t01: Skip # Promise removed (co19 issue #79)
@@ -308,7 +296,6 @@
 
 [ $compiler == none && $runtime == vm ]
 LibTest/core/Date/Date.fromString_A03_t01: Fail # Issue co19 - 121
-LibTest/core/Expect/throws_A02_t01: Fail # Issue co19 - 42
 LibTest/core/Match/operator_subscript_A01_t01: Fail
 LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t05: Fail
 LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t06: Fail
@@ -353,8 +340,6 @@
 LibTest/core/Date/toString_A02_t01: Fail, OK
 LibTest/core/Date/year_A01_t01: Fail, OK
 
-LibTest/core/String/charCodes_A01_t01: Fail, OK # co19 issue 289
-
 LibTest/isolate/SendPort/send_A02_t02: Fail, OK # co19 issue 293
 LibTest/isolate/SendPort/send_A02_t03: Fail, OK # co19 issue 293
 LibTest/isolate/SendPort/send_A02_t04: Fail, OK # co19 issue 293
@@ -376,56 +361,38 @@
 LibTest/core/Stopwatch/stop_A01_t01: Fail, OK # co19 issue 297
 LibTest/core/Stopwatch/frequency_A01_t01: Fail, OK # co19 issue 297
 
-
-LibTest/core/Match/end_A01_t01: Fail, OK # co19 issue 294
-LibTest/core/Match/group_A01_t01: Fail, OK # co19 issue 294
-LibTest/core/Match/groupCount_A01_t01: Fail, OK # co19 issue 294
 LibTest/core/Match/operator_subscript_A01_t01: Fail, OK # co19 issue 294
-LibTest/core/Match/start_A01_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/allMatches_A01_t01: Fail, OK # co19 issue 294
 LibTest/core/RegExp/firstMatch_A01_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Assertion_A03_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Assertion_A04_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Assertion_A05_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A01_t01: Fail, OK # co19 issue 294
 LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A02_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A03_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A03_t02: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A03_t03: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A04_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A05_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A06_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_AtomEscape_A01_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Disjunction_A01_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Quantifier_A01_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Quantifier_A02_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Quantifier_A03_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Quantifier_A04_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Quantifier_A05_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Quantifier_A06_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Term_A01_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Term_A02_t01: Fail, OK # co19 issue 294
 LibTest/core/RegExp/Pattern_semantics/firstMatch_Term_A03_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/Pattern_semantics/firstMatch_Term_A04_t01: Fail, OK # co19 issue 294
 
-LibTest/core/Queue/filter_A01_t04: Fail, OK # co19 issue 291
-LibTest/core/Queue/first_A01_t01: Fail, OK # co19 issue 291
-LibTest/core/Queue/removeFirst_A01_t01: Fail, OK # co19 issue 291
 LibTest/core/Queue/first_A02_t01: Fail, OK # co19 issue 291
-LibTest/core/Queue/addFirst_A01_t01: Fail, OK # co19 issue 291
-LibTest/core/Queue/removeLast_A01_t01: Fail, OK # co19 issue 291
-LibTest/core/Queue/add_A01_t01: Fail, OK # co19 issue 291
 LibTest/core/Queue/last_A02_t01: Fail, OK # co19 issue 291
-LibTest/core/Queue/addLast_A01_t01: Fail, OK # co19 issue 291
-LibTest/core/Queue/last_A01_t01: Fail, OK # co19 issue 291
-LibTest/core/List/last_A02_t01: Fail, OK # co19 issue 291
-LibTest/core/List/last_A01_t01: Fail, OK # co19 issue 291
 
-Language/10_Expressions/07_Maps_A07_t03: Fail, OK # co19 issue 287
-Language/10_Expressions/07_Maps_A04_t02: Fail, OK # co19 issue 287
-LibTest/core/Queue/filter_A01_t04: Fail, OK # co19 issue 287
+Language/11_Expressions/07_Maps_A07_t03: Fail, OK # co19 issue 287
+Language/11_Expressions/07_Maps_A04_t02: Fail, OK # co19 issue 287
+
 LibTest/core/Map/getValues_A01_t02: Fail, OK # co19 issue 287
 
+LibTest/core/List/List_A01_t01: Fail, OK # co19 issue 290
+LibTest/core/List/getRange_A04_t01: Fail, OK # co19 issue 290
+LibTest/core/List/insertRange_A06_t01: Fail, OK # co19 issue 290
+LibTest/core/List/last_A02_t01: Fail, OK # co19 issue 290
+LibTest/core/List/length_A05_t01: Fail, OK # co19 issue 290
+LibTest/core/List/operator_subscript_A02_t01: Fail, OK # co19 issue 290
+LibTest/core/List/operator_subscripted_assignment_A02_t01: Fail, OK # co19 issue 290
+LibTest/core/List/removeLast_A01_t02: Fail, OK # co19 issue 290
+LibTest/core/List/removeRange_A05_t01: Fail, OK # co19 issue 290
+LibTest/core/List/setRange_A02_t01: Fail, OK # co19 issue 290
+LibTest/core/List/setRange_A02_t02: Fail, OK # co19 issue 290
+LibTest/core/List/setRange_A03_t01: Fail, OK # co19 issue 290
+LibTest/core/List/setRange_A03_t02: Fail, OK # co19 issue 290
+LibTest/core/Match/group_A02_t01: Fail, OK # co19 issue 290
+LibTest/core/Match/groups_A02_t01: Fail, OK # co19 issue 290
+LibTest/core/Match/operator_subscript_A02_t01: Fail, OK # co19 issue 290
+LibTest/core/String/charCodeAt_A02_t01: Fail, OK # co19 issue 290
+LibTest/core/String/operator_subscript_A02_t01: Fail, OK # co19 issue 290
+LibTest/core/String/substring_A02_t01: Fail, OK # co19 issue 290
 
 [ $compiler == none && $runtime == vm ]
 LibTest/core/String/contains_A01_t03: Skip # Times out.
@@ -440,43 +407,33 @@
 [ $compiler == none && $runtime == vm ]
 Language/07_Classes/07_Classes_A02_t29: Fail
 Language/07_Classes/07_Classes_A02_t31: Fail
-Language/10_Expressions/05_Strings/1_String_Interpolation_A03_t02: Fail
-Language/10_Expressions/05_Strings/1_String_Interpolation_A04_t02: Fail
-Language/10_Expressions/05_Strings_A20_t01: Fail
-Language/10_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t04: Fail  # co19 issue 166
-Language/10_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t05: Fail
-Language/10_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A02_t01: Fail
-Language/10_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A08_t01: Fail
-Language/10_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t02: Fail # Issue 1604, exception should be NoSuchMethodException instead of ObjectNotClosureException
-Language/10_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t03: Fail # Issue 1604, exception should be NoSuchMethodException instead of ObjectNotClosureException
-Language/10_Expressions/15_Method_Invocation/3_Static_Invocation_A05_t01: Fail # Issue 1604, exception should be NoSuchMethodException instead of ObjectNotClosureException
-Language/10_Expressions/15_Method_Invocation/3_Static_Invocation_A06_t02: Fail # Issue 1604, exception should be NoSuchMethodException instead of ObjectNotClosureException
-LibTest/core/Future/handleException_A01_t07: Fail
-LibTest/core/Future/then_A01_t05: Fail
+Language/11_Expressions/05_Strings/1_String_Interpolation_A03_t02: Fail
+Language/11_Expressions/05_Strings/1_String_Interpolation_A04_t02: Fail
+Language/11_Expressions/05_Strings_A20_t01: Fail
+Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t02: Fail # Issue 1604, exception should be NoSuchMethodException instead of ObjectNotClosureException
+Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t03: Fail # Issue 1604, exception should be NoSuchMethodException instead of ObjectNotClosureException
+Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A05_t01: Fail # Issue 1604, exception should be NoSuchMethodException instead of ObjectNotClosureException
+Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A06_t02: Fail # Issue 1604, exception should be NoSuchMethodException instead of ObjectNotClosureException
 LibTest/isolate/ReceivePort/receive_A01_t02: Fail
 LibTest/isolate/isolate_api/spawnUri_A01_t03: Crash
 LibTest/isolate/isolate_api/spawnUri_A01_t04: Crash
 
 
 # class '?' overrides function '?' of super class '?' with incompatible parameters
-Language/10_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t02: Fail
-Language/10_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t03: Fail
-Language/10_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t05: Fail
-Language/10_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t06: Fail
-Language/10_Expressions/15_Method_Invocation/4_Super_Invocation_A04_t01: Fail # Issue 3622
-Language/10_Expressions/15_Method_Invocation/4_Super_Invocation_A04_t02: Fail # Issue 3622
+Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t02: Fail
+Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t03: Fail
 
 
 # function 'func' not found in super class, getter 'func' should be invoked first.
-Language/10_Expressions/15_Method_Invocation/4_Super_Invocation_A02_t04: Fail # co19 issue 251 or issue 5732
-Language/10_Expressions/15_Method_Invocation/4_Super_Invocation_A03_t02: Fail # co19 issue 251 or issue 5732
-Language/10_Expressions/15_Method_Invocation/4_Super_Invocation_A03_t03: Fail # co19 issue 251 or issue 5732
-Language/10_Expressions/15_Method_Invocation/4_Super_Invocation_A07_t01: Fail # co19 issue 251 or issue 5732
-Language/10_Expressions/15_Method_Invocation/4_Super_Invocation_A08_t02: Fail # co19 issue 251 or issue 5732
+Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A02_t04: Fail # co19 issue 251 or issue 5732
+Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A03_t02: Fail # co19 issue 251 or issue 5732
+Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A03_t03: Fail # co19 issue 251 or issue 5732
+Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A07_t01: Fail # co19 issue 251 or issue 5732
+Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A08_t02: Fail # co19 issue 251 or issue 5732
 
 
 # initializer must be a compile time constant
-Language/10_Expressions/30_Identifier_Reference_A05_t09: Fail
+Language/11_Expressions/30_Identifier_Reference_A05_t09: Fail
 
 
 # invalid operator overloading
diff --git a/tests/compiler/dart2js/backend_htype_list_test.dart b/tests/compiler/dart2js/backend_htype_list_test.dart
index 5d56b84..30369be 100644
--- a/tests/compiler/dart2js/backend_htype_list_test.dart
+++ b/tests/compiler/dart2js/backend_htype_list_test.dart
@@ -2,12 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "dart:uri";
+import 'dart:uri';
 
-import "../../../lib/compiler/implementation/elements/elements.dart";
-import "../../../lib/compiler/implementation/js_backend/js_backend.dart";
-import "../../../lib/compiler/implementation/ssa/ssa.dart";
-import "../../../lib/compiler/implementation/dart2jslib.dart";
+import '../../../lib/compiler/implementation/elements/elements.dart';
+import '../../../lib/compiler/implementation/js_backend/js_backend.dart';
+import '../../../lib/compiler/implementation/ssa/ssa.dart';
+import '../../../lib/compiler/implementation/dart2jslib.dart' show Selector;
 
 import 'compiler_helper.dart';
 import 'parser_helper.dart';
diff --git a/tests/compiler/dart2js/begin_end_token_test.dart b/tests/compiler/dart2js/begin_end_token_test.dart
index 2123982..954213e 100644
--- a/tests/compiler/dart2js/begin_end_token_test.dart
+++ b/tests/compiler/dart2js/begin_end_token_test.dart
@@ -2,10 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#import('parser_helper.dart');
-#import("../../../lib/compiler/implementation/scanner/scannerlib.dart");
-#import("../../../lib/compiler/implementation/tree/tree.dart");
-
+import 'parser_helper.dart';
+import '../../../lib/compiler/implementation/tree/tree.dart';
 
 void testNode(Node node, String expected, String text, [bool hard = true]) {
   var debug = 'text=$text,expected=$expected,node:${node}';
diff --git a/tests/compiler/dart2js/call_site_type_inferer_test.dart b/tests/compiler/dart2js/call_site_type_inferer_test.dart
index 8176f75..a32d9e6 100644
--- a/tests/compiler/dart2js/call_site_type_inferer_test.dart
+++ b/tests/compiler/dart2js/call_site_type_inferer_test.dart
@@ -2,14 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#import("dart:uri");
+import 'dart:uri';
 
-#import("../../../lib/compiler/implementation/js_backend/js_backend.dart");
-#import("../../../lib/compiler/implementation/ssa/ssa.dart");
-#import("../../../lib/compiler/implementation/scanner/scannerlib.dart");
+import '../../../lib/compiler/implementation/js_backend/js_backend.dart';
+import '../../../lib/compiler/implementation/ssa/ssa.dart';
 
-#import('compiler_helper.dart');
-#import('parser_helper.dart');
+import 'compiler_helper.dart';
+import 'parser_helper.dart';
 
 void compileAndFind(String code,
                     String className,
diff --git a/tests/compiler/dart2js/dart2js.status b/tests/compiler/dart2js/dart2js.status
index b94725f..5a11b46 100644
--- a/tests/compiler/dart2js/dart2js.status
+++ b/tests/compiler/dart2js/dart2js.status
@@ -10,5 +10,6 @@
 # Minification of locals temporarily disabled due to issue 5808
 minify_many_locals_test: Fail
 
+
 [ $jscl || $runtime == drt || $runtime == dartium || $runtime == ff || $runtime == firefox || $runtime == chrome || $runtime == safari || $runtime == ie9 || $runtime == opera ]
 *: Skip # dart2js uses #import('dart:io'); and it is not self-hosted (yet).
diff --git a/tests/compiler/dart2js/dart_backend_test.dart b/tests/compiler/dart2js/dart_backend_test.dart
index 7e9c960..6b59656 100644
--- a/tests/compiler/dart2js/dart_backend_test.dart
+++ b/tests/compiler/dart2js/dart_backend_test.dart
@@ -53,6 +53,7 @@
 
 const helperLib = r'''
 #library('js_helper');
+class JSInvocationMirror {}
 ''';
 
 testDart2Dart(String src, {void continuation(String s), bool minify: false,
@@ -172,19 +173,6 @@
   testDart2Dart('String get foo{return "a";}main(){foo;}');
 }
 
-testFactoryConstructor() {
-  testDart2Dart('main(){new A.fromFoo();}class A{A.fromFoo();}');
-  // Now more complicated, with normal constructor and factory parameters.
-  testDart2Dart('main(){new A.fromFoo(5);}'
-      'class A{A(this.f);A.fromFoo(foo):this("f");final String f;}');
-  // Now even more complicated, with interface and default factory.
-  testDart2Dart('main(){new A.fromFoo(5);new I.fromFoo();}'
-      'class IFactory{factory I.fromFoo()=>new A(5);}'
-      'interface I default IFactory{I.fromFoo();}'
-      'class A implements I{A(this.f);A.fromFoo(foo):this("f");'
-      'final String f;}');
-}
-
 testAbstractClass() {
   testDart2Dart('main(){A.foo;}abstract class A{final static num foo;}');
 }
@@ -252,12 +240,12 @@
           'static const field=5;}'
       'p_globalfoo(){}'
       'var p_globalVar;var p_globalVarInitialized=6,p_globalVarInitialized2=7;'
-      'class p_A{p_A(){}p_A.fromFoo(){}static p_staticfoo(){}foo(){}'
+      'class p_A{p_A(){}p_A.p_fromFoo(){}static p_staticfoo(){}foo(){}'
           'static const p_field=5;}'
       'main(){p_globalVar;p_globalVarInitialized;'
          'p_globalVarInitialized2;p_globalfoo();'
          'p_A.p_field;p_A.p_staticfoo();'
-         'new p_A();new p_A.fromFoo();new p_A().foo();'
+         'new p_A();new p_A.p_fromFoo();new p_A().foo();'
          'globalVar;globalVarInitialized;globalVarInitialized2;globalfoo();'
          'A.field;A.staticfoo();'
          'new A();new A.fromFoo();new A().foo();}';
@@ -483,42 +471,6 @@
   Expect.isTrue(collector.elementNodes[classElement].contains(defaultTypeNode));
 }
 
-testFactoryRename() {
-  var librarySrc = '''
-#library('mylib');
-
-interface I default B { I(); }
-class A implements I { A() {} }
-class B { factory I() {} }
-
-''';
-  var mainSrc = '''
-#import('mylib.dart', prefix: 'mylib');
-
-interface I default B { I(); }
-class A implements I { A() {} }
-class B { factory I() {} }
-
-main() {
-  new I();
-  new A();
-
-  new mylib.I();
-  new mylib.A();
-}
-''';
-  var expectedResult =
-    'interface I default B{I();}'
-    'class A implements I{A(){}}'
-    'class B{factory I(){}}'
-    'interface p_I default p_B{p_I();}'
-    'class p_A implements p_I{p_A(){}}'
-    'class p_B{factory p_I(){}}'
-    'main(){new p_I();new p_A();new I();new A();}';
-  testDart2DartWithLibrary(mainSrc, librarySrc,
-      continuation: (String result) { Expect.equals(expectedResult, result); });
-}
-
 testTypeVariablesAreRenamed() {
   // Somewhat a hack: we require all the references of the identifier
   // to be renamed in the same way for the whole library. Hence
@@ -610,32 +562,6 @@
       continuation: (String result) { Expect.equals(expectedResult, result); });
 }
 
-testInterfaceDefaultAnotherLib() {
-  var librarySrc = '''
-#library('mylib');
-class C<T> {
-  factory I() {}
-}
-''';
-  var mainSrc = '''
-#import('mylib.dart', prefix: 'mylib');
-
-interface I<T> default mylib.C<T> {
-  I();
-}
-
-main() {
-  new I();
-}
-''';
-  var expectedResult =
-    'class C<T>{factory I(){}}'
-    'interface I<T> default C<T>{I();}'
-    'main(){new I();}';
-  testDart2DartWithLibrary(mainSrc, librarySrc,
-      continuation: (String result) { Expect.equals(expectedResult, result); });
-}
-
 testStaticAccessIoLib() {
   var src = '''
 #import('dart:io');
@@ -710,39 +636,6 @@
       (String result) { Expect.equals(expectedResult, result); }, minify: true);
 }
 
-testTypeVariablesInDifferentLibraries() {
-// This is a simplified version of what we have in
-// lib/compiler/implementation/util.
-  var librarySrc = '''
-#library('mylib');
-#import('script.dart');
-interface Iterable<K> {}
-
-interface Link<T> extends Iterable<T> default LinkFactory<T> {
-  Link();
-}
-''';
-  var mainSrc = '''
-#library('script.dart');
-#import('mylib.dart');
-
-class LinkFactory<T> {
-  factory Link() {}
-}
-
-main() {
-  new Link<int>();
-}
-''';
-  var expectedResult =
-    'interface Iterable<K>{}'
-    'interface Link<T> extends Iterable<T> default LinkFactory<T>{Link();}'
-    'class LinkFactory<T>{factory Link(){}}'
-    'main(){new Link<int>();}';
-  testDart2DartWithLibrary(mainSrc, librarySrc,
-      continuation: (String result) { Expect.equals(expectedResult, result); });
-}
-
 testDeclarationTypePlaceholders() {
   var src = '''
 String globalfield;
@@ -807,7 +700,6 @@
   testExtendsImplements();
   testVariableDefinitions();
   testGetSet();
-  testFactoryConstructor();
   testAbstractClass();
   testConflictSendsRename();
   testNoConflictSendsRename();
@@ -818,17 +710,14 @@
   testLibraryGetSet();
   testFieldTypeOutput();
   testDefaultClassNamePlaceholder();
-  testFactoryRename();
   testTypeVariablesAreRenamed();
   testClassTypeArgumentBound();
   testDoubleMains();
-  testInterfaceDefaultAnotherLib();
   testStaticAccessIoLib();
   testLocalFunctionPlaceholder();
   testMinification();
   testClosureLocalsMinified();
   testParametersMinified();
-  testTypeVariablesInDifferentLibraries();
   testDeclarationTypePlaceholders();
   testPlatformLibraryMemberNamesAreFixed();
   testConflictsWithCoreLib();
diff --git a/tests/compiler/dart2js/mirrors_test.dart b/tests/compiler/dart2js/mirrors_test.dart
index 409557b..cec75b4 100644
--- a/tests/compiler/dart2js/mirrors_test.dart
+++ b/tests/compiler/dart2js/mirrors_test.dart
@@ -17,15 +17,15 @@
 
 bool containsType(TypeMirror expected, Iterable<TypeMirror> iterable) {
   for (var element in iterable) {
-    if (element.declaration == expected.declaration) {
+    if (element.originalDeclaration == expected.originalDeclaration) {
       return true;
     }
   }
   return false;
 }
 
-Mirror findMirror(List<Mirror> list, String name) {
-  for (Mirror mirror in list) {
+DeclarationMirror findMirror(List<DeclarationMirror> list, String name) {
+  for (DeclarationMirror mirror in list) {
     if (mirror.simpleName == name) {
       return mirror;
     }
@@ -55,18 +55,26 @@
   Expect.stringEquals("mirrors_helper", helperLibrary.qualifiedName,
     "Unexpected library qualified name");
 
-  var types = helperLibrary.types;
-  Expect.isNotNull(types, "No types map returned");
-  Expect.isFalse(types.isEmpty, "Empty types map returned");
+  var classes = helperLibrary.classes;
+  Expect.isNotNull(classes, "No classes map returned");
+  Expect.isFalse(classes.isEmpty, "Empty classes map returned");
 
-  testFoo(mirrors, helperLibrary, types);
-  testBar(mirrors, helperLibrary, types);
-  testBaz(mirrors, helperLibrary, types);
+  testFoo(mirrors, helperLibrary, classes);
+  testBar(mirrors, helperLibrary, classes);
+  testBaz(mirrors, helperLibrary, classes);
   // TODO(johnniwinther): Add test of class [Boz] and typedef [Func].
   // TODO(johnniwinther): Add tests of type argument substitution, which
   // is not currently implemented in dart2js.
   // TODO(johnniwinther): Add tests of Location and Source.
-  testPrivate(mirrors, helperLibrary, types);
+  testPrivate(mirrors, helperLibrary, classes);
+  // TODO(johnniwinther): Add thorough tests of [LibraryMirror.functions],
+  // [LibraryMirror.getters], [LibraryMirror.setters], [LibraryMirror.members],
+  // and [LibraryMirror.variable].
+  Expect.isNotNull(helperLibrary.functions);
+  Expect.isNotNull(helperLibrary.members);
+  Expect.isNotNull(helperLibrary.getters);
+  Expect.isNotNull(helperLibrary.setters);
+  Expect.isNotNull(helperLibrary.variables);
 }
 
 // Testing class Foo:
@@ -75,10 +83,10 @@
 //
 // }
 void testFoo(MirrorSystem system, LibraryMirror helperLibrary,
-             Map<String,TypeMirror> types) {
-  var fooClass = types["Foo"];
+             Map<String,TypeMirror> classes) {
+  var fooClass = classes["Foo"];
   Expect.isNotNull(fooClass, "Type 'Foo' not found");
-  Expect.isTrue(fooClass is InterfaceMirror,
+  Expect.isTrue(fooClass is ClassMirror,
                 "Unexpected mirror type returned");
   Expect.stringEquals("Foo", fooClass.simpleName,
                       "Unexpected type simple name");
@@ -95,9 +103,8 @@
   Expect.isFalse(fooClass.isTypedef, "Class is a typedef");
   Expect.isFalse(fooClass.isFunction, "Class is a function");
 
-  Expect.isTrue(fooClass.isDeclaration, "Class is not declaration");
-  Expect.equals(fooClass, fooClass.declaration,
-                "Class is not its declaration");
+  Expect.isTrue(fooClass.isOriginalDeclaration);
+  Expect.equals(fooClass, fooClass.originalDeclaration);
 
   Expect.isTrue(fooClass.isClass, "Class is not class");
   Expect.isFalse(fooClass.isInterface, "Class is interface");
@@ -106,20 +113,19 @@
   var objectType = fooClass.superclass;
   Expect.isNotNull(objectType, "Superclass is null");
   Expect.isTrue(objectType.isObject, "Object is not Object");
-  Expect.isFalse(objectType.isDeclaration, "Object type is declaration");
+  Expect.isFalse(objectType.isOriginalDeclaration);
   Expect.isTrue(containsType(fooClass,
                              computeSubdeclarations(objectType)),
                 "Class is not subclass of superclass");
 
-  var fooInterfaces = fooClass.interfaces;
+  var fooInterfaces = fooClass.superinterfaces;
   Expect.isNotNull(fooInterfaces, "Interfaces map is null");
   Expect.isTrue(fooInterfaces.isEmpty, "Interfaces map is not empty");
 
   var fooSubdeclarations = computeSubdeclarations(fooClass);
   Expect.equals(1, count(fooSubdeclarations), "Unexpected subtype count");
   for (var fooSubdeclaration in fooSubdeclarations) {
-    Expect.equals(fooClass, fooSubdeclaration.superclass.declaration,
-                  "Class is not superclass of subclass");
+    Expect.equals(fooClass, fooSubdeclaration.superclass.originalDeclaration);
   }
 
   Expect.throws(() => fooClass.typeArguments,
@@ -130,9 +136,9 @@
   Expect.isTrue(fooClassTypeVariables.isEmpty,
                 "Type variable list is not empty");
 
-  Expect.isNull(fooClass.defaultType, "Class has default type");
+  Expect.isNull(fooClass.defaultFactory);
 
-  var fooClassMembers = fooClass.declaredMembers;
+  var fooClassMembers = fooClass.members;
   Expect.isNotNull(fooClassMembers, "Declared members map is null");
   Expect.isTrue(fooClassMembers.isEmpty, "Declared members map is unempty");
 
@@ -140,6 +146,15 @@
   Expect.isNotNull(fooClassConstructors, "Constructors map is null");
   Expect.isTrue(fooClassConstructors.isEmpty,
                 "Constructors map is unempty");
+
+  // TODO(johnniwinther): Add thorough tests of [ClassMirror.functions],
+  // [ClassMirror.getters], [ClassMirror.setters], [ClassMirror.members],
+  // and [ClassMirror.variable].
+  Expect.isNotNull(fooClass.functions);
+  Expect.isNotNull(fooClass.members);
+  Expect.isNotNull(fooClass.getters);
+  Expect.isNotNull(fooClass.setters);
+  Expect.isNotNull(fooClass.variables);
 }
 
 // Testing interface Bar:
@@ -148,10 +163,10 @@
 //
 // }
 void testBar(MirrorSystem system, LibraryMirror helperLibrary,
-             Map<String,TypeMirror> types) {
-  var barInterface = types["Bar"];
+             Map<String,TypeMirror> classes) {
+  var barInterface = classes["Bar"];
   Expect.isNotNull(barInterface, "Type 'Bar' not found");
-  Expect.isTrue(barInterface is InterfaceMirror,
+  Expect.isTrue(barInterface is ClassMirror,
                "Unexpected mirror type returned");
   Expect.stringEquals("Bar", barInterface.simpleName,
                       "Unexpected type simple name");
@@ -168,9 +183,8 @@
   Expect.isFalse(barInterface.isTypedef, "Interface is a typedef");
   Expect.isFalse(barInterface.isFunction, "Interface is a function");
 
-  Expect.isTrue(barInterface.isDeclaration, "Interface is not declaration");
-  Expect.equals(barInterface, barInterface.declaration,
-                "Interface is not its declaration");
+  Expect.isTrue(barInterface.isOriginalDeclaration);
+  Expect.equals(barInterface, barInterface.originalDeclaration);
 
   Expect.isFalse(barInterface.isClass, "Interface is class");
   Expect.isTrue(barInterface.isInterface, "Interface is not interface");
@@ -179,12 +193,12 @@
   var objectType = barInterface.superclass;
   Expect.isNotNull(objectType, "Superclass is null");
   Expect.isTrue(objectType.isObject, "Object is not Object");
-  Expect.isFalse(objectType.isDeclaration, "Object type is declaration");
+  Expect.isFalse(objectType.isOriginalDeclaration);
   Expect.isTrue(containsType(barInterface,
                              computeSubdeclarations(objectType)),
                 "Class is not subclass of superclass");
 
-  var barInterfaces = barInterface.interfaces;
+  var barInterfaces = barInterface.superinterfaces;
   Expect.isNotNull(barInterfaces, "Interfaces map is null");
   Expect.isTrue(barInterfaces.isEmpty, "Interfaces map is not empty");
 
@@ -192,7 +206,7 @@
   Expect.equals(1, count(barSubdeclarations), "Unexpected subtype count");
   for (var barSubdeclaration in barSubdeclarations) {
     Expect.isTrue(containsType(barInterface,
-                               barSubdeclaration.interfaces),
+                               barSubdeclaration.superinterfaces),
                   "Interface is not superinterface of subclass");
   }
 
@@ -210,9 +224,9 @@
   Expect.isNotNull(barE, "Type variable is null");
   Expect.isTrue(barE.isTypeVariable, "Type variable is not type variable");
 
-  Expect.isNull(barInterface.defaultType, "Interface has default type");
+  Expect.isNull(barInterface.defaultFactory);
 
-  var barInterfaceMembers = barInterface.declaredMembers;
+  var barInterfaceMembers = barInterface.members;
   Expect.isNotNull(barInterfaceMembers, "Declared members map is null");
   Expect.isTrue(barInterfaceMembers.isEmpty,
                 "Declared members map is unempty");
@@ -238,10 +252,10 @@
 //   int operator -() => 0;
 // }
 void testBaz(MirrorSystem system, LibraryMirror helperLibrary,
-             Map<String,TypeMirror> types) {
-  var bazClass = types["Baz"];
+             Map<String,TypeMirror> classes) {
+  var bazClass = classes["Baz"];
   Expect.isNotNull(bazClass, "Type 'Baz' not found");
-  Expect.isTrue(bazClass is InterfaceMirror,
+  Expect.isTrue(bazClass is ClassMirror,
                 "Unexpected mirror type returned");
   Expect.stringEquals("Baz", bazClass.simpleName,
                       "Unexpected type simple name");
@@ -258,9 +272,8 @@
   Expect.isFalse(bazClass.isTypedef, "Class is a typedef");
   Expect.isFalse(bazClass.isFunction, "Class is a function");
 
-  Expect.isTrue(bazClass.isDeclaration, "Class is not declaration");
-  Expect.equals(bazClass, bazClass.declaration,
-                "Class is not its declaration");
+  Expect.isTrue(bazClass.isOriginalDeclaration);
+  Expect.equals(bazClass, bazClass.originalDeclaration);
 
   Expect.isTrue(bazClass.isClass, "Class is not class");
   Expect.isFalse(bazClass.isInterface, "Class is interface");
@@ -269,12 +282,12 @@
   var objectType = bazClass.superclass;
   Expect.isNotNull(objectType, "Superclass is null");
   Expect.isTrue(objectType.isObject, "Object is not Object");
-  Expect.isFalse(objectType.isDeclaration, "Object type is declaration");
+  Expect.isFalse(objectType.isOriginalDeclaration);
   Expect.isTrue(containsType(bazClass,
                              computeSubdeclarations(objectType)),
                 "Class is not subclass of superclass");
 
-  var bazInterfaces = bazClass.interfaces;
+  var bazInterfaces = bazClass.superinterfaces;
   Expect.isNotNull(bazInterfaces, "Interfaces map is null");
   Expect.isTrue(!bazInterfaces.isEmpty, "Interfaces map is empty");
   for (var bazInterface in bazInterfaces) {
@@ -288,7 +301,7 @@
 
   var barInterface = findMirror(bazInterfaces, "Bar");
   Expect.isNotNull(barInterface, "Interface bar is missing");
-  Expect.isFalse(barInterface.isDeclaration, "Interface type is declaration");
+  Expect.isFalse(barInterface.isOriginalDeclaration);
   var barInterfaceTypeArguments = barInterface.typeArguments;
   Expect.isNotNull(barInterfaceTypeArguments, "Type arguments are missing");
   Expect.equals(1, barInterfaceTypeArguments.length,
@@ -309,9 +322,9 @@
                       "Unexpected qualifiedName");
   Expect.equals(bazClass, bazE.declarer,
                 "Unexpected type variable declarer");
-  var bazEbound = bazE.bound;
-  Expect.isNotNull(bazEbound, "Missing type variable bound");
-  Expect.isFalse(bazEbound.isDeclaration, "Bound is declaration");
+  var bazEbound = bazE.upperBound;
+  Expect.isNotNull(bazEbound);
+  Expect.isFalse(bazEbound.isOriginalDeclaration);
   Expect.isTrue(bazEbound.isObject, "Bound is not object");
 
   var bazF = bazClassTypeVariables[1];
@@ -320,15 +333,15 @@
   Expect.stringEquals('mirrors_helper.Baz.F', bazF.qualifiedName,
                       "Unexpected qualifiedName");
   Expect.equals(bazClass, bazF.declarer);
-  var bazFbound = bazF.bound;
-  Expect.isNotNull(bazFbound, "Missing type variable bound");
-  Expect.isFalse(bazFbound.isDeclaration, "Bound is declaration");
+  var bazFbound = bazF.upperBound;
+  Expect.isNotNull(bazFbound);
+  Expect.isFalse(bazFbound.isOriginalDeclaration);
   Expect.stringEquals("mirrors_helper.Foo", bazFbound.qualifiedName,
                       "Bound is not Foo");
 
-  Expect.isNull(bazClass.defaultType, "Class has default type");
+  Expect.isNull(bazClass.defaultFactory);
 
-  var bazClassMembers = bazClass.declaredMembers;
+  var bazClassMembers = bazClass.members;
   Expect.isNotNull(bazClassMembers, "Declared members map is null");
   Expect.equals(8, bazClassMembers.length,
                 "Unexpected number of declared members");
@@ -342,24 +355,24 @@
                       "Unexpected method simpleName");
   Expect.stringEquals('mirrors_helper.Baz.method1', method1.qualifiedName,
                       "Unexpected method qualifiedName");
-  Expect.equals(method1.surroundingDeclaration, bazClass,
-                "Unexpected surrounding declaration");
-  Expect.isFalse(method1.isTopLevel, "Method is top level");
-  Expect.isFalse(method1.isConstructor, "Method is constructor");
-  Expect.isFalse(method1.isField, "Method is field");
-  Expect.isTrue(method1.isMethod, "Method is not method");
-  Expect.isFalse(method1.isPrivate, "Method is private");
-  Expect.isTrue(method1.isStatic, "Method is not static");
-  Expect.isTrue(method1 is MethodMirror, "Method is not MethodMirror");
-  Expect.isFalse(method1.isConst, "Method is const");
-  Expect.isFalse(method1.isFactory, "Method is factory");
-  Expect.isNull(method1.constructorName,
-                "Method constructorName is non-null");
-  Expect.isFalse(method1.isGetter, "Method is getter");
-  Expect.isFalse(method1.isSetter, "Method is setter");
-  Expect.isFalse(method1.isOperator, "Method is operator");
-  Expect.isNull(method1.operatorName,
-                "Method operatorName is non-null");
+  Expect.equals(method1.owner, bazClass);
+  Expect.isFalse(method1.isTopLevel);
+  Expect.isFalse(method1.isConstructor);
+  Expect.isFalse(method1.isField);
+  Expect.isTrue(method1.isMethod);
+  Expect.isFalse(method1.isPrivate);
+  Expect.isTrue(method1.isStatic);
+  Expect.isTrue(method1 is MethodMirror);
+  Expect.isTrue(method1.isRegularMethod);
+  Expect.isFalse(method1.isConstConstructor);
+  Expect.isFalse(method1.isGenerativeConstructor);
+  Expect.isFalse(method1.isRedirectingConstructor);
+  Expect.isFalse(method1.isFactoryConstructor);
+  Expect.isNull(method1.constructorName);
+  Expect.isFalse(method1.isGetter);
+  Expect.isFalse(method1.isSetter);
+  Expect.isFalse(method1.isOperator);
+  Expect.isNull(method1.operatorName);
 
   var dynamicType = method1.returnType;
   Expect.isNotNull(dynamicType, "Return type was null");
@@ -396,24 +409,24 @@
                       "Unexpected method simpleName");
   Expect.stringEquals('mirrors_helper.Baz.method2', method2.qualifiedName,
                       "Unexpected method qualifiedName");
-  Expect.equals(method2.surroundingDeclaration, bazClass,
-                "Unexpected surrounding declaration");
-  Expect.isFalse(method2.isTopLevel, "Method is top level");
-  Expect.isFalse(method2.isConstructor, "Method is constructor");
-  Expect.isFalse(method2.isField, "Method is field");
-  Expect.isTrue(method2.isMethod, "Method is not method");
-  Expect.isFalse(method2.isPrivate, "Method is private");
-  Expect.isFalse(method2.isStatic, "Method is static");
-  Expect.isTrue(method2 is MethodMirror, "Method is not MethodMirror");
-  Expect.isFalse(method2.isConst, "Method is const");
-  Expect.isFalse(method2.isFactory, "Method is factory");
-  Expect.isNull(method2.constructorName,
-                "Method constructorName is non-null");
-  Expect.isFalse(method2.isGetter, "Method is getter");
-  Expect.isFalse(method2.isSetter, "Method is setter");
-  Expect.isFalse(method2.isOperator, "Method is operator");
-  Expect.isNull(method2.operatorName,
-                "Method operatorName is non-null");
+  Expect.equals(method2.owner, bazClass);
+  Expect.isFalse(method2.isTopLevel);
+  Expect.isFalse(method2.isConstructor);
+  Expect.isFalse(method2.isField);
+  Expect.isTrue(method2.isMethod);
+  Expect.isFalse(method2.isPrivate);
+  Expect.isFalse(method2.isStatic);
+  Expect.isTrue(method2 is MethodMirror);
+  Expect.isTrue(method2.isRegularMethod);
+  Expect.isFalse(method2.isConstConstructor);
+  Expect.isFalse(method2.isGenerativeConstructor);
+  Expect.isFalse(method2.isRedirectingConstructor);
+  Expect.isFalse(method2.isFactoryConstructor);
+  Expect.isNull(method2.constructorName);
+  Expect.isFalse(method2.isGetter);
+  Expect.isFalse(method2.isSetter);
+  Expect.isFalse(method2.isOperator);
+  Expect.isNull(method2.operatorName);
 
   var voidType = method2.returnType;
   Expect.isNotNull(voidType, "Return type was null");
@@ -463,31 +476,30 @@
                       "Unexpected method simpleName");
   Expect.stringEquals('mirrors_helper.Baz.method3', method3.qualifiedName,
                       "Unexpected method qualifiedName");
-  Expect.equals(method3.surroundingDeclaration, bazClass,
-                      "Unexpected surrounding declaration");
-  Expect.isFalse(method3.isTopLevel, "Method is top level");
-  Expect.isFalse(method3.isConstructor, "Method is constructor");
-  Expect.isFalse(method3.isField, "Method is field");
-  Expect.isTrue(method3.isMethod, "Method is not method");
-  Expect.isFalse(method3.isPrivate, "Method is private");
-  Expect.isFalse(method3.isStatic, "Method is static");
-  Expect.isTrue(method3 is MethodMirror, "Method is not MethodMirror");
-  Expect.isFalse(method3.isConst, "Method is const");
-  Expect.isFalse(method3.isFactory, "Method is factory");
-  Expect.isNull(method3.constructorName,
-                "Method constructorName is non-null");
-  Expect.isFalse(method3.isGetter, "Method is getter");
-  Expect.isFalse(method3.isSetter, "Method is setter");
-  Expect.isFalse(method3.isOperator, "Method is operator");
-  Expect.isNull(method3.operatorName,
-                "Method operatorName is non-null");
+  Expect.equals(method3.owner, bazClass);
+  Expect.isFalse(method3.isTopLevel);
+  Expect.isFalse(method3.isConstructor);
+  Expect.isFalse(method3.isField);
+  Expect.isTrue(method3.isMethod);
+  Expect.isFalse(method3.isPrivate);
+  Expect.isFalse(method3.isStatic);
+  Expect.isTrue(method3 is MethodMirror);
+  Expect.isTrue(method3.isRegularMethod);
+  Expect.isFalse(method3.isConstConstructor);
+  Expect.isFalse(method3.isGenerativeConstructor);
+  Expect.isFalse(method3.isRedirectingConstructor);
+  Expect.isFalse(method3.isFactoryConstructor);
+  Expect.isNull(method3.constructorName);
+  Expect.isFalse(method3.isGetter);
+  Expect.isFalse(method3.isSetter);
+  Expect.isFalse(method3.isOperator);
+  Expect.isNull(method3.operatorName);
 
   var method3ReturnType = method3.returnType;
   Expect.isNotNull(method3ReturnType, "Return type is null");
-  Expect.isTrue(method3ReturnType is InterfaceMirror,
+  Expect.isTrue(method3ReturnType is ClassMirror,
                 "Return type is not interface");
-  Expect.equals(bazClass, method3ReturnType.declaration,
-                "Return type is not Baz");
+  Expect.equals(bazClass, method3ReturnType.originalDeclaration);
   // TODO(johnniwinther): Test type arguments of [method3ReturnType].
 
   var method3Parameters = method3.parameters;
@@ -542,24 +554,20 @@
   Expect.equals(helperLibrary, funcTypedef.library,
                 "Unexpected typedef library");
   Expect.isNull(funcTypedef.superclass, "Non-null superclass on typedef");
-  Expect.isNotNull(funcTypedef.interfaces,
-                   "Null interfaces map on typedef");
-  Expect.isTrue(funcTypedef.interfaces.isEmpty,
-                "Non-empty interfaces map on typedef");
-  Expect.isNotNull(funcTypedef.declaredMembers,
-                   "Declared members map is null on type def");
-  Expect.isTrue(funcTypedef.declaredMembers.isEmpty,
-                "Non-empty declared members map on typedef");
+  Expect.isNotNull(funcTypedef.superinterfaces);
+  Expect.isTrue(funcTypedef.superinterfaces.isEmpty);
+  Expect.isNotNull(funcTypedef.members);
+  Expect.isTrue(funcTypedef.members.isEmpty);
 
-  // TODO(johnniwinther): Returned typedef should not be the declaration:
-  Expect.isTrue(funcTypedef.isDeclaration, "Typedef is not declaration");
+  // TODO(johnniwinther): Returned typedef should not be the original
+  // declaration:
+  Expect.isTrue(funcTypedef.isOriginalDeclaration);
   Expect.isFalse(funcTypedef.isClass, "Typedef is class");
   Expect.isFalse(funcTypedef.isInterface, "Typedef is interface");
   Expect.isFalse(funcTypedef.isPrivate, "Typedef is private");
-  Expect.isNull(funcTypedef.defaultType,
-                "Typedef default type is non-null");
+  Expect.isNull(funcTypedef.defaultFactory);
   // TODO(johnniwinther): Should not throw an exception since the type should
-  // not be the declaration.
+  // not be the original declaration.
   Expect.throws(() => funcTypedef.typeArguments,
                 (exception) => true,
                 "Typedef has type arguments");
@@ -567,7 +575,7 @@
   Expect.isNotNull(funcTypedefTypeVariables);
   Expect.equals(2, funcTypedefTypeVariables.length);
 
-  var funcTypedefDefinition = funcTypedef.definition;
+  var funcTypedefDefinition = funcTypedef.value;
   Expect.isNotNull(funcTypedefDefinition);
   Expect.isTrue(funcTypedefDefinition is FunctionTypeMirror);
 
@@ -594,24 +602,24 @@
   Expect.stringEquals('mirrors_helper.Baz.==',
                       operator_eq.qualifiedName,
                       "Unexpected method qualifiedName");
-  Expect.equals(operator_eq.surroundingDeclaration, bazClass,
-                "Unexpected surrounding declaration");
-  Expect.isFalse(operator_eq.isTopLevel, "Method is top level");
-  Expect.isFalse(operator_eq.isConstructor, "Method is constructor");
-  Expect.isFalse(operator_eq.isField, "Method is field");
-  Expect.isTrue(operator_eq.isMethod, "Method is not method");
-  Expect.isFalse(operator_eq.isPrivate, "Method is private");
-  Expect.isFalse(operator_eq.isStatic, "Method is static");
-  Expect.isTrue(operator_eq is MethodMirror, "Method is not MethodMirror");
-  Expect.isFalse(operator_eq.isConst, "Method is const");
-  Expect.isFalse(operator_eq.isFactory, "Method is factory");
-  Expect.isNull(operator_eq.constructorName,
-                "Method constructorName is non-null");
-  Expect.isFalse(operator_eq.isGetter, "Method is getter");
-  Expect.isFalse(operator_eq.isSetter, "Method is setter");
-  Expect.isTrue(operator_eq.isOperator, "Method is not operator");
-  Expect.stringEquals('==', operator_eq.operatorName,
-                      "Unexpected operatorName");
+  Expect.equals(operator_eq.owner, bazClass);
+  Expect.isFalse(operator_eq.isTopLevel);
+  Expect.isFalse(operator_eq.isConstructor);
+  Expect.isFalse(operator_eq.isField);
+  Expect.isTrue(operator_eq.isMethod);
+  Expect.isFalse(operator_eq.isPrivate);
+  Expect.isFalse(operator_eq.isStatic);
+  Expect.isTrue(operator_eq is MethodMirror);
+  Expect.isTrue(operator_eq.isRegularMethod);
+  Expect.isFalse(operator_eq.isConstConstructor);
+  Expect.isFalse(operator_eq.isGenerativeConstructor);
+  Expect.isFalse(operator_eq.isRedirectingConstructor);
+  Expect.isFalse(operator_eq.isFactoryConstructor);
+  Expect.isNull(operator_eq.constructorName);
+  Expect.isFalse(operator_eq.isGetter);
+  Expect.isFalse(operator_eq.isSetter);
+  Expect.isTrue(operator_eq.isOperator);
+  Expect.stringEquals('==', operator_eq.operatorName);
 
   ////////////////////////////////////////////////////////////////////////////
   // int operator -() => 0;
@@ -624,25 +632,24 @@
   Expect.stringEquals('mirrors_helper.Baz.${Mirror.UNARY_MINUS}',
                       operator_negate.qualifiedName,
                       "Unexpected method qualifiedName");
-  Expect.equals(operator_negate.surroundingDeclaration, bazClass,
-                "Unexpected surrounding declaration");
-  Expect.isFalse(operator_negate.isTopLevel, "Method is top level");
-  Expect.isFalse(operator_negate.isConstructor, "Method is constructor");
-  Expect.isFalse(operator_negate.isField, "Method is field");
-  Expect.isTrue(operator_negate.isMethod, "Method is not method");
-  Expect.isFalse(operator_negate.isPrivate, "Method is private");
-  Expect.isFalse(operator_negate.isStatic, "Method is static");
-  Expect.isTrue(operator_negate is MethodMirror,
-                "Method is not MethodMirror");
-  Expect.isFalse(operator_negate.isConst, "Method is const");
-  Expect.isFalse(operator_negate.isFactory, "Method is factory");
-  Expect.isNull(operator_negate.constructorName,
-                "Method constructorName is non-null");
-  Expect.isFalse(operator_negate.isGetter, "Method is getter");
-  Expect.isFalse(operator_negate.isSetter, "Method is setter");
-  Expect.isTrue(operator_negate.isOperator, "Method is not operator");
-  Expect.stringEquals('-', operator_negate.operatorName,
-                      "Unexpected operatorName");
+  Expect.equals(operator_negate.owner, bazClass);
+  Expect.isFalse(operator_negate.isTopLevel);
+  Expect.isFalse(operator_negate.isConstructor);
+  Expect.isFalse(operator_negate.isField);
+  Expect.isTrue(operator_negate.isMethod);
+  Expect.isFalse(operator_negate.isPrivate);
+  Expect.isFalse(operator_negate.isStatic);
+  Expect.isTrue(operator_negate is MethodMirror);
+  Expect.isTrue(operator_negate.isRegularMethod);
+  Expect.isFalse(operator_negate.isConstConstructor);
+  Expect.isFalse(operator_negate.isGenerativeConstructor);
+  Expect.isFalse(operator_negate.isRedirectingConstructor);
+  Expect.isFalse(operator_negate.isFactoryConstructor);
+  Expect.isNull(operator_negate.constructorName);
+  Expect.isFalse(operator_negate.isGetter);
+  Expect.isFalse(operator_negate.isSetter);
+  Expect.isTrue(operator_negate.isOperator);
+  Expect.stringEquals('-', operator_negate.operatorName);
 
 
   var bazClassConstructors = bazClass.constructors;
@@ -650,33 +657,54 @@
   Expect.equals(3, bazClassConstructors.length,
                 "Unexpected number of constructors");
 
+  ////////////////////////////////////////////////////////////////////////////
+  //   Baz();
+  ////////////////////////////////////////////////////////////////////////////
   var bazClassNonameConstructor = bazClassConstructors['Baz'];
   Expect.isNotNull(bazClassNonameConstructor);
   Expect.isTrue(bazClassNonameConstructor is MethodMirror);
   Expect.isTrue(bazClassNonameConstructor.isConstructor);
-  Expect.isFalse(bazClassNonameConstructor.isFactory);
+  Expect.isFalse(bazClassNonameConstructor.isRegularMethod);
+  Expect.isFalse(bazClassNonameConstructor.isConstConstructor);
+  Expect.isTrue(bazClassNonameConstructor.isGenerativeConstructor);
+  Expect.isFalse(bazClassNonameConstructor.isRedirectingConstructor);
+  Expect.isFalse(bazClassNonameConstructor.isFactoryConstructor);
   Expect.stringEquals('Baz', bazClassNonameConstructor.simpleName);
   Expect.stringEquals('Baz', bazClassNonameConstructor.displayName);
   Expect.stringEquals('mirrors_helper.Baz.Baz',
       bazClassNonameConstructor.qualifiedName);
   Expect.stringEquals('', bazClassNonameConstructor.constructorName);
 
+  ////////////////////////////////////////////////////////////////////////////
+  //   const Baz.named();
+  ////////////////////////////////////////////////////////////////////////////
   var bazClassNamedConstructor = bazClassConstructors['Baz.named'];
   Expect.isNotNull(bazClassNamedConstructor);
   Expect.isTrue(bazClassNamedConstructor is MethodMirror);
   Expect.isTrue(bazClassNamedConstructor.isConstructor);
-  Expect.isFalse(bazClassNamedConstructor.isFactory);
+  Expect.isFalse(bazClassNamedConstructor.isRegularMethod);
+  Expect.isTrue(bazClassNamedConstructor.isConstConstructor);
+  Expect.isFalse(bazClassNamedConstructor.isGenerativeConstructor);
+  Expect.isFalse(bazClassNamedConstructor.isRedirectingConstructor);
+  Expect.isFalse(bazClassNamedConstructor.isFactoryConstructor);
   Expect.stringEquals('Baz.named', bazClassNamedConstructor.simpleName);
   Expect.stringEquals('Baz.named', bazClassNamedConstructor.displayName);
   Expect.stringEquals('mirrors_helper.Baz.Baz.named',
       bazClassNamedConstructor.qualifiedName);
   Expect.stringEquals('named', bazClassNamedConstructor.constructorName);
 
+  ////////////////////////////////////////////////////////////////////////////
+  //   factory Baz.factory() => new Baz<E,F>();
+  ////////////////////////////////////////////////////////////////////////////
   var bazClassFactoryConstructor = bazClassConstructors['Baz.factory'];
   Expect.isNotNull(bazClassFactoryConstructor);
   Expect.isTrue(bazClassFactoryConstructor is MethodMirror);
   Expect.isTrue(bazClassFactoryConstructor.isConstructor);
-  Expect.isTrue(bazClassFactoryConstructor.isFactory);
+  Expect.isFalse(bazClassFactoryConstructor.isRegularMethod);
+  Expect.isFalse(bazClassFactoryConstructor.isConstConstructor);
+  Expect.isFalse(bazClassFactoryConstructor.isGenerativeConstructor);
+  Expect.isFalse(bazClassFactoryConstructor.isRedirectingConstructor);
+  Expect.isTrue(bazClassFactoryConstructor.isFactoryConstructor);
   Expect.stringEquals('Baz.factory', bazClassFactoryConstructor.simpleName);
   Expect.stringEquals('Baz.factory', bazClassFactoryConstructor.displayName);
   Expect.stringEquals('mirrors_helper.Baz.Baz.factory',
@@ -696,46 +724,57 @@
 //   factory _PrivateClass._privateFactoryConstructor() => new _PrivateClass();
 // }
 void testPrivate(MirrorSystem system, LibraryMirror helperLibrary,
-                 Map<String,TypeMirror> types) {
-  var privateClass = types['_PrivateClass'];
+                 Map<String,TypeMirror> classes) {
+  var privateClass = classes['_PrivateClass'];
   Expect.isNotNull(privateClass);
-  Expect.isTrue(privateClass is InterfaceMirror);
+  Expect.isTrue(privateClass is ClassMirror);
   Expect.isTrue(privateClass.isClass);
   Expect.isTrue(privateClass.isPrivate);
 
-  var privateField = privateClass.declaredMembers['_privateField'];
+  var privateField = privateClass.members['_privateField'];
   Expect.isNotNull(privateField);
-  Expect.isTrue(privateField is FieldMirror);
+  Expect.isTrue(privateField is VariableMirror);
   Expect.isTrue(privateField.isPrivate);
 
-  var privateGetter = privateClass.declaredMembers['_privateGetter'];
+  var privateGetter = privateClass.members['_privateGetter'];
   Expect.isNotNull(privateGetter);
   Expect.isTrue(privateGetter is MethodMirror);
   Expect.isTrue(privateGetter.isGetter);
   Expect.isTrue(privateGetter.isPrivate);
+  Expect.isFalse(privateGetter.isRegularMethod);
 
-  var privateSetter = privateClass.declaredMembers['_privateSetter='];
+  var privateSetter = privateClass.members['_privateSetter='];
   Expect.isNotNull(privateSetter);
   Expect.isTrue(privateSetter is MethodMirror);
   Expect.isTrue(privateSetter.isSetter);
   Expect.isTrue(privateSetter.isPrivate);
+  Expect.isFalse(privateSetter.isRegularMethod);
 
-  var privateMethod = privateClass.declaredMembers['_privateMethod'];
+  var privateMethod = privateClass.members['_privateMethod'];
   Expect.isNotNull(privateMethod);
   Expect.isTrue(privateMethod is MethodMirror);
   Expect.isTrue(privateMethod.isPrivate);
+  Expect.isTrue(privateMethod.isRegularMethod);
 
   var privateConstructor =
-      privateClass.declaredMembers['_PrivateClass._privateConstructor'];
+      privateClass.members['_PrivateClass._privateConstructor'];
   Expect.isNotNull(privateConstructor);
   Expect.isTrue(privateConstructor is MethodMirror);
   Expect.isTrue(privateConstructor.isConstructor);
   Expect.isTrue(privateConstructor.isPrivate);
+  Expect.isFalse(privateConstructor.isConstConstructor);
+  Expect.isFalse(privateConstructor.isRedirectingConstructor);
+  Expect.isTrue(privateConstructor.isGenerativeConstructor);
+  Expect.isFalse(privateConstructor.isFactoryConstructor);
 
   var privateFactoryConstructor =
-      privateClass.declaredMembers['_PrivateClass._privateFactoryConstructor'];
+      privateClass.members['_PrivateClass._privateFactoryConstructor'];
   Expect.isNotNull(privateFactoryConstructor);
   Expect.isTrue(privateFactoryConstructor is MethodMirror);
-  Expect.isTrue(privateFactoryConstructor.isFactory);
+  Expect.isTrue(privateFactoryConstructor.isConstructor);
   Expect.isTrue(privateFactoryConstructor.isPrivate);
+  Expect.isFalse(privateFactoryConstructor.isConstConstructor);
+  Expect.isFalse(privateFactoryConstructor.isRedirectingConstructor);
+  Expect.isFalse(privateFactoryConstructor.isGenerativeConstructor);
+  Expect.isTrue(privateFactoryConstructor.isFactoryConstructor);
 }
diff --git a/tests/compiler/dart2js/mock_compiler.dart b/tests/compiler/dart2js/mock_compiler.dart
index 0a26a09..50bb431 100644
--- a/tests/compiler/dart2js/mock_compiler.dart
+++ b/tests/compiler/dart2js/mock_compiler.dart
@@ -42,6 +42,7 @@
   stringTypeCheck(x) {}
   boolConversionCheck(x) {}
   abstract class JavaScriptIndexingBehavior {}
+  class JSInvocationMirror {}
   S() {}
   assertHelper(a){}''';
 
@@ -92,6 +93,7 @@
     // We need to set the assert method to avoid calls with a 'null'
     // target being interpreted as a call to assert.
     jsHelperLibrary = createLibrary("helper", helperSource);
+    importHelperLibrary(coreLibrary);
     assertMethod = jsHelperLibrary.find(buildSourceString('assert'));
     interceptorsLibrary = createLibrary("interceptors", interceptorsSource);
 
diff --git a/tests/compiler/dart2js/parser_helper.dart b/tests/compiler/dart2js/parser_helper.dart
index dca44ba..fecc694 100644
--- a/tests/compiler/dart2js/parser_helper.dart
+++ b/tests/compiler/dart2js/parser_helper.dart
@@ -8,11 +8,16 @@
 
 import "../../../lib/compiler/implementation/elements/elements.dart";
 import "../../../lib/compiler/implementation/tree/tree.dart";
-import '../../../lib/compiler/implementation/scanner/scannerlib.dart';
+import "../../../lib/compiler/implementation/scanner/scannerlib.dart";
 import "../../../lib/compiler/implementation/dart2jslib.dart" hide SourceString;
 import "../../../lib/compiler/implementation/source_file.dart";
 import "../../../lib/compiler/implementation/util/util.dart";
 
+export "../../../lib/compiler/implementation/dart2jslib.dart"
+       show DiagnosticListener;
+// TODO(ahe): We should have token library to export instead.
+export "../../../lib/compiler/implementation/scanner/scannerlib.dart";
+
 class LoggerCanceler implements DiagnosticListener {
   void cancel(String reason, {node, token, instruction, element}) {
     throw new CompilerCancelledException(reason);
@@ -25,16 +30,18 @@
 
 Token scan(String text) => new StringScanner(text).tokenize();
 
-Node parseBodyCode(String text, Function parseMethod) {
+Node parseBodyCode(String text, Function parseMethod,
+                   {DiagnosticListener diagnosticHandler}) {
   Token tokens = scan(text);
-  LoggerCanceler lc = new LoggerCanceler();
+  if (diagnosticHandler == null) diagnosticHandler = new LoggerCanceler();
   Script script =
       new Script(
           new Uri.fromComponents(scheme: "source"),
           new MockFile(text));
   LibraryElement library = new LibraryElement(script);
   library.canUseNative = true;
-  NodeListener listener = new NodeListener(lc, library.entryCompilationUnit);
+  NodeListener listener =
+      new NodeListener(diagnosticHandler, library.entryCompilationUnit);
   Parser parser = new Parser(listener);
   Token endToken = parseMethod(parser, tokens);
   assert(endToken.kind == EOF_TOKEN);
@@ -54,8 +61,10 @@
   return element.parseNode(compiler);
 }
 
-Node parseMember(String text) =>
-    parseBodyCode(text, (parser, tokens) => parser.parseMember(tokens));
+Node parseMember(String text, {DiagnosticListener diagnosticHandler}) {
+  return parseBodyCode(text, (parser, tokens) => parser.parseMember(tokens),
+                       diagnosticHandler: diagnosticHandler);
+}
 
 class MockFile extends SourceFile {
   MockFile(text)
diff --git a/tests/compiler/dart2js/parser_test.dart b/tests/compiler/dart2js/parser_test.dart
index 3847f48..c3a6e00 100644
--- a/tests/compiler/dart2js/parser_test.dart
+++ b/tests/compiler/dart2js/parser_test.dart
@@ -265,6 +265,34 @@
   Expect.isNull(function.getOrSet);
 }
 
+class Collector implements DiagnosticListener {
+  int token = -1;
+
+  void cancel(String reason, {node, token, instruction, element}) {
+    this.token = token.kind;
+    throw this;
+  }
+
+  void log(message) {
+    print(message);
+  }
+}
+
+void testMissingCloseParen() {
+  final String source =
+'''foo(x {  // <= missing closing ")"
+  return x;
+}''';
+  parse() {
+    parseMember(source, diagnosticHandler: new Collector());
+  }
+  check(Collector c) {
+    Expect.equals(OPEN_CURLY_BRACKET_TOKEN, c.token);
+    return true;
+  }
+  Expect.throws(parse, check);
+}
+
 void main() {
   testGenericTypes();
   // TODO(ahe): Enable this test when we handle library prefixes.
@@ -279,4 +307,5 @@
   testIndex();
   testPostfix();
   testOperatorParse();
+  testMissingCloseParen();
 }
diff --git a/tests/compiler/dart2js/partial_parser_test.dart b/tests/compiler/dart2js/partial_parser_test.dart
index 60454d7..0539dfd 100644
--- a/tests/compiler/dart2js/partial_parser_test.dart
+++ b/tests/compiler/dart2js/partial_parser_test.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#import('parser_helper.dart');
-#import('../../../lib/compiler/implementation/scanner/scannerlib.dart');
+import 'parser_helper.dart';
 
 void main() {
   testSkipExpression();
diff --git a/tests/compiler/dart2js/patch_test.dart b/tests/compiler/dart2js/patch_test.dart
index a727f78..9770b3f 100644
--- a/tests/compiler/dart2js/patch_test.dart
+++ b/tests/compiler/dart2js/patch_test.dart
@@ -34,11 +34,7 @@
 void expectHasNoBody(compiler, Element element) {
     var node = element.parseNode(compiler);
     Expect.isNotNull(node, "Element isn't parseable, when a body was expected");
-    Expect.isNotNull(node.body);
-    // If the element has no body it is a Block with identical begin and end
-    // tokens (the semicolon).
-    Expect.isTrue(node.body is Block);
-    Expect.identical(node.body.getBeginToken(), node.body.getEndToken());
+    Expect.isFalse(node.hasBody());
 }
 
 Element ensure(compiler,
diff --git a/tests/compiler/dart2js/resolver_test.dart b/tests/compiler/dart2js/resolver_test.dart
index 4f964aa..3cb50bf 100644
--- a/tests/compiler/dart2js/resolver_test.dart
+++ b/tests/compiler/dart2js/resolver_test.dart
@@ -5,7 +5,7 @@
 import 'dart:uri';
 
 import "../../../lib/compiler/implementation/dart2jslib.dart"
-    hide TreeElementMapping, TreeElements;
+    hide TreeElementMapping, TreeElements, SourceString;
 import "../../../lib/compiler/implementation/resolution/resolution.dart";
 import "../../../lib/compiler/implementation/elements/elements.dart";
 import "../../../lib/compiler/implementation/tree/tree.dart";
diff --git a/tests/compiler/dart2js/type_checker_test.dart b/tests/compiler/dart2js/type_checker_test.dart
index 62d231e..cb06d74 100644
--- a/tests/compiler/dart2js/type_checker_test.dart
+++ b/tests/compiler/dart2js/type_checker_test.dart
@@ -2,13 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "../../../lib/compiler/implementation/dart2jslib.dart" hide SourceString;
-import "../../../lib/compiler/implementation/elements/elements.dart";
-import "../../../lib/compiler/implementation/tree/tree.dart";
-import '../../../lib/compiler/implementation/scanner/scannerlib.dart';
-import "../../../lib/compiler/implementation/util/util.dart";
-import "mock_compiler.dart";
-import "parser_helper.dart";
+import '../../../lib/compiler/implementation/dart2jslib.dart' hide SourceString;
+import '../../../lib/compiler/implementation/elements/elements.dart';
+import '../../../lib/compiler/implementation/tree/tree.dart';
+import '../../../lib/compiler/implementation/util/util.dart';
+import 'mock_compiler.dart';
+import 'parser_helper.dart';
 
 DartType intType;
 DartType boolType;
diff --git a/tests/compiler/dart2js/type_combination_test.dart b/tests/compiler/dart2js/type_combination_test.dart
index 7dbc058..fa2c48a 100644
--- a/tests/compiler/dart2js/type_combination_test.dart
+++ b/tests/compiler/dart2js/type_combination_test.dart
@@ -2,12 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#source("../../../lib/compiler/implementation/ssa/types.dart");
-
-class DartType {
-  const DartType(this.str);
-  final String str;
-}
+#import("mock_compiler.dart");
+#import("../../../lib/compiler/implementation/ssa/ssa.dart");
 
 const CONFLICTING = HType.CONFLICTING;
 const UNKNOWN = HType.UNKNOWN;
@@ -21,1048 +17,2021 @@
 const MUTABLE_ARRAY = HType.MUTABLE_ARRAY;
 const FIXED_ARRAY = HType.FIXED_ARRAY;
 const EXTENDABLE_ARRAY = HType.EXTENDABLE_ARRAY;
-const NON_PRIMITIVE1 = const HBoundedType.nonNull(const DartType("type1"));
-const NON_PRIMITIVE2 = const HBoundedType.nonNull(const DartType("type2"));
-const POTENTIAL_ARRAY =
-    const HBoundedPotentialPrimitiveArray(const DartType('type 3'), true);
-const POTENTIAL_STRING =
-    const HBoundedPotentialPrimitiveString(const DartType('type 4'), true);
 const BOOLEAN_OR_NULL = HType.BOOLEAN_OR_NULL;
 const NUMBER_OR_NULL = HType.NUMBER_OR_NULL;
 const INTEGER_OR_NULL = HType.INTEGER_OR_NULL;
 const DOUBLE_OR_NULL = HType.DOUBLE_OR_NULL;
 const STRING_OR_NULL = HType.STRING_OR_NULL;
 const NULL = HType.NULL;
+HType nonPrimitive1;
+HType nonPrimitive2;
+HType potentialArray;
+HType potentialString;
 
-void testUnion() {
-  Expect.equals(CONFLICTING, CONFLICTING.union(CONFLICTING));
-  Expect.equals(UNKNOWN, CONFLICTING.union(UNKNOWN));
-  Expect.equals(BOOLEAN, CONFLICTING.union(BOOLEAN));
-  Expect.equals(NUMBER, CONFLICTING.union(NUMBER));
-  Expect.equals(INTEGER, CONFLICTING.union(INTEGER));
-  Expect.equals(DOUBLE, CONFLICTING.union(DOUBLE));
-  Expect.equals(INDEXABLE_PRIMITIVE, CONFLICTING.union(INDEXABLE_PRIMITIVE));
-  Expect.equals(STRING, CONFLICTING.union(STRING));
-  Expect.equals(READABLE_ARRAY, CONFLICTING.union(READABLE_ARRAY));
-  Expect.equals(MUTABLE_ARRAY, CONFLICTING.union(MUTABLE_ARRAY));
-  Expect.equals(EXTENDABLE_ARRAY, CONFLICTING.union(EXTENDABLE_ARRAY));
-  Expect.equals(NON_PRIMITIVE1, CONFLICTING.union(NON_PRIMITIVE1));
-  Expect.equals(NON_PRIMITIVE2, CONFLICTING.union(NON_PRIMITIVE2));
-  Expect.equals(POTENTIAL_ARRAY, CONFLICTING.union(POTENTIAL_ARRAY));
-  Expect.equals(POTENTIAL_STRING, CONFLICTING.union(POTENTIAL_STRING));
-  Expect.equals(BOOLEAN_OR_NULL, CONFLICTING.union(BOOLEAN_OR_NULL));
-  Expect.equals(NUMBER_OR_NULL, CONFLICTING.union(NUMBER_OR_NULL));
-  Expect.equals(INTEGER_OR_NULL, CONFLICTING.union(INTEGER_OR_NULL));
-  Expect.equals(DOUBLE_OR_NULL, CONFLICTING.union(DOUBLE_OR_NULL));
-  Expect.equals(STRING_OR_NULL, CONFLICTING.union(STRING_OR_NULL));
-  Expect.equals(NULL, CONFLICTING.union(NULL));
-  Expect.equals(FIXED_ARRAY, CONFLICTING.union(FIXED_ARRAY));
+void testUnion(MockCompiler compiler) {
+  Expect.equals(CONFLICTING, 
+                CONFLICTING.union(CONFLICTING, compiler));
+  Expect.equals(UNKNOWN, 
+                CONFLICTING.union(UNKNOWN, compiler));
+  Expect.equals(BOOLEAN, 
+                CONFLICTING.union(BOOLEAN, compiler));
+  Expect.equals(NUMBER, 
+                CONFLICTING.union(NUMBER, compiler));
+  Expect.equals(INTEGER, 
+                CONFLICTING.union(INTEGER, compiler));
+  Expect.equals(DOUBLE, 
+                CONFLICTING.union(DOUBLE, compiler));
+  Expect.equals(INDEXABLE_PRIMITIVE, 
+                CONFLICTING.union(INDEXABLE_PRIMITIVE, compiler));
+  Expect.equals(STRING, 
+                CONFLICTING.union(STRING, compiler));
+  Expect.equals(READABLE_ARRAY, 
+                CONFLICTING.union(READABLE_ARRAY, compiler));
+  Expect.equals(MUTABLE_ARRAY, 
+                CONFLICTING.union(MUTABLE_ARRAY, compiler));
+  Expect.equals(EXTENDABLE_ARRAY, 
+                CONFLICTING.union(EXTENDABLE_ARRAY, compiler));
+  Expect.equals(nonPrimitive1, 
+                CONFLICTING.union(nonPrimitive1, compiler));
+  Expect.equals(nonPrimitive2, 
+                CONFLICTING.union(nonPrimitive2, compiler));
+  Expect.equals(potentialArray, 
+                CONFLICTING.union(potentialArray, compiler));
+  Expect.equals(potentialString, 
+                CONFLICTING.union(potentialString, compiler));
+  Expect.equals(BOOLEAN_OR_NULL, 
+                CONFLICTING.union(BOOLEAN_OR_NULL, compiler));
+  Expect.equals(NUMBER_OR_NULL, 
+                CONFLICTING.union(NUMBER_OR_NULL, compiler));
+  Expect.equals(INTEGER_OR_NULL, 
+                CONFLICTING.union(INTEGER_OR_NULL, compiler));
+  Expect.equals(DOUBLE_OR_NULL, 
+                CONFLICTING.union(DOUBLE_OR_NULL, compiler));
+  Expect.equals(STRING_OR_NULL, 
+                CONFLICTING.union(STRING_OR_NULL, compiler));
+  Expect.equals(NULL, 
+                CONFLICTING.union(NULL, compiler));
+  Expect.equals(FIXED_ARRAY, 
+                CONFLICTING.union(FIXED_ARRAY, compiler));
 
-  Expect.equals(UNKNOWN, UNKNOWN.union(CONFLICTING));
-  Expect.equals(UNKNOWN, UNKNOWN.union(UNKNOWN));
-  Expect.equals(UNKNOWN, UNKNOWN.union(BOOLEAN));
-  Expect.equals(UNKNOWN, UNKNOWN.union(NUMBER));
-  Expect.equals(UNKNOWN, UNKNOWN.union(INTEGER));
-  Expect.equals(UNKNOWN, UNKNOWN.union(DOUBLE));
-  Expect.equals(UNKNOWN, UNKNOWN.union(INDEXABLE_PRIMITIVE));
-  Expect.equals(UNKNOWN, UNKNOWN.union(STRING));
-  Expect.equals(UNKNOWN, UNKNOWN.union(READABLE_ARRAY));
-  Expect.equals(UNKNOWN, UNKNOWN.union(MUTABLE_ARRAY));
-  Expect.equals(UNKNOWN, UNKNOWN.union(EXTENDABLE_ARRAY));
-  Expect.equals(UNKNOWN, UNKNOWN.union(NON_PRIMITIVE1));
-  Expect.equals(UNKNOWN, UNKNOWN.union(NON_PRIMITIVE2));
-  Expect.equals(UNKNOWN, UNKNOWN.union(POTENTIAL_ARRAY));
-  Expect.equals(UNKNOWN, UNKNOWN.union(POTENTIAL_STRING));
-  Expect.equals(UNKNOWN, UNKNOWN.union(BOOLEAN_OR_NULL));
-  Expect.equals(UNKNOWN, UNKNOWN.union(NUMBER_OR_NULL));
-  Expect.equals(UNKNOWN, UNKNOWN.union(INTEGER_OR_NULL));
-  Expect.equals(UNKNOWN, UNKNOWN.union(DOUBLE_OR_NULL));
-  Expect.equals(UNKNOWN, UNKNOWN.union(STRING_OR_NULL));
-  Expect.equals(UNKNOWN, UNKNOWN.union(NULL));
-  Expect.equals(UNKNOWN, UNKNOWN.union(FIXED_ARRAY));
+  Expect.equals(UNKNOWN, 
+                UNKNOWN.union(CONFLICTING, compiler));
+  Expect.equals(UNKNOWN, 
+                UNKNOWN.union(UNKNOWN, compiler));
+  Expect.equals(UNKNOWN, 
+                UNKNOWN.union(BOOLEAN, compiler));
+  Expect.equals(UNKNOWN, 
+                UNKNOWN.union(NUMBER, compiler));
+  Expect.equals(UNKNOWN, 
+                UNKNOWN.union(INTEGER, compiler));
+  Expect.equals(UNKNOWN, 
+                UNKNOWN.union(DOUBLE, compiler));
+  Expect.equals(UNKNOWN, 
+                UNKNOWN.union(INDEXABLE_PRIMITIVE, compiler));
+  Expect.equals(UNKNOWN, 
+                UNKNOWN.union(STRING, compiler));
+  Expect.equals(UNKNOWN, 
+                UNKNOWN.union(READABLE_ARRAY, compiler));
+  Expect.equals(UNKNOWN, 
+                UNKNOWN.union(MUTABLE_ARRAY, compiler));
+  Expect.equals(UNKNOWN, 
+                UNKNOWN.union(EXTENDABLE_ARRAY, compiler));
+  Expect.equals(UNKNOWN, 
+                UNKNOWN.union(nonPrimitive1, compiler));
+  Expect.equals(UNKNOWN, 
+                UNKNOWN.union(nonPrimitive2, compiler));
+  Expect.equals(UNKNOWN, 
+                UNKNOWN.union(potentialArray, compiler));
+  Expect.equals(UNKNOWN, 
+                UNKNOWN.union(potentialString, compiler));
+  Expect.equals(UNKNOWN, 
+                UNKNOWN.union(BOOLEAN_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                UNKNOWN.union(NUMBER_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                UNKNOWN.union(INTEGER_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                UNKNOWN.union(DOUBLE_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                UNKNOWN.union(STRING_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                UNKNOWN.union(NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                UNKNOWN.union(FIXED_ARRAY, compiler));
 
-  Expect.equals(BOOLEAN, BOOLEAN.union(CONFLICTING));
-  Expect.equals(UNKNOWN, BOOLEAN.union(UNKNOWN));
-  Expect.equals(BOOLEAN, BOOLEAN.union(BOOLEAN));
-  Expect.equals(UNKNOWN, BOOLEAN.union(NUMBER));
-  Expect.equals(UNKNOWN, BOOLEAN.union(INTEGER));
-  Expect.equals(UNKNOWN, BOOLEAN.union(DOUBLE));
-  Expect.equals(UNKNOWN, BOOLEAN.union(INDEXABLE_PRIMITIVE));
-  Expect.equals(UNKNOWN, BOOLEAN.union(STRING));
-  Expect.equals(UNKNOWN, BOOLEAN.union(READABLE_ARRAY));
-  Expect.equals(UNKNOWN, BOOLEAN.union(MUTABLE_ARRAY));
-  Expect.equals(UNKNOWN, BOOLEAN.union(EXTENDABLE_ARRAY));
-  Expect.equals(UNKNOWN, BOOLEAN.union(NON_PRIMITIVE1));
-  Expect.equals(UNKNOWN, BOOLEAN.union(NON_PRIMITIVE2));
-  Expect.equals(UNKNOWN, BOOLEAN.union(POTENTIAL_ARRAY));
-  Expect.equals(UNKNOWN, BOOLEAN.union(POTENTIAL_STRING));
-  Expect.equals(BOOLEAN_OR_NULL, BOOLEAN.union(BOOLEAN_OR_NULL));
-  Expect.equals(UNKNOWN, BOOLEAN.union(NUMBER_OR_NULL));
-  Expect.equals(UNKNOWN, BOOLEAN.union(INTEGER_OR_NULL));
-  Expect.equals(UNKNOWN, BOOLEAN.union(DOUBLE_OR_NULL));
-  Expect.equals(UNKNOWN, BOOLEAN.union(STRING_OR_NULL));
-  Expect.equals(BOOLEAN_OR_NULL, BOOLEAN.union(NULL));
-  Expect.equals(UNKNOWN, BOOLEAN.union(FIXED_ARRAY));
+  Expect.equals(BOOLEAN, 
+                BOOLEAN.union(CONFLICTING, compiler));
+  Expect.equals(UNKNOWN, 
+                BOOLEAN.union(UNKNOWN, compiler));
+  Expect.equals(BOOLEAN, 
+                BOOLEAN.union(BOOLEAN, compiler));
+  Expect.equals(UNKNOWN, 
+                BOOLEAN.union(NUMBER, compiler));
+  Expect.equals(UNKNOWN, 
+                BOOLEAN.union(INTEGER, compiler));
+  Expect.equals(UNKNOWN, 
+                BOOLEAN.union(DOUBLE, compiler));
+  Expect.equals(UNKNOWN, 
+                BOOLEAN.union(INDEXABLE_PRIMITIVE, compiler));
+  Expect.equals(UNKNOWN, 
+                BOOLEAN.union(STRING, compiler));
+  Expect.equals(UNKNOWN, 
+                BOOLEAN.union(READABLE_ARRAY, compiler));
+  Expect.equals(UNKNOWN, 
+                BOOLEAN.union(MUTABLE_ARRAY, compiler));
+  Expect.equals(UNKNOWN, 
+                BOOLEAN.union(EXTENDABLE_ARRAY, compiler));
+  Expect.equals(UNKNOWN, 
+                BOOLEAN.union(nonPrimitive1, compiler));
+  Expect.equals(UNKNOWN, 
+                BOOLEAN.union(nonPrimitive2, compiler));
+  Expect.equals(UNKNOWN, 
+                BOOLEAN.union(potentialArray, compiler));
+  Expect.equals(UNKNOWN, 
+                BOOLEAN.union(potentialString, compiler));
+  Expect.equals(BOOLEAN_OR_NULL, 
+                BOOLEAN.union(BOOLEAN_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                BOOLEAN.union(NUMBER_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                BOOLEAN.union(INTEGER_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                BOOLEAN.union(DOUBLE_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                BOOLEAN.union(STRING_OR_NULL, compiler));
+  Expect.equals(BOOLEAN_OR_NULL, 
+                BOOLEAN.union(NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                BOOLEAN.union(FIXED_ARRAY, compiler));
 
-  Expect.equals(NUMBER, NUMBER.union(CONFLICTING));
-  Expect.equals(UNKNOWN, NUMBER.union(UNKNOWN));
-  Expect.equals(UNKNOWN, NUMBER.union(BOOLEAN));
-  Expect.equals(NUMBER, NUMBER.union(NUMBER));
-  Expect.equals(NUMBER, NUMBER.union(INTEGER));
-  Expect.equals(NUMBER, NUMBER.union(DOUBLE));
-  Expect.equals(UNKNOWN, NUMBER.union(INDEXABLE_PRIMITIVE));
-  Expect.equals(UNKNOWN, NUMBER.union(STRING));
-  Expect.equals(UNKNOWN, NUMBER.union(READABLE_ARRAY));
-  Expect.equals(UNKNOWN, NUMBER.union(MUTABLE_ARRAY));
-  Expect.equals(UNKNOWN, NUMBER.union(EXTENDABLE_ARRAY));
-  Expect.equals(UNKNOWN, NUMBER.union(NON_PRIMITIVE1));
-  Expect.equals(UNKNOWN, NUMBER.union(NON_PRIMITIVE2));
-  Expect.equals(UNKNOWN, NUMBER.union(POTENTIAL_ARRAY));
-  Expect.equals(UNKNOWN, NUMBER.union(POTENTIAL_STRING));
-  Expect.equals(UNKNOWN, NUMBER.union(BOOLEAN_OR_NULL));
-  Expect.equals(NUMBER_OR_NULL, NUMBER.union(NUMBER_OR_NULL));
-  Expect.equals(NUMBER_OR_NULL, NUMBER.union(INTEGER_OR_NULL));
-  Expect.equals(NUMBER_OR_NULL, NUMBER.union(DOUBLE_OR_NULL));
-  Expect.equals(UNKNOWN, NUMBER.union(STRING_OR_NULL));
-  Expect.equals(NUMBER_OR_NULL, NUMBER.union(NULL));
-  Expect.equals(UNKNOWN, NUMBER.union(FIXED_ARRAY));
+  Expect.equals(NUMBER, 
+                NUMBER.union(CONFLICTING, compiler));
+  Expect.equals(UNKNOWN, 
+                NUMBER.union(UNKNOWN, compiler));
+  Expect.equals(UNKNOWN, 
+                NUMBER.union(BOOLEAN, compiler));
+  Expect.equals(NUMBER, 
+                NUMBER.union(NUMBER, compiler));
+  Expect.equals(NUMBER, 
+                NUMBER.union(INTEGER, compiler));
+  Expect.equals(NUMBER, 
+                NUMBER.union(DOUBLE, compiler));
+  Expect.equals(UNKNOWN, 
+                NUMBER.union(INDEXABLE_PRIMITIVE, compiler));
+  Expect.equals(UNKNOWN, 
+                NUMBER.union(STRING, compiler));
+  Expect.equals(UNKNOWN, 
+                NUMBER.union(READABLE_ARRAY, compiler));
+  Expect.equals(UNKNOWN, 
+                NUMBER.union(MUTABLE_ARRAY, compiler));
+  Expect.equals(UNKNOWN, 
+                NUMBER.union(EXTENDABLE_ARRAY, compiler));
+  Expect.equals(UNKNOWN, 
+                NUMBER.union(nonPrimitive1, compiler));
+  Expect.equals(UNKNOWN, 
+                NUMBER.union(nonPrimitive2, compiler));
+  Expect.equals(UNKNOWN, 
+                NUMBER.union(potentialArray, compiler));
+  Expect.equals(UNKNOWN, 
+                NUMBER.union(potentialString, compiler));
+  Expect.equals(UNKNOWN, 
+                NUMBER.union(BOOLEAN_OR_NULL, compiler));
+  Expect.equals(NUMBER_OR_NULL, 
+                NUMBER.union(NUMBER_OR_NULL, compiler));
+  Expect.equals(NUMBER_OR_NULL, 
+                NUMBER.union(INTEGER_OR_NULL, compiler));
+  Expect.equals(NUMBER_OR_NULL, 
+                NUMBER.union(DOUBLE_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                NUMBER.union(STRING_OR_NULL, compiler));
+  Expect.equals(NUMBER_OR_NULL, 
+                NUMBER.union(NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                NUMBER.union(FIXED_ARRAY, compiler));
 
-  Expect.equals(INTEGER, INTEGER.union(CONFLICTING));
-  Expect.equals(UNKNOWN, INTEGER.union(UNKNOWN));
-  Expect.equals(UNKNOWN, INTEGER.union(BOOLEAN));
-  Expect.equals(NUMBER, INTEGER.union(NUMBER));
-  Expect.equals(INTEGER, INTEGER.union(INTEGER));
-  Expect.equals(NUMBER, INTEGER.union(DOUBLE));
-  Expect.equals(UNKNOWN, INTEGER.union(INDEXABLE_PRIMITIVE));
-  Expect.equals(UNKNOWN, INTEGER.union(STRING));
-  Expect.equals(UNKNOWN, INTEGER.union(READABLE_ARRAY));
-  Expect.equals(UNKNOWN, INTEGER.union(MUTABLE_ARRAY));
-  Expect.equals(UNKNOWN, INTEGER.union(EXTENDABLE_ARRAY));
-  Expect.equals(UNKNOWN, INTEGER.union(NON_PRIMITIVE1));
-  Expect.equals(UNKNOWN, INTEGER.union(NON_PRIMITIVE2));
-  Expect.equals(UNKNOWN, INTEGER.union(POTENTIAL_ARRAY));
-  Expect.equals(UNKNOWN, INTEGER.union(POTENTIAL_STRING));
-  Expect.equals(UNKNOWN, INTEGER.union(BOOLEAN_OR_NULL));
-  Expect.equals(NUMBER_OR_NULL, INTEGER.union(NUMBER_OR_NULL));
-  Expect.equals(INTEGER_OR_NULL, INTEGER.union(INTEGER_OR_NULL));
-  Expect.equals(NUMBER_OR_NULL, INTEGER.union(DOUBLE_OR_NULL));
-  Expect.equals(UNKNOWN, INTEGER.union(STRING_OR_NULL));
-  Expect.equals(INTEGER_OR_NULL, INTEGER.union(NULL));
-  Expect.equals(UNKNOWN, INTEGER.union(FIXED_ARRAY));
+  Expect.equals(INTEGER, 
+                INTEGER.union(CONFLICTING, compiler));
+  Expect.equals(UNKNOWN, 
+                INTEGER.union(UNKNOWN, compiler));
+  Expect.equals(UNKNOWN, 
+                INTEGER.union(BOOLEAN, compiler));
+  Expect.equals(NUMBER, 
+                INTEGER.union(NUMBER, compiler));
+  Expect.equals(INTEGER, 
+                INTEGER.union(INTEGER, compiler));
+  Expect.equals(NUMBER, 
+                INTEGER.union(DOUBLE, compiler));
+  Expect.equals(UNKNOWN, 
+                INTEGER.union(INDEXABLE_PRIMITIVE, compiler));
+  Expect.equals(UNKNOWN, 
+                INTEGER.union(STRING, compiler));
+  Expect.equals(UNKNOWN, 
+                INTEGER.union(READABLE_ARRAY, compiler));
+  Expect.equals(UNKNOWN, 
+                INTEGER.union(MUTABLE_ARRAY, compiler));
+  Expect.equals(UNKNOWN, 
+                INTEGER.union(EXTENDABLE_ARRAY, compiler));
+  Expect.equals(UNKNOWN, 
+                INTEGER.union(nonPrimitive1, compiler));
+  Expect.equals(UNKNOWN, 
+                INTEGER.union(nonPrimitive2, compiler));
+  Expect.equals(UNKNOWN, 
+                INTEGER.union(potentialArray, compiler));
+  Expect.equals(UNKNOWN, 
+                INTEGER.union(potentialString, compiler));
+  Expect.equals(UNKNOWN, 
+                INTEGER.union(BOOLEAN_OR_NULL, compiler));
+  Expect.equals(NUMBER_OR_NULL, 
+                INTEGER.union(NUMBER_OR_NULL, compiler));
+  Expect.equals(INTEGER_OR_NULL, 
+                INTEGER.union(INTEGER_OR_NULL, compiler));
+  Expect.equals(NUMBER_OR_NULL, 
+                INTEGER.union(DOUBLE_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                INTEGER.union(STRING_OR_NULL, compiler));
+  Expect.equals(INTEGER_OR_NULL, 
+                INTEGER.union(NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                INTEGER.union(FIXED_ARRAY, compiler));
 
-  Expect.equals(DOUBLE, DOUBLE.union(CONFLICTING));
-  Expect.equals(UNKNOWN, DOUBLE.union(UNKNOWN));
-  Expect.equals(UNKNOWN, DOUBLE.union(BOOLEAN));
-  Expect.equals(NUMBER, DOUBLE.union(NUMBER));
-  Expect.equals(NUMBER, DOUBLE.union(INTEGER));
-  Expect.equals(DOUBLE, DOUBLE.union(DOUBLE));
-  Expect.equals(UNKNOWN, DOUBLE.union(INDEXABLE_PRIMITIVE));
-  Expect.equals(UNKNOWN, DOUBLE.union(STRING));
-  Expect.equals(UNKNOWN, DOUBLE.union(READABLE_ARRAY));
-  Expect.equals(UNKNOWN, DOUBLE.union(MUTABLE_ARRAY));
-  Expect.equals(UNKNOWN, DOUBLE.union(EXTENDABLE_ARRAY));
-  Expect.equals(UNKNOWN, DOUBLE.union(NON_PRIMITIVE1));
-  Expect.equals(UNKNOWN, DOUBLE.union(NON_PRIMITIVE2));
-  Expect.equals(UNKNOWN, DOUBLE.union(POTENTIAL_ARRAY));
-  Expect.equals(UNKNOWN, DOUBLE.union(POTENTIAL_STRING));
-  Expect.equals(UNKNOWN, DOUBLE.union(BOOLEAN_OR_NULL));
-  Expect.equals(NUMBER_OR_NULL, DOUBLE.union(NUMBER_OR_NULL));
-  Expect.equals(NUMBER_OR_NULL, DOUBLE.union(INTEGER_OR_NULL));
-  Expect.equals(DOUBLE_OR_NULL, DOUBLE.union(DOUBLE_OR_NULL));
-  Expect.equals(UNKNOWN, DOUBLE.union(STRING_OR_NULL));
-  Expect.equals(DOUBLE_OR_NULL, DOUBLE.union(NULL));
-  Expect.equals(UNKNOWN, DOUBLE.union(FIXED_ARRAY));
+  Expect.equals(DOUBLE, 
+                DOUBLE.union(CONFLICTING, compiler));
+  Expect.equals(UNKNOWN, 
+                DOUBLE.union(UNKNOWN, compiler));
+  Expect.equals(UNKNOWN, 
+                DOUBLE.union(BOOLEAN, compiler));
+  Expect.equals(NUMBER, 
+                DOUBLE.union(NUMBER, compiler));
+  Expect.equals(NUMBER, 
+                DOUBLE.union(INTEGER, compiler));
+  Expect.equals(DOUBLE, 
+                DOUBLE.union(DOUBLE, compiler));
+  Expect.equals(UNKNOWN, 
+                DOUBLE.union(INDEXABLE_PRIMITIVE, compiler));
+  Expect.equals(UNKNOWN, 
+                DOUBLE.union(STRING, compiler));
+  Expect.equals(UNKNOWN, 
+                DOUBLE.union(READABLE_ARRAY, compiler));
+  Expect.equals(UNKNOWN, 
+                DOUBLE.union(MUTABLE_ARRAY, compiler));
+  Expect.equals(UNKNOWN, 
+                DOUBLE.union(EXTENDABLE_ARRAY, compiler));
+  Expect.equals(UNKNOWN, 
+                DOUBLE.union(nonPrimitive1, compiler));
+  Expect.equals(UNKNOWN, 
+                DOUBLE.union(nonPrimitive2, compiler));
+  Expect.equals(UNKNOWN, 
+                DOUBLE.union(potentialArray, compiler));
+  Expect.equals(UNKNOWN, 
+                DOUBLE.union(potentialString, compiler));
+  Expect.equals(UNKNOWN, 
+                DOUBLE.union(BOOLEAN_OR_NULL, compiler));
+  Expect.equals(NUMBER_OR_NULL, 
+                DOUBLE.union(NUMBER_OR_NULL, compiler));
+  Expect.equals(NUMBER_OR_NULL, 
+                DOUBLE.union(INTEGER_OR_NULL, compiler));
+  Expect.equals(DOUBLE_OR_NULL, 
+                DOUBLE.union(DOUBLE_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                DOUBLE.union(STRING_OR_NULL, compiler));
+  Expect.equals(DOUBLE_OR_NULL, 
+                DOUBLE.union(NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                DOUBLE.union(FIXED_ARRAY, compiler));
 
-  Expect.equals(INDEXABLE_PRIMITIVE, INDEXABLE_PRIMITIVE.union(CONFLICTING));
-  Expect.equals(UNKNOWN, INDEXABLE_PRIMITIVE.union(UNKNOWN));
-  Expect.equals(UNKNOWN, INDEXABLE_PRIMITIVE.union(BOOLEAN));
-  Expect.equals(UNKNOWN, INDEXABLE_PRIMITIVE.union(NUMBER));
-  Expect.equals(UNKNOWN, INDEXABLE_PRIMITIVE.union(INTEGER));
-  Expect.equals(UNKNOWN, INDEXABLE_PRIMITIVE.union(DOUBLE));
+  Expect.equals(INDEXABLE_PRIMITIVE, 
+                INDEXABLE_PRIMITIVE.union(CONFLICTING, compiler));
+  Expect.equals(UNKNOWN, 
+                INDEXABLE_PRIMITIVE.union(UNKNOWN, compiler));
+  Expect.equals(UNKNOWN, 
+                INDEXABLE_PRIMITIVE.union(BOOLEAN, compiler));
+  Expect.equals(UNKNOWN, 
+                INDEXABLE_PRIMITIVE.union(NUMBER, compiler));
+  Expect.equals(UNKNOWN, 
+                INDEXABLE_PRIMITIVE.union(INTEGER, compiler));
+  Expect.equals(UNKNOWN, 
+                INDEXABLE_PRIMITIVE.union(DOUBLE, compiler));
   Expect.equals(INDEXABLE_PRIMITIVE,
-                INDEXABLE_PRIMITIVE.union(INDEXABLE_PRIMITIVE));
-  Expect.equals(INDEXABLE_PRIMITIVE, INDEXABLE_PRIMITIVE.union(STRING));
-  Expect.equals(INDEXABLE_PRIMITIVE, INDEXABLE_PRIMITIVE.union(READABLE_ARRAY));
-  Expect.equals(INDEXABLE_PRIMITIVE, INDEXABLE_PRIMITIVE.union(MUTABLE_ARRAY));
+                INDEXABLE_PRIMITIVE.union(INDEXABLE_PRIMITIVE, 
+                compiler));
+  Expect.equals(INDEXABLE_PRIMITIVE, 
+                INDEXABLE_PRIMITIVE.union(STRING, compiler));
+  Expect.equals(INDEXABLE_PRIMITIVE, 
+                INDEXABLE_PRIMITIVE.union(READABLE_ARRAY, compiler));
+  Expect.equals(INDEXABLE_PRIMITIVE, 
+                INDEXABLE_PRIMITIVE.union(MUTABLE_ARRAY, compiler));
   Expect.equals(INDEXABLE_PRIMITIVE,
-                INDEXABLE_PRIMITIVE.union(EXTENDABLE_ARRAY));
-  Expect.equals(UNKNOWN, INDEXABLE_PRIMITIVE.union(NON_PRIMITIVE1));
-  Expect.equals(UNKNOWN, INDEXABLE_PRIMITIVE.union(NON_PRIMITIVE2));
-  Expect.equals(UNKNOWN, INDEXABLE_PRIMITIVE.union(POTENTIAL_ARRAY));
-  Expect.equals(UNKNOWN, INDEXABLE_PRIMITIVE.union(POTENTIAL_STRING));
-  Expect.equals(UNKNOWN, INDEXABLE_PRIMITIVE.union(BOOLEAN_OR_NULL));
-  Expect.equals(UNKNOWN, INDEXABLE_PRIMITIVE.union(NUMBER_OR_NULL));
-  Expect.equals(UNKNOWN, INDEXABLE_PRIMITIVE.union(INTEGER_OR_NULL));
-  Expect.equals(UNKNOWN, INDEXABLE_PRIMITIVE.union(DOUBLE_OR_NULL));
-  Expect.equals(UNKNOWN, INDEXABLE_PRIMITIVE.union(STRING_OR_NULL));
-  Expect.equals(UNKNOWN, INDEXABLE_PRIMITIVE.union(NULL));
-  Expect.equals(INDEXABLE_PRIMITIVE, INDEXABLE_PRIMITIVE.union(FIXED_ARRAY));
+                INDEXABLE_PRIMITIVE.union(EXTENDABLE_ARRAY, 
+                compiler));
+  Expect.equals(UNKNOWN, 
+                INDEXABLE_PRIMITIVE.union(nonPrimitive1, compiler));
+  Expect.equals(UNKNOWN, 
+                INDEXABLE_PRIMITIVE.union(nonPrimitive2, compiler));
+  Expect.equals(UNKNOWN, 
+                INDEXABLE_PRIMITIVE.union(potentialArray, compiler));
+  Expect.equals(UNKNOWN, 
+                INDEXABLE_PRIMITIVE.union(potentialString, compiler));
+  Expect.equals(UNKNOWN, 
+                INDEXABLE_PRIMITIVE.union(BOOLEAN_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                INDEXABLE_PRIMITIVE.union(NUMBER_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                INDEXABLE_PRIMITIVE.union(INTEGER_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                INDEXABLE_PRIMITIVE.union(DOUBLE_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                INDEXABLE_PRIMITIVE.union(STRING_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                INDEXABLE_PRIMITIVE.union(NULL, compiler));
+  Expect.equals(INDEXABLE_PRIMITIVE, 
+                INDEXABLE_PRIMITIVE.union(FIXED_ARRAY, compiler));
 
-  Expect.equals(STRING, STRING.union(CONFLICTING));
-  Expect.equals(UNKNOWN, STRING.union(UNKNOWN));
-  Expect.equals(UNKNOWN, STRING.union(BOOLEAN));
-  Expect.equals(UNKNOWN, STRING.union(NUMBER));
-  Expect.equals(UNKNOWN, STRING.union(INTEGER));
-  Expect.equals(UNKNOWN, STRING.union(DOUBLE));
-  Expect.equals(INDEXABLE_PRIMITIVE, STRING.union(INDEXABLE_PRIMITIVE));
-  Expect.equals(STRING, STRING.union(STRING));
-  Expect.equals(INDEXABLE_PRIMITIVE, STRING.union(READABLE_ARRAY));
-  Expect.equals(INDEXABLE_PRIMITIVE, STRING.union(MUTABLE_ARRAY));
-  Expect.equals(INDEXABLE_PRIMITIVE, STRING.union(EXTENDABLE_ARRAY));
-  Expect.equals(UNKNOWN, STRING.union(NON_PRIMITIVE1));
-  Expect.equals(UNKNOWN, STRING.union(NON_PRIMITIVE2));
-  Expect.equals(UNKNOWN, STRING.union(POTENTIAL_ARRAY));
-  Expect.equals(POTENTIAL_STRING, STRING.union(POTENTIAL_STRING));
-  Expect.equals(UNKNOWN, STRING.union(BOOLEAN_OR_NULL));
-  Expect.equals(UNKNOWN, STRING.union(NUMBER_OR_NULL));
-  Expect.equals(UNKNOWN, STRING.union(INTEGER_OR_NULL));
-  Expect.equals(UNKNOWN, STRING.union(DOUBLE_OR_NULL));
-  Expect.equals(STRING_OR_NULL, STRING.union(STRING_OR_NULL));
-  Expect.equals(STRING_OR_NULL, STRING.union(NULL));
-  Expect.equals(INDEXABLE_PRIMITIVE, STRING.union(FIXED_ARRAY));
+  Expect.equals(STRING, 
+                STRING.union(CONFLICTING, compiler));
+  Expect.equals(UNKNOWN, 
+                STRING.union(UNKNOWN, compiler));
+  Expect.equals(UNKNOWN, 
+                STRING.union(BOOLEAN, compiler));
+  Expect.equals(UNKNOWN, 
+                STRING.union(NUMBER, compiler));
+  Expect.equals(UNKNOWN, 
+                STRING.union(INTEGER, compiler));
+  Expect.equals(UNKNOWN, 
+                STRING.union(DOUBLE, compiler));
+  Expect.equals(INDEXABLE_PRIMITIVE, 
+                STRING.union(INDEXABLE_PRIMITIVE, compiler));
+  Expect.equals(STRING, 
+                STRING.union(STRING, compiler));
+  Expect.equals(INDEXABLE_PRIMITIVE, 
+                STRING.union(READABLE_ARRAY, compiler));
+  Expect.equals(INDEXABLE_PRIMITIVE, 
+                STRING.union(MUTABLE_ARRAY, compiler));
+  Expect.equals(INDEXABLE_PRIMITIVE, 
+                STRING.union(EXTENDABLE_ARRAY, compiler));
+  Expect.equals(UNKNOWN, 
+                STRING.union(nonPrimitive1, compiler));
+  Expect.equals(UNKNOWN, 
+                STRING.union(nonPrimitive2, compiler));
+  Expect.equals(UNKNOWN, 
+                STRING.union(potentialArray, compiler));
+  Expect.equals(potentialString, 
+                STRING.union(potentialString, compiler));
+  Expect.equals(UNKNOWN, 
+                STRING.union(BOOLEAN_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                STRING.union(NUMBER_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                STRING.union(INTEGER_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                STRING.union(DOUBLE_OR_NULL, compiler));
+  Expect.equals(STRING_OR_NULL, 
+                STRING.union(STRING_OR_NULL, compiler));
+  Expect.equals(STRING_OR_NULL, 
+                STRING.union(NULL, compiler));
+  Expect.equals(INDEXABLE_PRIMITIVE, 
+                STRING.union(FIXED_ARRAY, compiler));
 
-  Expect.equals(READABLE_ARRAY, READABLE_ARRAY.union(CONFLICTING));
-  Expect.equals(UNKNOWN, READABLE_ARRAY.union(UNKNOWN));
-  Expect.equals(UNKNOWN, READABLE_ARRAY.union(BOOLEAN));
-  Expect.equals(UNKNOWN, READABLE_ARRAY.union(NUMBER));
-  Expect.equals(UNKNOWN, READABLE_ARRAY.union(INTEGER));
-  Expect.equals(UNKNOWN, READABLE_ARRAY.union(DOUBLE));
-  Expect.equals(INDEXABLE_PRIMITIVE, READABLE_ARRAY.union(INDEXABLE_PRIMITIVE));
-  Expect.equals(INDEXABLE_PRIMITIVE, READABLE_ARRAY.union(STRING));
-  Expect.equals(READABLE_ARRAY, READABLE_ARRAY.union(READABLE_ARRAY));
-  Expect.equals(READABLE_ARRAY, READABLE_ARRAY.union(MUTABLE_ARRAY));
-  Expect.equals(READABLE_ARRAY, READABLE_ARRAY.union(EXTENDABLE_ARRAY));
-  Expect.equals(UNKNOWN, READABLE_ARRAY.union(NON_PRIMITIVE1));
-  Expect.equals(UNKNOWN, READABLE_ARRAY.union(NON_PRIMITIVE2));
-  Expect.equals(POTENTIAL_ARRAY, READABLE_ARRAY.union(POTENTIAL_ARRAY));
-  Expect.equals(UNKNOWN, READABLE_ARRAY.union(POTENTIAL_STRING));
-  Expect.equals(UNKNOWN, READABLE_ARRAY.union(BOOLEAN_OR_NULL));
-  Expect.equals(UNKNOWN, READABLE_ARRAY.union(NUMBER_OR_NULL));
-  Expect.equals(UNKNOWN, READABLE_ARRAY.union(INTEGER_OR_NULL));
-  Expect.equals(UNKNOWN, READABLE_ARRAY.union(DOUBLE_OR_NULL));
-  Expect.equals(UNKNOWN, READABLE_ARRAY.union(STRING_OR_NULL));
-  Expect.equals(UNKNOWN, READABLE_ARRAY.union(NULL));
-  Expect.equals(READABLE_ARRAY, READABLE_ARRAY.union(FIXED_ARRAY));
+  Expect.equals(READABLE_ARRAY, 
+                READABLE_ARRAY.union(CONFLICTING, compiler));
+  Expect.equals(UNKNOWN, 
+                READABLE_ARRAY.union(UNKNOWN, compiler));
+  Expect.equals(UNKNOWN, 
+                READABLE_ARRAY.union(BOOLEAN, compiler));
+  Expect.equals(UNKNOWN, 
+                READABLE_ARRAY.union(NUMBER, compiler));
+  Expect.equals(UNKNOWN, 
+                READABLE_ARRAY.union(INTEGER, compiler));
+  Expect.equals(UNKNOWN, 
+                READABLE_ARRAY.union(DOUBLE, compiler));
+  Expect.equals(INDEXABLE_PRIMITIVE, 
+                READABLE_ARRAY.union(INDEXABLE_PRIMITIVE, compiler));
+  Expect.equals(INDEXABLE_PRIMITIVE, 
+                READABLE_ARRAY.union(STRING, compiler));
+  Expect.equals(READABLE_ARRAY, 
+                READABLE_ARRAY.union(READABLE_ARRAY, compiler));
+  Expect.equals(READABLE_ARRAY, 
+                READABLE_ARRAY.union(MUTABLE_ARRAY, compiler));
+  Expect.equals(READABLE_ARRAY, 
+                READABLE_ARRAY.union(EXTENDABLE_ARRAY, compiler));
+  Expect.equals(UNKNOWN, 
+                READABLE_ARRAY.union(nonPrimitive1, compiler));
+  Expect.equals(UNKNOWN, 
+                READABLE_ARRAY.union(nonPrimitive2, compiler));
+  Expect.equals(potentialArray, 
+                READABLE_ARRAY.union(potentialArray, compiler));
+  Expect.equals(UNKNOWN, 
+                READABLE_ARRAY.union(potentialString, compiler));
+  Expect.equals(UNKNOWN, 
+                READABLE_ARRAY.union(BOOLEAN_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                READABLE_ARRAY.union(NUMBER_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                READABLE_ARRAY.union(INTEGER_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                READABLE_ARRAY.union(DOUBLE_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                READABLE_ARRAY.union(STRING_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                READABLE_ARRAY.union(NULL, compiler));
+  Expect.equals(READABLE_ARRAY, 
+                READABLE_ARRAY.union(FIXED_ARRAY, compiler));
 
-  Expect.equals(MUTABLE_ARRAY, MUTABLE_ARRAY.union(CONFLICTING));
-  Expect.equals(UNKNOWN, MUTABLE_ARRAY.union(UNKNOWN));
-  Expect.equals(UNKNOWN, MUTABLE_ARRAY.union(BOOLEAN));
-  Expect.equals(UNKNOWN, MUTABLE_ARRAY.union(NUMBER));
-  Expect.equals(UNKNOWN, MUTABLE_ARRAY.union(INTEGER));
-  Expect.equals(UNKNOWN, MUTABLE_ARRAY.union(DOUBLE));
-  Expect.equals(INDEXABLE_PRIMITIVE, MUTABLE_ARRAY.union(INDEXABLE_PRIMITIVE));
-  Expect.equals(INDEXABLE_PRIMITIVE, MUTABLE_ARRAY.union(STRING));
-  Expect.equals(READABLE_ARRAY, MUTABLE_ARRAY.union(READABLE_ARRAY));
-  Expect.equals(MUTABLE_ARRAY, MUTABLE_ARRAY.union(MUTABLE_ARRAY));
-  Expect.equals(MUTABLE_ARRAY, MUTABLE_ARRAY.union(EXTENDABLE_ARRAY));
-  Expect.equals(UNKNOWN, MUTABLE_ARRAY.union(NON_PRIMITIVE1));
-  Expect.equals(UNKNOWN, MUTABLE_ARRAY.union(NON_PRIMITIVE2));
-  Expect.equals(POTENTIAL_ARRAY,MUTABLE_ARRAY.union(POTENTIAL_ARRAY));
-  Expect.equals(UNKNOWN, MUTABLE_ARRAY.union(POTENTIAL_STRING));
-  Expect.equals(UNKNOWN, MUTABLE_ARRAY.union(BOOLEAN_OR_NULL));
-  Expect.equals(UNKNOWN, MUTABLE_ARRAY.union(NUMBER_OR_NULL));
-  Expect.equals(UNKNOWN, MUTABLE_ARRAY.union(INTEGER_OR_NULL));
-  Expect.equals(UNKNOWN, MUTABLE_ARRAY.union(DOUBLE_OR_NULL));
-  Expect.equals(UNKNOWN, MUTABLE_ARRAY.union(STRING_OR_NULL));
-  Expect.equals(UNKNOWN, MUTABLE_ARRAY.union(NULL));
-  Expect.equals(MUTABLE_ARRAY, MUTABLE_ARRAY.union(FIXED_ARRAY));
+  Expect.equals(MUTABLE_ARRAY, 
+                MUTABLE_ARRAY.union(CONFLICTING, compiler));
+  Expect.equals(UNKNOWN, 
+                MUTABLE_ARRAY.union(UNKNOWN, compiler));
+  Expect.equals(UNKNOWN, 
+                MUTABLE_ARRAY.union(BOOLEAN, compiler));
+  Expect.equals(UNKNOWN, 
+                MUTABLE_ARRAY.union(NUMBER, compiler));
+  Expect.equals(UNKNOWN, 
+                MUTABLE_ARRAY.union(INTEGER, compiler));
+  Expect.equals(UNKNOWN, 
+                MUTABLE_ARRAY.union(DOUBLE, compiler));
+  Expect.equals(INDEXABLE_PRIMITIVE, 
+                MUTABLE_ARRAY.union(INDEXABLE_PRIMITIVE, compiler));
+  Expect.equals(INDEXABLE_PRIMITIVE, 
+                MUTABLE_ARRAY.union(STRING, compiler));
+  Expect.equals(READABLE_ARRAY, 
+                MUTABLE_ARRAY.union(READABLE_ARRAY, compiler));
+  Expect.equals(MUTABLE_ARRAY, 
+                MUTABLE_ARRAY.union(MUTABLE_ARRAY, compiler));
+  Expect.equals(MUTABLE_ARRAY, 
+                MUTABLE_ARRAY.union(EXTENDABLE_ARRAY, compiler));
+  Expect.equals(UNKNOWN, 
+                MUTABLE_ARRAY.union(nonPrimitive1, compiler));
+  Expect.equals(UNKNOWN, 
+                MUTABLE_ARRAY.union(nonPrimitive2, compiler));
+  Expect.equals(potentialArray,MUTABLE_ARRAY.union(potentialArray, 
+                compiler));
+  Expect.equals(UNKNOWN, 
+                MUTABLE_ARRAY.union(potentialString, compiler));
+  Expect.equals(UNKNOWN, 
+                MUTABLE_ARRAY.union(BOOLEAN_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                MUTABLE_ARRAY.union(NUMBER_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                MUTABLE_ARRAY.union(INTEGER_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                MUTABLE_ARRAY.union(DOUBLE_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                MUTABLE_ARRAY.union(STRING_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                MUTABLE_ARRAY.union(NULL, compiler));
+  Expect.equals(MUTABLE_ARRAY, 
+                MUTABLE_ARRAY.union(FIXED_ARRAY, compiler));
 
-  Expect.equals(EXTENDABLE_ARRAY, EXTENDABLE_ARRAY.union(CONFLICTING));
-  Expect.equals(UNKNOWN, EXTENDABLE_ARRAY.union(UNKNOWN));
-  Expect.equals(UNKNOWN, EXTENDABLE_ARRAY.union(BOOLEAN));
-  Expect.equals(UNKNOWN, EXTENDABLE_ARRAY.union(NUMBER));
-  Expect.equals(UNKNOWN, EXTENDABLE_ARRAY.union(INTEGER));
-  Expect.equals(UNKNOWN, EXTENDABLE_ARRAY.union(DOUBLE));
-  Expect.equals(INDEXABLE_PRIMITIVE, EXTENDABLE_ARRAY.union(INDEXABLE_PRIMITIVE));
-  Expect.equals(INDEXABLE_PRIMITIVE, EXTENDABLE_ARRAY.union(STRING));
-  Expect.equals(READABLE_ARRAY, EXTENDABLE_ARRAY.union(READABLE_ARRAY));
-  Expect.equals(MUTABLE_ARRAY, EXTENDABLE_ARRAY.union(MUTABLE_ARRAY));
-  Expect.equals(EXTENDABLE_ARRAY, EXTENDABLE_ARRAY.union(EXTENDABLE_ARRAY));
-  Expect.equals(UNKNOWN, EXTENDABLE_ARRAY.union(NON_PRIMITIVE1));
-  Expect.equals(UNKNOWN, EXTENDABLE_ARRAY.union(NON_PRIMITIVE2));
-  Expect.equals(POTENTIAL_ARRAY, EXTENDABLE_ARRAY.union(POTENTIAL_ARRAY));
-  Expect.equals(UNKNOWN, EXTENDABLE_ARRAY.union(POTENTIAL_STRING));
-  Expect.equals(UNKNOWN, EXTENDABLE_ARRAY.union(BOOLEAN_OR_NULL));
-  Expect.equals(UNKNOWN, EXTENDABLE_ARRAY.union(NUMBER_OR_NULL));
-  Expect.equals(UNKNOWN, EXTENDABLE_ARRAY.union(INTEGER_OR_NULL));
-  Expect.equals(UNKNOWN, EXTENDABLE_ARRAY.union(DOUBLE_OR_NULL));
-  Expect.equals(UNKNOWN, EXTENDABLE_ARRAY.union(STRING_OR_NULL));
-  Expect.equals(UNKNOWN, EXTENDABLE_ARRAY.union(NULL));
-  Expect.equals(MUTABLE_ARRAY, EXTENDABLE_ARRAY.union(FIXED_ARRAY));
+  Expect.equals(EXTENDABLE_ARRAY, 
+                EXTENDABLE_ARRAY.union(CONFLICTING, compiler));
+  Expect.equals(UNKNOWN, 
+                EXTENDABLE_ARRAY.union(UNKNOWN, compiler));
+  Expect.equals(UNKNOWN, 
+                EXTENDABLE_ARRAY.union(BOOLEAN, compiler));
+  Expect.equals(UNKNOWN, 
+                EXTENDABLE_ARRAY.union(NUMBER, compiler));
+  Expect.equals(UNKNOWN, 
+                EXTENDABLE_ARRAY.union(INTEGER, compiler));
+  Expect.equals(UNKNOWN, 
+                EXTENDABLE_ARRAY.union(DOUBLE, compiler));
+  Expect.equals(INDEXABLE_PRIMITIVE, 
+                EXTENDABLE_ARRAY.union(INDEXABLE_PRIMITIVE, compiler));
+  Expect.equals(INDEXABLE_PRIMITIVE, 
+                EXTENDABLE_ARRAY.union(STRING, compiler));
+  Expect.equals(READABLE_ARRAY, 
+                EXTENDABLE_ARRAY.union(READABLE_ARRAY, compiler));
+  Expect.equals(MUTABLE_ARRAY, 
+                EXTENDABLE_ARRAY.union(MUTABLE_ARRAY, compiler));
+  Expect.equals(EXTENDABLE_ARRAY, 
+                EXTENDABLE_ARRAY.union(EXTENDABLE_ARRAY, compiler));
+  Expect.equals(UNKNOWN, 
+                EXTENDABLE_ARRAY.union(nonPrimitive1, compiler));
+  Expect.equals(UNKNOWN, 
+                EXTENDABLE_ARRAY.union(nonPrimitive2, compiler));
+  Expect.equals(potentialArray, 
+                EXTENDABLE_ARRAY.union(potentialArray, compiler));
+  Expect.equals(UNKNOWN, 
+                EXTENDABLE_ARRAY.union(potentialString, compiler));
+  Expect.equals(UNKNOWN, 
+                EXTENDABLE_ARRAY.union(BOOLEAN_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                EXTENDABLE_ARRAY.union(NUMBER_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                EXTENDABLE_ARRAY.union(INTEGER_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                EXTENDABLE_ARRAY.union(DOUBLE_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                EXTENDABLE_ARRAY.union(STRING_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                EXTENDABLE_ARRAY.union(NULL, compiler));
+  Expect.equals(MUTABLE_ARRAY, 
+                EXTENDABLE_ARRAY.union(FIXED_ARRAY, compiler));
 
-  Expect.equals(NON_PRIMITIVE1, NON_PRIMITIVE1.union(CONFLICTING));
-  Expect.equals(UNKNOWN, NON_PRIMITIVE1.union(UNKNOWN));
-  Expect.equals(UNKNOWN, NON_PRIMITIVE1.union(BOOLEAN));
-  Expect.equals(UNKNOWN, NON_PRIMITIVE1.union(NUMBER));
-  Expect.equals(UNKNOWN, NON_PRIMITIVE1.union(INTEGER));
-  Expect.equals(UNKNOWN, NON_PRIMITIVE1.union(DOUBLE));
-  Expect.equals(UNKNOWN, NON_PRIMITIVE1.union(INDEXABLE_PRIMITIVE));
-  Expect.equals(UNKNOWN, NON_PRIMITIVE1.union(STRING));
-  Expect.equals(UNKNOWN, NON_PRIMITIVE1.union(READABLE_ARRAY));
-  Expect.equals(UNKNOWN, NON_PRIMITIVE1.union(MUTABLE_ARRAY));
-  Expect.equals(UNKNOWN, NON_PRIMITIVE1.union(EXTENDABLE_ARRAY));
-  Expect.equals(NON_PRIMITIVE1, NON_PRIMITIVE1.union(NON_PRIMITIVE1));
-  Expect.equals(UNKNOWN, NON_PRIMITIVE1.union(NON_PRIMITIVE2));
-  Expect.equals(UNKNOWN, NON_PRIMITIVE1.union(POTENTIAL_ARRAY));
-  Expect.equals(UNKNOWN, NON_PRIMITIVE1.union(POTENTIAL_STRING));
-  Expect.equals(UNKNOWN, NON_PRIMITIVE1.union(BOOLEAN_OR_NULL));
-  Expect.equals(UNKNOWN, NON_PRIMITIVE1.union(NUMBER_OR_NULL));
-  Expect.equals(UNKNOWN, NON_PRIMITIVE1.union(INTEGER_OR_NULL));
-  Expect.equals(UNKNOWN, NON_PRIMITIVE1.union(DOUBLE_OR_NULL));
-  Expect.equals(UNKNOWN, NON_PRIMITIVE1.union(STRING_OR_NULL));
-  Expect.isTrue(NON_PRIMITIVE1.union(NULL) is HBoundedType);
-  Expect.equals(UNKNOWN, NON_PRIMITIVE1.union(FIXED_ARRAY));
+  Expect.equals(nonPrimitive1, 
+                nonPrimitive1.union(CONFLICTING, compiler));
+  Expect.equals(UNKNOWN, 
+                nonPrimitive1.union(UNKNOWN, compiler));
+  Expect.equals(UNKNOWN, 
+                nonPrimitive1.union(BOOLEAN, compiler));
+  Expect.equals(UNKNOWN, 
+                nonPrimitive1.union(NUMBER, compiler));
+  Expect.equals(UNKNOWN, 
+                nonPrimitive1.union(INTEGER, compiler));
+  Expect.equals(UNKNOWN, 
+                nonPrimitive1.union(DOUBLE, compiler));
+  Expect.equals(UNKNOWN, 
+                nonPrimitive1.union(INDEXABLE_PRIMITIVE, compiler));
+  Expect.equals(UNKNOWN, 
+                nonPrimitive1.union(STRING, compiler));
+  Expect.equals(UNKNOWN, 
+                nonPrimitive1.union(READABLE_ARRAY, compiler));
+  Expect.equals(UNKNOWN, 
+                nonPrimitive1.union(MUTABLE_ARRAY, compiler));
+  Expect.equals(UNKNOWN, 
+                nonPrimitive1.union(EXTENDABLE_ARRAY, compiler));
+  Expect.equals(nonPrimitive1, 
+                nonPrimitive1.union(nonPrimitive1, compiler));
+  Expect.equals(UNKNOWN, 
+                nonPrimitive1.union(nonPrimitive2, compiler));
+  Expect.equals(UNKNOWN, 
+                nonPrimitive1.union(potentialArray, compiler));
+  Expect.equals(UNKNOWN, 
+                nonPrimitive1.union(potentialString, compiler));
+  Expect.equals(UNKNOWN, 
+                nonPrimitive1.union(BOOLEAN_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                nonPrimitive1.union(NUMBER_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                nonPrimitive1.union(INTEGER_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                nonPrimitive1.union(DOUBLE_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                nonPrimitive1.union(STRING_OR_NULL, compiler));
+  Expect.isTrue(nonPrimitive1.union(NULL, compiler) is HBoundedType);
+  Expect.equals(UNKNOWN, 
+                nonPrimitive1.union(FIXED_ARRAY, compiler));
 
-  Expect.equals(NON_PRIMITIVE2, NON_PRIMITIVE2.union(CONFLICTING));
-  Expect.equals(UNKNOWN, NON_PRIMITIVE2.union(UNKNOWN));
-  Expect.equals(UNKNOWN, NON_PRIMITIVE2.union(BOOLEAN));
-  Expect.equals(UNKNOWN, NON_PRIMITIVE2.union(NUMBER));
-  Expect.equals(UNKNOWN, NON_PRIMITIVE2.union(INTEGER));
-  Expect.equals(UNKNOWN, NON_PRIMITIVE2.union(DOUBLE));
-  Expect.equals(UNKNOWN, NON_PRIMITIVE2.union(INDEXABLE_PRIMITIVE));
-  Expect.equals(UNKNOWN, NON_PRIMITIVE2.union(STRING));
-  Expect.equals(UNKNOWN, NON_PRIMITIVE2.union(READABLE_ARRAY));
-  Expect.equals(UNKNOWN, NON_PRIMITIVE2.union(MUTABLE_ARRAY));
-  Expect.equals(UNKNOWN, NON_PRIMITIVE2.union(EXTENDABLE_ARRAY));
-  Expect.equals(UNKNOWN, NON_PRIMITIVE2.union(NON_PRIMITIVE1));
-  Expect.equals(NON_PRIMITIVE2, NON_PRIMITIVE2.union(NON_PRIMITIVE2));
-  Expect.equals(UNKNOWN, NON_PRIMITIVE2.union(POTENTIAL_ARRAY));
-  Expect.equals(UNKNOWN, NON_PRIMITIVE2.union(POTENTIAL_STRING));
-  Expect.equals(UNKNOWN, NON_PRIMITIVE2.union(BOOLEAN_OR_NULL));
-  Expect.equals(UNKNOWN, NON_PRIMITIVE2.union(NUMBER_OR_NULL));
-  Expect.equals(UNKNOWN, NON_PRIMITIVE2.union(INTEGER_OR_NULL));
-  Expect.equals(UNKNOWN, NON_PRIMITIVE2.union(DOUBLE_OR_NULL));
-  Expect.equals(UNKNOWN, NON_PRIMITIVE2.union(STRING_OR_NULL));
-  Expect.isTrue(NON_PRIMITIVE2.union(NULL) is HBoundedType);
-  Expect.equals(UNKNOWN, NON_PRIMITIVE2.union(FIXED_ARRAY));
+  Expect.equals(nonPrimitive2, 
+                nonPrimitive2.union(CONFLICTING, compiler));
+  Expect.equals(UNKNOWN, 
+                nonPrimitive2.union(UNKNOWN, compiler));
+  Expect.equals(UNKNOWN, 
+                nonPrimitive2.union(BOOLEAN, compiler));
+  Expect.equals(UNKNOWN, 
+                nonPrimitive2.union(NUMBER, compiler));
+  Expect.equals(UNKNOWN, 
+                nonPrimitive2.union(INTEGER, compiler));
+  Expect.equals(UNKNOWN, 
+                nonPrimitive2.union(DOUBLE, compiler));
+  Expect.equals(UNKNOWN, 
+                nonPrimitive2.union(INDEXABLE_PRIMITIVE, compiler));
+  Expect.equals(UNKNOWN, 
+                nonPrimitive2.union(STRING, compiler));
+  Expect.equals(UNKNOWN, 
+                nonPrimitive2.union(READABLE_ARRAY, compiler));
+  Expect.equals(UNKNOWN, 
+                nonPrimitive2.union(MUTABLE_ARRAY, compiler));
+  Expect.equals(UNKNOWN, 
+                nonPrimitive2.union(EXTENDABLE_ARRAY, compiler));
+  Expect.equals(UNKNOWN, 
+                nonPrimitive2.union(nonPrimitive1, compiler));
+  Expect.equals(nonPrimitive2, 
+                nonPrimitive2.union(nonPrimitive2, compiler));
+  Expect.equals(UNKNOWN, 
+                nonPrimitive2.union(potentialArray, compiler));
+  Expect.equals(UNKNOWN, 
+                nonPrimitive2.union(potentialString, compiler));
+  Expect.equals(UNKNOWN, 
+                nonPrimitive2.union(BOOLEAN_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                nonPrimitive2.union(NUMBER_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                nonPrimitive2.union(INTEGER_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                nonPrimitive2.union(DOUBLE_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                nonPrimitive2.union(STRING_OR_NULL, compiler));
+  Expect.isTrue(nonPrimitive2.union(NULL, compiler) is HBoundedType);
+  Expect.equals(UNKNOWN, 
+                nonPrimitive2.union(FIXED_ARRAY, compiler));
 
-  Expect.equals(POTENTIAL_ARRAY, POTENTIAL_ARRAY.union(CONFLICTING));
-  Expect.equals(UNKNOWN, POTENTIAL_ARRAY.union(UNKNOWN));
-  Expect.equals(UNKNOWN, POTENTIAL_ARRAY.union(BOOLEAN));
-  Expect.equals(UNKNOWN, POTENTIAL_ARRAY.union(NUMBER));
-  Expect.equals(UNKNOWN, POTENTIAL_ARRAY.union(INTEGER));
-  Expect.equals(UNKNOWN, POTENTIAL_ARRAY.union(DOUBLE));
-  Expect.equals(UNKNOWN, POTENTIAL_ARRAY.union(INDEXABLE_PRIMITIVE));
-  Expect.equals(UNKNOWN, POTENTIAL_ARRAY.union(STRING));
-  Expect.equals(POTENTIAL_ARRAY, POTENTIAL_ARRAY.union(READABLE_ARRAY));
-  Expect.equals(POTENTIAL_ARRAY, POTENTIAL_ARRAY.union(MUTABLE_ARRAY));
-  Expect.equals(POTENTIAL_ARRAY, POTENTIAL_ARRAY.union(EXTENDABLE_ARRAY));
-  Expect.equals(UNKNOWN, POTENTIAL_ARRAY.union(NON_PRIMITIVE1));
-  Expect.equals(UNKNOWN, POTENTIAL_ARRAY.union(NON_PRIMITIVE2));
-  Expect.equals(POTENTIAL_ARRAY, POTENTIAL_ARRAY.union(POTENTIAL_ARRAY));
-  Expect.equals(UNKNOWN, POTENTIAL_ARRAY.union(POTENTIAL_STRING));
-  Expect.equals(UNKNOWN, POTENTIAL_ARRAY.union(BOOLEAN_OR_NULL));
-  Expect.equals(UNKNOWN, POTENTIAL_ARRAY.union(NUMBER_OR_NULL));
-  Expect.equals(UNKNOWN, POTENTIAL_ARRAY.union(INTEGER_OR_NULL));
-  Expect.equals(UNKNOWN, POTENTIAL_ARRAY.union(DOUBLE_OR_NULL));
-  Expect.equals(UNKNOWN, POTENTIAL_ARRAY.union(STRING_OR_NULL));
-  Expect.equals(POTENTIAL_ARRAY, POTENTIAL_ARRAY.union(NULL));
-  Expect.equals(POTENTIAL_ARRAY, POTENTIAL_ARRAY.union(FIXED_ARRAY));
+  Expect.equals(potentialArray, 
+                potentialArray.union(CONFLICTING, compiler));
+  Expect.equals(UNKNOWN, 
+                potentialArray.union(UNKNOWN, compiler));
+  Expect.equals(UNKNOWN, 
+                potentialArray.union(BOOLEAN, compiler));
+  Expect.equals(UNKNOWN, 
+                potentialArray.union(NUMBER, compiler));
+  Expect.equals(UNKNOWN, 
+                potentialArray.union(INTEGER, compiler));
+  Expect.equals(UNKNOWN, 
+                potentialArray.union(DOUBLE, compiler));
+  Expect.equals(UNKNOWN, 
+                potentialArray.union(INDEXABLE_PRIMITIVE, compiler));
+  Expect.equals(UNKNOWN, 
+                potentialArray.union(STRING, compiler));
+  Expect.equals(potentialArray, 
+                potentialArray.union(READABLE_ARRAY, compiler));
+  Expect.equals(potentialArray, 
+                potentialArray.union(MUTABLE_ARRAY, compiler));
+  Expect.equals(potentialArray, 
+                potentialArray.union(EXTENDABLE_ARRAY, compiler));
+  Expect.equals(UNKNOWN, 
+                potentialArray.union(nonPrimitive1, compiler));
+  Expect.equals(UNKNOWN, 
+                potentialArray.union(nonPrimitive2, compiler));
+  Expect.equals(potentialArray, 
+                potentialArray.union(potentialArray, compiler));
+  Expect.equals(UNKNOWN, 
+                potentialArray.union(potentialString, compiler));
+  Expect.equals(UNKNOWN, 
+                potentialArray.union(BOOLEAN_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                potentialArray.union(NUMBER_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                potentialArray.union(INTEGER_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                potentialArray.union(DOUBLE_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                potentialArray.union(STRING_OR_NULL, compiler));
+  Expect.equals(potentialArray, 
+                potentialArray.union(NULL, compiler));
+  Expect.equals(potentialArray, 
+                potentialArray.union(FIXED_ARRAY, compiler));
 
-  Expect.equals(POTENTIAL_STRING, POTENTIAL_STRING.union(CONFLICTING));
-  Expect.equals(UNKNOWN, POTENTIAL_STRING.union(UNKNOWN));
-  Expect.equals(UNKNOWN, POTENTIAL_STRING.union(BOOLEAN));
-  Expect.equals(UNKNOWN, POTENTIAL_STRING.union(NUMBER));
-  Expect.equals(UNKNOWN, POTENTIAL_STRING.union(INTEGER));
-  Expect.equals(UNKNOWN, POTENTIAL_STRING.union(DOUBLE));
-  Expect.equals(UNKNOWN, POTENTIAL_STRING.union(INDEXABLE_PRIMITIVE));
-  Expect.equals(POTENTIAL_STRING, POTENTIAL_STRING.union(STRING));
-  Expect.equals(UNKNOWN, POTENTIAL_STRING.union(READABLE_ARRAY));
-  Expect.equals(UNKNOWN, POTENTIAL_STRING.union(MUTABLE_ARRAY));
-  Expect.equals(UNKNOWN, POTENTIAL_STRING.union(EXTENDABLE_ARRAY));
-  Expect.equals(UNKNOWN, POTENTIAL_STRING.union(NON_PRIMITIVE1));
-  Expect.equals(UNKNOWN, POTENTIAL_STRING.union(NON_PRIMITIVE2));
-  Expect.equals(UNKNOWN, POTENTIAL_STRING.union(POTENTIAL_ARRAY));
-  Expect.equals(POTENTIAL_STRING, POTENTIAL_STRING.union(POTENTIAL_STRING));
-  Expect.equals(UNKNOWN, POTENTIAL_STRING.union(BOOLEAN_OR_NULL));
-  Expect.equals(UNKNOWN, POTENTIAL_STRING.union(NUMBER_OR_NULL));
-  Expect.equals(UNKNOWN, POTENTIAL_STRING.union(INTEGER_OR_NULL));
-  Expect.equals(UNKNOWN, POTENTIAL_STRING.union(DOUBLE_OR_NULL));
-  Expect.equals(POTENTIAL_STRING, POTENTIAL_STRING.union(STRING_OR_NULL));
-  Expect.equals(POTENTIAL_STRING, POTENTIAL_STRING.union(NULL));
-  Expect.equals(UNKNOWN, POTENTIAL_STRING.union(FIXED_ARRAY));
+  Expect.equals(potentialString, 
+                potentialString.union(CONFLICTING, compiler));
+  Expect.equals(UNKNOWN, 
+                potentialString.union(UNKNOWN, compiler));
+  Expect.equals(UNKNOWN, 
+                potentialString.union(BOOLEAN, compiler));
+  Expect.equals(UNKNOWN, 
+                potentialString.union(NUMBER, compiler));
+  Expect.equals(UNKNOWN, 
+                potentialString.union(INTEGER, compiler));
+  Expect.equals(UNKNOWN, 
+                potentialString.union(DOUBLE, compiler));
+  Expect.equals(UNKNOWN, 
+                potentialString.union(INDEXABLE_PRIMITIVE, compiler));
+  Expect.equals(potentialString, 
+                potentialString.union(STRING, compiler));
+  Expect.equals(UNKNOWN, 
+                potentialString.union(READABLE_ARRAY, compiler));
+  Expect.equals(UNKNOWN, 
+                potentialString.union(MUTABLE_ARRAY, compiler));
+  Expect.equals(UNKNOWN, 
+                potentialString.union(EXTENDABLE_ARRAY, compiler));
+  Expect.equals(UNKNOWN, 
+                potentialString.union(nonPrimitive1, compiler));
+  Expect.equals(UNKNOWN, 
+                potentialString.union(nonPrimitive2, compiler));
+  Expect.equals(UNKNOWN, 
+                potentialString.union(potentialArray, compiler));
+  Expect.equals(potentialString, 
+                potentialString.union(potentialString, compiler));
+  Expect.equals(UNKNOWN, 
+                potentialString.union(BOOLEAN_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                potentialString.union(NUMBER_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                potentialString.union(INTEGER_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                potentialString.union(DOUBLE_OR_NULL, compiler));
+  Expect.equals(potentialString, 
+                potentialString.union(STRING_OR_NULL, compiler));
+  Expect.equals(potentialString, 
+                potentialString.union(NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                potentialString.union(FIXED_ARRAY, compiler));
 
-  Expect.equals(BOOLEAN_OR_NULL, BOOLEAN_OR_NULL.union(CONFLICTING));
-  Expect.equals(UNKNOWN, BOOLEAN_OR_NULL.union(UNKNOWN));
-  Expect.equals(BOOLEAN_OR_NULL, BOOLEAN_OR_NULL.union(BOOLEAN));
-  Expect.equals(UNKNOWN, BOOLEAN_OR_NULL.union(NUMBER));
-  Expect.equals(UNKNOWN, BOOLEAN_OR_NULL.union(INTEGER));
-  Expect.equals(UNKNOWN, BOOLEAN_OR_NULL.union(DOUBLE));
-  Expect.equals(UNKNOWN, BOOLEAN_OR_NULL.union(INDEXABLE_PRIMITIVE));
-  Expect.equals(UNKNOWN, BOOLEAN_OR_NULL.union(STRING));
-  Expect.equals(UNKNOWN, BOOLEAN_OR_NULL.union(READABLE_ARRAY));
-  Expect.equals(UNKNOWN, BOOLEAN_OR_NULL.union(MUTABLE_ARRAY));
-  Expect.equals(UNKNOWN, BOOLEAN_OR_NULL.union(EXTENDABLE_ARRAY));
-  Expect.equals(UNKNOWN, BOOLEAN_OR_NULL.union(NON_PRIMITIVE1));
-  Expect.equals(UNKNOWN, BOOLEAN_OR_NULL.union(NON_PRIMITIVE2));
-  Expect.equals(UNKNOWN, BOOLEAN_OR_NULL.union(POTENTIAL_ARRAY));
-  Expect.equals(UNKNOWN, BOOLEAN_OR_NULL.union(POTENTIAL_STRING));
-  Expect.equals(BOOLEAN_OR_NULL, BOOLEAN_OR_NULL.union(BOOLEAN_OR_NULL));
-  Expect.equals(UNKNOWN, BOOLEAN_OR_NULL.union(NUMBER_OR_NULL));
-  Expect.equals(UNKNOWN, BOOLEAN_OR_NULL.union(INTEGER_OR_NULL));
-  Expect.equals(UNKNOWN, BOOLEAN_OR_NULL.union(DOUBLE_OR_NULL));
-  Expect.equals(UNKNOWN, BOOLEAN_OR_NULL.union(STRING_OR_NULL));
-  Expect.equals(BOOLEAN_OR_NULL, BOOLEAN_OR_NULL.union(NULL));
-  Expect.equals(UNKNOWN, BOOLEAN_OR_NULL.union(FIXED_ARRAY));
+  Expect.equals(BOOLEAN_OR_NULL, 
+                BOOLEAN_OR_NULL.union(CONFLICTING, compiler));
+  Expect.equals(UNKNOWN, 
+                BOOLEAN_OR_NULL.union(UNKNOWN, compiler));
+  Expect.equals(BOOLEAN_OR_NULL, 
+                BOOLEAN_OR_NULL.union(BOOLEAN, compiler));
+  Expect.equals(UNKNOWN, 
+                BOOLEAN_OR_NULL.union(NUMBER, compiler));
+  Expect.equals(UNKNOWN, 
+                BOOLEAN_OR_NULL.union(INTEGER, compiler));
+  Expect.equals(UNKNOWN, 
+                BOOLEAN_OR_NULL.union(DOUBLE, compiler));
+  Expect.equals(UNKNOWN, 
+                BOOLEAN_OR_NULL.union(INDEXABLE_PRIMITIVE, compiler));
+  Expect.equals(UNKNOWN, 
+                BOOLEAN_OR_NULL.union(STRING, compiler));
+  Expect.equals(UNKNOWN, 
+                BOOLEAN_OR_NULL.union(READABLE_ARRAY, compiler));
+  Expect.equals(UNKNOWN, 
+                BOOLEAN_OR_NULL.union(MUTABLE_ARRAY, compiler));
+  Expect.equals(UNKNOWN, 
+                BOOLEAN_OR_NULL.union(EXTENDABLE_ARRAY, compiler));
+  Expect.equals(UNKNOWN, 
+                BOOLEAN_OR_NULL.union(nonPrimitive1, compiler));
+  Expect.equals(UNKNOWN, 
+                BOOLEAN_OR_NULL.union(nonPrimitive2, compiler));
+  Expect.equals(UNKNOWN, 
+                BOOLEAN_OR_NULL.union(potentialArray, compiler));
+  Expect.equals(UNKNOWN, 
+                BOOLEAN_OR_NULL.union(potentialString, compiler));
+  Expect.equals(BOOLEAN_OR_NULL, 
+                BOOLEAN_OR_NULL.union(BOOLEAN_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                BOOLEAN_OR_NULL.union(NUMBER_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                BOOLEAN_OR_NULL.union(INTEGER_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                BOOLEAN_OR_NULL.union(DOUBLE_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                BOOLEAN_OR_NULL.union(STRING_OR_NULL, compiler));
+  Expect.equals(BOOLEAN_OR_NULL, 
+                BOOLEAN_OR_NULL.union(NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                BOOLEAN_OR_NULL.union(FIXED_ARRAY, compiler));
 
-  Expect.equals(NUMBER_OR_NULL, NUMBER_OR_NULL.union(CONFLICTING));
-  Expect.equals(UNKNOWN, NUMBER_OR_NULL.union(UNKNOWN));
-  Expect.equals(UNKNOWN, NUMBER_OR_NULL.union(BOOLEAN));
-  Expect.equals(NUMBER_OR_NULL, NUMBER_OR_NULL.union(NUMBER));
-  Expect.equals(NUMBER_OR_NULL, NUMBER_OR_NULL.union(INTEGER));
-  Expect.equals(NUMBER_OR_NULL, NUMBER_OR_NULL.union(DOUBLE));
-  Expect.equals(UNKNOWN, NUMBER_OR_NULL.union(INDEXABLE_PRIMITIVE));
-  Expect.equals(UNKNOWN, NUMBER_OR_NULL.union(STRING));
-  Expect.equals(UNKNOWN, NUMBER_OR_NULL.union(READABLE_ARRAY));
-  Expect.equals(UNKNOWN, NUMBER_OR_NULL.union(MUTABLE_ARRAY));
-  Expect.equals(UNKNOWN, NUMBER_OR_NULL.union(EXTENDABLE_ARRAY));
-  Expect.equals(UNKNOWN, NUMBER_OR_NULL.union(NON_PRIMITIVE1));
-  Expect.equals(UNKNOWN, NUMBER_OR_NULL.union(NON_PRIMITIVE2));
-  Expect.equals(UNKNOWN, NUMBER_OR_NULL.union(POTENTIAL_ARRAY));
-  Expect.equals(UNKNOWN, NUMBER_OR_NULL.union(POTENTIAL_STRING));
-  Expect.equals(UNKNOWN, NUMBER_OR_NULL.union(BOOLEAN_OR_NULL));
-  Expect.equals(NUMBER_OR_NULL, NUMBER_OR_NULL.union(NUMBER_OR_NULL));
-  Expect.equals(NUMBER_OR_NULL, NUMBER_OR_NULL.union(INTEGER_OR_NULL));
-  Expect.equals(NUMBER_OR_NULL, NUMBER_OR_NULL.union(DOUBLE_OR_NULL));
-  Expect.equals(UNKNOWN, NUMBER_OR_NULL.union(STRING_OR_NULL));
-  Expect.equals(NUMBER_OR_NULL, NUMBER_OR_NULL.union(NULL));
-  Expect.equals(UNKNOWN, NUMBER_OR_NULL.union(FIXED_ARRAY));
+  Expect.equals(NUMBER_OR_NULL, 
+                NUMBER_OR_NULL.union(CONFLICTING, compiler));
+  Expect.equals(UNKNOWN, 
+                NUMBER_OR_NULL.union(UNKNOWN, compiler));
+  Expect.equals(UNKNOWN, 
+                NUMBER_OR_NULL.union(BOOLEAN, compiler));
+  Expect.equals(NUMBER_OR_NULL, 
+                NUMBER_OR_NULL.union(NUMBER, compiler));
+  Expect.equals(NUMBER_OR_NULL, 
+                NUMBER_OR_NULL.union(INTEGER, compiler));
+  Expect.equals(NUMBER_OR_NULL, 
+                NUMBER_OR_NULL.union(DOUBLE, compiler));
+  Expect.equals(UNKNOWN, 
+                NUMBER_OR_NULL.union(INDEXABLE_PRIMITIVE, compiler));
+  Expect.equals(UNKNOWN, 
+                NUMBER_OR_NULL.union(STRING, compiler));
+  Expect.equals(UNKNOWN, 
+                NUMBER_OR_NULL.union(READABLE_ARRAY, compiler));
+  Expect.equals(UNKNOWN, 
+                NUMBER_OR_NULL.union(MUTABLE_ARRAY, compiler));
+  Expect.equals(UNKNOWN, 
+                NUMBER_OR_NULL.union(EXTENDABLE_ARRAY, compiler));
+  Expect.equals(UNKNOWN, 
+                NUMBER_OR_NULL.union(nonPrimitive1, compiler));
+  Expect.equals(UNKNOWN, 
+                NUMBER_OR_NULL.union(nonPrimitive2, compiler));
+  Expect.equals(UNKNOWN, 
+                NUMBER_OR_NULL.union(potentialArray, compiler));
+  Expect.equals(UNKNOWN, 
+                NUMBER_OR_NULL.union(potentialString, compiler));
+  Expect.equals(UNKNOWN, 
+                NUMBER_OR_NULL.union(BOOLEAN_OR_NULL, compiler));
+  Expect.equals(NUMBER_OR_NULL, 
+                NUMBER_OR_NULL.union(NUMBER_OR_NULL, compiler));
+  Expect.equals(NUMBER_OR_NULL, 
+                NUMBER_OR_NULL.union(INTEGER_OR_NULL, compiler));
+  Expect.equals(NUMBER_OR_NULL, 
+                NUMBER_OR_NULL.union(DOUBLE_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                NUMBER_OR_NULL.union(STRING_OR_NULL, compiler));
+  Expect.equals(NUMBER_OR_NULL, 
+                NUMBER_OR_NULL.union(NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                NUMBER_OR_NULL.union(FIXED_ARRAY, compiler));
 
-  Expect.equals(INTEGER_OR_NULL, INTEGER_OR_NULL.union(CONFLICTING));
-  Expect.equals(UNKNOWN, INTEGER_OR_NULL.union(UNKNOWN));
-  Expect.equals(UNKNOWN, INTEGER_OR_NULL.union(BOOLEAN));
-  Expect.equals(NUMBER_OR_NULL, INTEGER_OR_NULL.union(NUMBER));
-  Expect.equals(INTEGER_OR_NULL, INTEGER_OR_NULL.union(INTEGER));
-  Expect.equals(NUMBER_OR_NULL, INTEGER_OR_NULL.union(DOUBLE));
-  Expect.equals(UNKNOWN, INTEGER_OR_NULL.union(INDEXABLE_PRIMITIVE));
-  Expect.equals(UNKNOWN, INTEGER_OR_NULL.union(STRING));
-  Expect.equals(UNKNOWN, INTEGER_OR_NULL.union(READABLE_ARRAY));
-  Expect.equals(UNKNOWN, INTEGER_OR_NULL.union(MUTABLE_ARRAY));
-  Expect.equals(UNKNOWN, INTEGER_OR_NULL.union(EXTENDABLE_ARRAY));
-  Expect.equals(UNKNOWN, INTEGER_OR_NULL.union(NON_PRIMITIVE1));
-  Expect.equals(UNKNOWN, INTEGER_OR_NULL.union(NON_PRIMITIVE2));
-  Expect.equals(UNKNOWN, INTEGER_OR_NULL.union(POTENTIAL_ARRAY));
-  Expect.equals(UNKNOWN, INTEGER_OR_NULL.union(POTENTIAL_STRING));
-  Expect.equals(UNKNOWN, INTEGER_OR_NULL.union(BOOLEAN_OR_NULL));
-  Expect.equals(NUMBER_OR_NULL, INTEGER_OR_NULL.union(NUMBER_OR_NULL));
-  Expect.equals(INTEGER_OR_NULL, INTEGER_OR_NULL.union(INTEGER_OR_NULL));
-  Expect.equals(NUMBER_OR_NULL, INTEGER_OR_NULL.union(DOUBLE_OR_NULL));
-  Expect.equals(UNKNOWN, INTEGER_OR_NULL.union(STRING_OR_NULL));
-  Expect.equals(INTEGER_OR_NULL, INTEGER_OR_NULL.union(NULL));
-  Expect.equals(UNKNOWN, INTEGER_OR_NULL.union(FIXED_ARRAY));
+  Expect.equals(INTEGER_OR_NULL, 
+                INTEGER_OR_NULL.union(CONFLICTING, compiler));
+  Expect.equals(UNKNOWN, 
+                INTEGER_OR_NULL.union(UNKNOWN, compiler));
+  Expect.equals(UNKNOWN, 
+                INTEGER_OR_NULL.union(BOOLEAN, compiler));
+  Expect.equals(NUMBER_OR_NULL, 
+                INTEGER_OR_NULL.union(NUMBER, compiler));
+  Expect.equals(INTEGER_OR_NULL, 
+                INTEGER_OR_NULL.union(INTEGER, compiler));
+  Expect.equals(NUMBER_OR_NULL, 
+                INTEGER_OR_NULL.union(DOUBLE, compiler));
+  Expect.equals(UNKNOWN, 
+                INTEGER_OR_NULL.union(INDEXABLE_PRIMITIVE, compiler));
+  Expect.equals(UNKNOWN, 
+                INTEGER_OR_NULL.union(STRING, compiler));
+  Expect.equals(UNKNOWN, 
+                INTEGER_OR_NULL.union(READABLE_ARRAY, compiler));
+  Expect.equals(UNKNOWN, 
+                INTEGER_OR_NULL.union(MUTABLE_ARRAY, compiler));
+  Expect.equals(UNKNOWN, 
+                INTEGER_OR_NULL.union(EXTENDABLE_ARRAY, compiler));
+  Expect.equals(UNKNOWN, 
+                INTEGER_OR_NULL.union(nonPrimitive1, compiler));
+  Expect.equals(UNKNOWN, 
+                INTEGER_OR_NULL.union(nonPrimitive2, compiler));
+  Expect.equals(UNKNOWN, 
+                INTEGER_OR_NULL.union(potentialArray, compiler));
+  Expect.equals(UNKNOWN, 
+                INTEGER_OR_NULL.union(potentialString, compiler));
+  Expect.equals(UNKNOWN, 
+                INTEGER_OR_NULL.union(BOOLEAN_OR_NULL, compiler));
+  Expect.equals(NUMBER_OR_NULL, 
+                INTEGER_OR_NULL.union(NUMBER_OR_NULL, compiler));
+  Expect.equals(INTEGER_OR_NULL, 
+                INTEGER_OR_NULL.union(INTEGER_OR_NULL, compiler));
+  Expect.equals(NUMBER_OR_NULL, 
+                INTEGER_OR_NULL.union(DOUBLE_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                INTEGER_OR_NULL.union(STRING_OR_NULL, compiler));
+  Expect.equals(INTEGER_OR_NULL, 
+                INTEGER_OR_NULL.union(NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                INTEGER_OR_NULL.union(FIXED_ARRAY, compiler));
 
-  Expect.equals(DOUBLE_OR_NULL, DOUBLE_OR_NULL.union(CONFLICTING));
-  Expect.equals(UNKNOWN, DOUBLE_OR_NULL.union(UNKNOWN));
-  Expect.equals(UNKNOWN, DOUBLE_OR_NULL.union(BOOLEAN));
-  Expect.equals(NUMBER_OR_NULL, DOUBLE_OR_NULL.union(NUMBER));
-  Expect.equals(NUMBER_OR_NULL, DOUBLE_OR_NULL.union(INTEGER));
-  Expect.equals(DOUBLE_OR_NULL, DOUBLE_OR_NULL.union(DOUBLE));
-  Expect.equals(UNKNOWN, DOUBLE_OR_NULL.union(INDEXABLE_PRIMITIVE));
-  Expect.equals(UNKNOWN, DOUBLE_OR_NULL.union(STRING));
-  Expect.equals(UNKNOWN, DOUBLE_OR_NULL.union(READABLE_ARRAY));
-  Expect.equals(UNKNOWN, DOUBLE_OR_NULL.union(MUTABLE_ARRAY));
-  Expect.equals(UNKNOWN, DOUBLE_OR_NULL.union(EXTENDABLE_ARRAY));
-  Expect.equals(UNKNOWN, DOUBLE_OR_NULL.union(NON_PRIMITIVE1));
-  Expect.equals(UNKNOWN, DOUBLE_OR_NULL.union(NON_PRIMITIVE2));
-  Expect.equals(UNKNOWN, DOUBLE_OR_NULL.union(POTENTIAL_ARRAY));
-  Expect.equals(UNKNOWN, DOUBLE_OR_NULL.union(POTENTIAL_STRING));
-  Expect.equals(UNKNOWN, DOUBLE_OR_NULL.union(BOOLEAN_OR_NULL));
-  Expect.equals(NUMBER_OR_NULL, DOUBLE_OR_NULL.union(NUMBER_OR_NULL));
-  Expect.equals(NUMBER_OR_NULL, DOUBLE_OR_NULL.union(INTEGER_OR_NULL));
-  Expect.equals(DOUBLE_OR_NULL, DOUBLE_OR_NULL.union(DOUBLE_OR_NULL));
-  Expect.equals(UNKNOWN, DOUBLE_OR_NULL.union(STRING_OR_NULL));
-  Expect.equals(DOUBLE_OR_NULL, DOUBLE_OR_NULL.union(NULL));
-  Expect.equals(UNKNOWN, DOUBLE_OR_NULL.union(FIXED_ARRAY));
+  Expect.equals(DOUBLE_OR_NULL, 
+                DOUBLE_OR_NULL.union(CONFLICTING, compiler));
+  Expect.equals(UNKNOWN, 
+                DOUBLE_OR_NULL.union(UNKNOWN, compiler));
+  Expect.equals(UNKNOWN, 
+                DOUBLE_OR_NULL.union(BOOLEAN, compiler));
+  Expect.equals(NUMBER_OR_NULL, 
+                DOUBLE_OR_NULL.union(NUMBER, compiler));
+  Expect.equals(NUMBER_OR_NULL, 
+                DOUBLE_OR_NULL.union(INTEGER, compiler));
+  Expect.equals(DOUBLE_OR_NULL, 
+                DOUBLE_OR_NULL.union(DOUBLE, compiler));
+  Expect.equals(UNKNOWN, 
+                DOUBLE_OR_NULL.union(INDEXABLE_PRIMITIVE, compiler));
+  Expect.equals(UNKNOWN, 
+                DOUBLE_OR_NULL.union(STRING, compiler));
+  Expect.equals(UNKNOWN, 
+                DOUBLE_OR_NULL.union(READABLE_ARRAY, compiler));
+  Expect.equals(UNKNOWN, 
+                DOUBLE_OR_NULL.union(MUTABLE_ARRAY, compiler));
+  Expect.equals(UNKNOWN, 
+                DOUBLE_OR_NULL.union(EXTENDABLE_ARRAY, compiler));
+  Expect.equals(UNKNOWN, 
+                DOUBLE_OR_NULL.union(nonPrimitive1, compiler));
+  Expect.equals(UNKNOWN, 
+                DOUBLE_OR_NULL.union(nonPrimitive2, compiler));
+  Expect.equals(UNKNOWN, 
+                DOUBLE_OR_NULL.union(potentialArray, compiler));
+  Expect.equals(UNKNOWN, 
+                DOUBLE_OR_NULL.union(potentialString, compiler));
+  Expect.equals(UNKNOWN, 
+                DOUBLE_OR_NULL.union(BOOLEAN_OR_NULL, compiler));
+  Expect.equals(NUMBER_OR_NULL, 
+                DOUBLE_OR_NULL.union(NUMBER_OR_NULL, compiler));
+  Expect.equals(NUMBER_OR_NULL, 
+                DOUBLE_OR_NULL.union(INTEGER_OR_NULL, compiler));
+  Expect.equals(DOUBLE_OR_NULL, 
+                DOUBLE_OR_NULL.union(DOUBLE_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                DOUBLE_OR_NULL.union(STRING_OR_NULL, compiler));
+  Expect.equals(DOUBLE_OR_NULL, 
+                DOUBLE_OR_NULL.union(NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                DOUBLE_OR_NULL.union(FIXED_ARRAY, compiler));
 
-  Expect.equals(STRING_OR_NULL, STRING_OR_NULL.union(CONFLICTING));
-  Expect.equals(UNKNOWN, STRING_OR_NULL.union(UNKNOWN));
-  Expect.equals(UNKNOWN, STRING_OR_NULL.union(BOOLEAN));
-  Expect.equals(UNKNOWN, STRING_OR_NULL.union(NUMBER));
-  Expect.equals(UNKNOWN, STRING_OR_NULL.union(INTEGER));
-  Expect.equals(UNKNOWN, STRING_OR_NULL.union(DOUBLE));
-  Expect.equals(UNKNOWN, STRING_OR_NULL.union(INDEXABLE_PRIMITIVE));
-  Expect.equals(STRING_OR_NULL, STRING_OR_NULL.union(STRING));
-  Expect.equals(UNKNOWN, STRING_OR_NULL.union(READABLE_ARRAY));
-  Expect.equals(UNKNOWN, STRING_OR_NULL.union(MUTABLE_ARRAY));
-  Expect.equals(UNKNOWN, STRING_OR_NULL.union(EXTENDABLE_ARRAY));
-  Expect.equals(UNKNOWN, STRING_OR_NULL.union(NON_PRIMITIVE1));
-  Expect.equals(UNKNOWN, STRING_OR_NULL.union(NON_PRIMITIVE2));
-  Expect.equals(UNKNOWN, STRING_OR_NULL.union(POTENTIAL_ARRAY));
-  Expect.equals(POTENTIAL_STRING, STRING_OR_NULL.union(POTENTIAL_STRING));
-  Expect.equals(UNKNOWN, STRING_OR_NULL.union(BOOLEAN_OR_NULL));
-  Expect.equals(UNKNOWN, STRING_OR_NULL.union(NUMBER_OR_NULL));
-  Expect.equals(UNKNOWN, STRING_OR_NULL.union(INTEGER_OR_NULL));
-  Expect.equals(UNKNOWN, STRING_OR_NULL.union(DOUBLE_OR_NULL));
-  Expect.equals(STRING_OR_NULL, STRING_OR_NULL.union(STRING_OR_NULL));
-  Expect.equals(STRING_OR_NULL, STRING_OR_NULL.union(NULL));
-  Expect.equals(UNKNOWN, STRING_OR_NULL.union(FIXED_ARRAY));
+  Expect.equals(STRING_OR_NULL, 
+                STRING_OR_NULL.union(CONFLICTING, compiler));
+  Expect.equals(UNKNOWN, 
+                STRING_OR_NULL.union(UNKNOWN, compiler));
+  Expect.equals(UNKNOWN, 
+                STRING_OR_NULL.union(BOOLEAN, compiler));
+  Expect.equals(UNKNOWN, 
+                STRING_OR_NULL.union(NUMBER, compiler));
+  Expect.equals(UNKNOWN, 
+                STRING_OR_NULL.union(INTEGER, compiler));
+  Expect.equals(UNKNOWN, 
+                STRING_OR_NULL.union(DOUBLE, compiler));
+  Expect.equals(UNKNOWN, 
+                STRING_OR_NULL.union(INDEXABLE_PRIMITIVE, compiler));
+  Expect.equals(STRING_OR_NULL, 
+                STRING_OR_NULL.union(STRING, compiler));
+  Expect.equals(UNKNOWN, 
+                STRING_OR_NULL.union(READABLE_ARRAY, compiler));
+  Expect.equals(UNKNOWN, 
+                STRING_OR_NULL.union(MUTABLE_ARRAY, compiler));
+  Expect.equals(UNKNOWN, 
+                STRING_OR_NULL.union(EXTENDABLE_ARRAY, compiler));
+  Expect.equals(UNKNOWN, 
+                STRING_OR_NULL.union(nonPrimitive1, compiler));
+  Expect.equals(UNKNOWN, 
+                STRING_OR_NULL.union(nonPrimitive2, compiler));
+  Expect.equals(UNKNOWN, 
+                STRING_OR_NULL.union(potentialArray, compiler));
+  Expect.equals(potentialString, 
+                STRING_OR_NULL.union(potentialString, compiler));
+  Expect.equals(UNKNOWN, 
+                STRING_OR_NULL.union(BOOLEAN_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                STRING_OR_NULL.union(NUMBER_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                STRING_OR_NULL.union(INTEGER_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                STRING_OR_NULL.union(DOUBLE_OR_NULL, compiler));
+  Expect.equals(STRING_OR_NULL, 
+                STRING_OR_NULL.union(STRING_OR_NULL, compiler));
+  Expect.equals(STRING_OR_NULL, 
+                STRING_OR_NULL.union(NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                STRING_OR_NULL.union(FIXED_ARRAY, compiler));
 
-  Expect.equals(NULL, NULL.union(CONFLICTING));
-  Expect.equals(UNKNOWN, NULL.union(UNKNOWN));
-  Expect.equals(BOOLEAN_OR_NULL, NULL.union(BOOLEAN));
-  Expect.equals(NUMBER_OR_NULL, NULL.union(NUMBER));
-  Expect.equals(INTEGER_OR_NULL, NULL.union(INTEGER));
-  Expect.equals(DOUBLE_OR_NULL, NULL.union(DOUBLE));
-  Expect.equals(UNKNOWN, NULL.union(INDEXABLE_PRIMITIVE));
-  Expect.equals(STRING_OR_NULL, NULL.union(STRING));
-  Expect.equals(UNKNOWN, NULL.union(READABLE_ARRAY));
-  Expect.equals(UNKNOWN, NULL.union(MUTABLE_ARRAY));
-  Expect.equals(UNKNOWN, NULL.union(EXTENDABLE_ARRAY));
-  Expect.equals(UNKNOWN, NULL.union(NON_PRIMITIVE1));
-  Expect.equals(UNKNOWN, NULL.union(NON_PRIMITIVE2));
-  Expect.equals(POTENTIAL_ARRAY, NULL.union(POTENTIAL_ARRAY));
-  Expect.equals(POTENTIAL_STRING, NULL.union(POTENTIAL_STRING));
-  Expect.equals(BOOLEAN_OR_NULL, NULL.union(BOOLEAN_OR_NULL));
-  Expect.equals(NUMBER_OR_NULL, NULL.union(NUMBER_OR_NULL));
-  Expect.equals(INTEGER_OR_NULL, NULL.union(INTEGER_OR_NULL));
-  Expect.equals(DOUBLE_OR_NULL, NULL.union(DOUBLE_OR_NULL));
-  Expect.equals(STRING_OR_NULL, NULL.union(STRING_OR_NULL));
-  Expect.equals(NULL, NULL.union(NULL));
-  Expect.equals(UNKNOWN, NULL.union(FIXED_ARRAY));
+  Expect.equals(NULL, 
+                NULL.union(CONFLICTING, compiler));
+  Expect.equals(UNKNOWN, 
+                NULL.union(UNKNOWN, compiler));
+  Expect.equals(BOOLEAN_OR_NULL, 
+                NULL.union(BOOLEAN, compiler));
+  Expect.equals(NUMBER_OR_NULL, 
+                NULL.union(NUMBER, compiler));
+  Expect.equals(INTEGER_OR_NULL, 
+                NULL.union(INTEGER, compiler));
+  Expect.equals(DOUBLE_OR_NULL, 
+                NULL.union(DOUBLE, compiler));
+  Expect.equals(UNKNOWN, 
+                NULL.union(INDEXABLE_PRIMITIVE, compiler));
+  Expect.equals(STRING_OR_NULL, 
+                NULL.union(STRING, compiler));
+  Expect.equals(UNKNOWN, 
+                NULL.union(READABLE_ARRAY, compiler));
+  Expect.equals(UNKNOWN, 
+                NULL.union(MUTABLE_ARRAY, compiler));
+  Expect.equals(UNKNOWN, 
+                NULL.union(EXTENDABLE_ARRAY, compiler));
+  Expect.equals(UNKNOWN, 
+                NULL.union(nonPrimitive1, compiler));
+  Expect.equals(UNKNOWN, 
+                NULL.union(nonPrimitive2, compiler));
+  Expect.equals(potentialArray, 
+                NULL.union(potentialArray, compiler));
+  Expect.equals(potentialString, 
+                NULL.union(potentialString, compiler));
+  Expect.equals(BOOLEAN_OR_NULL, 
+                NULL.union(BOOLEAN_OR_NULL, compiler));
+  Expect.equals(NUMBER_OR_NULL, 
+                NULL.union(NUMBER_OR_NULL, compiler));
+  Expect.equals(INTEGER_OR_NULL, 
+                NULL.union(INTEGER_OR_NULL, compiler));
+  Expect.equals(DOUBLE_OR_NULL, 
+                NULL.union(DOUBLE_OR_NULL, compiler));
+  Expect.equals(STRING_OR_NULL, 
+                NULL.union(STRING_OR_NULL, compiler));
+  Expect.equals(NULL, 
+                NULL.union(NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                NULL.union(FIXED_ARRAY, compiler));
 
-  Expect.equals(FIXED_ARRAY, FIXED_ARRAY.union(CONFLICTING));
-  Expect.equals(UNKNOWN, FIXED_ARRAY.union(UNKNOWN));
-  Expect.equals(UNKNOWN, FIXED_ARRAY.union(BOOLEAN));
-  Expect.equals(UNKNOWN, FIXED_ARRAY.union(NUMBER));
-  Expect.equals(UNKNOWN, FIXED_ARRAY.union(INTEGER));
-  Expect.equals(UNKNOWN, FIXED_ARRAY.union(DOUBLE));
-  Expect.equals(INDEXABLE_PRIMITIVE, FIXED_ARRAY.union(INDEXABLE_PRIMITIVE));
-  Expect.equals(INDEXABLE_PRIMITIVE, FIXED_ARRAY.union(STRING));
-  Expect.equals(READABLE_ARRAY, FIXED_ARRAY.union(READABLE_ARRAY));
-  Expect.equals(MUTABLE_ARRAY, FIXED_ARRAY.union(MUTABLE_ARRAY));
-  Expect.equals(MUTABLE_ARRAY, FIXED_ARRAY.union(EXTENDABLE_ARRAY));
-  Expect.equals(UNKNOWN, FIXED_ARRAY.union(NON_PRIMITIVE1));
-  Expect.equals(UNKNOWN, FIXED_ARRAY.union(NON_PRIMITIVE2));
-  Expect.equals(POTENTIAL_ARRAY, FIXED_ARRAY.union(POTENTIAL_ARRAY));
-  Expect.equals(UNKNOWN, FIXED_ARRAY.union(POTENTIAL_STRING));
-  Expect.equals(UNKNOWN, FIXED_ARRAY.union(BOOLEAN_OR_NULL));
-  Expect.equals(UNKNOWN, FIXED_ARRAY.union(NUMBER_OR_NULL));
-  Expect.equals(UNKNOWN, FIXED_ARRAY.union(INTEGER_OR_NULL));
-  Expect.equals(UNKNOWN, FIXED_ARRAY.union(DOUBLE_OR_NULL));
-  Expect.equals(UNKNOWN, FIXED_ARRAY.union(STRING_OR_NULL));
-  Expect.equals(UNKNOWN, FIXED_ARRAY.union(NULL));
-  Expect.equals(FIXED_ARRAY, FIXED_ARRAY.union(FIXED_ARRAY));
+  Expect.equals(FIXED_ARRAY, 
+                FIXED_ARRAY.union(CONFLICTING, compiler));
+  Expect.equals(UNKNOWN, 
+                FIXED_ARRAY.union(UNKNOWN, compiler));
+  Expect.equals(UNKNOWN, 
+                FIXED_ARRAY.union(BOOLEAN, compiler));
+  Expect.equals(UNKNOWN, 
+                FIXED_ARRAY.union(NUMBER, compiler));
+  Expect.equals(UNKNOWN, 
+                FIXED_ARRAY.union(INTEGER, compiler));
+  Expect.equals(UNKNOWN, 
+                FIXED_ARRAY.union(DOUBLE, compiler));
+  Expect.equals(INDEXABLE_PRIMITIVE, 
+                FIXED_ARRAY.union(INDEXABLE_PRIMITIVE, compiler));
+  Expect.equals(INDEXABLE_PRIMITIVE, 
+                FIXED_ARRAY.union(STRING, compiler));
+  Expect.equals(READABLE_ARRAY, 
+                FIXED_ARRAY.union(READABLE_ARRAY, compiler));
+  Expect.equals(MUTABLE_ARRAY, 
+                FIXED_ARRAY.union(MUTABLE_ARRAY, compiler));
+  Expect.equals(MUTABLE_ARRAY, 
+                FIXED_ARRAY.union(EXTENDABLE_ARRAY, compiler));
+  Expect.equals(UNKNOWN, 
+                FIXED_ARRAY.union(nonPrimitive1, compiler));
+  Expect.equals(UNKNOWN, 
+                FIXED_ARRAY.union(nonPrimitive2, compiler));
+  Expect.equals(potentialArray, 
+                FIXED_ARRAY.union(potentialArray, compiler));
+  Expect.equals(UNKNOWN, 
+                FIXED_ARRAY.union(potentialString, compiler));
+  Expect.equals(UNKNOWN, 
+                FIXED_ARRAY.union(BOOLEAN_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                FIXED_ARRAY.union(NUMBER_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                FIXED_ARRAY.union(INTEGER_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                FIXED_ARRAY.union(DOUBLE_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                FIXED_ARRAY.union(STRING_OR_NULL, compiler));
+  Expect.equals(UNKNOWN, 
+                FIXED_ARRAY.union(NULL, compiler));
+  Expect.equals(FIXED_ARRAY, 
+                FIXED_ARRAY.union(FIXED_ARRAY, compiler));
 }
 
-void testIntersection() {
-  Expect.equals(CONFLICTING, CONFLICTING.intersection(CONFLICTING));
-  Expect.equals(CONFLICTING, CONFLICTING.intersection(UNKNOWN));
-  Expect.equals(CONFLICTING, CONFLICTING.intersection(BOOLEAN));
-  Expect.equals(CONFLICTING, CONFLICTING.intersection(NUMBER));
-  Expect.equals(CONFLICTING, CONFLICTING.intersection(INTEGER));
-  Expect.equals(CONFLICTING, CONFLICTING.intersection(DOUBLE));
-  Expect.equals(CONFLICTING, CONFLICTING.intersection(INDEXABLE_PRIMITIVE));
-  Expect.equals(CONFLICTING, CONFLICTING.intersection(STRING));
-  Expect.equals(CONFLICTING, CONFLICTING.intersection(READABLE_ARRAY));
-  Expect.equals(CONFLICTING, CONFLICTING.intersection(MUTABLE_ARRAY));
-  Expect.equals(CONFLICTING, CONFLICTING.intersection(EXTENDABLE_ARRAY));
-  Expect.equals(CONFLICTING, CONFLICTING.intersection(NON_PRIMITIVE1));
-  Expect.equals(CONFLICTING, CONFLICTING.intersection(NON_PRIMITIVE2));
-  Expect.equals(CONFLICTING, CONFLICTING.intersection(POTENTIAL_ARRAY));
-  Expect.equals(CONFLICTING, CONFLICTING.intersection(POTENTIAL_STRING));
-  Expect.equals(CONFLICTING, CONFLICTING.intersection(BOOLEAN_OR_NULL));
-  Expect.equals(CONFLICTING, CONFLICTING.intersection(NUMBER_OR_NULL));
-  Expect.equals(CONFLICTING, CONFLICTING.intersection(INTEGER_OR_NULL));
-  Expect.equals(CONFLICTING, CONFLICTING.intersection(DOUBLE_OR_NULL));
-  Expect.equals(CONFLICTING, CONFLICTING.intersection(STRING_OR_NULL));
-  Expect.equals(CONFLICTING, CONFLICTING.intersection(NULL));
-  Expect.equals(CONFLICTING, CONFLICTING.intersection(FIXED_ARRAY));
+void testIntersection(MockCompiler compiler) {
+  Expect.equals(CONFLICTING, 
+                CONFLICTING.intersection(CONFLICTING, compiler));
+  Expect.equals(CONFLICTING, 
+                CONFLICTING.intersection(UNKNOWN, compiler));
+  Expect.equals(CONFLICTING, 
+                CONFLICTING.intersection(BOOLEAN, compiler));
+  Expect.equals(CONFLICTING, 
+                CONFLICTING.intersection(NUMBER, compiler));
+  Expect.equals(CONFLICTING, 
+                CONFLICTING.intersection(INTEGER, compiler));
+  Expect.equals(CONFLICTING, 
+                CONFLICTING.intersection(DOUBLE, compiler));
+  Expect.equals(CONFLICTING, 
+                CONFLICTING.intersection(INDEXABLE_PRIMITIVE, compiler));
+  Expect.equals(CONFLICTING, 
+                CONFLICTING.intersection(STRING, compiler));
+  Expect.equals(CONFLICTING, 
+                CONFLICTING.intersection(READABLE_ARRAY, compiler));
+  Expect.equals(CONFLICTING, 
+                CONFLICTING.intersection(MUTABLE_ARRAY, compiler));
+  Expect.equals(CONFLICTING, 
+                CONFLICTING.intersection(EXTENDABLE_ARRAY, compiler));
+  Expect.equals(CONFLICTING, 
+                CONFLICTING.intersection(nonPrimitive1, compiler));
+  Expect.equals(CONFLICTING, 
+                CONFLICTING.intersection(nonPrimitive2, compiler));
+  Expect.equals(CONFLICTING, 
+                CONFLICTING.intersection(potentialArray, compiler));
+  Expect.equals(CONFLICTING, 
+                CONFLICTING.intersection(potentialString, compiler));
+  Expect.equals(CONFLICTING, 
+                CONFLICTING.intersection(BOOLEAN_OR_NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                CONFLICTING.intersection(NUMBER_OR_NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                CONFLICTING.intersection(INTEGER_OR_NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                CONFLICTING.intersection(DOUBLE_OR_NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                CONFLICTING.intersection(STRING_OR_NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                CONFLICTING.intersection(NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                CONFLICTING.intersection(FIXED_ARRAY, compiler));
 
-  Expect.equals(CONFLICTING, UNKNOWN.intersection(CONFLICTING));
-  Expect.equals(UNKNOWN, UNKNOWN.intersection(UNKNOWN));
-  Expect.equals(BOOLEAN, UNKNOWN.intersection(BOOLEAN));
-  Expect.equals(NUMBER, UNKNOWN.intersection(NUMBER));
-  Expect.equals(INTEGER, UNKNOWN.intersection(INTEGER));
-  Expect.equals(DOUBLE, UNKNOWN.intersection(DOUBLE));
-  Expect.equals(INDEXABLE_PRIMITIVE, UNKNOWN.intersection(INDEXABLE_PRIMITIVE));
-  Expect.equals(STRING, UNKNOWN.intersection(STRING));
-  Expect.equals(READABLE_ARRAY, UNKNOWN.intersection(READABLE_ARRAY));
-  Expect.equals(MUTABLE_ARRAY, UNKNOWN.intersection(MUTABLE_ARRAY));
-  Expect.equals(EXTENDABLE_ARRAY, UNKNOWN.intersection(EXTENDABLE_ARRAY));
-  Expect.equals(NON_PRIMITIVE1, UNKNOWN.intersection(NON_PRIMITIVE1));
-  Expect.equals(NON_PRIMITIVE2, UNKNOWN.intersection(NON_PRIMITIVE2));
-  Expect.equals(POTENTIAL_ARRAY, UNKNOWN.intersection(POTENTIAL_ARRAY));
-  Expect.equals(POTENTIAL_STRING, UNKNOWN.intersection(POTENTIAL_STRING));
-  Expect.equals(BOOLEAN_OR_NULL, UNKNOWN.intersection(BOOLEAN_OR_NULL));
-  Expect.equals(NUMBER_OR_NULL, UNKNOWN.intersection(NUMBER_OR_NULL));
-  Expect.equals(INTEGER_OR_NULL, UNKNOWN.intersection(INTEGER_OR_NULL));
-  Expect.equals(DOUBLE_OR_NULL, UNKNOWN.intersection(DOUBLE_OR_NULL));
-  Expect.equals(STRING_OR_NULL, UNKNOWN.intersection(STRING_OR_NULL));
-  Expect.equals(NULL, UNKNOWN.intersection(NULL));
-  Expect.equals(FIXED_ARRAY, UNKNOWN.intersection(FIXED_ARRAY));
+  Expect.equals(CONFLICTING, 
+                UNKNOWN.intersection(CONFLICTING, compiler));
+  Expect.equals(UNKNOWN, 
+                UNKNOWN.intersection(UNKNOWN, compiler));
+  Expect.equals(BOOLEAN, 
+                UNKNOWN.intersection(BOOLEAN, compiler));
+  Expect.equals(NUMBER, 
+                UNKNOWN.intersection(NUMBER, compiler));
+  Expect.equals(INTEGER, 
+                UNKNOWN.intersection(INTEGER, compiler));
+  Expect.equals(DOUBLE, 
+                UNKNOWN.intersection(DOUBLE, compiler));
+  Expect.equals(INDEXABLE_PRIMITIVE, 
+                UNKNOWN.intersection(INDEXABLE_PRIMITIVE, compiler));
+  Expect.equals(STRING, 
+                UNKNOWN.intersection(STRING, compiler));
+  Expect.equals(READABLE_ARRAY, 
+                UNKNOWN.intersection(READABLE_ARRAY, compiler));
+  Expect.equals(MUTABLE_ARRAY, 
+                UNKNOWN.intersection(MUTABLE_ARRAY, compiler));
+  Expect.equals(EXTENDABLE_ARRAY, 
+                UNKNOWN.intersection(EXTENDABLE_ARRAY, compiler));
+  Expect.equals(nonPrimitive1, 
+                UNKNOWN.intersection(nonPrimitive1, compiler));
+  Expect.equals(nonPrimitive2, 
+                UNKNOWN.intersection(nonPrimitive2, compiler));
+  Expect.equals(potentialArray, 
+                UNKNOWN.intersection(potentialArray, compiler));
+  Expect.equals(potentialString, 
+                UNKNOWN.intersection(potentialString, compiler));
+  Expect.equals(BOOLEAN_OR_NULL, 
+                UNKNOWN.intersection(BOOLEAN_OR_NULL, compiler));
+  Expect.equals(NUMBER_OR_NULL, 
+                UNKNOWN.intersection(NUMBER_OR_NULL, compiler));
+  Expect.equals(INTEGER_OR_NULL, 
+                UNKNOWN.intersection(INTEGER_OR_NULL, compiler));
+  Expect.equals(DOUBLE_OR_NULL, 
+                UNKNOWN.intersection(DOUBLE_OR_NULL, compiler));
+  Expect.equals(STRING_OR_NULL, 
+                UNKNOWN.intersection(STRING_OR_NULL, compiler));
+  Expect.equals(NULL, 
+                UNKNOWN.intersection(NULL, compiler));
+  Expect.equals(FIXED_ARRAY, 
+                UNKNOWN.intersection(FIXED_ARRAY, compiler));
 
-  Expect.equals(CONFLICTING, BOOLEAN.intersection(CONFLICTING));
-  Expect.equals(BOOLEAN, BOOLEAN.intersection(UNKNOWN));
-  Expect.equals(BOOLEAN, BOOLEAN.intersection(BOOLEAN));
-  Expect.equals(CONFLICTING, BOOLEAN.intersection(NUMBER));
-  Expect.equals(CONFLICTING, BOOLEAN.intersection(INTEGER));
-  Expect.equals(CONFLICTING, BOOLEAN.intersection(DOUBLE));
-  Expect.equals(CONFLICTING, BOOLEAN.intersection(INDEXABLE_PRIMITIVE));
-  Expect.equals(CONFLICTING, BOOLEAN.intersection(STRING));
-  Expect.equals(CONFLICTING, BOOLEAN.intersection(READABLE_ARRAY));
-  Expect.equals(CONFLICTING, BOOLEAN.intersection(MUTABLE_ARRAY));
-  Expect.equals(CONFLICTING, BOOLEAN.intersection(EXTENDABLE_ARRAY));
-  Expect.equals(CONFLICTING, BOOLEAN.intersection(NON_PRIMITIVE1));
-  Expect.equals(CONFLICTING, BOOLEAN.intersection(NON_PRIMITIVE2));
-  Expect.equals(CONFLICTING, BOOLEAN.intersection(POTENTIAL_ARRAY));
-  Expect.equals(CONFLICTING, BOOLEAN.intersection(POTENTIAL_STRING));
-  Expect.equals(BOOLEAN, BOOLEAN.intersection(BOOLEAN_OR_NULL));
-  Expect.equals(CONFLICTING, BOOLEAN.intersection(NUMBER_OR_NULL));
-  Expect.equals(CONFLICTING, BOOLEAN.intersection(INTEGER_OR_NULL));
-  Expect.equals(CONFLICTING, BOOLEAN.intersection(DOUBLE_OR_NULL));
-  Expect.equals(CONFLICTING, BOOLEAN.intersection(STRING_OR_NULL));
-  Expect.equals(CONFLICTING, BOOLEAN.intersection(NULL));
-  Expect.equals(CONFLICTING, BOOLEAN.intersection(FIXED_ARRAY));
+  Expect.equals(CONFLICTING, 
+                BOOLEAN.intersection(CONFLICTING, compiler));
+  Expect.equals(BOOLEAN, 
+                BOOLEAN.intersection(UNKNOWN, compiler));
+  Expect.equals(BOOLEAN, 
+                BOOLEAN.intersection(BOOLEAN, compiler));
+  Expect.equals(CONFLICTING, 
+                BOOLEAN.intersection(NUMBER, compiler));
+  Expect.equals(CONFLICTING, 
+                BOOLEAN.intersection(INTEGER, compiler));
+  Expect.equals(CONFLICTING, 
+                BOOLEAN.intersection(DOUBLE, compiler));
+  Expect.equals(CONFLICTING, 
+                BOOLEAN.intersection(INDEXABLE_PRIMITIVE, compiler));
+  Expect.equals(CONFLICTING, 
+                BOOLEAN.intersection(STRING, compiler));
+  Expect.equals(CONFLICTING, 
+                BOOLEAN.intersection(READABLE_ARRAY, compiler));
+  Expect.equals(CONFLICTING, 
+                BOOLEAN.intersection(MUTABLE_ARRAY, compiler));
+  Expect.equals(CONFLICTING, 
+                BOOLEAN.intersection(EXTENDABLE_ARRAY, compiler));
+  Expect.equals(CONFLICTING, 
+                BOOLEAN.intersection(nonPrimitive1, compiler));
+  Expect.equals(CONFLICTING, 
+                BOOLEAN.intersection(nonPrimitive2, compiler));
+  Expect.equals(CONFLICTING, 
+                BOOLEAN.intersection(potentialArray, compiler));
+  Expect.equals(CONFLICTING, 
+                BOOLEAN.intersection(potentialString, compiler));
+  Expect.equals(BOOLEAN, 
+                BOOLEAN.intersection(BOOLEAN_OR_NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                BOOLEAN.intersection(NUMBER_OR_NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                BOOLEAN.intersection(INTEGER_OR_NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                BOOLEAN.intersection(DOUBLE_OR_NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                BOOLEAN.intersection(STRING_OR_NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                BOOLEAN.intersection(NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                BOOLEAN.intersection(FIXED_ARRAY, compiler));
 
-  Expect.equals(CONFLICTING, NUMBER.intersection(CONFLICTING));
-  Expect.equals(NUMBER, NUMBER.intersection(UNKNOWN));
-  Expect.equals(CONFLICTING, NUMBER.intersection(BOOLEAN));
-  Expect.equals(NUMBER, NUMBER.intersection(NUMBER));
-  Expect.equals(INTEGER, NUMBER.intersection(INTEGER));
-  Expect.equals(DOUBLE, NUMBER.intersection(DOUBLE));
-  Expect.equals(CONFLICTING, NUMBER.intersection(INDEXABLE_PRIMITIVE));
-  Expect.equals(CONFLICTING, NUMBER.intersection(STRING));
-  Expect.equals(CONFLICTING, NUMBER.intersection(READABLE_ARRAY));
-  Expect.equals(CONFLICTING, NUMBER.intersection(MUTABLE_ARRAY));
-  Expect.equals(CONFLICTING, NUMBER.intersection(EXTENDABLE_ARRAY));
-  Expect.equals(CONFLICTING, NUMBER.intersection(NON_PRIMITIVE1));
-  Expect.equals(CONFLICTING, NUMBER.intersection(NON_PRIMITIVE2));
-  Expect.equals(CONFLICTING, NUMBER.intersection(POTENTIAL_ARRAY));
-  Expect.equals(CONFLICTING, NUMBER.intersection(POTENTIAL_STRING));
-  Expect.equals(CONFLICTING, NUMBER.intersection(BOOLEAN_OR_NULL));
-  Expect.equals(NUMBER, NUMBER.intersection(NUMBER_OR_NULL));
-  Expect.equals(INTEGER, NUMBER.intersection(INTEGER_OR_NULL));
-  Expect.equals(DOUBLE, NUMBER.intersection(DOUBLE_OR_NULL));
-  Expect.equals(CONFLICTING, NUMBER.intersection(STRING_OR_NULL));
-  Expect.equals(CONFLICTING, NUMBER.intersection(NULL));
-  Expect.equals(CONFLICTING, NUMBER.intersection(FIXED_ARRAY));
+  Expect.equals(CONFLICTING, 
+                NUMBER.intersection(CONFLICTING, compiler));
+  Expect.equals(NUMBER, 
+                NUMBER.intersection(UNKNOWN, compiler));
+  Expect.equals(CONFLICTING, 
+                NUMBER.intersection(BOOLEAN, compiler));
+  Expect.equals(NUMBER, 
+                NUMBER.intersection(NUMBER, compiler));
+  Expect.equals(INTEGER, 
+                NUMBER.intersection(INTEGER, compiler));
+  Expect.equals(DOUBLE, 
+                NUMBER.intersection(DOUBLE, compiler));
+  Expect.equals(CONFLICTING, 
+                NUMBER.intersection(INDEXABLE_PRIMITIVE, compiler));
+  Expect.equals(CONFLICTING, 
+                NUMBER.intersection(STRING, compiler));
+  Expect.equals(CONFLICTING, 
+                NUMBER.intersection(READABLE_ARRAY, compiler));
+  Expect.equals(CONFLICTING, 
+                NUMBER.intersection(MUTABLE_ARRAY, compiler));
+  Expect.equals(CONFLICTING, 
+                NUMBER.intersection(EXTENDABLE_ARRAY, compiler));
+  Expect.equals(CONFLICTING, 
+                NUMBER.intersection(nonPrimitive1, compiler));
+  Expect.equals(CONFLICTING, 
+                NUMBER.intersection(nonPrimitive2, compiler));
+  Expect.equals(CONFLICTING, 
+                NUMBER.intersection(potentialArray, compiler));
+  Expect.equals(CONFLICTING, 
+                NUMBER.intersection(potentialString, compiler));
+  Expect.equals(CONFLICTING, 
+                NUMBER.intersection(BOOLEAN_OR_NULL, compiler));
+  Expect.equals(NUMBER, 
+                NUMBER.intersection(NUMBER_OR_NULL, compiler));
+  Expect.equals(INTEGER, 
+                NUMBER.intersection(INTEGER_OR_NULL, compiler));
+  Expect.equals(DOUBLE, 
+                NUMBER.intersection(DOUBLE_OR_NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                NUMBER.intersection(STRING_OR_NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                NUMBER.intersection(NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                NUMBER.intersection(FIXED_ARRAY, compiler));
 
-  Expect.equals(CONFLICTING, INTEGER.intersection(CONFLICTING));
-  Expect.equals(INTEGER, INTEGER.intersection(UNKNOWN));
-  Expect.equals(CONFLICTING, INTEGER.intersection(BOOLEAN));
-  Expect.equals(INTEGER, INTEGER.intersection(NUMBER));
-  Expect.equals(INTEGER, INTEGER.intersection(INTEGER));
-  Expect.equals(CONFLICTING, INTEGER.intersection(DOUBLE));
-  Expect.equals(CONFLICTING, INTEGER.intersection(INDEXABLE_PRIMITIVE));
-  Expect.equals(CONFLICTING, INTEGER.intersection(STRING));
-  Expect.equals(CONFLICTING, INTEGER.intersection(READABLE_ARRAY));
-  Expect.equals(CONFLICTING, INTEGER.intersection(MUTABLE_ARRAY));
-  Expect.equals(CONFLICTING, INTEGER.intersection(EXTENDABLE_ARRAY));
-  Expect.equals(CONFLICTING, INTEGER.intersection(NON_PRIMITIVE1));
-  Expect.equals(CONFLICTING, INTEGER.intersection(NON_PRIMITIVE2));
-  Expect.equals(CONFLICTING, INTEGER.intersection(POTENTIAL_ARRAY));
-  Expect.equals(CONFLICTING, INTEGER.intersection(POTENTIAL_STRING));
-  Expect.equals(CONFLICTING, INTEGER.intersection(BOOLEAN_OR_NULL));
-  Expect.equals(INTEGER, INTEGER.intersection(NUMBER_OR_NULL));
-  Expect.equals(INTEGER, INTEGER.intersection(INTEGER_OR_NULL));
-  Expect.equals(CONFLICTING, INTEGER.intersection(DOUBLE_OR_NULL));
-  Expect.equals(CONFLICTING, INTEGER.intersection(STRING_OR_NULL));
-  Expect.equals(CONFLICTING, INTEGER.intersection(NULL));
-  Expect.equals(CONFLICTING, INTEGER.intersection(FIXED_ARRAY));
+  Expect.equals(CONFLICTING, 
+                INTEGER.intersection(CONFLICTING, compiler));
+  Expect.equals(INTEGER, 
+                INTEGER.intersection(UNKNOWN, compiler));
+  Expect.equals(CONFLICTING, 
+                INTEGER.intersection(BOOLEAN, compiler));
+  Expect.equals(INTEGER, 
+                INTEGER.intersection(NUMBER, compiler));
+  Expect.equals(INTEGER, 
+                INTEGER.intersection(INTEGER, compiler));
+  Expect.equals(CONFLICTING, 
+                INTEGER.intersection(DOUBLE, compiler));
+  Expect.equals(CONFLICTING, 
+                INTEGER.intersection(INDEXABLE_PRIMITIVE, compiler));
+  Expect.equals(CONFLICTING, 
+                INTEGER.intersection(STRING, compiler));
+  Expect.equals(CONFLICTING, 
+                INTEGER.intersection(READABLE_ARRAY, compiler));
+  Expect.equals(CONFLICTING, 
+                INTEGER.intersection(MUTABLE_ARRAY, compiler));
+  Expect.equals(CONFLICTING, 
+                INTEGER.intersection(EXTENDABLE_ARRAY, compiler));
+  Expect.equals(CONFLICTING, 
+                INTEGER.intersection(nonPrimitive1, compiler));
+  Expect.equals(CONFLICTING, 
+                INTEGER.intersection(nonPrimitive2, compiler));
+  Expect.equals(CONFLICTING, 
+                INTEGER.intersection(potentialArray, compiler));
+  Expect.equals(CONFLICTING, 
+                INTEGER.intersection(potentialString, compiler));
+  Expect.equals(CONFLICTING, 
+                INTEGER.intersection(BOOLEAN_OR_NULL, compiler));
+  Expect.equals(INTEGER, 
+                INTEGER.intersection(NUMBER_OR_NULL, compiler));
+  Expect.equals(INTEGER, 
+                INTEGER.intersection(INTEGER_OR_NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                INTEGER.intersection(DOUBLE_OR_NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                INTEGER.intersection(STRING_OR_NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                INTEGER.intersection(NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                INTEGER.intersection(FIXED_ARRAY, compiler));
 
-  Expect.equals(CONFLICTING, DOUBLE.intersection(CONFLICTING));
-  Expect.equals(DOUBLE, DOUBLE.intersection(UNKNOWN));
-  Expect.equals(CONFLICTING, DOUBLE.intersection(BOOLEAN));
-  Expect.equals(DOUBLE, DOUBLE.intersection(NUMBER));
-  Expect.equals(CONFLICTING, DOUBLE.intersection(INTEGER));
-  Expect.equals(DOUBLE, DOUBLE.intersection(DOUBLE));
-  Expect.equals(CONFLICTING, DOUBLE.intersection(INDEXABLE_PRIMITIVE));
-  Expect.equals(CONFLICTING, DOUBLE.intersection(STRING));
-  Expect.equals(CONFLICTING, DOUBLE.intersection(READABLE_ARRAY));
-  Expect.equals(CONFLICTING, DOUBLE.intersection(MUTABLE_ARRAY));
-  Expect.equals(CONFLICTING, DOUBLE.intersection(EXTENDABLE_ARRAY));
-  Expect.equals(CONFLICTING, DOUBLE.intersection(NON_PRIMITIVE1));
-  Expect.equals(CONFLICTING, DOUBLE.intersection(NON_PRIMITIVE2));
-  Expect.equals(CONFLICTING, DOUBLE.intersection(POTENTIAL_ARRAY));
-  Expect.equals(CONFLICTING, DOUBLE.intersection(POTENTIAL_STRING));
-  Expect.equals(CONFLICTING, DOUBLE.intersection(BOOLEAN_OR_NULL));
-  Expect.equals(DOUBLE, DOUBLE.intersection(NUMBER_OR_NULL));
-  Expect.equals(CONFLICTING, DOUBLE.intersection(INTEGER_OR_NULL));
-  Expect.equals(DOUBLE, DOUBLE.intersection(DOUBLE_OR_NULL));
-  Expect.equals(CONFLICTING, DOUBLE.intersection(STRING_OR_NULL));
-  Expect.equals(CONFLICTING, DOUBLE.intersection(NULL));
-  Expect.equals(CONFLICTING, DOUBLE.intersection(FIXED_ARRAY));
+  Expect.equals(CONFLICTING, 
+                DOUBLE.intersection(CONFLICTING, compiler));
+  Expect.equals(DOUBLE, 
+                DOUBLE.intersection(UNKNOWN, compiler));
+  Expect.equals(CONFLICTING, 
+                DOUBLE.intersection(BOOLEAN, compiler));
+  Expect.equals(DOUBLE, 
+                DOUBLE.intersection(NUMBER, compiler));
+  Expect.equals(CONFLICTING, 
+                DOUBLE.intersection(INTEGER, compiler));
+  Expect.equals(DOUBLE, 
+                DOUBLE.intersection(DOUBLE, compiler));
+  Expect.equals(CONFLICTING, 
+                DOUBLE.intersection(INDEXABLE_PRIMITIVE, compiler));
+  Expect.equals(CONFLICTING, 
+                DOUBLE.intersection(STRING, compiler));
+  Expect.equals(CONFLICTING, 
+                DOUBLE.intersection(READABLE_ARRAY, compiler));
+  Expect.equals(CONFLICTING, 
+                DOUBLE.intersection(MUTABLE_ARRAY, compiler));
+  Expect.equals(CONFLICTING, 
+                DOUBLE.intersection(EXTENDABLE_ARRAY, compiler));
+  Expect.equals(CONFLICTING, 
+                DOUBLE.intersection(nonPrimitive1, compiler));
+  Expect.equals(CONFLICTING, 
+                DOUBLE.intersection(nonPrimitive2, compiler));
+  Expect.equals(CONFLICTING, 
+                DOUBLE.intersection(potentialArray, compiler));
+  Expect.equals(CONFLICTING, 
+                DOUBLE.intersection(potentialString, compiler));
+  Expect.equals(CONFLICTING, 
+                DOUBLE.intersection(BOOLEAN_OR_NULL, compiler));
+  Expect.equals(DOUBLE, 
+                DOUBLE.intersection(NUMBER_OR_NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                DOUBLE.intersection(INTEGER_OR_NULL, compiler));
+  Expect.equals(DOUBLE, 
+                DOUBLE.intersection(DOUBLE_OR_NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                DOUBLE.intersection(STRING_OR_NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                DOUBLE.intersection(NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                DOUBLE.intersection(FIXED_ARRAY, compiler));
   
-  Expect.equals(CONFLICTING, INDEXABLE_PRIMITIVE.intersection(CONFLICTING));
-  Expect.equals(INDEXABLE_PRIMITIVE, INDEXABLE_PRIMITIVE.intersection(UNKNOWN));
-  Expect.equals(CONFLICTING, INDEXABLE_PRIMITIVE.intersection(BOOLEAN));
-  Expect.equals(CONFLICTING, INDEXABLE_PRIMITIVE.intersection(NUMBER));
-  Expect.equals(CONFLICTING, INDEXABLE_PRIMITIVE.intersection(INTEGER));
-  Expect.equals(CONFLICTING, INDEXABLE_PRIMITIVE.intersection(DOUBLE));
+  Expect.equals(CONFLICTING, 
+                INDEXABLE_PRIMITIVE.intersection(CONFLICTING, compiler));
+  Expect.equals(INDEXABLE_PRIMITIVE, 
+                INDEXABLE_PRIMITIVE.intersection(UNKNOWN, compiler));
+  Expect.equals(CONFLICTING, 
+                INDEXABLE_PRIMITIVE.intersection(BOOLEAN, compiler));
+  Expect.equals(CONFLICTING, 
+                INDEXABLE_PRIMITIVE.intersection(NUMBER, compiler));
+  Expect.equals(CONFLICTING, 
+                INDEXABLE_PRIMITIVE.intersection(INTEGER, compiler));
+  Expect.equals(CONFLICTING, 
+                INDEXABLE_PRIMITIVE.intersection(DOUBLE, compiler));
   Expect.equals(INDEXABLE_PRIMITIVE,
-                INDEXABLE_PRIMITIVE.intersection(INDEXABLE_PRIMITIVE));
-  Expect.equals(STRING, INDEXABLE_PRIMITIVE.intersection(STRING));
+                INDEXABLE_PRIMITIVE.intersection(INDEXABLE_PRIMITIVE, 
+                compiler));
+  Expect.equals(STRING, 
+                INDEXABLE_PRIMITIVE.intersection(STRING, compiler));
   Expect.equals(READABLE_ARRAY,
-                INDEXABLE_PRIMITIVE.intersection(READABLE_ARRAY));
+                INDEXABLE_PRIMITIVE.intersection(READABLE_ARRAY, 
+                compiler));
   Expect.equals(MUTABLE_ARRAY,
-                INDEXABLE_PRIMITIVE.intersection(MUTABLE_ARRAY));
+                INDEXABLE_PRIMITIVE.intersection(MUTABLE_ARRAY, 
+                compiler));
   Expect.equals(EXTENDABLE_ARRAY,
-                INDEXABLE_PRIMITIVE.intersection(EXTENDABLE_ARRAY));
-  Expect.equals(CONFLICTING, INDEXABLE_PRIMITIVE.intersection(NON_PRIMITIVE1));
-  Expect.equals(CONFLICTING, INDEXABLE_PRIMITIVE.intersection(NON_PRIMITIVE2));
+                INDEXABLE_PRIMITIVE.intersection(EXTENDABLE_ARRAY, 
+                compiler));
+  Expect.equals(CONFLICTING, 
+                INDEXABLE_PRIMITIVE.intersection(nonPrimitive1, compiler));
+  Expect.equals(CONFLICTING, 
+                INDEXABLE_PRIMITIVE.intersection(nonPrimitive2, compiler));
   Expect.equals(READABLE_ARRAY,
-                INDEXABLE_PRIMITIVE.intersection(POTENTIAL_ARRAY));
+                INDEXABLE_PRIMITIVE.intersection(potentialArray, 
+                compiler));
   Expect.equals(STRING,
-                INDEXABLE_PRIMITIVE.intersection(POTENTIAL_STRING));
-  Expect.equals(CONFLICTING, INDEXABLE_PRIMITIVE.intersection(BOOLEAN_OR_NULL));
-  Expect.equals(CONFLICTING, INDEXABLE_PRIMITIVE.intersection(NUMBER_OR_NULL));
-  Expect.equals(CONFLICTING, INDEXABLE_PRIMITIVE.intersection(INTEGER_OR_NULL));
-  Expect.equals(CONFLICTING, INDEXABLE_PRIMITIVE.intersection(DOUBLE_OR_NULL));
-  Expect.equals(CONFLICTING, INDEXABLE_PRIMITIVE.intersection(STRING_OR_NULL));
-  Expect.equals(CONFLICTING, INDEXABLE_PRIMITIVE.intersection(NULL));
-  Expect.equals(FIXED_ARRAY, INDEXABLE_PRIMITIVE.intersection(FIXED_ARRAY));
+                INDEXABLE_PRIMITIVE.intersection(potentialString, 
+                compiler));
+  Expect.equals(CONFLICTING, 
+                INDEXABLE_PRIMITIVE.intersection(BOOLEAN_OR_NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                INDEXABLE_PRIMITIVE.intersection(NUMBER_OR_NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                INDEXABLE_PRIMITIVE.intersection(INTEGER_OR_NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                INDEXABLE_PRIMITIVE.intersection(DOUBLE_OR_NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                INDEXABLE_PRIMITIVE.intersection(STRING_OR_NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                INDEXABLE_PRIMITIVE.intersection(NULL, compiler));
+  Expect.equals(FIXED_ARRAY, 
+                INDEXABLE_PRIMITIVE.intersection(FIXED_ARRAY, compiler));
 
-  Expect.equals(CONFLICTING, STRING.intersection(CONFLICTING));
-  Expect.equals(STRING, STRING.intersection(UNKNOWN));
-  Expect.equals(CONFLICTING, STRING.intersection(BOOLEAN));
-  Expect.equals(CONFLICTING, STRING.intersection(NUMBER));
-  Expect.equals(CONFLICTING, STRING.intersection(INTEGER));
-  Expect.equals(CONFLICTING, STRING.intersection(DOUBLE));
-  Expect.equals(STRING, STRING.intersection(INDEXABLE_PRIMITIVE));
-  Expect.equals(STRING, STRING.intersection(STRING));
-  Expect.equals(CONFLICTING, STRING.intersection(READABLE_ARRAY));
-  Expect.equals(CONFLICTING, STRING.intersection(MUTABLE_ARRAY));
-  Expect.equals(CONFLICTING, STRING.intersection(EXTENDABLE_ARRAY));
-  Expect.equals(CONFLICTING, STRING.intersection(NON_PRIMITIVE1));
-  Expect.equals(CONFLICTING, STRING.intersection(NON_PRIMITIVE2));
-  Expect.equals(CONFLICTING, STRING.intersection(POTENTIAL_ARRAY));
-  Expect.equals(STRING, STRING.intersection(POTENTIAL_STRING));
-  Expect.equals(CONFLICTING, STRING.intersection(BOOLEAN_OR_NULL));
-  Expect.equals(CONFLICTING, STRING.intersection(NUMBER_OR_NULL));
-  Expect.equals(CONFLICTING, STRING.intersection(INTEGER_OR_NULL));
-  Expect.equals(CONFLICTING, STRING.intersection(DOUBLE_OR_NULL));
-  Expect.equals(STRING, STRING.intersection(STRING_OR_NULL));
-  Expect.equals(CONFLICTING, STRING.intersection(NULL));
-  Expect.equals(CONFLICTING, STRING.intersection(FIXED_ARRAY));
+  Expect.equals(CONFLICTING, 
+                STRING.intersection(CONFLICTING, compiler));
+  Expect.equals(STRING, 
+                STRING.intersection(UNKNOWN, compiler));
+  Expect.equals(CONFLICTING, 
+                STRING.intersection(BOOLEAN, compiler));
+  Expect.equals(CONFLICTING, 
+                STRING.intersection(NUMBER, compiler));
+  Expect.equals(CONFLICTING, 
+                STRING.intersection(INTEGER, compiler));
+  Expect.equals(CONFLICTING, 
+                STRING.intersection(DOUBLE, compiler));
+  Expect.equals(STRING, 
+                STRING.intersection(INDEXABLE_PRIMITIVE, compiler));
+  Expect.equals(STRING, 
+                STRING.intersection(STRING, compiler));
+  Expect.equals(CONFLICTING, 
+                STRING.intersection(READABLE_ARRAY, compiler));
+  Expect.equals(CONFLICTING, 
+                STRING.intersection(MUTABLE_ARRAY, compiler));
+  Expect.equals(CONFLICTING, 
+                STRING.intersection(EXTENDABLE_ARRAY, compiler));
+  Expect.equals(CONFLICTING, 
+                STRING.intersection(nonPrimitive1, compiler));
+  Expect.equals(CONFLICTING, 
+                STRING.intersection(nonPrimitive2, compiler));
+  Expect.equals(CONFLICTING, 
+                STRING.intersection(potentialArray, compiler));
+  Expect.equals(STRING, 
+                STRING.intersection(potentialString, compiler));
+  Expect.equals(CONFLICTING, 
+                STRING.intersection(BOOLEAN_OR_NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                STRING.intersection(NUMBER_OR_NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                STRING.intersection(INTEGER_OR_NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                STRING.intersection(DOUBLE_OR_NULL, compiler));
+  Expect.equals(STRING, 
+                STRING.intersection(STRING_OR_NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                STRING.intersection(NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                STRING.intersection(FIXED_ARRAY, compiler));
 
-  Expect.equals(CONFLICTING, READABLE_ARRAY.intersection(CONFLICTING));
-  Expect.equals(READABLE_ARRAY, READABLE_ARRAY.intersection(UNKNOWN));
-  Expect.equals(CONFLICTING, READABLE_ARRAY.intersection(BOOLEAN));
-  Expect.equals(CONFLICTING, READABLE_ARRAY.intersection(NUMBER));
-  Expect.equals(CONFLICTING, READABLE_ARRAY.intersection(INTEGER));
-  Expect.equals(CONFLICTING, READABLE_ARRAY.intersection(DOUBLE));
-  Expect.equals(READABLE_ARRAY, READABLE_ARRAY.intersection(INDEXABLE_PRIMITIVE));
-  Expect.equals(CONFLICTING, READABLE_ARRAY.intersection(STRING));
-  Expect.equals(READABLE_ARRAY, READABLE_ARRAY.intersection(READABLE_ARRAY));
-  Expect.equals(MUTABLE_ARRAY, READABLE_ARRAY.intersection(MUTABLE_ARRAY));
-  Expect.equals(EXTENDABLE_ARRAY, READABLE_ARRAY.intersection(EXTENDABLE_ARRAY));
-  Expect.equals(CONFLICTING, READABLE_ARRAY.intersection(NON_PRIMITIVE1));
-  Expect.equals(CONFLICTING, READABLE_ARRAY.intersection(NON_PRIMITIVE2));
-  Expect.equals(READABLE_ARRAY, READABLE_ARRAY.intersection(POTENTIAL_ARRAY));
-  Expect.equals(CONFLICTING, READABLE_ARRAY.intersection(POTENTIAL_STRING));
-  Expect.equals(CONFLICTING, READABLE_ARRAY.intersection(BOOLEAN_OR_NULL));
-  Expect.equals(CONFLICTING, READABLE_ARRAY.intersection(NUMBER_OR_NULL));
-  Expect.equals(CONFLICTING, READABLE_ARRAY.intersection(INTEGER_OR_NULL));
-  Expect.equals(CONFLICTING, READABLE_ARRAY.intersection(DOUBLE_OR_NULL));
-  Expect.equals(CONFLICTING, READABLE_ARRAY.intersection(STRING_OR_NULL));
-  Expect.equals(CONFLICTING, READABLE_ARRAY.intersection(NULL));
-  Expect.equals(FIXED_ARRAY, READABLE_ARRAY.intersection(FIXED_ARRAY));
+  Expect.equals(CONFLICTING, 
+                READABLE_ARRAY.intersection(CONFLICTING, compiler));
+  Expect.equals(READABLE_ARRAY, 
+                READABLE_ARRAY.intersection(UNKNOWN, compiler));
+  Expect.equals(CONFLICTING, 
+                READABLE_ARRAY.intersection(BOOLEAN, compiler));
+  Expect.equals(CONFLICTING, 
+                READABLE_ARRAY.intersection(NUMBER, compiler));
+  Expect.equals(CONFLICTING, 
+                READABLE_ARRAY.intersection(INTEGER, compiler));
+  Expect.equals(CONFLICTING, 
+                READABLE_ARRAY.intersection(DOUBLE, compiler));
+  Expect.equals(READABLE_ARRAY, 
+                READABLE_ARRAY.intersection(INDEXABLE_PRIMITIVE, compiler));
+  Expect.equals(CONFLICTING, 
+                READABLE_ARRAY.intersection(STRING, compiler));
+  Expect.equals(READABLE_ARRAY, 
+                READABLE_ARRAY.intersection(READABLE_ARRAY, compiler));
+  Expect.equals(MUTABLE_ARRAY, 
+                READABLE_ARRAY.intersection(MUTABLE_ARRAY, compiler));
+  Expect.equals(EXTENDABLE_ARRAY, 
+                READABLE_ARRAY.intersection(EXTENDABLE_ARRAY, compiler));
+  Expect.equals(CONFLICTING, 
+                READABLE_ARRAY.intersection(nonPrimitive1, compiler));
+  Expect.equals(CONFLICTING, 
+                READABLE_ARRAY.intersection(nonPrimitive2, compiler));
+  Expect.equals(READABLE_ARRAY, 
+                READABLE_ARRAY.intersection(potentialArray, compiler));
+  Expect.equals(CONFLICTING, 
+                READABLE_ARRAY.intersection(potentialString, compiler));
+  Expect.equals(CONFLICTING, 
+                READABLE_ARRAY.intersection(BOOLEAN_OR_NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                READABLE_ARRAY.intersection(NUMBER_OR_NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                READABLE_ARRAY.intersection(INTEGER_OR_NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                READABLE_ARRAY.intersection(DOUBLE_OR_NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                READABLE_ARRAY.intersection(STRING_OR_NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                READABLE_ARRAY.intersection(NULL, compiler));
+  Expect.equals(FIXED_ARRAY, 
+                READABLE_ARRAY.intersection(FIXED_ARRAY, compiler));
 
-  Expect.equals(CONFLICTING, MUTABLE_ARRAY.intersection(CONFLICTING));
-  Expect.equals(MUTABLE_ARRAY, MUTABLE_ARRAY.intersection(UNKNOWN));
-  Expect.equals(CONFLICTING, MUTABLE_ARRAY.intersection(BOOLEAN));
-  Expect.equals(CONFLICTING, MUTABLE_ARRAY.intersection(NUMBER));
-  Expect.equals(CONFLICTING, MUTABLE_ARRAY.intersection(INTEGER));
-  Expect.equals(CONFLICTING, MUTABLE_ARRAY.intersection(DOUBLE));
-  Expect.equals(MUTABLE_ARRAY, MUTABLE_ARRAY.intersection(INDEXABLE_PRIMITIVE));
-  Expect.equals(CONFLICTING, MUTABLE_ARRAY.intersection(STRING));
-  Expect.equals(MUTABLE_ARRAY, MUTABLE_ARRAY.intersection(READABLE_ARRAY));
-  Expect.equals(MUTABLE_ARRAY, MUTABLE_ARRAY.intersection(MUTABLE_ARRAY));
-  Expect.equals(EXTENDABLE_ARRAY, MUTABLE_ARRAY.intersection(EXTENDABLE_ARRAY));
-  Expect.equals(CONFLICTING, MUTABLE_ARRAY.intersection(NON_PRIMITIVE1));
-  Expect.equals(CONFLICTING, MUTABLE_ARRAY.intersection(NON_PRIMITIVE2));
-  Expect.equals(MUTABLE_ARRAY, MUTABLE_ARRAY.intersection(POTENTIAL_ARRAY));
-  Expect.equals(CONFLICTING, MUTABLE_ARRAY.intersection(POTENTIAL_STRING));
-  Expect.equals(CONFLICTING, MUTABLE_ARRAY.intersection(BOOLEAN_OR_NULL));
-  Expect.equals(CONFLICTING, MUTABLE_ARRAY.intersection(NUMBER_OR_NULL));
-  Expect.equals(CONFLICTING, MUTABLE_ARRAY.intersection(INTEGER_OR_NULL));
-  Expect.equals(CONFLICTING, MUTABLE_ARRAY.intersection(DOUBLE_OR_NULL));
-  Expect.equals(CONFLICTING, MUTABLE_ARRAY.intersection(STRING_OR_NULL));
-  Expect.equals(CONFLICTING, MUTABLE_ARRAY.intersection(NULL));
-  Expect.equals(FIXED_ARRAY, MUTABLE_ARRAY.intersection(FIXED_ARRAY));
+  Expect.equals(CONFLICTING, 
+                MUTABLE_ARRAY.intersection(CONFLICTING, compiler));
+  Expect.equals(MUTABLE_ARRAY, 
+                MUTABLE_ARRAY.intersection(UNKNOWN, compiler));
+  Expect.equals(CONFLICTING, 
+                MUTABLE_ARRAY.intersection(BOOLEAN, compiler));
+  Expect.equals(CONFLICTING, 
+                MUTABLE_ARRAY.intersection(NUMBER, compiler));
+  Expect.equals(CONFLICTING, 
+                MUTABLE_ARRAY.intersection(INTEGER, compiler));
+  Expect.equals(CONFLICTING, 
+                MUTABLE_ARRAY.intersection(DOUBLE, compiler));
+  Expect.equals(MUTABLE_ARRAY, 
+                MUTABLE_ARRAY.intersection(INDEXABLE_PRIMITIVE, compiler));
+  Expect.equals(CONFLICTING, 
+                MUTABLE_ARRAY.intersection(STRING, compiler));
+  Expect.equals(MUTABLE_ARRAY, 
+                MUTABLE_ARRAY.intersection(READABLE_ARRAY, compiler));
+  Expect.equals(MUTABLE_ARRAY, 
+                MUTABLE_ARRAY.intersection(MUTABLE_ARRAY, compiler));
+  Expect.equals(EXTENDABLE_ARRAY, 
+                MUTABLE_ARRAY.intersection(EXTENDABLE_ARRAY, compiler));
+  Expect.equals(CONFLICTING, 
+                MUTABLE_ARRAY.intersection(nonPrimitive1, compiler));
+  Expect.equals(CONFLICTING, 
+                MUTABLE_ARRAY.intersection(nonPrimitive2, compiler));
+  Expect.equals(MUTABLE_ARRAY, 
+                MUTABLE_ARRAY.intersection(potentialArray, compiler));
+  Expect.equals(CONFLICTING, 
+                MUTABLE_ARRAY.intersection(potentialString, compiler));
+  Expect.equals(CONFLICTING, 
+                MUTABLE_ARRAY.intersection(BOOLEAN_OR_NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                MUTABLE_ARRAY.intersection(NUMBER_OR_NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                MUTABLE_ARRAY.intersection(INTEGER_OR_NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                MUTABLE_ARRAY.intersection(DOUBLE_OR_NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                MUTABLE_ARRAY.intersection(STRING_OR_NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                MUTABLE_ARRAY.intersection(NULL, compiler));
+  Expect.equals(FIXED_ARRAY, 
+                MUTABLE_ARRAY.intersection(FIXED_ARRAY, compiler));
 
-  Expect.equals(CONFLICTING, EXTENDABLE_ARRAY.intersection(CONFLICTING));
-  Expect.equals(EXTENDABLE_ARRAY, EXTENDABLE_ARRAY.intersection(UNKNOWN));
-  Expect.equals(CONFLICTING, EXTENDABLE_ARRAY.intersection(BOOLEAN));
-  Expect.equals(CONFLICTING, EXTENDABLE_ARRAY.intersection(NUMBER));
-  Expect.equals(CONFLICTING, EXTENDABLE_ARRAY.intersection(INTEGER));
-  Expect.equals(CONFLICTING, EXTENDABLE_ARRAY.intersection(DOUBLE));
+  Expect.equals(CONFLICTING, 
+                EXTENDABLE_ARRAY.intersection(CONFLICTING, compiler));
+  Expect.equals(EXTENDABLE_ARRAY, 
+                EXTENDABLE_ARRAY.intersection(UNKNOWN, compiler));
+  Expect.equals(CONFLICTING, 
+                EXTENDABLE_ARRAY.intersection(BOOLEAN, compiler));
+  Expect.equals(CONFLICTING, 
+                EXTENDABLE_ARRAY.intersection(NUMBER, compiler));
+  Expect.equals(CONFLICTING, 
+                EXTENDABLE_ARRAY.intersection(INTEGER, compiler));
+  Expect.equals(CONFLICTING, 
+                EXTENDABLE_ARRAY.intersection(DOUBLE, compiler));
   Expect.equals(EXTENDABLE_ARRAY,
-                EXTENDABLE_ARRAY.intersection(INDEXABLE_PRIMITIVE));
-  Expect.equals(CONFLICTING, EXTENDABLE_ARRAY.intersection(STRING));
+                EXTENDABLE_ARRAY.intersection(INDEXABLE_PRIMITIVE, 
+                compiler));
+  Expect.equals(CONFLICTING, 
+                EXTENDABLE_ARRAY.intersection(STRING, compiler));
   Expect.equals(EXTENDABLE_ARRAY,
-                EXTENDABLE_ARRAY.intersection(READABLE_ARRAY));
-  Expect.equals(EXTENDABLE_ARRAY, EXTENDABLE_ARRAY.intersection(MUTABLE_ARRAY));
+                EXTENDABLE_ARRAY.intersection(READABLE_ARRAY, 
+                compiler));
+  Expect.equals(EXTENDABLE_ARRAY, 
+                EXTENDABLE_ARRAY.intersection(MUTABLE_ARRAY, compiler));
   Expect.equals(EXTENDABLE_ARRAY,
-                EXTENDABLE_ARRAY.intersection(EXTENDABLE_ARRAY));
-  Expect.equals(CONFLICTING, EXTENDABLE_ARRAY.intersection(NON_PRIMITIVE1));
-  Expect.equals(CONFLICTING, EXTENDABLE_ARRAY.intersection(NON_PRIMITIVE2));
+                EXTENDABLE_ARRAY.intersection(EXTENDABLE_ARRAY, 
+                compiler));
+  Expect.equals(CONFLICTING, 
+                EXTENDABLE_ARRAY.intersection(nonPrimitive1, compiler));
+  Expect.equals(CONFLICTING, 
+                EXTENDABLE_ARRAY.intersection(nonPrimitive2, compiler));
   Expect.equals(EXTENDABLE_ARRAY,
-                EXTENDABLE_ARRAY.intersection(POTENTIAL_ARRAY));
-  Expect.equals(CONFLICTING, EXTENDABLE_ARRAY.intersection(POTENTIAL_STRING));
-  Expect.equals(CONFLICTING, EXTENDABLE_ARRAY.intersection(BOOLEAN_OR_NULL));
-  Expect.equals(CONFLICTING, EXTENDABLE_ARRAY.intersection(NUMBER_OR_NULL));
-  Expect.equals(CONFLICTING, EXTENDABLE_ARRAY.intersection(INTEGER_OR_NULL));
-  Expect.equals(CONFLICTING, EXTENDABLE_ARRAY.intersection(DOUBLE_OR_NULL));
-  Expect.equals(CONFLICTING, EXTENDABLE_ARRAY.intersection(STRING_OR_NULL));
-  Expect.equals(CONFLICTING, EXTENDABLE_ARRAY.intersection(NULL));
-  Expect.equals(CONFLICTING, EXTENDABLE_ARRAY.intersection(FIXED_ARRAY));
+                EXTENDABLE_ARRAY.intersection(potentialArray, 
+                compiler));
+  Expect.equals(CONFLICTING, 
+                EXTENDABLE_ARRAY.intersection(potentialString, compiler));
+  Expect.equals(CONFLICTING, 
+                EXTENDABLE_ARRAY.intersection(BOOLEAN_OR_NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                EXTENDABLE_ARRAY.intersection(NUMBER_OR_NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                EXTENDABLE_ARRAY.intersection(INTEGER_OR_NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                EXTENDABLE_ARRAY.intersection(DOUBLE_OR_NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                EXTENDABLE_ARRAY.intersection(STRING_OR_NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                EXTENDABLE_ARRAY.intersection(NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                EXTENDABLE_ARRAY.intersection(FIXED_ARRAY, compiler));
 
-  Expect.equals(CONFLICTING, NON_PRIMITIVE1.intersection(CONFLICTING));
-  Expect.equals(NON_PRIMITIVE1, NON_PRIMITIVE1.intersection(UNKNOWN));
-  Expect.equals(CONFLICTING, NON_PRIMITIVE1.intersection(BOOLEAN));
-  Expect.equals(CONFLICTING, NON_PRIMITIVE1.intersection(NUMBER));
-  Expect.equals(CONFLICTING, NON_PRIMITIVE1.intersection(INTEGER));
-  Expect.equals(CONFLICTING, NON_PRIMITIVE1.intersection(DOUBLE));
-  Expect.equals(CONFLICTING, NON_PRIMITIVE1.intersection(INDEXABLE_PRIMITIVE));
-  Expect.equals(CONFLICTING, NON_PRIMITIVE1.intersection(STRING));
-  Expect.equals(CONFLICTING, NON_PRIMITIVE1.intersection(READABLE_ARRAY));
-  Expect.equals(CONFLICTING, NON_PRIMITIVE1.intersection(MUTABLE_ARRAY));
-  Expect.equals(CONFLICTING, NON_PRIMITIVE1.intersection(EXTENDABLE_ARRAY));
-  Expect.equals(NON_PRIMITIVE1, NON_PRIMITIVE1.intersection(NON_PRIMITIVE1));
-  Expect.equals(CONFLICTING, NON_PRIMITIVE1.intersection(NON_PRIMITIVE2));
-  Expect.equals(CONFLICTING, NON_PRIMITIVE1.intersection(POTENTIAL_ARRAY));
-  Expect.equals(CONFLICTING, NON_PRIMITIVE1.intersection(POTENTIAL_STRING));
-  Expect.equals(CONFLICTING, NON_PRIMITIVE1.intersection(BOOLEAN_OR_NULL));
-  Expect.equals(CONFLICTING, NON_PRIMITIVE1.intersection(NUMBER_OR_NULL));
-  Expect.equals(CONFLICTING, NON_PRIMITIVE1.intersection(INTEGER_OR_NULL));
-  Expect.equals(CONFLICTING, NON_PRIMITIVE1.intersection(DOUBLE_OR_NULL));
-  Expect.equals(CONFLICTING, NON_PRIMITIVE1.intersection(STRING_OR_NULL));
-  Expect.equals(CONFLICTING, NON_PRIMITIVE1.intersection(NULL));
-  Expect.equals(CONFLICTING, NON_PRIMITIVE1.intersection(FIXED_ARRAY));
+  Expect.equals(CONFLICTING, 
+                nonPrimitive1.intersection(CONFLICTING, compiler));
+  Expect.equals(nonPrimitive1, 
+                nonPrimitive1.intersection(UNKNOWN, compiler));
+  Expect.equals(CONFLICTING, 
+                nonPrimitive1.intersection(BOOLEAN, compiler));
+  Expect.equals(CONFLICTING, 
+                nonPrimitive1.intersection(NUMBER, compiler));
+  Expect.equals(CONFLICTING, 
+                nonPrimitive1.intersection(INTEGER, compiler));
+  Expect.equals(CONFLICTING, 
+                nonPrimitive1.intersection(DOUBLE, compiler));
+  Expect.equals(CONFLICTING, 
+                nonPrimitive1.intersection(INDEXABLE_PRIMITIVE, compiler));
+  Expect.equals(CONFLICTING, 
+                nonPrimitive1.intersection(STRING, compiler));
+  Expect.equals(CONFLICTING, 
+                nonPrimitive1.intersection(READABLE_ARRAY, compiler));
+  Expect.equals(CONFLICTING, 
+                nonPrimitive1.intersection(MUTABLE_ARRAY, compiler));
+  Expect.equals(CONFLICTING, 
+                nonPrimitive1.intersection(EXTENDABLE_ARRAY, compiler));
+  Expect.equals(nonPrimitive1, 
+                nonPrimitive1.intersection(nonPrimitive1, compiler));
+  Expect.equals(CONFLICTING, 
+                nonPrimitive1.intersection(nonPrimitive2, compiler));
+  Expect.equals(CONFLICTING, 
+                nonPrimitive1.intersection(potentialArray, compiler));
+  Expect.equals(CONFLICTING, 
+                nonPrimitive1.intersection(potentialString, compiler));
+  Expect.equals(CONFLICTING, 
+                nonPrimitive1.intersection(BOOLEAN_OR_NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                nonPrimitive1.intersection(NUMBER_OR_NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                nonPrimitive1.intersection(INTEGER_OR_NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                nonPrimitive1.intersection(DOUBLE_OR_NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                nonPrimitive1.intersection(STRING_OR_NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                nonPrimitive1.intersection(NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                nonPrimitive1.intersection(FIXED_ARRAY, compiler));
 
-  Expect.equals(CONFLICTING, NON_PRIMITIVE2.intersection(CONFLICTING));
-  Expect.equals(NON_PRIMITIVE2, NON_PRIMITIVE2.intersection(UNKNOWN));
-  Expect.equals(CONFLICTING, NON_PRIMITIVE2.intersection(BOOLEAN));
-  Expect.equals(CONFLICTING, NON_PRIMITIVE2.intersection(NUMBER));
-  Expect.equals(CONFLICTING, NON_PRIMITIVE2.intersection(INTEGER));
-  Expect.equals(CONFLICTING, NON_PRIMITIVE2.intersection(DOUBLE));
-  Expect.equals(CONFLICTING, NON_PRIMITIVE2.intersection(INDEXABLE_PRIMITIVE));
-  Expect.equals(CONFLICTING, NON_PRIMITIVE2.intersection(STRING));
-  Expect.equals(CONFLICTING, NON_PRIMITIVE2.intersection(READABLE_ARRAY));
-  Expect.equals(CONFLICTING, NON_PRIMITIVE2.intersection(MUTABLE_ARRAY));
-  Expect.equals(CONFLICTING, NON_PRIMITIVE2.intersection(EXTENDABLE_ARRAY));
-  Expect.equals(CONFLICTING, NON_PRIMITIVE2.intersection(NON_PRIMITIVE1));
-  Expect.equals(NON_PRIMITIVE2, NON_PRIMITIVE2.intersection(NON_PRIMITIVE2));
-  Expect.equals(CONFLICTING, NON_PRIMITIVE2.intersection(POTENTIAL_ARRAY));
-  Expect.equals(CONFLICTING, NON_PRIMITIVE2.intersection(POTENTIAL_STRING));
-  Expect.equals(CONFLICTING, NON_PRIMITIVE2.intersection(BOOLEAN_OR_NULL));
-  Expect.equals(CONFLICTING, NON_PRIMITIVE2.intersection(NUMBER_OR_NULL));
-  Expect.equals(CONFLICTING, NON_PRIMITIVE2.intersection(INTEGER_OR_NULL));
-  Expect.equals(CONFLICTING, NON_PRIMITIVE2.intersection(DOUBLE_OR_NULL));
-  Expect.equals(CONFLICTING, NON_PRIMITIVE2.intersection(STRING_OR_NULL));
-  Expect.equals(CONFLICTING, NON_PRIMITIVE2.intersection(NULL));
-  Expect.equals(CONFLICTING, NON_PRIMITIVE2.intersection(FIXED_ARRAY));
+  Expect.equals(CONFLICTING, 
+                nonPrimitive2.intersection(CONFLICTING, compiler));
+  Expect.equals(nonPrimitive2, 
+                nonPrimitive2.intersection(UNKNOWN, compiler));
+  Expect.equals(CONFLICTING, 
+                nonPrimitive2.intersection(BOOLEAN, compiler));
+  Expect.equals(CONFLICTING, 
+                nonPrimitive2.intersection(NUMBER, compiler));
+  Expect.equals(CONFLICTING, 
+                nonPrimitive2.intersection(INTEGER, compiler));
+  Expect.equals(CONFLICTING, 
+                nonPrimitive2.intersection(DOUBLE, compiler));
+  Expect.equals(CONFLICTING, 
+                nonPrimitive2.intersection(INDEXABLE_PRIMITIVE, compiler));
+  Expect.equals(CONFLICTING, 
+                nonPrimitive2.intersection(STRING, compiler));
+  Expect.equals(CONFLICTING, 
+                nonPrimitive2.intersection(READABLE_ARRAY, compiler));
+  Expect.equals(CONFLICTING, 
+                nonPrimitive2.intersection(MUTABLE_ARRAY, compiler));
+  Expect.equals(CONFLICTING, 
+                nonPrimitive2.intersection(EXTENDABLE_ARRAY, compiler));
+  Expect.equals(CONFLICTING, 
+                nonPrimitive2.intersection(nonPrimitive1, compiler));
+  Expect.equals(nonPrimitive2, 
+                nonPrimitive2.intersection(nonPrimitive2, compiler));
+  Expect.equals(CONFLICTING, 
+                nonPrimitive2.intersection(potentialArray, compiler));
+  Expect.equals(CONFLICTING, 
+                nonPrimitive2.intersection(potentialString, compiler));
+  Expect.equals(CONFLICTING, 
+                nonPrimitive2.intersection(BOOLEAN_OR_NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                nonPrimitive2.intersection(NUMBER_OR_NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                nonPrimitive2.intersection(INTEGER_OR_NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                nonPrimitive2.intersection(DOUBLE_OR_NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                nonPrimitive2.intersection(STRING_OR_NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                nonPrimitive2.intersection(NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                nonPrimitive2.intersection(FIXED_ARRAY, compiler));
 
-  Expect.equals(CONFLICTING, POTENTIAL_ARRAY.intersection(CONFLICTING));
-  Expect.equals(POTENTIAL_ARRAY, POTENTIAL_ARRAY.intersection(UNKNOWN));
-  Expect.equals(CONFLICTING, POTENTIAL_ARRAY.intersection(BOOLEAN));
-  Expect.equals(CONFLICTING, POTENTIAL_ARRAY.intersection(NUMBER));
-  Expect.equals(CONFLICTING, POTENTIAL_ARRAY.intersection(INTEGER));
-  Expect.equals(CONFLICTING, POTENTIAL_ARRAY.intersection(DOUBLE));
-  Expect.equals(READABLE_ARRAY, POTENTIAL_ARRAY.intersection(INDEXABLE_PRIMITIVE));
-  Expect.equals(CONFLICTING, POTENTIAL_ARRAY.intersection(STRING));
-  Expect.equals(READABLE_ARRAY, POTENTIAL_ARRAY.intersection(READABLE_ARRAY));
-  Expect.equals(MUTABLE_ARRAY, POTENTIAL_ARRAY.intersection(MUTABLE_ARRAY));
-  Expect.equals(EXTENDABLE_ARRAY, POTENTIAL_ARRAY.intersection(EXTENDABLE_ARRAY));
-  Expect.equals(CONFLICTING, POTENTIAL_ARRAY.intersection(NON_PRIMITIVE1));
-  Expect.equals(CONFLICTING, POTENTIAL_ARRAY.intersection(NON_PRIMITIVE2));
-  Expect.equals(POTENTIAL_ARRAY, POTENTIAL_ARRAY.intersection(POTENTIAL_ARRAY));
-  Expect.equals(NULL, POTENTIAL_ARRAY.intersection(POTENTIAL_STRING));
-  Expect.equals(NULL, POTENTIAL_ARRAY.intersection(BOOLEAN_OR_NULL));
-  Expect.equals(NULL, POTENTIAL_ARRAY.intersection(NUMBER_OR_NULL));
-  Expect.equals(NULL, POTENTIAL_ARRAY.intersection(INTEGER_OR_NULL));
-  Expect.equals(NULL, POTENTIAL_ARRAY.intersection(DOUBLE_OR_NULL));
-  Expect.equals(NULL, POTENTIAL_ARRAY.intersection(STRING_OR_NULL));
-  Expect.equals(NULL, POTENTIAL_ARRAY.intersection(NULL));
-  Expect.equals(FIXED_ARRAY, POTENTIAL_ARRAY.intersection(FIXED_ARRAY));
+  Expect.equals(CONFLICTING, 
+                potentialArray.intersection(CONFLICTING, compiler));
+  Expect.equals(potentialArray, 
+                potentialArray.intersection(UNKNOWN, compiler));
+  Expect.equals(CONFLICTING, 
+                potentialArray.intersection(BOOLEAN, compiler));
+  Expect.equals(CONFLICTING, 
+                potentialArray.intersection(NUMBER, compiler));
+  Expect.equals(CONFLICTING, 
+                potentialArray.intersection(INTEGER, compiler));
+  Expect.equals(CONFLICTING, 
+                potentialArray.intersection(DOUBLE, compiler));
+  Expect.equals(READABLE_ARRAY, 
+                potentialArray.intersection(INDEXABLE_PRIMITIVE, compiler));
+  Expect.equals(CONFLICTING, 
+                potentialArray.intersection(STRING, compiler));
+  Expect.equals(READABLE_ARRAY, 
+                potentialArray.intersection(READABLE_ARRAY, compiler));
+  Expect.equals(MUTABLE_ARRAY, 
+                potentialArray.intersection(MUTABLE_ARRAY, compiler));
+  Expect.equals(EXTENDABLE_ARRAY, 
+                potentialArray.intersection(EXTENDABLE_ARRAY, compiler));
+  Expect.equals(CONFLICTING, 
+                potentialArray.intersection(nonPrimitive1, compiler));
+  Expect.equals(CONFLICTING, 
+                potentialArray.intersection(nonPrimitive2, compiler));
+  Expect.equals(potentialArray, 
+                potentialArray.intersection(potentialArray, compiler));
+  Expect.equals(NULL, 
+                potentialArray.intersection(potentialString, compiler));
+  Expect.equals(NULL, 
+                potentialArray.intersection(BOOLEAN_OR_NULL, compiler));
+  Expect.equals(NULL, 
+                potentialArray.intersection(NUMBER_OR_NULL, compiler));
+  Expect.equals(NULL, 
+                potentialArray.intersection(INTEGER_OR_NULL, compiler));
+  Expect.equals(NULL, 
+                potentialArray.intersection(DOUBLE_OR_NULL, compiler));
+  Expect.equals(NULL, 
+                potentialArray.intersection(STRING_OR_NULL, compiler));
+  Expect.equals(NULL, 
+                potentialArray.intersection(NULL, compiler));
+  Expect.equals(FIXED_ARRAY, 
+                potentialArray.intersection(FIXED_ARRAY, compiler));
 
-  Expect.equals(CONFLICTING, POTENTIAL_STRING.intersection(CONFLICTING));
-  Expect.equals(POTENTIAL_STRING, POTENTIAL_STRING.intersection(UNKNOWN));
-  Expect.equals(CONFLICTING, POTENTIAL_STRING.intersection(BOOLEAN));
-  Expect.equals(CONFLICTING, POTENTIAL_STRING.intersection(NUMBER));
-  Expect.equals(CONFLICTING, POTENTIAL_STRING.intersection(INTEGER));
-  Expect.equals(CONFLICTING, POTENTIAL_STRING.intersection(DOUBLE));
-  Expect.equals(STRING, POTENTIAL_STRING.intersection(INDEXABLE_PRIMITIVE));
-  Expect.equals(STRING, POTENTIAL_STRING.intersection(STRING));
-  Expect.equals(CONFLICTING, POTENTIAL_STRING.intersection(READABLE_ARRAY));
-  Expect.equals(CONFLICTING, POTENTIAL_STRING.intersection(MUTABLE_ARRAY));
-  Expect.equals(CONFLICTING, POTENTIAL_STRING.intersection(EXTENDABLE_ARRAY));
-  Expect.equals(CONFLICTING, POTENTIAL_STRING.intersection(NON_PRIMITIVE1));
-  Expect.equals(CONFLICTING, POTENTIAL_STRING.intersection(NON_PRIMITIVE2));
-  Expect.equals(NULL, POTENTIAL_STRING.intersection(POTENTIAL_ARRAY));
-  Expect.equals(POTENTIAL_STRING, POTENTIAL_STRING.intersection(POTENTIAL_STRING));
-  Expect.equals(NULL, POTENTIAL_STRING.intersection(BOOLEAN_OR_NULL));
-  Expect.equals(NULL, POTENTIAL_STRING.intersection(NUMBER_OR_NULL));
-  Expect.equals(NULL, POTENTIAL_STRING.intersection(INTEGER_OR_NULL));
-  Expect.equals(NULL, POTENTIAL_STRING.intersection(DOUBLE_OR_NULL));
-  Expect.equals(STRING_OR_NULL, POTENTIAL_STRING.intersection(STRING_OR_NULL));
-  Expect.equals(NULL, POTENTIAL_STRING.intersection(NULL));
-  Expect.equals(CONFLICTING, POTENTIAL_STRING.intersection(FIXED_ARRAY));
+  Expect.equals(CONFLICTING, 
+                potentialString.intersection(CONFLICTING, compiler));
+  Expect.equals(potentialString, 
+                potentialString.intersection(UNKNOWN, compiler));
+  Expect.equals(CONFLICTING, 
+                potentialString.intersection(BOOLEAN, compiler));
+  Expect.equals(CONFLICTING, 
+                potentialString.intersection(NUMBER, compiler));
+  Expect.equals(CONFLICTING, 
+                potentialString.intersection(INTEGER, compiler));
+  Expect.equals(CONFLICTING, 
+                potentialString.intersection(DOUBLE, compiler));
+  Expect.equals(STRING, 
+                potentialString.intersection(INDEXABLE_PRIMITIVE, compiler));
+  Expect.equals(STRING, 
+                potentialString.intersection(STRING, compiler));
+  Expect.equals(CONFLICTING, 
+                potentialString.intersection(READABLE_ARRAY, compiler));
+  Expect.equals(CONFLICTING, 
+                potentialString.intersection(MUTABLE_ARRAY, compiler));
+  Expect.equals(CONFLICTING, 
+                potentialString.intersection(EXTENDABLE_ARRAY, compiler));
+  Expect.equals(CONFLICTING, 
+                potentialString.intersection(nonPrimitive1, compiler));
+  Expect.equals(CONFLICTING, 
+                potentialString.intersection(nonPrimitive2, compiler));
+  Expect.equals(NULL, 
+                potentialString.intersection(potentialArray, compiler));
+  Expect.equals(potentialString, 
+                potentialString.intersection(potentialString, compiler));
+  Expect.equals(NULL, 
+                potentialString.intersection(BOOLEAN_OR_NULL, compiler));
+  Expect.equals(NULL, 
+                potentialString.intersection(NUMBER_OR_NULL, compiler));
+  Expect.equals(NULL, 
+                potentialString.intersection(INTEGER_OR_NULL, compiler));
+  Expect.equals(NULL, 
+                potentialString.intersection(DOUBLE_OR_NULL, compiler));
+  Expect.equals(STRING_OR_NULL, 
+                potentialString.intersection(STRING_OR_NULL, compiler));
+  Expect.equals(NULL, 
+                potentialString.intersection(NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                potentialString.intersection(FIXED_ARRAY, compiler));
 
-  Expect.equals(CONFLICTING, BOOLEAN_OR_NULL.intersection(CONFLICTING));
-  Expect.equals(BOOLEAN_OR_NULL, BOOLEAN_OR_NULL.intersection(UNKNOWN));
-  Expect.equals(BOOLEAN, BOOLEAN_OR_NULL.intersection(BOOLEAN));
-  Expect.equals(CONFLICTING, BOOLEAN_OR_NULL.intersection(NUMBER));
-  Expect.equals(CONFLICTING, BOOLEAN_OR_NULL.intersection(INTEGER));
-  Expect.equals(CONFLICTING, BOOLEAN_OR_NULL.intersection(DOUBLE));
-  Expect.equals(CONFLICTING, BOOLEAN_OR_NULL.intersection(INDEXABLE_PRIMITIVE));
-  Expect.equals(CONFLICTING, BOOLEAN_OR_NULL.intersection(STRING));
-  Expect.equals(CONFLICTING, BOOLEAN_OR_NULL.intersection(READABLE_ARRAY));
-  Expect.equals(CONFLICTING, BOOLEAN_OR_NULL.intersection(MUTABLE_ARRAY));
-  Expect.equals(CONFLICTING, BOOLEAN_OR_NULL.intersection(EXTENDABLE_ARRAY));
-  Expect.equals(CONFLICTING, BOOLEAN_OR_NULL.intersection(NON_PRIMITIVE1));
-  Expect.equals(CONFLICTING, BOOLEAN_OR_NULL.intersection(NON_PRIMITIVE2));
-  Expect.equals(NULL, BOOLEAN_OR_NULL.intersection(POTENTIAL_ARRAY));
-  Expect.equals(NULL, BOOLEAN_OR_NULL.intersection(POTENTIAL_STRING));
-  Expect.equals(BOOLEAN_OR_NULL, BOOLEAN_OR_NULL.intersection(BOOLEAN_OR_NULL));
-  Expect.equals(NULL, BOOLEAN_OR_NULL.intersection(NUMBER_OR_NULL));
-  Expect.equals(NULL, BOOLEAN_OR_NULL.intersection(INTEGER_OR_NULL));
-  Expect.equals(NULL, BOOLEAN_OR_NULL.intersection(DOUBLE_OR_NULL));
-  Expect.equals(NULL, BOOLEAN_OR_NULL.intersection(STRING_OR_NULL));
-  Expect.equals(NULL, BOOLEAN_OR_NULL.intersection(NULL));
-  Expect.equals(CONFLICTING, BOOLEAN_OR_NULL.intersection(FIXED_ARRAY));
+  Expect.equals(CONFLICTING, 
+                BOOLEAN_OR_NULL.intersection(CONFLICTING, compiler));
+  Expect.equals(BOOLEAN_OR_NULL, 
+                BOOLEAN_OR_NULL.intersection(UNKNOWN, compiler));
+  Expect.equals(BOOLEAN, 
+                BOOLEAN_OR_NULL.intersection(BOOLEAN, compiler));
+  Expect.equals(CONFLICTING, 
+                BOOLEAN_OR_NULL.intersection(NUMBER, compiler));
+  Expect.equals(CONFLICTING, 
+                BOOLEAN_OR_NULL.intersection(INTEGER, compiler));
+  Expect.equals(CONFLICTING, 
+                BOOLEAN_OR_NULL.intersection(DOUBLE, compiler));
+  Expect.equals(CONFLICTING, 
+                BOOLEAN_OR_NULL.intersection(INDEXABLE_PRIMITIVE, compiler));
+  Expect.equals(CONFLICTING, 
+                BOOLEAN_OR_NULL.intersection(STRING, compiler));
+  Expect.equals(CONFLICTING, 
+                BOOLEAN_OR_NULL.intersection(READABLE_ARRAY, compiler));
+  Expect.equals(CONFLICTING, 
+                BOOLEAN_OR_NULL.intersection(MUTABLE_ARRAY, compiler));
+  Expect.equals(CONFLICTING, 
+                BOOLEAN_OR_NULL.intersection(EXTENDABLE_ARRAY, compiler));
+  Expect.equals(CONFLICTING, 
+                BOOLEAN_OR_NULL.intersection(nonPrimitive1, compiler));
+  Expect.equals(CONFLICTING, 
+                BOOLEAN_OR_NULL.intersection(nonPrimitive2, compiler));
+  Expect.equals(NULL, 
+                BOOLEAN_OR_NULL.intersection(potentialArray, compiler));
+  Expect.equals(NULL, 
+                BOOLEAN_OR_NULL.intersection(potentialString, compiler));
+  Expect.equals(BOOLEAN_OR_NULL, 
+                BOOLEAN_OR_NULL.intersection(BOOLEAN_OR_NULL, compiler));
+  Expect.equals(NULL, 
+                BOOLEAN_OR_NULL.intersection(NUMBER_OR_NULL, compiler));
+  Expect.equals(NULL, 
+                BOOLEAN_OR_NULL.intersection(INTEGER_OR_NULL, compiler));
+  Expect.equals(NULL, 
+                BOOLEAN_OR_NULL.intersection(DOUBLE_OR_NULL, compiler));
+  Expect.equals(NULL, 
+                BOOLEAN_OR_NULL.intersection(STRING_OR_NULL, compiler));
+  Expect.equals(NULL, 
+                BOOLEAN_OR_NULL.intersection(NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                BOOLEAN_OR_NULL.intersection(FIXED_ARRAY, compiler));
 
-  Expect.equals(CONFLICTING, NUMBER_OR_NULL.intersection(CONFLICTING));
-  Expect.equals(NUMBER_OR_NULL, NUMBER_OR_NULL.intersection(UNKNOWN));
-  Expect.equals(CONFLICTING, NUMBER_OR_NULL.intersection(BOOLEAN));
-  Expect.equals(NUMBER, NUMBER_OR_NULL.intersection(NUMBER));
-  Expect.equals(INTEGER, NUMBER_OR_NULL.intersection(INTEGER));
-  Expect.equals(DOUBLE, NUMBER_OR_NULL.intersection(DOUBLE));
-  Expect.equals(CONFLICTING, NUMBER_OR_NULL.intersection(INDEXABLE_PRIMITIVE));
-  Expect.equals(CONFLICTING, NUMBER_OR_NULL.intersection(STRING));
-  Expect.equals(CONFLICTING, NUMBER_OR_NULL.intersection(READABLE_ARRAY));
-  Expect.equals(CONFLICTING, NUMBER_OR_NULL.intersection(MUTABLE_ARRAY));
-  Expect.equals(CONFLICTING, NUMBER_OR_NULL.intersection(EXTENDABLE_ARRAY));
-  Expect.equals(CONFLICTING, NUMBER_OR_NULL.intersection(NON_PRIMITIVE1));
-  Expect.equals(CONFLICTING, NUMBER_OR_NULL.intersection(NON_PRIMITIVE2));
-  Expect.equals(NULL, NUMBER_OR_NULL.intersection(POTENTIAL_ARRAY));
-  Expect.equals(NULL, NUMBER_OR_NULL.intersection(POTENTIAL_STRING));
-  Expect.equals(NULL, NUMBER_OR_NULL.intersection(BOOLEAN_OR_NULL));
-  Expect.equals(NUMBER_OR_NULL, NUMBER_OR_NULL.intersection(NUMBER_OR_NULL));
-  Expect.equals(INTEGER_OR_NULL, NUMBER_OR_NULL.intersection(INTEGER_OR_NULL));
-  Expect.equals(DOUBLE_OR_NULL, NUMBER_OR_NULL.intersection(DOUBLE_OR_NULL));
-  Expect.equals(NULL, NUMBER_OR_NULL.intersection(STRING_OR_NULL));
-  Expect.equals(NULL, NUMBER_OR_NULL.intersection(NULL));
-  Expect.equals(CONFLICTING, NUMBER_OR_NULL.intersection(FIXED_ARRAY));
+  Expect.equals(CONFLICTING, 
+                NUMBER_OR_NULL.intersection(CONFLICTING, compiler));
+  Expect.equals(NUMBER_OR_NULL, 
+                NUMBER_OR_NULL.intersection(UNKNOWN, compiler));
+  Expect.equals(CONFLICTING, 
+                NUMBER_OR_NULL.intersection(BOOLEAN, compiler));
+  Expect.equals(NUMBER, 
+                NUMBER_OR_NULL.intersection(NUMBER, compiler));
+  Expect.equals(INTEGER, 
+                NUMBER_OR_NULL.intersection(INTEGER, compiler));
+  Expect.equals(DOUBLE, 
+                NUMBER_OR_NULL.intersection(DOUBLE, compiler));
+  Expect.equals(CONFLICTING, 
+                NUMBER_OR_NULL.intersection(INDEXABLE_PRIMITIVE, compiler));
+  Expect.equals(CONFLICTING, 
+                NUMBER_OR_NULL.intersection(STRING, compiler));
+  Expect.equals(CONFLICTING, 
+                NUMBER_OR_NULL.intersection(READABLE_ARRAY, compiler));
+  Expect.equals(CONFLICTING, 
+                NUMBER_OR_NULL.intersection(MUTABLE_ARRAY, compiler));
+  Expect.equals(CONFLICTING, 
+                NUMBER_OR_NULL.intersection(EXTENDABLE_ARRAY, compiler));
+  Expect.equals(CONFLICTING, 
+                NUMBER_OR_NULL.intersection(nonPrimitive1, compiler));
+  Expect.equals(CONFLICTING, 
+                NUMBER_OR_NULL.intersection(nonPrimitive2, compiler));
+  Expect.equals(NULL, 
+                NUMBER_OR_NULL.intersection(potentialArray, compiler));
+  Expect.equals(NULL, 
+                NUMBER_OR_NULL.intersection(potentialString, compiler));
+  Expect.equals(NULL, 
+                NUMBER_OR_NULL.intersection(BOOLEAN_OR_NULL, compiler));
+  Expect.equals(NUMBER_OR_NULL, 
+                NUMBER_OR_NULL.intersection(NUMBER_OR_NULL, compiler));
+  Expect.equals(INTEGER_OR_NULL, 
+                NUMBER_OR_NULL.intersection(INTEGER_OR_NULL, compiler));
+  Expect.equals(DOUBLE_OR_NULL, 
+                NUMBER_OR_NULL.intersection(DOUBLE_OR_NULL, compiler));
+  Expect.equals(NULL, 
+                NUMBER_OR_NULL.intersection(STRING_OR_NULL, compiler));
+  Expect.equals(NULL, 
+                NUMBER_OR_NULL.intersection(NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                NUMBER_OR_NULL.intersection(FIXED_ARRAY, compiler));
 
-  Expect.equals(CONFLICTING, INTEGER_OR_NULL.intersection(CONFLICTING));
-  Expect.equals(INTEGER_OR_NULL, INTEGER_OR_NULL.intersection(UNKNOWN));
-  Expect.equals(CONFLICTING, INTEGER_OR_NULL.intersection(BOOLEAN));
-  Expect.equals(INTEGER, INTEGER_OR_NULL.intersection(NUMBER));
-  Expect.equals(INTEGER, INTEGER_OR_NULL.intersection(INTEGER));
-  Expect.equals(CONFLICTING, INTEGER_OR_NULL.intersection(DOUBLE));
-  Expect.equals(CONFLICTING, INTEGER_OR_NULL.intersection(INDEXABLE_PRIMITIVE));
-  Expect.equals(CONFLICTING, INTEGER_OR_NULL.intersection(STRING));
-  Expect.equals(CONFLICTING, INTEGER_OR_NULL.intersection(READABLE_ARRAY));
-  Expect.equals(CONFLICTING, INTEGER_OR_NULL.intersection(MUTABLE_ARRAY));
-  Expect.equals(CONFLICTING, INTEGER_OR_NULL.intersection(EXTENDABLE_ARRAY));
-  Expect.equals(CONFLICTING, INTEGER_OR_NULL.intersection(NON_PRIMITIVE1));
-  Expect.equals(CONFLICTING, INTEGER_OR_NULL.intersection(NON_PRIMITIVE2));
-  Expect.equals(NULL, INTEGER_OR_NULL.intersection(POTENTIAL_ARRAY));
-  Expect.equals(NULL, INTEGER_OR_NULL.intersection(POTENTIAL_STRING));
-  Expect.equals(NULL, INTEGER_OR_NULL.intersection(BOOLEAN_OR_NULL));
-  Expect.equals(INTEGER_OR_NULL, INTEGER_OR_NULL.intersection(NUMBER_OR_NULL));
-  Expect.equals(INTEGER_OR_NULL, INTEGER_OR_NULL.intersection(INTEGER_OR_NULL));
-  Expect.equals(NULL, INTEGER_OR_NULL.intersection(DOUBLE_OR_NULL));
-  Expect.equals(NULL, INTEGER_OR_NULL.intersection(STRING_OR_NULL));
-  Expect.equals(NULL, INTEGER_OR_NULL.intersection(NULL));
-  Expect.equals(CONFLICTING, INTEGER_OR_NULL.intersection(FIXED_ARRAY));
+  Expect.equals(CONFLICTING, 
+                INTEGER_OR_NULL.intersection(CONFLICTING, compiler));
+  Expect.equals(INTEGER_OR_NULL, 
+                INTEGER_OR_NULL.intersection(UNKNOWN, compiler));
+  Expect.equals(CONFLICTING, 
+                INTEGER_OR_NULL.intersection(BOOLEAN, compiler));
+  Expect.equals(INTEGER, 
+                INTEGER_OR_NULL.intersection(NUMBER, compiler));
+  Expect.equals(INTEGER, 
+                INTEGER_OR_NULL.intersection(INTEGER, compiler));
+  Expect.equals(CONFLICTING, 
+                INTEGER_OR_NULL.intersection(DOUBLE, compiler));
+  Expect.equals(CONFLICTING, 
+                INTEGER_OR_NULL.intersection(INDEXABLE_PRIMITIVE, compiler));
+  Expect.equals(CONFLICTING, 
+                INTEGER_OR_NULL.intersection(STRING, compiler));
+  Expect.equals(CONFLICTING, 
+                INTEGER_OR_NULL.intersection(READABLE_ARRAY, compiler));
+  Expect.equals(CONFLICTING, 
+                INTEGER_OR_NULL.intersection(MUTABLE_ARRAY, compiler));
+  Expect.equals(CONFLICTING, 
+                INTEGER_OR_NULL.intersection(EXTENDABLE_ARRAY, compiler));
+  Expect.equals(CONFLICTING, 
+                INTEGER_OR_NULL.intersection(nonPrimitive1, compiler));
+  Expect.equals(CONFLICTING, 
+                INTEGER_OR_NULL.intersection(nonPrimitive2, compiler));
+  Expect.equals(NULL, 
+                INTEGER_OR_NULL.intersection(potentialArray, compiler));
+  Expect.equals(NULL, 
+                INTEGER_OR_NULL.intersection(potentialString, compiler));
+  Expect.equals(NULL, 
+                INTEGER_OR_NULL.intersection(BOOLEAN_OR_NULL, compiler));
+  Expect.equals(INTEGER_OR_NULL, 
+                INTEGER_OR_NULL.intersection(NUMBER_OR_NULL, compiler));
+  Expect.equals(INTEGER_OR_NULL, 
+                INTEGER_OR_NULL.intersection(INTEGER_OR_NULL, compiler));
+  Expect.equals(NULL, 
+                INTEGER_OR_NULL.intersection(DOUBLE_OR_NULL, compiler));
+  Expect.equals(NULL, 
+                INTEGER_OR_NULL.intersection(STRING_OR_NULL, compiler));
+  Expect.equals(NULL, 
+                INTEGER_OR_NULL.intersection(NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                INTEGER_OR_NULL.intersection(FIXED_ARRAY, compiler));
 
-  Expect.equals(CONFLICTING, DOUBLE_OR_NULL.intersection(CONFLICTING));
-  Expect.equals(DOUBLE_OR_NULL, DOUBLE_OR_NULL.intersection(UNKNOWN));
-  Expect.equals(CONFLICTING, DOUBLE_OR_NULL.intersection(BOOLEAN));
-  Expect.equals(DOUBLE, DOUBLE_OR_NULL.intersection(NUMBER));
-  Expect.equals(CONFLICTING, DOUBLE_OR_NULL.intersection(INTEGER));
-  Expect.equals(DOUBLE, DOUBLE_OR_NULL.intersection(DOUBLE));
-  Expect.equals(CONFLICTING, DOUBLE_OR_NULL.intersection(INDEXABLE_PRIMITIVE));
-  Expect.equals(CONFLICTING, DOUBLE_OR_NULL.intersection(STRING));
-  Expect.equals(CONFLICTING, DOUBLE_OR_NULL.intersection(READABLE_ARRAY));
-  Expect.equals(CONFLICTING, DOUBLE_OR_NULL.intersection(MUTABLE_ARRAY));
-  Expect.equals(CONFLICTING, DOUBLE_OR_NULL.intersection(EXTENDABLE_ARRAY));
-  Expect.equals(CONFLICTING, DOUBLE_OR_NULL.intersection(NON_PRIMITIVE1));
-  Expect.equals(CONFLICTING, DOUBLE_OR_NULL.intersection(NON_PRIMITIVE2));
-  Expect.equals(NULL, DOUBLE_OR_NULL.intersection(POTENTIAL_ARRAY));
-  Expect.equals(NULL, DOUBLE_OR_NULL.intersection(POTENTIAL_STRING));
-  Expect.equals(NULL, DOUBLE_OR_NULL.intersection(BOOLEAN_OR_NULL));
-  Expect.equals(DOUBLE_OR_NULL, DOUBLE_OR_NULL.intersection(NUMBER_OR_NULL));
-  Expect.equals(NULL, DOUBLE_OR_NULL.intersection(INTEGER_OR_NULL));
-  Expect.equals(DOUBLE_OR_NULL, DOUBLE_OR_NULL.intersection(DOUBLE_OR_NULL));
-  Expect.equals(NULL, DOUBLE_OR_NULL.intersection(STRING_OR_NULL));
-  Expect.equals(NULL, DOUBLE_OR_NULL.intersection(NULL));
-  Expect.equals(CONFLICTING, DOUBLE_OR_NULL.intersection(FIXED_ARRAY));
+  Expect.equals(CONFLICTING, 
+                DOUBLE_OR_NULL.intersection(CONFLICTING, compiler));
+  Expect.equals(DOUBLE_OR_NULL, 
+                DOUBLE_OR_NULL.intersection(UNKNOWN, compiler));
+  Expect.equals(CONFLICTING, 
+                DOUBLE_OR_NULL.intersection(BOOLEAN, compiler));
+  Expect.equals(DOUBLE, 
+                DOUBLE_OR_NULL.intersection(NUMBER, compiler));
+  Expect.equals(CONFLICTING, 
+                DOUBLE_OR_NULL.intersection(INTEGER, compiler));
+  Expect.equals(DOUBLE, 
+                DOUBLE_OR_NULL.intersection(DOUBLE, compiler));
+  Expect.equals(CONFLICTING, 
+                DOUBLE_OR_NULL.intersection(INDEXABLE_PRIMITIVE, compiler));
+  Expect.equals(CONFLICTING, 
+                DOUBLE_OR_NULL.intersection(STRING, compiler));
+  Expect.equals(CONFLICTING, 
+                DOUBLE_OR_NULL.intersection(READABLE_ARRAY, compiler));
+  Expect.equals(CONFLICTING, 
+                DOUBLE_OR_NULL.intersection(MUTABLE_ARRAY, compiler));
+  Expect.equals(CONFLICTING, 
+                DOUBLE_OR_NULL.intersection(EXTENDABLE_ARRAY, compiler));
+  Expect.equals(CONFLICTING, 
+                DOUBLE_OR_NULL.intersection(nonPrimitive1, compiler));
+  Expect.equals(CONFLICTING, 
+                DOUBLE_OR_NULL.intersection(nonPrimitive2, compiler));
+  Expect.equals(NULL, 
+                DOUBLE_OR_NULL.intersection(potentialArray, compiler));
+  Expect.equals(NULL, 
+                DOUBLE_OR_NULL.intersection(potentialString, compiler));
+  Expect.equals(NULL, 
+                DOUBLE_OR_NULL.intersection(BOOLEAN_OR_NULL, compiler));
+  Expect.equals(DOUBLE_OR_NULL, 
+                DOUBLE_OR_NULL.intersection(NUMBER_OR_NULL, compiler));
+  Expect.equals(NULL, 
+                DOUBLE_OR_NULL.intersection(INTEGER_OR_NULL, compiler));
+  Expect.equals(DOUBLE_OR_NULL, 
+                DOUBLE_OR_NULL.intersection(DOUBLE_OR_NULL, compiler));
+  Expect.equals(NULL, 
+                DOUBLE_OR_NULL.intersection(STRING_OR_NULL, compiler));
+  Expect.equals(NULL, 
+                DOUBLE_OR_NULL.intersection(NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                DOUBLE_OR_NULL.intersection(FIXED_ARRAY, compiler));
 
-  Expect.equals(CONFLICTING, STRING_OR_NULL.intersection(CONFLICTING));
-  Expect.equals(STRING_OR_NULL, STRING_OR_NULL.intersection(UNKNOWN));
-  Expect.equals(CONFLICTING, STRING_OR_NULL.intersection(BOOLEAN));
-  Expect.equals(CONFLICTING, STRING_OR_NULL.intersection(NUMBER));
-  Expect.equals(CONFLICTING, STRING_OR_NULL.intersection(INTEGER));
-  Expect.equals(CONFLICTING, STRING_OR_NULL.intersection(DOUBLE));
-  Expect.equals(STRING, STRING_OR_NULL.intersection(INDEXABLE_PRIMITIVE));
-  Expect.equals(STRING, STRING_OR_NULL.intersection(STRING));
-  Expect.equals(CONFLICTING, STRING_OR_NULL.intersection(READABLE_ARRAY));
-  Expect.equals(CONFLICTING, STRING_OR_NULL.intersection(MUTABLE_ARRAY));
-  Expect.equals(CONFLICTING, STRING_OR_NULL.intersection(EXTENDABLE_ARRAY));
-  Expect.equals(CONFLICTING, STRING_OR_NULL.intersection(NON_PRIMITIVE1));
-  Expect.equals(CONFLICTING, STRING_OR_NULL.intersection(NON_PRIMITIVE2));
-  Expect.equals(NULL, STRING_OR_NULL.intersection(POTENTIAL_ARRAY));
-  Expect.equals(STRING_OR_NULL, STRING_OR_NULL.intersection(POTENTIAL_STRING));
-  Expect.equals(NULL, STRING_OR_NULL.intersection(BOOLEAN_OR_NULL));
-  Expect.equals(NULL, STRING_OR_NULL.intersection(NUMBER_OR_NULL));
-  Expect.equals(NULL, STRING_OR_NULL.intersection(INTEGER_OR_NULL));
-  Expect.equals(NULL, STRING_OR_NULL.intersection(DOUBLE_OR_NULL));
-  Expect.equals(STRING_OR_NULL, STRING_OR_NULL.intersection(STRING_OR_NULL));
-  Expect.equals(NULL, STRING_OR_NULL.intersection(NULL));
-  Expect.equals(CONFLICTING, STRING_OR_NULL.intersection(FIXED_ARRAY));
+  Expect.equals(CONFLICTING, 
+                STRING_OR_NULL.intersection(CONFLICTING, compiler));
+  Expect.equals(STRING_OR_NULL, 
+                STRING_OR_NULL.intersection(UNKNOWN, compiler));
+  Expect.equals(CONFLICTING, 
+                STRING_OR_NULL.intersection(BOOLEAN, compiler));
+  Expect.equals(CONFLICTING, 
+                STRING_OR_NULL.intersection(NUMBER, compiler));
+  Expect.equals(CONFLICTING, 
+                STRING_OR_NULL.intersection(INTEGER, compiler));
+  Expect.equals(CONFLICTING, 
+                STRING_OR_NULL.intersection(DOUBLE, compiler));
+  Expect.equals(STRING, 
+                STRING_OR_NULL.intersection(INDEXABLE_PRIMITIVE, compiler));
+  Expect.equals(STRING, 
+                STRING_OR_NULL.intersection(STRING, compiler));
+  Expect.equals(CONFLICTING, 
+                STRING_OR_NULL.intersection(READABLE_ARRAY, compiler));
+  Expect.equals(CONFLICTING, 
+                STRING_OR_NULL.intersection(MUTABLE_ARRAY, compiler));
+  Expect.equals(CONFLICTING, 
+                STRING_OR_NULL.intersection(EXTENDABLE_ARRAY, compiler));
+  Expect.equals(CONFLICTING, 
+                STRING_OR_NULL.intersection(nonPrimitive1, compiler));
+  Expect.equals(CONFLICTING, 
+                STRING_OR_NULL.intersection(nonPrimitive2, compiler));
+  Expect.equals(NULL, 
+                STRING_OR_NULL.intersection(potentialArray, compiler));
+  Expect.equals(STRING_OR_NULL, 
+                STRING_OR_NULL.intersection(potentialString, compiler));
+  Expect.equals(NULL, 
+                STRING_OR_NULL.intersection(BOOLEAN_OR_NULL, compiler));
+  Expect.equals(NULL, 
+                STRING_OR_NULL.intersection(NUMBER_OR_NULL, compiler));
+  Expect.equals(NULL, 
+                STRING_OR_NULL.intersection(INTEGER_OR_NULL, compiler));
+  Expect.equals(NULL, 
+                STRING_OR_NULL.intersection(DOUBLE_OR_NULL, compiler));
+  Expect.equals(STRING_OR_NULL, 
+                STRING_OR_NULL.intersection(STRING_OR_NULL, compiler));
+  Expect.equals(NULL, 
+                STRING_OR_NULL.intersection(NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                STRING_OR_NULL.intersection(FIXED_ARRAY, compiler));
 
-  Expect.equals(CONFLICTING, NULL.intersection(CONFLICTING));
-  Expect.equals(NULL, NULL.intersection(UNKNOWN));
-  Expect.equals(CONFLICTING, NULL.intersection(BOOLEAN));
-  Expect.equals(CONFLICTING, NULL.intersection(NUMBER));
-  Expect.equals(CONFLICTING, NULL.intersection(INTEGER));
-  Expect.equals(CONFLICTING, NULL.intersection(DOUBLE));
-  Expect.equals(CONFLICTING, NULL.intersection(INDEXABLE_PRIMITIVE));
-  Expect.equals(CONFLICTING, NULL.intersection(STRING));
-  Expect.equals(CONFLICTING, NULL.intersection(READABLE_ARRAY));
-  Expect.equals(CONFLICTING, NULL.intersection(MUTABLE_ARRAY));
-  Expect.equals(CONFLICTING, NULL.intersection(EXTENDABLE_ARRAY));
-  Expect.equals(CONFLICTING, NULL.intersection(NON_PRIMITIVE1));
-  Expect.equals(CONFLICTING, NULL.intersection(NON_PRIMITIVE2));
-  Expect.equals(NULL, NULL.intersection(POTENTIAL_ARRAY));
-  Expect.equals(NULL, NULL.intersection(POTENTIAL_STRING));
-  Expect.equals(NULL, NULL.intersection(BOOLEAN_OR_NULL));
-  Expect.equals(NULL, NULL.intersection(NUMBER_OR_NULL));
-  Expect.equals(NULL, NULL.intersection(INTEGER_OR_NULL));
-  Expect.equals(NULL, NULL.intersection(DOUBLE_OR_NULL));
-  Expect.equals(NULL, NULL.intersection(STRING_OR_NULL));
-  Expect.equals(NULL, NULL.intersection(NULL));
-  Expect.equals(CONFLICTING, NULL.intersection(FIXED_ARRAY));
+  Expect.equals(CONFLICTING, 
+                NULL.intersection(CONFLICTING, compiler));
+  Expect.equals(NULL, 
+                NULL.intersection(UNKNOWN, compiler));
+  Expect.equals(CONFLICTING, 
+                NULL.intersection(BOOLEAN, compiler));
+  Expect.equals(CONFLICTING, 
+                NULL.intersection(NUMBER, compiler));
+  Expect.equals(CONFLICTING, 
+                NULL.intersection(INTEGER, compiler));
+  Expect.equals(CONFLICTING, 
+                NULL.intersection(DOUBLE, compiler));
+  Expect.equals(CONFLICTING, 
+                NULL.intersection(INDEXABLE_PRIMITIVE, compiler));
+  Expect.equals(CONFLICTING, 
+                NULL.intersection(STRING, compiler));
+  Expect.equals(CONFLICTING, 
+                NULL.intersection(READABLE_ARRAY, compiler));
+  Expect.equals(CONFLICTING, 
+                NULL.intersection(MUTABLE_ARRAY, compiler));
+  Expect.equals(CONFLICTING, 
+                NULL.intersection(EXTENDABLE_ARRAY, compiler));
+  Expect.equals(CONFLICTING, 
+                NULL.intersection(nonPrimitive1, compiler));
+  Expect.equals(CONFLICTING, 
+                NULL.intersection(nonPrimitive2, compiler));
+  Expect.equals(NULL, 
+                NULL.intersection(potentialArray, compiler));
+  Expect.equals(NULL, 
+                NULL.intersection(potentialString, compiler));
+  Expect.equals(NULL, 
+                NULL.intersection(BOOLEAN_OR_NULL, compiler));
+  Expect.equals(NULL, 
+                NULL.intersection(NUMBER_OR_NULL, compiler));
+  Expect.equals(NULL, 
+                NULL.intersection(INTEGER_OR_NULL, compiler));
+  Expect.equals(NULL, 
+                NULL.intersection(DOUBLE_OR_NULL, compiler));
+  Expect.equals(NULL, 
+                NULL.intersection(STRING_OR_NULL, compiler));
+  Expect.equals(NULL, 
+                NULL.intersection(NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                NULL.intersection(FIXED_ARRAY, compiler));
 
-  Expect.equals(CONFLICTING, FIXED_ARRAY.intersection(CONFLICTING));
-  Expect.equals(FIXED_ARRAY, FIXED_ARRAY.intersection(UNKNOWN));
-  Expect.equals(CONFLICTING, FIXED_ARRAY.intersection(BOOLEAN));
-  Expect.equals(CONFLICTING, FIXED_ARRAY.intersection(NUMBER));
-  Expect.equals(CONFLICTING, FIXED_ARRAY.intersection(INTEGER));
-  Expect.equals(CONFLICTING, FIXED_ARRAY.intersection(DOUBLE));
-  Expect.equals(FIXED_ARRAY, FIXED_ARRAY.intersection(INDEXABLE_PRIMITIVE));
-  Expect.equals(CONFLICTING, FIXED_ARRAY.intersection(STRING));
-  Expect.equals(FIXED_ARRAY, FIXED_ARRAY.intersection(READABLE_ARRAY));
-  Expect.equals(FIXED_ARRAY, FIXED_ARRAY.intersection(MUTABLE_ARRAY));
-  Expect.equals(CONFLICTING, FIXED_ARRAY.intersection(EXTENDABLE_ARRAY));
-  Expect.equals(CONFLICTING, FIXED_ARRAY.intersection(NON_PRIMITIVE1));
-  Expect.equals(CONFLICTING, FIXED_ARRAY.intersection(NON_PRIMITIVE2));
-  Expect.equals(FIXED_ARRAY, FIXED_ARRAY.intersection(POTENTIAL_ARRAY));
-  Expect.equals(CONFLICTING, FIXED_ARRAY.intersection(POTENTIAL_STRING));
-  Expect.equals(CONFLICTING, FIXED_ARRAY.intersection(BOOLEAN_OR_NULL));
-  Expect.equals(CONFLICTING, FIXED_ARRAY.intersection(NUMBER_OR_NULL));
-  Expect.equals(CONFLICTING, FIXED_ARRAY.intersection(INTEGER_OR_NULL));
-  Expect.equals(CONFLICTING, FIXED_ARRAY.intersection(DOUBLE_OR_NULL));
-  Expect.equals(CONFLICTING, FIXED_ARRAY.intersection(STRING_OR_NULL));
-  Expect.equals(CONFLICTING, FIXED_ARRAY.intersection(NULL));
-  Expect.equals(FIXED_ARRAY, FIXED_ARRAY.intersection(FIXED_ARRAY));
+  Expect.equals(CONFLICTING, 
+                FIXED_ARRAY.intersection(CONFLICTING, compiler));
+  Expect.equals(FIXED_ARRAY, 
+                FIXED_ARRAY.intersection(UNKNOWN, compiler));
+  Expect.equals(CONFLICTING, 
+                FIXED_ARRAY.intersection(BOOLEAN, compiler));
+  Expect.equals(CONFLICTING, 
+                FIXED_ARRAY.intersection(NUMBER, compiler));
+  Expect.equals(CONFLICTING, 
+                FIXED_ARRAY.intersection(INTEGER, compiler));
+  Expect.equals(CONFLICTING, 
+                FIXED_ARRAY.intersection(DOUBLE, compiler));
+  Expect.equals(FIXED_ARRAY, 
+                FIXED_ARRAY.intersection(INDEXABLE_PRIMITIVE, compiler));
+  Expect.equals(CONFLICTING, 
+                FIXED_ARRAY.intersection(STRING, compiler));
+  Expect.equals(FIXED_ARRAY, 
+                FIXED_ARRAY.intersection(READABLE_ARRAY, compiler));
+  Expect.equals(FIXED_ARRAY, 
+                FIXED_ARRAY.intersection(MUTABLE_ARRAY, compiler));
+  Expect.equals(CONFLICTING, 
+                FIXED_ARRAY.intersection(EXTENDABLE_ARRAY, compiler));
+  Expect.equals(CONFLICTING, 
+                FIXED_ARRAY.intersection(nonPrimitive1, compiler));
+  Expect.equals(CONFLICTING, 
+                FIXED_ARRAY.intersection(nonPrimitive2, compiler));
+  Expect.equals(FIXED_ARRAY, 
+                FIXED_ARRAY.intersection(potentialArray, compiler));
+  Expect.equals(CONFLICTING, 
+                FIXED_ARRAY.intersection(potentialString, compiler));
+  Expect.equals(CONFLICTING, 
+                FIXED_ARRAY.intersection(BOOLEAN_OR_NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                FIXED_ARRAY.intersection(NUMBER_OR_NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                FIXED_ARRAY.intersection(INTEGER_OR_NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                FIXED_ARRAY.intersection(DOUBLE_OR_NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                FIXED_ARRAY.intersection(STRING_OR_NULL, compiler));
+  Expect.equals(CONFLICTING, 
+                FIXED_ARRAY.intersection(NULL, compiler));
+  Expect.equals(FIXED_ARRAY, 
+                FIXED_ARRAY.intersection(FIXED_ARRAY, compiler));
 }
 
 void main() {
-  testUnion();
-  testIntersection();
+  MockCompiler compiler = new MockCompiler();
+  nonPrimitive1 = new HBoundedType.nonNull(
+      compiler.mapClass.computeType(compiler));
+  nonPrimitive2 = new HBoundedType.nonNull(
+      compiler.functionClass.computeType(compiler));
+  potentialArray = new HBoundedPotentialPrimitiveArray(
+      compiler.listClass.computeType(compiler), true);
+  potentialString = new HBoundedPotentialPrimitiveString(
+      compiler.stringClass.computeType(compiler), true);
+  testUnion(compiler);
+  testIntersection(compiler);
 }
diff --git a/tests/compiler/dart2js/value_range2_test.dart b/tests/compiler/dart2js/value_range2_test.dart
index 768a3f1..c0c3bca 100644
--- a/tests/compiler/dart2js/value_range2_test.dart
+++ b/tests/compiler/dart2js/value_range2_test.dart
@@ -4,22 +4,33 @@
 
 import "../../../lib/compiler/implementation/ssa/ssa.dart";
 import "../../../lib/compiler/implementation/dart2jslib.dart";
+import "../../../lib/compiler/implementation/js_backend/js_backend.dart";
 
-Value instructionValue = new InstructionValue(new HReturn(null));
-Value lengthValue = new LengthValue(new HReturn(null));
+ValueRangeInfo info = new ValueRangeInfo(const JavaScriptConstantSystem());
 
-Range createSingleRange(Value value) => new Range(value, value);
-Range createSingleIntRange(int value) => createSingleRange(new IntValue(value));
+Value instructionValue = info.newInstructionValue(new HReturn(null));
+Value lengthValue = info.newLengthValue(new HReturn(null));
+
+Range createSingleRange(Value value) => info.newRange(value, value);
+
+Range createSingleIntRange(int value) {
+  return createSingleRange(info.newIntValue(value));
+}
+
 Range createSingleInstructionRange() => createSingleRange(instructionValue);
+
 Range createSingleLengthRange() => createSingleRange(lengthValue);
+
 Range createIntRange(int lower, int upper) {
-  return new Range(new IntValue(lower), new IntValue(upper));
+  return info.newRange(info.newIntValue(lower), info.newIntValue(upper));
 }
+
 Range createLengthRange(int lower) {
-  return new Range(new IntValue(lower), lengthValue);
+  return info.newRange(info.newIntValue(lower), lengthValue);
 }
+
 Range createInstructionRange(int lower) {
-  return new Range(new IntValue(lower), instructionValue);
+  return info.newRange(info.newIntValue(lower), instructionValue);
 }
 
 Range instruction = createSingleInstructionRange();
@@ -35,9 +46,9 @@
 Range _0_instruction = createInstructionRange(0);
 
 checkAndRange(Range one, Range two, lower, upper) {
-  if (lower is num) lower = new IntValue(lower);
-  if (upper is num) upper = new IntValue(upper);
-  Range range = new Range(lower, upper);
+  if (lower is num) lower = info.newIntValue(lower);
+  if (upper is num) upper = info.newIntValue(upper);
+  Range range = info.newRange(lower, upper);
   Expect.equals(range, one & two);
 }
 
@@ -47,33 +58,33 @@
     // Create a bound just like our current implementation in dart2js does.
     if (two is IntValue) {
       if (two.isNegative) {
-        return new AddValue(one, -two);
+        return info.newAddValue(one, -two);
       } else if (two.isZero) {
         return one;
       }
     }
     if (one is IntValue) {
       if (one.isNegative) {
-        return new SubtractValue(-two, -one);
+        return info.newSubtractValue(-two, -one);
       } else if (one.isZero) {
         return -two;
       }
     }
-    return new SubtractValue(one, two);
+    return info.newSubtractValue(one, two);
   }
 
   if (lower == null) {
     lower = buildBound(one.lower, two.upper);
   } else if (lower is num) {
-    lower = new IntValue(lower);
+    lower = info.newIntValue(lower);
   }
   if (upper == null) {
     upper = buildBound(one.upper, two.lower);
   } else if (upper is num) {
-    upper = new IntValue(upper);
+    upper = info.newIntValue(upper);
   }
 
-  Expect.equals(new Range(lower, upper), one - two);
+  Expect.equals(info.newRange(lower, upper), one - two);
 }
 
 checkNegateRange(Range range, [arg1, arg2]) {
@@ -82,20 +93,20 @@
   } else {
     Value low, up;
     if (arg1 is num) {
-      low = new IntValue(arg1);
+      low = info.newIntValue(arg1);
     } else if (arg1 == null) {
-      low = new NegateValue(range.upper);
+      low = info.newNegateValue(range.upper);
     } else {
       low = arg1;
     }
     if (arg2 is num) {
-      up = new IntValue(arg2);
+      up = info.newIntValue(arg2);
     } else if (arg2 == null) {
-      up = new NegateValue(range.lower);
+      up = info.newNegateValue(range.lower);
     } else {
       up = arg2;
     }
-    Expect.equals(new Range(low, up), -range);
+    Expect.equals(info.newRange(low, up), -range);
   }
 }
 
@@ -113,6 +124,8 @@
   checkNegateRange(_0_instruction, -instructionValue, 0);
 }
 
+bits32(value) => value & 0xFFFFFFFF;
+
 testAnd() {
   checkAndRange(
       instruction, instruction, const MinIntValue(), const MaxIntValue());
@@ -162,7 +175,7 @@
 
   checkAndRange(nFF, FF, 1, 1);
   checkAndRange(nFF, FA, 0, 0);
-  checkAndRange(nFF, nFF, -0xFF, -0xFF);
+  checkAndRange(nFF, nFF, bits32(-0xFF), bits32(-0xFF));
   checkAndRange(nFF, length, 0, length.upper);
   checkAndRange(nFF, _FA_FF, 0, 0xFF);
   checkAndRange(nFF, _0_FF, 0, 0xFF);
diff --git a/tests/compiler/dart2js_extra/constant_javascript_semantics2_test.dart b/tests/compiler/dart2js_extra/constant_javascript_semantics2_test.dart
index af4872f..5790fe3 100644
--- a/tests/compiler/dart2js_extra/constant_javascript_semantics2_test.dart
+++ b/tests/compiler/dart2js_extra/constant_javascript_semantics2_test.dart
@@ -21,5 +21,5 @@
 
 main() {
   Expect.throws(() => foo(),
-                (e) => e is IndexOutOfRangeException);
+                (e) => e is RangeError);
 }
diff --git a/tests/compiler/dart2js_extra/constant_javascript_semantics3_test.dart b/tests/compiler/dart2js_extra/constant_javascript_semantics3_test.dart
index b21674d..0fba325 100644
--- a/tests/compiler/dart2js_extra/constant_javascript_semantics3_test.dart
+++ b/tests/compiler/dart2js_extra/constant_javascript_semantics3_test.dart
@@ -33,5 +33,5 @@
 
 main() {
   Expect.throws(() => foo(),
-                (e) => e is IndexOutOfRangeException);
+                (e) => e is RangeError);
 }
diff --git a/tests/compiler/dart2js_extra/dart2js_extra.status b/tests/compiler/dart2js_extra/dart2js_extra.status
index 31ef7cf..47ea3f2 100644
--- a/tests/compiler/dart2js_extra/dart2js_extra.status
+++ b/tests/compiler/dart2js_extra/dart2js_extra.status
@@ -6,8 +6,7 @@
 class_test: Fail
 statements_test: Fail
 typed_locals_test: Fail
-inline_position_crash_test: Fail # http://www.dartbug.com/3905
-constant_javascript_semantics3_test: Fail # http://www.dartbug.com/5581
+no_such_method_test: Fail # Wrong InvocationMirror.memberName.
 
 [ $compiler == dart2js && $runtime == ff && $system == windows ]
 regress/4740_test: Fail
diff --git a/tests/compiler/dart2js_extra/no_such_method_test.dart b/tests/compiler/dart2js_extra/no_such_method_test.dart
index 4a432c5..f1047df 100644
--- a/tests/compiler/dart2js_extra/no_such_method_test.dart
+++ b/tests/compiler/dart2js_extra/no_such_method_test.dart
@@ -11,8 +11,9 @@
 }
 
 class A {
-  noSuchMethod(String name, List args) {
-    topLevelInfo = new NoSuchMethodInfo(this, name, args);
+  noSuchMethod(InvocationMirror invocation) {
+    topLevelInfo = new NoSuchMethodInfo(this, invocation.memberName,
+                                        invocation.positionalArguments);
     return topLevelInfo;
   }
 
@@ -38,13 +39,13 @@
   Expect.isTrue(info.receiver === a);
 
   info = a.bar;
-  Expect.equals('get:bar', info.name);
+  Expect.equals('bar', info.name);
   Expect.isTrue(info.args.length == 0);
   Expect.isTrue(info.receiver === a);
 
   a.bar = 2;
   info = topLevelInfo;
-  Expect.equals('set:bar', info.name);
+  Expect.equals('bar', info.name);
   Expect.isTrue(info.args.length == 1);
   Expect.isTrue(info.args[0] === 2);
   Expect.isTrue(info.receiver === a);
diff --git a/tests/compiler/dart2js_extra/optional_parameter_test.dart b/tests/compiler/dart2js_extra/optional_parameter_test.dart
index 82f2f84..4fd5ac8 100644
--- a/tests/compiler/dart2js_extra/optional_parameter_test.dart
+++ b/tests/compiler/dart2js_extra/optional_parameter_test.dart
@@ -11,7 +11,7 @@
     return b;
   }
 
-  noSuchMethod(name, args) {
+  noSuchMethod(mirror) {
     return 0;
   }
 }
diff --git a/tests/compiler/dart2js_native/native_no_such_method_exception3_frog_test.dart b/tests/compiler/dart2js_native/native_no_such_method_exception3_frog_test.dart
index 549b111..22f4369 100644
--- a/tests/compiler/dart2js_native/native_no_such_method_exception3_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_no_such_method_exception3_frog_test.dart
@@ -12,7 +12,7 @@
 
 class C {
   static create() => new C();
-  noSuchMethod(x, y) => "$x:$y";
+  noSuchMethod(x) => "${x.memberName}:${x.positionalArguments}";
 }
 
 makeA() native;
diff --git a/tests/compiler/dart2js_native/native_no_such_method_exception4_frog_test.dart b/tests/compiler/dart2js_native/native_no_such_method_exception4_frog_test.dart
index fa1f878..3827cac 100644
--- a/tests/compiler/dart2js_native/native_no_such_method_exception4_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_no_such_method_exception4_frog_test.dart
@@ -4,7 +4,7 @@
 
 class A native "*A" {
   bar() => 42;
-  noSuchMethod(x,y) => "native($x:$y)";
+  noSuchMethod(x) => "native(${x.memberName}:${x.positionalArguments})";
 }
 
 class B native "*B" {
diff --git a/tests/compiler/dart2js_native/native_no_such_method_exception5_frog_test.dart b/tests/compiler/dart2js_native/native_no_such_method_exception5_frog_test.dart
index 58074df..c0f03ac 100644
--- a/tests/compiler/dart2js_native/native_no_such_method_exception5_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_no_such_method_exception5_frog_test.dart
@@ -4,7 +4,7 @@
 
 class A native "*A" {
   bar() => 42;
-  noSuchMethod(x,y) => "native($x:$y)";
+  noSuchMethod(x) => "native(${x.memberName}:${x.positionalArguments})";
 }
 
 class B native "*B" {
@@ -13,7 +13,7 @@
 
 class C {
   static create() => new C();
-  noSuchMethod(x, y) => "$x:$y";
+  noSuchMethod(x) => "${x.memberName}:${x.positionalArguments}";
 }
 
 makeA() native;
diff --git a/tests/corelib/core_runtime_types_test.dart b/tests/corelib/core_runtime_types_test.dart
index d1733bd..e3d94ce 100644
--- a/tests/corelib/core_runtime_types_test.dart
+++ b/tests/corelib/core_runtime_types_test.dart
@@ -45,16 +45,10 @@
   }
 
   static assertTypeError(void f()) {
-    try {
-      f();
-    } catch (exception) {
-      Expect.equals(true, (exception is TypeError) ||
-                          (exception is NoSuchMethodError) ||
-                          (exception is NullPointerException) ||
-                          (exception is ArgumentError));
-      return;
-    }
-    Expect.equals(true, false);
+    Expect.throws(f, (exception) => (exception is TypeError) ||
+                                    (exception is NoSuchMethodError) ||
+                                    (exception is NullPointerException) ||
+                                    (exception is ArgumentError));
   }
 
   static testBooleanOperators() {
diff --git a/tests/corelib/corelib.status b/tests/corelib/corelib.status
index b604ddd..83da1cb 100644
--- a/tests/corelib/corelib.status
+++ b/tests/corelib/corelib.status
@@ -67,3 +67,8 @@
 null_nosuchmethod_test: Fail # inherited from VM
 null_test: Fail # inherited from VM
 unicode_test: Fail # inherited from VM
+
+[ $compiler == dartc ]
+# test issue 6324
+list_sort_test: Fail, OK
+sort_test: Fail, OK
diff --git a/tests/corelib/list_get_range_test.dart b/tests/corelib/list_get_range_test.dart
index 431af2c..88baeb6 100644
--- a/tests/corelib/list_get_range_test.dart
+++ b/tests/corelib/list_get_range_test.dart
@@ -37,7 +37,7 @@
 }
 
 void expectIOORE(Function f) {
-  Expect.throws(f, (e) => e is IndexOutOfRangeException);
+  Expect.throws(f, (e) => e is RangeError);
 }
 
 void expectIAE(Function f) {
diff --git a/tests/corelib/list_insert_range_test.dart b/tests/corelib/list_insert_range_test.dart
index eebe9b0..26e48cf 100644
--- a/tests/corelib/list_insert_range_test.dart
+++ b/tests/corelib/list_insert_range_test.dart
@@ -37,7 +37,7 @@
 }
 
 void expectIOORE(Function f) {
-  Expect.throws(f, (e) => e is IndexOutOfRangeException);
+  Expect.throws(f, (e) => e is RangeError);
 }
 
 void expectIAE(Function f) {
diff --git a/tests/corelib/list_remove_range_test.dart b/tests/corelib/list_remove_range_test.dart
index b806c92..4e41ef6 100644
--- a/tests/corelib/list_remove_range_test.dart
+++ b/tests/corelib/list_remove_range_test.dart
@@ -40,7 +40,7 @@
 }
 
 void expectIOORE(Function f) {
-  Expect.throws(f, (e) => e is IndexOutOfRangeException);
+  Expect.throws(f, (e) => e is RangeError);
 }
 
 void testNegativeIndices() {
diff --git a/tests/corelib/list_removeat_test.dart b/tests/corelib/list_removeat_test.dart
index 465f2f5..d6a9b28 100644
--- a/tests/corelib/list_removeat_test.dart
+++ b/tests/corelib/list_removeat_test.dart
@@ -11,10 +11,10 @@
 
   // Index must be integer and in range.
   Expect.throws(() { l1.removeAt(-1); },
-                (e) => e is IndexOutOfRangeException,
+                (e) => e is RangeError,
                 "negative");
   Expect.throws(() { l1.removeAt(5); },
-                (e) => e is IndexOutOfRangeException,
+                (e) => e is RangeError,
                 "too large");
   Expect.throws(() { l1.removeAt(null); },
                 (e) => e is ArgumentError,
@@ -57,6 +57,6 @@
   // Empty list is not special.
   var l4 = [];
   Expect.throws(() { l4.removeAt(0); },
-                (e) => e is IndexOutOfRangeException,
+                (e) => e is RangeError,
                 "empty");
 }
diff --git a/tests/corelib/list_set_range_test.dart b/tests/corelib/list_set_range_test.dart
index c37e950..f96ede5 100644
--- a/tests/corelib/list_set_range_test.dart
+++ b/tests/corelib/list_set_range_test.dart
@@ -57,7 +57,7 @@
 }
 
 void expectIOORE(Function f) {
-  Expect.throws(f, (e) => e is IndexOutOfRangeException);
+  Expect.throws(f, (e) => e is RangeError);
 }
 
 void testNegativeIndices() {
diff --git a/tests/corelib/map_test.dart b/tests/corelib/map_test.dart
index 4b44793..0f78437 100644
--- a/tests/corelib/map_test.dart
+++ b/tests/corelib/map_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #library("MapTest.dart");
-#import("dart:coreimpl");
+#import("dart:collection");
 
 class MapTest {
 
diff --git a/tests/corelib/maps_test.dart b/tests/corelib/maps_test.dart
index 95b2e1d..16ef12c 100644
--- a/tests/corelib/maps_test.dart
+++ b/tests/corelib/maps_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #library("MapsTest.dart");
-#import("dart:coreimpl");
+#import("dart:collection");
 
 main() {
   final key1 = "key1";
diff --git a/tests/corelib/index_out_of_range_exception_test.dart b/tests/corelib/range_error_test.dart
similarity index 89%
rename from tests/corelib/index_out_of_range_exception_test.dart
rename to tests/corelib/range_error_test.dart
index b052a4b..e83bd30 100644
--- a/tests/corelib/index_out_of_range_exception_test.dart
+++ b/tests/corelib/range_error_test.dart
@@ -4,7 +4,7 @@
 
 // Dart test for testing out of range exceptions on arrays.
 
-class IndexOutOfRangeExceptionTest {
+class RangeErrorTest {
   static testRead() {
     testListRead([], 0);
     testListRead([], -1);
@@ -52,7 +52,7 @@
     var exception = null;
     try {
       var e = list[index];
-    } on IndexOutOfRangeException catch (e) {
+    } on RangeError catch (e) {
       exception = e;
     }
     Expect.equals(true, exception != null);
@@ -62,7 +62,7 @@
     var exception = null;
     try {
       list[index] = null;
-    } on IndexOutOfRangeException catch (e) {
+    } on RangeError catch (e) {
       exception = e;
     }
     Expect.equals(true, exception != null);
@@ -70,5 +70,5 @@
 }
 
 main() {
-  IndexOutOfRangeExceptionTest.testMain();
+  RangeErrorTest.testMain();
 }
diff --git a/tests/corelib/splay_tree_test.dart b/tests/corelib/splay_tree_test.dart
index dd3601c..bb0ae70 100644
--- a/tests/corelib/splay_tree_test.dart
+++ b/tests/corelib/splay_tree_test.dart
@@ -4,7 +4,7 @@
 
 // Dart test for Splaytrees.
 #library("SplayTreeTest.dart");
-#import("dart:coreimpl");
+#import("dart:collection");
 
 
 class SplayTreeMapTest {
diff --git a/tests/corelib/string_base_vm_test.dart b/tests/corelib/string_base_vm_test.dart
index 87d3a53..be44250 100644
--- a/tests/corelib/string_base_vm_test.dart
+++ b/tests/corelib/string_base_vm_test.dart
@@ -55,14 +55,14 @@
     bool exception_caught = false;
     try {
       s.substring(5, 12);
-    } on IndexOutOfRangeException catch (ex) {
+    } on RangeError catch (ex) {
       exception_caught = true;
     }
     Expect.equals(true, exception_caught);
     exception_caught = false;
     try {
       s.substring(5, 4);
-    } on IndexOutOfRangeException catch (ex) {
+    } on RangeError catch (ex) {
       exception_caught = true;
     }
     Expect.equals(true, exception_caught);
diff --git a/tests/corelib/string_substring_test.dart b/tests/corelib/string_substring_test.dart
index fa6085f..0cdac66 100644
--- a/tests/corelib/string_substring_test.dart
+++ b/tests/corelib/string_substring_test.dart
@@ -6,32 +6,32 @@
   // Test that not providing an optional argument goes to the end.
   Expect.equals("".substring(0), "");
   Expect.throws(() => "".substring(1),
-      (e) => e is IndexOutOfRangeException);
+      (e) => e is RangeError);
   Expect.throws(() => "".substring(-1),
-      (e) => e is IndexOutOfRangeException);
+      (e) => e is RangeError);
 
   Expect.equals("abc".substring(0), "abc");
   Expect.equals("abc".substring(1), "bc");
   Expect.equals("abc".substring(2), "c");
   Expect.equals("abc".substring(3), "");
   Expect.throws(() => "abc".substring(4),
-      (e) => e is IndexOutOfRangeException);
+      (e) => e is RangeError);
   Expect.throws(() => "abc".substring(-1),
-      (e) => e is IndexOutOfRangeException);
+      (e) => e is RangeError);
 
   // Test that providing null goes to the end.
   Expect.equals("".substring(0, null), "");
   Expect.throws(() => "".substring(1, null),
-      (e) => e is IndexOutOfRangeException);
+      (e) => e is RangeError);
   Expect.throws(() => "".substring(-1, null),
-      (e) => e is IndexOutOfRangeException);
+      (e) => e is RangeError);
 
   Expect.equals("abc".substring(0, null), "abc");
   Expect.equals("abc".substring(1, null), "bc");
   Expect.equals("abc".substring(2, null), "c");
   Expect.equals("abc".substring(3, null), "");
   Expect.throws(() => "abc".substring(4, null),
-      (e) => e is IndexOutOfRangeException);
+      (e) => e is RangeError);
   Expect.throws(() => "abc".substring(-1, null),
-      (e) => e is IndexOutOfRangeException);
+      (e) => e is RangeError);
 }
diff --git a/tests/corelib/string_test.dart b/tests/corelib/string_test.dart
index 0dd8e54..a5ba35b 100644
--- a/tests/corelib/string_test.dart
+++ b/tests/corelib/string_test.dart
@@ -28,7 +28,7 @@
     bool exception_caught = false;
     try {
       var c = a[20];  // Throw exception.
-    } on IndexOutOfRangeException catch (e) {
+    } on RangeError catch (e) {
       exception_caught = true;
     }
     Expect.equals(true, exception_caught);
diff --git a/tests/html/audiobuffersourcenode_test.dart b/tests/html/audiobuffersourcenode_test.dart
index 0251672..360f9bc 100644
--- a/tests/html/audiobuffersourcenode_test.dart
+++ b/tests/html/audiobuffersourcenode_test.dart
@@ -12,6 +12,6 @@
       AudioBufferSourceNode node = ctx.createBufferSource();
       node.start(ctx.currentTime, 0, 2);
       node.stop(ctx.currentTime + 2);
-      expect(node is AudioBufferSourceNode);
+      expect(node is AudioBufferSourceNode, isTrue);
   });
 }
diff --git a/tests/html/audiocontext_test.dart b/tests/html/audiocontext_test.dart
index 9706aa4..f84ddbf 100644
--- a/tests/html/audiocontext_test.dart
+++ b/tests/html/audiocontext_test.dart
@@ -7,10 +7,13 @@
 
   useHtmlConfiguration();
 
+  var isAudioContext =
+      predicate((x) => x is AudioContext, 'is an AudioContext');
+
   test('constructorTest', () {
       var ctx = new AudioContext();
       expect(ctx, isNotNull);
-      expect(ctx is AudioContext);
+      expect(ctx, isAudioContext);
   });
   test('createBuffer', () {
       var ctx = new AudioContext();
@@ -23,4 +26,18 @@
         expect(e.code, equals(DOMException.SYNTAX_ERR));
       }
   });
+
+  test('audioRenames', () {
+    AudioContext context = new AudioContext();
+    GainNode gainNode = context.createGainNode();
+    gainNode.connect(context.destination, 0, 0);
+    expect(gainNode is GainNode, isTrue);
+
+    expect(context.createAnalyser() is AnalyserNode, isTrue);
+    expect(context.createChannelMerger() is ChannelMergerNode, isTrue);
+    expect(context.createChannelSplitter() is ChannelSplitterNode, isTrue);
+    expect(context.createOscillator() is OscillatorNode, isTrue);
+    expect(context.createPanner() is PannerNode, isTrue);
+    expect(context.createJavaScriptNode(4096) is ScriptProcessorNode, isTrue);
+  });
 }
diff --git a/tests/html/audioelement_test.dart b/tests/html/audioelement_test.dart
index da7fd3f..988d140 100644
--- a/tests/html/audioelement_test.dart
+++ b/tests/html/audioelement_test.dart
@@ -9,13 +9,13 @@
   test('constructorTest1', () {
       var audio = new AudioElement();
       expect(audio, isNotNull);
-      expect(audio is AudioElement);
+      expect(audio is AudioElement, isTrue);
     });
 
   test('constructorTest2', () {
       var audio = new AudioElement('hahaURL');
       expect(audio, isNotNull);
-      expect(audio is AudioElement);
+      expect(audio is AudioElement, isTrue);
       expect(audio.src, contains('hahaURL'));
     });
 }
diff --git a/tests/html/blob_constructor_test.dart b/tests/html/blob_constructor_test.dart
index 788d4d5..71071bc 100644
--- a/tests/html/blob_constructor_test.dart
+++ b/tests/html/blob_constructor_test.dart
@@ -12,7 +12,7 @@
 
   test('basic', () {
       var b = new Blob([]);
-      expect(b.size, 0);
+      expect(b.size, isZero);
     });
 
   test('type1', () {
@@ -31,7 +31,8 @@
   test('endings2', () {
       // OPTIONALS var b = new Blob(['A\nB\n'], endings: 'native');
       var b = new Blob(['A\nB\n'], null, 'native');
-      expect(b.size, (x) => x == 4 || x == 6);
+      expect(b.size, (x) => x == 4 || x == 6,
+          reason: "b.size should be 4 or 6");
     });
 
   test('twoStrings', () {
@@ -43,7 +44,7 @@
   test('fromBlob1', () {
       var b1 = new Blob([]);
       var b2 = new Blob([b1]);
-      expect(b2.size, 0);
+      expect(b2.size, isZero);
     });
 
   test('fromBlob2', () {
diff --git a/tests/html/canvas_pixel_array_type_alias_test.dart b/tests/html/canvas_pixel_array_type_alias_test.dart
index 5560d9f..7a9ba78 100644
--- a/tests/html/canvas_pixel_array_type_alias_test.dart
+++ b/tests/html/canvas_pixel_array_type_alias_test.dart
@@ -31,7 +31,8 @@
     Uint8ClampedArray data = image.data;
     // It is legal for the dart2js compiler to believe the type of the native
     // ImageData.data and elides the check, so check the type explicitly:
-    expect(confuseType(data) is Uint8ClampedArray, isTrue, 'canvas array type');
+    expect(confuseType(data) is Uint8ClampedArray, isTrue,
+        reason: 'canvas array type');
 
     expect(data, hasLength(40000));
     checkPixel(data, 0, [0, 0, 0, 0]);
@@ -46,6 +47,6 @@
 {
   offset *= 4;
   for (var i = 0; i < 4; ++i) {
-    Expect.equals(rgba[i], data[offset + i]);
+    expect(rgba[i], equals(data[offset + i]));
   }
 }
diff --git a/tests/html/client_rect_test.dart b/tests/html/client_rect_test.dart
index 580f41d..4ad9ddf 100644
--- a/tests/html/client_rect_test.dart
+++ b/tests/html/client_rect_test.dart
@@ -5,6 +5,9 @@
 
 main() {
 
+  var isClientRectList =
+      predicate((x) => x is List<ClientRect>, 'is a List<ClientRect>');
+
   insertTestDiv() {
     var element = new Element.tag('div');
     element.innerHTML = r'''
@@ -21,7 +24,7 @@
    test("ClientRectList test", () {
     insertTestDiv();
     var range = document.createRange();
-    List<ClientRect> rects = range.getClientRects();
-    Expect.isTrue(rects is List<ClientRect>);
+    var rects = range.getClientRects();
+    expect(rects, isClientRectList);
   });
 }
diff --git a/tests/html/contentelement_test.dart b/tests/html/contentelement_test.dart
index 88e5c57..1df3b10 100644
--- a/tests/html/contentelement_test.dart
+++ b/tests/html/contentelement_test.dart
@@ -10,8 +10,11 @@
 main() {
   useHtmlConfiguration();
 
+  var isContentElement =
+      predicate((x) => x is ContentElement, 'is a ContentElement');
+
   test('constructor', () {
       var e = new ContentElement();
-      expect(e is ContentElement);
+      expect(e, isContentElement);
     });
 }
diff --git a/tests/html/cross_frame_test.dart b/tests/html/cross_frame_test.dart
index 1fb54ad..aa8043e 100644
--- a/tests/html/cross_frame_test.dart
+++ b/tests/html/cross_frame_test.dart
@@ -6,19 +6,31 @@
 main() {
   useHtmlConfiguration();
 
+  var isWindow = predicate((x) => x is Window, 'is a Window');
+  var isLocalWindow = predicate((x) => x is LocalWindow, 'is a LocalWindow');
+  var isLocation = predicate((x) => x is Location, 'is a Location');
+  var isLocalLocation =
+      predicate((x) => x is LocalLocation, 'is a LocalLocation');
+  var isHistory = predicate((x) => x is History, 'is a History');
+  var isLocalHistory = predicate((x) => x is LocalHistory, 'is a LocalHistory');
+
   final iframe = new Element.tag('iframe');
   document.body.nodes.add(iframe);
 
   test('window', () {
-      expect(window is LocalWindow);
-      expect(window.document == document);
+      expect(window, isLocalWindow);
+      expect(window.document, document);
     });
 
   test('iframe', () {
       final frameWindow = iframe.contentWindow;
-      expect(frameWindow is Window);
-      expect(frameWindow is! LocalWindow);
-      expect(frameWindow.parent is LocalWindow);
+      expect(frameWindow, isWindow);
+      //TODO(gram) The next test should be written as:
+      //    expect(frameWindow, isNot(isLocalWindow));
+      // but that will cause problems now until is/is! work
+      // properly in dart2js instead of always returning true.
+      expect(frameWindow is! LocalWindow, isTrue);
+      expect(frameWindow.parent, isLocalWindow);
 
       // Ensure that the frame's document is inaccessible via window.
       expect(() => frameWindow.document, throws);
@@ -30,23 +42,27 @@
     });
 
   test('location', () {
-      expect(window.location is LocalLocation);
+      expect(window.location, isLocalLocation);
       final frameLocation = iframe.contentWindow.location;
-      expect(frameLocation is Location);
-      expect(frameLocation is! LocalLocation);
+      expect(frameLocation, isLocation);
+      // TODO(gram) Similar to the above, the next test should be:
+      //     expect(frameLocation, isNot(isLocalLocation));
+      expect(frameLocation is! LocalLocation, isTrue);
 
       expect(() => frameLocation.href, throws);
       expect(() => frameLocation.hash, throws);
 
       final frameParentLocation = iframe.contentWindow.parent.location;
-      expect(frameParentLocation is LocalLocation);
+      expect(frameParentLocation, isLocalLocation);
     });
 
   test('history', () {
-      expect(window.history is LocalHistory);
+      expect(window.history, isLocalHistory);
       final frameHistory = iframe.contentWindow.history;
-      expect(frameHistory is History);
-      expect(frameHistory is! LocalHistory);
+      expect(frameHistory, isHistory);
+      // See earlier comments.
+      //expect(frameHistory, isNot(isLocalHistory));
+      expect(frameHistory is! LocalHistory, isTrue);
 
       // Valid methods.
       frameHistory.forward();
@@ -54,6 +70,6 @@
       expect(() => frameHistory.length, throws);
 
       final frameParentHistory = iframe.contentWindow.parent.history;
-      expect(frameParentHistory is LocalHistory);
+      expect(frameParentHistory, isLocalHistory);
     });
 }
diff --git a/tests/html/css_rule_list_test.dart b/tests/html/css_rule_list_test.dart
index bf534ad..9d144b4 100644
--- a/tests/html/css_rule_list_test.dart
+++ b/tests/html/css_rule_list_test.dart
@@ -5,11 +5,14 @@
 
 main() {
 
+  var isCSSRuleList =
+      predicate((x) => x is List<CSSRule>, 'is a List<CSSRule>');
+
   useHtmlConfiguration();
 
   test("ClientRectList test", () {
     var sheet = document.styleSheets[0];
     List<CSSRule> rulesList = sheet.cssRules;
-    Expect.isTrue(rulesList is List<CSSRule>);
+    expect(rulesList, isCSSRuleList);
   });
 }
diff --git a/tests/html/css_test.dart b/tests/html/css_test.dart
index ca6cc53..f4fa0b8 100644
--- a/tests/html/css_test.dart
+++ b/tests/html/css_test.dart
@@ -38,6 +38,6 @@
 }
 
 void checkPoint(expectedX, expectedY, Point point) {
-  expect(point.x.round(), equals(expectedX), 'Wrong point.x');
-  expect(point.y.round(), equals(expectedY), 'Wrong point.y');
+  expect(point.x.round(), equals(expectedX), reason: 'Wrong point.x');
+  expect(point.y.round(), equals(expectedY), reason: 'Wrong point.y');
 }
diff --git a/tests/html/cssstyledeclaration_test.dart b/tests/html/cssstyledeclaration_test.dart
index 9807299..068952a7 100644
--- a/tests/html/cssstyledeclaration_test.dart
+++ b/tests/html/cssstyledeclaration_test.dart
@@ -24,9 +24,9 @@
     expect(style.item(0), isEmpty);
     expect(style, hasLength(0));
     // These assertions throw a NotImplementedException in dartium:
-    // Expect.isNull(style.parentRule);
-    // Expect.isNull(style.getPropertyCSSValue('color'));
-    // Expect.isNull(style.getPropertyShorthand('color'));
+    // expect(style.parentRule, isNull);
+    // expect(style.getPropertyCSSValue('color'), isNull);
+    // expect(style.getPropertyShorthand('color'), isNull);
   });
 
   test('length is wrapped', () {
diff --git a/tests/html/dart_object_local_storage_test.dart b/tests/html/dart_object_local_storage_test.dart
index 6d4291d..3e8a36d 100644
--- a/tests/html/dart_object_local_storage_test.dart
+++ b/tests/html/dart_object_local_storage_test.dart
@@ -19,16 +19,16 @@
   body.nodes.add(element);
 
   test('body', () {
-      Expect.equals(body, document.body);
+      expect(body, equals(document.body));
   });
   test('localStorage', () {
-      Expect.equals(localStorage, window.localStorage);
+      expect(localStorage, equals(window.localStorage));
   });
   test('sessionStorage', () {
-      Expect.equals(sessionStorage, window.sessionStorage);
+      expect(sessionStorage, equals(window.sessionStorage));
   });
   test('unknown', () {
       var test = document.query('#test');
-      Expect.equals(element, test);
+      expect(element, equals(test));
   });
 }
diff --git a/tests/html/datalistelement_test.dart b/tests/html/datalistelement_test.dart
index e130152..790f11d 100644
--- a/tests/html/datalistelement_test.dart
+++ b/tests/html/datalistelement_test.dart
@@ -10,6 +10,9 @@
 main() {
   useHtmlConfiguration();
 
+  var isDataListElement =
+      predicate((x) => x is DataListElement, 'is a DataListElement');
+
   var div;
 
   setUp(() {
@@ -34,7 +37,7 @@
 
   test('is', () {
       var list = document.query('#browsers');
-      expect(list is DataListElement);
+      expect(list, isDataListElement);
   });
 
   test('list', () {
@@ -51,6 +54,6 @@
 
   test('create', () {
       var list = new DataListElement();
-      expect(list is DataListElement);
+      expect(list, isDataListElement);
     });
 }
diff --git a/tests/html/document_test.dart b/tests/html/document_test.dart
index bba6e20..e535aba 100644
--- a/tests/html/document_test.dart
+++ b/tests/html/document_test.dart
@@ -6,11 +6,18 @@
 main() {
   useHtmlConfiguration();
 
+  var isElement = predicate((x) => x is Element, 'is an Element');
+  var isDivElement = predicate((x) => x is DivElement, 'is a DivElement');
+  var isAnchorElement =
+      predicate((x) => x is AnchorElement, 'is an AnchorElement');
+  var isUnknownElement =
+      predicate((x) => x is UnknownElement, 'is UnknownElement');
+
   test('CreateElement', () {
     // FIXME: nifty way crashes, do it boring way.
-    Expect.isTrue(new Element.tag('span') is Element);
-    Expect.isTrue(new Element.tag('div') is DivElement);
-    Expect.isTrue(new Element.tag('a') is AnchorElement);
-    Expect.isTrue(new Element.tag('bad_name') is UnknownElement);
+    expect(new Element.tag('span'), isElement);
+    expect(new Element.tag('div'), isDivElement);
+    expect(new Element.tag('a'), isAnchorElement);
+    expect(new Element.tag('bad_name'), isUnknownElement);
   });
 }
diff --git a/tests/html/documentfragment_test.dart b/tests/html/documentfragment_test.dart
index b312cf6..fe6ecb6 100644
--- a/tests/html/documentfragment_test.dart
+++ b/tests/html/documentfragment_test.dart
@@ -11,6 +11,9 @@
 main() {
   useHtmlConfiguration();
 
+  var isAnchorElement =
+      predicate((x) => x is AnchorElement, 'is an AnchorElement');
+
   Collection<String> _nodeStrings(Collection<Node> input) {
     var out = new List<String>();
     for (Node n in input) {
@@ -32,19 +35,19 @@
         return;
       }
     }
-    Expect.fail('Expected immutability error');
+    expect(true, isFalse, reason: 'Expected immutability error');
   };
 
   void expectEmptyStyleDeclaration(CSSStyleDeclaration style) {
-    Expect.equals("", style.cssText);
-    Expect.equals("", style.getPropertyPriority('color'));
-    Expect.equals("", style.item(0));
-    Expect.equals(0, style.length);
+    expect(style.cssText, equals(''));
+    expect(style.getPropertyPriority('color'), equals(''));
+    expect(style.item(0), equals(''));
+    expect(style.length, isZero);
     // TODO(jacobr): these checks throw NotImplementedExceptions in dartium.
-    // Expect.isNull(style.parentRule);
-    // Expect.isNull(style.getPropertyCSSValue('color'));
-    // Expect.isNull(style.getPropertyShorthand('color'));
-    // Expect.isFalse(style.isPropertyImplicit('color'));
+    // expect(style.parentRule, isNull);
+    // expect(style.getPropertyCSSValue('color'), isNull);
+    // expect(style.getPropertyShorthand('color'), isNull);
+    // expect(style.isPropertyImplicit('color'), isFalse);
 
     // Ideally these would throw errors, but it's not possible to create a class
     // that'll intercept these calls without implementing the entire
@@ -57,23 +60,23 @@
   group('constructors', () {
     test('0-argument makes an empty fragment', () {
       final fragment = new DocumentFragment();
-      Expect.listEquals([], fragment.elements);
+      expect(fragment.elements, equals([]));
     });
 
     test('.html parses input as HTML', () {
       final fragment = new DocumentFragment.html('<a>foo</a>');
-      Expect.isTrue(fragment.elements[0] is AnchorElement);
+      expect(fragment.elements[0], isAnchorElement);
     });
 
     // test('.svg parses input as SVG', () {
     //   final fragment = new DocumentFragment.svg('<a>foo</a>');
-    //   Expect.isTrue(fragment.elements[0] is SVGAElement);
+    //   expect(fragment.elements[0] is SVGAElement, isTrue);
     // });
 
     // TODO(nweiz): enable this once XML is ported.
     // test('.xml parses input as XML', () {
     //   final fragment = new DocumentFragment.xml('<a>foo</a>');
-    //   Expect.isTrue(fragment.elements[0] is XMLElement);
+    //   expect(fragment.elements[0] is XMLElement, isTrue);
     // });
   });
 
@@ -116,63 +119,66 @@
 
     test('is initially empty', () {
       elements = new DocumentFragment().elements;
-      Expect.listEquals([], elements);
-      Expect.isTrue(elements.isEmpty);
+      expect(elements, equals([]));
+      expect(elements.isEmpty, isTrue);
     });
 
     test('filters out non-element nodes', () {
       init();
-      Expect.listEquals(["1", "A", "B", "2", "I", "3", "U"],
-                        _nodeStrings(fragment.nodes));
-      Expect.listEquals(["A", "B", "I", "U"], _nodeStrings(elements));
+      expect(_nodeStrings(fragment.nodes),
+          orderedEquals(["1", "A", "B", "2", "I", "3", "U"]));
+      expect(_nodeStrings(elements),
+          orderedEquals(["A", "B", "I", "U"]));
     });
 
     test('only indexes elements, not other nodes', () {
       init();
       elements[1] = new Element.tag("BR");
-      Expect.listEquals(["1", "A", "BR", "2", "I", "3", "U"],
-                        _nodeStrings(fragment.nodes));
-      Expect.listEquals(["A", "BR", "I", "U"], _nodeStrings(elements));
+      expect(_nodeStrings(fragment.nodes),
+          orderedEquals(["1", "A", "BR", "2", "I", "3", "U"]));
+      expect(_nodeStrings(elements),
+          orderedEquals(["A", "BR", "I", "U"]));
     });
 
     test('adds to both elements and nodes', () {
       init();
       elements.add(new Element.tag("UL"));
-      Expect.listEquals(["1", "A", "B", "2", "I", "3", "U", "UL"],
-                        _nodeStrings(fragment.nodes));
-      Expect.listEquals(["A", "B", "I", "U", "UL"], _nodeStrings(elements));
+      expect(_nodeStrings(fragment.nodes),
+          orderedEquals(["1", "A", "B", "2", "I", "3", "U", "UL"]));
+      expect(_nodeStrings(elements),
+          orderedEquals(["A", "B", "I", "U", "UL"]));
     });
 
     test('removes only elements, from both elements and nodes', () {
       init();
-      Expect.equals("U", elements.removeLast().tagName);
-      Expect.listEquals(["1", "A", "B", "2", "I", "3"],
-                        _nodeStrings(fragment.nodes));
-      Expect.listEquals(["A", "B", "I"], _nodeStrings(elements));
+      expect(elements.removeLast().tagName, equals('U'));
+      expect(_nodeStrings(fragment.nodes),
+          orderedEquals(["1", "A", "B", "2", "I", "3"]));
+      expect(_nodeStrings(elements),
+          orderedEquals(["A", "B", "I"]));
 
-      Expect.equals("I", elements.removeLast().tagName);
-      Expect.listEquals(["1", "A", "B", "2", "3"],
-                        _nodeStrings(fragment.nodes));
-      Expect.listEquals(["A", "B"], _nodeStrings(elements));
+      expect(elements.removeLast().tagName, "I");
+      expect(_nodeStrings(fragment.nodes), 
+          equals(["1", "A", "B", "2", "3"]));
+      expect(_nodeStrings(elements), equals(["A", "B"]));
     });
 
     test('accessors are wrapped', () {
       init();
-      Expect.equals("A", elements[0].tagName);
-      Expect.listEquals(
-          ["I"], _nodeStrings(elements.filter((e) => e.tagName == "I")));
-      Expect.isTrue(elements.every((e) => e is Element));
-      Expect.isTrue(elements.some((e) => e.tagName == "U"));
-      Expect.isFalse(elements.isEmpty);
-      Expect.equals(4, elements.length);
-      Expect.equals("I", elements[2].tagName);
-      Expect.equals("U", elements.last.tagName);
+      expect(elements[0].tagName, "A");
+      expect(_nodeStrings(elements.filter((e) => e.tagName == "I")), ["I"]);
+      expect(elements.every((e) => e is Element), isTrue);
+      expect(elements.some((e) => e.tagName == "U"), isTrue);
+      expect(elements.isEmpty, isFalse);
+      expect(elements.length, 4);
+      expect(elements[2].tagName, "I");
+      expect(elements.last.tagName, "U");
     });
 
     test('setting elements overwrites nodes as well', () {
       init();
       fragment.elements = [new Element.tag("DIV"), new Element.tag("HEAD")];
-      Expect.listEquals(["DIV", "HEAD"], _nodeStrings(fragment.nodes));
+      expect(_nodeStrings(fragment.nodes), equals(["DIV", "HEAD"]));
     });
   });
 
@@ -180,14 +186,14 @@
     var fragment = new DocumentFragment();
     fragment.nodes.add(new Text("foo"));
     fragment.innerHTML = "<a>bar</a>baz";
-    Expect.listEquals(["A", "baz"], _nodeStrings(fragment.nodes));
+    expect(_nodeStrings(fragment.nodes), equals(["A", "baz"]));
   });
 
   test('getting innerHTML works', () {
     var fragment = new DocumentFragment();
     fragment.nodes.addAll([new Text("foo"), new Element.html("<A>bar</A>")]);
-    Expect.equals("foo<a>bar</a>", fragment.innerHTML);
-    Expect.equals("foo<a>bar</a>", fragment.outerHTML);
+    expect(fragment.innerHTML, "foo<a>bar</a>");
+    expect(fragment.outerHTML, "foo<a>bar</a>");
   });
 
   group('insertAdjacentElement', () {
@@ -195,30 +201,30 @@
 
     test('beforeBegin does nothing', () {
       var fragment = getFragment();
-      Expect.isNull(
-        fragment.insertAdjacentElement("beforeBegin", new Element.tag("b")));
-      Expect.equals("<a>foo</a>", fragment.innerHTML);
+      expect(fragment.insertAdjacentElement("beforeBegin",
+          new Element.tag("b")), isNull);
+      expect(fragment.innerHTML, "<a>foo</a>");
     });
 
     test('afterEnd does nothing', () {
       var fragment = getFragment();
-      Expect.isNull(
-        fragment.insertAdjacentElement("afterEnd", new Element.tag("b")));
-      Expect.equals("<a>foo</a>", fragment.innerHTML);
+      expect(fragment.insertAdjacentElement("afterEnd",
+          new Element.tag("b")), isNull);
+      expect(fragment.innerHTML, "<a>foo</a>");
     });
 
     test('afterBegin inserts the element', () {
       var fragment = getFragment();
       var el = new Element.tag("b");
-      Expect.equals(el, fragment.insertAdjacentElement("afterBegin", el));
-      Expect.equals("<b></b><a>foo</a>", fragment.innerHTML);
+      expect(fragment.insertAdjacentElement("afterBegin", el), equals(el));
+      expect(fragment.innerHTML, "<b></b><a>foo</a>");
     });
 
     test('beforeEnd inserts the element', () {
       var fragment = getFragment();
       var el = new Element.tag("b");
-      Expect.equals(el, fragment.insertAdjacentElement("beforeEnd", el));
-      Expect.equals("<a>foo</a><b></b>", fragment.innerHTML);
+      expect(fragment.insertAdjacentElement("beforeEnd", el), equals(el));
+      expect(fragment.innerHTML, "<a>foo</a><b></b>");
     });
   });
 
@@ -228,25 +234,25 @@
     test('beforeBegin does nothing', () {
       var fragment = getFragment();
       fragment.insertAdjacentText("beforeBegin", "foo");
-      Expect.equals("<a>foo</a>", fragment.innerHTML);
+      expect(fragment.innerHTML, "<a>foo</a>");
     });
 
     test('afterEnd does nothing', () {
       var fragment = getFragment();
       fragment.insertAdjacentText("afterEnd", "foo");
-      Expect.equals("<a>foo</a>", fragment.innerHTML);
+      expect(fragment.innerHTML, "<a>foo</a>");
     });
 
     test('afterBegin inserts the text', () {
       var fragment = getFragment();
       fragment.insertAdjacentText("afterBegin", "foo");
-      Expect.equals("foo<a>foo</a>", fragment.innerHTML);
+      expect(fragment.innerHTML, "foo<a>foo</a>");
     });
 
     test('beforeEnd inserts the text', () {
       var fragment = getFragment();
       fragment.insertAdjacentText("beforeEnd", "foo");
-      Expect.equals("<a>foo</a>foo", fragment.innerHTML);
+      expect(fragment.innerHTML, "<a>foo</a>foo");
     });
   });
 
@@ -256,25 +262,25 @@
     test('beforeBegin does nothing', () {
       var fragment = getFragment();
       fragment.insertAdjacentHTML("beforeBegin", "foo<br>");
-      Expect.equals("<a>foo</a>", fragment.innerHTML);
+      expect(fragment.innerHTML, "<a>foo</a>");
     });
 
     test('afterEnd does nothing', () {
       var fragment = getFragment();
       fragment.insertAdjacentHTML("afterEnd", "<br>foo");
-      Expect.equals("<a>foo</a>", fragment.innerHTML);
+      expect(fragment.innerHTML, "<a>foo</a>");
     });
 
     test('afterBegin inserts the HTML', () {
       var fragment = getFragment();
       fragment.insertAdjacentHTML("afterBegin", "foo<br>");
-      Expect.equals("foo<br><a>foo</a>", fragment.innerHTML);
+      expect(fragment.innerHTML, "foo<br><a>foo</a>");
     });
 
     test('beforeEnd inserts the HTML', () {
       var fragment = getFragment();
       fragment.insertAdjacentHTML("beforeEnd", "<br>foo");
-      Expect.equals("<a>foo</a><br>foo", fragment.innerHTML);
+      expect(fragment.innerHTML, "<a>foo</a><br>foo");
     });
   });
 
@@ -298,29 +304,29 @@
        expectEmptyRect(rect.offset);
        expectEmptyRect(rect.scroll);
        expectEmptyRect(rect.bounding);
-       Expect.isTrue(rect.clientRects.isEmpty);
+       expect(rect.clientRects.isEmpty, isTrue);
     }));
-    Expect.equals("false", fragment.contentEditable);
-    Expect.equals(-1, fragment.tabIndex);
-    Expect.equals("", fragment.id);
-    Expect.equals("", fragment.title);
-    Expect.equals("", fragment.tagName);
-    Expect.equals("", fragment.webkitdropzone);
-    Expect.equals("", fragment.webkitRegionOverflow);
-    Expect.isFalse(fragment.isContentEditable);
-    Expect.isFalse(fragment.draggable);
-    Expect.isFalse(fragment.hidden);
-    Expect.isFalse(fragment.spellcheck);
-    Expect.isFalse(fragment.translate);
-    Expect.isNull(fragment.nextElementSibling);
-    Expect.isNull(fragment.previousElementSibling);
-    Expect.isNull(fragment.offsetParent);
-    Expect.isNull(fragment.parent);
-    Expect.isTrue(fragment.attributes.isEmpty);
-    Expect.isTrue(fragment.classes.isEmpty);
-    Expect.isTrue(fragment.dataAttributes.isEmpty);
-    Expect.isFalse(fragment.matchesSelector("foo"));
-    Expect.isFalse(fragment.matchesSelector("*"));
+    expect(fragment.contentEditable, "false");
+    expect(fragment.tabIndex, -1);
+    expect(fragment.id, "");
+    expect(fragment.title, "");
+    expect(fragment.tagName, "");
+    expect(fragment.webkitdropzone, "");
+    expect(fragment.webkitRegionOverflow, "");
+    expect(fragment.isContentEditable, isFalse);
+    expect(fragment.draggable, isFalse);
+    expect(fragment.hidden, isFalse);
+    expect(fragment.spellcheck, isFalse);
+    expect(fragment.translate, isFalse);
+    expect(fragment.nextElementSibling, isNull);
+    expect(fragment.previousElementSibling, isNull);
+    expect(fragment.offsetParent, isNull);
+    expect(fragment.parent, isNull);
+    expect(fragment.attributes.isEmpty, isTrue);
+    expect(fragment.classes.isEmpty, isTrue);
+    expect(fragment.dataAttributes.isEmpty, isTrue);
+    expect(fragment.matchesSelector("foo"), isFalse);
+    expect(fragment.matchesSelector("*"), isFalse);
   });
 
   test('style', () {
@@ -348,7 +354,7 @@
   test('query searches the fragment', () {
     var fragment = new DocumentFragment.html(
       "<div class='foo'><a>foo</a><b>bar</b></div>");
-    Expect.equals("A", fragment.query(".foo a").tagName);
-    Expect.listEquals(["A", "B"], _nodeStrings(fragment.queryAll(".foo *")));
+    expect(fragment.query(".foo a").tagName, "A");
+    expect(_nodeStrings(fragment.queryAll(".foo *")), equals(["A", "B"]));
   });
 }
diff --git a/tests/html/dom_constructors_test.dart b/tests/html/dom_constructors_test.dart
index 684caf5..6354aac 100644
--- a/tests/html/dom_constructors_test.dart
+++ b/tests/html/dom_constructors_test.dart
@@ -7,6 +7,6 @@
   useHtmlConfiguration();
   test('FileReader', () {
     FileReader fileReader = new FileReader();
-    Expect.equals(FileReader.EMPTY, fileReader.readyState);
+    expect(fileReader.readyState, equals(FileReader.EMPTY));
   });
 }
diff --git a/tests/html/domparser_test.dart b/tests/html/domparser_test.dart
index 990f4cd0f..59d20fb 100644
--- a/tests/html/domparser_test.dart
+++ b/tests/html/domparser_test.dart
@@ -7,9 +7,11 @@
 
   useHtmlConfiguration();
 
+  var isDOMParser = predicate((x) => x is DOMParser, 'is a DOMParser');
+
   test('constructorTest', () {
       var ctx = new DOMParser();
-      Expect.isTrue(ctx != null);
-      Expect.isTrue(ctx is DOMParser);
+      expect(ctx, isNotNull);
+      expect(ctx, isDOMParser);
   });
 }
diff --git a/tests/html/element_add_test.dart b/tests/html/element_add_test.dart
index 3a128f6..767dbe1 100644
--- a/tests/html/element_add_test.dart
+++ b/tests/html/element_add_test.dart
@@ -11,8 +11,12 @@
 main() {
   useHtmlConfiguration();
 
+  var isSpanElement = predicate((x) => x is SpanElement, 'is a SpanElemt');
+  var isDivElement = predicate((x) => x is DivElement, 'is a DivElement');
+  var isText = predicate((x) => x is Text, 'is a Text');
+
   void expectNoSuchMethod(void fn()) =>
-    Expect.throws(fn, (e) => e is NoSuchMethodError);
+    expect(fn, throwsNoSuchMethodError);
 
   group('addHTML', () {
     test('htmlelement', () {
@@ -20,20 +24,20 @@
       el.addHTML('<span></span>');
       expect(el.elements.length, equals(1));
       var span = el.elements[0];
-      expect(span is SpanElement);
+      expect(span, isSpanElement);
 
       el.addHTML('<div></div>');
       expect(el.elements.length, equals(2));
       // Validate that the first item is still first.
-      expect(el.elements[0] == span);
-      expect(el.elements[1] is DivElement);
+      expect(el.elements[0], equals(span));
+      expect(el.elements[1], isDivElement);
     });
 
     test('documentFragment', () {
       var fragment = new DocumentFragment();
       fragment.addHTML('<span>something</span>');
       expect(fragment.elements.length, equals(1));
-      expect(fragment.elements[0] is SpanElement);
+      expect(fragment.elements[0], isSpanElement);
     });
   });
 
@@ -67,7 +71,7 @@
       child.insertAdjacentElement('beforebegin', newChild);
 
       expect(parent.elements.length, 2);
-      expect(parent.elements[0] is SpanElement);
+      expect(parent.elements[0], isSpanElement);
     });
 
     test('afterend', () {
@@ -79,7 +83,7 @@
       child.insertAdjacentElement('afterend', newChild);
 
       expect(parent.elements.length, 2);
-      expect(parent.elements[1] is SpanElement);
+      expect(parent.elements[1], isSpanElement);
     });
 
     test('afterbegin', () {
@@ -91,7 +95,7 @@
       parent.insertAdjacentElement('afterbegin', newChild);
 
       expect(parent.elements.length, 2);
-      expect(parent.elements[0] is SpanElement);
+      expect(parent.elements[0], isSpanElement);
     });
 
     test('beforeend', () {
@@ -103,7 +107,7 @@
       parent.insertAdjacentElement('beforeend', newChild);
 
       expect(parent.elements.length, 2);
-      expect(parent.elements[1] is SpanElement);
+      expect(parent.elements[1], isSpanElement);
     });
   });
 
@@ -116,7 +120,7 @@
       child.insertAdjacentHTML('beforebegin', '<span></span>');
 
       expect(parent.elements.length, 2);
-      expect(parent.elements[0] is SpanElement);
+      expect(parent.elements[0], isSpanElement);
     });
 
     test('afterend', () {
@@ -127,7 +131,7 @@
       child.insertAdjacentHTML('afterend', '<span></span>');
 
       expect(parent.elements.length, 2);
-      expect(parent.elements[1] is SpanElement);
+      expect(parent.elements[1], isSpanElement);
     });
 
     test('afterbegin', () {
@@ -138,7 +142,7 @@
       parent.insertAdjacentHTML('afterbegin', '<span></span>');
 
       expect(parent.elements.length, 2);
-      expect(parent.elements[0] is SpanElement);
+      expect(parent.elements[0], isSpanElement);
     });
 
     test('beforeend', () {
@@ -149,7 +153,7 @@
       parent.insertAdjacentHTML('beforeend', '<span></span>');
 
       expect(parent.elements.length, 2);
-      expect(parent.elements[1] is SpanElement);
+      expect(parent.elements[1], isSpanElement);
     });
   });
 
@@ -162,7 +166,7 @@
       child.insertAdjacentText('beforebegin', 'test');
 
       expect(parent.nodes.length, 2);
-      expect(parent.nodes[0] is Text);
+      expect(parent.nodes[0], isText);
     });
 
     test('afterend', () {
@@ -173,7 +177,7 @@
       child.insertAdjacentText('afterend', 'test');
 
       expect(parent.nodes.length, 2);
-      expect(parent.nodes[1] is Text);
+      expect(parent.nodes[1], isText);
     });
 
     test('afterbegin', () {
@@ -184,7 +188,7 @@
       parent.insertAdjacentText('afterbegin', 'test');
 
       expect(parent.nodes.length, 2);
-      expect(parent.nodes[0] is Text);
+      expect(parent.nodes[0], isText);
     });
 
     test('beforeend', () {
@@ -195,7 +199,7 @@
       parent.insertAdjacentText('beforeend', 'test');
 
       expect(parent.nodes.length, 2);
-      expect(parent.nodes[1] is Text);
+      expect(parent.nodes[1], isText);
     });
   });
 }
diff --git a/tests/html/element_classes_test.dart b/tests/html/element_classes_test.dart
index 5dd611c..039e844 100644
--- a/tests/html/element_classes_test.dart
+++ b/tests/html/element_classes_test.dart
@@ -28,26 +28,26 @@
   test('affects the "class" attribute', () {
     final el = makeElementWithClasses();
     el.classes.add('qux');
-    Expect.setEquals(['foo', 'bar', 'baz', 'qux'], extractClasses(el));
+    expect(extractClasses(el), unorderedEquals(['foo', 'bar', 'baz', 'qux']));
   });
 
   test('is affected by the "class" attribute', () {
     final el = makeElementWithClasses();
     el.attributes['class'] = 'foo qux';
-    Expect.setEquals(['foo', 'qux'], el.classes);
+    expect(el.classes, unorderedEquals(['foo', 'qux']));
   });
 
   test('classes=', () {
     final el = makeElementWithClasses();
     el.classes = ['foo', 'qux'];
-    Expect.setEquals(['foo', 'qux'], el.classes);
-    Expect.setEquals(['foo', 'qux'], extractClasses(el));
+    expect(el.classes, unorderedEquals(['foo', 'qux']));
+    expect(extractClasses(el), unorderedEquals(['foo', 'qux']));
   });
 
   test('toString', () {
-    Expect.setEquals(['foo', 'bar', 'baz'],
-        makeClassSet().toString().split(' '));
-    Expect.equals('', makeElement().classes.toString());
+    expect(makeClassSet().toString().split(' '), 
+        unorderedEquals(['foo', 'bar', 'baz']));
+    expect(makeElement().classes.toString(), '');
   });
 
   test('forEach', () {
@@ -55,7 +55,7 @@
     // TODO: Change to this when Issue 3484 is fixed.
     //    makeClassSet().forEach(classes.add);
     makeClassSet().forEach((c) => classes.add(c));
-    Expect.setEquals(['foo', 'bar', 'baz'], classes);
+    expect(classes, unorderedEquals(['foo', 'bar', 'baz']));
   });
 
   test('iterator', () {
@@ -63,108 +63,106 @@
     for (var el in makeClassSet()) {
       classes.add(el);
     }
-    Expect.setEquals(['foo', 'bar', 'baz'], classes);
+    expect(classes, unorderedEquals(['foo', 'bar', 'baz']));
   });
 
   test('map', () {
-    Expect.setEquals(['FOO', 'BAR', 'BAZ'],
-        makeClassSet().map((c) => c.toUpperCase()));
+    expect(makeClassSet().map((c) => c.toUpperCase()),
+        unorderedEquals(['FOO', 'BAR', 'BAZ']));
   });
 
   test('filter', () {
-    Expect.setEquals(['bar', 'baz'],
-        makeClassSet().filter((c) => c.contains('a')));
+    expect(makeClassSet().filter((c) => c.contains('a')),
+        unorderedEquals(['bar', 'baz']));
   });
 
   test('every', () {
-    Expect.isTrue(makeClassSet().every((c) => c is String));
-    Expect.isFalse(
-        makeClassSet().every((c) => c.contains('a')));
+    expect(makeClassSet().every((c) => c is String), isTrue);
+    expect(makeClassSet().every((c) => c.contains('a')), isFalse);
   });
 
   test('some', () {
-    Expect.isTrue(
-        makeClassSet().some((c) => c.contains('a')));
-    Expect.isFalse(makeClassSet().some((c) => c is num));
+    expect(makeClassSet().some((c) => c.contains('a')), isTrue);
+    expect(makeClassSet().some((c) => c is num), isFalse);
   });
 
   test('isEmpty', () {
-    Expect.isFalse(makeClassSet().isEmpty);
-    Expect.isTrue(makeElement().classes.isEmpty);
+    expect(makeClassSet().isEmpty, isFalse);
+    expect(makeElement().classes.isEmpty, isTrue);
   });
 
   test('length', () {
-    Expect.equals(3, makeClassSet().length);
-    Expect.equals(0, makeElement().classes.length);
+    expect(makeClassSet().length, 3);
+    expect(makeElement().classes.length, 0);
   });
 
   test('contains', () {
-    Expect.isTrue(makeClassSet().contains('foo'));
-    Expect.isFalse(makeClassSet().contains('qux'));
+    expect(makeClassSet().contains('foo'), isTrue);
+    expect(makeClassSet().contains('qux'), isFalse);
   });
 
   test('add', () {
     final classes = makeClassSet();
     classes.add('qux');
-    Expect.setEquals(['foo', 'bar', 'baz', 'qux'], classes);
+    expect(classes, unorderedEquals(['foo', 'bar', 'baz', 'qux']));
 
     classes.add('qux');
     final list = new List.from(classes);
     list.sort((a, b) => a.compareTo(b));
-    Expect.listEquals(['bar', 'baz', 'foo', 'qux'], list,
-        "The class set shouldn't have duplicate elements.");
+    expect(list, unorderedEquals(['bar', 'baz', 'foo', 'qux']),
+        reason: "The class set shouldn't have duplicate elements.");
   });
 
   test('remove', () {
     final classes = makeClassSet();
     classes.remove('bar');
-    Expect.setEquals(['foo', 'baz'], classes);
+    expect(classes, unorderedEquals(['foo', 'baz']));
     classes.remove('qux');
-    Expect.setEquals(['foo', 'baz'], classes);
+    expect(classes, unorderedEquals(['foo', 'baz']));
   });
 
   test('toggle', () {
     final classes = makeClassSet();
     classes.toggle('bar');
-    Expect.setEquals(['foo', 'baz'], classes);
+    expect(classes, unorderedEquals(['foo', 'baz']));
     classes.toggle('qux');
-    Expect.setEquals(['foo', 'baz', 'qux'], classes);
+    expect(classes, unorderedEquals(['foo', 'baz', 'qux']));
   });
 
   test('addAll', () {
     final classes = makeClassSet();
     classes.addAll(['bar', 'qux', 'bip']);
-    Expect.setEquals(['foo', 'bar', 'baz', 'qux', 'bip'], classes);
+    expect(classes, unorderedEquals(['foo', 'bar', 'baz', 'qux', 'bip']));
   });
 
   test('removeAll', () {
     final classes = makeClassSet();
     classes.removeAll(['bar', 'baz', 'qux']);
-    Expect.setEquals(['foo'], classes);
+    expect(classes, unorderedEquals(['foo']));
   });
 
   test('isSubsetOf', () {
     final classes = makeClassSet();
-    Expect.isTrue(classes.isSubsetOf(['foo', 'bar', 'baz']));
-    Expect.isTrue(classes.isSubsetOf(['foo', 'bar', 'baz', 'qux']));
-    Expect.isFalse(classes.isSubsetOf(['foo', 'bar', 'qux']));
+    expect(classes.isSubsetOf(['foo', 'bar', 'baz']), isTrue);
+    expect(classes.isSubsetOf(['foo', 'bar', 'baz', 'qux']), isTrue);
+    expect(classes.isSubsetOf(['foo', 'bar', 'qux']), isFalse);
   });
 
   test('containsAll', () {
     final classes = makeClassSet();
-    Expect.isTrue(classes.containsAll(['foo', 'baz']));
-    Expect.isFalse(classes.containsAll(['foo', 'qux']));
+    expect(classes.containsAll(['foo', 'baz']), isTrue);
+    expect(classes.containsAll(['foo', 'qux']), isFalse);
   });
 
   test('intersection', () {
     final classes = makeClassSet();
-    Expect.setEquals(['foo', 'baz'],
-        classes.intersection(['foo', 'qux', 'baz']));
+    expect(classes.intersection(['foo', 'qux', 'baz']),
+        unorderedEquals(['foo', 'baz']));
   });
 
   test('clear', () {
     final classes = makeClassSet();
     classes.clear();
-    Expect.setEquals([], classes);
+    expect(classes, equals([]));
   });
 }
diff --git a/tests/html/element_constructor_1_test.dart b/tests/html/element_constructor_1_test.dart
index cf4e43f..57f9439 100644
--- a/tests/html/element_constructor_1_test.dart
+++ b/tests/html/element_constructor_1_test.dart
@@ -14,53 +14,66 @@
 main() {
   useHtmlConfiguration();
 
+  var isAnchorElement = 
+      predicate((x) => x is AnchorElement, 'is an AnchorElement');
+  var isAreaElement = 
+      predicate((x) => x is AreaElement, 'is an AreaElement');
+  var isDivElement = predicate((x) => x is DivElement, 'is a DivElement');
+  var isCanvasElement = 
+      predicate((x) => x is CanvasElement, 'is a CanvasElement');
+  var isParagraphElement =
+      predicate((x) => x is ParagraphElement, 'is a ParagraphElement');
+  var isSpanElement = predicate((x) => x is SpanElement, 'is a SpanElement');
+  var isSelectElement = 
+      predicate((x) => x is SelectElement, 'is a SelectElement');
+
   test('anchor1', () {
       var e = new AnchorElement();
-      Expect.isTrue(e is AnchorElement);
+      expect(e, isAnchorElement);
     });
 
   test('anchor2', () {
       var e = new AnchorElement(href: '#blah');
-      Expect.isTrue(e is AnchorElement);
-      Expect.isTrue(e.href.endsWith('#blah'));
+      expect(e, isAnchorElement);
+      expect(e.href, endsWith('#blah'));
     });
 
   test('area', () {
       var e = new AreaElement();
-      Expect.isTrue(e is AreaElement);
+      expect(e, isAreaElement);
     });
 
   // AudioElement tested in audioelement_test.dart
 
   test('div', () {
       var e = new DivElement();
-      Expect.isTrue(e is DivElement);
+      expect(e, isDivElement);
     });
 
   test('canvas1', () {
       var e = new CanvasElement();
-      Expect.isTrue(e is CanvasElement);
+      expect(e, isCanvasElement);
     });
 
   test('canvas2', () {
       var e = new CanvasElement(height: 100, width: 200);
-      Expect.isTrue(e is CanvasElement);
-      Expect.equals(200, e.width);
-      Expect.equals(100, e.height);
+      expect(e, isCanvasElement);
+      expect(e.width, 200);
+      expect(e.height, 100);
     });
 
   test('p', () {
       var e = new ParagraphElement();
-      Expect.isTrue(e is ParagraphElement);
+      expect(e, isParagraphElement);
     });
 
   test('span', () {
       var e = new SpanElement();
-      Expect.isTrue(e is SpanElement);
+      expect(e, isSpanElement);
     });
 
   test('select', () {
       var e = new SelectElement();
-      Expect.isTrue(e is SelectElement);
+      expect(e, isSelectElement);
     });
 }
diff --git a/tests/html/element_test.dart b/tests/html/element_test.dart
index 511eef7..66968b2 100644
--- a/tests/html/element_test.dart
+++ b/tests/html/element_test.dart
@@ -8,12 +8,12 @@
 #import('dart:html');
 
 expectLargeRect(ClientRect rect) {
-  Expect.equals(rect.top, 0);
-  Expect.equals(rect.left, 0);
-  Expect.isTrue(rect.width > 100);
-  Expect.isTrue(rect.height > 100);
-  Expect.equals(rect.bottom, rect.top + rect.height);
-  Expect.equals(rect.right, rect.left + rect.width);
+  expect(rect.top, 0);
+  expect(rect.left, 0);
+  expect(rect.width, greaterThan(100));
+  expect(rect.height, greaterThan(100));
+  expect(rect.bottom, rect.top + rect.height);
+  expect(rect.right, rect.left + rect.width);
 }
 
 void testEventHelper(EventListenerList listenerList, String type,
@@ -38,23 +38,37 @@
     listenerList.dispatch(event);
   }
 
-  Expect.isTrue(firedWhenAddedToListenerList);
+  expect(firedWhenAddedToListenerList, isTrue);
   if (registerOnEventListener != null) {
-    Expect.isTrue(firedOnEvent);
+    expect(firedOnEvent, isTrue);
   }
 }
 
 void testConstructorHelper(String tag, String htmlSnippet,
     String expectedText, Function isExpectedClass) {
-  Expect.isTrue(isExpectedClass(new Element.tag(tag)));
+  expect(isExpectedClass(new Element.tag(tag)), isTrue);
   final elementFromSnippet = new Element.html(htmlSnippet);
-  Expect.isTrue(isExpectedClass(elementFromSnippet));
-  Expect.equals(expectedText, elementFromSnippet.text);
+  expect(isExpectedClass(elementFromSnippet), isTrue);
+  expect(elementFromSnippet.text, expectedText);
 }
 
 main() {
   useHtmlConfiguration();
 
+  var isHRElement = predicate((x) => x is HRElement, 'is a HRElement');
+  var isBRElement = predicate((x) => x is BRElement, 'is a BRElement');
+  var isInputElement =
+      predicate((x) => x is InputElement, 'is an InputElement');
+  var isImageElement =
+      predicate((x) => x is ImageElement, 'is an ImageElement');
+  var isSpanElement = predicate((x) => x is SpanElement, 'is a SpanElement');
+  var isAnchorElement =
+      predicate((x) => x is AnchorElement, 'is an AnchorElement');
+  var isElementList =
+      predicate((x) => x is List<Element>, 'is a List<Element>');
+  var isHeadingElement =
+      predicate((x) => x is HeadingElement, 'is a HeadingElement');
+
   Element makeElement() => new Element.tag('div');
 
   Element makeElementWithChildren() =>
@@ -63,7 +77,7 @@
   test('computedStyle', () {
     final element = document.body;
     element.computedStyle.then(expectAsync1((style) {
-      Expect.equals(style.getPropertyValue('left'), 'auto');
+      expect(style.getPropertyValue('left'), 'auto');
     }));
   });
 
@@ -113,12 +127,11 @@
 
   group('constructors', () {
     test('error', () {
-      Expect.throws(() => new Element.html('<br/><br/>'),
-          (e) => e is ArgumentError);
+      expect(() => new Element.html('<br/><br/>'), throwsArgumentError);
     });
 
     test('.html has no parent', () =>
-        Expect.isNull(new Element.html('<br/>').parent));
+        expect(new Element.html('<br/>').parent, isNull));
 
     test('a', () => testConstructorHelper('a', '<a>foo</a>', 'foo',
         (element) => element is AnchorElement));
@@ -434,136 +447,136 @@
                    data-foo2="bar2" dir="rtl">
                </div>''');
         final attributes = element.attributes;
-        Expect.equals(attributes['class'], 'foo');
-        Expect.equals(attributes['style'], 'overflow: hidden');
-        Expect.equals(attributes['data-foo'], 'bar');
-        Expect.equals(attributes['data-foo2'], 'bar2');
-        Expect.equals(attributes.length, 5);
-        Expect.equals(element.dataAttributes.length, 2);
+        expect(attributes['class'], 'foo');
+        expect(attributes['style'], 'overflow: hidden');
+        expect(attributes['data-foo'], 'bar');
+        expect(attributes['data-foo2'], 'bar2');
+        expect(attributes.length, 5);
+        expect(element.dataAttributes.length, 2);
         element.dataAttributes['foo'] = 'baz';
-        Expect.equals(element.dataAttributes['foo'], 'baz');
-        Expect.equals(attributes['data-foo'], 'baz');
+        expect(element.dataAttributes['foo'], 'baz');
+        expect(attributes['data-foo'], 'baz');
         attributes['data-foo2'] = 'baz2';
-        Expect.equals(attributes['data-foo2'], 'baz2');
-        Expect.equals(element.dataAttributes['foo2'], 'baz2');
-        Expect.equals(attributes['dir'], 'rtl');
+        expect(attributes['data-foo2'], 'baz2');
+        expect(element.dataAttributes['foo2'], 'baz2');
+        expect(attributes['dir'], 'rtl');
 
         final dataAttributes = element.dataAttributes;
         dataAttributes.remove('foo2');
-        Expect.equals(attributes.length, 4);
-        Expect.equals(dataAttributes.length, 1);
+        expect(attributes.length, 4);
+        expect(dataAttributes.length, 1);
         attributes.remove('style');
-        Expect.equals(attributes.length, 3);
+        expect(attributes.length, 3);
         dataAttributes['foo3'] = 'baz3';
-        Expect.equals(dataAttributes.length, 2);
-        Expect.equals(attributes.length, 4);
+        expect(dataAttributes.length, 2);
+        expect(attributes.length, 4);
         attributes['style'] = 'width: 300px;';
-        Expect.equals(attributes.length, 5);
+        expect(attributes.length, 5);
       });
 
       test('coercion', () {
         final element = new Element.tag('div');
         element.attributes['foo'] = 42;
         element.attributes['bar'] = 3.1;
-        Expect.equals(element.attributes['foo'], '42');
-        Expect.equals(element.attributes['bar'], '3.1');
+        expect(element.attributes['foo'], '42');
+        expect(element.attributes['bar'], '3.1');
       });
   });
 
   group('elements', () {
     test('is a subset of nodes', () {
       var el = new Element.html("<div>Foo<br/><img/></div>");
-      Expect.equals(3, el.nodes.length);
-      Expect.equals(2, el.elements.length);
-      Expect.equals(el.nodes[1], el.elements[0]);
-      Expect.equals(el.nodes[2], el.elements[1]);
+      expect(el.nodes.length, 3);
+      expect(el.elements.length, 2);
+      expect(el.nodes[1], el.elements[0]);
+      expect(el.nodes[2], el.elements[1]);
     });
 
     test('changes when an element is added to nodes', () {
       var el = new Element.html("<div>Foo<br/><img/></div>");
       el.nodes.add(new Element.tag('hr'));
-      Expect.equals(3, el.elements.length);
-      Expect.isTrue(el.elements[2] is HRElement);
-      Expect.equals(el.nodes[3], el.elements[2]);
+      expect(el.elements.length, 3);
+      expect(el.elements[2], isHRElement);
+      expect(el.nodes[3], el.elements[2]);
     });
 
     test('changes nodes when an element is added', () {
       var el = new Element.html("<div>Foo<br/><img/></div>");
       el.elements.add(new Element.tag('hr'));
-      Expect.equals(4, el.nodes.length);
-      Expect.isTrue(el.nodes[3] is HRElement);
-      Expect.equals(el.elements[2], el.nodes[3]);
+      expect(el.nodes.length, 4);
+      expect(el.nodes[3], isHRElement);
+      expect(el.elements[2], el.nodes[3]);
     });
 
     test('last', () {
       var el = makeElementWithChildren();
-      Expect.isTrue(el.elements.last is InputElement);
+      expect(el.elements.last, isInputElement);
     });
 
     test('forEach', () {
       var els = [];
       var el = makeElementWithChildren();
       el.elements.forEach((n) => els.add(n));
-      Expect.isTrue(els[0] is BRElement);
-      Expect.isTrue(els[1] is ImageElement);
-      Expect.isTrue(els[2] is InputElement);
+      expect(els[0], isBRElement);
+      expect(els[1], isImageElement);
+      expect(els[2], isInputElement);
     });
 
     test('filter', () {
       var filtered = makeElementWithChildren().elements.
         filter((n) => n is ImageElement);
-      Expect.equals(1, filtered.length);
-      Expect.isTrue(filtered[0] is ImageElement);
-      Expect.isTrue(filtered is List<Element>);
+      expect(1, filtered.length);
+      expect(filtered[0], isImageElement);
+      expect(filtered, isElementList);
     });
 
     test('every', () {
       var el = makeElementWithChildren();
-      Expect.isTrue(el.elements.every((n) => n is Element));
-      Expect.isFalse(el.elements.every((n) => n is InputElement));
+      expect(el.elements.every((n) => n is Element), isTrue);
+      expect(el.elements.every((n) => n is InputElement), isFalse);
     });
 
     test('some', () {
       var el = makeElementWithChildren();
-      Expect.isTrue(el.elements.some((n) => n is InputElement));
-      Expect.isFalse(el.elements.some((n) => n is SVGElement));
+      expect(el.elements.some((n) => n is InputElement), isTrue);
+      expect(el.elements.some((n) => n is SVGElement), isFalse);
     });
 
     test('isEmpty', () {
-      Expect.isTrue(makeElement().elements.isEmpty);
-      Expect.isFalse(makeElementWithChildren().elements.isEmpty);
+      expect(makeElement().elements.isEmpty, isTrue);
+      expect(makeElementWithChildren().elements.isEmpty, isFalse);
     });
 
     test('length', () {
-      Expect.equals(0, makeElement().elements.length);
-      Expect.equals(3, makeElementWithChildren().elements.length);
+      expect(makeElement().elements.length, 0);
+      expect(makeElementWithChildren().elements.length, 3);
     });
 
     test('[]', () {
       var el = makeElementWithChildren();
-      Expect.isTrue(el.elements[0] is BRElement);
-      Expect.isTrue(el.elements[1] is ImageElement);
-      Expect.isTrue(el.elements[2] is InputElement);
+      expect(el.elements[0], isBRElement);
+      expect(el.elements[1], isImageElement);
+      expect(el.elements[2], isInputElement);
     });
 
     test('[]=', () {
       var el = makeElementWithChildren();
       el.elements[1] = new Element.tag('hr');
-      Expect.isTrue(el.elements[0] is BRElement);
-      Expect.isTrue(el.elements[1] is HRElement);
-      Expect.isTrue(el.elements[2] is InputElement);
+      expect(el.elements[0], isBRElement);
+      expect(el.elements[1], isHRElement);
+      expect(el.elements[2], isInputElement);
     });
 
     test('add', () {
       var el = makeElement();
       el.elements.add(new Element.tag('hr'));
-      Expect.isTrue(el.elements.last is HRElement);
+      expect(el.elements.last, isHRElement);
     });
 
     test('addLast', () {
       var el = makeElement();
       el.elements.addLast(new Element.tag('hr'));
-      Expect.isTrue(el.elements.last is HRElement);
+      expect(el.elements.last, isHRElement);
     });
 
     test('iterator', () {
@@ -572,9 +585,9 @@
       for (var subel in el.elements) {
         els.add(subel);
       }
-      Expect.isTrue(els[0] is BRElement);
-      Expect.isTrue(els[1] is ImageElement);
-      Expect.isTrue(els[2] is InputElement);
+      expect(els[0], isBRElement);
+      expect(els[1], isImageElement);
+      expect(els[2], isInputElement);
     });
 
     test('addAll', () {
@@ -584,31 +597,31 @@
         new Element.tag('a'),
         new Element.tag('h1')
       ]);
-      Expect.isTrue(el.elements[0] is BRElement);
-      Expect.isTrue(el.elements[1] is ImageElement);
-      Expect.isTrue(el.elements[2] is InputElement);
-      Expect.isTrue(el.elements[3] is SpanElement);
-      Expect.isTrue(el.elements[4] is AnchorElement);
-      Expect.isTrue(el.elements[5] is HeadingElement);
+      expect(el.elements[0], isBRElement);
+      expect(el.elements[1], isImageElement);
+      expect(el.elements[2], isInputElement);
+      expect(el.elements[3], isSpanElement);
+      expect(el.elements[4], isAnchorElement);
+      expect(el.elements[5], isHeadingElement);
     });
 
     test('clear', () {
       var el = makeElementWithChildren();
       el.elements.clear();
-      Expect.listEquals([], el.elements);
+      expect(el.elements, equals([]));
     });
 
     test('removeLast', () {
       var el = makeElementWithChildren();
-      Expect.isTrue(el.elements.removeLast() is InputElement);
-      Expect.equals(2, el.elements.length);
-      Expect.isTrue(el.elements.removeLast() is ImageElement);
-      Expect.equals(1, el.elements.length);
+      expect(el.elements.removeLast(), isInputElement);
+      expect(el.elements.length, 2);
+      expect(el.elements.removeLast(), isImageElement);
+      expect(el.elements.length, 1);
     });
 
     test('getRange', () {
       var el = makeElementWithChildren();
-      Expect.isTrue(el.elements.getRange(1, 1) is List<Element>);
+      expect(el.elements.getRange(1, 1), isElementList);
     });
   });
 
@@ -631,61 +644,61 @@
 
     void testUnsupported(String name, void f()) {
       test(name, () {
-        Expect.throws(f, (e) => e is UnsupportedError);
+        expect(f, throwsUnsupportedError);
       });
     }
 
     test('last', () {
-      Expect.isTrue(getQueryAll().last is HRElement);
+      expect(getQueryAll().last, isHRElement);
     });
 
     test('forEach', () {
       var els = [];
       getQueryAll().forEach((el) => els.add(el));
-      Expect.isTrue(els[0] is AnchorElement);
-      Expect.isTrue(els[1] is SpanElement);
-      Expect.isTrue(els[2] is HRElement);
+      expect(els[0], isAnchorElement);
+      expect(els[1], isSpanElement);
+      expect(els[2], isHRElement);
     });
 
     test('map', () {
       var texts = getQueryAll().map((el) => el.text);
-      Expect.listEquals(['Dart!', 'Hello', ''], texts);
+      expect(texts, equals(['Dart!', 'Hello', '']));
     });
 
     test('filter', () {
       var filtered = getQueryAll().filter((n) => n is SpanElement);
-      Expect.equals(1, filtered.length);
-      Expect.isTrue(filtered[0] is SpanElement);
-      Expect.isTrue(filtered is List<Element>);
+      expect(filtered.length, 1);
+      expect(filtered[0], isSpanElement);
+      expect(filtered, isElementList);
     });
 
     test('every', () {
       var el = getQueryAll();
-      Expect.isTrue(el.every((n) => n is Element));
-      Expect.isFalse(el.every((n) => n is SpanElement));
+      expect(el.every((n) => n is Element), isTrue);
+      expect(el.every((n) => n is SpanElement), isFalse);
     });
 
     test('some', () {
       var el = getQueryAll();
-      Expect.isTrue(el.some((n) => n is SpanElement));
-      Expect.isFalse(el.some((n) => n is SVGElement));
+      expect(el.some((n) => n is SpanElement), isTrue);
+      expect(el.some((n) => n is SVGElement), isFalse);
     });
 
     test('isEmpty', () {
-      Expect.isTrue(getEmptyQueryAll().isEmpty);
-      Expect.isFalse(getQueryAll().isEmpty);
+      expect(getEmptyQueryAll().isEmpty, isTrue);
+      expect(getQueryAll().isEmpty, isFalse);
     });
 
     test('length', () {
-      Expect.equals(0, getEmptyQueryAll().length);
-      Expect.equals(3, getQueryAll().length);
+      expect(getEmptyQueryAll().length, 0);
+      expect(getQueryAll().length, 3);
     });
 
     test('[]', () {
       var els = getQueryAll();
-      Expect.isTrue(els[0] is AnchorElement);
-      Expect.isTrue(els[1] is SpanElement);
-      Expect.isTrue(els[2] is HRElement);
+      expect(els[0], isAnchorElement);
+      expect(els[1], isSpanElement);
+      expect(els[2], isHRElement);
     });
 
     test('iterator', () {
@@ -693,13 +706,13 @@
       for (var subel in getQueryAll()) {
         els.add(subel);
       }
-      Expect.isTrue(els[0] is AnchorElement);
-      Expect.isTrue(els[1] is SpanElement);
-      Expect.isTrue(els[2] is HRElement);
+      expect(els[0], isAnchorElement);
+      expect(els[1], isSpanElement);
+      expect(els[2], isHRElement);
     });
 
     test('getRange', () {
-      Expect.isTrue(getQueryAll().getRange(1, 1) is List<Element>);
+      expect(getQueryAll().getRange(1, 1) is List<Element>, isTrue);
     });
 
     testUnsupported('[]=', () => getQueryAll()[1] = new Element.tag('br'));
@@ -733,16 +746,16 @@
 
     test('filter', () {
       var filtered = makeElList().filter((n) => n is ImageElement);
-      Expect.equals(1, filtered.length);
-      Expect.isTrue(filtered[0] is ImageElement);
-      Expect.isTrue(filtered is List<Element>);
+      expect(filtered.length, 1);
+      expect(filtered[0], isImageElement);
+      expect(filtered, isElementList);
     });
 
     test('getRange', () {
       var range = makeElList().getRange(1, 2);
-      Expect.isTrue(range is List<Element>);
-      Expect.isTrue(range[0] is ImageElement);
-      Expect.isTrue(range[1] is InputElement);
+      expect(range, isElementList);
+      expect(range[0], isImageElement);
+      expect(range[1], isInputElement);
     });
   });
 }
diff --git a/tests/html/element_webkit_test.dart b/tests/html/element_webkit_test.dart
index dc1e637..64f5c7e 100644
--- a/tests/html/element_webkit_test.dart
+++ b/tests/html/element_webkit_test.dart
@@ -37,9 +37,9 @@
   final event = new Event(type);
   listenerList.dispatch(event);
 
-  Expect.isTrue(firedWhenAddedToListenerList);
+  expect(firedWhenAddedToListenerList, isTrue);
   if (registerOnEventListener != null) {
-    Expect.isTrue(firedOnEvent);
+    expect(firedOnEvent, isTrue);
   }
 }
 
diff --git a/tests/html/event_customevent_test.dart b/tests/html/event_customevent_test.dart
index 348ed16..f7e789a 100644
--- a/tests/html/event_customevent_test.dart
+++ b/tests/html/event_customevent_test.dart
@@ -19,7 +19,7 @@
       validate(ev);
     });
     el.on[type].dispatch(eventFn());
-    expect(fired, isTrue, 'Expected event to be dispatched.');
+    expect(fired, isTrue, reason: 'Expected event to be dispatched.');
   });
 }
 
diff --git a/tests/html/event_test.dart b/tests/html/event_test.dart
index 370ced2..7484432 100644
--- a/tests/html/event_test.dart
+++ b/tests/html/event_test.dart
@@ -19,7 +19,7 @@
       validate(ev);
     });
     el.on[type].dispatch(eventFn());
-    Expect.isTrue(fired, 'Expected event to be dispatched.');
+    expect(fired, isTrue, reason: 'Expected event to be dispatched.');
   });
 }
 
@@ -29,33 +29,33 @@
   // Issue 1005.
   // eventTest('AnimationEvent', () => new AnimationEvent('foo', 'color', 0.5),
   //     (ev) {
-  //   Expect.equals('color', ev.animationName);
-  //   Expect.equals(0.5, ev.elapsedTime);
+  //   expect(ev.animationName, 'color');
+  //   expect(ev.elapsedTime, 0.5);
   // });
 
   // Issue 1005.
   // eventTest('BeforeLoadEvent',
   //    () => new BeforeLoadEvent('foo', 'http://example.url'),
-  //    (ev) { Expect.equals('http://example.url', ev.url); });
+  //    (ev) { expect(ev.url, 'http://example.url'); });
 
   // Issue 1005.
   // eventTest('CloseEvent',
   //     () => new CloseEvent('foo', 5, 'reason', wasClean: true),
   //     (ev) {
-  //   Expect.equals(5, ev.code);
-  //   Expect.equals('reason', ev.reason);
-  //   Expect.isTrue(ev.wasClean);
+  //   expect(ev.code, 5);
+  //   expect(ev.reason, 'reason');
+  //   expect(ev.wasClean, isTrue);
   // });
 
   eventTest('CompositionEvent',
       () => new CompositionEvent('compositionstart', window, 'data'),
-      (ev) { Expect.equals('data', ev.data); },
+      (ev) { expect(ev.data, 'data'); },
       type: 'compositionstart');
 
   // initCustomEvent is not yet implemented
   // eventTest('CustomEvent',
   //     () => new CustomEvent('foo', false, false, 'detail'),
-  //     (ev) { Expect.equals('detail', ev.detail); });
+  //     (ev) { expect(ev.detail, 'detail'); });
 
   // DeviceMotionEvent has no properties to itself, so just test that it doesn't
   // error out on creation and can be dispatched.
@@ -65,46 +65,46 @@
   // eventTest('DeviceOrientationEvent',
   //     () => new DeviceOrientationEvent('foo', 0.1, 0.2, 0.3),
   //     (ev) {
-  //   Expect.equals(0.1, ev.alpha);
-  //   Expect.equals(0.2, ev.beta);
-  //   Expect.equals(0.3, ev.gamma);
+  //   expect(ev.alpha, 0.1);
+  //   expect(ev.beta, 0.2);
+  //   expect(ev.gamma, 0.3);
   // });
 
   // Issue 1005.
   // eventTest('ErrorEvent',
   //     () => new ErrorEvent('foo', 'message', 'filename', 10),
   //     (ev) {
-  //   Expect.equals('message', ev.message);
-  //   Expect.equals('filename', ev.filename);
-  //   Expect.equals(10, ev.lineno);
+  //   expect('message', ev.message);
+  //   expect('filename', ev.filename);
+  //   expect(ev.lineno, 10);
   // });
 
   eventTest('Event',
       () => new Event('foo', canBubble: false, cancelable: false),
       (ev) {
-    Expect.equals('foo', ev.type);
-    Expect.isFalse(ev.bubbles);
-    Expect.isFalse(ev.cancelable);
+    expect(ev.type, equals('foo'));
+    expect(ev.bubbles, isFalse);
+    expect(ev.cancelable, isFalse);
   });
 
   eventTest('HashChangeEvent',
       () => new HashChangeEvent('foo', 'http://old.url', 'http://new.url'),
       (ev) {
-    Expect.equals('http://old.url', ev.oldURL);
-    Expect.equals('http://new.url', ev.newURL);
+    expect(ev.oldURL, equals('http//old.url'));
+    expect(ev.newURL, equals('http://new.url'));
   });
 
   eventTest('KeyboardEvent',
       () => new KeyboardEvent('foo', window, 'key', 10, ctrlKey: true,
           altKey: true, shiftKey: true, metaKey: true, altGraphKey: true),
       (ev) {
-    Expect.equals('key', ev.keyIdentifier);
-    Expect.equals(10, ev.keyLocation);
-    Expect.isTrue(ev.ctrlKey);
-    Expect.isTrue(ev.altKey);
-    Expect.isTrue(ev.shiftKey);
-    Expect.isTrue(ev.metaKey);
-    Expect.isTrue(ev.altGraphKey);
+    expect.equals(ev.keyIdentifier, equals('key'));
+    expect.equals(ev.keyLocation, equals(10));
+    expect(ev.ctrlKey, isTrue);
+    expect(ev.altKey, isTrue);
+    expect(ev.shiftKey, isTrue);
+    expect(ev.metaKey, isTrue);
+    expect(ev.altGraphKey, isTrue);
   });
 
   eventTest('MouseEvent',
@@ -114,30 +114,30 @@
           cancelable: true, ctrlKey: true, altKey: true, shiftKey: true,
           metaKey: true, relatedTarget: new Element.tag('div')),
       (ev) {
-    Expect.equals(1, ev.detail);
-    Expect.equals(2, ev.screenX);
-    Expect.equals(3, ev.screenY);
-    Expect.equals(4, ev.clientX);
-    Expect.equals(5, ev.clientY);
-    Expect.equals(4, ev.offsetX);  // Same as clientX.
-    Expect.equals(5, ev.offsetY);  // Same as clientY.
-    Expect.equals(6, ev.button);
-    Expect.isTrue(ev.ctrlKey);
-    Expect.isTrue(ev.altKey);
-    Expect.isTrue(ev.shiftKey);
-    Expect.isTrue(ev.metaKey);
-    Expect.equals('DIV', ev.relatedTarget.tagName);
+    expect(ev.detail, 1);
+    expect(ev.screenX, 2);
+    expect(ev.screenYi, 3);
+    expect(ev.clientX, 4);
+    expect(ev.clientY, 5);
+    expect(ev.offsetX, 4);  // Same as clientX.
+    expect(ev.offsetY, 5);  // Same as clientY.
+    expect(ev.button, 6);
+    expect(ev.ctrlKey, isTrue);
+    expect(ev.altKey, isTrue);
+    expect(ev.shiftKey, isTrue);
+    expect(ev.metaKey, isTrue);
+    expect(ev.relatedTarget.tagName, 'DIV');
   });
 
   eventTest('MutationEvent',
       () => new MutationEvent('foo', new Element.tag('div'), 'red', 'blue',
           'color', MutationEvent.MODIFICATION),
       (ev) {
-    Expect.equals('DIV', ev.relatedNode.tagName);
-    Expect.equals('red', ev.prevValue);
-    Expect.equals('blue', ev.newValue);
-    Expect.equals('color', ev.attrName);
-    Expect.equals(MutationEvent.MODIFICATION, ev.attrChange);
+    expect(ev.relatedNode.tagName, 'DIV');
+    expect.equals(ev.prevValue, 'red');
+    expect.equals(ev.newValue, 'blue');
+    expect.equals(ev.attrName, 'color');
+    expect.equals(ev.attrChange, equals(MutationEvent.MODIFICATION));
   });
 
   test('DOMMutationEvent', () {
@@ -150,19 +150,19 @@
   // eventTest('OverflowEvent',
   //     () => new OverflowEvent(OverflowEvent.BOTH, true, true),
   //     (ev) {
-  //   Expect.equals(OverflowEvent.BOTH, ev.orient);
-  //   Expect.isTrue(ev.horizontalOverflow);
-  //   Expect.isTrue(ev.verticalOverflow);
+  //   expect(ev.orient, OverflowEvent.BOTH);
+  //   expect(ev.horizontalOverflow, isTrue);
+  //   expect(ev.verticalOverflow, isTrue);
   // }, type: 'overflowchanged');
 
   // Issue 1005.
   // eventTest('PageTransitionEvent',
   //     () => new PageTransitionEvent('foo', persisted: true),
-  //     (ev) { Expect.isTrue(ev.persisted); });
+  //     (ev) { expect(ev.persisted, isTrue); });
 
   // initPopStateEvent is not yet implemented
   // eventTest('PopStateEvent', () => new PopStateEvent('foo', 'state'),
-  //     (ev) { Expect.equals('state', ev.state); }
+  //     (ev) { expect(ev.state, 'state'); }
 
   // Issue 1005.
   // eventTest('ProgressEvent',
@@ -171,9 +171,9 @@
   //     () => new ProgressEvent('foo', 5, canBubble: true, cancelable: true,
   //         lengthComputable: true, total: 10),
   //     (ev) {
-  //   Expect.equals(5, ev.loaded);
-  //   Expect.isTrue(ev.lengthComputable);
-  //   Expect.equals(10, ev.total);
+  //   expect(ev.loaded, 5);
+  //   expect(ev.lengthComputable, isTrue);
+  //   expect(ev.total, 10);
   // });
 
   eventTest('StorageEvent',
@@ -181,28 +181,28 @@
           window.localStorage, canBubble: true, cancelable: true,
           oldValue: 'old', newValue: 'new'),
       (ev) {
-    Expect.equals('key', ev.key);
-    Expect.equals('http://example.url', ev.url);
+    expect(ev.key, 'key');
+    expect(ev.url, 'http://example.url');
     // Equality isn't preserved for storageArea
-    Expect.isNotNull(ev.storageArea);
-    Expect.equals('old', ev.oldValue);
-    Expect.equals('new', ev.newValue);
+    expect.isNotNull(ev.storageArea);
+    expect(ev.oldValue, 'old');
+    expect(ev.newValue, 'new');
   });
 
   eventTest('TextEvent', () => new TextEvent('foo', window, 'data'),
-      (ev) { Expect.equals('data', ev.data); });
+      (ev) { expect(ev.data, 'data'); });
 
   // Issue 1005.
   // eventTest('TransitionEvent', () => new TransitionEvent('foo', 'color', 0.5),
   //     (ev) {
-  //   Expect.equals('color', ev.propertyName);
-  //   Expect.equals(0.5, ev.elapsedTime);
+  //   expect(ev.propertyName, 'color');
+  //   expect(ev.elapsedTime, 0.5);
   // });
 
   eventTest('UIEvent', () => new UIEvent('foo', window, 12),
       (ev) {
-    Expect.equals(window, ev.view);
-    Expect.equals(12, ev.detail);
+    expect(window, ev.view, window);
+    expect(12, ev.detail, 12);
   });
 
   eventTest('WheelEvent',
@@ -210,16 +210,16 @@
           altKey: true, shiftKey: true, metaKey: true),
       (ev) {
     // wheelDelta* properties are multiplied by 120 for some reason
-    Expect.equals(120, ev.wheelDeltaX);
-    Expect.equals(240, ev.wheelDeltaY);
-    Expect.equals(3, ev.screenX);
-    Expect.equals(4, ev.screenY);
-    Expect.equals(5, ev.clientX);
-    Expect.equals(6, ev.clientY);
-    Expect.isTrue(ev.ctrlKey);
-    Expect.isTrue(ev.altKey);
-    Expect.isTrue(ev.shiftKey);
-    Expect.isTrue(ev.metaKey);
+    expect(ev.wheelDeltaX, 120);
+    expect(ev.wheelDeltaY, 240);
+    expect(ev.screenX, 3);
+    expect(ev.screenY, 4);
+    expect(ev.clientX, 5);
+    expect(ev.clientY, 6);
+    expect(ev.ctrlKey, isTrue);
+    expect(ev.altKey, isTrue);
+    expect(ev.shiftKey, isTrue);
+    expect(ev.metaKey, isTrue);
   }, type: 'mousewheel');
 
   // HttpRequestProgressEvent has no properties to itself, so just test that
diff --git a/tests/html/events_test.dart b/tests/html/events_test.dart
index 0657de0..62fbb7e 100644
--- a/tests/html/events_test.dart
+++ b/tests/html/events_test.dart
@@ -9,7 +9,7 @@
     Event event = new Event('test');
 
     int timeStamp = event.timeStamp;
-    Expect.isTrue(timeStamp > 0);
+    expect(timeStamp, greaterThan(0));
   });
   // The next test is not asynchronous because [on['test'].dispatch(event)] fires the event
   // and event listener synchronously.
@@ -20,9 +20,9 @@
 
     int invocationCounter = 0;
     void handler(Event e) {
-      Expect.equals('test', e.type);
+      expect(e.type, equals('test'));
       Element target = e.target;
-      Expect.identical(element, target);
+      expect(element, equals(target));
       invocationCounter++;
     }
 
@@ -30,27 +30,27 @@
 
     invocationCounter = 0;
     element.on['test'].dispatch(event);
-    Expect.equals(0, invocationCounter);
+    expect(invocationCounter, isZero);
 
     element.on['test'].add(handler, false);
     invocationCounter = 0;
     element.on['test'].dispatch(event);
-    Expect.equals(1, invocationCounter);
+    expect(invocationCounter, 1);
 
     element.on['test'].remove(handler, false);
     invocationCounter = 0;
     element.on['test'].dispatch(event);
-    Expect.equals(0, invocationCounter);
+    expect(invocationCounter, isZero);
 
     element.on['test'].add(handler, false);
     invocationCounter = 0;
     element.on['test'].dispatch(event);
-    Expect.equals(1, invocationCounter);
+    expect(invocationCounter, 1);
 
     element.on['test'].add(handler, false);
     invocationCounter = 0;
     element.on['test'].dispatch(event);
-    Expect.equals(1, invocationCounter);
+    expect(invocationCounter, 1);
   });
   test('InitMouseEvent', () {
     DivElement div = new Element.tag('div');
diff --git a/tests/html/exceptions_test.dart b/tests/html/exceptions_test.dart
index 984a3d0..2895d02 100644
--- a/tests/html/exceptions_test.dart
+++ b/tests/html/exceptions_test.dart
@@ -9,9 +9,9 @@
     try {
       window.webkitNotifications.createNotification('', '', '');
     } on DOMException catch (e) {
-      Expect.equals(DOMException.SECURITY_ERR, e.code);
-      Expect.equals('SECURITY_ERR', e.name);
-      Expect.equals('SECURITY_ERR: DOM Exception 18', e.message);
+      expect(e.code, DOMException.SECURITY_ERR);
+      expect(e.name, 'SECURITY_ERR');
+      expect(e.message, 'SECURITY_ERR: DOM Exception 18');
     }
   });
   test('EventException', () {
@@ -20,9 +20,9 @@
     try {
       document.$dom_dispatchEvent(event);
     } on EventException catch (e) {
-      Expect.equals(EventException.UNSPECIFIED_EVENT_TYPE_ERR, e.code);
-      Expect.equals('UNSPECIFIED_EVENT_TYPE_ERR', e.name);
-      Expect.equals('UNSPECIFIED_EVENT_TYPE_ERR: DOM Events Exception 0', e.message);
+      expect(e.code, EventException.UNSPECIFIED_EVENT_TYPE_ERR);
+      expect(e.name, 'UNSPECIFIED_EVENT_TYPE_ERR');
+      expect(e.message, 'UNSPECIFIED_EVENT_TYPE_ERR: DOM Events Exception 0');
     }
   });
 }
diff --git a/tests/html/fileapi_test.dart b/tests/html/fileapi_test.dart
index 82aad86..bb15d15 100644
--- a/tests/html/fileapi_test.dart
+++ b/tests/html/fileapi_test.dart
@@ -5,7 +5,7 @@
 
 void fail(message) {
   guardAsync(() {
-    Expect.fail(message);
+    expect(false, isTrue, reason: message);
   });
 }
 
@@ -69,7 +69,7 @@
           options: {'create': true},
           successCallback: expectAsync1((FileEntry e) {
             expect(e.name, equals('file4'));
-            expect(e.isFile, equals(true));
+            expect(e.isFile, isTrue);
           }),
           errorCallback: (e) {
             fail('Got file error: ${e.code}');
diff --git a/tests/html/form_data_test.dart b/tests/html/form_data_test.dart
index eedafb1..808c52f 100644
--- a/tests/html/form_data_test.dart
+++ b/tests/html/form_data_test.dart
@@ -13,16 +13,18 @@
   // both a server and fire up a browser.
   useHtmlConfiguration();
 
+  var isFormData = predicate((x) => x is FormData, 'is a FormData');
+
   test('constructorTest1', () {
     var form = new FormData();
     expect(form, isNotNull);
-    expect(form is FormData);
+    expect(form, isFormData);
   });
 
   test('constructorTest2', () {
     var form = new FormData(new FormElement());
     expect(form, isNotNull);
-    expect(form is FormData);
+    expect(form, isFormData);
   });
 
   test('appendTest', () {
diff --git a/tests/html/form_element_test.dart b/tests/html/form_element_test.dart
index 03b36f7..a4b81f5 100644
--- a/tests/html/form_element_test.dart
+++ b/tests/html/form_element_test.dart
@@ -11,10 +11,12 @@
 void main() {
   useHtmlConfiguration();
 
+  var isFormElement = predicate((x) => x is FormElement, 'is a FormElement');
+
   test('constructorTest1', () {
     var form = new FormElement();
     expect(form, isNotNull);
-    expect(form is FormElement);
+    expect(form, isFormElement);
   });
 
   test('checkValidityTest', () {
diff --git a/tests/html/hidden_dom_1_test.dart b/tests/html/hidden_dom_1_test.dart
index f2a4597..7d7e05a 100644
--- a/tests/html/hidden_dom_1_test.dart
+++ b/tests/html/hidden_dom_1_test.dart
@@ -15,7 +15,7 @@
 Hello World!
 </div>'''));
     Element e = document.query('#div1');
-    Expect.isTrue(e != null);
+    expect(e, isNotNull);
 
     checkNoSuchMethod(() { confuse(e).onfocus = null; });
   });
@@ -39,7 +39,7 @@
     ex = e;
   }
   if (ex === null)
-    Expect.fail('Action should have thrown exception');
+    expect(false, isTrue, reason: 'Action should have thrown exception');
 
-  Expect.isTrue(ex is NoSuchMethodError, 'ex is NoSuchMethodError');
+  expect(ex, isNoSuchMethodError);
 }
diff --git a/tests/html/hidden_dom_2_test.dart b/tests/html/hidden_dom_2_test.dart
index 262fbf8..1e73b37 100644
--- a/tests/html/hidden_dom_2_test.dart
+++ b/tests/html/hidden_dom_2_test.dart
@@ -16,7 +16,7 @@
 </div>'''));
     Element e = document.query('#div1');
     Element e2 = new Element.html(r"<div id='xx'>XX</div>");
-    Expect.isTrue(e != null);
+    expect(e, isNotNull);
 
     checkNoSuchMethod(() { confuse(e).appendChild(e2); });
 
@@ -42,7 +42,7 @@
     ex = e;
   }
   if (!threw)
-    Expect.fail('Action should have thrown exception');
+    expect(false, isTrue, reason: 'Action should have thrown exception');
 
-  Expect.isTrue(ex is NoSuchMethodError, 'ex is NoSuchMethodError');
+  expect(ex, isNoSuchMethodError);
 }
diff --git a/tests/html/html.status b/tests/html/html.status
index 5f77f84..b31ad44 100644
--- a/tests/html/html.status
+++ b/tests/html/html.status
@@ -53,6 +53,7 @@
 
 [ $runtime == dartium || $runtime == chrome || $runtime == ie9 || $runtime == ie10 || $runtime == safari || $runtime == ff || $runtime == opera ]
 history_test: Fail
+audiocontext_test: Fail # After WebKit roll due to renamed method?
 
 [$runtime == ie10 ]
 # TODO(efortuna, blois): Triage.
@@ -179,7 +180,7 @@
 instance_of_test: Fail
 mutationobserver_test: Fail
 native_gc_test: Fail
-node_test: Fail
+node_test: Skip # Issue 6457
 serialized_script_value_test: Fail
 svgelement2_test: Fail
 svgelement_test: Fail
@@ -273,6 +274,7 @@
 
 [ $compiler == dart2js && $runtime == drt ]
 # Unknown error - should investigate.
+audiocontext_test: Fail
 htmloptionscollection_test: Fail # Issue 3813.
 unknownelement_test: Fail # Issue 4189
 
@@ -300,6 +302,3 @@
 
 [ $compiler == dart2js && $runtime == chrome && $system == windows]
 css_test: Pass, Fail # Issue #2823
-
-[ $compiler == dart2js && $checked && $browser]
-fileapi_test: Fail # TypeError: Object #<DirectoryEntry> has no method 'get$name'
diff --git a/tests/html/htmlaudioelement_test.dart b/tests/html/htmlaudioelement_test.dart
index c526b0f..6d1b1c9 100644
--- a/tests/html/htmlaudioelement_test.dart
+++ b/tests/html/htmlaudioelement_test.dart
@@ -7,16 +7,19 @@
 
   useHtmlConfiguration();
 
+  var isAudioElement =
+      predicate((x) => x is AudioElement, 'is an AudioElement');
+
   test('constructorTest1', () {
       var audio = new AudioElement();   // would be new Audio() in JS
-      Expect.isTrue(audio != null);
-      Expect.isTrue(audio is AudioElement);
+      expect(audio, isNotNull);
+      expect(audio, isAudioElement);
     });
 
   test('constructorTest2', () {
       var audio = new AudioElement('hahaURL');
-      Expect.isTrue(audio != null);
-      Expect.isTrue(audio is AudioElement);
-      Expect.isTrue(audio.src.indexOf('hahaURL') >= 0);
+      expect(audio, isNotNull);
+      expect(audio, isAudioElement);
+      expect(audio.src.indexOf('hahaURL'), greaterThanOrEqualTo(0));
     });
 }
diff --git a/tests/html/htmlcollection_test.dart b/tests/html/htmlcollection_test.dart
index e7cc4d1..7f6ce9c 100644
--- a/tests/html/htmlcollection_test.dart
+++ b/tests/html/htmlcollection_test.dart
@@ -33,13 +33,14 @@
   }
 
   useHtmlConfiguration();
+
   test('IsList', () {
     Element root = insertTestDiv();
 
     List<Element> eachChecked =
         document.query('#allChecked').elements;
 
-    Expect.isTrue(eachChecked is List);
+    expect(eachChecked, isList);
 
     root.remove();
   });
@@ -55,16 +56,16 @@
     List<Element> noneChecked =
         document.query('#noneChecked').elements;
 
-    Expect.equals(4, eachChecked.length);
-    Expect.equals(4, someChecked.length);
-    Expect.equals(4, noneChecked.length);
+    expect(eachChecked.length, 4);
+    expect(someChecked.length, 4);
+    expect(noneChecked.length, 4);
 
-    Expect.isTrue(eachChecked.every((x) => x.checked));
-    Expect.isFalse(eachChecked.every((x) => !x.checked));
-    Expect.isFalse(someChecked.every((x) => x.checked));
-    Expect.isFalse(someChecked.every((x) => !x.checked));
-    Expect.isFalse(noneChecked.every((x) => x.checked));
-    Expect.isTrue(noneChecked.every((x) => !x.checked));
+    expect(eachChecked.every((x) => x.checked), isTrue);
+    expect(eachChecked.every((x) => !x.checked), isFalse);
+    expect(someChecked.every((x) => x.checked), isFalse);
+    expect(someChecked.every((x) => !x.checked), isFalse);
+    expect(noneChecked.every((x) => x.checked), isFalse);
+    expect(noneChecked.every((x) => !x.checked), isTrue);
 
     root.remove();
   });
@@ -80,16 +81,16 @@
     List<Element> noneChecked =
         document.query('#noneChecked').elements;
 
-    Expect.equals(4, eachChecked.length);
-    Expect.equals(4, someChecked.length);
-    Expect.equals(4, noneChecked.length);
+    expect(eachChecked.length, 4);
+    expect(someChecked.length, 4);
+    expect(noneChecked.length, 4);
 
-    Expect.isTrue(eachChecked.some((x) => x.checked));
-    Expect.isFalse(eachChecked.some((x) => !x.checked));
-    Expect.isTrue(someChecked.some((x) => x.checked));
-    Expect.isTrue(someChecked.some((x) => !x.checked));
-    Expect.isFalse(noneChecked.some((x) => x.checked));
-    Expect.isTrue(noneChecked.some((x) => !x.checked));
+    expect(eachChecked.some((x) => x.checked), isTrue);
+    expect(eachChecked.some((x) => !x.checked), isFalse);
+    expect(someChecked.some((x) => x.checked), isTrue);
+    expect(someChecked.some((x) => !x.checked), isTrue);
+    expect(noneChecked.some((x) => x.checked), isFalse);
+    expect(noneChecked.some((x) => !x.checked), isTrue);
 
     root.remove();
   });
@@ -105,16 +106,16 @@
     List<Element> noneChecked =
         document.query('#noneChecked').elements;
 
-    Expect.equals(4, eachChecked.length);
-    Expect.equals(4, someChecked.length);
-    Expect.equals(4, noneChecked.length);
+    expect(eachChecked.length, 4);
+    expect(someChecked.length, 4);
+    expect(noneChecked.length, 4);
 
-    Expect.equals(4, eachChecked.filter((x) => x.checked).length);
-    Expect.equals(0, eachChecked.filter((x) => !x.checked).length);
-    Expect.equals(2, someChecked.filter((x) => x.checked).length);
-    Expect.equals(2, someChecked.filter((x) => !x.checked).length);
-    Expect.equals(0, noneChecked.filter((x) => x.checked).length);
-    Expect.equals(4, noneChecked.filter((x) => !x.checked).length);
+    expect(eachChecked.filter((x) => x.checked).length, 4);
+    expect(eachChecked.filter((x) => !x.checked).length, 0);
+    expect(someChecked.filter((x) => x.checked).length, 2);
+    expect(someChecked.filter((x) => !x.checked).length, 2);
+    expect(noneChecked.filter((x) => x.checked).length, 0);
+    expect(noneChecked.filter((x) => !x.checked).length, 4);
 
     root.remove();
   });
@@ -127,11 +128,11 @@
     List<Element> emptyDiv =
         document.query('#emptyDiv').elements;
 
-    Expect.equals(4, someChecked.length);
-    Expect.equals(0, emptyDiv.length);
+    expect(someChecked.length, 4);
+    expect(emptyDiv.length, 0);
 
-    Expect.isFalse(someChecked.isEmpty);
-    Expect.isTrue(emptyDiv.isEmpty);
+    expect(someChecked.isEmpty, isFalse);
+    expect(emptyDiv.isEmpty, isTrue);
 
     root.remove();
   });
@@ -156,16 +157,16 @@
     List<Element> noneChecked =
         document.query('#noneChecked').elements;
 
-    Expect.equals(4, eachChecked.length);
-    Expect.equals(4, someChecked.length);
-    Expect.equals(4, noneChecked.length);
+    expect(eachChecked.length, 4);
+    expect(someChecked.length, 4);
+    expect(noneChecked.length, 4);
 
-    Expect.equals(4, countWithForEach(eachChecked, (x) => x.checked));
-    Expect.equals(0, countWithForEach(eachChecked, (x) => !x.checked));
-    Expect.equals(2, countWithForEach(someChecked, (x) => x.checked));
-    Expect.equals(2, countWithForEach(someChecked, (x) => !x.checked));
-    Expect.equals(0, countWithForEach(noneChecked, (x) => x.checked));
-    Expect.equals(4, countWithForEach(noneChecked, (x) => !x.checked));
+    expect(countWithForEach(eachChecked, (x) => x.checked), 4);
+    expect(countWithForEach(eachChecked, (x) => !x.checked), 0);
+    expect(countWithForEach(someChecked, (x) => x.checked), 2);
+    expect(countWithForEach(someChecked, (x) => !x.checked), 2);
+    expect(countWithForEach(noneChecked, (x) => x.checked), 0);
+    expect(countWithForEach(noneChecked, (x) => !x.checked), 4);
 
     root.remove();
   });
@@ -190,16 +191,16 @@
     List<Element> noneChecked =
         document.query('#noneChecked').elements;
 
-    Expect.equals(4, eachChecked.length);
-    Expect.equals(4, someChecked.length);
-    Expect.equals(4, noneChecked.length);
+    expect(eachChecked.length, 4);
+    expect(someChecked.length, 4);
+    expect(noneChecked.length, 4);
 
-    Expect.equals(4, countWithForLoop(eachChecked, (x) => x.checked));
-    Expect.equals(0, countWithForLoop(eachChecked, (x) => !x.checked));
-    Expect.equals(2, countWithForLoop(someChecked, (x) => x.checked));
-    Expect.equals(2, countWithForLoop(someChecked, (x) => !x.checked));
-    Expect.equals(0, countWithForLoop(noneChecked, (x) => x.checked));
-    Expect.equals(4, countWithForLoop(noneChecked, (x) => !x.checked));
+    expect(countWithForLoop(eachChecked, (x) => x.checked), 4);
+    expect(countWithForLoop(eachChecked, (x) => !x.checked), 0);
+    expect(countWithForLoop(someChecked, (x) => x.checked), 2);
+    expect(countWithForLoop(someChecked, (x) => !x.checked), 2);
+    expect(countWithForLoop(noneChecked, (x) => x.checked), 0);
+    expect(countWithForLoop(noneChecked, (x) => !x.checked), 4);
 
     root.remove();
   });
@@ -209,9 +210,9 @@
     List<Element> someChecked =
         document.query('#someChecked').elements;
 
-    Expect.equals(4, someChecked.length);
+    expect(someChecked.length, 4);
 
-    Expect.equals(someChecked[3], someChecked.last);
+    expect(someChecked.last, equals(someChecked[3]));
 
     root.remove();
   });
@@ -224,24 +225,23 @@
     List<Element> noneChecked =
         document.query('#noneChecked').elements;
 
-    Expect.equals(4, someChecked.length);
-    Expect.equals(4, noneChecked.length);
+    expect(someChecked.length, 4);
+    expect(noneChecked.length, 4);
 
-    Expect.equals(0, someChecked.indexOf(someChecked[0], 0));
-    Expect.equals(1, someChecked.indexOf(someChecked[1], 0));
-    Expect.equals(2, someChecked.indexOf(someChecked[2], 0));
-    Expect.equals(3, someChecked.indexOf(someChecked[3], 0));
+    expect(someChecked.indexOf(someChecked[0], 0), 0);
+    expect(someChecked.indexOf(someChecked[1], 0), 1);
+    expect(someChecked.indexOf(someChecked[2], 0), 2);
+    expect(someChecked.indexOf(someChecked[3], 0), 3);
 
-    Expect.equals(-1, someChecked.indexOf(someChecked[0], 1));
-    Expect.equals(-1, someChecked.indexOf(someChecked[1], 2));
-    Expect.equals(-1, someChecked.indexOf(someChecked[2], 3));
-    Expect.equals(-1, someChecked.indexOf(someChecked[3], 4));
+    expect(someChecked.indexOf(someChecked[0], 1), -1);
+    expect(someChecked.indexOf(someChecked[1], 2), -1);
+    expect(someChecked.indexOf(someChecked[2], 3), -1);
+    expect(someChecked.indexOf(someChecked[3], 4), -1);
 
-
-    Expect.equals(-1, someChecked.indexOf(noneChecked[0], 0));
-    Expect.equals(-1, noneChecked.indexOf(someChecked[0], 0));
-    Expect.equals(-1, someChecked.indexOf(noneChecked[1], 0));
-    Expect.equals(-1, noneChecked.indexOf(someChecked[1], 0));
+    expect(someChecked.indexOf(noneChecked[0], 0), -1);
+    expect(noneChecked.indexOf(someChecked[0], 0), -1);
+    expect(someChecked.indexOf(noneChecked[1], 0), -1);
+    expect(noneChecked.indexOf(someChecked[1], 0), -1);
 
     root.remove();
   });
@@ -254,23 +254,23 @@
     List<Element> noneChecked =
         document.query('#noneChecked').elements;
 
-    Expect.equals(4, someChecked.length);
-    Expect.equals(4, noneChecked.length);
+    expect(someChecked.length, 4);
+    expect(noneChecked.length, 4);
 
-    Expect.equals(0, someChecked.lastIndexOf(someChecked[0], 3));
-    Expect.equals(1, someChecked.lastIndexOf(someChecked[1], 3));
-    Expect.equals(2, someChecked.lastIndexOf(someChecked[2], 3));
-    Expect.equals(3, someChecked.lastIndexOf(someChecked[3], 3));
+    expect(someChecked.lastIndexOf(someChecked[0], 3), 0);
+    expect(someChecked.lastIndexOf(someChecked[1], 3), 1);
+    expect(someChecked.lastIndexOf(someChecked[2], 3), 2);
+    expect(someChecked.lastIndexOf(someChecked[3], 3), 3);
 
-    Expect.equals(-1, someChecked.lastIndexOf(someChecked[0], -1));
-    Expect.equals(-1, someChecked.lastIndexOf(someChecked[1], 0));
-    Expect.equals(-1, someChecked.lastIndexOf(someChecked[2], 1));
-    Expect.equals(-1, someChecked.lastIndexOf(someChecked[3], 2));
+    expect(someChecked.lastIndexOf(someChecked[0], -1), -1);
+    expect(someChecked.lastIndexOf(someChecked[1], 0), -1);
+    expect(someChecked.lastIndexOf(someChecked[2], 1), -1);
+    expect(someChecked.lastIndexOf(someChecked[3], 2), -1);
 
-    Expect.equals(-1, someChecked.lastIndexOf(noneChecked[0], 3));
-    Expect.equals(-1, noneChecked.lastIndexOf(someChecked[0], 3));
-    Expect.equals(-1, someChecked.lastIndexOf(noneChecked[1], 3));
-    Expect.equals(-1, noneChecked.lastIndexOf(someChecked[1], 3));
+    expect(someChecked.lastIndexOf(noneChecked[0], 3), -1);
+    expect(noneChecked.lastIndexOf(someChecked[0], 3), -1);
+    expect(someChecked.lastIndexOf(noneChecked[1], 3), -1);
+    expect(noneChecked.lastIndexOf(someChecked[1], 3), -1);
 
     root.remove();
   });
diff --git a/tests/html/htmlelement_test.dart b/tests/html/htmlelement_test.dart
index ba83071..ea99338 100644
--- a/tests/html/htmlelement_test.dart
+++ b/tests/html/htmlelement_test.dart
@@ -12,7 +12,7 @@
     document.body.nodes.add(element);
 
     element = document.query('#test');
-    Expect.stringEquals('Hello World', element.innerHTML);
+    expect(element.innerHTML, 'Hello World');
     element.remove();
   });
   test('HTMLTable', () {
@@ -24,26 +24,26 @@
     row.nodes.add(new Element.tag('td'));
     row.nodes.add(new Element.tag('td'));
 
-    Expect.equals(2, row.cells.length);
+    expect(row.cells.length, 2);
 
     TableRowElement headerRow = table.rows[0];
-    Expect.equals(2, headerRow.cells.length);
+    expect(headerRow.cells.length, 2);
   });
   test('dataAttributes', () {
     Element div = new Element.tag('div');
 
-    Expect.isTrue(div.dataAttributes.isEmpty);
-    Expect.equals(null, div.dataAttributes['foo']);
-    Expect.isTrue(div.dataAttributes.isEmpty);
+    expect(div.dataAttributes.isEmpty, isTrue);
+    expect(div.dataAttributes['foo'], isNull);
+    expect(div.dataAttributes.isEmpty, isTrue);
 
     div.dataAttributes['foo'] = 'foo-value';
-    Expect.equals('foo-value', div.dataAttributes['foo']);
-    Expect.isFalse(div.dataAttributes.isEmpty);
+    expect(div.dataAttributes['foo'], 'foo-value');
+    expect(div.dataAttributes.isEmpty, isFalse);
 
-    Expect.isTrue(div.dataAttributes.containsValue('foo-value'));
-    Expect.isFalse(div.dataAttributes.containsValue('bar-value'));
-    Expect.isTrue(div.dataAttributes.containsKey('foo'));
-    Expect.isFalse(div.dataAttributes.containsKey('bar'));
+    expect(div.dataAttributes.containsValue('foo-value'), isTrue);
+    expect(div.dataAttributes.containsValue('bar-value'), isFalse);
+    expect(div.dataAttributes.containsKey('foo'), isTrue);
+    expect(div.dataAttributes.containsKey('bar'), isFalse);
 
     bool hasBeenInvoked;
     String f() {
@@ -52,12 +52,12 @@
     }
 
     hasBeenInvoked = false;
-    Expect.equals('bar-value', div.dataAttributes.putIfAbsent('bar', f));
-    Expect.isTrue(hasBeenInvoked);
+    expect(div.dataAttributes.putIfAbsent('bar', f), 'bar-value');
+    expect(hasBeenInvoked, isTrue);
 
     hasBeenInvoked = false;
-    Expect.equals('bar-value', div.dataAttributes.putIfAbsent('bar', f));
-    Expect.isFalse(hasBeenInvoked);
+    expect(div.dataAttributes.putIfAbsent('bar', f), 'bar-value');
+    expect(hasBeenInvoked, isFalse);
 
     final keys = <String> [];
     final values = <String> [];
@@ -65,27 +65,27 @@
         keys.add(key);
         values.add(value);
     });
-    Expect.setEquals(const <String> ['foo', 'bar'], keys);
-    Expect.setEquals(const <String> ['foo-value', 'bar-value'], values);
+    expect(keys, unorderedEquals(['foo', 'bar']));
+    expect(values, unorderedEquals(['foo-value', 'bar-value']));
 
-    Expect.setEquals(const <String> ['foo', 'bar'],
-                     new List<String>.from(div.dataAttributes.keys));
-    Expect.setEquals(const <String> ['foo-value', 'bar-value'],
-                     new List<String>.from(div.dataAttributes.values));
+    expect(new List<String>.from(div.dataAttributes.keys), 
+        unorderedEquals(['foo', 'bar']));
+    expect(new List<String>.from(div.dataAttributes.values),
+        unorderedEquals(['foo-value', 'bar-value']));
 
-    Expect.equals(2, div.dataAttributes.length);
-    Expect.isFalse(div.dataAttributes.isEmpty);
+    expect(div.dataAttributes.length, 2);
+    expect(div.dataAttributes.isEmpty, isFalse);
 
-    Expect.isNull(div.dataAttributes.remove('qux'));
-    Expect.equals(2, div.dataAttributes.length);
-    Expect.isFalse(div.dataAttributes.isEmpty);
+    expect(div.dataAttributes.remove('qux'), isNull);
+    expect(div.dataAttributes.length, 2);
+    expect(div.dataAttributes.isEmpty, isFalse);
 
-    Expect.equals('foo-value', div.dataAttributes.remove('foo'));
-    Expect.equals(1, div.dataAttributes.length);
-    Expect.isFalse(div.dataAttributes.isEmpty);
+    expect(div.dataAttributes.remove('foo'), 'foo-value');
+    expect(div.dataAttributes.length, 1);
+    expect(div.dataAttributes.isEmpty, isFalse);
 
     div.dataAttributes.clear();
-    Expect.equals(0, div.dataAttributes.length);
-    Expect.isTrue(div.dataAttributes.isEmpty);
+    expect(div.dataAttributes.length, 0);
+    expect(div.dataAttributes.isEmpty, isTrue);
   });
 }
diff --git a/tests/html/indexeddb_1_test.dart b/tests/html/indexeddb_1_test.dart
index 3a8eb4c..2f2c6c7 100644
--- a/tests/html/indexeddb_1_test.dart
+++ b/tests/html/indexeddb_1_test.dart
@@ -7,7 +7,7 @@
 const String STORE_NAME = 'TEST';
 const int VERSION = 1;
 
-testReadWrite(key, value, check,
+testReadWrite(key, value, matcher,
               [dbName = DB_NAME,
                storeName = STORE_NAME,
                version = VERSION]) => () {
@@ -30,7 +30,7 @@
     request.on.success.add(expectAsync1((e) {
       var object = e.target.result;
       db.close();
-      check(value, object);
+      expect(object, matcher);
     }));
     request.on.error.add(fail);
   }
@@ -83,7 +83,7 @@
   deleteRequest.on.error.add(fail);
 };
 
-testReadWriteTyped(key, value, check,
+testReadWriteTyped(key, value, matcher,
                    [dbName = DB_NAME,
                     storeName = STORE_NAME,
                     version = VERSION]) => () {
@@ -106,7 +106,7 @@
     request.on.success.add(expectAsync1((e) {
       var object = e.target.result;
       db.close();
-      check(value, object);
+      expect(object, matcher);
     }));
     request.on.error.add(fail);
   }
@@ -160,18 +160,17 @@
 };
 
 tests_dynamic() {
-  test('test1', testReadWrite(123, 'Hoot!', Expect.equals));
-  test('test2', testReadWrite(123, 12345, Expect.equals));
-  test('test3', testReadWrite(123, [1,2,3], Expect.listEquals));
-  test('test4', testReadWrite(123, const [2, 3, 4], Expect.listEquals));
+  test('test1', testReadWrite(123, 'Hoot!', equals('Hoot!')));
+  test('test2', testReadWrite(123, 12345, equals(12345)));
+  test('test3', testReadWrite(123, [1, 2, 3], equals([1, 2, 3])));
+  test('test4', testReadWrite(123, [2, 3, 4], equals([2, 3, 4])));
 }
 
 tests_typed() {
-  test('test1', testReadWriteTyped(123, 'Hoot!', Expect.equals));
-  test('test2', testReadWriteTyped(123, 12345, Expect.equals));
-  test('test3', testReadWriteTyped(123, [1,2,3], Expect.listEquals));
-  test('test4',
-            testReadWriteTyped(123, const [2, 3, 4], Expect.listEquals));
+  test('test1', testReadWriteTyped(123, 'Hoot!', equals('Hoot!')));
+  test('test2', testReadWriteTyped(123, 12345, equals(12345)));
+  test('test3', testReadWriteTyped(123, [1, 2, 3], equals([1, 2, 3])));
+  test('test4', testReadWriteTyped(123, [2, 3, 4], equals([2, 3, 4])));
 }
 
 main() {
diff --git a/tests/html/indexeddb_2_test.dart b/tests/html/indexeddb_2_test.dart
index 7a64313..f37be90 100644
--- a/tests/html/indexeddb_2_test.dart
+++ b/tests/html/indexeddb_2_test.dart
@@ -2,7 +2,7 @@
 #import('../../pkg/unittest/unittest.dart');
 #import('../../pkg/unittest/html_config.dart');
 #import('dart:html');
-#import('dart:coreimpl');
+#import('dart:collection');
 #import('utils.dart');
 
 // Write and re-read Maps: simple Maps; Maps with DAGs; Maps with cycles.
diff --git a/tests/html/indexeddb_3_test.dart b/tests/html/indexeddb_3_test.dart
index 8914add..03cb79a 100644
--- a/tests/html/indexeddb_3_test.dart
+++ b/tests/html/indexeddb_3_test.dart
@@ -12,7 +12,7 @@
 class Test {
   fail(message) => (e) {
     guardAsync(() {
-      Expect.fail('IndexedDB failure: $message'); 
+      expect(false, isTrue, reason: 'IndexedDB failure: $message'); 
     });
   };
 
@@ -100,13 +100,13 @@
         itemCount += 1;
         sumKeys += cursor.key;
         window.console.log('${cursor.key}  ${cursor.value}');
-        Expect.equals('Item ${cursor.key}', cursor.value);
+        expect(cursor.value, 'Item ${cursor.key}');
         cursor.continueFunction();
       } else {
         // Done
-        Expect.equals(99, lastKey);
-        Expect.equals(100, itemCount);
-        Expect.equals((100 * 99) ~/ 2, sumKeys);
+        expect(lastKey, 99);
+        expect(itemCount, 100);
+        expect(sumKeys, (100 * 99) ~/ 2);
       }
     }, count:101));
     cursorRequest.on.error.add(fail('openCursor'));
@@ -126,13 +126,13 @@
         lastKey = cursor.key;
         itemCount += 1;
         sumKeys += cursor.key;
-        Expect.equals('Item ${cursor.key}', cursor.value);
+        expect(cursor.value, 'Item ${cursor.key}');
         cursor.continueFunction();
       } else {
         // Done
-        Expect.equals(0, lastKey);  // i.e. first key (scanned in reverse).
-        Expect.equals(100, itemCount);
-        Expect.equals((100 * 99) ~/ 2, sumKeys);
+        expect(lastKey, 0);  // i.e. first key (scanned in reverse).
+        expect(itemCount, 100);
+        expect(sumKeys, (100 * 99) ~/ 2);
       }
     }, count:101));
     cursorRequest.on.error.add(fail('openCursor'));
diff --git a/tests/html/indexeddb_4_test.dart b/tests/html/indexeddb_4_test.dart
index 1e7e29c..cbe4f77 100644
--- a/tests/html/indexeddb_4_test.dart
+++ b/tests/html/indexeddb_4_test.dart
@@ -12,7 +12,7 @@
 class Test {
   fail(message) => (e) {
     guardAsync(() {
-      Expect.fail('IndexedDB failure: $message');
+      expect(false, isTrue, reason: 'IndexedDB failure: $message');
     });
   };
 
@@ -99,16 +99,16 @@
         if (firstKey == null) firstKey = cursor.key;
         lastKey = cursor.key;
         itemCount += 1;
-        Expect.equals('Item ${cursor.key}', cursor.value);
+        expect(cursor.value, 'Item ${cursor.key}');
         cursor.continueFunction();
       } else {
         // Done
-        Expect.equals(expectedFirst, firstKey);
-        Expect.equals(expectedLast, lastKey);
+        expect(firstKey, expectedFirst);
+        expect(lastKey, expectedLast);
         if (expectedFirst == null) {
-          Expect.equals(0, itemCount);
+          expect(itemCount, isZero);
         } else {
-          Expect.equals(expectedLast - expectedFirst + 1, itemCount);
+          expect(itemCount, expectedLast - expectedFirst + 1);
         }
       }
     },
diff --git a/tests/html/inner_frame_test.dart b/tests/html/inner_frame_test.dart
index c14fa79..0579412 100644
--- a/tests/html/inner_frame_test.dart
+++ b/tests/html/inner_frame_test.dart
@@ -19,7 +19,7 @@
           var div = parentDocument.$dom_createElement("div");
           div.id = "illegalFrameElement";
           parentDocument.body.nodes.add(div);
-          Expect.fail('Should not reach here.');
+          expect(false, isTrue, reason: 'Should not reach here.');
         } on NoSuchMethodError catch (e) {
           // Expected.
           window.top.postMessage('pass_frameElement', '*');
@@ -36,7 +36,7 @@
           var div = parentDocument.$dom_createElement("div");
           div.id = "illegalTop";
           parentDocument.body.nodes.add(div);
-          Expect.fail('Should not reach here.');
+          expect(false, isTrue, reason: 'Should not reach here.');
         } on NoSuchMethodError catch (e) {
           // Expected.
           window.top.postMessage('pass_top', '*');
@@ -53,7 +53,7 @@
           var div = parentDocument.$dom_createElement("div");
           div.id = "illegalParent";
           parentDocument.body.nodes.add(div);
-          Expect.fail('Should not reach here.');
+          expect(false, isTrue, reason: 'Should not reach here.');
         } on NoSuchMethodError catch (e) {
           // Expected.
           window.top.postMessage('pass_parent', '*');
@@ -85,7 +85,7 @@
           if (e.data == 'pass_$testName') {
             expectedVerify();
           }
-          expect(e.data != 'fail_$testName');
+          expect(e.data, isNot(equals('fail_$testName')));
         });
       });
     child.postMessage(testName, '*');
diff --git a/tests/html/instance_of_test.dart b/tests/html/instance_of_test.dart
index 2d382c5..ee21a9d 100644
--- a/tests/html/instance_of_test.dart
+++ b/tests/html/instance_of_test.dart
@@ -11,46 +11,60 @@
   canvas.attributes['height'] = 100;
   document.body.nodes.add(canvas);
 
+  var isCanvasRenderingContext = predicate((x) => x is CanvasRenderingContext,
+      'is a CanvasRenderingContext');
+  var isCanvasRenderingContext2D = 
+      predicate((x) => x is CanvasRenderingContext2D,
+      'is a CanvasRenderingContext2D');
+  var isElement = predicate((x) => x is Element, 'is an Element');
+  var isCanvasElement = 
+      predicate((x) => x is CanvasElement, 'is a CanvasElement');
+  var isImageData = predicate((x) => x is ImageData, 'is an ImageData');
+  //var isCanvasPixelArray =
+  //  predicate((x) => x is CanvasPixelArray, 'is a CanvasPixelArray');
+  var isUint8ClampedArray = 
+      predicate((x) => x is Uint8ClampedArray, 'is a Uint8ClampedArray');
+
   useHtmlConfiguration();
   test('Instanceof', () {
-    Expect.isFalse(canvas is CanvasRenderingContext);
-    Expect.isFalse(canvas is CanvasRenderingContext2D);
-    Expect.isTrue(canvas is Element);
-    Expect.isTrue(canvas is CanvasElement);
-    Expect.isFalse(canvas is ImageData);
-    // Expect.isFalse(canvas is CanvasPixelArray);
+    expect(canvas, isNot(isCanvasRenderingContext));
+    expect(canvas, isNot(isCanvasRenderingContext2D));
+    expect(canvas, isElement);
+    expect(canvas, isCanvasElement);
+    expect(canvas, isNot(isImageData));
+    // expect(canvas, isNot(isCanvasPixelArray));
 
     CanvasRenderingContext2D context = canvas.getContext('2d');
-    Expect.isTrue(context is CanvasRenderingContext);
-    Expect.isTrue(context is CanvasRenderingContext2D);
-    Expect.isFalse(context is Element);
-    Expect.isFalse(context is CanvasElement);
-    Expect.isFalse(context is ImageData);
-    // Expect.isFalse(context is CanvasPixelArray);
+    expect(context, isCanvasRenderingContext);
+    expect(context, isCanvasRenderingContext2D);
+    expect(context, isNot(isElement));
+    expect(context, isNot(isCanvasElement));
+    expect(context, isNot(isImageData));
+    // expect(context, isNot(isCanvasPixelArray));
 
     // FIXME(b/5286633): Interface injection type check workaround.
     var image = context.createImageData(canvas.width as Dynamic,
                                         canvas.height as Dynamic);
-    Expect.isFalse(image is CanvasRenderingContext);
-    Expect.isFalse(image is CanvasRenderingContext2D);
-    Expect.isFalse(image is Element);
-    Expect.isFalse(image is CanvasElement);
-    Expect.isTrue(image is ImageData);
-    // Expect.isFalse(image is CanvasPixelArray);
+    expect(image, isNot(isCanvasRenderingContext));
+    expect(image, isNot(isCanvasRenderingContext2D));
+    expect(image, isNot(isElement));
+    expect(image, isNot(isCanvasElement));
+    expect(image, isImageData);
+    // expect(image, isNot(isCanvasPixelArray));
 
     // Include CanvasPixelArray since constructor and prototype are not
     // available until one is created.
     var bytes = image.data;
-    Expect.isFalse(bytes is CanvasRenderingContext);
-    Expect.isFalse(bytes is CanvasRenderingContext2D);
-    Expect.isFalse(bytes is Element);
-    Expect.isFalse(bytes is CanvasElement);
-    Expect.isFalse(bytes is ImageData);
-    Expect.isTrue(bytes is Uint8ClampedArray);
+    expect(bytes, isNot(isCanvasRenderingContext));
+    expect(bytes, isNot(isCanvasRenderingContext2D));
+    expect(bytes, isNot(isElement));
+    expect(bytes, isNot(isCanvasElement));
+    expect(bytes, isNot(isImageData));
+    expect(bytes, isUint8ClampedArray);
 
     // FIXME: Ensure this is an SpanElement when we next update
     // WebKit IDL.
     var span = new Element.tag('span');
-    Expect.isTrue(span is Element);
+    expect(span, isElement);
   });
 }
diff --git a/tests/html/isolates_test.dart b/tests/html/isolates_test.dart
index 7140d3e..8b31ca3 100644
--- a/tests/html/isolates_test.dart
+++ b/tests/html/isolates_test.dart
@@ -39,10 +39,10 @@
     final msg2 = 'bar';
     port.call(msg1).then((response) {
       guardAsync(() {
-        Expect.equals(responseFor(msg1), response);
+        expect(response, equals(responseFor(msg1)));
         port.call(msg2).then((response) {
           guardAsync(() {
-            Expect.equals(responseFor(msg2), response);
+            expect(response, equals(responseFor(msg2)));
             callback();
           });
         });
diff --git a/tests/html/js_interop_2_test.dart b/tests/html/js_interop_2_test.dart
index 6f43564..bf7cfde 100644
--- a/tests/html/js_interop_2_test.dart
+++ b/tests/html/js_interop_2_test.dart
@@ -34,9 +34,9 @@
 
     SendPortSync port = window.lookupPort('test');
     var result = port.callSync('sent');
-    Expect.equals('received', result);
+    expect(result, 'received');
 
     result = port.callSync('ignore');
-    Expect.isNull(result);
+    expect(result, isNull);
   });
 }
diff --git a/tests/html/js_interop_3_test.dart b/tests/html/js_interop_3_test.dart
index c8ab351..92f7294 100644
--- a/tests/html/js_interop_3_test.dart
+++ b/tests/html/js_interop_3_test.dart
@@ -28,10 +28,10 @@
 
   test('js-to-dart', () {
     var fun1 = (message) {
-      Expect.equals('Hello', message['a']);
-      Expect.equals('World', message['b']);
-      Expect.equals(42, message['c']);
-      Expect.equals(3, message.keys.length);
+      expect(message['a'], 'Hello');
+      expect(message['b'], 'World');
+      expect(message['c'], 42);
+      expect(message.keys.length, 3);
       return 42;
     };
 
@@ -42,7 +42,7 @@
     // TODO(vsm): Investigate why this needs to be called asynchronously.
     var done = expectAsync0(() {});
     var fun2 = (message) {
-      Expect.equals(42, message);
+      expect(message, 42);
       window.setTimeout(done, 0);
     };
 
diff --git a/tests/html/js_interop_4_test.dart b/tests/html/js_interop_4_test.dart
index b05ffb7..3e0fe4e 100644
--- a/tests/html/js_interop_4_test.dart
+++ b/tests/html/js_interop_4_test.dart
@@ -24,7 +24,7 @@
   // Test that our interop scheme also works from Dart to Dart.
   test('dart-to-dart-same-isolate', () {
     var fun = expectAsync1((message) {
-      Expect.listEquals(testData, message);
+      expect(message, orderedEquals(testData));
       return message.length;
     });
 
@@ -34,13 +34,13 @@
 
     var port2 = window.lookupPort('fun');
     var result = port2.callSync(testData);
-    Expect.equals(3, result);
+    expect(result, 3);
   });
 
   // Test across isolate boundary.
   test('dart-to-dart-cross-isolate', () {
     var fun1 = (message) {
-      Expect.listEquals(testData, message);
+      expect(message, orderedEquals(testData));
       return message.length;
     };
 
@@ -51,7 +51,7 @@
     // TODO(vsm): Investigate why this needs to be called asynchronously.
     var done = expectAsync0(() {});
     var fun2 = (message) {
-      Expect.equals(3, message);
+      expect(message, 3);
       window.setTimeout(done, 0);
     };
 
diff --git a/tests/html/key_name_location_test.dart b/tests/html/key_name_location_test.dart
index 445f43d..856b615 100644
--- a/tests/html/key_name_location_test.dart
+++ b/tests/html/key_name_location_test.dart
@@ -10,22 +10,22 @@
   useHtmlConfiguration();
 
   test('keyNames', () {
-      Expect.equals("DownLeft", KeyName.DOWN_LEFT);
-      Expect.equals("Fn", KeyName.FN);
-      Expect.equals("F1", KeyName.F1);
-      Expect.equals("Meta", KeyName.META);
-      Expect.equals("MediaNextTrack", KeyName.MEDIA_NEXT_TRACK);
-      Expect.equals("NumLock", KeyName.NUM_LOCK);
-      Expect.equals("PageDown", KeyName.PAGE_DOWN);
-      Expect.equals("DeadIota", KeyName.DEAD_IOTA);
+      expect(KeyName.DOWN_LEFT, "DownLeft");
+      expect(KeyName.FN, "Fn");
+      expect(KeyName.F1, "F1");
+      expect(KeyName.META, "Meta");
+      expect(KeyName.MEDIA_NEXT_TRACK, "MediaNextTrack");
+      expect(KeyName.NUM_LOCK, "NumLock");
+      expect(KeyName.PAGE_DOWN, "PageDown");
+      expect(KeyName.DEAD_IOTA, "DeadIota");
   });
 
   test('keyLocations', () {
-      Expect.equals(0, KeyLocation.STANDARD);
-      Expect.equals(1, KeyLocation.LEFT);
-      Expect.equals(2, KeyLocation.RIGHT);
-      Expect.equals(3, KeyLocation.NUMPAD);
-      Expect.equals(4, KeyLocation.MOBILE);
-      Expect.equals(5, KeyLocation.JOYSTICK);
+      expect(KeyLocation.STANDARD, 0);
+      expect(KeyLocation.LEFT, 1);
+      expect(KeyLocation.RIGHT, 2);
+      expect(KeyLocation.NUMPAD, 3);
+      expect(KeyLocation.MOBILE, 4);
+      expect(KeyLocation.JOYSTICK, 5);
   });
 }
diff --git a/tests/html/localstorage_test.dart b/tests/html/localstorage_test.dart
index 38e4204..3e4aeda 100644
--- a/tests/html/localstorage_test.dart
+++ b/tests/html/localstorage_test.dart
@@ -25,56 +25,55 @@
   }
 
   testWithLocalStorage('containsValue', () {
-    Expect.isFalse(window.localStorage.containsValue('does not exist'));
-    Expect.isFalse(window.localStorage.containsValue('key1'));
-    Expect.isTrue(window.localStorage.containsValue('val1'));
-    Expect.isTrue(window.localStorage.containsValue('val3'));
+    expect(window.localStorage.containsValue('does not exist'), isFalse);
+    expect(window.localStorage.containsValue('key1'), isFalse);
+    expect(window.localStorage.containsValue('val1'), isTrue);
+    expect(window.localStorage.containsValue('val3'), isTrue);
   });
 
   testWithLocalStorage('containsKey', () {
-    Expect.isFalse(window.localStorage.containsKey('does not exist'));
-    Expect.isFalse(window.localStorage.containsKey('val1'));
-    Expect.isTrue(window.localStorage.containsKey('key1'));
-    Expect.isTrue(window.localStorage.containsKey('key3'));
+    expect(window.localStorage.containsKey('does not exist'), isFalse);
+    expect(window.localStorage.containsKey('val1'), isFalse);
+    expect(window.localStorage.containsKey('key1'), isTrue);
+    expect(window.localStorage.containsKey('key3'), isTrue);
   });
 
   testWithLocalStorage('[]', () {
-    Expect.isNull(window.localStorage['does not exist']);
-    Expect.equals('val1', window.localStorage['key1']);
-    Expect.equals('val3', window.localStorage['key3']);
+    expect(window.localStorage['does not exist'], isNull);
+    expect(window.localStorage['key1'], 'val1');
+    expect(window.localStorage['key3'], 'val3');
   });
 
   testWithLocalStorage('[]=', () {
-    Expect.isNull(window.localStorage['key4']);
+    expect(window.localStorage['key4'], isNull);
     window.localStorage['key4'] = 'val4';
-    Expect.equals('val4', window.localStorage['key4']);
+    expect(window.localStorage['key4'], 'val4');
 
-    Expect.equals('val3', window.localStorage['key3']);
+    expect(window.localStorage['key3'], 'val3');
     window.localStorage['key3'] = 'val3-new';
-    Expect.equals('val3-new', window.localStorage['key3']);
+    expect(window.localStorage['key3'], 'val3-new');
   });
 
   testWithLocalStorage('putIfAbsent', () {
-    Expect.isNull(window.localStorage['key4']);
-    Expect.equals('val4',
-        window.localStorage.putIfAbsent('key4', () => 'val4'));
-    Expect.equals('val4', window.localStorage['key4']);
+    expect(window.localStorage['key4'], isNull);
+    expect(window.localStorage.putIfAbsent('key4', () => 'val4'), 'val4');
+    expect(window.localStorage['key4'], 'val4');
 
-    Expect.equals('val3', window.localStorage['key3']);
-    Expect.equals('val3', window.localStorage.putIfAbsent(
-            'key3', () => Expect.fail('should not be called')));
-    Expect.equals('val3', window.localStorage['key3']);
+    expect(window.localStorage['key3'], 'val3');
+    expect(window.localStorage.putIfAbsent('key3',
+        () => expect(false, isTrue, reason: 'should not be called')), 'val3');
+    expect(window.localStorage['key3'], 'val3');
   });
 
   testWithLocalStorage('remove', () {
-    Expect.isNull(window.localStorage.remove('does not exist'));
-    Expect.equals('val3', window.localStorage.remove('key3'));
-    Expect.mapEquals({'key1': 'val1', 'key2': 'val2'}, window.localStorage);
+    expect(window.localStorage.remove('does not exist'), isNull);
+    expect(window.localStorage.remove('key3'), 'val3');
+    expect(window.localStorage, equals({'key1': 'val1', 'key2': 'val2'}));
   });
 
   testWithLocalStorage('clear', () {
     window.localStorage.clear();
-    Expect.mapEquals({}, window.localStorage);
+    expect(window.localStorage, equals({}));
   });
 
   testWithLocalStorage('forEach', () {
@@ -82,28 +81,28 @@
     window.localStorage.forEach((k, v) {
       results[k] = v;
     });
-    Expect.mapEquals({'key1': 'val1', 'key2': 'val2', 'key3': 'val3'},
-        results);
+    expect(results, equals({'key1': 'val1', 'key2': 'val2', 'key3': 'val3'}));
   });
 
   testWithLocalStorage('getKeys', () {
-    Expect.setEquals(['key1', 'key2', 'key3'], window.localStorage.keys);
+    expect(window.localStorage.keys,
+        unorderedEquals(['key1', 'key2', 'key3']));
   });
 
   testWithLocalStorage('getVals', () {
-    Expect.setEquals(['val1', 'val2', 'val3'],
-        window.localStorage.values);
+    expect(window.localStorage.values,
+        unorderedEquals(['val1', 'val2', 'val3']));
   });
 
   testWithLocalStorage('length', () {
-    Expect.equals(3, window.localStorage.length);
+    expect(window.localStorage.length, 3);
     window.localStorage.clear();
-    Expect.equals(0, window.localStorage.length);
+    expect(window.localStorage.length, 0);
   });
 
   testWithLocalStorage('isEmpty', () {
-    Expect.isFalse(window.localStorage.isEmpty);
+    expect(window.localStorage.isEmpty, isFalse);
     window.localStorage.clear();
-    Expect.isTrue(window.localStorage.isEmpty);
+    expect(window.localStorage.isEmpty, isTrue);
   });
 }
diff --git a/tests/html/location_test.dart b/tests/html/location_test.dart
index fc2b8f9..a46f528 100644
--- a/tests/html/location_test.dart
+++ b/tests/html/location_test.dart
@@ -6,13 +6,15 @@
 main() {
   useHtmlConfiguration();
 
+  var isLocation = predicate((x) => x is Location, 'is a Location');
+
   test('location hash', () {
       final location = window.location;
-      Expect.isTrue(location is Location);
+      expect(location, isLocation);
 
       // The only navigation we dare try is hash.
       location.hash = 'hello';
       var h = location.hash;
-      Expect.equals('#hello', h);
+      expect(h, '#hello');
     });
 }
diff --git a/tests/html/measurement_test.dart b/tests/html/measurement_test.dart
index 175e92f..74c4182 100644
--- a/tests/html/measurement_test.dart
+++ b/tests/html/measurement_test.dart
@@ -18,10 +18,10 @@
     final computedStyle = element.computedStyle;
     computedStyle.then(expectAsync1((style) {
       expect(style.getPropertyValue('left'), equals('auto'));
-      expect(fnComplete);
+      expect(fnComplete, isTrue);
       expect(timeout0, isFalse);
     }));
-    Expect.isFalse(computedStyle.isComplete);
+    expect(computedStyle.isComplete, isFalse);
     fnComplete = true;
   });
 
@@ -29,8 +29,8 @@
     var rect;
     var computedStyle;
     window.requestLayoutFrame(expectAsync0(() {
-      expect(rect.isComplete);
-      expect(computedStyle.isComplete);
+      expect(rect.isComplete, isTrue);
+      expect(computedStyle.isComplete, isTrue);
     }));
 
     final element = document.body;
diff --git a/tests/html/mutationobserver_test.dart b/tests/html/mutationobserver_test.dart
index 3585b85..07bf311 100644
--- a/tests/html/mutationobserver_test.dart
+++ b/tests/html/mutationobserver_test.dart
@@ -38,7 +38,8 @@
 
     test('empty options is syntax error', () {
         var mutationObserver = new MutationObserver(
-            (mutations, observer) { expect(false, 'Should not be reached'); });
+            (mutations, observer) { expect(false, isTrue,
+                reason: 'Should not be reached'); });
         expect(() { mutationObserver.observe(document, {}); },
                throws);
       });
diff --git a/tests/html/native_gc_test.dart b/tests/html/native_gc_test.dart
index b2bc481..0044ac4 100644
--- a/tests/html/native_gc_test.dart
+++ b/tests/html/native_gc_test.dart
@@ -23,7 +23,7 @@
         div.on['test'].add((_) {
             // Only the final iteration's listener should be invoked.
             // Note: the reference to l keeps the entire list alive.
-            Expect.equals(M - 1, l[N - 1]);
+            expect(l[N - 1], M - 1);
           }, false);
       }
 
diff --git a/tests/html/node_test.dart b/tests/html/node_test.dart
index 80ab9a9..df490ab 100644
--- a/tests/html/node_test.dart
+++ b/tests/html/node_test.dart
@@ -14,114 +14,124 @@
 main() {
   useHtmlConfiguration();
 
+  var isText = predicate((x) => x is Text, 'is a Text');
+  var isComment = predicate((x) => x is Comment, 'is a Comment');
+  var isBRElement = predicate((x) => x is BRElement, 'is a BRElement');
+  var isHRElement = predicate((x) => x is HRElement, 'is a HRElement');
+  var isNodeList = predicate((x) => x is List<Node>, 'is a List<Node>');
+  var isImageElement =
+      predicate((x) => x is ImageElement, 'is an ImageElement');
+  var isInputElement =
+      predicate((x) => x is InputElement, 'is an InputElement');
+
   test('replaceWith', () {
     final node = makeNodeWithChildren();
     final subnode = node.nodes[1];
     final out = subnode.replaceWith(new Text('Bar'));
-    Expect.equals(subnode, out, '#replaceWith should be chainable');
-    Expect.equals(3, node.nodes.length);
-    Expect.isTrue(node.nodes[0] is Text);
-    Expect.equals('Foo', node.nodes[0].text);
-    Expect.isTrue(node.nodes[1] is Text);
-    Expect.equals('Bar', node.nodes[1].text);
-    Expect.isTrue(node.nodes[2] is Comment);
+    expect(out, equals(subnode), reason: '#replaceWith should be chainable');
+    expect(node.nodes.length, 3);
+    expect(node.nodes[0], isText);
+    expect(node.nodes[0].text, 'Foo');
+    expect(node.nodes[1], isText);
+    expect(node.nodes[1].text, 'Bar');
+    expect(node.nodes[2], isComment);
   });
 
   test('remove', () {
     final node = makeNodeWithChildren();
     final subnode = node.nodes[1];
     final out = subnode.remove();
-    Expect.isNull(out);
-    Expect.equals(2, node.nodes.length);
-    Expect.isTrue(node.nodes[0] is Text);
-    Expect.isTrue(node.nodes[1] is Comment);
+    expect(out, isNull);
+    expect(node.nodes.length, 2);
+    expect(node.nodes[0], isText);
+    expect(node.nodes[1], isComment);
   });
 
   test('contains', () {
     final Node node = new Element.html("<div>Foo<span>Bar</span></div>");
-    Expect.isTrue(node.contains(node.nodes.first));
-    Expect.isTrue(node.contains(node.nodes[1].nodes.first));
-    Expect.isFalse(node.contains(new Text('Foo')));
+    expect(node.contains(node.nodes.first), isTrue);
+    expect(node.contains(node.nodes[1].nodes.first), isTrue);
+    expect(node.contains(new Text('Foo')), isFalse);
   });
 
   group('nodes', () {
     test('is a NodeList', () {
-      Expect.isTrue(makeNodeWithChildren().nodes is List<Node>);
+      expect(makeNodeWithChildren().nodes, isNodeList);
     });
 
     test('first', () {
       var node = makeNodeWithChildren();
-      Expect.isTrue(node.nodes.first is Text);
+      expect(node.nodes.first, isText);
     });
 
     test('last', () {
       var node = makeNodeWithChildren();
-      Expect.isTrue(node.nodes.last is Comment);
+      expect(node.nodes.last, isComment);
     });
 
     test('forEach', () {
       var nodes = [];
       var node = makeNodeWithChildren();
       node.nodes.forEach((n) => nodes.add(n));
-      Expect.isTrue(nodes[0] is Text);
-      Expect.isTrue(nodes[1] is BRElement);
-      Expect.isTrue(nodes[2] is Comment);
+      expect(nodes[0], isText);
+      expect(nodes[1], isBRElement);
+      expect(nodes[2], isComment);
     });
 
     test('filter', () {
       var filtered = makeNodeWithChildren().nodes.filter((n) => n is BRElement);
-      Expect.equals(1, filtered.length);
-      Expect.isTrue(filtered[0] is BRElement);
-      Expect.isTrue(filtered is List<Node>);
+      expect(filtered.length, 1);
+      expect(filtered[0], isBRElement);
+      expect(filtered, isNodeList);
     });
 
     test('every', () {
       var node = makeNodeWithChildren();
-      Expect.isTrue(node.nodes.every((n) => n is Node));
-      Expect.isFalse(node.nodes.every((n) => n is Comment));
+      expect(node.nodes.every((n) => n is Node), isTrue);
+      expect(node.nodes.every((n) => n is Comment), isFalse);
     });
 
     test('some', () {
       var node = makeNodeWithChildren();
-      Expect.isTrue(node.nodes.some((n) => n is Comment));
-      Expect.isFalse(node.nodes.some((n) => n is SVGElement));
+      expect(node.nodes.some((n) => n is Comment), isTrue);
+      expect(node.nodes.some((n) => n is SVGElement), isFalse);
     });
 
     test('isEmpty', () {
-      Expect.isTrue(makeNode().nodes.isEmpty);
-      Expect.isFalse(makeNodeWithChildren().nodes.isEmpty);
+      expect(makeNode().nodes.isEmpty, isTrue);
+      expect(makeNodeWithChildren().nodes.isEmpty, isFalse);
     });
 
     test('length', () {
-      Expect.equals(0, makeNode().nodes.length);
-      Expect.equals(3, makeNodeWithChildren().nodes.length);
+      expect(makeNode().nodes.length, 0);
+      expect(makeNodeWithChildren().nodes.length, 3);
     });
 
     test('[]', () {
       var node = makeNodeWithChildren();
-      Expect.isTrue(node.nodes[0] is Text);
-      Expect.isTrue(node.nodes[1] is BRElement);
-      Expect.isTrue(node.nodes[2] is Comment);
+      expect(node.nodes[0], isText);
+      expect(node.nodes[1], isBRElement);
+      expect(node.nodes[2], isComment);
     });
 
     test('[]=', () {
       var node = makeNodeWithChildren();
       node.nodes[1] = new Element.tag('hr');
-      Expect.isTrue(node.nodes[0] is Text);
-      Expect.isTrue(node.nodes[1] is HRElement);
-      Expect.isTrue(node.nodes[2] is Comment);
+      expect(node.nodes[0], isText);
+      expect(node.nodes[1], isHRElement);
+      expect(node.nodes[2], isComment);
     });
 
     test('add', () {
       var node = makeNode();
       node.nodes.add(new Element.tag('hr'));
-      Expect.isTrue(node.nodes.last is HRElement);
+      expect(node.nodes.last, isHRElement);
     });
 
     test('addLast', () {
       var node = makeNode();
       node.nodes.addLast(new Element.tag('hr'));
-      Expect.isTrue(node.nodes.last is HRElement);
+      expect(node.nodes.last, isHRElement);
     });
 
     test('iterator', () {
@@ -130,9 +140,9 @@
       for (var subnode in node.nodes) {
         nodes.add(subnode);
       }
-      Expect.isTrue(nodes[0] is Text);
-      Expect.isTrue(nodes[1] is BRElement);
-      Expect.isTrue(nodes[2] is Comment);
+      expect(nodes[0], isText);
+      expect(nodes[1], isBRElement);
+      expect(nodes[2], isComment);
     });
 
     test('addAll', () {
@@ -142,31 +152,31 @@
         new Element.tag('img'),
         new Element.tag('input')
       ]);
-      Expect.isTrue(node.nodes[0] is Text);
-      Expect.isTrue(node.nodes[1] is BRElement);
-      Expect.isTrue(node.nodes[2] is Comment);
-      Expect.isTrue(node.nodes[3] is HRElement);
-      Expect.isTrue(node.nodes[4] is ImageElement);
-      Expect.isTrue(node.nodes[5] is InputElement);
+      expect(node.nodes[0], isText);
+      expect(node.nodes[1], isBRElement);
+      expect(node.nodes[2], isComment);
+      expect(node.nodes[3], isHRElement);
+      expect(node.nodes[4], isImageElement);
+      expect(node.nodes[5], isInputElement);
     });
 
     test('clear', () {
       var node = makeNodeWithChildren();
       node.nodes.clear();
-      Expect.listEquals([], node.nodes);
+      expect(node.nodes, []);
     });
 
     test('removeLast', () {
       var node = makeNodeWithChildren();
-      Expect.isTrue(node.nodes.removeLast() is Comment);
-      Expect.equals(2, node.nodes.length);
-      Expect.isTrue(node.nodes.removeLast() is BRElement);
-      Expect.equals(1, node.nodes.length);
+      expect(node.nodes.removeLast(), isComment);
+      expect(node.nodes.length, 2);
+      expect(node.nodes.removeLast(), isBRElement);
+      expect(node.nodes.length, 1);
     });
 
     test('getRange', () {
       var node = makeNodeWithChildren();
-      Expect.isTrue(node.nodes.getRange(1, 2) is List<Node>);
+      expect(node.nodes.getRange(1, 2), isNodeList);
     });
   });
 
@@ -176,21 +186,21 @@
 
     test('first', () {
       var nodes = makeNodeList();
-      Expect.isTrue(nodes.first is Text);
+      expect(nodes.first, isText);
     });
 
     test('filter', () {
       var filtered = makeNodeList().filter((n) => n is BRElement);
-      Expect.equals(1, filtered.length);
-      Expect.isTrue(filtered[0] is BRElement);
-      Expect.isTrue(filtered is List<Node>);
+      expect(filtered.length, 1);
+      expect(filtered[0], isBRElement);
+      expect(filtered, isNodeList);
     });
 
     test('getRange', () {
       var range = makeNodeList().getRange(1, 2);
-      Expect.isTrue(range is List<Node>);
-      Expect.isTrue(range[0] is BRElement);
-      Expect.isTrue(range[1] is Comment);
+      expect(range, isNodeList);
+      expect(range[0], isBRElement);
+      expect(range[1], isComment);
     });
   });
 }
diff --git a/tests/html/postmessage_structured_test.dart b/tests/html/postmessage_structured_test.dart
index 6fd7beb..a37280f 100644
--- a/tests/html/postmessage_structured_test.dart
+++ b/tests/html/postmessage_structured_test.dart
@@ -6,7 +6,7 @@
 #import('../../pkg/unittest/unittest.dart');
 #import('../../pkg/unittest/html_config.dart');
 #import('dart:html');
-#import('dart:coreimpl');  // SplayTreeMap
+#import('dart:collection');  // SplayTreeMap
 #import('utils.dart');
 
 injectSource(code) {
@@ -34,7 +34,7 @@
         guardAsync(() {
             var data = e.data;
             if (data is String) return;    // Messages from unit test protocol.
-            expect(data is Map);
+            expect(data, isMap);
             expect(data['eggs'], equals(3));
             onSuccess(e);
           });
@@ -66,7 +66,7 @@
         guardAsync(() {
             var data = e.data;
             if (data is String) return;    // Messages from unit test protocol.
-            expect(data is Map);
+            expect(data, isMap);
             if (data['recipient'] != 'DART') return;  // Hearing the sent message.
             expect(data['peas'], equals(50));
             onSuccess(e);
@@ -98,7 +98,7 @@
             guardAsync(() {
                 var data = e.data;
                 if (data is String) return;    // Messages from unit test protocol.
-                expect(data is Map);
+                expect(data, isMap);
                 if (data['recipient'] != 'DART') return;  // Not for me.
                 var returnedValue = data['data'];
 
diff --git a/tests/html/query_test.dart b/tests/html/query_test.dart
index 6abae94..5713652 100644
--- a/tests/html/query_test.dart
+++ b/tests/html/query_test.dart
@@ -17,37 +17,41 @@
       new Element.html("<div><br/><img/><input/><img/></div>");
   document.body.nodes.addAll([div, canvas,  element]);
   
+  var isCanvasElement =
+      predicate((x) => x is CanvasElement, 'is a CanvasElement');
+  var isImageElement =
+      predicate((x) => x is ImageElement, 'is an ImageElement');
 
   test('query', () {
       Element e = query('#testcanvas');
-      Expect.isNotNull(e);
-      Expect.stringEquals('testcanvas', e.id);
-      Expect.isTrue(e is CanvasElement);
-      Expect.equals(canvas, e);
+      expect(e, isNotNull);
+      expect(e.id, 'testcanvas');
+      expect(e, isCanvasElement);
+      expect(e, canvas);
     });
 
   test('query (None)', () {
       Element e = query('#nothere');
-      Expect.isNull(e);
+      expect(e, isNull);
     });
 
   test('queryAll (One)', () {
       List l = queryAll('canvas');
-      Expect.equals(1, l.length);
-      Expect.equals(canvas, l[0]);
+      expect(l.length, 1);
+      expect(l[0], canvas);
     });
 
 
   test('queryAll (Multiple)', () {
       List l = queryAll('img');
-      Expect.equals(2, l.length);
-      Expect.isTrue(l[0] is ImageElement);
-      Expect.isTrue(l[1] is ImageElement);
-      Expect.notEquals(l[0], l[1]);
+      expect(l.length, 2);
+      expect(l[0], isImageElement);
+      expect(l[1], isImageElement);
+      expect(l[0], isNot(equals(l[1])));
     });
 
   test('queryAll (None)', () {
       List l = queryAll('video');
-      Expect.isTrue(l.isEmpty);
+      expect(l.isEmpty, isTrue);
     });
 }
diff --git a/tests/html/queryall_test.dart b/tests/html/queryall_test.dart
index 181f5c3..ce580e1 100644
--- a/tests/html/queryall_test.dart
+++ b/tests/html/queryall_test.dart
@@ -10,6 +10,11 @@
 main() {
   useHtmlConfiguration();
 
+  var isElement = predicate((x) => x is Element, 'is an Element');
+  var isCanvasElement =
+      predicate((x) => x is CanvasElement, 'is a CanvasElement');
+  var isDivElement = predicate((x) => x is DivElement, 'is a isDivElement');
+
   var div = new DivElement();
   div.id = 'test';
   document.body.nodes.add(div);
@@ -26,7 +31,7 @@
   test('queryAll', () {
       List<Node> all = queryAll('*');
       for (var e in all) {
-        expect(e is Element, isTrue);
+        expect(e, isElement);
       }
     });
 
@@ -42,7 +47,7 @@
   test('queryAll-canvas', () {
       List<CanvasElement> all = queryAll('canvas');
       for (var e in all) {
-        expect(e is CanvasElement, isTrue);
+        expect(e, isCanvasElement);
       }
       expect(all.length, equals(2));
     });
@@ -66,11 +71,11 @@
   test('node.queryAll', () {
       List<Element> list = div.queryAll('*');
       expect(list.length, equals(5));
-      expect(list[0] is DivElement, isTrue);
-      expect(list[1] is CanvasElement, isTrue);
-      expect(list[2] is DivElement, isTrue);
-      expect(list[3] is DivElement, isTrue);
-      expect(list[4] is CanvasElement, isTrue);
+      expect(list[0], isDivElement);
+      expect(list[1], isCanvasElement);
+      expect(list[2], isDivElement);
+      expect(list[3], isDivElement);
+      expect(list[4], isCanvasElement);
     });
 
   test('immutable', () {
diff --git a/tests/html/request_animation_frame_test.dart b/tests/html/request_animation_frame_test.dart
index 56d0d2f..c61c9ce 100644
--- a/tests/html/request_animation_frame_test.dart
+++ b/tests/html/request_animation_frame_test.dart
@@ -21,7 +21,8 @@
             window.requestAnimationFrame(
                 expectAsync1((timestamp2) {
                     // Not monotonic on Safari and IE.
-                    // Expect.isTrue(timestamp2 > timestamp1, 'timestamps ordered');
+                    // expect(timestamp2, greaterThan(timestamp1),
+                    //    reason: 'timestamps ordered');
                   }));
           }));
     });
diff --git a/tests/html/selectelement_test.dart b/tests/html/selectelement_test.dart
index 4adb45f..0d354df 100644
--- a/tests/html/selectelement_test.dart
+++ b/tests/html/selectelement_test.dart
@@ -23,7 +23,7 @@
     ];
     element.elements.addAll(options);
     expect(element.selectedOptions.length, 1);
-    expect(element.selectedOptions[0] == options[4]);
+    expect(element.selectedOptions[0], equals(options[4]));
   });
 
   test('multiple selectedOptions', () {
@@ -39,8 +39,8 @@
     ];
     element.elements.addAll(options);
     expect(element.selectedOptions.length, 2);
-    expect(element.selectedOptions[0] == options[2]);
-    expect(element.selectedOptions[1] == options[4]);
+    expect(element.selectedOptions[0], equals(options[2]));
+    expect(element.selectedOptions[1], equals(options[4]));
   });
 
   test('options', () {
@@ -53,6 +53,6 @@
     ];
     element.elements.addAll(options);
     // Use last to make sure that the list was correctly wrapped.
-    expect(element.options.last, options[3]);
+    expect(element.options.last, equals(options[3]));
   });
 }
diff --git a/tests/html/shadowroot_test.dart b/tests/html/shadowroot_test.dart
index a216392..4a55b27 100644
--- a/tests/html/shadowroot_test.dart
+++ b/tests/html/shadowroot_test.dart
@@ -10,13 +10,16 @@
 main() {
   useHtmlConfiguration();
 
+  var isShadowRoot =
+      predicate((x) => x is ShadowRoot, 'is a ShadowRoot');
+
   test('ShadowRoot supported', () {
     var isSupported = ShadowRoot.supported;
 
     // If it's supported, then it should work. Otherwise should fail.
     if (isSupported) {
       var shadowRoot = new ShadowRoot(new DivElement());
-      expect(shadowRoot is ShadowRoot);
+      expect(shadowRoot, isShadowRoot);
     } else {
       expect(() => new ShadowRoot(new DivElement()), throws);
     }
diff --git a/tests/html/storage_test.dart b/tests/html/storage_test.dart
index 985d377..25f127e 100644
--- a/tests/html/storage_test.dart
+++ b/tests/html/storage_test.dart
@@ -7,13 +7,13 @@
   useHtmlConfiguration();
   test('GetItem', () {
     final value = window.localStorage['does not exist'];
-    Expect.isNull(value);
+    expect(value, isNull);
   });
   test('SetItem', () {
     final key = 'foo';
     final value = 'bar';
     window.localStorage[key] = value;
     final stored = window.localStorage[key];
-    Expect.equals(value, stored);
+    expect(stored, value);
   });
 }
diff --git a/tests/html/svg_1_test.dart b/tests/html/svg_1_test.dart
index fc8c724..f536f2c 100644
--- a/tests/html/svg_1_test.dart
+++ b/tests/html/svg_1_test.dart
@@ -8,6 +8,8 @@
 main() {
   useHtmlConfiguration();
 
+  var isSVGElement = predicate((x) => x is SVGElement, 'is a SVGElement');
+
   test('simpleRect', () {
       var div = new Element.tag('div');
       document.body.nodes.add(div);
@@ -19,14 +21,14 @@
 ''';
 
     var e = document.query('#svg1');
-    Expect.isTrue(e != null);
+    expect(e, isNotNull);
 
     SVGRectElement r = document.query('#rect1');
-    Expect.equals(10, r.x.baseVal.value);
-    Expect.equals(20, r.y.baseVal.value);
-    Expect.equals(40, r.height.baseVal.value);
-    Expect.equals(130, r.width.baseVal.value);
-    Expect.equals(5, r.rx.baseVal.value);
+    expect(r.x.baseVal.value, 10);
+    expect(r.y.baseVal.value, 20);
+    expect(r.height.baseVal.value, 40);
+    expect(r.width.baseVal.value, 130);
+    expect(r.rx.baseVal.value, 5);
   });
 
   test('trailing newline', () {
@@ -37,7 +39,7 @@
       </svg>
       """);
 
-  expect(logo is SVGElement, true);
+  expect(logo, isSVGElement);
 
   });
 }
diff --git a/tests/html/svg_2_test.dart b/tests/html/svg_2_test.dart
index d792481..1c355c0 100644
--- a/tests/html/svg_2_test.dart
+++ b/tests/html/svg_2_test.dart
@@ -21,27 +21,44 @@
 
   useHtmlConfiguration();
 
+  var isElement = predicate((x) => x is Element, 'is an Element');
+  var isSVGElement = predicate((x) => x is SVGElement, 'is a SVGElement');
+  var isSVGSVGElement =
+      predicate((x) => x is SVGSVGElement, 'is a SVGSVGElement');
+  var isNode = predicate((x) => x is Node, 'is a Node');
+  var isSVGTests = predicate((x) => x is SVGTests, 'is a SVGTests');
+  var isSVGLangSpace = predicate((x) => x is SVGLangSpace, 'is a SVGLangSpace');
+  var isSVGExternalResourcesRequired =
+      predicate((x) => x is SVGExternalResourcesRequired,
+          'is a SVGExternalResourcesRequired');
+  var isSVGStylable = predicate((x) => x is SVGStylable, 'is a SVGStylable');
+  var isSVGTransformable =
+      predicate((x) => x is SVGTransformable, 'is a SVGTransformable');
+  var isSVGLocatable = predicate((x) => x is SVGLocatable, 'is a SVGLocatable');
+  var isSVGNumber = predicate((x) => x is SVGNumber, 'is a SVGNumber');
+  var isSVGRect = predicate((x) => x is SVGRect, 'is a SVGRect');
+
   test('rect_isChecks', () {
       var div = insertTestDiv();
       var r = document.query('#rect1');
 
       // Direct inheritance chain
-      Expect.isTrue(r is SVGElement);
-      Expect.isTrue(r is Element);
-      Expect.isTrue(r is Node);
+      expect(r, isSVGElement);
+      expect(r, isElement);
+      expect(r, isNode);
 
       // Other implemented interfaces.
-      Expect.isTrue(r is SVGTests);
-      Expect.isTrue(r is SVGLangSpace);
-      Expect.isTrue(r is SVGExternalResourcesRequired);
-      Expect.isTrue(r is SVGStylable);
-      Expect.isTrue(r is SVGTransformable);
-      Expect.isTrue(r is SVGLocatable);
+      expect(r, isSVGTests);
+      expect(r, isSVGLangSpace);
+      expect(r, isSVGExternalResourcesRequired);
+      expect(r, isSVGStylable);
+      expect(r, isSVGTransformable);
+      expect(r, isSVGLocatable);
 
       // Interfaces not implemented.
-      Expect.isFalse(r is SVGNumber);
-      Expect.isFalse(r is SVGRect);
-      Expect.isFalse(r is SVGSVGElement);
+      expect(r, isNot(isSVGNumber));
+      expect(r, isNot(isSVGRect));
+      expect(r, isNot(isSVGSVGElement));
 
       div.remove();
     });
diff --git a/tests/html/svg_3_test.dart b/tests/html/svg_3_test.dart
index 46d0cc2..573c198 100644
--- a/tests/html/svg_3_test.dart
+++ b/tests/html/svg_3_test.dart
@@ -9,6 +9,21 @@
 
 main() {
 
+  var isString = predicate((x) => x is String, 'is a String');
+  var isStringList = predicate((x) => x is List<String>, 'is a List<String>');
+  var isSVGMatrix = predicate((x) => x is SVGMatrix, 'is a SVGMatrix');
+  var isSVGAnimatedBoolean = 
+      predicate((x) => x is SVGAnimatedBoolean, 'is an SVGAnimatedBoolean');
+  var isSVGAnimatedString = 
+      predicate((x) => x is SVGAnimatedString, 'is an SVGAnimatedString');
+  var isSVGRect = predicate((x) => x is SVGRect, 'is a SVGRect');
+  var isSVGAnimatedTransformList =
+      predicate((x) => x is SVGAnimatedTransformList,
+          'is an SVGAnimatedTransformList');
+  var isCSSStyleDeclaration =
+      predicate((x) => x is CSSStyleDeclaration, 'is a CSSStyleDeclaration');
+  var isCSSValue = predicate((x) => x is CSSValue, 'is a CSSValue');
+
   insertTestDiv() {
     var element = new Element.tag('div');
     element.innerHTML = r'''
@@ -28,14 +43,14 @@
   checkSVGTests(e) {
     // Just check that the operations seem to exist.
     var rx = e.requiredExtensions;
-    Expect.isTrue(rx is List<String>);
+    expect(rx, isStringList);
     var rf = e.requiredFeatures;
-    Expect.isTrue(rf is List<String>);
+    expect(rf, isStringList);
     var sl = e.systemLanguage;
-    Expect.isTrue(sl is List<String>);
+    expect(sl, isStringList);
 
     bool hasDoDo = e.hasExtension("DoDo");
-    Expect.isFalse(hasDoDo);
+    expect(hasDoDo, isFalse);
   }
 
   /**
@@ -49,8 +64,8 @@
     String space = e.xmlspace;
     e.xmlspace = space;
 
-    Expect.isTrue(lang is String);
-    Expect.isTrue(space is String);
+    expect(lang, isString);
+    expect(space, isString);
   }
 
   /**
@@ -59,9 +74,9 @@
    */
   checkSVGExternalResourcesRequired(e) {
     var b = e.externalResourcesRequired;
-    Expect.isTrue(b is SVGAnimatedBoolean);
-    Expect.isFalse(b.baseVal);
-    Expect.isFalse(b.animVal);
+    expect(b, isSVGAnimatedBoolean);
+    expect(b.baseVal, isFalse);
+    expect(b.animVal, isFalse);
   }
 
   /**
@@ -69,13 +84,13 @@
    */
   checkSVGStylable(e) {
     var className = e.$dom_svgClassName;
-    Expect.isTrue(className is SVGAnimatedString);
+    expect(className, isSVGAnimatedString);
 
     var s = e.style;
-    Expect.isTrue(s is CSSStyleDeclaration);
+    expect(s, isCSSStyleDeclaration);
 
     var attributeA = e.getPresentationAttribute('A');
-    Expect.isTrue(attributeA === null || attributeA is CSSValue);
+    expect(attributeA, anyOf(isNull, isCSSValue));
   }
 
   /**
@@ -84,19 +99,19 @@
   checkSVGLocatable(e) {
     var v1 = e.farthestViewportElement;
     var v2 = e.nearestViewportElement;
-    Expect.isTrue(v1 === v2);
+    expect(v1, same(v2));
 
     var bbox = e.getBBox();
-    Expect.isTrue(bbox is SVGRect);
+    expect(bbox, isSVGRect);
 
     var ctm = e.getCTM();
-    Expect.isTrue(ctm is SVGMatrix);
+    expect(ctm, isSVGMatrix);
 
     var sctm = e.getScreenCTM();
-    Expect.isTrue(sctm is SVGMatrix);
+    expect(sctm, isSVGMatrix);
 
     var xf2e = e.getTransformToElement(e);
-    Expect.isTrue(xf2e is SVGMatrix);
+    expect(xf2e, isSVGMatrix);
   }
 
   /**
@@ -105,7 +120,7 @@
    */
   checkSVGTransformable(e) {
     var trans = e.transform;
-    Expect.isTrue(trans is SVGAnimatedTransformList);
+    expect(trans, isSVGAnimatedTransformList);
   }
 
   testRect(name, checker) {
diff --git a/tests/html/svgelement2_test.dart b/tests/html/svgelement2_test.dart
index 218e7a6..024cf6b 100644
--- a/tests/html/svgelement2_test.dart
+++ b/tests/html/svgelement2_test.dart
@@ -17,6 +17,6 @@
   // The svgelement_test requires the field "_this" to map to "_this". In this
   // test-case we use another library's '_this' first (see issue 3039 and
   // _ChildNodeListLazy.first).
-  Expect.equals(499, new A(499)._this);
+  expect(new A(499)._this, 499);
   originalTest.main();
 }
diff --git a/tests/html/svgelement_test.dart b/tests/html/svgelement_test.dart
index 9892601..69ab4fe 100644
--- a/tests/html/svgelement_test.dart
+++ b/tests/html/svgelement_test.dart
@@ -10,6 +10,9 @@
 main() {
   useHtmlConfiguration();
 
+  var isSVGSVGElement =
+      predicate((x) => x is SVGSVGElement, 'is a SVGSVGElement');
+
   Collection<String> _nodeStrings(Collection<Node> input) {
     final out = new List<String>();
     for (Node n in input) {
@@ -25,9 +28,9 @@
 
   testConstructor(String tagName, Function isExpectedClass) {
     test(tagName, () {
-      Expect.isTrue(isExpectedClass(new SVGElement.tag(tagName)));
-      Expect.isTrue(isExpectedClass(
-          new SVGElement.svg('<$tagName></$tagName>')));
+      expect(isExpectedClass(new SVGElement.tag(tagName)), isTrue);
+      expect(isExpectedClass(
+          new SVGElement.svg('<$tagName></$tagName>')), isTrue);
     });
   }
 
@@ -40,23 +43,22 @@
   <path></path>
 </svg>""";
         final el = new SVGElement.svg(svg);
-        Expect.isTrue(el is SVGSVGElement);
-        Expect.equals("<circle></circle><path></path>", el.innerHTML);
-        Expect.equals(svg, el.outerHTML);
+        expect(el, isSVGSVGElement);
+        expect(el.innerHTML, "<circle></circle><path></path>");
+        expect(el.outerHTML, svg);
       });
 
       test('has no parent', () =>
-        Expect.isNull(new SVGElement.svg('<circle/>').parent));
+        expect(new SVGElement.svg('<circle/>').parent, isNull)
+      );
 
       test('empty', () {
-        Expect.throws(() => new SVGElement.svg(""),
-            (e) => e is ArgumentError);
+        expect(() => new SVGElement.svg(""), throwsArgumentError);
       });
 
       test('too many elements', () {
-        Expect.throws(
-            () => new SVGElement.svg("<circle></circle><path></path>"),
-            (e) => e is ArgumentError);
+        expect(() => new SVGElement.svg("<circle></circle><path></path>"),
+            throwsArgumentError);
       });
     });
 
@@ -149,8 +151,8 @@
     final el = new SVGSVGElement();
     el.elements.add(new SVGElement.tag("circle"));
     el.elements.add(new SVGElement.tag("path"));
-    Expect.equals('<svg version="1.1"><circle></circle><path></path></svg>',
-        el.outerHTML);
+    expect(el.outerHTML,
+        '<svg version="1.1"><circle></circle><path></path></svg>');
   });
 
   group('innerHTML', () {
@@ -158,7 +160,7 @@
       final el = new SVGSVGElement();
       el.elements.add(new SVGElement.tag("circle"));
       el.elements.add(new SVGElement.tag("path"));
-      Expect.equals('<circle></circle><path></path>', el.innerHTML);
+      expect(el.innerHTML, '<circle></circle><path></path>');
     });
 
     test('set', () {
@@ -166,7 +168,7 @@
       el.elements.add(new SVGElement.tag("circle"));
       el.elements.add(new SVGElement.tag("path"));
       el.innerHTML = '<rect></rect><a></a>';
-      Expect.listEquals(["rect", "a"], _nodeStrings(el.elements));
+      expect(_nodeStrings(el.elements), ["rect", "a"]);
     });
   });
 
@@ -178,13 +180,13 @@
   <path></path>
   text
 </svg>""");
-      Expect.listEquals(["circle", "path"], _nodeStrings(el.elements));
+      expect(_nodeStrings(el.elements), ["circle", "path"]);
     });
 
     test('set', () {
       final el = new SVGSVGElement();
       el.elements = [new SVGElement.tag("circle"), new SVGElement.tag("path")];
-      Expect.equals('<circle></circle><path></path>', el.innerHTML);
+      expect(el.innerHTML, '<circle></circle><path></path>');
     });
   });
 }
diff --git a/tests/html/transferables_test.dart b/tests/html/transferables_test.dart
index 220852c..8779362 100644
--- a/tests/html/transferables_test.dart
+++ b/tests/html/transferables_test.dart
@@ -10,9 +10,12 @@
 main() {
   useHtmlConfiguration();
 
+  var isArrayBuffer =
+      predicate((x) => x is ArrayBuffer, 'is an ArrayBuffer');
+
   test('TransferableTest', () {
     window.on.message.add(expectAsync1((messageEvent) {
-      expect(messageEvent.data, new isInstanceOf<ArrayBuffer>());
+      expect(messageEvent.data, isArrayBuffer);
     }));
     final buffer = (new Float32Array(3)).buffer;
     window.postMessage(buffer, '*', [buffer]);
diff --git a/tests/html/typed_arrays_1_test.dart b/tests/html/typed_arrays_1_test.dart
index daca422..860ed71 100644
--- a/tests/html/typed_arrays_1_test.dart
+++ b/tests/html/typed_arrays_1_test.dart
@@ -10,36 +10,39 @@
 main() {
   useHtmlConfiguration();
 
+  var isnumList = predicate((x) => x is List<num>, 'is a List<num>');
+  var isStringList = predicate((x) => x is List<String>, 'is a List<String>');
+
   test('createByLengthTest', () {
       var a = new Float32Array(10);
-      Expect.equals(10, a.length);
-      Expect.equals(0, a[4]);
+      expect(a.length, 10);
+      expect(a[4], 0);
   });
 
   test('aliasTest', () {
       var a1 = new Uint8Array.fromList([0,0,1,0x45]);
       var a2 = new Float32Array.fromBuffer(a1.buffer);
 
-      Expect.equals(1, a2.length);
+      expect(a2.length, 1);
 
       // 0x45010000 = 2048+16
-      Expect.equals(2048 + 16, a2[0]);
+      expect(a2[0], 2048 + 16);
 
       a1[2] = 0;
       // 0x45000000 = 2048
-      Expect.equals(2048, a2[0]);
+      expect(a2[0], 2048);
 
       a1[3]--;
       a1[2] += 128;
       // 0x44800000 = 1024
-      Expect.equals(1024, a2[0]);
+      expect(a2[0], 1024);
 
   });
 
   test('typeTests', () {
       var a = new Float32Array(10);
-      Expect.isTrue(a is List);
-      Expect.isTrue(a is List<num>);
-      Expect.isTrue(a is! List<String>);
+      expect(a, isList);
+      expect(a, isnumList);
+      expect(a, isNot(isStringList));
     });
 }
diff --git a/tests/html/typed_arrays_2_test.dart b/tests/html/typed_arrays_2_test.dart
index 6705833f..a2e747e 100644
--- a/tests/html/typed_arrays_2_test.dart
+++ b/tests/html/typed_arrays_2_test.dart
@@ -17,32 +17,32 @@
       }
 
       var a2 = new Uint32Array.fromBuffer(a1.buffer);
-      Expect.equals(1024 ~/ 4, a2.length);
-      Expect.equals(0x03020100, a2[0]);
-      Expect.equals(0x07060504, a2[1]);
-      Expect.equals(0x0B0A0908, a2[2]);
-      Expect.equals(0xCBCAC9C8, a2[50]);
-      Expect.equals(0xCFCECDCC, a2[51]);
-      Expect.equals(0x03020100, a2[64]);
+      expect(1024 ~/ 4, a2.length);
+      expect(a2[0], 0x03020100);
+      expect(a2[1], 0x07060504);
+      expect(a2[2], 0x0B0A0908);
+      expect(a2[50], 0xCBCAC9C8);
+      expect(a2[51], 0xCFCECDCC);
+      expect(a2[64], 0x03020100);
 
       a2 = new Uint32Array.fromBuffer(a1.buffer, 200);
-      Expect.equals((1024 - 200) ~/ 4, a2.length);
-      Expect.equals(0xCBCAC9C8, a2[0]);
-      Expect.equals(0xCFCECDCC, a2[1]);
-      Expect.equals(0x03020100, a2[14]);
+      expect(a2.length, (1024 - 200) ~/ 4);
+      expect(a2[0], 0xCBCAC9C8);
+      expect(a2[1], 0xCFCECDCC);
+      expect(a2[14], 0x03020100);
 
       a2 = new Uint32Array.fromBuffer(a1.buffer, 456, 20);
-      Expect.equals(20, a2.length);
-      Expect.equals(0xCBCAC9C8, a2[0]);
-      Expect.equals(0xCFCECDCC, a2[1]);
-      Expect.equals(0x03020100, a2[14]);
+      expect(a2.length, 20);
+      expect(a2[0], 0xCBCAC9C8);
+      expect(a2[1], 0xCFCECDCC);
+      expect(a2[14], 0x03020100);
 
       // OPTIONALS a2 = new Uint32Array.fromBuffer(a1.buffer, length: 30, byteOffset: 456);
       a2 = new Uint32Array.fromBuffer(a1.buffer, 456, 30);
-      Expect.equals(30, a2.length);
-      Expect.equals(0xCBCAC9C8, a2[0]);
-      Expect.equals(0xCFCECDCC, a2[1]);
-      Expect.equals(0x03020100, a2[14]);
+      expect(a2.length, 30);
+      expect(a2[0], 0xCBCAC9C8);
+      expect(a2[1], 0xCFCECDCC);
+      expect(a2[14], 0x03020100);
   });
 
   test('fromBufferTest_typed', () {
@@ -52,29 +52,29 @@
       }
 
       Uint32Array a2 = new Uint32Array.fromBuffer(a1.buffer);
-      Expect.equals(1024 ~/ 4, a2.length);
-      Expect.equals(0x03020100, a2[0]);
-      Expect.equals(0xCBCAC9C8, a2[50]);
-      Expect.equals(0xCFCECDCC, a2[51]);
-      Expect.equals(0x03020100, a2[64]);
+      expect(a2.length, 1024 ~/ 4);
+      expect(a2[0], 0x03020100);
+      expect(a2[50], 0xCBCAC9C8);
+      expect(a2[51], 0xCFCECDCC);
+      expect(a2[64], 0x03020100);
 
       a2 = new Uint32Array.fromBuffer(a1.buffer, 200);
-      Expect.equals((1024 - 200) ~/ 4, a2.length);
-      Expect.equals(0xCBCAC9C8, a2[0]);
-      Expect.equals(0xCFCECDCC, a2[1]);
-      Expect.equals(0x03020100, a2[14]);
+      expect(a2.length, (1024 - 200) ~/ 4);
+      expect(a2[0], 0xCBCAC9C8);
+      expect(a2[1], 0xCFCECDCC);
+      expect(a2[14], 0x03020100);
 
       a2 = new Uint32Array.fromBuffer(a1.buffer, 456, 20);
-      Expect.equals(20, a2.length);
-      Expect.equals(0xCBCAC9C8, a2[0]);
-      Expect.equals(0xCFCECDCC, a2[1]);
-      Expect.equals(0x03020100, a2[14]);
+      expect(20, a2.length);
+      expect(a2[0], 0xCBCAC9C8);
+      expect(a2[1], 0xCFCECDCC);
+      expect(a2[14], 0x03020100);
 
       // OPTIONALS a2 = new Uint32Array.fromBuffer(a1.buffer, length: 30, byteOffset: 456);
       a2 = new Uint32Array.fromBuffer(a1.buffer, 456, 30);
-      Expect.equals(30, a2.length);
-      Expect.equals(0xCBCAC9C8, a2[0]);
-      Expect.equals(0xCFCECDCC, a2[1]);
-      Expect.equals(0x03020100, a2[14]);
+      expect(a2.length, 30);
+      expect(a2[0], 0xCBCAC9C8);
+      expect(a2[1], 0xCFCECDCC);
+      expect(a2[14], 0x03020100);
   });
 }
diff --git a/tests/html/typed_arrays_3_test.dart b/tests/html/typed_arrays_3_test.dart
index 7d0c1a5..a1f9416 100644
--- a/tests/html/typed_arrays_3_test.dart
+++ b/tests/html/typed_arrays_3_test.dart
@@ -16,12 +16,12 @@
       a1.setElements([0x50,0x60,0x70], 4);
 
       var a2 = new Uint32Array.fromBuffer(a1.buffer);
-      Expect.equals(0x00000000, a2[0]);
-      Expect.equals(0x00706050, a2[1]);
+      expect(a2[0], 0x00000000);
+      expect(a2[1], 0x00706050);
 
       a2.setElements([0x01020304], 2);
-      Expect.equals(0x04, a1[8]);
-      Expect.equals(0x01, a1[11]);
+      expect(a1[8], 0x04);
+      expect(a1[11], 0x01);
   });
 
   test('setElementsTest_typed', () {
@@ -30,11 +30,11 @@
       a1.setElements([0x50,0x60,0x70], 4);
 
       Uint32Array a2 = new Uint32Array.fromBuffer(a1.buffer);
-      Expect.equals(0x00000000, a2[0]);
-      Expect.equals(0x00706050, a2[1]);
+      expect(a2[0], 0x00000000);
+      expect(a2[1], 0x00706050);
 
       a2.setElements([0x01020304], 2);
-      Expect.equals(0x04, a1[8]);
-      Expect.equals(0x01, a1[11]);
+      expect(a1[8], 0x04);
+      expect(a1[11], 0x01);
   });
 }
diff --git a/tests/html/typed_arrays_4_test.dart b/tests/html/typed_arrays_4_test.dart
index 43f3331..59e532c 100644
--- a/tests/html/typed_arrays_4_test.dart
+++ b/tests/html/typed_arrays_4_test.dart
@@ -16,13 +16,13 @@
         a1[i] = i;
       }
 
-      Expect.equals(50, a1.indexOf(50));
-      Expect.equals(50, a1.indexOf(50, 50));
-      Expect.equals(256 + 50, a1.indexOf(50, 51));
+      expect(a1.indexOf(50), 50);
+      expect(a1.indexOf(50, 50), 50);
+      expect(a1.indexOf(50, 51), 256 + 50);
 
-      Expect.equals(768 + 50, a1.lastIndexOf(50));
-      Expect.equals(768 + 50, a1.lastIndexOf(50, 768 + 50));
-      Expect.equals(512 + 50, a1.lastIndexOf(50, 768 + 50 - 1));
+      expect(a1.lastIndexOf(50), 768 + 50);
+      expect(a1.lastIndexOf(50, 768 + 50), 768 + 50);
+      expect(a1.lastIndexOf(50, 768 + 50 - 1), 512 + 50);
   });
 
   test('indexOf_typed', () {
@@ -31,12 +31,12 @@
         a1[i] = i;
       }
 
-      Expect.equals(50, a1.indexOf(50));
-      Expect.equals(50, a1.indexOf(50, 50));
-      Expect.equals(256 + 50, a1.indexOf(50, 51));
+      expect(a1.indexOf(50), 50);
+      expect(a1.indexOf(50, 50), 50);
+      expect(a1.indexOf(50, 51), 256 + 50);
 
-      Expect.equals(768 + 50, a1.lastIndexOf(50));
-      Expect.equals(768 + 50, a1.lastIndexOf(50, 768 + 50));
-      Expect.equals(512 + 50, a1.lastIndexOf(50, 768 + 50 - 1));
+      expect(a1.lastIndexOf(50), 768 + 50);
+      expect(a1.lastIndexOf(50, 768 + 50), 768 + 50);
+      expect(a1.lastIndexOf(50, 768 + 50 - 1), 512 + 50);
   });
 }
diff --git a/tests/html/typing_test.dart b/tests/html/typing_test.dart
index 518a7d3..ec544d8 100644
--- a/tests/html/typing_test.dart
+++ b/tests/html/typing_test.dart
@@ -6,6 +6,9 @@
 main() {
   useHtmlConfiguration();
 
+  var isStyleSheetList =
+      predicate((x) => x is List<StyleSheet>, 'is a List<StyleSheet>');
+
   test('NodeList', () {
     List<Node> asList = window.document.queryAll('body');
     // Check it's Iterable
@@ -13,15 +16,15 @@
     for (Node node in window.document.queryAll('body')) {
       counter++;
     }
-    Expect.equals(1, counter);
+    expect(counter, 1);
     counter = 0;
     window.document.queryAll('body').forEach((e) { counter++; });
-    Expect.equals(1, counter);
+    expect(counter, 1);
   });
 
   test('StyleSheetList', () {
     List<StyleSheet> asList = window.document.styleSheets;
-    expect(asList is List<StyleSheet>);
+    expect(asList, isStyleSheetList);
     // Check it's Iterable.
     int counter = 0;
     for (StyleSheet styleSheet in window.document.styleSheets) {
@@ -29,6 +32,6 @@
     }
 
     // There is one style sheet from the unittest framework.
-    Expect.equals(1, counter);
+    expect(counter, 1);
   });
 }
diff --git a/tests/html/unknownelement_test.dart b/tests/html/unknownelement_test.dart
index 86a67b1..00d7ca6 100644
--- a/tests/html/unknownelement_test.dart
+++ b/tests/html/unknownelement_test.dart
@@ -10,6 +10,9 @@
 main() {
   useHtmlConfiguration();
 
+  var isUnknownElement =
+      predicate((x) => x is UnknownElement, 'is an UnknownELement');
+
   var foo = new Element.tag('foo');
   foo.id = 'foo';
   var bar = new Element.tag('bar');
@@ -17,8 +20,8 @@
   document.body.nodes.addAll([foo, bar]);
 
   test('type-check', () {
-      expect(foo is UnknownElement, isTrue);
-      expect(bar is UnknownElement, isTrue);
+      expect(foo, isUnknownElement);
+      expect(bar, isUnknownElement);
       expect(query('#foo'), equals(foo));
       expect(query('#bar'), equals(bar));
     });
@@ -57,7 +60,7 @@
             }
             break;
         }
-        throw new NoSuchMethodError(element, name, args);
+        throw new NoSuchMethodError(element, name, args, {});
       }
       dynamicUnknownElementDispatcher = dispatch;
 
diff --git a/tests/html/url_test.dart b/tests/html/url_test.dart
index 6cfc815..8fec60a 100644
--- a/tests/html/url_test.dart
+++ b/tests/html/url_test.dart
@@ -38,7 +38,7 @@
       var blob = createImageBlob();
       var url = window.createObjectUrl(blob);
       expect(url.length, greaterThan(0));
-      expect(url.startsWith('blob:'));
+      expect(url, startsWith('blob:'));
 
       var img = new ImageElement();
       img.on.load.add(expectAsync1((_) {
@@ -46,7 +46,7 @@
       }));
       img.on.error.add((_) {
         guardAsync(() {
-          expect(true, isFalse, 'URL failed to load.');
+          expect(true, isFalse, reason: 'URL failed to load.');
         });
       });
       img.src = url;
@@ -55,7 +55,7 @@
     test('revokeObjectUrl', () {
       var blob = createImageBlob();
       var url = window.createObjectUrl(blob);
-      expect(url.startsWith('blob:'));
+      expect(url, startsWith('blob:'));
       window.revokeObjectUrl(url);
 
       var img = new ImageElement();
@@ -64,7 +64,7 @@
       }));
       img.on.load.add((_) {
         guardAsync(() {
-          expect(true, isFalse, 'URL should not have loaded.');
+          expect(true, isFalse, reason: 'URL should not have loaded.');
         });
       });
       img.src = url;
diff --git a/tests/html/util.dart b/tests/html/util.dart
index 511a576..9451581 100644
--- a/tests/html/util.dart
+++ b/tests/html/util.dart
@@ -2,14 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-void expectUnsupported(void fn()) =>
-  Expect.throws(fn, (e) => e is UnsupportedError);
+void expectUnsupported(f) => expect(f, throwsUnsupportedError);
 
 void expectEmptyRect(ClientRect rect) {
-  Expect.equals(0, rect.bottom);
-  Expect.equals(0, rect.top);
-  Expect.equals(0, rect.left);
-  Expect.equals(0, rect.right);
-  Expect.equals(0, rect.height);
-  Expect.equals(0, rect.width);
+  expect(rect.bottom, isZero);
+  expect(rect.top, isZero);
+  expect(rect.left, isZero);
+  expect(rect.right, isZero);
+  expect(rect.height, isZero);
+  expect(rect.width, isZero);
 }
diff --git a/tests/html/utils.dart b/tests/html/utils.dart
index 2c07fcf..9752239 100644
--- a/tests/html/utils.dart
+++ b/tests/html/utils.dart
@@ -1,4 +1,5 @@
 #library('TestUtils');
+#import('../../pkg/unittest/unittest.dart');
 
 /**
  * Verifies that [actual] has the same graph structure as [expected].
@@ -14,22 +15,22 @@
 
   walk(path, expected, actual) {
     if (expected is String || expected is num || expected == null) {
-      Expect.equals(expected, actual, message(path, 'not equal'));
+      expect(actual, equals(expected), reason: message(path, 'not equal'));
       return;
     }
 
     // Cycle or DAG?
     for (int i = 0; i < eItems.length; i++) {
       if (expected === eItems[i]) {
-        Expect.identical(aItems[i], actual,
-                         message(path, 'missing back or side edge'));
+        expect(actual, same(aItems[i]),
+            reason: message(path, 'missing back or side edge'));
         return;
       }
     }
     for (int i = 0; i < aItems.length; i++) {
       if (actual === aItems[i]) {
-        Expect.identical(eItems[i], expected,
-                         message(path, 'extra back or side edge'));
+        expect(expected, same(eItems[i]),
+            reason: message(path, 'extra back or side edge'));
         return;
       }
     }
@@ -37,9 +38,9 @@
     aItems.add(actual);
 
     if (expected is List) {
-      Expect.isTrue(actual is List, message(path, '$actual is List'));
-      Expect.equals(expected.length, actual.length,
-                    message(path, 'different list lengths'));
+      expect(actual, isList, reason: message(path, '$actual is List'));
+      expect(actual.length, expected.length,
+          reason: message(path, 'different list lengths'));
       for (var i = 0; i < expected.length; i++) {
         walk('$path[$i]', expected[i], actual[i]);
       }
@@ -47,22 +48,22 @@
     }
 
     if (expected is Map) {
-      Expect.isTrue(actual is Map, message(path, '$actual is Map'));
+      expect(actual, isMap, reason: message(path, '$actual is Map'));
       for (var key in expected.keys) {
         if (!actual.containsKey(key)) {
-          Expect.fail(message(path, 'missing key "$key"'));
+          expect(false, isTrue, reason: message(path, 'missing key "$key"'));
         }
         walk('$path["$key"]',  expected[key], actual[key]);
       }
       for (var key in actual.keys) {
         if (!expected.containsKey(key)) {
-          Expect.fail(message(path, 'extra key "$key"'));
+          expect(false, isTrue, reason: message(path, 'extra key "$key"'));
         }
       }
       return;
     }
 
-    Expect.fail('Unhandled type: $expected');
+    expect(false, isTrue, reason: 'Unhandled type: $expected');
   }
 
   walk('', expected, actual);
diff --git a/tests/html/webgl_1_test.dart b/tests/html/webgl_1_test.dart
index 5be80d7..8ad757c 100644
--- a/tests/html/webgl_1_test.dart
+++ b/tests/html/webgl_1_test.dart
@@ -16,6 +16,6 @@
       gl.compileShader(shader);
       var success =
           gl.getShaderParameter(shader, WebGLRenderingContext.COMPILE_STATUS);
-      Expect.isTrue(success);
+      expect(success, isTrue);
   });
 }
diff --git a/tests/html/websocket_test.dart b/tests/html/websocket_test.dart
index 25c271c..d14765f 100644
--- a/tests/html/websocket_test.dart
+++ b/tests/html/websocket_test.dart
@@ -7,9 +7,11 @@
 
   useHtmlConfiguration();
 
+  var isWebSocket = predicate((x) => x is WebSocket, 'is a WebSocket');
+
   test('constructorTest', () {
       var socket = new WebSocket('ws://localhost');
-      Expect.isTrue(socket != null);
-      Expect.isTrue(socket is WebSocket);
+      expect(socket, isNotNull);
+      expect(socket, isWebSocket);
   });
 }
diff --git a/tests/html/websql_test.dart b/tests/html/websql_test.dart
index 8cf2fd2..047e9b3 100644
--- a/tests/html/websql_test.dart
+++ b/tests/html/websql_test.dart
@@ -5,7 +5,7 @@
 
 void fail(message) {
   guardAsync(() {
-      Expect.fail(message);
+      expect(false, isTrue, reason: message);
     });
 }
 
@@ -94,7 +94,7 @@
 
     final db = window.openDatabase('test_db', '1.0', 'test_db', 1024 * 1024);
 
-    Expect.isNotNull(db, 'Unable to open database');
+    expect(db, isNotNull, reason: 'Unable to open database');
 
     createTransaction(db)
       // Attempt to clear out any tables which may be lurking from previous
@@ -104,10 +104,10 @@
       .chain(insert(tableName, columnName, 'Some text data'))
       .chain(queryTable(tableName, (resultSet) {
         guardAsync(() {
-          Expect.equals(1, resultSet.rows.length);
+          expect(resultSet.rows.length, 1);
           var row = resultSet.rows.item(0);
-          Expect.isTrue(row.containsKey(columnName));
-          Expect.equals('Some text data', row[columnName]);
+          expect(row.containsKey(columnName), isTrue);
+          expect(row[columnName], 'Some text data');
         });
       }))
       .chain(dropTable(tableName))
diff --git a/tests/html/window_eq_test.dart b/tests/html/window_eq_test.dart
index a91d1e3..015c985 100644
--- a/tests/html/window_eq_test.dart
+++ b/tests/html/window_eq_test.dart
@@ -8,7 +8,7 @@
   var obfuscated = null;
 
   test('notNull', () {
-      Expect.isNotNull(window);
-      Expect.isTrue(window != obfuscated);
+      expect(window, isNotNull);
+      expect(window, isNot(equals(obfuscated)));
     });
 }
diff --git a/tests/html/window_mangling_test.dart b/tests/html/window_mangling_test.dart
index 911a1ef..83d5481 100644
--- a/tests/html/window_mangling_test.dart
+++ b/tests/html/window_mangling_test.dart
@@ -20,16 +20,16 @@
   test('windowMethod', () {
       final message = navigator;
       final x = win.navigator;
-      Expect.notEquals(message, x);
+      expect(x, isNot(equals(message)));
     });
 
   test('windowEquals', () {
-      Expect.isFalse($eq(win, win));
-      Expect.isTrue(win == win);
+      expect($eq(win, win), isFalse);
+      expect(win == win, isTrue);
     });
 
   test('windowEquals', () {
-      Expect.isFalse($eq$(win, win));
-      Expect.isTrue(win == win);
+      expect($eq$(win, win), isFalse);
+      expect(win == win, isTrue);
     });
 }
diff --git a/tests/html/window_nosuchmethod_test.dart b/tests/html/window_nosuchmethod_test.dart
index b46f4f8..cad0678 100644
--- a/tests/html/window_nosuchmethod_test.dart
+++ b/tests/html/window_nosuchmethod_test.dart
@@ -25,18 +25,18 @@
       final message = foo("Hello World");
       try {
         String x = win.foo(message);
-        Expect.fail('Should not reach here: $x');
+        expect(false, isTrue, reason: 'Should not reach here: $x');
       } on NoSuchMethodError catch (e) {
         // Expected exception.
       } on Exception catch (e) {
-        Expect.fail('Wrong exception: $e');
+        expect(false, isTrue, reason: 'Wrong exception: $e');
       }
     });
 
   test('foo', () {
       var win = things[inscrutable(0)];
       String x = win.foo('bar');
-      Expect.equals('not bar', x);
+      expect(x, 'not bar');
     });
 
   // Use dom.window direclty in case the compiler does type inference.
@@ -44,11 +44,11 @@
       final message = foo("Hello World");
       try {
         String x = dom.window.foo(message);
-        Expect.fail('Should not reach here: $x');
+        expect(false, isTrue, reason: 'Should not reach here: $x');
       } on NoSuchMethodError catch (e) {
         // Expected exception.
       } on Exception catch (e) {
-        Expect.fail('Wrong exception: $e');
+        expect(false, isTrue, reason: 'Wrong exception: $e');
       }
     });
 }
diff --git a/tests/html/xhr_cross_origin_test.dart b/tests/html/xhr_cross_origin_test.dart
index 472950c..a210f66 100644
--- a/tests/html/xhr_cross_origin_test.dart
+++ b/tests/html/xhr_cross_origin_test.dart
@@ -18,7 +18,7 @@
     var validate = expectAsync1((data) {
       expect(data, contains('feed'));
       expect(data['feed'], contains('entry'));
-      expect(data is Map, isTrue);
+      expect(data, isMap);
     });
     xhr.on.readyStateChange.add((e) {
       guardAsync(() {
@@ -36,7 +36,7 @@
       var data = JSON.parse(xhr.response);
       expect(data, contains('feed'));
       expect(data['feed'], contains('entry'));
-      expect(data is Map, isTrue);
+      expect(data, isMap);
     }));
   });
 }
diff --git a/tests/html/xmldocument_test.dart b/tests/html/xmldocument_test.dart
index dccf15b..980801d 100644
--- a/tests/html/xmldocument_test.dart
+++ b/tests/html/xmldocument_test.dart
@@ -10,27 +10,30 @@
 main() {
   useHtmlConfiguration();
 
+  var isXMLDocument = predicate((x) => x is XMLDocument, 'is an XMLDocument');
+  var isXMLElement = predicate((x) => x is XMLElement, 'is an XMLElement');
+
   XMLDocument makeDocument() => new XMLDocument.xml("<xml><foo/><bar/></xml>");
 
   group('constructor', () {
     test('with a well-formed document', () {
       final doc = makeDocument();
-      Expect.isTrue(doc is XMLDocument);
-      Expect.equals('foo', doc.elements[0].tagName);
-      Expect.equals('bar', doc.elements[1].tagName);
+      expect(doc, isXMLDocument);
+      expect(doc.elements[0].tagName, 'foo');
+      expect(doc.elements[1].tagName, 'bar');
     });
 
     // TODO(nweiz): re-enable this when Document#query matches the root-level
     // element. Otherwise it fails on Firefox.
     //
     // test('with a parse error', () {
-    //   Expect.throws(() => new XMLDocument.xml("<xml></xml>foo"),
-    //       (e) => e is ArgumentError);
+    //   expect(() => new XMLDocument.xml("<xml></xml>foo"),
+    //       throwsArgumentError);
     // });
 
     test('with a PARSERERROR tag', () {
       final doc = new XMLDocument.xml("<xml><parsererror /></xml>");
-      Expect.equals('parsererror', doc.elements[0].tagName);
+      expect(doc.elements[0].tagName, 'parsererror');
     });
   });
 
@@ -38,13 +41,13 @@
   group('elements', () {
     test('filters out non-element nodes', () {
       final doc = new XMLDocument.xml("<xml>1<a/><b/>2<c/>3<d/></xml>");
-      Expect.listEquals(["a", "b", "c", "d"], doc.elements.map((e) => e.tagName));
+      expect(doc.elements.map((e) => e.tagName), ["a", "b", "c", "d"]);
     });
 
     test('overwrites nodes when set', () {
       final doc = new XMLDocument.xml("<xml>1<a/><b/>2<c/>3<d/></xml>");
       doc.elements = [new XMLElement.tag('x'), new XMLElement.tag('y')];
-      Expect.equals("<xml><x></x><y></y></xml>", doc.outerHTML);
+      expect(doc.outerHTML, "<xml><x></x><y></y></xml>");
     });
   });
 
@@ -62,32 +65,32 @@
     test('affects the "class" attribute', () {
       final doc = makeDocumentWithClasses();
       doc.classes.add('qux');
-      Expect.setEquals(['foo', 'bar', 'baz', 'qux'], extractClasses(doc));
+      expect(extractClasses(doc), ["foo", "bar", "baz", "qux"]);
     });
 
     test('is affected by the "class" attribute', () {
       final doc = makeDocumentWithClasses();
       doc.attributes['class'] = 'foo qux';
-      Expect.setEquals(['foo', 'qux'], doc.classes);
+      expect(doc.classes, ["foo", "qux"]);
     });
 
     test('classes=', () {
       final doc = makeDocumentWithClasses();
       doc.classes = ['foo', 'qux'];
-      Expect.setEquals(['foo', 'qux'], doc.classes);
-      Expect.setEquals(['foo', 'qux'], extractClasses(doc));
+      expect(doc.classes, ["foo", "qux"]);
+      expect(extractClasses(doc), ["foo", "qux"]);
     });
 
     test('toString', () {
-      Expect.setEquals(['foo', 'bar', 'baz'],
-          makeClassSet().toString().split(' '));
-      Expect.equals('', makeDocument().classes.toString());
+      expect(makeClassSet().toString().split(' '),
+          unorderedEquals(['foo', 'bar', 'baz']));
+      expect(makeDocument().classes.toString(), '');
     });
 
     test('forEach', () {
       final classes = <String>[];
       makeClassSet().forEach(classes.add);
-      Expect.setEquals(['foo', 'bar', 'baz'], classes);
+      expect(classes, unorderedEquals(['foo', 'bar', 'baz']));
     });
 
     test('iterator', () {
@@ -95,101 +98,99 @@
       for (var doc in makeClassSet()) {
         classes.add(doc);
       }
-      Expect.setEquals(['foo', 'bar', 'baz'], classes);
+      expect(classes, unorderedEquals(['foo', 'bar', 'baz']));
     });
 
     test('map', () {
-      Expect.setEquals(['FOO', 'BAR', 'BAZ'],
-          makeClassSet().map((c) => c.toUpperCase()));
+      expect(makeClassSet().map((c) => c.toUpperCase()),
+          unorderedEquals(['FOO', 'BAR', 'BAZ']));
     });
 
     test('filter', () {
-      Expect.setEquals(['bar', 'baz'],
-          makeClassSet().filter((c) => c.contains('a')));
+      expect(makeClassSet().filter((c) => c.contains('a')),
+          unorderedEquals(['bar', 'baz']));
     });
 
     test('every', () {
-      Expect.isTrue(makeClassSet().every((c) => c is String));
-      Expect.isFalse(
-          makeClassSet().every((c) => c.contains('a')));
+      expect(makeClassSet().every((c) => c is String), isTrue);
+      expect(makeClassSet().every((c) => c.contains('a')), isFalse);
     });
 
     test('some', () {
-      Expect.isTrue(
-          makeClassSet().some((c) => c.contains('a')));
-      Expect.isFalse(makeClassSet().some((c) => c is num));
+      expect(makeClassSet().some((c) => c.contains('a')), isTrue);
+      expect(makeClassSet().some((c) => c is num), isFalse);
     });
 
     test('isEmpty', () {
-      Expect.isFalse(makeClassSet().isEmpty);
-      Expect.isTrue(makeDocument().classes.isEmpty);
+      expect(makeClassSet().isEmpty, isFalse);
+      expect(makeDocument().classes.isEmpty, isTrue);
     });
 
     test('length', () {
-      Expect.equals(3, makeClassSet().length);
-      Expect.equals(0, makeDocument().classes.length);
+      expect(makeClassSet().length, 3);
+      expect(makeDocument().classes.length, 0);
     });
 
     test('contains', () {
-      Expect.isTrue(makeClassSet().contains('foo'));
-      Expect.isFalse(makeClassSet().contains('qux'));
+      expect(makeClassSet().contains('foo'), isTrue);
+      expect(makeClassSet().contains('qux'), isFalse);
     });
 
     test('add', () {
       final classes = makeClassSet();
       classes.add('qux');
-      Expect.setEquals(['foo', 'bar', 'baz', 'qux'], classes);
+      expect(classes, unorderedEquals(['foo', 'bar', 'baz', 'qux']);
 
       classes.add('qux');
       final list = new List.from(classes);
       list.sort((a, b) => a.compareTo(b));
-      Expect.listEquals(['bar', 'baz', 'foo', 'qux'], list,
-          "The class set shouldn't have duplicate elements.");
+      expect(list, ['bar', 'baz', 'foo', 'qux'],
+          reason: "The class set shouldn't have duplicate elements.");
     });
 
     test('remove', () {
       final classes = makeClassSet();
       classes.remove('bar');
-      Expect.setEquals(['foo', 'baz'], classes);
+      expect(classes, unorderedEquals(['foo', 'baz']));
       classes.remove('qux');
-      Expect.setEquals(['foo', 'baz'], classes);
+      expect(classes, unorderedEquals(['foo', 'baz']));
     });
 
     test('addAll', () {
       final classes = makeClassSet();
       classes.addAll(['bar', 'qux', 'bip']);
-      Expect.setEquals(['foo', 'bar', 'baz', 'qux', 'bip'], classes);
+      expect(classes, unorderedEquals(['foo', 'bar', 'baz', 'qux', 'bip']));
     });
 
     test('removeAll', () {
       final classes = makeClassSet();
       classes.removeAll(['bar', 'baz', 'qux']);
-      Expect.setEquals(['foo'], classes);
+      expect(classes, ['foo']);
     });
 
     test('isSubsetOf', () {
       final classes = makeClassSet();
-      Expect.isTrue(classes.isSubsetOf(['foo', 'bar', 'baz']));
-      Expect.isTrue(classes.isSubsetOf(['foo', 'bar', 'baz', 'qux']));
-      Expect.isFalse(classes.isSubsetOf(['foo', 'bar', 'qux']));
+      expect(classes.isSubsetOf(['foo', 'bar', 'baz']), isTrue);
+      expect(classes.isSubsetOf(['foo', 'bar', 'baz', 'qux']), isTrue);
+      expect(classes.isSubsetOf(['foo', 'bar', 'qux']), isFalse);
     });
 
     test('containsAll', () {
       final classes = makeClassSet();
-      Expect.isTrue(classes.containsAll(['foo', 'baz']));
-      Expect.isFalse(classes.containsAll(['foo', 'qux']));
+      expect(classes.containsAll(['foo', 'baz']), isTrue);
+      expect(classes.containsAll(['foo', 'qux']), isFalse);
     });
 
     test('intersection', () {
       final classes = makeClassSet();
-      Expect.setEquals(['foo', 'baz'],
-          classes.intersection(['foo', 'qux', 'baz']));
+      expect(classes.intersection(['foo', 'qux', 'baz']),
+          unorderedEquals(['foo', 'baz']))
     });
 
     test('clear', () {
       final classes = makeClassSet();
       classes.clear();
-      Expect.setEquals([], classes);
+      expect(classes, []);
     });
   });
 
@@ -201,14 +202,14 @@
     test('affects the "class" attribute', () {
       final doc = makeDocumentWithClasses();
       doc.classes.add('qux');
-      Expect.setEquals(['foo', 'bar', 'baz', 'qux'],
-          doc.attributes['class'].split(' '));
+      expect(doc.attributes['class'].split(' '),
+          unorderedEquals(['foo', 'bar', 'baz', 'qux']));
     });
 
     test('is affected by the "class" attribute', () {
       final doc = makeDocumentWithClasses();
       doc.attributes['class'] = 'foo qux';
-      Expect.setEquals(['foo', 'qux'], doc.classes);
+      expect(doc.classes, unorderedEquals(['foo', 'qux']));
     });
   });
 
@@ -220,131 +221,131 @@
     doc.scrollByLines(2);
     doc.scrollByPages(2);
     doc.scrollIntoView();
-    Expect.isFalse(doc.execCommand("foo", false, "bar"));
+    expect(doc.execCommand("foo", false, "bar"), isFalse);
   });
 
   group('properties that map to attributes', () {
     group('contentEditable', () {
       test('get', () {
         final doc = makeDocument();
-        Expect.equals('inherit', doc.contentEditable);
+        expect(doc.contentEditable, 'inherit');
         doc.attributes['contentEditable'] = 'foo';
-        Expect.equals('foo', doc.contentEditable);
+        expect(doc.contentEditable, 'foo');
       });
 
       test('set', () {
         final doc = makeDocument();
         doc.contentEditable = 'foo';
-        Expect.equals('foo', doc.attributes['contentEditable']);
+        expect(doc.attributes['contentEditable'], 'foo');
       });
 
       test('isContentEditable', () {
         final doc = makeDocument();
-        Expect.isFalse(doc.isContentEditable);
+        expect(doc.isContentEditable, isFalse);
         doc.contentEditable = 'true';
-        Expect.isFalse(doc.isContentEditable);
+        expect(doc.isContentEditable, isFalse);
       });
     });
 
     group('draggable', () {
       test('get', () {
         final doc = makeDocument();
-        Expect.isFalse(doc.draggable);
+        expect(doc.draggable, isFalse);
         doc.attributes['draggable'] = 'true';
-        Expect.isTrue(doc.draggable);
+        expect(doc.draggable, isTrue);
         doc.attributes['draggable'] = 'foo';
-        Expect.isFalse(doc.draggable);
+        expect(doc.draggable, isFalse);
       });
 
       test('set', () {
         final doc = makeDocument();
         doc.draggable = true;
-        Expect.equals('true', doc.attributes['draggable']);
+        expect(doc.attributes['draggable'], 'true');
         doc.draggable = false;
-        Expect.equals('false', doc.attributes['draggable']);
+        expect(doc.attributes['draggable'], 'false');
       });
     });
 
     group('spellcheck', () {
       test('get', () {
         final doc = makeDocument();
-        Expect.isFalse(doc.spellcheck);
+        expect(doc.spellcheck, isFalse);
         doc.attributes['spellcheck'] = 'true';
-        Expect.isTrue(doc.spellcheck);
+        expect(doc.spellcheck, isTrue);
         doc.attributes['spellcheck'] = 'foo';
-        Expect.isFalse(doc.spellcheck);
+        expect(doc.spellcheck, isFalse);
       });
 
       test('set', () {
         final doc = makeDocument();
         doc.spellcheck = true;
-        Expect.equals('true', doc.attributes['spellcheck']);
+        expect(doc.attributes['spellcheck'], 'true');
         doc.spellcheck = false;
-        Expect.equals('false', doc.attributes['spellcheck']);
+        expect(doc.attributes['spellcheck'], 'false');
       });
     });
 
     group('hidden', () {
       test('get', () {
         final doc = makeDocument();
-        Expect.isFalse(doc.hidden);
+        expect(doc.hidden, isFalse);
         doc.attributes['hidden'] = '';
-        Expect.isTrue(doc.hidden);
+        expect(doc.hidden, isTrue);
       });
 
       test('set', () {
         final doc = makeDocument();
         doc.hidden = true;
-        Expect.equals('', doc.attributes['hidden']);
+        expect(doc.attributes['hidden'], '');
         doc.hidden = false;
-        Expect.isFalse(doc.attributes.containsKey('hidden'));
+        expect(doc.attributes.containsKey('hidden'), isFalse);
       });
     });
 
     group('tabIndex', () {
       test('get', () {
         final doc = makeDocument();
-        Expect.equals(0, doc.tabIndex);
+        expect(doc.tabIndex, 0);
         doc.attributes['tabIndex'] = '2';
-        Expect.equals(2, doc.tabIndex);
+        expect(doc.tabIndex, 2);
         doc.attributes['tabIndex'] = 'foo';
-        Expect.equals(0, doc.tabIndex);
+        expect(doc.tabIndex, 0);
       });
 
       test('set', () {
         final doc = makeDocument();
         doc.tabIndex = 15;
-        Expect.equals('15', doc.attributes['tabIndex']);
+        expect(doc.attributes['tabIndex'], '15');
       });
     });
 
     group('id', () {
       test('get', () {
         final doc = makeDocument();
-        Expect.equals('', doc.id);
+        expect(doc.id, '');
         doc.attributes['id'] = 'foo';
-        Expect.equals('foo', doc.id);
+        expect(doc.id, 'foo');
       });
 
       test('set', () {
         final doc = makeDocument();
         doc.id = 'foo';
-        Expect.equals('foo', doc.attributes['id']);
+        expect(doc.attributes['id'], 'foo');
       });
     });
 
     group('title', () {
       test('get', () {
         final doc = makeDocument();
-        Expect.equals('', doc.title);
+        expect(doc.title, '');
         doc.attributes['title'] = 'foo';
-        Expect.equals('foo', doc.title);
+        expect(doc.title, 'foo');
       });
 
       test('set', () {
         final doc = makeDocument();
         doc.title = 'foo';
-        Expect.equals('foo', doc.attributes['title']);
+        expect(doc.attributes['title'], 'foo');
       });
     });
 
@@ -354,45 +355,45 @@
     // group('webkitdropzone', () {
     //   test('get', () {
     //     final doc = makeDocument();
-    //     Expect.equals('', doc.webkitdropzone);
+    //     expect(doc.webkitdropzone, '');
     //     doc.attributes['webkitdropzone'] = 'foo';
-    //     Expect.equals('foo', doc.webkitdropzone);
+    //     expect(doc.webkitdropzone, 'foo');
     //   });
     //
     //   test('set', () {
     //     final doc = makeDocument();
     //     doc.webkitdropzone = 'foo';
-    //     Expect.equals('foo', doc.attributes['webkitdropzone']);
+    //     expect(doc.attributes['webkitdropzone'], 'foo');
     //   });
     // });
 
     group('lang', () {
       test('get', () {
         final doc = makeDocument();
-        Expect.equals('', doc.lang);
+        expect(doc.lang, '');
         doc.attributes['lang'] = 'foo';
-        Expect.equals('foo', doc.lang);
+        expect(doc.lang, 'foo');
       });
 
       test('set', () {
         final doc = makeDocument();
         doc.lang = 'foo';
-        Expect.equals('foo', doc.attributes['lang']);
+        expect(doc.attributes['lang'], 'foo');
       });
     });
 
     group('dir', () {
       test('get', () {
         final doc = makeDocument();
-        Expect.equals('', doc.dir);
+        expect(doc.dir, '');
         doc.attributes['dir'] = 'foo';
-        Expect.equals('foo', doc.dir);
+        expect(doc.dir, 'foo');
       });
 
       test('set', () {
         final doc = makeDocument();
         doc.dir = 'foo';
-        Expect.equals('foo', doc.attributes['dir']);
+        expect(doc.attributes['dir'], 'foo');
       });
     });
   });
@@ -400,43 +401,43 @@
   test('set innerHTML', () {
     final doc = makeDocument();
     doc.innerHTML = "<foo>Bar<baz/></foo>";
-    Expect.equals(1, doc.nodes.length);
+    expect(doc.nodes.length, 1);
     final node = doc.nodes[0];
-    Expect.isTrue(node is XMLElement);
-    Expect.equals('foo', node.tagName);
-    Expect.equals('Bar', node.nodes[0].text);
-    Expect.equals('baz', node.nodes[1].tagName);
+    expect(node, isXMLElement);
+    expect(node.tagName, 'foo');
+    expect(node.nodes[0].text, 'Bar');
+    expect(node.nodes[1].tagName, 'baz');
   });
 
   test('get innerHTML/outerHTML', () {
     final doc = makeDocument();
-    Expect.equals("<foo></foo><bar></bar>", doc.innerHTML);
+    expect(doc.innerHTML, "<foo></foo><bar></bar>");
     doc.nodes.clear();
     doc.nodes.addAll([new Text("foo"), new XMLElement.xml("<a>bar</a>")]);
-    Expect.equals("foo<a>bar</a>", doc.innerHTML);
-    Expect.equals("<xml>foo<a>bar</a></xml>", doc.outerHTML);
+    expect(doc.innertHTML, "foo<a>bar</a>");
+    expect(doc.outerHTML, "<xml>foo<a>bar</a></xml>");
   });
 
   test('query', () {
     final doc = makeDocument();
-    Expect.equals("foo", doc.query('foo').tagName);
-    Expect.isNull(doc.query('baz'));
+    expect(doc.query('foo').tagName, 'foo');
+    expect(doc.query('baz'), isNull);
   });
 
   test('queryAll', () {
     final doc = new XMLDocument.xml(
         "<xml><foo id='f1' /><bar><foo id='f2' /></bar></xml>");
-    Expect.listEquals(["f1", "f2"], doc.queryAll('foo').map((e) => e.id));
-    Expect.listEquals([], doc.queryAll('baz'));
+    expect(doc.queryAll('foo').map((e) => e.id), ['f1', 'f2']);
+    expect(doc.queryAll('baz'), []);
   });
 
   // TODO(nweiz): re-enable this when matchesSelector works cross-browser.
   //
   // test('matchesSelector', () {
   //   final doc = makeDocument();
-  //   Expect.isTrue(doc.matchesSelector('*'));
-  //   Expect.isTrue(doc.matchesSelector('xml'));
-  //   Expect.isFalse(doc.matchesSelector('html'));
+  //   expect(doc.matchesSelector('*'), isTrue);
+  //   expect(doc.matchesSelector('xml'), isTrue);
+  //   expect(doc.matchesSelector('html'), isFalse);
   // });
 
   group('insertAdjacentElement', () {
@@ -444,30 +445,30 @@
 
     test('beforeBegin does nothing', () {
       final doc = getDoc();
-      Expect.isNull(
-        doc.insertAdjacentElement("beforeBegin", new XMLElement.tag("b")));
-      Expect.equals("<a>foo</a>", doc.innerHTML);
+      expect(doc.insertAdjacentElement("beforeBegin", new XMLElement.tag("b")),
+          isNull);
+      expect(doc.innerHTML, "<a>foo</a>");
     });
 
     test('afterEnd does nothing', () {
       final doc = getDoc();
-      Expect.isNull(
-        doc.insertAdjacentElement("afterEnd", new XMLElement.tag("b")));
-      Expect.equals("<a>foo</a>", doc.innerHTML);
+      expect(doc.insertAdjacentElement("afterEnd", new XMLElement.tag("b")),
+          isNull);
+      expect(doc.innerHTML, "<a>foo</a>");
     });
 
     test('afterBegin inserts the element', () {
       final doc = getDoc();
       final el = new XMLElement.tag("b");
-      Expect.equals(el, doc.insertAdjacentElement("afterBegin", el));
-      Expect.equals("<b></b><a>foo</a>", doc.innerHTML);
+      expect(doc.insertAdjacentElement("afterBegin", el), el);
+      expect(doc.innerHTML, "<b></b><a>foo</a>");
     });
 
     test('beforeEnd inserts the element', () {
       final doc = getDoc();
       final el = new XMLElement.tag("b");
-      Expect.equals(el, doc.insertAdjacentElement("beforeEnd", el));
-      Expect.equals("<a>foo</a><b></b>", doc.innerHTML);
+      expect(doc.insertAdjacentElement("beforeEnd", el), el);
+      expect(doc.innerHTML, "<a>foo</a><b></b>");
     });
   });
 
@@ -477,25 +478,25 @@
     test('beforeBegin does nothing', () {
       final doc = getDoc();
       doc.insertAdjacentText("beforeBegin", "foo");
-      Expect.equals("<a>foo</a>", doc.innerHTML);
+      expect(doc.innerHTML, "<a>foo</a>");
     });
 
     test('afterEnd does nothing', () {
       final doc = getDoc();
       doc.insertAdjacentText("afterEnd", "foo");
-      Expect.equals("<a>foo</a>", doc.innerHTML);
+      expect(doc.innerHTML, "<a>foo</a>");
     });
 
     test('afterBegin inserts the text', () {
       final doc = getDoc();
       doc.insertAdjacentText("afterBegin", "foo");
-      Expect.equals("foo<a>foo</a>", doc.innerHTML);
+      expect(doc.innerHTML, "foo<a>foo</a>");
     });
 
     test('beforeEnd inserts the text', () {
       final doc = getDoc();
       doc.insertAdjacentText("beforeEnd", "foo");
-      Expect.equals("<a>foo</a>foo", doc.innerHTML);
+      expect(doc.innerHTML, "<a>foo</a>foo");
     });
   });
 
@@ -505,25 +506,25 @@
     test('beforeBegin does nothing', () {
       final doc = getDoc();
       doc.insertAdjacentHTML("beforeBegin", "foo<b/>");
-      Expect.equals("<a>foo</a>", doc.innerHTML);
+      expect(doc.innerHTML, "<a>foo</a>");
     });
 
     test('afterEnd does nothing', () {
       final doc = getDoc();
       doc.insertAdjacentHTML("afterEnd", "<b/>foo");
-      Expect.equals("<a>foo</a>", doc.innerHTML);
+      expect(doc.innerHTML, "<a>foo</a>");
     });
 
     test('afterBegin inserts the HTML', () {
       final doc = getDoc();
       doc.insertAdjacentHTML("afterBegin", "foo<b/>");
-      Expect.equals("foo<b></b><a>foo</a>", doc.innerHTML);
+      expect(doc.innerHTML, "foo<b></b><a>foo</a>");
     });
 
     test('beforeEnd inserts the HTML', () {
       final doc = getDoc();
       doc.insertAdjacentHTML("beforeEnd", "<b/>foo");
-      Expect.equals("<a>foo</a><b></b>foo", doc.innerHTML);
+      expect(doc.innerHTML, "<a>foo</a><b></b>foo");
     });
   });
 
@@ -534,37 +535,36 @@
         expectEmptyRect(rect.offset);
         expectEmptyRect(rect.scroll);
         expectEmptyRect(rect.bounding);
-        Expect.isTrue(rect.clientRects.isEmpty);
+        expect(rect.clientRects.isEmpty, isTrue);
       }));
     });
 
     test('nextElementSibling', () =>
-        Expect.isNull(makeDocument().nextElementSibling));
+        expect(makeDocument().nextElementSibling), isNull);
     test('previousElementSibling', () =>
-        Expect.isNull(makeDocument().previousElementSibling));
-    test('parent', () => Expect.isNull(makeDocument().parent));
-    test('offsetParent', () => Expect.isNull(makeDocument().offsetParent));
-    test('activeElement', () => Expect.isNull(makeDocument().activeElement));
-    test('body', () => Expect.isNull(makeDocument().body));
-    test('window', () => Expect.isNull(makeDocument().window));
-    test('domain', () => Expect.equals('', makeDocument().domain));
-    test('head', () => Expect.isNull(makeDocument().head));
-    test('referrer', () => Expect.equals('', makeDocument().referrer));
-    test('styleSheets', () =>
-        Expect.listEquals([], makeDocument().styleSheets));
-    test('title', () => Expect.equals('', makeDocument().title));
+        expect(makeDocument().previousElementSibling), isNull);
+    test('parent', () => expect(makeDocument().parent), isNull);
+    test('offsetParent', () => expect(makeDocument().offsetParent), isNull);
+    test('activeElement', () => expect(makeDocument().activeElement), isNull);
+    test('body', () => expect(makeDocument().body), isNull);
+    test('window', () => expect(makeDocument().window), isNull);
+    test('domain', () => expect(makeDocument().domain), '');
+    test('head', () => expect(makeDocument().head), isNull);
+    test('referrer', () => expect(makeDocument().referrer), '');
+    test('styleSheets', () => expect(makeDocument().styleSheets), []);
+    test('title', () => expect(makeDocument().title), '');
 
     // TODO(nweiz): IE sets the charset to "windows-1252". How do we want to
     // handle that?
     //
-    // test('charset', () => Expect.isNull(makeDocument().charset));
+    // test('charset', () => expect(makeDocument().charset), isNull);
 
     // TODO(nweiz): re-enable these when the WebKit-specificness won't break
     // non-WebKit browsers.
     //
-    // test('webkitHidden', () => Expect.isFalse(makeDocument().webkitHidden));
+    // test('webkitHidden', () => expect(makeDocument().webkitHidden), isFalse);
     // test('webkitVisibilityState', () =>
-    //     Expect.equals('visible', makeDocument().webkitVisibilityState));
+    //     expect(makeDocument().webkitVisibilityState), 'visible');
 
     test('caretRangeFromPoint', () {
       final doc = makeDocument();
@@ -573,7 +573,7 @@
         doc.caretRangeFromPoint(0, 0),
         doc.caretRangeFromPoint(5, 5)
       ]).then(expectAsync1((ranges) {
-        Expect.listEquals([null, null, null], ranges);
+        expect(ranges, [null, null, null]);
       }));
     });
 
@@ -584,31 +584,31 @@
         doc.elementFromPoint(0, 0),
         doc.elementFromPoint(5, 5)
       ]).then(expectAsync1((ranges) {
-        Expect.listEquals([null, null, null], ranges);
+        expect(ranges, [null, null, null]);
       }));
     });
 
     test('queryCommandEnabled', () {
-      Expect.isFalse(makeDocument().queryCommandEnabled('foo'));
-      Expect.isFalse(makeDocument().queryCommandEnabled('bold'));
+      expect(makeDocument().queryCommandEnabled('foo'), isFalse);
+      expect(makeDocument().queryCommandEnabled('bold'), isFalse);
     });
 
     test('queryCommandIndeterm', () {
-      Expect.isFalse(makeDocument().queryCommandIndeterm('foo'));
-      Expect.isFalse(makeDocument().queryCommandIndeterm('bold'));
+      expect(makeDocument().queryCommandIndeterm('foo'), isFalse);
+      expect(makeDocument().queryCommandIndeterm('bold'), isFalse);
     });
 
     test('queryCommandState', () {
-      Expect.isFalse(makeDocument().queryCommandState('foo'));
-      Expect.isFalse(makeDocument().queryCommandState('bold'));
+      expect(makeDocument().queryCommandState('foo'), isFalse);
+      expect(makeDocument().queryCommandState('bold'), isFalse);
     });
 
     test('queryCommandSupported', () {
-      Expect.isFalse(makeDocument().queryCommandSupported('foo'));
-      Expect.isFalse(makeDocument().queryCommandSupported('bold'));
+      expect(makeDocument().queryCommandSupported('foo'), isFalse);
+      expect(makeDocument().queryCommandSupported('bold'), isFalse);
     });
 
-    test('manifest', () => Expect.equals('', makeDocument().manifest));
+    test('manifest', () => expect(makeDocument().manifest), '');
   });
 
   test('unsupported operations', () {
diff --git a/tests/html/xmlelement_test.dart b/tests/html/xmlelement_test.dart
index 1518673..b134a69 100644
--- a/tests/html/xmlelement_test.dart
+++ b/tests/html/xmlelement_test.dart
@@ -10,6 +10,8 @@
 main() {
   useHtmlConfiguration();
 
+  var isXMLElement = predicate((x) => x is XMLElement, 'is an XMLElement');
+
   XMLElement makeElement() => new XMLElement.xml("<xml><foo/><bar/></xml>");
 
   makeElementWithParent() {
@@ -22,34 +24,32 @@
     group('.xml', () {
       test('with a well-formed document', () {
         final el = makeElement();
-        Expect.isTrue(el is XMLElement);
-        Expect.equals('foo', el.elements[0].tagName);
-        Expect.equals('bar', el.elements[1].tagName);
+        expect(el, isXMLElement);
+        expect(el.elements[0].tagName, 'foo');
+        expect(el.elements[1].tagName, 'bar');
       });
 
       test('with too many nodes', () {
-        Expect.throws(() => new XMLElement.xml("<xml></xml>foo"),
-            (e) => e is ArgumentError);
+        expect(() => new XMLElement.xml("<xml></xml>foo"), throwsArgumentError);
       });
 
       test('with a parse error', () {
-        Expect.throws(() => new XMLElement.xml("<xml></xml>>"),
-            (e) => e is ArgumentError);
+        expect(() => new XMLElement.xml("<xml></xml>>"), throwsArgumentError);
       });
 
       test('with a PARSERERROR tag', () {
         final el = new XMLElement.xml("<xml><parsererror /></xml>");
-        Expect.equals('parsererror', el.elements[0].tagName);
+        expect('parsererror', el.elements[0].tagName, 'parsererror');
       });
 
       test('has no parent', () =>
-          Expect.isNull(new XMLElement.xml('<foo/>').parent));
+          expect(new XMLElement.xml('<foo/>').parent), isNull);
     });
 
     test('.tag', () {
       final el = new XMLElement.tag('foo');
-      Expect.isTrue(el is XMLElement);
-      Expect.equals('foo', el.tagName);
+      expect(el, isXMLElement);
+      expect(el.tagName, 'foo');
     });
   });
 
@@ -57,13 +57,13 @@
   group('elements', () {
     test('filters out non-element nodes', () {
       final el = new XMLElement.xml("<xml>1<a/><b/>2<c/>3<d/></xml>");
-      Expect.listEquals(["a", "b", "c", "d"], el.elements.map((e) => e.tagName));
+      expect(el.elements.map((e) => e.tagName), ["a", "b", "c", "d"]);
     });
 
     test('overwrites nodes when set', () {
       final el = new XMLElement.xml("<xml>1<a/><b/>2<c/>3<d/></xml>");
       el.elements = [new XMLElement.tag('x'), new XMLElement.tag('y')];
-      Expect.equals("<xml><x></x><y></y></xml>", el.outerHTML);
+      expect(el.outerHTML, "<xml><x></x><y></y></xml>");
     });
   });
 
@@ -76,33 +76,34 @@
     test('affects the "class" attribute', () {
       final el = makeElementWithClasses();
       el.classes.add('qux');
-      Expect.setEquals(['foo', 'bar', 'baz', 'qux'],
-          el.attributes['class'].split(' '));
+      expect(el.attributes['class'].split(' '),
+          unorderedEquals(['foo', 'bar', 'baz', 'qux']));
     });
 
     test('is affected by the "class" attribute', () {
       final el = makeElementWithClasses();
       el.attributes['class'] = 'foo qux';
-      Expect.setEquals(['foo', 'qux'], el.classes);
+      expect(el.classes, unorderedEquals(['foo', 'qux']));
     });
 
     test('classes=', () {
       final el = makeElementWithClasses();
       el.classes = ['foo', 'qux'];
-      Expect.setEquals(['foo', 'qux'], el.classes);
-      Expect.setEquals(['foo', 'qux'], el.attributes['class'].split(' '));
+      expect(el.classes, unorderedEquals(['foo', 'qux']));
+      expect(el.attributes['class'].split(' '),
+          unorderedEquals(['foo', 'qux']));
     });
 
     test('toString', () {
-      Expect.setEquals(['foo', 'bar', 'baz'],
-          makeClassSet().toString().split(' '));
-      Expect.equals('', makeElement().classes.toString());
+      expect(makeClassSet().toString().split(' '),
+          unorderedEquals(['foo', 'bar', 'baz']));
+      expect(makeElement().classes.toString(), '');
     });
 
     test('forEach', () {
       final classes = <String>[];
       makeClassSet().forEach(classes.add);
-      Expect.setEquals(['foo', 'bar', 'baz'], classes);
+      expect(classes, unorderedEquals(['foo', 'bar', 'baz']));
     });
 
     test('iterator', () {
@@ -110,101 +111,99 @@
       for (var el in makeClassSet()) {
         classes.add(el);
       }
-      Expect.setEquals(['foo', 'bar', 'baz'], classes);
+      expect(classes, unorderedEquals(['foo', 'bar', 'baz']));
     });
 
     test('map', () {
-      Expect.setEquals(['FOO', 'BAR', 'BAZ'],
-          makeClassSet().map((c) => c.toUpperCase()));
+      expect(makeClassSet().map((c) => c.toUpperCase()),
+          unorderedEquals(['FOO', 'BAR', 'BAZ']));
     });
 
     test('filter', () {
-      Expect.setEquals(['bar', 'baz'],
-          makeClassSet().filter((c) => c.contains('a')));
+      expect(makeClassSet().filter((c) => c.contains('a')),
+          unorderedEquals(['bar', 'baz']));
     });
 
     test('every', () {
-      Expect.isTrue(makeClassSet().every((c) => c is String));
-      Expect.isFalse(
-          makeClassSet().every((c) => c.contains('a')));
+      expect(makeClassSet().every((c) => c is String), isTrue);
+      expect(makeClassSet().every((c) => c.contains('a')), isFalse);
     });
 
     test('some', () {
-      Expect.isTrue(
-          makeClassSet().some((c) => c.contains('a')));
-      Expect.isFalse(makeClassSet().some((c) => c is num));
+      expect(makeClassSet().some((c) => c.contains('a')), isTrue);
+      expect(makeClassSet().some((c) => c is num), isFalse);
     });
 
     test('isEmpty', () {
-      Expect.isFalse(makeClassSet().isEmpty);
-      Expect.isTrue(makeElement().classes.isEmpty);
+      expect(makeClassSet().isEmpty, isFalse);
+      expect(makeElement().classes.isEmpty, isTrue);
     });
 
     test('length', () {
-      Expect.equals(3, makeClassSet().length);
-      Expect.equals(0, makeElement().classes.length);
+      expect(makeClassSet().length, 3);
+      expect(makeElement().classes.length, 0);
     });
 
     test('contains', () {
-      Expect.isTrue(makeClassSet().contains('foo'));
-      Expect.isFalse(makeClassSet().contains('qux'));
+      expect(makeClassSet().contains('foo'), isTrue);
+      expect(makeClassSet().contains('qux'), isFalse);
     });
 
     test('add', () {
       final classes = makeClassSet();
       classes.add('qux');
-      Expect.setEquals(['foo', 'bar', 'baz', 'qux'], classes);
+      expect(classes, unorderedEquals(['foo', 'bar', 'baz', 'qux']));
 
       classes.add('qux');
       final list = new List.from(classes);
       list.sort((a, b) => a.compareTo(b));
-      Expect.listEquals(['bar', 'baz', 'foo', 'qux'], list,
-          "The class set shouldn't have duplicate elements.");
+      expect(list, ['bar', 'baz', 'foo', 'qux'],
+          reason: "The class set shouldn't have duplicate elements.");
     });
 
     test('remove', () {
       final classes = makeClassSet();
       classes.remove('bar');
-      Expect.setEquals(['foo', 'baz'], classes);
+      expect(classes, unorderedEquals(['foo', 'baz']));
       classes.remove('qux');
-      Expect.setEquals(['foo', 'baz'], classes);
+      expect(classes, unorderedEquals(['foo', 'baz']));
     });
 
     test('addAll', () {
       final classes = makeClassSet();
       classes.addAll(['bar', 'qux', 'bip']);
-      Expect.setEquals(['foo', 'bar', 'baz', 'qux', 'bip'], classes);
+      expect(classes, unorderedEquals(['foo', 'bar', 'baz', 'qux', 'bip']));
     });
 
     test('removeAll', () {
       final classes = makeClassSet();
       classes.removeAll(['bar', 'baz', 'qux']);
-      Expect.setEquals(['foo'], classes);
+      expect(classes, ['foo']);
     });
 
     test('isSubsetOf', () {
       final classes = makeClassSet();
-      Expect.isTrue(classes.isSubsetOf(['foo', 'bar', 'baz']));
-      Expect.isTrue(classes.isSubsetOf(['foo', 'bar', 'baz', 'qux']));
-      Expect.isFalse(classes.isSubsetOf(['foo', 'bar', 'qux']));
+      expect(classes.isSubsetOf(['foo', 'bar', 'baz']), isTrue);
+      expect(classes.isSubsetOf(['foo', 'bar', 'baz', 'qux']), isTrue);
+      expect(classes.isSubsetOf(['foo', 'bar', 'qux']), isFalse);
     });
 
     test('containsAll', () {
       final classes = makeClassSet();
-      Expect.isTrue(classes.containsAll(['foo', 'baz']));
-      Expect.isFalse(classes.containsAll(['foo', 'qux']));
+      expect(classes.containsAll(['foo', 'baz']), isTrue);
+      expect(classes.containsAll(['foo', 'qux']), isFalse);
     });
 
     test('intersection', () {
       final classes = makeClassSet();
-      Expect.setEquals(['foo', 'baz'],
-          classes.intersection(['foo', 'qux', 'baz']));
+      expect(classes.intersection(['foo', 'qux', 'baz']),
+          unorderedEquals(['foo', 'baz']));
     });
 
     test('clear', () {
       final classes = makeClassSet();
       classes.clear();
-      Expect.setEquals([], classes);
+      expect(classes, []);
     });
   });
 
@@ -222,169 +221,169 @@
     group('contentEditable', () {
       test('get', () {
         final el = makeElement();
-        Expect.equals('inherit', el.contentEditable);
+        expect(el.contentEditable, 'inherit');
         el.attributes['contentEditable'] = 'foo';
-        Expect.equals('foo', el.contentEditable);
+        expect(el.contentEditable, 'foo');
       });
 
       test('set', () {
         final el = makeElement();
         el.contentEditable = 'foo';
-        Expect.equals('foo', el.attributes['contentEditable']);
+        expect(el.attributes['contentEditable'], 'foo');
       });
 
       test('isContentEditable', () {
         final el = makeElement();
-        Expect.isFalse(el.isContentEditable);
+        expect(el.isContentEditable, isFalse);
         el.contentEditable = 'true';
-        Expect.isFalse(el.isContentEditable);
+        expect(el.isContentEditable, isFalse);
       });
     });
 
     group('draggable', () {
       test('get', () {
         final el = makeElement();
-        Expect.isFalse(el.draggable);
+        expect(el.draggable, isFalse);
         el.attributes['draggable'] = 'true';
-        Expect.isTrue(el.draggable);
+        expect(el.draggable, isTrue);
         el.attributes['draggable'] = 'foo';
-        Expect.isFalse(el.draggable);
+        expect(el.draggable, isFalse);
       });
 
       test('set', () {
         final el = makeElement();
         el.draggable = true;
-        Expect.equals('true', el.attributes['draggable']);
+        expect(el.attributes['draggable'], 'true');
         el.draggable = false;
-        Expect.equals('false', el.attributes['draggable']);
+        expect(el.attributes['draggable'], 'false');
       });
     });
 
     group('spellcheck', () {
       test('get', () {
         final el = makeElement();
-        Expect.isFalse(el.spellcheck);
+        expect(el.spellcheck, isFalse);
         el.attributes['spellcheck'] = 'true';
-        Expect.isTrue(el.spellcheck);
+        expect(el.spellcheck, isTrue);
         el.attributes['spellcheck'] = 'foo';
-        Expect.isFalse(el.spellcheck);
+        expect(el.spellcheck, isFalse);
       });
 
       test('set', () {
         final el = makeElement();
         el.spellcheck = true;
-        Expect.equals('true', el.attributes['spellcheck']);
+        expect(el.attributes['spellcheck'], 'true');
         el.spellcheck = false;
-        Expect.equals('false', el.attributes['spellcheck']);
+        expect(el.attributes['spellcheck'], 'false');
       });
     });
 
     group('hidden', () {
       test('get', () {
         final el = makeElement();
-        Expect.isFalse(el.hidden);
+        expect(el.hidden, isFalse);
         el.attributes['hidden'] = '';
-        Expect.isTrue(el.hidden);
+        expect(el.hidden, isTrue);
       });
 
       test('set', () {
         final el = makeElement();
         el.hidden = true;
-        Expect.equals('', el.attributes['hidden']);
+        expect(el.attributes['hidden'], '');
         el.hidden = false;
-        Expect.isFalse(el.attributes.containsKey('hidden'));
+        expect(el.attributes.containsKey('hidden'), isFalse);
       });
     });
 
     group('tabIndex', () {
       test('get', () {
         final el = makeElement();
-        Expect.equals(0, el.tabIndex);
+        expect(el.tabIndex, 0);
         el.attributes['tabIndex'] = '2';
-        Expect.equals(2, el.tabIndex);
+        expect(el.tabIndex, 2);
         el.attributes['tabIndex'] = 'foo';
-        Expect.equals(0, el.tabIndex);
+        expect(el.tabIndex, 0);
       });
 
       test('set', () {
         final el = makeElement();
         el.tabIndex = 15;
-        Expect.equals('15', el.attributes['tabIndex']);
+        expect(el.attributes['tabIndex'], '15');
       });
     });
 
     group('id', () {
       test('get', () {
         final el = makeElement();
-        Expect.equals('', el.id);
+        expect(el.id, '');
         el.attributes['id'] = 'foo';
-        Expect.equals('foo', el.id);
+        expect(el.id, 'foo');
       });
 
       test('set', () {
         final el = makeElement();
         el.id = 'foo';
-        Expect.equals('foo', el.attributes['id']);
+        expect(el.attributes['id'], 'foo');
       });
     });
 
     group('title', () {
       test('get', () {
         final el = makeElement();
-        Expect.equals('', el.title);
+        expect(el.title, '');
         el.attributes['title'] = 'foo';
-        Expect.equals('foo', el.title);
+        expect(el.title, 'foo');
       });
 
       test('set', () {
         final el = makeElement();
         el.title = 'foo';
-        Expect.equals('foo', el.attributes['title']);
+        expect(el.attributes['title'], 'foo');
       });
     });
 
     group('webkitdropzone', () {
       test('get', () {
         final el = makeElement();
-        Expect.equals('', el.webkitdropzone);
+        expect(el.webkitdropzone, '');
         el.attributes['webkitdropzone'] = 'foo';
-        Expect.equals('foo', el.webkitdropzone);
+        expect(el.webkitdropzone, 'foo');
       });
 
       test('set', () {
         final el = makeElement();
         el.webkitdropzone = 'foo';
-        Expect.equals('foo', el.attributes['webkitdropzone']);
+        expect(el.attributes['webkitdropzone'], 'foo');
       });
     });
 
     group('lang', () {
       test('get', () {
         final el = makeElement();
-        Expect.equals('', el.lang);
+        expect(el.lang, '');
         el.attributes['lang'] = 'foo';
-        Expect.equals('foo', el.lang);
+        expect(el.lang, 'foo');
       });
 
       test('set', () {
         final el = makeElement();
         el.lang = 'foo';
-        Expect.equals('foo', el.attributes['lang']);
+        expect(el.attributes['lang'], 'foo');
       });
     });
 
     group('dir', () {
       test('get', () {
         final el = makeElement();
-        Expect.equals('', el.dir);
+        expect(el.dir, '');
         el.attributes['dir'] = 'foo';
-        Expect.equals('foo', el.dir);
+        expect(el.dir, 'foo');
       });
 
       test('set', () {
         final el = makeElement();
         el.dir = 'foo';
-        Expect.equals('foo', el.attributes['dir']);
+        expect(el.attributes['dir'], 'foo');
       });
     });
   });
@@ -392,90 +391,92 @@
   test('set innerHTML', () {
     final el = makeElement();
     el.innerHTML = "<foo>Bar<baz/></foo>";
-    Expect.equals(1, el.nodes.length);
+    expect(el.nodes.length, 1);
     final node = el.nodes[0];
-    Expect.isTrue(node is XMLElement);
-    Expect.equals('foo', node.tagName);
-    Expect.equals('Bar', node.nodes[0].text);
-    Expect.equals('baz', node.nodes[1].tagName);
+    expect(node, isXMLElement);
+    expect(node.tagName, 'foo');
+    expect(node.nodes[0].text, 'Bar');
+    expect(node.nodes[1].tagName, 'baz');
   });
 
   test('get innerHTML/outerHTML', () {
     final el = makeElement();
-    Expect.equals("<foo></foo><bar></bar>", el.innerHTML);
+    expect(el.innerHTML, "<foo></foo><bar></bar>");
     el.nodes.clear();
     el.nodes.addAll([new Text("foo"), new XMLElement.xml("<a>bar</a>")]);
-    Expect.equals("foo<a>bar</a>", el.innerHTML);
-    Expect.equals("<xml>foo<a>bar</a></xml>", el.outerHTML);
+    expect(el.innerHTML, "foo<a>bar</a>");
+    expect(el.outerHTML, "<xml>foo<a>bar</a></xml>");
   });
 
   test('query', () {
     final el = makeElement();
-    Expect.equals("foo", el.query('foo').tagName);
-    Expect.isNull(el.query('baz'));
+    expect(el.query('foo').tagName, 'foo');
+    expect(el.query('baz'), isNull);
   });
 
   test('queryAll', () {
     final el = new XMLElement.xml(
         "<xml><foo id='f1' /><bar><foo id='f2' /></bar></xml>");
-    Expect.listEquals(["f1", "f2"], el.queryAll('foo').map((e) => e.id));
-    Expect.listEquals([], el.queryAll('baz'));
+    expect(el.queryAll('foo').map((e) => e.id), ['f1', 'f2']);
+    expect(el.queryAll('baz'), []);
   });
 
   // TODO(nweiz): re-enable this when matchesSelector works cross-browser.
   //
   // test('matchesSelector', () {
   //   final el = makeElement();
-  //   Expect.isTrue(el.matchesSelector('*'));
-  //   Expect.isTrue(el.matchesSelector('xml'));
-  //   Expect.isFalse(el.matchesSelector('html'));
+  //   expect(el.matchesSelector('*'), isTrue);
+  //   expect(el.matchesSelector('xml'), isTrue);
+  //   expect(el.matchesSelector('html'), isFalse);
   // });
 
   group('insertAdjacentElement', () {
     test('beforeBegin with no parent does nothing', () {
       final el = makeElement();
-      Expect.isNull(
-        el.insertAdjacentElement("beforeBegin", new XMLElement.tag("b")));
-      Expect.equals("<foo></foo><bar></bar>", el.innerHTML);
+      expect(el.insertAdjacentElement("beforeBegin", new XMLElement.tag("b")),
+          isNull);
+      expect(el.innerHTML, "<foo></foo><bar></bar>");
     });
 
     test('afterEnd with no parent does nothing', () {
       final el = makeElement();
-      Expect.isNull(
-        el.insertAdjacentElement("afterEnd", new XMLElement.tag("b")));
-      Expect.equals("<foo></foo><bar></bar>", el.innerHTML);
+      expect(
+        el.insertAdjacentElement("afterEnd", new XMLElement.tag("b")), isNull);
+      expect(el.innerHTML, "<foo></foo><bar></bar>");
     });
 
     test('beforeBegin with parent inserts the element', () {
       final el = makeElementWithParent();
       final newEl = new XMLElement.tag("b");
-      Expect.equals(newEl, el.insertAdjacentElement("beforeBegin", newEl));
-      Expect.equals("<foo></foo><bar></bar>", el.innerHTML);
-      Expect.equals("<before></before><b></b><xml><foo></foo><bar></bar>" +
-          "</xml><after></after>", el.parent.innerHTML);
+      expect(el.insertAdjacentElement("beforeBegin", newEl), newEl);
+      expect(el.innerHTML, "<foo></foo><bar></bar>");
+      expect(el.parent.innerHTML, 
+          "<before></before><b></b><xml><foo></foo><bar></bar>"
+          "</xml><after></after>");
     });
 
     test('afterEnd with parent inserts the element', () {
       final el = makeElementWithParent();
       final newEl = new XMLElement.tag("b");
-      Expect.equals(newEl, el.insertAdjacentElement("afterEnd", newEl));
-      Expect.equals("<foo></foo><bar></bar>", el.innerHTML);
-      Expect.equals("<before></before><xml><foo></foo><bar></bar></xml><b>" +
-          "</b><after></after>", el.parent.innerHTML);
+      expect(el.insertAdjacentElement("afterEnd", newEl), newEl);
+      expect(el.innerHTML, "<foo></foo><bar></bar>");
+      expect(el.parent.innerHTML, 
+          "<before></before><xml><foo></foo><bar></bar></xml><b>"
+          "</b><after></after>");
     });
 
     test('afterBegin inserts the element', () {
       final el = makeElement();
       final newEl = new XMLElement.tag("b");
-      Expect.equals(newEl, el.insertAdjacentElement("afterBegin", newEl));
-      Expect.equals("<b></b><foo></foo><bar></bar>", el.innerHTML);
+      expect(el.insertAdjacentElement("afterBegin", newEl), newEl);
+      expect(el.innerHTML, "<b></b><foo></foo><bar></bar>");
     });
 
     test('beforeEnd inserts the element', () {
       final el = makeElement();
       final newEl = new XMLElement.tag("b");
-      Expect.equals(newEl, el.insertAdjacentElement("beforeEnd", newEl));
-      Expect.equals("<foo></foo><bar></bar><b></b>", el.innerHTML);
+      expect(el.insertAdjacentElement("beforeEnd", newEl), newEl);
+      expect(el.innerHTML, "<foo></foo><bar></bar><b></b>");
     });
   });
 
@@ -483,41 +484,43 @@
     test('beforeBegin with no parent does nothing', () {
       final el = makeElement();
       el.insertAdjacentText("beforeBegin", "foo");
-      Expect.equals("<foo></foo><bar></bar>", el.innerHTML);
+      expect(el.innerHTML, "<foo></foo><bar></bar>");
     });
 
     test('afterEnd with no parent does nothing', () {
       final el = makeElement();
       el.insertAdjacentText("afterEnd", "foo");
-      Expect.equals("<foo></foo><bar></bar>", el.innerHTML);
+      expect(el.innerHTML, "<foo></foo><bar></bar>");
     });
 
     test('beforeBegin with parent inserts the text', () {
       final el = makeElementWithParent();
       el.insertAdjacentText("beforeBegin", "foo");
-      Expect.equals("<foo></foo><bar></bar>", el.innerHTML);
-      Expect.equals("<before></before>foo<xml><foo></foo><bar></bar></xml>" +
-          "<after></after>", el.parent.innerHTML);
+      expect(el.innerHTML, "<foo></foo><bar></bar>");
+      expect(el.parent.innerHTML, 
+          "<before></before>foo<xml><foo></foo><bar></bar></xml>"
+          "<after></after>");
     });
 
     test('afterEnd with parent inserts the text', () {
       final el = makeElementWithParent();
       el.insertAdjacentText("afterEnd", "foo");
-      Expect.equals("<foo></foo><bar></bar>", el.innerHTML);
-      Expect.equals("<before></before><xml><foo></foo><bar></bar></xml>foo" +
-          "<after></after>", el.parent.innerHTML);
+      expect(el.innerHTML, "<foo></foo><bar></bar>");
+      expect(el.parent.innerHTML, 
+          "<before></before><xml><foo></foo><bar></bar></xml>foo"
+          "<after></after>");
     });
 
     test('afterBegin inserts the text', () {
       final el = makeElement();
       el.insertAdjacentText("afterBegin", "foo");
-      Expect.equals("foo<foo></foo><bar></bar>", el.innerHTML);
+      expect(el.innerHTML, "foo<foo></foo><bar></bar>");
     });
 
     test('beforeEnd inserts the text', () {
       final el = makeElement();
       el.insertAdjacentText("beforeEnd", "foo");
-      Expect.equals("<foo></foo><bar></bar>foo", el.innerHTML);
+      expect(el.innerHTML, "<foo></foo><bar></bar>foo");
     });
   });
 
@@ -525,41 +528,43 @@
     test('beforeBegin with no parent does nothing', () {
       final el = makeElement();
       el.insertAdjacentHTML("beforeBegin", "foo<b/>");
-      Expect.equals("<foo></foo><bar></bar>", el.innerHTML);
+      expect(el.innerHTML, "<foo></foo><bar></bar>");
     });
 
     test('afterEnd with no parent does nothing', () {
       final el = makeElement();
       el.insertAdjacentHTML("afterEnd", "<b/>foo");
-      Expect.equals("<foo></foo><bar></bar>", el.innerHTML);
+      expect(el.innerHTML, "<foo></foo><bar></bar>");
     });
 
     test('beforeBegin with parent inserts the HTML', () {
       final el = makeElementWithParent();
       el.insertAdjacentHTML("beforeBegin", "foo<b/>");
-      Expect.equals("<foo></foo><bar></bar>", el.innerHTML);
-      Expect.equals("<before></before>foo<b></b><xml><foo></foo><bar></bar>" +
-          "</xml><after></after>", el.parent.innerHTML);
+      expect(el.innerHTML, "<foo></foo><bar></bar>");
+      expect(el.parent.innerHTML,
+          "<before></before>foo<b></b><xml><foo></foo><bar></bar>"
+          "</xml><after></after>");
     });
 
     test('afterEnd with parent inserts the HTML', () {
       final el = makeElementWithParent();
       el.insertAdjacentHTML("afterEnd", "foo<b/>");
-      Expect.equals("<foo></foo><bar></bar>", el.innerHTML);
-      Expect.equals("<before></before><xml><foo></foo><bar></bar></xml>foo" +
-          "<b></b><after></after>", el.parent.innerHTML);
+      expect(el.innerHTML, "<foo></foo><bar></bar>");
+      expect(el.parent.innerHTML,
+          "<before></before><xml><foo></foo><bar></bar></xml>foo"
+          "<b></b><after></after>");
     });
 
     test('afterBegin inserts the HTML', () {
       final el = makeElement();
       el.insertAdjacentHTML("afterBegin", "foo<b/>");
-      Expect.equals("foo<b></b><foo></foo><bar></bar>", el.innerHTML);
+      expect(el.innerHTML, "foo<b></b><foo></foo><bar></bar>");
     });
 
     test('beforeEnd inserts the HTML', () {
       final el = makeElement();
       el.insertAdjacentHTML("beforeEnd", "<b/>foo");
-      Expect.equals("<foo></foo><bar></bar><b></b>foo", el.innerHTML);
+      expect(el.innerHTML, "<foo></foo><bar></bar><b></b>foo");
     });
   });
 
@@ -570,7 +575,7 @@
         expectEmptyRect(rect.offset);
         expectEmptyRect(rect.scroll);
         expectEmptyRect(rect.bounding);
-        Expect.isTrue(rect.clientRects.isEmpty);
+        expect(rect.clientRects.isEmpty, isTrue);
       }));
   });
 }
diff --git a/tests/html/xsltprocessor_test.dart b/tests/html/xsltprocessor_test.dart
index 7e70cf0..5216726 100644
--- a/tests/html/xsltprocessor_test.dart
+++ b/tests/html/xsltprocessor_test.dart
@@ -7,9 +7,12 @@
 
   useHtmlConfiguration();
 
+  var isXSLTProcessor =
+      predicate((x) => x is XSLTProcessor, 'is an XSLTProcessor');
+
   test('constructorTest', () {
       var processor = new XSLTProcessor();
-      Expect.isTrue(processor != null);
-      Expect.isTrue(processor is XSLTProcessor);
+      expect(processor, isNotNull);
+      expect(processor, isXSLTProcessor);
     });
 }
diff --git a/tests/isolate/isolate.status b/tests/isolate/isolate.status
index 0fdc16c..6e106f5 100644
--- a/tests/isolate/isolate.status
+++ b/tests/isolate/isolate.status
@@ -30,6 +30,10 @@
 spawn_uri_vm_negative_test: Fail, OK # Fails at runtime.
 unresolved_ports_negative_test: Fail, OK # Fails at runtime.
 
+# packages issue 6340
+compute_this_script_browser_test: Fail, OK
+
+
 [ $compiler == dart2js ]
 serialization_test: Fail # Tries to access class TestingOnly declared in isolate_patch.dart
 
diff --git a/tests/isolate/multiple_timer_test.dart b/tests/isolate/multiple_timer_test.dart
index d43e135..9071e88 100644
--- a/tests/isolate/multiple_timer_test.dart
+++ b/tests/isolate/multiple_timer_test.dart
@@ -23,29 +23,29 @@
 
     void timeoutHandler1(Timer timer) {
       int endTime = (new Date.now()).millisecondsSinceEpoch;
-      expect((endTime - _startTime1) >= TIMEOUT1);
-      expect(_order[_message] == 0);
+      expect(endTime - _startTime1, greaterThanOrEqualTo(TIMEOUT1));
+      expect(_order[_message], 0);
       _message++;
     }
 
     void timeoutHandler2(Timer timer) {
       int endTime  = (new Date.now()).millisecondsSinceEpoch;
-      expect((endTime - _startTime2) >= TIMEOUT2);
-      expect(_order[_message] == 1);
+      expect(endTime - _startTime2, greaterThanOrEqualTo(TIMEOUT2));
+      expect(_order[_message], 1);
       _message++;
     }
 
     void timeoutHandler3(Timer timer) {
       int endTime = (new Date.now()).millisecondsSinceEpoch;
-      expect((endTime - _startTime3) >= TIMEOUT3);
-      expect(_order[_message] == 2);
+      expect(endTime - _startTime3, greaterThanOrEqualTo(TIMEOUT3));
+      expect(_order[_message], 2);
       _message++;
     }
 
     void timeoutHandler4(Timer timer) {
       int endTime  = (new Date.now()).millisecondsSinceEpoch;
-      expect((endTime - _startTime4) >= TIMEOUT4);
-      expect(_order[_message] == 3);
+      expect(endTime - _startTime4, greaterThanOrEqualTo(TIMEOUT4));
+      expect(_order[_message], 3);
       _message++;
     }
 
diff --git a/tests/isolate/timer_cancel_test.dart b/tests/isolate/timer_cancel_test.dart
index 7e35062..ffb866d 100644
--- a/tests/isolate/timer_cancel_test.dart
+++ b/tests/isolate/timer_cancel_test.dart
@@ -23,7 +23,7 @@
     void repeatHandler(Timer timer) {
       repeatTimer++;
       timer.cancel();
-      expect(repeatTimer == 1);
+      expect(repeatTimer, 1);
     }
 
     cancelTimer = new Timer(1000, expectAsync1(unreachable, count: 0));
diff --git a/tests/isolate/timer_isolate_test.dart b/tests/isolate/timer_isolate_test.dart
index 63345ea..f98ffd2 100644
--- a/tests/isolate/timer_isolate_test.dart
+++ b/tests/isolate/timer_isolate_test.dart
@@ -25,7 +25,7 @@
     port.receive(expectAsync2((msg, _) {
       expect("timer_fired", msg);
       int endTime = (new Date.now()).millisecondsSinceEpoch;
-      expect((endTime - startTime) >= TIMEOUT);
+      expect(endTime - startTime, greaterThanOrEqualTo(TIMEOUT));
       port.close();
     }));
     
diff --git a/tests/isolate/timer_test.dart b/tests/isolate/timer_test.dart
index fd679d3..4a151e0 100644
--- a/tests/isolate/timer_test.dart
+++ b/tests/isolate/timer_test.dart
@@ -17,7 +17,7 @@
 
 void timeoutHandler(Timer timer) {
   int endTime = (new Date.now()).millisecondsSinceEpoch;
-  expect((endTime - startTime) >= timeout);
+  expect(endTime - startTime, greaterThanOrEqualTo(timeout));
   if (iteration < ITERATIONS) {
     iteration++;
     timeout = timeout - DECREASE;
diff --git a/tests/language/argument_definition3_test.dart b/tests/language/argument_definition3_test.dart
new file mode 100644
index 0000000..be74835
--- /dev/null
+++ b/tests/language/argument_definition3_test.dart
@@ -0,0 +1,76 @@
+// 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.
+
+main() {
+  new Param.test1(false);
+  new Param.test1(true, 42);
+
+  new Param.test2(false);
+  new Param.test2(true, 42);
+
+  new Param.test3(false);
+  new Param.test3(true, 42);
+
+  new Param.test4();
+  new Param.test5();
+
+  new Param.test6(false);
+  new Param.test6(true, 42);
+
+  new Param.test7();
+  new Param.test8();
+}
+
+class Super {
+  var superField;
+  var otherSuperField;
+
+  Super();
+  Super.withParameters(passed, op, value) {
+    Expect.equals(passed, op);
+    Expect.equals(passed ? 42 : 0, value);
+  }
+
+  Super.withOptional(passed, [int a]) : superField = ?a {
+    Expect.equals(passed, ?a);
+    Expect.equals(passed, superField);
+  }
+
+  Super.withUpdate(passed, [int a = 0])
+      : superField = ?a, otherSuperField = a++ {
+    Expect.equals(passed, ?a);
+    Expect.equals(passed, superField);
+    Expect.equals(passed ? 43 : 1, a);
+  }
+}
+
+class Param extends Super {
+  var field;
+  var otherField;
+
+  Param.test1(a_check, [int a]) {
+    Expect.equals(a_check, ?a);
+  }
+
+  Param.test2(passed, [int a]) : field = ?a {
+    Expect.equals(passed, ?a);
+    Expect.equals(passed, field);
+  }
+
+  Param.test3(passed, [int a = 0]) : super.withParameters(passed, ?a, a) {
+    Expect.equals(passed, ?a);
+  }
+
+  Param.test4() : super.withOptional(true, 42);
+  Param.test5() : super.withOptional(false);
+
+  Param.test6(passed, [int a = 0]) : field = ?a, otherField = a++ {
+    Expect.equals(passed, ?a);
+    Expect.equals(passed, field);
+    Expect.equals(passed ? 43 : 1, a);
+  }
+
+  Param.test7() : super.withUpdate(true, 42);
+  Param.test8() : super.withUpdate(false);
+}
diff --git a/tests/language/bad_named_parameters_test.dart b/tests/language/bad_named_parameters_test.dart
index 937cf05..99a82b8 100644
--- a/tests/language/bad_named_parameters_test.dart
+++ b/tests/language/bad_named_parameters_test.dart
@@ -6,11 +6,11 @@
 
 class BadNamedParametersTest {
 
-  int f42(int a, [int b = 20, int c = 30]) {
+  int f42(int a, {int b: 20, int c: 30}) {
     return 100*(100*a + b) + c;
   }
 
-  int f52(int a, [int b = 20, int c, int d = 40]) {
+  int f52(int a, {int b: 20, int c, int d: 40}) {
     return 100*(100*(100*a + b) + (c == null ? 0 : c)) + d;
   }
 
diff --git a/tests/language/call_nonexistent_static_test.dart b/tests/language/call_nonexistent_static_test.dart
index dca8536..f114be9 100644
--- a/tests/language/call_nonexistent_static_test.dart
+++ b/tests/language/call_nonexistent_static_test.dart
@@ -22,7 +22,7 @@
 }
 
 alwaysThrows() {
-  throw new NoSuchMethodError(null, 'foo', []);
+  throw new NoSuchMethodError(null, 'foo', [], {});
 }
 
 test01() {
diff --git a/tests/language/char_escape_test.dart b/tests/language/char_escape_test.dart
index 18a0f47..a890e4d 100644
--- a/tests/language/char_escape_test.dart
+++ b/tests/language/char_escape_test.dart
@@ -366,24 +366,24 @@
 
     var v10000 = "\u{10000}";
     var v010000 = "\u{010000}";
-    Expect.equals(1, v10000.length);
-    Expect.equals(1, v010000.length);
+    Expect.equals(2, v10000.length);
+    Expect.equals(2, v010000.length);
     Expect.equals("\u{10000}", new String.fromCharCodes([0x10000]));
     Expect.equals("\u{010000}", new String.fromCharCodes([0x10000]));
 
     var v1FFFF = "\u{1FFFF}";
     var v01FFFF = "\u{01FFFF}";
-    Expect.equals(1, v1FFFF.length);
-    Expect.equals(1, v01FFFF.length);
+    Expect.equals(2, v1FFFF.length);
+    Expect.equals(2, v01FFFF.length);
     Expect.equals("\u{1FFFF}", new String.fromCharCodes([0x1FFFF]));
     Expect.equals("\u{01FFFF}", new String.fromCharCodes([0x1FFFF]));
 
     var v105555 = "\u{105555}";
-    Expect.equals(1, v105555.length);
+    Expect.equals(2, v105555.length);
     Expect.equals("\u{105555}", new String.fromCharCodes([0x105555]));
 
     var v10FFFF = "\u{10FFFF}";
-    Expect.equals(1, v10FFFF.length);
+    Expect.equals(2, v10FFFF.length);
     Expect.equals("\u{10FFFF}", new String.fromCharCodes([0x10FFFF]));
 
     var bs = "\b";
diff --git a/tests/language/closure8_test.dart b/tests/language/closure8_test.dart
new file mode 100644
index 0000000..623679a
--- /dev/null
+++ b/tests/language/closure8_test.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+// Regression test for issue 6353.
+
+class A<E> {
+}
+
+class C<E> extends A<E> {
+  forEach(callback(E element)) {
+  }
+}
+
+class D<E> {
+  lala(E element) {
+  }
+}
+
+main() {
+  var c = new C<int>();
+  c.forEach(new D<int>().lala);
+}
+
diff --git a/tests/language/closure_in_initializer2_test.dart b/tests/language/closure_in_initializer2_test.dart
new file mode 100644
index 0000000..3c1e1bd
--- /dev/null
+++ b/tests/language/closure_in_initializer2_test.dart
@@ -0,0 +1,21 @@
+// 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.
+
+class S {
+  S() {
+    Expect.equals(2, this.f());
+  }
+}
+
+class A extends S {
+  var f;
+  A(a) : f = (() => ++a) {
+    Expect.equals(a, 2);
+  }
+}
+
+main() {
+  var a = new A(1);
+  Expect.equals(a.f(), 3);
+}
diff --git a/tests/language/closure_in_initializer_test.dart b/tests/language/closure_in_initializer_test.dart
new file mode 100644
index 0000000..607553c
--- /dev/null
+++ b/tests/language/closure_in_initializer_test.dart
@@ -0,0 +1,42 @@
+// 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.
+
+class A {
+  var f;
+  var g;
+  A(a) : f = (() => 42 + a), g = (() => ++a) {
+    a = 4;
+  }
+}
+
+class B extends A {
+  B() : super(42);
+}
+
+class C extends A {
+  var h;
+  C(a) : super(42), h = (() => ++a);
+}
+
+main() {
+  var a = new A(1);
+  Expect.equals(46, a.f());
+  Expect.equals(5, a.g());
+  Expect.equals(47, a.f());
+
+  a = new B();
+  Expect.equals(46, a.f());
+  Expect.equals(5, a.g());
+  Expect.equals(47, a.f());
+
+  a = new C(0);
+  Expect.equals(46, a.f());
+  Expect.equals(5, a.g());
+  Expect.equals(47, a.f());
+  Expect.equals(1, a.h());
+  Expect.equals(2, a.h());
+  Expect.equals(47, a.f());
+  Expect.equals(6, a.g());
+  Expect.equals(48, a.f());
+}
diff --git a/tests/language/constructor6_test.dart b/tests/language/constructor6_test.dart
index 39116c9..ff105e8 100644
--- a/tests/language/constructor6_test.dart
+++ b/tests/language/constructor6_test.dart
@@ -9,7 +9,7 @@
 String trace = "";
 
 int E(int i) {
-  trace += "$i-";
+  trace = "$trace$i-";
   return i;
 }
 
diff --git a/tests/language/constructor_redirect2_test.dart b/tests/language/constructor_redirect2_test.dart
new file mode 100644
index 0000000..e0ceb8d
--- /dev/null
+++ b/tests/language/constructor_redirect2_test.dart
@@ -0,0 +1,29 @@
+// 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.
+// Redirection constructors must not have a function body.
+
+class A {
+  var x;
+  A(this.x) {}
+
+  // Redirecting constructor must not have a function body.
+  A.illegalBody(x) : this(3) {}      /// 01: compile-time error
+
+  // Redirecting constructor must not initialize any fields.
+  A.illegalInit() : this(3), x = 5;  /// 02: compile-time error
+
+  // Redirecting constructor must not have initializing formal parameters.
+  A.illegalFormal(this.x) : this(3);  /// 03: compile-time error
+
+  // Redirection constructors must not call super constructor.
+  A.illegalSuper() : this(3), super(3);  /// 04: compile-time error
+}
+
+main() {
+  new A(3);
+  new A.illegalBody(10);         /// 01: continued
+  new A.illegalInit(10);         /// 02: continued
+  new A.illegalFormal(10);       /// 03: continued
+  new A.illegalSuper(10);        /// 04: continued
+}
diff --git a/tests/language/constructor_redirect3_negative_test.dart b/tests/language/constructor_redirect3_negative_test.dart
deleted file mode 100644
index 37d3109..0000000
--- a/tests/language/constructor_redirect3_negative_test.dart
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-// Redirection constructors must not initialize any fields.
-
-class A {
-  var x;
-  A(this.x) {}
-  A.named() : this(3), x = 5 {}
-}
-
-class ConstructorRedirect3NegativeTest {
-  static testMain() {
-    new A.named();
-  }
-}
-
-main() {
-  ConstructorRedirect3NegativeTest.testMain();
-}
diff --git a/tests/language/constructor_redirect4_negative_test.dart b/tests/language/constructor_redirect4_negative_test.dart
deleted file mode 100644
index f38229f..0000000
--- a/tests/language/constructor_redirect4_negative_test.dart
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-// Redirection constructors must not initialize any fields.
-
-class A {
-  var x;
-  A(this.x) {}
-  A.named(this.x) : this(3) {}
-}
-
-class ConstructorRedirect4NegativeTest {
-  static testMain() {
-    new A.named(10);
-  }
-}
-
-main() {
-  ConstructorRedirect4NegativeTest.testMain();
-}
diff --git a/tests/language/constructor_redirect5_negative_test.dart b/tests/language/constructor_redirect5_negative_test.dart
deleted file mode 100644
index 498be3b..0000000
--- a/tests/language/constructor_redirect5_negative_test.dart
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-// Redirection constructors must not call any super constructors.
-
-class A {
-  var x;
-  A(this.x) {}
-  A.named(x) : this(3), super() {}
-}
-
-class ConstructorRedirect5NegativeTest {
-  static testMain() {
-    new A.named(10);
-  }
-}
-
-main() {
-  ConstructorRedirect5NegativeTest.testMain();
-}
diff --git a/tests/language/final_variable_assignment_test.dart b/tests/language/final_variable_assignment_test.dart
new file mode 100644
index 0000000..f173747
--- /dev/null
+++ b/tests/language/final_variable_assignment_test.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test to make sure we catch assignments to final local variables.
+
+main() {
+  final x = 30;
+  x = 0;    /// 01: compile-time error
+  x += 1;   /// 02: compile-time error
+  ++x;      /// 03: compile-time error
+  x++;      /// 04: compile-time error
+}
diff --git a/tests/language/function_syntax_test.dart b/tests/language/function_syntax_test.dart
index dc8a58e..131802f 100644
--- a/tests/language/function_syntax_test.dart
+++ b/tests/language/function_syntax_test.dart
@@ -470,7 +470,6 @@
     expectEvaluatesTo(0, ()=> 4 % 2);
 
     // Negate.
-    expectEvaluatesTo(-3, ()=> ~2);
     expectEvaluatesTo(false, ()=> !true);
 
     // Postfix / prefix.
diff --git a/tests/language/import_core_impl_no_prefix_test.dart b/tests/language/import_collection_no_prefix_test.dart
similarity index 71%
rename from tests/language/import_core_impl_no_prefix_test.dart
rename to tests/language/import_collection_no_prefix_test.dart
index 434d606..6353284 100644
--- a/tests/language/import_core_impl_no_prefix_test.dart
+++ b/tests/language/import_collection_no_prefix_test.dart
@@ -4,10 +4,10 @@
 
 // Dart test program importing the core library explicitly.
 
-#library("ImportCoreImplNoPrefixTest.dart");
-#import("dart:coreimpl");
+#library("ImportCollectionNoPrefixTest.dart");
+#import("dart:collection");
 
 main() {
   var e = new SplayTreeMap();
-  print('"dart:coreimpl" imported, $e allocated');
+  print('"dart:collection" imported, $e allocated');
 }
diff --git a/tests/language/invocation_mirror_test.dart b/tests/language/invocation_mirror_test.dart
index 6bbb094..38e1277 100644
--- a/tests/language/invocation_mirror_test.dart
+++ b/tests/language/invocation_mirror_test.dart
@@ -6,7 +6,10 @@
 
 /** Class with noSuchMethod that returns the mirror */
 class N {
-  noSuchMethod(InvocationMirror m) => m;
+  // Storage for the last argument to noSuchMethod.
+  // Needed for setters, which don't evaluate to the return value.
+  var last;
+  noSuchMethod(InvocationMirror m) => last = m;
 
   get wut => this;
 
@@ -31,38 +34,40 @@
  */
 testInvocationMirror(InvocationMirror im, String name,
                      [List positional, Map named]) {
-  Expect.isTrue(im is InvocationMirror);
-  Expect.equals(name, im.methodName);
+  Expect.isTrue(im is InvocationMirror, "is InvocationMirror");
+  Expect.equals(name, im.memberName, "name");
   if (named == null) {
-    Expect.isTrue(im.isAccessor);
-    Expect.isFalse(im.isMethod);
+    Expect.isTrue(im.isAccessor, "$name:isAccessor");
+    Expect.isFalse(im.isMethod, "$name:isMethod");
     if (positional == null) {
-      Expect.isTrue(im.isGetter);
-      Expect.isFalse(im.isSetter);
-      Expect.equals(null, im.positionalArguments);
-      Expect.equals(null, im.positionalArguments);
+      Expect.isTrue(im.isGetter, "$name:isGetter");
+      Expect.isFalse(im.isSetter, "$name:isSetter");
+      Expect.equals(null, im.positionalArguments, "$name:positional");
+      Expect.equals(null, im.namedArguments, "$name:named");
       return;
     }
-    Expect.isTrue(im.isSetter);
-    Expect.isFalse(im.isGetter);
-    Expect.equals(1, im.positionalArguments.length);
-    Expect.equals(positional[0], im.positionalArguments[0]);
-    Expect.equals(null, im.namedArguments);
+    Expect.isTrue(im.isSetter, "$name:isSetter");
+    Expect.isFalse(im.isGetter, "$name:isGetter");
+    Expect.equals(1, im.positionalArguments.length, "$name:#positional");
+    Expect.equals(positional[0], im.positionalArguments[0],
+                  "$name:positional[0]");
+    Expect.equals(null, im.namedArguments, "$name:named");
     return;
   }
-  Expect.isTrue(im.isMethod);
-  Expect.isFalse(im.isAccessor);
-  Expect.isFalse(im.isSetter);
-  Expect.isFalse(im.isGetter);
+  Expect.isTrue(im.isMethod, "$name:isMethod");
+  Expect.isFalse(im.isAccessor, "$name:isAccessor");
+  Expect.isFalse(im.isSetter, "$name:isSetter");
+  Expect.isFalse(im.isGetter, "$name:isGetter");
 
   Expect.equals(positional.length, im.positionalArguments.length);
   for (int i = 0; i < positional.length; i++) {
-    Expect.equals(positional[i], im.positionalArguments[i]);
+    Expect.equals(positional[i], im.positionalArguments[i],
+                  "$name:positional[$i]");
   }
-  Expect.equals(named.length, im.namedArguments.length);
+  Expect.equals(named.length, im.namedArguments.length, "$name:#named");
   named.forEach((k, v) {
-    Expect.isTrue(im.namedArguments.containsKey(k));
-    Expect.equals(v, im.namedArguments[k]);
+    Expect.isTrue(im.namedArguments.containsKey(k), "$name:?named[$k]");
+    Expect.equals(v, im.namedArguments[k], "$name:named[$k]");
   });
 }
 
@@ -74,7 +79,7 @@
 
   // Missing property/method access.
   testInvocationMirror(n.bar, 'bar');
-  testInvocationMirror(n.bar = 42, 'bar=', [42]);
+  testInvocationMirror((n..bar = 42).last, 'bar=', [42]);
   testInvocationMirror(n.bar(), 'bar', [], {});
   testInvocationMirror(n.bar(42), 'bar', [42], {});
   testInvocationMirror(n.bar(x: 42), 'bar', [], {"x": 42});
@@ -87,15 +92,15 @@
   // Missing operator access.
   testInvocationMirror(n + 4, '+', [4], {});
   testInvocationMirror(n - 4, '-', [4], {});
-  testInvocationMirror(-n, '+', [], {});
+  testInvocationMirror(-n, '-', [], {});
   testInvocationMirror(n[42], '[]', [42], {});
-  testInvocationMirror(n[37] = 42, '[]=', [37, 42], {});
+  testInvocationMirror((n..[37] = 42).last, '[]=', [37, 42], {});
 
   // Calling as function when it's not.
   testInvocationMirror(n(), 'call', [], {});
   testInvocationMirror(n(42), 'call', [42], {});
   testInvocationMirror(n(x: 42), 'call', [], {"x": 42});
-  testInvocationMirror(n(37, x: 42), 'call', [37], {"x": 42});is
+  testInvocationMirror(n(37, x: 42), 'call', [37], {"x": 42});
 
   // Calling with arguments not matching existing call method.
   testInvocationMirror(c(), 'call', [], {});
@@ -108,17 +113,17 @@
   testInvocationMirror(n.flif(37, 42), "flif", [37, 42], {});
   testInvocationMirror(n.flif(x: 42), "flif", [], {"x": 42});
   testInvocationMirror(n.flif(37, x: 42), "flif", [37], {"x": 42});
-  testInvocationMirror(n.flif = 42, "flif=", [42]);
+  testInvocationMirror((n..flif = 42).last, "flif=", [42]);
 
   testInvocationMirror(n.flaf(37, 42), "flaf", [37, 42], {});
   testInvocationMirror(n.flaf(x: 42), "flaf", [], {"x": 42});
   testInvocationMirror(n.flaf(37, x: 42), "flaf", [37], {"x": 42});
-  testInvocationMirror(n.flaf = 42, "flaf=", [42]);
+  testInvocationMirror((n..flaf = 42).last, "flaf=", [42]);
 
   testInvocationMirror(n.flof(37, 42), "flof", [37, 42], {});
   testInvocationMirror(n.flof(x: 42), "flof", [], {"x": 42});
   testInvocationMirror(n.flof(37, y: 42), "flof", [37], {"y": 42});
-  testInvocationMirror(n.flof = 42, "flof=", [42]);
+  testInvocationMirror((n..flof = 42).last, "flof=", [42]);
 
   // Reading works.
   Expect.isTrue(n.flif is Function);
@@ -126,26 +131,26 @@
   Expect.isTrue(n.flof is Function);
 
   // Writing to read-only fields.
-  testInvocationMirror(n.wut = 42, "wut=", [42]);
-  testInvocationMirror(n.plif = 42, "plif=", [42]);
-  testInvocationMirror(n.plaf = 42, "plaf=", [42]);
+  testInvocationMirror((n..wut = 42).last, "wut=", [42]);
+  testInvocationMirror((n..plif = 42).last, "plif=", [42]);
+  testInvocationMirror((n..plaf = 42).last, "plaf=", [42]);
 
   // Trick call to n.call - wut is a getter returning n again.
-  testInvocationMirror(n.wut(42), "call", [42]);
+  testInvocationMirror(n.wut(42), "call", [42], {});
 
   // Closurizing a method means that calling it badly will not hit the
   // original receivers noSuchMethod, only the one inherited from Object
   // by the closure object.
   Expect.throws(() { var x = n.flif; x(37, 42); },
-                (e) => e is noSuchMethodError);
+                (e) => e is NoSuchMethodError);
   Expect.throws(() { var x = c.call; x(37, 42); },
-                (e) => e is noSuchMethodError);
+                (e) => e is NoSuchMethodError);
 }
 
 // Test the NoSuchMethodError thrown by different incorrect calls.
 testNoSuchMethodErrors() {
   test(Function block) {
-    Expect.throws(block, (e) => e is noSuchMethodError);
+    Expect.throws(block, (e) => e is NoSuchMethodError);
   }
 
   var o = new Object();
diff --git a/tests/language/language.status b/tests/language/language.status
index 0549cc3..fd80dde 100644
--- a/tests/language/language.status
+++ b/tests/language/language.status
@@ -28,8 +28,10 @@
 pseudo_kw_illegal_test/14: Fail  # Issue 356
 
 # These bugs refer currently ongoing language discussions.
-constructor5_test: Fail          # (Discussion ongoing)
-constructor6_test: Fail          # (Discussion ongoing)
+constructor5_test: Fail           # (Discussion ongoing)
+
+constructor6_test: Fail           # Issue 6422
+closure_in_initializer_test: Fail # Issue 6422
 
 # Regular bugs which should be fixed.
 const_init6_negative_test: Fail       # Issue 811
@@ -57,12 +59,12 @@
 
 export_cyclic_test: Crash # issue 6060
 
-call_through_getter_test: Fail # issue 6124
 call_through_null_getter_test: Fail # issue 6124
-local_function_test: Fail # issue 6124
-naming_test: Fail # issue 6124
 
 invocation_mirror_test: Fail # issue 3326, 3622.
+no_such_method_test: Fail # issue 3326, 3622.
+
+invocation_mirror_indirect_test: Fail # Issue 3326
 
 [ $compiler == none && ($system == macos || $system == linux) && $arch == ia32 && $checked ]
 gc_test: Skip  # Issue 1487, flaky.
@@ -139,8 +141,6 @@
 constructor3_negative_test: Fail # Runtime only test, rewrite as multitest
 constructor_call_wrong_argument_count_negative_test: Fail # Runtime only test, rewrite as multitest
 disable_privacy_test: Fail # Issue 1882: Needs --disable_privacy support.
-duplicate_implements_test/03: Fail, OK # we are going to remove interfaces
-duplicate_implements_test/04: Fail, OK # we are going to remove interfaces
 factory5_test/00: Fail # issue 3079
 field_method4_negative_test: Fail  # Runtime only test, rewrite as multitest
 field7_negative_test: Fail, OK # language changed, test issue 5249
@@ -148,11 +148,9 @@
 getter_no_setter_test/01: Fail # Fails to detect compile-time error.
 getter_no_setter2_test/01: Fail # Fails to detect compile-time error.
 instance_call_wrong_argument_count_negative_test: Fail # Runtime only test, rewrite as multitest
-interface_factory1_negative_test: Fail # language change 1031
 # Test expects signature of noSuchMethod to be correct according
 # to specification. Should start working when the library signature
 # changes.
-invocation_mirror_test: Fail, OK
 is_not_class2_negative_test: Fail #  Runtime only test, rewrite as multitest
 library2_negative_test: Fail # still a valid test? Issue 3649
 library4_negative_test: Fail # still a valid test? Issue 3530
@@ -160,11 +158,13 @@
 list_literal4_test: Fail # Issue 1343
 map_literal4_test: Fail # Issue 1343
 named_parameters_with_object_property_names_test: Fail # Issue 2137
-no_such_method_negative_test: Fail # Runtime only test, rewrite as multiteste
+many_overridden_no_such_method_test: Fail
+no_such_method_negative_test: Fail # Runtime only test, rewrite as multitest
 override_field_test/03: Fail # still a valid test? Issue 3894
 override_field_test/04: Fail # still a valid test? Issue 3656
 override_field_method3_negative_test: Fail, OK # test issue 5249
 override_field_method6_negative_test: Fail, OK # test issue 5249
+overridden_no_such_method_test: Fail
 parameter_initializer6_negative_test: Fail # language change 4288
 prefix1_negative_test : Fail # language change 1031
 prefix4_negative_test : Fail # language change 1031
@@ -172,7 +172,6 @@
 prefix8_negative_test : Fail # language change 1031
 prefix9_negative_test : Fail # language change 1031
 prefix10_negative_test : Fail # language change 1031
-prefix11_negative_test : Fail # language change 1031
 private_member3_negative_test: Fail # Runtime only test?  rewrite as multitest
 pseudo_kw_illegal_test/09: Fail, OK # 'interface' is not a built-in identifier
 pseudo_kw_illegal_test/14: Fail, OK # 'source' is not a built-in identifier
@@ -185,7 +184,6 @@
 syntax_test/none: Fail # Bug 2107  Static type warnings in none case (INSTANTIATION_OF_CLASS_WITH_UNIMPLEMENTED_MEMBERS)
 throw7_negative_test: Fail # Issue 3654
 type_variable_bounds_test/00: Fail # issue 3079
-type_variable_bounds_test/07: Fail # language change 1031
 
 # test issue 5291
 type_parameter_test/none: Fail, OK
@@ -204,6 +202,109 @@
 abstract_syntax_test/none: Fail, OK
 interface_test/none: Fail, OK
 
+# test issue 6338
+application_negative_test: Pass
+application_test: Fail, OK
+generic_instanceof_test: Fail, OK
+hello_script_test: Fail, OK
+lazy_static6_test: Fail, OK
+library1_test: Fail, OK
+library_prefixes_test: Fail, OK
+many_generic_instanceof_test: Fail, OK
+multi_pass2_test: Fail, OK
+multi_pass_test: Fail, OK
+private2_test: Fail, OK
+private3_test: Fail, OK
+private_test: Fail, OK
+top_level_entry_test: Fail, OK
+top_level_multiple_files_test: Fail, OK
+top_level_non_prefixed_library_test: Fail, OK
+
+
+
+# test issue 6324
+class_test: Fail, OK
+compile_time_constant_h_test: Fail, OK
+const_constructor_syntax_test/none: Fail, OK
+ct_const_test: Fail, OK
+cyclic_type_variable_test/none: Fail, OK
+cyclic_type_variable_test/01: Fail, OK
+cyclic_type_variable_test/02: Fail, OK
+cyclic_type_variable_test/03: Fail, OK
+cyclic_type_variable_test/04: Fail, OK
+default_class_implicit_constructor_test: Fail, OK
+default_factory2_test/none: Fail, OK
+default_factory2_test/01: Fail, OK
+default_factory3_test: Fail, OK
+default_factory_library_test: Fail, OK
+default_implementation2_test: Fail, OK
+default_factory_test: Fail, OK
+default_implementation_test: Fail, OK
+duplicate_implements_test/none: Fail, OK
+duplicate_implements_test/03: Pass
+duplicate_implements_test/04: Pass
+dynamic_test: Fail, OK
+factory2_test: Fail, OK
+factory3_test: Fail, OK
+factory5_test/none: Fail, OK
+factory4_test: Fail, OK
+factory_implementation_test: Fail, OK
+generic_deep_test: Fail, OK
+generic_instanceof3_test: Fail, OK
+generic_syntax_test: Fail, OK
+implicit_this_test/01: Fail, OK
+implicit_this_test/04: Fail, OK
+implied_interface_test: Fail, OK
+instanceof2_test: Fail, OK
+instanceof_test: Fail, OK
+interface_constants_test: Fail, OK
+interface_factory1_negative_test: Fail, OK
+interface_factory_test: Fail, OK
+interface_factory_multi_test: Fail, OK
+interface_inherit_field_test: Fail, OK
+interface_test/00: Fail, OK
+is_operator_test: Fail, OK
+library_same_name_used_test: Fail, OK
+list_literal_syntax_test/none: Fail, OK
+method_override2_test/none: Fail, OK
+named_parameters_test/none: Fail, OK
+non_parameterized_factory2_test: Fail, OK
+non_parameterized_factory_test: Fail, OK
+prefix11_negative_test: Pass
+prefix14_test: Fail, OK
+prefix15_test: Fail, OK
+prefix16_test: Fail, OK
+prefix17_test: Fail, OK
+prefix22_test: Fail, OK
+prefix23_test: Fail, OK
+throw1_test: Fail, OK
+throw2_test: Fail, OK
+try_catch2_test: Fail, OK
+try_catch3_test: Fail, OK
+type_checks_in_factory_method_test: Fail, OK
+type_variable_bounds2_test/none: Fail, OK
+type_variable_bounds2_test/01: Fail, OK
+type_variable_bounds2_test/02: Fail, OK
+type_variable_bounds2_test/03: Fail, OK
+type_variable_bounds2_test/04: Fail, OK
+type_variable_bounds2_test/00: Fail, OK
+type_variable_bounds2_test/06: Fail, OK
+type_variable_bounds_test/none: Fail, OK
+type_variable_bounds_test/04: Fail, OK
+type_variable_bounds_test/05: Fail, OK
+type_variable_bounds_test/02: Fail, OK
+type_variable_bounds_test/03: Fail, OK
+type_variable_bounds_test/06: Fail, OK
+type_variable_bounds_test/01: Fail, OK
+type_variable_bounds_test/07: Fail, OK
+type_variable_bounds_test/10: Fail, OK
+type_variable_bounds_test/09: Fail, OK
+type_variable_scope_test/none: Fail, OK
+interface_factory1_negative_test: Pass
+type_variable_bounds_test/07: Pass
+
+
+
 #
 # Add new dartc annotations above in alphabetical order
 #
@@ -214,6 +315,10 @@
 
 
 [ $compiler == none && $runtime == drt ]
+final_variable_assignment_test/01: Fail
+final_variable_assignment_test/02: Fail
+final_variable_assignment_test/03: Fail
+final_variable_assignment_test/04: Fail
 gc_test: Skip # Issue 1487
 prefix_new_test: Fail
 import_combinators_test: Fail
@@ -249,6 +354,38 @@
 *: Skip
 
 [ $compiler == dart2dart ]
+many_overridden_no_such_method_test: Fail, Pass # TRIAGE: fails in minified mode
+overridden_no_such_method_test: Fail, Pass # TRIAGE: fails in minified mode
+# Calling unresolved class constructor:
+# call_constructor_on_unresolvable_class_test/07: Fail
+call_nonexistent_constructor_test: Fail
+
+# Renaming type from platform library:
+dynamic_test: Fail
+
+# Missing compile-time error when modifying final local variables
+final_variable_assignment_test/01: Fail
+final_variable_assignment_test/02: Fail
+final_variable_assignment_test/03: Fail
+final_variable_assignment_test/04: Fail
+
+# Factory for another interface (will be obsolete soon).
+# factory2_negative_test: Fail
+# factory3_negative_test: Fail
+# factory_negative_test: Fail
+default_factory_test: Fail
+factory2_test: Fail
+factory3_test: Fail
+factory4_test: Fail
+factory5_test: Fail
+factory_implementation_test: Fail
+interface_factory_multi_test: Fail
+interface_factory_test: Fail
+non_parameterized_factory2_test: Fail
+non_parameterized_factory_test: Fail
+type_variable_scope_test: Fail
+constructor_redirect2_test/03: Fail
+
 class_literal_test/05: Fail # http://dartbug.com/5519
 class_literal_test/10: Fail # http://dartbug.com/5519
 class_literal_test/11: Fail # http://dartbug.com/5519
@@ -298,7 +435,6 @@
 named_parameters_aggregated_test/01: Fail # http://dartbug.com/5519
 named_parameters_aggregated_test/03: Fail # http://dartbug.com/5519
 named_parameters_aggregated_test/04: Fail # http://dartbug.com/5519
-new_expression_type_args_test/02: Fail # inherited from dart2js
 not_enough_positional_arguments_test/01: Fail # http://dartbug.com/5519
 override_field_test/04: Fail # http://dartbug.com/5519
 static_field3_test/01: Fail # http://dartbug.com/5519
@@ -314,6 +450,7 @@
 bad_constructor_test/06: Fail
 argument_definition_test/*: Skip # Not implemented.
 argument_definition2_test: Skip # Not implemented. Fails in minified tests.
+argument_definition3_test: Skip # Not implemented. Fails in minified tests.
 const_var_test: Fail # Map literals take 2 type arguments.
 map_literal3_test: Fail # Map literals take 2 type arguments.
 class_cycle_negative_test: Fail, OK # Bad test: assumes eager loading.
@@ -384,6 +521,7 @@
 # DartVM problem.
 constructor5_test: Fail
 constructor6_test: Fail
+closure_in_initializer_test: Fail
 field_override_test/01: Fail
 field_override_test/02: Fail
 field_override_test/none: Fail
@@ -396,12 +534,12 @@
 generic_test: Fail, Ok
 # Minified mode failures.
 # TODO(antonm): proper support in test framework.
-overridden_no_such_method_test: Pass, Fail, OK # Hard codes the name of invoked method ("foo").
-many_overridden_no_such_method_test: Pass, Fail, OK # Hard codes the name of invoked method ("foo").
 no_such_method_test: Pass, Fail, OK # Hard codes the name of invoked method ("foo").
 
 named_parameters_aggregated_test/05: Fail # Compile-time error reported instead of static type warning.
 
+new_expression_type_args_test/02: Fail # Test does not conform with spec.
+
 get_set_syntax_test/00: Fail # Fixed by https://chromiumcodereview.appspot.com/10915111
 get_set_syntax_test/01: Fail # Fixed by https://chromiumcodereview.appspot.com/10915111
 get_set_syntax_test/02: Fail # Fixed by https://chromiumcodereview.appspot.com/10915111
@@ -435,10 +573,8 @@
 
 type_error_test: Fail, OK # VM bug: http://dartbug.com/5280
 
-call_through_getter_test: Fail # issue 6130
 call_through_null_getter_test: Fail # issue 6130
-local_function_test: Fail # issue 6130
-naming_test: Fail # issue 6130
 
 # This is a VM error when the compiled code is run.
 invocation_mirror_test: Fail # issue 3326, 3622.
+invocation_mirror_indirect_test: Fail # issue 3326, 3622.
diff --git a/tests/language/language_dart2js.status b/tests/language/language_dart2js.status
index f3ff4de..8bcd4fd 100644
--- a/tests/language/language_dart2js.status
+++ b/tests/language/language_dart2js.status
@@ -38,9 +38,11 @@
 type_parameter_test/03: Fail # Issue 4932
 type_parameter_test/04: Fail # Issue 4932
 
+super_call4_test: Fail # Badly generated noSuchMethod call.
+
 [ $compiler == dart2js && $unchecked ]
 assertion_test: Fail
-new_expression_type_args_test/02: Fail # dart2js fails to reject type variable within static member
+new_expression_type_args_test/02: Fail # Test does not conform with spec.
 
 # Only checked mode reports an error on type assignment
 # problems in compile time constants.
@@ -59,6 +61,10 @@
 compile_time_constant_checked3_test/06: Fail, OK
 
 [ $compiler == dart2js ]
+final_variable_assignment_test/01: Fail
+final_variable_assignment_test/02: Fail
+final_variable_assignment_test/03: Fail
+final_variable_assignment_test/04: Fail
 bad_constructor_test/04: Fail # http://dartbug.com/5519
 bad_constructor_test/05: Fail # http://dartbug.com/5519
 bad_constructor_test/06: Fail # http://dartbug.com/5519
@@ -70,14 +76,6 @@
 illegal_invocation_test/03: Fail # http://dartbug.com/5519
 isnot_malformed_type_test/01: Fail # http://dartbug.com/5519
 not_enough_positional_arguments_test/01: Fail # http://dartbug.com/5519
-not_enough_positional_arguments_test/02: Fail # http://dartbug.com/5519
-optional_named_parameters_test/01: Fail # http://dartbug.com/5519
-optional_named_parameters_test/03: Fail # http://dartbug.com/5519
-optional_named_parameters_test/05: Fail # http://dartbug.com/5519
-optional_named_parameters_test/07: Fail # http://dartbug.com/5519
-optional_named_parameters_test/09: Fail # http://dartbug.com/5519
-
-execute_finally8_test: Fail # http://dartbug.com/5643
 
 throw_expr_test: Fail
 metadata_test: Fail # Metadata on type parameters not supported.
@@ -94,12 +92,8 @@
 function_type_alias2_test: Fail
 named_parameters_type_test: Fail
 positional_parameters_type_test: Fail
-named_parameters_test/01: Fail
-named_parameters_test/03: Fail
-named_parameters_test/05: Fail
-named_parameters_test/07: Fail
-named_parameters_test/09: Fail
 named_parameters_with_object_property_names_test: Fail
+named_parameters_aggregated_test/04: Fail # dart2js issue 5213
 
 # Fail "const EmptyLink<Element>" must be a compile-time constant if unchecked on linux.
 # Crash infinite loop on Mac and dart2js checked mode on linux.
@@ -111,7 +105,6 @@
 map_literal3_test: Fail # Map literals take 2 type arguments.
 ct_const_test: Fail # We don't take the generic type into account yet.
 char_escape_test: Fail # Unhandled non-BMP character: U+10000
-constructor6_test: Fail # Closures inside initializers not implemented.
 default_factory_library_test: Fail # lib is not a type
 dynamic_test: Fail # cannot resolve type F1
 factory_redirection_test/none: Fail # Not implemented.
@@ -122,10 +115,8 @@
 factory_redirection_test/05: Fail # Not implemented.
 factory_redirection_test/06: Fail # Not implemented.
 factory_redirection_test/07: Pass # For the wrong reason. Not implemented.
+constructor_redirect2_test/03: Fail # redirecting ctor with initializing formal
 factory3_test: Fail # internal error: visitIs for type variables not implemented
-function_literals2_test: Fail # Closures inside initializers not implemented.
-function_syntax_test/none: Fail # Closures inside initializers not implemented.
-function_test: Fail # internal error: Closures inside initializers not implemented
 function_type_alias2_test: Fail # cannot resolve type f1
 function_type_alias3_test: Fail # cannot resolve type F
 function_type_alias4_test: Fail # cannot resolve type F
@@ -155,7 +146,6 @@
 get_set_syntax_test/15: Fail # Fixed by https://chromiumcodereview.appspot.com/10915111
 get_set_syntax_test/16: Fail # Fixed by https://chromiumcodereview.appspot.com/10915111
 implicit_scope_test: Fail # duplicate definition of a="bar"
-library_prefixes_test: Fail # other is not a type
 many_generic_instanceof_test: Fail # cannot resolve type T
 method_binding_test: Fail # internal error: super property read not implemented.
 method_override_test: Fail # cannot resolve type GetKeysFunctionType
@@ -166,9 +156,6 @@
 abstract_getter_test/01: Fail # instantiation of abstract class
 abstract_factory_constructor_test/01: Fail # instantiation of abstract class
 parameter_initializer6_negative_test: Fail # Issue 3502
-named_parameters2_test: Fail # Unimplemented non-matching static call
-named_parameters3_test: Fail # Unimplemented non-matching static call
-named_parameters4_test: Fail # Unimplemented non-matching static call
 named_parameters_aggregated_test/01: Fail # Presence of default values for optional params is not properly validated in type definitions.
 named_parameters_aggregated_test/03: Fail # Presence of default values for optional params is not properly validated in closure types.
 named_parameters_aggregated_test/05: Fail # Absence of positional parameters before named parameters does not trigger static type warning.
diff --git a/tests/language/licm_test.dart b/tests/language/licm_test.dart
new file mode 100644
index 0000000..67fea65
--- /dev/null
+++ b/tests/language/licm_test.dart
@@ -0,0 +1,25 @@
+// 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.
+
+var sum = 0;
+var foo = 0;
+var bar = 1;
+
+test() {
+  while (true) {
+    if (0 === foo) {
+      sum += 2;
+      if (1 === bar) {
+        sum += 3;
+        break;
+      }
+      break;
+    }
+  }
+}
+
+main() {
+  test();
+  Expect.equals(5, sum);
+}
diff --git a/tests/language/list_test.dart b/tests/language/list_test.dart
index 192b219..899c178 100644
--- a/tests/language/list_test.dart
+++ b/tests/language/list_test.dart
@@ -48,7 +48,7 @@
     a.forEach(f(element) { Expect.equals(null, element); });
     a[1] = 1;
     Expect.equals(1, a[1]);
-    Expect.throws(() => a[len], (e) => e is IndexOutOfRangeException);
+    Expect.throws(() => a[len], (e) => e is RangeError);
 
     Expect.throws(() {
       List a = new List(4);
@@ -58,7 +58,7 @@
     Expect.throws(() {
       List a = new List(4);
       a.setRange(10, 1, a, 1);
-    }, (e) => e is IndexOutOfRangeException);
+    }, (e) => e is RangeError);
 
     a = new List(4);
     List b = new List(4);
@@ -101,7 +101,7 @@
     List list = new List();
     // We cannot write just 'list.removeLast' due to issue 3769.
     Expect.throws(() => list.removeLast(),
-                  (e) => e is IndexOutOfRangeException);
+                  (e) => e is RangeError);
     Expect.equals(0, list.length);
   }
 }
diff --git a/tests/language/mint_compares.dart b/tests/language/mint_compares.dart
index c09bec1..fea302e 100644
--- a/tests/language/mint_compares.dart
+++ b/tests/language/mint_compares.dart
@@ -4,7 +4,6 @@
 
 // Test compares on 64-bit integers.
 
-
 compareTest() {
   Expect.isFalse(4294967296 < 6);
   Expect.isFalse(4294967296 < 4294967296);
@@ -52,9 +51,46 @@
   Expect.isFalse(-4294967296 < -184467440737095516150);
 }
 
+compareTest2(lt, lte, gt, gte) {
+  Expect.isFalse(lt(4294967296, 6));
+  Expect.isFalse(lte(4294967296, 6));
+  Expect.isTrue(gt(4294967296, 6));
+  Expect.isTrue(gte(4294967296, 6));
+
+  Expect.isTrue(lte(-1, -1));
+  Expect.isTrue(gte(-1, -1));
+  Expect.isTrue(lte(-2, -1));
+  Expect.isFalse(gte(-2, -1));
+  Expect.isTrue(lte(-4294967296, -1));
+  Expect.isFalse(gte(-4294967296, -1));
+
+  Expect.isTrue(lt(-2, -1));
+  Expect.isFalse(gt(-2, -1));
+  Expect.isTrue(lt(-4294967296, -1));
+  Expect.isFalse(gt(-4294967296, -1));
+
+  Expect.isFalse(lt(-1, -4294967296));
+  Expect.isTrue(gt(-1, -4294967296));
+  Expect.isFalse(lt(2, -2));
+  Expect.isTrue(gt(2, -2));
+  Expect.isFalse(lt(4294967296, -1));
+  Expect.isTrue(gt(4294967296, -1));
+}
+
+bool lt1(a, b) => a < b;
+bool lte1(a, b) => a <= b;
+bool gt1(a, b) => a > b;
+bool gte1(a, b) => a >= b;
+
+bool lt2(a, b) => a < b ? true : false;
+bool lte2(a, b) => a <= b ? true : false;
+bool gt2(a, b) => a > b ? true : false;
+bool gte2(a, b) => a >= b ? true : false;
 
 main() {
-  for (var i = 0; i < 100; i++) {
+  for (var i = 0; i < 1000; i++) {
     compareTest();
+    compareTest2(lt1, lte1, gt1, gte1);
+    compareTest2(lt2, lte2, gt2, gte2);
   }
 }
diff --git a/tests/language/no_such_method_test.dart b/tests/language/no_such_method_test.dart
index 138df66..0bd9da3 100644
--- a/tests/language/no_such_method_test.dart
+++ b/tests/language/no_such_method_test.dart
@@ -5,22 +5,20 @@
 
 class NoSuchMethodTest {
 
-  foo([a = 10, b = 20]) {
+  foo({a : 10, b : 20}) {
     return (10 * a) + b;
   }
 
-  noSuchMethod(String name, List args) {
-    Expect.equals("moo", name);
-    Expect.equals(1, args.length);
-    return foo(args[0]);
+  noSuchMethod(InvocationMirror im) {
+    Expect.equals("moo", im.memberName);
+    Expect.equals(0, im.positionalArguments.length);
+    Expect.equals(1, im.namedArguments.length);
+    return foo(b:im.namedArguments["b"]);
   }
 
   static testMain() {
     var obj = new NoSuchMethodTest();
-    Expect.equals(1010, obj.moo(b:99));  // obj.NoSuchMethod called here.
-    // After we remove the rest argument and change the signature of
-    // noSuchMethod to be compatible with named arguments, we can expect the
-    // correct value of 199 instead of 1010.
+    Expect.equals(199, obj.moo(b:99));  // obj.NoSuchMethod called here.
   }
 }
 
diff --git a/tests/language/overridden_no_such_method.dart b/tests/language/overridden_no_such_method.dart
index d2d26fb..b06fc5c 100644
--- a/tests/language/overridden_no_such_method.dart
+++ b/tests/language/overridden_no_such_method.dart
@@ -7,9 +7,10 @@
 
   OverriddenNoSuchMethod() {}
 
-  noSuchMethod(var function_name, List args) {
-    Expect.equals("foo", function_name);
+  noSuchMethod(InvocationMirror mirror) {
+    Expect.equals("foo", mirror.memberName);
     // 'foo' was called with two parameters (not counting receiver).
+    List args = mirror.positionalArguments;
     Expect.equals(2, args.length);
     Expect.equals(101, args[0]);
     Expect.equals(202, args[1]);
diff --git a/tests/language/super_assign_test.dart b/tests/language/super_assign_test.dart
new file mode 100644
index 0000000..84f8146
--- /dev/null
+++ b/tests/language/super_assign_test.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class A {
+  int x;
+}
+
+class C extends A {
+  void setX(int value) { super.x = value; }
+}
+
+main() {
+ A a = new C();
+ a.x = 37;
+ a.setX(42);
+ Expect.equals(42, a.x);
+}
diff --git a/tests/language/super_call4_test.dart b/tests/language/super_call4_test.dart
index f353f48..f5ce7c28 100644
--- a/tests/language/super_call4_test.dart
+++ b/tests/language/super_call4_test.dart
@@ -6,15 +6,13 @@
 // current class.
 
 class C {
-  // bool noSuchMethod(InvocationMirror im) {  // Issue 3622
-  bool noSuchMethod(String function_name, List args) {
+  bool noSuchMethod(InvocationMirror im) {
     return true;
   }
 }
 
 class D extends C {
-  // bool noSuchMethod(InvocationMirror im) {  // Issue 3622
-  bool noSuchMethod(String function_name, List args) {
+  bool noSuchMethod(InvocationMirror im) {
     return false;
   }
   test() {
diff --git a/tests/language/super_operator_test.dart b/tests/language/super_operator_test.dart
index a0be547..eea7545 100644
--- a/tests/language/super_operator_test.dart
+++ b/tests/language/super_operator_test.dart
@@ -47,6 +47,18 @@
 
 }
 
+
+class Autobianchi {
+  g() => super[0];
+}
+
+
+testRegression6403() {
+  // Do not crash, throw exception instead
+  new Autobianchi().g();
+}
+
+
 main () {
   var a = new A();
   a = a + "William";  // operator + of class A.
@@ -62,4 +74,5 @@
   Expect.equals(43, a.things[4]);
   Expect.equals(86, a[4]);
 
+  Expect.throws(testRegression6403);
 }
diff --git a/tests/language/typed_equality_test.dart b/tests/language/typed_equality_test.dart
new file mode 100644
index 0000000..c849df0
--- /dev/null
+++ b/tests/language/typed_equality_test.dart
@@ -0,0 +1,21 @@
+// 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.
+
+// Regression test for http://dartbug.com/6036. dart2js used to fail
+// this method because it was computing that intersecting type D with
+// type C is conflicting.
+
+foo(a, b) {
+  if (a === b) return;
+  throw 'broken';
+}
+
+class D {}
+
+class C implements D {}
+
+main() {
+  var c = new C();
+  foo(c, c as D);
+}
diff --git a/tests/language/typed_selector_test.dart b/tests/language/typed_selector_test.dart
new file mode 100644
index 0000000..5431d36
--- /dev/null
+++ b/tests/language/typed_selector_test.dart
@@ -0,0 +1,29 @@
+// 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.
+
+// Regression test for http://dartbug.com/6259. This test used to fail
+// on dart2js because class A does not know [A.document] is a target for
+// the call [:obj.document:] in the [main] method. Therefore, dart2js
+// would not compile [A.document].
+
+class A {
+  get document => 42;
+}
+
+abstract class B {
+  abstract get document;
+}
+
+class C extends A implements B {
+}
+
+int inscrutable(int x) => x == 0 ? 0 : x | inscrutable(x & (x - 1));
+
+void main() {
+  var tab = [new Object(), new C()];
+  var obj = tab[inscrutable(1)];
+  int res = 0;
+  if (obj is B) res = obj.document;
+  Expect.equals(42, res);
+} 
diff --git a/tests/language/value_range2_test.dart b/tests/language/value_range2_test.dart
index 49a9b71..6e45cc1 100644
--- a/tests/language/value_range2_test.dart
+++ b/tests/language/value_range2_test.dart
@@ -17,6 +17,6 @@
 
 main() {
   Expect.throws(() => foo(),
-                (e) => e is IndexOutOfRangeException);
+                (e) => e is RangeError);
 }
 
diff --git a/tests/language/value_range_test.dart b/tests/language/value_range_test.dart
index f5a0491..5f4abb7 100644
--- a/tests/language/value_range_test.dart
+++ b/tests/language/value_range_test.dart
@@ -15,6 +15,6 @@
 
 main() {
   Expect.throws(() => foo(),
-                (e) => e is IndexOutOfRangeException);
+                (e) => e is RangeError);
 }
 
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index 4e9589d..63ffc68 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -13,3 +13,10 @@
 [ $compiler == dart2dart ]
 # Skip until we stabilize language tests.
 *: Skip
+
+[ $compiler == dartc ]
+# lib issue 6322
+crypto/hmac_sha1_test: Fail, OK
+crypto/hmac_sha256_test: Fail, OK
+crypto/sha1_test: Fail, OK
+crypto/sha256_test: Fail, OK
diff --git a/tests/standalone/byte_array_test.dart b/tests/standalone/byte_array_test.dart
index e23715f..c2a1165 100644
--- a/tests/standalone/byte_array_test.dart
+++ b/tests/standalone/byte_array_test.dart
@@ -20,7 +20,7 @@
   for (int i = 0; i < 10; i++) {
     Expect.equals(0, byteArray[i]);
   }
-  
+
 }
 
 void testUnsignedByteArrayRange() {
@@ -31,7 +31,7 @@
   Expect.equals(255, byteArray[1]);
   byteArray[1] = 0;
   Expect.equals(0, byteArray[1]);
-  
+
   Expect.throws(() {
     byteArray[1] = 1.2;
   });
@@ -131,7 +131,7 @@
   Expect.equals(10, array.subByteArray(0, null).lengthInBytes());
   Expect.equals(10, array.subByteArray().lengthInBytes());
   testThrowsIndex(function) {
-    Expect.throws(function, (e) => e is IndexOutOfRangeException);
+    Expect.throws(function, (e) => e is RangeError);
   }
   testThrowsIndex(() => array.subByteArray(0, -1));
   testThrowsIndex(() => array.subByteArray(1, -1));
diff --git a/tests/standalone/crypto/base64_test.dart b/tests/standalone/crypto/base64_test.dart
index 1d47aac..96de0c2 100644
--- a/tests/standalone/crypto/base64_test.dart
+++ b/tests/standalone/crypto/base64_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#source("../../../runtime/bin/base64.dart");
+#source("../../../lib/io/base64.dart");
 
 void main() {
   String line;
diff --git a/tests/standalone/io/dart_std_io_pipe_test.dart b/tests/standalone/io/dart_std_io_pipe_test.dart
index 1642fa6..5264a72 100644
--- a/tests/standalone/io/dart_std_io_pipe_test.dart
+++ b/tests/standalone/io/dart_std_io_pipe_test.dart
@@ -44,7 +44,6 @@
   future.then((process) {
     process.onExit = (exitCode) {
       Expect.equals(0, exitCode);
-      process.close();
 
       // Check the expected file contents.
       if (type == "0") {
@@ -68,6 +67,9 @@
       // Cleanup test directory.
       dir.deleteRecursivelySync();
     };
+    // Drain out and err streams so they close.
+    process.stdout.onData = process.stdout.read;
+    process.stderr.onData = process.stderr.read;
   });
   future.handleException((ProcessException error) {
     dir.deleteRecursivelySync();
diff --git a/tests/standalone/io/echo_server_stream_test.dart b/tests/standalone/io/echo_server_stream_test.dart
index c30fc95..3368b5c 100644
--- a/tests/standalone/io/echo_server_stream_test.dart
+++ b/tests/standalone/io/echo_server_stream_test.dart
@@ -39,7 +39,7 @@
 
     void connectHandler() {
 
-      SocketOutputStream stream = _socket.outputStream;
+      OutputStream stream = _socket.outputStream;
 
       void dataSent() {
         InputStream inputStream = _socket.inputStream;
@@ -149,9 +149,8 @@
     int offset = 0;
 
     void dataReceived() {
-      SocketOutputStream outputStream;
       int bytesRead;
-      outputStream = connection.outputStream;
+      OutputStream outputStream = connection.outputStream;
       bytesRead = inputStream.readInto(buffer, offset, MSGSIZE - offset);
       if (bytesRead > 0) {
         offset += bytesRead;
diff --git a/tests/standalone/io/file_test.dart b/tests/standalone/io/file_test.dart
index 4fd426a..02ee65f 100644
--- a/tests/standalone/io/file_test.dart
+++ b/tests/standalone/io/file_test.dart
@@ -872,7 +872,7 @@
     try {
       List<int> buffer = new List<int>(10);
       openedFile.readListSync(buffer, 0, 12);
-    } on IndexOutOfRangeException catch (ex) {
+    } on RangeError catch (ex) {
       exceptionCaught = true;
     } on Exception catch (ex) {
       wrongExceptionCaught = true;
@@ -883,7 +883,7 @@
     try {
       List<int> buffer = new List<int>(10);
       openedFile.readListSync(buffer, 6, 6);
-    } on IndexOutOfRangeException catch (ex) {
+    } on RangeError catch (ex) {
       exceptionCaught = true;
     } on Exception catch (ex) {
       wrongExceptionCaught = true;
@@ -894,7 +894,7 @@
     try {
       List<int> buffer = new List<int>(10);
       openedFile.readListSync(buffer, -1, 1);
-    } on IndexOutOfRangeException catch (ex) {
+    } on RangeError catch (ex) {
       exceptionCaught = true;
     } on Exception catch (ex) {
       wrongExceptionCaught = true;
@@ -905,7 +905,7 @@
     try {
       List<int> buffer = new List<int>(10);
       openedFile.readListSync(buffer, 0, -1);
-    } on IndexOutOfRangeException catch (ex) {
+    } on RangeError catch (ex) {
       exceptionCaught = true;
     } on Exception catch (ex) {
       wrongExceptionCaught = true;
@@ -916,7 +916,7 @@
     try {
       List<int> buffer = new List<int>(10);
       openedFile.writeListSync(buffer, 0, 12);
-    } on IndexOutOfRangeException catch (ex) {
+    } on RangeError catch (ex) {
       exceptionCaught = true;
     } on Exception catch (ex) {
       wrongExceptionCaught = true;
@@ -927,7 +927,7 @@
     try {
       List<int> buffer = new List<int>(10);
       openedFile.writeListSync(buffer, 6, 6);
-    } on IndexOutOfRangeException catch (ex) {
+    } on RangeError catch (ex) {
       exceptionCaught = true;
     } on Exception catch (ex) {
       wrongExceptionCaught = true;
@@ -938,7 +938,7 @@
     try {
       List<int> buffer = new List<int>(10);
       openedFile.writeListSync(buffer, -1, 1);
-    } on IndexOutOfRangeException catch (ex) {
+    } on RangeError catch (ex) {
       exceptionCaught = true;
     } on Exception catch (ex) {
       wrongExceptionCaught = true;
@@ -949,7 +949,7 @@
     try {
       List<int> buffer = new List<int>(10);
       openedFile.writeListSync(buffer, 0, -1);
-    } on IndexOutOfRangeException catch (ex) {
+    } on RangeError catch (ex) {
       exceptionCaught = true;
     } on Exception catch (ex) {
       wrongExceptionCaught = true;
@@ -1218,6 +1218,59 @@
     Expect.isFalse(file.existsSync());
   }
 
+  static void testWriteStringUtf8() {
+    var file = new File('${tempDirectory.path}/out_write_string');
+    var string = new String.fromCharCodes([0x192]);
+    file.open(FileMode.WRITE).then((openedFile) {
+      openedFile.writeString(string).then((_) {
+        openedFile.length().then((l) {
+          Expect.equals(2, l);
+          openedFile.close().then((_) {
+            file.open(FileMode.APPEND).then((openedFile) {
+              openedFile.setPosition(2).then((_) {
+                openedFile.writeString(string).then((_) {
+                  openedFile.length().then((l) {
+                    Expect.equals(4, l);
+                    openedFile.close().then((_) {
+                      file.readAsText().then((readBack) {
+                        Expect.stringEquals(readBack, '$string$string');
+                        file.delete().then((_) {
+                          file.exists().then((e) {
+                           Expect.isFalse(e);
+                           asyncTestDone("testWriteStringUtf8");
+                          });
+                        });
+                      });
+                    });
+                  });
+                });
+              });
+            });
+          });
+        });
+      });
+    });
+    asyncTestStarted();
+  }
+
+  static void testWriteStringUtf8Sync() {
+    var file = new File('${tempDirectory.path}/out_write_string_sync');
+    var string = new String.fromCharCodes([0x192]);
+    var openedFile = file.openSync(FileMode.WRITE);
+    openedFile.writeStringSync(string);
+    Expect.equals(2, openedFile.lengthSync());
+    openedFile.closeSync();
+    openedFile = file.openSync(FileMode.APPEND);
+    openedFile.setPositionSync(2);
+    openedFile.writeStringSync(string);
+    Expect.equals(4, openedFile.lengthSync());
+    openedFile.closeSync();
+    var readBack = file.readAsTextSync();
+    Expect.stringEquals(readBack, '$string$string');
+    file.deleteSync();
+    Expect.isFalse(file.existsSync());
+  }
+
   // Helper method to be able to run the test from the runtime
   // directory, or the top directory.
   static String getFilename(String path) =>
@@ -1273,6 +1326,8 @@
       testWriteVariousLists();
       testDirectory();
       testDirectorySync();
+      testWriteStringUtf8();
+      testWriteStringUtf8Sync();
     });
   }
 }
diff --git a/tests/standalone/io/http_advanced_test.dart b/tests/standalone/io/http_advanced_test.dart
index 77e36fa..a37d025 100644
--- a/tests/standalone/io/http_advanced_test.dart
+++ b/tests/standalone/io/http_advanced_test.dart
@@ -178,6 +178,11 @@
     response.outputStream.close();
   }
 
+  void _flushHandler(HttpRequest request, HttpResponse response) {
+    response.outputStream.flush();
+    response.outputStream.close();
+  }
+
   void init() {
     // Setup request handlers.
     _requestHandlers = new Map();
@@ -209,6 +214,10 @@
         (HttpRequest request, HttpResponse response) {
           _cookie2Handler(request, response);
         };
+    _requestHandlers["/flush"] =
+        (HttpRequest request, HttpResponse response) {
+          _flushHandler(request, response);
+        };
   }
 
   void dispatch(message, replyTo) {
@@ -405,9 +414,29 @@
   testServerMain.start();
 }
 
+void testFlush() {
+  TestServerMain testServerMain = new TestServerMain();
+  testServerMain.setServerStartedHandler((int port) {
+    HttpClient httpClient = new HttpClient();
+
+    HttpClientConnection conn = httpClient.get("127.0.0.1", port, "/flush");
+    conn.onRequest = (HttpClientRequest request) {
+      request.outputStream.flush();
+      request.outputStream.close();
+    };
+    conn.onResponse = (HttpClientResponse response) {
+      Expect.equals(HttpStatus.OK, response.statusCode);
+      httpClient.shutdown();
+      testServerMain.shutdown();
+    };
+  });
+  testServerMain.start();
+}
+
 void main() {
   testHost();
   testExpires();
   testContentType();
   testCookies();
+  testFlush();
 }
diff --git a/tests/standalone/io/http_auth_test.dart b/tests/standalone/io/http_auth_test.dart
new file mode 100644
index 0000000..7347b5d
--- /dev/null
+++ b/tests/standalone/io/http_auth_test.dart
@@ -0,0 +1,264 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#import("dart:isolate");
+#import("dart:crypto");
+#import("dart:io");
+#import("dart:uri");
+#import("dart:utf");
+
+class Server {
+  HttpServer server;
+  bool passwordChanged = false;
+
+  Server() : server = new HttpServer();
+
+  void start() {
+    server.listen("127.0.0.1", 0);
+    server.defaultRequestHandler =
+        (HttpRequest request, HttpResponse response) {
+          String username;
+          String password;
+          if (request.path == "/") {
+            username = "username";
+            password = "password";
+          } else {
+            username = request.path.substring(1, 6);
+            password = request.path.substring(1, 6);
+          }
+          if (passwordChanged) password = "${password}1";
+          if (request.headers[HttpHeaders.AUTHORIZATION] != null) {
+            Expect.equals(1, request.headers[HttpHeaders.AUTHORIZATION].length);
+            String authorization =
+              request.headers[HttpHeaders.AUTHORIZATION][0];
+            List<String> tokens = authorization.split(" ");
+            Expect.equals("Basic", tokens[0]);
+            String auth =
+                CryptoUtils.bytesToBase64(encodeUtf8("$username:$password"));
+            if (passwordChanged && auth != tokens[1]) {
+              response.statusCode = HttpStatus.UNAUTHORIZED;
+              response.headers.set(HttpHeaders.WWW_AUTHENTICATE,
+                                   "Basic, realm=realm");
+            } else {
+              Expect.equals(auth, tokens[1]);
+            }
+          } else {
+            response.statusCode = HttpStatus.UNAUTHORIZED;
+            response.headers.set(HttpHeaders.WWW_AUTHENTICATE,
+                                 "Basic, realm=realm");
+          }
+          response.outputStream.close();
+        };
+    server.addRequestHandler(
+        (HttpRequest request) => request.path == "/passwdchg",
+        (HttpRequest request, HttpResponse response) {
+          passwordChanged = true;
+          response.outputStream.close();
+        });
+  }
+
+  void shutdown() {
+    server.close();
+  }
+
+  int get port => server.port;
+}
+
+Server setupServer() {
+  Server server = new Server();
+  server.start();
+  return server;
+}
+
+void testUrlUserInfo() {
+  Server server = setupServer();
+  HttpClient client = new HttpClient();
+
+  HttpClientConnection conn =
+      client.getUrl(
+          new Uri.fromString(
+              "http://username:password@127.0.0.1:${server.port}/"));
+  conn.onResponse = (HttpClientResponse response) {
+    server.shutdown();
+    client.shutdown();
+  };
+}
+
+void testBasicNoCredentials() {
+  Server server = setupServer();
+  HttpClient client = new HttpClient();
+
+  Future makeRequest(Uri url) {
+    Completer completer = new Completer();
+    HttpClientConnection conn = client.getUrl(url);
+    conn.onResponse = (HttpClientResponse response) {
+      Expect.equals(HttpStatus.UNAUTHORIZED, response.statusCode);
+      completer.complete(null);
+    };
+    return completer.future;
+  }
+
+  var futures = [];
+  for (int i = 0; i < 5; i++) {
+    futures.add(
+        makeRequest(
+            new Uri.fromString("http://127.0.0.1:${server.port}/test$i")));
+    futures.add(
+        makeRequest(
+            new Uri.fromString("http://127.0.0.1:${server.port}/test$i/xxx")));
+  }
+  Futures.wait(futures).then((_) {
+    server.shutdown();
+    client.shutdown();
+  });
+}
+
+void testBasicCredentials() {
+  Server server = setupServer();
+  HttpClient client = new HttpClient();
+
+  Future makeRequest(Uri url) {
+    Completer completer = new Completer();
+    HttpClientConnection conn = client.getUrl(url);
+    conn.onResponse = (HttpClientResponse response) {
+      Expect.equals(HttpStatus.OK, response.statusCode);
+      completer.complete(null);
+    };
+    return completer.future;
+  }
+
+  for (int i = 0; i < 5; i++) {
+    client.addCredentials(
+        new Uri.fromString("http://127.0.0.1:${server.port}/test$i"),
+        "realm",
+        new HttpClientBasicCredentials("test$i", "test$i"));
+  }
+
+  var futures = [];
+  for (int i = 0; i < 5; i++) {
+    futures.add(
+        makeRequest(
+            new Uri.fromString("http://127.0.0.1:${server.port}/test$i")));
+    futures.add(
+        makeRequest(
+            new Uri.fromString("http://127.0.0.1:${server.port}/test$i/xxx")));
+  }
+  Futures.wait(futures).then((_) {
+    server.shutdown();
+    client.shutdown();
+  });
+}
+
+void testBasicAuthenticateCallback() {
+  Server server = setupServer();
+  HttpClient client = new HttpClient();
+  bool passwordChanged = false;
+
+  client.authenticate = (Uri url, String scheme, String realm) {
+    Expect.equals("Basic", scheme);
+    Expect.equals("realm", realm);
+    String username = url.path.substring(1, 6);
+    String password = url.path.substring(1, 6);
+    if (passwordChanged) password = "${password}1";
+    Completer completer = new Completer();
+    new Timer(10, (_) {
+      client.addCredentials(
+          url, realm, new HttpClientBasicCredentials(username, password));
+      completer.complete(true);
+    });
+    return completer.future;
+  };
+
+  Future makeRequest(Uri url) {
+    Completer completer = new Completer();
+    HttpClientConnection conn = client.getUrl(url);
+    conn.onResponse = (HttpClientResponse response) {
+      Expect.equals(HttpStatus.OK, response.statusCode);
+      completer.complete(null);
+    };
+    return completer.future;
+  }
+
+  List<Future> makeRequests() {
+    var futures = [];
+    for (int i = 0; i < 5; i++) {
+      futures.add(
+          makeRequest(
+              new Uri.fromString("http://127.0.0.1:${server.port}/test$i")));
+      futures.add(
+          makeRequest(
+              new Uri.fromString(
+                  "http://127.0.0.1:${server.port}/test$i/xxx")));
+    }
+    return futures;
+  }
+
+  Futures.wait(makeRequests()).then((_) {
+    makeRequest(
+        new Uri.fromString(
+            "http://127.0.0.1:${server.port}/passwdchg")).then((_) {
+      passwordChanged = true;
+      Futures.wait(makeRequests()).then((_) {
+        server.shutdown();
+        client.shutdown();
+      });
+    });
+  });
+}
+
+void testLocalServerBasic() {
+  HttpClient client = new HttpClient();
+
+  client.authenticate = (Uri url, String scheme, String realm) {
+    client.addCredentials(
+        new Uri.fromString("http://127.0.0.1/basic"),
+        "test",
+        new HttpClientBasicCredentials("test", "test"));
+    return new Future.immediate(true);
+  };
+
+  HttpClientConnection conn =
+      client.getUrl(new Uri.fromString("http://127.0.0.1/basic/test"));
+  conn.onResponse = (HttpClientResponse response) {
+    Expect.equals(HttpStatus.OK, response.statusCode);
+    response.inputStream.onData = () => response.inputStream.read();
+    response.inputStream.onClosed = () {
+      client.shutdown();
+    };
+  };
+}
+
+void testLocalServerDigest() {
+  HttpClient client = new HttpClient();
+
+  client.authenticate = (Uri url, String scheme, String realm) {
+    print("url: $url, scheme: $scheme, realm: $realm");
+    client.addCredentials(
+        new Uri.fromString("http://127.0.0.1/digest"),
+        "test",
+        new HttpClientDigestCredentials("test", "test"));
+    return new Future.immediate(true);
+  };
+
+  HttpClientConnection conn =
+      client.getUrl(new Uri.fromString("http://127.0.0.1/digest/test"));
+  conn.onResponse = (HttpClientResponse response) {
+    Expect.equals(HttpStatus.OK, response.statusCode);
+    response.inputStream.onData = () => response.inputStream.read();
+    response.inputStream.onClosed = () {
+      client.shutdown();
+    };
+  };
+}
+
+main() {
+  testUrlUserInfo();
+  testBasicNoCredentials();
+  testBasicCredentials();
+  testBasicAuthenticateCallback();
+  // These teste are not normally run. They can be used for locally
+  // testing with another web server (e.g. Apache).
+  //testLocalServerBasic();
+  //testLocalServerDigest();
+}
diff --git a/tests/standalone/io/http_client_test.dart b/tests/standalone/io/http_client_test.dart
index 55ec617..6c3c549 100644
--- a/tests/standalone/io/http_client_test.dart
+++ b/tests/standalone/io/http_client_test.dart
@@ -63,8 +63,6 @@
   HttpClient client = new HttpClient();
   Expect.throws(
       () => client.getUrl(new Uri.fromString('ftp://www.google.com')));
-  Expect.throws(
-      () => client.getUrl(new Uri.fromString('http://usr:pwd@www.google.com')));
 }
 
 void testBadHostName() {
diff --git a/tests/standalone/io/http_content_length_test.dart b/tests/standalone/io/http_content_length_test.dart
index 2f03c8b..917b014 100644
--- a/tests/standalone/io/http_content_length_test.dart
+++ b/tests/standalone/io/http_content_length_test.dart
@@ -6,11 +6,13 @@
 #import("dart:isolate");
 #import("dart:io");
 
-void testNoBody(int totalConnections) {
+void testNoBody(int totalConnections, bool explicitContentLength) {
   HttpServer server = new HttpServer();
   server.onError = (e) => Expect.fail("Unexpected error $e");
   server.listen("127.0.0.1", 0, backlog: totalConnections);
   server.defaultRequestHandler = (HttpRequest request, HttpResponse response) {
+    Expect.isNull(request.headers.value('content-length'));
+    Expect.equals(0, request.contentLength);
     response.contentLength = 0;
     OutputStream stream = response.outputStream;
     Expect.throws(() => stream.writeString("x"), (e) => e is HttpException);
@@ -25,11 +27,16 @@
     conn.onError = (e) => Expect.fail("Unexpected error $e");
     conn.onRequest = (HttpClientRequest request) {
       OutputStream stream = request.outputStream;
-      Expect.throws(() => stream.writeString("x"), (e) => e is HttpException);
+      if (explicitContentLength) {
+        request.contentLength = 0;
+        Expect.throws(() => stream.writeString("x"), (e) => e is HttpException);
+      }
       stream.close();
       Expect.throws(() => stream.writeString("x"), (e) => e is HttpException);
     };
     conn.onResponse = (HttpClientResponse response) {
+      Expect.equals("0", response.headers.value('content-length'));
+      Expect.equals(0, response.contentLength);
       count++;
       if (count == totalConnections) {
         client.shutdown();
@@ -44,6 +51,8 @@
   server.onError = (e) => Expect.fail("Unexpected error $e");
   server.listen("127.0.0.1", 0, backlog: totalConnections);
   server.defaultRequestHandler = (HttpRequest request, HttpResponse response) {
+    Expect.equals("2", request.headers.value('content-length'));
+    Expect.equals(2, request.contentLength);
     response.contentLength = 2;
     OutputStream stream = response.outputStream;
     stream.writeString("x");
@@ -70,6 +79,8 @@
       Expect.throws(() => stream.writeString("x"), (e) => e is HttpException);
     };
     conn.onResponse = (HttpClientResponse response) {
+      Expect.equals("2", response.headers.value('content-length'));
+      Expect.equals(2, response.contentLength);
       count++;
       if (count == totalConnections) {
         client.shutdown();
@@ -84,10 +95,12 @@
   server.onError = (e) => Expect.fail("Unexpected error $e");
   server.listen("127.0.0.1", 0, backlog: 5);
   server.defaultRequestHandler = (HttpRequest request, HttpResponse response) {
+    Expect.isNull(request.headers.value('content-length'));
+    Expect.equals(0, request.contentLength);
+    response.contentLength = 0;
     OutputStream stream = response.outputStream;
     Expect.equals("1.0", request.protocolVersion);
     Expect.throws(() => stream.writeString("x"), (e) => e is HttpException);
-    response.contentLength = 0;
     stream.close();
   };
 
@@ -104,7 +117,8 @@
 }
 
 void main() {
-  testNoBody(5);
+  testNoBody(5, false);
+  testNoBody(5, true);
   testBody(5);
   testHttp10();
 }
diff --git a/tests/standalone/io/http_date_test.dart b/tests/standalone/io/http_date_test.dart
index 1c7df41..81ed109 100644
--- a/tests/standalone/io/http_date_test.dart
+++ b/tests/standalone/io/http_date_test.dart
@@ -4,15 +4,15 @@
 
 #import("dart:math");
 
-#source("../../../runtime/bin/input_stream.dart");
-#source("../../../runtime/bin/output_stream.dart");
-#source("../../../runtime/bin/chunked_stream.dart");
-#source("../../../runtime/bin/string_stream.dart");
-#source("../../../runtime/bin/stream_util.dart");
-#source("../../../runtime/bin/http.dart");
-#source("../../../runtime/bin/http_impl.dart");
-#source("../../../runtime/bin/http_parser.dart");
-#source("../../../runtime/bin/http_utils.dart");
+#source("../../../lib/io/input_stream.dart");
+#source("../../../lib/io/output_stream.dart");
+#source("../../../lib/io/chunked_stream.dart");
+#source("../../../lib/io/string_stream.dart");
+#source("../../../lib/io/stream_util.dart");
+#source("../../../lib/io/http.dart");
+#source("../../../lib/io/http_impl.dart");
+#source("../../../lib/io/http_parser.dart");
+#source("../../../lib/io/http_utils.dart");
 
 void testParseHttpDate() {
   Date date;
diff --git a/tests/standalone/io/http_headers_test.dart b/tests/standalone/io/http_headers_test.dart
index fe1c11f..feb579a 100644
--- a/tests/standalone/io/http_headers_test.dart
+++ b/tests/standalone/io/http_headers_test.dart
@@ -4,15 +4,15 @@
 
 #import('dart:math');
 
-#source("../../../runtime/bin/input_stream.dart");
-#source("../../../runtime/bin/output_stream.dart");
-#source("../../../runtime/bin/chunked_stream.dart");
-#source("../../../runtime/bin/string_stream.dart");
-#source("../../../runtime/bin/stream_util.dart");
-#source("../../../runtime/bin/http.dart");
-#source("../../../runtime/bin/http_impl.dart");
-#source("../../../runtime/bin/http_parser.dart");
-#source("../../../runtime/bin/http_utils.dart");
+#source("../../../lib/io/input_stream.dart");
+#source("../../../lib/io/output_stream.dart");
+#source("../../../lib/io/chunked_stream.dart");
+#source("../../../lib/io/string_stream.dart");
+#source("../../../lib/io/stream_util.dart");
+#source("../../../lib/io/http.dart");
+#source("../../../lib/io/http_impl.dart");
+#source("../../../lib/io/http_parser.dart");
+#source("../../../lib/io/http_utils.dart");
 
 void testMultiValue() {
   _HttpHeaders headers = new _HttpHeaders();
diff --git a/tests/standalone/io/http_parser_test.dart b/tests/standalone/io/http_parser_test.dart
index 456ffc2..1c6538d 100644
--- a/tests/standalone/io/http_parser_test.dart
+++ b/tests/standalone/io/http_parser_test.dart
@@ -5,7 +5,7 @@
 #import('dart:math');
 #import('dart:scalarlist');
 
-#source("../../../runtime/bin/http_parser.dart");
+#source("../../../lib/io/http_parser.dart");
 
 class HttpParserTest {
   static void runAllTests() {
@@ -18,7 +18,7 @@
   static void _testParseRequest(String request,
                                 String expectedMethod,
                                 String expectedUri,
-                                {int expectedContentLength: -1,
+                                {int expectedContentLength: 0,
                                  int expectedBytesReceived: 0,
                                  Map expectedHeaders: null,
                                  bool chunked: false,
diff --git a/tests/standalone/io/mime_multipart_parser_test.dart b/tests/standalone/io/mime_multipart_parser_test.dart
index d349a4f..b46e5d1 100644
--- a/tests/standalone/io/mime_multipart_parser_test.dart
+++ b/tests/standalone/io/mime_multipart_parser_test.dart
@@ -4,8 +4,8 @@
 
 #import('dart:math');
 
-#source("../../../runtime/bin/http_parser.dart");
-#source("../../../runtime/bin/mime_multipart_parser.dart");
+#source("../../../lib/io/http_parser.dart");
+#source("../../../lib/io/mime_multipart_parser.dart");
 
 void testParse(String message,
                String boundary,
diff --git a/tests/standalone/io/process_broken_pipe_test.dart b/tests/standalone/io/process_broken_pipe_test.dart
index e56ab14..611f850 100644
--- a/tests/standalone/io/process_broken_pipe_test.dart
+++ b/tests/standalone/io/process_broken_pipe_test.dart
@@ -15,11 +15,14 @@
     // Ignore error on stdin.
     process.stdin.onError = (e) => null;
 
+    // Drain stdout and stderr.
+    process.stdout.onData = () => process.stdout.read();
+    process.stderr.onData = () => process.stderr.read();
+
     // Write to the stdin after the process is terminated to test
     // writing to a broken pipe.
     process.onExit = (code) {
       Expect.isFalse(process.stdin.write([0]));
-      process.close();
     };
   });
 }
diff --git a/tests/standalone/io/process_check_arguments_test.dart b/tests/standalone/io/process_check_arguments_test.dart
index cc0f5e7..1e97c8d 100644
--- a/tests/standalone/io/process_check_arguments_test.dart
+++ b/tests/standalone/io/process_check_arguments_test.dart
@@ -10,8 +10,10 @@
   future.then((process) {
     process.onExit = (exitCode) {
       Expect.equals(0, exitCode);
-      process.close();
     };
+    // Drain stdout and stderr.
+    process.stdout.onData = process.stdout.read;
+    process.stderr.onData = process.stderr.read;
   });
 }
 
diff --git a/tests/standalone/io/process_exit_negative_test.dart b/tests/standalone/io/process_exit_negative_test.dart
index 0e5e445..caf5cfb 100644
--- a/tests/standalone/io/process_exit_negative_test.dart
+++ b/tests/standalone/io/process_exit_negative_test.dart
@@ -13,6 +13,8 @@
                             const ["0", "0", "0", "0"]);
   p.onExit = (int s) {
     print(a.toString());  // Should cause a compilation error here.
-    p.close();
   };
+  // Drain stdout and stderr.
+  p.stdout.onData = p.stdout.read;
+  p.stderr.onData = p.stderr.read;
 }
diff --git a/tests/standalone/io/process_exit_test.dart b/tests/standalone/io/process_exit_test.dart
index 84e5865..a745bfe 100644
--- a/tests/standalone/io/process_exit_test.dart
+++ b/tests/standalone/io/process_exit_test.dart
@@ -14,8 +14,9 @@
   future.then((process) {
     process.onExit = (int exitCode) {
       Expect.equals(exitCode, 99);
-      process.close();
     };
+    process.stdout.onData = process.stdout.read;
+    process.stderr.onData = process.stderr.read;
   });
 }
 
diff --git a/tests/standalone/io/process_path_environment_test.dart b/tests/standalone/io/process_path_environment_test.dart
new file mode 100644
index 0000000..0a29708
--- /dev/null
+++ b/tests/standalone/io/process_path_environment_test.dart
@@ -0,0 +1,27 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// Test that the executable is looked up on the user's PATH when spawning a
+// process and environment variables are passed in.
+
+#import('dart:io');
+
+main() {
+  // Pick an app that we expect to be on the PATH that returns 0 when run with
+  // no arguments.
+  var executable = 'true';
+  var args = [];
+  if (Platform.operatingSystem == 'windows') {
+    executable = 'cmd.exe';
+    args = ['/C', 'echo', '"ok"'];
+  }
+
+  var options = new ProcessOptions();
+  options.environment = new Map.from(Platform.environment);
+  options.environment['whatever'] = 'something';
+
+  Process.run(executable, args, options).then((result) {
+    Expect.equals(0, result.exitCode);
+  });
+}
diff --git a/tests/standalone/io/process_path_test.dart b/tests/standalone/io/process_path_test.dart
new file mode 100644
index 0000000..03debe3
--- /dev/null
+++ b/tests/standalone/io/process_path_test.dart
@@ -0,0 +1,24 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// Test that the executable is looked up on the user's PATH when spawning a
+// process.
+
+#import('dart:io');
+
+main() {
+  // Pick an app that we expect to be on the PATH that returns 0 when run with
+  // no arguments.
+  var executable = 'true';
+  var args = [];
+  if (Platform.operatingSystem == 'windows') {
+    executable = 'cmd.exe';
+    args = ['/C', 'echo', '"ok"'];
+  }
+
+  var options = new ProcessOptions();
+  Process.run(executable, args).then((result) {
+    Expect.equals(0, result.exitCode);
+  });
+}
diff --git a/tests/standalone/io/process_segfault_test.dart b/tests/standalone/io/process_segfault_test.dart
index 541a4f6..e535a69 100644
--- a/tests/standalone/io/process_segfault_test.dart
+++ b/tests/standalone/io/process_segfault_test.dart
@@ -14,8 +14,9 @@
   future.then((process) {
     process.onExit = (int exitCode) {
       Expect.isTrue(exitCode != 0);
-      process.close();
     };
+    process.stdout.onData = process.stdout.read;
+    process.stderr.onData = process.stderr.read;
   });
 }
 
diff --git a/tests/standalone/io/process_stderr_test.dart b/tests/standalone/io/process_stderr_test.dart
index 8cd987f..ccf3187 100644
--- a/tests/standalone/io/process_stderr_test.dart
+++ b/tests/standalone/io/process_stderr_test.dart
@@ -23,14 +23,13 @@
     List<int> data = "ABCDEFGHI\n".charCodes;
     final int dataSize = data.length;
 
-    InputStream input = process.stderr;
-    OutputStream output = process.stdin;
+    InputStream err = process.stderr;
 
     int received = 0;
     List<int> buffer = [];
 
     void readData() {
-      buffer.addAll(input.read());
+      buffer.addAll(err.read());
       for (int i = received;
            i < min(data.length, buffer.length) - 1;
            i++) {
@@ -43,17 +42,14 @@
           Expect.equals(13, buffer[dataSize - 1]);
           Expect.equals(10, buffer[dataSize]);
           buffer.removeLast();
-          process.close();
-        } else if (received === dataSize) {
-          process.close();
         }
       }
     }
 
-    output.write(data);
-    output.close();
-    input.onData = readData;
-
+    process.stdout.onData = process.stdout.read;
+    process.stdin.write(data);
+    process.stdin.close();
+    err.onData = readData;
   });
 }
 
diff --git a/tests/standalone/io/process_stdout_test.dart b/tests/standalone/io/process_stdout_test.dart
index ecebe73..048deb3 100644
--- a/tests/standalone/io/process_stdout_test.dart
+++ b/tests/standalone/io/process_stdout_test.dart
@@ -23,14 +23,13 @@
     List<int> data = "ABCDEFGHI\n".charCodes;
     final int dataSize = data.length;
 
-    InputStream input = process.stdout;
-    OutputStream output = process.stdin;
+    InputStream out = process.stdout;
 
     int received = 0;
     List<int> buffer = [];
 
     void readData() {
-      buffer.addAll(input.read());
+      buffer.addAll(out.read());
       for (int i = received;
            i < min(data.length, buffer.length) - 1;
            i++) {
@@ -43,16 +42,14 @@
           Expect.equals(13, buffer[dataSize - 1]);
           Expect.equals(10, buffer[dataSize]);
           buffer.removeLast();
-          process.close();
-        } else if (received === dataSize) {
-          process.close();
         }
       }
     }
 
-    output.write(data);
-    output.close();
-    input.onData = readData;
+    process.stdin.write(data);
+    process.stdin.close();
+    out.onData = readData;
+    process.stderr.onData = process.stderr.read;
   });
 }
 
diff --git a/tests/standalone/io/process_working_directory_test.dart b/tests/standalone/io/process_working_directory_test.dart
index 1255518..6040b53 100644
--- a/tests/standalone/io/process_working_directory_test.dart
+++ b/tests/standalone/io/process_working_directory_test.dart
@@ -27,9 +27,10 @@
     processFuture.then((process) {
       process.onExit = (int exitCode) {
         Expect.equals(exitCode, 99);
-        process.close();
         directory.deleteSync();
       };
+      process.stdout.onData = process.stdout.read;
+      process.stderr.onData = process.stderr.read;
     });
     processFuture.handleException((error) {
       directory.deleteSync();
@@ -48,7 +49,6 @@
                                options);
     future.then((process) {
       Expect.fail("bad process completed");
-      process.close();
       directory.deleteSync();
     });
 
diff --git a/tests/standalone/io/socket_exception_test.dart b/tests/standalone/io/socket_exception_test.dart
index 67f4ef4..46d6c13 100644
--- a/tests/standalone/io/socket_exception_test.dart
+++ b/tests/standalone/io/socket_exception_test.dart
@@ -128,7 +128,7 @@
       try {
         List<int> buffer = new List<int>(10);
         client.readList(buffer, -1, 1);
-      } on IndexOutOfRangeException catch (ex) {
+      } on RangeError catch (ex) {
         exceptionCaught = true;
       } on Exception catch (ex) {
         wrongExceptionCaught = true;
@@ -140,7 +140,7 @@
       try {
         List<int> buffer = new List<int>(10);
         client.readList(buffer, 0, -1);
-      } on IndexOutOfRangeException catch (ex) {
+      } on RangeError catch (ex) {
         exceptionCaught = true;
       } on Exception catch (ex) {
         wrongExceptionCaught = true;
@@ -152,7 +152,7 @@
       try {
         List<int> buffer = new List<int>(10);
         client.writeList(buffer, -1, 1);
-      } on IndexOutOfRangeException catch (ex) {
+      } on RangeError catch (ex) {
         exceptionCaught = true;
       } on Exception catch (ex) {
         wrongExceptionCaught = true;
@@ -164,7 +164,7 @@
       try {
         List<int> buffer = new List<int>(10);
         client.writeList(buffer, 0, -1);
-      } on IndexOutOfRangeException catch (ex) {
+      } on RangeError catch (ex) {
         exceptionCaught = true;
       } on Exception catch (ex) {
         wrongExceptionCaught = true;
diff --git a/tests/standalone/io/stream_pipe_test.dart b/tests/standalone/io/stream_pipe_test.dart
index 42f86de..4683794 100644
--- a/tests/standalone/io/stream_pipe_test.dart
+++ b/tests/standalone/io/stream_pipe_test.dart
@@ -78,11 +78,11 @@
       String srcFileName =
           getDataFilename("tests/standalone/io/readline_test1.dat");
 
-      SocketOutputStream socketOutput = _socket.outputStream;
+      OutputStream socketOutput = _socket.outputStream;
       InputStream fileInput = new File(srcFileName).openInputStream();
 
       fileInput.onClosed = () {
-        SocketInputStream socketInput = _socket.inputStream;
+        InputStream socketInput = _socket.inputStream;
         var tempDir = new Directory('').createTempSync();
         var dstFileName = tempDir.path.concat("/readline_test1.dat");
         var dstFile = new File(dstFileName);
diff --git a/tests/standalone/io/string_stream_test.dart b/tests/standalone/io/string_stream_test.dart
index ade6c8d..e9bb7af 100644
--- a/tests/standalone/io/string_stream_test.dart
+++ b/tests/standalone/io/string_stream_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #import("dart:io");
+#import("dart:isolate");
 
 void testUtf8() {
   List<int> data = [0x01,
@@ -278,7 +279,7 @@
   List<int> read([int len]) => null;
   int readInto(List<int> buffer, [int offset, int len]) => 0;
   int available() => 0;
-  void pipe(OutputStream output, [bool close]){ }
+  void pipe(OutputStream output, {bool close: true}){ }
   void close() { }
   bool get closed => true;
   void set onData(void callback()) { }
@@ -298,6 +299,23 @@
   Expect.equals(1, errors);
 }
 
+testEncodingErrorWithHandler() {
+  var port = new ReceivePort();    
+  var errors = 0;
+  var expected = [206, 187, 120, 46, 32, 120, 10];
+  ListInputStream input = new ListInputStream();
+  input.write(expected);
+  var stringStream = new StringInputStream(input, Encoding.ASCII);
+  stringStream.onData = () {
+    Expect.fail("We should not get any data");
+  };
+  stringStream.onError = (e) {
+    port.close();
+    Expect.isTrue(e is Exception);
+  };
+}
+
+
 main() {
   testUtf8();
   testLatin1();
@@ -307,4 +325,5 @@
   testReadChunks();
   testReadMixed();
   testErrorHandler();
+  testEncodingErrorWithHandler();
 }
diff --git a/tests/standalone/io/url_encoding_test.dart b/tests/standalone/io/url_encoding_test.dart
index 4cf2eaa..7148c77 100644
--- a/tests/standalone/io/url_encoding_test.dart
+++ b/tests/standalone/io/url_encoding_test.dart
@@ -3,15 +3,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #import("dart:utf");
-#source("../../../runtime/bin/input_stream.dart");
-#source("../../../runtime/bin/output_stream.dart");
-#source("../../../runtime/bin/chunked_stream.dart");
-#source("../../../runtime/bin/string_stream.dart");
-#source("../../../runtime/bin/stream_util.dart");
-#source("../../../runtime/bin/http.dart");
-#source("../../../runtime/bin/http_impl.dart");
-#source("../../../runtime/bin/http_parser.dart");
-#source("../../../runtime/bin/http_utils.dart");
+#source("../../../lib/io/input_stream.dart");
+#source("../../../lib/io/output_stream.dart");
+#source("../../../lib/io/chunked_stream.dart");
+#source("../../../lib/io/string_stream.dart");
+#source("../../../lib/io/stream_util.dart");
+#source("../../../lib/io/http.dart");
+#source("../../../lib/io/http_impl.dart");
+#source("../../../lib/io/http_parser.dart");
+#source("../../../lib/io/http_utils.dart");
 
 void testParseEncodedString() {
   String encodedString = 'foo+bar%20foobar%25%26';
diff --git a/tests/standalone/io/web_socket_protocol_processor_test.dart b/tests/standalone/io/web_socket_protocol_processor_test.dart
index 609f7a8..568a705 100644
--- a/tests/standalone/io/web_socket_protocol_processor_test.dart
+++ b/tests/standalone/io/web_socket_protocol_processor_test.dart
@@ -4,8 +4,8 @@
 
 #import("dart:math");
 
-#source("../../../runtime/bin/websocket.dart");
-#source("../../../runtime/bin/websocket_impl.dart");
+#source("../../../lib/io/websocket.dart");
+#source("../../../lib/io/websocket_impl.dart");
 
 class WebSocketFrame {
   WebSocketFrame(int opcode, List<int> data);
diff --git a/tests/standalone/standalone.status b/tests/standalone/standalone.status
index cb5fd3e..265fae8 100644
--- a/tests/standalone/standalone.status
+++ b/tests/standalone/standalone.status
@@ -6,21 +6,6 @@
 
 package/invalid_uri_test: Fail, OK # Fails intentionally
 
-[ $runtime == vm ]
-# The following tests require files in the tools-directory to be modified.
-# However the tools directory uses its own version of dart-binary. We reenable
-# these tests when we update the dart-binary.
-status_expression_test: Fail, OK
-io/status_file_parser_test: Fail, OK
-io/test_runner_exit_code_test: Fail, OK
-io/test_runner_test: Fail, OK
-
-[ $compiler == dart2js || ($compiler == none && $runtime == drt) ]
-# The following tests require files in the tools-directory to be modified.
-# However the tools directory uses its own version of dart-binary. We reenable
-# these tests when we update the dart-binary.
-status_expression_test: Fail, OK
-
 [ $runtime == vm && $checked ]
 # These tests have type errors on purpose.
 io/process_invalid_arguments_test: Fail, OK
@@ -64,6 +49,7 @@
 *: Skip
 
 [ $compiler == dart2js ]
+typed_array_test: Skip # This is a VM test
 float_array_test: Skip # This is a VM test
 int_array_test: Skip  # This is a VM test
 medium_integer_test: Fail, OK # cannot resolve type Mint
diff --git a/tests/standalone/typed_array_test.dart b/tests/standalone/typed_array_test.dart
new file mode 100644
index 0000000..993b232
--- /dev/null
+++ b/tests/standalone/typed_array_test.dart
@@ -0,0 +1,342 @@
+// 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.
+//
+// Dart test program for testing native float arrays.
+
+// Library tag to be able to run in html test framework.
+#library('TypedArray');
+#import('dart:isolate');
+#import('dart:scalarlist');
+
+void main() {
+  int8_receiver();
+  uint8_receiver();
+  int16_receiver();
+  uint16_receiver();
+  int32_receiver();
+  uint32_receiver();
+  int64_receiver();
+  uint64_receiver();
+  float32_receiver();
+  float64_receiver();
+}
+
+// Int8 array.
+Int8List initInt8() {
+  var int8 = new Int8List(2);
+  int8[0] = 10;
+  int8[1] = 100;
+  return int8;
+}
+Int8List int8 = initInt8();
+
+void int8_receiver() {
+  var sp = spawnFunction(int8_sender);
+  sp.call(int8.length).then((a) {
+    Expect.equals(int8.length, a.length);
+    for (int i = 0; i < a.length; i++) {
+      Expect.equals(int8[i], a[i]);
+    }
+    print("int8_receiver");
+  });
+}
+
+int8_sender() {
+  port.receive((len, r) {
+    Expect.equals(int8.length, len);
+    var a = new Int8List(len);
+    for (int i = 0; i < len; i++) {
+      a[i] = int8[i];
+    }
+    r.send(a);
+  });
+}
+
+
+// Uint8 array.
+Uint8List initUint8() {
+  var uint8 = new Uint8List(2);
+  uint8[0] = 0xff;
+  uint8[1] = 0x7f;
+  return uint8;
+}
+Uint8List uint8 = initUint8();
+
+void uint8_receiver() {
+  var sp = spawnFunction(uint8_sender);
+  sp.call(uint8.length).then((a) {
+    Expect.equals(uint8.length, a.length);
+    for (int i = 0; i < a.length; i++) {
+      Expect.equals(uint8[i], a[i]);
+    }
+    print("uint8_receiver");
+  });
+}
+
+uint8_sender() {
+  port.receive((len, r) {
+    Expect.equals(uint8.length, len);
+    var a = new Uint8List(len);
+    for (int i = 0; i < len; i++) {
+      a[i] = uint8[i];
+    }
+    r.send(a);
+  });
+}
+
+
+// Int16 array.
+Int16List initInt16() {
+  var int16 = new Int16List(2);
+  int16[0] = 1000;
+  int16[1] = 10000;
+  return int16;
+}
+Int16List int16 = initInt16();
+
+void int16_receiver() {
+  var sp = spawnFunction(int16_sender);
+  sp.call(int16.length).then((a) {
+    Expect.equals(int16.length, a.length);
+    for (int i = 0; i < a.length; i++) {
+      Expect.equals(int16[i], a[i]);
+    }
+    print("int16_receiver");
+  });
+}
+
+int16_sender() {
+  port.receive((len, r) {
+    Expect.equals(int16.length, len);
+    var a = new Int16List(len);
+    for (int i = 0; i < len; i++) {
+      a[i] = int16[i];
+    }
+    r.send(a);
+  });
+}
+
+
+// Uint16 array.
+Uint16List initUint16() {
+  var uint16 = new Uint16List(2);
+  uint16[0] = 0xffff;
+  uint16[1] = 0x7fff;
+  return uint16;
+}
+Uint16List uint16 = initUint16();
+
+void uint16_receiver() {
+  var sp = spawnFunction(uint16_sender);
+  sp.call(uint16.length).then((a) {
+    Expect.equals(uint16.length, a.length);
+    for (int i = 0; i < a.length; i++) {
+      Expect.equals(uint16[i], a[i]);
+    }
+    print("uint16_receiver");
+  });
+}
+
+uint16_sender() {
+  port.receive((len, r) {
+    Expect.equals(uint16.length, len);
+    var a = new Uint16List(len);
+    for (int i = 0; i < len; i++) {
+      a[i] = uint16[i];
+    }
+    r.send(a);
+  });
+}
+
+
+// Int32 array.
+Int32List initInt32() {
+  var int32 = new Int32List(2);
+  int32[0] = 100000;
+  int32[1] = 1000000;
+  return int32;
+}
+Int32List int32 = initInt32();
+
+void int32_receiver() {
+  var sp = spawnFunction(int32_sender);
+  sp.call(int32.length).then((a) {
+    Expect.equals(int32.length, a.length);
+    for (int i = 0; i < a.length; i++) {
+      Expect.equals(int32[i], a[i]);
+    }
+    print("int32_receiver");
+  });
+}
+
+int32_sender() {
+  port.receive((len, r) {
+    Expect.equals(int32.length, len);
+    var a = new Int32List(len);
+    for (int i = 0; i < len; i++) {
+      a[i] = int32[i];
+    }
+    r.send(a);
+  });
+}
+
+
+// Uint32 array.
+Uint32List initUint32() {
+  var uint32 = new Uint32List(2);
+  uint32[0] = 0xffffffff;
+  uint32[1] = 0x7fffffff;
+  return uint32;
+}
+Uint32List uint32 = initUint32();
+
+void uint32_receiver() {
+  var sp = spawnFunction(uint32_sender);
+  sp.call(uint32.length).then((a) {
+    Expect.equals(uint32.length, a.length);
+    for (int i = 0; i < a.length; i++) {
+      Expect.equals(uint32[i], a[i]);
+    }
+    print("uint32_receiver");
+  });
+}
+
+uint32_sender() {
+  port.receive((len, r) {
+    Expect.equals(uint32.length, len);
+    var a = new Uint32List(len);
+    for (int i = 0; i < len; i++) {
+      a[i] = uint32[i];
+    }
+    r.send(a);
+  });
+}
+
+
+// Int64 array.
+Int64List initInt64() {
+  var int64 = new Int64List(2);
+  int64[0] = 10000000;
+  int64[1] = 100000000;
+  return int64;
+}
+Int64List int64 = initInt64();
+
+void int64_receiver() {
+  var sp = spawnFunction(int64_sender);
+  sp.call(int64.length).then((a) {
+    Expect.equals(int64.length, a.length);
+    for (int i = 0; i < a.length; i++) {
+      Expect.equals(int64[i], a[i]);
+    }
+    print("int64_receiver");
+  });
+}
+
+int64_sender() {
+  port.receive((len, r) {
+    Expect.equals(int64.length, len);
+    var a = new Int64List(len);
+    for (int i = 0; i < len; i++) {
+      a[i] = int64[i];
+    }
+    r.send(a);
+  });
+}
+
+
+// Uint64 array.
+Uint64List initUint64() {
+  var uint64 = new Uint64List(2);
+  uint64[0] = 0xffffffffffffffff;
+  uint64[1] = 0x7fffffffffffffff;
+  return uint64;
+}
+Uint64List uint64 = initUint64();
+
+void uint64_receiver() {
+  var sp = spawnFunction(uint64_sender);
+  sp.call(uint64.length).then((a) {
+    Expect.equals(uint64.length, a.length);
+    for (int i = 0; i < a.length; i++) {
+      Expect.equals(uint64[i], a[i]);
+    }
+    print("uint64_receiver");
+  });
+}
+
+uint64_sender() {
+  port.receive((len, r) {
+    Expect.equals(uint64.length, len);
+    var a = new Uint64List(len);
+    for (int i = 0; i < len; i++) {
+      a[i] = uint64[i];
+    }
+    r.send(a);
+  });
+}
+
+
+// Float32 Array.
+Float32List initFloat32() {
+  var float32 = new Float32List(2);
+  float32[0] = 1.0;
+  float32[1] = 2.0;
+  return float32;
+}
+Float32List float32 = new Float32List(2);
+
+void float32_receiver() {
+  var sp = spawnFunction(float32_sender);
+  sp.call(float32.length).then((a) {
+    Expect.equals(float32.length, a.length);
+    for (int i = 0; i < a.length; i++) {
+      Expect.equals(float32[i], a[i]);
+    }
+    print("float32_receiver");
+  });
+}
+
+float32_sender() {
+  port.receive((len, r) {
+    Expect.equals(float32.length, len);
+    var a = new Float32List(len);
+    for (int i = 0; i < len; i++) {
+      a[i] = float32[i];
+    }
+    r.send(a);
+  });
+}
+
+
+// Float64 Array.
+Float64List initFloat64() {
+  var float64 = new Float64List(2);
+  float64[0] = 101.234;
+  float64[1] = 201.765;
+  return float64;
+}
+Float64List float64 = initFloat64();
+
+void float64_receiver() {
+  var sp = spawnFunction(float64_sender);
+  sp.call(float64.length).then((a) {
+    Expect.equals(float64.length, a.length);
+    for (int i = 0; i < a.length; i++) {
+      Expect.equals(float64[i], a[i]);
+    }
+    print("float64_receiver");
+  });
+}
+
+float64_sender() {
+  port.receive((len, r) {
+    Expect.equals(float64.length, len);
+    var a = new Float64List(len);
+    for (int i = 0; i < len; i++) {
+      a[i] = float64[i];
+    }
+    r.send(a);
+  });
+}
diff --git a/tests/utils/dummy_compiler_test.dart b/tests/utils/dummy_compiler_test.dart
index dab13b5..7389be8 100644
--- a/tests/utils/dummy_compiler_test.dart
+++ b/tests/utils/dummy_compiler_test.dart
@@ -33,6 +33,8 @@
                   eqNullB(a) {}""";
     } else if (uri.path.endsWith('_patch.dart')) {
       source = '';
+    } else if (uri.path.endsWith('js_helper.dart')) {
+      source = 'library jshelper; class JSInvocationMirror {}';
     } else {
       source = "#library('lib');";
     }
diff --git a/tests/utils/recursive_import_test.dart b/tests/utils/recursive_import_test.dart
index 2702f67..fdf5fb4 100644
--- a/tests/utils/recursive_import_test.dart
+++ b/tests/utils/recursive_import_test.dart
@@ -25,6 +25,7 @@
 setRuntimeTypeInfo(o, i) {}
 eqNull(a) {}
 eqNullB(a) {}
+class JSInvocationMirror {}  // Should be in helper.
 """;
 
 const String RECURSIVE_MAIN = """
diff --git a/tests/utils/utils.status b/tests/utils/utils.status
index 0ccca1e..d06160b 100644
--- a/tests/utils/utils.status
+++ b/tests/utils/utils.status
@@ -8,6 +8,7 @@
 [ $compiler == dart2js ]
 dummy_compiler_test: Slow, Pass
 recursive_import_test: Slow, Pass
+utf8_test: Fail # issue 6418
 
 [ $compiler == none && $runtime == drt ]
 dummy_compiler_test: Fail # http://dartbug.com/2264
@@ -16,6 +17,9 @@
 [ $compiler == dart2js && $browser ]
 *: Skip
 
+[ $runtime == dartium || $runtime == drt ]
+utf8_test: Fail # TRIAGE
+
 [ $runtime == vm ]
 *_layout_test: Skip
 
diff --git a/tools/VERSION b/tools/VERSION
index b629afa..34007a7 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -1,4 +1,4 @@
 MAJOR 0
 MINOR 2
-BUILD 1
-PATCH 2
+BUILD 2
+PATCH 0
diff --git a/tools/bots/android.py b/tools/bots/android.py
index 5ccc4e9..b320ce0 100644
--- a/tools/bots/android.py
+++ b/tools/bots/android.py
@@ -1,8 +1,8 @@
 #!/usr/bin/python
 
-# Copyright (c) 2012 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
+# 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.
 
 """
 Android buildbot steps.
diff --git a/tools/bots/bot.py b/tools/bots/bot.py
index 5bde985..a57877e 100644
--- a/tools/bots/bot.py
+++ b/tools/bots/bot.py
@@ -1,8 +1,8 @@
 #!/usr/bin/python
 
-# Copyright (c) 2012 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
+# 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.
 
 """
 Shared code for use in the buildbot scripts.
diff --git a/tools/bots/compiler.py b/tools/bots/compiler.py
index 35f0d795..c752f8d 100644
--- a/tools/bots/compiler.py
+++ b/tools/bots/compiler.py
@@ -1,8 +1,8 @@
 #!/usr/bin/python
 
-# Copyright (c) 2011 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
+# 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.
 
 """
 Dart2js buildbot steps
@@ -294,5 +294,19 @@
     CleanUpTemporaryFiles(build_info.system, build_info.runtime)
 
 
+def BuildCompiler(build_info):
+  """
+  Builds the SDK.
+
+  - build_info: the buildInfo object, containing information about what sort of
+      build and test to be run.
+  """
+  with bot.BuildStep('Build SDK and d8'):
+    args = [sys.executable, './tools/build.py', '--mode=' + build_info.mode,
+            'dart2js_bot']
+    print 'Build SDK and d8: %s' % (' '.join(args))
+    bot.RunProcess(args)
+
+
 if __name__ == '__main__':
-  bot.RunBot(GetBuildInfo, RunCompilerTests)
+  bot.RunBot(GetBuildInfo, RunCompilerTests, build_step=BuildCompiler)
diff --git a/tools/bots/pub.py b/tools/bots/pub.py
index 41d6745..9d40778 100755
--- a/tools/bots/pub.py
+++ b/tools/bots/pub.py
@@ -1,8 +1,8 @@
 #!/usr/bin/python
 
-# Copyright (c) 2012 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
+# 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.
 
 """
 Pub buildbot steps.
diff --git a/tools/create_sdk.py b/tools/create_sdk.py
index 841c99b..857ba0e 100755
--- a/tools/create_sdk.py
+++ b/tools/create_sdk.py
@@ -23,6 +23,7 @@
 # ......dart_debugger_api.h
 # ....lib/
 # ......_internal/
+# ......collection/
 # ......core/
 # ......coreimpl/
 # ......crypto/
@@ -148,9 +149,6 @@
 
 def Main(argv):
   # Pull in all of the gpyi files which will be munged into the sdk.
-  io_runtime_sources = \
-    (eval(open("runtime/bin/io_sources.gypi").read()))['sources']
-
   HOME = dirname(dirname(realpath(__file__)))
 
   SDK = argv[1]
@@ -221,37 +219,13 @@
   os.makedirs(LIB)
 
   #
-  # Create and populate lib/io.
-  #
-  io_dest_dir = join(LIB, 'io')
-  os.makedirs(io_dest_dir)
-  os.makedirs(join(io_dest_dir, 'runtime'))
-  for filename in io_runtime_sources:
-    assert filename.endswith('.dart')
-    if filename == 'io.dart':
-      copyfile(join(HOME, 'runtime', 'bin', filename),
-               join(io_dest_dir, 'io_runtime.dart'))
-    else:
-      copyfile(join(HOME, 'runtime', 'bin', filename),
-               join(io_dest_dir, 'runtime', filename))
-
-  # Construct lib/io/io_runtime.dart from whole cloth.
-  dest_file = open(join(io_dest_dir, 'io_runtime.dart'), 'a')
-  for filename in io_runtime_sources:
-    assert filename.endswith('.dart')
-    if filename == 'io.dart':
-      continue
-    dest_file.write('#source("runtime/' + filename + '");\n')
-  dest_file.close()
-
-  #
   # Create and populate lib/{core, crypto, isolate, json, uri, utf, ...}.
   #
 
   os.makedirs(join(LIB, 'html'))
-  for library in ['_internal', 'core', 'coreimpl', 'crypto', 'isolate',
-                  join('html', 'dart2js'), join('html', 'dartium'), 'json',
-                  'math', 'mirrors', 'scalarlist', 'uri', 'utf']:
+  for library in ['_internal', 'collection', 'core', 'coreimpl', 'crypto', 'io',
+                  'isolate', join('html', 'dart2js'), join('html', 'dartium'),
+                  'json', 'math', 'mirrors', 'scalarlist', 'uri', 'utf']:
     copytree(join(HOME, 'lib', library), join(LIB, library),
              ignore=ignore_patterns('*.svn', 'doc', '*.py', '*.gypi', '*.sh'))
 
@@ -278,10 +252,6 @@
         [join(LIB, '_internal', 'libraries.dart')],
         [('"compiler/', '"../pkg/compiler/')])
 
-  ReplaceInFiles(
-        [join(PKG, 'compiler', 'implementation', 'lib', 'io.dart')],
-        [('../../runtime/bin', '../../lib/io/runtime')])
-
   # Fixup dartdoc
   # TODO(dgrove): Remove this once issue 4788 is addressed.
   ReplaceInFiles([
diff --git a/tools/ddbg.dart b/tools/ddbg.dart
index eaf0258..e51516f 100644
--- a/tools/ddbg.dart
+++ b/tools/ddbg.dart
@@ -62,7 +62,7 @@
 }
 
 
-Future sendCmd(Map<String, Dynamic> cmd) {
+Future sendCmd(Map<String, dynamic> cmd) {
   var completer = new Completer();
   int id = cmd["id"];
   outstandingCommands[id] = completer;
@@ -529,12 +529,12 @@
 void main() {
   outstandingCommands = new Map<int, Completer>();
   vmSock = new Socket("127.0.0.1", 5858);
-  vmStream = new SocketOutputStream(vmSock);
+  vmStream = vmSock.outputStream;
   var stdinStream = new StringInputStream(stdin);
   stdinStream.onLine = () {
     processCommand(stdinStream.readLine());
   };
-  var vmInStream = new SocketInputStream(vmSock);
+  var vmInStream = vmSock.inputStream;
   vmInStream.onData = () {
     String s = decodeUtf8(vmInStream.read());
     processVmData(s);
diff --git a/tools/gyp/configurations_msvs.gypi b/tools/gyp/configurations_msvs.gypi
index 023cec1..4a21b2f 100644
--- a/tools/gyp/configurations_msvs.gypi
+++ b/tools/gyp/configurations_msvs.gypi
@@ -17,6 +17,7 @@
             'ExceptionHandling': '0',
             'RuntimeTypeInfo': 'false',
             'OmitFramePointers': 'false',
+            'RuntimeLibrary': '1',  # /MTd - Multi-threaded, static (debug)
           },
           'VCLinkerTool': {
             'LinkIncremental': '2',
@@ -37,6 +38,7 @@
             'RuntimeTypeInfo': 'false',
             'OmitFramePointers': 'false',
             'StringPooling': 'true',
+            'RuntimeLibrary': '0',  # /MT - Multi-threaded, static
           },
           'VCLinkerTool': {
             'LinkIncremental': '1',
diff --git a/tools/revert.py b/tools/revert.py
old mode 100644
new mode 100755
diff --git a/tools/test-runtime.dart b/tools/test-runtime.dart
index ec1a450..b9663ff 100755
--- a/tools/test-runtime.dart
+++ b/tools/test-runtime.dart
@@ -68,7 +68,7 @@
 
   var configurationIterator = configurations.iterator();
   void enqueueConfiguration(ProcessQueue queue) {
-    if (!configurationIterator.hasNext()) return;
+    if (!configurationIterator.hasNext) return;
 
     var conf = configurationIterator.next();
     if (selectors.containsKey('co19')) {
@@ -92,7 +92,13 @@
   // Start global http server that serves the entire dart repo.
   // The http server is available on localhost:9876 for any
   // test that needs to load resources from the repo over http.
-  startHttpServer('127.0.0.1', 9876);
+  if (!listTests) {
+    // Only start the server if we are running browser tests.
+    var runningBrowserTests = configurations.some((config) {
+      return TestUtils.isBrowserRuntime(config['runtime']);
+    });
+    if (runningBrowserTests) startHttpServer('127.0.0.1', 9876);
+  }
 
   // Start process queue.
   new ProcessQueue(
diff --git a/tools/test.dart b/tools/test.dart
index 439aaad..2e4990d 100755
--- a/tools/test.dart
+++ b/tools/test.dart
@@ -99,10 +99,10 @@
 
   var configurationIterator = configurations.iterator();
   void enqueueConfiguration(ProcessQueue queue) {
-    if (!configurationIterator.hasNext()) return;
+    if (!configurationIterator.hasNext) return;
 
     var conf = configurationIterator.next();
-    for (String key in selectors.getKeys()) {
+    for (String key in selectors.keys) {
       if (key == 'co19') {
         queue.addTestSuite(new Co19TestSuite(conf));
       } else if (conf['runtime'] == 'vm' && key == 'vm') {
@@ -127,7 +127,13 @@
   // Start global http server that serves the entire dart repo.
   // The http server is available on localhost:9876 for any
   // test that needs to load resources from the repo over http.
-  if (!listTests) startHttpServer('127.0.0.1', 9876);
+  if (!listTests) {
+    // Only start the server if we are running browser tests.
+    var runningBrowserTests = configurations.some((config) {
+      return TestUtils.isBrowserRuntime(config['runtime']);
+    });
+    if (runningBrowserTests) startHttpServer('127.0.0.1', 9876);
+  }
 
   // Start process queue.
   new ProcessQueue(maxProcesses,
@@ -135,9 +141,7 @@
                    startTime,
                    printTiming,
                    enqueueConfiguration,
-                   () {
-                     if (!listTests) terminateHttpServer();
-                   },
+                   () => terminateHttpServer(),
                    verbose,
                    listTests);
 }
diff --git a/tools/testing/dart/browser_test.dart b/tools/testing/dart/browser_test.dart
index 21a4e82..fc0d05b 100644
--- a/tools/testing/dart/browser_test.dart
+++ b/tools/testing/dart/browser_test.dart
@@ -3,10 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 String getHtmlContents(String title,
-                       String controllerScript,
-                       String dartJsScript,
+                       Path controllerScript,
+                       Path dartJsScript,
                        String scriptType,
-                       String sourceScript) =>
+                       Path sourceScript) =>
 """
 <!DOCTYPE html>
 <html>
diff --git a/tools/testing/dart/co19_test.dart b/tools/testing/dart/co19_test.dart
index dba9eb6..0adda23 100644
--- a/tools/testing/dart/co19_test.dart
+++ b/tools/testing/dart/co19_test.dart
@@ -50,7 +50,7 @@
     arguments.add('co19');
     configurations.addAll(optionsParser.parse(arguments));
   }
-  if (configurations == null || configurations.isEmpty()) return;
+  if (configurations == null || configurations.isEmpty) return;
 
   var firstConfiguration = configurations[0];
   Map<String, RegExp> selectors = firstConfiguration['selectors'];
@@ -60,9 +60,9 @@
 
   var configurationIterator = configurations.iterator();
   void enqueueConfiguration(ProcessQueue queue) {
-    if (!configurationIterator.hasNext()) return;
+    if (!configurationIterator.hasNext) return;
     var configuration = configurationIterator.next();
-    for (String selector in selectors.getKeys()) {
+    for (String selector in selectors.keys) {
       if (selector == 'co19') {
         queue.addTestSuite(new Co19TestSuite(configuration));
       } else {
diff --git a/tools/testing/dart/http_server.dart b/tools/testing/dart/http_server.dart
index b939e2c..ad542d7 100644
--- a/tools/testing/dart/http_server.dart
+++ b/tools/testing/dart/http_server.dart
@@ -46,5 +46,5 @@
 }
 
 terminateHttpServer() {
-  _httpServer.close();
+  if (_httpServer != null) _httpServer.close();
 }
diff --git a/tools/testing/dart/multitest.dart b/tools/testing/dart/multitest.dart
index 93a9f0a..34551db 100644
--- a/tools/testing/dart/multitest.dart
+++ b/tools/testing/dart/multitest.dart
@@ -72,7 +72,7 @@
       ? '\n'
       : '\r\n';
   List<String> lines = contents.split(line_separator);
-  if (lines.last() == '') lines.removeLast();
+  if (lines.last == '') lines.removeLast();
   contents = null;
   Set<String> validMultitestOutcomes = new Set<String>.from(
       ['compile-time error', 'runtime error',
@@ -108,13 +108,13 @@
       }
     } else {
       testTemplate.add(line);
-      for (var test in testsAsLines.getValues()) test.add(line);
+      for (var test in testsAsLines.values) test.add(line);
     }
   }
 
   // Check that every key (other than the none case) has at least one outcome
-  for (var outcomeKey in outcomes.getKeys()) {
-    if (outcomeKey != 'none' && outcomes[outcomeKey].isEmpty()) {
+  for (var outcomeKey in outcomes.keys) {
+    if (outcomeKey != 'none' && outcomes[outcomeKey].isEmpty) {
       Expect.fail("Test ${outcomeKey} has no valid annotated outcomes.\n"
                   "Expected one of: ${validMultitestOutcomes.toString()}");
     }
@@ -125,7 +125,7 @@
   outcomes['none'] = new Set<String>();
 
   // Copy all the tests into the output map tests, as multiline strings.
-  for (String key in testsAsLines.getKeys()) {
+  for (String key in testsAsLines.keys) {
     tests[key] =
         Strings.join(testsAsLines[key], line_separator).concat(line_separator);
   }
@@ -161,7 +161,7 @@
   // except dart:, dart-ext: or /, at the beginning of a line.
   RegExp relativeImportRegExp = const RegExp(
       '^#(import|source)[(]["\'](?!(dart:|dart-ext:|/))([^"\']*)["\']');
-  while (!toSearch.isEmpty()) {
+  while (!toSearch.isEmpty) {
     var thisPass = toSearch;
     toSearch = new HashSet<Path>();
     for (Path filename in thisPass) {
@@ -219,14 +219,14 @@
   // Wait until all imports are copied before scheduling test cases.
   Futures.wait(futureCopies).then((ignored) {
     String baseFilename = filePath.filenameWithoutExtension;
-    for (String key in tests.getKeys()) {
+    for (String key in tests.keys) {
       final Path multitestFilename =
           targetDir.append('${baseFilename}_$key.dart');
       final File file = new File.fromPath(multitestFilename);
 
       file.createSync();
       RandomAccessFile openedFile = file.openSync(FileMode.WRITE);
-      var bytes = tests[key].charCodes();
+      var bytes = tests[key].charCodes;
       openedFile.writeListSync(bytes, 0, bytes.length);
       openedFile.closeSync();
       Set<String> outcome = outcomes[key];
@@ -256,12 +256,12 @@
     generatedTestDir.createSync();
   }
   var split = suiteDir.segments();
-  if (split.last() == 'src') {
+  if (split.last == 'src') {
     // TODO(sigmund): remove this once all tests are migrated to use
     // TestSuite.forDirectory.
     split.removeLast();
   }
-  String path = '${generatedTestDir.path}/${split.last()}';
+  String path = '${generatedTestDir.path}/${split.last}';
   Directory dir = new Directory(path);
   if (!dir.existsSync()) {
     dir.createSync();
diff --git a/tools/testing/dart/status_expression.dart b/tools/testing/dart/status_expression.dart
index fcc11cb..e49dc6c 100644
--- a/tools/testing/dart/status_expression.dart
+++ b/tools/testing/dart/status_expression.dart
@@ -182,7 +182,7 @@
   bool hasMore() => current != null;
 
   void advance() {
-    current = tokenIterator.hasNext() ? tokenIterator.next() : null;
+    current = tokenIterator.hasNext ? tokenIterator.next() : null;
   }
 }
 
diff --git a/tools/testing/dart/status_file_parser.dart b/tools/testing/dart/status_file_parser.dart
index ef0f819..c3b70d8 100644
--- a/tools/testing/dart/status_file_parser.dart
+++ b/tools/testing/dart/status_file_parser.dart
@@ -77,7 +77,7 @@
       Match match = StripComment.firstMatch(line);
       line = (match == null) ? "" : match[0];
       line = line.trim();
-      if (line.isEmpty()) continue;
+      if (line.isEmpty) continue;
 
       match = HeaderPattern.firstMatch(line);
       if (match != null) {
@@ -177,7 +177,7 @@
 
     // If no expectations were found the expectation is that the test
     // passes.
-    if (result.isEmpty()) {
+    if (result.isEmpty) {
       result.add(PASS);
     }
     return result;
diff --git a/tools/testing/dart/test_options.dart b/tools/testing/dart/test_options.dart
index eae9f12..97301ea 100644
--- a/tools/testing/dart/test_options.dart
+++ b/tools/testing/dart/test_options.dart
@@ -353,7 +353,7 @@
       }
       // Parse the value for the option.
       if (spec.type == 'bool') {
-        if (!value.isEmpty()) {
+        if (!value.isEmpty) {
           print('No value expected for bool option $name');
           exit(1);
         }
@@ -367,7 +367,7 @@
         }
       } else {
         assert(spec.type == 'string');
-        if (!spec.values.isEmpty()) {
+        if (!spec.values.isEmpty) {
           for (var v in value.split(',')) {
             if (spec.values.lastIndexOf(v) == -1) {
               print('Unknown value ($v) for option $name');
@@ -388,7 +388,7 @@
 
     List<Map> expandedConfigs = _expandConfigurations(configuration);
     List<Map> result = expandedConfigs.filter(_isValidConfig);
-    return result.isEmpty() ? null : result;
+    return result.isEmpty ? null : result;
   }
 
   /**
@@ -624,11 +624,11 @@
         var buffer = new StringBuffer();;
         buffer.add(name);
         if (option.type == 'bool') {
-          assert(option.values.isEmpty());
+          assert(option.values.isEmpty);
         } else {
           buffer.add(name.startsWith('--') ? '=' : ' ');
           if (option.type == 'int') {
-            assert(option.values.isEmpty());
+            assert(option.values.isEmpty);
             buffer.add('n (default: ${option.defaultValue})');
           } else {
             buffer.add('[');
diff --git a/tools/testing/dart/test_progress.dart b/tools/testing/dart/test_progress.dart
index bcd027b..44c94c8 100644
--- a/tools/testing/dart/test_progress.dart
+++ b/tools/testing/dart/test_progress.dart
@@ -143,21 +143,21 @@
         }
       }
     }
-    if (!test.output.diagnostics.isEmpty()) {
+    if (!test.output.diagnostics.isEmpty) {
       String prefix = 'diagnostics:';
       for (var s in test.output.diagnostics) {
         output.add('$prefix ${s}');
         prefix = '   ';
       }
     }
-    if (!test.output.stdout.isEmpty()) {
+    if (!test.output.stdout.isEmpty) {
       output.add('');
       output.add('stdout:');
       for (var s in test.output.stdout) {
         output.add(s);
       }
     }
-    if (!test.output.stderr.isEmpty()) {
+    if (!test.output.stderr.isEmpty) {
       output.add('');
       output.add('stderr:');
       for (var s in test.output.stderr) {
@@ -166,7 +166,7 @@
     }
     for (Command c in test.commands) {
       output.add('');
-      String message = (c == test.commands.last()
+      String message = (c == test.commands.last
           ? "Command line" : "Compilation command");
       output.add('$message: ${c.commandLine}');
     }
@@ -228,7 +228,7 @@
       : super(startTime, printTiming);
 
   void allDone() {
-    stdout.write('\n'.charCodes());
+    stdout.write('\n'.charCodes);
     _printFailureSummary();
     _printTimingInformation();
     if (_failedTests > 0) {
@@ -245,7 +245,7 @@
     if (!_allTestsKnown && SummaryReport.total > 0) {
       // Clear progress indicator before printing summary report.
       stdout.write(
-          '\r                                               \r'.charCodes());
+          '\r                                               \r'.charCodes);
       SummaryReport.printReport();
     }
     _allTestsKnown = true;
@@ -271,7 +271,7 @@
     var progressLine =
         '\r[${_timeString(d)} | $progressPadded% | '
         '+$passedPadded | -$failedPadded]';
-    stdout.write(progressLine.charCodes());
+    stdout.write(progressLine.charCodes);
   }
 }
 
@@ -287,10 +287,10 @@
 
   addColorWrapped(List<int> codes, String string, int color) {
     codes.add(27);
-    codes.addAll('[${color}m'.charCodes());
-    codes.addAll(string.charCodes());
+    codes.addAll('[${color}m'.charCodes);
+    codes.addAll(string.charCodes);
     codes.add(27);
-    codes.addAll('[0m'.charCodes());
+    codes.addAll('[0m'.charCodes);
   }
 
   void _printProgress() {
@@ -300,12 +300,12 @@
     var failedPadded = _pad(_failedTests.toString(), 5);
     Duration d = (new Date.now()).difference(_startTime);
     var progressLine = [];
-    progressLine.addAll('\r[${_timeString(d)} | $progressPadded% | '.charCodes());
+    progressLine.addAll('\r[${_timeString(d)} | $progressPadded% | '.charCodes);
     addColorWrapped(progressLine, '+$passedPadded ', GREEN);
-    progressLine.addAll('| '.charCodes());
+    progressLine.addAll('| '.charCodes);
     var failedColor = (_failedTests != 0) ? RED : NONE;
     addColorWrapped(progressLine, '-$failedPadded', failedColor);
-    progressLine.addAll(']'.charCodes());
+    progressLine.addAll(']'.charCodes);
     stdout.write(progressLine);
   }
 
@@ -385,7 +385,7 @@
   }
 
   void _printFailureSummary() {
-    if (!_failureSummary.isEmpty()) {
+    if (!_failureSummary.isEmpty) {
       print('@@@STEP_FAILURE@@@');
       print('@@@BUILD_STEP $stepName failures@@@');
     }
diff --git a/tools/testing/dart/test_runner.dart b/tools/testing/dart/test_runner.dart
index 930a561..c270a10 100644
--- a/tools/testing/dart/test_runner.dart
+++ b/tools/testing/dart/test_runner.dart
@@ -104,7 +104,7 @@
     // The new command will be:
     // PREFIX EXECUTABLE SUFFIX ARGUMENTS
     var specialCommand = configuration['special-command'];
-    if (!specialCommand.isEmpty()) {
+    if (!specialCommand.isEmpty) {
       Expect.isTrue(specialCommand.contains('@'),
                     "special-command must contain a '@' char");
       var specialCommandSplit = specialCommand.split('@');
@@ -121,7 +121,7 @@
           newExecutablePath = prefixSplit[0];
           for (int i = 1; i < prefixSplit.length; i++) {
             var current = prefixSplit[i];
-            if (!current.isEmpty()) newArguments.add(current);
+            if (!current.isEmpty) newArguments.add(current);
           }
           newArguments.add(c.executable);
         }
@@ -129,7 +129,7 @@
         // Add any suffixes to the arguments of the original executable.
         var suffixSplit = suffix.split(' ');
         suffixSplit.forEach((e) {
-          if (!e.isEmpty()) newArguments.add(e);
+          if (!e.isEmpty) newArguments.add(e);
         });
 
         newArguments.addAll(c.arguments);
@@ -162,7 +162,7 @@
   }
 
   List<String> get batchRunnerArguments => ['-batch'];
-  List<String> get batchTestArguments => commands.last().arguments;
+  List<String> get batchTestArguments => commands.last.arguments;
 
   bool get usesWebDriver => TestUtils.usesWebDriver(configuration['runtime']);
 
@@ -189,7 +189,7 @@
     numRetries = 2; // Allow two retries to compensate for flaky browser tests.
   }
 
-  List<String> get _lastArguments => commands.last().arguments;
+  List<String> get _lastArguments => commands.last.arguments;
 
   List<String> get batchRunnerArguments => [_lastArguments[0], '--batch'];
 
@@ -436,7 +436,7 @@
     } else if (outcome.contains('static type warning')
         && staticWarnings.length > 0) {
       return true;
-    } else if (outcome.isEmpty()
+    } else if (outcome.isEmpty
         && (errors.length > 0 || staticWarnings.length > 0)) {
       return true;
     }
@@ -609,7 +609,6 @@
    * the actual test and its output is analyzed in [testComplete].
    */
   void stepExitHandler(int exitCode) {
-    process.close();
     process = null;
     int totalSteps = testCase.commands.length;
     String suffix =' (step $currentStep of $totalSteps)';
@@ -740,7 +739,7 @@
   bool _isWebDriver;
 
   BatchRunnerProcess(TestCase testCase) {
-    _executable = testCase.commands.last().executable;
+    _executable = testCase.commands.last.executable;
     _batchArguments = testCase.batchRunnerArguments;
     _isWebDriver = testCase.usesWebDriver;
   }
@@ -752,17 +751,16 @@
     _currentTest = testCase;
     if (_process === null) {
       // Start process if not yet started.
-      _executable = testCase.commands.last().executable;
+      _executable = testCase.commands.last.executable;
       _startProcess(() {
         doStartTest(testCase);
       });
-    } else if (testCase.commands.last().executable != _executable) {
+    } else if (testCase.commands.last.executable != _executable) {
       // Restart this runner with the right executable for this test
       // if needed.
-      _executable = testCase.commands.last().executable;
+      _executable = testCase.commands.last.executable;
       _batchArguments = testCase.batchRunnerArguments;
       _process.onExit = (exitCode) {
-        _process.close();
         _startProcess(() {
           doStartTest(testCase);
         });
@@ -778,7 +776,6 @@
     Completer completer = new Completer();
     Timer killTimer;
     _process.onExit = (exitCode) {
-      _process.close();
       if (killTimer != null) killTimer.cancel();
       completer.complete(true);
     };
@@ -786,7 +783,7 @@
       // Use a graceful shutdown so our Selenium script can close
       // the open browser processes. On Windows, signals do not exist
       // and a kill is a hard kill.
-      _process.stdin.write('--terminate\n'.charCodes());
+      _process.stdin.write('--terminate\n'.charCodes);
 
       // In case the run_selenium process didn't close, kill it after 30s
       int shutdownMillisecs = 30000;
@@ -817,7 +814,7 @@
       print('  Error: $err');
       throw err;
     };
-    _process.stdin.write(line.charCodes());
+    _process.stdin.write(line.charCodes);
   }
 
   String _createArgumentsLine(List<String> arguments) {
@@ -926,10 +923,8 @@
         }
         _stderrDrained = true;
         _stdoutDrained = true;
-        _process.close();
         _startProcess(_reportResult);
       } else {  // No active test case running.
-        _process.close();
         _process = null;
       }
     }
@@ -1071,7 +1066,7 @@
     // If there is still no work, we are done.
     if (_activeTestListers == 0) {
       _progress.allTestsKnown();
-      if (_tests.isEmpty() && _numProcesses == 0) {
+      if (_tests.isEmpty && _numProcesses == 0) {
         _terminateBatchRunners().then((_) => _cleanupAndMarkDone());
       }
     }
@@ -1111,6 +1106,8 @@
 
       Future processFuture = Process.start(cmd, arg);
       processFuture.then((Process p) {
+        // Drain stderr to not leak resources.
+        p.stderr.onData = p.stderr.read;
         final StringInputStream stdoutStringStream =
             new StringInputStream(p.stdout);
         stdoutStringStream.onLine = () {
@@ -1214,7 +1211,7 @@
 
   Future _terminateBatchRunners() {
     var futures = new List();
-    for (var runners in _batchProcesses.getValues()) {
+    for (var runners in _batchProcesses.values) {
       for (var runner in runners) {
         futures.add(runner.terminate());
       }
@@ -1242,13 +1239,13 @@
 
   void _tryRunTest() {
     _checkDone();
-    if (_numProcesses < _maxProcesses && !_tests.isEmpty()) {
+    if (_numProcesses < _maxProcesses && !_tests.isEmpty) {
       TestCase test = _tests.removeFirst();
       if (_listTests) {
         var fields = [test.displayName,
                       Strings.join(new List.from(test.expectedOutcomes), ','),
                       test.isNegative.toString()];
-        fields.addAll(test.commands.last().arguments);
+        fields.addAll(test.commands.last.arguments);
         print(Strings.join(fields, '\t'));
         return;
       }
diff --git a/tools/testing/dart/test_suite.dart b/tools/testing/dart/test_suite.dart
index dc01e69..dd639df 100644
--- a/tools/testing/dart/test_suite.dart
+++ b/tools/testing/dart/test_suite.dart
@@ -67,6 +67,8 @@
   port.receive((String runnerPath, SendPort replyTo) {
     Future processFuture = Process.start(runnerPath, ["--list"]);
     processFuture.then((p) {
+      // Drain stderr to not leak resources.
+      p.stderr.onData = p.stderr.read;
       StringInputStream stdoutStream = new StringInputStream(p.stdout);
       var streamDone = false;
       var processExited = false;
@@ -127,7 +129,7 @@
               String this.suiteName,
               String runnerName,
               List<String> this.statusFilePaths,
-              [this.testPrefix = ''])
+              {this.testPrefix: ''})
       : dartDir = TestUtils.dartDir().toNativePath() {
     runnerPath = '${TestUtils.buildDir(configuration)}/$runnerName';
   }
@@ -399,7 +401,7 @@
     int shards = configuration['shards'];
     if (shards > 1) {
       int shard = configuration['shard'];
-      if (testName.hashCode() % shards != shard - 1) {
+      if (testName.hashCode % shards != shard - 1) {
         return;
       }
     }
@@ -452,7 +454,7 @@
                                                   info.optionsFromFile);
 
     List<List<String>> vmOptionsList = getVmOptions(info.optionsFromFile);
-    Expect.isFalse(vmOptionsList.isEmpty(), "empty vmOptionsList");
+    Expect.isFalse(vmOptionsList.isEmpty, "empty vmOptionsList");
 
     for (var vmOptions in vmOptionsList) {
       doTest(new TestCase('$suiteName/$testName',
@@ -489,7 +491,7 @@
       var additionalFlags =
           configuration['additional-compiler-flags'].split(' ');
       for (final flag in additionalFlags) {
-        if (flag.isEmpty()) continue;
+        if (flag.isEmpty) continue;
         compilerArguments.add(flag);
       }
       compilerArguments.add('--output-type=dart');
@@ -785,7 +787,7 @@
     Path relative = testPath.relativeTo(TestUtils.dartDir());
     relative = relative.directoryPath.append(relative.filenameWithoutExtension);
     String testUniqueName = relative.toString().replaceAll('/', '_');
-    if (!optionsName.isEmpty()) {
+    if (!optionsName.isEmpty) {
       testUniqueName = '$testUniqueName-$optionsName';
     }
 
@@ -1006,7 +1008,7 @@
     for (var match in matches) {
       result.add(match[1].split(' ').filter((e) => e != ''));
     }
-    if (result.isEmpty()) result.add([]);
+    if (result.isEmpty) result.add([]);
 
     matches = dartOptionsRegExp.allMatches(contents);
     for (var match in matches) {
diff --git a/utils/apidoc/apidoc.dart b/utils/apidoc/apidoc.dart
index 8e016f3..931a5fe 100644
--- a/utils/apidoc/apidoc.dart
+++ b/utils/apidoc/apidoc.dart
@@ -380,7 +380,7 @@
 
   /** Override definition from parent class to strip out annotation tags. */
   doc.DocComment createDocComment(String text,
-                                  [InterfaceMirror inheritedFrom]) {
+                                  [ClassMirror inheritedFrom]) {
     String strippedText =
         text.replaceAll(const RegExp("@([a-zA-Z]+) ([^;]+)(?:;|\$)"),
                         '').trim();
@@ -551,7 +551,7 @@
    * different library than [member].
    */
   String _linkMember(MemberMirror member) {
-    final typeName = member.surroundingDeclaration.simpleName;
+    final typeName = member.owner.simpleName;
     var memberName = '$typeName.${member.simpleName}';
     if (member is MethodMirror && (member.isConstructor || member.isFactory)) {
       final separator = member.constructorName == '' ? '' : '.';
@@ -570,7 +570,7 @@
 
   String get text => mdnComment;
 
-  InterfaceMirror get inheritedFrom => null;
+  ClassMirror get inheritedFrom => null;
 
   String get html {
     // Wrap the mdn comment so we can highlight it and so we handle MDN scraped
diff --git a/utils/apidoc/html_diff.dart b/utils/apidoc/html_diff.dart
index c9428bb..2de79b7 100644
--- a/utils/apidoc/html_diff.dart
+++ b/utils/apidoc/html_diff.dart
@@ -101,14 +101,14 @@
       warn('Could not find $HTML_LIBRARY_NAME');
       return;
     }
-    for (InterfaceMirror htmlType in htmlLib.types.values) {
+    for (ClassMirror htmlType in htmlLib.classes.values) {
       final domTypes = htmlToDomTypes(htmlType);
       if (domTypes.isEmpty) continue;
 
       htmlTypesToDom.putIfAbsent(htmlType.qualifiedName,
           () => new Set()).addAll(domTypes);
 
-      htmlType.declaredMembers.forEach(
+      htmlType.members.forEach(
           (_, m) => _addMemberDiff(m, domTypes));
     }
   }
@@ -123,7 +123,7 @@
     var domMembers = htmlToDomMembers(htmlMember, domTypes);
     if (htmlMember == null && !domMembers.isEmpty) {
       warn('$HTML_LIBRARY_NAME member '
-           '${htmlMember.surroundingDeclaration.simpleName}.'
+           '${htmlMember.owner.simpleName}.'
            '${htmlMember.simpleName} has no corresponding '
            '$HTML_LIBRARY_NAME member.');
     }
@@ -139,7 +139,7 @@
    * [htmlType] from `dart:html`. This can be the empty list if no
    * correspondence is found.
    */
-  List<String> htmlToDomTypes(InterfaceMirror htmlType) {
+  List<String> htmlToDomTypes(ClassMirror htmlType) {
     if (htmlType.simpleName == null) return [];
     final tags = _getTags(comments.find(htmlType.location));
     if (tags.containsKey('domName')) {
diff --git a/utils/compiler/build_helper.dart b/utils/compiler/build_helper.dart
index 0b4d29e..971bb58 100644
--- a/utils/compiler/build_helper.dart
+++ b/utils/compiler/build_helper.dart
@@ -142,7 +142,9 @@
 if %SCRIPTPATH:~-1%==\ set SCRIPTPATH=%SCRIPTPATH:~0,-1%
 
 set arguments=%*
+set SNAPSHOTNAME=%SCRIPTPATH%dart2js.snapshot
+if exist %SNAPSHOTNAME% set SNAPSHOT=--use_script_snapshot=%SNAPSHOTNAME%
 
-"%SCRIPTPATH%\dart.exe"$options "%SCRIPTPATH%$pathWin" %arguments%
+"%SCRIPTPATH%\dart.exe"$options %SNAPSHOT% "%SCRIPTPATH%$pathWin" %arguments%
 '''.replaceAll('\n', '\r\n')];
 }
diff --git a/utils/compiler/compiler.gyp b/utils/compiler/compiler.gyp
index fc83a3c..abb576d 100644
--- a/utils/compiler/compiler.gyp
+++ b/utils/compiler/compiler.gyp
@@ -12,7 +12,6 @@
       'type': 'none',
       'dependencies': [
         '../../runtime/dart-runtime.gyp:dart',
-        '../../third_party/v8/src/d8.gyp:d8',
       ],
       'actions': [
         {
diff --git a/utils/pub/io.dart b/utils/pub/io.dart
index c2f1456..8b632e3 100644
--- a/utils/pub/io.dart
+++ b/utils/pub/io.dart
@@ -471,15 +471,17 @@
   return completer.future;
 }
 
-/**
- * Spawns and runs the process located at [executable], passing in [args].
- * Returns a [Future] that will complete the results of the process after it
- * has ended.
- *
- * If [pipeStdout] and/or [pipeStderr] are set, all output from the subprocess's
- * output streams are sent to the parent process's output streams. Output from
- * piped streams won't be available in the result object.
- */
+/// Spawns and runs the process located at [executable], passing in [args].
+/// Returns a [Future] that will complete the results of the process after it
+/// has ended.
+///
+/// The spawned process will inherit its parent's environment variables. If
+/// [environment] is provided, that will be used to augment (not replace) the
+/// the inherited variables.
+///
+/// If [pipeStdout] and/or [pipeStderr] are set, all output from the
+/// subprocess's output streams are sent to the parent process's output streams.
+/// Output from piped streams won't be available in the result object.
 Future<PubProcessResult> runProcess(String executable, List<String> args,
     {workingDir, Map<String, String> environment, bool pipeStdout: false,
     bool pipeStderr: false}) {
@@ -499,7 +501,11 @@
   if (workingDir != null) {
     options.workingDirectory = _getDirectory(workingDir).path;
   }
-  options.environment = environment;
+
+  if (environment != null) {
+    options.environment = new Map.from(Platform.environment);
+    environment.forEach((key, value) => options.environment[key] = value);
+  }
 
   var future = Process.run(executable, args, options);
   return future.transform((result) {
@@ -556,8 +562,11 @@
 }
 
 /// Run a git process with [args] from [workingDir].
-Future<PubProcessResult> runGit(List<String> args, {String workingDir}) =>
-    _gitCommand.chain((git) => runProcess(git, args, workingDir: workingDir));
+Future<PubProcessResult> runGit(List<String> args,
+    {String workingDir, Map<String, String> environment}) {
+  return _gitCommand.chain((git) => runProcess(git, args,
+        workingDir: workingDir, environment: environment));
+}
 
 /// Returns the name of the git command-line app, or null if Git could not be
 /// found on the user's PATH.
diff --git a/utils/testrunner/layout_test_controller.dart b/utils/testrunner/layout_test_controller.dart
index d8864a3..8dedf11 100644
--- a/utils/testrunner/layout_test_controller.dart
+++ b/utils/testrunner/layout_test_controller.dart
@@ -129,6 +129,8 @@
   var stdout = new List();
   start = new Date.now();
   Process.start(drt, [url]).then((process) {
+    // Drain stderr to not leak resources.
+    process.stderr.onData = process.stderr.read;
     StringInputStream stdoutStringStream =
         new StringInputStream(process.stdout);
     stdoutStringStream.onLine = () {
@@ -213,6 +215,8 @@
   var stdout = new List();
   start = new Date.now();
   Process.start(drt, ["$url'-p"]).then((process) {
+    // Drain stderr to not leak resources.
+    process.stderr.onData = process.stderr.read;
     ListInputStream stdoutStream = process.stdout;
     stdoutStream.onData = () {
       if (!stdoutStream.closed) {
diff --git a/utils/tests/pub/pubspec_test.dart b/utils/tests/pub/pubspec_test.dart
index ed5522e..d952611 100644
--- a/utils/tests/pub/pubspec_test.dart
+++ b/utils/tests/pub/pubspec_test.dart
@@ -36,9 +36,9 @@
 
         var foo = pubspec.dependencies[0];
         expect(foo.name, equals('foo'));
-        expect(foo.constraint.allows(new Version(1, 2, 3)));
-        expect(foo.constraint.allows(new Version(1, 2, 5)));
-        expect(!foo.constraint.allows(new Version(3, 4, 5)));
+        expect(foo.constraint.allows(new Version(1, 2, 3)), isTrue);
+        expect(foo.constraint.allows(new Version(1, 2, 5)), isTrue);
+        expect(foo.constraint.allows(new Version(3, 4, 5)), isFalse);
       });
 
       test("throws if the description isn't valid", () {
diff --git a/utils/tests/pub/test_pub.dart b/utils/tests/pub/test_pub.dart
index 8c8dd80..67ac4a7 100644
--- a/utils/tests/pub/test_pub.dart
+++ b/utils/tests/pub/test_pub.dart
@@ -536,9 +536,10 @@
           ['--enable-type-checks', '--enable-asserts', pubPath, '--trace'];
       dartArgs.addAll(args);
 
-      var environment = new Map.from(Platform.environment);
-      environment['PUB_CACHE'] = pathInSandbox(cachePath);
-      environment['DART_SDK'] = pathInSandbox(sdkPath);
+      var environment = {
+        'PUB_CACHE': pathInSandbox(cachePath),
+        'DART_SDK': pathInSandbox(sdkPath)
+      };
 
       return runProcess(dartBin, dartArgs, workingDir: pathInSandbox(appPath),
           environment: environment);
@@ -1050,16 +1051,22 @@
 
     return super.create(parentDir).chain((rootDir) {
       workingDir = rootDir;
-      return writeTextFile(join(parentDir, '.gitconfig'), '''
-[user]
-  name = Test Pub
-  email = pub@dartlang.org
-''');
-    }).chain(runGitStep);
+      return runGitStep(null);
+    });
   }
 
   Future<String> _runGit(List<String> args, Directory workingDir) {
-    return runGit(args, workingDir: workingDir.path).transform((result) {
+    // Explicitly specify the committer information. Git needs this to commit
+    // and we don't want to rely on the buildbots having this already set up.
+    var environment = {
+      'GIT_AUTHOR_NAME': 'Pub Test',
+      'GIT_AUTHOR_EMAIL': 'pub@dartlang.org',
+      'GIT_COMMITTER_NAME': 'Pub Test',
+      'GIT_COMMITTER_EMAIL': 'pub@dartlang.org'
+    };
+
+    return runGit(args, workingDir: workingDir.path,
+        environment: environment).transform((result) {
       if (!result.success) {
         throw "Error running: git ${Strings.join(args, ' ')}\n"
             "${Strings.join(result.stderr, '\n')}";
diff --git a/utils/tests/pub/version_solver_test.dart b/utils/tests/pub/version_solver_test.dart
index e077b6b..4777aa41 100644
--- a/utils/tests/pub/version_solver_test.dart
+++ b/utils/tests/pub/version_solver_test.dart
@@ -339,6 +339,20 @@
 
 testResolve(description, packages, {lockfile, result, error}) {
   test(description, () {
+    var isNoVersionException = predicate((x)=> x is NoVersionException,
+        "is a NoVersionException");
+    var isDisjointConstraintException =
+        predicate((x)=> x is DisjointConstraintException,
+       "    is a DisjointConstraintException");
+    var isSourceMismatchException =
+        predicate((x)=> x is SourceMismatchException,
+            "is a SourceMismatchException");
+    var isDescriptionMismatchException =
+        predicate((x)=> x is DescriptionMismatchException,
+            "is a DescriptionMismatchException");
+    var isCouldNotSolveException = predicate((x)=> x is CouldNotSolveException,
+            "is a CouldNotSolveException");
+
     var sources = new SourceRegistry();
     source1 = new MockSource('mock1');
     source2 = new MockSource('mock2');
@@ -405,17 +419,17 @@
           if (actualId != expectedId) return false;
         }
         return result.isEmpty;
-      }, description: 'packages to match $result')));
+      }, 'packages to match $result')));
     } else if (error == noVersion) {
-      expect(future, throwsA(new isInstanceOf<NoVersionException>()));
+      expect(future, throwsA(isNoVersionException));
     } else if (error == disjointConstraint) {
-      expect(future, throwsA(new isInstanceOf<DisjointConstraintException>()));
+      expect(future, throwsA(isDisjointConstraintException));
     } else if (error == sourceMismatch) {
-      expect(future, throwsA(new isInstanceOf<SourceMismatchException>()));
+      expect(future, throwsA(isSourceMismatchException));
     } else if (error == descriptionMismatch) {
-      expect(future, throwsA(new isInstanceOf<DescriptionMismatchException>()));
+      expect(future, throwsA(isDescriptionMismatchException));
     } else if (error == couldNotSolve) {
-      expect(future, throwsA(new isInstanceOf<CouldNotSolveException>()));
+      expect(future, throwsA(isCouldNotSolveException));
     } else {
       expect(future, throwsA(error));
     }
diff --git a/utils/tests/pub/version_test.dart b/utils/tests/pub/version_test.dart
index 22c0ffb..314ab5b 100644
--- a/utils/tests/pub/version_test.dart
+++ b/utils/tests/pub/version_test.dart
@@ -81,9 +81,9 @@
     });
 
     test('allows()', () {
-      expect(v123.allows(v123));
-      expect(!v123.allows(v114));
-      expect(!v123.allows(v124));
+      expect(v123.allows(v123), isTrue);
+      expect(v123.allows(v114), isFalse);
+      expect(v123.allows(v124), isFalse);
     });
 
     test('intersect()', () {
@@ -91,18 +91,19 @@
       expect(v123.intersect(v123), equals(v123));
 
       // Intersecting a different version allows no versions.
-      expect(v123.intersect(v114).isEmpty);
+      expect(v123.intersect(v114).isEmpty, isTrue);
 
       // Intersecting a range returns the version if the range allows it.
       expect(v123.intersect(new VersionRange(min: v114, max: v124)),
           equals(v123));
 
       // Intersecting a range allows no versions if the range doesn't allow it.
-      expect(v114.intersect(new VersionRange(min: v123, max: v124)).isEmpty);
+      expect(v114.intersect(new VersionRange(min: v123, max: v124)).isEmpty,
+          isTrue);
     });
 
     test('isEmpty', () {
-      expect(!v123.isEmpty);
+      expect(v123.isEmpty, isFalse);
     });
 
     test('parse()', () {
@@ -169,7 +170,7 @@
 
       test('takes includeMin', () {
         var range = new VersionRange(min: v123, includeMin: true);
-        expect(range.includeMin);
+        expect(range.includeMin, isTrue);
       });
 
       test('includeMin defaults to false if omitted', () {
@@ -179,7 +180,7 @@
 
       test('takes includeMax', () {
         var range = new VersionRange(max: v123, includeMax: true);
-        expect(range.includeMax);
+        expect(range.includeMax, isTrue);
       });
 
       test('includeMax defaults to false if omitted', () {
@@ -196,57 +197,57 @@
       test('version must be greater than min', () {
         var range = new VersionRange(min: v123, max: v234);
 
-        expect(!range.allows(new Version.parse('1.2.2')));
-        expect(!range.allows(new Version.parse('1.2.3')));
-        expect(range.allows(new Version.parse('1.3.3')));
-        expect(range.allows(new Version.parse('2.3.3')));
+        expect(range.allows(new Version.parse('1.2.2')), isFalse);
+        expect(range.allows(new Version.parse('1.2.3')), isFalse);
+        expect(range.allows(new Version.parse('1.3.3')), isTrue);
+        expect(range.allows(new Version.parse('2.3.3')), isTrue);
       });
 
       test('version must be min or greater if includeMin', () {
         var range = new VersionRange(min: v123, max: v234, includeMin: true);
 
-        expect(!range.allows(new Version.parse('1.2.2')));
-        expect(range.allows(new Version.parse('1.2.3')));
-        expect(range.allows(new Version.parse('1.3.3')));
-        expect(range.allows(new Version.parse('2.3.3')));
+        expect(range.allows(new Version.parse('1.2.2')), isFalse);
+        expect(range.allows(new Version.parse('1.2.3')), isTrue);
+        expect(range.allows(new Version.parse('1.3.3')), isTrue);
+        expect(range.allows(new Version.parse('2.3.3')), isTrue);
       });
 
       test('version must be less than max', () {
         var range = new VersionRange(min: v123, max: v234);
 
-        expect(range.allows(new Version.parse('2.3.3')));
-        expect(!range.allows(new Version.parse('2.3.4')));
-        expect(!range.allows(new Version.parse('2.4.3')));
+        expect(range.allows(new Version.parse('2.3.3')), isTrue);
+        expect(range.allows(new Version.parse('2.3.4')), isFalse);
+        expect(range.allows(new Version.parse('2.4.3')), isFalse);
       });
 
       test('version must be max or less if includeMax', () {
         var range = new VersionRange(min: v123, max: v234, includeMax: true);
 
-        expect(range.allows(new Version.parse('2.3.3')));
-        expect(range.allows(new Version.parse('2.3.4')));
-        expect(!range.allows(new Version.parse('2.4.3')));
+        expect(range.allows(new Version.parse('2.3.3')), isTrue);
+        expect(range.allows(new Version.parse('2.3.4')), isTrue);
+        expect(range.allows(new Version.parse('2.4.3')), isFalse);
       });
 
       test('has no min if one was not set', () {
         var range = new VersionRange(max: v123);
 
-        expect(range.allows(new Version.parse('0.0.0')));
-        expect(!range.allows(new Version.parse('1.2.3')));
+        expect(range.allows(new Version.parse('0.0.0')), isTrue);
+        expect(range.allows(new Version.parse('1.2.3')), isFalse);
       });
 
       test('has no max if one was not set', () {
         var range = new VersionRange(min: v123);
 
-        expect(!range.allows(new Version.parse('1.2.3')));
-        expect(range.allows(new Version.parse('1.3.3')));
-        expect(range.allows(new Version.parse('999.3.3')));
+        expect(range.allows(new Version.parse('1.2.3')), isFalse);
+        expect(range.allows(new Version.parse('1.3.3')), isTrue);
+        expect(range.allows(new Version.parse('999.3.3')), isTrue);
       });
 
       test('allows any version if there is no min or max', () {
         var range = new VersionRange();
 
-        expect(range.allows(new Version.parse('0.0.0')));
-        expect(range.allows(new Version.parse('999.99.9')));
+        expect(range.allows(new Version.parse('0.0.0')), isTrue);
+        expect(range.allows(new Version.parse('999.99.9')), isTrue);
       });
     });
 
@@ -264,13 +265,13 @@
       test('a non-overlapping range allows no versions', () {
         var a = new VersionRange(min: v114, max: v124);
         var b = new VersionRange(min: v200, max: v250);
-        expect(a.intersect(b).isEmpty);
+        expect(a.intersect(b).isEmpty, isTrue);
       });
 
       test('adjacent ranges allow no versions if exclusive', () {
         var a = new VersionRange(min: v114, max: v124, includeMax: false);
         var b = new VersionRange(min: v124, max: v200, includeMin: true);
-        expect(a.intersect(b).isEmpty);
+        expect(a.intersect(b).isEmpty, isTrue);
       });
 
       test('adjacent ranges allow version if inclusive', () {
@@ -289,7 +290,8 @@
       test('returns the version if the range allows it', () {
         expect(new VersionRange(min: v114, max: v124).intersect(v123),
             equals(v123));
-        expect(new VersionRange(min: v123, max: v124).intersect(v114).isEmpty);
+        expect(new VersionRange(min: v123, max: v124).intersect(v114).isEmpty,
+            isTrue);
       });
     });
 
@@ -301,19 +303,19 @@
 
   group('VersionConstraint', () {
     test('empty', () {
-      expect(new VersionConstraint.empty().isEmpty);
+      expect(new VersionConstraint.empty().isEmpty, isTrue);
     });
 
     group('parse()', () {
       test('parses an exact version', () {
         var constraint = new VersionConstraint.parse('1.2.3-alpha');
-        expect(constraint is Version);
+        expect(constraint is Version, isTrue);
         expect(constraint, equals(new Version(1, 2, 3, pre: 'alpha')));
       });
 
       test('parses "any"', () {
         var constraint = new VersionConstraint.parse('any');
-        expect(constraint is VersionConstraint);
+        expect(constraint is VersionConstraint, isTrue);
         expect(constraint, allows([
             new Version.parse('0.0.0'),
             new Version.parse('1.2.3'),
