diff --git a/compiler/java/com/google/dart/compiler/resolver/TopLevelElementBuilder.java b/compiler/java/com/google/dart/compiler/resolver/TopLevelElementBuilder.java
index b72e73a..2a4e52b 100644
--- a/compiler/java/com/google/dart/compiler/resolver/TopLevelElementBuilder.java
+++ b/compiler/java/com/google/dart/compiler/resolver/TopLevelElementBuilder.java
@@ -144,8 +144,14 @@
     // Fill "library" export scope with re-exports.
     for (LibraryExport export : library.getExports()) {
       LibraryUnit lib = export.getLibrary();
+      fillInLibraryScope(lib, listener);
       for (Element element : lib.getElement().getExportedElements()) {
         String name = element.getName();
+        // re-export only in not defined locally
+        if (scope.findLocalElement(name) != null) {
+          continue;
+        }
+        // check if show/hide combinators of "export" are satisfied
         if (export.isVisible(name)) {
           Elements.addExportedElement(library.getElement(), element);
         }
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 c13c42a..8f586e5 100644
--- a/compiler/javatests/com/google/dart/compiler/end2end/inc/IncrementalCompilation2Test.java
+++ b/compiler/javatests/com/google/dart/compiler/end2end/inc/IncrementalCompilation2Test.java
@@ -716,6 +716,42 @@
             ""));
   }
 
+  /**
+   * <p>
+   * http://code.google.com/p/dart/issues/detail?id=5735
+   */
+  public void test_importConflict_hideNoPrefix_importAgainWithPrefix() throws Exception {
+    appSource.setContent(
+        "A.dart",
+        makeCode(
+            "// filler filler filler filler filler filler filler filler filler filler filler",
+            "library lib_a;",
+            "var E = 2.7;",
+            ""));
+    appSource.setContent(
+        "B.dart",
+        makeCode(
+            "// filler filler filler filler filler filler filler filler filler filler filler",
+            "library lib_b;",
+            "export 'A.dart' show E;",
+            "var E = 'E';",
+            ""));
+    appSource.setContent(
+        APP,
+        makeCode(
+            "// filler filler filler filler filler filler filler filler filler filler filler",
+            "library test.app;",
+            "import 'B.dart';",
+            "import 'A.dart' as M show E;",
+            "main() {",
+            "  print(E);",
+            "  print(M.E);",
+            "}",
+            ""));
+    compile();
+    assertErrors(errors);
+  }
+
   public void test_reportMissingSource() throws Exception {
     appSource.setContent(
         APP,
@@ -1041,7 +1077,7 @@
     assertErrors(errors, errEx(TypeErrorCode.NO_SUCH_TYPE, 7, 3, 10));
   }
 
-  public void test_newLibrarySyntax_export() throws Exception {
+  public void test_newLibrarySyntax_export_show() throws Exception {
     appSource.setContent(
         "A.dart",
         makeCode(
@@ -1056,7 +1092,6 @@
         makeCode(
             "// filler filler filler filler filler filler filler filler filler filler filler",
             "library test.B;",
-            "import 'A.dart' as libA hide TypeAC;",
             "export 'A.dart' show TypeAA, TypeAB;",
             "class TypeBA {}",
             "class TypeBB {}",
@@ -1088,6 +1123,52 @@
     assertTrue(errors.toString().contains("libB.TypeBB"));
   }
   
+  public void test_newLibrarySyntax_export_hide() throws Exception {
+    appSource.setContent(
+        "A.dart",
+        makeCode(
+            "// filler filler filler filler filler filler filler filler filler filler filler",
+            "library test.A;",
+            "class TypeAA {}",
+            "class TypeAB {}",
+            "class TypeAC {}",
+            ""));
+    appSource.setContent(
+        "B.dart",
+        makeCode(
+            "// filler filler filler filler filler filler filler filler filler filler filler",
+            "library test.B;",
+            "export 'A.dart' hide TypeAC;",
+            "class TypeBA {}",
+            "class TypeBB {}",
+            "class TypeBC {}",
+            ""));
+    appSource.setContent(
+        APP,
+        makeCode(
+            "// filler filler filler filler filler filler filler filler filler filler filler",
+            "library test.app;",
+            "import 'B.dart' as libB hide TypeAA, TypeBB;",
+            "main() {",
+            "  libB.TypeAA aa;",
+            "  libB.TypeAB ab;",
+            "  libB.TypeAC ac;",
+            "  libB.TypeBA ba;",
+            "  libB.TypeBB bb;",
+            "  libB.TypeBC bc;",
+            "}",
+            ""));
+    compile();
+    assertErrors(
+        errors,
+        errEx(TypeErrorCode.NO_SUCH_TYPE, 5, 3, 11),
+        errEx(TypeErrorCode.NO_SUCH_TYPE, 7, 3, 11),
+        errEx(TypeErrorCode.NO_SUCH_TYPE, 9, 3, 11));
+    assertTrue(errors.toString().contains("libB.TypeAA"));
+    assertTrue(errors.toString().contains("libB.TypeAC"));
+    assertTrue(errors.toString().contains("libB.TypeBB"));
+  }
+  
   public void test_newLibrarySyntax_noExport() throws Exception {
     appSource.setContent(
         "A.dart",
diff --git a/lib/_internal/libraries.dart b/lib/_internal/libraries.dart
index 881e955..239cec4 100644
--- a/lib/_internal/libraries.dart
+++ b/lib/_internal/libraries.dart
@@ -57,8 +57,7 @@
 
   "mirrors": const LibraryInfo(
       "mirrors/mirrors.dart",
-      documented: false,
-      platforms: VM_PLATFORM),
+      dart2jsPath: "compiler/implementation/lib/mirrors.dart"),
 
   "nativewrappers": const LibraryInfo(
       "html/dartium/nativewrappers.dart",
diff --git a/lib/compiler/implementation/apiimpl.dart b/lib/compiler/implementation/apiimpl.dart
index 40030da..d65f8c7 100644
--- a/lib/compiler/implementation/apiimpl.dart
+++ b/lib/compiler/implementation/apiimpl.dart
@@ -113,7 +113,12 @@
   Uri translateDartUri(Uri uri, tree.Node node) {
     String path = lookupLibraryPath(uri.path);
     if (path === null || LIBRARIES[uri.path].category == "Internal") {
-      reportError(node, 'library not found ${uri}');
+      if (node != null) {
+        reportError(node, 'library not found ${uri}');
+      } else {
+        reportDiagnostic(null, 'library not found ${uri}',
+                         api.Diagnostic.ERROR);
+      }
       return null;
     }
     if (uri.path == 'html' ||
diff --git a/lib/compiler/implementation/compile_time_constants.dart b/lib/compiler/implementation/compile_time_constants.dart
index ce96502..0f3fd37 100644
--- a/lib/compiler/implementation/compile_time_constants.dart
+++ b/lib/compiler/implementation/compile_time_constants.dart
@@ -767,16 +767,17 @@
       if (enclosingClass != compiler.objectClass) {
         assert(superClass !== null);
         assert(superClass.resolutionState == STATE_DONE);
+
+        Selector selector =
+            new Selector.callDefaultConstructor(enclosingClass.getLibrary());
+
         FunctionElement targetConstructor =
-            superClass.lookupConstructor(superClass.name);
+            superClass.lookupConstructor(selector);
         if (targetConstructor === null) {
           compiler.internalError("no default constructor available",
                                  node: functionNode);
         }
 
-        Selector selector = new Selector.call(superClass.name,
-                                              enclosingClass.getLibrary(),
-                                              0);
         evaluateSuperOrRedirectSend(functionNode,
                                     selector,
                                     const Link<Node>(),
diff --git a/lib/compiler/implementation/compiler.dart b/lib/compiler/implementation/compiler.dart
index e461074..fe032d9 100644
--- a/lib/compiler/implementation/compiler.dart
+++ b/lib/compiler/implementation/compiler.dart
@@ -390,7 +390,7 @@
     addForeignFunctions(jsHelperLibrary);
     addForeignFunctions(interceptorsLibrary);
 
-    assertMethod = jsHelperLibrary.find(const SourceString('assert'));
+    assertMethod = jsHelperLibrary.find(const SourceString('assertHelper'));
     identicalFunction = coreLibrary.find(const SourceString('identical'));
 
     initializeSpecialClasses();
diff --git a/lib/compiler/implementation/dart_backend/placeholder_collector.dart b/lib/compiler/implementation/dart_backend/placeholder_collector.dart
index 381b5da..6e815c1 100644
--- a/lib/compiler/implementation/dart_backend/placeholder_collector.dart
+++ b/lib/compiler/implementation/dart_backend/placeholder_collector.dart
@@ -394,7 +394,10 @@
       if (send.receiver !== null) tryMakeMemberPlaceholder(send.selector);
     } else if (!element.isErroneous()) {
       if (Elements.isStaticOrTopLevel(element)) {
-        assert(element is VariableElement || element.isAccessor());
+        // TODO(smok): Worth investigating why sometimes we get getter/setter
+        // here and sometimes abstract field.
+        assert(element is VariableElement || element.isAccessor()
+            || element.isAbstractField() || element.isFunction());
         makeElementPlaceholder(send.selector, element);
       } else {
         assert(send.selector is Identifier);
diff --git a/lib/compiler/implementation/elements/elements.dart b/lib/compiler/implementation/elements/elements.dart
index 5ae0939..dc70d0f 100644
--- a/lib/compiler/implementation/elements/elements.dart
+++ b/lib/compiler/implementation/elements/elements.dart
@@ -1475,24 +1475,42 @@
     }
   }
 
-  Element lookupConstructor(SourceString className,
-                            [SourceString constructorName =
-                                 const SourceString(''),
-                            Element noMatch(Element)]) {
-    // TODO(karlklose): have a map from class names to a map of constructors
-    //                  instead of creating the name here?
+  Element validateConstructorLookupResults(Selector selector,
+                                           Element result,
+                                           Element noMatch(Element)) {
+    if (result === null
+        || !result.isConstructor()
+        || (selector.name.isPrivate()
+            && result.getLibrary() != selector.library)) {
+      result = noMatch !== null ? noMatch(result) : null;
+    }
+    return result;
+  }
+
+  // TODO(aprelev@gmail.com): Peter believes that it would be great to
+  // make noMatch a required argument. Peter's suspicion is that most
+  // callers of this method would benefit from using the noMatch method.
+  Element lookupConstructor(Selector selector, [Element noMatch(Element)]) {
     SourceString normalizedName;
-    if (constructorName !== const SourceString('')) {
+    SourceString className = this.name;
+    SourceString constructorName = selector.name;
+    if (constructorName !== const SourceString('') &&
+        ((className === null) ||
+         (constructorName.slowToString() != className.slowToString()))) {
       normalizedName = Elements.constructConstructorName(className,
                                                          constructorName);
     } else {
       normalizedName = className;
     }
     Element result = localLookup(normalizedName);
-    if (result === null || !result.isConstructor()) {
-      result = noMatch !== null ? noMatch(result) : null;
-    }
-    return result;
+    return validateConstructorLookupResults(selector, result, noMatch);
+  }
+
+  Element lookupFactoryConstructor(Selector selector,
+                                   [Element noMatch(Element)]) {
+    SourceString constructorName = selector.name;
+    Element result = localLookup(constructorName);
+    return validateConstructorLookupResults(selector, result, noMatch);
   }
 
   bool get hasConstructor {
diff --git a/lib/compiler/implementation/js/printer.dart b/lib/compiler/implementation/js/printer.dart
index 27c9aa5..e29ef8d 100644
--- a/lib/compiler/implementation/js/printer.dart
+++ b/lib/compiler/implementation/js/printer.dart
@@ -20,7 +20,8 @@
         namer = determineRenamer(compiler.enableMinification);
   
   static Namer determineRenamer(bool shouldCompressOutput) {
-    return shouldCompressOutput ? new MinifyRenamer() : new IdentityNamer();
+    // TODO(erikcorry): Re-enable the MinifyRenamer after M1.
+    return new IdentityNamer();
   }
 
   void spaceOut() {
diff --git a/lib/compiler/implementation/lib/js_helper.dart b/lib/compiler/implementation/lib/js_helper.dart
index 7170d2c..2515116 100644
--- a/lib/compiler/implementation/lib/js_helper.dart
+++ b/lib/compiler/implementation/lib/js_helper.dart
@@ -849,6 +849,10 @@
   throw new RuntimeError(message);
 }
 
+throwAbstractClassInstantiationError(className) {
+  throw new AbstractClassInstantiationError(className);
+}
+
 /**
  * Called from catch blocks in generated code to extract the Dart
  * exception from the thrown value. The thrown value may have been
@@ -1361,7 +1365,7 @@
 /**
  * Helper function for implementing asserts. The compiler treats this specially.
  */
-void assert(condition) {
+void assertHelper(condition) {
   if (condition is Function) condition = condition();
   if (condition is !bool) {
     throw new TypeErrorImplementation(condition, 'bool');
diff --git a/lib/compiler/implementation/lib/mirrors.dart b/lib/compiler/implementation/lib/mirrors.dart
new file mode 100644
index 0000000..f717d9b
--- /dev/null
+++ b/lib/compiler/implementation/lib/mirrors.dart
@@ -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.
+
+#library("dart:mirrors");
+
+#import("dart:isolate");
+
+#source("../../../mirrors/mirrors.dart");
+
+/**
+ * Stub class for the mirror system.
+ */
+class _Mirrors {
+  static MirrorSystem currentMirrorSystem() {
+    throw new UnsupportedOperationException("MirrorSystem not implemented");
+  }
+
+  static Future<MirrorSystem> mirrorSystemOf(SendPort port) {
+    throw new UnsupportedOperationException("MirrorSystem not implemented");
+  }
+
+  static InstanceMirror reflect(Object reflectee) {
+    throw new UnsupportedOperationException("MirrorSystem not implemented");
+  }
+}
diff --git a/lib/compiler/implementation/resolver.dart b/lib/compiler/implementation/resolver.dart
index 17c9d56..7409bc6 100644
--- a/lib/compiler/implementation/resolver.dart
+++ b/lib/compiler/implementation/resolver.dart
@@ -87,15 +87,23 @@
     });
   }
 
+  bool isNamedConstructor(Send node) => node.receiver !== null;
+
   SourceString getConstructorName(Send node) {
-    if (node.receiver !== null) {
-      return node.selector.asIdentifier().source;
-    } else {
-      return const SourceString('');
-    }
+    return node.selector.asIdentifier().source;
   }
 
-  FunctionElement resolveConstructorRedirection(FunctionElement constructor) {
+  String constructorNameForDiagnostics(SourceString className,
+                                   SourceString constructorName) {
+    String classNameString = className.slowToString();
+    String constructorNameString = constructorName.slowToString();
+    return (constructorName === const SourceString(''))
+        ? classNameString
+        : "$classNameString.$constructorNameString";
+   }
+
+  FunctionElement resolveConstructorRedirection(InitializerResolver resolver,
+                                                FunctionElement constructor) {
     if (constructor.isPatched) {
       checkMatchingPatchSignatures(constructor, constructor.patch);
       constructor = constructor.patch;
@@ -109,10 +117,17 @@
     if (!initializers.isEmpty() &&
         Initializers.isConstructorRedirect(initializers.head)) {
       final ClassElement classElement = constructor.getEnclosingClass();
-      final SourceString constructorName =
-          getConstructorName(initializers.head);
-      final SourceString className = classElement.name;
-      return classElement.lookupConstructor(className, constructorName);
+      Selector selector;
+      if (isNamedConstructor(initializers.head)) {
+        SourceString constructorName = getConstructorName(initializers.head);
+        selector = new Selector.callConstructor(
+            constructorName,
+            resolver.visitor.enclosingElement.getLibrary());
+      } else {
+        selector = new Selector.callDefaultConstructor(
+            resolver.visitor.enclosingElement.getLibrary());
+      }
+      return classElement.lookupConstructor(selector);
     }
     return null;
   }
@@ -129,7 +144,7 @@
         return;
       }
       seen.add(redirection);
-      redirection = resolveConstructorRedirection(redirection);
+      redirection = resolveConstructorRedirection(resolver, redirection);
     }
   }
 
@@ -290,26 +305,42 @@
     // [intrface] is an interface, let's say "MyInterface".
     // [defaultClass] is a class, let's say "MyClass".
 
+    Selector selector;
     // If the default class implements the interface then we must use the
     // default class' name. Otherwise we look for a factory with the name
     // of the interface.
-    SourceString name;
     if (defaultClass.implementsInterface(intrface)) {
-      // TODO(ahe): Don't use string replacement here.
-      name = new SourceString(constructor.name.slowToString().replaceFirst(
-                 intrface.name.slowToString(),
-                 defaultClass.name.slowToString()));
+      var constructorNameString = constructor.name.slowToString();
+      // Create selector based on constructor.name but where interface
+      // is replaced with default class name.
+      // TODO(ahe): Don't use string manipulations here.
+      int classNameSeparatorIndex = constructorNameString.indexOf('\$');
+      if (classNameSeparatorIndex < 0) {
+        selector = new Selector.callDefaultConstructor(
+            defaultClass.getLibrary());
+      } else {
+        selector = new Selector.callConstructor(
+            new SourceString(
+                constructorNameString.substring(classNameSeparatorIndex + 1)),
+            defaultClass.getLibrary());
+      }
+      constructor.defaultImplementation =
+          defaultClass.lookupConstructor(selector);
     } else {
-      name = constructor.name;
+      selector =
+          new Selector.callConstructor(constructor.name,
+                                       defaultClass.getLibrary());
+      constructor.defaultImplementation =
+          defaultClass.lookupFactoryConstructor(selector);
     }
-    constructor.defaultImplementation = defaultClass.lookupConstructor(name);
-
     if (constructor.defaultImplementation === null) {
       // We failed to find a constructor named either
       // "MyInterface.name" or "MyClass.name".
+      // TODO(aprelev@gmail.com): Use constructorNameForDiagnostics in
+      // the error message below.
       error(node,
             MessageKind.CANNOT_FIND_CONSTRUCTOR2,
-            [name, defaultClass.name]);
+            [selector.name, defaultClass.name]);
     }
   }
 
@@ -682,6 +713,21 @@
     visitor.visitInStaticContext(init.arguments.head);
   }
 
+  ClassElement getSuperOrThisLookupTarget(FunctionElement constructor,
+                                          bool isSuperCall,
+                                          Node diagnosticNode) {
+    ClassElement lookupTarget = constructor.getEnclosingClass();
+    if (isSuperCall) {
+      // Calculate correct lookup target and constructor name.
+      if (lookupTarget === visitor.compiler.objectClass) {
+        error(diagnosticNode, MessageKind.SUPER_INITIALIZER_IN_OBJECT);
+      } else {
+        return lookupTarget.supertype.element;
+      }
+    }
+    return lookupTarget;
+  }
+
   Element resolveSuperOrThisForSend(FunctionElement constructor,
                                     FunctionExpression functionNode,
                                     Send call) {
@@ -693,12 +739,39 @@
     });
     Selector selector = visitor.mapping.getSelector(call);
     bool isSuperCall = Initializers.isSuperConstructorCall(call);
-    SourceString constructorName = resolver.getConstructorName(call);
-    Element result = resolveSuperOrThis(
-        constructor, isSuperCall, false, constructorName, selector, call);
-    visitor.useElement(call, result);
-    visitor.world.registerStaticUse(result);
-    return result;
+
+    ClassElement lookupTarget = getSuperOrThisLookupTarget(constructor,
+                                                           isSuperCall,
+                                                           call);
+    final SourceString className = lookupTarget.name;
+
+    SourceString constructorName;
+    Selector lookupSelector;
+    if (resolver.isNamedConstructor(call)) {
+      constructorName = resolver.getConstructorName(call);
+      lookupSelector = new Selector.callConstructor(
+          constructorName,
+          visitor.enclosingElement.getLibrary());
+    } else {
+      constructorName = const SourceString('');
+      lookupSelector = new Selector.callDefaultConstructor(
+          visitor.enclosingElement.getLibrary());
+    }
+
+    FunctionElement lookedupConstructor =
+        lookupTarget.lookupConstructor(lookupSelector);
+
+    final bool isImplicitSuperCall = false;
+    verifyThatConstructorMatchesCall(lookedupConstructor,
+                                     selector,
+                                     isImplicitSuperCall,
+                                     call,
+                                     constructorName,
+                                     className);
+
+    visitor.useElement(call, lookedupConstructor);
+    visitor.world.registerStaticUse(lookedupConstructor);
+    return lookedupConstructor;
   }
 
   void resolveImplicitSuperConstructorSend(FunctionElement constructor,
@@ -709,55 +782,57 @@
     if (classElement != visitor.compiler.objectClass) {
       assert(superClass !== null);
       assert(superClass.resolutionState == STATE_DONE);
-      SourceString name = const SourceString('');
-      Selector call = new Selector.call(name, classElement.getLibrary(), 0);
-      var element = resolveSuperOrThis(constructor, true, true,
-                                       name, call, functionNode);
-      visitor.world.registerStaticUse(element);
+      SourceString constructorName = const SourceString('');
+      Selector callToMatch = new Selector.call(
+          constructorName,
+          classElement.getLibrary(),
+          0);
+
+      final bool isSuperCall = true;
+      ClassElement lookupTarget = getSuperOrThisLookupTarget(constructor,
+                                                             isSuperCall,
+                                                             functionNode);
+      final SourceString className = lookupTarget.name;
+      Element calledConstructor = lookupTarget.lookupConstructor(
+          new Selector.callDefaultConstructor(
+              visitor.enclosingElement.getLibrary()));
+
+      final bool isImplicitSuperCall = true;
+      verifyThatConstructorMatchesCall(calledConstructor,
+                                       callToMatch,
+                                       isImplicitSuperCall,
+                                       functionNode,
+                                       className,
+                                       const SourceString(''));
+
+      visitor.world.registerStaticUse(calledConstructor);
     }
   }
 
-  Element resolveSuperOrThis(FunctionElement constructor,
-                             bool isSuperCall,
-                             bool isImplicitSuperCall,
-                             SourceString constructorName,
-                             Selector selector,
-                             Node diagnosticNode) {
-    ClassElement lookupTarget = constructor.getEnclosingClass();
-    bool validTarget = true;
-    FunctionElement result;
-    if (isSuperCall) {
-      // Calculate correct lookup target and constructor name.
-      if (lookupTarget === visitor.compiler.objectClass) {
-        error(diagnosticNode, MessageKind.SUPER_INITIALIZER_IN_OBJECT);
-      } else {
-        lookupTarget = lookupTarget.supertype.element;
-      }
-    }
-
-    // Lookup constructor and try to match it to the selector.
-    ResolverTask resolver = visitor.compiler.resolver;
-    final SourceString className = lookupTarget.name;
-    result = lookupTarget.lookupConstructor(className, constructorName);
-    if (result === null || !result.isGenerativeConstructor()) {
-      String classNameString = className.slowToString();
-      String constructorNameString = constructorName.slowToString();
-      String name = (constructorName === const SourceString(''))
-                        ? classNameString
-                        : "$classNameString.$constructorNameString";
+  void verifyThatConstructorMatchesCall(
+      FunctionElement lookedupConstructor,
+      Selector call,
+      bool isImplicitSuperCall,
+      Node diagnosticNode,
+      SourceString className,
+      SourceString constructorName) {
+    if (lookedupConstructor === null
+        || !lookedupConstructor.isGenerativeConstructor()) {
+      var fullConstructorName =
+          visitor.compiler.resolver.constructorNameForDiagnostics(className,
+                                                              constructorName);
       MessageKind kind = isImplicitSuperCall
-                         ? MessageKind.CANNOT_RESOLVE_CONSTRUCTOR_FOR_IMPLICIT
-                         : MessageKind.CANNOT_RESOLVE_CONSTRUCTOR;
-      error(diagnosticNode, kind, [name]);
+          ? MessageKind.CANNOT_RESOLVE_CONSTRUCTOR_FOR_IMPLICIT
+          : MessageKind.CANNOT_RESOLVE_CONSTRUCTOR;
+      error(diagnosticNode, kind, [fullConstructorName]);
     } else {
-      if (!selector.applies(result, visitor.compiler)) {
+      if (!call.applies(lookedupConstructor, visitor.compiler)) {
         MessageKind kind = isImplicitSuperCall
                            ? MessageKind.NO_MATCHING_CONSTRUCTOR_FOR_IMPLICIT
                            : MessageKind.NO_MATCHING_CONSTRUCTOR;
         error(diagnosticNode, kind);
       }
     }
-    return result;
   }
 
   FunctionElement resolveRedirection(FunctionElement constructor,
@@ -1412,33 +1487,22 @@
     return (str === '&&' || str == '||' || str == '!');
   }
 
-  /**
-   * Check the lexical scope chain for a declaration with the name "assert".
-   *
-   * This is used to detect whether "assert(x)" is actually an assertion or
-   * just a call expression.
-   * It does not check fields inherited from a superclass.
-   */
-  bool isAssertInLexicalScope() {
-    return scope.lexicalLookup(const SourceString("assert")) !== null;
-  }
-
-  /** Check if [node] is the expression of the current expression statement. */
-  bool isExpressionStatementExpression(Node node) {
-    return currentExpressionStatement !== null &&
-        currentExpressionStatement.expression === node;
-  }
-
   Element resolveSend(Send node) {
     Selector selector = resolveSelector(node);
 
     if (node.receiver === null) {
-      // If this send is the expression of an expression statement, and is on
-      // the form "assert(expr);", and there is no declaration with name
-      // "assert" in the lexical scope, then this is actually an assertion.
-      if (isExpressionStatementExpression(node) &&
-          selector.isAssertSyntax() &&
-          !isAssertInLexicalScope()) {
+      // If this send is of the form "assert(expr);", then
+      // this is an assertion.
+      if (selector.isAssert()) {
+        if (selector.argumentCount != 1) {
+          error(node.selector,
+                MessageKind.WRONG_NUMBER_OF_ARGUMENTS_FOR_ASSERT,
+                [selector.argumentCount]);
+        } else if (selector.namedArgumentCount != 0) {
+          error(node.selector,
+                MessageKind.ASSERT_IS_GIVEN_NAMED_ARGUMENTS,
+                [selector.namedArgumentCount]);
+        }
         return compiler.assertMethod;
       }
       return node.selector.accept(this);
@@ -2809,22 +2873,33 @@
     }
   }
 
+  Selector createConstructorSelector(SourceString constructorName) {
+    return constructorName == const SourceString('')
+        ? new Selector.callDefaultConstructor(
+            resolver.enclosingElement.getLibrary())
+        : new Selector.callConstructor(
+            constructorName,
+            resolver.enclosingElement.getLibrary());
+  }
+
   // TODO(ngeoffray): method named lookup should not report errors.
   FunctionElement lookupConstructor(ClassElement cls,
                                     Node diagnosticNode,
                                     SourceString constructorName) {
     cls.ensureResolved(compiler);
-    Element result = cls.lookupConstructor(cls.name, constructorName);
+    Selector selector = createConstructorSelector(constructorName);
+    Element result = cls.lookupConstructor(selector);
     if (result === null) {
-      String fullConstructorName = cls.name.slowToString();
-      if (constructorName !== const SourceString('')) {
-        fullConstructorName = '$fullConstructorName'
-                              '.${constructorName.slowToString()}';
-      }
-      return failOrReturnErroneousElement(cls, diagnosticNode,
-                                          new SourceString(fullConstructorName),
-                                          MessageKind.CANNOT_FIND_CONSTRUCTOR,
-                                          [fullConstructorName]);
+      String fullConstructorName =
+          resolver.compiler.resolver.constructorNameForDiagnostics(
+              cls.name,
+              constructorName);
+      return failOrReturnErroneousElement(
+          cls,
+          diagnosticNode,
+          new SourceString(fullConstructorName),
+          MessageKind.CANNOT_FIND_CONSTRUCTOR,
+          [fullConstructorName]);
     } else if (inConstContext && !result.modifiers.isConst()) {
       error(diagnosticNode, MessageKind.CONSTRUCTOR_IS_NOT_CONST);
     }
diff --git a/lib/compiler/implementation/scanner/keyword.dart b/lib/compiler/implementation/scanner/keyword.dart
index be4e652..31a4614 100644
--- a/lib/compiler/implementation/scanner/keyword.dart
+++ b/lib/compiler/implementation/scanner/keyword.dart
@@ -7,6 +7,7 @@
  */
 class Keyword implements SourceString {
   static const List<Keyword> values = const <Keyword> [
+      const Keyword("assert"),
       const Keyword("break"),
       const Keyword("case"),
       const Keyword("catch"),
@@ -23,9 +24,6 @@
       const Keyword("for"),
       const Keyword("if"),
       const Keyword("in"),
-      // TODO(ahe): Don't think this is a reserved word.
-      // See: http://dartbug.com/5579
-      const Keyword("is", info: IS_INFO),
       const Keyword("new"),
       const Keyword("null"),
       const Keyword("return"),
@@ -39,28 +37,31 @@
       const Keyword("void"),
       const Keyword("while"),
 
+      // TODO(ahe): Don't think this is a reserved word.
+      // See: http://dartbug.com/5579
+      const Keyword("is", info: IS_INFO),
+
       const Keyword("abstract", isBuiltIn: true),
       const Keyword("as", info: AS_INFO, isBuiltIn: true),
-      const Keyword("assert", isBuiltIn: true),
       const Keyword("dynamic", isBuiltIn: true),
+      const Keyword("export", isBuiltIn: true),
       const Keyword("external", isBuiltIn: true),
       const Keyword("factory", isBuiltIn: true),
       const Keyword("get", isBuiltIn: true),
       const Keyword("implements", isBuiltIn: true),
+      const Keyword("import", isBuiltIn: true),
       const Keyword("interface", isBuiltIn: true),
+      const Keyword("library", isBuiltIn: true),
       const Keyword("operator", isBuiltIn: true),
+      const Keyword("part", isBuiltIn: true),
       const Keyword("set", isBuiltIn: true),
       const Keyword("static", isBuiltIn: true),
       const Keyword("typedef", isBuiltIn: true),
 
-      const Keyword("export", isPseudo: true),
       const Keyword("hide", isPseudo: true),
-      const Keyword("import", isPseudo: true),
-      const Keyword("library", isPseudo: true),
       const Keyword("native", isPseudo: true),
       const Keyword("of", isPseudo: true),
       const Keyword("on", isPseudo: true),
-      const Keyword("part", isPseudo: true),
       const Keyword("show", isPseudo: true),
       const Keyword("source", isPseudo: true) ];
 
diff --git a/lib/compiler/implementation/scanner/listener.dart b/lib/compiler/implementation/scanner/listener.dart
index 86d088c..424d17f 100644
--- a/lib/compiler/implementation/scanner/listener.dart
+++ b/lib/compiler/implementation/scanner/listener.dart
@@ -436,6 +436,9 @@
   void handleEmptyStatement(Token token) {
   }
 
+  void handleAssertStatement(Token assertKeyword, Token semicolonToken) {
+  }
+
   /** Called with either the token containing a double literal, or
     * an immediately preceding "unary plus" token.
     */
@@ -1697,6 +1700,13 @@
                                 beginToken, inKeyword));
   }
 
+  void handleAssertStatement(Token assertKeyword, Token semicolonToken) {
+    NodeList arguments = popNode();
+    Node selector = new Identifier(assertKeyword);
+    Node send = new Send(null, selector, arguments);
+    pushNode(new ExpressionStatement(send, semicolonToken));
+  }
+
   void endUnamedFunction(Token token) {
     Statement body = popNode();
     NodeList formals = popNode();
diff --git a/lib/compiler/implementation/scanner/parser.dart b/lib/compiler/implementation/scanner/parser.dart
index b2faf1a..a276ebe 100644
--- a/lib/compiler/implementation/scanner/parser.dart
+++ b/lib/compiler/implementation/scanner/parser.dart
@@ -1149,6 +1149,8 @@
       return parseBreakStatement(token);
     } else if (value === 'continue') {
       return parseContinueStatement(token);
+    } else if (value === 'assert') {
+      return parseAssertStatement(token);
     } else if (value === ';') {
       return parseEmptyStatement(token);
     } else if (value === 'const') {
@@ -2130,6 +2132,14 @@
     return expectSemicolon(token);
   }
 
+  Token parseAssertStatement(Token token) {
+    Token assertKeyword = token;
+    token = expect('assert', token);
+    token = parseArguments(token);
+    listener.handleAssertStatement(assertKeyword, token);
+    return expectSemicolon(token);
+  }
+
   Token parseContinueStatement(Token token) {
     assert(optional('continue', token));
     Token continueKeyword = token;
diff --git a/lib/compiler/implementation/ssa/builder.dart b/lib/compiler/implementation/ssa/builder.dart
index 5cf3d37..7c573d4 100644
--- a/lib/compiler/implementation/ssa/builder.dart
+++ b/lib/compiler/implementation/ssa/builder.dart
@@ -119,6 +119,11 @@
     return compiler.findHelper(const SourceString('throwRuntimeError'));
   }
 
+  Element getThrowAbstractClassInstantiationError() {
+    return compiler.findHelper(
+        const SourceString('throwAbstractClassInstantiationError'));
+  }
+
   Element getClosureConverter() {
     return compiler.findHelper(const SourceString('convertDartClosureToJS'));
   }
@@ -1213,9 +1218,9 @@
         assert(superClass !== null);
         assert(superClass.resolutionState == STATE_DONE);
         Selector selector =
-            new Selector.call(superClass.name, enclosingClass.getLibrary(), 0);
+            new Selector.callDefaultConstructor(enclosingClass.getLibrary());
         // TODO(johnniwinther): Should we find injected constructors as well?
-        FunctionElement target = superClass.lookupConstructor(superClass.name);
+        FunctionElement target = superClass.lookupConstructor(selector);
         if (target === null) {
           compiler.internalError("no default constructor available");
         }
@@ -2937,6 +2942,11 @@
       compiler.internalError("malformed send in new expression");
     }
     InterfaceType type = elements.getType(annotation);
+    if (type.element.modifiers.isAbstract() &&
+        constructor.isGenerativeConstructor()) {
+      generateAbstractClassInstantiationError(node, type.name.slowToString());
+      return;
+    }
     if (compiler.world.needsRti(constructor.enclosingElement)) {
       type.arguments.forEach((DartType argument) {
         inputs.add(analyzeTypeArgument(argument, node));
@@ -3011,15 +3021,24 @@
     compiler.internalError(reason, node: node);
   }
 
-  void generateRuntimeError(Node node, String message) {
+  void generateError(Node node, String message, Element helper) {
     DartString messageObject = new DartString.literal(message);
     Constant messageConstant =
         constantSystem.createString(messageObject, node);
     HInstruction errorMessage = graph.addConstant(messageConstant);
-    Element helper = interceptors.getThrowRuntimeError();
     pushInvokeHelper1(helper, errorMessage);
   }
 
+  void generateRuntimeError(Node node, String message) {
+    generateError(node, message, interceptors.getThrowRuntimeError());
+  }
+
+  void generateAbstractClassInstantiationError(Node node, String message) {
+    generateError(node,
+                  message,
+                  interceptors.getThrowAbstractClassInstantiationError());
+  }
+
   void generateThrowNoSuchMethod(Node diagnosticNode,
                                  String methodName,
                                  [Link<Node> argumentNodes,
diff --git a/lib/compiler/implementation/ssa/codegen.dart b/lib/compiler/implementation/ssa/codegen.dart
index 27e1b23..b4e06b3 100644
--- a/lib/compiler/implementation/ssa/codegen.dart
+++ b/lib/compiler/implementation/ssa/codegen.dart
@@ -2696,12 +2696,15 @@
     return labels.last();
   }
 
+  js.VariableUse generateStateUse()
+      => new js.VariableUse(variableNames.stateName);
+
   HBasicBlock beginGraph(HGraph graph) {
     propagator = new SsaBailoutPropagator(compiler, generateAtUseSite);
     propagator.visitGraph(graph);
     // TODO(ngeoffray): We could avoid generating the state at the
     // call site for non-complex bailout methods.
-    newParameters.add(new js.Parameter('state'));
+    newParameters.add(new js.Parameter(variableNames.stateName));
 
     if (propagator.hasComplexBailoutTargets) {
       // Use generic parameters that will be assigned to
@@ -2717,7 +2720,7 @@
       // The setup phase of a bailout function sets up the environment for
       // each bailout target. Each bailout target will populate this
       // setup phase. It is put at the beginning of the function.
-      setup = new js.Switch(new js.VariableUse('state'), <js.SwitchClause>[]);
+      setup = new js.Switch(generateStateUse(), <js.SwitchClause>[]);
       return graph.entry;
     } else {
       // We have a simple bailout target, so we can reuse the names that
@@ -2788,7 +2791,7 @@
                                  nextBlock);
     currentBailoutSwitch.cases.add(clause);
     currentContainer = nextBlock;
-    pushExpressionAsStatement(new js.Assignment(new js.VariableUse('state'),
+    pushExpressionAsStatement(new js.Assignment(generateStateUse(),
                                                 new js.LiteralNumber('0')));
     js.Block setupBlock = new js.Block.empty();
     int i = 0;
@@ -2845,7 +2848,7 @@
     List<js.SwitchClause> cases = <js.SwitchClause>[];
     js.Block firstBlock = new js.Block.empty();
     cases.add(new js.Case(new js.LiteralNumber("0"), firstBlock));
-    currentBailoutSwitch = new js.Switch(new js.VariableUse('state'), cases);
+    currentBailoutSwitch = new js.Switch(generateStateUse(), cases);
     pushStatement(currentBailoutSwitch);
     oldContainerStack.add(currentContainer);
     currentContainer = firstBlock;
@@ -2922,14 +2925,13 @@
 
     use(node.inputs[0]);
     js.Binary stateEquals0 =
-        new js.Binary('===',
-                      new js.VariableUse('state'), new js.LiteralNumber('0'));
+        new js.Binary('===', generateStateUse(), new js.LiteralNumber('0'));
     js.Expression condition = new js.Binary('&&', stateEquals0, pop());
     // TODO(ngeoffray): Put the condition initialization in the
     // [setup] buffer.
     List<HBailoutTarget> targets = node.thenBlock.bailoutTargets;
     for (int i = 0, len = targets.length; i < len; i++) {
-      js.VariableUse stateRef = new js.VariableUse('state');
+      js.VariableUse stateRef = generateStateUse();
       js.Expression targetState = new js.LiteralNumber('${targets[i].state}');
       js.Binary stateTest = new js.Binary('===', stateRef, targetState);
       condition = new js.Binary('||', stateTest, condition);
diff --git a/lib/compiler/implementation/ssa/variable_allocator.dart b/lib/compiler/implementation/ssa/variable_allocator.dart
index 167c91f..d317a4a 100644
--- a/lib/compiler/implementation/ssa/variable_allocator.dart
+++ b/lib/compiler/implementation/ssa/variable_allocator.dart
@@ -369,22 +369,30 @@
   final Map<HInstruction, String> ownName;
   final Map<HBasicBlock, CopyHandler> copyHandlers;
   /**
-   * Name that is being used as a temporary to break cycles in
+   * Name that is used as a temporary to break cycles in
    * parallel copies. We make sure this name is not being used
    * anywhere by reserving it when we allocate names for instructions.
    */
   final String swapTemp;
+  /**
+   * Name that is used in bailout code. We make sure this name is not being used
+   * anywhere by reserving it when we allocate names for instructions.
+   */
+  final String stateName;
 
   VariableNames(Map<Element, String> parameterNames)
     : ownName = new Map<HInstruction, String>(),
       copyHandlers = new Map<HBasicBlock, CopyHandler>(),
-      swapTemp = computeSwapTemp(parameterNames);
+      swapTemp = computeFreshWithPrefix("t", parameterNames),
+      stateName = computeFreshWithPrefix("state", parameterNames);
 
-  static String computeSwapTemp(Map<Element, String> parameterNames) {
+  /** Returns a fresh variable with the given prefix. */
+  static String computeFreshWithPrefix(String prefix,
+                                       Map<Element, String> parameterNames) {
     Set<String> parameters = new Set<String>.from(parameterNames.getValues());
-    String name = 't0';
+    String name = '${prefix}0';
     int i = 1;
-    while (parameters.contains(name)) name = 't${i++}';
+    while (parameters.contains(name)) name = '$prefix${i++}';
     return name;
   }
 
@@ -424,9 +432,11 @@
   VariableNamer(LiveEnvironment environment, this.names, this.parameterNames)
     : usedNames = new Set<String>(),
       freeTemporaryNames = new List<String>() {
-    // [VariableNames.swapTemp] is being used when there is a cycle
-    // in a copy handler. Therefore we make sure no one will use it.
+    // [VariableNames.swapTemp] and [VariableNames.stateName] are being used
+    // throughout the function. Therefore we make sure no one uses it at any
+    // time.
     usedNames.add(names.swapTemp);
+    usedNames.add(names.stateName);
 
     // All liveIns instructions must have a name at this point, so we
     // add them to the list of used names.
diff --git a/lib/compiler/implementation/types/concrete_types_inferrer.dart b/lib/compiler/implementation/types/concrete_types_inferrer.dart
index cd22a7a..d93cb38 100644
--- a/lib/compiler/implementation/types/concrete_types_inferrer.dart
+++ b/lib/compiler/implementation/types/concrete_types_inferrer.dart
@@ -682,7 +682,8 @@
     if (!foundSuperOrRedirect) {
       ClassElement superClass = enclosingClass.superclass;
       if (enclosingClass != compiler.objectClass) {
-        FunctionElement target = superClass.lookupConstructor(superClass.name);
+        FunctionElement target = superClass.lookupConstructor(
+          new Selector.callDefaultConstructor(enclosingClass.getLibrary()));
         final superClassConcreteType = new ConcreteType.singleton(
             new ClassBaseType(enclosingClass));
         getSendReturnType(target, new ClassBaseType(enclosingClass),
diff --git a/lib/compiler/implementation/types/types.dart b/lib/compiler/implementation/types/types.dart
index dbbb11e..ca44c69 100644
--- a/lib/compiler/implementation/types/types.dart
+++ b/lib/compiler/implementation/types/types.dart
@@ -9,6 +9,7 @@
 #import('../elements/elements.dart');
 #import('../util/util.dart');
 #import('../scanner/scannerlib.dart');
+#import('../universe/universe.dart');
 
 #source('concrete_types_inferrer.dart');
 
diff --git a/lib/compiler/implementation/universe/universe.dart b/lib/compiler/implementation/universe/universe.dart
index 3baa353..03bb1a6 100644
--- a/lib/compiler/implementation/universe/universe.dart
+++ b/lib/compiler/implementation/universe/universe.dart
@@ -186,6 +186,17 @@
       : this(SelectorKind.CALL, Compiler.CALL_OPERATOR_NAME, null,
              selector.argumentCount, selector.namedArguments);
 
+  Selector.callConstructor(SourceString constructorName,
+                           LibraryElement library)
+      : this(SelectorKind.CALL,
+             constructorName,
+             library,
+             0,
+             const []);
+
+  Selector.callDefaultConstructor(LibraryElement library)
+      : this(SelectorKind.CALL, const SourceString(""), library, 0, const []);
+
   // TODO(kasperl): This belongs somewhere else.
   Selector.noSuchMethod()
       : this(SelectorKind.CALL, Compiler.NO_SUCH_METHOD, null, 2);
@@ -201,13 +212,8 @@
   bool isUnaryOperator() => isOperator() && argumentCount == 0;
   bool isBinaryOperator() => isOperator() && argumentCount == 1;
 
-  /** Check whether this is a call to 'assert' with one positional parameter. */
-  bool isAssertSyntax() {
-    return (isCall() &&
-            name.stringValue === "assert" &&
-            argumentCount == 1 &&
-            namedArgumentCount == 0);
-  }
+  /** Check whether this is a call to 'assert'. */
+  bool isAssert() => isCall() && name.stringValue === "assert";
 
   int hashCode() => argumentCount + 1000 * namedArguments.length;
   int get namedArgumentCount => namedArguments.length;
diff --git a/lib/compiler/implementation/warnings.dart b/lib/compiler/implementation/warnings.dart
index 0e57d68..9d00fd4 100644
--- a/lib/compiler/implementation/warnings.dart
+++ b/lib/compiler/implementation/warnings.dart
@@ -303,6 +303,13 @@
   static const TOP_LEVEL_VARIABLE_DECLARED_STATIC = const MessageKind(
       "Top-level variable cannot be declared static.");
 
+  static const WRONG_NUMBER_OF_ARGUMENTS_FOR_ASSERT = const MessageKind(
+      "Wrong number of arguments to assert. Should be 1, but given #{1}.");
+
+  static const ASSERT_IS_GIVEN_NAMED_ARGUMENTS = const MessageKind(
+      "assert takes no named arguments, but given #{1}.");
+
+
   static const COMPILER_CRASHED = const MessageKind(
       "Error: The compiler crashed when compiling this element.");
 
diff --git a/lib/core/errors.dart b/lib/core/errors.dart
index 85e9f93..cef165e 100644
--- a/lib/core/errors.dart
+++ b/lib/core/errors.dart
@@ -46,7 +46,10 @@
   const FallThroughError();
 }
 
-class AbstractClassInstantiationError {
+class AbstractClassInstantiationError implements Error {
+  final String _className;
+  const AbstractClassInstantiationError(String this._className);
+  String toString() => "Cannot instantiate abstract class: '$_className'";
 }
 
 /**
diff --git a/lib/html/dart2js/html_dart2js.dart b/lib/html/dart2js/html_dart2js.dart
index 68bcf42..e5cdd97 100644
--- a/lib/html/dart2js/html_dart2js.dart
+++ b/lib/html/dart2js/html_dart2js.dart
@@ -36918,18 +36918,24 @@
   /** @domName WheelEvent.webkitDirectionInvertedFromDevice */
   abstract bool get webkitDirectionInvertedFromDevice;
 
-  /** @domName WheelEvent.deltaX */
-  abstract int get deltaX;
+  /** @domName WheelEvent.wheelDeltaX */
+  abstract int get $dom_wheelDeltaX;
 
-  /** @domName WheelEvent.deltaY */
-  abstract int get deltaY;
+  /** @domName WheelEvent.wheelDeltaY */
+  abstract int get $dom_wheelDeltaY;
 
   /** @domName WheelEvent.initWebKitWheelEvent */
   void initWebKitWheelEvent(int wheelDeltaX, int wheelDeltaY, LocalWindow view, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey);
 
 
+  /** @domName WheelEvent.deltaX */
+  abstract num get deltaX;
+
+  /** @domName WheelEvent.deltaY */
+  abstract num get deltaY;
+
   /** @domName WheelEvent.deltaMode */
-  int get deltaMode;
+  abstract int get deltaMode;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
diff --git a/lib/html/dartium/html_dartium.dart b/lib/html/dartium/html_dartium.dart
index 973b4bb..6535ef4 100644
--- a/lib/html/dartium/html_dartium.dart
+++ b/lib/html/dartium/html_dartium.dart
@@ -41115,18 +41115,24 @@
   /** @domName WheelEvent.webkitDirectionInvertedFromDevice */
   abstract bool get webkitDirectionInvertedFromDevice;
 
-  /** @domName WheelEvent.deltaX */
-  abstract int get deltaX;
+  /** @domName WheelEvent.wheelDeltaX */
+  abstract int get $dom_wheelDeltaX;
 
-  /** @domName WheelEvent.deltaY */
-  abstract int get deltaY;
+  /** @domName WheelEvent.wheelDeltaY */
+  abstract int get $dom_wheelDeltaY;
 
   /** @domName WheelEvent.initWebKitWheelEvent */
   void initWebKitWheelEvent(int wheelDeltaX, int wheelDeltaY, LocalWindow view, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey);
 
 
+  /** @domName WheelEvent.deltaX */
+  abstract num get deltaX;
+
+  /** @domName WheelEvent.deltaY */
+  abstract num get deltaY;
+
   /** @domName WheelEvent.deltaMode */
-  int get deltaMode;
+  abstract int get deltaMode;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -41136,13 +41142,15 @@
 
   bool get webkitDirectionInvertedFromDevice native "WheelEvent_webkitDirectionInvertedFromDevice_Getter";
 
-  int get deltaX native "WheelEvent_wheelDeltaX_Getter";
+  int get $dom_wheelDeltaX native "WheelEvent_wheelDeltaX_Getter";
 
-  int get deltaY native "WheelEvent_wheelDeltaY_Getter";
+  int get $dom_wheelDeltaY native "WheelEvent_wheelDeltaY_Getter";
 
   void initWebKitWheelEvent(int wheelDeltaX, int wheelDeltaY, LocalWindow view, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey) native "WheelEvent_initWebKitWheelEvent_Callback";
 
 
+  num get deltaX => $dom_wheelDeltaX;
+  num get deltaY => $dom_wheelDeltaY;
   int get deltaMode => 0;
 
 }
diff --git a/lib/html/idl/dart/dart.idl b/lib/html/idl/dart/dart.idl
index f9e1b9a..86017f6 100644
--- a/lib/html/idl/dart/dart.idl
+++ b/lib/html/idl/dart/dart.idl
@@ -391,12 +391,3 @@
     [Custom] void handleEvent(in DOMTimeStamp time);
   };
 }
-
-module events {
-  [Supplemental]
-  interface WheelEvent {
-    [Suppressed] readonly attribute long wheelDelta;
-    [DartName=deltaX] readonly attribute long wheelDeltaX;
-    [DartName=deltaY] readonly attribute long wheelDeltaY;
-  };
-}
diff --git a/lib/html/scripts/htmlrenamer.py b/lib/html/scripts/htmlrenamer.py
index 55aca93..ee7892f 100644
--- a/lib/html/scripts/htmlrenamer.py
+++ b/lib/html/scripts/htmlrenamer.py
@@ -36,14 +36,14 @@
   'Document.createEvent',
   'Document.createTextNode',
   'Document.createTouchList',
+  'DocumentFragment.querySelector',
+  'DocumentFragment.querySelectorAll',
   'Document.getElementById',
   'Document.getElementsByClassName',
   'Document.getElementsByName',
   'Document.getElementsByTagName',
   'Document.querySelector',
   'Document.querySelectorAll',
-  'DocumentFragment.querySelector',
-  'DocumentFragment.querySelectorAll',
   'Element.childElementCount',
   'Element.children',
   'Element.className',
@@ -61,6 +61,7 @@
   'EventTarget.addEventListener',
   'EventTarget.dispatchEvent',
   'EventTarget.removeEventListener',
+  'LocalWindow.getComputedStyle',
   'MouseEvent.initMouseEvent',
   'Node.appendChild',
   'Node.attributes',
@@ -73,13 +74,14 @@
   'ShadowRoot.getElementById',
   'ShadowRoot.getElementsByClassName',
   'ShadowRoot.getElementsByTagName',
-  'Storage.length',
   'Storage.clear',
   'Storage.getItem',
   'Storage.key',
+  'Storage.length',
   'Storage.removeItem',
   'Storage.setItem',
-  'LocalWindow.getComputedStyle',
+  'WheelEvent.wheelDeltaX',
+  'WheelEvent.wheelDeltaY',
 ])
 
 # Members from the standard dom that exist in the dart:html library with
@@ -268,6 +270,7 @@
     "LocalWindow.get:frames",
     "LocalWindow.get:length",
     "LocalWindow.webkitCancelRequestAnimationFrame",
+    "WheelEvent.wheelDelta",
     ])
 
 class HtmlRenamer(object):
diff --git a/lib/html/templates/html/impl/impl_WheelEvent.darttemplate b/lib/html/templates/html/impl/impl_WheelEvent.darttemplate
index a2fbc06..e4b6609 100644
--- a/lib/html/templates/html/impl/impl_WheelEvent.darttemplate
+++ b/lib/html/templates/html/impl/impl_WheelEvent.darttemplate
@@ -77,6 +77,8 @@
   int get _deltaMode() native 'return this.deltaMode';
 
 $else
+  num get deltaX => $dom_wheelDeltaX;
+  num get deltaY => $dom_wheelDeltaY;
   int get deltaMode => 0;
 
 $endif
diff --git a/lib/html/templates/html/interface/interface_WheelEvent.darttemplate b/lib/html/templates/html/interface/interface_WheelEvent.darttemplate
index d623c4c..1966c89 100644
--- a/lib/html/templates/html/interface/interface_WheelEvent.darttemplate
+++ b/lib/html/templates/html/interface/interface_WheelEvent.darttemplate
@@ -6,6 +6,12 @@
 abstract class $ID$EXTENDS {
 $!MEMBERS
 
+  /** @domName WheelEvent.deltaX */
+  abstract num get deltaX;
+
+  /** @domName WheelEvent.deltaY */
+  abstract num get deltaY;
+
   /** @domName WheelEvent.deltaMode */
-  int get deltaMode;
+  abstract int get deltaMode;
 }
diff --git a/lib/isolate/timer.dart b/lib/isolate/timer.dart
index a90c2d0..8684de7 100644
--- a/lib/isolate/timer.dart
+++ b/lib/isolate/timer.dart
@@ -8,10 +8,10 @@
    * [milliSeconds] milliseconds.
    */
   factory Timer(int milliSeconds, void callback(Timer timer)) {
-    if (_factory == null) {
+    if (_TimerFactory._factory == null) {
       throw new UnsupportedOperationException("Timer interface not supported.");
     }
-    return _factory(milliSeconds, callback, false);
+    return _TimerFactory._factory(milliSeconds, callback, false);
   }
 
   /**
@@ -19,18 +19,16 @@
    * [milliSeconds] millisecond until cancelled.
    */
   factory Timer.repeating(int milliSeconds, void callback(Timer timer)) {
-    if (_factory == null) {
+    if (_TimerFactory._factory == null) {
       throw new UnsupportedOperationException("Timer interface not supported.");
     }
-    return _factory(milliSeconds, callback, true);
+    return _TimerFactory._factory(milliSeconds, callback, true);
   }
 
   /**
    * Cancels the timer.
    */
   void cancel();
-
-  static _TimerFactoryClosure _factory;
 }
 
 // TODO(ajohnsen): Patch timer once we have support for patching named
@@ -40,6 +38,12 @@
                                    void callback(Timer timer),
                                    bool repeating);
 
+class _TimerFactory {
+  static _TimerFactoryClosure _factory;
+}
+
+// TODO(ahe): Warning: this is NOT called by Dartium. Instead, it sets
+// [_TimerFactory._factory] directly.
 void _setTimerFactoryClosure(_TimerFactoryClosure closure) {
-  Timer._factory = closure;
+  _TimerFactory._factory = closure;
 }
diff --git a/pkg/dartdoc/lib/dartdoc.dart b/pkg/dartdoc/lib/dartdoc.dart
index 8e9a159..5acdba1 100644
--- a/pkg/dartdoc/lib/dartdoc.dart
+++ b/pkg/dartdoc/lib/dartdoc.dart
@@ -819,7 +819,11 @@
     writeln('<button id="show-inherited" class="show-inherited">'
             'Hide inherited</button>');
 
-    docCode(type, type.location, getTypeComment(type));
+    writeln('<div class="doc">');
+    docComment(type, getTypeComment(type));
+    docCode(type.location);
+    writeln('</div>');
+
     docInheritance(type);
     docTypedef(type);
 
@@ -964,7 +968,9 @@
               title="Permalink to ${type.simpleName}">#</a>''');
     writeln('</h4>');
 
-    docCode(type, type.location, null, showCode: true);
+    writeln('<div class="doc">');
+    docCode(type.location);
+    writeln('</div>');
 
     writeln('</div>');
   }
@@ -991,21 +997,48 @@
     }
   }
 
+  static const operatorOrder = const <String>[
+      '[]', '[]=', // Indexing.
+      '+', Mirror.UNARY_MINUS, '-', '*', '/', '~/', '%', // Arithmetic.
+      '&', '|', '^', '~', // Bitwise.
+      '<<', '>>', // Shift.
+      '<', '<=', '>', '>=', // Relational.
+      '==', // Equality.
+  ];
+
+  static final Map<String, int> operatorOrderMap = (){
+    var map = new Map<String, int>();
+    var index = 0;
+    for (String operator in operatorOrder) {
+      map[operator] = index++;
+    }
+    return map;
+  }();
+
   void docMembers(ObjectMirror host) {
     // Collect the different kinds of members.
     final staticMethods = [];
-    final staticFields = [];
+    final staticGetters = new Map<String,MemberMirror>();
+    final staticSetters = new Map<String,MemberMirror>();
     final memberMap = new Map<String,MemberMirror>();
     final instanceMethods = [];
-    final instanceFields = [];
+    final instanceOperators = [];
+    final instanceGetters = new Map<String,MemberMirror>();
+    final instanceSetters = new Map<String,MemberMirror>();
 
     host.declaredMembers.forEach((_, MemberMirror member) {
       if (member.isPrivate) return;
       if (host is LibraryMirror || member.isStatic) {
-        if (member.isMethod) {
-          staticMethods.add(member);
-        } else  if (member.isField) {
-          staticFields.add(member);
+        if (member is MethodMirror) {
+          if (member.isGetter) {
+            staticGetters[member.displayName] = member;
+          } else if (member.isSetter) {
+            staticSetters[member.displayName] = member;
+          } else {
+            staticMethods.add(member);
+          }
+        } else if (member is FieldMirror) {
+          staticGetters[member.displayName] = member;
         }
       }
     });
@@ -1016,53 +1049,117 @@
         type.declaredMembers.forEach((_, MemberMirror member) {
           if (member.isPrivate) return;
           if (!member.isStatic) {
-            memberMap.putIfAbsent(member.simpleName, () => member);
+            if (member.isField) {
+              // Fields override both getters and setters.
+              memberMap.putIfAbsent(member.simpleName, () => member);
+              memberMap.putIfAbsent('${member.simpleName}=', () => member);
+            } else {
+              memberMap.putIfAbsent(member.simpleName, () => member);
+            }
           }
         });
       }
     }
 
     memberMap.forEach((_, MemberMirror member) {
-      if (member.isMethod) {
-        instanceMethods.add(member);
-      } else  if (member.isField) {
-        instanceFields.add(member);
+      if (member is MethodMirror) {
+        if (member.isGetter) {
+          instanceGetters[member.displayName] = member;
+        } else if (member.isSetter) {
+          instanceSetters[member.displayName] = member;
+        } else if (member.isOperator) {
+          instanceOperators.add(member);
+        } else {
+          instanceMethods.add(member);
+        }
+      } else if (member is FieldMirror) {
+        instanceGetters[member.displayName] = member;
       }
     });
 
-    if (staticFields.length > 0) {
-      final title = host is LibraryMirror ? 'Variables' : 'Static Fields';
+    instanceOperators.sort((MethodMirror a, MethodMirror b) {
+      return operatorOrderMap[a.simpleName].compareTo(
+          operatorOrderMap[b.simpleName]);
+    });
+
+    docProperties(host,
+                  host is LibraryMirror ? 'Properties' : 'Static Properties',
+                  staticGetters, staticSetters);
+    docMethods(host,
+               host is LibraryMirror ? 'Functions' : 'Static Methods',
+               staticMethods);
+
+    docProperties(host, 'Properties', instanceGetters, instanceSetters);
+    docMethods(host, 'Operators', instanceOperators);
+    docMethods(host, 'Methods', orderByName(instanceMethods));
+  }
+
+  /**
+   * Documents fields, getters, and setters as properties.
+   */
+  void docProperties(ObjectMirror host, String title,
+                     Map<String,MemberMirror> getters,
+                     Map<String,MemberMirror> setters) {
+    if (getters.isEmpty() && setters.isEmpty()) return;
+
+    var nameSet = new Set<String>.from(getters.getKeys());
+    nameSet.addAll(setters.getKeys());
+    var nameList = new List<String>.from(nameSet);
+    nameList.sort((String a, String b) {
+      return a.toLowerCase().compareTo(b.toLowerCase());
+    });
+
+    writeln('<div>');
+    writeln('<h3>$title</h3>');
+    for (String name in nameList) {
+      MemberMirror getter = getters[name];
+      MemberMirror setter = setters[name];
+      if (setter == null) {
+        if (getter is FieldMirror) {
+          // We have a field.
+          docField(host, getter);
+        } else {
+          // We only have a getter.
+          assert(getter is MethodMirror);
+          docProperty(host, getter, null);
+        }
+      } else if (getter == null) {
+        // We only have a setter => Document as a method.
+        assert(setter is MethodMirror);
+        docMethod(host, setter);
+      } else {
+        DocComment getterComment = getMemberComment(getter);
+        DocComment setterComment = getMemberComment(setter);
+        if (getter.surroundingDeclaration !== setter.surroundingDeclaration ||
+            getterComment != null && setterComment != null) {
+          // Both have comments or are not declared in the same class
+          // => Documents separately.
+          if (getter is FieldMirror) {
+            // Document field as a getter (setter is inherited).
+            docField(host, getter, asGetter: true);
+          } else {
+            docMethod(host, getter);
+          }
+          if (setter is FieldMirror) {
+            // Document field as a setter (getter is inherited).
+            docField(host, setter, asSetter: true);
+          } else {
+            docMethod(host, setter);
+          }
+        } else {
+          // Document as field.
+          docProperty(host, getter, setter);
+        }
+      }
+    }
+    writeln('</div>');
+  }
+
+  void docMethods(ObjectMirror host, String title, List<MethodMirror> methods) {
+    if (methods.length > 0) {
       writeln('<div>');
       writeln('<h3>$title</h3>');
-      for (final field in orderByName(staticFields)) {
-        docField(host, field);
-      }
-      writeln('</div>');
-    }
-
-    if (staticMethods.length > 0) {
-      final title = host is LibraryMirror ? 'Functions' : 'Static Methods';
-      writeln('<div>');
-      writeln('<h3>$title</h3>');
-      for (final method in orderByName(staticMethods)) {
-        docMethod(host, method);
-      }
-      writeln('</div>');
-    }
-
-    if (instanceFields.length > 0) {
-      writeln('<div>');
-      writeln('<h3>Fields</h3>');
-      for (final field in orderByName(instanceFields)) {
-        docField(host, field);
-      }
-      writeln('</div>');
-    }
-
-    if (instanceMethods.length > 0) {
-      writeln('<div>');
-      writeln('<h3>Methods</h3>');
-      for (final method in orderByName(instanceMethods)) {
+      for (final method in methods) {
         docMethod(host, method);
       }
       writeln('</div>');
@@ -1070,104 +1167,188 @@
   }
 
   /**
-   * Documents the [method] in type [type]. Handles all kinds of methods
-   * including getters, setters, and constructors.
+   * Documents the [member] declared in [host]. Handles all kinds of members
+   * including getters, setters, and constructors. If [member] is a
+   * [FieldMirror] it is documented as a getter or setter depending upon the
+   * value of [asGetter].
    */
-  void docMethod(ObjectMirror host, MethodMirror method) {
+  void docMethod(ObjectMirror host, MemberMirror member,
+                 {bool asGetter: false}) {
     _totalMembers++;
-    _currentMember = method;
+    _currentMember = member;
 
-    bool showCode = includeSource && !method.isAbstract;
-    bool inherited = host != method.surroundingDeclaration;
+    bool isAbstract = false;
+    String name = member.displayName;
+    if (member is FieldMirror) {
+      if (asGetter) {
+        // Getter.
+        name = 'get $name';
+      } else {
+        // Setter.
+        name = 'set $name';
+      }
+    } else {
+      assert(member is MethodMirror);
+      isAbstract = member.isAbstract;
+      if (member.isGetter) {
+        // Getter.
+        name = 'get $name';
+      } else if (member.isSetter) {
+        // Setter.
+        name = 'set $name';
+      }
+    }
+
+    bool showCode = includeSource && !isAbstract;
+    bool inherited = host != member.surroundingDeclaration;
 
     writeln('<div class="method${inherited ? ' inherited': ''}">'
-            '<h4 id="${memberAnchor(method)}">');
+            '<h4 id="${memberAnchor(member)}">');
 
     if (showCode) {
       writeln('<button class="show-code">Code</button>');
     }
 
-    if (method.isConstructor) {
-      if (method.isFactory) {
-        write('factory ');
-      } else {
-        write(method.isConst ? 'const ' : 'new ');
+    if (member is MethodMirror) {
+      if (member.isConstructor) {
+        if (member.isFactory) {
+          write('factory ');
+        } else {
+          write(member.isConst ? 'const ' : 'new ');
+        }
+      } else if (member.isAbstract) {
+        write('abstract ');
       }
-    } else if (method.isAbstract) {
-      write('abstract ');
-    }
 
-    if (!method.isConstructor) {
-      annotateType(host, method.returnType);
-    }
-
-    var name = method.displayName;
-    // Translate specially-named methods: getters, setters, operators.
-    if (method.isGetter) {
-      // Getter.
-      name = 'get $name';
-    } else if (method.isSetter) {
-      // Setter.
-      name = 'set $name';
+      if (!member.isConstructor) {
+        annotateType(host, member.returnType);
+      }
+    } else {
+      assert(member is FieldMirror);
+      if (asGetter) {
+        annotateType(host, member.type);
+      } else {
+        write('void ');
+      }
     }
 
     write('<strong>$name</strong>');
 
-    docParamList(host, method.parameters);
+    if (member is MethodMirror) {
+      if (!member.isGetter) {
+        docParamList(host, member.parameters);
+      }
+    } else {
+      assert(member is FieldMirror);
+      if (!asGetter) {
+        write('(');
+        annotateType(host, member.type);
+        write(' value)');
+      }
+    }
 
     var prefix = host is LibraryMirror ? '' : '${typeName(host)}.';
-    write(''' <a class="anchor-link" href="#${memberAnchor(method)}"
+    write(''' <a class="anchor-link" href="#${memberAnchor(member)}"
               title="Permalink to $prefix$name">#</a>''');
     writeln('</h4>');
 
     if (inherited) {
       write('<div class="inherited-from">inherited from ');
-      annotateType(host, method.surroundingDeclaration);
+      annotateType(host, member.surroundingDeclaration);
       write('</div>');
     }
 
-    docCode(host, method.location, getMemberComment(method), showCode: showCode);
+    writeln('<div class="doc">');
+    docComment(host, getMemberComment(member));
+    if (showCode) {
+      docCode(member.location);
+    }
+    writeln('</div>');
 
     writeln('</div>');
   }
 
-  /** Documents the field [field] of type [type]. */
-  void docField(ObjectMirror host, FieldMirror field) {
-    _totalMembers++;
-    _currentMember = field;
+  void docField(ObjectMirror host, FieldMirror field,
+                {bool asGetter: false, bool asSetter: false}) {
+    if (asGetter) {
+      docMethod(host, field, asGetter: true);
+    } else if (asSetter) {
+      docMethod(host, field, asGetter: false);
+    } else {
+      docProperty(host, field, null);
+    }
+  }
 
-    bool inherited = host != field.surroundingDeclaration;
+  /**
+   * Documents the property defined by [getter] and [setter] of declared in
+   * [host]. If [getter] is a [FieldMirror], [setter] must be [:null:].
+   * Otherwise, if [getter] is a [MethodMirror], the property is considered
+   * final if [setter] is [:null:].
+   */
+  void docProperty(ObjectMirror host,
+                   MemberMirror getter, MemberMirror setter) {
+    assert(getter != null);
+    _totalMembers++;
+    _currentMember = getter;
+
+    bool inherited = host != getter.surroundingDeclaration;
 
     writeln('<div class="field${inherited ? ' inherited' : ''}">'
-            '<h4 id="${memberAnchor(field)}">');
+            '<h4 id="${memberAnchor(getter)}">');
 
     if (includeSource) {
       writeln('<button class="show-code">Code</button>');
     }
 
-    if (field.isFinal) {
+    bool isConst = false;
+    bool isFinal;
+    TypeMirror type;
+    if (getter is FieldMirror) {
+      assert(setter == null);
+      isConst = getter.isConst;
+      isFinal = getter.isFinal;
+      type = getter.type;
+    } else {
+      assert(getter is MethodMirror);
+      isFinal = setter == null;
+      type = getter.returnType;
+    }
+
+    if (isConst) {
+      write('const ');
+    } else if (isFinal) {
       write('final ');
-    } else if (field.type.isDynamic) {
+    } else if (type.isDynamic) {
       write('var ');
     }
 
-    annotateType(host, field.type);
+    annotateType(host, type);
     var prefix = host is LibraryMirror ? '' : '${typeName(host)}.';
     write(
         '''
-        <strong>${field.simpleName}</strong> <a class="anchor-link"
-            href="#${memberAnchor(field)}"
-            title="Permalink to $prefix${field.simpleName}">#</a>
+        <strong>${getter.simpleName}</strong> <a class="anchor-link"
+            href="#${memberAnchor(getter)}"
+            title="Permalink to $prefix${getter.simpleName}">#</a>
         </h4>
         ''');
 
     if (inherited) {
       write('<div class="inherited-from">inherited from ');
-      annotateType(host, field.surroundingDeclaration);
+      annotateType(host, getter.surroundingDeclaration);
       write('</div>');
     }
 
-    docCode(host, field.location, getMemberComment(field), showCode: true);
+    DocComment comment = getMemberComment(getter);
+    if (comment == null && setter != null) {
+      comment = getMemberComment(setter);
+    }
+    writeln('<div class="doc">');
+    docComment(host, comment);
+    docCode(getter.location);
+    if (setter != null) {
+      docCode(setter.location);
+    }
+    writeln('</div>');
 
     writeln('</div>');
   }
@@ -1200,13 +1381,7 @@
     write(')');
   }
 
-  /**
-   * Documents the code contained within [span] with [comment]. If [showCode]
-   * is `true` (and [includeSource] is set), also includes the source code.
-   */
-  void docCode(ObjectMirror host, Location location, DocComment comment,
-               [bool showCode = false]) {
-    writeln('<div class="doc">');
+  void docComment(ObjectMirror host, DocComment comment) {
     if (comment != null) {
       if (comment.inheritedFrom !== null) {
         writeln('<div class="inherited">');
@@ -1219,14 +1394,17 @@
         writeln(comment.html);
       }
     }
+  }
 
-    if (includeSource && showCode) {
+  /**
+   * Documents the source code contained within [location].
+   */
+  void docCode(Location location) {
+    if (includeSource) {
       writeln('<pre class="source">');
       writeln(md.escapeHtml(unindentCode(location)));
       writeln('</pre>');
     }
-
-    writeln('</div>');
   }
 
   DocComment createDocComment(String text, [InterfaceMirror inheritedFrom]) =>
diff --git a/pkg/dartdoc/lib/mirrors.dart b/pkg/dartdoc/lib/mirrors.dart
index 326d1be..692e37a 100644
--- a/pkg/dartdoc/lib/mirrors.dart
+++ b/pkg/dartdoc/lib/mirrors.dart
@@ -353,6 +353,11 @@
   bool get isFinal;
 
   /**
+   * Returns true if this field is const.
+   */
+  bool get isConst;
+
+  /**
    * Returns the type of this field.
    */
   TypeMirror get type;
diff --git a/pkg/dartdoc/lib/src/client/client-shared.dart b/pkg/dartdoc/lib/src/client/client-shared.dart
index bddaa12..a448ae2 100644
--- a/pkg/dartdoc/lib/src/client/client-shared.dart
+++ b/pkg/dartdoc/lib/src/client/client-shared.dart
@@ -38,18 +38,20 @@
     // disabled.
     if (showCode == null) continue;
 
-    var pre = elem.query('pre.source');
+    var preList = elem.queryAll('pre.source');
 
     showCode.on.click.add((e) {
-      if (pre.classes.contains('expanded')) {
-        pre.classes.remove('expanded');
-      } else {
-        // Syntax highlight.
-        if (!pre.classes.contains('formatted')) {
-          pre.innerHTML = classifySource(pre.text);
-          pre.classes.add('formatted');
-        };
-        pre.classes.add('expanded');
+      for (final pre in preList) {
+        if (pre.classes.contains('expanded')) {
+          pre.classes.remove('expanded');
+        } else {
+          // Syntax highlight.
+          if (!pre.classes.contains('formatted')) {
+            pre.innerHTML = classifySource(pre.text);
+            pre.classes.add('formatted');
+          };
+          pre.classes.add('expanded');
+        }
       }
     });
   }
diff --git a/pkg/dartdoc/lib/src/mirrors/dart2js_mirror.dart b/pkg/dartdoc/lib/src/mirrors/dart2js_mirror.dart
index af3f858..1925ec2 100644
--- a/pkg/dartdoc/lib/src/mirrors/dart2js_mirror.dart
+++ b/pkg/dartdoc/lib/src/mirrors/dart2js_mirror.dart
@@ -1374,9 +1374,10 @@
 
   bool get isStatic => _variable.modifiers.isStatic();
 
-  // TODO(johnniwinther): Should this return true on const as well?
   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);
diff --git a/pkg/dartdoc/static/styles.css b/pkg/dartdoc/static/styles.css
index fd643c6..bd9452f 100644
--- a/pkg/dartdoc/static/styles.css
+++ b/pkg/dartdoc/static/styles.css
@@ -361,9 +361,9 @@
 /* Only show the "code" link for the highlighted member. */
 .show-code, .show-inherited {
   float: right;
-  font: 600 11px/22px 'Open Sans', 'Lucida Sans Unicode', 'Lucida Grande',
+  font: 600 11px 'Open Sans', 'Lucida Sans Unicode', 'Lucida Grande',
       sans-serif;
-  padding: 0 0 6px 0; /* In case it gets too close to the member. */
+  padding: 0 0 0 6px; /* In case it gets too close to the member. */
   border: none;
   background: transparent;
   margin: 0;
@@ -395,7 +395,7 @@
 
 /* Links that don't cause a page refresh. */
 .anchor-link, .anchor-link:visited,
-.show-code, .show-code:visited, 
+.show-code, .show-code:visited,
 .show-inherited, .show-inherited:visited {
   color: hsl(40, 100%, 40%);
   cursor: pointer;
@@ -407,7 +407,7 @@
 }
 
 .anchor-link:hover,
-.show-code:hover, 
+.show-code:hover,
 .show-inherited:hover {
   color: hsl(40, 100%, 60%);
 }
diff --git a/runtime/bin/http_impl.dart b/runtime/bin/http_impl.dart
index 7e71ca8..a0d73ba 100644
--- a/runtime/bin/http_impl.dart
+++ b/runtime/bin/http_impl.dart
@@ -2105,29 +2105,92 @@
   }
 
   HttpClientConnection _prepareHttpClientConnection(
-    String method,
-    Uri url,
-    [_HttpClientConnection connection]) {
+      String method,
+      Uri url,
+      [_HttpClientConnection connection]) {
 
-    String host = url.domain;
-    int port = url.port == 0 ? HttpClient.DEFAULT_HTTP_PORT : url.port;
+    void _establishConnection(String host,
+                              int port,
+                              _ProxyConfiguration proxyConfiguration,
+                              int proxyIndex) {
 
-    void _connectionOpened(_SocketConnection socketConn,
-                           _HttpClientConnection connection,
-                           bool usingProxy) {
-      connection._usingProxy = usingProxy;
-      connection._connectionEstablished(socketConn);
-      HttpClientRequest request = connection.open(method, url);
-      request.headers.host = host;
-      request.headers.port = port;
-      if (connection._onRequest != null) {
-        connection._onRequest(request);
+      void _connectionOpened(_SocketConnection socketConn,
+                             _HttpClientConnection connection,
+                             bool usingProxy) {
+        connection._usingProxy = usingProxy;
+        connection._connectionEstablished(socketConn);
+        HttpClientRequest request = connection.open(method, url);
+        request.headers.host = host;
+        request.headers.port = port;
+        if (connection._onRequest != null) {
+          connection._onRequest(request);
+        } else {
+          request.outputStream.close();
+        }
+      }
+
+      assert(proxyIndex < proxyConfiguration.proxies.length);
+
+      // Determine the actual host to connect to.
+      String connectHost;
+      int connectPort;
+      _Proxy proxy = proxyConfiguration.proxies[proxyIndex];
+      if (proxy.isDirect) {
+        connectHost = host;
+        connectPort = port;
       } else {
-        request.outputStream.close();
+        connectHost = proxy.host;
+        connectPort = proxy.port;
+      }
+
+      // If there are active connections for this key get the first one
+      // otherwise create a new one.
+      String key = _connectionKey(connectHost, connectPort);
+      Queue socketConnections = _openSockets[key];
+      if (socketConnections == null || socketConnections.isEmpty()) {
+        Socket socket = new Socket(connectHost, connectPort);
+        // Until the connection is established handle connection errors
+        // here as the HttpClientConnection object is not yet associated
+        // with the socket.
+        socket.onError = (e) {
+          proxyIndex++;
+          if (proxyIndex < proxyConfiguration.proxies.length) {
+            // Try the next proxy in the list.
+            _establishConnection(host, port, proxyConfiguration, proxyIndex);
+          } else {
+            // Report the error through the HttpClientConnection object to
+            // the client.
+            connection._onError(e);
+          }
+        };
+        socket.onConnect = () {
+          // When the connection is established, clear the error
+          // callback as it will now be handled by the
+          // HttpClientConnection object which will be associated with
+          // the connected socket.
+          socket.onError = null;
+          _SocketConnection socketConn =
+          new _SocketConnection(connectHost, connectPort, socket);
+          _activeSockets.add(socketConn);
+          _connectionOpened(socketConn, connection, !proxy.isDirect);
+        };
+      } else {
+        _SocketConnection socketConn = socketConnections.removeFirst();
+        _activeSockets.add(socketConn);
+        new Timer(0, (ignored) =>
+                  _connectionOpened(socketConn, connection, !proxy.isDirect));
+
+        // Get rid of eviction timer if there are no more active connections.
+        if (socketConnections.isEmpty()) _openSockets.remove(key);
+        if (_openSockets.isEmpty()) _cancelEvictionTimer();
       }
     }
 
-    // Create a new connection if we are not re-using an existing one.
+    // Find the TCP host and port.
+    String host = url.domain;
+    int port = url.port == 0 ? HttpClient.DEFAULT_HTTP_PORT : url.port;
+
+    // Create a new connection object if we are not re-using an existing one.
     if (connection == null) {
       connection = new _HttpClientConnection(this);
     }
@@ -2141,53 +2204,8 @@
       proxyConfiguration = new _ProxyConfiguration(_findProxy(url));
     }
 
-    // Determine the actual host to connect to.
-    String connectHost;
-    int connectPort;
-    _Proxy proxy = proxyConfiguration.proxies[0];
-    if (proxy.isDirect) {
-      connectHost = host;
-      connectPort = port;
-    } else {
-      connectHost = proxy.host;
-      connectPort = proxy.port;
-    }
-
-    // If there are active connections for this key get the first one
-    // otherwise create a new one.
-    String key = _connectionKey(connectHost, connectPort);
-    Queue socketConnections = _openSockets[key];
-    if (socketConnections == null || socketConnections.isEmpty()) {
-      Socket socket = new Socket(connectHost, connectPort);
-      // Until the connection is established handle connection errors
-      // here as the HttpClientConnection object is not yet associated
-      // with the socket.
-      socket.onError = (e) {
-        // Report the error through the HttpClientConnection object to
-        // the client.
-        connection._onError(e);
-      };
-      socket.onConnect = () {
-        // When the connection is established, clear the error
-        // callback as it will now be handled by the
-        // HttpClientConnection object which will be associated with
-        // the connected socket.
-        socket.onError = null;
-        _SocketConnection socketConn =
-            new _SocketConnection(connectHost, connectPort, socket);
-        _activeSockets.add(socketConn);
-        _connectionOpened(socketConn, connection, !proxy.isDirect);
-      };
-    } else {
-      _SocketConnection socketConn = socketConnections.removeFirst();
-      _activeSockets.add(socketConn);
-      new Timer(0, (ignored) =>
-                _connectionOpened(socketConn, connection, !proxy.isDirect));
-
-      // Get rid of eviction timer if there are no more active connections.
-      if (socketConnections.isEmpty()) _openSockets.remove(key);
-      if (_openSockets.isEmpty()) _cancelEvictionTimer();
-    }
+    // Establish the connection starting with the first proxy configured.
+    _establishConnection(host, port, proxyConfiguration, 0);
 
     return connection;
   }
diff --git a/runtime/vm/disassembler_x64.cc b/runtime/vm/disassembler_x64.cc
index 5cac646..db52c38 100644
--- a/runtime/vm/disassembler_x64.cc
+++ b/runtime/vm/disassembler_x64.cc
@@ -426,12 +426,19 @@
 
 // Append the str to the output buffer.
 void DisassemblerX64::AppendToBuffer(const char* format, ...) {
+  intptr_t available = buffer_size_ - buffer_pos_;
+  if (available <= 1) {
+    ASSERT(buffer_[buffer_pos_] == '\0');
+    return;
+  }
   char* buf = buffer_ + buffer_pos_;
   va_list args;
   va_start(args, format);
-  int retval = OS::VSNPrint(buf, buffer_size_, format, args);
+  int length = OS::VSNPrint(buf, available, format, args);
   va_end(args);
-  buffer_pos_ += retval;
+  buffer_pos_ =
+      (length >= available) ? (buffer_size_ - 1) : (buffer_pos_ + length);
+  ASSERT(buffer_pos_ < buffer_size_);
 }
 
 
@@ -1801,9 +1808,7 @@
     }
   }  // !processed
 
-  if (buffer_pos_ < buffer_size_) {
-    buffer_[buffer_pos_] = '\0';
-  }
+  ASSERT(buffer_[buffer_pos_] == '\0');
 
   int instr_len = data - reinterpret_cast<uint8_t*>(pc);
   ASSERT(instr_len > 0);  // Ensure progress.
diff --git a/tests/co19/co19-compiler.status b/tests/co19/co19-compiler.status
index cb3c6f5..e745c56 100644
--- a/tests/co19/co19-compiler.status
+++ b/tests/co19/co19-compiler.status
@@ -188,9 +188,7 @@
 Language/13_Libraries_and_Scripts/13_Libraries_and_Scripts_A05_t04: Fail, OK # contains syntax error
 Language/13_Libraries_and_Scripts/2_Imports_A01_t18: Fail, OK # contains semantic error
 Language/13_Libraries_and_Scripts/2_Imports_A02_t18: Fail, OK # contains syntax error
-Language/13_Libraries_and_Scripts/2_Imports_A02_t20: Fail, OK # contains syntax error
 Language/13_Libraries_and_Scripts/2_Imports_A02_t21: Fail, OK # contains syntax error
-Language/13_Libraries_and_Scripts/2_Imports_A02_t22: Fail, OK # contains syntax error
 Language/13_Libraries_and_Scripts/2_Imports_A02_t24: Fail, OK # co19 issue 243
 Language/13_Libraries_and_Scripts/2_Imports_A05_t02: Fail, OK # invalid directive syntax
 Language/06_Functions/06_Functions_A01_t06: Fail, OK # expecting error that doesn't exist
diff --git a/tests/co19/co19-dart2dart.status b/tests/co19/co19-dart2dart.status
index a15d037..d9365ce 100644
--- a/tests/co19/co19-dart2dart.status
+++ b/tests/co19/co19-dart2dart.status
@@ -45,7 +45,6 @@
 Language/05_Variables/05_Variables_A05_t02: Fail # http://dartbug.com/5519
 Language/06_Functions/06_Functions_A01_t06: Fail # inherited from VM
 Language/06_Functions/06_Functions_A01_t22: Fail # inherited from VM
-Language/06_Functions/06_Functions_A01_t23: Fail # http://dartbug.com/5519
 Language/06_Functions/06_Functions_A01_t31: Fail # http://dartbug.com/5519
 Language/06_Functions/1_Function_Declaration_A01_t01: Fail # http://dartbug.com/5519
 Language/06_Functions/1_Function_Declaration_A02_t02: Fail # http://dartbug.com/5519
@@ -401,7 +400,6 @@
 Language/10_Expressions/28_Identifier_Reference_A04_t06: Fail # Inherited from dart2js
 Language/10_Expressions/28_Identifier_Reference_A04_t07: Fail, OK # co19 issue 184
 Language/10_Expressions/28_Identifier_Reference_A05_t09: Fail # inherited from VM
-Language/10_Expressions/28_Identifier_Reference_A06_t07: Fail # inherited from VM
 Language/10_Expressions/28_Identifier_Reference_A06_t13: Fail, OK # co19 issue 254
 Language/10_Expressions/28_Identifier_Reference_A06_t15: Fail # inherited from VM
 Language/10_Expressions/28_Identifier_Reference_A07_t01: Fail # http://dartbug.com/5519
@@ -466,9 +464,6 @@
 Language/11_Statements/11_Labels_A03_t04: Fail # inherited from dart2js
 Language/11_Statements/13_Continue_A02_t12: Fail # inherited from dart2js
 Language/11_Statements/13_Continue_A02_t13: Fail # inherited from dart2js
-Language/11_Statements/15_Assert_A01_t03: Fail # http://dartbug.com/5519
-Language/11_Statements/15_Assert_A01_t04: Fail # http://dartbug.com/5519
-Language/11_Statements/15_Assert_A01_t05: Fail # http://dartbug.com/5519
 Language/13_Libraries_and_Scripts/13_Libraries_and_Scripts_A05_t04: Fail # inherited from VM
 Language/13_Libraries_and_Scripts/2_Imports_A01_t39: Fail # inherited from VM
 Language/13_Libraries_and_Scripts/2_Imports_A02_t01: Fail # inherited from VM
@@ -501,8 +496,6 @@
 Language/14_Types/4_Interface_Types_A02_t01: Fail # Looks like dart2js issue, let's wait when interfaces are phased away
 Language/14_Types/5_Function_Types_A01_t05: Fail # inherited from dart2js
 Language/14_Types/5_Function_Types_A02_t01: Fail # inherited from VM
-Language/15_Reference/1_Lexical_Rules/1_Reserved_Words_A30_t04: Fail # inherited from dart2js
-Language/15_Reference/1_Lexical_Rules/1_Reserved_Words_A30_t05: Fail # inherited from dart2js
 Language/15_Reference/1_Lexical_Rules/1_Reserved_Words_A40_t04: Fail # inherited from dart2js
 Language/15_Reference/1_Lexical_Rules_A01_t06: Fail # inherited from VM
 Language/15_Reference/1_Lexical_Rules_A02_t06: Fail # inherited from dart2js
@@ -568,6 +561,8 @@
 # Partially implemented redirecting constructors makes this fail.
 Language/07_Classes/6_Constructors/2_Factories_A01_t05: Fail
 
+Language/07_Classes/6_Constructors/1_Generative_Constructors_A16_t07: Fail # Redirecting constructors can not use initializing formals. This bug was previously masked - compilation failed, but for different, wrong reason.
+
 [ $compiler == dart2dart && $system == windows ]
 LibTest/core/double/operator_remainder_A01_t04: Fail # Result is NaN
 LibTest/core/double/round_A01_t01: Fail # Result is NaN
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index d43d6e2..5750632 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -37,8 +37,6 @@
 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_A06_t01: Fail # TODO(ahe): Please triage this failure.
-Language/10_Expressions/11_Instance_Creation/1_New_A06_t02: Fail # TODO(ahe): Please triage this failure.
 Language/10_Expressions/11_Instance_Creation/1_New_A06_t06: 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.
@@ -125,7 +123,6 @@
 Language/11_Statements/09_Try_A01_t18: Fail # TODO(ahe): Please triage this failure.
 Language/13_Libraries_and_Scripts/2_Imports_A02_t19: Fail # TODO(ahe): Please triage this failure.
 Language/13_Libraries_and_Scripts/2_Imports_A02_t28: Fail # TODO(ahe): Please triage this failure.
-Language/15_Reference/1_Lexical_Rules/1_Reserved_Words_A30_t05: Fail # TODO(ahe): Please triage this failure.
 Language/15_Reference/1_Lexical_Rules/1_Reserved_Words_A40_t04: Fail # TODO(ahe): Please triage this failure.
 Language/15_Reference/1_Lexical_Rules_A01_t06: Fail # TODO(ahe): Please triage this failure.
 LibTest/core/RegExp/hasMatch_A01_t02: Fail # TODO(ahe): Please triage this failure.
@@ -247,6 +244,8 @@
 LibTest/core/double/operator_remainder_A01_t04: Fail
 
 [ $compiler == dart2js ]
+Language/07_Classes/6_Constructors/1_Generative_Constructors_A16_t07: Fail # Redirecting constructors can not use initializing formals. This bug was previously masked - compilation failed, but for different, wrong reason.
+
 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.
@@ -348,12 +347,12 @@
 Language/10_Expressions/22_Shift_A01_t01: Fail, OK # Function declaration takes precedence over function expression.
 Language/10_Expressions/26_Postfix_Expressions_A01_t01: Fail, OK # A map literal cannot start an expression statement.
 Language/10_Expressions/27_Assignable_Expressions_A01_t27: Fail, OK # A map literal cannot start an expression statement.
+Language/10_Expressions/28_Identifier_Reference_A04_t07: Fail # assert is a reserved word, which can not be used as a variable name.
 Language/11_Statements/07_Do_A02_t02: Fail, OK # co19 issue 145.
 LibTest/core/String/String_class_A02_t01: Fail, OK # 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
 
-Language/06_Functions/06_Functions_A01_t23: Fail, OK # co19 issue 210
 Language/06_Functions/1_Function_Declaration_A02_t03: Fail, OK # co19 issue 210
 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
@@ -362,16 +361,12 @@
 Language/11_Statements/03_Variable_Declaration_A01_t10: Fail, OK # co19 issue 210
 Language/11_Statements/03_Variable_Declaration_A02_t04: Fail, OK # co19 issue 210
 Language/11_Statements/08_Switch_A07_t02: Fail, OK # co19 issue 210
-Language/11_Statements/15_Assert_A01_t03: Fail, OK # co19 issue 210
-Language/11_Statements/15_Assert_A01_t04: Fail, OK # co19 issue 210
-Language/11_Statements/15_Assert_A01_t05: Fail, OK # co19 issue 210
 
 LibTest/core/Math/max_A01_t03: Fail, OK # co19 issue 157
 LibTest/core/Math/min_A01_t03: Fail, OK # co19 issue 157
 
 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/10_Expressions/28_Identifier_Reference_A06_t07: Fail, OK # co19 issue 188
 Language/10_Expressions/28_Identifier_Reference_A06_t13: Fail, OK # co19 issue 254
 Language/10_Expressions/28_Identifier_Reference_A06_t15: Fail, OK # co19 issue 188
 
@@ -393,8 +388,6 @@
 
 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/03_Overview/2_Privacy_A01_t19: Fail, OK # co19 issue 198
-Language/03_Overview/2_Privacy_A01_t20: Fail, OK # co19 issue 198
 
 Language/10_Expressions/30_Type_Cast_A02_t03: Fail, OK # co19 issue 236
 
@@ -656,7 +649,6 @@
 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).
-Language/15_Reference/1_Lexical_Rules/1_Reserved_Words_A30_t04: Fail # Checks that other Unicode whitespaces are not allowed:  check NO-BREAK SPACE (U+00A0)
 Language/15_Reference/1_Lexical_Rules_A02_t06: Fail # Checks that Unicode whitespaces other than WHITESPACE are not permitted in the source code. Checks symbol U+00a0.
 
 
diff --git a/tests/compiler/dart2js/dart2js.status b/tests/compiler/dart2js/dart2js.status
index f63da2e..0478963 100644
--- a/tests/compiler/dart2js/dart2js.status
+++ b/tests/compiler/dart2js/dart2js.status
@@ -2,12 +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.
 
-link_test: Fail # TODO(ahe): I'm fixing this.
-
 constant_folding_string_test: Fail
 redundant_phi_eliminator_test: Fail # Fails because of hack to allow aborting loops.
 pretty_parameter_test: Fail # TODO(floitsch): investigate.
 tree_shaking_test: Fail # Issue 4811
 
+# Minification of locals temporarily disabled due to issue 5808
+minify_many_locals_test: Fail
+
 [ $runtime == d8 || $runtime == drt || $runtime == dartium || $runtime == ff || $runtime == firefox || $runtime == chrome || $runtime == safari || $runtime == ie || $runtime == opera ]
 *: Skip # dart2js uses #import('dart:io'); and it is not self-hosted (yet).
diff --git a/tests/compiler/dart2js/link_test.dart b/tests/compiler/dart2js/link_test.dart
index 92baa10..f108fd8 100644
--- a/tests/compiler/dart2js/link_test.dart
+++ b/tests/compiler/dart2js/link_test.dart
@@ -2,15 +2,16 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#import('../../../lib/compiler/implementation/util/util.dart');
-#import('../../../lib/compiler/implementation/util/util_implementation.dart');
+import '../../../lib/compiler/implementation/util/util.dart';
+import '../../../lib/compiler/implementation/util/util_implementation.dart';
 
 main() {
-  test(new Link<Comparable>('three').prepend(2).prepend('one'),
+  test(const Link<Comparable>().prepend('three').prepend(2).prepend('one'),
        ['one', 2, 'three']);
-  test(new Link<Comparable>(3).prepend('two').prepend(1), [1, 'two', 3]);
-  test(new Link<String>('single'), ['single']);
-  test(new LinkTail(), []);
+  test(const Link<Comparable>().prepend(3).prepend('two').prepend(1),
+       [1, 'two', 3]);
+  test(const Link<String>().prepend('single'), ['single']);
+  test(const Link(), []);
   testFromList([]);
   testFromList([0]);
   testFromList([0, 1]);
diff --git a/tests/compiler/dart2js/mock_compiler.dart b/tests/compiler/dart2js/mock_compiler.dart
index a3aa2df..6c37746 100644
--- a/tests/compiler/dart2js/mock_compiler.dart
+++ b/tests/compiler/dart2js/mock_compiler.dart
@@ -41,7 +41,7 @@
   boolConversionCheck(x) {}
   abstract class JavaScriptIndexingBehavior {}
   S() {}
-  assert(a){}''';
+  assertHelper(a){}''';
 
 const String DEFAULT_INTERCEPTORSLIB = r'''
   add$1(receiver, value) {}
diff --git a/tests/compiler/dart2js/resolver_test.dart b/tests/compiler/dart2js/resolver_test.dart
index 01cd912..fe4db71c 100644
--- a/tests/compiler/dart2js/resolver_test.dart
+++ b/tests/compiler/dart2js/resolver_test.dart
@@ -8,6 +8,7 @@
 #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/universe/universe.dart");
 #import("../../../lib/compiler/implementation/util/util.dart");
 #import("compiler_helper.dart");
 #import("mock_compiler.dart");
@@ -563,7 +564,9 @@
   ClassElement classElement =
       compiler.mainApp.find(buildSourceString(className));
   Element element =
-      classElement.lookupConstructor(buildSourceString(constructor));
+      classElement.lookupConstructor(
+          new Selector.callConstructor(buildSourceString(constructor),
+                                       classElement.getLibrary()));
   FunctionExpression tree = element.parseNode(compiler);
   ResolverVisitor visitor = new ResolverVisitor(compiler, element);
   new InitializerResolver(visitor).resolveInitializers(element, tree);
@@ -663,7 +666,7 @@
                 A.a() : this.b(0);
                 A.b(int i);
               }""";
-  resolveConstructor(script, "A a = new A.a();", "A", r"A$a", 1,
+  resolveConstructor(script, "A a = new A.a();", "A", "a", 1,
                      [], []);
 
   script = """class A {
@@ -671,7 +674,7 @@
                 A.a() : i = 42, this(0);
                 A(int i);
               }""";
-  resolveConstructor(script, "A a = new A.a();", "A", r"A$a", 2,
+  resolveConstructor(script, "A a = new A.a();", "A", "a", 2,
                      [], [MessageKind.REDIRECTING_CONSTRUCTOR_HAS_INITIALIZER]);
 
   script = """class A {
diff --git a/tests/compiler/dart2js_extra/dart2js_extra.status b/tests/compiler/dart2js_extra/dart2js_extra.status
index 9d53c1c..f24783d 100644
--- a/tests/compiler/dart2js_extra/dart2js_extra.status
+++ b/tests/compiler/dart2js_extra/dart2js_extra.status
@@ -6,7 +6,6 @@
 class_test: Fail
 statements_test: Fail
 typed_locals_test: Fail
-regress/4740_test: Fail
 inline_position_crash_test: Fail # http://www.dartbug.com/3905
 constant_javascript_semantics3_test: Fail # http://www.dartbug.com/5581
 
diff --git a/tests/language/call_constructor_on_unresolvable_class_test.dart b/tests/language/call_constructor_on_unresolvable_class_test.dart
index 3ecf056..0998eec 100644
--- a/tests/language/call_constructor_on_unresolvable_class_test.dart
+++ b/tests/language/call_constructor_on_unresolvable_class_test.dart
@@ -20,12 +20,12 @@
     // These should not produce errors because the calls are never executed.
     new A();         /// 01: static type warning
     new A.foo();     /// 02: static type warning
-    new library.A(); /// 03: static type warning
+    new lib.A();     /// 03: static type warning
   }
 
   new A();         /// 04: runtime error
   new A.foo();     /// 05: runtime error
-  new library.A(); /// 06: runtime error
+  new lib.A();     /// 06: runtime error
 
   var ex;                    /// 07: static type warning
   try {                      /// 07: continued
diff --git a/tests/language/language.status b/tests/language/language.status
index 456875a..3f2bad9 100644
--- a/tests/language/language.status
+++ b/tests/language/language.status
@@ -87,10 +87,8 @@
 compile_time_constant_checked3_test/06: Fail, OK
 
 [ $compiler == dartc ]
-import_combinators_test: Fail # Issue 5735
 implicit_this_test/none: Fail # should not warn about allocating SubAbstract2
 metadata_test: Fail
-call_constructor_on_unresolvable_class_test/03: Fail, OK # 'library' cannot be used as a prefix because it is a built-in identifier
 get_set_syntax_test/none: Fail # does not accept getter/setter with no method body
 application_negative_test: Fail # Runtime only test, rewrite as multitest
 assign_instance_method_negative_test: Fail # Runtime only test, rewrite as multitest
@@ -328,8 +326,6 @@
 # chokes on things like typedef(x) => "typedef $x" and alike.
 abstract_syntax_test/01: Fail
 abstract_syntax_test/02: Fail
-pseudo_kw_illegal_test/08: Fail
-pseudo_kw_illegal_test/10: Fail
 pseudo_kw_illegal_test/11: Fail
 pseudo_kw_illegal_test/14: Fail
 pseudo_kw_test: Fail
diff --git a/tests/language/language_dart2js.status b/tests/language/language_dart2js.status
index cf021ae..f17d87c 100644
--- a/tests/language/language_dart2js.status
+++ b/tests/language/language_dart2js.status
@@ -58,7 +58,6 @@
 compile_time_constant_checked3_test/06: Fail, OK
 
 [ $compiler == dart2js ]
-abstract_runtime_error_test: Fail # http://dartbug.com/4737
 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
@@ -162,8 +161,6 @@
 method_override2_test/01: Fail # accepts illegal override
 method_override2_test/02: Fail # accepts illegal override
 method_override2_test/03: Fail # accepts illegal override
-implicit_this_test/02: Fail # instantiation of abstract class
-implicit_this_test/03: Fail # instantiation of abstract class
 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
@@ -270,8 +267,6 @@
 prefix20_negative_test: Fail # Negative language test.
 prefix23_negative_test: Fail # Negative language test.
 pseudo_kw_illegal_test/03: Fail # Negative language test.
-pseudo_kw_illegal_test/08: Fail # Negative language test.
-pseudo_kw_illegal_test/10: Fail # Negative language test.
 pseudo_kw_illegal_test/11: Fail # Negative language test.
 pseudo_kw_illegal_test/14: Fail # Negative language test.
 scope_negative_test: Fail # Negative language test.
@@ -358,8 +353,8 @@
 first_class_types_test: Fail # http://dartbug.com/5523
 part2_test: Fail # TODO(ahe): Enable wrapper-less tests on Firefox/Windows.
 part_test: Fail # TODO(ahe): Enable wrapper-less tests on Firefox/Windows.
-export_test: Fail # Issue 5785
-export_cyclic_test: Fail # Issue 5785
-generic_creation_test: Fail # Issue 5785l
-import_combinators_test: Fail # Issue 3454
+export_test: Fail # Issue 5785 (root cause: issue 2264)
+export_cyclic_test: Fail # Issue 5785 (root cause: issue 2264)
+generic_creation_test: Fail # Issue 5785 (root cause: issue 2264)
+import_combinators_test: Fail # Issue 5785 (root cause: issue 2264)
 first_class_types_libraries_test: Fail
diff --git a/tests/language/state_mangling2_test.dart b/tests/language/state_mangling2_test.dart
new file mode 100644
index 0000000..637df3e
--- /dev/null
+++ b/tests/language/state_mangling2_test.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 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.
+
+foo(state) {
+  if (state == null) return 0;
+  var sum = 0;
+  state = inscrutableId(state);
+  for (int i = 0; i < state.length; i++) {
+    sum += state[i];
+  }
+  state = inscrutableId(state);
+  for (int i = 0; i < state.length; i++) {
+    sum += state[i];
+  }
+  return sum;
+}
+
+int inscrutable(int x) => x == 0 ? 0 : x | inscrutable(x & (x - 1));
+
+inscrutableId(x) {
+  if (x == 0) return inscrutable(x);
+  return (3 == inscrutable(3)) ? x : false;
+}
+
+class A {
+  int length = 3;
+  operator [](i) => 1;
+}
+
+main() {
+  Expect.equals(12, foo([1, 2, 3]));
+  if (inscrutableId(0) == 0) {
+    Expect.equals(6, foo(new A()));
+  }
+}
diff --git a/tests/language/state_mangling_test.dart b/tests/language/state_mangling_test.dart
new file mode 100644
index 0000000..02df690
--- /dev/null
+++ b/tests/language/state_mangling_test.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.
+
+foo(state) {
+  if (state == null) return 0;
+  var sum = 0;
+  for (int i = 0; i < state.length; i++) {
+    sum += state[i];
+  }
+  state = inscrutableId(state);
+  for (int i = 0; i < state.length; i++) {
+    sum += state[i];
+  }
+  return sum;
+}
+
+int inscrutable(int x) => x == 0 ? 0 : x | inscrutable(x & (x - 1));
+
+inscrutableId(x) {
+  if (x == 0) return inscrutable(x);
+  return (3 == inscrutable(3)) ? x : false;
+}
+
+class A {
+  int length = 3;
+  operator [](i) => 1;
+}
+
+main() {
+  Expect.equals(12, foo([1, 2, 3]));
+  if (inscrutableId(0) == 0) {
+    Expect.equals(6, foo(new A()));
+  }
+}
diff --git a/tests/standalone/io/http_proxy_test.dart b/tests/standalone/io/http_proxy_test.dart
index 4eb185e..5ab12b1 100644
--- a/tests/standalone/io/http_proxy_test.dart
+++ b/tests/standalone/io/http_proxy_test.dart
@@ -8,16 +8,21 @@
 class Server {
   HttpServer server;
   int proxyHops;
+  List<String> directRequestPaths;
   int requestCount = 0;
 
-  Server(this.proxyHops) : server = new HttpServer();
+  Server(this.proxyHops, this.directRequestPaths) : server = new HttpServer();
 
   void start() {
     server.listen("127.0.0.1", 0);
     server.defaultRequestHandler =
         (HttpRequest request, HttpResponse response) {
           requestCount++;
-          if (proxyHops > 0) {
+          // Check whether a proxy or direct connection is expected.
+          bool direct = directRequestPaths.reduce(
+              false,
+              (prev, path) => prev ? prev : path == request.path);
+          if (!direct && proxyHops > 0) {
             Expect.isNotNull(request.headers[HttpHeaders.VIA]);
             Expect.equals(1, request.headers[HttpHeaders.VIA].length);
             Expect.equals(
@@ -46,8 +51,9 @@
   int get port => server.port;
 }
 
-Server setupServer(int proxyHops) {
-  Server server = new Server(proxyHops);
+Server setupServer(int proxyHops,
+                   [List<String> directRequestPaths = const <String>[]]) {
+  Server server = new Server(proxyHops, directRequestPaths);
   server.start();
   return server;
 }
@@ -165,12 +171,15 @@
 int testProxyDoneCount = 0;
 void testProxy() {
   ProxyServer proxyServer = setupProxyServer();
-  Server server = setupServer(1);
+  Server server = setupServer(1, ["/4"]);
   HttpClient client = new HttpClient();
 
   List<String> proxy =
       ["PROXY localhost:${proxyServer.port}",
        "PROXY localhost:${proxyServer.port}; PROXY hede.hule.hest:8080",
+       "PROXY hede.hule.hest:8080; PROXY localhost:${proxyServer.port}",
+       "PROXY hede.hule.hest:8080; PROXY hede.hule.hest:8181; PROXY localhost:${proxyServer.port}",
+       "PROXY hede.hule.hest:8080; PROXY hede.hule.hest:8181; DIRECT",
        "PROXY localhost:${proxyServer.port}; DIRECT"];
 
   client.findProxy = (Uri uri) {
@@ -210,12 +219,15 @@
   ProxyServer proxyServer2 = setupProxyServer();
   proxyServer1.client.findProxy = (_) => "PROXY 127.0.0.1:${proxyServer2.port}";
 
-  Server server = setupServer(2);
+  Server server = setupServer(2, ["/4"]);
   HttpClient client = new HttpClient();
 
   List<String> proxy =
       ["PROXY localhost:${proxyServer1.port}",
        "PROXY localhost:${proxyServer1.port}; PROXY hede.hule.hest:8080",
+       "PROXY hede.hule.hest:8080; PROXY localhost:${proxyServer1.port}",
+       "PROXY hede.hule.hest:8080; PROXY hede.hule.hest:8181; PROXY localhost:${proxyServer1.port}",
+       "PROXY hede.hule.hest:8080; PROXY hede.hule.hest:8181; DIRECT",
        "PROXY localhost:${proxyServer1.port}; DIRECT"];
 
   client.findProxy = (Uri uri) {
@@ -257,6 +269,7 @@
   List<String> proxy =
       ["PROXY localhost:8080",
        "PROXY localhost:8080; PROXY hede.hule.hest:8080",
+       "PROXY hede.hule.hest:8080; PROXY localhost:8080",
        "PROXY localhost:8080; DIRECT"];
 
   client.findProxy = (Uri uri) {
diff --git a/tools/VERSION b/tools/VERSION
index 82ee775..d278f4e 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -1,4 +1,4 @@
 MAJOR 0
 MINOR 1
-BUILD 3
+BUILD 4
 PATCH 0
diff --git a/tools/release/version.dart b/tools/release/version.dart
index 5197f75..efb014a 100644
--- a/tools/release/version.dart
+++ b/tools/release/version.dart
@@ -122,7 +122,7 @@
   int getRevisionFromSvnInfo(String info) {
     if (info == null || info == '') return 0;
     var lines = info.split("\n");
-    RegExp exp = const RegExp(r"Revision: (\d*)");
+    RegExp exp = const RegExp(r"Last Changed Rev: (\d*)");
     for (var line in lines) {
       if (exp.hasMatch(line)) {
         String revisionString = (exp.firstMatch(line).group(1));
@@ -144,7 +144,15 @@
     var command = isSvn ? "svn" : "git";
     command = "$command${getExecutableSuffix()}";
     var arguments = isSvn ? ["info"] : ["svn", "info"];
-    return Process.run(command, arguments).transform((result) {
+    ProcessOptions options = new ProcessOptions();
+    // Run the command from the root to get the last changed revision for this
+    // "branch". Since we have both trunk and bleeding edge in the same
+    // repository and since we always build TOT we need this to get the
+    // right version number.
+    Path toolsDirectory = new Path.fromNative(_versionFileName).directoryPath;
+    Path root = toolsDirectory.join(new Path(".."));
+    options.workingDirectory = root.toNativePath();
+    return Process.run(command, arguments, options).transform((result) {
       if (result.exitCode != 0) {
         return 0;
       }
