Version 0.2.7.0

svn merge -r 15346:15594  https://dart.googlecode.com/svn/branches/bleeding_edge trunk

git-svn-id: http://dart.googlecode.com/svn/trunk@15595 260f80e4-7a28-3924-810f-c04153c831b5
diff --git a/.gitignore b/.gitignore
index ce9b95f..1a58486 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,60 +5,31 @@
 #
 # Whenever possible, prefer creating ignores in svn and then generating them
 # to keep git in sync.
-/api_docs.target.mk
-/benchmarks
-/compiler.target.mk
-/create_sdk.target.mk
-/dart.Makefile
-/dart.xcodeproj
-/dart2js.target.mk
-/dart2js_bot.target.mk
-/Makefile
-/out
-/runtime.target.mk
-/samples.target.mk
-/upload_sdk.target.mk
-/xcodebuild
-/upload_sdk.vcxproj
-/dart2js.vcxproj.user
-/api_docs.vcproj
-/upload_sdk.vcxproj.filters
-/api_docs.vcxproj.user
-/dart.suo
-/dart2js.vcxproj
-/compiler.vcxproj
-/dart.sdf
-/cached_results.txt
-/chromedriver.log
-/api_docs.vcxproj
-/compiler.vcproj
-/timing_info.txt
-/compiler.vcxproj.user
-/dart.sln
-/runtime.vcproj
-/upload_sdk.vcproj
-/runtime.vcxproj.user
-/upload_sdk.vcxproj.user
-/create_sdk.vcxproj
-/create_sdk.vcxproj.filters
-/create_sdk.vcproj
-/samples.vcproj
-/dart2js.vcproj
-/create_sdk.vcxproj.user
-/runtime.vcxproj
-/build
-/*.xcodeproj
 /.children
 /.project
+/Makefile
+/benchmarks
+/build
+/ipch
+/out
+/xcodebuild
+/*.Makefile
+/*.opensdf
 /*.pyc
+/*.sdf
+/*.sln
+/*.suo
+/*.target.mk
+/*.vcproj
+/*.vcxproj
+/*.vcxproj.filters
+/*.vcxproj.user
+/*.xcodeproj
 
 # End generated ignores. The following are hand-added because the svn:ignore
 # stuff doesn't handle them well.
 
-# Generated XCode projects on Mac
-*.xcodeproj
-
-# Dart Editor config files
+# Dart Editor config files - also in all subdirectories.
 .children
 .project
 
diff --git a/client/dart.js b/client/dart.js
index 1c8b333..1777e22 100644
--- a/client/dart.js
+++ b/client/dart.js
@@ -161,9 +161,14 @@
     var stringified = JSON.stringify(serialize(port));
     var attrName = 'dart-port:' + name;
     document.documentElement.setAttribute(attrName, stringified);
-    // TODO(vsm): Phase out usage of localStorage.  We're leaving it in
-    // temporarily for backwards compatibility.
-    window.localStorage[attrName] = stringified;
+    // TODO(vsm): Phase out usage of localStorage and delete the
+    // below.  We're leaving it in temporarily for backwards
+    // compatibility.
+    try {
+      window.localStorage[attrName] = stringified;
+    } catch (e) {
+      // Swallow errors (e.g., Chrome apps disallow this access).
+    }
   };
 
   window.lookupPort = function(name) {
diff --git a/compiler/.gitignore b/compiler/.gitignore
index 36e20ef..02aa8f2 100644
--- a/compiler/.gitignore
+++ b/compiler/.gitignore
@@ -1,32 +1,39 @@
-/domlib_sources.gypi
-/test_sources.xml
-/compiler_corelib_sources.gypi
-/dummy.target.mk
-/dartc.target.mk
-/dart_analyzer.target.mk
-/test_sources.gypi
-/sources.gypi
-/jsonlib_sources.xml
-/domlib_sources.xml
 /compiler
-/Makefile
-/corelib_sources.xml
-/sources.xml
 /third_party
-/corelib_sources.gypi
-/htmllib_sources.xml
-/htmllib_sources.gypi
-/jsonlib_sources.gypi
+/compiler_corelib_sources.gypi
 /compiler_corelib_sources.xml
-/dart-compiler.Makefile
-/dart-compiler.xcodeproj
+/corelib_sources.gypi
+/corelib_sources.xml
+/domlib_sources.gypi
+/domlib_sources.xml
+/htmllib_sources.gypi
+/htmllib_sources.xml
+/isolatelib_sources.gypi
+/isolatelib_sources.xml
+/jsonlib_sources.gypi
+/jsonlib_sources.xml
+/sources.gypi
+/sources.xml
+/test_sources.gypi
+/test_sources.xml
 /out
 /xcodebuild
-/isolatelib_sources.xml
-/isolatelib_sources.gypi
-/Release_ia32
-/Debug_ia32
+/Debug
+/DebugARM
+/DebugIA32
+/DebugSIMARM
+/DebugX64
+/Release
+/ReleaseARM
+/ReleaseIA32
+/ReleaseSIMARM
+/ReleaseX64
+/Makefile
+/*.Makefile
+/*.sln
+/*.target.mk
 /*.vcproj
 /*.vcxproj
 /*.vcxproj.filters
 /*.vcxproj.user
+/*.xcodeproj
diff --git a/compiler/java/com/google/dart/compiler/CommandLineOptions.java b/compiler/java/com/google/dart/compiler/CommandLineOptions.java
index e264801..440b7bb 100644
--- a/compiler/java/com/google/dart/compiler/CommandLineOptions.java
+++ b/compiler/java/com/google/dart/compiler/CommandLineOptions.java
@@ -117,6 +117,10 @@
         usage = "For debugging, continue on with resolution even if there are parse errors.")
     private boolean resolveDespiteParseErrors;
 
+    @Option(name = "--type-checks-for-inferred-types",
+        usage = "[not in spec] Enables 'interface has no method/field' for receivers with inferred types.")
+    private boolean typeChecksForInferredTypes = false;
+
     @Option(name = "--version",
         usage = "Show analyzer version")
     private boolean showVersion = false;
@@ -157,7 +161,7 @@
      * Returns whether inferred types should be used for type checks.
      */
     public boolean typeChecksForInferredTypes() {
-      return false;
+      return this.typeChecksForInferredTypes;
     }
     
     /**
diff --git a/compiler/java/com/google/dart/compiler/DartCompiler.java b/compiler/java/com/google/dart/compiler/DartCompiler.java
index 5cb4e52..6900a50 100644
--- a/compiler/java/com/google/dart/compiler/DartCompiler.java
+++ b/compiler/java/com/google/dart/compiler/DartCompiler.java
@@ -408,10 +408,14 @@
         throws IOException {
       String libSpec = libNode.getText();
       LibrarySource dep;
-      if (PackageLibraryManager.isDartSpec(libSpec)) {
-        dep = context.getSystemLibraryFor(libSpec);
-      } else {
-        dep = libSrc.getImportFor(libSpec);
+      try {
+        if (PackageLibraryManager.isDartSpec(libSpec)) {
+          dep = context.getSystemLibraryFor(libSpec);
+        } else {
+          dep = libSrc.getImportFor(libSpec);
+        }
+      } catch (Throwable e) {
+        return null;
       }
       if (dep == null || !dep.exists()) {
         return null;
diff --git a/compiler/java/com/google/dart/compiler/DefaultErrorFormatter.java b/compiler/java/com/google/dart/compiler/DefaultErrorFormatter.java
index bbf3851..a908369 100644
--- a/compiler/java/com/google/dart/compiler/DefaultErrorFormatter.java
+++ b/compiler/java/com/google/dart/compiler/DefaultErrorFormatter.java
@@ -24,22 +24,42 @@
 
   @Override
   public void format(DartCompilationError event) {
-    String sourceName = "<unknown-source-file>";
-    Source sourceFile = event.getSource();
-    String includeFrom = getImportString(sourceFile);
-
-    if (sourceFile != null) {
-      sourceName = sourceFile.getUri().toString();
-    }
-    outputStream.printf("%s:%d:%d: %s%s\n",
-        sourceName,
-        event.getLineNumber(),
-        event.getColumnNumber(),
-        event.getMessage(),
-        includeFrom);
+    StringBuilder buf = new StringBuilder();
+    appendError(buf, event);
+    outputStream.print(buf);
+    outputStream.print("\n");
   }
 
-  public String getImportString(Source sourceFile) {
+  protected void appendError(StringBuilder buf, DartCompilationError error) {
+    Source source = error.getSource();
+    String sourceName = getSourceName(source);
+    int line = error.getLineNumber();
+    int col = error.getColumnNumber();
+    int length = error.getLength();
+    if (errorFormat == ErrorFormat.MACHINE) {
+      buf.append(String.format(
+          "%s|%s|%s|%s|%d|%d|%d|%s",
+          escapePipe(error.getErrorCode().getErrorSeverity().toString()),
+          escapePipe(error.getErrorCode().getSubSystem().toString()),
+          escapePipe(error.getErrorCode().toString()),
+          escapePipe(sourceName),
+          line,
+          col,
+          length,
+          escapePipe(error.getMessage())));
+    } else {
+      String includeFrom = getImportString(source);
+      buf.append(String.format(
+          "%s:%d:%d: %s%s",
+          sourceName,
+          line,
+          col,
+          error.getMessage(),
+          includeFrom));
+    }
+  }
+
+  protected static String getImportString(Source sourceFile) {
     String includeFrom = "";
     if (sourceFile instanceof DartSource) {
       LibrarySource lib = ((DartSource) sourceFile).getLibrary();
@@ -49,4 +69,25 @@
     }
     return includeFrom;
   }
+  
+  protected static String getSourceName(Source source) {
+    if (source instanceof UrlDartSource) {
+      return source.getUri().toString();
+    }
+    if (source != null) {
+      return source.getName();
+    }
+    return "<unknown-source-file>";
+  }
+
+  protected static String escapePipe(String input) {
+    StringBuilder result = new StringBuilder();
+    for (char c : input.toCharArray()) {
+      if (c == '\\' || c == '|') {
+        result.append('\\');
+      }
+      result.append(c);
+    }
+    return result.toString();
+  }
 }
diff --git a/compiler/java/com/google/dart/compiler/PrettyErrorFormatter.java b/compiler/java/com/google/dart/compiler/PrettyErrorFormatter.java
index 315a8fb..0baa651 100644
--- a/compiler/java/com/google/dart/compiler/PrettyErrorFormatter.java
+++ b/compiler/java/com/google/dart/compiler/PrettyErrorFormatter.java
@@ -85,27 +85,7 @@
         buf.append(event.getErrorCode().getErrorSeverity() == ErrorSeverity.WARNING
             ? WARNING_BOLD_COLOR : ERROR_BOLD_COLOR);
       }
-      if (errorFormat == ErrorFormat.MACHINE) {
-        buf.append(String.format(
-            "%s|%s|%s|%s|%d|%d|%d|%s",
-            escapePipe(event.getErrorCode().getErrorSeverity().toString()),
-            escapePipe(event.getErrorCode().getSubSystem().toString()),
-            escapePipe(event.getErrorCode().toString()),
-            escapePipe(getSourceName(sourceFile)),
-            event.getLineNumber(),
-            1 + col,
-            length,
-            escapePipe(event.getMessage())));
-      } else {
-        String sourceName = sourceFile.getUri().toString();
-        String includeFrom = getImportString(sourceFile);
-        buf.append(String.format(
-            "%s:%d: %s%s",
-            sourceName,
-            event.getLineNumber(),
-            event.getMessage(),
-            includeFrom));
-      }
+      appendError(buf, event);
       if (useColor) {
         buf.append(NO_COLOR);
       }
@@ -153,24 +133,6 @@
       }
     }
   }
-  
-  private static String getSourceName(Source source) {
-    if (source instanceof UrlDartSource) {
-      return source.getUri().toString();
-    }
-    return source.getName();
-  }
-
-  private String escapePipe(String input) {
-    StringBuilder result = new StringBuilder();
-    for (char c : input.toCharArray()) {
-      if (c == '\\' || c == '|') {
-        result.append('\\');
-      }
-      result.append(c);
-    }
-    return result.toString();
-  }
 
   private String getLineAt(BufferedReader reader, int line) throws IOException {
     if (line <= 0) {
diff --git a/compiler/java/com/google/dart/compiler/SystemLibraryManager.java b/compiler/java/com/google/dart/compiler/SystemLibraryManager.java
index 6ea6314..63626bc 100644
--- a/compiler/java/com/google/dart/compiler/SystemLibraryManager.java
+++ b/compiler/java/com/google/dart/compiler/SystemLibraryManager.java
@@ -43,7 +43,7 @@
   
   public URI expandRelativeDartUri(URI uri) throws AssertionError {
       String host = uri.getHost();
-      if (host == null) {
+      if (host == null && uri.getAuthority() == null) {
         String spec = uri.getSchemeSpecificPart();
         String replacement = expansionMap.get(spec);
         if (replacement != null) {
@@ -94,6 +94,7 @@
   public URI translateDartUri(URI uri) {
    
       String host = uri.getHost();
+      
       SystemLibrary library = hostMap.get(host);
       if (library != null) {
         return library.translateUri(uri);
@@ -101,6 +102,10 @@
       if (host != null) {        
         return libraryProvider.resolveHost(host, uri);
       }
+      String authorithy = uri.getAuthority();
+      if (authorithy != null){
+        return libraryProvider.resolveHost(authorithy, uri);
+      }
       throw new RuntimeException("No system library defined for " + uri);
    
   }
diff --git a/compiler/java/com/google/dart/compiler/UrlLibrarySource.java b/compiler/java/com/google/dart/compiler/UrlLibrarySource.java
index f5ec48c..e762294 100644
--- a/compiler/java/com/google/dart/compiler/UrlLibrarySource.java
+++ b/compiler/java/com/google/dart/compiler/UrlLibrarySource.java
@@ -35,7 +35,7 @@
     }
     try {
       // Force the creation of an escaped relative URI to deal with spaces, etc.
-      URI uri = getUri().resolve(new URI(null, null, relPath, null, null)).normalize();
+      URI uri = getImportBaseUri().resolve(new URI(null, null, relPath, null, null)).normalize();
       String path = uri.getPath();
       // Resolve relative reference out of one system library into another
       if (PackageLibraryManager.isDartUri(uri)) {
@@ -69,7 +69,7 @@
     }
     try {
       // Force the creation of an escaped relative URI to deal with spaces, etc.
-      URI uri = getUri().resolve(new URI(null, null, relPath, null, null)).normalize();
+      URI uri = getImportBaseUri().resolve(new URI(null, null, relPath, null, null)).normalize();
       if (PackageLibraryManager.isPackageUri(uri)) {
         URI fileUri = packageLibraryManager.resolveDartUri(uri);
         if (fileUri != null) {
@@ -121,5 +121,13 @@
     String path = uri.getPath();
     return path == null || new File(path).exists();
   }
-  
+
+  /**
+   * @return the {@link URI} to use as a base for resolving imports. Usually same as {@link #getUri()},
+   * but in case of Dart code in HTML may be mapped {@link URI}.
+   */
+  protected URI getImportBaseUri() {
+    return getUri();
+  }
+
 }
diff --git a/compiler/java/com/google/dart/compiler/ast/DartCatchBlock.java b/compiler/java/com/google/dart/compiler/ast/DartCatchBlock.java
index 91818ad..6ab02f5 100644
--- a/compiler/java/com/google/dart/compiler/ast/DartCatchBlock.java
+++ b/compiler/java/com/google/dart/compiler/ast/DartCatchBlock.java
@@ -8,18 +8,25 @@
  * Represents a Dart 'catch' block.
  */
 public class DartCatchBlock extends DartStatement {
-  private DartParameter exception;
-  private DartParameter stackTrace;
-  private DartBlock block;
+  private final int onTokenOffset;
+  private final DartParameter exception;
+  private final DartParameter stackTrace;
+  private final DartBlock block;
 
   public DartCatchBlock(DartBlock block,
+                        int onTokenOffset,
                         DartParameter exception,
                         DartParameter stackTrace) {
     this.block = becomeParentOf(block);
+    this.onTokenOffset = onTokenOffset;
     this.exception = becomeParentOf(exception);
     this.stackTrace = becomeParentOf(stackTrace);
   }
 
+  public int getOnTokenOffset() {
+    return onTokenOffset;
+  }
+
   public DartParameter getException() {
     return exception;
   }
diff --git a/compiler/java/com/google/dart/compiler/parser/DartParser.java b/compiler/java/com/google/dart/compiler/parser/DartParser.java
index 1482111..591c54a 100644
--- a/compiler/java/com/google/dart/compiler/parser/DartParser.java
+++ b/compiler/java/com/google/dart/compiler/parser/DartParser.java
@@ -654,9 +654,7 @@
   protected DartExportDirective parseExportDirective() {
     beginExportDirective();
     next(); // "export"
-    beginLiteral();
-    expect(Token.STRING);
-    DartStringLiteral libUri = done(DartStringLiteral.get(ctx.getTokenString()));
+    DartStringLiteral libUri = parseUri();
 
     List<ImportCombinator> combinators = new ArrayList<ImportCombinator>();
     while (peekPseudoKeyword(0, HIDE_KEYWORD) || peekPseudoKeyword(0, SHOW_KEYWORD)) {
@@ -682,10 +680,7 @@
   protected DartImportDirective parseImportDirective() {
     beginImportDirective();
     next(); // "import"
-    beginLiteral();
-    expect(Token.STRING);
-    DartStringLiteral libUri = done(DartStringLiteral.get(ctx.getTokenString()));
-    
+    DartStringLiteral libUri = parseUri();
     // allow "native" if we have "dart-ext:" import
     if (StringUtils.startsWith(libUri.getValue(), "dart-ext:")) {
       allowNativeKeyword = true;
@@ -741,9 +736,7 @@
     reportDeprecatedError(position(), ParserErrorCode.DEPRECATED_IMPORT_DIRECTIVE);
     expect(Token.LPAREN);
     
-    beginLiteral();
-    expect(Token.STRING);
-    DartStringLiteral libUri = done(DartStringLiteral.get(ctx.getTokenString()));
+    DartStringLiteral libUri = parseUri();
     
     // allow "native" if we have "dart-ext:" import
     if (StringUtils.startsWith(libUri.getValue(), "dart-ext:")) {
@@ -787,9 +780,7 @@
     expect(Token.SOURCE);
     reportDeprecatedError(position(), ParserErrorCode.DEPRECATED_SOURCE_DIRECTIVE);
     expect(Token.LPAREN);
-    beginLiteral();
-    expect(Token.STRING);
-    DartStringLiteral sourceUri = done(DartStringLiteral.get(ctx.getTokenString()));
+    DartStringLiteral sourceUri = parseUri();
     expectCloseParen();
     expect(Token.SEMICOLON);
     return new DartSourceDirective(sourceUri);
@@ -809,10 +800,8 @@
     expect(Token.RESOURCE);
     reportError(position(), ParserErrorCode.DEPRECATED_RESOURCE_DIRECTIVE);
     expect(Token.LPAREN);
-    beginLiteral();
-    expect(Token.STRING);
     @SuppressWarnings("unused")
-    DartStringLiteral resourceUri = done(DartStringLiteral.get(ctx.getTokenString()));
+    DartStringLiteral sourceUri = parseUri();
     expectCloseParen();
     expect(Token.SEMICOLON);
   }
@@ -820,9 +809,7 @@
   private DartNativeDirective parseNativeDirective() {
     expect(Token.NATIVE);
     expect(Token.LPAREN);
-    beginLiteral();
-    expect(Token.STRING);
-    DartStringLiteral nativeUri = done(DartStringLiteral.get(ctx.getTokenString()));
+    DartStringLiteral nativeUri = parseUri();
     expect(Token.RPAREN);
     expect(Token.SEMICOLON);
     return new DartNativeDirective(nativeUri);
@@ -2891,6 +2878,21 @@
     return offset;
   }
 
+  private DartStringLiteral parseUri() {
+    DartExpression str = parseStringWithPasting();
+    if (str instanceof DartStringLiteral) {
+      return (DartStringLiteral) str;
+    } else if (str != null) {
+      reportError(str, ParserErrorCode.URI_CANNOT_USE_INTERPOLATION);
+      DartStringLiteral result = DartStringLiteral.get("<invalid-uri>");
+      result.setSourceInfo(str.getSourceInfo());
+      return result;
+    } else {
+      expect(Token.STRING);
+      return DartStringLiteral.get(null);
+    }
+  }
+
   /**
    * Instances of the class {@code DepthCounter} represent the number of less than tokens that have
    * not yet been matched.
@@ -5078,6 +5080,7 @@
       if (peekPseudoKeyword(0, ON_KEYWORD)) {
         beginCatchClause();
         next();
+        int onTokenOffset = position();
         DartTypeNode exceptionType = parseTypeAnnotation();
         DartParameter exception = null;
         DartParameter stackTrace = null;
@@ -5104,7 +5107,7 @@
           setMetadata(exception, metadata);
         }
         DartBlock block = parseBlock();
-        catches.add(done(new DartCatchBlock(block, exception, stackTrace)));
+        catches.add(done(new DartCatchBlock(block, onTokenOffset, exception, stackTrace)));
       } else {
         beginCatchClause();
         next();
@@ -5137,7 +5140,7 @@
         }
         expectCloseParen();
         DartBlock block = parseBlock();
-        catches.add(done(new DartCatchBlock(block, exception, stackTrace)));
+        catches.add(done(new DartCatchBlock(block, -1, exception, stackTrace)));
       }
     }
 
diff --git a/compiler/java/com/google/dart/compiler/parser/ParserErrorCode.java b/compiler/java/com/google/dart/compiler/parser/ParserErrorCode.java
index 1e458cb..25563a7 100644
--- a/compiler/java/com/google/dart/compiler/parser/ParserErrorCode.java
+++ b/compiler/java/com/google/dart/compiler/parser/ParserErrorCode.java
@@ -141,6 +141,7 @@
   UNREACHABLE_CODE_IN_CASE(ErrorSeverity.WARNING, "Unreachable code in case statement"),
   UNEXPECTED_TOKEN("Unexpected token '%s'"),
   UNEXPECTED_TOKEN_IN_STRING_INTERPOLATION("Unexpected token in string interpolation: %s"),
+  URI_CANNOT_USE_INTERPOLATION("URIs cannot use string interpolation"),
   VAR_IS_NOT_ALLOWED_ON_A_METHOD_DEFINITION("'var' is not allowed on a method definition"),
   VOID_FIELD("Field cannot be of type void"),
   VOID_PARAMETER("Parameter cannot be of type void");
diff --git a/compiler/java/com/google/dart/compiler/resolver/Elements.java b/compiler/java/com/google/dart/compiler/resolver/Elements.java
index 66aa87c..e0474b5 100644
--- a/compiler/java/com/google/dart/compiler/resolver/Elements.java
+++ b/compiler/java/com/google/dart/compiler/resolver/Elements.java
@@ -912,6 +912,9 @@
     if (element.getModifiers().isExternal()) {
       return false;
     }
+    if (element.getModifiers().isNative()) {
+      return false;
+    }
     if (element.getModifiers().isStatic()) {
       return false;
     }
diff --git a/compiler/java/com/google/dart/compiler/resolver/Resolver.java b/compiler/java/com/google/dart/compiler/resolver/Resolver.java
index 66308b2..df2b8e6 100644
--- a/compiler/java/com/google/dart/compiler/resolver/Resolver.java
+++ b/compiler/java/com/google/dart/compiler/resolver/Resolver.java
@@ -723,23 +723,10 @@
       }
 
       DartBlock body = functionNode.getBody();
-      boolean isInterface = false;
-      boolean isAbstractClass = false;
-      if (ElementKind.of(member.getEnclosingElement()).equals(ElementKind.CLASS)) {
-        ClassElement cl = (ClassElement) member.getEnclosingElement();
-        isInterface = cl.isInterface();
-        isAbstractClass = cl.getModifiers().isAbstract();
-      }
-
       if (body == null) {
         if (member.getModifiers().isStatic() && !member.getModifiers().isExternal()) {
           onError(functionNode, ResolverErrorCode.STATIC_METHOD_MUST_HAVE_BODY);
         }
-//        else if (!Elements.isNonFactoryConstructor(member) && !member.getModifiers().isAbstract()
-//            && !member.getModifiers().isExternal() && node.getRedirectedTypeName() == null
-//            && !(isInterface || isAbstractClass)) {
-//          onError(functionNode, ResolverErrorCode.METHOD_MUST_HAVE_BODY);
-//        }
       }
       resolve(functionNode.getBody());
 
@@ -1768,7 +1755,11 @@
           }
         break;
         case TYPE_VARIABLE:
-          onError(x.getConstructor(), ResolverErrorCode.NEW_EXPRESSION_CANT_USE_TYPE_VAR);
+          if (x.isConst() ) {
+            onError(x.getConstructor(), ResolverErrorCode.CONST_EXPRESSION_CANT_USE_TYPE_VAR);
+          } else {
+            onError(x.getConstructor(), ResolverErrorCode.NEW_EXPRESSION_CANT_USE_TYPE_VAR);
+          }
           return null;
         default:
           break;
diff --git a/compiler/java/com/google/dart/compiler/resolver/ResolverErrorCode.java b/compiler/java/com/google/dart/compiler/resolver/ResolverErrorCode.java
index f40fd84..bd33b9a 100644
--- a/compiler/java/com/google/dart/compiler/resolver/ResolverErrorCode.java
+++ b/compiler/java/com/google/dart/compiler/resolver/ResolverErrorCode.java
@@ -67,6 +67,7 @@
   CONST_CLASS_WITH_NONFINAL_FIELDS("Const class %s cannot have non-final field %s"),
   CONST_CONSTRUCTOR_CANNOT_HAVE_BODY("A const constructor cannot have a body"),
   CONST_CONSTRUCTOR_MUST_CALL_CONST_SUPER("const constructor must call const super constructor"),
+  CONST_EXPRESSION_CANT_USE_TYPE_VAR("Const expression cannot be invoked on type variable"),
   CONST_MAP_WITH_TYPE_VARIABLE("Const map literals cannot have a type variable as a type argument"),
   CONST_WITH_TYPE_VARIABLE("Const constructor cannot be invoked with a type variable as a type argument"),
   CONSTANTS_MUST_BE_INITIALIZED("constants must be initialized"),
@@ -123,9 +124,9 @@
   FINAL_FIELD_MUST_BE_INITIALIZED("The final field %s must be initialized"),
   FORMAL_PARAMETER_NAME_EXPECTED("Formal parameter name expected"),
   // TODO(zundel): error message needs JUnit test - how to test #imports in junit?
-  ILLEGAL_ACCESS_TO_PRIVATE("'%s' is private and not defined in this library"),
+  ILLEGAL_ACCESS_TO_PRIVATE(ErrorSeverity.WARNING, "'%s' is private and not defined in this library"),
   // TODO(zundel): error message needs JUnit test - how to test #imports in junit?
-  ILLEGAL_ACCESS_TO_PRIVATE_MEMBER("\"%s\" refers to \"%s\" which is in a different library"),
+  ILLEGAL_ACCESS_TO_PRIVATE_MEMBER("ErrorSeverity.WARNING, \"%s\" refers to \"%s\" which is in a different library"),
   ILLEGAL_FIELD_ACCESS_FROM_STATIC("Illegal access of instance field %s from static scope"),
   ILLEGAL_METHOD_ACCESS_FROM_STATIC("Illegal access of instance method %s from static scope"),
   INITIALIZER_ONLY_IN_GENERATIVE_CONSTRUCTOR("Initializers are allowed only in non-redirecting generative constructors"),
@@ -156,7 +157,7 @@
       "Constructor cannot have the same name as the name of a member declared in the enclosing class"),
   METHOD_MUST_HAVE_BODY(ErrorSeverity.WARNING, "Method must have a body in a non-abstract class"),
   NAMED_PARAMETERS_CANNOT_START_WITH_UNDER("Named parameters cannot start with an '_' character"),
-  NEW_EXPRESSION_CANT_USE_TYPE_VAR("New expression cannot be invoked on type variable"),
+  NEW_EXPRESSION_CANT_USE_TYPE_VAR(ErrorSeverity.WARNING, "New expression cannot be invoked on type variable"),
   NEW_EXPRESSION_NOT_CONSTRUCTOR(
       ErrorSeverity.WARNING, "New expression does not resolve to a constructor"),
   NEW_EXPRESSION_NOT_CONST_CONSTRUCTOR("New expression does not resolve to a const constructor"),
@@ -209,7 +210,8 @@
   TYPE_VARIABLE_DOES_NOT_MATCH("Type variable %s does not match %s in default class %s."),
   TYPE_PARAMETERS_MUST_MATCH_EXACTLY(
       "Type parameters in default declaration must match referenced class exactly"),
-  TYPE_VARIABLE_IN_STATIC_CONTEXT("cannot access type variable %s in static context"),
+  TYPE_VARIABLE_IN_STATIC_CONTEXT(ErrorSeverity.WARNING, "cannot access type variable %s in static context"),
+  TYPE_VARIABLE_IN_STATIC_CONTEXT_ERROR("cannot access type variable %s in static context"),
   TYPE_VARIABLE_NOT_ALLOWED_IN_IDENTIFIER(
       "type variables are not allowed in identifier expressions"),
   USE_ASSIGNMENT_ON_SETTER("Use assignment to set field '%s'"),
diff --git a/compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java b/compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java
index ea351ca..e7fcd7e 100644
--- a/compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java
+++ b/compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java
@@ -663,7 +663,8 @@
       // report problem
       if (member == null && problemTarget != null) {
         if (reportNoMemberWhenHasInterceptor || !Elements.handlesNoSuchMethod(itype)) {
-          if (typeChecksForInferredTypes || !TypeQuality.isInferred(receiver)) {
+          if (typeChecksForInferredTypes && !isTooGenericInferredType(receiver)
+              || !TypeQuality.isInferred(receiver)) {
             ErrorCode code = TypeQuality.isInferred(receiver)
                 ? TypeErrorCode.INTERFACE_HAS_NO_METHOD_NAMED_INFERRED
                 : TypeErrorCode.INTERFACE_HAS_NO_METHOD_NAMED;
@@ -1606,7 +1607,8 @@
       // remember unimplemented members
       {
         List<Element> unimplementedMembers = findUnimplementedMembers(element);
-        if (!node.getModifiers().isAbstract() && !unimplementedMembers.isEmpty()) {
+        if (!node.getModifiers().isAbstract() && !unimplementedMembers.isEmpty() &&
+            (reportNoMemberWhenHasInterceptor || !Elements.handlesNoSuchMethod(type))) {
           StringBuilder sb = getUnimplementedMembersMessage(element, unimplementedMembers);
           onError(node.getName(), TypeErrorCode.CONTRETE_CLASS_WITH_UNIMPLEMENTED_MEMBERS,
               node.getName(), sb.toString());
@@ -1785,9 +1787,15 @@
       Member iteratorMember = lookupMember(iterableType, "iterator", iterableExpression);
       Type elementType = null;
       if (iteratorMember != null) {
+        Type memberReturnType = null;
         if (TypeKind.of(iteratorMember.getType()) == TypeKind.FUNCTION) {
           FunctionType iteratorMethod = (FunctionType) iteratorMember.getType();
-          InterfaceType asInstanceOf = types.asInstanceOf(iteratorMethod.getReturnType(),
+          memberReturnType = iteratorMethod.getReturnType();
+        } else if (ElementKind.of(iteratorMember.getElement()) == ElementKind.FIELD) {
+          memberReturnType = iteratorMember.getType();
+        }
+        if (memberReturnType != null) {
+          InterfaceType asInstanceOf = types.asInstanceOf(memberReturnType,
               dynamicIteratorType.getElement());
           if (asInstanceOf != null) {
             elementType = asInstanceOf.getArguments().get(0);
@@ -1795,8 +1803,7 @@
           } else {
             InterfaceType expectedIteratorType = dynamicIteratorType.subst(
                 Arrays.asList(variableType), dynamicIteratorType.getElement().getTypeParameters());
-            typeError(iterableExpression,
-                TypeErrorCode.FOR_IN_WITH_INVALID_ITERATOR_RETURN_TYPE,
+            typeError(iterableExpression, TypeErrorCode.FOR_IN_WITH_INVALID_ITERATOR_RETURN_TYPE,
                 expectedIteratorType);
           }
         } else {
@@ -2369,7 +2376,8 @@
       // report "not a member"
       if (member == null) {
         if (reportNoMemberWhenHasInterceptor || !Elements.handlesNoSuchMethod(cls)) {
-          if (typeChecksForInferredTypes || !TypeQuality.isInferred(receiver)) {
+          if (typeChecksForInferredTypes && !isTooGenericInferredType(receiver)
+              || !TypeQuality.isInferred(receiver)) {
             TypeErrorCode errorCode = TypeQuality.isInferred(receiver)
                 ? TypeErrorCode.NOT_A_MEMBER_OF_INFERRED : TypeErrorCode.NOT_A_MEMBER_OF;
             typeError(node.getName(), errorCode, name, cls);
@@ -3617,4 +3625,18 @@
         && Elements.isCoreLibrarySource(type.getElement().getSourceInfo().getSource())
         && type.getElement().getName().equals(name);
   }
+
+  /**
+   * Sometimes inferred type is too generic - such as "Object" or "Collection", so there are no
+   * reason to reports problems.
+   */
+  private static boolean isTooGenericInferredType(Type type) {
+    if (TypeQuality.of(type) == TypeQuality.INFERRED) {
+      String typeName = type.getElement().getName();
+      if ("Object".equals(typeName) || "Collection".equals(typeName)) {
+        return true;
+      }
+    }
+    return false;
+  }
 }
diff --git a/compiler/javatests/com/google/dart/compiler/PrettyErrorFormatterTest.java b/compiler/javatests/com/google/dart/compiler/PrettyErrorFormatterTest.java
index 471654d..94839a9 100644
--- a/compiler/javatests/com/google/dart/compiler/PrettyErrorFormatterTest.java
+++ b/compiler/javatests/com/google/dart/compiler/PrettyErrorFormatterTest.java
@@ -104,7 +104,7 @@
     String errorString = getErrorString(error, false, false);
     assertEquals(
         Joiner.on("\n").join(
-            "my/path/Test.dart:1: no such type \"Foo\" (sourced from Test_app)",
+            "my/path/Test.dart:1:3: no such type \"Foo\" (sourced from Test_app)",
             "     1: lineAAA",
             "          ~~~",
             ""),
@@ -122,7 +122,7 @@
     String errorString = getErrorString(error, false, false);
     assertEquals(
         Joiner.on("\n").join(
-            "my/path/Test.dart:2: no such type \"Foo\" (sourced from Test_app)",
+            "my/path/Test.dart:2:3: no such type \"Foo\" (sourced from Test_app)",
             "     1: lineAAA",
             "     2: lineBBB",
             "          ~~~~~",
@@ -141,7 +141,7 @@
     assertEquals(
         Joiner.on("\n").join(
             WARNING_BOLD_COLOR
-                + "my/path/Test.dart:2: no such type \"Foo\" (sourced from Test_app)"
+                + "my/path/Test.dart:2:3: no such type \"Foo\" (sourced from Test_app)"
                 + NO_COLOR,
             "     1: lineAAA",
             "     2: li" + WARNING_COLOR + "neBBB" + NO_COLOR,
@@ -153,7 +153,7 @@
     assertEquals(
         Joiner.on("\n").join(
             ERROR_BOLD_COLOR
-                + "my/path/Test.dart:2: no such type \"Foo\" (sourced from Test_app)"
+                + "my/path/Test.dart:2:3: no such type \"Foo\" (sourced from Test_app)"
                 + NO_COLOR,
             "     1: lineAAA",
             "     2: li" + ERROR_COLOR + "neBBB" + NO_COLOR,
@@ -172,7 +172,7 @@
     String errorString = getErrorString(error, false, false);
     assertEquals(
         Joiner.on("\n").join(
-            "my/path/Test.dart:2: no such type \"Foo\" (sourced from Test_app)",
+            "my/path/Test.dart:2:3: no such type \"Foo\" (sourced from Test_app)",
             "     1: lineAAA",
             "     2: lineBBB",
             "          ~~~",
@@ -191,7 +191,7 @@
     assertEquals(
         Joiner.on("\n").join(
             WARNING_BOLD_COLOR
-                + "my/path/Test.dart:2: no such type \"Foo\" (sourced from Test_app)"
+                + "my/path/Test.dart:2:3: no such type \"Foo\" (sourced from Test_app)"
                 + NO_COLOR,
             "     1: lineAAA",
             "     2: li" + WARNING_COLOR + "neB" + NO_COLOR + "BB",
@@ -203,7 +203,7 @@
     assertEquals(
         Joiner.on("\n").join(
             ERROR_BOLD_COLOR
-                + "my/path/Test.dart:2: no such type \"Foo\" (sourced from Test_app)"
+                + "my/path/Test.dart:2:3: no such type \"Foo\" (sourced from Test_app)"
                 + NO_COLOR,
             "     1: lineAAA",
             "     2: li" + ERROR_COLOR + "neB" + NO_COLOR + "BB",
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 3b08569..7ef53ab 100644
--- a/compiler/javatests/com/google/dart/compiler/end2end/inc/IncrementalCompilation2Test.java
+++ b/compiler/javatests/com/google/dart/compiler/end2end/inc/IncrementalCompilation2Test.java
@@ -589,6 +589,23 @@
   }
 
   /**
+   * <p>
+   * http://code.google.com/p/dart/issues/detail?id=6859
+   */
+  public void test_reportMissingImport_dart() throws Exception {
+    appSource.setContent(
+        APP,
+        makeCode(
+            "// filler filler filler filler filler filler filler filler filler filler filler",
+            "library app;",
+            "import 'dart:mirrors as mirrors';",
+            ""));
+    compile();
+    // Check that errors where reported (and in correct time).
+    assertErrors(errors, errEx(DartCompilerErrorCode.MISSING_SOURCE, 3, 1, 33));
+  }
+
+  /**
    * Test that same prefix can be used to import several libraries.
    */
   public void test_samePrefix_severalLibraries() throws Exception {
diff --git a/compiler/javatests/com/google/dart/compiler/parser/SyntaxTest.java b/compiler/javatests/com/google/dart/compiler/parser/SyntaxTest.java
index 496653f..4f9415a 100644
--- a/compiler/javatests/com/google/dart/compiler/parser/SyntaxTest.java
+++ b/compiler/javatests/com/google/dart/compiler/parser/SyntaxTest.java
@@ -46,6 +46,27 @@
 import java.util.List;
 
 public class SyntaxTest extends AbstractParserTest {
+  /**
+   * <p>
+   * http://code.google.com/p/dart/issues/detail?id=6881
+   */
+  public void test_uri_adjacent() {
+    parseUnit("test.dart", Joiner.on("\n").join(
+        "import 'myLib' '.dart';",
+        ""));
+  }
+  /**
+   * <p>
+   * http://code.google.com/p/dart/issues/detail?id=6881
+   */
+  public void test_uri_interpolation() {
+    parseUnit("test.dart", Joiner.on("\n").join(
+        "import 'my$x' '.dart';",
+        "var a = 'Lib';",
+        ""),
+        ParserErrorCode.URI_CANNOT_USE_INTERPOLATION, 1, 8);
+  }
+
   public void test_exportDirective_combinators() {
     parseUnit("test.dart", Joiner.on("\n").join(
         "library lib;",
diff --git a/compiler/javatests/com/google/dart/compiler/resolver/ResolverTest.java b/compiler/javatests/com/google/dart/compiler/resolver/ResolverTest.java
index e27f146..fa7c795 100644
--- a/compiler/javatests/com/google/dart/compiler/resolver/ResolverTest.java
+++ b/compiler/javatests/com/google/dart/compiler/resolver/ResolverTest.java
@@ -393,6 +393,18 @@
         "}"),
         ResolverErrorCode.NEW_EXPRESSION_CANT_USE_TYPE_VAR);
   }
+  
+  public void testConstExpression4() {
+    // New expression tied to an unbound type variable is not allowed.
+    resolveAndTest(Joiner.on("\n").join(
+        "class Object {}",
+        "class Foo<T> {",
+        "  T create() {",
+        "    return const T();",
+        "  }",
+        "}"),
+        ResolverErrorCode.CONST_EXPRESSION_CANT_USE_TYPE_VAR);
+  }
 
   public void testNewExpression5() {
     // More cowbell. (Foo<T> isn't a type yet)
diff --git a/compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerCompilerTest.java b/compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerCompilerTest.java
index dd81e86..bfada16 100644
--- a/compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerCompilerTest.java
+++ b/compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerCompilerTest.java
@@ -617,6 +617,49 @@
     }
   }
 
+  /**
+   * When class implements "noSuchMethod", we presume that it will handle unimplemented methods.
+   * <p>
+   * http://code.google.com/p/dart/issues/detail?id=6964
+   */
+  public void test_warnAbstract_onConcreteClassDeclaration_hasUnimplementedMethod_noSuchMethod()
+      throws Exception {
+    // report by default
+    {
+      AnalyzeLibraryResult libraryResult =
+          analyzeLibrary(
+              "class A {",
+              "  void foo();",
+              "  noSuchMethod(InvocationMirror m) {}",
+              "}",
+              "main() {",
+              "  new A();",
+              "}");
+      assertErrors(
+          libraryResult.getErrors(),
+          errEx(TypeErrorCode.CONTRETE_CLASS_WITH_UNIMPLEMENTED_MEMBERS, 1, 7, 1));
+    }
+    // disable warnings if has "noSuchMethod"
+    {
+      compilerConfiguration = new DefaultCompilerConfiguration(new CompilerOptions() {
+        @Override
+        public boolean reportNoMemberWhenHasInterceptor() {
+          return false;
+        }
+      });
+      AnalyzeLibraryResult libraryResult =
+          analyzeLibrary(
+              "class A {",
+              "  void foo();",
+              "  noSuchMethod(InvocationMirror m) {}",
+              "}",
+              "main() {",
+              "  new A();",
+              "}");
+      assertErrors(libraryResult.getErrors());
+    }
+  }
+
   public void test_warnAbstract_onConcreteClassDeclaration_hasUnimplemented_getter()
       throws Exception {
     AnalyzeLibraryResult libraryResult =
@@ -3052,6 +3095,37 @@
   }
 
   /**
+   * Sometimes inferred type is too generic - such as "Object" or "Collection", so there are no
+   * reason to reports problems.
+   */
+  public void test_typesPropagation_dontWant_ifTooGeneric() throws Exception {
+    compilerConfiguration = new DefaultCompilerConfiguration(new CompilerOptions() {
+      @Override
+      public boolean typeChecksForInferredTypes() {
+        return true;
+      }
+    });
+    AnalyzeLibraryResult libraryResult = analyzeLibrary(
+        "// filler filler filler filler filler filler filler filler filler filler",
+        "typedef void HandlerObject(Object o);",
+        "typedef void HandlerCollection(Collection o);",
+        "fObject(HandlerObject h) {}",
+        "fCollection(HandlerCollection h) {}",
+        "main() {",
+        "  fObject((x) {",
+        "    x.myNoSuchField;",
+        "    x.myNoSuchMethod();",
+        "  });",
+        "  fCollection((x) {",
+        "    x.myNoSuchField;",
+        "    x.myNoSuchMethod();",
+        "  });",
+        "}",
+        "");
+    assertErrors(libraryResult.getErrors());
+  }
+
+  /**
    * Helpful (but not perfectly satisfying Specification) type of "conditional" is intersection of
    * then/else types, not just their "least upper bounds". And this corresponds runtime behavior.
    */
@@ -5695,4 +5769,74 @@
     assertErrors(result.getErrors(),
         errEx(ResolverErrorCode.VARIABLE_REFERENCES_SAME_NAME_IN_INITIALIZER, 3, 11, 1));
   }
+
+  public void test_ForEachStatement_method() throws Exception {
+    AnalyzeLibraryResult result = analyzeLibrary(
+        "// filler filler filler filler filler filler filler filler filler filler",
+        "class A {",
+        "  Iterator<int> iterator() {}",
+        "}",
+        "main() {",
+        "  A a = new A();",
+        "  for (int v in a) {}",
+        "}",
+        "");
+    assertErrors(result.getErrors());
+  }
+
+  public void test_ForEachStatement_negative_method_invalidReturnType() throws Exception {
+    AnalyzeLibraryResult result = analyzeLibrary(
+        "// filler filler filler filler filler filler filler filler filler filler",
+        "class A {",
+        "  int iterator() {}",
+        "}",
+        "main() {",
+        "  A a = new A();",
+        "  for (int v in a) {}",
+        "}",
+        "");
+    assertErrors(
+        result.getErrors(),
+        errEx(TypeErrorCode.FOR_IN_WITH_INVALID_ITERATOR_RETURN_TYPE, 7, 17, 1));
+  }
+
+  /**
+   * It was negative test, but in the new <code>Iterator</code> field should be also supported.
+   */
+  public void test_ForEachStatement_field() throws Exception {
+    AnalyzeLibraryResult result = analyzeLibrary(
+        "// filler filler filler filler filler filler filler filler filler filler",
+        "class A {",
+        "  Iterator iterator;",
+        "}",
+        "main() {",
+        "  A a = new A();",
+        "  for (int v in a) {}",
+        "}",
+        "");
+    assertErrors(result.getErrors());
+//    Map<String, ClassNodeElement> fieldNotMethod = loadSource(
+//        "class A {",
+//        "  int iterator;",
+//        "}",
+//        "class B {",
+//        "  main() { for (int i in new A()) {}}",
+//        "}");
+//    analyzeClasses(fieldNotMethod, TypeErrorCode.FOR_IN_WITH_ITERATOR_FIELD);
+  }
+
+  public void test_ForEachStatement_negative_field_invalidReturnType() throws Exception {
+    AnalyzeLibraryResult result = analyzeLibrary(
+        "// filler filler filler filler filler filler filler filler filler filler",
+        "class A {",
+        "  int iterator;",
+        "}",
+        "main() {",
+        "  A a = new A();",
+        "  for (int v in a) {}",
+        "}",
+        "");
+    assertErrors(result.getErrors(),
+        errEx(TypeErrorCode.FOR_IN_WITH_INVALID_ITERATOR_RETURN_TYPE, 7, 17, 1));
+  }
 }
diff --git a/compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerTest.java b/compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerTest.java
index c4396fa..5889eb0 100644
--- a/compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerTest.java
+++ b/compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerTest.java
@@ -404,40 +404,6 @@
     analyzeClass(classes.get("Bad"), 3);
   }
 
-  public void testForEachStatement() {
-    Map<String, ClassNodeElement> invalidReturnType = loadSource(
-        "class A {",
-        "  Iterator<int> iterator() {}",
-        "}",
-        "class B {",
-        "  main() { for (int i in new A()) {}}",
-        "}");
-    analyzeClasses(invalidReturnType);
-  }
-
-  public void testForEachStatement_Negative1() {
-    Map<String, ClassNodeElement> fieldNotMethod = loadSource(
-        "class A {",
-        "  int iterator;",
-        "}",
-        "class B {",
-        "  main() { for (int i in new A()) {}}",
-        "}");
-    analyzeClasses(fieldNotMethod, TypeErrorCode.FOR_IN_WITH_ITERATOR_FIELD);
-  }
-
-  public void testForEachStatement_Negative2() {
-    Map<String, ClassNodeElement> invalidReturnType = loadSource(
-        "class A {",
-        "  int iterator() {}",
-        "}",
-        "class B {",
-        "  main() { for (int i in new A()) {}}",
-        "}");
-    analyzeClasses(invalidReturnType, TypeErrorCode.FOR_IN_WITH_INVALID_ITERATOR_RETURN_TYPE);
-  }
-
-
   public void testForStatement() {
     analyze("for (;true;) {}");
     analyze("for (;null;) {}");
diff --git a/compiler/scripts/dart_analyzer.bat b/compiler/scripts/dart_analyzer.bat
index 0353f2b..4653020 100644
--- a/compiler/scripts/dart_analyzer.bat
+++ b/compiler/scripts/dart_analyzer.bat
@@ -44,7 +44,7 @@
 setlocal EnableDelayedExpansion

 set DART_SDK=""

 if [%FOUND_SDK%] == [0] (

-  if exist "%DART_ANALYZER_HOME%\lib\core\core_runtime.dart" (

+  if exist "%DART_ANALYZER_HOME%\lib\core\core.dart" (

     set DART_SDK=--dart-sdk %DART_ANALYZER_HOME%

   ) else (

     for /f %%i in ('echo %DART_ANALYZER_HOME%') do set DART_SDK_HOME=%%~dpi\dart-sdk

@@ -64,7 +64,7 @@
 

 rem DART_SDK=""

 rem if [ $FOUND_SDK = 0 ] ; then

-rem   if [ -f $DART_ANALYZER_HOME/lib/core/core_runtime.dart ] ; then

+rem   if [ -f $DART_ANALYZER_HOME/lib/core/core.dart ] ; then

 rem     DART_SDK="--dart-sdk $DART_ANALYZER_HOME"

 rem   else

 rem     DART_SDK_HOME=$(dirname $DART_ANALYZER_HOME)/dart-sdk

@@ -136,4 +136,4 @@
 

 rem exec java $EXTRA_JVMARGS $DART_JVMARGS -ea -classpath "@CLASSPATH@" \

 rem   com.google.dart.compiler.DartCompiler ${DART_SDK} $@

-rem 
\ No newline at end of file
+rem 

diff --git a/compiler/scripts/dart_analyzer.sh b/compiler/scripts/dart_analyzer.sh
index 8abaf52..c07f5bc 100755
--- a/compiler/scripts/dart_analyzer.sh
+++ b/compiler/scripts/dart_analyzer.sh
@@ -5,8 +5,11 @@
 
 set -e
 
-SCRIPT_DIR=$(dirname $0)
-DART_ANALYZER_HOME=$(dirname $SCRIPT_DIR)
+# Setting SCRIPT_DIR this way is ugly, but is needed to handle the case where
+# dart-sdk/bin has been symlinked to. On MacOS, readlink doesn't work
+# with this case.
+SCRIPT_DIR="$(cd "${0%/*}" ; pwd -P)"
+DART_ANALYZER_HOME="$(cd "${SCRIPT_DIR%/*}" ; pwd -P)"
 
 FOUND_BATCH=0
 FOUND_SDK=0
@@ -26,7 +29,7 @@
 
 DART_SDK=""
 if [ $FOUND_SDK = 0 ] ; then
-  if [ -f $DART_ANALYZER_HOME/lib/core/core_runtime.dart ] ; then
+  if [ -f $DART_ANALYZER_HOME/lib/core/core.dart ] ; then
     DART_SDK="--dart-sdk $DART_ANALYZER_HOME"
   else
     DART_SDK_HOME=$(dirname $DART_ANALYZER_HOME)/dart-sdk
diff --git a/dart.gyp b/dart.gyp
index b76a758..fe081d3 100644
--- a/dart.gyp
+++ b/dart.gyp
@@ -40,8 +40,8 @@
         {
           'action_name': 'create_sdk_py',
           'inputs': [
-            '<!@(["python", "tools/list_files.py", "\\.dart$", "lib"])',
-            '<!@(["python", "tools/list_files.py", "import_.*\\.config$", "lib/config"])',
+            '<!@(["python", "tools/list_files.py", "\\.dart$", "sdk/lib"])',
+            '<!@(["python", "tools/list_files.py", "", "sdk/bin"])',
             'tools/create_sdk.py',
             '<(PRODUCT_DIR)/<(EXECUTABLE_PREFIX)dart<(EXECUTABLE_SUFFIX)',
             '<(PRODUCT_DIR)/dart2js',
@@ -129,8 +129,19 @@
     {
       'target_name': 'samples',
       'type': 'none',
-      'dependencies': [
-        'samples/sample_extension/sample_extension.gyp:sample_extension',
+      'conditions': [
+         ['OS=="android"', {
+            'dependencies': [
+              'samples/android_embedder/android_embedder.gyp:android_embedder',
+            ],
+          },
+        ],
+         ['OS!="android"', {
+            'dependencies': [
+              'samples/sample_extension/sample_extension.gyp:sample_extension',
+            ],
+          },
+        ]
       ],
     },
     {
diff --git a/pkg/.gitignore b/pkg/.gitignore
new file mode 100644
index 0000000..256ea1f
--- /dev/null
+++ b/pkg/.gitignore
@@ -0,0 +1,9 @@
+/Makefile
+/*.Makefile
+/*.sln
+/*.target.mk
+/*.vcproj
+/*.vcxproj
+/*.vcxproj.user
+/*.vcxproj.filters
+/*.xcodeproj
diff --git a/pkg/http/lib/src/base_request.dart b/pkg/http/lib/src/base_request.dart
index ecf5f7a..4a8b5ce 100644
--- a/pkg/http/lib/src/base_request.dart
+++ b/pkg/http/lib/src/base_request.dart
@@ -5,6 +5,7 @@
 library base_request;
 
 import 'dart:io';
+import 'dart:isolate';
 import 'dart:uri';
 
 import 'client.dart';
@@ -104,9 +105,19 @@
   /// requests.
   Future<StreamedResponse> send() {
     var client = new Client();
-    var future = client.send(this);
-    future.onComplete((_) => client.close());
-    return future;
+    return client.send(this).transform((response) {
+      // TODO(nweiz): This makes me sick to my stomach, but it's currently the
+      // best way to listen for the response stream being closed. Kill it with
+      // fire once issue 4202 is fixed.
+      new Timer.repeating(100, (timer) {
+        if (response.stream.closed) {
+          client.close();
+          timer.cancel();
+        }
+      });
+
+      return response;
+    });
   }
 
   /// Throws an error if this request has been finalized.
diff --git a/pkg/http/lib/src/base_response.dart b/pkg/http/lib/src/base_response.dart
index 57f4a95..8b7da0c 100644
--- a/pkg/http/lib/src/base_response.dart
+++ b/pkg/http/lib/src/base_response.dart
@@ -6,11 +6,16 @@
 
 import 'dart:io';
 
+import 'base_request.dart';
+
 /// The base class for HTTP responses.
 ///
 /// Subclasses of [BaseResponse] are usually not constructed manually; instead,
 /// they're returned by [BaseClient.send] or other HTTP client methods.
 abstract class BaseResponse {
+  /// The (frozen) request that triggered this response.
+  final BaseRequest request;
+
   /// The status code of the response.
   final int statusCode;
 
@@ -37,7 +42,8 @@
   BaseResponse(
       this.statusCode,
       this.contentLength,
-      {this.headers: const <String>{},
+      {this.request,
+       this.headers: const <String>{},
        this.isRedirect: false,
        this.persistentConnection: true,
        this.reasonPhrase});
diff --git a/pkg/http/lib/src/io_client.dart b/pkg/http/lib/src/io_client.dart
index 995ff3b..e263c66 100644
--- a/pkg/http/lib/src/io_client.dart
+++ b/pkg/http/lib/src/io_client.dart
@@ -25,10 +25,26 @@
 
     var completer = new Completer<StreamedResponse>();
     var connection = _inner.openUrl(request.method, request.url);
+    connection.followRedirects = request.followRedirects;
+    connection.maxRedirects = request.maxRedirects;
     connection.onError = (e) {
       async.then((_) {
-        // TODO(nweiz): remove this when issue 4974 is fixed
-        if (completer.future.isComplete) throw e;
+        if (completer.future.isComplete) {
+          // TODO(nweiz): issue 7014 means that connection errors may be routed
+          // here even after onResponse has been called. Since these errors are
+          // also routed to the response input stream, we want to silently
+          // ignore them.
+          //
+          // We test if they're HTTP exceptions to distinguish them from errors
+          // caused by issue 4974 (see below).
+          if (e is HttpException) return;
+
+          // TODO(nweiz): issue 4974 means that any errors that appear in the
+          // onRequest or onResponse callbacks get passed to onError. If the
+          // completer has already fired, we want to re-throw those exceptions
+          // to the top level so that they aren't silently ignored.
+          throw e;
+        }
 
         completer.completeException(e);
       });
@@ -53,9 +69,10 @@
       response.headers.forEach((key, value) => headers[key] = value);
 
       completer.complete(new StreamedResponse(
-          response.inputStream,
+          wrapInputStream(response.inputStream),
           response.statusCode,
           response.contentLength,
+          request: request,
           headers: headers,
           isRedirect: response.isRedirect,
           persistentConnection: response.persistentConnection,
@@ -68,7 +85,7 @@
   /// Closes the client. This terminates all active connections. If a client
   /// remains unclosed, the Dart process may not terminate.
   void close() {
-    if (_inner != null) _inner.shutdown();
+    if (_inner != null) _inner.shutdown(force: true);
     _inner = null;
   }
 }
diff --git a/pkg/http/lib/src/mock_client.dart b/pkg/http/lib/src/mock_client.dart
index ce2916f..90c5d19 100644
--- a/pkg/http/lib/src/mock_client.dart
+++ b/pkg/http/lib/src/mock_client.dart
@@ -25,10 +25,12 @@
   /// [StreamedResponse]s.
   final MockClientStreamHandler _handler;
 
+  MockClient._(this._handler);
+
   /// Creates a [MockClient] with a handler that receives [Request]s and sends
   /// [Response]s.
   MockClient(MockClientHandler fn)
-    : this.streaming((baseRequest, bodyStream) {
+    : this._((baseRequest, bodyStream) {
       return consumeInputStream(bodyStream).chain((bodyBytes) {
         var request = new Request(baseRequest.method, baseRequest.url);
         request.persistentConnection = baseRequest.persistentConnection;
@@ -48,6 +50,7 @@
             stream,
             response.statusCode,
             response.contentLength,
+            request: baseRequest,
             headers: response.headers,
             isRedirect: response.isRedirect,
             persistentConnection: response.persistentConnection,
@@ -57,7 +60,20 @@
 
   /// Creates a [MockClient] with a handler that receives [StreamedRequest]s and
   /// sends [StreamedResponse]s.
-  MockClient.streaming(MockClientStreamHandler this._handler);
+  MockClient.streaming(MockClientStreamHandler fn)
+    : this._((request, bodyStream) {
+      return fn(request, bodyStream).transform((response) {
+        return new StreamedResponse(
+            response.stream,
+            response.statusCode,
+            response.contentLength,
+            request: request,
+            headers: response.headers,
+            isRedirect: response.isRedirect,
+            persistentConnection: response.persistentConnection,
+            reasonPhrase: response.reasonPhrase);
+      });
+    });
 
   /// Sends a request.
   Future<StreamedResponse> send(BaseRequest request) {
diff --git a/pkg/http/lib/src/multipart_request.dart b/pkg/http/lib/src/multipart_request.dart
index b523956..b9adf9c 100644
--- a/pkg/http/lib/src/multipart_request.dart
+++ b/pkg/http/lib/src/multipart_request.dart
@@ -102,7 +102,7 @@
       writeLine();
     });
 
-    forEachFuture(files, (file) {
+    Futures.forEach(files, (file) {
       writeAscii('--$boundary\r\n');
       writeAscii(_headerForFile(file));
       return writeInputToInput(file.finalize(), stream)
diff --git a/pkg/http/lib/src/response.dart b/pkg/http/lib/src/response.dart
index d3546fe..26e5e61 100644
--- a/pkg/http/lib/src/response.dart
+++ b/pkg/http/lib/src/response.dart
@@ -7,6 +7,7 @@
 import 'dart:io';
 import 'dart:scalarlist';
 
+import 'base_request.dart';
 import 'base_response.dart';
 import 'streamed_response.dart';
 import 'utils.dart';
@@ -28,13 +29,15 @@
   Response(
       String body,
       int statusCode,
-      {Map<String, String> headers: const <String>{},
+      {BaseRequest request,
+       Map<String, String> headers: const <String>{},
        bool isRedirect: false,
        bool persistentConnection: true,
        String reasonPhrase})
     : this.bytes(
         encodeString(body, _encodingForHeaders(headers)),
         statusCode,
+        request: request,
         headers: headers,
         isRedirect: isRedirect,
         persistentConnection: persistentConnection,
@@ -44,7 +47,8 @@
   Response.bytes(
       List<int> bodyBytes,
       int statusCode,
-      {Map<String, String> headers: const <String>{},
+      {BaseRequest request,
+       Map<String, String> headers: const <String>{},
        bool isRedirect: false,
        bool persistentConnection: true,
        String reasonPhrase})
@@ -52,6 +56,7 @@
       super(
         statusCode,
         bodyBytes.length,
+        request: request,
         headers: headers,
         isRedirect: isRedirect,
         persistentConnection: persistentConnection,
@@ -64,6 +69,7 @@
       return new Response.bytes(
           body,
           response.statusCode,
+          request: response.request,
           headers: response.headers,
           isRedirect: response.isRedirect,
           persistentConnection: response.persistentConnection,
diff --git a/pkg/http/lib/src/streamed_response.dart b/pkg/http/lib/src/streamed_response.dart
index 8810df7..218643b 100644
--- a/pkg/http/lib/src/streamed_response.dart
+++ b/pkg/http/lib/src/streamed_response.dart
@@ -7,6 +7,7 @@
 import 'dart:io';
 
 import 'base_response.dart';
+import 'base_request.dart';
 
 /// An HTTP response where the response body is received asynchronously after
 /// the headers have been received.
@@ -19,13 +20,15 @@
       this.stream,
       int statusCode,
       int contentLength,
-      {Map<String, String> headers: const <String>{},
+      {BaseRequest request,
+       Map<String, String> headers: const <String>{},
        bool isRedirect: false,
        bool persistentConnection: true,
        String reasonPhrase})
     : super(
         statusCode,
         contentLength,
+        request: request,
         headers: headers,
         isRedirect: isRedirect,
         persistentConnection: persistentConnection,
diff --git a/pkg/http/lib/src/utils.dart b/pkg/http/lib/src/utils.dart
index 8431603..5bc9b5f 100644
--- a/pkg/http/lib/src/utils.dart
+++ b/pkg/http/lib/src/utils.dart
@@ -144,11 +144,29 @@
   return completer.future;
 }
 
+// TODO(nweiz): this wouldn't be necessary were it not for issue 7013.
+/// Wrap an InputStream in a ListInputStream. This ensures that if the input
+/// stream has invalid onClosed/onError behavior (see issue 7013), that behavior
+/// is papered over.
+InputStream wrapInputStream(InputStream source) {
+  var sink = new ListInputStream();
+  // TODO(nweiz): Due to issuee 3657, pipeInputToInput naturally avoids calling
+  // both onClosed and onError. If 3657 gets fixed before 7013, we'll need to do
+  // that explicitly.
+  pipeInputToInput(source, sink);
+  return sink;
+}
+
 /// Takes all input from [source] and writes it to [sink], then closes [sink].
+/// Returns a [Future] that completes when [source] is exhausted.
 void pipeInputToInput(InputStream source, ListInputStream sink) {
-  source.onClosed = () => sink.markEndOfStream();
+  source.onClosed = sink.markEndOfStream;
   source.onData = () => sink.write(source.read());
   // TODO(nweiz): propagate source errors to the sink. See issue 3657.
+  // TODO(nweiz): we need to use async here to avoid issue 4974.
+  source.onError = (e) => async.then((_) {
+    throw e;
+  });
 }
 
 /// Takes all input from [source] and writes it to [sink], but does not close
diff --git a/pkg/http/test/client_test.dart b/pkg/http/test/client_test.dart
index e7c3501..673ba1d 100644
--- a/pkg/http/test/client_test.dart
+++ b/pkg/http/test/client_test.dart
@@ -22,6 +22,7 @@
       'application/json; charset=utf-8';
 
     var future = client.send(request).chain((response) {
+      expect(response.request, equals(request));
       expect(response.statusCode, equals(200));
       return consumeInputStream(response.stream);
     }).transform((bytes) => new String.fromCharCodes(bytes));
diff --git a/pkg/http/test/mock_client_test.dart b/pkg/http/test/mock_client_test.dart
index 7bc39566..44d5161 100644
--- a/pkg/http/test/mock_client_test.dart
+++ b/pkg/http/test/mock_client_test.dart
@@ -20,7 +20,7 @@
     var client = new MockClient((request) {
       return new Future.immediate(new http.Response(
           JSON.stringify(request.bodyFields), 200,
-          headers: {'content-type': 'application/json'}));
+          request: request, headers: {'content-type': 'application/json'}));
     });
 
     expect(client.post("http://example.com/foo", fields: {
diff --git a/pkg/http/test/request_test.dart b/pkg/http/test/request_test.dart
index 319abfb..e26ee75 100644
--- a/pkg/http/test/request_test.dart
+++ b/pkg/http/test/request_test.dart
@@ -183,6 +183,53 @@
     // when issue 6284 is fixed.
   });
 
+  test('#followRedirects', () {
+    print("This test is known to be flaky, please ignore "
+          "(debug prints below added by sgjesse@)");
+    print("#followRedirects test starting server...");
+    startServer();
+    print("#followRedirects test server running");
+
+    var request = new http.Request('POST', serverUrl.resolve('/redirect'))
+        ..followRedirects = false;
+    var future = request.send().transform((response) {
+      print("#followRedirects test response received");
+      expect(response.statusCode, equals(302));
+    });
+    future.onComplete((_) {
+      print("#followRedirects test stopping server...");
+      stopServer();
+      print("#followRedirects test server stopped");
+    });
+
+    expect(future, completes);
+    print("#followRedirects test started");
+  });
+
+  test('#maxRedirects', () {
+    print("This test is known to be flaky, please ignore "
+          "(debug prints below added by sgjesse@)");
+    print("#maxRedirects test starting server...");
+    startServer();
+    print("#maxRedirects test server running");
+
+    var request = new http.Request('POST', serverUrl.resolve('/loop?1'))
+      ..maxRedirects = 2;
+    var future = request.send().transformException((e) {
+      print("#maxRedirects test exception received");
+      expect(e, isRedirectLimitExceededException);
+      expect(e.redirects.length, equals(2));
+    });
+    future.onComplete((_) {
+      print("#maxRedirects test stopping server...");
+      stopServer();
+      print("#maxRedirects test server stopped");
+    });
+
+    expect(future, completes);
+    print("#maxRedirects test started");
+  });
+
   group('content-type header', () {
     test('defaults to empty', () {
       var request = new http.Request('POST', dummyUrl);
diff --git a/pkg/http/test/utils.dart b/pkg/http/test/utils.dart
index 19a3cf3..9e0d010 100644
--- a/pkg/http/test/utils.dart
+++ b/pkg/http/test/utils.dart
@@ -29,24 +29,25 @@
       (request, response) {
     response.statusCode = 400;
     response.contentLength = 0;
-    response.outputStream.close();
+    closeResponse(request, response);
   });
 
   _server.addRequestHandler((request) => request.path == '/loop',
       (request, response) {
     var n = int.parse(new Uri.fromString(request.uri).query);
     response.statusCode = 302;
-    response.headers.set('location', '/loop?${n + 1}');
+    response.headers.set('location',
+        serverUrl.resolve('/loop?${n + 1}').toString());
     response.contentLength = 0;
-    response.outputStream.close();
+    closeResponse(request, response);
   });
 
   _server.addRequestHandler((request) => request.path == '/redirect',
       (request, response) {
     response.statusCode = 302;
-    response.headers.set('location', '/');
+    response.headers.set('location', serverUrl.resolve('/').toString());
     response.contentLength = 0;
-    response.outputStream.close();
+    closeResponse(request, response);
   });
 
   _server.defaultRequestHandler = (request, response) {
@@ -103,6 +104,15 @@
   _server = null;
 }
 
+/// Closes [response] while ignoring the body of [request].
+///
+/// Due to issue 6984, it's necessary to drain the request body before closing
+/// the response.
+void closeResponse(HttpRequest request, HttpResponse response) {
+  request.inputStream.onData = request.inputStream.read;
+  request.inputStream.onClosed = response.outputStream.close;
+}
+
 /// A matcher that matches JSON that parses to a value that matches the inner
 /// matcher.
 Matcher parse(matcher) => new _Parse(matcher);
diff --git a/pkg/oauth2/pubspec.yaml b/pkg/oauth2/pubspec.yaml
new file mode 100644
index 0000000..477d211
--- /dev/null
+++ b/pkg/oauth2/pubspec.yaml
@@ -0,0 +1,7 @@
+name: oauth2
+description: A composable, Future-based API for making HTTP requests.
+dependencies:
+  unittest:
+    sdk: unittest
+  http:
+    sdk: http
diff --git a/pkg/pkg.gyp b/pkg/pkg.gyp
index e5c2c35..6d09c61 100644
--- a/pkg/pkg.gyp
+++ b/pkg/pkg.gyp
@@ -23,15 +23,7 @@
             'webdriver/lib',
           ],
           'outputs': [
-            '<(PRODUCT_DIR)/packages/args',
-            '<(PRODUCT_DIR)/packages/fixnum',
-            '<(PRODUCT_DIR)/packages/htmlescape',
-            '<(PRODUCT_DIR)/packages/http',
-            '<(PRODUCT_DIR)/packages/intl',
-            '<(PRODUCT_DIR)/packages/logging',
-            '<(PRODUCT_DIR)/packages/meta',
-            '<(PRODUCT_DIR)/packages/unittest',
-            '<(PRODUCT_DIR)/packages/webdriver',
+            '<(PRODUCT_DIR)/packages',
           ],
           'action': [
             'python', '../tools/make_links.py',
diff --git a/pkg/pkg.status b/pkg/pkg.status
index e8688de..5e083aa 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -34,6 +34,9 @@
 intl/test/find_default_locale_browser_test: Skip
 intl/test/date_time_format_http_request_test: Skip
 
+[ $runtime == vm && $system == windows ]
+http/test/http_test: Pass, Fail # http://dartbug.com/6967
+
 # Skip http request tests on Dartium while resolving an odd
 # error there that causes the tests to timeout.
 [ $runtime == dartium || $runtime == drt ]
@@ -54,4 +57,3 @@
 
 [ $compiler == none && $runtime == drt ]
 dartdoc/test/dartdoc_test: Skip # See dartbug.com/4541.
-args/test/args_test: Skip # http://dartbug.com/6744
diff --git a/pkg/unittest/lib/html_config.dart b/pkg/unittest/lib/html_config.dart
index 3a8b3c4..3d87f98 100644
--- a/pkg/unittest/lib/html_config.dart
+++ b/pkg/unittest/lib/html_config.dart
@@ -14,7 +14,7 @@
 void _showResultsInPage(int passed, int failed, int errors,
     List<TestCase> results, bool isLayoutTest, String uncaughtError) {
   if (isLayoutTest && (passed == results.length) && uncaughtError == null) {
-    document.body.innerHTML = "PASS";
+    document.body.innerHtml = "PASS";
   } else {
     var newBody = new StringBuffer();
     newBody.add("<table class='unittest-table'><tbody>");
@@ -49,7 +49,7 @@
           </td></tr>""");
     }
     newBody.add("</tbody></table>");
-    document.body.innerHTML = newBody.toString();
+    document.body.innerHtml = newBody.toString();
   }
 }
 
diff --git a/pkg/unittest/lib/html_enhanced_config.dart b/pkg/unittest/lib/html_enhanced_config.dart
index ce68ef7..faad8eb 100644
--- a/pkg/unittest/lib/html_enhanced_config.dart
+++ b/pkg/unittest/lib/html_enhanced_config.dart
@@ -65,7 +65,7 @@
       cssElement = document.head.query('#${_CSSID}');
     }
 
-    cssElement.innerHTML = _htmlTestCSS;
+    cssElement.innerHtml = _htmlTestCSS;
   }
 
   void onStart() {
@@ -89,7 +89,7 @@
   void _showInteractiveResultsInPage(int passed, int failed, int errors,
       List<TestCase> results, bool isLayoutTest, String uncaughtError) {
     if (isLayoutTest && passed == results.length) {
-      document.body.innerHTML = "PASS";
+      document.body.innerHtml = "PASS";
     } else {
       // changed the StringBuffer to an Element fragment
       Element te = new Element.html('<div class="unittest-table"></div>');
diff --git a/pkg/unittest/lib/interactive_html_config.dart b/pkg/unittest/lib/interactive_html_config.dart
index 7cc2a04..796fcd4 100644
--- a/pkg/unittest/lib/interactive_html_config.dart
+++ b/pkg/unittest/lib/interactive_html_config.dart
@@ -242,7 +242,7 @@
   void onInit() {
     _installErrorHandler();
     _messageHandler = _handleMessage; // We need to make just one closure.
-    document.query('#group-divs').innerHTML = "";
+    document.query('#group-divs').innerHtml = "";
   }
 
   void onStart() {
@@ -355,7 +355,7 @@
       testItem.classes.clear();
       testItem.classes.add('test-it');
       testItem.classes.add('status-pending');
-      testItem.query('#$_actionIdPrefix$id').innerHTML = '';
+      testItem.query('#$_actionIdPrefix$id').innerHtml = '';
     }
   }
 
diff --git a/runtime/.gitignore b/runtime/.gitignore
index 7f21541..adaa849 100644
--- a/runtime/.gitignore
+++ b/runtime/.gitignore
@@ -1,41 +1,15 @@
-/*.filters
-/*.user
-/dart-runtime.sln
+/Makefile
+/out
+/runtime
+/xcodebuild
+/*.Makefile
+/*.sln
+/*.target.mk
 /*.vcproj
 /*.vcxproj
-/*.mk
-/dart_no_snapshot.target.mk
-/dart-runtime.Makefile
-/dart-runtime.xcodeproj
-/dart.target.mk
-/generate_builtin_cc_file.target.mk
-/generate_corelib_cc_file.target.mk
-/generate_corelib_impl_cc_file.target.mk
-/generate_io_cc_file.target.mk
-/generate_isolate_cc_file.target.mk
-/generate_json_cc_file.target.mk
-/generate_mirrors_cc_file.target.mk
-/generate_snapshot_file.target.mk
-/generate_snapshot_test_dat_file.target.mk
-/generate_uri_cc_file.target.mk
-/generate_utf_cc_file.target.mk
-/gen_snapshot.target.mk
-/libdart_builtin.target.mk
-/libdart_export.target.mk
-/libdart_lib.target.mk
-/libdart_lib_withcore.target.mk
-/libdart.target.mk
-/libdart_vm.target.mk
-/libdart_withcore.target.mk
-/libdouble_conversion.target.mk
-/libjscre.target.mk
-/Makefile
-/process_test.target.mk
-/runtime
-/run_vm_tests.target.mk
-/test_extension.target.mk
-/out
-/xcodebuild
+/*.vcxproj.filters
+/*.vcxproj.user
+/*.xcodeproj
 /Debug
 /DebugARM
 /DebugIA32
diff --git a/runtime/bin/bin.gypi b/runtime/bin/bin.gypi
index c8108b7..3a6dd8a 100644
--- a/runtime/bin/bin.gypi
+++ b/runtime/bin/bin.gypi
@@ -50,16 +50,35 @@
     {
       'target_name': 'generate_crypto_cc_file',
       'type': 'none',
+      'variables': {
+        'crypto_dart': '<(SHARED_INTERMEDIATE_DIR)/crypto_gen.dart',
+      },
       'includes': [
         'crypto_sources.gypi',
       ],
       'actions': [
         {
+          'action_name': 'generate_crypto_dart',
+          'inputs': [
+            '../tools/concat_library.py',
+            '<@(_sources)',
+          ],
+          'outputs': [
+            '<(crypto_dart)',
+          ],
+          'action': [
+            'python',
+            '<@(_inputs)',
+            '--output', '<(crypto_dart)',
+          ],
+          'message': 'Generating ''<(crypto_dart)'' file.',
+        },
+        {
           'action_name': 'generate_crypto_cc',
           'inputs': [
             '../tools/create_string_literal.py',
             '<(builtin_in_cc_file)',
-            '<@(_sources)',
+            '<(crypto_dart)',
           ],
           'outputs': [
             '<(crypto_cc_file)',
@@ -71,7 +90,7 @@
             '--input_cc', '<(builtin_in_cc_file)',
             '--include', 'bin/builtin.h',
             '--var_name', 'Builtin::crypto_source_',
-            '<@(_sources)',
+            '<(crypto_dart)',
           ],
           'message': 'Generating ''<(crypto_cc_file)'' file.'
         },
@@ -80,6 +99,9 @@
     {
       'target_name': 'generate_io_cc_file',
       'type': 'none',
+      'variables': {
+        'io_dart': '<(SHARED_INTERMEDIATE_DIR)/io_gen.dart',
+      },
       'sources': [
         'io.dart',
       ],
@@ -88,11 +110,27 @@
       ],
       'actions': [
         {
+          'action_name': 'generate_io_dart',
+          'inputs': [
+            '../tools/concat_library.py',
+            '<@(_sources)',
+          ],
+          'outputs': [
+            '<(io_dart)',
+          ],
+          'action': [
+            'python',
+            '<@(_inputs)',
+            '--output', '<(io_dart)',
+          ],
+          'message': 'Generating ''<(io_dart)'' file.',
+        },
+        {
           'action_name': 'generate_io_cc',
           'inputs': [
             '../tools/create_string_literal.py',
             '<(builtin_in_cc_file)',
-            '<@(_sources)',
+            '<(io_dart)',
           ],
           'outputs': [
             '<(io_cc_file)',
@@ -104,7 +142,7 @@
             '--input_cc', '<(builtin_in_cc_file)',
             '--include', 'bin/builtin.h',
             '--var_name', 'Builtin::io_source_',
-            '<@(_sources)',
+            '<(io_dart)',
           ],
           'message': 'Generating ''<(io_cc_file)'' file.'
         },
@@ -143,16 +181,35 @@
     {
       'target_name': 'generate_json_cc_file',
       'type': 'none',
+      'variables': {
+        'json_dart': '<(SHARED_INTERMEDIATE_DIR)/json_gen.dart',
+      },
       'includes': [
         'json_sources.gypi',
       ],
       'actions': [
         {
+          'action_name': 'generate_json_dart',
+          'inputs': [
+            '../tools/concat_library.py',
+            '<@(_sources)',
+          ],
+          'outputs': [
+            '<(json_dart)',
+          ],
+          'action': [
+            'python',
+            '<@(_inputs)',
+            '--output', '<(json_dart)',
+          ],
+          'message': 'Generating ''<(json_dart)'' file.',
+        },
+        {
           'action_name': 'generate_json_cc',
           'inputs': [
             '../tools/create_string_literal.py',
             '<(builtin_in_cc_file)',
-            '<@(_sources)',
+            '<(json_dart)',
           ],
           'outputs': [
             '<(json_cc_file)',
@@ -164,7 +221,7 @@
             '--input_cc', '<(builtin_in_cc_file)',
             '--include', 'bin/builtin.h',
             '--var_name', 'Builtin::json_source_',
-            '<@(_sources)',
+            '<(json_dart)',
           ],
           'message': 'Generating ''<(json_cc_file)'' file.'
         },
@@ -173,12 +230,12 @@
     {
       'target_name': 'generate_uri_cc_file',
       'type': 'none',
+      'variables': {
+        'uri_dart': '<(SHARED_INTERMEDIATE_DIR)/uri_gen.dart',
+      },
       'includes': [
         'uri_sources.gypi',
       ],
-      'variables': {
-        'uri_dart': '<(SHARED_INTERMEDIATE_DIR)/uri.dart',
-      },
       'actions': [
         {
           'action_name': 'generate_uri_dart',
@@ -222,16 +279,35 @@
     {
       'target_name': 'generate_utf_cc_file',
       'type': 'none',
+      'variables': {
+        'utf_dart': '<(SHARED_INTERMEDIATE_DIR)/utf_gen.dart',
+      },
       'includes': [
         'utf_sources.gypi',
       ],
       'actions': [
         {
+          'action_name': 'generate_utf_dart',
+          'inputs': [
+            '../tools/concat_library.py',
+            '<@(_sources)',
+          ],
+          'outputs': [
+            '<(utf_dart)',
+          ],
+          'action': [
+            'python',
+            '<@(_inputs)',
+            '--output', '<(utf_dart)',
+          ],
+          'message': 'Generating ''<(utf_dart)'' file.',
+        },
+        {
           'action_name': 'generate_utf_cc',
           'inputs': [
             '../tools/create_string_literal.py',
             '<(builtin_in_cc_file)',
-            '<@(_sources)',
+            '<(utf_dart)',
           ],
           'outputs': [
             '<(utf_cc_file)',
@@ -243,7 +319,7 @@
             '--input_cc', '<(builtin_in_cc_file)',
             '--include', 'bin/builtin.h',
             '--var_name', 'Builtin::utf_source_',
-            '<@(_sources)',
+            '<(utf_dart)',
           ],
           'message': 'Generating ''<(utf_cc_file)'' file.'
         },
diff --git a/runtime/bin/builtin_natives.cc b/runtime/bin/builtin_natives.cc
index 91e82e8..dcaf06b 100644
--- a/runtime/bin/builtin_natives.cc
+++ b/runtime/bin/builtin_natives.cc
@@ -30,6 +30,7 @@
   V(File_Close, 1)                                                             \
   V(File_ReadByte, 1)                                                          \
   V(File_WriteByte, 2)                                                         \
+  V(File_Read, 2)                                                              \
   V(File_ReadList, 4)                                                          \
   V(File_WriteList, 4)                                                         \
   V(File_Position, 1)                                                          \
diff --git a/runtime/bin/file.cc b/runtime/bin/file.cc
index 88d0ef4..ae81e20 100644
--- a/runtime/bin/file.cc
+++ b/runtime/bin/file.cc
@@ -6,6 +6,7 @@
 
 #include "bin/builtin.h"
 #include "bin/dartutils.h"
+#include "bin/io_buffer.h"
 #include "bin/thread.h"
 #include "bin/utils.h"
 
@@ -158,6 +159,41 @@
 }
 
 
+void FUNCTION_NAME(File_Read)(Dart_NativeArguments args) {
+  Dart_EnterScope();
+  intptr_t value =
+      DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 0));
+  File* file = reinterpret_cast<File*>(value);
+  ASSERT(file != NULL);
+  Dart_Handle length_object = Dart_GetNativeArgument(args, 1);
+  int64_t length = 0;
+  if (DartUtils::GetInt64Value(length_object, &length)) {
+    uint8_t* buffer = NULL;
+    Dart_Handle external_array = IOBuffer::Allocate(length, &buffer);
+    int bytes_read = file->Read(reinterpret_cast<void*>(buffer), length);
+    if (bytes_read < 0) {
+      Dart_Handle err = DartUtils::NewDartOSError();
+      if (Dart_IsError(err)) Dart_PropagateError(err);
+      Dart_SetReturnValue(args, err);
+    } else {
+      if (bytes_read < length) {
+        // TODO(ager): cache the 'length' string if this becomes a bottle neck.
+        Dart_SetField(external_array,
+                      DartUtils::NewString("length"),
+                      Dart_NewInteger(bytes_read));
+      }
+      Dart_SetReturnValue(args, external_array);
+    }
+  } else {
+    OSError os_error(-1, "Invalid argument", OSError::kUnknown);
+    Dart_Handle err = DartUtils::NewDartOSError(&os_error);
+    if (Dart_IsError(err)) Dart_PropagateError(err);
+    Dart_SetReturnValue(args, err);
+  }
+  Dart_ExitScope();
+}
+
+
 void FUNCTION_NAME(File_ReadList)(Dart_NativeArguments args) {
   Dart_EnterScope();
   intptr_t value =
@@ -758,6 +794,39 @@
 }
 
 
+static CObject* FileReadRequest(const CObjectArray& request) {
+  if (request.Length() == 3 &&
+      request[1]->IsIntptr() &&
+      request[2]->IsInt32OrInt64()) {
+    File* file = CObjectToFilePointer(request[1]);
+    ASSERT(file != NULL);
+    if (!file->IsClosed()) {
+      int64_t length = CObjectInt32OrInt64ToInt64(request[2]);
+      uint8_t* buffer = new uint8_t[length];
+      int bytes_read = file->Read(buffer, length);
+      if (bytes_read >= 0) {
+        void* peer = reinterpret_cast<void*>(buffer);
+        CObject* external_array =
+            new CObjectExternalUint8Array(
+                CObject::NewExternalUint8Array(bytes_read,
+                                               buffer,
+                                               peer,
+                                               FinalizeExternalByteArray));
+        CObjectArray* result = new CObjectArray(CObject::NewArray(2));
+        result->SetAt(0, new CObjectIntptr(CObject::NewInt32(0)));
+        result->SetAt(1, external_array);
+        return result;
+      } else {
+        return CObject::NewOSError();
+      }
+    } else {
+      return CObject::FileClosedError();
+    }
+  }
+  return CObject::IllegalArgumentError();
+}
+
+
 static CObject* FileReadListRequest(const CObjectArray& request) {
   if (request.Length() == 3 &&
       request[1]->IsIntptr() &&
@@ -897,6 +966,9 @@
         case File::kWriteByteRequest:
           response = FileWriteByteRequest(request);
           break;
+        case File::kReadRequest:
+          response = FileReadRequest(request);
+          break;
         case File::kReadListRequest:
           response = FileReadListRequest(request);
           break;
diff --git a/runtime/bin/file.h b/runtime/bin/file.h
index 1e5df5f..5f3fd00 100644
--- a/runtime/bin/file.h
+++ b/runtime/bin/file.h
@@ -60,8 +60,9 @@
     kFlushRequest = 13,
     kReadByteRequest = 14,
     kWriteByteRequest = 15,
-    kReadListRequest = 16,
-    kWriteListRequest = 17
+    kReadRequest = 16,
+    kReadListRequest = 17,
+    kWriteListRequest = 18
   };
 
   ~File();
diff --git a/runtime/bin/file_patch.dart b/runtime/bin/file_patch.dart
index 4ca5733..eb55dae 100644
--- a/runtime/bin/file_patch.dart
+++ b/runtime/bin/file_patch.dart
@@ -21,6 +21,7 @@
 patch class _RandomAccessFile {
   /* patch */ static int _close(int id) native "File_Close";
   /* patch */ static _readByte(int id) native "File_ReadByte";
+  /* patch */ static _read(int id, int bytes) native "File_Read";
   /* patch */ static _readList(int id, List<int> buffer, int offset, int bytes)
       native "File_ReadList";
   /* patch */ static _writeByte(int id, int value) native "File_WriteByte";
diff --git a/runtime/bin/gen_snapshot.cc b/runtime/bin/gen_snapshot.cc
index 2f2c6f2..ac50f47 100644
--- a/runtime/bin/gen_snapshot.cc
+++ b/runtime/bin/gen_snapshot.cc
@@ -301,7 +301,7 @@
   // Initialize the Dart VM.
   // Note: We don't expect isolates to be created from dart code during
   // snapshot generation.
-  if (!Dart_Initialize(NULL, NULL, NULL)) {
+  if (!Dart_Initialize(NULL, NULL, NULL, NULL)) {
     Log::PrintErr("VM initialization failed\n");
     return 255;
   }
diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
index 81c1373..7505ad1 100644
--- a/runtime/bin/main.cc
+++ b/runtime/bin/main.cc
@@ -692,6 +692,7 @@
   // Initialize the Dart VM.
   if (!Dart_Initialize(CreateIsolateAndSetup,
                        NULL,
+                       NULL,
                        ShutdownIsolate)) {
     fprintf(stderr, "%s", "VM initialization failed\n");
     fflush(stderr);
diff --git a/runtime/bin/net/.gitignore b/runtime/bin/net/.gitignore
index bfd80d7..3ca2cc5 100644
--- a/runtime/bin/net/.gitignore
+++ b/runtime/bin/net/.gitignore
@@ -1,13 +1,8 @@
-/libssl_dart.target.mk
-/minizip_dart.target.mk
-/nspr_dart.target.mk
-/nss.Makefile
-/nss_dart.target.mk
-/nss_static_dart.target.mk
-/nssckbi_dart.target.mk
-/sqlite.Makefile
-/sqlite_dart.target.mk
-/sqlite_shell_dart.target.mk
-/ssl.Makefile
-/zlib.Makefile
-/zlib_dart.target.mk
+/*.Makefile
+/*.sln
+/*.target.mk
+/*.vcproj
+/*.vcxproj
+/*.vcxproj.filters
+/*.vcxproj.user
+/*.xcodeproj
diff --git a/runtime/bin/run_vm_tests.cc b/runtime/bin/run_vm_tests.cc
index d73b046..f0eb3a8 100644
--- a/runtime/bin/run_vm_tests.cc
+++ b/runtime/bin/run_vm_tests.cc
@@ -138,7 +138,7 @@
   bool set_vm_flags_success = Flags::ProcessCommandLineFlags(dart_argc,
                                                              dart_argv);
   ASSERT(set_vm_flags_success);
-  const char* err_msg = Dart::InitOnce(NULL, NULL, NULL);
+  const char* err_msg = Dart::InitOnce(NULL, NULL, NULL, NULL);
   ASSERT(err_msg == NULL);
   // Apply the filter to all registered tests.
   TestCaseBase::RunAll();
diff --git a/runtime/bin/secure_socket.cc b/runtime/bin/secure_socket.cc
index f297aed..2c9665b 100644
--- a/runtime/bin/secure_socket.cc
+++ b/runtime/bin/secure_socket.cc
@@ -262,6 +262,11 @@
     if (status != SECSuccess) {
       ThrowPRException("Unsuccessful SSL_OptionSetDefault enable TLS call.");
     }
+    status = SSL_ConfigServerSessionIDCache(0, 0, 0, NULL);
+    if (status != SECSuccess) {
+      ThrowPRException("Unsuccessful SSL_ConfigServerSessionIDCache call.");
+    }
+
   } else {
     ThrowException("Called SSLFilter::InitializeLibrary more than once");
   }
diff --git a/runtime/bin/socket_patch.dart b/runtime/bin/socket_patch.dart
index 6e58985..ec09d6f 100644
--- a/runtime/bin/socket_patch.dart
+++ b/runtime/bin/socket_patch.dart
@@ -469,10 +469,6 @@
       throw new StreamException(
           "Cannot set connect handler when already connected");
     }
-    if (_outputStream != null) {
-      throw new StreamException(
-          "Cannot set connect handler when output stream is used");
-    }
     _clientConnectHandler = callback;
     _updateOutHandler();
   }
@@ -507,7 +503,7 @@
 
   OutputStream get outputStream {
     if (_outputStream == null) {
-      if (_handlerMap[_SocketBase._OUT_EVENT] != null) {
+      if (_clientWriteHandler != null) {
         throw new StreamException(
             "Cannot get output stream when socket handlers are used");
       }
diff --git a/runtime/dart-runtime.gyp b/runtime/dart-runtime.gyp
index 3f6b8f5..bbd4c97 100644
--- a/runtime/dart-runtime.gyp
+++ b/runtime/dart-runtime.gyp
@@ -101,5 +101,12 @@
         },
       ],
     },
+    {
+      'target_name': 'runtime_packages',
+      'type': 'none',
+      'dependencies': [
+        '../pkg/pkg.gyp:pkg_packages',
+      ],
+    },
   ],
 }
diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h
index 821014c..7657441 100755
--- a/runtime/include/dart_api.h
+++ b/runtime/include/dart_api.h
@@ -622,6 +622,19 @@
 // TODO(turnidge): Define and implement unwinding.
 
 /**
+ * An isolate unhandled exception callback function.
+ *
+ * This callback, provided by the embedder, is called when an unhandled
+ * exception or internal error is thrown during isolate execution. When the
+ * callback is invoked, Dart_CurrentIsolate can be used to figure out which
+ * isolate was running when the exception was thrown.
+ *
+ * \param error The unhandled exception or error.  This handle's scope is
+ *   only valid until the embedder returns from this callback.
+ */
+typedef void (*Dart_IsolateUnhandledExceptionCallback)(Dart_Handle error);
+
+/**
  * An isolate shutdown callback function.
  *
  * This callback, provided by the embedder, is called after the vm
@@ -644,12 +657,18 @@
  *   See Dart_IsolateCreateCallback.
  * \param interrupt A function to be called when an isolate is interrupted.
  *   See Dart_IsolateInterruptCallback.
+ * \param unhandled_exception A function to be called if an isolate has an
+ *   unhandled exception.  Set Dart_IsolateUnhandledExceptionCallback.
+ * \param shutdown A function to be called when an isolate is shutdown.
+ *   See Dart_IsolateShutdownCallback.
  *
  * \return True if initialization is successful.
  */
-DART_EXPORT bool Dart_Initialize(Dart_IsolateCreateCallback create,
-                                 Dart_IsolateInterruptCallback interrupt,
-                                 Dart_IsolateShutdownCallback shutdown);
+DART_EXPORT bool Dart_Initialize(
+    Dart_IsolateCreateCallback create,
+    Dart_IsolateInterruptCallback interrupt,
+    Dart_IsolateUnhandledExceptionCallback unhandled_exception,
+    Dart_IsolateShutdownCallback shutdown);
 
 /**
  * Sets command line flags. Should be called before Dart_Initialize.
@@ -1406,10 +1425,10 @@
                                                    void** peer);
 
 /**
- * Returns a String which references an external array of UTF-8 encoded
- * characters.
+ * Returns a String which references an external array of
+ * Latin-1 (ISO-8859-1) encoded characters.
  *
- * \param utf8_array An array of UTF-8 encoded characters. This must not move.
+ * \param latin1_array Array of Latin-1 encoded characters. This must not move.
  * \param length The length of the characters array.
  * \param peer An external pointer to associate with this string.
  * \param cback A callback to be called when this string is finalized.
@@ -1417,10 +1436,11 @@
  * \return The String object if no error occurs. Otherwise returns
  *   an error handle.
  */
-DART_EXPORT Dart_Handle Dart_NewExternalUTF8String(const uint8_t* utf8_array,
-                                                   intptr_t length,
-                                                   void* peer,
-                                                   Dart_PeerFinalizer cback);
+DART_EXPORT Dart_Handle Dart_NewExternalLatin1String(
+    const uint8_t* latin1_array,
+    intptr_t length,
+    void* peer,
+    Dart_PeerFinalizer cback);
 
 /**
  * Returns a String which references an external array of UTF-16 encoded
@@ -1986,27 +2006,13 @@
 
 /**
  * Is this a class handle?
- *
- * Most parts of the dart embedding api do not distinguish between
- * classes and interfaces.  For example, Dart_GetClass can return a
- * class or an interface and Dart_New can instantiate a class or an
- * interface.  The exceptions are Dart_IsClass and Dart_IsInterface,
- * which can be used to distinguish whether a handle refers to a class
- * or an interface.
  */
 DART_EXPORT bool Dart_IsClass(Dart_Handle handle);
 
 /**
- * Is this an interface handle?
- *
- * Most parts of the dart embedding api do not distinguish between
- * classes and interfaces.  For example, Dart_GetClass can return a
- * class or an interface and Dart_New can instantiate a class or an
- * interface.  The exceptions are Dart_IsClass and Dart_IsInterface,
- * which can be used to distinguish whether a handle refers to a class
- * or an interface.
+ * Is this an abstract class handle?
  */
-DART_EXPORT bool Dart_IsInterface(Dart_Handle handle);
+DART_EXPORT bool Dart_IsAbstractClass(Dart_Handle handle);
 
 /**
  * Returns the class name for the provided class or interface.
@@ -2019,16 +2025,6 @@
 DART_EXPORT Dart_Handle Dart_ClassGetLibrary(Dart_Handle clazz);
 
 /**
- * Returns the default factory class for the provided class or
- * interface.
- *
- * Only interfaces may have default fadctory classes.  If the class or
- * interface has no default factory class, this function returns
- * Dart_Null().
- */
-DART_EXPORT Dart_Handle Dart_ClassGetDefault(Dart_Handle clazz);
-
-/**
  * Returns the number of interfaces directly implemented by some class
  * or interface.
  *
diff --git a/runtime/lib/double.cc b/runtime/lib/double.cc
index 76babac..abadf12 100644
--- a/runtime/lib/double.cc
+++ b/runtime/lib/double.cc
@@ -87,7 +87,8 @@
   double left = Double::CheckedHandle(arguments->NativeArgAt(0)).value();
   GET_NATIVE_ARGUMENT(Double, right_object, arguments->NativeArgAt(1));
   double right = right_object.value();
-  double remainder = fmod(left, right);
+
+  double remainder = fmod_ieee(left, right);
   if (remainder == 0.0) {
     // We explicitely switch to the positive 0.0 (just in case it was negative).
     remainder = +0.0;
@@ -106,7 +107,7 @@
   double left = Double::CheckedHandle(arguments->NativeArgAt(0)).value();
   GET_NATIVE_ARGUMENT(Double, right_object, arguments->NativeArgAt(1));
   double right = right_object.value();
-  return Double::New(fmod(left, right));
+  return Double::New(fmod_ieee(left, right));
 }
 
 
diff --git a/runtime/lib/error.dart b/runtime/lib/error.dart
index 619b16c..b3ce3b7 100644
--- a/runtime/lib/error.dart
+++ b/runtime/lib/error.dart
@@ -53,7 +53,7 @@
 class CastErrorImplementation
     extends TypeErrorImplementation
     implements CastError {
-  factory CastError._uninstantiable() {
+  factory CastErrorImplementation._uninstantiable() {
     throw new UnsupportedError(
         "CastError can only be allocated by the VM");
   }
diff --git a/runtime/lib/invocation_mirror_patch.dart b/runtime/lib/invocation_mirror_patch.dart
index 5eedca0..4fb83f9 100644
--- a/runtime/lib/invocation_mirror_patch.dart
+++ b/runtime/lib/invocation_mirror_patch.dart
@@ -25,7 +25,7 @@
   bool get isSetter => _type == SETTER;
 
   invokeOn(Object receiver) {
-    throw new UnsupportedOperation("invokeOn not implemented yet");
+    throw new UnsupportedError("invokeOn not implemented yet");
   }
 }
 
diff --git a/runtime/lib/isolate.cc b/runtime/lib/isolate.cc
index 7219bda..3585ba9 100644
--- a/runtime/lib/isolate.cc
+++ b/runtime/lib/isolate.cc
@@ -91,8 +91,7 @@
     Error& error = Error::Handle();
     error = isolate->object_store()->sticky_error();
     if (!error.IsNull()) {
-      OS::PrintErr("%s\n", error.ToErrorCString());
-      exit(255);
+      OS::PrintErr("in ShutdownIsolate: %s\n", error.ToErrorCString());
     }
   }
   {
diff --git a/runtime/lib/map_patch.dart b/runtime/lib/map_patch.dart
index 633b7ce..cbc03fb 100644
--- a/runtime/lib/map_patch.dart
+++ b/runtime/lib/map_patch.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-patch class _HashMapImpl<K, V> {
+patch class Map<K, V> {
   // Factory constructing a Map from a parser generated Map literal.
   // [elements] contains n key-value pairs.
   // The keys are at position 2*n and are already type checked by the parser
diff --git a/runtime/lib/math.cc b/runtime/lib/math.cc
index ff4e6af..5a434c4 100644
--- a/runtime/lib/math.cc
+++ b/runtime/lib/math.cc
@@ -53,7 +53,7 @@
 DEFINE_NATIVE_ENTRY(Math_atan2, 2) {
   GET_NATIVE_ARGUMENT(Double, operand1, arguments->NativeArgAt(0));
   GET_NATIVE_ARGUMENT(Double, operand2, arguments->NativeArgAt(1));
-  return Double::New(atan2(operand1.value(), operand2.value()));
+  return Double::New(atan2_ieee(operand1.value(), operand2.value()));
 }
 
 DEFINE_NATIVE_ENTRY(Math_exp, 1) {
diff --git a/runtime/lib/math_patch.dart b/runtime/lib/math_patch.dart
index bfcbacc..52818a4 100644
--- a/runtime/lib/math_patch.dart
+++ b/runtime/lib/math_patch.dart
@@ -51,12 +51,11 @@
 
 class _Random implements Random {
   // Internal state of the random number generator.
-  var _state;
+  final _state = new List(2);
   static const kSTATE_LO = 0;
   static const kSTATE_HI = 1;
 
   _Random._internal(state) {
-    _state = new List(2);
     _state[kSTATE_LO] = state & _MASK_32;
     _state[kSTATE_HI] = state >> 32;
   }
diff --git a/runtime/lib/mirrors.cc b/runtime/lib/mirrors.cc
index e075a25..afd1bc5 100644
--- a/runtime/lib/mirrors.cc
+++ b/runtime/lib/mirrors.cc
@@ -259,7 +259,7 @@
     return Dart_New(cls, Dart_Null(), ARRAY_SIZE(args), args);
   }
 
-  if (Dart_IsClass(target) || Dart_IsInterface(target)) {
+  if (Dart_IsClass(target)) {
     if (Dart_ClassIsFunctionType(target)) {
       Dart_Handle cls_name = NewString("_LazyFunctionTypeMirror");
       Dart_Handle cls = Dart_GetClass(MirrorLib(), cls_name);
@@ -364,7 +364,7 @@
 
 static Dart_Handle CreateTypeVariableMap(Dart_Handle owner,
                                          Dart_Handle owner_mirror) {
-  ASSERT(Dart_IsClass(owner) || Dart_IsInterface(owner));
+  ASSERT(Dart_IsClass(owner));
   // TODO(turnidge): This should be an immutable map.
   Dart_Handle map = MapNew();
   if (Dart_IsError(map)) {
@@ -436,7 +436,7 @@
                                      Dart_Handle intf_name,
                                      Dart_Handle lib,
                                      Dart_Handle lib_mirror) {
-  ASSERT(Dart_IsClass(intf) || Dart_IsInterface(intf));
+  ASSERT(Dart_IsClass(intf));
   if (Dart_ClassIsTypedef(intf)) {
     // This class is actually a typedef.  Represent it specially in
     // reflection.
@@ -454,7 +454,8 @@
   if (Dart_IsNull(super_class)) {
     super_class = Dart_GetClass(CoreLib(), NewString("Object"));
   }
-  Dart_Handle default_class = Dart_ClassGetDefault(intf);
+  // TODO(turnidge): Simplify code, now that default classes have been removed.
+  Dart_Handle default_class = Dart_Null();
 
   Dart_Handle intf_mirror = CreateLazyMirror(intf);
   if (Dart_IsError(intf_mirror)) {
diff --git a/runtime/lib/string.cc b/runtime/lib/string.cc
index 797cad2..236c95d 100644
--- a/runtime/lib/string.cc
+++ b/runtime/lib/string.cc
@@ -8,6 +8,7 @@
 #include "vm/native_entry.h"
 #include "vm/object.h"
 #include "vm/symbols.h"
+#include "vm/unicode.h"
 
 namespace dart {
 
@@ -30,15 +31,15 @@
       Exceptions::ThrowByType(Exceptions::kArgument, args);
     }
     intptr_t value = Smi::Cast(index_object).Value();
-    if (value < 0) {
+    if (Utf::IsOutOfRange(value)) {
       GrowableArray<const Object*> args;
       Exceptions::ThrowByType(Exceptions::kArgument, args);
     } else {
-      if (value > 0x7F) {
+      if (!Utf::IsLatin1(value)) {
         is_one_byte_string = false;
-      }
-      if (value > 0xFFFF) {
-        utf16_len += 1;
+        if (Utf::IsSupplementary(value)) {
+          utf16_len += 1;
+        }
       }
     }
     utf32_array[i] = value;
@@ -51,7 +52,7 @@
 
 
 DEFINE_NATIVE_ENTRY(StringBase_substringUnchecked, 3) {
-  GET_NATIVE_ARGUMENT(String, receiver, arguments->NativeArgAt(0));
+  const String& receiver = String::CheckedHandle(arguments->NativeArgAt(0));
   GET_NATIVE_ARGUMENT(Smi, start_obj, arguments->NativeArgAt(1));
   GET_NATIVE_ARGUMENT(Smi, end_obj, arguments->NativeArgAt(2));
 
@@ -61,6 +62,18 @@
 }
 
 
+DEFINE_NATIVE_ENTRY(OneByteString_substringUnchecked, 3) {
+  const String& receiver = String::CheckedHandle(arguments->NativeArgAt(0));
+  ASSERT(receiver.IsOneByteString());
+  GET_NATIVE_ARGUMENT(Smi, start_obj, arguments->NativeArgAt(1));
+  GET_NATIVE_ARGUMENT(Smi, end_obj, arguments->NativeArgAt(2));
+
+  const intptr_t start = start_obj.Value();
+  const intptr_t end = end_obj.Value();
+  return OneByteString::New(receiver, start, end - start, Heap::kNew);
+}
+
+
 DEFINE_NATIVE_ENTRY(String_getHashCode, 1) {
   const String& receiver = String::CheckedHandle(arguments->NativeArgAt(0));
   intptr_t hash_val = receiver.Hash();
diff --git a/runtime/lib/string_base.dart b/runtime/lib/string_base.dart
index 22e17b9..ac631ff 100644
--- a/runtime/lib/string_base.dart
+++ b/runtime/lib/string_base.dart
@@ -152,6 +152,12 @@
     if (startIndex > endIndex) {
       throw new RangeError.value(startIndex);
     }
+    if (startIndex == endIndex) {
+      return "";
+    }
+    if ((startIndex + 1) == endIndex) {
+      return this[startIndex];
+    }
     return _substringUnchecked(startIndex, endIndex);
   }
 
@@ -263,6 +269,9 @@
   }
 
   List<String> split(Pattern pattern) {
+    if ((pattern is String) && pattern.isEmpty) {
+      return splitChars();
+    }
     int length = this.length;
     Iterator iterator = pattern.allMatches(this).iterator();
     if (length == 0 && iterator.hasNext) {
@@ -369,6 +378,8 @@
       ((9 <= codePoint) && (codePoint <= 13)); // CR, LF, TAB, etc.
   }
 
+  String _substringUnchecked(int startIndex, int endIndex)
+      native "OneByteString_substringUnchecked";
 }
 
 
diff --git a/runtime/platform/c99_support_win.h b/runtime/platform/c99_support_win.h
index 1d09eff..10fcf2b 100644
--- a/runtime/platform/c99_support_win.h
+++ b/runtime/platform/c99_support_win.h
@@ -48,10 +48,19 @@
 }
 
 static inline double round(double x) {
-  if (x < 0) {
-    return ceil(x - 0.5);
+  if (!_finite(x)) {
+    return x;
+  }
+
+  double intpart;
+  double fractpart = modf(x, &intpart);
+
+  if (fractpart >= 0.5) {
+    return intpart + 1;
+  } else if (fractpart > -0.5) {
+    return intpart;
   } else {
-    return floor(x + 0.5);
+    return intpart - 1;
   }
 }
 
diff --git a/runtime/platform/floating_point.h b/runtime/platform/floating_point.h
new file mode 100644
index 0000000..7adaa73
--- /dev/null
+++ b/runtime/platform/floating_point.h
@@ -0,0 +1,11 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#ifndef PLATFORM_FLOATING_POINT_H_
+#define PLATFORM_FLOATING_POINT_H_
+
+inline double fmod_ieee(double x, double y) { return fmod(x, y); }
+inline double atan2_ieee(double y, double x) { return atan2(y, x); }
+
+#endif  // PLATFORM_FLOATING_POINT_H_
diff --git a/runtime/platform/floating_point_win.cc b/runtime/platform/floating_point_win.cc
new file mode 100644
index 0000000..82aee16
--- /dev/null
+++ b/runtime/platform/floating_point_win.cc
@@ -0,0 +1,46 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include <math.h>
+#include <limits>
+
+#include "platform/globals.h"
+
+// Taken from third_party/v8/src/platform-win32.cc
+double fmod_ieee(double x, double y) {
+  // x is dividend, y is divisor.
+  // Work around MS fmod bugs. ISO Standard says:
+  // If dividend is finite and divisor is an infinity or
+  //    dividend is a zero and divisor is nonzero finite,
+  // then dividend is returned.
+  if (!(_finite(x) && (!_finite(y) && !isnan(y))) &&
+      !(x == 0 && (y != 0 && _finite(y)))) {
+    x = fmod(x, y);
+  }
+  return x;
+}
+
+// Bring MSVC atan2 behavior in line with ISO standard.
+// MSVC atan2 returns NaN when x and y are either +infinity or -infinity.
+// Per ISO standard:
+//  - If y is +/-infinity and x is -infinity, +/-3*pi/4 is returned.
+//  - If y is +/-infinity and x is +infinity, +/-pi/4 is returned.
+double atan2_ieee(double x, double y) {
+  int cls_x = _fpclass(x);
+  int cls_y = _fpclass(y);
+  if (((cls_x & (_FPCLASS_PINF | _FPCLASS_NINF)) != 0) &&
+      ((cls_y & (_FPCLASS_PINF | _FPCLASS_NINF)) != 0)) {
+    // atan2 values at infinities listed above are the same as values
+    // at (+/-1, +/-1). index_x is 0, when x is +infinty, 1 when x is -infinty.
+    // Same is with index_y.
+    int index_x = (cls_x & _FPCLASS_PINF) != 0 ? 0 : 1;
+    int index_y = (cls_y & _FPCLASS_PINF) != 0 ? 0 : 1;
+    static double atans_at_infinities[2][2] =
+      { { atan2(1.,  1.), atan2(1.,  -1.) },
+        { atan2(-1., 1.), atan2(-1., -1.) } };
+    return atans_at_infinities[index_x][index_y];
+  } else {
+    return atan2(x, y);
+  }
+}
diff --git a/runtime/platform/floating_point_win.h b/runtime/platform/floating_point_win.h
new file mode 100644
index 0000000..a97051a
--- /dev/null
+++ b/runtime/platform/floating_point_win.h
@@ -0,0 +1,11 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#ifndef PLATFORM_FLOATING_POINT_WIN_H_
+#define PLATFORM_FLOATING_POINT_WIN_H_
+
+double atan2_ieee(double x, double y);
+double fmod_ieee(double x, double y);
+
+#endif  // PLATFORM_FLOATING_POINT_WIN_H_
diff --git a/runtime/platform/globals.h b/runtime/platform/globals.h
index 95585b1..597e278 100644
--- a/runtime/platform/globals.h
+++ b/runtime/platform/globals.h
@@ -46,8 +46,14 @@
 #if defined(_WIN32)
 #include "platform/c99_support_win.h"
 #include "platform/inttypes_support_win.h"
+#include "platform/floating_point_win.h"
 #endif
 
+#if !defined(_WIN32)
+#include "platform/floating_point.h"
+#endif
+
+
 // Target OS detection.
 // for more information on predefined macros:
 //   - http://msdn.microsoft.com/en-us/library/b0084kay.aspx
diff --git a/runtime/platform/platform_headers.gypi b/runtime/platform/platform_headers.gypi
index 756a1a4..514ad08 100644
--- a/runtime/platform/platform_headers.gypi
+++ b/runtime/platform/platform_headers.gypi
@@ -11,6 +11,8 @@
     'hashmap.h',
     'inttypes_support_win.h',
     'json.h',
+    'floating_point.h',
+    'floating_point_win.h',
     'thread.h',
     'thread_linux.h',
     'thread_macos.h',
diff --git a/runtime/platform/platform_sources.gypi b/runtime/platform/platform_sources.gypi
index 2e2ddc7..eadf674 100644
--- a/runtime/platform/platform_sources.gypi
+++ b/runtime/platform/platform_sources.gypi
@@ -8,6 +8,7 @@
     'assert.cc',
     'hashmap.cc',
     'json.cc',
+    'floating_point_win.cc',
     'thread_android.cc',
     'thread_linux.cc',
     'thread_macos.cc',
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index 9b8ab80..f5f6038 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -2,10 +2,11 @@
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
 
-# When a spawned isolate throws an uncaught exception, we terminate the vm.
-cc/RunLoop_ExceptionChild: Fail
-
-cc/SymbolUnicode: Fail
+cc/New: Crash # Issue 6958.
+cc/TypeVariableReflection: Crash # Issue 6958.
+cc/LibraryGetClassNames: Fail # Issue 6958.
+cc/ImportLibrary5: Fail # Issue 6958.
+cc/CustomIsolates: Crash # Default factory classes are removed.
 
 # These tests are expected to crash on all platforms.
 cc/ArrayNew_Overflow_Crash: Crash
diff --git a/runtime/tools/concat_library.py b/runtime/tools/concat_library.py
index 838bd42..dfb574a 100644
--- a/runtime/tools/concat_library.py
+++ b/runtime/tools/concat_library.py
@@ -31,7 +31,10 @@
         for source in arguments:
             with open(source, 'r') as inpt:
                 for line in inpt:
-                    if line.startswith('#source'):
+                    # Drop unneeded library tags as all the library's files
+                    # are concatenated into one big file here:
+                    # The 'part' and 'part of' library tags are removed.
+                    if line.startswith('#source') or line.startswith('part '):
                         line = '// %s' % line
                     output.write(line)
     shutil.move(tmp_name, options.output)
diff --git a/runtime/tools/gyp/runtime-configurations.gypi b/runtime/tools/gyp/runtime-configurations.gypi
index 6a52f2d..7cb0a21 100644
--- a/runtime/tools/gyp/runtime-configurations.gypi
+++ b/runtime/tools/gyp/runtime-configurations.gypi
@@ -8,6 +8,16 @@
     # If we have not set dart_io_support to 1 in Dart's all.gypi or common.gypi,
     # then do not build the native libraries supporting  dart:io.
     'dart_io_support%': 0,
+    # Intel VTune related variables.
+    'dart_vtune_support%': 0,
+    'conditions': [
+      ['OS=="linux"', {
+        'dart_vtune_root%': '/opt/intel/vtune_amplifier_xe',
+      }],
+      ['OS=="win"', {
+        'dart_vtune_root%': 'C:/Program Files (x86)/Intel/VTune Amplifier XE 2013',
+      }],
+    ],
   },
 
   'target_defaults': {
@@ -41,6 +51,18 @@
         'xcode_settings': {
           'ARCHS': [ 'i386' ],
         },
+        'conditions': [
+          ['OS=="linux" and dart_vtune_support==1', {
+            'ldflags': ['-L<(dart_vtune_root)/lib32'],
+          }],
+          ['OS=="win" and dart_vtune_support==1', {
+            'msvs_settings': {
+              'VCLinkerTool': {
+                'AdditionalLibraryDirectories': ['<(dart_vtune_root)/lib32'],
+              },
+            },
+          }],
+        ],
       },
 
       'Dart_x64_Base': {
@@ -48,6 +70,18 @@
         'xcode_settings': {
           'ARCHS': [ 'x86_64' ],
         },
+        'conditions': [
+          ['OS=="linux" and dart_vtune_support==1', {
+            'ldflags': ['-L<(dart_vtune_root)/lib64'],
+          }],
+          ['OS=="win" and dart_vtune_support==1', {
+            'msvs_settings': {
+              'VCLinkerTool': {
+                'AdditionalLibraryDirectories': ['<(dart_vtune_root)/lib32'],
+              },
+            },
+          }],
+        ],
       },
 
       'Dart_simarm_Base': {
diff --git a/runtime/vm/assembler_arm.h b/runtime/vm/assembler_arm.h
index 4895a74..6e2e4c7 100644
--- a/runtime/vm/assembler_arm.h
+++ b/runtime/vm/assembler_arm.h
@@ -73,7 +73,7 @@
     UNIMPLEMENTED();
     return 0;
   }
-  int prolog_offset() const {
+  int prologue_offset() const {
     UNIMPLEMENTED();
     return 0;
   }
diff --git a/runtime/vm/assembler_ia32.cc b/runtime/vm/assembler_ia32.cc
index 7fa7e21..72f84ed 100644
--- a/runtime/vm/assembler_ia32.cc
+++ b/runtime/vm/assembler_ia32.cc
@@ -1707,8 +1707,8 @@
 
 
 void Assembler::EnterFrame(intptr_t frame_size) {
-  if (prolog_offset_ == -1) {
-    prolog_offset_ = CodeSize();
+  if (prologue_offset_ == -1) {
+    prologue_offset_ = CodeSize();
   }
   pushl(EBP);
   movl(EBP, ESP);
diff --git a/runtime/vm/assembler_ia32.h b/runtime/vm/assembler_ia32.h
index a738df3..78afb8f 100644
--- a/runtime/vm/assembler_ia32.h
+++ b/runtime/vm/assembler_ia32.h
@@ -275,7 +275,7 @@
 
 class Assembler : public ValueObject {
  public:
-  Assembler() : buffer_(), prolog_offset_(-1), comments_() { }
+  Assembler() : buffer_(), prologue_offset_(-1), comments_() { }
   ~Assembler() { }
 
   static const bool kNearJump = true;
@@ -603,7 +603,7 @@
   void Bind(Label* label);
 
   int CodeSize() const { return buffer_.Size(); }
-  int prolog_offset() const { return prolog_offset_; }
+  int prologue_offset() const { return prologue_offset_; }
   const ZoneGrowableArray<int>& GetPointerOffsets() const {
     return buffer_.pointer_offsets();
   }
@@ -628,7 +628,7 @@
 
  private:
   AssemblerBuffer buffer_;
-  int prolog_offset_;
+  int prologue_offset_;
 
   class CodeComment : public ZoneAllocated {
    public:
diff --git a/runtime/vm/assembler_x64.cc b/runtime/vm/assembler_x64.cc
index 57ffd01..04feed8 100644
--- a/runtime/vm/assembler_x64.cc
+++ b/runtime/vm/assembler_x64.cc
@@ -328,7 +328,7 @@
 
 
 // Use 0x89 encoding (instead of 0x8B encoding), which is expected by gdb64
-// older than 7.3.1-gg5 when disassembling a function's prolog (movq rbp, rsp)
+// older than 7.3.1-gg5 when disassembling a function's prologue (movq rbp, rsp)
 // for proper unwinding of Dart frames (use --generate_gdb_symbols and -O0).
 void Assembler::movq(Register dst, Register src) {
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
@@ -1799,8 +1799,8 @@
 
 
 void Assembler::EnterFrame(intptr_t frame_size) {
-  if (prolog_offset_ == -1) {
-    prolog_offset_ = CodeSize();
+  if (prologue_offset_ == -1) {
+    prologue_offset_ = CodeSize();
   }
   pushq(RBP);
   movq(RBP, RSP);
diff --git a/runtime/vm/assembler_x64.h b/runtime/vm/assembler_x64.h
index ab97b2a..fb73aac 100644
--- a/runtime/vm/assembler_x64.h
+++ b/runtime/vm/assembler_x64.h
@@ -291,7 +291,7 @@
 
 class Assembler : public ValueObject {
  public:
-  Assembler() : buffer_(), prolog_offset_(-1), comments_() { }
+  Assembler() : buffer_(), prologue_offset_(-1), comments_() { }
   ~Assembler() { }
 
   static const bool kNearJump = true;
@@ -625,7 +625,7 @@
   const Code::Comments& GetCodeComments() const;
 
   int CodeSize() const { return buffer_.Size(); }
-  int prolog_offset() const { return prolog_offset_; }
+  int prologue_offset() const { return prologue_offset_; }
   const ZoneGrowableArray<int>& GetPointerOffsets() const {
     return buffer_.pointer_offsets();
   }
@@ -648,7 +648,7 @@
 
  private:
   AssemblerBuffer buffer_;
-  int prolog_offset_;
+  int prologue_offset_;
 
   class CodeComment : public ZoneAllocated {
    public:
diff --git a/runtime/vm/benchmark_test.cc b/runtime/vm/benchmark_test.cc
index d719b0e..ff44ac8 100644
--- a/runtime/vm/benchmark_test.cc
+++ b/runtime/vm/benchmark_test.cc
@@ -203,10 +203,8 @@
   // Create strings.
   uint8_t data8[] = { 'o', 'n', 'e', 0xFF };
   int external_peer_data = 123;
-  Dart_Handle external_string = Dart_NewExternalUTF8String(data8,
-                                                           ARRAY_SIZE(data8),
-                                                           &external_peer_data,
-                                                           NULL);
+  Dart_Handle external_string = Dart_NewExternalLatin1String(
+      data8, ARRAY_SIZE(data8), &external_peer_data, NULL);
   Dart_Handle internal_string = NewString("two");
 
   // Run benchmark.
diff --git a/runtime/vm/bootstrap_natives.h b/runtime/vm/bootstrap_natives.h
index fad33c9..390860f 100644
--- a/runtime/vm/bootstrap_natives.h
+++ b/runtime/vm/bootstrap_natives.h
@@ -74,6 +74,7 @@
   V(ObjectArray_copyFromObjectArray, 5)                                        \
   V(StringBase_createFromCodePoints, 1)                                        \
   V(StringBase_substringUnchecked, 3)                                          \
+  V(OneByteString_substringUnchecked, 3)                                       \
   V(String_getHashCode, 1)                                                     \
   V(String_getLength, 1)                                                       \
   V(String_charAt, 2)                                                          \
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index bae68fd..19e82a9 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -139,9 +139,6 @@
         OS::Print("Resolving super and interfaces: %s\n", cls.ToCString());
       }
       ResolveSuperType(cls);
-      if (cls.is_interface()) {
-        ResolveFactoryClass(cls);
-      }
       GrowableArray<intptr_t> visited_interfaces;
       ResolveInterfaces(cls, &visited_interfaces);
     }
@@ -322,16 +319,6 @@
   // Resolve failures lead to a longjmp.
   ResolveType(cls, super_type, kCanonicalizeWellFormed);
   const Class& super_class = Class::Handle(super_type.type_class());
-  if (cls.is_interface() != super_class.is_interface()) {
-    String& class_name = String::Handle(cls.Name());
-    String& super_class_name = String::Handle(super_class.Name());
-    const Script& script = Script::Handle(cls.script());
-    ReportError(script, cls.token_pos(),
-                "class '%s' and superclass '%s' are not "
-                "both classes or both interfaces",
-                class_name.ToCString(),
-                super_class_name.ToCString());
-  }
   // If cls belongs to core lib or to core lib's implementation, restrictions
   // about allowed interfaces are lifted.
   if (cls.library() != Library::CoreLibrary()) {
@@ -400,86 +387,6 @@
 }
 
 
-void ClassFinalizer::ResolveFactoryClass(const Class& interface) {
-  ASSERT(interface.is_interface());
-  if (interface.is_finalized() ||
-      !interface.HasFactoryClass() ||
-      interface.HasResolvedFactoryClass()) {
-    return;
-  }
-  const UnresolvedClass& unresolved_factory_class =
-      UnresolvedClass::Handle(interface.UnresolvedFactoryClass());
-
-  // Lookup the factory class.
-  const Class& factory_class =
-      Class::Handle(ResolveClass(interface, unresolved_factory_class));
-  if (factory_class.IsNull()) {
-    const Script& script = Script::Handle(interface.script());
-    ReportError(script, unresolved_factory_class.token_pos(),
-                "cannot resolve factory class name '%s' from '%s'",
-                String::Handle(unresolved_factory_class.Name()).ToCString(),
-                String::Handle(interface.Name()).ToCString());
-  }
-  if (factory_class.is_interface()) {
-    const String& interface_name = String::Handle(interface.Name());
-    const String& factory_name = String::Handle(factory_class.Name());
-    const Script& script = Script::Handle(interface.script());
-    ReportError(script, unresolved_factory_class.token_pos(),
-                "default clause of interface '%s' names non-class '%s'",
-                interface_name.ToCString(),
-                factory_name.ToCString());
-  }
-  interface.set_factory_class(factory_class);
-  // It is not necessary to finalize the bounds before comparing them between
-  // the expected and actual factory class.
-  const Class& factory_signature_class = Class::Handle(
-      unresolved_factory_class.factory_signature_class());
-  ASSERT(!factory_signature_class.IsNull());
-  // If a type parameter list is included in the default factory clause (it
-  // can be omitted), verify that it matches the list of type parameters of
-  // the factory class in number, names, and bounds.
-  if (factory_signature_class.NumTypeParameters() > 0) {
-    const TypeArguments& expected_type_parameters =
-        TypeArguments::Handle(factory_signature_class.type_parameters());
-    const TypeArguments& actual_type_parameters =
-        TypeArguments::Handle(factory_class.type_parameters());
-    const bool check_type_parameter_bounds = true;
-    if (!AbstractTypeArguments::AreIdentical(expected_type_parameters,
-                                             actual_type_parameters,
-                                             check_type_parameter_bounds)) {
-      const String& interface_name = String::Handle(interface.Name());
-      const String& factory_name = String::Handle(factory_class.Name());
-      const Script& script = Script::Handle(interface.script());
-      ReportError(script, unresolved_factory_class.token_pos(),
-                  "mismatch in number, names, or bounds of type parameters "
-                  "between default clause of interface '%s' and actual factory "
-                  "class '%s'",
-                  interface_name.ToCString(),
-                  factory_name.ToCString());
-    }
-  }
-  // Verify that the type parameters of the factory class and of the interface
-  // have identical names, but not necessarily identical bounds.
-  const TypeArguments& interface_type_parameters =
-      TypeArguments::Handle(interface.type_parameters());
-  const TypeArguments& factory_type_parameters =
-      TypeArguments::Handle(factory_class.type_parameters());
-  const bool check_type_parameter_bounds = false;
-  if (!AbstractTypeArguments::AreIdentical(interface_type_parameters,
-                                           factory_type_parameters,
-                                           check_type_parameter_bounds)) {
-    const String& interface_name = String::Handle(interface.Name());
-    const String& factory_name = String::Handle(factory_class.Name());
-    const Script& script = Script::Handle(interface.script());
-    ReportError(script, unresolved_factory_class.token_pos(),
-                "mismatch in number or names of type parameters between "
-                "interface '%s' and default factory class '%s'",
-                interface_name.ToCString(),
-                factory_name.ToCString());
-  }
-}
-
-
 void ClassFinalizer::ResolveRedirectingFactoryTarget(
     const Class& cls,
     const Function& factory,
@@ -1225,11 +1132,10 @@
           const String& super_class_name = String::Handle(super_class.Name());
           const Script& script = Script::Handle(cls.script());
           ReportError(script, function.token_pos(),
-                      "class '%s' overrides function '%s' of %s '%s' "
+                      "class '%s' overrides function '%s' of super class '%s' "
                       "with incompatible parameters",
                       class_name.ToCString(),
                       function_name.ToCString(),
-                      super_class.is_interface() ? "interface" : "super class",
                       super_class_name.ToCString());
         }
       }
@@ -1317,19 +1223,6 @@
     ASSERT(super_type.IsNull() || super_type.IsObjectType());
     return;
   }
-  // Finalize factory class, if any.
-  if (cls.is_interface()) {
-    if (cls.HasFactoryClass()) {
-      const Class& factory_class = Class::Handle(cls.FactoryClass());
-      if (!factory_class.is_finalized()) {
-        FinalizeClass(factory_class);
-        // Finalizing the factory class may indirectly finalize this interface.
-        if (cls.is_finalized()) {
-          return;
-        }
-      }
-    }
-  }
   // Finalize interface types (but not necessarily interface classes).
   Array& interface_types = Array::Handle(cls.interfaces());
   AbstractType& interface_type = AbstractType::Handle();
@@ -1501,6 +1394,7 @@
                     String::Handle(interface_class.Name()).ToCString());
       }
     }
+    interface_class.set_is_implemented();
     // Now resolve the super interfaces.
     ResolveInterfaces(interface_class, visited);
   }
@@ -1542,9 +1436,7 @@
 void ClassFinalizer::PrintClassInformation(const Class& cls) {
   HANDLESCOPE(Isolate::Current());
   const String& class_name = String::Handle(cls.Name());
-  OS::Print("%s '%s'",
-            cls.is_interface() ? "interface" : "class",
-            class_name.ToCString());
+  OS::Print("class '%s'", class_name.ToCString());
   const Library& library = Library::Handle(cls.library());
   if (!library.IsNull()) {
     OS::Print(" library '%s%s':\n",
diff --git a/runtime/vm/class_finalizer.h b/runtime/vm/class_finalizer.h
index 2fe9ea6..6804b0c 100644
--- a/runtime/vm/class_finalizer.h
+++ b/runtime/vm/class_finalizer.h
@@ -96,7 +96,6 @@
   static RawClass* ResolveClass(const Class& cls,
                                 const UnresolvedClass& unresolved_class);
   static void ResolveSuperType(const Class& cls);
-  static void ResolveFactoryClass(const Class& cls);
   static void ResolveRedirectingFactoryTarget(
       const Class& cls,
       const Function& factory,
diff --git a/runtime/vm/code_generator.cc b/runtime/vm/code_generator.cc
index abf1cdd..ed90731 100644
--- a/runtime/vm/code_generator.cc
+++ b/runtime/vm/code_generator.cc
@@ -402,20 +402,18 @@
 // Converts InstantiatedTypeArguments to TypeArguments and stores it
 // into the instance. The assembly code can handle only type arguments of
 // class TypeArguments. Because of the overhead, do it only when needed.
-// Return false if the optimization was aborted.
-// Set type_arguments_replaced to true if they have changed.
-static bool OptimizeTypeArguments(const Instance& instance,
-                                  bool* type_arguments_replaced) {
-  *type_arguments_replaced = false;
+// Return true if type arguments have been replaced, false otherwise.
+static bool OptimizeTypeArguments(const Instance& instance) {
   const Class& type_class = Class::ZoneHandle(instance.clazz());
   if (!type_class.HasTypeArguments()) {
-    return true;
+    return false;
   }
   AbstractTypeArguments& type_arguments =
       AbstractTypeArguments::Handle(instance.GetTypeArguments());
   if (type_arguments.IsNull()) {
-    return true;
+    return false;
   }
+  bool replaced = false;
   if (type_arguments.IsInstantiatedTypeArguments()) {
     do {
       const InstantiatedTypeArguments& instantiated_type_arguments =
@@ -431,16 +429,16 @@
     AbstractTypeArguments& new_type_arguments = AbstractTypeArguments::Handle();
     new_type_arguments = type_arguments.Canonicalize();
     instance.SetTypeArguments(new_type_arguments);
-    *type_arguments_replaced = true;
+    replaced = true;
   } else if (!type_arguments.IsCanonical()) {
     AbstractTypeArguments& new_type_arguments = AbstractTypeArguments::Handle();
     new_type_arguments = type_arguments.Canonicalize();
     instance.SetTypeArguments(new_type_arguments);
-    *type_arguments_replaced = true;
+    replaced = true;
   }
   ASSERT(AbstractTypeArguments::Handle(
       instance.GetTypeArguments()).IsTypeArguments());
-  return true;
+  return replaced;
 }
 
 
@@ -473,26 +471,11 @@
   bool type_arguments_replaced = false;
   if (instance_class.HasTypeArguments()) {
     // Canonicalize type arguments.
-    if (!OptimizeTypeArguments(instance, &type_arguments_replaced)) {
-      if (FLAG_trace_type_checks) {
-        PrintTypeCheck("WARNING: Cannot canonicalize instance type arguments",
-            instance, type, instantiator_type_arguments, result);
-      }
-      return;
-    }
+    type_arguments_replaced = OptimizeTypeArguments(instance);
     instance_type_arguments = instance.GetTypeArguments();
   }
   if (!instantiator.IsNull()) {
-    bool replaced = false;
-    if (!OptimizeTypeArguments(instantiator, &replaced)) {
-      if (FLAG_trace_type_checks) {
-        PrintTypeCheck("WARNING: Cannot canonicalize instantiator "
-            "type arguments",
-            instance, type, instantiator_type_arguments, result);
-      }
-      return;
-    }
-    if (replaced) {
+    if (OptimizeTypeArguments(instantiator)) {
       type_arguments_replaced = true;
     }
     instantiator_type_arguments = instantiator.GetTypeArguments();
@@ -1380,26 +1363,6 @@
 }
 
 
-// A closure object was invoked with incompatible arguments.
-// TODO(regis): Deprecated. This case should be handled by a noSuchMethod call.
-DEFINE_RUNTIME_ENTRY(ClosureArgumentMismatch, 0) {
-  ASSERT(arguments.ArgCount() ==
-         kClosureArgumentMismatchRuntimeEntry.argument_count());
-  const Instance& instance = Instance::Handle();  // Incorrect. OK for now.
-  const Array& function_args = Array::Handle();  // Incorrect. OK for now.
-  const String& function_name = String::Handle(Symbols::Call());
-  GrowableArray<const Object*> dart_arguments(5);
-
-  const Object& null_object = Object::Handle();
-  dart_arguments.Add(&instance);
-  dart_arguments.Add(&function_name);
-  dart_arguments.Add(&function_args);
-  dart_arguments.Add(&null_object);
-  Exceptions::ThrowByType(Exceptions::kNoSuchMethod, dart_arguments);
-  UNREACHABLE();
-}
-
-
 DEFINE_RUNTIME_ENTRY(StackOverflow, 0) {
   ASSERT(arguments.ArgCount() ==
          kStackOverflowRuntimeEntry.argument_count());
diff --git a/runtime/vm/code_generator.h b/runtime/vm/code_generator.h
index a212cea..1bd9632 100644
--- a/runtime/vm/code_generator.h
+++ b/runtime/vm/code_generator.h
@@ -23,7 +23,6 @@
 DECLARE_RUNTIME_ENTRY(BreakpointReturnHandler);
 DECLARE_RUNTIME_ENTRY(BreakpointDynamicHandler);
 DECLARE_RUNTIME_ENTRY(CloneContext);
-DECLARE_RUNTIME_ENTRY(ClosureArgumentMismatch);
 DECLARE_RUNTIME_ENTRY(Deoptimize);
 DECLARE_RUNTIME_ENTRY(FixCallersTarget);
 DECLARE_RUNTIME_ENTRY(InlineCacheMissHandlerOneArg);
diff --git a/runtime/vm/code_observers.cc b/runtime/vm/code_observers.cc
new file mode 100644
index 0000000..b476a0d
--- /dev/null
+++ b/runtime/vm/code_observers.cc
@@ -0,0 +1,142 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "vm/code_observers.h"
+
+#include "vm/dart.h"
+#include "vm/debuginfo.h"
+#include "vm/flags.h"
+#include "vm/isolate.h"
+#include "vm/os.h"
+#include "vm/vtune.h"
+#include "vm/zone.h"
+
+namespace dart {
+
+DEFINE_FLAG(bool, generate_gdb_symbols, false,
+    "Generate symbols of generated dart functions for debugging with GDB");
+
+intptr_t CodeObservers::observers_length_ = 0;
+CodeObserver** CodeObservers::observers_ = NULL;
+
+
+void CodeObservers::Register(CodeObserver* observer) {
+  observers_length_++;
+  observers_ = reinterpret_cast<CodeObserver**>(
+      realloc(observers_, sizeof(observer) * observers_length_));
+  if (observers_ == NULL) {
+    FATAL("failed to grow code observers array");
+  }
+  observers_[observers_length_ - 1] = observer;
+}
+
+
+void CodeObservers::NotifyAll(const char* name,
+                              uword base,
+                              uword prologue_offset,
+                              uword size,
+                              bool optimized) {
+  ASSERT(!AreActive() || (strlen(name) != 0));
+  for (intptr_t i = 0; i < observers_length_; i++) {
+    if (observers_[i]->IsActive()) {
+      observers_[i]->Notify(name, base, prologue_offset, size, optimized);
+    }
+  }
+}
+
+
+bool CodeObservers::AreActive() {
+  for (intptr_t i = 0; i < observers_length_; i++) {
+    if (observers_[i]->IsActive()) return true;
+  }
+  return false;
+}
+
+
+class PerfCodeObserver : public CodeObserver {
+ public:
+  virtual bool IsActive() const {
+    return Dart::perf_events_writer() != NULL;
+  }
+
+  virtual void Notify(const char* name,
+                      uword base,
+                      uword prologue_offset,
+                      uword size,
+                      bool optimized) {
+    Dart_FileWriterFunction perf_events_writer = Dart::perf_events_writer();
+    ASSERT(perf_events_writer != NULL);
+
+    const char* format = "%"Px" %"Px" %s%s\n";
+    const char* marker = optimized ? "*" : "";
+    intptr_t len = OS::SNPrint(NULL, 0, format, base, size, marker, name);
+    char* buffer = Isolate::Current()->current_zone()->Alloc<char>(len + 1);
+    OS::SNPrint(buffer, len + 1, format, base, size, marker, name);
+    (*perf_events_writer)(buffer, len);
+  }
+};
+
+
+class PprofCodeObserver : public CodeObserver {
+ public:
+  virtual bool IsActive() const {
+    return Dart::pprof_symbol_generator() != NULL;
+  }
+
+  virtual void Notify(const char* name,
+                      uword base,
+                      uword prologue_offset,
+                      uword size,
+                      bool optimized) {
+    DebugInfo* pprof_symbol_generator = Dart::pprof_symbol_generator();
+    ASSERT(pprof_symbol_generator != NULL);
+    pprof_symbol_generator->AddCode(base, size);
+    pprof_symbol_generator->AddCodeRegion(name, base, size);
+  }
+};
+
+
+class GdbCodeObserver : public CodeObserver {
+ public:
+  virtual bool IsActive() const {
+    return FLAG_generate_gdb_symbols;
+  }
+
+  virtual void Notify(const char* name,
+                      uword base,
+                      uword prologue_offset,
+                      uword size,
+                      bool optimized) {
+    if (prologue_offset > 0) {
+      // In order to ensure that gdb sees the first instruction of a function
+      // as the prologue sequence we register two symbols for the cases when
+      // the prologue sequence is not the first instruction:
+      // <name>_entry is used for code preceding the prologue sequence.
+      // <name> for rest of the code (first instruction is prologue sequence).
+      const char* kFormat = "%s_%s";
+      intptr_t len = OS::SNPrint(NULL, 0, kFormat, name, "entry");
+      char* pname = Isolate::Current()->current_zone()->Alloc<char>(len + 1);
+      OS::SNPrint(pname, (len + 1), kFormat, name, "entry");
+      DebugInfo::RegisterSection(pname, base, size);
+      DebugInfo::RegisterSection(name,
+                                 (base + prologue_offset),
+                                 (size - prologue_offset));
+    } else {
+      DebugInfo::RegisterSection(name, base, size);
+    }
+  }
+};
+
+
+void CodeObservers::InitOnce() {
+  Register(new PerfCodeObserver);
+  Register(new PprofCodeObserver);
+  Register(new GdbCodeObserver);
+#if defined(DART_VTUNE_SUPPORT)
+  Register(new VTuneCodeObserver);
+#endif
+}
+
+
+}  // namespace dart
diff --git a/runtime/vm/code_observers.h b/runtime/vm/code_observers.h
new file mode 100644
index 0000000..1891f3d
--- /dev/null
+++ b/runtime/vm/code_observers.h
@@ -0,0 +1,56 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#ifndef VM_CODE_OBSERVERS_H_
+#define VM_CODE_OBSERVERS_H_
+
+#include "vm/globals.h"
+
+namespace dart {
+
+// Object observing code creation events. Used by external profilers and
+// debuggers to map address ranges to function names.
+class CodeObserver {
+ public:
+  virtual ~CodeObserver() { }
+
+  // Returns true if this observer is active and should be notified
+  // about newly created code objects.
+  virtual bool IsActive() const = 0;
+
+  // Notify code observer about a newly created code object with the
+  // given properties.
+  virtual void Notify(const char* name,
+                      uword base,
+                      uword prologue_offset,
+                      uword size,
+                      bool optimized) = 0;
+};
+
+
+class CodeObservers {
+ public:
+  static void InitOnce();
+
+  static void Register(CodeObserver* observer);
+
+  // Notify all active code observers about a newly created code object.
+  static void NotifyAll(const char* name,
+                        uword base,
+                        uword prologue_offset,
+                        uword size,
+                        bool optimized);
+
+  // Returns true if there is at least one active code observer.
+  static bool AreActive();
+
+ private:
+  static intptr_t observers_length_;
+  static CodeObserver** observers_;
+};
+
+
+}  // namespace dart
+
+#endif  // VM_CODE_OBSERVERS_H_
diff --git a/runtime/vm/compiler.cc b/runtime/vm/compiler.cc
index 25cb8a3..c82be17 100644
--- a/runtime/vm/compiler.cc
+++ b/runtime/vm/compiler.cc
@@ -553,6 +553,12 @@
   Error& error = Error::Handle();
   Array& functions = Array::Handle(cls.functions());
   Function& func = Function::Handle();
+  // Class dynamic lives in the vm isolate. Its array fields cannot be set to
+  // an empty array.
+  if (functions.IsNull()) {
+    ASSERT(cls.IsDynamicClass());
+    return error.raw();
+  }
   for (int i = 0; i < functions.Length(); i++) {
     func ^= functions.At(i);
     ASSERT(!func.IsNull());
diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc
index fcc3501..5c6abe5 100644
--- a/runtime/vm/dart.cc
+++ b/runtime/vm/dart.cc
@@ -4,6 +4,7 @@
 
 #include "vm/dart.h"
 
+#include "vm/code_observers.h"
 #include "vm/dart_api_state.h"
 #include "vm/flags.h"
 #include "vm/freelist.h"
@@ -49,8 +50,9 @@
 
 // TODO(turnidge): We should add a corresponding Dart::Cleanup.
 const char* Dart::InitOnce(Dart_IsolateCreateCallback create,
-                    Dart_IsolateInterruptCallback interrupt,
-                    Dart_IsolateShutdownCallback shutdown) {
+                           Dart_IsolateInterruptCallback interrupt,
+                           Dart_IsolateUnhandledExceptionCallback unhandled,
+                           Dart_IsolateShutdownCallback shutdown) {
   // TODO(iposva): Fix race condition here.
   if (vm_isolate_ != NULL || !Flags::Initialized()) {
     return "VM already initialized.";
@@ -61,6 +63,7 @@
   PortMap::InitOnce();
   FreeListElement::InitOnce();
   Api::InitOnce();
+  CodeObservers::InitOnce();
   // Create the VM isolate and finish the VM initialization.
   ASSERT(thread_pool_ == NULL);
   thread_pool_ = new ThreadPool();
@@ -90,6 +93,7 @@
   Isolate::SetCurrent(NULL);  // Unregister the VM isolate from this thread.
   Isolate::SetCreateCallback(create);
   Isolate::SetInterruptCallback(interrupt);
+  Isolate::SetUnhandledExceptionCallback(unhandled);
   Isolate::SetShutdownCallback(shutdown);
   return NULL;
 }
@@ -191,4 +195,5 @@
   }
 }
 
+
 }  // namespace dart
diff --git a/runtime/vm/dart.h b/runtime/vm/dart.h
index 585cddd..b716661 100644
--- a/runtime/vm/dart.h
+++ b/runtime/vm/dart.h
@@ -18,9 +18,11 @@
 
 class Dart : public AllStatic {
  public:
-  static const char* InitOnce(Dart_IsolateCreateCallback create,
-                              Dart_IsolateInterruptCallback interrupt,
-                              Dart_IsolateShutdownCallback shutdown);
+  static const char* InitOnce(
+      Dart_IsolateCreateCallback create,
+      Dart_IsolateInterruptCallback interrupt,
+      Dart_IsolateUnhandledExceptionCallback unhandled,
+      Dart_IsolateShutdownCallback shutdown);
 
   static Isolate* CreateIsolate(const char* name_prefix);
   static RawError* InitializeIsolate(const uint8_t* snapshot, void* data);
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index aed8a10..5173713 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -736,10 +736,12 @@
   return Version::String();
 }
 
-DART_EXPORT bool Dart_Initialize(Dart_IsolateCreateCallback create,
-                                 Dart_IsolateInterruptCallback interrupt,
-                                 Dart_IsolateShutdownCallback shutdown) {
-  const char* err_msg = Dart::InitOnce(create, interrupt, shutdown);
+DART_EXPORT bool Dart_Initialize(
+    Dart_IsolateCreateCallback create,
+    Dart_IsolateInterruptCallback interrupt,
+    Dart_IsolateUnhandledExceptionCallback unhandled,
+    Dart_IsolateShutdownCallback shutdown) {
+  const char* err_msg = Dart::InitOnce(create, interrupt, unhandled, shutdown);
   if (err_msg != NULL) {
     OS::PrintErr("Dart_Initialize: %s\n", err_msg);
     return false;
@@ -1615,18 +1617,19 @@
 }
 
 
-DART_EXPORT Dart_Handle Dart_NewExternalUTF8String(const uint8_t* utf8_array,
-                                                   intptr_t length,
-                                                   void* peer,
-                                                   Dart_PeerFinalizer cback) {
+DART_EXPORT Dart_Handle Dart_NewExternalLatin1String(
+    const uint8_t* latin1_array,
+    intptr_t length,
+    void* peer,
+    Dart_PeerFinalizer cback) {
   Isolate* isolate = Isolate::Current();
   DARTSCOPE(isolate);
-  if (utf8_array == NULL && length != 0) {
-    RETURN_NULL_ERROR(utf8_array);
+  if (latin1_array == NULL && length != 0) {
+    RETURN_NULL_ERROR(latin1_array);
   }
   CHECK_LENGTH(length, String::kMaxElements);
   return Api::NewHandle(isolate,
-                        String::NewExternal(utf8_array, length, peer, cback));
+                        String::NewExternal(latin1_array, length, peer, cback));
 }
 
 
@@ -1747,6 +1750,10 @@
   if (array == NULL) {
     RETURN_NULL_ERROR(array);
   }
+  if (str_obj.IsCanonical()) {
+    return Api::NewError("Dart_MakeExternalString "
+                         "cannot externalize a read-only string.");
+  }
   intptr_t str_size = (str_obj.Length() * str_obj.CharSize());
   if ((length < str_size) || (length > String::kMaxElements)) {
     return Api::NewError("Dart_MakeExternalString "
@@ -2456,26 +2463,23 @@
 }
 
 
-// --- Classes and Interfaces ---
+// --- Classes ---
 
 
 DART_EXPORT bool Dart_IsClass(Dart_Handle handle) {
   Isolate* isolate = Isolate::Current();
   DARTSCOPE(isolate);
   const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(handle));
-  if (obj.IsClass()) {
-    return !Class::Cast(obj).is_interface();
-  }
-  return false;
+  return obj.IsClass();
 }
 
 
-DART_EXPORT bool Dart_IsInterface(Dart_Handle handle) {
+DART_EXPORT bool Dart_IsAbstractClass(Dart_Handle handle) {
   Isolate* isolate = Isolate::Current();
   DARTSCOPE(isolate);
   const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(handle));
   if (obj.IsClass()) {
-    return Class::Cast(obj).is_interface();
+    return Class::Cast(obj).is_abstract();
   }
   return false;
 }
@@ -2514,27 +2518,6 @@
 }
 
 
-DART_EXPORT Dart_Handle Dart_ClassGetDefault(Dart_Handle clazz) {
-  Isolate* isolate = Isolate::Current();
-  DARTSCOPE(isolate);
-  const Class& cls = Api::UnwrapClassHandle(isolate, clazz);
-  if (cls.IsNull()) {
-    RETURN_TYPE_ERROR(isolate, clazz, Class);
-  }
-
-  // Finalize all classes.
-  const char* msg = CheckIsolateState(isolate);
-  if (msg != NULL) {
-    return Api::NewError("%s", msg);
-  }
-
-  if (cls.HasFactoryClass() && cls.HasResolvedFactoryClass()) {
-    return Api::NewHandle(isolate, cls.FactoryClass());
-  }
-  return Api::Null(isolate);
-}
-
-
 DART_EXPORT Dart_Handle Dart_ClassGetInterfaceCount(Dart_Handle clazz,
                                                     intptr_t* count) {
   Isolate* isolate = Isolate::Current();
@@ -3334,40 +3317,13 @@
     return Api::NewError("%s", msg);
   }
 
-  // Check for interfaces with default implementations.
-  if (cls.is_interface()) {
-    // Make sure that the constructor is found in the interface.
-    result = ResolveConstructor(
-        "Dart_New", cls, base_constructor_name, dot_name, number_of_arguments);
-    if (result.IsError()) {
-      return Api::NewHandle(isolate, result.raw());
-    }
-
-    ASSERT(cls.HasResolvedFactoryClass());
-    const Class& factory_class = Class::Handle(cls.FactoryClass());
-
-    // If the factory class implements the requested interface, then
-    // we use the name of the factory class when looking up the
-    // constructor.  Otherwise we use the original interface name when
-    // looking up the constructor.
-    const TypeArguments& no_type_args = TypeArguments::Handle(isolate);
-    Error& error = Error::Handle();
-    if (factory_class.IsSubtypeOf(no_type_args, cls, no_type_args, &error)) {
-      base_constructor_name = factory_class.Name();
-    }
-    if (!error.IsNull()) {
-      return Api::NewHandle(isolate, error.raw());
-    }
-
-    cls = cls.FactoryClass();
-  }
-
   // Resolve the constructor.
   result = ResolveConstructor(
       "Dart_New", cls, base_constructor_name, dot_name, number_of_arguments);
   if (result.IsError()) {
     return Api::NewHandle(isolate, result.raw());
   }
+  // TODO(turnidge): Support redirecting factories.
   ASSERT(result.IsFunction());
   Function& constructor = Function::Handle(isolate);
   constructor ^= result.raw();
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index ecc1df1..bbae17f 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -521,8 +521,8 @@
   EXPECT(Dart_IsStringLatin1(str8));
   EXPECT(!Dart_IsExternalString(str8));
 
-  Dart_Handle ext8 = Dart_NewExternalUTF8String(data8, ARRAY_SIZE(data8),
-                                                NULL, NULL);
+  Dart_Handle ext8 = Dart_NewExternalLatin1String(data8, ARRAY_SIZE(data8),
+                                                  NULL, NULL);
   EXPECT_VALID(ext8);
   EXPECT(Dart_IsString(ext8));
   EXPECT(Dart_IsExternalString(ext8));
@@ -575,13 +575,13 @@
 TEST_CASE(ExternalStringGetPeer) {
   Dart_Handle result;
 
-  uint8_t data8[] = { 'o', 'n', 'e', 0x7F };
+  uint8_t data8[] = { 'o', 'n', 'e', 0xFF };
   int peer_data = 123;
   void* peer = NULL;
 
   // Success.
-  Dart_Handle ext8 = Dart_NewExternalUTF8String(data8, ARRAY_SIZE(data8),
-                                                &peer_data, NULL);
+  Dart_Handle ext8 = Dart_NewExternalLatin1String(data8, ARRAY_SIZE(data8),
+                                                  &peer_data, NULL);
   EXPECT_VALID(ext8);
 
   result = Dart_ExternalStringGetPeer(ext8, &peer);
@@ -596,7 +596,8 @@
 
   // String is not external.
   peer = NULL;
-  Dart_Handle str8 = Dart_NewStringFromUTF8(data8, ARRAY_SIZE(data8));
+  uint8_t utf8_data8[] = { 'o', 'n', 'e', 0x7F };
+  Dart_Handle str8 = Dart_NewStringFromUTF8(utf8_data8, ARRAY_SIZE(data8));
   EXPECT_VALID(str8);
   result = Dart_ExternalStringGetPeer(str8, &peer);
   EXPECT(Dart_IsError(result));
@@ -630,7 +631,7 @@
     Dart_EnterScope();
 
     uint8_t data8[] = { 'h', 'e', 'l', 'l', 'o' };
-    Dart_Handle obj8 = Dart_NewExternalUTF8String(
+    Dart_Handle obj8 = Dart_NewExternalLatin1String(
         data8,
         ARRAY_SIZE(data8),
         &peer8,
@@ -2014,7 +2015,7 @@
   EXPECT_EQ(7, global_epilogue_callback_status);
 
   // Garbage collect old space again.  Callbacks are persistent so the
-  // prolog status value should change again.
+  // prologue status value should change again.
   Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
   EXPECT_EQ(12, global_prologue_callback_status);
   EXPECT_EQ(7, global_epilogue_callback_status);
@@ -2330,79 +2331,6 @@
 // Only ia32 and x64 can run execution tests.
 #if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64)
 
-
-TEST_CASE(ClassBasics) {
-  const char* kScriptChars =
-      "class MyClass {\n"
-      "}\n"
-      "class MyDefault {\n"
-      "}\n"
-      "interface MyInterface default MyDefault {\n"
-      "}\n";
-  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
-  Dart_Handle cls = Dart_GetClass(lib, NewString("MyClass"));
-  Dart_Handle interface = Dart_GetClass(lib, NewString("MyInterface"));
-
-  // Test Dart_IsClass and Dart_IsInterface.
-  EXPECT(Dart_IsClass(cls));
-  EXPECT(!Dart_IsClass(interface));
-  EXPECT(!Dart_IsClass(Dart_True()));
-
-  EXPECT(!Dart_IsInterface(cls));
-  EXPECT(Dart_IsInterface(interface));
-  EXPECT(!Dart_IsInterface(Dart_True()));
-
-  EXPECT(!Dart_IsInterface(cls));
-  EXPECT(Dart_IsInterface(interface));
-  EXPECT(!Dart_IsInterface(Dart_True()));
-
-  // Test Dart_ClassName
-  Dart_Handle cls_name = Dart_ClassName(cls);
-  EXPECT_VALID(cls_name);
-  const char* cls_name_cstr = "";
-  EXPECT_VALID(Dart_StringToCString(cls_name, &cls_name_cstr));
-  EXPECT_STREQ("MyClass", cls_name_cstr);
-
-  cls_name = Dart_ClassName(interface);
-  EXPECT_VALID(cls_name);
-  cls_name_cstr = "";
-  EXPECT_VALID(Dart_StringToCString(cls_name, &cls_name_cstr));
-  EXPECT_STREQ("MyInterface", cls_name_cstr);
-
-  EXPECT_ERROR(Dart_ClassName(Dart_True()),
-               "Dart_ClassName expects argument 'clazz' to be of type Class.");
-  EXPECT_ERROR(Dart_ClassName(Dart_NewApiError("MyError")), "MyError");
-
-  // Test Dart_ClassGetLibrary
-  Dart_Handle cls_lib = Dart_ClassGetLibrary(cls);
-  Dart_Handle cls_lib_name = Dart_LibraryName(cls_lib);
-  EXPECT_VALID(cls_lib_name);
-  const char* cls_lib_name_cstr = "";
-  EXPECT_VALID(Dart_StringToCString(cls_lib_name, &cls_lib_name_cstr));
-  EXPECT_STREQ(TestCase::url(), cls_lib_name_cstr);
-
-  EXPECT_ERROR(
-      Dart_ClassGetLibrary(Dart_True()),
-      "Dart_ClassGetLibrary expects argument 'clazz' to be of type Class.");
-  EXPECT_ERROR(Dart_ClassGetLibrary(Dart_NewApiError("MyError")), "MyError");
-
-
-  Dart_Handle dflt = Dart_ClassGetDefault(interface);
-  EXPECT_VALID(dflt);
-  EXPECT(Dart_IsClass(dflt));
-  Dart_Handle dflt_name = Dart_ClassName(dflt);
-  EXPECT_VALID(dflt_name);
-  const char* dflt_name_cstr = "";
-  EXPECT_VALID(Dart_StringToCString(dflt_name, &dflt_name_cstr));
-  EXPECT_STREQ("MyDefault", dflt_name_cstr);
-
-  EXPECT(Dart_IsNull(Dart_ClassGetDefault(cls)));
-  EXPECT_ERROR(
-      Dart_ClassGetDefault(Dart_True()),
-      "Dart_ClassGetDefault expects argument 'clazz' to be of type Class.");
-  EXPECT_ERROR(Dart_ClassGetDefault(Dart_NewApiError("MyError")), "MyError");
-}
-
 TEST_CASE(ClassTypedefsEtc) {
   const char* kScriptChars =
       "class SomeClass {\n"
@@ -2451,16 +2379,16 @@
                "class 'SomeClass' is not a function-type class.");
 }
 
-#define CHECK_INTERFACE(handle, name)                                   \
-  {                                                                     \
-    Dart_Handle tmp = (handle);                                         \
-    EXPECT_VALID(tmp);                                                  \
-    EXPECT(Dart_IsInterface(tmp));                                      \
-    Dart_Handle intf_name = Dart_ClassName(tmp);                        \
-    EXPECT_VALID(intf_name);                                            \
-    const char* intf_name_cstr = "";                                    \
-    EXPECT_VALID(Dart_StringToCString(intf_name, &intf_name_cstr));     \
-    EXPECT_STREQ((name), intf_name_cstr);                               \
+#define CHECK_ABSTRACT_CLASS(handle, name)                                     \
+  {                                                                            \
+    Dart_Handle tmp = (handle);                                                \
+    EXPECT_VALID(tmp);                                                         \
+    EXPECT(Dart_IsAbstractClass(tmp));                                         \
+    Dart_Handle intf_name = Dart_ClassName(tmp);                               \
+    EXPECT_VALID(intf_name);                                                   \
+    const char* intf_name_cstr = "";                                           \
+    EXPECT_VALID(Dart_StringToCString(intf_name, &intf_name_cstr));            \
+    EXPECT_STREQ((name), intf_name_cstr);                                      \
   }
 
 
@@ -2475,10 +2403,10 @@
       "class MyClass2 implements MyInterface0, MyInterface1 {\n"
       "}\n"
       "\n"
-      "interface MyInterface0 {\n"
+      "abstract class MyInterface0 {\n"
       "}\n"
       "\n"
-      "interface MyInterface1 extends MyInterface0 {\n"
+      "abstract class MyInterface1 implements MyInterface0 {\n"
       "}\n";
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
 
@@ -2498,7 +2426,7 @@
   len = -1;
   EXPECT_VALID(Dart_ClassGetInterfaceCount(cls1, &len));
   EXPECT_EQ(1, len);
-  CHECK_INTERFACE(Dart_ClassGetInterfaceAt(cls1, 0), "MyInterface1");
+  CHECK_ABSTRACT_CLASS(Dart_ClassGetInterfaceAt(cls1, 0), "MyInterface1");
 
   EXPECT_ERROR(Dart_ClassGetInterfaceAt(cls1, -1),
                "Dart_ClassGetInterfaceAt: argument 'index' out of bounds");
@@ -2510,8 +2438,8 @@
   EXPECT_EQ(2, len);
 
   // TODO(turnidge): The test relies on the ordering here.  Sort this.
-  CHECK_INTERFACE(Dart_ClassGetInterfaceAt(cls2, 0), "MyInterface0");
-  CHECK_INTERFACE(Dart_ClassGetInterfaceAt(cls2, 1), "MyInterface1");
+  CHECK_ABSTRACT_CLASS(Dart_ClassGetInterfaceAt(cls2, 0), "MyInterface0");
+  CHECK_ABSTRACT_CLASS(Dart_ClassGetInterfaceAt(cls2, 1), "MyInterface1");
 
   len = -1;
   EXPECT_VALID(Dart_ClassGetInterfaceCount(intf0, &len));
@@ -2520,7 +2448,7 @@
   len = -1;
   EXPECT_VALID(Dart_ClassGetInterfaceCount(intf1, &len));
   EXPECT_EQ(1, len);
-  CHECK_INTERFACE(Dart_ClassGetInterfaceAt(intf1, 0), "MyInterface0");
+  CHECK_ABSTRACT_CLASS(Dart_ClassGetInterfaceAt(intf1, 0), "MyInterface0");
 
   // Error cases.
   EXPECT_ERROR(Dart_ClassGetInterfaceCount(Dart_True(), &len),
@@ -6250,11 +6178,28 @@
 }
 
 
+// The error string from the last unhandled exception. This value is only
+// valid until the next Dart_ExitScope().
+static char* last_exception = NULL;
+
+
+static void RunLoopUnhandledExceptionCallback(Dart_Handle exception) {
+  Dart_Handle error_string = Dart_ToString(exception);
+  EXPECT_VALID(error_string);
+  const char* error_text;
+  Dart_Handle result = Dart_StringToCString(error_string, &error_text);
+  // Duplicate the string since error text is freed when callback is finished.
+  last_exception = strdup(error_text);
+  EXPECT_VALID(result);
+}
+
+
 // Common code for RunLoop_Success/RunLoop_Failure.
 static void RunLoopTest(bool throw_exception_child,
                         bool throw_exception_parent) {
   Dart_IsolateCreateCallback saved = Isolate::CreateCallback();
   Isolate::SetCreateCallback(RunLoopTestCallback);
+  Isolate::SetUnhandledExceptionCallback(RunLoopUnhandledExceptionCallback);
   RunLoopTestCallback(NULL, NULL, NULL, NULL);
 
   Dart_EnterScope();
@@ -6267,11 +6212,24 @@
   args[1] = (throw_exception_parent ? Dart_True() : Dart_False());
   result = Dart_Invoke(lib, NewString("main"), 2, args);
   EXPECT_VALID(result);
-  result = Dart_RunLoop();
-  if (throw_exception_parent) {
-    EXPECT_ERROR(result, "Exception: MakeParentExit");
+  if (throw_exception_child) {
+    // TODO(tball): fix race-condition
+    // EXPECT_NOTNULL(last_exception);
+    // EXPECT_STREQ("UnhandledException", last_exception);
   } else {
-    EXPECT_VALID(result);
+    result = Dart_RunLoop();
+    if (throw_exception_parent) {
+      EXPECT_ERROR(result, "Exception: MakeParentExit");
+      EXPECT_NOTNULL(last_exception);
+      EXPECT_STREQ("UnhandledException", last_exception);
+    } else {
+      EXPECT_VALID(result);
+      EXPECT(last_exception == NULL);
+    }
+  }
+  if (last_exception != NULL) {
+    free(last_exception);
+    last_exception = NULL;
   }
 
   Dart_ExitScope();
@@ -7218,7 +7176,7 @@
     uint8_t data8[] = { 'h', 'e', 'l', 'l', 'o' };
     const char* err = "string";
     Dart_Handle err_str = NewString(err);
-    Dart_Handle ext_err_str = Dart_NewExternalUTF8String(
+    Dart_Handle ext_err_str = Dart_NewExternalLatin1String(
         data8, ARRAY_SIZE(data8), NULL, NULL);
     Dart_Handle result = Dart_MakeExternalString(Dart_Null(),
                                                  data8,
diff --git a/runtime/vm/dart_api_message.cc b/runtime/vm/dart_api_message.cc
index 4cee392..8d576ab 100644
--- a/runtime/vm/dart_api_message.cc
+++ b/runtime/vm/dart_api_message.cc
@@ -389,17 +389,28 @@
       uint16_t *utf16 =
           reinterpret_cast<uint16_t*>(::malloc(len * sizeof(uint16_t)));
       intptr_t utf8_len = 0;
+      // Read all the UTF-16 code units.
       for (intptr_t i = 0; i < len; i++) {
         utf16[i] = Read<uint16_t>();
-        // TODO(sgjesse): Check for surrogate pairs.
-        utf8_len += Utf8::Length(utf16[i]);
+      }
+      // Calculate the UTF-8 length and check if the string can be
+      // UTF-8 encoded.
+      bool valid = true;
+      intptr_t i = 0;
+      while (i < len && valid) {
+        int32_t ch = Utf16::Next(utf16, &i, len);
+        utf8_len += Utf8::Length(ch);
+        valid = !Utf16::IsSurrogate(ch);
+      }
+      if (!valid) {
+        return AllocateDartCObjectUnsupported();
       }
       Dart_CObject* object = AllocateDartCObjectString(utf8_len);
       AddBackRef(object_id, object, kIsDeserialized);
       char* p = object->value.as_string;
-      for (intptr_t i = 0; i < len; i++) {
-        // TODO(sgjesse): Check for surrogate pairs.
-        p += Utf8::Encode(utf16[i], p);
+      i = 0;
+      while (i < len) {
+        p += Utf8::Encode(Utf16::Next(utf16, &i, len), p);
       }
       *p = '\0';
       ASSERT(p == (object->value.as_string + utf8_len));
@@ -807,16 +818,20 @@
       if (type == Utf8::kLatin1) {
         uint8_t* latin1_str =
             reinterpret_cast<uint8_t*>(::malloc(len * sizeof(uint8_t)));
-        Utf8::DecodeToLatin1(utf8_str, utf8_len, latin1_str, len);
+        bool success = Utf8::DecodeToLatin1(utf8_str,
+                                            utf8_len,
+                                            latin1_str,
+                                            len);
+        ASSERT(success);
         for (intptr_t i = 0; i < len; i++) {
           Write<uint8_t>(latin1_str[i]);
         }
         ::free(latin1_str);
       } else {
-        // TODO(sgjesse): Make sure surrogate pairs are handled.
         uint16_t* utf16_str =
             reinterpret_cast<uint16_t*>(::malloc(len * sizeof(uint16_t)));
-        Utf8::DecodeToUTF16(utf8_str, utf8_len, utf16_str, len);
+        bool success = Utf8::DecodeToUTF16(utf8_str, utf8_len, utf16_str, len);
+        ASSERT(success);
         for (intptr_t i = 0; i < len; i++) {
           Write<uint16_t>(utf16_str[i]);
         }
diff --git a/runtime/vm/exceptions.cc b/runtime/vm/exceptions.cc
index 479ad64..ba1dae4 100644
--- a/runtime/vm/exceptions.cc
+++ b/runtime/vm/exceptions.cc
@@ -4,6 +4,7 @@
 
 #include "vm/exceptions.h"
 
+#include "vm/dart_api_impl.h"
 #include "vm/dart_entry.h"
 #include "vm/debugger.h"
 #include "vm/flags.h"
@@ -163,14 +164,20 @@
                                              pc_offset_list);
   if (handler_pc == 0) {
     // There are no dart invocation frames on the stack so we do not
-    // have a caller to return to. This is a case where we would have
-    // to call the Isolate error handler and let it deal with the shutdown.
-    // We report an error and shutdown the process as a temporary solution
-    // until the isolate error handler stuff is implemented.
+    // have a caller to return to.
     ASSERT(!handler_exists);
-    OS::PrintErr("Exception '%s' thrown:\n", exception.ToCString());
-    OS::PrintErr("Exiting the process\n");
-    OS::Exit(255);
+    if (Isolate::UnhandledExceptionCallback() != NULL) {
+      // Notify embedder that an unhandled exception occurred.
+      Dart_EnterScope();
+      Dart_Handle error_handle = Api::NewHandle(Isolate::Current(),
+                                                incoming_exception.raw());
+      (Isolate::UnhandledExceptionCallback())(error_handle);
+      Dart_ExitScope();
+    } else {
+      OS::PrintErr("Exception '%s' thrown:\n", exception.ToCString());
+      OS::PrintErr("Shutting down the isolate\n");
+    }
+    Dart_ShutdownIsolate();
   }
   // TODO(5411263): At some point we can optimize by figuring out if a
   // stack trace is needed based on whether the catch code specifies a
diff --git a/runtime/vm/flow_graph_builder.cc b/runtime/vm/flow_graph_builder.cc
index 37be5e7..f48ac9e 100644
--- a/runtime/vm/flow_graph_builder.cc
+++ b/runtime/vm/flow_graph_builder.cc
@@ -1886,13 +1886,13 @@
   // The receiver cannot be null; extract its AbstractTypeArguments object.
   // Note that in the factory case, the instantiator is the first parameter
   // of the factory, i.e. already an AbstractTypeArguments object.
-  intptr_t type_arguments_instance_field_offset =
-      instantiator_class.type_arguments_instance_field_offset();
-  ASSERT(type_arguments_instance_field_offset != Class::kNoTypeArguments);
+  intptr_t type_arguments_field_offset =
+      instantiator_class.type_arguments_field_offset();
+  ASSERT(type_arguments_field_offset != Class::kNoTypeArguments);
 
   return Bind(new LoadFieldInstr(
       instantiator,
-      type_arguments_instance_field_offset,
+      type_arguments_field_offset,
       Type::ZoneHandle()));  // Not an instance, no type.
 }
 
diff --git a/runtime/vm/flow_graph_compiler.cc b/runtime/vm/flow_graph_compiler.cc
index 7b8b194..869627c 100644
--- a/runtime/vm/flow_graph_compiler.cc
+++ b/runtime/vm/flow_graph_compiler.cc
@@ -6,6 +6,7 @@
 
 #include "vm/flow_graph_compiler.h"
 
+#include "vm/cha.h"
 #include "vm/dart_entry.h"
 #include "vm/debugger.h"
 #include "vm/deopt_instructions.h"
@@ -28,6 +29,7 @@
 DECLARE_FLAG(bool, propagate_ic_data);
 DECLARE_FLAG(bool, report_usage_count);
 DECLARE_FLAG(int, optimization_counter_threshold);
+DECLARE_FLAG(bool, use_cha);
 
 void CompilerDeoptInfo::BuildReturnAddress(DeoptInfoBuilder* builder,
                                            const Function& function,
@@ -1004,4 +1006,28 @@
   }
 }
 
+
+// Returns true if checking against this type is a direct class id comparison.
+bool FlowGraphCompiler::TypeCheckAsClassEquality(const AbstractType& type) {
+  ASSERT(type.IsFinalized() && !type.IsMalformed());
+  // Requires CHA, which can be applied in optimized code only,
+  if (!FLAG_use_cha || !is_optimizing()) return false;
+  if (!type.IsInstantiated()) return false;
+  const Class& type_class = Class::Handle(type.type_class());
+  // Could be an interface check?
+  if (type_class.is_implemented()) return false;
+  const intptr_t type_cid = type_class.id();
+  if (CHA::HasSubclasses(type_cid)) return false;
+  if (type_class.HasTypeArguments()) {
+    // Only raw types can be directly compared, thus disregarding type
+    // arguments.
+    const AbstractTypeArguments& type_arguments =
+        AbstractTypeArguments::Handle(type.arguments());
+    const bool is_raw_type = type_arguments.IsNull() ||
+        type_arguments.IsRaw(type_arguments.Length());
+    return is_raw_type;
+  }
+  return true;
+}
+
 }  // namespace dart
diff --git a/runtime/vm/flow_graph_compiler_ia32.cc b/runtime/vm/flow_graph_compiler_ia32.cc
index 5efe27e..832c5f1 100644
--- a/runtime/vm/flow_graph_compiler_ia32.cc
+++ b/runtime/vm/flow_graph_compiler_ia32.cc
@@ -132,12 +132,10 @@
   if (is_raw_type) {
     const Register kClassIdReg = ECX;
     // dynamic type argument, check only classes.
-    // List is a very common case.
     __ LoadClassId(kClassIdReg, kInstanceReg);
-    if (!type_class.is_interface()) {
-      __ cmpl(kClassIdReg, Immediate(type_class.id()));
-      __ j(EQUAL, is_instance_lbl);
-    }
+    __ cmpl(kClassIdReg, Immediate(type_class.id()));
+    __ j(EQUAL, is_instance_lbl);
+    // List is a very common case.
     if (type_class.IsListClass()) {
       GenerateListTypeCheck(kClassIdReg, is_instance_lbl);
     }
@@ -216,11 +214,8 @@
   __ Bind(&compare_classes);
   const Register kClassIdReg = ECX;
   __ LoadClassId(kClassIdReg, kInstanceReg);
-  // If type is an interface, we can skip the class equality check.
-  if (!type_class.is_interface()) {
-    __ cmpl(kClassIdReg, Immediate(type_class.id()));
-    __ j(EQUAL, is_instance_lbl);
-  }
+  __ cmpl(kClassIdReg, Immediate(type_class.id()));
+  __ j(EQUAL, is_instance_lbl);
   // Bool interface can be implemented only by core class Bool.
   // (see ClassFinalizer::ResolveInterfaces for list of restricted interfaces).
   if (type.IsBoolType()) {
@@ -392,6 +387,20 @@
     // type error. A null value is handled prior to executing this inline code.
     return SubtypeTestCache::null();
   }
+  if (TypeCheckAsClassEquality(type)) {
+    const intptr_t type_cid = Class::Handle(type.type_class()).id();
+    const Register kInstanceReg = EAX;
+    __ testl(kInstanceReg, Immediate(kSmiTagMask));
+    if (type_cid == kSmiCid) {
+      __ j(ZERO, is_instance_lbl);
+    } else {
+      __ j(ZERO, is_not_instance_lbl);
+      __ CompareClassId(kInstanceReg, type_cid, EDI);
+      __ j(EQUAL, is_instance_lbl);
+    }
+    __ jmp(is_not_instance_lbl);
+    return SubtypeTestCache::null();
+  }
   if (type.IsInstantiated()) {
     const Class& type_class = Class::ZoneHandle(type.type_class());
     // A Smi object cannot be the instance of a parameterized class.
@@ -777,41 +786,32 @@
     // stack.
     __ addl(ESP, Immediate(StackSize() * kWordSize));
   }
-  // The calls immediately below have empty stackmaps because we have just
+  // The call below has an empty stackmap because we have just
   // dropped the spill slots.
   BitmapBuilder* empty_stack_bitmap = new BitmapBuilder();
-  if (function.IsClosureFunction()) {
-    // TODO(regis): Call NoSuchMethod with "call" as name of original function.
-    // We do not use GenerateCallRuntime because of the non-standard (empty)
-    // stackmap used here.
-    __ CallRuntime(kClosureArgumentMismatchRuntimeEntry);
-    AddCurrentDescriptor(PcDescriptors::kOther,
-                         Isolate::kNoDeoptId,
-                         0);  // No token position.
-  } else {
-    // Invoke noSuchMethod function.
-    const int kNumArgsChecked = 1;
-    ICData& ic_data = ICData::ZoneHandle();
-    ic_data = ICData::New(function,
-                          String::Handle(function.name()),
-                          Isolate::kNoDeoptId,
-                          kNumArgsChecked);
-    __ LoadObject(ECX, ic_data);
-    // EBP - 4 : PC marker, allows easy identification of RawInstruction obj.
-    // EBP : points to previous frame pointer.
-    // EBP + 4 : points to return address.
-    // EBP + 8 : address of last argument (arg n-1).
-    // ESP + 8 + 4*(n-1) : address of first argument (arg 0).
-    // ECX : ic-data.
-    // EDX : arguments descriptor array.
-    __ call(&StubCode::CallNoSuchMethodFunctionLabel());
-  }
+
+  // Invoke noSuchMethod function passing the original name of the function.
+  // If the function is a closure function, use "call" as the original name.
+  const String& name = String::Handle(
+      function.IsClosureFunction() ? Symbols::Call() : function.name());
+  const int kNumArgsChecked = 1;
+  const ICData& ic_data = ICData::ZoneHandle(
+      ICData::New(function, name, Isolate::kNoDeoptId, kNumArgsChecked));
+  __ LoadObject(ECX, ic_data);
+  // EBP - 4 : PC marker, allows easy identification of RawInstruction obj.
+  // EBP : points to previous frame pointer.
+  // EBP + 4 : points to return address.
+  // EBP + 8 : address of last argument (arg n-1).
+  // ESP + 8 + 4*(n-1) : address of first argument (arg 0).
+  // ECX : ic-data.
+  // EDX : arguments descriptor array.
+  __ call(&StubCode::CallNoSuchMethodFunctionLabel());
   if (is_optimizing()) {
     stackmap_table_builder_->AddEntry(assembler()->CodeSize(),
                                       empty_stack_bitmap,
                                       0);  // No registers.
   }
-
+  // The noSuchMethod call may return.
   __ LeaveFrame();
   __ ret();
 
@@ -912,11 +912,38 @@
       __ cmpl(EAX, Immediate(Smi::RawValue(num_fixed_params)));
       __ j(EQUAL, &argc_in_range, Assembler::kNearJump);
       if (function.IsClosureFunction()) {
-        // TODO(regis): Call NoSuchMethod with "call" as name of original
-        // function.
-        GenerateCallRuntime(function.token_pos(),
-                            kClosureArgumentMismatchRuntimeEntry,
-                            prologue_locs);
+        if (StackSize() != 0) {
+          // We need to unwind the space we reserved for locals and copied
+          // parameters. The NoSuchMethodFunction stub does not expect to see
+          // that area on the stack.
+          __ addl(ESP, Immediate(StackSize() * kWordSize));
+        }
+        // The call below has an empty stackmap because we have just
+        // dropped the spill slots.
+        BitmapBuilder* empty_stack_bitmap = new BitmapBuilder();
+
+        // Invoke noSuchMethod function passing "call" as the function name.
+        const String& name = String::Handle(Symbols::Call());
+        const int kNumArgsChecked = 1;
+        const ICData& ic_data = ICData::ZoneHandle(
+            ICData::New(function, name, Isolate::kNoDeoptId, kNumArgsChecked));
+        __ LoadObject(ECX, ic_data);
+        // EBP - 4 : PC marker, for easy identification of RawInstruction obj.
+        // EBP : points to previous frame pointer.
+        // EBP + 4 : points to return address.
+        // EBP + 8 : address of last argument (arg n-1).
+        // ESP + 8 + 4*(n-1) : address of first argument (arg 0).
+        // ECX : ic-data.
+        // EDX : arguments descriptor array.
+        __ call(&StubCode::CallNoSuchMethodFunctionLabel());
+        if (is_optimizing()) {
+          stackmap_table_builder_->AddEntry(assembler()->CodeSize(),
+                                            empty_stack_bitmap,
+                                            0);  // No registers.
+        }
+        // The noSuchMethod call may return.
+        __ LeaveFrame();
+        __ ret();
       } else {
         __ Stop("Wrong number of arguments");
       }
diff --git a/runtime/vm/flow_graph_compiler_ia32.h b/runtime/vm/flow_graph_compiler_ia32.h
index 5576041..4af53ad 100644
--- a/runtime/vm/flow_graph_compiler_ia32.h
+++ b/runtime/vm/flow_graph_compiler_ia32.h
@@ -297,6 +297,9 @@
                                                    Label* is_instance_lbl,
                                                    Label* is_not_instance_lbl);
 
+  // Returns true if checking against this type is a direct class id comparison.
+  bool TypeCheckAsClassEquality(const AbstractType& type);
+
   void GenerateBoolToJump(Register bool_reg, Label* is_true, Label* is_false);
 
   void CopyParameters();
diff --git a/runtime/vm/flow_graph_compiler_x64.cc b/runtime/vm/flow_graph_compiler_x64.cc
index f5c7e2b..6ac1af9 100644
--- a/runtime/vm/flow_graph_compiler_x64.cc
+++ b/runtime/vm/flow_graph_compiler_x64.cc
@@ -132,12 +132,10 @@
   if (is_raw_type) {
     const Register kClassIdReg = R10;
     // dynamic type argument, check only classes.
-    // List is a very common case.
     __ LoadClassId(kClassIdReg, kInstanceReg);
-    if (!type_class.is_interface()) {
-      __ cmpl(kClassIdReg, Immediate(type_class.id()));
-      __ j(EQUAL, is_instance_lbl);
-    }
+    __ cmpl(kClassIdReg, Immediate(type_class.id()));
+    __ j(EQUAL, is_instance_lbl);
+    // List is a very common case.
     if (type_class.IsListClass()) {
       GenerateListTypeCheck(kClassIdReg, is_instance_lbl);
     }
@@ -216,11 +214,8 @@
   __ Bind(&compare_classes);
   const Register kClassIdReg = R10;
   __ LoadClassId(kClassIdReg, kInstanceReg);
-  // If type is an interface, we can skip the class equality check.
-  if (!type_class.is_interface()) {
-    __ cmpl(kClassIdReg, Immediate(type_class.id()));
-    __ j(EQUAL, is_instance_lbl);
-  }
+  __ cmpl(kClassIdReg, Immediate(type_class.id()));
+  __ j(EQUAL, is_instance_lbl);
   // Bool interface can be implemented only by core class Bool.
   // (see ClassFinalizer::ResolveInterfaces for list of restricted interfaces).
   if (type.IsBoolType()) {
@@ -392,6 +387,20 @@
     // type error. A null value is handled prior to executing this inline code.
     return SubtypeTestCache::null();
   }
+  if (TypeCheckAsClassEquality(type)) {
+    const intptr_t type_cid = Class::Handle(type.type_class()).id();
+    const Register kInstanceReg = RAX;
+    __ testq(kInstanceReg, Immediate(kSmiTagMask));
+    if (type_cid == kSmiCid) {
+      __ j(ZERO, is_instance_lbl);
+    } else {
+      __ j(ZERO, is_not_instance_lbl);
+      __ CompareClassId(kInstanceReg, type_cid);
+      __ j(EQUAL, is_instance_lbl);
+    }
+    __ jmp(is_not_instance_lbl);
+    return SubtypeTestCache::null();
+  }
   if (type.IsInstantiated()) {
     const Class& type_class = Class::ZoneHandle(type.type_class());
     // A Smi object cannot be the instance of a parameterized class.
@@ -779,41 +788,32 @@
     // stack.
     __ addq(RSP, Immediate(StackSize() * kWordSize));
   }
-  // The calls immediately below have empty stackmaps because we have just
+  // The call below has an empty stackmap because we have just
   // dropped the spill slots.
   BitmapBuilder* empty_stack_bitmap = new BitmapBuilder();
-  if (function.IsClosureFunction()) {
-    // TODO(regis): Call NoSuchMethod with "call" as name of original function.
-    // We do not use GenerateCallRuntime because of the non-standard (empty)
-    // stackmap used here.
-    __ CallRuntime(kClosureArgumentMismatchRuntimeEntry);
-    AddCurrentDescriptor(PcDescriptors::kOther,
-                         Isolate::kNoDeoptId,
-                         0);  // No token position.
-  } else {
-    // Invoke noSuchMethod function.
-    const int kNumArgsChecked = 1;
-    ICData& ic_data = ICData::ZoneHandle();
-    ic_data = ICData::New(function,
-                          String::Handle(function.name()),
-                          Isolate::kNoDeoptId,
-                          kNumArgsChecked);
-    __ LoadObject(RBX, ic_data);
-    // RBP - 8 : PC marker, allows easy identification of RawInstruction obj.
-    // RBP : points to previous frame pointer.
-    // RBP + 8 : points to return address.
-    // RBP + 16 : address of last argument (arg n-1).
-    // RSP + 16 + 8*(n-1) : address of first argument (arg 0).
-    // RBX : ic-data.
-    // R10 : arguments descriptor array.
-    __ call(&StubCode::CallNoSuchMethodFunctionLabel());
-  }
+
+  // Invoke noSuchMethod function passing the original name of the function.
+  // If the function is a closure function, use "call" as the original name.
+  const String& name = String::Handle(
+      function.IsClosureFunction() ? Symbols::Call() : function.name());
+  const int kNumArgsChecked = 1;
+  const ICData& ic_data = ICData::ZoneHandle(
+      ICData::New(function, name, Isolate::kNoDeoptId, kNumArgsChecked));
+  __ LoadObject(RBX, ic_data);
+  // RBP - 8 : PC marker, allows easy identification of RawInstruction obj.
+  // RBP : points to previous frame pointer.
+  // RBP + 8 : points to return address.
+  // RBP + 16 : address of last argument (arg n-1).
+  // RSP + 16 + 8*(n-1) : address of first argument (arg 0).
+  // RBX : ic-data.
+  // R10 : arguments descriptor array.
+  __ call(&StubCode::CallNoSuchMethodFunctionLabel());
   if (is_optimizing()) {
     stackmap_table_builder_->AddEntry(assembler()->CodeSize(),
                                       empty_stack_bitmap,
                                       0);  // No registers.
   }
-
+  // The noSuchMethod call may return.
   __ LeaveFrame();
   __ ret();
 
@@ -915,11 +915,38 @@
       __ cmpq(RAX, Immediate(Smi::RawValue(num_fixed_params)));
       __ j(EQUAL, &argc_in_range, Assembler::kNearJump);
       if (function.IsClosureFunction()) {
-        // TODO(regis): Call NoSuchMethod with "call" as name of original
-        // function.
-        GenerateCallRuntime(function.token_pos(),
-                            kClosureArgumentMismatchRuntimeEntry,
-                            prologue_locs);
+        if (StackSize() != 0) {
+          // We need to unwind the space we reserved for locals and copied
+          // parameters. The NoSuchMethodFunction stub does not expect to see
+          // that area on the stack.
+          __ addq(RSP, Immediate(StackSize() * kWordSize));
+        }
+        // The call below has an empty stackmap because we have just
+        // dropped the spill slots.
+        BitmapBuilder* empty_stack_bitmap = new BitmapBuilder();
+
+        // Invoke noSuchMethod function passing "call" as the function name.
+        const String& name = String::Handle(Symbols::Call());
+        const int kNumArgsChecked = 1;
+        const ICData& ic_data = ICData::ZoneHandle(
+            ICData::New(function, name, Isolate::kNoDeoptId, kNumArgsChecked));
+        __ LoadObject(RBX, ic_data);
+        // RBP - 8 : PC marker, for easy identification of RawInstruction obj.
+        // RBP : points to previous frame pointer.
+        // RBP + 8 : points to return address.
+        // RBP + 16 : address of last argument (arg n-1).
+        // RSP + 16 + 8*(n-1) : address of first argument (arg 0).
+        // RBX : ic-data.
+        // R10 : arguments descriptor array.
+        __ call(&StubCode::CallNoSuchMethodFunctionLabel());
+        if (is_optimizing()) {
+          stackmap_table_builder_->AddEntry(assembler()->CodeSize(),
+                                            empty_stack_bitmap,
+                                            0);  // No registers.
+        }
+        // The noSuchMethod call may return.
+        __ LeaveFrame();
+        __ ret();
       } else {
         __ Stop("Wrong number of arguments");
       }
diff --git a/runtime/vm/flow_graph_compiler_x64.h b/runtime/vm/flow_graph_compiler_x64.h
index 8d61eda..cb6c742 100644
--- a/runtime/vm/flow_graph_compiler_x64.h
+++ b/runtime/vm/flow_graph_compiler_x64.h
@@ -298,6 +298,9 @@
                                                    Label* is_instance_lbl,
                                                    Label* is_not_instance_lbl);
 
+  // Returns true if checking against this type is a direct class id comparison.
+  bool TypeCheckAsClassEquality(const AbstractType& type);
+
   void GenerateBoolToJump(Register bool_reg, Label* is_true, Label* is_false);
 
   void CopyParameters();
diff --git a/runtime/vm/flow_graph_optimizer.cc b/runtime/vm/flow_graph_optimizer.cc
index 2e5d624..d88659d 100644
--- a/runtime/vm/flow_graph_optimizer.cc
+++ b/runtime/vm/flow_graph_optimizer.cc
@@ -559,11 +559,11 @@
       case kArrayCid:
       case kGrowableObjectArrayCid: {
         const Class& instantiator_class = Class::Handle(target.Owner());
-        intptr_t type_arguments_instance_field_offset =
-            instantiator_class.type_arguments_instance_field_offset();
+        intptr_t type_arguments_field_offset =
+            instantiator_class.type_arguments_field_offset();
         LoadFieldInstr* load_type_args =
             new LoadFieldInstr(array->Copy(),
-                               type_arguments_instance_field_offset,
+                               type_arguments_field_offset,
                                Type::ZoneHandle());  // No type.
         InsertBefore(call, load_type_args, NULL, Definition::kValue);
         instantiator = array->Copy();
@@ -1015,6 +1015,7 @@
   AddCheckClass(call, call->ArgumentAt(0)->value()->Copy());
 
   LoadFieldInstr* load = BuildLoadStringLength(call->ArgumentAt(0)->value());
+  load->set_recognized_kind(MethodRecognizer::kStringBaseLength);
   call->ReplaceWith(load, current_iterator());
   RemovePushArguments(call);
 }
@@ -2776,9 +2777,60 @@
 }
 
 
-static intptr_t NumberLoadExpressions(FlowGraph* graph) {
+static intptr_t ComputeLoadOffsetInWords(Definition* defn) {
+  if (defn->IsLoadIndexed()) {
+    // We are assuming that LoadField is never used to load the first word.
+    return 0;
+  }
+
+  LoadFieldInstr* load_field = defn->AsLoadField();
+  if (load_field != NULL) {
+    const intptr_t idx = load_field->offset_in_bytes() / kWordSize;
+    ASSERT(idx > 0);
+    return idx;
+  }
+
+  UNREACHABLE();
+  return 0;
+}
+
+
+static bool IsInterferingStore(Instruction* instr,
+                               intptr_t* offset_in_words) {
+  if (instr->IsStoreIndexed()) {
+    // We are assuming that LoadField is never used to load the first word.
+    *offset_in_words = 0;
+    return true;
+  }
+
+  StoreInstanceFieldInstr* store_instance_field = instr->AsStoreInstanceField();
+  if (store_instance_field != NULL) {
+    ASSERT(store_instance_field->field().Offset() != 0);
+    *offset_in_words = store_instance_field->field().Offset() / kWordSize;
+    return true;
+  }
+
+  StoreVMFieldInstr* store_vm_field = instr->AsStoreVMField();
+  if (store_vm_field != NULL) {
+    ASSERT(store_vm_field->offset_in_bytes() != 0);
+    *offset_in_words = store_vm_field->offset_in_bytes() / kWordSize;
+    return true;
+  }
+
+  return false;
+}
+
+
+static intptr_t NumberLoadExpressions(
+    FlowGraph* graph,
+    GrowableArray<BitVector*>* kill_by_offs) {
   DirectChainedHashMap<PointerKeyValueTrait<Definition> > map;
   intptr_t expr_id = 0;
+
+  // Loads representing different expression ids will be collected and
+  // used to build per offset kill sets.
+  GrowableArray<Definition*> loads(10);
+
   for (BlockIterator it = graph->reverse_postorder_iterator();
        !it.Done();
        it.Advance()) {
@@ -2794,11 +2846,29 @@
       if (result == NULL) {
         map.Insert(defn);
         defn->set_expr_id(expr_id++);
+        loads.Add(defn);
       } else {
         defn->set_expr_id(result->expr_id());
       }
     }
   }
+
+  // Build per offset kill sets. Any store interferes only with loads from
+  // the same offset.
+  for (intptr_t i = 0; i < loads.length(); i++) {
+    Definition* defn = loads[i];
+
+    const intptr_t offset_in_words = ComputeLoadOffsetInWords(defn);
+    while (kill_by_offs->length() <= offset_in_words) {
+      kill_by_offs->Add(NULL);
+    }
+    if ((*kill_by_offs)[offset_in_words] == NULL) {
+      (*kill_by_offs)[offset_in_words] = new BitVector(expr_id);
+    }
+    (*kill_by_offs)[offset_in_words]->Add(defn->expr_id());
+  }
+
+
   return expr_id;
 }
 
@@ -2806,7 +2876,8 @@
 static void ComputeAvailableLoads(
     FlowGraph* graph,
     intptr_t max_expr_id,
-    const GrowableArray<BitVector*>& avail_in) {
+    const GrowableArray<BitVector*>& avail_in,
+    const GrowableArray<BitVector*>& kill_by_offs) {
   // Initialize gen-, kill-, out-sets.
   intptr_t num_blocks = graph->preorder().length();
   GrowableArray<BitVector*> avail_out(num_blocks);
@@ -2827,15 +2898,29 @@
          !instr_it.Done();
          instr_it.Advance()) {
       Instruction* instr = instr_it.Current();
-      if (instr->HasSideEffect()) {
+
+      intptr_t offset_in_words = 0;
+      if (IsInterferingStore(instr, &offset_in_words)) {
+        if ((offset_in_words < kill_by_offs.length()) &&
+            (kill_by_offs[offset_in_words] != NULL)) {
+          avail_kill[preorder_number]->AddAll(kill_by_offs[offset_in_words]);
+        }
+        ASSERT(instr->IsDefinition() &&
+               !IsLoadEliminationCandidate(instr->AsDefinition()));
+        continue;
+      } else if (instr->HasSideEffect()) {
         avail_kill[preorder_number]->SetAll();
         break;
       }
-      Definition* defn = instr_it.Current()->AsDefinition();
+      Definition* defn = instr->AsDefinition();
       if ((defn == NULL) || !IsLoadEliminationCandidate(defn)) {
         continue;
       }
-      avail_gen[preorder_number]->Add(defn->expr_id());
+
+      const intptr_t expr_id = defn->expr_id();
+      if (!avail_kill[preorder_number]->Contains(expr_id)) {
+        avail_gen[preorder_number]->Add(expr_id);
+      }
     }
     avail_out[preorder_number]->CopyFrom(avail_gen[preorder_number]);
   }
@@ -2887,7 +2972,8 @@
 static bool OptimizeLoads(
     BlockEntryInstr* block,
     GrowableArray<Definition*>* definitions,
-    const GrowableArray<BitVector*>& avail_in) {
+    const GrowableArray<BitVector*>& avail_in,
+    const GrowableArray<BitVector*>& kill_by_offs) {
   // TODO(fschneider): Factor out code shared with the existing CSE pass.
 
   // Delete loads that are killed (not available) at the entry.
@@ -2902,7 +2988,21 @@
   bool changed = false;
   for (ForwardInstructionIterator it(block); !it.Done(); it.Advance()) {
     Instruction* instr = it.Current();
-    if (instr->HasSideEffect()) {
+
+    intptr_t offset_in_words = 0;
+    if (IsInterferingStore(instr, &offset_in_words)) {
+      if ((offset_in_words < kill_by_offs.length()) &&
+          (kill_by_offs[offset_in_words] != NULL)) {
+        for (BitVector::Iterator it(kill_by_offs[offset_in_words]);
+             !it.Done();
+             it.Advance()) {
+          (*definitions)[it.Current()] = NULL;
+        }
+      }
+      ASSERT(instr->IsDefinition() &&
+             !IsLoadEliminationCandidate(instr->AsDefinition()));
+      continue;
+    } else if (instr->HasSideEffect()) {
       // Handle local side effects by clearing current definitions.
       for (intptr_t i = 0; i < definitions->length(); i++) {
         (*definitions)[i] = NULL;
@@ -2937,9 +3037,11 @@
     if (i  < num_children - 1) {
       GrowableArray<Definition*> child_defs(definitions->length());
       child_defs.AddArray(*definitions);
-      changed = OptimizeLoads(child, &child_defs, avail_in) || changed;
+      changed = OptimizeLoads(child, &child_defs, avail_in, kill_by_offs) ||
+                changed;
     } else {
-      changed = OptimizeLoads(child, definitions, avail_in) || changed;
+      changed = OptimizeLoads(child, definitions, avail_in, kill_by_offs) ||
+                changed;
     }
   }
   return changed;
@@ -2949,7 +3051,8 @@
 bool DominatorBasedCSE::Optimize(FlowGraph* graph) {
   bool changed = false;
   if (FLAG_load_cse) {
-    intptr_t max_expr_id = NumberLoadExpressions(graph);
+    GrowableArray<BitVector*> kill_by_offs(10);
+    intptr_t max_expr_id = NumberLoadExpressions(graph, &kill_by_offs);
     if (max_expr_id > 0) {
       intptr_t num_blocks = graph->preorder().length();
       GrowableArray<BitVector*> avail_in(num_blocks);
@@ -2957,13 +3060,14 @@
         avail_in.Add(new BitVector(max_expr_id));
       }
 
-      ComputeAvailableLoads(graph, max_expr_id, avail_in);
+      ComputeAvailableLoads(graph, max_expr_id, avail_in, kill_by_offs);
 
       GrowableArray<Definition*> definitions(max_expr_id);
       for (intptr_t j = 0; j < max_expr_id ; j++) {
         definitions.Add(NULL);
       }
-      changed = OptimizeLoads(graph->graph_entry(), &definitions, avail_in);
+      changed = OptimizeLoads(
+          graph->graph_entry(), &definitions, avail_in, kill_by_offs);
     }
   }
 
@@ -3438,7 +3542,20 @@
 
 void ConstantPropagator::VisitInstantiateTypeArguments(
     InstantiateTypeArgumentsInstr* instr) {
-  SetValue(instr, non_constant_);
+  const Object& object =
+      instr->instantiator()->definition()->constant_value();
+  if (IsNonConstant(object)) {
+    SetValue(instr, non_constant_);
+  } else if (IsConstant(object)) {
+    if (!object.IsNull() &&
+        object.IsTypeArguments() &&
+        (TypeArguments::Cast(object).Length() ==
+         instr->type_arguments().Length())) {
+      SetValue(instr, object);
+    } else {
+      SetValue(instr, non_constant_);
+    }
+  }
 }
 
 
@@ -3713,7 +3830,8 @@
       // TODO(kmillikin): Extend this to handle booleans, other number
       // types, etc.
       if ((defn != NULL) &&
-          defn->constant_value().IsSmi() &&
+          (defn->constant_value().IsSmi() ||
+           defn->constant_value().IsTypeArguments()) &&
           !defn->IsConstant() &&
           !defn->IsPushArgument() &&
           !defn->IsStoreIndexed() &&
diff --git a/runtime/vm/heap.cc b/runtime/vm/heap.cc
index 84f55df..003e5ae 100644
--- a/runtime/vm/heap.cc
+++ b/runtime/vm/heap.cc
@@ -6,7 +6,6 @@
 
 #include "platform/assert.h"
 #include "platform/utils.h"
-#include "vm/compiler_stats.h"
 #include "vm/flags.h"
 #include "vm/heap_profiler.h"
 #include "vm/isolate.h"
diff --git a/runtime/vm/heap_profiler.cc b/runtime/vm/heap_profiler.cc
index f218a81..8f98764 100644
--- a/runtime/vm/heap_profiler.cc
+++ b/runtime/vm/heap_profiler.cc
@@ -513,7 +513,7 @@
   }
   // instance size (in bytes)
   // TODO(cshapiro): properly account for variable sized objects
-  sub.Write32(raw_class->ptr()->instance_size_);
+  sub.Write32(raw_class->ptr()->instance_size_in_words_);
   // size of constant pool and number of records that follow:
   sub.Write16(0);
   // Number of static fields
diff --git a/runtime/vm/intermediate_language.cc b/runtime/vm/intermediate_language.cc
index 5fec3ad..35802a3 100644
--- a/runtime/vm/intermediate_language.cc
+++ b/runtime/vm/intermediate_language.cc
@@ -2460,10 +2460,33 @@
                        RangeBoundary::FromConstant(Array::kMaxElements));
     return;
   }
+  if ((range_ == NULL) &&
+      (recognized_kind() == MethodRecognizer::kStringBaseLength)) {
+    range_ = new Range(RangeBoundary::FromConstant(0),
+                       RangeBoundary::FromConstant(String::kMaxElements));
+    return;
+  }
   Definition::InferRange();
 }
 
 
+
+void StringCharCodeAtInstr::InferRange() {
+  switch (class_id_) {
+    case kOneByteStringCid:
+      range_ = new Range(RangeBoundary::FromConstant(0),
+                         RangeBoundary::FromConstant(0xFF));
+      break;
+    case kTwoByteStringCid:
+      range_ = new Range(RangeBoundary::FromConstant(0),
+                         RangeBoundary::FromConstant(0xFFFF));
+      break;
+    default:
+      UNIMPLEMENTED();
+  }
+}
+
+
 void LoadIndexedInstr::InferRange() {
   switch (class_id()) {
     case kExternalUint8ArrayCid:
diff --git a/runtime/vm/intermediate_language.h b/runtime/vm/intermediate_language.h
index a6e3452..cce4f64 100644
--- a/runtime/vm/intermediate_language.h
+++ b/runtime/vm/intermediate_language.h
@@ -38,10 +38,10 @@
   V(_GrowableObjectArray, get:length, GrowableArrayLength, 725548050)          \
   V(_GrowableObjectArray, get:capacity, GrowableArrayCapacity, 725548050)      \
   V(_StringBase, get:length, StringBaseLength, 320803993)                      \
-  V(_StringBase, get:isEmpty, StringBaseIsEmpty, 1065961093)                   \
+  V(_StringBase, get:isEmpty, StringBaseIsEmpty, 583130725)                    \
   V(_StringBase, charCodeAt, StringBaseCharCodeAt, 984449525)                  \
   V(_StringBase, [], StringBaseCharAt, 1062366987)                             \
-  V(_IntegerImplementation, toDouble, IntegerToDouble, 1396338041)             \
+  V(_IntegerImplementation, toDouble, IntegerToDouble, 1252792570)             \
   V(_Double, toInt, DoubleToInteger, 362666636)                                \
   V(::, sqrt, MathSqrt, 2232519)                                               \
 
@@ -2694,6 +2694,8 @@
 
   virtual bool AffectedBySideEffect() const { return true; }
 
+  virtual void InferRange();
+
  private:
   const intptr_t class_id_;
 
diff --git a/runtime/vm/intrinsifier.h b/runtime/vm/intrinsifier.h
index af4f8d4..ff07cc1 100644
--- a/runtime/vm/intrinsifier.h
+++ b/runtime/vm/intrinsifier.h
@@ -17,47 +17,47 @@
 // build and run to get the correct fingerprint from the mismatch error.
 #define INTRINSIC_LIST(V)                                                      \
   V(_IntegerImplementation, _addFromInteger, Integer_addFromInteger, 726019207)\
-  V(_IntegerImplementation, +, Integer_add, 13708438)                          \
+  V(_IntegerImplementation, +, Integer_add, 1821133110)                        \
   V(_IntegerImplementation, _subFromInteger, Integer_subFromInteger, 726019207)\
-  V(_IntegerImplementation, -, Integer_sub, 284482664)                         \
+  V(_IntegerImplementation, -, Integer_sub, 2091907336)                        \
   V(_IntegerImplementation, _mulFromInteger, Integer_mulFromInteger, 726019207)\
-  V(_IntegerImplementation, *, Integer_mul, 486761895)                         \
-  V(_IntegerImplementation, %, Integer_modulo, 1370017357)                     \
-  V(_IntegerImplementation, ~/, Integer_truncDivide, 450435650)                \
-  V(_IntegerImplementation, unary-, Integer_negate, 1734168384)                \
+  V(_IntegerImplementation, *, Integer_mul, 146702919)                         \
+  V(_IntegerImplementation, %, Integer_modulo, 578878541)                      \
+  V(_IntegerImplementation, ~/, Integer_truncDivide, 1806780482)               \
+  V(_IntegerImplementation, unary-, Integer_negate, 1705538272)                \
   V(_IntegerImplementation, _bitAndFromInteger,                                \
     Integer_bitAndFromInteger, 726019207)                                      \
-  V(_IntegerImplementation, &, Integer_bitAnd, 1267520437)                     \
+  V(_IntegerImplementation, &, Integer_bitAnd, 927461461)                      \
   V(_IntegerImplementation, _bitOrFromInteger,                                 \
     Integer_bitOrFromInteger, 726019207)                                       \
-  V(_IntegerImplementation, |, Integer_bitOr, 249432836)                       \
+  V(_IntegerImplementation, |, Integer_bitOr, 2056857508)                      \
   V(_IntegerImplementation, _bitXorFromInteger,                                \
     Integer_bitXorFromInteger, 726019207)                                      \
-  V(_IntegerImplementation, ^, Integer_bitXor, 1177061571)                     \
+  V(_IntegerImplementation, ^, Integer_bitXor, 837002595)                      \
   V(_IntegerImplementation,                                                    \
     _greaterThanFromInteger,                                                   \
     Integer_greaterThanFromInt, 79222670)                                      \
-  V(_IntegerImplementation, >, Integer_greaterThan, 319553701)                 \
-  V(_IntegerImplementation, ==, Integer_equal, 1163202222)                     \
+  V(_IntegerImplementation, >, Integer_greaterThan, 2126978373)                \
+  V(_IntegerImplementation, ==, Integer_equal, 507939054)                      \
   V(_IntegerImplementation, _equalToInteger, Integer_equalToInteger, 79222670) \
-  V(_IntegerImplementation, <, Integer_lessThan, 1306209983)                   \
-  V(_IntegerImplementation, <=, Integer_lessEqualThan, 458673122)              \
-  V(_IntegerImplementation, >=, Integer_greaterEqualThan, 459596643)           \
-  V(_IntegerImplementation, <<, Integer_shl, 1586407617)                       \
-  V(_IntegerImplementation, >>, Integer_sar, 130211175)                        \
+  V(_IntegerImplementation, <, Integer_lessThan, 1277579871)                   \
+  V(_IntegerImplementation, <=, Integer_lessEqualThan, 806519877)              \
+  V(_IntegerImplementation, >=, Integer_greaterEqualThan, 807443398)           \
+  V(_IntegerImplementation, <<, Integer_shl, 1246348641)                       \
+  V(_IntegerImplementation, >>, Integer_sar, 1937635847)                       \
   V(_Smi, ~, Smi_bitNegate, 882629793)                                         \
-  V(_Double, >, Double_greaterThan, 1821658410)                                \
-  V(_Double, >=, Double_greaterEqualThan, 1317118885)                          \
-  V(_Double, <, Double_lessThan, 177557761)                                    \
-  V(_Double, <=, Double_lessEqualThan, 1316195364)                             \
-  V(_Double, ==, Double_equal, 1896071176)                                     \
-  V(_Double, +, Double_add, 1137022234)                                        \
-  V(_Double, -, Double_sub, 1425469940)                                        \
-  V(_Double, *, Double_mul, 1865672692)                                        \
-  V(_Double, /, Double_div, 1832148629)                                        \
+  V(_Double, >, Double_greaterThan, 1471126121)                                \
+  V(_Double, >=, Double_greaterEqualThan, 1664965640)                          \
+  V(_Double, <, Double_lessThan, 148927649)                                    \
+  V(_Double, <=, Double_lessEqualThan, 1664042119)                             \
+  V(_Double, ==, Double_equal, 900686217)                                      \
+  V(_Double, +, Double_add, 786489945)                                         \
+  V(_Double, -, Double_sub, 1074937651)                                        \
+  V(_Double, *, Double_mul, 1515140403)                                        \
+  V(_Double, /, Double_div, 1481616340)                                        \
   V(_Double, get:isNaN, Double_getIsNaN, 54462366)                             \
   V(_Double, get:isNegative, Double_getIsNegative, 54462366)                   \
-  V(_Double, _mulFromInteger, Double_mulFromInteger, 795128)                   \
+  V(_Double, _mulFromInteger, Double_mulFromInteger, 1668662807)               \
   V(_Double, .fromInteger, Double_fromInteger, 842078193)                      \
   V(_Double, toInt, Double_toInt, 362666636)                                   \
   V(_ObjectArray, ., ObjectArray_Allocate, 577949617)                          \
@@ -71,36 +71,36 @@
   V(_GrowableObjectArray, []=, GrowableArray_setIndexed, 1048007636)           \
   V(_GrowableObjectArray, _setLength, GrowableArray_setLength, 796709584)      \
   V(_GrowableObjectArray, _setData, GrowableArray_setData, 477312179)          \
-  V(_GrowableObjectArray, add, GrowableArray_add, 1776744235)                  \
+  V(_GrowableObjectArray, add, GrowableArray_add, 455936651)                   \
   V(_ImmutableArray, [], ImmutableArray_getIndexed, 486821199)                 \
   V(_ImmutableArray, get:length, ImmutableArray_getLength, 433698233)          \
   V(::, sqrt, Math_sqrt, 2232519)                                              \
   V(::, sin, Math_sin, 837187616)                                              \
   V(::, cos, Math_cos, 548880317)                                              \
-  V(Object, ==, Object_equal, 1512068535)                                      \
+  V(Object, ==, Object_equal, 1511145014)                                      \
   V(_FixedSizeArrayIterator, get:hasNext,                                      \
-    FixedSizeArrayIterator_getHasNext, 1847855366)                             \
-  V(_FixedSizeArrayIterator, next, FixedSizeArrayIterator_next, 1739352783)    \
+    FixedSizeArrayIterator_getHasNext, 1819226215)                             \
+  V(_FixedSizeArrayIterator, next, FixedSizeArrayIterator_next, 1147008464)    \
   V(_StringBase, get:hashCode, String_getHashCode, 320803993)                  \
-  V(_StringBase, get:isEmpty, String_getIsEmpty, 1065961093)                   \
+  V(_StringBase, get:isEmpty, String_getIsEmpty, 583130725)                    \
   V(_StringBase, get:length, String_getLength, 320803993)                      \
   V(_StringBase, charCodeAt, String_charCodeAt, 984449525)                     \
-  V(_ByteArrayBase, get:length, ByteArrayBase_getLength, 1856909152)           \
-  V(_Int8Array, [], Int8Array_getIndexed, 239810357)                           \
+  V(_ByteArrayBase, get:length, ByteArrayBase_getLength, 1828280001)           \
+  V(_Int8Array, [], Int8Array_getIndexed, 1499790324)                          \
   V(_Int8Array, []=, Int8Array_setIndexed, 1469038436)                         \
-  V(_Uint8Array, [], Uint8Array_getIndexed, 1635923899)                        \
+  V(_Uint8Array, [], Uint8Array_getIndexed, 748420218)                         \
   V(_Uint8Array, []=, Uint8Array_setIndexed, 1619321522)                       \
-  V(_Int16Array, [], Int16Array_getIndexed, 2090761657)                        \
-  V(_Uint16Array, [], Uint16Array_getIndexed, 289929708)                       \
-  V(_Int32Array, [], Int32Array_getIndexed, 589442411)                         \
-  V(_Uint32Array, [], Uint32Array_getIndexed, 1474116947)                      \
-  V(_Int64Array, [], Int64Array_getIndexed, 1506836119)                        \
-  V(_Uint64Array, [], Uint64Array_getIndexed, 1856952148)                      \
-  V(_Float32Array, [], Float32Array_getIndexed, 1167607283)                    \
+  V(_Int16Array, [], Int16Array_getIndexed, 1203257976)                        \
+  V(_Uint16Array, [], Uint16Array_getIndexed, 1549909675)                      \
+  V(_Int32Array, [], Int32Array_getIndexed, 1849422378)                        \
+  V(_Uint32Array, [], Uint32Array_getIndexed, 586613266)                       \
+  V(_Int64Array, [], Int64Array_getIndexed, 619332438)                         \
+  V(_Uint64Array, [], Uint64Array_getIndexed, 969448467)                       \
+  V(_Float32Array, [], Float32Array_getIndexed, 280103602)                     \
   V(_Float32Array, []=, Float32Array_setIndexed, 1270729544)                   \
-  V(_Float64Array, [], Float64Array_getIndexed, 1363897161)                    \
+  V(_Float64Array, [], Float64Array_getIndexed, 476393480)                     \
   V(_Float64Array, []=, Float64Array_setIndexed, 283625119)                    \
-  V(_ExternalUint8Array, [], ExternalUint8Array_getIndexed, 632699940)         \
+  V(_ExternalUint8Array, [], ExternalUint8Array_getIndexed, 1892679907)        \
 
 // Forward declarations.
 class Assembler;
diff --git a/runtime/vm/intrinsifier_ia32.cc b/runtime/vm/intrinsifier_ia32.cc
index 5675214..ba42141 100644
--- a/runtime/vm/intrinsifier_ia32.cc
+++ b/runtime/vm/intrinsifier_ia32.cc
@@ -181,7 +181,7 @@
   ASSERT(!cls.IsNull());
   ASSERT(cls.HasTypeArguments());
   ASSERT(cls.NumTypeArguments() == 1);
-  const intptr_t field_offset = cls.type_arguments_instance_field_offset();
+  const intptr_t field_offset = cls.type_arguments_field_offset();
   ASSERT(field_offset != Class::kNoTypeArguments);
   return field_offset;
 }
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index 6b9178d..e247881 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -110,8 +110,16 @@
         DartLibraryCalls::HandleMessage(
             message->dest_port(), message->reply_port(), msg));
     delete message;
-    if (result.IsError()) {
-      isolate_->object_store()->set_sticky_error(Error::Cast(result));
+    if (result.IsError() || result.IsUnhandledException()) {
+      if (result.IsError()) {
+        isolate_->object_store()->set_sticky_error(Error::Cast(result));
+      }
+      if (Isolate::UnhandledExceptionCallback() != NULL) {
+        Dart_EnterScope();
+        Dart_Handle error = Api::NewHandle(isolate_, result.raw());
+        (Isolate::UnhandledExceptionCallback())(error);
+        Dart_ExitScope();
+      }
       return false;
     }
     ASSERT(result.IsNull());
@@ -446,6 +454,8 @@
 
 Dart_IsolateCreateCallback Isolate::create_callback_ = NULL;
 Dart_IsolateInterruptCallback Isolate::interrupt_callback_ = NULL;
+Dart_IsolateUnhandledExceptionCallback
+    Isolate::unhandled_exception_callback_ = NULL;
 Dart_IsolateShutdownCallback Isolate::shutdown_callback_ = NULL;
 
 
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index 5849640..6be2193 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -253,6 +253,14 @@
     return interrupt_callback_;
   }
 
+  static void SetUnhandledExceptionCallback(
+      Dart_IsolateUnhandledExceptionCallback cb) {
+    unhandled_exception_callback_ = cb;
+  }
+  static Dart_IsolateUnhandledExceptionCallback UnhandledExceptionCallback() {
+    return unhandled_exception_callback_;
+  }
+
   static void SetShutdownCallback(Dart_IsolateShutdownCallback cb) {
     shutdown_callback_ = cb;
   }
@@ -350,6 +358,7 @@
 
   static Dart_IsolateCreateCallback create_callback_;
   static Dart_IsolateInterruptCallback interrupt_callback_;
+  static Dart_IsolateUnhandledExceptionCallback unhandled_exception_callback_;
   static Dart_IsolateShutdownCallback shutdown_callback_;
 
   DISALLOW_COPY_AND_ASSIGN(Isolate);
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index b8088ff..fb4157a 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -11,6 +11,7 @@
 #include "vm/bootstrap.h"
 #include "vm/class_finalizer.h"
 #include "vm/code_generator.h"
+#include "vm/code_observers.h"
 #include "vm/code_patcher.h"
 #include "vm/compiler.h"
 #include "vm/compiler_stats.h"
@@ -18,7 +19,6 @@
 #include "vm/dart_api_state.h"
 #include "vm/dart_entry.h"
 #include "vm/datastream.h"
-#include "vm/debuginfo.h"
 #include "vm/deopt_instructions.h"
 #include "vm/double_conversion.h"
 #include "vm/exceptions.h"
@@ -35,8 +35,6 @@
 
 namespace dart {
 
-DEFINE_FLAG(bool, generate_gdb_symbols, false,
-    "Generate symbols of generated dart functions for debugging with GDB");
 DEFINE_FLAG(bool, show_internal_names, false,
     "Show names of internal classes (e.g. \"OneByteString\") in error messages "
     "instead of showing the corresponding interface names (e.g. \"String\")");
@@ -273,7 +271,7 @@
     cls.set_id(Class::kClassId);
     cls.raw_ptr()->state_bits_ = 0;
     cls.set_is_finalized();
-    cls.raw_ptr()->type_arguments_instance_field_offset_ =
+    cls.raw_ptr()->type_arguments_field_offset_in_words_ =
         Class::kNoTypeArguments;
     cls.raw_ptr()->num_native_fields_ = 0;
     cls.InitEmptyFields();
@@ -304,7 +302,7 @@
 
   cls = Class::New<Instance>(kDynamicCid);
   cls.set_is_finalized();
-  cls.set_is_interface();
+  cls.set_is_abstract();
   dynamic_class_ = cls.raw();
 
   // Allocate the remaining VM internal classes.
@@ -557,13 +555,13 @@
   // Since they are pre-finalized, CalculateFieldOffsets() is not called, so we
   // need to set the offset of their type_arguments_ field, which is explicitly
   // declared in RawArray.
-  cls.set_type_arguments_instance_field_offset(Array::type_arguments_offset());
+  cls.set_type_arguments_field_offset(Array::type_arguments_offset());
 
   // Set up the growable object array class (Has to be done after the array
   // class is setup as one of its field is an array object).
   cls = Class::New<GrowableObjectArray>();
   object_store->set_growable_object_array_class(cls);
-  cls.set_type_arguments_instance_field_offset(
+  cls.set_type_arguments_field_offset(
       GrowableObjectArray::type_arguments_offset());
 
   // canonical_type_arguments_ are NULL terminated.
@@ -634,7 +632,7 @@
 
   cls = Class::New<ImmutableArray>();
   object_store->set_immutable_array_class(cls);
-  cls.set_type_arguments_instance_field_offset(Array::type_arguments_offset());
+  cls.set_type_arguments_field_offset(Array::type_arguments_offset());
   ASSERT(object_store->immutable_array_class() != object_store->array_class());
   name = Symbols::ImmutableArray();
   RegisterPrivateClass(cls, name, core_lib);
@@ -1371,7 +1369,7 @@
   // VM backed classes are almost ready: run checks and resolve class
   // references, but do not recompute size.
   result.set_is_prefinalized();
-  result.raw_ptr()->type_arguments_instance_field_offset_ = kNoTypeArguments;
+  result.raw_ptr()->type_arguments_field_offset_in_words_ = kNoTypeArguments;
   result.raw_ptr()->num_native_fields_ = 0;
   result.raw_ptr()->token_pos_ = Scanner::kDummyTokenIndex;
   result.InitEmptyFields();
@@ -1525,7 +1523,7 @@
 bool Class::HasTypeArguments() const {
   if (!IsSignatureClass() && (is_finalized() || is_prefinalized())) {
     // More efficient than calling NumTypeArguments().
-    return type_arguments_instance_field_offset() != kNoTypeArguments;
+    return type_arguments_field_offset() != kNoTypeArguments;
   } else {
     // No need to check NumTypeArguments() if class has type parameters.
     return (NumTypeParameters() > 0) || (NumTypeArguments() > 0);
@@ -1547,40 +1545,6 @@
 }
 
 
-bool Class::HasFactoryClass() const {
-  const Object& factory_class = Object::Handle(raw_ptr()->factory_class_);
-  return !factory_class.IsNull();
-}
-
-
-bool Class::HasResolvedFactoryClass() const {
-  ASSERT(HasFactoryClass());
-  const Object& factory_class = Object::Handle(raw_ptr()->factory_class_);
-  return factory_class.IsClass();
-}
-
-
-RawClass* Class::FactoryClass() const {
-  ASSERT(HasResolvedFactoryClass());
-  Class& type_class = Class::Handle();
-  type_class ^= raw_ptr()->factory_class_;
-  return type_class.raw();
-}
-
-
-RawUnresolvedClass* Class::UnresolvedFactoryClass() const {
-  ASSERT(!HasResolvedFactoryClass());
-  UnresolvedClass& unresolved_factory_class = UnresolvedClass::Handle();
-  unresolved_factory_class ^= raw_ptr()->factory_class_;
-  return unresolved_factory_class.raw();
-}
-
-
-void Class::set_factory_class(const Object& value) const {
-  StorePointer(&raw_ptr()->factory_class_, value.raw());
-}
-
-
 // Return a TypeParameter if the type_name is a type parameter of this class.
 // Return null otherwise.
 RawTypeParameter* Class::LookupTypeParameter(const String& type_name,
@@ -1624,7 +1588,7 @@
   if (super.IsNull()) {
     offset = sizeof(RawObject);
   } else {
-    type_args_field_offset = super.type_arguments_instance_field_offset();
+    type_args_field_offset = super.type_arguments_field_offset();
     offset = super.next_field_offset();
     ASSERT(offset > 0);
     // We should never call CalculateFieldOffsets for native wrapper
@@ -1642,7 +1606,7 @@
       offset += kWordSize;
     }
   }
-  set_type_arguments_instance_field_offset(type_args_field_offset);
+  set_type_arguments_field_offset(type_args_field_offset);
   ASSERT(offset != 0);
   Field& field = Field::Handle();
   intptr_t len = flds.Length();
@@ -1791,7 +1755,7 @@
   result.set_next_field_offset(FakeInstance::InstanceSize());
   result.set_id(index);
   result.raw_ptr()->state_bits_ = 0;
-  result.raw_ptr()->type_arguments_instance_field_offset_ = kNoTypeArguments;
+  result.raw_ptr()->type_arguments_field_offset_in_words_ = kNoTypeArguments;
   result.raw_ptr()->num_native_fields_ = 0;
   result.raw_ptr()->token_pos_ = Scanner::kDummyTokenIndex;
   result.InitEmptyFields();
@@ -1820,15 +1784,6 @@
 }
 
 
-RawClass* Class::NewInterface(const String& name,
-                              const Script& script,
-                              intptr_t token_pos) {
-  Class& result = Class::Handle(New<Instance>(name, script, token_pos));
-  result.set_is_interface();
-  return result.raw();
-}
-
-
 RawClass* Class::NewSignatureClass(const String& name,
                                    const Function& signature_function,
                                    const Script& script) {
@@ -1856,7 +1811,7 @@
   result.set_type_parameters(type_parameters);
   result.SetFields(empty_array);
   result.SetFunctions(empty_array);
-  result.set_type_arguments_instance_field_offset(
+  result.set_type_arguments_field_offset(
       Closure::type_arguments_offset());
   // Implements interface "Function".
   const Type& function_type = Type::Handle(Type::Function());
@@ -1951,10 +1906,11 @@
 }
 
 
-void Class::set_is_interface() const {
-  set_state_bits(InterfaceBit::update(true, raw_ptr()->state_bits_));
+void Class::set_is_implemented() const {
+  set_state_bits(ImplementedBit::update(true, raw_ptr()->state_bits_));
 }
 
+
 void Class::set_is_abstract() const {
   set_state_bits(AbstractBit::update(true, raw_ptr()->state_bits_));
 }
@@ -2080,6 +2036,11 @@
     ASSERT(test_kind == kIsMoreSpecificThan);
     return true;
   }
+  // Check for ObjectType. Any type that is not NullType or DynamicType (already
+  // checked above), is more specific than ObjectType.
+  if (other.IsObjectClass()) {
+    return true;
+  }
   // Check for reflexivity.
   if (raw() == other.raw()) {
     const intptr_t len = NumTypeArguments();
@@ -2102,8 +2063,7 @@
                                    len,
                                    malformed_error);
   }
-  // TODO(regis): Check for interface type S implementing method call() of
-  // function type T.
+  // TODO(regis): Check if type S has a call() method of function type T.
   // Check for two function types.
   if (IsSignatureClass() && other.IsSignatureClass()) {
     const Function& fun = Function::Handle(signature_function());
@@ -2114,9 +2074,8 @@
                         other_type_arguments,
                         malformed_error);
   }
-  // Check for 'direct super type' in the case of an interface
-  // (i.e. other.is_interface()) or implicit interface (i.e.
-  // !other.is_interface()) and check for transitivity at the same time.
+  // Check for 'direct super type' specified in the implements clause
+  // and check for transitivity at the same time.
   Array& interfaces = Array::Handle(this->interfaces());
   AbstractType& interface = AbstractType::Handle();
   Class& interface_class = Class::Handle();
@@ -2158,15 +2117,6 @@
       return true;
     }
   }
-  // Check the interface case.
-  if (is_interface()) {
-    // We already checked the case where 'other' is an interface. Now, 'this',
-    // an interface, cannot be more specific than a class, except class Object,
-    // because although Object is not considered an interface by the vm, it is
-    // one. In other words, all classes implementing this interface also extend
-    // class Object. An interface is also more specific than the DynamicType.
-    return (other.IsDynamicClass() || other.IsObjectClass());
-  }
   const Class& super_class = Class::Handle(SuperClass());
   if (super_class.IsNull()) {
     return false;
@@ -2388,8 +2338,7 @@
 
 
 const char* Class::ToCString() const {
-  const char* format = is_interface()
-      ? "%s Interface: %s" : "%s Class: %s";
+  const char* format = "%s Class: %s";
   const Library& lib = Library::Handle(library());
   const char* library_name = lib.IsNull() ? "" : lib.ToCString();
   const char* class_name = String::Handle(Name()).ToCString();
@@ -2454,11 +2403,6 @@
 }
 
 
-void UnresolvedClass::set_factory_signature_class(const Class& value) const {
-  StorePointer(&raw_ptr()->factory_signature_class_, value.raw());
-}
-
-
 RawString* UnresolvedClass::Name() const {
   if (library_prefix() != LibraryPrefix::null()) {
     const LibraryPrefix& lib_prefix = LibraryPrefix::Handle(library_prefix());
@@ -2596,34 +2540,6 @@
 }
 
 
-bool AbstractTypeArguments::AreIdentical(
-    const AbstractTypeArguments& arguments,
-    const AbstractTypeArguments& other_arguments,
-    bool check_type_parameter_bounds) {
-  if (arguments.raw() == other_arguments.raw()) {
-    return true;
-  }
-  if (arguments.IsNull() || other_arguments.IsNull()) {
-    return false;
-  }
-  intptr_t num_types = arguments.Length();
-  if (num_types != other_arguments.Length()) {
-    return false;
-  }
-  AbstractType& type = AbstractType::Handle();
-  AbstractType& other_type = AbstractType::Handle();
-  for (intptr_t i = 0; i < num_types; i++) {
-    type = arguments.TypeAt(i);
-    ASSERT(!type.IsNull());
-    other_type = other_arguments.TypeAt(i);
-    if (!type.IsIdentical(other_type, check_type_parameter_bounds)) {
-      return false;
-    }
-  }
-  return true;
-}
-
-
 RawAbstractTypeArguments* AbstractTypeArguments::InstantiateFrom(
     const AbstractTypeArguments& instantiator_type_arguments) const {
   // AbstractTypeArguments is an abstract class.
@@ -4214,7 +4130,7 @@
 
 bool Function::CheckSourceFingerprint(intptr_t fp) const {
   if (SourceFingerprint() != fp) {
-    OS::Print("FP mismatch while recogbnizing method %s:"
+    OS::Print("FP mismatch while recognizing method %s:"
       " expecting %"Pd" found %d\n",
       ToFullyQualifiedCString(),
       fp,
@@ -4497,7 +4413,7 @@
   result.set_kind(kind);
   result.set_literal(literal);
   if (kind == Token::kINTEGER) {
-    const Integer& value = Integer::Handle(Integer::New(literal, Heap::kOld));
+    const Integer& value = Integer::Handle(Integer::NewCanonical(literal));
     ASSERT(value.IsSmi() || value.IsOld());
     result.set_value(value);
   } else if (kind == Token::kDOUBLE) {
@@ -6392,17 +6308,14 @@
     ClassDictionaryIterator it(lib);
     while (it.HasNext()) {
       cls ^= it.GetNextClass();
-      if (!cls.is_interface()) {
-        error = Compiler::CompileAllFunctions(cls);
-        if (!error.IsNull()) {
-          return error.raw();
-        }
+      error = Compiler::CompileAllFunctions(cls);
+      if (!error.IsNull()) {
+        return error.raw();
       }
     }
     Array& anon_classes = Array::Handle(lib.raw_ptr()->anonymous_classes_);
     for (int i = 0; i < lib.raw_ptr()->num_anonymous_; i++) {
       cls ^= anon_classes.At(i);
-      ASSERT(!cls.is_interface());
       error = Compiler::CompileAllFunctions(cls);
       if (!error.IsNull()) {
         return error.raw();
@@ -7132,46 +7045,12 @@
   MemoryRegion region(reinterpret_cast<void*>(instrs.EntryPoint()),
                       instrs.size());
   assembler->FinalizeInstructions(region);
-  Dart_FileWriterFunction perf_events_writer = Dart::perf_events_writer();
-  if (perf_events_writer != NULL) {
-    const char* format = "%"Px" %"Px" %s%s\n";
-    uword addr = instrs.EntryPoint();
-    uword size = instrs.size();
-    const char* marker = optimized ? "*" : "";
-    intptr_t len = OS::SNPrint(NULL, 0, format, addr, size, marker, name);
-    char* buffer = Isolate::Current()->current_zone()->Alloc<char>(len + 1);
-    OS::SNPrint(buffer, len + 1, format, addr, size, marker, name);
-    (*perf_events_writer)(buffer, len);
-  }
-  DebugInfo* pprof_symbol_generator = Dart::pprof_symbol_generator();
-  if (pprof_symbol_generator != NULL) {
-    ASSERT(strlen(name) != 0);
-    pprof_symbol_generator->AddCode(instrs.EntryPoint(), instrs.size());
-    pprof_symbol_generator->AddCodeRegion(name,
-                                          instrs.EntryPoint(),
-                                          instrs.size());
-  }
-  if (FLAG_generate_gdb_symbols) {
-    ASSERT(strlen(name) != 0);
-    intptr_t prolog_offset = assembler->prolog_offset();
-    if (prolog_offset > 0) {
-      // In order to ensure that gdb sees the first instruction of a function
-      // as the prolog sequence we register two symbols for the cases when
-      // the prolog sequence is not the first instruction:
-      // <name>_entry is used for code preceding the prolog sequence.
-      // <name> for rest of the code (first instruction is prolog sequence).
-      const char* kFormat = "%s_%s";
-      intptr_t len = OS::SNPrint(NULL, 0, kFormat, name, "entry");
-      char* pname = Isolate::Current()->current_zone()->Alloc<char>(len + 1);
-      OS::SNPrint(pname, (len + 1), kFormat, name, "entry");
-      DebugInfo::RegisterSection(pname, instrs.EntryPoint(), prolog_offset);
-      DebugInfo::RegisterSection(name,
-                                 (instrs.EntryPoint() + prolog_offset),
-                                 (instrs.size() - prolog_offset));
-    } else {
-      DebugInfo::RegisterSection(name, instrs.EntryPoint(), instrs.size());
-    }
-  }
+
+  CodeObservers::NotifyAll(name,
+                           instrs.EntryPoint(),
+                           assembler->prologue_offset(),
+                           instrs.size(),
+                           optimized);
 
   const ZoneGrowableArray<int>& pointer_offsets =
       assembler->GetPointerOffsets();
@@ -7203,9 +7082,7 @@
                             Assembler* assembler,
                             bool optimized) {
   // Calling ToFullyQualifiedCString is very expensive, try to avoid it.
-  if (FLAG_generate_gdb_symbols ||
-      Dart::perf_events_writer() != NULL ||
-      Dart::pprof_symbol_generator() != NULL) {
+  if (CodeObservers::AreActive()) {
     return FinalizeCode(function.ToFullyQualifiedCString(),
                         assembler,
                         optimized);
@@ -8223,7 +8100,7 @@
 
 RawAbstractTypeArguments* Instance::GetTypeArguments() const {
   const Class& cls = Class::Handle(clazz());
-  intptr_t field_offset = cls.type_arguments_instance_field_offset();
+  intptr_t field_offset = cls.type_arguments_field_offset();
   ASSERT(field_offset != Class::kNoTypeArguments);
   AbstractTypeArguments& type_arguments = AbstractTypeArguments::Handle();
   type_arguments ^= *FieldAddrAtOffset(field_offset);
@@ -8233,7 +8110,7 @@
 
 void Instance::SetTypeArguments(const AbstractTypeArguments& value) const {
   const Class& cls = Class::Handle(clazz());
-  intptr_t field_offset = cls.type_arguments_instance_field_offset();
+  intptr_t field_offset = cls.type_arguments_field_offset();
   ASSERT(field_offset != Class::kNoTypeArguments);
   SetFieldAtOffset(field_offset, value);
 }
@@ -8495,14 +8372,6 @@
 }
 
 
-bool AbstractType::IsIdentical(const AbstractType& other,
-                               bool check_type_parameter_bound) const {
-  // AbstractType is an abstract class.
-  UNREACHABLE();
-  return false;
-}
-
-
 RawAbstractType* AbstractType::InstantiateFrom(
     const AbstractTypeArguments& instantiator_type_arguments) const {
   // AbstractType is an abstract class.
@@ -8926,27 +8795,6 @@
 }
 
 
-bool Type::IsIdentical(const AbstractType& other,
-                       bool check_type_parameter_bounds) const {
-  if (raw() == other.raw()) {
-    return true;
-  }
-  if (!other.IsType()) {
-    return false;
-  }
-  // Both type classes may not be resolved yet.
-  String& name = String::Handle(TypeClassName());
-  String& other_name = String::Handle(Type::Cast(other).TypeClassName());
-  if (!name.Equals(other_name)) {
-    return false;
-  }
-  return AbstractTypeArguments::AreIdentical(
-      AbstractTypeArguments::Handle(arguments()),
-      AbstractTypeArguments::Handle(other.arguments()),
-      false);  // Bounds are only checked at the top level.
-}
-
-
 RawAbstractType* Type::Canonicalize() const {
   ASSERT(IsFinalized());
   if (IsCanonical() || IsMalformed()) {
@@ -9111,38 +8959,6 @@
 }
 
 
-bool TypeParameter::IsIdentical(const AbstractType& other,
-                                bool check_type_parameter_bound) const {
-  if (raw() == other.raw()) {
-    return true;
-  }
-  if (!other.IsTypeParameter()) {
-    return false;
-  }
-  const TypeParameter& other_type_param = TypeParameter::Cast(other);
-  // IsIdentical may be called on type parameters belonging to different
-  // classes, e.g. to an interface and to its default factory class.
-  // Therefore, both type parameters may have different parameterized classes
-  // and different indices. Compare the type parameter names only, and their
-  // bounds if requested.
-  String& type_param_name = String::Handle(name());
-  String& other_type_param_name = String::Handle(other_type_param.name());
-  if (!type_param_name.Equals(other_type_param_name)) {
-    return false;
-  }
-  if (check_type_parameter_bound) {
-    AbstractType& this_bound = AbstractType::Handle(bound());
-    AbstractType& other_bound = AbstractType::Handle(other_type_param.bound());
-    // Bounds are only checked at the top level.
-    const bool check_type_parameter_bounds = false;
-    if (!this_bound.IsIdentical(other_bound, check_type_parameter_bounds)) {
-      return false;
-    }
-  }
-  return true;
-}
-
-
 void TypeParameter::set_parameterized_class(const Class& value) const {
   // Set value may be null.
   StorePointer(&raw_ptr()->parameterized_class_, value.raw());
@@ -9243,8 +9059,7 @@
 
 
 RawInteger* Integer::New(const String& str, Heap::Space space) {
-  // We are not supposed to have integers represented as two byte or
-  // four byte strings.
+  // We are not supposed to have integers represented as two byte strings.
   ASSERT(str.IsOneByteString());
   int64_t value;
   if (!OS::StringToInt64(str.ToCString(), &value)) {
@@ -9257,6 +9072,23 @@
 }
 
 
+RawInteger* Integer::NewCanonical(const String& str) {
+  // We are not supposed to have integers represented as two byte strings.
+  ASSERT(str.IsOneByteString());
+  int64_t value;
+  if (!OS::StringToInt64(str.ToCString(), &value)) {
+    const Bigint& big = Bigint::Handle(Bigint::NewCanonical(str));
+    ASSERT(!BigintOperations::FitsIntoSmi(big));
+    ASSERT(!BigintOperations::FitsIntoMint(big));
+    return big.raw();
+  }
+  if ((value <= Smi::kMaxValue) && (value >= Smi::kMinValue)) {
+    return Smi::New(value);
+  }
+  return Mint::NewCanonical(value);
+}
+
+
 RawInteger* Integer::New(int64_t value, Heap::Space space) {
   if ((value <= Smi::kMaxValue) && (value >= Smi::kMinValue)) {
     return Smi::New(value);
@@ -9858,6 +9690,10 @@
 
   const Bigint& other_bgi = Bigint::Cast(other);
 
+  if (this->IsNegative() != other_bgi.IsNegative()) {
+    return false;
+  }
+
   intptr_t len = this->Length();
   if (len != other_bgi.Length()) {
     return false;
@@ -9880,6 +9716,36 @@
 }
 
 
+RawBigint* Bigint::NewCanonical(const String& str) {
+  const Bigint& value = Bigint::Handle(
+      BigintOperations::NewFromCString(str.ToCString(), Heap::kOld));
+  ASSERT(!BigintOperations::FitsIntoMint(value));
+  const Class& cls =
+      Class::Handle(Isolate::Current()->object_store()->bigint_class());
+  const Array& constants = Array::Handle(cls.constants());
+  const intptr_t constants_len = constants.Length();
+  // Linear search to see whether this value is already present in the
+  // list of canonicalized constants.
+  Bigint& canonical_value = Bigint::Handle();
+  intptr_t index = 0;
+  while (index < constants_len) {
+    canonical_value ^= constants.At(index);
+    if (canonical_value.IsNull()) {
+      break;
+    }
+    if (canonical_value.Equals(value)) {
+      return canonical_value.raw();
+    }
+    index++;
+  }
+  // The value needs to be added to the constants list. Grow the list if
+  // it is full.
+  cls.InsertCanonicalConstant(index, value);
+  value.SetCanonical();
+  return value.raw();
+}
+
+
 double Bigint::AsDoubleValue() const {
   return Double::Handle(BigintOperations::ToDouble(*this)).value();
 }
@@ -9977,8 +9843,9 @@
   ASSERT(len >= 0);
   ASSERT((begin_index + len) <= str.Length());
   StringHasher hasher;
-  for (intptr_t i = 0; i < len; i++) {
-    hasher.Add(str.CharAt(begin_index + i));
+  CodePointIterator it(str, begin_index, len);
+  while (it.Next()) {
+    hasher.Add(it.Current());
   }
   return hasher.Finalize(String::kHashBits);
 }
@@ -10001,7 +9868,12 @@
 
 
 intptr_t String::Hash(const uint16_t* characters, intptr_t len) {
-  return HashImpl(characters, len);
+  StringHasher hasher;
+  intptr_t i = 0;
+  while (i < len) {
+    hasher.Add(Utf16::Next(characters, &i, len));
+  }
+  return hasher.Finalize(String::kHashBits);
 }
 
 
@@ -10215,7 +10087,7 @@
                        Heap::Space space) {
   bool is_one_byte_string = true;
   for (intptr_t i = 0; i < array_len; ++i) {
-    if (utf16_array[i] > 0xFF) {
+    if (!Utf::IsLatin1(utf16_array[i])) {
       is_one_byte_string = false;
       break;
     }
@@ -10233,11 +10105,11 @@
   bool is_one_byte_string = true;
   intptr_t utf16_len = array_len;
   for (intptr_t i = 0; i < array_len; ++i) {
-    if (utf32_array[i] > 0xFF) {
+    if (!Utf::IsLatin1(utf32_array[i])) {
       is_one_byte_string = false;
-    }
-    if (utf32_array[i] > 0xFFFF) {
-      utf16_len += 1;
+      if (Utf::IsSupplementary(utf32_array[i])) {
+        utf16_len += 1;
+      }
     }
   }
   if (is_one_byte_string) {
@@ -10314,7 +10186,7 @@
   if (dst.IsOneByteString()) {
     NoGCScope no_gc;
     for (intptr_t i = 0; i < array_len; ++i) {
-      ASSERT(utf16_array[i] <= 0xFF);
+      ASSERT(Utf::IsLatin1(utf16_array[i]));
       *OneByteString::CharAddr(dst, i + dst_offset) = utf16_array[i];
     }
   } else {
@@ -10469,7 +10341,7 @@
   intptr_t char_size = str.CharSize();
   if (char_size == kTwoByteChar) {
     for (intptr_t i = begin_index; i < begin_index + length; ++i) {
-      if (str.CharAt(i) > 0xFF) {
+      if (!Utf::IsLatin1(str.CharAt(i))) {
         is_one_byte_string = false;
         break;
       }
@@ -10519,15 +10391,16 @@
                                 intptr_t length,
                                 void* peer,
                                 Dart_PeerFinalizer cback) const {
+  NoGCScope no_gc;
   ASSERT(array != NULL);
   intptr_t str_length = this->Length();
   ASSERT(length >= (str_length * this->CharSize()));
   intptr_t class_id = raw()->GetClassId();
   intptr_t used_size = 0;
   intptr_t original_size = 0;
-  uword tags = 0;
-  NoGCScope no_gc;
+  uword tags = raw_ptr()->tags_;
 
+  ASSERT(!IsCanonical());
   if (class_id == kOneByteStringCid) {
     used_size = ExternalOneByteString::InstanceSize();
     original_size = OneByteString::InstanceSize(str_length);
@@ -10604,10 +10477,10 @@
   if (!has_mapping) {
     return str.raw();
   }
-  if (dst_max <= 0xFF) {
+  if (Utf::IsLatin1(dst_max)) {
     return OneByteString::Transform(mapping, str, space);
   }
-  ASSERT(dst_max > 0xFF);
+  ASSERT(Utf::IsBmp(dst_max) || Utf::IsSupplementary(dst_max));
   return TwoByteString::Transform(mapping, str, space);
 }
 
@@ -10626,20 +10499,20 @@
 
 bool String::CodePointIterator::Next() {
   ASSERT(index_ >= -1);
-  ASSERT(index_ < str_.Length());
-  int d = Utf16::Length(ch_);
-  if (index_ == (str_.Length() - d)) {
-    return false;
-  }
-  index_ += d;
-  ch_ = str_.CharAt(index_);
-  if (Utf16::IsLeadSurrogate(ch_) && (index_ != (str_.Length() - 1))) {
-    int32_t ch2 = str_.CharAt(index_ + 1);
-    if (Utf16::IsTrailSurrogate(ch2)) {
-      ch_ = Utf16::Decode(ch_, ch2);
+  intptr_t length = Utf16::Length(ch_);
+  if (index_ < (end_ - length)) {
+    index_ += length;
+    ch_ = str_.CharAt(index_);
+    if (Utf16::IsLeadSurrogate(ch_) && (index_ < (end_ - 1))) {
+      int32_t ch2 = str_.CharAt(index_ + 1);
+      if (Utf16::IsTrailSurrogate(ch2)) {
+        ch_ = Utf16::Decode(ch_, ch2);
+      }
     }
+    return true;
   }
-  return true;
+  index_ = end_;
+  return false;
 }
 
 
@@ -10774,7 +10647,7 @@
                                      Heap::Space space) {
   const String& result =String::Handle(OneByteString::New(len, space));
   for (intptr_t i = 0; i < len; ++i) {
-    ASSERT(characters[i] <= 0xFF);
+    ASSERT(Utf::IsLatin1(characters[i]));
     *CharAddr(result, i) = characters[i];
   }
   return OneByteString::raw(result);
@@ -10786,7 +10659,7 @@
                                      Heap::Space space) {
   const String& result = String::Handle(OneByteString::New(len, space));
   for (intptr_t i = 0; i < len; ++i) {
-    ASSERT(characters[i] <= 0xFF);
+    ASSERT(Utf::IsLatin1(characters[i]));
     *CharAddr(result, i) = characters[i];
   }
   return OneByteString::raw(result);
@@ -10802,6 +10675,22 @@
 }
 
 
+RawOneByteString* OneByteString::New(const String& other_one_byte_string,
+                                     intptr_t other_start_index,
+                                     intptr_t other_len,
+                                     Heap::Space space) {
+  const String& result = String::Handle(OneByteString::New(other_len, space));
+  ASSERT(other_one_byte_string.IsOneByteString());
+  if (other_len > 0) {
+    NoGCScope no_gc;
+    memmove(OneByteString::CharAddr(result, 0),
+            OneByteString::CharAddr(other_one_byte_string, other_start_index),
+            other_len);
+  }
+  return OneByteString::raw(result);
+}
+
+
 RawOneByteString* OneByteString::Concat(const String& str1,
                                         const String& str2,
                                         Heap::Space space) {
@@ -10840,7 +10729,7 @@
   const String& result = String::Handle(OneByteString::New(len, space));
   for (intptr_t i = 0; i < len; ++i) {
     int32_t ch = mapping(str.CharAt(i));
-    ASSERT(ch >= 0 && ch <= 0xFF);
+    ASSERT(Utf::IsLatin1(ch));
     *CharAddr(result, i) = ch;
   }
   return OneByteString::raw(result);
@@ -10925,7 +10814,7 @@
     NoGCScope no_gc;
     intptr_t j = 0;
     for (intptr_t i = 0; i < array_len; ++i) {
-      if (utf32_array[i] > 0xffff) {
+      if (Utf::IsSupplementary(utf32_array[i])) {
         ASSERT(j < (utf16_len - 1));
         Utf16::Encode(utf32_array[i], CharAddr(result, j));
         j += 2;
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index a6734ad..2b43f97 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -454,25 +454,30 @@
  public:
   intptr_t instance_size() const {
     ASSERT(is_finalized() || is_prefinalized());
-    return raw_ptr()->instance_size_;
+    return (raw_ptr()->instance_size_in_words_ * kWordSize);
   }
-  void set_instance_size(intptr_t value) const {
-    ASSERT(Utils::IsAligned(value, kObjectAlignment));
-    raw_ptr()->instance_size_ = value;
+  void set_instance_size(intptr_t value_in_bytes) const {
+    ASSERT(kWordSize != 0);
+    set_instance_size_in_words(value_in_bytes / kWordSize);
   }
-  static intptr_t instance_size_offset() {
-    return OFFSET_OF(RawClass, instance_size_);
+  void set_instance_size_in_words(intptr_t value) const {
+    ASSERT(Utils::IsAligned((value * kWordSize), kObjectAlignment));
+    raw_ptr()->instance_size_in_words_ = value;
   }
 
   intptr_t next_field_offset() const {
-    return raw_ptr()->next_field_offset_;
+    return raw_ptr()->next_field_offset_in_words_ * kWordSize;
   }
-  void set_next_field_offset(intptr_t value) const {
-    ASSERT((Utils::IsAligned(value, kObjectAlignment) &&
-            (value == raw_ptr()->instance_size_)) ||
-           (!Utils::IsAligned(value, kObjectAlignment) &&
-            (value + kWordSize == raw_ptr()->instance_size_)));
-    raw_ptr()->next_field_offset_ = value;
+  void set_next_field_offset(intptr_t value_in_bytes) const {
+    ASSERT(kWordSize != 0);
+    set_next_field_offset_in_words(value_in_bytes / kWordSize);
+  }
+  void set_next_field_offset_in_words(intptr_t value) const {
+    ASSERT((Utils::IsAligned((value * kWordSize), kObjectAlignment) &&
+            (value == raw_ptr()->instance_size_in_words_)) ||
+           (!Utils::IsAligned((value * kWordSize), kObjectAlignment) &&
+            ((value + 1) == raw_ptr()->instance_size_in_words_)));
+    raw_ptr()->next_field_offset_in_words_ = value;
   }
 
   cpp_vtable handle_vtable() const { return raw_ptr()->handle_vtable_; }
@@ -540,15 +545,28 @@
 
   // If this class is parameterized, each instance has a type_arguments field.
   static const intptr_t kNoTypeArguments = -1;
-  intptr_t type_arguments_instance_field_offset() const {
+  intptr_t type_arguments_field_offset() const {
     ASSERT(is_finalized() || is_prefinalized());
-    return raw_ptr()->type_arguments_instance_field_offset_;
+    if (raw_ptr()->type_arguments_field_offset_in_words_ == kNoTypeArguments) {
+      return kNoTypeArguments;
+    }
+    return raw_ptr()->type_arguments_field_offset_in_words_ * kWordSize;
   }
-  void set_type_arguments_instance_field_offset(intptr_t value) const {
-    raw_ptr()->type_arguments_instance_field_offset_ = value;
+  void set_type_arguments_field_offset(intptr_t value_in_bytes) const {
+    intptr_t value;
+    if (value_in_bytes == kNoTypeArguments) {
+      value = kNoTypeArguments;
+    } else {
+      ASSERT(kWordSize != 0);
+      value = value_in_bytes / kWordSize;
+    }
+    set_type_arguments_field_offset_in_words(value);
   }
-  static intptr_t type_arguments_instance_field_offset_offset() {
-    return OFFSET_OF(RawClass, type_arguments_instance_field_offset_);
+  void set_type_arguments_field_offset_in_words(intptr_t value) const {
+    raw_ptr()->type_arguments_field_offset_in_words_ = value;
+  }
+  static intptr_t type_arguments_field_offset_in_words_offset() {
+    return OFFSET_OF(RawClass, type_arguments_field_offset_in_words_);
   }
 
   // The super type of this class, Object type if not explicitly specified.
@@ -561,21 +579,6 @@
   // Asserts that the class of the super type has been resolved.
   RawClass* SuperClass() const;
 
-  // Return true if this interface has a factory class.
-  bool HasFactoryClass() const;
-
-  // Return true if the factory class of this interface is resolved.
-  bool HasResolvedFactoryClass() const;
-
-  // Return the resolved factory class of this interface.
-  RawClass* FactoryClass() const;
-
-  // Return the unresolved factory class of this interface.
-  RawUnresolvedClass* UnresolvedFactoryClass() const;
-
-  // Set the resolved or unresolved factory class of this interface.
-  void set_factory_class(const Object& value) const;
-
   // Interfaces is an array of Types.
   RawArray* interfaces() const { return raw_ptr()->interfaces_; }
   void set_interfaces(const Array& value) const;
@@ -676,10 +679,10 @@
     return RoundedAllocationSize(sizeof(RawClass));
   }
 
-  bool is_interface() const {
-    return InterfaceBit::decode(raw_ptr()->state_bits_);
+  bool is_implemented() const {
+    return ImplementedBit::decode(raw_ptr()->state_bits_);
   }
-  void set_is_interface() const;
+  void set_is_implemented() const;
 
   bool is_abstract() const {
     return AbstractBit::decode(raw_ptr()->state_bits_);
@@ -724,13 +727,10 @@
   // Allocate a class used for VM internal objects.
   template <class FakeObject> static RawClass* New();
 
-  // Allocate instance classes and interfaces.
+  // Allocate instance classes.
   static RawClass* New(const String& name,
                        const Script& script,
                        intptr_t token_pos);
-  static RawClass* NewInterface(const String& name,
-                                const Script& script,
-                                intptr_t token_pos);
   static RawClass* NewNativeWrapper(const Library& library,
                                     const String& name,
                                     int num_fields);
@@ -756,13 +756,13 @@
  private:
   enum {
     kConstBit = 1,
-    kInterfaceBit = 2,
+    kImplementedBit = 2,
     kAbstractBit = 3,
     kStateTagBit = 4,
     kStateTagSize = 2,
   };
   class ConstBit : public BitField<bool, kConstBit, 1> {};
-  class InterfaceBit : public BitField<bool, kInterfaceBit, 1> {};
+  class ImplementedBit : public BitField<bool, kImplementedBit, 1> {};
   class AbstractBit : public BitField<bool, kAbstractBit, 1> {};
   class StateBits : public BitField<RawClass::ClassState,
                                     kStateTagBit, kStateTagSize> {};  // NOLINT
@@ -819,11 +819,6 @@
   RawString* ident() const { return raw_ptr()->ident_; }
   intptr_t token_pos() const { return raw_ptr()->token_pos_; }
 
-  RawClass* factory_signature_class() const {
-    return raw_ptr()->factory_signature_class_;
-  }
-  void set_factory_signature_class(const Class& value) const;
-
   RawString* Name() const;
 
   static intptr_t InstanceSize() {
@@ -854,12 +849,6 @@
   static bool AreEqual(const AbstractTypeArguments& arguments,
                        const AbstractTypeArguments& other_arguments);
 
-  // Returns true if both arguments represent vectors of possibly still
-  // unresolved identical types.
-  static bool AreIdentical(const AbstractTypeArguments& arguments,
-                           const AbstractTypeArguments& other_arguments,
-                           bool check_type_parameter_bounds);
-
   // Return 'this' if this type argument vector is instantiated, i.e. if it does
   // not refer to type parameters. Otherwise, return a new type argument vector
   // where each reference to a type parameter is replaced with the corresponding
@@ -896,7 +885,7 @@
   }
 
   // Check that this type argument vector is within the declared bounds of the
-  // given class or interface. If not, set malformed_error (if not yet set).
+  // given class. If not, set malformed_error (if not yet set).
   bool IsWithinBoundsOf(const Class& cls,
                         const AbstractTypeArguments& bounds_instantiator,
                         Error* malformed_error) const;
@@ -1591,7 +1580,7 @@
   bool is_const() const { return ConstBit::decode(raw_ptr()->kind_bits_); }
 
   inline intptr_t Offset() const;
-  inline void SetOffset(intptr_t value) const;
+  inline void SetOffset(intptr_t value_in_bytes) const;
 
   RawInstance* value() const;
   void set_value(const Instance& value) const;
@@ -3177,8 +3166,6 @@
   virtual intptr_t token_pos() const;
   virtual bool IsInstantiated() const;
   virtual bool Equals(const Instance& other) const;
-  virtual bool IsIdentical(const AbstractType& other,
-                           bool check_type_parameter_bound) const;
 
   // Instantiate this type using the given type argument vector.
   // Return a new type, or return 'this' if it is already instantiated.
@@ -3241,15 +3228,6 @@
   // Check if this type represents the 'Function' type.
   bool IsFunctionType() const;
 
-  // Check if this type is an interface type.
-  bool IsInterfaceType() const {
-    if (!HasResolvedTypeClass()) {
-      return false;
-    }
-    const Class& cls = Class::Handle(type_class());
-    return !cls.IsNull() && cls.is_interface();
-  }
-
   // Check the subtype relationship.
   bool IsSubtypeOf(const AbstractType& other, Error* malformed_error) const {
     return TypeTest(kIsSubtypeOf, other, malformed_error);
@@ -3316,8 +3294,6 @@
   virtual intptr_t token_pos() const { return raw_ptr()->token_pos_; }
   virtual bool IsInstantiated() const;
   virtual bool Equals(const Instance& other) const;
-  virtual bool IsIdentical(const AbstractType& other,
-                           bool check_type_parameter_bound) const;
   virtual RawAbstractType* InstantiateFrom(
       const AbstractTypeArguments& instantiator_type_arguments) const;
   virtual RawAbstractType* Canonicalize() const;
@@ -3353,7 +3329,7 @@
   // The 'double' type.
   static RawType* Double();
 
-  // The 'num' interface type.
+  // The 'num' type.
   static RawType* Number();
 
   // The 'String' type.
@@ -3362,7 +3338,7 @@
   // The 'Array' type.
   static RawType* ArrayType();
 
-  // The 'Function' interface type.
+  // The 'Function' type.
   static RawType* Function();
 
   // The finalized type of the given non-parameterized class.
@@ -3416,8 +3392,6 @@
   virtual intptr_t token_pos() const { return raw_ptr()->token_pos_; }
   virtual bool IsInstantiated() const { return false; }
   virtual bool Equals(const Instance& other) const;
-  virtual bool IsIdentical(const AbstractType& other,
-                           bool check_type_parameter_bound) const;
   virtual RawAbstractType* InstantiateFrom(
       const AbstractTypeArguments& instantiator_type_arguments) const;
   virtual RawAbstractType* Canonicalize() const { return raw(); }
@@ -3465,6 +3439,10 @@
 class Integer : public Number {
  public:
   static RawInteger* New(const String& str, Heap::Space space = Heap::kNew);
+
+  // Returns a canonical Integer object allocated in the old gen space.
+  static RawInteger* NewCanonical(const String& str);
+
   static RawInteger* New(int64_t value, Heap::Space space = Heap::kNew);
 
   virtual double AsDoubleValue() const;
@@ -3623,6 +3601,9 @@
 
   static RawBigint* New(const String& str, Heap::Space space = Heap::kNew);
 
+  // Returns a canonical Bigint object allocated in the old gen space.
+  static RawBigint* NewCanonical(const String& str);
+
   RawBigint* ArithmeticOp(Token::Kind operation, const Bigint& other) const;
 
  private:
@@ -3730,13 +3711,23 @@
    public:
     explicit CodePointIterator(const String& str)
         : str_(str),
+          ch_(0),
           index_(-1),
-          ch_(-1) {
+          end_(str.Length()) {
     }
 
-    int32_t Current() {
+    CodePointIterator(const String& str, intptr_t start, intptr_t length)
+        : str_(str),
+          ch_(0),
+          index_(start - 1),
+          end_(start + length) {
+      ASSERT(start >= 0);
+      ASSERT(end_ <= str.Length());
+    }
+
+    int32_t Current() const {
       ASSERT(index_ >= 0);
-      ASSERT(index_ < str_.Length());
+      ASSERT(index_ < end_);
       return ch_;
     }
 
@@ -3744,8 +3735,9 @@
 
    private:
     const String& str_;
-    intptr_t index_;
     int32_t ch_;
+    intptr_t index_;
+    intptr_t end_;
     DISALLOW_IMPLICIT_CONSTRUCTORS(CodePointIterator);
   };
 
@@ -3991,6 +3983,11 @@
                                Heap::Space space);
   static RawOneByteString* New(const String& str,
                                Heap::Space space);
+  // 'other' must be OneByteString.
+  static RawOneByteString* New(const String& other_one_byte_string,
+                               intptr_t other_start_index,
+                               intptr_t other_len,
+                               Heap::Space space);
 
   static RawOneByteString* Concat(const String& str1,
                                   const String& str2,
@@ -5922,13 +5919,15 @@
 
 intptr_t Field::Offset() const {
   ASSERT(!is_static());  // Offset is valid only for instance fields.
-  return Smi::Value(reinterpret_cast<RawSmi*>(raw_ptr()->value_));
+  intptr_t value = Smi::Value(reinterpret_cast<RawSmi*>(raw_ptr()->value_));
+  return (value * kWordSize);
 }
 
 
-void Field::SetOffset(intptr_t value) const {
+void Field::SetOffset(intptr_t value_in_bytes) const {
   ASSERT(!is_static());  // SetOffset is valid only for instance fields.
-  raw_ptr()->value_ = Smi::New(value);
+  ASSERT(kWordSize != 0);
+  raw_ptr()->value_ = Smi::New(value_in_bytes / kWordSize);
 }
 
 
diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
index 11b7f77..f4b1c23 100644
--- a/runtime/vm/object_test.cc
+++ b/runtime/vm/object_test.cc
@@ -191,26 +191,9 @@
   EXPECT_EQ(Utils::RoundUp((header_size + (1 * kWordSize)), kObjectAlignment),
             one_field_class.instance_size());
   EXPECT_EQ(header_size, field.Offset());
-}
-
-
-TEST_CASE(Interface) {
-  String& class_name = String::Handle(Symbols::New("EmptyClass"));
-  Script& script = Script::Handle();
-  const Class& factory_class =
-      Class::Handle(Class::New(class_name, script, Scanner::kDummyTokenIndex));
-  const Array& no_fields = Array::Handle(Object::empty_array());
-  // Finalizes the class.
-  factory_class.SetFields(no_fields);
-
-  String& interface_name = String::Handle(Symbols::New("MyInterface"));
-  const Class& interface = Class::Handle(
-      Class::NewInterface(interface_name, script, Scanner::kDummyTokenIndex));
-  EXPECT(interface.is_interface());
-  EXPECT(!factory_class.is_interface());
-  EXPECT(!interface.HasFactoryClass());
-  interface.set_factory_class(factory_class);
-  EXPECT_EQ(factory_class.raw(), interface.FactoryClass());
+  EXPECT(!one_field_class.is_implemented());
+  one_field_class.set_is_implemented();
+  EXPECT(one_field_class.is_implemented());
 }
 
 
@@ -328,13 +311,13 @@
     const String& smi_str = String::Handle(String::New("1"));
     const String& mint1_str = String::Handle(String::New("2147419168"));
     const String& mint2_str = String::Handle(String::New("-2147419168"));
-    Integer& i = Integer::Handle(Integer::New(smi_str));
+    Integer& i = Integer::Handle(Integer::NewCanonical(smi_str));
     EXPECT(i.IsSmi());
-    i = Integer::New(mint1_str);
+    i = Integer::NewCanonical(mint1_str);
     EXPECT(i.IsMint());
     EXPECT(!i.IsZero());
     EXPECT(!i.IsNegative());
-    i = Integer::New(mint2_str);
+    i = Integer::NewCanonical(mint2_str);
     EXPECT(i.IsMint());
     EXPECT(!i.IsZero());
     EXPECT(i.IsNegative());
@@ -456,7 +439,7 @@
   EXPECT(b.IsNull());
   const char* cstr = "18446744073709551615000";
   const String& test = String::Handle(String::New(cstr));
-  b = Bigint::New(test);
+  b = Bigint::NewCanonical(test);
   const char* str = b.ToCString();
   EXPECT_STREQ(cstr, str);
 
@@ -493,15 +476,17 @@
 
 TEST_CASE(Integer) {
   Integer& i = Integer::Handle();
-  i = Integer::New(String::Handle(String::New("12")));
+  i = Integer::NewCanonical(String::Handle(String::New("12")));
   EXPECT(i.IsSmi());
-  i = Integer::New(String::Handle(String::New("-120")));
+  i = Integer::NewCanonical(String::Handle(String::New("-120")));
   EXPECT(i.IsSmi());
-  i = Integer::New(String::Handle(String::New("0")));
+  i = Integer::NewCanonical(String::Handle(String::New("0")));
   EXPECT(i.IsSmi());
-  i = Integer::New(String::Handle(String::New("12345678901234567890")));
+  i = Integer::NewCanonical(
+      String::Handle(String::New("12345678901234567890")));
   EXPECT(i.IsBigint());
-  i = Integer::New(String::Handle(String::New("-12345678901234567890111222")));
+  i = Integer::NewCanonical(
+      String::Handle(String::New("-12345678901234567890111222")));
   EXPECT(i.IsBigint());
 }
 
@@ -1709,6 +1694,23 @@
 }
 
 
+TEST_CASE(StringCodePointIteratorRange) {
+  const String& str = String::Handle(String::New("foo bar baz"));
+
+  String::CodePointIterator it0(str, 3, 0);
+  EXPECT(!it0.Next());
+
+  String::CodePointIterator it1(str, 4, 3);
+  EXPECT(it1.Next());
+  EXPECT_EQ('b', it1.Current());
+  EXPECT(it1.Next());
+  EXPECT_EQ('a', it1.Current());
+  EXPECT(it1.Next());
+  EXPECT_EQ('r', it1.Current());
+  EXPECT(!it1.Next());
+}
+
+
 TEST_CASE(GrowableObjectArray) {
   const int kArrayLen = 5;
   Smi& value = Smi::Handle();
diff --git a/runtime/vm/pages.cc b/runtime/vm/pages.cc
index e6c4b37..68a0530 100644
--- a/runtime/vm/pages.cc
+++ b/runtime/vm/pages.cc
@@ -5,6 +5,7 @@
 #include "vm/pages.h"
 
 #include "platform/assert.h"
+#include "vm/compiler_stats.h"
 #include "vm/gc_marker.h"
 #include "vm/gc_sweeper.h"
 #include "vm/object.h"
@@ -237,6 +238,9 @@
   }
   if (result != 0) {
     in_use_ += size;
+    if (FLAG_compiler_stats && (type == HeapPage::kExecutable)) {
+      CompilerStats::code_allocated += size;
+    }
   }
   ASSERT((result & kObjectAlignmentMask) == kOldObjectAlignmentOffset);
   return result;
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index 3273891..6cc95d3 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -29,10 +29,6 @@
 DEFINE_FLAG(bool, silent_warnings, false, "Silence warnings.");
 DEFINE_FLAG(bool, warn_legacy_map_literal, false,
             "Warning on legacy map literal syntax (single type argument)");
-DEFINE_FLAG(bool, warn_legacy_dynamic, false,
-            "Warning on legacy type Dynamic)");
-DEFINE_FLAG(bool, warn_legacy_getters, false,
-            "Warning on legacy getter syntax");
 DEFINE_FLAG(bool, strict_function_literals, false,
             "enforce new function literal rules");
 DEFINE_FLAG(bool, fail_legacy_abstract, false,
@@ -538,7 +534,6 @@
             intptr_t token_pos)
       : clazz_(cls),
         class_name_(cls_name),
-        is_interface_(is_interface),
         token_pos_(token_pos),
         functions_(GrowableObjectArray::Handle(GrowableObjectArray::New())),
         fields_(GrowableObjectArray::Handle(GrowableObjectArray::New())) {
@@ -629,10 +624,6 @@
     return class_name_;
   }
 
-  bool is_interface() const {
-    return is_interface_;
-  }
-
   bool has_constructor() const {
     Function& func = Function::Handle();
     for (int i = 0; i < functions_.Length(); i++) {
@@ -702,7 +693,6 @@
 
   const Class& clazz_;
   const String& class_name_;
-  const bool is_interface_;
   intptr_t token_pos_;   // Token index of "class" keyword.
   GrowableObjectArray& functions_;
   GrowableObjectArray& fields_;
@@ -1290,15 +1280,6 @@
 }
 
 
-void Parser::CheckFunctionIsCallable(intptr_t token_pos,
-                                     const Function& function) {
-  if (Class::Handle(function.Owner()).is_interface()) {
-    ErrorMsg(token_pos, "cannot call function of interface '%s'",
-        function.ToFullyQualifiedCString());
-  }
-}
-
-
 // Resolve and return the dynamic function of the given name in the superclass.
 // If it is not found, and resolve_getter is true, try to resolve a getter of
 // the same name. If it is still not found, return noSuchMethod and
@@ -1329,7 +1310,6 @@
   } else {
     *is_no_such_method = false;
   }
-  CheckFunctionIsCallable(token_pos, super_func);
   return super_func.raw();
 }
 
@@ -1462,7 +1442,6 @@
     ArgumentListNode* op_arguments = new ArgumentListNode(super_pos);
     AstNode* receiver = LoadReceiver(super_pos);
     op_arguments->Add(receiver);
-    CheckFunctionIsCallable(super_pos, super_operator);
     if (is_no_such_method) {
       op_arguments = BuildNoSuchMethodArguments(
           super_pos, operator_function_name, *op_arguments);
@@ -1519,7 +1498,6 @@
     op_arguments->Add(receiver);
     op_arguments->Add(other_operand);
 
-    CheckFunctionIsCallable(operator_pos, super_operator);
     if (is_no_such_method) {
       op_arguments = BuildNoSuchMethodArguments(
           operator_pos, operator_function_name, *op_arguments);
@@ -1638,7 +1616,6 @@
              String::Handle(super_class.Name()).ToCString(),
              error_message.ToCString());
   }
-  CheckFunctionIsCallable(supercall_pos, super_ctor);
   current_block_->statements->Add(
       new StaticCallNode(supercall_pos, super_ctor, arguments));
 }
@@ -1698,7 +1675,6 @@
              ctor_name.ToCString(),
              error_message.ToCString());
   }
-  CheckFunctionIsCallable(supercall_pos, super_ctor);
   return new StaticCallNode(supercall_pos, super_ctor, arguments);
 }
 
@@ -1912,7 +1888,6 @@
              ctor_name.ToCString(),
              error_message.ToCString());
   }
-  CheckFunctionIsCallable(call_pos, redirect_ctor);
   current_block_->statements->Add(
       new StaticCallNode(call_pos, redirect_ctor, arguments));
 }
@@ -2451,14 +2426,6 @@
     Class& cls = Class::Handle(library_.LookupClass(members->class_name()));
     cls.set_is_const();
   }
-  if (method->has_abstract && members->is_interface()) {
-    ErrorMsg(method->name_pos,
-             "'abstract' method only allowed in class definition");
-  }
-  if (method->has_external && members->is_interface()) {
-    ErrorMsg(method->name_pos,
-             "'external' method only allowed in class definition");
-  }
 
   // Parse the formal parameters.
   const bool are_implicitly_final = method->has_const;
@@ -2488,16 +2455,6 @@
   }
   if (!method->IsGetter()) {
     ParseFormalParameterList(allow_explicit_default_values, &method->params);
-  } else {
-    // TODO(hausner): Remove this once the old getter syntax with
-    // empty parameter list is no longer supported.
-    if (CurrentToken() == Token::kLPAREN) {
-      if (FLAG_warn_legacy_getters) {
-        Warning("legacy getter syntax, remove parenthesis");
-      }
-      ConsumeToken();
-      ExpectToken(Token::kRPAREN);
-    }
   }
 
   // Now that we know the parameter list, we can distinguish between the
@@ -2619,9 +2576,6 @@
       ErrorMsg(method->name_pos,
                "const constructor or factory '%s' may not have a function body",
                method->name->ToCString());
-    } else if (members->is_interface()) {
-      ErrorMsg(method->name_pos,
-               "function body not allowed in interface declaration");
     }
     if (method->redirect_name != NULL) {
       ErrorMsg(method->name_pos,
@@ -2640,9 +2594,6 @@
       ErrorMsg(method->name_pos,
                "abstract method '%s' may not have a function body",
                method->name->ToCString());
-    } else if (members->is_interface()) {
-      ErrorMsg(method->name_pos,
-               "function body not allowed in interface declaration");
     } else if (method->IsFactoryOrConstructor() && method->has_const) {
       ErrorMsg(method->name_pos,
                "const constructor or factory '%s' may not be native",
@@ -2656,7 +2607,6 @@
   } else {
     // We haven't found a method body. Issue error if one is required.
     const bool must_have_body =
-        !members->is_interface() &&
         method->has_static &&
         !method->has_external &&
         redirection_type.IsNull();
@@ -2668,8 +2618,7 @@
 
     if (CurrentToken() == Token::kSEMICOLON) {
       ConsumeToken();
-      if (!members->is_interface() &&
-          !method->has_static &&
+      if (!method->has_static &&
           !method->has_external &&
           !method->IsConstructor()) {
           // Methods, getters and setters without a body are
@@ -2680,7 +2629,6 @@
       // Signature is not followed by semicolon or body. Issue an
       // appropriate error.
       const bool must_have_semicolon =
-          members->is_interface() ||
           (method->redirect_name != NULL) ||
           (method->IsConstructor() && method->has_const) ||
           method->has_external;
@@ -2977,37 +2925,26 @@
   // Optionally parse a (possibly named) constructor name or factory.
   if (IsIdentifier() &&
       (CurrentLiteral()->Equals(members->class_name()) || member.has_factory)) {
+    member.name_pos = TokenPos();
+    member.name = CurrentLiteral();  // Unqualified identifier.
+    ConsumeToken();
     if (member.has_factory) {
-      // TODO(regis): Simplify this code once the core library is fixed.
-      // See issue 6641.
-      // Per specification, the name of the factory must be the name of the
-      // immediately enclosing class.
-
-      // The factory name may be qualified.
-      QualIdent factory_name;
-      ParseQualIdent(&factory_name);
-      member.name_pos = factory_name.ident_pos;
-      member.name = factory_name.ident;  // Unqualified identifier.
-      // The class of the factory result type is specified by the factory name.
-      LibraryPrefix& lib_prefix = LibraryPrefix::Handle();
-      if (factory_name.lib_prefix != NULL) {
-        lib_prefix = factory_name.lib_prefix->raw();
+      // The factory name may be qualified, but the first identifier must match
+      // the name of the immediately enclosing class.
+      if (!member.name->Equals(members->class_name())) {
+        ErrorMsg(member.name_pos, "factory name must be '%s'",
+                 members->class_name().ToCString());
       }
       const Object& result_type_class = Object::Handle(
-          UnresolvedClass::New(lib_prefix,
-                               *factory_name.ident,
-                               factory_name.ident_pos));
+          UnresolvedClass::New(LibraryPrefix::Handle(),
+                               *member.name,
+                               member.name_pos));
       // The type arguments of the result type are set during finalization.
       member.type = &Type::ZoneHandle(Type::New(result_type_class,
                                                 TypeArguments::Handle(),
-                                                factory_name.ident_pos));
-    } else {
-      if (member.has_static) {
-        ErrorMsg("constructor cannot be static");
-      }
-      member.name_pos = TokenPos();
-      member.name = CurrentLiteral();
-      ConsumeToken();
+                                                member.name_pos));
+    } else if (member.has_static) {
+      ErrorMsg(member.name_pos, "constructor cannot be static");
     }
     // We must be dealing with a constructor or named constructor.
     member.kind = RawFunction::kConstructor;
@@ -3092,13 +3029,6 @@
 
   ASSERT(member.name != NULL);
   if (CurrentToken() == Token::kLPAREN || member.IsGetter()) {
-    if (members->is_interface() && member.has_static) {
-      if (member.has_factory) {
-        ErrorMsg("factory constructors are not allowed in interfaces");
-      } else {
-        ErrorMsg("static methods are not allowed in interfaces");
-      }
-    }
     // Constructor or method.
     if (member.type == NULL) {
       member.type = &Type::ZoneHandle(Type::DynamicType());
@@ -3121,9 +3051,6 @@
                  " in field declaration");
       }
     }
-    if (members->is_interface() && member.has_static && !member.has_final) {
-      ErrorMsg("static non-final fields are not allowed in interfaces");
-    }
     ParseFieldDefinition(members, &member);
   } else {
     UnexpectedToken();
@@ -3168,13 +3095,7 @@
                class_name.ToCString());
     }
     cls ^= obj.raw();
-    if (cls.is_interface()) {
-      ErrorMsg(classname_pos, "'%s' %s",
-               class_name.ToCString(),
-               is_patch ?
-                   "interface cannot be patched" :
-                   "is already defined as interface");
-    } else if (is_patch) {
+    if (is_patch) {
       String& patch = String::Handle(Symbols::New("patch "));
       patch = String::Concat(patch, class_name);
       patch = Symbols::New(patch);
@@ -3208,12 +3129,6 @@
                String::Handle(type.UserVisibleName()).ToCString());
     }
     super_type ^= type.raw();
-    if (super_type.IsInterfaceType()) {
-      ErrorMsg(type_pos,
-               "class '%s' may implement, but cannot extend interface '%s'",
-               class_name.ToCString(),
-               String::Handle(super_type.UserVisibleName()).ToCString());
-    }
   } else {
     // No extends clause: Implicitly extend Object.
     super_type = Type::ObjectType();
@@ -3370,13 +3285,14 @@
   TRACE_PARSER("ParseFunctionTypeAlias");
   ExpectToken(Token::kTYPEDEF);
 
-  // Allocate an interface to hold the type parameters and their bounds.
+  // Allocate an abstract class to hold the type parameters and their bounds.
   // Make it the owner of the function type descriptor.
   const Class& alias_owner = Class::Handle(
       Class::New(String::Handle(Symbols::New(":alias_owner")),
                  Script::Handle(),
                  TokenPos()));
-  alias_owner.set_is_interface();
+
+  alias_owner.set_is_abstract();
   alias_owner.set_library(library_);
   set_current_class(alias_owner);
 
@@ -3476,119 +3392,6 @@
 }
 
 
-void Parser::ParseInterfaceDefinition(
-    const GrowableObjectArray& pending_classes) {
-  TRACE_PARSER("ParseInterfaceDefinition");
-  const intptr_t interface_pos = TokenPos();
-  ExpectToken(Token::kINTERFACE);
-  const intptr_t interfacename_pos = TokenPos();
-  String& interface_name =
-      *ExpectUserDefinedTypeIdentifier("interface name expected");
-  if (FLAG_trace_parser) {
-    OS::Print("TopLevel parsing interface '%s'\n", interface_name.ToCString());
-  }
-  Class& interface = Class::Handle();
-  Object& obj = Object::Handle(library_.LookupLocalObject(interface_name));
-  if (obj.IsNull()) {
-    interface = Class::NewInterface(interface_name, script_, interfacename_pos);
-    library_.AddClass(interface);
-  } else {
-    if (!obj.IsClass()) {
-      ErrorMsg(interfacename_pos, "'%s' is already defined",
-               interface_name.ToCString());
-    }
-    interface ^= obj.raw();
-    if (!interface.is_interface()) {
-      ErrorMsg(interfacename_pos,
-               "'%s' is already defined as class",
-               interface_name.ToCString());
-    } else if (interface.functions() != Object::empty_array()) {
-      ErrorMsg(interfacename_pos,
-               "interface '%s' is already defined",
-               interface_name.ToCString());
-    }
-  }
-  ASSERT(!interface.IsNull());
-  ASSERT(interface.functions() == Object::empty_array());
-  set_current_class(interface);
-  ParseTypeParameters(interface);
-
-  if (CurrentToken() == Token::kEXTENDS) {
-    Array& interfaces = Array::Handle();
-    const intptr_t interfaces_pos = TokenPos();
-    interfaces = ParseInterfaceList();
-    AddInterfaces(interfaces_pos, interface, interfaces);
-  }
-
-  if (CurrentToken() == Token::kDEFAULT) {
-    ConsumeToken();
-    if (CurrentToken() != Token::kIDENT) {
-      ErrorMsg("class name expected");
-    }
-    QualIdent factory_name;
-    ParseQualIdent(&factory_name);
-    LibraryPrefix& lib_prefix = LibraryPrefix::Handle();
-    if (factory_name.lib_prefix != NULL) {
-      lib_prefix = factory_name.lib_prefix->raw();
-    }
-    const UnresolvedClass& unresolved_factory_class = UnresolvedClass::Handle(
-        UnresolvedClass::New(lib_prefix,
-                             *factory_name.ident,
-                             factory_name.ident_pos));
-    const Class& factory_class = Class::Handle(
-        Class::New(String::Handle(Symbols::New(":factory_signature")),
-                   script_,
-                   factory_name.ident_pos));
-    factory_class.set_library(library_);
-    factory_class.set_is_finalized();
-    ParseTypeParameters(factory_class);
-    unresolved_factory_class.set_factory_signature_class(factory_class);
-    interface.set_factory_class(unresolved_factory_class);
-    // If a type parameter list is included in the default factory clause (it
-    // can be omitted), verify that it matches the list of type parameters of
-    // the interface in number and names, but not necessarily in bounds.
-    if (factory_class.NumTypeParameters() > 0) {
-      const bool check_type_parameter_bounds = false;
-      if (!AbstractTypeArguments::AreIdentical(
-          AbstractTypeArguments::Handle(interface.type_parameters()),
-          AbstractTypeArguments::Handle(factory_class.type_parameters()),
-          check_type_parameter_bounds)) {
-        const String& interface_name = String::Handle(interface.Name());
-        ErrorMsg(factory_name.ident_pos,
-                 "mismatch in number or names of type parameters between "
-                 "interface '%s' and default factory class '%s'.\n",
-                 interface_name.ToCString(),
-                 factory_name.ident->ToCString());
-      }
-    }
-  }
-
-  ExpectToken(Token::kLBRACE);
-  ClassDesc members(interface, interface_name, true, interface_pos);
-  while (CurrentToken() != Token::kRBRACE) {
-    ParseClassMemberDefinition(&members);
-  }
-  ExpectToken(Token::kRBRACE);
-
-  if (members.has_constructor() && !interface.HasFactoryClass()) {
-    ErrorMsg(interfacename_pos,
-             "interface '%s' with constructor must declare a factory class",
-             interface_name.ToCString());
-  }
-
-  Array& array = Array::Handle();
-  array = Array::MakeArray(members.fields());
-  interface.SetFields(array);
-
-  // Creating a new array for functions marks the interface as parsed.
-  array = Array::MakeArray(members.functions());
-  interface.SetFunctions(array);
-  ASSERT(interface.is_interface());
-
-  pending_classes.Add(interface, Heap::kOld);
-}
-
-
 // Consumes exactly one right angle bracket. If the current token is a single
 // bracket token, it is consumed normally. However, if it is a double or triple
 // bracket, it is replaced by a single or double bracket token without
@@ -3840,17 +3643,10 @@
     AbstractType& interface = AbstractType::ZoneHandle();
     interface ^= interfaces.At(i);
     if (interface.IsTypeParameter()) {
-      if (cls.is_interface()) {
-        ErrorMsg(interfaces_pos,
-                 "interface '%s' may not extend type parameter '%s'",
-                 String::Handle(cls.Name()).ToCString(),
-                 String::Handle(interface.UserVisibleName()).ToCString());
-      } else {
-        ErrorMsg(interfaces_pos,
-                 "class '%s' may not implement type parameter '%s'",
-                 String::Handle(cls.Name()).ToCString(),
-                 String::Handle(interface.UserVisibleName()).ToCString());
-      }
+      ErrorMsg(interfaces_pos,
+               "class '%s' may not implement type parameter '%s'",
+               String::Handle(cls.Name()).ToCString(),
+               String::Handle(interface.UserVisibleName()).ToCString());
     }
     AddInterfaceIfUnique(interfaces_pos, all_interfaces, interface);
   }
@@ -4065,12 +3861,8 @@
 
   const intptr_t accessor_pos = TokenPos();
   ParamList params;
-  if (FLAG_warn_legacy_getters &&
-      is_getter && (CurrentToken() == Token::kLPAREN)) {
-    Warning("legacy getter syntax, remove parenthesis");
-  }
-  // TODO(hausner): Remove the kLPAREN check once we remove old getter syntax.
-  if (!is_getter || (CurrentToken() == Token::kLPAREN)) {
+
+  if (!is_getter) {
     const bool allow_explicit_default_values = true;
     ParseFormalParameterList(allow_explicit_default_values, &params);
   }
@@ -4534,8 +4326,6 @@
     } else if ((CurrentToken() == Token::kTYPEDEF) &&
                (LookaheadToken(1) != Token::kLPAREN)) {
       ParseFunctionTypeAlias(pending_classes);
-    } else if (CurrentToken() == Token::kINTERFACE) {
-      ParseInterfaceDefinition(pending_classes);
     } else if ((CurrentToken() == Token::kABSTRACT) &&
         (LookaheadToken(1) == Token::kCLASS)) {
       ParseClassDefinition(pending_classes);
@@ -5944,7 +5734,6 @@
                               arguments->names(),
                               Resolver::kIsQualified));
   ASSERT(!func.IsNull());
-  CheckFunctionIsCallable(arguments->token_pos(), func);
   return new StaticCallNode(arguments->token_pos(), func, arguments);
 }
 
@@ -6723,9 +6512,7 @@
     ErrorMsg("%s", msg);
   }
   String* ident = CurrentLiteral();
-  // TODO(hausner): Remove check for 'Dynamic' once support for upper-case
-  // type dynamic is gone.
-  if (ident->Equals("Dynamic") || ident->Equals("dynamic")) {
+  if (ident->Equals("dynamic")) {
     ErrorMsg("%s", msg);
   }
   ConsumeToken();
@@ -7384,7 +7171,6 @@
     // Could not resolve static method: throw a NoSuchMethodError.
     return ThrowNoSuchMethodError(ident_pos, func_name);
   }
-  CheckFunctionIsCallable(call_pos, func);
   return new StaticCallNode(call_pos, func, arguments);
 }
 
@@ -8603,16 +8389,6 @@
     SkipQualIdent();
   } else {
     ParseQualIdent(&type_name);
-    // TODO(hausner): Remove this once support for legacy type 'Dynamic'
-    // is removed.
-    if ((type_name.lib_prefix == NULL) && type_name.ident->Equals("Dynamic")) {
-      if (FLAG_warn_legacy_dynamic) {
-        Warning(type_name.ident_pos,
-                "legacy type 'Dynamic' found; auto-converting to 'dynamic'");
-      }
-      // Replace with lower-case 'dynamic'.
-      *type_name.ident ^= Symbols::Dynamic();
-    }
     // An identifier cannot be resolved in a local scope when top level parsing.
     if (!is_top_level_ &&
         (type_name.lib_prefix == NULL) &&
@@ -9017,7 +8793,7 @@
     }
   } else {
     // Factory call at runtime.
-    String& factory_class_name = String::Handle(Symbols::MapImplementation());
+    String& factory_class_name = String::Handle(Symbols::Map());
     const Class& factory_class =
         Class::Handle(LookupCoreClass(factory_class_name));
     ASSERT(!factory_class.IsNull());
@@ -9162,101 +8938,25 @@
   AbstractTypeArguments& type_arguments =
       AbstractTypeArguments::ZoneHandle(type.arguments());
 
-  // The constructor class and its name are those of the parsed type, unless the
-  // parsed type is an interface and a default factory class is specified, in
-  // which case constructor_class and constructor_class_name are modified below.
-  Class& constructor_class = Class::ZoneHandle(type_class.raw());
-  String& constructor_class_name = String::Handle(type_class_name.raw());
-
   // A constructor has an implicit 'this' parameter (instance to construct)
   // and a factory has an implicit 'this' parameter (type_arguments).
   // A constructor has a second implicit 'phase' parameter.
   intptr_t arguments_length = arguments->length() + 2;
 
-  if (type_class.is_interface()) {
-    // We need to make sure that an appropriate constructor is
-    // declared in the interface.
-    const String& constructor_name =
-        BuildConstructorName(type_class_name, named_constructor);
-    const String& external_constructor_name =
-        (named_constructor ? constructor_name : type_class_name);
-    Function& constructor = Function::ZoneHandle(
-        type_class.LookupConstructor(constructor_name));
-    if (constructor.IsNull()) {
-      // Replace the type with a malformed type and compile a throw or report
-      // a compile-time error if the constructor is const.
-      type = ClassFinalizer::NewFinalizedMalformedType(
-          Error::Handle(),  // No previous error.
-          current_class(),
-          call_pos,
-          ClassFinalizer::kTryResolve,  // No compile-time error.
-          "interface '%s' has no constructor named '%s'",
-          type_class_name.ToCString(),
-          external_constructor_name.ToCString());
-      if (is_const) {
-        const Error& error = Error::Handle(type.malformed_error());
-        ErrorMsg(error);
-      }
-      return ThrowNoSuchMethodError(call_pos, external_constructor_name);
-    }
-    String& error_message = String::Handle();
-    if (!constructor.AreValidArguments(arguments_length,
-                                       arguments->names(),
-                                       &error_message)) {
-      if (is_const) {
-        ErrorMsg(call_pos,
-                 "invalid arguments passed to constructor '%s' "
-                 "for interface '%s': %s",
-                 external_constructor_name.ToCString(),
-                 type_class_name.ToCString(),
-                 error_message.ToCString());
-      }
-      return ThrowNoSuchMethodError(call_pos, external_constructor_name);
-    }
-    // TODO(regis): Remove support for obsolete default factory classes.
-    if (!type_class.HasFactoryClass()) {
-      ErrorMsg(type_pos,
-               "cannot allocate interface '%s' without factory class",
-               type_class_name.ToCString());
-    }
-    if (!type_class.HasResolvedFactoryClass()) {
-      // This error can occur only with bootstrap classes.
-      const UnresolvedClass& unresolved =
-          UnresolvedClass::Handle(type_class.UnresolvedFactoryClass());
-      const String& missing_class_name = String::Handle(unresolved.ident());
-      ErrorMsg("unresolved factory class '%s'", missing_class_name.ToCString());
-    }
-    // Only change the class of the constructor to the factory class if the
-    // factory class implements the interface 'type'.
-    const Class& factory_class = Class::Handle(type_class.FactoryClass());
-    if (factory_class.IsSubtypeOf(TypeArguments::Handle(),
-                                  type_class,
-                                  TypeArguments::Handle(),
-                                  NULL)) {
-      // Class finalization verifies that the factory class has identical type
-      // parameters as the interface.
-      constructor_class_name = factory_class.Name();
-    }
-    // Always change the result type of the constructor to the factory type.
-    constructor_class = factory_class.raw();
-    // The finalized type_arguments are still those of the interface type.
-    ASSERT(!constructor_class.is_interface());
-  }
-
   // An additional type check of the result of a redirecting factory may be
   // required.
   AbstractType& type_bound = AbstractType::ZoneHandle();
 
   // Make sure that an appropriate constructor exists.
   const String& constructor_name =
-      BuildConstructorName(constructor_class_name, named_constructor);
+      BuildConstructorName(type_class_name, named_constructor);
   Function& constructor = Function::ZoneHandle(
-      constructor_class.LookupConstructor(constructor_name));
+      type_class.LookupConstructor(constructor_name));
   if (constructor.IsNull()) {
-    constructor = constructor_class.LookupFactory(constructor_name);
+    constructor = type_class.LookupFactory(constructor_name);
     if (constructor.IsNull()) {
       const String& external_constructor_name =
-          (named_constructor ? constructor_name : constructor_class_name);
+          (named_constructor ? constructor_name : type_class_name);
       // Replace the type with a malformed type and compile a throw or report a
       // compile-time error if the constructor is const.
       type = ClassFinalizer::NewFinalizedMalformedType(
@@ -9265,7 +8965,7 @@
           call_pos,
           ClassFinalizer::kTryResolve,  // No compile-time error.
           "class '%s' has no constructor or factory named '%s'",
-          String::Handle(constructor_class.Name()).ToCString(),
+          String::Handle(type_class.Name()).ToCString(),
           external_constructor_name.ToCString());
       if (is_const) {
         const Error& error = Error::Handle(type.malformed_error());
@@ -9295,8 +8995,6 @@
       type_arguments = type.arguments();
       constructor = constructor.RedirectionTarget();
       ASSERT(!constructor.IsNull());
-      constructor_class = constructor.Owner();
-      ASSERT(type_class.raw() == constructor_class.raw());
     }
     if (constructor.IsFactory()) {
       // A factory does not have the implicit 'phase' parameter.
@@ -9307,12 +9005,12 @@
   // It is ok to call a factory method of an abstract class, but it is
   // a dynamic error to instantiate an abstract class.
   ASSERT(!constructor.IsNull());
-  if (constructor_class.is_abstract() && !constructor.IsFactory()) {
+  if (type_class.is_abstract() && !constructor.IsFactory()) {
     ArgumentListNode* arguments = new ArgumentListNode(type_pos);
     arguments->Add(new LiteralNode(
         TokenPos(), Integer::ZoneHandle(Integer::New(type_pos))));
     arguments->Add(new LiteralNode(
-        TokenPos(), String::ZoneHandle(constructor_class_name.raw())));
+        TokenPos(), String::ZoneHandle(type_class_name.raw())));
     const String& cls_name =
         String::Handle(Symbols::AbstractClassInstantiationError());
     const String& func_name = String::Handle(Symbols::ThrowNew());
@@ -9323,60 +9021,18 @@
                                      arguments->names(),
                                      &error_message)) {
     const String& external_constructor_name =
-        (named_constructor ? constructor_name : constructor_class_name);
+        (named_constructor ? constructor_name : type_class_name);
     if (is_const) {
       ErrorMsg(call_pos,
                "invalid arguments passed to constructor '%s' "
                "for class '%s': %s",
                external_constructor_name.ToCString(),
-               String::Handle(constructor_class.Name()).ToCString(),
+               String::Handle(type_class.Name()).ToCString(),
                error_message.ToCString());
     }
     return ThrowNoSuchMethodError(call_pos, external_constructor_name);
   }
 
-  // Now that the constructor to be called is identified, finalize the type
-  // argument vector to be passed.
-  // The type argument vector of the parsed type was finalized in ParseType.
-  // If the constructor class was changed from the interface class to the
-  // factory class, we need to finalize the type argument vector again, because
-  // it may be longer due to the factory class extending a class, or/and because
-  // the bounds on the factory class may be tighter than on the interface.
-  if (!constructor.IsNull() && (constructor_class.raw() != type_class.raw())) {
-    const intptr_t num_type_parameters = constructor_class.NumTypeParameters();
-    TypeArguments& temp_type_arguments = TypeArguments::Handle();
-    if (!type_arguments.IsNull()) {
-      // Copy the parsed type arguments starting at offset 0, because interfaces
-      // have no super types.
-      ASSERT(type_class.NumTypeArguments() == type_class.NumTypeParameters());
-      const intptr_t num_type_arguments = type_arguments.Length();
-      temp_type_arguments = TypeArguments::New(num_type_parameters, Heap::kNew);
-      AbstractType& type_argument = AbstractType::Handle();
-      for (intptr_t i = 0; i < num_type_parameters; i++) {
-        if (i < num_type_arguments) {
-          type_argument = type_arguments.TypeAt(i);
-        } else {
-          type_argument = Type::DynamicType();
-        }
-        temp_type_arguments.SetTypeAt(i, type_argument);
-      }
-    }
-    Type& temp_type = Type::Handle(Type::New(
-         constructor_class, temp_type_arguments, type.token_pos(), Heap::kNew));
-    // No need to canonicalize temporary type.
-    temp_type ^= ClassFinalizer::FinalizeType(
-        current_class(), temp_type, ClassFinalizer::kFinalize);
-    // The type argument vector may have been expanded with the type arguments
-    // of the super type when finalizing the temporary type.
-    type_arguments = temp_type.arguments();
-    // The type parameter bounds of the factory class may be more specific than
-    // the type parameter bounds of the interface class. Therefore, although
-    // type was not malformed, temp_type may be malformed.
-    if (!type.IsMalformed() && temp_type.IsMalformed()) {
-      const Error& error = Error::Handle(temp_type.malformed_error());
-      type.set_malformed_error(error);
-    }
-  }
   // Return a throw in case of a malformed type or report a compile-time error
   // if the constructor is const.
   if (type.IsMalformed()) {
@@ -9395,7 +9051,7 @@
           String::Handle(constructor.name()).ToCString());
     }
     const Object& constructor_result = Object::Handle(
-        EvaluateConstConstructorCall(constructor_class,
+        EvaluateConstConstructorCall(type_class,
                                      type_arguments,
                                      constructor,
                                      arguments));
@@ -9424,7 +9080,6 @@
       }
     }
   } else {
-    CheckFunctionIsCallable(new_pos, constructor);
     CheckConstructorCallTypeArguments(new_pos, constructor, type_arguments);
     if (!type_arguments.IsNull() &&
         !type_arguments.IsInstantiated() &&
diff --git a/runtime/vm/parser.h b/runtime/vm/parser.h
index e3c082d..5af3352 100644
--- a/runtime/vm/parser.h
+++ b/runtime/vm/parser.h
@@ -118,7 +118,7 @@
   Parser(const Script& script, const Function& function, intptr_t token_pos);
 
   // Parse the top level of a whole script file and register declared classes
-  // and interfaces in the given library.
+  // in the given library.
   static void ParseCompilationUnit(const Library& library,
                                    const Script& script);
 
@@ -183,7 +183,7 @@
   // current_function(), but is greater than zero while parsing the body of
   // local functions nested in current_function().
 
-  // The class or interface being parsed.
+  // The class being parsed.
   const Class& current_class() const;
   void set_current_class(const Class& value);
 
@@ -293,7 +293,6 @@
   // Support for parsing of scripts.
   void ParseTopLevel();
   void ParseClassDefinition(const GrowableObjectArray& pending_classes);
-  void ParseInterfaceDefinition(const GrowableObjectArray& pending_classes);
   void ParseFunctionTypeAlias(const GrowableObjectArray& pending_classes);
   void ParseTopLevelVariable(TopLevel* top_level);
   void ParseTopLevelFunction(TopLevel* top_level);
@@ -352,7 +351,6 @@
                          LocalVariable* receiver,
                          GrowableArray<Field*>* initialized_fields);
   String& ParseNativeDeclaration();
-  // TODO(srdjan): Return TypeArguments instead of Array?
   RawArray* ParseInterfaceList();
   void AddInterfaceIfUnique(intptr_t interfaces_pos,
                             const GrowableObjectArray& interface_list,
@@ -576,7 +574,6 @@
   AstNode* ThrowTypeError(intptr_t type_pos, const AbstractType& type);
   AstNode* ThrowNoSuchMethodError(intptr_t call_pos, const String& name);
 
-  void CheckFunctionIsCallable(intptr_t token_pos, const Function& function);
   void CheckOperatorArity(const MemberDesc& member);
 
   const LocalVariable* GetIncrementTempLocal();
@@ -597,7 +594,8 @@
   Block* current_block_;
 
   // is_top_level_ is true if parsing the "top level" of a compilation unit,
-  // that is interface and class definitions.
+  // that is class definitions, function type aliases, global functions,
+  // global variables.
   bool is_top_level_;
 
   // The member currently being parsed during "top level" parsing.
@@ -614,7 +612,7 @@
   // The function currently being parsed.
   Function& innermost_function_;
 
-  // The class or interface currently being parsed, or the owner class of the
+  // The class currently being parsed, or the owner class of the
   // function currently being parsed. It is used for primary identifier lookups.
   Class& current_class_;
 
diff --git a/runtime/vm/raw_object.cc b/runtime/vm/raw_object.cc
index 7e37ea4..021a82f 100644
--- a/runtime/vm/raw_object.cc
+++ b/runtime/vm/raw_object.cc
@@ -48,7 +48,8 @@
   ASSERT(IsHeapObject());
 
   RawClass* raw_class = isolate->class_table()->At(GetClassId());
-  intptr_t instance_size = raw_class->ptr()->instance_size_;
+  intptr_t instance_size =
+      raw_class->ptr()->instance_size_in_words_ << kWordSizeLog2;
   intptr_t class_id = raw_class->ptr()->id_;
 
   if (instance_size == 0) {
@@ -598,7 +599,7 @@
   if (instance_size == 0) {
     RawClass* cls =
         visitor->isolate()->class_table()->At(raw_obj->GetClassId());
-    instance_size = cls->ptr()->instance_size_;
+    instance_size = cls->ptr()->instance_size_in_words_ << kWordSizeLog2;
   }
 
   // Calculate the first and last raw object pointer fields.
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index a99dde7..672720a 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -423,7 +423,6 @@
   RawLibrary* library_;
   RawTypeArguments* type_parameters_;  // Array of TypeParameter.
   RawType* super_type_;
-  RawObject* factory_class_;  // UnresolvedClass (until finalization) or Class.
   RawFunction* signature_function_;  // Associated function for signature class.
   RawArray* constants_;  // Canonicalized values of this class.
   RawArray* canonical_types_;  // Canonicalized types of this class.
@@ -433,13 +432,13 @@
   }
 
   cpp_vtable handle_vtable_;
-  intptr_t instance_size_;  // Size if fixed length or 0 if variable length.
+  intptr_t instance_size_in_words_;  // Size if fixed len or 0 if variable len.
   intptr_t id_;  // Class Id, also index in the class table.
-  intptr_t type_arguments_instance_field_offset_;  // May be kNoTypeArguments.
-  intptr_t next_field_offset_;  // Offset of the next instance field.
+  intptr_t type_arguments_field_offset_in_words_;  // Offset of type args fld.
+  intptr_t next_field_offset_in_words_;  // Offset of the next instance field.
   intptr_t num_native_fields_;  // Number of native fields in class.
   intptr_t token_pos_;
-  uint8_t state_bits_;  // state, is_const, is_interface.
+  uint8_t state_bits_;  // state, is_const, is_implemented.
 
   friend class Instance;
   friend class Object;
@@ -457,9 +456,8 @@
   }
   RawLibraryPrefix* library_prefix_;  // Library prefix qualifier for the ident.
   RawString* ident_;  // Name of the unresolved identifier.
-  RawClass* factory_signature_class_;  // Expected type parameters for factory.
   RawObject** to() {
-    return reinterpret_cast<RawObject**>(&ptr()->factory_signature_class_);
+    return reinterpret_cast<RawObject**>(&ptr()->ident_);
   }
   intptr_t token_pos_;
 };
@@ -604,7 +602,7 @@
   RawString* name_;
   RawClass* owner_;
   RawAbstractType* type_;
-  RawInstance* value_;  // Offset for instance and value for static fields.
+  RawInstance* value_;  // Offset in words for instance and value for static.
   RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->value_); }
 
   intptr_t token_pos_;
diff --git a/runtime/vm/raw_object_snapshot.cc b/runtime/vm/raw_object_snapshot.cc
index f6540c1..cd0e7be 100644
--- a/runtime/vm/raw_object_snapshot.cc
+++ b/runtime/vm/raw_object_snapshot.cc
@@ -57,9 +57,9 @@
     cls.set_tags(tags);
 
     // Set all non object fields.
-    cls.set_instance_size(reader->ReadIntptrValue());
-    cls.set_type_arguments_instance_field_offset(reader->ReadIntptrValue());
-    cls.set_next_field_offset(reader->ReadIntptrValue());
+    cls.set_instance_size_in_words(reader->ReadIntptrValue());
+    cls.set_type_arguments_field_offset_in_words(reader->ReadIntptrValue());
+    cls.set_next_field_offset_in_words(reader->ReadIntptrValue());
     cls.set_num_native_fields(reader->ReadIntptrValue());
     cls.set_token_pos(reader->ReadIntptrValue());
     cls.set_state_bits(reader->Read<uint8_t>());
@@ -96,9 +96,9 @@
     // Write out all the non object pointer fields.
     // NOTE: cpp_vtable_ is not written.
     writer->WriteIntptrValue(ptr()->id_);
-    writer->WriteIntptrValue(ptr()->instance_size_);
-    writer->WriteIntptrValue(ptr()->type_arguments_instance_field_offset_);
-    writer->WriteIntptrValue(ptr()->next_field_offset_);
+    writer->WriteIntptrValue(ptr()->instance_size_in_words_);
+    writer->WriteIntptrValue(ptr()->type_arguments_field_offset_in_words_);
+    writer->WriteIntptrValue(ptr()->next_field_offset_in_words_);
     writer->WriteIntptrValue(ptr()->num_native_fields_);
     writer->WriteIntptrValue(ptr()->token_pos_);
     writer->Write<uint8_t>(ptr()->state_bits_);
diff --git a/runtime/vm/scanner.cc b/runtime/vm/scanner.cc
index 26920c6..f969fde 100644
--- a/runtime/vm/scanner.cc
+++ b/runtime/vm/scanner.cc
@@ -521,8 +521,8 @@
     }
   }
   if (is_valid &&
-      ((*code_point > 0x10FFFF) ||
-       ((*code_point & 0xFFFFF800) == 0xD800))) {
+      ((Utf::IsOutOfRange(*code_point) ||
+        (Utf16::IsSurrogate(*code_point))))) {
     ErrorMsg("invalid code point");
   }
 }
diff --git a/runtime/vm/scanner_test.cc b/runtime/vm/scanner_test.cc
index e647dd3..1e04b8d 100644
--- a/runtime/vm/scanner_test.cc
+++ b/runtime/vm/scanner_test.cc
@@ -338,7 +338,7 @@
       "// This source is not meant to be valid Dart code. The text is used to"
       "// test the Dart scanner."
       ""
-      "// Cartesian point implemetation."
+      "// Cartesian point implementation."
       "class Point {"
       ""
       "  // Constructor"
diff --git a/runtime/vm/snapshot.cc b/runtime/vm/snapshot.cc
index 044d34b..f4f94c6 100644
--- a/runtime/vm/snapshot.cc
+++ b/runtime/vm/snapshot.cc
@@ -131,7 +131,7 @@
 
 RawSmi* BaseReader::ReadAsSmi() {
   intptr_t value = ReadIntptrValue();
-  ASSERT((value & kSmiTagMask) == 0);
+  ASSERT((value & kSmiTagMask) == kSmiTag);
   return reinterpret_cast<RawSmi*>(value);
 }
 
@@ -179,7 +179,7 @@
   ASSERT(kind_ != Snapshot::kFull);
   // Read the class header information and lookup the class.
   intptr_t class_header = ReadIntptrValue();
-  ASSERT((class_header & kSmiTagMask) != 0);
+  ASSERT((class_header & kSmiTagMask) != kSmiTag);
   Class& cls = Class::ZoneHandle(isolate(), Class::null());
   cls = LookupInternalClass(class_header);
   AddBackRef(object_id, &cls, kIsDeserialized);
@@ -198,8 +198,8 @@
 
 RawObject* SnapshotReader::ReadObjectImpl() {
   int64_t value = Read<int64_t>();
-  if ((value & kSmiTagMask) == 0) {
-    return Integer::New((value >> kSmiTagShift), HEAP_SPACE(kind_));
+  if ((value & kSmiTagMask) == kSmiTag) {
+    return NewInteger(value);
   }
   return ReadObjectImpl(value);
 }
@@ -221,8 +221,8 @@
 
 RawObject* SnapshotReader::ReadObjectRef() {
   int64_t header_value = Read<int64_t>();
-  if ((header_value & kSmiTagMask) == 0) {
-    return Integer::New((header_value >> kSmiTagShift), HEAP_SPACE(kind_));
+  if ((header_value & kSmiTagMask) == kSmiTag) {
+    return NewInteger(header_value);
   }
   ASSERT((header_value <= kIntptrMax) && (header_value >= kIntptrMin));
   if (IsVMIsolateObject(header_value)) {
@@ -255,7 +255,7 @@
     }
     return result.raw();
   }
-  ASSERT((class_header & kSmiTagMask) != 0);
+  ASSERT((class_header & kSmiTagMask) != kSmiTag);
   cls_ = LookupInternalClass(class_header);
   ASSERT(!cls_.IsNull());
 
@@ -574,6 +574,19 @@
 }
 
 
+RawObject* SnapshotReader::NewInteger(int64_t value) {
+  ASSERT((value & kSmiTagMask) == kSmiTag);
+  value = value >> kSmiTagShift;
+  if ((value <= Smi::kMaxValue) && (value >= Smi::kMinValue)) {
+    return Smi::New(value);
+  }
+  if (kind_ == Snapshot::kFull) {
+    return NewMint(value);
+  }
+  return Mint::NewCanonical(value);
+}
+
+
 RawClass* SnapshotReader::LookupInternalClass(intptr_t class_header) {
   // If the header is an object Id, lookup singleton VM classes or classes
   // stored in the object store.
@@ -704,7 +717,7 @@
     }
     return result->raw();
   }
-  ASSERT((class_header & kSmiTagMask) != 0);
+  ASSERT((class_header & kSmiTagMask) != kSmiTag);
   cls_ = LookupInternalClass(class_header);
   ASSERT(!cls_.IsNull());
   switch (cls_.id()) {
@@ -1020,6 +1033,19 @@
     return true;
   }
 
+  // Check if the object is a Mint and could potentially be a Smi
+  // on other architectures (64 bit), if so write it out as int64_t value.
+  if (rawobj->GetClassId() == kMintCid) {
+    int64_t value = reinterpret_cast<RawMint*>(rawobj)->ptr()->value_;
+    const intptr_t kSmi64Bits = 62;
+    const int64_t kSmi64Max = (static_cast<int64_t>(1) << kSmi64Bits) - 1;
+    const int64_t kSmi64Min = -(static_cast<int64_t>(1) << kSmi64Bits);
+    if (value <= kSmi64Max && value >= kSmi64Min) {
+      Write<int64_t>((value << kSmiTagShift) | kSmiTag);
+      return true;
+    }
+  }
+
   // Check if it is a code object in that case just write a Null object
   // as we do not want code objects in the snapshot.
   if (rawobj->GetClassId() == kCodeCid) {
@@ -1089,7 +1115,8 @@
       Isolate::Current()->long_jump_base()->Jump(1, *ErrorHandle());
     }
     // Object is regular dart instance.
-    intptr_t instance_size = cls->ptr()->instance_size_;
+    intptr_t instance_size =
+        cls->ptr()->instance_size_in_words_ << kWordSizeLog2;
     ASSERT(instance_size != 0);
 
     // Write out the serialization header value for this object.
diff --git a/runtime/vm/snapshot.h b/runtime/vm/snapshot.h
index 378a7bd..98015d5 100644
--- a/runtime/vm/snapshot.h
+++ b/runtime/vm/snapshot.h
@@ -263,6 +263,7 @@
   RawGrowableObjectArray* NewGrowableObjectArray();
   RawApiError* NewApiError();
   RawLanguageError* NewLanguageError();
+  RawObject* NewInteger(int64_t value);
 
  private:
   class BackRefNode : public ZoneAllocated {
diff --git a/runtime/vm/snapshot_test.cc b/runtime/vm/snapshot_test.cc
index beaca40..bdadf78 100644
--- a/runtime/vm/snapshot_test.cc
+++ b/runtime/vm/snapshot_test.cc
@@ -375,7 +375,7 @@
   MessageWriter writer(&buffer, &zone_allocator);
   const char* cstr = "0x270FFFFFFFFFFFFFD8F0";
   const String& str = String::Handle(String::New(cstr));
-  const Bigint& bigint = Bigint::Handle(Bigint::New(str));
+  const Bigint& bigint = Bigint::Handle(Bigint::NewCanonical(str));
   writer.WriteMessage(bigint);
   intptr_t buffer_len = writer.BytesWritten();
 
@@ -1260,6 +1260,44 @@
 }
 
 
+static void CheckString(Dart_Handle string, const char* expected) {
+  StackZone zone(Isolate::Current());
+  uint8_t* buffer;
+  MessageWriter writer(&buffer, &zone_allocator);
+  String& str = String::Handle();
+  str ^= Api::UnwrapHandle(string);
+  writer.WriteMessage(str);
+  intptr_t buffer_len = writer.BytesWritten();
+
+  // Read object back from the snapshot into a C structure.
+  ApiNativeScope scope;
+  ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator);
+  Dart_CObject* root = api_reader.ReadMessage();
+  EXPECT_NOTNULL(root);
+  EXPECT_EQ(Dart_CObject::kString, root->type);
+  EXPECT_STREQ(expected, root->value.as_string);
+  CheckEncodeDecodeMessage(root);
+}
+
+
+static void CheckStringInvalid(Dart_Handle string) {
+  StackZone zone(Isolate::Current());
+  uint8_t* buffer;
+  MessageWriter writer(&buffer, &zone_allocator);
+  String& str = String::Handle();
+  str ^= Api::UnwrapHandle(string);
+  writer.WriteMessage(str);
+  intptr_t buffer_len = writer.BytesWritten();
+
+  // Read object back from the snapshot into a C structure.
+  ApiNativeScope scope;
+  ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator);
+  Dart_CObject* root = api_reader.ReadMessage();
+  EXPECT_NOTNULL(root);
+  EXPECT_EQ(Dart_CObject::kUnsupported, root->type);
+}
+
+
 UNIT_TEST_CASE(DartGeneratedMessages) {
   static const char* kCustomIsolateScriptChars =
       "getSmi() {\n"
@@ -1274,6 +1312,21 @@
       "getNonAsciiString() {\n"
       "  return \"Blåbærgrød\";\n"
       "}\n"
+      "getNonBMPString() {\n"
+      "  return \"\\u{10000}\\u{1F601}\\u{1F637}\\u{20000}\";\n"
+      "}\n"
+      "getLeadSurrogateString() {\n"
+      "  return new String.fromCharCodes([0xd800]);\n"
+      "}\n"
+      "getTrailSurrogateString() {\n"
+      "  return \"\\u{10000}\".substring(1);\n"
+      "}\n"
+      "getSurrogatesString() {\n"
+      "  return new String.fromCharCodes([0xdc00, 0xdc00, 0xd800, 0xd800]);\n"
+      "}\n"
+      "getCrappyString() {\n"
+      "  return new String.fromCharCodes([0xd800, 32, 0xdc00, 32]);\n"
+      "}\n"
       "getList() {\n"
       "  return new List(kArrayLength);\n"
       "}\n";
@@ -1292,16 +1345,48 @@
   Dart_Handle bigint_result;
   bigint_result = Dart_Invoke(lib, NewString("getBigint"), 0, NULL);
   EXPECT_VALID(bigint_result);
+
   Dart_Handle ascii_string_result;
   ascii_string_result = Dart_Invoke(lib, NewString("getAsciiString"), 0, NULL);
   EXPECT_VALID(ascii_string_result);
   EXPECT(Dart_IsString(ascii_string_result));
+
   Dart_Handle non_ascii_string_result;
   non_ascii_string_result =
       Dart_Invoke(lib, NewString("getNonAsciiString"), 0, NULL);
   EXPECT_VALID(non_ascii_string_result);
   EXPECT(Dart_IsString(non_ascii_string_result));
 
+  Dart_Handle non_bmp_string_result;
+  non_bmp_string_result =
+      Dart_Invoke(lib, NewString("getNonBMPString"), 0, NULL);
+  EXPECT_VALID(non_bmp_string_result);
+  EXPECT(Dart_IsString(non_bmp_string_result));
+
+  Dart_Handle lead_surrogate_string_result;
+  lead_surrogate_string_result =
+      Dart_Invoke(lib, NewString("getLeadSurrogateString"), 0, NULL);
+  EXPECT_VALID(lead_surrogate_string_result);
+  EXPECT(Dart_IsString(lead_surrogate_string_result));
+
+  Dart_Handle trail_surrogate_string_result;
+  trail_surrogate_string_result =
+      Dart_Invoke(lib, NewString("getTrailSurrogateString"), 0, NULL);
+  EXPECT_VALID(trail_surrogate_string_result);
+  EXPECT(Dart_IsString(trail_surrogate_string_result));
+
+  Dart_Handle surrogates_string_result;
+  surrogates_string_result =
+      Dart_Invoke(lib, NewString("getSurrogatesString"), 0, NULL);
+  EXPECT_VALID(surrogates_string_result);
+  EXPECT(Dart_IsString(surrogates_string_result));
+
+  Dart_Handle crappy_string_result;
+  crappy_string_result =
+      Dart_Invoke(lib, NewString("getCrappyString"), 0, NULL);
+  EXPECT_VALID(crappy_string_result);
+  EXPECT(Dart_IsString(crappy_string_result));
+
   {
     DARTSCOPE_NOCHECKS(isolate);
 
@@ -1342,42 +1427,17 @@
                    root->value.as_bigint);
       CheckEncodeDecodeMessage(root);
     }
-    {
-      StackZone zone(Isolate::Current());
-      uint8_t* buffer;
-      MessageWriter writer(&buffer, &zone_allocator);
-      String& str = String::Handle();
-      str ^= Api::UnwrapHandle(ascii_string_result);
-      writer.WriteMessage(str);
-      intptr_t buffer_len = writer.BytesWritten();
-
-      // Read object back from the snapshot into a C structure.
-      ApiNativeScope scope;
-      ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator);
-      Dart_CObject* root = api_reader.ReadMessage();
-      EXPECT_NOTNULL(root);
-      EXPECT_EQ(Dart_CObject::kString, root->type);
-      EXPECT_STREQ("Hello, world!", root->value.as_string);
-      CheckEncodeDecodeMessage(root);
-    }
-    {
-      StackZone zone(Isolate::Current());
-      uint8_t* buffer;
-      MessageWriter writer(&buffer, &zone_allocator);
-      String& str = String::Handle();
-      str ^= Api::UnwrapHandle(non_ascii_string_result);
-      writer.WriteMessage(str);
-      intptr_t buffer_len = writer.BytesWritten();
-
-      // Read object back from the snapshot into a C structure.
-      ApiNativeScope scope;
-      ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator);
-      Dart_CObject* root = api_reader.ReadMessage();
-      EXPECT_NOTNULL(root);
-      EXPECT_EQ(Dart_CObject::kString, root->type);
-      EXPECT_STREQ("Blåbærgrød", root->value.as_string);
-      CheckEncodeDecodeMessage(root);
-    }
+    CheckString(ascii_string_result, "Hello, world!");
+    CheckString(non_ascii_string_result, "Blåbærgrød");
+    CheckString(non_bmp_string_result,
+                "\xf0\x90\x80\x80"
+                "\xf0\x9f\x98\x81"
+                "\xf0\x9f\x98\xb7"
+                "\xf0\xa0\x80\x80");
+    CheckStringInvalid(lead_surrogate_string_result);
+    CheckStringInvalid(trail_surrogate_string_result);
+    CheckStringInvalid(crappy_string_result);
+    CheckStringInvalid(surrogates_string_result);
   }
   Dart_ExitScope();
   Dart_ShutdownIsolate();
@@ -2073,7 +2133,6 @@
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
   Dart_EnterScope();
 
-  // xxx
   Dart_Handle send_port = Dart_Invoke(lib, NewString("main"), 0, NULL);
   EXPECT_VALID(send_port);
   Dart_Handle result = Dart_GetField(send_port, NewString("_id"));
@@ -2109,12 +2168,6 @@
   object.value.as_string = const_cast<char*>("æøå");
   EXPECT(Dart_PostCObject(send_port_id, &object));
 
-  // Try to post an invalid UTF-8 sequence (lead surrogate).
-  const char* data = "\xED\xA0\x80";  // U+D800
-  object.type = Dart_CObject::kString;
-  object.value.as_string = const_cast<char*>(data);
-  EXPECT(!Dart_PostCObject(send_port_id, &object));
-
   object.type = Dart_CObject::kDouble;
   object.value.as_double = 3.14;
   EXPECT(Dart_PostCObject(send_port_id, &object));
diff --git a/runtime/vm/stub_code_ia32.cc b/runtime/vm/stub_code_ia32.cc
index 637d1e3..140eb70 100644
--- a/runtime/vm/stub_code_ia32.cc
+++ b/runtime/vm/stub_code_ia32.cc
@@ -1114,7 +1114,7 @@
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   // The generated code is different if the class is parameterized.
   const bool is_cls_parameterized =
-      cls.type_arguments_instance_field_offset() != Class::kNoTypeArguments;
+      cls.type_arguments_field_offset() != Class::kNoTypeArguments;
   // kInlineInstanceSize is a constant used as a threshold for determining
   // when the object initialization should be done as a loop or as
   // straight line code.
@@ -1239,7 +1239,7 @@
     if (is_cls_parameterized) {
       // EDI: new object type arguments.
       // Set the type arguments in the new object.
-      __ movl(Address(EAX, cls.type_arguments_instance_field_offset()), EDI);
+      __ movl(Address(EAX, cls.type_arguments_field_offset()), EDI);
     }
     // Done allocating and initializing the instance.
     // EAX: new object.
@@ -1881,10 +1881,10 @@
     Label has_no_type_arguments;
     __ movl(EBX, raw_null);
     __ movl(EDI, FieldAddress(ECX,
-        Class::type_arguments_instance_field_offset_offset()));
+        Class::type_arguments_field_offset_in_words_offset()));
     __ cmpl(EDI, Immediate(Class::kNoTypeArguments));
     __ j(EQUAL, &has_no_type_arguments, Assembler::kNearJump);
-    __ movl(EBX, FieldAddress(EAX, EDI, TIMES_1, 0));
+    __ movl(EBX, FieldAddress(EAX, EDI, TIMES_4, 0));
     __ Bind(&has_no_type_arguments);
   }
   __ LoadClassId(ECX, EAX);
diff --git a/runtime/vm/stub_code_x64.cc b/runtime/vm/stub_code_x64.cc
index d7efa3a..5cdfeda 100644
--- a/runtime/vm/stub_code_x64.cc
+++ b/runtime/vm/stub_code_x64.cc
@@ -1094,7 +1094,7 @@
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   // The generated code is different if the class is parameterized.
   const bool is_cls_parameterized =
-      cls.type_arguments_instance_field_offset() != Class::kNoTypeArguments;
+      cls.type_arguments_field_offset() != Class::kNoTypeArguments;
   // kInlineInstanceSize is a constant used as a threshold for determining
   // when the object initialization should be done as a loop or as
   // straight line code.
@@ -1222,7 +1222,7 @@
     if (is_cls_parameterized) {
       // RDI: new object type arguments.
       // Set the type arguments in the new object.
-      __ movq(Address(RAX, cls.type_arguments_instance_field_offset()), RDI);
+      __ movq(Address(RAX, cls.type_arguments_field_offset()), RDI);
     }
     // Done allocating and initializing the instance.
     // RAX: new object.
@@ -1845,10 +1845,10 @@
     Label has_no_type_arguments;
     __ movq(R13, raw_null);
     __ movq(RDI, FieldAddress(R10,
-        Class::type_arguments_instance_field_offset_offset()));
+        Class::type_arguments_field_offset_in_words_offset()));
     __ cmpq(RDI, Immediate(Class::kNoTypeArguments));
     __ j(EQUAL, &has_no_type_arguments, Assembler::kNearJump);
-    __ movq(R13, FieldAddress(RAX, RDI, TIMES_1, 0));
+    __ movq(R13, FieldAddress(RAX, RDI, TIMES_8, 0));
     __ Bind(&has_no_type_arguments);
   }
   __ LoadClassId(R10, RAX);
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index 0e6cc21..754009b 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -45,7 +45,7 @@
   V(List, "List")                                                              \
   V(ListLiteralFactory, "List._fromLiteral")                                   \
   V(ListFactory, "List.")                                                      \
-  V(MapImplementation, "_HashMapImpl")                                         \
+  V(Map, "Map")                                                                \
   V(MapLiteralFactory, "Map._fromLiteral")                                     \
   V(ImmutableMap, "ImmutableMap")                                              \
   V(ImmutableMapConstructor, "ImmutableMap._create")                           \
diff --git a/runtime/vm/token.h b/runtime/vm/token.h
index f1199ff..ee57ca9 100644
--- a/runtime/vm/token.h
+++ b/runtime/vm/token.h
@@ -167,7 +167,6 @@
   KW(kIMPLEMENTS, "implements", 0, kPseudoKeyword)                             \
   KW(kIMPORT, "import", 0, kPseudoKeyword)                                     \
   KW(kIN, "in", 0, kKeyword)                                                   \
-  KW(kINTERFACE, "interface", 0, kPseudoKeyword)                               \
   KW(kIS, "is", 10, kKeyword)                                                  \
   KW(kLIBRARY, "library", 0, kPseudoKeyword)                                   \
   KW(kNEW, "new", 0, kKeyword)                                                 \
diff --git a/runtime/vm/unicode.cc b/runtime/vm/unicode.cc
index 3129a06..0b15976 100644
--- a/runtime/vm/unicode.cc
+++ b/runtime/vm/unicode.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -10,7 +10,7 @@
 
 namespace dart {
 
-static const int8_t kTrailBytes[256] = {
+const int8_t Utf8::kTrailBytes[256] = {
   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -30,8 +30,8 @@
 };
 
 
-static const uint32_t kMagicBits[7] = {
-  0,  // padding
+const uint32_t Utf8::kMagicBits[7] = {
+  0,  // Padding.
   0x00000000,
   0x00003080,
   0x000E2080,
@@ -42,8 +42,8 @@
 
 
 // Minimum values of code points used to check shortest form.
-static const uint32_t kOverlongMinimum[7] = {
-  0,  // padding
+const uint32_t Utf8::kOverlongMinimum[7] = {
+  0,  // Padding.
   0x0,
   0x80,
   0x800,
@@ -53,35 +53,6 @@
 };
 
 
-static bool IsTrailByte(uint8_t code_unit) {
-  return (code_unit & 0xc0) == 0x80;
-}
-
-
-static bool IsLatin1SequenceStart(uint8_t code_unit) {
-  // Check is codepoint is <= U+00FF
-  return (code_unit <= Utf8::kMaxOneByteChar);
-}
-
-
-static bool IsSupplementarySequenceStart(uint8_t code_unit) {
-  // Check is codepoint is >= U+10000.
-  return (code_unit >= 0xF0);
-}
-
-
-// Returns true if the code point value is above Plane 17.
-static bool IsOutOfRange(uint32_t code_point) {
-  return (code_point > 0x10FFFF);
-}
-
-
-// Returns true if the byte sequence is ill-formed.
-static bool IsNonShortestForm(uint32_t code_point, size_t num_bytes) {
-  return code_point < kOverlongMinimum[num_bytes];
-}
-
-
 // Returns a count of the number of UTF-8 trail bytes.
 intptr_t Utf8::CodePointCount(const uint8_t* utf8_array,
                               intptr_t array_len,
@@ -128,7 +99,7 @@
       ch -= kMagicBits[num_trail_bytes];
       if (!((is_malformed == false) &&
             (j == num_trail_bytes) &&
-            !IsOutOfRange(ch) &&
+            !Utf::IsOutOfRange(ch) &&
             !IsNonShortestForm(ch, j) &&
             !Utf16::IsSurrogate(ch))) {
         return false;
@@ -165,6 +136,7 @@
 
 
 intptr_t Utf8::Encode(int32_t ch, char* dst) {
+  ASSERT(!Utf16::IsSurrogate(ch));
   static const int kMask = ~(1 << 6);
   if (ch <= kMaxOneByteChar) {
     dst[0] = ch;
@@ -227,7 +199,7 @@
     ch -= kMagicBits[num_trail_bytes];
     if (!((is_malformed == false) &&
           (i == num_trail_bytes) &&
-          !IsOutOfRange(ch) &&
+          !Utf::IsOutOfRange(ch) &&
           !IsNonShortestForm(ch, i) &&
           !Utf16::IsSurrogate(ch))) {
       *dst = -1;
@@ -251,15 +223,15 @@
     ASSERT(IsLatin1SequenceStart(utf8_array[i]));
     num_bytes = Utf8::Decode(&utf8_array[i], (array_len - i), &ch);
     if (ch == -1) {
-      return false;  // invalid input
+      return false;  // Invalid input.
     }
-    ASSERT(ch <= 0xff);
+    ASSERT(Utf::IsLatin1(ch));
     dst[j] = ch;
   }
   if ((i < array_len) && (j == len)) {
-    return false;  // output overflow
+    return false;  // Output overflow.
   }
-  return true;  // success
+  return true;  // Success.
 }
 
 
@@ -275,7 +247,7 @@
     bool is_supplementary = IsSupplementarySequenceStart(utf8_array[i]);
     num_bytes = Utf8::Decode(&utf8_array[i], (array_len - i), &ch);
     if (ch == -1) {
-      return false;  // invalid input
+      return false;  // Invalid input.
     }
     if (is_supplementary) {
       Utf16::Encode(ch, &dst[j]);
@@ -285,9 +257,9 @@
     }
   }
   if ((i < array_len) && (j == len)) {
-    return false;  // output overflow
+    return false;  // Output overflow.
   }
-  return true;  // success
+  return true;  // Success.
 }
 
 
@@ -302,19 +274,27 @@
     int32_t ch;
     num_bytes = Utf8::Decode(&utf8_array[i], (array_len - i), &ch);
     if (ch == -1) {
-      return false;  // invalid input
+      return false;  // Invalid input.
     }
     dst[j] = ch;
   }
   if ((i < array_len) && (j == len)) {
-    return false;  // output overflow
+    return false;  // Output overflow.
   }
-  return true;  // success
+  return true;  // Success.
+}
+
+
+bool Utf8::DecodeCStringToUTF32(const char* str, int32_t* dst, intptr_t len) {
+  ASSERT(str != NULL);
+  intptr_t array_len = strlen(str);
+  const uint8_t* utf8_array = reinterpret_cast<const uint8_t*>(str);
+  return Utf8::DecodeToUTF32(utf8_array, array_len, dst, len);
 }
 
 
 void Utf16::Encode(int32_t codepoint, uint16_t* dst) {
-  ASSERT(codepoint > kMaxBmpCodepoint);
+  ASSERT(codepoint > Utf16::kMaxCodeUnit);
   ASSERT(dst != NULL);
   dst[0] = (Utf16::kLeadSurrogateOffset + (codepoint >> 10));
   dst[1] = (0xDC00 + (codepoint & 0x3FF));
diff --git a/runtime/vm/unicode.h b/runtime/vm/unicode.h
index 03a4b29..9d4fc38 100644
--- a/runtime/vm/unicode.h
+++ b/runtime/vm/unicode.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -12,6 +12,29 @@
 
 class String;
 
+class Utf : AllStatic {
+ public:
+  static const int32_t kMaxCodePoint = 0x10FFFF;
+
+  static bool IsLatin1(int32_t code_point) {
+    return (code_point >= 0) && (code_point <= 0xFF);
+  }
+
+  static bool IsBmp(int32_t code_point) {
+    return (code_point >= 0) && (code_point <= 0xFFFF);
+  }
+
+  static bool IsSupplementary(int32_t code_point) {
+    return (code_point > 0xFFFF) && (code_point <= kMaxCodePoint);
+  }
+
+  // Returns true if the code point value is above Plane 17.
+  static bool IsOutOfRange(int32_t code_point) {
+    return (code_point < 0) || (code_point > kMaxCodePoint);
+  }
+};
+
+
 class Utf8 : AllStatic {
  public:
   enum Type {
@@ -20,11 +43,6 @@
     kSupplementary,  // Supplementary code point [U+010000, U+10FFFF].
   };
 
-  static const intptr_t kMaxOneByteChar   = 0x7F;
-  static const intptr_t kMaxTwoByteChar   = 0x7FF;
-  static const intptr_t kMaxThreeByteChar = 0xFFFF;
-  static const intptr_t kMaxFourByteChar  = 0x10FFFF;
-
   static intptr_t CodePointCount(const uint8_t* utf8_array,
                                  intptr_t array_len,
                                  Type* type);
@@ -56,26 +74,43 @@
                             intptr_t len);
   static bool DecodeCStringToUTF32(const char* str,
                                    int32_t* dst,
-                                   intptr_t len) {
-    ASSERT(str != NULL);
-    intptr_t array_len = strlen(str);
-    const uint8_t* utf8_array = reinterpret_cast<const uint8_t*>(str);
-    return DecodeToUTF32(utf8_array, array_len, dst, len);
+                                   intptr_t len);
+
+ private:
+  static const int32_t kMaxOneByteChar   = 0x7F;
+  static const int32_t kMaxTwoByteChar   = 0x7FF;
+  static const int32_t kMaxThreeByteChar = 0xFFFF;
+  static const int32_t kMaxFourByteChar  = Utf::kMaxCodePoint;
+
+  static bool IsTrailByte(uint8_t code_unit) {
+    return (code_unit & 0xc0) == 0x80;
   }
+
+  static bool IsNonShortestForm(uint32_t code_point, size_t num_code_units) {
+    return code_point < kOverlongMinimum[num_code_units];
+  }
+
+  static bool IsLatin1SequenceStart(uint8_t code_unit) {
+    // Check is codepoint is <= U+00FF
+    return (code_unit <= Utf8::kMaxOneByteChar);
+  }
+
+  static bool IsSupplementarySequenceStart(uint8_t code_unit) {
+    // Check is codepoint is >= U+10000.
+    return (code_unit >= 0xF0);
+  }
+
+  static const int8_t kTrailBytes[];
+  static const uint32_t kMagicBits[];
+  static const uint32_t kOverlongMinimum[];
 };
 
 
 class Utf16 : AllStatic {
  public:
-  static const int32_t kMaxBmpCodepoint  = 0xFFFF;
-
-  static const int32_t kLeadSurrogateOffset = (0xD800 - (0x10000 >> 10));
-
-  static const int32_t kSurrogateOffset = (0x10000 - (0xD800 << 10) - 0xDC00);
-
   // Returns the length of the code point in UTF-16 code units.
   static intptr_t Length(int32_t ch) {
-    return (ch <= kMaxBmpCodepoint) ? 1 : 2;
+    return (ch <= Utf16::kMaxCodeUnit) ? 1 : 2;
   }
 
   // Returns true if ch is a lead or trail surrogate.
@@ -93,6 +128,21 @@
     return (ch & 0xFFFFFC00) == 0xDC00;
   }
 
+  // Returns the character at i and advances i to the next character
+  // boundary.
+  static int32_t Next(const uint16_t* characters, intptr_t* i, intptr_t len) {
+    int32_t ch = characters[*i];
+    if (Utf16::IsLeadSurrogate(ch) && (*i < (len - 1))) {
+      int32_t ch2 = characters[*i + 1];
+      if (Utf16::IsTrailSurrogate(ch2)) {
+        ch = Utf16::Decode(ch, ch2);
+        *i += 1;
+      }
+    }
+    *i += 1;
+    return ch;
+  }
+
   // Decodes a surrogate pair into a supplementary code point.
   static int32_t Decode(int32_t lead, int32_t trail) {
     return 0x10000 + ((lead & 0x3FF) << 10) + (trail & 0x3FF);
@@ -100,6 +150,13 @@
 
   // Encodes a single code point.
   static void Encode(int32_t codepoint, uint16_t* dst);
+
+ private:
+  static const int32_t kMaxCodeUnit = 0xFFFF;
+
+  static const int32_t kLeadSurrogateOffset = (0xD800 - (0x10000 >> 10));
+
+  static const int32_t kSurrogateOffset = (0x10000 - (0xD800 << 10) - 0xDC00);
 };
 
 
@@ -138,7 +195,7 @@
   static const int kBlockSize = 1 << kBlockSizeLog2;
 
   static int32_t Convert(int32_t ch, int32_t mapping) {
-    if (ch <= 0xFF) {
+    if (Utf::IsLatin1(ch)) {
       int32_t info = stage2_[ch];
       if ((info & kTypeMask) == mapping) {
         ch += info >> kTypeShift;
diff --git a/runtime/vm/vm.gypi b/runtime/vm/vm.gypi
index 7104aa5..530f7f0 100644
--- a/runtime/vm/vm.gypi
+++ b/runtime/vm/vm.gypi
@@ -31,7 +31,7 @@
       ],
       'sources/': [
         # Exclude all _test.[cc|h] files.
-        ['exclude', '_test\\.cc|h$'],
+        ['exclude', '_test\\.(cc|h)$'],
       ],
       'include_dirs': [
         '..',
@@ -57,7 +57,26 @@
           'sources/' : [
             ['exclude', 'gdbjit.cc'],
           ],
-       }]],
+       }],
+       ['dart_vtune_support==0', {
+          'sources/' : [
+            ['exclude', 'vtune\\.(cc|h)$'],
+          ],
+       }],
+       ['dart_vtune_support==1', {
+          'include_dirs': ['<(dart_vtune_root)/include'],
+          'defines': ['DART_VTUNE_SUPPORT'],
+          'link_settings': {
+            'conditions': [
+              ['OS=="linux"', {
+                 'libraries': ['-ljitprofiling'],
+              }],
+              ['OS=="win"', {
+                 'libraries': ['-ljitprofiling.lib'],
+              }],
+            ],
+          },
+        }]],
     },
     {
       'target_name': 'libdart_lib_withcore',
@@ -121,7 +140,9 @@
     {
       'target_name': 'generate_corelib_cc_file',
       'type': 'none',
-      'includes': [
+      'variables': {
+        'core_dart': '<(SHARED_INTERMEDIATE_DIR)/core_gen.dart',
+      },'includes': [
         # Load the shared core library sources.
         '../../sdk/lib/core/corelib_sources.gypi',
       ],
@@ -134,11 +155,27 @@
       ],
       'actions': [
         {
+          'action_name': 'generate_core_dart',
+          'inputs': [
+            '../tools/concat_library.py',
+            '<@(_sources)',
+          ],
+          'outputs': [
+            '<(core_dart)',
+          ],
+          'action': [
+            'python',
+            '<@(_inputs)',
+            '--output', '<(core_dart)',
+          ],
+          'message': 'Generating ''<(core_dart)'' file.',
+        },
+        {
           'action_name': 'generate_corelib_cc',
           'inputs': [
             '../tools/create_string_literal.py',
             '<(builtin_in_cc_file)',
-            '<@(_sources)',
+            '<(core_dart)',
           ],
           'outputs': [
             '<(corelib_cc_file)',
@@ -150,7 +187,7 @@
             '--input_cc', '<(builtin_in_cc_file)',
             '--include', 'vm/bootstrap.h',
             '--var_name', 'dart::Bootstrap::corelib_source_',
-            '<@(_sources)',
+            '<(core_dart)',
           ],
           'message': 'Generating ''<(corelib_cc_file)'' file.'
         },
@@ -197,6 +234,9 @@
     {
       'target_name': 'generate_collection_cc_file',
       'type': 'none',
+      'variables': {
+        'collection_dart': '<(SHARED_INTERMEDIATE_DIR)/collection_gen.dart',
+      },
       'includes': [
         # Load the shared collection library sources.
         '../../sdk/lib/collection/collection_sources.gypi',
@@ -210,11 +250,27 @@
       ],
       'actions': [
         {
+          'action_name': 'generate_collection_dart',
+          'inputs': [
+            '../tools/concat_library.py',
+            '<@(_sources)',
+          ],
+          'outputs': [
+            '<(collection_dart)',
+          ],
+          'action': [
+            'python',
+            '<@(_inputs)',
+            '--output', '<(collection_dart)',
+          ],
+          'message': 'Generating ''<(collection_dart)'' file.',
+        },
+        {
           'action_name': 'generate_collection_cc',
           'inputs': [
             '../tools/create_string_literal.py',
             '<(builtin_in_cc_file)',
-            '<@(_sources)',
+            '<(collection_dart)',
           ],
           'outputs': [
             '<(collection_cc_file)',
@@ -226,7 +282,7 @@
             '--input_cc', '<(builtin_in_cc_file)',
             '--include', 'vm/bootstrap.h',
             '--var_name', 'dart::Bootstrap::collection_source_',
-            '<@(_sources)',
+            '<(collection_dart)',
           ],
           'message': 'Generating ''<(collection_cc_file)'' file.'
         },
@@ -235,6 +291,9 @@
     {
       'target_name': 'generate_math_cc_file',
       'type': 'none',
+      'variables': {
+        'math_dart': '<(SHARED_INTERMEDIATE_DIR)/math_gen.dart',
+      },
       'includes': [
         # Load the shared math library sources.
         '../../sdk/lib/math/math_sources.gypi',
@@ -248,11 +307,27 @@
       ],
       'actions': [
         {
+          'action_name': 'generate_math_dart',
+          'inputs': [
+            '../tools/concat_library.py',
+            '<@(_sources)',
+          ],
+          'outputs': [
+            '<(math_dart)',
+          ],
+          'action': [
+            'python',
+            '<@(_inputs)',
+            '--output', '<(math_dart)',
+          ],
+          'message': 'Generating ''<(math_dart)'' file.',
+        },
+        {
           'action_name': 'generate_math_cc',
           'inputs': [
             '../tools/create_string_literal.py',
             '<(builtin_in_cc_file)',
-            '<@(_sources)',
+            '<(math_dart)',
           ],
           'outputs': [
             '<(math_cc_file)',
@@ -264,7 +339,7 @@
             '--input_cc', '<(builtin_in_cc_file)',
             '--include', 'vm/bootstrap.h',
             '--var_name', 'dart::Bootstrap::math_source_',
-            '<@(_sources)',
+            '<(math_dart)',
           ],
           'message': 'Generating ''<(math_cc_file)'' file.'
         },
@@ -311,6 +386,9 @@
     {
       'target_name': 'generate_mirrors_cc_file',
       'type': 'none',
+      'variables': {
+        'mirrors_dart': '<(SHARED_INTERMEDIATE_DIR)/mirrors_gen.dart',
+      },
       'includes': [
         # Load the shared core library sources.
         '../../sdk/lib/mirrors/mirrors_sources.gypi',
@@ -324,11 +402,27 @@
       ],
       'actions': [
         {
+          'action_name': 'generate_mirrors_dart',
+          'inputs': [
+            '../tools/concat_library.py',
+            '<@(_sources)',
+          ],
+          'outputs': [
+            '<(mirrors_dart)',
+          ],
+          'action': [
+            'python',
+            '<@(_inputs)',
+            '--output', '<(mirrors_dart)',
+          ],
+          'message': 'Generating ''<(mirrors_dart)'' file.',
+        },
+        {
           'action_name': 'generate_mirrors_cc',
           'inputs': [
             '../tools/create_string_literal.py',
             '<(builtin_in_cc_file)',
-            '<@(_sources)',
+            '<(mirrors_dart)',
           ],
           'outputs': [
             '<(mirrors_cc_file)',
@@ -340,7 +434,7 @@
             '--input_cc', '<(builtin_in_cc_file)',
             '--include', 'vm/bootstrap.h',
             '--var_name', 'dart::Bootstrap::mirrors_source_',
-            '<@(_sources)',
+            '<(mirrors_dart)',
           ],
           'message': 'Generating ''<(mirrors_cc_file)'' file.'
         },
@@ -387,6 +481,9 @@
     {
       'target_name': 'generate_isolate_cc_file',
       'type': 'none',
+      'variables': {
+        'isolate_dart': '<(SHARED_INTERMEDIATE_DIR)/isolate_gen.dart',
+      },
       'includes': [
         # Load the runtime implementation sources.
         '../../sdk/lib/isolate/isolate_sources.gypi',
@@ -400,11 +497,27 @@
       ],
       'actions': [
         {
+          'action_name': 'generate_isolate_dart',
+          'inputs': [
+            '../tools/concat_library.py',
+            '<@(_sources)',
+          ],
+          'outputs': [
+            '<(isolate_dart)',
+          ],
+          'action': [
+            'python',
+            '<@(_inputs)',
+            '--output', '<(isolate_dart)',
+          ],
+          'message': 'Generating ''<(isolate_dart)'' file.',
+        },
+        {
           'action_name': 'generate_isolate_cc',
           'inputs': [
             '../tools/create_string_literal.py',
             '<(builtin_in_cc_file)',
-            '<@(_sources)',
+            '<(isolate_dart)',
           ],
           'outputs': [
             '<(isolate_cc_file)',
@@ -416,7 +529,7 @@
             '--input_cc', '<(builtin_in_cc_file)',
             '--include', 'vm/bootstrap.h',
             '--var_name', 'dart::Bootstrap::isolate_source_',
-            '<@(_sources)',
+            '<(isolate_dart)',
           ],
           'message': 'Generating ''<(isolate_cc_file)'' file.'
         },
@@ -463,6 +576,9 @@
     {
       'target_name': 'generate_scalarlist_cc_file',
       'type': 'none',
+      'variables': {
+        'scalarlist_dart': '<(SHARED_INTERMEDIATE_DIR)/scalarlist_gen.dart',
+      },
       'includes': [
         # Load the shared library sources.
         '../../sdk/lib/scalarlist/scalarlist_sources.gypi',
@@ -476,11 +592,27 @@
       ],
       'actions': [
         {
+          'action_name': 'generate_scalarlist_dart',
+          'inputs': [
+            '../tools/concat_library.py',
+            '<@(_sources)',
+          ],
+          'outputs': [
+            '<(scalarlist_dart)',
+          ],
+          'action': [
+            'python',
+            '<@(_inputs)',
+            '--output', '<(scalarlist_dart)',
+          ],
+          'message': 'Generating ''<(scalarlist_dart)'' file.',
+        },
+        {
           'action_name': 'generate_scalarlist_cc',
           'inputs': [
             '../tools/create_string_literal.py',
             '<(builtin_in_cc_file)',
-            '<@(_sources)',
+            '<(scalarlist_dart)',
           ],
           'outputs': [
             '<(scalarlist_cc_file)',
@@ -492,7 +624,7 @@
             '--input_cc', '<(builtin_in_cc_file)',
             '--include', 'vm/bootstrap.h',
             '--var_name', 'dart::Bootstrap::scalarlist_source_',
-            '<@(_sources)',
+            '<(scalarlist_dart)',
           ],
           'message': 'Generating ''<(scalarlist_cc_file)'' file.'
         },
diff --git a/runtime/vm/vm_sources.gypi b/runtime/vm/vm_sources.gypi
index 2b2f9d4..0b18707 100644
--- a/runtime/vm/vm_sources.gypi
+++ b/runtime/vm/vm_sources.gypi
@@ -64,6 +64,8 @@
     'code_generator.cc',
     'code_generator.h',
     'code_generator_test.cc',
+    'code_observers.cc',
+    'code_observers.h',
     'code_patcher.h',
     'code_patcher_arm.cc',
     'code_patcher_ia32.cc',
@@ -302,6 +304,8 @@
     'verifier.cc',
     'verifier.h',
     'visitor.h',
+    'vtune.cc',
+    'vtune.h',
     'zone.cc',
     'zone.h',
     'zone_test.cc',
diff --git a/runtime/vm/vtune.cc b/runtime/vm/vtune.cc
new file mode 100644
index 0000000..57e065a
--- /dev/null
+++ b/runtime/vm/vtune.cc
@@ -0,0 +1,33 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "vm/vtune.h"
+
+#include <jitprofiling.h>
+
+#include "platform/assert.h"
+
+namespace dart {
+
+bool VTuneCodeObserver::IsActive() const {
+  return (iJIT_IsProfilingActive() == iJIT_SAMPLING_ON);
+}
+
+
+void VTuneCodeObserver::Notify(const char* name,
+                               uword base,
+                               uword prologue_offset,
+                               uword size,
+                               bool optimized) {
+  ASSERT(IsActive());
+  iJIT_Method_Load jmethod;
+  memset(&jmethod, 0, sizeof(jmethod));
+  jmethod.method_id = iJIT_GetNewMethodID();
+  jmethod.method_name = const_cast<char*>(name);
+  jmethod.method_load_address = reinterpret_cast<void*>(base);
+  jmethod.method_size = size;
+  iJIT_NotifyEvent(iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED, &jmethod);
+}
+
+}  // namespace dart
diff --git a/runtime/vm/vtune.h b/runtime/vm/vtune.h
new file mode 100644
index 0000000..4f62aff
--- /dev/null
+++ b/runtime/vm/vtune.h
@@ -0,0 +1,28 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#ifndef VM_VTUNE_H_
+#define VM_VTUNE_H_
+
+#include "vm/code_observers.h"
+
+namespace dart {
+
+#if defined(DART_VTUNE_SUPPORT)
+class VTuneCodeObserver : public CodeObserver {
+ public:
+  virtual bool IsActive() const;
+
+  virtual void Notify(const char* name,
+                      uword base,
+                      uword prologue_offset,
+                      uword size,
+                      bool optimized);
+};
+#endif
+
+
+}  // namespace dart
+
+#endif  // VM_VTUNE_H_
diff --git a/sdk/bin/dart b/sdk/bin/dart
index 6bb8e1c..22abed8 100755
--- a/sdk/bin/dart
+++ b/sdk/bin/dart
@@ -12,7 +12,7 @@
   DART_CONFIGURATION="ReleaseIA32"
 fi
 
-if [[ `uname` -eq 'Darwin' ]]; 
+if [[ `uname` == 'Darwin' ]]; 
 then
   BIN_DIR="$CUR_DIR"/../../xcodebuild/$DART_CONFIGURATION
 else
diff --git a/sdk/bin/dart2js b/sdk/bin/dart2js
index dfa5228..3f74135 100755
--- a/sdk/bin/dart2js
+++ b/sdk/bin/dart2js
@@ -3,24 +3,63 @@
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
 
-# Setting BIN_DIR this way is ugly, but is needed to handle the case where
-# dart-sdk/bin has been symlinked to. On MacOS, readlink doesn't work
-# with this case.
-BIN_DIR="$(cd "${0%/*}" ; pwd -P)"
+function follow_links() {
+  while [ -h "$1" ]; do
+    # On Mac OS, readlink -f doesn't work.
+    1="$(readlink "$1")"
+  done
+  echo "$1"
+}
 
-unset COLORS
+# Unlike $0, $BASH_SOURCE points to the absolute path of this file.
+PROG_NAME="$(follow_links "$BASH_SOURCE")"
+
+# Handle the case where dart-sdk/bin has been symlinked to.
+BIN_DIR="$(follow_links "$(cd "${PROG_NAME%/*}" ; pwd -P)")"
+
+SDK_DIR="$(cd "${BIN_DIR}/.." ; pwd -P)"
+
+DART2JS="$SDK_DIR/lib/_internal/compiler/implementation/dart2js.dart"
+
+DART="$BIN_DIR/dart"
+
+SNAPSHOT="${DART2JS}.snapshot"
+
+unset EXTRA_OPTIONS
+declare -a EXTRA_OPTIONS
+
 if test -t 1; then
   # Stdout is a terminal.
   if test 8 -le `tput colors`; then
     # Stdout has at least 8 colors, so enable colors.
-    COLORS="--enable-diagnostic-colors"
+    EXTRA_OPTIONS[${#EXTRA_OPTIONS[@]}]='--enable-diagnostic-colors'
   fi
 fi
 
-unset SNAPSHOT
-if test -f "$BIN_DIR/../lib/_internal/compiler/implementation/dart2js.dart.snapshot"; then
+unset EXTRA_VM_OPTIONS
+declare -a EXTRA_VM_OPTIONS
+
+if test -f "$SNAPSHOT"; then
   # TODO(ahe): Remove the following line when we are relatively sure it works.
-  echo Using snapshot "$BIN_DIR/../lib/_internal/compiler/implementation/dart2js.dart.snapshot" 1>&2
-  SNAPSHOT="--use_script_snapshot=$BIN_DIR/../lib/_internal/compiler/implementation/dart2js.dart.snapshot"
+  echo Using snapshot "$SNAPSHOT" 1>&2
+  EXTRA_VM_OPTIONS[${#EXTRA_VM_OPTIONS[@]}]="--use_script_snapshot=$SNAPSHOT"
 fi
-exec "$BIN_DIR"/dart --no_use_inlining --heap_growth_rate=32 $SNAPSHOT "$BIN_DIR/../lib/_internal/compiler/implementation/dart2js.dart" $COLORS "$@"
+
+# Tell the VM to grow the heap more aggressively. This should only
+# be necessary temporarily until the VM is better at detecting how
+# applications use memory.
+# TODO(ahe): Remove this option (http://dartbug.com/6495).
+EXTRA_VM_OPTIONS[${#EXTRA_VM_OPTIONS[@]}]='--heap_growth_rate=512'
+
+# Tell the VM to don't bother inlining methods. So far inlining isn't
+# paying off but the VM team is working on fixing that.
+# TODO(ahe): Remove this option (http://dartbug.com/6495).
+EXTRA_VM_OPTIONS[${#EXTRA_VM_OPTIONS[@]}]='--no_use_inlining'
+
+case $0 in
+  *_developer)
+    EXTRA_VM_OPTIONS[${#EXTRA_VM_OPTIONS[@]}]='--checked'
+    ;;
+esac
+
+exec "$DART" "${EXTRA_VM_OPTIONS[@]}" "$DART2JS" "${EXTRA_OPTIONS[@]}" "$@"
diff --git a/sdk/bin/dart2js.bat b/sdk/bin/dart2js.bat
index 86ede92..687c504 100644
--- a/sdk/bin/dart2js.bat
+++ b/sdk/bin/dart2js.bat
@@ -12,4 +12,4 @@
 set SNAPSHOTNAME=%SCRIPTPATH%dart2js.snapshot
 if exist %SNAPSHOTNAME% set SNAPSHOT=--use_script_snapshot=%SNAPSHOTNAME%
 
-"%SCRIPTPATH%dart" --no_use_inlining --heap_growth_rate=32 %SNAPSHOT% "%SCRIPTPATH%..\lib\_internal\compiler\implementation\dart2js.dart" %arguments%
+"%SCRIPTPATH%dart" --no_use_inlining --heap_growth_rate=512 %SNAPSHOT% "%SCRIPTPATH%..\lib\_internal\compiler\implementation\dart2js.dart" %arguments%
diff --git a/sdk/bin/dart2js_developer b/sdk/bin/dart2js_developer
new file mode 100755
index 0000000..948cb4a
--- /dev/null
+++ b/sdk/bin/dart2js_developer
@@ -0,0 +1,6 @@
+#!/bin/bash
+# Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+. ${BASH_SOURCE%_developer}
diff --git a/sdk/bin/dart2js_developer.bat b/sdk/bin/dart2js_developer.bat
new file mode 100644
index 0000000..1156d9e
--- /dev/null
+++ b/sdk/bin/dart2js_developer.bat
@@ -0,0 +1,15 @@
+@echo off
+REM Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+REM for details. All rights reserved. Use of this source code is governed by a
+REM BSD-style license that can be found in the LICENSE file.
+
+set SCRIPTPATH=%~dp0
+
+REM Does the path have a trailing slash? If so, remove it.
+if %SCRIPTPATH:~-1%== set SCRIPTPATH=%SCRIPTPATH:~0,-1%
+
+set arguments=%*
+set SNAPSHOTNAME=%SCRIPTPATH%dart2js.snapshot
+if exist %SNAPSHOTNAME% set SNAPSHOT=--use_script_snapshot=%SNAPSHOTNAME%
+
+"%SCRIPTPATH%dart" --checked --no_use_inlining --heap_growth_rate=512 %SNAPSHOT% "%SCRIPTPATH%..\lib\_internal\compiler\implementation\dart2js.dart" %arguments%
diff --git a/sdk/lib/_internal/compiler/implementation/apiimpl.dart b/sdk/lib/_internal/compiler/implementation/apiimpl.dart
index e84d45c..608bae78 100644
--- a/sdk/lib/_internal/compiler/implementation/apiimpl.dart
+++ b/sdk/lib/_internal/compiler/implementation/apiimpl.dart
@@ -31,7 +31,9 @@
             enableUserAssertions: hasOption(options, '--enable-checked-mode'),
             enableMinification: hasOption(options, '--minify'),
             enableNativeLiveTypeAnalysis:
-              hasOption(options, '--enable-native-live-type-analysis'),
+              hasOption(options, '--disable-native-live-type-analysis')
+                  ? false
+                  : hasOption(options, '--enable-native-live-type-analysis'),
             emitJavaScript: !hasOption(options, '--output-type=dart'),
             disallowUnsafeEval: hasOption(options, '--disallow-unsafe-eval'),
             analyzeAll: hasOption(options, '--analyze-all'),
@@ -100,23 +102,25 @@
   }
 
   leg.Script readScript(Uri uri, [tree.Node node]) {
-    if (uri.scheme == 'dart') uri = translateDartUri(uri, node);
-    var translated = translateUri(uri, node);
-    String text = "";
-    try {
-      // TODO(ahe): We expect the future to be complete and call value
-      // directly. In effect, we don't support truly asynchronous API.
-      text = provider(translated).value;
-    } catch (exception) {
-      if (node != null) {
-        cancel("$exception", node: node);
-      } else {
-        reportDiagnostic(null, "$exception", api.Diagnostic.ERROR);
-        throw new leg.CompilerCancelledException("$exception");
+    return fileReadingTask.measure(() {
+      if (uri.scheme == 'dart') uri = translateDartUri(uri, node);
+      var translated = translateUri(uri, node);
+      String text = "";
+      try {
+        // TODO(ahe): We expect the future to be complete and call value
+        // directly. In effect, we don't support truly asynchronous API.
+        text = provider(translated).value;
+      } catch (exception) {
+        if (node != null) {
+          cancel("$exception", node: node);
+        } else {
+          reportDiagnostic(null, "$exception", api.Diagnostic.ERROR);
+          throw new leg.CompilerCancelledException("$exception");
+        }
       }
-    }
-    SourceFile sourceFile = new SourceFile(translated.toString(), text);
-    return new leg.Script(uri, sourceFile);
+      SourceFile sourceFile = new SourceFile(translated.toString(), text);
+      return new leg.Script(uri, sourceFile);
+    });
   }
 
   Uri translateUri(Uri uri, tree.Node node) {
@@ -156,9 +160,14 @@
 
   bool run(Uri uri) {
     bool success = super.run(uri);
+    int cumulated = 0;
     for (final task in tasks) {
+      cumulated += task.timing;
       log('${task.name} took ${task.timing}msec');
     }
+    int total = totalCompileTime.elapsedMilliseconds;
+    log('Total compile-time ${total}msec;'
+        ' unaccounted ${total - cumulated}msec');
     return success;
   }
 
diff --git a/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart b/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart
index 975d4e5..2a6adb8 100644
--- a/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart
+++ b/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart
@@ -84,10 +84,12 @@
         Constant result = initialVariableValues[element];
         return result;
       }
-      TreeElements definitions = compiler.analyzeElement(element);
-      Constant constant = compileVariableWithDefinitions(
-          element, definitions, isConst: isConst);
-      return constant;
+      return compiler.withCurrentElement(element, () {
+        TreeElements definitions = compiler.analyzeElement(element);
+        Constant constant = compileVariableWithDefinitions(
+            element, definitions, isConst: isConst);
+        return constant;
+      });
     });
   }
 
@@ -163,7 +165,7 @@
     return measure(() {
       assert(node != null);
       CompileTimeConstantEvaluator evaluator = new CompileTimeConstantEvaluator(
-          constantSystem, definitions, compiler, isConst: isConst);
+          this, definitions, compiler, isConst: isConst);
       return evaluator.evaluate(node);
     });
   }
@@ -174,9 +176,7 @@
       assert(node != null);
       try {
         TryCompileTimeConstantEvaluator evaluator =
-            new TryCompileTimeConstantEvaluator(constantSystem,
-                                                definitions,
-                                                compiler);
+            new TryCompileTimeConstantEvaluator(this, definitions, compiler);
         return evaluator.evaluate(node);
       } on CompileTimeConstantError catch (exn) {
         return null;
@@ -244,17 +244,19 @@
 
 class CompileTimeConstantEvaluator extends Visitor {
   bool isEvaluatingConstant;
-  final ConstantSystem constantSystem;
+  final ConstantHandler handler;
   final TreeElements elements;
   final Compiler compiler;
   bool enabledRuntimeTypeSupport = false;
 
-  CompileTimeConstantEvaluator(this.constantSystem,
+  CompileTimeConstantEvaluator(this.handler,
                                this.elements,
                                this.compiler,
                                {bool isConst: false})
       : this.isEvaluatingConstant = isConst;
 
+  ConstantSystem get constantSystem => handler.constantSystem;
+
   Constant evaluate(Node node) {
     return node.accept(this);
   }
@@ -297,7 +299,7 @@
     // TODO(floitsch): get type parameters.
     DartType type = new InterfaceType(compiler.listClass);
     Constant constant = new ListConstant(type, arguments);
-    compiler.constantHandler.registerCompileTimeConstant(constant);
+    handler.registerCompileTimeConstant(constant);
     return constant;
   }
 
@@ -333,7 +335,7 @@
     // TODO(floitsch): this should be a List<String> type.
     DartType keysType = new InterfaceType(compiler.listClass);
     ListConstant keysList = new ListConstant(keysType, keys);
-    compiler.constantHandler.registerCompileTimeConstant(keysList);
+    handler.registerCompileTimeConstant(keysList);
     SourceString className = hasProtoKey
                              ? MapConstant.DART_PROTO_CLASS
                              : MapConstant.DART_CLASS;
@@ -343,7 +345,7 @@
     DartType type = new InterfaceType(classElement);
     registerInstantiatedClass(classElement);
     Constant constant = new MapConstant(type, keysList, values, protoValue);
-    compiler.constantHandler.registerCompileTimeConstant(constant);
+    handler.registerCompileTimeConstant(constant);
     return constant;
   }
 
@@ -415,7 +417,7 @@
     DartType elementType = element.computeType(compiler).asRaw();
     DartType constantType = compiler.typeClass.computeType(compiler);
     Constant constant = new TypeConstant(elementType, constantType);
-    compiler.constantHandler.registerCompileTimeConstant(constant);
+    handler.registerCompileTimeConstant(constant);
     return constant;
   }
 
@@ -426,15 +428,15 @@
       if (Elements.isStaticOrTopLevelFunction(element)) {
         compiler.codegenWorld.staticFunctionsNeedingGetter.add(element);
         Constant constant = new FunctionConstant(element);
-        compiler.constantHandler.registerCompileTimeConstant(constant);
+        handler.registerCompileTimeConstant(constant);
         compiler.enqueuer.codegen.registerStaticUse(element);
         return constant;
       } else if (Elements.isStaticOrTopLevelField(element)) {
         Constant result;
         if (element.modifiers.isConst()) {
-          result = compiler.compileConstant(element);
+          result = handler.compileConstant(element);
         } else if (element.modifiers.isFinal() && !isEvaluatingConstant) {
-          result = compiler.compileVariable(element);
+          result = handler.compileVariable(element);
         }
         if (result != null) return result;
       } else if (Elements.isClass(element) || Elements.isTypedef(element)) {
@@ -584,7 +586,7 @@
     List<Constant> compiledArguments = <Constant>[];
 
     Function compileArgument = evaluateConstant;
-    Function compileConstant = compiler.compileConstant;
+    Function compileConstant = handler.compileConstant;
     bool succeeded = selector.addArgumentsToList(arguments,
                                                  compiledArguments,
                                                  target,
@@ -622,7 +624,7 @@
     List<Constant> arguments = evaluateArgumentsToConstructor(
         node, selector, send.arguments, constructor);
     ConstructorEvaluator evaluator =
-        new ConstructorEvaluator(node, constructor, constantSystem, compiler);
+        new ConstructorEvaluator(node, constructor, handler, compiler);
     evaluator.evaluateConstructorFieldValues(arguments);
     List<Constant> jsNewArguments = evaluator.buildJsNewArguments(classElement);
 
@@ -630,7 +632,7 @@
     // TODO(floitsch): take generic types into account.
     DartType type = classElement.computeType(compiler);
     Constant constant = new ConstructedConstant(type, jsNewArguments);
-    compiler.constantHandler.registerCompileTimeConstant(constant);
+    handler.registerCompileTimeConstant(constant);
     return constant;
   }
 
@@ -659,10 +661,10 @@
 }
 
 class TryCompileTimeConstantEvaluator extends CompileTimeConstantEvaluator {
-  TryCompileTimeConstantEvaluator(ConstantSystem constantSystem,
+  TryCompileTimeConstantEvaluator(ConstantHandler handler,
                                   TreeElements elements,
                                   Compiler compiler)
-      : super(constantSystem, elements, compiler, isConst: true);
+      : super(handler, elements, compiler, isConst: true);
 
   error(Node node) {
     // Just fail without reporting it anywhere.
@@ -683,12 +685,12 @@
    */
   ConstructorEvaluator(Node node,
                        FunctionElement constructor,
-                       ConstantSystem constantSystem,
+                       ConstantHandler handler,
                        Compiler compiler)
       : this.constructor = constructor,
         this.definitions = new Map<Element, Constant>(),
         this.fieldValues = new Map<Element, Constant>(),
-        super(constantSystem,
+        super(handler,
               compiler.resolver.resolveMethodElement(constructor.declaration),
               compiler,
               isConst: true) {
@@ -755,7 +757,7 @@
         currentNode, selector, arguments, targetConstructor);
 
     ConstructorEvaluator evaluator = new ConstructorEvaluator(
-        currentNode, targetConstructor, constantSystem, compiler);
+        currentNode, targetConstructor, handler, compiler);
     evaluator.evaluateConstructorFieldValues(compiledArguments);
     // Copy over the fieldValues from the super/redirect-constructor.
     // No need to go through [updateFieldValue] because the
@@ -844,7 +846,7 @@
           Constant fieldValue = fieldValues[field];
           if (fieldValue == null) {
             // Use the default value.
-            fieldValue = compiler.compileConstant(field);
+            fieldValue = handler.compileConstant(field);
           }
           jsNewArguments.add(fieldValue);
         },
diff --git a/sdk/lib/_internal/compiler/implementation/compiler.dart b/sdk/lib/_internal/compiler/implementation/compiler.dart
index e770cff..a791281 100644
--- a/sdk/lib/_internal/compiler/implementation/compiler.dart
+++ b/sdk/lib/_internal/compiler/implementation/compiler.dart
@@ -58,6 +58,11 @@
   }
 }
 
+class ReadingFilesTask extends CompilerTask {
+  ReadingFilesTask(Compiler compiler) : super(compiler);
+  String get name => 'Reading input files';
+}
+
 abstract class Backend {
   final Compiler compiler;
   final ConstantSystem constantSystem;
@@ -100,6 +105,7 @@
 
 abstract class Compiler implements DiagnosticListener {
   final Map<String, LibraryElement> libraries;
+  final Stopwatch totalCompileTime = new Stopwatch();
   int nextFreeClassId = 0;
   World world;
   String assembledCode;
@@ -189,7 +195,9 @@
   ti.TypesTask typesTask;
   Backend backend;
   ConstantHandler constantHandler;
+  ConstantHandler metadataHandler;
   EnqueueTask enqueuer;
+  CompilerTask fileReadingTask;
 
   static const SourceString MAIN = const SourceString('main');
   static const SourceString CALL_OPERATOR_NAME = const SourceString('call');
@@ -232,27 +240,31 @@
         progress = new Stopwatch() {
     progress.start();
     world = new World(this);
-    scanner = new ScannerTask(this);
-    dietParser = new DietParserTask(this);
-    parser = new ParserTask(this);
-    patchParser = new PatchParserTask(this);
-    libraryLoader = new LibraryLoaderTask(this);
-    validator = new TreeValidatorTask(this);
-    resolver = new ResolverTask(this);
-    closureToClassMapper = new closureMapping.ClosureTask(this);
-    checker = new TypeCheckerTask(this);
-    typesTask = new ti.TypesTask(this, enableConcreteTypeInference);
     backend = emitJavaScript ?
         new js_backend.JavaScriptBackend(this,
                                          generateSourceMap,
                                          disallowUnsafeEval) :
         new dart_backend.DartBackend(this, strips);
-    constantHandler = new ConstantHandler(this, backend.constantSystem);
-    enqueuer = new EnqueueTask(this);
-    tasks = [scanner, dietParser, parser, patchParser, libraryLoader,
-             resolver, closureToClassMapper, checker, typesTask,
-             constantHandler, enqueuer];
+
+    // No-op in production mode.
+    validator = new TreeValidatorTask(this);
+
+    tasks = [
+      fileReadingTask = new ReadingFilesTask(this),
+      libraryLoader = new LibraryLoaderTask(this),
+      scanner = new ScannerTask(this),
+      dietParser = new DietParserTask(this),
+      parser = new ParserTask(this),
+      patchParser = new PatchParserTask(this),
+      resolver = new ResolverTask(this),
+      closureToClassMapper = new closureMapping.ClosureTask(this),
+      checker = new TypeCheckerTask(this),
+      typesTask = new ti.TypesTask(this, enableConcreteTypeInference),
+      constantHandler = new ConstantHandler(this, backend.constantSystem),
+      enqueuer = new EnqueueTask(this)];
+
     tasks.addAll(backend.tasks);
+    metadataHandler = new ConstantHandler(this, backend.constantSystem);
   }
 
   Universe get resolverWorld => enqueuer.resolution.universe;
@@ -340,13 +352,16 @@
   }
 
   bool run(Uri uri) {
+    totalCompileTime.start();
     try {
       runCompiler(uri);
     } on CompilerCancelledException catch (exception) {
       log('Error: $exception');
       return false;
+    } finally {
+      tracer.close();
+      totalCompileTime.stop();
     }
-    tracer.close();
     return true;
   }
 
@@ -486,15 +501,21 @@
   /** Enable the 'JS' helper for a library if needed. */
   void maybeEnableJSHelper(LibraryElement library) {
     String libraryName = library.uri.toString();
-    if (library.entryCompilationUnit.script.name.contains(
-            'dart/tests/compiler/dart2js_native')
+    bool nativeTest = library.entryCompilationUnit.script.name.contains(
+        'dart/tests/compiler/dart2js_native');
+    if (nativeTest
         || libraryName == 'dart:mirrors'
         || libraryName == 'dart:isolate'
         || libraryName == 'dart:math'
         || libraryName == 'dart:html'
-        || libraryName == 'dart:svg') {
-      if (libraryName == 'dart:html' || libraryName == 'dart:mirrors') {
-        // dart:html needs access to convertDartClosureToJS.
+        || libraryName == 'dart:svg'
+        || libraryName == 'dart:web_audio') {
+      if (nativeTest
+          || libraryName == 'dart:html'
+          || libraryName == 'dart:svg'
+          || libraryName == 'dart:mirrors') {
+        // dart:html and dart:svg need access to convertDartClosureToJS and
+        // annotation classes.
         // dart:mirrors needs access to the Primitives class.
         importHelperLibrary(library);
       }
@@ -718,27 +739,6 @@
         () => resolver.computeFunctionType(element, signature));
   }
 
-  bool isLazilyInitialized(VariableElement element) {
-    Constant initialValue = compileVariable(element);
-    return initialValue == null;
-  }
-
-  /**
-   * Compiles compile-time constants. Never returns [:null:].
-   * If the initial value is not a compile-time constants reports an error.
-   */
-  Constant compileConstant(VariableElement element) {
-    return withCurrentElement(element, () {
-      return constantHandler.compileConstant(element);
-    });
-  }
-
-  Constant compileVariable(VariableElement element) {
-    return withCurrentElement(element, () {
-      return constantHandler.compileVariable(element);
-    });
-  }
-
   reportWarning(Node node, var message) {
     if (message is TypeWarning) {
       // TODO(ahe): Don't supress these warning when the type checker
@@ -863,16 +863,18 @@
   int get timing => watch.elapsedMilliseconds;
 
   measure(Function action) {
-    // TODO(kasperl): Do we have to worry about exceptions here?
     CompilerTask previous = compiler.measuredTask;
+    if (identical(this, previous)) return action();
     compiler.measuredTask = this;
     if (previous != null) previous.watch.stop();
     watch.start();
-    var result = action();
-    watch.stop();
-    if (previous != null) previous.watch.start();
-    compiler.measuredTask = previous;
-    return result;
+    try {
+      return action();
+    } finally {
+      watch.stop();
+      if (previous != null) previous.watch.start();
+      compiler.measuredTask = previous;
+    }
   }
 }
 
diff --git a/sdk/lib/_internal/compiler/implementation/dart2js.dart b/sdk/lib/_internal/compiler/implementation/dart2js.dart
index fdc98b9..c4687ba 100644
--- a/sdk/lib/_internal/compiler/implementation/dart2js.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart2js.dart
@@ -164,6 +164,7 @@
     new OptionHandler('--package-root=.+|-p.+', setPackageRoot),
     new OptionHandler('--disallow-unsafe-eval', passThrough),
     new OptionHandler('--analyze-all', passThrough),
+    new OptionHandler('--disable-native-live-type-analysis', passThrough),
     new OptionHandler('--enable-native-live-type-analysis', passThrough),
     new OptionHandler('--reject-deprecated-language-features', passThrough),
     new OptionHandler('--report-sdk-use-of-deprecated-language-features',
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
index c012488..fb1cf88 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
@@ -137,7 +137,7 @@
     Set<DartType> processedTypes = new Set<DartType>();
     List<DartType> workQueue = new List<DartType>();
     workQueue.addAll(
-        classMembers.keys.map((classElement) => classElement.type));
+        classMembers.keys.map((classElement) => classElement.thisType));
     workQueue.addAll(compiler.resolverWorld.isChecks);
     Element typeErrorElement =
         compiler.coreLibrary.find(new SourceString('TypeError'));
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/placeholder_collector.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/placeholder_collector.dart
index 63e14f9..24859f4 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/placeholder_collector.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/placeholder_collector.dart
@@ -174,14 +174,14 @@
   void collectFunctionDeclarationPlaceholders(
       FunctionElement element, FunctionExpression node) {
     if (element.isGenerativeConstructor() || element.isFactoryConstructor()) {
-      DartType type = element.getEnclosingClass().type.asRaw();
+      DartType type = element.getEnclosingClass().thisType.asRaw();
       makeConstructorPlaceholder(node.name, element, type);
       Return bodyAsReturn = node.body.asReturn();
       if (bodyAsReturn != null && bodyAsReturn.isRedirectingFactoryBody) {
         // Factory redirection.
         FunctionElement redirectTarget = element.defaultImplementation;
         assert(redirectTarget != null && redirectTarget != element);
-        type = redirectTarget.getEnclosingClass().type.asRaw();
+        type = redirectTarget.getEnclosingClass().thisType.asRaw();
         makeConstructorPlaceholder(
             bodyAsReturn.expression, redirectTarget, type);
       }
@@ -365,8 +365,14 @@
     Element constructor = treeElements[send];
     assert(constructor != null);
     assert(send.receiver == null);
-    if (!Elements.isErroneousElement(constructor) &&
-        !Elements.isMalformedElement(constructor)) {
+
+    // For constructors that refer to malformed class types retrieve
+    // class type like it is done in [ SsaBuilder.visitNewSend ].
+    if (type.kind == TypeKind.MALFORMED_TYPE) {
+      type = constructor.getEnclosingClass().thisType;
+    }
+
+    if (!Elements.isUnresolved(constructor)) {
       makeConstructorPlaceholder(node.send.selector, constructor, type);
       // TODO(smok): Should this be in visitNamedArgument?
       // Field names can be exposed as names of optional arguments, e.g.
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/renamer.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/renamer.dart
index f132df6..44daef6 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/renamer.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/renamer.dart
@@ -88,7 +88,7 @@
     // js-helpers.
     StringBuffer result = new StringBuffer(renameElement(type.element));
     if (type is InterfaceType) {
-      if (!type.typeArguments.isEmpty) {
+      if (!type.isRaw) {
         result.add('<');
         Link<DartType> argumentsLink = type.typeArguments;
         result.add(renameType(argumentsLink.head, renameElement));
@@ -285,7 +285,7 @@
   }
 
   // Rename constructors.
-  placeholderCollector.constructorPlaceholders.forEach(
+  sortedForEach(placeholderCollector.constructorPlaceholders,
       (Element constructor, List<ConstructorPlaceholder> placeholders) {
         for (ConstructorPlaceholder ph in placeholders) {
           renames[ph.node] =
diff --git a/sdk/lib/_internal/compiler/implementation/elements/elements.dart b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
index df07e95..2289215 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/elements.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
@@ -355,9 +355,11 @@
     }
   }
 
-  bool _isNative = false;
-  void setNative() { _isNative = true; }
-  bool isNative() => _isNative;
+  String _nativeName = null;
+  bool isNative() => _nativeName != null;
+  String nativeName() => _nativeName;
+  /// Marks this element as a native element.
+  void setNative(String name) { _nativeName = name; }
 
   FunctionElement asFunctionElement() => null;
 
@@ -838,6 +840,19 @@
 class TypedefElement extends Element implements TypeDeclarationElement {
   Typedef cachedNode;
   TypedefType cachedType;
+
+  /**
+   * Canonicalize raw version of [cachedType].
+   *
+   * See [ClassElement.rawType] for motivation.
+   *
+   * The [rawType] is computed together with [cachedType] in [computeType].
+   */
+  TypedefType rawType;
+
+  /**
+   * The type annotation which defines this typedef.
+   */
   DartType alias;
 
   bool isResolved = false;
@@ -862,6 +877,16 @@
     Link<DartType> parameters =
         TypeDeclarationElement.createTypeVariables(this, node.typeParameters);
     cachedType = new TypedefType(this, parameters);
+    if (parameters.isEmpty) {
+      rawType = cachedType;
+    } else {
+      var dynamicParameters = const Link<DartType>();
+      parameters.forEach((_) {
+        dynamicParameters =
+            dynamicParameters.prepend(compiler.types.dynamicType);
+      });
+      rawType = new TypedefType(this, dynamicParameters);
+    }
     compiler.resolveTypedef(this);
     return cachedType;
   }
@@ -1383,11 +1408,40 @@
 abstract class ClassElement extends ScopeContainerElement
     implements TypeDeclarationElement {
   final int id;
-  InterfaceType type;
+  /**
+   * The type of [:this:] for this class declaration.
+   *
+   * The type of [:this:] is the interface type based on this element in which
+   * the type arguments are the declared type variables. For instance,
+   * [:List<E>:] for [:List:] and [:Map<K,V>:] for [:Map:].
+   *
+   * This type is computed in [computeType].
+   */
+  InterfaceType thisType;
+
+  /**
+   * The raw type for this class declaration.
+   *
+   * The raw type is the interface type base on this element in which the type
+   * arguments are all [dynamic]. For instance [:List<dynamic>:] for [:List:]
+   * and [:Map<dynamic,dynamic>:] for [:Map:]. For non-generic classes [rawType]
+   * is the same as [thisType].
+   *
+   * The [rawType] field is a canonicalization of the raw type and should be
+   * used to distinguish explicit and implicit uses of the [dynamic]
+   * type arguments. For instance should [:List:] be the [rawType] of the
+   * [:List:] class element whereas [:List<dynamic>:] should be its own
+   * instantiation of [InterfaceType] with [:dynamic:] as type argument. Using
+   * this distinction, we can print the raw type with type arguments only when
+   * the input source has used explicit type arguments.
+   *
+   * This type is computed together with [thisType] in [computeType].
+   */
+  InterfaceType rawType;
   DartType supertype;
   DartType defaultClass;
   Link<DartType> interfaces;
-  SourceString nativeName;
+  SourceString nativeTagInfo;
   int supertypeLoadState;
   int resolutionState;
 
@@ -1409,18 +1463,29 @@
   ClassNode parseNode(Compiler compiler);
 
   InterfaceType computeType(compiler) {
-    if (type == null) {
+    if (thisType == null) {
       if (origin == null) {
         ClassNode node = parseNode(compiler);
         Link<DartType> parameters =
             TypeDeclarationElement.createTypeVariables(this,
                                                        node.typeParameters);
-        type = new InterfaceType(this, parameters);
+        thisType = new InterfaceType(this, parameters);
+        if (parameters.isEmpty) {
+          rawType = thisType;
+        } else {
+          var dynamicParameters = const Link<DartType>();
+          parameters.forEach((_) {
+            dynamicParameters =
+                dynamicParameters.prepend(compiler.types.dynamicType);
+          });
+          rawType = new InterfaceType(this, dynamicParameters);
+        }
       } else {
-        type = origin.computeType(compiler);
+        thisType = origin.computeType(compiler);
+        rawType = origin.rawType;
       }
     }
-    return type;
+    return thisType;
   }
 
   bool get isPatched => patch != null;
@@ -1435,7 +1500,7 @@
   bool isObject(Compiler compiler) =>
       identical(declaration, compiler.objectClass);
 
-  Link<DartType> get typeVariables => type.typeArguments;
+  Link<DartType> get typeVariables => thisType.typeArguments;
 
   ClassElement ensureResolved(Compiler compiler) {
     if (resolutionState == STATE_NOT_STARTED) {
@@ -1724,15 +1789,11 @@
   }
 
   bool isInterface() => false;
-  bool isNative() => nativeName != null;
+  bool isNative() => nativeTagInfo != null;
   int get hashCode => id;
 
   Scope buildScope() => new ClassScope(enclosingElement.buildScope(), this);
 
-  Link<DartType> get allSupertypesAndSelf {
-    return allSupertypes.prepend(new InterfaceType(this));
-  }
-
   String toString() {
     if (origin != null) {
       return 'patch ${super.toString()}';
@@ -1852,7 +1913,7 @@
     } else if (identical(value, '[]')) {
       return const SourceString(r'operator$index');
     } else if (identical(value, '[]=')) {
-      return const SourceString(r'oprator$indexSet');
+      return const SourceString(r'operator$indexSet');
     } else if (identical(value, '*')) {
       return const SourceString(r'operator$mul');
     } else if (identical(value, '/')) {
@@ -1890,7 +1951,8 @@
     }
   }
 
-  static SourceString constructOperatorName(SourceString op, bool isUnary) {
+  static SourceString constructOperatorNameOrNull(SourceString op,
+                                                  bool isUnary) {
     String value = op.stringValue;
     if ((identical(value, '==')) ||
         (identical(value, '~')) ||
@@ -1915,11 +1977,17 @@
     } else if (identical(value, '-')) {
       return isUnary ? const SourceString('unary-') : op;
     } else {
-      throw 'Unhandled operator: ${op.slowToString()}';
+      return null;
     }
   }
 
-  static SourceString mapToUserOperator(SourceString op) {
+  static SourceString constructOperatorName(SourceString op, bool isUnary) {
+    SourceString operatorName = constructOperatorNameOrNull(op, isUnary);
+    if (operatorName == null) throw 'Unhandled operator: ${op.slowToString()}';
+    else return operatorName;
+  }
+
+  static SourceString mapToUserOperatorOrNull(SourceString op) {
     String value = op.stringValue;
 
     if (identical(value, '!=')) return const SourceString('==');
@@ -1935,7 +2003,13 @@
     if (identical(value, '^=')) return const SourceString('^');
     if (identical(value, '|=')) return const SourceString('|');
 
-    throw 'Unhandled operator: ${op.slowToString()}';
+    return null;
+  }
+
+  static SourceString mapToUserOperator(SourceString op) {
+    SourceString userOperator = mapToUserOperatorOrNull(op);
+    if (userOperator == null) throw 'Unhandled operator: ${op.slowToString()}';
+    else return userOperator;
   }
 
   static bool isNumberOrStringSupertype(Element element, Compiler compiler) {
diff --git a/sdk/lib/_internal/compiler/implementation/enqueue.dart b/sdk/lib/_internal/compiler/implementation/enqueue.dart
index f12d760..e066fb5 100644
--- a/sdk/lib/_internal/compiler/implementation/enqueue.dart
+++ b/sdk/lib/_internal/compiler/implementation/enqueue.dart
@@ -89,10 +89,6 @@
       if (isResolutionQueue && getCachedElements(element) != null) return;
       compiler.internalErrorOnElement(element, "Work list is closed.");
     }
-    if (!isResolutionQueue &&
-        identical(element.kind, ElementKind.GENERATIVE_CONSTRUCTOR)) {
-      registerInstantiatedClass(element.getEnclosingClass());
-    }
     if (elements == null) {
       elements = getCachedElements(element);
     }
@@ -139,8 +135,10 @@
 
   void registerInstantiatedClass(ClassElement cls) {
     if (universe.instantiatedClasses.contains(cls)) return;
-    universe.instantiatedClasses.add(cls);
-    onRegisterInstantiatedClass(cls);
+    if (!cls.isAbstract(compiler)) {
+      universe.instantiatedClasses.add(cls);
+      onRegisterInstantiatedClass(cls);
+    }
     compiler.backend.registerInstantiatedClass(cls, this);
   }
 
@@ -173,6 +171,7 @@
     if (member.isField()) {
       // Native fields need to go into instanceMembersByName as they are virtual
       // instantiation points and escape points.
+      // Test the enclosing class, since the metadata has not been parsed yet.
       if (!member.enclosingElement.isNative()) return;
     }
 
@@ -212,6 +211,7 @@
       }
     } else if (member.kind == ElementKind.FIELD &&
                member.enclosingElement.isNative()) {
+      nativeEnqueuer.registerField(member);
       if (universe.hasInvokedGetter(member, compiler) ||
           universe.hasInvocation(member, compiler)) {
         nativeEnqueuer.registerFieldLoad(member);
@@ -228,10 +228,9 @@
       // supertypes.
       cls.ensureResolved(compiler);
 
-      for (Link<DartType> supertypes = cls.allSupertypesAndSelf;
-           !supertypes.isEmpty; supertypes = supertypes.tail) {
-        cls = supertypes.head.element;
-        if (seenClasses.contains(cls)) continue;
+      void processClass(ClassElement cls) {
+        if (seenClasses.contains(cls)) return;
+
         seenClasses.add(cls);
         cls.ensureResolved(compiler);
         cls.implementation.forEachMember(processInstantiatedClassMember);
@@ -255,6 +254,11 @@
           });
         }
       }
+      processClass(cls);
+      for (Link<DartType> supertypes = cls.allSupertypes;
+           !supertypes.isEmpty; supertypes = supertypes.tail) {
+        processClass(supertypes.head.element);
+      }
     });
   }
 
diff --git a/sdk/lib/_internal/compiler/implementation/js/nodes.dart b/sdk/lib/_internal/compiler/implementation/js/nodes.dart
index cfc88a5..ec1469c 100644
--- a/sdk/lib/_internal/compiler/implementation/js/nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/js/nodes.dart
@@ -429,6 +429,9 @@
 
 abstract class Expression extends Node {
   int get precedenceLevel;
+
+  PropertyAccess dot(String name) => new PropertyAccess.field(this, name);
+  Call callWith(List<Expression> arguments) => new Call(this, arguments);
 }
 
 class LiteralExpression extends Expression {
diff --git a/sdk/lib/_internal/compiler/implementation/js/printer.dart b/sdk/lib/_internal/compiler/implementation/js/printer.dart
index 267ccc5..ce2e056 100644
--- a/sdk/lib/_internal/compiler/implementation/js/printer.dart
+++ b/sdk/lib/_internal/compiler/implementation/js/printer.dart
@@ -12,21 +12,21 @@
   bool inForInit = false;
   bool atStatementBegin = false;
   final DanglingElseVisitor danglingElseVisitor;
-  final LocalNamer localNamer;
+  final Namer namer;
   bool pendingSemicolon = false;
   bool pendingSpace = false;
-  static final identifierRegexp = new RegExp(r'^[a-zA-Z_0-9$]');
+  static final identifierCharacterRegExp = new RegExp(r'^[a-zA-Z_0-9$]');
 
   Printer(leg.Compiler compiler, { allowVariableMinification: true })
       : shouldCompressOutput = compiler.enableMinification,
         this.compiler = compiler,
         outBuffer = new leg.CodeBuffer(),
         danglingElseVisitor = new DanglingElseVisitor(compiler),
-        localNamer = determineRenamer(compiler.enableMinification,
-                                      allowVariableMinification);
+        namer = determineRenamer(compiler.enableMinification,
+                                 allowVariableMinification);
 
-  static LocalNamer determineRenamer(bool shouldCompressOutput,
-                                     bool allowVariableMinification) {
+  static Namer determineRenamer(bool shouldCompressOutput,
+                                bool allowVariableMinification) {
     return (shouldCompressOutput && allowVariableMinification)
         ? new MinifyRenamer() : new IdentityNamer();
   }
@@ -51,7 +51,7 @@
         outBuffer.add(";");
       }
       if (pendingSpace &&
-          (!shouldCompressOutput || identifierRegexp.hasMatch(str))) {
+          (!shouldCompressOutput || identifierCharacterRegExp.hasMatch(str))) {
         outBuffer.add(" ");
       }
       pendingSpace = false;
@@ -391,7 +391,7 @@
       visitNestedExpression(name, PRIMARY,
                             newInForInit: false, newAtStatementBegin: false);
     }
-    localNamer.enterScope(vars);
+    namer.enterScope(vars);
     out("(");
     if (fun.params != null) {
       visitCommaSeparated(fun.params, PRIMARY,
@@ -399,7 +399,7 @@
     }
     out(")");
     blockBody(fun.body, needsSeparation: false, needsNewline: false);
-    localNamer.leaveScope();
+    namer.leaveScope();
   }
 
   visitFunctionDeclaration(FunctionDeclaration declaration) {
@@ -639,7 +639,7 @@
   }
 
   visitVariableUse(VariableUse ref) {
-    out(localNamer.getName(ref.name));
+    out(namer.getName(ref.name));
   }
 
   visitThis(This node) {
@@ -647,11 +647,11 @@
   }
 
   visitVariableDeclaration(VariableDeclaration decl) {
-    out(localNamer.getName(decl.name));
+    out(namer.getName(decl.name));
   }
 
   visitParameter(Parameter param) {
-    out(localNamer.getName(param.name));
+    out(namer.getName(param.name));
   }
 
   bool isDigit(int charCode) {
@@ -944,7 +944,7 @@
 }
 
 
-abstract class LocalNamer {
+abstract class Namer {
   String getName(String oldName);
   String declareVariable(String oldName);
   String declareParameter(String oldName);
@@ -953,7 +953,7 @@
 }
 
 
-class IdentityNamer implements LocalNamer {
+class IdentityNamer implements Namer {
   String getName(String oldName) => oldName;
   String declareVariable(String oldName) => oldName;
   String declareParameter(String oldName) => oldName;
@@ -962,7 +962,7 @@
 }
 
 
-class MinifyRenamer implements LocalNamer {
+class MinifyRenamer implements Namer {
   final List<Map<String, String>> maps = [];
   final List<int> parameterNumberStack = [];
   final List<int> variableNumberStack = [];
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
index 9aa445d..d73707a 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
@@ -101,6 +101,13 @@
                                           HTypeMap types) {
     HTypeList result;
     int argumentsCount = node.inputs.length - 1;
+    int startInvokeIndex = HInvoke.ARGUMENTS_OFFSET;
+
+    if (node.isInterceptorCall) {
+      argumentsCount--;
+      startInvokeIndex++;
+    }
+
     if (selector.namedArgumentCount > 0) {
       result =
           new HTypeList.withNamedArguments(
@@ -108,8 +115,9 @@
     } else {
       result = new HTypeList(argumentsCount);
     }
+
     for (int i = 0; i < result.types.length; i++) {
-      result.types[i] = types[node.inputs[i + 1]];
+      result.types[i] = types[node.inputs[i + startInvokeIndex]];
     }
     return result;
   }
@@ -142,38 +150,6 @@
     return onlyUnknown ? HTypeList.ALL_UNKNOWN : result;
   }
 
-  /**
-   * Create the union of this [HTypeList] object with the types used by
-   * the [node]. If the union results in exactly the same types the receiver
-   * is returned. Otherwise a different [HTypeList] object is returned
-   * with the type union information.
-   */
-  HTypeList unionWithInvoke(HInvoke node, HTypeMap types, Compiler compiler) {
-    // Union an all unknown list with something stays all unknown.
-    if (allUnknown) return this;
-
-    bool allUnknown = true;
-    if (length != node.inputs.length - 1) {
-      return HTypeList.ALL_UNKNOWN;
-    }
-
-    bool onlyUnknown = true;
-    HTypeList result = this;
-    for (int i = 0; i < length; i++) {
-      HType newType = this[i].union(types[node.inputs[i + 1]], compiler);
-      if (result == this && newType != this[i]) {
-        // Create a new argument types object with the matching types copied.
-        result = new HTypeList(length);
-        result.types.setRange(0, i, this.types);
-      }
-      if (result != this) {
-        result.types[i] = newType;
-      }
-      if (result[i] != HType.UNKNOWN) onlyUnknown = false;
-    }
-    return onlyUnknown ? HTypeList.ALL_UNKNOWN : result;
-  }
-
   HTypeList unionWithOptionalParameters(
       Selector selector,
       FunctionSignature signature,
@@ -473,18 +449,22 @@
 
   Compiler get compiler => backend.compiler;
 
+  bool updateTypes(HTypeList oldTypes, HTypeList newTypes, var key, var map) {
+    if (oldTypes.allUnknown) return false;
+    newTypes = oldTypes.union(newTypes, backend.compiler);
+    if (identical(newTypes, oldTypes)) return false;
+    map[key] = newTypes;
+    return true;
+  }
+
   void registerStaticInvocation(HInvokeStatic node, HTypeMap types) {
     Element element = node.element;
     assert(invariant(node, element.isDeclaration));
     HTypeList oldTypes = staticTypeMap[element];
+    HTypeList newTypes = new HTypeList.fromStaticInvocation(node, types);
     if (oldTypes == null) {
-      staticTypeMap[element] = new HTypeList.fromStaticInvocation(node, types);
-    } else {
-      if (oldTypes.allUnknown) return;
-      HTypeList newTypes =
-          oldTypes.unionWithInvoke(node, types, backend.compiler);
-      if (identical(newTypes, oldTypes)) return;
       staticTypeMap[element] = newTypes;
+    } else if (updateTypes(oldTypes, newTypes, element, staticTypeMap)) {
       if (optimizedStaticFunctions.contains(element)) {
         backend.scheduleForRecompilation(element);
       }
@@ -524,10 +504,7 @@
       selectorTypeMap[selector] = providedTypes;
     } else {
       HTypeList oldTypes = selectorTypeMap[selector];
-      HTypeList newTypes =
-           oldTypes.unionWithInvoke(node, types, backend.compiler);
-      if (identical(newTypes, oldTypes)) return;
-      selectorTypeMap[selector] = newTypes;
+      updateTypes(oldTypes, providedTypes, selector, selectorTypeMap);
     }
 
     // If we're not compiling, we don't have to do anything.
@@ -657,6 +634,10 @@
   ClassElement objectInterceptorClass;
   Element jsArrayLength;
   Element jsStringLength;
+  Element jsArrayRemoveLast;
+  Element jsArrayAdd;
+  Element jsStringSplit;
+  Element jsStringConcat;
   Element getInterceptorMethod;
   bool _interceptorsAreInitialized = false;
 
@@ -694,7 +675,24 @@
    * name to the list of members that have that name. This map is used
    * by the codegen to know whether a send must be intercepted or not.
    */
-  final Map<SourceString, Set<Element>> interceptedElements;  
+  final Map<SourceString, Set<Element>> interceptedElements;
+
+  /**
+   * A map of specialized versions of the [getInterceptorMethod].
+   * Since [getInterceptorMethod] is a hot method at runtime, we're
+   * always specializing it based on the incoming type. The keys in
+   * the map are the names of these specialized versions. Note that
+   * the generic version that contains all possible type checks is
+   * also stored in this map.
+   */
+  final Map<String, Collection<ClassElement>> specializedGetInterceptors;
+
+  /**
+   * Set of classes whose instances are intercepted. Implemented as a
+   * [LinkedHashMap] to preserve the insertion order.
+   * TODO(ngeoffray): Use a BitSet instead.
+   */
+  final Map<ClassElement, ClassElement> interceptedClasses;
 
   List<CompilerTask> get tasks {
     return <CompilerTask>[builder, optimizer, generator, emitter];
@@ -702,14 +700,19 @@
 
   final RuntimeTypeInformation rti;
 
-  JavaScriptBackend(Compiler compiler, bool generateSourceMap, bool disableEval)
-      : namer = determineNamer(compiler),
+  JavaScriptBackend(Compiler compiler,
+                    bool generateSourceMap,
+                    bool disableEval)
+      : namer = new Namer(compiler),
         returnInfo = new Map<Element, ReturnInfo>(),
         invalidateAfterCodegen = new List<Element>(),
         interceptors = new Interceptors(compiler),
         usedInterceptors = new Set<Selector>(),
         interceptedElements = new Map<SourceString, Set<Element>>(),
         rti = new RuntimeTypeInformation(compiler),
+        specializedGetInterceptors =
+            new Map<String, Collection<ClassElement>>(),
+        interceptedClasses = new LinkedHashMap<ClassElement, ClassElement>(),
         super(compiler, JAVA_SCRIPT_CONSTANT_SYSTEM) {
     emitter = disableEval
         ? new CodeEmitterNoEvalTask(compiler, namer, generateSourceMap)
@@ -721,22 +724,9 @@
     fieldTypes = new FieldTypesRegistry(this);
   }
 
-  static Namer determineNamer(Compiler compiler) {
-    return compiler.enableMinification ?
-        new MinifyNamer(compiler) :
-        new Namer(compiler);
-  }
-
   bool isInterceptorClass(Element element) {
     if (element == null) return false;
-    return element == jsStringClass
-        || element == jsArrayClass
-        || element == jsIntClass
-        || element == jsDoubleClass
-        || element == jsNullClass
-        || element == jsFunctionClass
-        || element == jsBoolClass
-        || element == jsNumberClass;
+    return interceptedClasses.containsKey(element);
   }
 
   void addInterceptedSelector(Selector selector) {
@@ -761,33 +751,47 @@
     return result;
   }
 
+  List<ClassElement> getListOfInterceptedClasses() {
+      return <ClassElement>[jsStringClass, jsArrayClass, jsIntClass,
+                            jsDoubleClass, jsNumberClass, jsNullClass,
+                            jsFunctionClass, jsBoolClass];
+  }
+
   void initializeInterceptorElements() {
     objectInterceptorClass =
         compiler.findInterceptor(const SourceString('ObjectInterceptor'));
     getInterceptorMethod =
         compiler.findInterceptor(const SourceString('getInterceptor'));
-    jsStringClass =
-        compiler.findInterceptor(const SourceString('JSString'));
-    jsArrayClass =
-        compiler.findInterceptor(const SourceString('JSArray'));
-    jsNumberClass =
-        compiler.findInterceptor(const SourceString('JSNumber'));
-    jsIntClass =
-        compiler.findInterceptor(const SourceString('JSInt'));
-    jsDoubleClass =
-        compiler.findInterceptor(const SourceString('JSDouble'));
-    jsNullClass =
-        compiler.findInterceptor(const SourceString('JSNull'));
-    jsFunctionClass =
-        compiler.findInterceptor(const SourceString('JSFunction'));
-    jsBoolClass =
-        compiler.findInterceptor(const SourceString('JSBool'));
+    List<ClassElement> classes = [
+      jsStringClass = compiler.findInterceptor(const SourceString('JSString')),
+      jsArrayClass = compiler.findInterceptor(const SourceString('JSArray')),
+      jsNumberClass = compiler.findInterceptor(const SourceString('JSNumber')),
+      jsIntClass = compiler.findInterceptor(const SourceString('JSInt')),
+      jsDoubleClass = compiler.findInterceptor(const SourceString('JSDouble')),
+      jsNullClass = compiler.findInterceptor(const SourceString('JSNull')),
+      jsFunctionClass =
+          compiler.findInterceptor(const SourceString('JSFunction')),
+      jsBoolClass = compiler.findInterceptor(const SourceString('JSBool'))];
+
     jsArrayClass.ensureResolved(compiler);
     jsArrayLength =
         jsArrayClass.lookupLocalMember(const SourceString('length'));
+    jsArrayRemoveLast =
+        jsArrayClass.lookupLocalMember(const SourceString('removeLast'));
+    jsArrayAdd =
+        jsArrayClass.lookupLocalMember(const SourceString('add'));
+
     jsStringClass.ensureResolved(compiler);
     jsStringLength =
         jsStringClass.lookupLocalMember(const SourceString('length'));
+    jsStringSplit =
+        jsStringClass.lookupLocalMember(const SourceString('split'));
+    jsStringConcat =
+        jsStringClass.lookupLocalMember(const SourceString('concat'));
+
+    for (ClassElement cls in classes) {
+      if (cls != null) interceptedClasses[cls] = null;
+    }
   }
 
   void addInterceptors(ClassElement cls) {
@@ -800,24 +804,32 @@
       includeSuperMembers: true);
   }
 
+  String registerSpecializedGetInterceptor(Set<ClassElement> classes) {
+    compiler.enqueuer.codegen.registerInstantiatedClass(objectInterceptorClass);
+    if (classes.contains(compiler.objectClass)) {
+      // We can't use a specialized [getInterceptorMethod], so we make
+      // sure we emit the one with all checks.
+      String name = namer.getName(getInterceptorMethod);
+      specializedGetInterceptors.putIfAbsent(name, () {
+        // It is important to take the order provided by this list,
+        // because we want the int type check to happen before the
+        // double type check: the double type check covers the int
+        // type check.
+        return interceptedClasses.keys;
+      });
+      return namer.isolateAccess(getInterceptorMethod);
+    } else {
+      String name = namer.getSpecializedName(getInterceptorMethod, classes);
+      specializedGetInterceptors[name] = classes;
+      return '${namer.CURRENT_ISOLATE}.$name';
+    }
+  }
+
   void registerInstantiatedClass(ClassElement cls, Enqueuer enqueuer) {
     ClassElement result = null;
     if (!_interceptorsAreInitialized) {
       initializeInterceptorElements();
       _interceptorsAreInitialized = true;
-      // The null interceptor and the function interceptor are
-      // currently always instantiated if a new class is instantiated.
-      // TODO(ngeoffray): do this elsewhere for the function
-      // interceptor?
-      if (jsNullClass != null) {
-        addInterceptors(jsNullClass);
-        enqueuer.registerInstantiatedClass(jsNullClass);
-      }
-      if (jsFunctionClass != null) {
-        addInterceptors(jsFunctionClass);
-        enqueuer.registerInstantiatedClass(jsFunctionClass);
-      }
-      enqueuer.addToWorkList(getInterceptorMethod);
     }
     if (cls == compiler.stringClass) {
       result = jsStringClass;
@@ -825,12 +837,16 @@
       result = jsArrayClass;
     } else if (cls == compiler.intClass) {
       result = jsIntClass;
+      enqueuer.registerInstantiatedClass(jsNumberClass);
     } else if (cls == compiler.doubleClass) {
       result = jsDoubleClass;
+      enqueuer.registerInstantiatedClass(jsNumberClass);
     } else if (cls == compiler.functionClass) {
       result = jsFunctionClass;
     } else if (cls == compiler.boolClass) {
       result = jsBoolClass;
+    } else if (cls == compiler.nullClass) {
+      result = jsNullClass;
     }
 
     if (result == null) return;
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/constant_emitter.dart b/sdk/lib/_internal/compiler/implementation/js_backend/constant_emitter.dart
index 7635c6a..1b8992a 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/constant_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/constant_emitter.dart
@@ -4,84 +4,114 @@
 
 part of js_backend;
 
-class ConstantEmitter implements ConstantVisitor {
+class ConstantEmitter  {
+  ConstantReferenceEmitter _referenceEmitter;
+  ConstantInitializerEmitter _initializerEmitter;
+
+  ConstantEmitter(Compiler compiler, Namer namer) {
+    _referenceEmitter = new ConstantReferenceEmitter(compiler, namer);
+    _initializerEmitter = new ConstantInitializerEmitter(
+        compiler, namer, _referenceEmitter);
+  }
+
+  /**
+   * Constructs an expression that is a reference to the constant.  Uses a
+   * canonical name unless the constant can be emitted multiple times (as for
+   * numbers and strings).
+   */
+  js.Expression reference(Constant constant) {
+    return _referenceEmitter.generate(constant);
+  }
+
+  /**
+   * Constructs an expression like [reference], but the expression is valid
+   * during isolate initialization.
+   */
+  js.Expression referenceInInitializationContext(Constant constant) {
+    return _referenceEmitter.generateInInitializationContext(constant);
+  }
+
+  /**
+   * Constructs an expression used to initialize a canonicalized constant.
+   */
+  js.Expression initializationExpression(Constant constant) {
+    return _initializerEmitter.generate(constant);
+  }
+}
+
+/**
+ * Visitor for generating JavaScript expressions to refer to [Constant]s.
+ * Do not use directly, use methods from [ConstantEmitter].
+ */
+class ConstantReferenceEmitter implements ConstantVisitor<js.Expression> {
   final Compiler compiler;
   final Namer namer;
+  bool inIsolateInitializationContext = false;
 
-  CodeBuffer buffer;
-  bool shouldEmitCanonicalVersion;
+  ConstantReferenceEmitter(this.compiler, this.namer);
 
-  ConstantEmitter(this.compiler, this.namer);
-
-  /**
-   * Unless the constant can be emitted multiple times (as for numbers and
-   * strings) use the canonical name.
-   */
-  void emitCanonicalVersionOfConstant(Constant constant, CodeBuffer newBuffer) {
-    shouldEmitCanonicalVersion = true;
-    buffer = newBuffer;
-    _visit(constant);
+  js.Expression generate(Constant constant) {
+    inIsolateInitializationContext = false;
+    return _visit(constant);
   }
 
-  /**
-   * Emit the JavaScript code of the constant. If the constant must be
-   * canonicalized this method emits the initialization value.
-   */
-  void emitJavaScriptCodeForConstant(Constant constant, CodeBuffer newBuffer) {
-    shouldEmitCanonicalVersion = false;
-    buffer = newBuffer;
-    _visit(constant);
+  js.Expression generateInInitializationContext(Constant constant) {
+    inIsolateInitializationContext = true;
+    return _visit(constant);
   }
 
-  _visit(Constant constant) {
-    constant.accept(this);
+  js.Expression _visit(Constant constant) {
+    return constant.accept(this);
   }
 
-  void visitSentinel(SentinelConstant constant) {
-    if (shouldEmitCanonicalVersion) {
-      buffer.add(namer.CURRENT_ISOLATE);
-    } else {
-      compiler.internalError(
-          "The parameter sentinel constant does not need specific JS code");
-    }
+  js.Expression visitSentinel(SentinelConstant constant) {
+    return new js.VariableUse(namer.CURRENT_ISOLATE);
   }
 
-  void visitFunction(FunctionConstant constant) {
-    if (shouldEmitCanonicalVersion) {
-      buffer.add(namer.isolatePropertiesAccess(constant.element));
-    } else {
-      compiler.internalError(
-          "The function constant does not need specific JS code");
-    }
+  js.Expression visitFunction(FunctionConstant constant) {
+    return inIsolateInitializationContext
+        ? new js.VariableUse(namer.isolatePropertiesAccess(constant.element))
+        : new js.VariableUse(namer.isolateAccess(constant.element));
   }
 
-  void visitNull(NullConstant constant) {
-    buffer.add("null");
+  js.Expression visitNull(NullConstant constant) {
+    return new js.LiteralNull();
   }
 
-  void visitInt(IntConstant constant) {
-    buffer.add(constant.value.toString());
+  js.Expression visitInt(IntConstant constant) {
+    return new js.LiteralNumber('${constant.value}');
   }
 
-  void visitDouble(DoubleConstant constant) {
+  js.Expression visitDouble(DoubleConstant constant) {
     double value = constant.value;
     if (value.isNaN) {
-      buffer.add("(0/0)");
+      return new js.LiteralNumber("(0/0)");
     } else if (value == double.INFINITY) {
-      buffer.add("(1/0)");
+      return new js.LiteralNumber("(1/0)");
     } else if (value == -double.INFINITY) {
-      buffer.add("(-1/0)");
+      return new js.LiteralNumber("(-1/0)");
     } else {
-      buffer.add("$value");
+      return new js.LiteralNumber("$value");
     }
   }
 
-  void visitTrue(TrueConstant constant) {
-    buffer.add("true");
+  js.Expression visitTrue(TrueConstant constant) {
+    if (compiler.enableMinification) {
+      // Use !0 for true.
+      return new js.Prefix("!", new js.LiteralNumber("0"));
+    } else {
+      return new js.LiteralBool(true);
+    }
+
   }
 
-  void visitFalse(FalseConstant constant) {
-    buffer.add("false");
+  js.Expression visitFalse(FalseConstant constant) {
+    if (compiler.enableMinification) {
+      // Use !1 for false.
+      return new js.Prefix("!", new js.LiteralNumber("1"));
+    } else {
+      return new js.LiteralBool(false);
+    }
   }
 
   /**
@@ -89,139 +119,213 @@
    * a form that is valid as JavaScript string literal content.
    * The string is assumed quoted by double quote characters.
    */
-  void visitString(StringConstant constant) {
-    buffer.add('"');
-    writeJsonEscapedCharsOn(constant.value.slowToString(), buffer);
-    buffer.add('"');
+  js.Expression visitString(StringConstant constant) {
+    // TODO(sra): If the string is long *and repeated* (and not on a hot path)
+    // then it should be assigned to a name.  We don't have reference counts (or
+    // profile information) here, so this is the wrong place.
+    StringBuffer sb = new StringBuffer();
+    writeJsonEscapedCharsOn(constant.value.slowToString(), sb);
+    return new js.LiteralString('"$sb"');
   }
 
-  void emitCanonicalVersion(Constant constant) {
+  js.Expression emitCanonicalVersion(Constant constant) {
     String name = namer.constantName(constant);
-    buffer.add(namer.isolatePropertiesAccessForConstant(name));
+    if (inIsolateInitializationContext) {
+      //  $ISOLATE.$ISOLATE_PROPERTIES.$name
+      return new js.PropertyAccess.field(
+          new js.PropertyAccess.field(
+              new js.VariableUse(namer.ISOLATE),
+              namer.ISOLATE_PROPERTIES),
+          name);
+    } else {
+      return new js.PropertyAccess.field(
+          new js.VariableUse(namer.CURRENT_ISOLATE),
+          name);
+    }
   }
 
-  void visitList(ListConstant constant) {
-    if (shouldEmitCanonicalVersion) {
-      emitCanonicalVersion(constant);
-    } else {
-      shouldEmitCanonicalVersion = true;
-      buffer.add("${namer.ISOLATE}.makeConstantList");
-      buffer.add("([");
-      for (int i = 0; i < constant.entries.length; i++) {
-        if (i != 0) buffer.add(", ");
-        _visit(constant.entries[i]);
-      }
-      buffer.add("])");
-    }
+  js.Expression visitList(ListConstant constant) {
+    return emitCanonicalVersion(constant);
+  }
+
+  js.Expression visitMap(MapConstant constant) {
+    return emitCanonicalVersion(constant);
+  }
+
+  js.Expression visitType(TypeConstant constant) {
+    return emitCanonicalVersion(constant);
+  }
+
+  js.Expression visitConstructed(ConstructedConstant constant) {
+    return emitCanonicalVersion(constant);
+  }
+}
+
+/**
+ * Visitor for generating JavaScript expressions to initialize [Constant]s.
+ * Do not use directly; use methods from [ConstantEmitter].
+ */
+class ConstantInitializerEmitter implements ConstantVisitor<js.Expression> {
+  final Compiler compiler;
+  final Namer namer;
+  final ConstantReferenceEmitter referenceEmitter;
+
+  ConstantInitializerEmitter(this.compiler, this.namer, this.referenceEmitter);
+
+  js.Expression generate(Constant constant) {
+    return _visit(constant);
+  }
+
+  js.Expression _visit(Constant constant) {
+    return constant.accept(this);
+  }
+
+  js.Expression _reference(Constant constant) {
+    return referenceEmitter.generateInInitializationContext(constant);
+  }
+
+  js.Expression visitSentinel(SentinelConstant constant) {
+    compiler.internalError(
+        "The parameter sentinel constant does not need specific JS code");
+  }
+
+  js.Expression visitFunction(FunctionConstant constant) {
+    compiler.internalError(
+        "The function constant does not need specific JS code");
+  }
+
+  js.Expression visitNull(NullConstant constant) {
+    return _reference(constant);
+  }
+
+  js.Expression visitInt(IntConstant constant) {
+    return _reference(constant);
+  }
+
+  js.Expression visitDouble(DoubleConstant constant) {
+    return _reference(constant);
+  }
+
+  js.Expression visitTrue(TrueConstant constant) {
+    return _reference(constant);
+  }
+
+  js.Expression visitFalse(FalseConstant constant) {
+    return _reference(constant);
+  }
+
+  js.Expression visitString(StringConstant constant) {
+    // TODO(sra): Some larger strings are worth sharing.
+    return _reference(constant);
+  }
+
+  js.Expression visitList(ListConstant constant) {
+    return new js.Call(
+        new js.PropertyAccess.field(
+            new js.VariableUse(namer.ISOLATE),
+            'makeConstantList'),
+        [new js.ArrayInitializer.from(_array(constant.entries))]);
   }
 
   String getJsConstructor(ClassElement element) {
     return namer.isolatePropertiesAccess(element);
   }
 
-  void visitMap(MapConstant constant) {
-    if (shouldEmitCanonicalVersion) {
-      emitCanonicalVersion(constant);
-    } else {
-      void writeJsMap() {
-        buffer.add("{");
-        int valueIndex = 0;
-        for (int i = 0; i < constant.keys.entries.length; i++) {
-          StringConstant key = constant.keys.entries[i];
-          if (key.value == MapConstant.PROTO_PROPERTY) continue;
+  js.Expression visitMap(MapConstant constant) {
+    js.Expression jsMap() {
+      List<js.Property> properties = <js.Property>[];
+      int valueIndex = 0;
+      for (int i = 0; i < constant.keys.entries.length; i++) {
+        StringConstant key = constant.keys.entries[i];
+        if (key.value == MapConstant.PROTO_PROPERTY) continue;
 
-          if (valueIndex != 0) buffer.add(", ");
-
-          // Keys in literal maps must be emitted in place.
-          emitJavaScriptCodeForConstant(key, buffer);
-
-          buffer.add(": ");
-          emitCanonicalVersionOfConstant(constant.values[valueIndex++], buffer);
-        }
-        buffer.add("}");
-        if (valueIndex != constant.values.length) {
-          compiler.internalError("Bad value count.");
-        }
+        // Keys in literal maps must be emitted in place.
+        js.Literal keyExpression = _visit(key);
+        js.Expression valueExpression =
+            _reference(constant.values[valueIndex++]);
+        properties.add(new js.Property(keyExpression, valueExpression));
       }
+      if (valueIndex != constant.values.length) {
+        compiler.internalError("Bad value count.");
+      }
+      return new js.ObjectInitializer(properties);
+    }
 
-      void badFieldCountError() {
-        compiler.internalError(
+    void badFieldCountError() {
+      compiler.internalError(
           "Compiler and ConstantMap disagree on number of fields.");
-      }
-
-      shouldEmitCanonicalVersion = true;
-
-      ClassElement classElement = constant.type.element;
-      buffer.add("new ");
-      buffer.add(getJsConstructor(classElement));
-      buffer.add("(");
-      // The arguments of the JavaScript constructor for any given Dart class
-      // are in the same order as the members of the class element.
-      int emittedArgumentCount = 0;
-      classElement.implementation.forEachInstanceField(
-          (ClassElement enclosing, Element field) {
-            if (emittedArgumentCount != 0) buffer.add(", ");
-            if (field.name == MapConstant.LENGTH_NAME) {
-              buffer.add(constant.keys.entries.length);
-            } else if (field.name == MapConstant.JS_OBJECT_NAME) {
-              writeJsMap();
-            } else if (field.name == MapConstant.KEYS_NAME) {
-              emitCanonicalVersionOfConstant(constant.keys, buffer);
-            } else if (field.name == MapConstant.PROTO_VALUE) {
-              assert(constant.protoValue != null);
-              emitCanonicalVersionOfConstant(constant.protoValue, buffer);
-            } else {
-              badFieldCountError();
-            }
-            emittedArgumentCount++;
-          },
-          includeBackendMembers: true,
-          includeSuperMembers: true);
-      if ((constant.protoValue == null && emittedArgumentCount != 3) ||
-          (constant.protoValue != null && emittedArgumentCount != 4)) {
-        badFieldCountError();
-      }
-      buffer.add(")");
     }
+
+    ClassElement classElement = constant.type.element;
+
+    List<js.Expression> arguments = <js.Expression>[];
+
+    // The arguments of the JavaScript constructor for any given Dart class
+    // are in the same order as the members of the class element.
+    int emittedArgumentCount = 0;
+    classElement.implementation.forEachInstanceField(
+        (ClassElement enclosing, Element field) {
+          if (field.name == MapConstant.LENGTH_NAME) {
+            arguments.add(
+                new js.LiteralNumber('${constant.keys.entries.length}'));
+          } else if (field.name == MapConstant.JS_OBJECT_NAME) {
+            arguments.add(jsMap());
+          } else if (field.name == MapConstant.KEYS_NAME) {
+            arguments.add(_reference(constant.keys));
+          } else if (field.name == MapConstant.PROTO_VALUE) {
+            assert(constant.protoValue != null);
+            arguments.add(_reference(constant.protoValue));
+          } else {
+            badFieldCountError();
+          }
+          emittedArgumentCount++;
+        },
+        includeBackendMembers: true,
+        includeSuperMembers: true);
+
+    if ((constant.protoValue == null && emittedArgumentCount != 3) ||
+        (constant.protoValue != null && emittedArgumentCount != 4)) {
+      badFieldCountError();
+    }
+
+    return new js.New(
+        new js.VariableUse(getJsConstructor(classElement)),
+        arguments);
   }
 
-  void visitType(TypeConstant constant) {
-    if (shouldEmitCanonicalVersion) {
-      emitCanonicalVersion(constant);
+  js.Expression visitType(TypeConstant constant) {
+    SourceString helperSourceName = const SourceString('createRuntimeType');
+    Element helper = compiler.findHelper(helperSourceName);
+    JavaScriptBackend backend = compiler.backend;
+    String helperName = backend.namer.getName(helper);
+    DartType type = constant.representedType;
+    Element element = type.element;
+    String typeName;
+    if (type.kind == TypeKind.INTERFACE) {
+      typeName =
+          backend.rti.getStringRepresentation(type, expandRawType: true);
     } else {
-      SourceString helperSourceName =
-          const SourceString('createRuntimeType');
-      Element helper = compiler.findHelper(helperSourceName);
-      JavaScriptBackend backend = compiler.backend;
-      String helperName = backend.namer.getName(helper);
-      DartType type = constant.representedType;
-      Element element = type.element;
-      String typeName;
-      if (type.kind == TypeKind.INTERFACE) {
-        typeName =
-            backend.rti.getStringRepresentation(type, expandRawType: true);
-      } else {
-        assert(type.kind == TypeKind.TYPEDEF);
-        typeName = element.name.slowToString();
-      }
-      buffer.add("${namer.CURRENT_ISOLATE}.$helperName('$typeName')");
+      assert(type.kind == TypeKind.TYPEDEF);
+      typeName = element.name.slowToString();
     }
+    return new js.Call(
+        new js.PropertyAccess.field(
+            new js.VariableUse(namer.CURRENT_ISOLATE),
+            helperName),
+        [new js.LiteralString("'$typeName'")]);
   }
 
-  void visitConstructed(ConstructedConstant constant) {
-    if (shouldEmitCanonicalVersion) {
-      emitCanonicalVersion(constant);
-    } else {
-      shouldEmitCanonicalVersion = true;
+  js.Expression visitConstructed(ConstructedConstant constant) {
+    return new js.New(
+        new js.VariableUse(getJsConstructor(constant.type.element)),
+        _array(constant.fields));
+  }
 
-      buffer.add("new ");
-      buffer.add(getJsConstructor(constant.type.element));
-      buffer.add("(");
-      for (int i = 0; i < constant.fields.length; i++) {
-        if (i != 0) buffer.add(", ");
-        _visit(constant.fields[i]);
-      }
-      buffer.add(")");
+  List<js.Expression> _array(List<Constant> values) {
+    List<js.Expression> valueList = <js.Expression>[];
+    for (int i = 0; i < values.length; i++) {
+      valueList.add(_reference(values[i]));
     }
+    return valueList;
   }
 }
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart b/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
index 12a8d4f..91c072f 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
@@ -81,13 +81,12 @@
     });
   }
 
-  void writeConstantToBuffer(Constant value, CodeBuffer buffer,
-                             {emitCanonicalVersion: true}) {
-    if (emitCanonicalVersion) {
-      constantEmitter.emitCanonicalVersionOfConstant(value, buffer);
-    } else {
-      constantEmitter.emitJavaScriptCodeForConstant(value, buffer);
-    }
+  js.Expression constantReference(Constant value) {
+    return constantEmitter.reference(value);
+  }
+
+  js.Expression constantInitializerExpression(Constant value) {
+    return constantEmitter.initializationExpression(value);
   }
 
   String get name => 'CodeEmitter';
@@ -107,63 +106,41 @@
   String get lazyInitializerName
       => '${namer.ISOLATE}.\$lazy';
 
-  // Property name suffixes.  If the accessors are renaming then the format
-  // is <accessorName>:<fieldName><suffix>.  We use the suffix to know whether
-  // to look for the ':' separator in order to avoid doing the indexOf operation
-  // on every single property (they are quite rare).  None of these characters
-  // are legal in an identifier and they are related by bit patterns.
-  // setter          <          0x3c
-  // both            =          0x3d
-  // getter          >          0x3e
-  // renaming setter |          0x7c
-  // renaming both   }          0x7d
-  // renaming getter ~          0x7e
-  const SUFFIX_MASK = 0x3f;
-  const FIRST_SUFFIX_CODE = 0x3c;
-  const SETTER_CODE = 0x3c;
-  const GETTER_SETTER_CODE = 0x3d;
-  const GETTER_CODE = 0x3e;
-  const RENAMING_FLAG = 0x40;
-  String needsGetterCode(String variable) => '($variable & 3) > 0';
-  String needsSetterCode(String variable) => '($variable & 2) == 0';
-  String isRenaming(String variable) => '($variable & $RENAMING_FLAG) != 0';
+  final String GETTER_SUFFIX = "?";
+  final String SETTER_SUFFIX = "!";
+  final String GETTER_SETTER_SUFFIX = "=";
 
   String get generateGetterSetterFunction {
     return """
   function(field, prototype) {
     var len = field.length;
-    var lastCharCode = field.charCodeAt(len - 1);
-    var needsAccessor = (lastCharCode & $SUFFIX_MASK) >= $FIRST_SUFFIX_CODE;
-    if (needsAccessor) {
-      var needsGetter = ${needsGetterCode('lastCharCode')};
-      var needsSetter = ${needsSetterCode('lastCharCode')};
-      var renaming = ${isRenaming('lastCharCode')};
-      var accessorName = field = field.substring(0, len - 1);
-      if (renaming) {
-        var divider = field.indexOf(":");
-        accessorName = field.substring(0, divider);
-        field = field.substring(divider + 1);
-      }
-      if (needsGetter) {
-        var getterString = "return this." + field + ";";
-        prototype["get\$" + accessorName] = new Function(getterString);
-      }
-      if (needsSetter) {
-        var setterString = "this." + field + " = v;";
-        prototype["set\$" + accessorName] = new Function("v", setterString);
-      }
+    var lastChar = field[len - 1];
+    var needsGetter = lastChar == '$GETTER_SUFFIX' || lastChar == '$GETTER_SETTER_SUFFIX';
+    var needsSetter = lastChar == '$SETTER_SUFFIX' || lastChar == '$GETTER_SETTER_SUFFIX';
+    if (needsGetter || needsSetter) field = field.substring(0, len - 1);
+    if (needsGetter) {
+      var getterString = "return this." + field + ";";
+  """
+  /* The supportsProtoCheck below depends on the getter/setter convention.
+         When changing here, update the protoCheck too. */
+  """
+      prototype["get\$" + field] = new Function(getterString);
+    }
+    if (needsSetter) {
+      var setterString = "this." + field + " = v;";
+      prototype["set\$" + field] = new Function("v", setterString);
     }
     return field;
   }""";
   }
 
   String get defineClassFunction {
-    // First the class name, then the super class name, followed by the fields
-    // (in an array) and the members (inside an Object literal).
+    // First the class name, then the field names in an array and the members
+    // (inside an Object literal).
     // The caller can also pass in the constructor as a function if needed.
     //
     // Example:
-    // defineClass("A", "B", ["x", "y"], {
+    // defineClass("A", ["x", "y"], {
     //  foo$1: function(y) {
     //   print(this.x + y);
     //  },
@@ -213,7 +190,7 @@
 var tmp = $defineClassName('c', ['f?'], {}).prototype;
 if (tmp.__proto__) {
   tmp.__proto__ = {};
-  if (typeof tmp.get\$f !== 'undefined') $supportsProtoName = true;
+  if (typeof tmp.get\$f !== "undefined") $supportsProtoName = true;
 }
 ''';
   }
@@ -237,10 +214,12 @@
   for (var cls in collectedClasses) {
     if (hasOwnProperty.call(collectedClasses, cls)) {
       var desc = collectedClasses[cls];
-'''/* If the class does not have any declared fields (in the ''
-      property of the description), then provide an empty list of fields. */'''
-      $isolatePropertiesName[cls] = $defineClassName(cls, desc[''] || [], desc);
-      if (desc['super'] !== "") $pendingClassesName[cls] = desc['super'];
+'''/* Get the superclass and the fields in the format Super;field1,field2 from
+      the null-string property on the descriptor. */'''
+      var s = desc[''].split(';'), supr = s[0];
+      var fields = s[1] == '' ? [] : s[1].split(',');
+      $isolatePropertiesName[cls] = $defineClassName(cls, fields, desc);
+      if (supr) $pendingClassesName[cls] = supr;
     }
   }
   var pendingClasses = $pendingClassesName;
@@ -271,7 +250,7 @@
       constructor.prototype = newPrototype;
       newPrototype.constructor = constructor;
       for (var member in prototype) {
-        if (member == '' || member == 'super') continue;
+        if (!member) continue;  '''/* Short version of: if (member == '') */'''
         if (hasOwnProperty.call(prototype, member)) {
           newPrototype[member] = prototype[member];
         }
@@ -422,8 +401,6 @@
                                            selector);
     if (alreadyGenerated.contains(invocationName)) return;
     alreadyGenerated.add(invocationName);
-    CodeBuffer buffer = new CodeBuffer();
-    buffer.add('function(');
 
     JavaScriptBackend backend = compiler.backend;
     bool isInterceptorClass =
@@ -432,23 +409,23 @@
     // If the method is in an interceptor class, we need to also pass
     // the actual receiver.
     int extraArgumentCount = isInterceptorClass ? 1 : 0;
-    // Use '$' to avoid clashes with other parameter names. Using '$'
-    // works because [JsNames.getValid] used for getting parameter
-    // names never returns '$'.
-    String extraArgumentName = r'$';
+    // Use '$receiver' to avoid clashes with other parameter names. Using
+    // '$receiver' works because [JsNames.getValid] used for getting parameter
+    // names never returns a name beginning with a single '$'.
+    String receiverArgumentName = r'$receiver';
 
     // The parameters that this stub takes.
-    List<String> parametersBuffer =
-        new List<String>(selector.argumentCount + extraArgumentCount);
+    List<js.Parameter> parametersBuffer =
+        new List<js.Parameter>(selector.argumentCount + extraArgumentCount);
     // The arguments that will be passed to the real method.
-    List<String> argumentsBuffer =
-        new List<String>(parameters.parameterCount + extraArgumentCount);
+    List<js.Expression> argumentsBuffer =
+        new List<js.Expression>(parameters.parameterCount + extraArgumentCount);
 
     int count = 0;
     if (isInterceptorClass) {
       count++;
-      parametersBuffer[0] = extraArgumentName;
-      argumentsBuffer[0] = extraArgumentName;
+      parametersBuffer[0] = new js.Parameter(receiverArgumentName);
+      argumentsBuffer[0] = new js.VariableUse(receiverArgumentName);
     }
 
     int indexOfLastOptionalArgumentInParameters = positionalArgumentCount - 1;
@@ -457,53 +434,56 @@
 
     parameters.orderedForEachParameter((Element element) {
       String jsName = JsNames.getValid(element.name.slowToString());
-      assert(jsName != extraArgumentName);
+      assert(jsName != receiverArgumentName);
       if (count < positionalArgumentCount + extraArgumentCount) {
-        parametersBuffer[count] = jsName;
-        argumentsBuffer[count] = jsName;
+        parametersBuffer[count] = new js.Parameter(jsName);
+        argumentsBuffer[count] = new js.VariableUse(jsName);
       } else {
         int index = names.indexOf(element.name);
         if (index != -1) {
           indexOfLastOptionalArgumentInParameters = count;
           // The order of the named arguments is not the same as the
           // one in the real method (which is in Dart source order).
-          argumentsBuffer[count] = jsName;
-          parametersBuffer[selector.positionalArgumentCount + index] = jsName;
-        // Note that [elements] may be null for a synthetized [member].
+          argumentsBuffer[count] = new js.VariableUse(jsName);
+          parametersBuffer[selector.positionalArgumentCount + index] =
+              new js.Parameter(jsName);
+        // Note that [elements] may be null for a synthesized [member].
         } else if (elements != null && elements.isParameterChecked(element)) {
-          CodeBuffer argumentBuffer = new CodeBuffer();
-          writeConstantToBuffer(SentinelConstant.SENTINEL, argumentBuffer);
-          argumentsBuffer[count] = argumentBuffer.toString();
+          argumentsBuffer[count] = constantReference(SentinelConstant.SENTINEL);
         } else {
           Constant value = handler.initialVariableValues[element];
           if (value == null) {
-            argumentsBuffer[count] = NullConstant.JsNull;
+            argumentsBuffer[count] = constantReference(new NullConstant());
           } else {
             if (!value.isNull()) {
               // If the value is the null constant, we should not pass it
               // down to the native method.
               indexOfLastOptionalArgumentInParameters = count;
             }
-            CodeBuffer argumentBuffer = new CodeBuffer();
-            writeConstantToBuffer(value, argumentBuffer);
-            argumentsBuffer[count] = argumentBuffer.toString();
+            argumentsBuffer[count] = constantReference(value);
           }
         }
       }
       count++;
     });
-    String parametersString = Strings.join(parametersBuffer, ",");
-    buffer.add('$parametersString) {\n');
 
+    List<js.Statement> body;
     if (member.isNative()) {
-      nativeEmitter.generateParameterStub(
-          member, invocationName, parametersString, argumentsBuffer,
-          indexOfLastOptionalArgumentInParameters, buffer);
+      body = nativeEmitter.generateParameterStubStatements(
+          member, invocationName, parametersBuffer, argumentsBuffer,
+          indexOfLastOptionalArgumentInParameters);
     } else {
-      String arguments = Strings.join(argumentsBuffer, ",");
-      buffer.add('  return this.${namer.getName(member)}($arguments)');
+      body = <js.Statement>[
+          new js.Return(
+              new js.VariableUse('this')
+                  .dot(namer.getName(member))
+                  .callWith(argumentsBuffer))];
     }
-    buffer.add('\n}');
+
+    js.Fun function = new js.Fun(parametersBuffer, new js.Block(body));
+
+    CodeBuffer buffer = new CodeBuffer();
+    buffer.add(js.prettyPrint(function, compiler));
     defineInstanceMember(invocationName, buffer);
   }
 
@@ -540,7 +520,7 @@
     // on A and a typed selector on B could yield the same stub.
     Set<String> generatedStubNames = new Set<String>();
     if (compiler.enabledFunctionApply
-        && member.name == namer.CLOSURE_INVOCATION_NAME) {
+        && member.name == Namer.CLOSURE_INVOCATION_NAME) {
       // If [Function.apply] is called, we pessimistically compile all
       // possible stubs for this closure.
       FunctionSignature signature = member.computeSignature(compiler);
@@ -739,7 +719,6 @@
   void visitClassFields(ClassElement classElement,
                         void addField(Element member,
                                       String name,
-                                      String accessorName,
                                       bool needsGetter,
                                       bool needsSetter,
                                       bool needsCheckedSetter)) {
@@ -750,7 +729,6 @@
         compiler.codegenWorld.instantiatedClasses.contains(classElement);
 
     void visitField(ClassElement enclosingClass, Element member) {
-      assert(!member.isNative());
       assert(invariant(classElement, member.isDeclaration));
 
       LibraryElement library = member.getLibrary();
@@ -778,8 +756,9 @@
         String accessorName = isShadowed
             ? namer.shadowedFieldName(member)
             : namer.getName(member);
-        String fieldName = enclosingClass.isNative() ?
-            member.name.slowToString() : accessorName;
+        String fieldName = member.isNative()
+            ? member.nativeName()
+            : accessorName;
         bool needsCheckedSetter = false;
         if (needsSetter && compiler.enableTypeAssertions
             && canGenerateCheckedSetter(member)) {
@@ -789,7 +768,6 @@
         // Getters and setters with suffixes will be generated dynamically.
         addField(member,
                  fieldName,
-                 accessorName,
                  needsGetter,
                  needsSetter,
                  needsCheckedSetter);
@@ -806,17 +784,13 @@
         includeSuperMembers: isInstantiated && !classElement.isNative());
   }
 
-  void generateGetter(Element member, String fieldName, String accessorName,
-                      CodeBuffer buffer) {
-    String getterName =
-        namer.getterName(member.getLibrary(), new SourceString(accessorName));
+  void generateGetter(Element member, String fieldName, CodeBuffer buffer) {
+    String getterName = namer.getterName(member.getLibrary(), member.name);
     buffer.add("$getterName: function() { return this.$fieldName; }");
   }
 
-  void generateSetter(Element member, String fieldName, String accessorName,
-                      CodeBuffer buffer) {
-    String setterName =
-        namer.setterName(member.getLibrary(), new SourceString(accessorName));
+  void generateSetter(Element member, String fieldName, CodeBuffer buffer) {
+    String setterName = namer.setterName(member.getLibrary(), member.name);
     buffer.add("$setterName: function(v) { this.$fieldName = v; }");
   }
 
@@ -833,7 +807,6 @@
 
   void generateCheckedSetter(Element member,
                              String fieldName,
-                             String accessorName,
                              CodeBuffer buffer) {
     assert(canGenerateCheckedSetter(member));
     DartType type = member.computeType(compiler);
@@ -844,8 +817,7 @@
     if (helperElement.computeSignature(compiler).parameterCount != 1) {
       additionalArgument = ", '${namer.operatorIs(type.element)}'";
     }
-    String setterName =
-        namer.publicSetterName(new SourceString(accessorName));
+    String setterName = namer.setterName(member.getLibrary(), member.name);
     buffer.add("$setterName: function(v) { "
         "this.$fieldName = $helperName(v$additionalArgument); }");
   }
@@ -856,39 +828,47 @@
 
   void emitClassFields(ClassElement classElement,
                        CodeBuffer buffer,
-                       bool emitEndingComma) {
+                       bool emitEndingComma,
+                       { String superClass: "",
+                         bool isNative: false}) {
+    assert(!isNative || superClass != "");
     bool isFirstField = true;
+    bool isAnythingOutput = false;
+    if (!isNative) {
+      buffer.add('"":"$superClass;');
+      isAnythingOutput = true;
+    }
     visitClassFields(classElement, (Element member,
                                     String name,
-                                    String accessorName,
                                     bool needsGetter,
                                     bool needsSetter,
                                     bool needsCheckedSetter) {
-      if (isFirstField) {
-        buffer.add('"": [');
-        isFirstField = false;
-      } else {
-        buffer.add(", ");
+      if (!getterAndSetterCanBeImplementedByFieldSpec(
+          member, name, needsGetter, needsSetter)) {
+        return;
       }
-      buffer.add('"$accessorName');
-      int flag = 0;
-      if (name != accessorName) {
-        buffer.add(':$name');
-        assert(needsGetter || needsSetter);
-        flag = RENAMING_FLAG;
+      if (!isNative || needsCheckedSetter || needsGetter || needsSetter) {
+        if (isFirstField) {
+          isFirstField = false;
+          if (!isAnythingOutput) {
+            buffer.add('"":"');
+            isAnythingOutput = true;
+          }
+        } else {
+          buffer.add(",");
+        }
+        buffer.add('$name');
+        if (needsGetter && needsSetter) {
+          buffer.add(GETTER_SETTER_SUFFIX);
+        } else if (needsGetter) {
+          buffer.add(GETTER_SUFFIX);
+        } else if (needsSetter) {
+          buffer.add(SETTER_SUFFIX);
+        }
       }
-      if (needsGetter && needsSetter) {
-        buffer.addCharCode(GETTER_SETTER_CODE + flag);
-      } else if (needsGetter) {
-        buffer.addCharCode(GETTER_CODE + flag);
-      } else if (needsSetter) {
-        buffer.addCharCode(SETTER_CODE + flag);
-      }
-      buffer.add('"');
     });
-    if (!isFirstField) {
-      // There was at least one field.
-      buffer.add(']');
+    if (isAnythingOutput) {
+      buffer.add('"');
       if (emitEndingComma) {
         buffer.add(',');
       }
@@ -899,24 +879,58 @@
   void emitClassGettersSetters(ClassElement classElement,
                                CodeBuffer buffer,
                                bool emitLeadingComma) {
+    emitComma() {
+      if (emitLeadingComma) {
+        buffer.add(",\n ");
+      } else {
+        emitLeadingComma = true;
+      }
+    }
+
     visitClassFields(classElement, (Element member,
                                     String name,
-                                    String accessorName,
                                     bool needsGetter,
                                     bool needsSetter,
                                     bool needsCheckedSetter) {
+          if (name == null) throw 123;
+      if (getterAndSetterCanBeImplementedByFieldSpec(
+          member, name, needsGetter, needsSetter)) {
+        needsGetter = false;
+        needsSetter = false;
+      }
+      if (needsGetter) {
+        emitComma();
+        generateGetter(member, name, buffer);
+      }
+      if (needsSetter) {
+        emitComma();
+        generateSetter(member, name, buffer);
+      }
       if (needsCheckedSetter) {
         assert(!needsSetter);
-        if (emitLeadingComma) {
-          buffer.add(",\n ");
-        } else {
-          emitLeadingComma = true;
-        }
-        generateCheckedSetter(member, name, accessorName, buffer);
+        emitComma();
+        generateCheckedSetter(member, name, buffer);
       }
     });
   }
 
+  bool getterAndSetterCanBeImplementedByFieldSpec(Element member,
+      String name,
+      bool needsGetter,
+      bool needsSetter) {
+    if (needsGetter) {
+      if (namer.getterName(member.getLibrary(), member.name) != 'get\$$name') {
+        return false;
+      }
+    }
+    if (needsSetter) {
+      if (namer.setterName(member.getLibrary(), member.name) != 'set\$$name') {
+        return false;
+      }
+    }
+    return true;
+  }
+
   /**
    * Documentation wanted -- johnniwinther
    *
@@ -944,11 +958,11 @@
 
     buffer.add('$classesCollector.$className = {');
     emitClassConstructor(classElement, buffer);
-    emitClassFields(classElement, buffer, true);
+    emitClassFields(classElement, buffer, false,
+                    superClass: superName, isNative: false);
     // TODO(floitsch): the emitInstanceMember should simply always emit a ',\n'.
     // That does currently not work because the native classes have a different
     // syntax.
-    buffer.add('\n "super": "$superName"');
     emitClassGettersSetters(classElement, buffer, true);
     emitInstanceMembers(classElement, buffer, true);
     buffer.add('\n};\n\n');
@@ -1138,7 +1152,7 @@
       // create a fake element with the correct name.
       // Note: the callElement will not have any enclosingElement.
       FunctionElement callElement =
-          new ClosureInvocationElement(namer.CLOSURE_INVOCATION_NAME, element);
+          new ClosureInvocationElement(Namer.CLOSURE_INVOCATION_NAME, element);
       String staticName = namer.getName(element);
       String invocationName = namer.instanceMethodName(callElement);
       String fieldAccess = '$isolateProperties.$staticName';
@@ -1157,11 +1171,10 @@
                                    String superName,
                                    String extraArgument,
                                    CodeBuffer buffer) {
-    extraArgument = extraArgument.isEmpty ? '' : ", '$extraArgument'";
+    extraArgument = extraArgument.isEmpty ? '' : ",$extraArgument";
     buffer.add("""
 $classesCollector.$mangledName = {'':
-['self'$extraArgument, 'target'],
-'super': '$superName',
+\"$superName;self$extraArgument,target\",
 """);
   }
 
@@ -1236,8 +1249,8 @@
       // its stubs we simply create a fake element with the correct name.
       // Note: the callElement will not have any enclosingElement.
       FunctionElement callElement =
-          new ClosureInvocationElement(namer.CLOSURE_INVOCATION_NAME, member);
-
+          new ClosureInvocationElement(Namer.CLOSURE_INVOCATION_NAME, member);
+      
       String invocationName = namer.instanceMethodName(callElement);
       List<String> arguments = new List<String>(parameterCount);
       for (int i = 0; i < parameterCount; i++) {
@@ -1289,7 +1302,9 @@
     if (member.isGetter()) {
       getter = "this.${namer.getterName(member.getLibrary(), member.name)}()";
     } else {
-      String name = namer.instanceFieldName(memberLibrary, member.name);
+      String name = member.isNative()
+          ? member.nativeName()
+          : namer.instanceFieldName(memberLibrary, member.name);
       getter = "this.$name";
     }
     for (Selector selector in selectors) {
@@ -1297,7 +1312,7 @@
         String invocationName =
             namer.instanceMethodInvocationName(memberLibrary, member.name,
                                                selector);
-        SourceString callName = namer.CLOSURE_INVOCATION_NAME;
+        SourceString callName = Namer.CLOSURE_INVOCATION_NAME;
         String closureCallName =
             namer.instanceMethodInvocationName(memberLibrary, callName,
                                                selector);
@@ -1319,12 +1334,17 @@
     List<VariableElement> staticNonFinalFields =
         handler.getStaticNonFinalFieldsForEmission();
     for (Element element in staticNonFinalFields) {
-      buffer.add('$isolateProperties.${namer.getName(element)} = ');
       compiler.withCurrentElement(element, () {
-          Constant initialValue = handler.getInitialValueFor(element);
-          writeConstantToBuffer(initialValue, buffer);
-        });
-      buffer.add(';\n');
+        Constant initialValue = handler.getInitialValueFor(element);
+        js.Expression init =
+            new js.Assignment(
+                new js.PropertyAccess.field(
+                    new js.VariableUse(isolateProperties),
+                    namer.getName(element)),
+                constantEmitter.referenceInInitializationContext(initialValue));
+        buffer.add(js.prettyPrint(init, compiler));
+        buffer.add(';\n');
+      });
     }
   }
 
@@ -1382,8 +1402,13 @@
         addedMakeConstantList = true;
         emitMakeConstantList(buffer);
       }
-      buffer.add('$isolateProperties.$name = ');
-      writeConstantToBuffer(constant, buffer, emitCanonicalVersion: false);
+      js.Expression init =
+          new js.Assignment(
+              new js.PropertyAccess.field(
+                  new js.VariableUse(isolateProperties),
+                  name),
+              constantInitializerExpression(constant));
+      buffer.add(js.prettyPrint(init, compiler));
       buffer.add(';\n');
     }
   }
@@ -1477,14 +1502,11 @@
       }
       String internalName = namer.instanceMethodInvocationName(
           selector.library, new SourceString(methodName), selector);
-      Element createInvocationMirror =
-          compiler.findHelper(const SourceString('createInvocationMirror'));
       CodeBuffer buffer = new CodeBuffer();
       buffer.add('function($args) {\n');
       buffer.add('  return this.$noSuchMethodName('
-                        '${namer.isolateAccess(createInvocationMirror)}('
-                            '"$methodName", "$internalName",'
-                            '$type, [$args], [$argNames]));\n');
+                     '\$.createInvocationMirror("$methodName", "$internalName",'
+                     ' $type, [$args], [$argNames]));\n');
       buffer.add(' }');
       return buffer;
     }
@@ -1657,10 +1679,10 @@
 //
 // BEGIN invoke [main].
 //
-if (typeof document !== 'undefined' && document.readyState != 'complete') {
+if (typeof document != 'undefined' && document.readyState != 'complete') {
   document.addEventListener('readystatechange', function () {
     if (document.readyState == 'complete') {
-      if (typeof dartMainRunner === 'function') {
+      if (typeof dartMainRunner == 'function') {
         dartMainRunner(function() { ${mainCall}; });
       } else {
         ${mainCall};
@@ -1668,7 +1690,7 @@
     }
   }, false);
 } else {
-  if (typeof dartMainRunner === 'function') {
+  if (typeof dartMainRunner == 'function') {
     dartMainRunner(function() { ${mainCall}; });
   } else {
     ${mainCall};
@@ -1681,6 +1703,53 @@
 """);
   }
 
+  /**
+   * Emit the code for doing a type check on [cls]. [cls] must
+   * be an interceptor class.
+   */
+  void emitInterceptorCheck(ClassElement cls, CodeBuffer buffer) {
+    JavaScriptBackend backend = compiler.backend;
+    assert(backend.isInterceptorClass(cls));
+    if (cls == backend.jsBoolClass) {
+      buffer.add("if (typeof receiver == 'boolean')");
+    } else if (cls == backend.jsIntClass) {
+      buffer.add("if (typeof receiver == 'number' "
+                 "&& Math.floor(receiver) == receiver)");
+    } else if (cls == backend.jsDoubleClass || cls == backend.jsNumberClass) {
+      buffer.add("if (typeof receiver == 'number')");
+    } else if (cls == backend.jsArrayClass) {
+      buffer.add("if (receiver != null && receiver.constructor == Array)");
+    } else if (cls == backend.jsStringClass) {
+      buffer.add("if (typeof receiver == 'string')");
+    } else if (cls == backend.jsNullClass) {
+      buffer.add("if (receiver == null)");
+    } else if (cls == backend.jsFunctionClass) {
+      buffer.add("if (typeof receiver == 'function')");
+    }
+    buffer.add(' return ${namer.isolateAccess(cls)}.prototype;');
+  }
+
+  /**
+   * Emit all versions of the [:getInterceptor:] method.
+   */
+  void emitGetInterceptorMethods(CodeBuffer buffer) {
+    JavaScriptBackend backend = compiler.backend;
+    // If no class needs to be intercepted, just return.
+    if (backend.objectInterceptorClass == null) return;
+    String objectName = namer.isolateAccess(backend.objectInterceptorClass);
+    backend.specializedGetInterceptors.forEach(
+        (String key, Collection<ClassElement> classes) {
+          buffer.add('$isolateProperties.$key = function(receiver) {');
+          for (ClassElement cls in classes) {
+            if (compiler.codegenWorld.instantiatedClasses.contains(cls)) {
+              buffer.add('\n  ');
+              emitInterceptorCheck(cls, buffer);
+            }
+          }
+          buffer.add('\n  return $objectName.prototype;\n};\n');
+        });
+  }
+
   String assembleProgram() {
     measure(() {
       mainBuffer.add(HOOKS_API_USAGE);
@@ -1705,6 +1774,7 @@
       // Static field initializations require the classes and compile-time
       // constants to be set up.
       emitStaticNonFinalFieldInitializations(mainBuffer);
+      emitGetInterceptorMethods(mainBuffer);
       emitLazilyInitializedStaticFields(mainBuffer);
 
       isolateProperties = isolatePropertiesName;
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/emitter_no_eval.dart b/sdk/lib/_internal/compiler/implementation/js_backend/emitter_no_eval.dart
index 0b3864e..0b6c0f5 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/emitter_no_eval.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/emitter_no_eval.dart
@@ -108,7 +108,6 @@
     List<String> fields = <String>[];
     visitClassFields(classElement, (Element member,
                                     String name,
-                                    String accessorName,
                                     bool needsGetter,
                                     bool needsSetter,
                                     bool needsCheckedSetter) {
@@ -135,40 +134,16 @@
 
   void emitClassFields(ClassElement classElement,
                        CodeBuffer buffer,
-                       bool emitEndingComma) {
+                       bool emitEndingComma,
+                       { String superClass: "",
+                         bool isNative: false}) {
     if (emitEndingComma) buffer.add(', ');
   }
 
-  void emitClassGettersSetters(ClassElement classElement,
-                               CodeBuffer buffer,
-                               bool emitLeadingComma) {
-    emitComma() {
-      if (emitLeadingComma) {
-        buffer.add(",\n ");
-      } else {
-        emitLeadingComma = true;
-      }
-    }
-
-    visitClassFields(classElement, (Element member,
-                                    String name,
-                                    String accessorName,
-                                    bool needsGetter,
-                                    bool needsSetter,
-                                    bool needsCheckedSetter) {
-      if (needsGetter) {
-        emitComma();
-        generateGetter(member, name, accessorName, buffer);
-      }
-      if (needsSetter) {
-        emitComma();
-        generateSetter(member, name, accessorName, buffer);
-      }
-      if (needsCheckedSetter) {
-        assert(!needsSetter);
-        emitComma();
-        generateCheckedSetter(member, name, accessorName, buffer);
-      }
-    });
+  bool getterAndSetterCanBeImplementedByFieldSpec(Element member,
+                                                  String name,
+                                                  bool needsGetter,
+                                                  bool needsSetter) {
+    return false;
   }
 }
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart b/sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart
index f24e5ba..1f2106e 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart
@@ -25,5 +25,4 @@
 part 'emitter_no_eval.dart';
 part 'namer.dart';
 part 'native_emitter.dart';
-part 'minify_namer.dart';
 part 'runtime_types.dart';
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/minify_namer.dart b/sdk/lib/_internal/compiler/implementation/js_backend/minify_namer.dart
deleted file mode 100644
index 8e292b4..0000000
--- a/sdk/lib/_internal/compiler/implementation/js_backend/minify_namer.dart
+++ /dev/null
@@ -1,108 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of js_backend;
-
-/**
- * Assigns JavaScript identifiers to Dart variables, class-names and members.
- */
-class MinifyNamer extends Namer {
-  MinifyNamer(Compiler compiler) : super(compiler);
-
-  String get ISOLATE => 'I';
-  String get ISOLATE_PROPERTIES => 'p';
-  bool get shouldMinify => true;
-
-  const ALPHABET_CHARACTERS = 52;  // a-zA-Z.
-  const ALPHANUMERIC_CHARACTERS = 62;  // a-zA-Z0-9.
-
-  // You can pass an invalid identifier to this and unlike its non-minifying
-  // counterpart it will never return the proposedName as the new fresh name.
-  String getFreshName(String proposedName, Set<String> usedNames) {
-    var freshName = _getUnusedName(proposedName, usedNames);
-    usedNames.add(freshName);
-    return freshName;
-  }
-
-  // This gets a minified name based on a hash of the proposed name.  This
-  // is slightly less efficient than just getting the next name in a series,
-  // but it means that small changes in the input program will give smallish
-  // changes in the output, which can be useful for diffing etc.
-  String _getUnusedName(String proposedName, Set<String> usedNames) {
-    // Try single-character names with characters that occur in the
-    // input.
-    for (int i = 0; i < proposedName.length; i++) {
-      String candidate = proposedName[i];
-      int code = candidate.charCodeAt(0);
-      if (code < $A) continue;
-      if (code > $z) continue;
-      if (code > $Z && code < $a) continue;
-      if (!usedNames.contains(candidate)) return candidate;
-    }
-
-    int hash = _calculateHash(proposedName);
-    // Avoid very small hashes that won't try many names.
-    hash = hash < 1000 ? hash * 314159 : hash;  // Yes, it's prime.
-
-    // Try other n-character names based on the hash.  We try one to three
-    // character identifiers.  For each length we try around 10 different names
-    // in a predictable order determined by the proposed name.  This is in order
-    // to make the renamer stable: small changes in the input should nornally
-    // result in relatively small changes in the output.
-    for (var n = 1; n <= 3; n++) {
-      int h = hash;
-      while (h > 10) {
-        var codes = <int>[_letterNumber(h)];
-        int h2 = h ~/ ALPHABET_CHARACTERS;
-        for (var i = 1; i < n; i++) {
-          codes.add(_alphaNumericNumber(h2));
-          h2 ~/= ALPHANUMERIC_CHARACTERS;
-        }
-        final candidate = new String.fromCharCodes(codes);
-        if (!usedNames.contains(candidate) && !jsReserved.contains(candidate)) {
-          return candidate;
-        }
-        // Try again with a slightly different hash.  After around 10 turns
-        // around this loop h is zero and we try a longer name.
-        h ~/= 7;
-      }
-    }
-
-    // If we can't find a hash based name in the three-letter space, then base
-    // the name on a letter and a counter.
-    var startLetter = new String.fromCharCodes([_letterNumber(hash)]);
-    var i = 0;
-    while (usedNames.contains("$startLetter$i")) {
-      i++;
-    }
-    return "$startLetter$i";
-  }
-
-  int _calculateHash(String name) {
-    int h = 0;
-    for (int i = 0; i < name.length; i++) {
-      h += name.charCodeAt(i);
-      h &= 0xffffffff;
-      h += h << 10;
-      h &= 0xffffffff;
-      h ^= h >> 6;
-      h &= 0xffffffff;
-    }
-    return h;
-  }
-
-  int _letterNumber(int x) {
-    if (x >= ALPHABET_CHARACTERS) x %= ALPHABET_CHARACTERS;
-    if (x < 26) return $a + x;
-    return $A + x - 26;
-  }
-
-  int _alphaNumericNumber(int x) {
-    if (x >= ALPHANUMERIC_CHARACTERS) x %= ALPHANUMERIC_CHARACTERS;
-    if (x < 26) return $a + x;
-    if (x < 52) return $A + x - 26;
-    return $0 + x - 52;
-  }
-
-}
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart b/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart
index 691d73b..c4888b2 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart
@@ -8,6 +8,8 @@
  * Assigns JavaScript identifiers to Dart variables, class-names and members.
  */
 class Namer {
+  final Compiler compiler;
+
   static Set<String> _jsReserved = null;
   Set<String> get jsReserved {
     if (_jsReserved == null) {
@@ -18,22 +20,15 @@
     return _jsReserved;
   }
 
-  final String CURRENT_ISOLATE = r'$';
-
   /**
    * Map from top-level or static elements to their unique identifiers provided
    * by [getName].
    *
    * Invariant: Keys must be declaration elements.
    */
-  final Compiler compiler;
   final Map<Element, String> globals;
+  final Map<String, int> usedGlobals;
   final Map<String, LibraryElement> shortPrivateNameOwners;
-  final Set<String> usedGlobalNames;
-  final Set<String> usedInstanceNames;
-  final Map<String, String> instanceNameMap;
-  final Map<String, String> globalNameMap;
-  final Map<String, int> popularNameCounters;
 
   /**
    * A cache of names used for bailout methods. We make sure two
@@ -50,27 +45,22 @@
 
   Namer(this.compiler)
       : globals = new Map<Element, String>(),
+        usedGlobals = new Map<String, int>(),
         shortPrivateNameOwners = new Map<String, LibraryElement>(),
         bailoutNames = new Map<Element, String>(),
         usedBailoutInstanceNames = new Set<String>(),
-        usedGlobalNames = new Set<String>(),
-        usedInstanceNames = new Set<String>(),
-        instanceNameMap = new Map<String, String>(),
-        globalNameMap = new Map<String, String>(),
-        constantNames = new Map<Constant, String>(),
-        popularNameCounters = new Map<String, int>();
+        constantNames = new Map<Constant, String>();
 
-  String get ISOLATE => 'Isolate';
-  String get ISOLATE_PROPERTIES => r'$isolateProperties';
+  final String CURRENT_ISOLATE = r'$';
+  final String ISOLATE = 'Isolate';
+  final String ISOLATE_PROPERTIES = r"$isolateProperties";
   /**
    * Some closures must contain their name. The name is stored in
    * [STATIC_CLOSURE_NAME_NAME].
    */
-  String get STATIC_CLOSURE_NAME_NAME => r'$name';
-  SourceString get CLOSURE_INVOCATION_NAME => Compiler.CALL_OPERATOR_NAME;
-  bool get shouldMinify => false;
-
-  bool isReserved(String name) => name == ISOLATE;
+  final String STATIC_CLOSURE_NAME_NAME = r'$name';
+  static const SourceString CLOSURE_INVOCATION_NAME =
+      Compiler.CALL_OPERATOR_NAME;
 
   String constantName(Constant constant) {
     // In the current implementation it doesn't make sense to give names to
@@ -79,30 +69,16 @@
     assert(!constant.isFunction());
     String result = constantNames[constant];
     if (result == null) {
-      String longName;
-      if (shouldMinify) {
-        if (constant.isString()) {
-          StringConstant stringConstant = constant;
-          // The minifier never returns the same string as we suggested so we
-          // can suggest any name and it will use it as input to the hashing
-          // algorithm.  This means that constants will tend to have the same
-          // name from version to version of the program being minfied.
-          longName = stringConstant.value.slowToString();
-        } else {
-          longName = "C";
-        }
-      } else {
-        longName = "CTC";
-      }
-      result = getFreshName(longName, usedGlobalNames);
+      result = getFreshGlobalName("CTC");
       constantNames[constant] = result;
     }
     return result;
   }
 
   String closureInvocationName(Selector selector) {
-    return
-        instanceMethodInvocationName(null, CLOSURE_INVOCATION_NAME, selector);
+    // TODO(floitsch): mangle, while not conflicting with instance names.
+    return instanceMethodInvocationName(null, CLOSURE_INVOCATION_NAME,
+                                        selector);
   }
 
   String breakLabelName(LabelElement label) {
@@ -128,7 +104,6 @@
    * mangles the [name] so that each library has a unique name.
    */
   String privateName(LibraryElement lib, SourceString name) {
-    String result;
     if (name.isPrivate()) {
       String nameString = name.slowToString();
       // The first library asking for a short private name wins.
@@ -137,22 +112,17 @@
       // If a private name could clash with a mangled private name we don't
       // use the short name. For example a private name "_lib3_foo" would
       // clash with "_foo" from "lib3".
-      if (owner == lib &&
-          !nameString.startsWith('_$LIBRARY_PREFIX') &&
-          !shouldMinify) {
-        result = nameString;
-      } else {
-        String libName = getName(lib);
-        // If a library name does not start with the [LIBRARY_PREFIX] then our
-        // assumptions about clashing with mangled private members do not hold.
-        assert(shouldMinify || libName.startsWith(LIBRARY_PREFIX));
-        // TODO(erikcorry): Fix this with other manglings to avoid clashes.
-        result = '_lib$libName\$$nameString';
+      if (identical(owner, lib) && !nameString.startsWith('_$LIBRARY_PREFIX')) {
+        return nameString;
       }
+      String libName = getName(lib);
+      // If a library name does not start with the [LIBRARY_PREFIX] then our
+      // assumptions about clashing with mangled private members do not hold.
+      assert(libName.startsWith(LIBRARY_PREFIX));
+      return '_$libName$nameString';
     } else {
-      result = name.slowToString();
+      return name.slowToString();
     }
-    return result;
   }
 
   String instanceMethodName(FunctionElement element) {
@@ -165,27 +135,21 @@
     FunctionSignature signature = element.computeSignature(compiler);
     String methodName =
         '${privateName(lib, name)}\$${signature.parameterCount}';
-    if (signature.optionalParametersAreNamed &&
-        !signature.optionalParameters.isEmpty) {
+    if (!signature.optionalParametersAreNamed) {
+      return methodName;
+    } else if (!signature.optionalParameters.isEmpty) {
       StringBuffer buffer = new StringBuffer();
       signature.orderedOptionalParameters.forEach((Element element) {
         buffer.add('\$${JsNames.getValid(element.name.slowToString())}');
       });
-      methodName = '$methodName$buffer';
+      return '$methodName$buffer';
     }
-    if (name == CLOSURE_INVOCATION_NAME) return methodName;
-    return getMappedInstanceName(methodName);
   }
 
   String publicInstanceMethodNameByArity(SourceString name, int arity) {
     name = Elements.operatorNameToIdentifier(name);
     assert(!name.isPrivate());
-    var base = name.slowToString();
-    // We don't mangle the closure invoking function name because it is
-    // generated in applyFunction.
-    var proposedName = '$base\$$arity';
-    if (base == CLOSURE_INVOCATION_NAME) return proposedName;
-    return getMappedInstanceName(proposedName);
+    return '${name.slowToString()}\$$arity';
   }
 
   String instanceMethodInvocationName(LibraryElement lib, SourceString name,
@@ -198,16 +162,12 @@
       buffer.add(r'$');
       argumentName.printOn(buffer);
     }
-    if (name == CLOSURE_INVOCATION_NAME) {
-      return '$CLOSURE_INVOCATION_NAME\$${selector.argumentCount}$buffer';
-    }
-    return getMappedInstanceName(
-        '${privateName(lib, name)}\$${selector.argumentCount}$buffer');
+    return '${privateName(lib, name)}\$${selector.argumentCount}$buffer';
   }
 
   String instanceFieldName(LibraryElement libraryElement, SourceString name) {
     String proposedName = privateName(libraryElement, name);
-    return getMappedInstanceName(proposedName);
+    return safeName(proposedName);
   }
 
   String shadowedFieldName(Element fieldElement) {
@@ -216,71 +176,45 @@
     String libName = getName(libraryElement);
     String clsName = getName(cls);
     String instanceName = instanceFieldName(libraryElement, fieldElement.name);
-    return getMappedInstanceName('$libName\$$clsName\$$instanceName');
+    return safeName('$libName\$$clsName\$$instanceName');
   }
 
   String setterName(LibraryElement lib, SourceString name) {
     // We dynamically create setters from the field-name. The setter name must
     // therefore be derived from the instance field-name.
-    String fieldName = getMappedInstanceName(privateName(lib, name));
+    String fieldName = safeName(privateName(lib, name));
     return 'set\$$fieldName';
   }
 
   String publicGetterName(SourceString name) {
     // We dynamically create getters from the field-name. The getter name must
     // therefore be derived from the instance field-name.
-    String fieldName = getMappedInstanceName(name.slowToString());
+    String fieldName = safeName(name.slowToString());
     return 'get\$$fieldName';
   }
 
   String getterName(LibraryElement lib, SourceString name) {
     // We dynamically create getters from the field-name. The getter name must
     // therefore be derived from the instance field-name.
-    String fieldName = getMappedInstanceName(privateName(lib, name));
+    String fieldName = safeName(privateName(lib, name));
     return 'get\$$fieldName';
   }
 
-  String publicSetterName(SourceString name) {
-    // We dynamically create setter from the field-name. The setter name must
-    // therefore be derived from the instance field-name.
-    String fieldName = name.slowToString();
-    return 'set\$$fieldName';
-  }
-
-  String getMappedGlobalName(String proposedName) {
-    var newName = globalNameMap[proposedName];
-    if (newName == null) {
-      newName = getFreshName(proposedName, usedGlobalNames);
-      globalNameMap[proposedName] = newName;
+  String getFreshGlobalName(String proposedName) {
+    String name = proposedName;
+    int count = usedGlobals[name];
+    if (count != null) {
+      // Not the first time we see this name. Append a number to make it unique.
+      do {
+        name = '$proposedName${count++}';
+      } while (usedGlobals[name] != null);
+      // Record the count in case we see this name later. We
+      // frequently see names multiple times, as all our closures use
+      // the same name for their class.
+      usedGlobals[proposedName] = count;
     }
-    return newName;
-  }
-
-  String getMappedInstanceName(String proposedName) {
-    var newName = instanceNameMap[proposedName];
-    if (newName == null) {
-      newName = getFreshName(proposedName, usedInstanceNames);
-      instanceNameMap[proposedName] = newName;
-    }
-    return newName;
-  }
-
-  String getFreshName(String proposedName, Set<String> usedNames) {
-    var candidate;
-    proposedName = safeName(proposedName);
-    if (!usedNames.contains(proposedName)) {
-      candidate = proposedName;
-    } else {
-      var counter = popularNameCounters[proposedName];
-      var i = counter == null ? 0 : counter;
-      while (usedNames.contains("$proposedName$i")) {
-        i++;
-      }
-      popularNameCounters[proposedName] = i + 1;
-      candidate = "$proposedName$i";
-    }
-    usedNames.add(candidate);
-    return candidate;
+    usedGlobals[name] = 0;
+    return name;
   }
 
   static const String LIBRARY_PREFIX = "lib";
@@ -313,7 +247,15 @@
     } else {
       name = element.name.slowToString();
     }
-    return name;
+    return safeName(name);
+  }
+
+  String getSpecializedName(Element element, Collection<ClassElement> classes) {
+    StringBuffer buffer = new StringBuffer('${getName(element)}\$');
+    for (ClassElement cls in classes) {
+      buffer.add(getName(cls));
+    }
+    return safeName(buffer.toString());
   }
 
   String getBailoutName(Element element) {
@@ -321,15 +263,12 @@
     if (name != null) return name;
     bool global = !element.isInstanceMember();
     String unminifiedName = '${getName(element)}\$bailout';
-    if (global) {
-      name = getMappedGlobalName(unminifiedName);
-    } else {
-      name = unminifiedName;
+    name = unminifiedName;
+    if (!global) {
       int i = 0;
       while (usedBailoutInstanceNames.contains(name)) {
         name = '$unminifiedName${i++}';
       }
-      name = getMappedInstanceName(name);
       usedBailoutInstanceNames.add(name);
     }
     bailoutNames[element] = name;
@@ -371,26 +310,18 @@
       if (identical(kind, ElementKind.VARIABLE) ||
           identical(kind, ElementKind.PARAMETER)) {
         // The name is not guaranteed to be unique.
-        return safeName(guess);
+        return guess;
       }
-      if (kind == ElementKind.GENERATIVE_CONSTRUCTOR ||
-          kind == ElementKind.FUNCTION ||
-          kind == ElementKind.CLASS ||
-          kind == ElementKind.FIELD ||
-          kind == ElementKind.GETTER ||
-          kind == ElementKind.SETTER ||
-          kind == ElementKind.TYPEDEF ||
-          kind == ElementKind.LIBRARY ||
-          kind == ElementKind.MALFORMED_TYPE) {
-        bool isNative = false;
-        if (identical(kind, ElementKind.CLASS)) {
-          ClassElement class_elt = element;
-          isNative = class_elt.isNative();
-        }
-        if (Elements.isInstanceField(element)) {
-          isNative = element.isNative();
-        }
-        String result = isNative ? guess : getFreshName(guess, usedGlobalNames);
+      if (identical(kind, ElementKind.GENERATIVE_CONSTRUCTOR) ||
+          identical(kind, ElementKind.FUNCTION) ||
+          identical(kind, ElementKind.CLASS) ||
+          identical(kind, ElementKind.FIELD) ||
+          identical(kind, ElementKind.GETTER) ||
+          identical(kind, ElementKind.SETTER) ||
+          identical(kind, ElementKind.TYPEDEF) ||
+          identical(kind, ElementKind.LIBRARY) ||
+          identical(kind, ElementKind.MALFORMED_TYPE)) {
+        String result = getFreshGlobalName(guess);
         globals[element] = result;
         return result;
       }
@@ -400,25 +331,21 @@
   }
 
   String getLazyInitializerName(Element element) {
+    // TODO(floitsch): mangle while not conflicting with other statics.
     assert(Elements.isStaticOrTopLevelField(element));
-    return getMappedGlobalName("get\$${getName(element)}");
+    return "get\$${getName(element)}";
   }
 
   String isolatePropertiesAccess(Element element) {
     return "$ISOLATE.$ISOLATE_PROPERTIES.${getName(element)}";
   }
 
-  String isolatePropertiesAccessForConstant(String constantName) {
-    return "$ISOLATE.$ISOLATE_PROPERTIES.$constantName";
-  }
-
   String isolateAccess(Element element) {
     return "$CURRENT_ISOLATE.${getName(element)}";
   }
 
   String isolateBailoutAccess(Element element) {
-    String newName = getMappedGlobalName('${getName(element)}\$bailout');
-    return '$CURRENT_ISOLATE.$newName';
+    return '${isolateAccess(element)}\$bailout';
   }
 
   String isolateLazyInitializerAccess(Element element) {
@@ -426,7 +353,6 @@
   }
 
   String operatorIs(Element element) {
-    // TODO(erikcorry): Reduce from is$x to ix when we are minifying.
     return 'is\$${getName(element)}';
   }
 
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart b/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart
index c2542ef..076ab69 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart
@@ -31,9 +31,6 @@
   // Caches the methods that have a native body.
   Set<FunctionElement> nativeMethods;
 
-  // Caches the methods that redirect to a JS method.
-  Map<FunctionElement, String> redirectingMethods;
-
   // Do we need the native emitter to take care of handling
   // noSuchMethod for us? This flag is set to true in the emitter if
   // it finds any native class that needs noSuchMethod handling.
@@ -46,16 +43,11 @@
         directSubtypes = new Map<ClassElement, List<ClassElement>>(),
         overriddenMethods = new Set<FunctionElement>(),
         nativeMethods = new Set<FunctionElement>(),
-        redirectingMethods = new Map<FunctionElement, String>(),
         nativeBuffer = new CodeBuffer();
 
   Compiler get compiler => emitter.compiler;
   JavaScriptBackend get backend => compiler.backend;
 
-  void addRedirectingMethod(FunctionElement element, String name) {
-    redirectingMethods[element] = name;
-  }
-
   String get dynamicName {
     Element element = compiler.findHelper(
         const SourceString('dynamicFunction'));
@@ -98,14 +90,15 @@
   String get defineNativeClassFunction {
     return """
 function(cls, desc) {
-  var fields = desc[''] || [];
   var generateGetterSetter = ${emitter.generateGetterSetterFunction};
-  for (var i = 0; i < fields.length; i++) {
-    generateGetterSetter(fields[i], desc);
+  var fields = desc[''];
+  var fields_array = fields ? fields.split(',') : [];
+  for (var i = 0; i < fields_array.length; i++) {
+    generateGetterSetter(fields_array[i], desc);
   }
   var hasOwnProperty = Object.prototype.hasOwnProperty;
   for (var method in desc) {
-    if (method !== '') {
+    if (method) {  """/* Short version of: if (method != '') */"""
       if (hasOwnProperty.call(desc, method)) {
         $dynamicName(method)[cls] = desc[method];
       }
@@ -115,7 +108,7 @@
   }
 
   void generateNativeLiteral(ClassElement classElement) {
-    String quotedNative = classElement.nativeName.slowToString();
+    String quotedNative = classElement.nativeTagInfo.slowToString();
     String nativeCode = quotedNative.substring(2, quotedNative.length - 1);
     String className = backend.namer.getName(classElement);
     nativeBuffer.add(className);
@@ -142,8 +135,8 @@
     return identical(quotedName[1], '@');
   }
 
-  String toNativeName(ClassElement cls) {
-    String quotedName = cls.nativeName.slowToString();
+  String toNativeTag(ClassElement cls) {
+    String quotedName = cls.nativeTagInfo.slowToString();
     if (isNativeGlobal(quotedName)) {
       // Global object, just be like the other types for now.
       return quotedName.substring(3, quotedName.length - 1);
@@ -156,7 +149,7 @@
     nativeClasses.add(classElement);
 
     assert(classElement.backendMembers.isEmpty);
-    String quotedName = classElement.nativeName.slowToString();
+    String quotedName = classElement.nativeTagInfo.slowToString();
     if (isNativeLiteral(quotedName)) {
       generateNativeLiteral(classElement);
       // The native literal kind needs to be dealt with specially when
@@ -168,7 +161,7 @@
     CodeBuffer getterSetterBuffer = new CodeBuffer();
     CodeBuffer methodBuffer = new CodeBuffer();
 
-    emitter.emitClassFields(classElement, fieldBuffer, false);
+    emitter.emitClassFields(classElement, fieldBuffer, false, isNative: true);
     emitter.emitClassGettersSetters(classElement, getterSetterBuffer, false);
     emitter.emitInstanceMembers(classElement, methodBuffer, false);
 
@@ -178,8 +171,8 @@
       return;
     }
 
-    String nativeName = toNativeName(classElement);
-    nativeBuffer.add("$defineNativeClassName('$nativeName', ");
+    String nativeTag = toNativeTag(classElement);
+    nativeBuffer.add("$defineNativeClassName('$nativeTag', ");
     nativeBuffer.add('{');
     bool firstInMap = true;
     if (!fieldBuffer.isEmpty) {
@@ -206,34 +199,47 @@
     return result == null ? const<ClassElement>[] : result;
   }
 
-  void potentiallyConvertDartClosuresToJs(CodeBuffer code,
+  void potentiallyConvertDartClosuresToJs(List<js.Statement> statements,
                                           FunctionElement member,
-                                          List<String> argumentsBuffer) {
+                                          List<js.Parameter> stubParameters) {
     FunctionSignature parameters = member.computeSignature(compiler);
     Element converter =
         compiler.findHelper(const SourceString('convertDartClosureToJS'));
     String closureConverter = backend.namer.isolateAccess(converter);
+    Set<String> stubParameterNames = new Set<String>.from(
+        stubParameters.map((param) => param.name));
     parameters.forEachParameter((Element parameter) {
       String name = parameter.name.slowToString();
-      // If [name] is not in [argumentsBuffer], then the parameter is
-      // an optional parameter that was not provided for that stub.
-      if (argumentsBuffer.indexOf(name) == -1) return;
-      DartType type = parameter.computeType(compiler).unalias(compiler);
-      if (type is FunctionType) {
-        // The parameter type is a function type either directly or through
-        // typedef(s).
-        int arity = type.computeArity();
-        code.add('  $name = $closureConverter($name, $arity);\n');
+      // If [name] is not in [stubParameters], then the parameter is an optional
+      // parameter that was not provided for this stub.
+      for (js.Parameter stubParameter in stubParameters) {
+        if (stubParameter.name == name) {
+          DartType type = parameter.computeType(compiler).unalias(compiler);
+          if (type is FunctionType) {
+            // The parameter type is a function type either directly or through
+            // typedef(s).
+            int arity = type.computeArity();
+
+            statements.add(
+                new js.ExpressionStatement(
+                    new js.Assignment(
+                        new js.VariableUse(name),
+                        new js.VariableUse(closureConverter)
+                            .callWith([new js.VariableUse(name),
+                                       new js.LiteralNumber('$arity')]))));
+            break;
+          }
+        }
       }
     });
   }
 
-  String generateParameterStub(Element member,
-                               String invocationName,
-                               String stubParameters,
-                               List<String> argumentsBuffer,
-                               int indexOfLastOptionalArgumentInParameters,
-                               CodeBuffer buffer) {
+  List<js.Statement> generateParameterStubStatements(
+      Element member,
+      String invocationName,
+      List<js.Parameter> stubParameters,
+      List<js.Expression> argumentsBuffer,
+      int indexOfLastOptionalArgumentInParameters) {
     // The target JS function may check arguments.length so we need to
     // make sure not to pass any unspecified optional arguments to it.
     // For example, for the following Dart method:
@@ -243,37 +249,92 @@
     // must be turned into a JS call to:
     //   foo(null, y).
 
-    List<String> nativeArgumentsBuffer = argumentsBuffer.getRange(
-        0, indexOfLastOptionalArgumentInParameters + 1);
-
     ClassElement classElement = member.enclosingElement;
-    String nativeName = classElement.nativeName.slowToString();
-    String nativeArguments = Strings.join(nativeArgumentsBuffer, ",");
+    //String nativeTagInfo = classElement.nativeName.slowToString();
+    String nativeTagInfo = classElement.nativeTagInfo.slowToString();
 
-    CodeBuffer code = new CodeBuffer();
-    potentiallyConvertDartClosuresToJs(code, member, argumentsBuffer);
+    List<js.Statement> statements = <js.Statement>[];
+    potentiallyConvertDartClosuresToJs(statements, member, stubParameters);
+
+    String target;
+    List<js.Expression> arguments;
 
     if (!nativeMethods.contains(member)) {
-      // When calling a method that has a native body, we call it
-      // with our calling conventions.
-      String arguments = Strings.join(argumentsBuffer, ",");
-      code.add('  return this.${backend.namer.getName(member)}($arguments)');
+      // When calling a method that has a native body, we call it with our
+      // calling conventions.
+      target = backend.namer.getName(member);
+      arguments = argumentsBuffer;
     } else {
-      // When calling a JS method, we call it with the native name.
-      String name = redirectingMethods[member];
-      if (name == null) name = member.name.slowToString();
-      code.add('  return this.$name($nativeArguments);');
+      // When calling a JS method, we call it with the native name, and only the
+      // arguments up until the last one provided.
+      target = member.nativeName();
+      arguments = argumentsBuffer.getRange(
+          0, indexOfLastOptionalArgumentInParameters + 1);
     }
+    statements.add(
+        new js.Return(
+            new js.VariableUse('this').dot(target).callWith(arguments)));
 
-    if (isNativeLiteral(nativeName) || !overriddenMethods.contains(member)) {
+    if (isNativeLiteral(nativeTagInfo) || !overriddenMethods.contains(member)) {
       // Call the method directly.
-      buffer.add(code.toString());
+      return statements;
     } else {
-      native.generateMethodWithPrototypeCheck(
-          compiler, buffer, invocationName, code.toString(), stubParameters);
+      return <js.Statement>[
+          generateMethodBodyWithPrototypeCheck(
+              invocationName, new js.Block(statements), stubParameters)];
     }
   }
 
+  // If a method is overridden, we must check if the prototype of 'this' has the
+  // method available. Otherwise, we may end up calling the method from the
+  // super class. If the method is not available, we make a direct call to
+  // Object.prototype.$methodName.  This method will patch the prototype of
+  // 'this' to the real method.
+  js.Statement generateMethodBodyWithPrototypeCheck(
+      String methodName,
+      js.Statement body,
+      List<js.Parameter> parameters) {
+    return new js.If(
+        new js.VariableUse('Object')
+            .dot('getPrototypeOf')
+            .callWith([new js.VariableUse('this')])
+            .dot('hasOwnProperty')
+            .callWith([new js.LiteralString("'$methodName'")]),
+        body,
+        new js.Block(
+            <js.Statement>[
+                new js.Return(
+                    new js.VariableUse('Object')
+                        .dot('prototype').dot(methodName).dot('call')
+                        .callWith(
+                            <js.Expression>[new js.VariableUse('this')]
+                                ..addAll(parameters.map((param) =>
+                                        new js.VariableUse(param.name)))))
+            ]));
+  }
+
+  js.Block generateMethodBodyWithPrototypeCheckForElement(
+      FunctionElement element,
+      js.Block body,
+      List<js.Parameter> parameters) {
+    String methodName;
+    Namer namer = backend.namer;
+    if (element.kind == ElementKind.FUNCTION) {
+      methodName = namer.instanceMethodName(element);
+    } else if (element.kind == ElementKind.GETTER) {
+      methodName = namer.getterName(element.getLibrary(), element.name);
+    } else if (element.kind == ElementKind.SETTER) {
+      methodName = namer.setterName(element.getLibrary(), element.name);
+    } else {
+      compiler.internalError('unexpected kind: "${element.kind}"',
+          element: element);
+    }
+
+    return new js.Block(
+        [generateMethodBodyWithPrototypeCheck(methodName, body, parameters)]);
+  }
+
+
   void emitDynamicDispatchMetadata() {
     if (classesWithDynamicDispatch.isEmpty) return;
     int length = classesWithDynamicDispatch.length;
@@ -327,14 +388,14 @@
       // Expression fragments for this set of cls keys.
       List<js.Expression> expressions = <js.Expression>[];
       // TODO: Remove if cls is abstract.
-      List<String> subtags = [toNativeName(classElement)];
+      List<String> subtags = [toNativeTag(classElement)];
       void walk(ClassElement cls) {
         for (final ClassElement subclass in getDirectSubclasses(cls)) {
           ClassElement tag = subclass;
           js.Expression existing = tagDefns[tag];
           if (existing == null) {
             // [subclass] is still within the subtree between dispatch classes.
-            subtags.add(toNativeName(tag));
+            subtags.add(toNativeTag(tag));
             walk(subclass);
           } else {
             // [subclass] is one of the preorderDispatchClasses, so CSE this
@@ -404,7 +465,7 @@
           new js.ArrayInitializer.from(
               preorderDispatchClasses.map((cls) =>
                   new js.ArrayInitializer.from([
-                      new js.LiteralString("'${toNativeName(cls)}'"),
+                      new js.LiteralString("'${toNativeTag(cls)}'"),
                       tagDefns[cls]])));
 
       //  $.dynamicSetMetadata(table);
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/runtime_types.dart b/sdk/lib/_internal/compiler/implementation/js_backend/runtime_types.dart
index 2064f09..a4545e6 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/runtime_types.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/runtime_types.dart
@@ -23,11 +23,10 @@
         InterfaceType interface = t;
         ClassElement element = t.element;
         if (element.typeVariables.isEmpty) return;
-        bool isRaw = interface.typeArguments.isEmpty;
+        bool isRaw = interface.isRaw;
         if (isRaw && !expandRawType) return;
         builder.add('<');
-        Iterable items =
-            isRaw ? element.typeVariables : interface.typeArguments;
+        Iterable items = interface.typeArguments;
         var stringify = isRaw ? (_) => 'dynamic' : (type) => type.toString();
         bool first = true;
         for (var item in items) {
@@ -49,7 +48,7 @@
   static bool hasTypeArguments(DartType type) {
     if (type is InterfaceType) {
       InterfaceType interfaceType = type;
-      return !interfaceType.typeArguments.isEmpty;
+      return !interfaceType.isRaw;
     }
     return false;
   }
diff --git a/sdk/lib/_internal/compiler/implementation/lib/interceptors.dart b/sdk/lib/_internal/compiler/implementation/lib/interceptors.dart
index c87e763..5ac5b19 100644
--- a/sdk/lib/_internal/compiler/implementation/lib/interceptors.dart
+++ b/sdk/lib/_internal/compiler/implementation/lib/interceptors.dart
@@ -23,15 +23,10 @@
  * to emit a call to an intercepted method, that is a method that is
  * defined in an interceptor class.
  */
-getInterceptor(object) {
-  if (object is String) return const JSString();
-  if (isJsArray(object)) return const JSArray();
-  if (object is int) return const JSInt();
-  if (object is double) return const JSDouble();
-  if (object is bool) return const JSBool();
-  if (object == null) return const JSNull();
-  if (JS('String', 'typeof #', object) == 'function') return const JSFunction();
-  return const ObjectInterceptor();
+getInterceptor() {
+  // This is a magic method: the compiler does specialization of it
+  // depending on the uses of intercepted methods and instantiated
+  // primitive types.
 }
 
 /**
diff --git a/sdk/lib/_internal/compiler/implementation/lib/io_patch.dart b/sdk/lib/_internal/compiler/implementation/lib/io_patch.dart
index a253935..796bd98 100644
--- a/sdk/lib/_internal/compiler/implementation/lib/io_patch.dart
+++ b/sdk/lib/_internal/compiler/implementation/lib/io_patch.dart
@@ -87,6 +87,9 @@
   patch static _readByte(int id) {
     throw new UnsupportedError("RandomAccessFile._readByte");
   }
+  patch static _read(int id, int bytes) {
+    throw new UnsupportedError("RandomAccessFile._read");
+  }
   patch static _readList(int id, List<int> buffer, int offset, int bytes) {
     throw new UnsupportedError("RandomAccessFile._readList");
   }
diff --git a/sdk/lib/_internal/compiler/implementation/lib/isolate_patch.dart b/sdk/lib/_internal/compiler/implementation/lib/isolate_patch.dart
index 9c7b19d..c6356bf 100644
--- a/sdk/lib/_internal/compiler/implementation/lib/isolate_patch.dart
+++ b/sdk/lib/_internal/compiler/implementation/lib/isolate_patch.dart
@@ -188,9 +188,9 @@
   }
 
   void _nativeDetectEnvironment() {
-    JS("void", r"# = $isWorker", isWorker);
-    JS("void", r"# = $supportsWorkers", supportsWorkers);
-    JS("void", r"# = typeof(window) == 'undefined'", fromCommandLine);
+    isWorker = JS("bool", r"$isWorker");
+    supportsWorkers = JS("bool", r"$supportsWorkers");
+    fromCommandLine = JS("bool", r"typeof(window) == 'undefined'");
   }
 
   void _nativeInitWorkerMessageHandler() {
diff --git a/sdk/lib/_internal/compiler/implementation/lib/js_helper.dart b/sdk/lib/_internal/compiler/implementation/lib/js_helper.dart
index ad8d98c..7b046c9 100644
--- a/sdk/lib/_internal/compiler/implementation/lib/js_helper.dart
+++ b/sdk/lib/_internal/compiler/implementation/lib/js_helper.dart
@@ -540,7 +540,7 @@
       var performance = JS('var', 'window.performance');
       if (performance != null && 
           JS('bool', 'typeof #.webkitNow == "function"', performance)) {
-        return JS('num', '#.webkitNow()', performance);
+        return (1000 * JS('num', '#.webkitNow()', performance)).floor();
       }
     }
     return 1000 * dateNow();
@@ -557,7 +557,7 @@
       if (end <= kMaxApply) {
         subarray = array;
       } else {
-        subarray = JS('List<int>', r'array.slice(#, #)',
+        subarray = JS('=List', r'array.slice(#, #)',
                       i, i + kMaxApply < end ? i + kMaxApply : end);
       }
       result = JS('String', '# + String.fromCharCode.apply(#, #)',
@@ -972,9 +972,6 @@
  *
  * Some native exceptions are mapped to new Dart instances, others are
  * returned unmodified.
- *
- * TODO(erikcorry): Fix this to produce consistent result regardless of
- * minification.
  */
 unwrapException(ex) {
   // Note that we are checking if the object has the property. If it
@@ -1223,6 +1220,23 @@
 }
 
 /**
+ * A metadata annotation placed on native methods and fields of native classes
+ * to specify the JavaScript name.
+ *
+ * This example declares a Dart field + getter + setter called `$dom_title` that
+ * corresponds to the JavaScript property `title`.
+ *
+ *     class Docmument native "*Foo" {
+ *       @JSName('title')
+ *       String $dom_title;
+ *     }
+ */
+class JSName {
+  final String name;
+  const JSName(this.name);
+}
+
+/**
  * Represents the type of Null. The compiler treats this specially.
  * TODO(lrn): Null should be defined in core. It's a class, like int.
  * It just happens to act differently in assignability tests and,
diff --git a/sdk/lib/_internal/compiler/implementation/lib/js_string.dart b/sdk/lib/_internal/compiler/implementation/lib/js_string.dart
index c8bb16c..d45df32 100644
--- a/sdk/lib/_internal/compiler/implementation/lib/js_string.dart
+++ b/sdk/lib/_internal/compiler/implementation/lib/js_string.dart
@@ -49,11 +49,18 @@
 
   List<String> split(Pattern pattern) {
     checkNull(pattern);
-    return stringSplitUnchecked(this, pattern);
+    if (pattern is String) {
+      return JS('JSArray', r'#.split(#)', this, pattern);
+    } else if (pattern is JSSyntaxRegExp) {
+      var re = regExpGetNative(pattern);
+      return JS('JSArray', r'#.split(#)', this, re);
+    } else {
+      throw "String.split(Pattern) UNIMPLEMENTED";
+    }
   }
 
   List<String> splitChars() {
-    return JS('List', r'#.split("")', this);
+    return JS('JSArray', r'#.split("")', this);
   }
 
   bool startsWith(String other) {
diff --git a/sdk/lib/_internal/compiler/implementation/lib/native_helper.dart b/sdk/lib/_internal/compiler/implementation/lib/native_helper.dart
index 98eea02..46d81be 100644
--- a/sdk/lib/_internal/compiler/implementation/lib/native_helper.dart
+++ b/sdk/lib/_internal/compiler/implementation/lib/native_helper.dart
@@ -118,6 +118,10 @@
   JS('var', '#[#] = #', array, index, value);
 }
 
+propertyGet(var object, String property) {
+  return JS('var', '#[#]', object, property);
+}
+
 void propertySet(var object, String property, var value) {
   JS('var', '#[#] = #', object, property, value);
 }
@@ -201,31 +205,21 @@
             String name,
             var methods,
             List arguments) {
-  // The tag is related to the class name.  E.g. the dart:html class
-  // '_ButtonElement' has the tag 'HTMLButtonElement'.  TODO(erikcorry): rename
-  // getTypeNameOf to getTypeTag.
   String tag = getTypeNameOf(obj);
-  var hasOwnProperty = JS('var', 'Object.prototype.hasOwnProperty');
-  var method = lookupDynamicClass(hasOwnProperty, methods, tag);
+  var method = JS('var', '#[#]', methods, tag);
 
   if (method == null && _dynamicMetadata != null) {
-    // Look at the inheritance data, getting the class tags and using them
-    // to check the methods table for this method name.
     for (int i = 0; i < arrayLength(_dynamicMetadata); i++) {
       MetaInfo entry = arrayGet(_dynamicMetadata, i);
-      if (JS('bool', '#.call(#, #)', hasOwnProperty, entry._set, tag)) {
-        method = lookupDynamicClass(hasOwnProperty, methods, entry._tag);
-        // Stop if we found it in the methods array.
+      if (JS('bool', '#', propertyGet(entry._set, tag))) {
+        method = propertyGet(methods, entry._tag);
         if (method != null) break;
       }
     }
   }
 
-  // If we didn't find the method then look up in the Dart Object class, using
-  // getTypeNameOf in case the minifier has renamed Object.
   if (method == null) {
-    String nameOfObjectClass = getTypeNameOf(const Object());
-    method = lookupDynamicClass(hasOwnProperty, methods, nameOfObjectClass);
+    method = propertyGet(methods, 'Object');
   }
 
   var proto = JS('var', 'Object.getPrototypeOf(#)', obj);
@@ -245,24 +239,13 @@
       proto, name, name);
   }
 
-  if (JS('bool', '!#.call(#, #)', hasOwnProperty, proto, name)) {
+  if (JS('bool', '!#.hasOwnProperty(#)', proto, name)) {
     defineProperty(proto, name, method);
   }
 
   return JS('var', '#.apply(#, #)', method, obj, arguments);
 }
 
-// For each method name and class inheritance subtree, we use an ordinary JS
-// object as a hash map to store the method for each class.  Entries are added
-// in native_emitter.dart (see dynamicName).  In order to avoid the class names
-// clashing with the method names on Object.prototype (needed for native
-// objects) we must always use hasOwnProperty.
-var lookupDynamicClass(var hasOwnProperty, var methods, String className) {
-  return JS('bool', '#.call(#, #)', hasOwnProperty, methods, className) ?
-         JS('var', '#[#]', methods, className) :
-         null;
-}
-
 /**
  * Code for doing the dynamic dispatch on JavaScript prototypes that are not
  * available at compile-time. Each property of a native Dart class
@@ -290,10 +273,7 @@
   var methods = JS('var', '{}');
   // If there is a method attached to the Dart Object class, use it as
   // the method to call in case no method is registered for that type.
-  var dartMethod =
-      JS('var', 'Object.getPrototypeOf(#)[#]', const Object(), name);
-  // Take the method from the Dart Object class if we didn't find it yet and it
-  // is there.
+  var dartMethod = JS('var', 'Object.getPrototypeOf(#)[#]', const Object(), name);
   if (dartMethod != null) propertySet(methods, 'Object', dartMethod);
 
   var bind = JS('var',
diff --git a/sdk/lib/_internal/compiler/implementation/lib/string_helper.dart b/sdk/lib/_internal/compiler/implementation/lib/string_helper.dart
index 70580df..e3da2be 100644
--- a/sdk/lib/_internal/compiler/implementation/lib/string_helper.dart
+++ b/sdk/lib/_internal/compiler/implementation/lib/string_helper.dart
@@ -122,17 +122,6 @@
   }
 }
 
-stringSplitUnchecked(receiver, pattern) {
-  if (pattern is String) {
-    return JS('=List', r'#.split(#)', receiver, pattern);
-  } else if (pattern is JSSyntaxRegExp) {
-    var re = regExpGetNative(pattern);
-    return JS('=List', r'#.split(#)', receiver, re);
-  } else {
-    throw "String.split(Pattern) UNIMPLEMENTED";
-  }
-}
-
 stringJoinUnchecked(array, separator) {
   return JS('String', r'#.join(#)', array, separator);
 }
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirror.dart b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirror.dart
index 5d4f253..a5ee505 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirror.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirror.dart
@@ -524,7 +524,7 @@
     _ensureMembers();
     return new AsFilteredImmutableMap<String, MemberMirror, MethodMirror>(
         _members,
-        (MemberMirror member) => member is MethodMirror);
+        (MemberMirror member) => member is MethodMirror ? member : null);
   }
 
   Map<String, MethodMirror> get getters {
@@ -532,7 +532,8 @@
     return new AsFilteredImmutableMap<String, MemberMirror, MethodMirror>(
         _members,
         (MemberMirror member) =>
-            member is MethodMirror && (member as MethodMirror).isGetter);
+            member is MethodMirror && (member as MethodMirror).isGetter ?
+                member : null);
   }
 
   Map<String, MethodMirror> get setters {
@@ -540,14 +541,15 @@
     return new AsFilteredImmutableMap<String, MemberMirror, MethodMirror>(
         _members,
         (MemberMirror member) =>
-            member is MethodMirror && (member as MethodMirror).isSetter);
+            member is MethodMirror && (member as MethodMirror).isSetter ?
+                member : null);
   }
 
   Map<String, VariableMirror> get variables {
     _ensureMembers();
     return new AsFilteredImmutableMap<String, MemberMirror, VariableMirror>(
         _members,
-        (MemberMirror member) => member is VariableMirror);
+        (MemberMirror member) => member is VariableMirror ? member : null);
   }
 }
 
@@ -1169,11 +1171,13 @@
   List<TypeMirror> get typeArguments {
     if (_typeArguments == null) {
       _typeArguments = <TypeMirror>[];
-      Link<DartType> type = _interfaceType.typeArguments;
-      while (type != null && type.head != null) {
-        _typeArguments.add(_convertTypeToTypeMirror(mirrors, type.head,
-            mirrors.compiler.types.dynamicType));
-        type = type.tail;
+      if (!_interfaceType.isRaw) {
+        Link<DartType> type = _interfaceType.typeArguments;
+        while (type != null && type.head != null) {
+          _typeArguments.add(_convertTypeToTypeMirror(mirrors, type.head,
+              mirrors.compiler.types.dynamicType));
+          type = type.tail;
+        }
       }
     }
     return _typeArguments;
diff --git a/sdk/lib/_internal/compiler/implementation/native_handler.dart b/sdk/lib/_internal/compiler/implementation/native_handler.dart
index 8de208f..3e37ed3 100644
--- a/sdk/lib/_internal/compiler/implementation/native_handler.dart
+++ b/sdk/lib/_internal/compiler/implementation/native_handler.dart
@@ -35,15 +35,18 @@
   /// Initial entry point to native enqueuer.
   void processNativeClasses(Collection<LibraryElement> libraries) {}
 
+  /// Notification of a main Enqueuer worklist element.  For methods, adds
+  /// information from metadata attributes, and computes types instantiated due
+  /// to calling the method.
   void registerElement(Element element) {}
 
-  /// Method is a member of a native class.
-  void registerMethod(Element method) {}
+  /// Notification of native field.  Adds information from metadata attributes.
+  void registerField(Element field) {}
 
-  /// Compute types instantiated due to getting a native field.
+  /// Computes types instantiated due to getting a native field.
   void registerFieldLoad(Element field) {}
 
-  /// Compute types instantiated due to setting a native field.
+  /// Computes types instantiated due to setting a native field.
   void registerFieldStore(Element field) {}
 
   /**
@@ -93,6 +96,7 @@
 
   ClassElement _annotationCreatesClass;
   ClassElement _annotationReturnsClass;
+  ClassElement _annotationJsNameClass;
 
   /// Subclasses of [NativeEnqueuerBase] are constructed by the backend.
   NativeEnqueuerBase(this.world, this.compiler, this.enableLiveTypeAnalysis);
@@ -122,16 +126,22 @@
   }
 
   ClassElement get annotationCreatesClass {
-    if (_annotationCreatesClass == null) findAnnotationClasses();
+    findAnnotationClasses();
     return _annotationCreatesClass;
   }
 
   ClassElement get annotationReturnsClass {
-    if (_annotationReturnsClass == null) findAnnotationClasses();
+    findAnnotationClasses();
     return _annotationReturnsClass;
   }
 
+  ClassElement get annotationJsNameClass {
+    findAnnotationClasses();
+    return _annotationJsNameClass;
+  }
+
   void findAnnotationClasses() {
+    if (_annotationCreatesClass != null) return;
     ClassElement find(name) {
       Element e = compiler.findHelper(name);
       if (e == null || e is! ClassElement) {
@@ -141,8 +151,41 @@
     }
     _annotationCreatesClass = find(const SourceString('Creates'));
     _annotationReturnsClass = find(const SourceString('Returns'));
+    _annotationJsNameClass = find(const SourceString('JSName'));
   }
 
+  /// Returns the JSName annotation string or `null` if no JSName annotation is
+  /// present.
+  String findJsNameFromAnnotation(Element element) {
+    String name = null;
+    ClassElement annotationClass = annotationJsNameClass;
+    for (Link<MetadataAnnotation> link = element.metadata;
+         !link.isEmpty;
+         link = link.tail) {
+      MetadataAnnotation annotation = link.head.ensureResolved(compiler);
+      var value = annotation.value;
+      if (value is! ConstructedConstant) continue;
+      if (value.type is! InterfaceType) continue;
+      if (!identical(value.type.element, annotationClass)) continue;
+
+      var fields = value.fields;
+      // TODO(sra): Better validation of the constant.
+      if (fields.length != 1 || fields[0] is! StringConstant) {
+        PartialMetadataAnnotation partial = annotation;
+        compiler.cancel(
+            'Annotations needs one string: ${partial.parseNode(compiler)}');
+      }
+      String specString = fields[0].toDartString().slowToString();
+      if (name == null) {
+        name = specString;
+      } else {
+        PartialMetadataAnnotation partial = annotation;
+        compiler.cancel(
+            'Too many JSName annotations: ${partial.parseNode(compiler)}');
+      }
+    }
+    return name;
+  }
 
   enqueueClass(ClassElement classElement, cause) {
     assert(unusedClasses.contains(classElement));
@@ -179,11 +222,20 @@
   }
 
   registerElement(Element element) {
-    if (element.isFunction()) return registerMethod(element);
+    if (element.isFunction() || element.isGetter() || element.isSetter()) {
+      return registerMethod(element);
+    }
+  }
+
+  registerField(Element element) {
+    if (element.enclosingElement.isNative()) {
+      setNativeName(element);
+    }
   }
 
   registerMethod(Element method) {
     if (isNativeMethod(method)) {
+      setNativeName(method);
       processNativeBehavior(
           NativeBehavior.ofMethod(method, compiler),
           method);
@@ -191,6 +243,14 @@
     }
   }
 
+  /// Sets the native name of [element], either from an annotation, or
+  /// defaulting to the Dart name.
+  void setNativeName(Element element) {
+    String name = findJsNameFromAnnotation(element);
+    if (name == null) name = element.name.slowToString();
+    element.setNative(name);
+  }
+
   bool isNativeMethod(Element element) {
     if (!element.getLibrary().canUseNative) return false;
     // Native method?
@@ -236,7 +296,7 @@
       }
       assert(type is DartType);
       enqueueUnusedClassesMatching(
-          (nativeClass)  => compiler.types.isSubtype(nativeClass.type, type),
+          (nativeClass) => compiler.types.isSubtype(nativeClass.thisType, type),
           cause,
           'subtypeof($type)');
     }
@@ -357,7 +417,8 @@
           'dart/tests/compiler/dart2js_native')
       || libraryName == 'dart:isolate'
       || libraryName == 'dart:html'
-      || libraryName == 'dart:svg') {
+      || libraryName == 'dart:svg'
+      || libraryName == 'dart:web_audio') {
     library.canUseNative = true;
   }
 }
@@ -666,15 +727,15 @@
 }
 
 SourceString checkForNativeClass(ElementListener listener) {
-  SourceString nativeName;
+  SourceString nativeTagInfo;
   Node node = listener.nodes.head;
   if (node != null
       && node.asIdentifier() != null
       && node.asIdentifier().source.stringValue == 'native') {
-    nativeName = node.asIdentifier().token.next.value;
+    nativeTagInfo = node.asIdentifier().token.next.value;
     listener.popNode();
   }
-  return nativeName;
+  return nativeTagInfo;
 }
 
 bool isOverriddenMethod(FunctionElement element,
@@ -693,7 +754,6 @@
 void handleSsaNative(SsaBuilder builder, Expression nativeBody) {
   Compiler compiler = builder.compiler;
   FunctionElement element = builder.work.element;
-  element.setNative();
   NativeEmitter nativeEmitter = builder.emitter.nativeEmitter;
   // If what we're compiling is a getter named 'typeName' and the native
   // class is named 'DOMType', we generate a call to the typeNameOf
@@ -723,22 +783,23 @@
   }
 
   // Check which pattern this native method follows:
-  // 1) foo() native; hasBody = false, isRedirecting = false
-  // 2) foo() native "bar"; hasBody = false, isRedirecting = true
-  // 3) foo() native "return 42"; hasBody = true, isRedirecting = false
+  // 1) foo() native;
+  //      hasBody = false, isRedirecting = false
+  // 2) foo() native "bar";
+  //      hasBody = false, isRedirecting = true, no longer supported.
+  // 3) foo() native "return 42";
+  //      hasBody = true, isRedirecting = false
   bool hasBody = false;
-  bool isRedirecting = false;
-  String nativeMethodName = element.name.slowToString();
+  assert(element.isNative());
+  String nativeMethodName = element.nativeName();
   if (nativeBody != null) {
     LiteralString jsCode = nativeBody.asLiteralString();
     String str = jsCode.dartString.slowToString();
     if (nativeRedirectionRegExp.hasMatch(str)) {
-      nativeMethodName = str;
-      isRedirecting = true;
-      nativeEmitter.addRedirectingMethod(element, nativeMethodName);
-    } else {
-      hasBody = true;
+      compiler.cancel("Deprecated syntax, use @JSName('name') instead.",
+                      node: nativeBody);
     }
+    hasBody = true;
   }
 
   if (!hasBody) {
@@ -808,47 +869,3 @@
     builder.push(new HForeign.statement(jsCode.dartString, <HInstruction>[]));
   }
 }
-
-void generateMethodWithPrototypeCheckForElement(Compiler compiler,
-                                                StringBuffer buffer,
-                                                FunctionElement element,
-                                                String code,
-                                                String parameters) {
-  String methodName;
-  JavaScriptBackend backend = compiler.backend;
-  Namer namer = backend.namer;
-  if (element.kind == ElementKind.FUNCTION) {
-    methodName = namer.instanceMethodName(element);
-  } else if (element.kind == ElementKind.GETTER) {
-    methodName = namer.getterName(element.getLibrary(), element.name);
-  } else if (element.kind == ElementKind.SETTER) {
-    methodName = namer.setterName(element.getLibrary(), element.name);
-  } else {
-    compiler.internalError('unexpected kind: "${element.kind}"',
-                           element: element);
-  }
-
-  generateMethodWithPrototypeCheck(
-      compiler, buffer, methodName, code, parameters);
-}
-
-
-// If a method is overridden, we must check if the prototype of
-// 'this' has the method available. Otherwise, we may end up
-// calling the method from the super class. If the method is not
-// available, we make a direct call to Object.prototype.$methodName.
-// This method will patch the prototype of 'this' to the real method.
-void generateMethodWithPrototypeCheck(Compiler compiler,
-                                      StringBuffer buffer,
-                                      String methodName,
-                                      String code,
-                                      String parameters) {
-  buffer.add("  if (Object.getPrototypeOf(this).hasOwnProperty");
-  buffer.add("('$methodName')) {\n");
-  buffer.add("  $code");
-  buffer.add("  } else {\n");
-  buffer.add("    return Object.prototype.$methodName.call(this");
-  buffer.add(parameters == '' ? '' : ', $parameters');
-  buffer.add(");\n");
-  buffer.add("  }\n");
-}
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/members.dart b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
index 713a03c..6b578ce 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/members.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
@@ -644,7 +644,7 @@
       ResolverVisitor visitor =
           visitorFor(annotation.annotatedElement.enclosingElement);
       node.accept(visitor);
-      annotation.value = compiler.constantHandler.compileNodeWithDefinitions(
+      annotation.value = compiler.metadataHandler.compileNodeWithDefinitions(
           node, visitor.mapping, isConst: true);
 
       annotation.resolutionState = STATE_DONE;
@@ -1038,7 +1038,7 @@
 
   TypeResolver(this.compiler);
 
-  bool anyMalformedTypesInThere(Link<DartType> list) {
+  bool anyMalformedTypes(Link<DartType> list) {
     for (Link<DartType> link = list;
         !link.isEmpty;
         link = link.tail) {
@@ -1136,20 +1136,36 @@
           // Use the canonical type if it has no type parameters.
           type = cls.computeType(compiler);
         } else {
-          // In checked mode malformed-ness of the type argument bubbles up.
-          if (anyMalformedTypesInThere(arguments) &&
-              compiler.enableTypeAssertions) {
-            type = new MalformedType(
-                new MalformedTypeElement(node, element));
+          if (anyMalformedTypes(arguments)) {
+            // Build interface type (with malformed arguments in it) and
+            // call [whenResolved] to let [ConstructorResolver] create
+            // constructor selectors, which are used by 
+            // [SsaBuilder.visitNewSend] to figure out what class needs 
+            // to be built.
+            whenResolved(node,
+                         new InterfaceType(cls.declaration, arguments));
+            // Return malformed type element below so that
+            // [ConstructorResolver.visitTypeAnnotation] gets [:MalformedType:]
+            // and can map (via resolver.mapping) NewExpression node to
+            // this malformed type.
+            // [SsaBuilder.visitNewExpression] picks up the fact that
+            // NewExpression is mapped to malformed type and generates
+            // runtime error in checked mode.
+            type = new MalformedType(new MalformedTypeElement(node, element));
+            return type;
           } else {
-            type = new InterfaceType(cls.declaration, arguments);
+            if (arguments.isEmpty) {
+              // Use the canonical raw type if the class is generic.
+              type = cls.rawType;
+            } else {
+              type = new InterfaceType(cls.declaration, arguments);
+            }
           }
         }
       } else if (element.isTypedef()) {
         TypedefElement typdef = element;
         // TODO(ahe): Should be [ensureResolved].
         compiler.resolveTypedef(typdef);
-        typdef.computeType(compiler);
         Link<DartType> arguments = resolveTypeArguments(
             node, typdef.typeVariables, inStaticContext,
             scope, onFailure, whenResolved);
@@ -1157,7 +1173,11 @@
           // Return the canonical type if it has no type parameters.
           type = typdef.computeType(compiler);
         } else {
-          type = new TypedefType(typdef, arguments);
+          if (arguments.isEmpty) {
+            type = typdef.rawType;
+          } else {
+           type = new TypedefType(typdef, arguments);
+          }
         }
       } else if (element.isTypeVariable()) {
         if (inStaticContext) {
@@ -1808,6 +1828,10 @@
     // unqualified.
     useElement(node, target);
     registerSend(selector, target);
+    if (node.isPropertyAccess) {
+      // It might be the closurization of a method.
+      world.registerInstantiatedClass(compiler.functionClass);
+    }
     return node.isPropertyAccess ? target : null;
   }
 
@@ -1926,6 +1950,7 @@
   }
 
   visitLiteralBool(LiteralBool node) {
+    world.registerInstantiatedClass(compiler.boolClass);
   }
 
   visitLiteralString(LiteralString node) {
@@ -1933,6 +1958,7 @@
   }
 
   visitLiteralNull(LiteralNull node) {
+    world.registerInstantiatedClass(compiler.nullClass);
   }
 
   visitStringJuxtaposition(StringJuxtaposition node) {
@@ -1961,7 +1987,7 @@
   void handleRedirectingFactoryBody(Return node) {
     Element redirectionTarget = resolveRedirectingFactory(node);
     var type = mapping.getType(node.expression);
-    if (type is InterfaceType && !type.typeArguments.isEmpty) {
+    if (type is InterfaceType && !type.isRaw) {
       unimplemented(node.expression, 'type arguments on redirecting factory');
     }
     useElement(node.expression, redirectionTarget);
@@ -1984,6 +2010,8 @@
     }
     constructor.defaultImplementation = redirectionTarget;
     world.registerStaticUse(redirectionTarget);
+    world.registerInstantiatedClass(
+        redirectionTarget.enclosingElement.declaration);
   }
 
   visitThrow(Throw node) {
@@ -2549,8 +2577,7 @@
       } else {
         objectElement.ensureResolved(compiler);
       }
-      // TODO(ahe): This should be objectElement.computeType(...).
-      element.supertype = new InterfaceType(objectElement);
+      element.supertype = objectElement.computeType(compiler);
     }
     assert(element.interfaces == null);
     Link<DartType> interfaces = const Link<DartType>();
@@ -2779,7 +2806,11 @@
     return visit(node.selector);
   }
 
-  SourceString visitIdentifier(Identifier node) => node.source;
+  SourceString visitIdentifier(Identifier node) {
+    // The variable is initialized to null.
+    resolver.world.registerInstantiatedClass(compiler.nullClass);
+    return node.source;
+  }
 
   visitNodeList(NodeList node) {
     for (Link<Node> link = node.nodes; !link.isEmpty; link = link.tail) {
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/array_based_scanner.dart b/sdk/lib/_internal/compiler/implementation/scanner/array_based_scanner.dart
index d1e0099..ea84f75 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/array_based_scanner.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/array_based_scanner.dart
@@ -68,8 +68,7 @@
     tail.next = tail;
     discardOpenLt();
     while (!groupingStack.isEmpty) {
-      BeginGroupToken begin = groupingStack.head;
-      begin.endGroup = tail;
+      unmatchedBeginGroup(groupingStack.head);
       groupingStack = groupingStack.tail;
     }
   }
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/listener.dart b/sdk/lib/_internal/compiler/implementation/scanner/listener.dart
index e8a15aa..e4ca09e 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/listener.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/listener.dart
@@ -747,7 +747,7 @@
   void endClassDeclaration(int interfacesCount, Token beginToken,
                            Token extendsKeyword, Token implementsKeyword,
                            Token endToken) {
-    SourceString nativeName = native.checkForNativeClass(this);
+    SourceString nativeTagInfo = native.checkForNativeClass(this);
     NodeList interfaces =
         makeNodeList(interfacesCount, implementsKeyword, null, ",");
     TypeAnnotation supertype = popNode();
@@ -756,7 +756,7 @@
     int id = idGenerator();
     ClassElement element = new PartialClassElement(
         name.source, beginToken, endToken, compilationUnitElement, id);
-    element.nativeName = nativeName;
+    element.nativeTagInfo = nativeTagInfo;
     pushElement(element);
     rejectBuiltInIdentifier(name);
   }
@@ -947,7 +947,11 @@
   }
 
   Token unexpected(Token token) {
-    listener.cancel("unexpected token '${token.slowToString()}'", token: token);
+    String message = "unexpected token '${token.slowToString()}'";
+    if (token.info == BAD_INPUT_INFO) {
+      message = token.stringValue;
+    }
+    listener.cancel(message, token: token);
     return skipToEof(token);
   }
 
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/parser.dart b/sdk/lib/_internal/compiler/implementation/scanner/parser.dart
index f7ea476..64f712f 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/parser.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/parser.dart
@@ -849,6 +849,7 @@
       token = parseMember(token);
       ++count;
     }
+    expect('}', token);
     listener.endClassBody(count, begin, token);
     return token;
   }
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/string_scanner.dart b/sdk/lib/_internal/compiler/implementation/scanner/string_scanner.dart
index 23f7c4bc..958db2f 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/string_scanner.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/string_scanner.dart
@@ -34,6 +34,23 @@
     tail.next = new StringToken.fromSource(info, value, tokenStart);
     tail = tail.next;
   }
+
+  void unmatchedBeginGroup(BeginGroupToken begin) {
+    SourceString error = new SourceString('unmatched "${begin.stringValue}"');
+    Token close =
+        new StringToken.fromSource(BAD_INPUT_INFO, error, begin.charOffset);
+    // We want to ensure that unmatched BeginGroupTokens are reported
+    // as errors. However, the rest of the parser assume the groups
+    // are well-balanced and will never look at the endGroup
+    // token. This is a nice property that allows us to skip quickly
+    // over correct code. By inserting an additional error token in
+    // the stream, we can keep ignoring endGroup tokens.
+    Token next =
+        new StringToken.fromSource(BAD_INPUT_INFO, error, begin.charOffset);
+    begin.endGroup = close;
+    close.next = next;
+    next.next = begin.next;
+  }
 }
 
 class SubstringWrapper implements SourceString {
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/token.dart b/sdk/lib/_internal/compiler/implementation/scanner/token.dart
index a768b50..573fc4f 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/token.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/token.dart
@@ -141,7 +141,15 @@
   /**
    * The number of characters parsed by this token.
    */
-  int get slowCharCount => slowToString().length;
+  int get slowCharCount {
+    if (info == BAD_INPUT_INFO) {
+      // This is a token that wraps around an error message. Return 1
+      // instead of the size of the length of the error message.
+      return 1;
+    } else {
+      return slowToString().length;
+    }
+  }
 }
 
 /**
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
index cefee59..d76be36 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
@@ -202,7 +202,7 @@
               new OptionalParameterTypes(signature.optionalParameterCount);
           int index = 0;
           signature.forEachOptionalParameter((Element parameter) {
-            Constant defaultValue = compiler.compileVariable(parameter);
+            Constant defaultValue = builder.compileVariable(parameter);
             HType type = HGraph.mapConstantTypeToSsaType(defaultValue);
             defaultValueTypes.update(index, parameter.name, type);
             index++;
@@ -988,6 +988,24 @@
   }
 
   /**
+   * Compiles compile-time constants. Never returns [:null:]. If the
+   * initial value is not a compile-time constants, it reports an
+   * internal error.
+   */
+  Constant compileConstant(VariableElement element) {
+    return compiler.constantHandler.compileConstant(element);
+  }
+
+  Constant compileVariable(VariableElement element) {
+    return compiler.constantHandler.compileVariable(element);
+  }
+
+  bool isLazilyInitialized(VariableElement element) {
+    Constant initialValue = compileVariable(element);
+    return initialValue == null;
+  }
+
+  /**
    * Documentation wanted -- johnniwinther
    *
    * Invariant: [functionElement] must be an implementation element.
@@ -1524,8 +1542,7 @@
       // }
 
       // Fetch the original default value of [element];
-      ConstantHandler handler = compiler.constantHandler;
-      Constant constant = handler.compileVariable(element);
+      Constant constant = compileVariable(element);
       HConstant defaultValue = constant == null
           ? graph.addConstantNull(constantSystem)
           : graph.addConstant(constant);
@@ -2458,11 +2475,11 @@
       if (element.isField() && !element.isAssignable()) {
         // A static final or const. Get its constant value and inline it if
         // the value can be compiled eagerly.
-        value = compiler.compileVariable(element);
+        value = compileVariable(element);
       }
       if (value != null) {
         stack.add(graph.addConstant(value));
-      } else if (element.isField() && compiler.isLazilyInitialized(element)) {
+      } else if (element.isField() && isLazilyInitialized(element)) {
         push(new HLazyStatic(element));
       } else {
         // TODO(5346): Try to avoid the need for calling [declaration] before
@@ -2741,14 +2758,14 @@
       return pop();
     }
 
-    HInstruction compileConstant(Element parameter) {
+    HInstruction handleConstant(Element parameter) {
       Constant constant;
       TreeElements calleeElements =
           compiler.enqueuer.resolution.getCachedElements(element);
       if (calleeElements.isParameterChecked(parameter)) {
         constant = SentinelConstant.SENTINEL;
       } else {
-        constant = compiler.compileConstant(parameter);
+        constant = compileConstant(parameter);
       }
       return graph.addConstant(constant);
     }
@@ -2757,7 +2774,7 @@
                                        list,
                                        element,
                                        compileArgument,
-                                       compileConstant,
+                                       handleConstant,
                                        compiler);
   }
 
@@ -2802,7 +2819,7 @@
 
     List<HInstruction> inputs = <HInstruction>[];
     Set<ClassElement> interceptedClasses =
-        interceptors.getInterceptedClassesOn(selector);
+        getInterceptedClassesOn(node, selector);
     if (interceptedClasses != null) {
       inputs.add(invokeInterceptor(interceptedClasses, receiver, node));
     }
@@ -3060,6 +3077,11 @@
   }
 
   HInstruction analyzeTypeArgument(DartType argument, Node currentNode) {
+    if (argument == compiler.types.dynamicType) {
+      // Represent [dynamic] as [null].
+      return graph.addConstantNull(constantSystem);
+    }
+
     // These variables are shared between invocations of the helper methods.
     HInstruction typeInfo;
     StringBuffer template = new StringBuffer();
@@ -3119,7 +3141,7 @@
       } else if (type is InterfaceType) {
         bool isFirstVariable = true;
         InterfaceType interfaceType = type;
-        bool hasTypeArguments = !interfaceType.typeArguments.isEmpty;
+        bool hasTypeArguments = !interfaceType.isRaw;
         if (!isInQuotes) template.add("'");
         template.add(backend.namer.getName(type.element));
         if (hasTypeArguments) {
@@ -3157,9 +3179,11 @@
                              HInstruction newObject) {
     if (!compiler.world.needsRti(type.element)) return;
     List<HInstruction> inputs = <HInstruction>[];
-    type.typeArguments.forEach((DartType argument) {
-      inputs.add(analyzeTypeArgument(argument, currentNode));
-    });
+    if (!type.isRaw) {
+      type.typeArguments.forEach((DartType argument) {
+        inputs.add(analyzeTypeArgument(argument, currentNode));
+      });
+    }
     callSetRuntimeTypeInfo(type.element, inputs, newObject);
   }
 
@@ -3194,7 +3218,7 @@
         }
       } else if (element.isGenerativeConstructor()) {
         ClassElement cls = element.getEnclosingClass();
-        return new HBoundedType.exact(cls.type);
+        return new HBoundedType.exact(cls.thisType);
       } else {
         return HType.UNKNOWN;
       }
@@ -3229,7 +3253,7 @@
       return;
     }
     if (compiler.world.needsRti(constructor.enclosingElement)) {
-      if (!type.typeArguments.isEmpty) {
+      if (!type.isRaw) {
         type.typeArguments.forEach((DartType argument) {
           inputs.add(analyzeTypeArgument(argument, node));
         });
@@ -3423,8 +3447,7 @@
 
   visitNewExpression(NewExpression node) {
     Element element = elements[node.send];
-    if (!Elements.isErroneousElement(element) &&
-        !Elements.isMalformedElement(element)) {
+    if (!Elements.isUnresolved(element)) {
       FunctionElement function = element;
       element = function.redirectionTarget;
     }
@@ -3446,12 +3469,15 @@
       ConstantHandler handler = compiler.constantHandler;
       Constant constant = handler.compileNodeWithDefinitions(node, elements);
       stack.add(graph.addConstant(constant));
-    } else if (Elements.isMalformedElement(element)) {
-      Message message =
-          MessageKind.TYPE_VARIABLE_WITHIN_STATIC_MEMBER.message([element]);
-      generateRuntimeError(node.send, message.toString());
     } else {
-      visitNewSend(node.send, elements.getType(node));
+      DartType dartType = elements.getType(node);
+      if (dartType.kind == TypeKind.MALFORMED_TYPE &&
+          compiler.enableTypeAssertions) {
+        Message message = MessageKind.MALFORMED_TYPE_REFERENCE.message([node]);
+        generateRuntimeError(node.send, message.toString());
+      } else {
+        visitNewSend(node.send, dartType);
+      }
     }
   }
 
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart b/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
index d51850f..b704a11 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
@@ -73,7 +73,8 @@
       FunctionElement element = work.element;
       js.Block body;
       ClassElement enclosingClass = element.getEnclosingClass();
-      bool allowVariableMinification;
+      bool allowVariableMinification = !codegen.visitedForeignCode;
+
       if (element.isInstanceMember()
           && enclosingClass.isNative()
           && native.isOverriddenMethod(
@@ -83,18 +84,13 @@
         // and needs to know if the method is overridden.
         nativeEmitter.overriddenMethods.add(element);
         StringBuffer buffer = new StringBuffer();
-        String codeString = prettyPrint(codegen.body).toString();
-        String parametersString =
-            Strings.join(codegen.parameterNames.values, ", ");
-        native.generateMethodWithPrototypeCheckForElement(
-            compiler, buffer, element, codeString, parametersString);
-        js.Node nativeCode = new js.LiteralStatement(buffer.toString());
-        body = new js.Block(<js.Statement>[nativeCode]);
-        allowVariableMinification = false;
+        body =
+            nativeEmitter.generateMethodBodyWithPrototypeCheckForElement(
+                element, codegen.body, codegen.parameters);
       } else {
         body = codegen.body;
-        allowVariableMinification = !codegen.visitedForeignCode;
       }
+
       js.Fun fun = buildJavaScriptFunction(element, codegen.parameters, body);
       return prettyPrint(fun,
                          allowVariableMinification: allowVariableMinification);
@@ -1530,11 +1526,9 @@
   }
 
   void visitInterceptor(HInterceptor node) {
-    Element element = backend.getInterceptorMethod;
-    assert(element != null);
-    world.registerStaticUse(element);
-    js.VariableUse interceptor =
-        new js.VariableUse(backend.namer.isolateAccess(element));
+    String name =
+        backend.registerSpecializedGetInterceptor(node.interceptedClasses);
+    js.VariableUse interceptor = new js.VariableUse(name);
     use(node.receiver);
     List<js.Expression> arguments = <js.Expression>[pop()];
     push(new js.Call(interceptor, arguments), node);
@@ -1545,32 +1539,40 @@
     js.Expression object = pop();
     SourceString name = node.selector.name;
     String methodName;
-    List<js.Expression> arguments;
+    List<js.Expression> arguments = visitArguments(node.inputs);
     Element target = node.element;
 
-    // Avoid adding the generative constructor name to the list of
-    // seen selectors.
-    if (target != null && target.isGenerativeConstructorBody()) {
-      methodName = name.slowToString();
-      arguments = visitArguments(node.inputs);
-    } else {
+    if (target != null) {
+      // Avoid adding the generative constructor name to the list of
+      // seen selectors.
+      if (target.isGenerativeConstructorBody()) {
+        methodName = name.slowToString();
+      } else if (target == backend.jsArrayAdd) {
+        methodName = 'push';
+      } else if (target == backend.jsArrayRemoveLast) {
+        methodName = 'pop';
+      } else if (target == backend.jsStringSplit) {
+        methodName = 'split';
+        // Split returns a List, so we make sure the backend knows the
+        // list class is instantiated.
+        world.registerInstantiatedClass(compiler.listClass);
+      } else if (target == backend.jsStringConcat) {
+        push(new js.Binary('+', object, arguments[0]), node);
+        return;
+      }
+    }
+
+    if (methodName == null) {
       methodName = backend.namer.instanceMethodInvocationName(
           node.selector.library, name, node.selector);
-      arguments = visitArguments(node.inputs);
       bool inLoop = node.block.enclosingLoopHeader != null;
 
-      // Register this invocation to collect the types used at all call sites.
       Selector selector = getOptimizedSelectorFor(node, node.selector);
-      // TODO(ngeoffray): Remove the following restriction. Because
-      // the second input of this interceptor call is the actual
-      // receiver (the first is the interceptor), the backend gets
-      // confused. We should pass a list of types instead of a node to
-      // [registerDynamicInvocation].
-      if (!node.isInterceptorCall) {
-        backend.registerDynamicInvocation(node, selector, types);
-      } else {
+      if (node.isInterceptorCall) {
         backend.addInterceptedSelector(selector);
       }
+      // Register this invocation to collect the types used at all call sites.
+      backend.registerDynamicInvocation(node, selector, types);
 
       // If we don't know what we're calling or if we are calling a getter,
       // we need to register that fact that we may be calling a closure
@@ -1644,6 +1646,7 @@
     if (node.isInterceptorCall) {
       backend.addInterceptedSelector(getter);
     }
+    world.registerInstantiatedClass(compiler.functionClass);
   }
 
   visitInvokeClosure(HInvokeClosure node) {
@@ -1729,7 +1732,7 @@
       // property should not be mangled.
       push(new js.PropertyAccess.field(pop(), 'length'), node);
     } else {
-      String name = backend.namer.getName(node.element);
+      String name = _fieldPropertyName(node.element);
       push(new js.PropertyAccess.field(pop(), name), node);
       HType receiverHType = types[node.receiver];
       DartType type = receiverHType.computeType(compiler);
@@ -1741,7 +1744,7 @@
   }
 
   visitFieldSet(HFieldSet node) {
-    String name = backend.namer.getName(node.element);
+    String name = _fieldPropertyName(node.element);
     DartType type = types[node.receiver].computeType(compiler);
     if (type != null) {
       // Field setters in the generative constructor body are handled in a
@@ -1757,9 +1760,13 @@
     js.Expression receiver = pop();
     use(node.value);
     push(new js.Assignment(new js.PropertyAccess.field(receiver, name), pop()),
-         node);
+        node);
   }
 
+  String _fieldPropertyName(Element element) => element.isNative()
+      ? element.nativeName()
+      : backend.namer.getName(element);
+
   visitLocalGet(HLocalGet node) {
     use(node.receiver);
   }
@@ -1787,6 +1794,10 @@
       }
       push(new js.LiteralExpression.withData(code, data), node);
     }
+    DartType type = types[node].computeType(compiler);
+    if (type != null) {
+      world.registerInstantiatedClass(type.element);
+    }
     // TODO(sra): Tell world.nativeEnqueuer about the types created here.
   }
 
@@ -1815,49 +1826,18 @@
   }
 
   void generateConstant(Constant constant) {
-    Namer namer = backend.namer;
-    // TODO(floitsch): should we use the ConstantVisitor here?
-    if (!constant.isObject()) {
-      if (constant.isBool()) {
-        BoolConstant boolConstant = constant;
-        push(newLiteralBool(boolConstant.value));
-      } else if (constant.isNum()) {
-        // TODO(floitsch): get rid of the code buffer.
-        CodeBuffer buffer = new CodeBuffer();
-        backend.emitter.writeConstantToBuffer(constant, buffer);
-        push(new js.LiteralNumber(buffer.toString()));
-      } else if (constant.isNull()) {
-        push(new js.LiteralNull());
-      } else if (constant.isString()) {
-        // TODO(floitsch): get rid of the code buffer.
-        CodeBuffer buffer = new CodeBuffer();
-        backend.emitter.writeConstantToBuffer(constant, buffer);
-        push(new js.LiteralString(buffer.toString()));
-      } else if (constant.isFunction()) {
-        FunctionConstant function = constant;
-        world.registerStaticUse(function.element);
-        push(new js.VariableUse(namer.isolateAccess(function.element)));
-      } else if (constant.isSentinel()) {
-        // TODO(floitsch): get rid of the code buffer.
-        CodeBuffer buffer = new CodeBuffer();
-        backend.emitter.writeConstantToBuffer(constant, buffer);
-        push(new js.VariableUse(buffer.toString()));
-      } else {
-        compiler.internalError(
-            "The compiler does not know how generate code for "
-            "constant $constant");
-      }
-    } else {
-      String name = namer.constantName(constant);
-      js.VariableUse currentIsolateUse =
-          new js.VariableUse(backend.namer.CURRENT_ISOLATE);
-      push(new js.PropertyAccess.field(currentIsolateUse, name));
+    if (constant.isFunction()) {
+      FunctionConstant function = constant;
+      world.registerStaticUse(function.element);
     }
+    push(backend.emitter.constantReference(constant));
   }
 
   visitConstant(HConstant node) {
     assert(isGenerateAtUseSite(node));
     generateConstant(node.constant);
+    DartType type = node.constant.computeType(compiler);
+    world.registerInstantiatedClass(type.element);
   }
 
   visitLoopBranch(HLoopBranch node) {
@@ -2091,20 +2071,20 @@
     node.usedBy.forEach((HInstruction instr) {
       if (instr is !HInvokeStatic) {
         backend.registerNonCallStaticUse(node);
-      } else if (!identical(instr.target, node)) {
-        backend.registerNonCallStaticUse(node);
-      } else {
-        // If invoking the static is can still be passed as an argument as well
-        // which will also be non call static use.
-        for (int i = 1; i < node.inputs.length; i++) {
-          if (identical(node.inputs, node)) {
-            backend.registerNonCallStaticUse(node);
-            break;
-          }
+        if (node.element.isFunction()) {
+          world.registerInstantiatedClass(compiler.functionClass);
         }
+      } else if (instr.target != node) {
+        backend.registerNonCallStaticUse(node);
       }
     });
-    world.registerStaticUse(node.element);
+    Element element = node.element;
+    world.registerStaticUse(element);
+    ClassElement cls = element.getEnclosingClass();    
+    if (element.isGenerativeConstructor()
+        || (element.isFactoryConstructor() && cls == compiler.listClass)) {
+      world.registerInstantiatedClass(cls);
+    }
     push(new js.VariableUse(backend.namer.isolateAccess(node.element)));
   }
 
@@ -2159,6 +2139,7 @@
   }
 
   void visitLiteralList(HLiteralList node) {
+    world.registerInstantiatedClass(compiler.listClass);
     generateArrayLiteral(node);
   }
 
@@ -2423,15 +2404,19 @@
         use(node.typeInfoCall);
         int index = RuntimeTypeInformation.getTypeVariableIndex(typeVariable);
         js.PropertyAccess field = new js.PropertyAccess.indexed(pop(), index);
-        RuntimeTypeInformation rti = backend.rti;
-        String typeName = rti.getStringRepresentation(arguments.head);
-        js.Expression genericName = new js.LiteralString("'$typeName'");
-        js.Binary eqTest = new js.Binary('===', field, genericName);
         // Also test for 'undefined' in case the object does not have
         // any type variable.
         js.Prefix undefinedTest = new js.Prefix('!', field);
-        result = new js.Binary(
-            '&&', result, new js.Binary('||', undefinedTest, eqTest));
+        if (arguments.head == compiler.types.dynamicType) {
+          result = new js.Binary('&&', result, undefinedTest);
+        } else {
+          RuntimeTypeInformation rti = backend.rti;
+          String typeName = rti.getStringRepresentation(arguments.head);
+          js.Expression genericName = new js.LiteralString("'$typeName'");
+          js.Binary eqTest = new js.Binary('===', field, genericName);
+          result = new js.Binary(
+              '&&', result, new js.Binary('||', undefinedTest, eqTest));
+        }
         arguments = arguments.tail;
       }
       push(result, node);
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart b/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
index 2878379..b8144e3 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
@@ -1509,6 +1509,7 @@
     if (declaredType.slowToString() == 'double') return HType.DOUBLE;
     if (declaredType.slowToString() == 'num') return HType.NUMBER;
     if (declaredType.slowToString() == 'String') return HType.STRING;
+    if (declaredType.slowToString() == 'JSArray') return HType.READABLE_ARRAY;
     return HType.UNKNOWN;
   }
 
@@ -2370,7 +2371,7 @@
 }
 
 class HInterceptor extends HInstruction {
-  final Set<ClassElement> interceptedClasses;
+  Set<ClassElement> interceptedClasses;
   HInterceptor(this.interceptedClasses, HInstruction receiver)
       : super(<HInstruction>[receiver]);
   String toString() => 'interceptor on $interceptedClasses';
@@ -2379,9 +2380,16 @@
 
   void prepareGvn(HTypeMap types) {
     clearAllSideEffects();
+    setUseGvn();
   }
 
   int typeCode() => HInstruction.INTERCEPTOR_TYPECODE;
+  bool typeEquals(other) => other is HInterceptor;
+  bool dataEquals(HInterceptor other) {
+    return interceptedClasses == other.interceptedClasses
+        || (interceptedClasses.length == other.interceptedClasses.length
+            && interceptedClasses.containsAll(other.interceptedClasses));
+  }
 }
 
 /** An [HLazyStatic] is a static that is initialized lazily at first read. */
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart b/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
index e0b8c41..995ac5b 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
@@ -39,12 +39,13 @@
           new SsaConstantFolder(constantSystem, backend, work, types),
           new SsaTypeConversionInserter(compiler),
           new SsaTypePropagator(compiler, types),
-          new SsaCheckInserter(backend, work, types, context.boundsChecked),
           new SsaConstantFolder(constantSystem, backend, work, types),
+          new SsaCheckInserter(backend, work, types, context.boundsChecked),
           new SsaRedundantPhiEliminator(),
           new SsaDeadPhiEliminator(),
           new SsaConstantFolder(constantSystem, backend, work, types),
           new SsaTypePropagator(compiler, types),
+          new SsaReceiverSpecialization(compiler),
           new SsaGlobalValueNumberer(compiler, types),
           new SsaCodeMotion(),
           new SsaValueRangeAnalyzer(constantSystem, types, work),
@@ -206,11 +207,59 @@
   }
 
   HInstruction handleInterceptorCall(HInvokeDynamic node) {
+    if (node is !HInvokeDynamicMethod) return;
     HInstruction input = node.inputs[1];
     if (input.isString(types)
         && node.selector.name == const SourceString('toString')) {
       return node.inputs[1];
     }
+    // Check if this call does not need to be intercepted.
+    HType type = types[input];
+    var interceptor = node.inputs[0];
+    if (interceptor is !HThis && !type.canBePrimitive()) {
+      // If the type can be null, and the intercepted method can be in
+      // the object class, keep the interceptor.
+      if (type.canBeNull()
+          && interceptor.interceptedClasses.contains(compiler.objectClass)) {
+        return node;
+      }
+      // Change the call to a regular invoke dynamic call.
+      return new HInvokeDynamicMethod(
+          node.selector, node.inputs.getRange(1, node.inputs.length - 1));
+    }
+
+    Selector selector = node.selector;
+    SourceString selectorName = selector.name;
+    Element target;
+    if (input.isExtendableArray(types)) {
+      if (selectorName == backend.jsArrayRemoveLast.name
+          && selector.argumentCount == 0) {
+        target = backend.jsArrayRemoveLast;
+      } else if (selectorName == backend.jsArrayAdd.name
+                 && selector.argumentCount == 1
+                 && selector.namedArgumentCount == 0
+                 && !compiler.enableTypeAssertions) {
+        target = backend.jsArrayAdd;
+      }
+    } else if (input.isString(types)) {
+      if (selectorName == backend.jsStringSplit.name
+          && selector.argumentCount == 1
+          && selector.namedArgumentCount == 0
+          && node.inputs[2].isString(types)) {
+        target = backend.jsStringSplit;
+      } else if (selectorName == backend.jsStringConcat.name
+                 && selector.argumentCount == 1
+                 && selector.namedArgumentCount == 0
+                 && node.inputs[2].isString(types)) {
+        target = backend.jsStringConcat;
+      }
+    }
+    if (target != null) {
+      HInvokeDynamicMethod result = new HInvokeDynamicMethod(
+          node.selector, node.inputs.getRange(1, node.inputs.length - 1));
+      result.element = target;
+      return result;
+    }
     return node;
   }
 
@@ -250,8 +299,13 @@
     return node;
   }
 
-  HInstruction fromInterceptorToDynamicInvocation(HInvokeStatic node,
-                                                  Selector selector) {
+  /**
+   * Turns a primitive instruction (e.g. [HIndex], [HAdd], ...) into a
+   * [HInvokeDynamic] because we know the receiver is not a JS
+   * primitive object.
+   */
+  HInstruction fromPrimitiveInstructionToDynamicInvocation(HInvokeStatic node,
+                                                           Selector selector) {
     HBoundedType type = types[node.inputs[1]];
     HInvokeDynamicMethod result = new HInvokeDynamicMethod(
         selector,
@@ -281,7 +335,7 @@
   HInstruction visitIndex(HIndex node) {
     if (!node.receiver.canBePrimitive(types)) {
       Selector selector = new Selector.index();
-      return fromInterceptorToDynamicInvocation(node, selector);
+      return fromPrimitiveInstructionToDynamicInvocation(node, selector);
     }
     return node;
   }
@@ -289,7 +343,7 @@
   HInstruction visitIndexAssign(HIndexAssign node) {
     if (!node.receiver.canBePrimitive(types)) {
       Selector selector = new Selector.indexSet();
-      return fromInterceptorToDynamicInvocation(node, selector);
+      return fromPrimitiveInstructionToDynamicInvocation(node, selector);
     }
     return node;
   }
@@ -310,7 +364,7 @@
         // The equals operation is being optimized in visitEquals.
         && node is! HEquals) {
       Selector selector = new Selector.binaryOperator(operation.name);
-      return fromInterceptorToDynamicInvocation(node, selector);
+      return fromPrimitiveInstructionToDynamicInvocation(node, selector);
     }
     return node;
   }
@@ -656,24 +710,55 @@
     }
     return graph.addConstant(constantSystem.createString(folded, node.node));
   }
+
+  HInstruction visitInterceptor(HInterceptor node) {
+    if (node.isConstant()) return node;
+    HType type = types[node.inputs[0]];
+    ClassElement constantInterceptor;
+    if (type.isInteger()) {
+      constantInterceptor = backend.jsIntClass;
+    } else if (type.isDouble()) {
+      constantInterceptor = backend.jsDoubleClass;
+    } else if (type.isBoolean()) {
+      constantInterceptor = backend.jsBoolClass;
+    } else if (type.isString()) {
+      constantInterceptor = backend.jsStringClass;
+    } else if (type.isArray()) {
+      constantInterceptor = backend.jsArrayClass;
+    } else if (type.isNull()) {
+      constantInterceptor = backend.jsIntClass;
+    } else if (type.isNumber()) {
+      Set<ClassElement> intercepted = node.interceptedClasses;
+      // If the method being intercepted is not defined in [int] or
+      // [double] we can safely use the number interceptor.
+      if (!intercepted.contains(compiler.intClass)
+          && !intercepted.contains(compiler.doubleClass)) {
+        constantInterceptor = backend.jsNumberClass;
+      }
+    }
+
+    if (constantInterceptor == null) return node;
+
+    ConstantHandler handler = compiler.constantHandler;
+    Constant constant = new ConstructedConstant(
+        constantInterceptor.computeType(compiler), <Constant>[]);
+    handler.registerCompileTimeConstant(constant);
+    return graph.addConstant(constant);
+  }
 }
 
 class SsaCheckInserter extends HBaseVisitor implements OptimizationPhase {
   final HTypeMap types;
-  final ConstantSystem constantSystem;
   final Set<HInstruction> boundsChecked;
   final WorkItem work;
+  final JavaScriptBackend backend;
   final String name = "SsaCheckInserter";
   HGraph graph;
-  Element lengthInterceptor;
 
-  SsaCheckInserter(JavaScriptBackend backend,
+  SsaCheckInserter(this.backend,
                    this.work,
                    this.types,
-                   this.boundsChecked)
-      : constantSystem = backend.constantSystem {
-    lengthInterceptor = backend.jsArrayLength;
-  }
+                   this.boundsChecked);
 
   void visitGraph(HGraph graph) {
     this.graph = graph;
@@ -693,8 +778,8 @@
                                  HInstruction receiver,
                                  HInstruction index) {
     bool isAssignable = !receiver.isFixedArray(types);
-    HFieldGet length =
-        new HFieldGet(lengthInterceptor, receiver, isAssignable: isAssignable);
+    HFieldGet length = new HFieldGet(
+        backend.jsArrayLength, receiver, isAssignable: isAssignable);
     length.guaranteedType = HType.INTEGER;
     types[length] = HType.INTEGER;
     node.block.addBefore(node, length);
@@ -738,6 +823,14 @@
     node.changeUse(node.index, index);
     assert(node.isBuiltin(types));
   }
+
+  void visitInvokeDynamicMethod(HInvokeDynamicMethod node) {
+    Element element = node.element;
+    if (element != backend.jsArrayRemoveLast) return;
+    if (boundsChecked.contains(node)) return;
+    insertBoundsCheck(
+        node, node.receiver, graph.addConstantInt(0, backend.constantSystem));
+  }
 }
 
 class SsaDeadCodeEliminator extends HGraphVisitor implements OptimizationPhase {
@@ -1360,3 +1453,32 @@
     });
   }
 }
+
+/**
+ * This phase specializes dominated uses of a call, where the call
+ * can give us some type information of what the receiver might be.
+ * For example, after a call to [:a.foo():], if [:foo:] is only
+ * in class [:A:], a can be of type [:A:].
+ */
+class SsaReceiverSpecialization extends HBaseVisitor
+    implements OptimizationPhase {
+  final String name = "SsaReceiverSpecialization";
+  final Compiler compiler;
+
+  SsaReceiverSpecialization(this.compiler);
+
+  void visitGraph(HGraph graph) {
+    visitDominatorTree(graph);
+  }
+
+  void visitInterceptor(HInterceptor interceptor) {
+    HInstruction receiver = interceptor.receiver;
+    for (var user in receiver.usedBy) {
+      if (user is HInterceptor && interceptor.dominates(user)) {
+        user.interceptedClasses = interceptor.interceptedClasses;
+      }
+    }
+  }
+
+  // TODO(ngeoffray): Also implement it for non-intercepted calls.
+}
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/types.dart b/sdk/lib/_internal/compiler/implementation/ssa/types.dart
index 597ccf1..52a20e7 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/types.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/types.dart
@@ -18,7 +18,7 @@
     if (identical(element.kind, ElementKind.TYPE_VARIABLE)) {
       // TODO(ngeoffray): Replace object type with [type].
       return new HBoundedPotentialPrimitiveType(
-          compiler.objectClass.computeType(compiler), canBeNull);
+          compiler.objectClass.computeType(compiler), canBeNull, true);
     }
 
     if (identical(element, compiler.intClass)) {
@@ -38,6 +38,9 @@
       return new HBoundedPotentialPrimitiveNumberOrString(type, canBeNull);
     } else if (Elements.isStringOnlySupertype(element, compiler)) {
       return new HBoundedPotentialPrimitiveString(type, canBeNull);
+    } else if (identical(element, compiler.objectClass)) {
+      return new HBoundedPotentialPrimitiveType(
+          compiler.objectClass.computeType(compiler), canBeNull, true);
     } else {
       return canBeNull ? new HBoundedType.withNull(type)
                        : new HBoundedType.nonNull(type);
@@ -85,6 +88,7 @@
   bool isPrimitive() => false;
   bool isExact() => false;
   bool isPrimitiveOrNull() => false;
+  bool isTop() => false;
 
   bool canBePrimitive() => false;
   bool canBeNull() => false;
@@ -218,6 +222,9 @@
     if (other.isUnknown()) return HType.BOOLEAN_OR_NULL;
     if (other.isBoolean()) return HType.BOOLEAN;
     if (other.isBooleanOrNull()) return HType.BOOLEAN_OR_NULL;
+    if (other.isTop()) {
+      return other.canBeNull() ? this : HType.BOOLEAN;
+    }
     if (other.canBeNull()) return HType.NULL;
     return HType.CONFLICTING;
   }
@@ -278,6 +285,9 @@
     if (other.isIntegerOrNull()) return HType.INTEGER_OR_NULL;
     if (other.isDoubleOrNull()) return HType.DOUBLE_OR_NULL;
     if (other.isNumberOrNull()) return HType.NUMBER_OR_NULL;
+    if (other.isTop()) {
+      return other.canBeNull() ? this : HType.NUMBER;
+    }
     if (other.canBeNull()) return HType.NULL;
     return HType.CONFLICTING;
   }
@@ -342,6 +352,9 @@
     if (other.isDoubleOrNull()) return HType.NULL;
     if (other.isNumber()) return HType.INTEGER;
     if (other.isNumberOrNull()) return HType.INTEGER_OR_NULL;
+    if (other.isTop()) {
+      return other.canBeNull() ? this : HType.INTEGER;
+    }
     if (other.canBeNull()) return HType.NULL;
     return HType.CONFLICTING;
   }
@@ -410,6 +423,9 @@
     if (other.isDoubleOrNull()) return HType.DOUBLE_OR_NULL;
     if (other.isNumber()) return HType.DOUBLE;
     if (other.isNumberOrNull()) return HType.DOUBLE_OR_NULL;
+    if (other.isTop()) {
+      return other.canBeNull() ? this : HType.DOUBLE;
+    }
     if (other.canBeNull()) return HType.NULL;
     return HType.CONFLICTING;
   }
@@ -525,6 +541,9 @@
     if (other is HBoundedPotentialPrimitiveString) {
       return other.canBeNull() ? HType.STRING_OR_NULL : HType.STRING;
     }
+    if (other.isTop()) {
+      return other.canBeNull() ? this : HType.STRING;
+    }
     if (other.canBeNull()) return HType.NULL;
     return HType.CONFLICTING;
   }
@@ -679,8 +698,8 @@
   final bool _canBeNull;
   final bool _isExact;
 
-  toString() {
-    return 'BoundedType($type, $_canBeNull, $_isExact)';
+  String toString() {
+    return 'BoundedType($type, canBeNull: $_canBeNull, isExact: $_isExact)';
   }
 
   bool canBeNull() => _canBeNull;
@@ -764,15 +783,47 @@
 }
 
 class HBoundedPotentialPrimitiveType extends HBoundedType {
-  const HBoundedPotentialPrimitiveType(DartType type, bool canBeNull)
+  final bool _isObject;
+  const HBoundedPotentialPrimitiveType(DartType type,
+                                       bool canBeNull,
+                                       this._isObject)
       : super(type, canBeNull, false);
+
+  String toString() {
+    return 'BoundedPotentialPrimitiveType($type, canBeNull: $_canBeNull)';
+  }
+
   bool canBePrimitive() => true;
+  bool isTop() => _isObject;
+
+  HType union(HType other, Compiler compiler) {
+    if (isTop()) {
+      // The union of the top type and another type is the top type.
+      if (!canBeNull() && other.canBeNull()) {
+        return new HBoundedPotentialPrimitiveType(type, true, true);
+      } else {
+        return this;
+      }
+    } else {
+      return super.union(other, compiler);
+    }
+  }
+
+  HType intersection(HType other, Compiler compiler) {
+    if (isTop()) {
+      // The intersection of the top type and any other type is the other type.
+      // TODO(ngeoffray): Also update the canBeNull information.
+      return other;
+    } else {
+      return super.intersection(other, compiler);
+    }
+  }
 }
 
 class HBoundedPotentialPrimitiveNumberOrString
     extends HBoundedPotentialPrimitiveType {
   const HBoundedPotentialPrimitiveNumberOrString(DartType type, bool canBeNull)
-      : super(type, canBeNull);
+      : super(type, canBeNull, false);
 
   HType union(HType other, Compiler compiler) {
     if (other.isNumber()) return this;
@@ -812,7 +863,7 @@
 
 class HBoundedPotentialPrimitiveArray extends HBoundedPotentialPrimitiveType {
   const HBoundedPotentialPrimitiveArray(DartType type, bool canBeNull)
-      : super(type, canBeNull);
+      : super(type, canBeNull, false);
 
   HType union(HType other, Compiler compiler) {
     if (other.isString()) return HType.UNKNOWN;
@@ -840,7 +891,7 @@
 
 class HBoundedPotentialPrimitiveString extends HBoundedPotentialPrimitiveType {
   const HBoundedPotentialPrimitiveString(DartType type, bool canBeNull)
-      : super(type, canBeNull);
+      : super(type, canBeNull, false);
 
   bool isPrimitiveOrNull() => true;
 
@@ -878,17 +929,29 @@
 }
 
 class HTypeMap {
-  Map<HInstruction, HType> _map;
+  // Approximately 85% of methods in the sample "swarm" have less than
+  // 32 instructions.
+  static const int INITIAL_SIZE = 32;
 
-  HTypeMap() : _map = new Map<HInstruction, HType>();
+  List<HType> _list = new List<HType>()..length = INITIAL_SIZE;
 
   operator [](HInstruction instruction) {
-    HType result = _map[instruction];
+    HType result;
+    if (instruction.id < _list.length) result = _list[instruction.id];
     if (result == null) return instruction.guaranteedType;
     return result;
   }
 
   operator []=(HInstruction instruction, HType value) {
-    _map[instruction] = value;
+    int length = _list.length;
+    int id = instruction.id;
+    if (length <= id) {
+      if (id + 1 < length * 2) {
+        _list.length = length * 2;
+      } else {
+        _list.length = id + 1;
+      }
+    }
+    _list[id] = value;
   }
 }
diff --git a/sdk/lib/_internal/compiler/implementation/typechecker.dart b/sdk/lib/_internal/compiler/implementation/typechecker.dart
index b192c23..c0c5de2 100644
--- a/sdk/lib/_internal/compiler/implementation/typechecker.dart
+++ b/sdk/lib/_internal/compiler/implementation/typechecker.dart
@@ -87,6 +87,11 @@
 
   bool operator ==(other);
 
+  /**
+   * Is [: true :] if this type has no explict type arguments.
+   */
+  bool get isRaw => true;
+
   DartType asRaw() => this;
 }
 
@@ -256,15 +261,19 @@
 
   DartType unalias(Compiler compiler) => this;
 
-  int get hashCode => 1733;
+  int get hashCode => 1733 + 19 * element.hashCode;
 
-  bool operator ==(other) => other is MalformedType;
+  bool operator ==(other) {
+    if (other is !MalformedType) return false;
+    if (!identical(element, other.element)) return false;
+    return true;
+  }
 
   String toString() => name.slowToString();
 }
 
 class InterfaceType extends DartType {
-  final Element element;
+  final ClassElement element;
   final Link<DartType> typeArguments;
 
   InterfaceType(this.element,
@@ -300,7 +309,7 @@
   String toString() {
     StringBuffer sb = new StringBuffer();
     sb.add(name.slowToString());
-    if (!typeArguments.isEmpty) {
+    if (!isRaw) {
       sb.add('<');
       typeArguments.printOn(sb, ', ');
       sb.add('>');
@@ -325,10 +334,9 @@
     return typeArguments == other.typeArguments;
   }
 
-  InterfaceType asRaw() {
-    if (typeArguments.isEmpty) return this;
-    return new InterfaceType(element);
-  }
+  bool get isRaw => typeArguments.isEmpty || identical(this, element.rawType);
+
+  InterfaceType asRaw() => element.rawType;
 }
 
 class FunctionType extends DartType {
@@ -445,7 +453,7 @@
   String toString() {
     StringBuffer sb = new StringBuffer();
     sb.add(name.slowToString());
-    if (!typeArguments.isEmpty) {
+    if (!isRaw) {
       sb.add('<');
       typeArguments.printOn(sb, ', ');
       sb.add('>');
@@ -460,6 +468,10 @@
     if (!identical(element, other.element)) return false;
     return typeArguments == other.typeArguments;
   }
+
+  bool get isRaw => typeArguments.isEmpty || identical(this, element.rawType);
+
+  TypedefType asRaw() => element.rawType;
 }
 
 /**
@@ -477,7 +489,7 @@
   final Compiler compiler;
   // TODO(karlklose): should we have a class Void?
   final VoidType voidType;
-  final InterfaceType dynamicType;
+  final DynamicType dynamicType;
 
   Types(Compiler compiler, ClassElement dynamicElement)
     : this.with(compiler, dynamicElement,
@@ -488,7 +500,7 @@
              LibraryElement library)
     : voidType = new VoidType(new VoidElement(library)),
       dynamicType = new DynamicType(dynamicElement) {
-    dynamicElement.type = dynamicType;
+      dynamicElement.rawType = dynamicElement.thisType = dynamicType;
   }
 
   /** Returns true if t is a subtype of s */
@@ -505,7 +517,9 @@
 
     if (t is VoidType) {
       return false;
-    } else if (t is MalformedType) {
+    } else if (t is MalformedType || s is MalformedType) {
+      // TODO(johnniwinther): Malformed types should be treated as dynamic and
+      // thus return true here.
       return false;
     } else if (t is InterfaceType) {
       if (s is !InterfaceType) return false;
diff --git a/sdk/lib/_internal/compiler/implementation/types/concrete_types_inferrer.dart b/sdk/lib/_internal/compiler/implementation/types/concrete_types_inferrer.dart
index 1d8731d..3b2334c 100644
--- a/sdk/lib/_internal/compiler/implementation/types/concrete_types_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/types/concrete_types_inferrer.dart
@@ -94,6 +94,7 @@
 
   ConcreteType union(ConcreteType other);
   bool isUnkown();
+  bool isEmpty();
   Set<BaseType> get baseTypes;
 
   /**
@@ -109,6 +110,7 @@
 class UnknownConcreteType implements ConcreteType {
   const UnknownConcreteType();
   bool isUnkown() => true;
+  bool isEmpty() => false;
   bool operator ==(ConcreteType other) => identical(this, other);
   Set<BaseType> get baseTypes =>
       new Set<BaseType>.from([const UnknownBaseType()]);
@@ -131,6 +133,7 @@
   UnionType(this.baseTypes);
 
   bool isUnkown() => false;
+  bool isEmpty() => baseTypes.isEmpty;
 
   bool operator ==(ConcreteType other) {
     if (other is! UnionType) return false;
@@ -366,6 +369,14 @@
   final Compiler compiler;
 
   /**
+   * When true, the string litteral [:"__dynamic_for_test":] is inferred to
+   * have the unknown type.
+   */
+  // TODO(polux): get rid of this hack once we have a natural way of inferring
+  // the unknown type.
+  bool testMode = false;
+
+  /**
    * Constants representing builtin base types. Initialized in [analyzeMain]
    * and not in the constructor because the compiler elements are not yet
    * populated.
@@ -479,9 +490,9 @@
   /**
    * Returns all the members with name [methodName].
    */
-  List<FunctionElement> getMembersByName(SourceString methodName) {
+  List<Element> getMembersByName(SourceString methodName) {
     // TODO(polux): make this faster!
-    var result = new List<FunctionElement>();
+    var result = new List<Element>();
     for (ClassElement cls in compiler.enqueuer.resolution.seenClasses) {
       Element elem = cls.lookupLocalMember(methodName);
       if (elem != null) {
@@ -601,13 +612,11 @@
     ConcreteType result = new ConcreteType.empty();
     Map<Element, ConcreteType> argumentMap =
         associateArguments(function, argumentsTypes);
-    argumentMap.forEach((Element parameter, ConcreteType type) {
-      augmentParameterType(parameter, type);
-    });
     // if the association failed, this send will never occur or will fail
     if (argumentMap == null) {
       return new ConcreteType.empty();
     }
+    argumentMap.forEach(augmentParameterType);
     ConcreteTypeCartesianProduct product =
         new ConcreteTypeCartesianProduct(receiverType, argumentMap);
     for (ConcreteTypesEnvironment environment in product) {
@@ -1010,14 +1019,14 @@
   }
 
   ConcreteType analyzeSetNode(Node receiver, ConcreteType argumentType,
-                              SourceString source) {
+                              SourceString name) {
     ConcreteType receiverType = analyze(receiver);
 
-    void augmentField(BaseType baseReceiverType, Element fieldOrSetter) {
-      if (fieldOrSetter.isField()) {
-        inferrer.augmentFieldType(fieldOrSetter, argumentType);
-      } else {
-        AbstractFieldElement abstractField = fieldOrSetter;
+    void augmentField(BaseType baseReceiverType, Element member) {
+      if (member.isField()) {
+        inferrer.augmentFieldType(member, argumentType);
+      } else if (member.isAbstractField()){
+        AbstractFieldElement abstractField = member;
         FunctionElement setter = abstractField.setter;
         // TODO(polux): A setter always returns void so there's no need to
         // invalidate its callers even if it is called with new arguments.
@@ -1028,50 +1037,77 @@
         inferrer.getSendReturnType(setter, baseReceiverType,
             new ArgumentsTypes([argumentType], new Map()));
       }
+      // since this is a sendSet we ignore non-fields
     }
 
     if (receiverType.isUnkown()) {
-      for (FunctionElement member in inferrer.getMembersByName(source)) {
+      for (Element member in inferrer.getMembersByName(name)) {
+        if (!(member.isField() || member.isAbstractField())) continue;
         Element classElem = member.getEnclosingClass();
         BaseType baseReceiverType = new ClassBaseType(classElem);
         augmentField(baseReceiverType, member);
       }
     } else {
-      for (ClassBaseType baseReceiverType in receiverType.baseTypes) {
-        Element member = baseReceiverType.element.lookupMember(source);
+      for (BaseType baseReceiverType in receiverType.baseTypes) {
+        if (!baseReceiverType.isClass()) continue;
+        ClassBaseType baseReceiverClassType = baseReceiverType;
+        Element member = baseReceiverClassType.element.lookupMember(name);
         if (member != null) {
-          augmentField(baseReceiverType, member);
+          augmentField(baseReceiverClassType, member);
         }
       }
     }
     return argumentType;
   }
 
-  SourceString canonicalizeCompoundOperator(String op) {
+  SourceString canonicalizeCompoundOperator(SourceString op) {
     // TODO(ahe): This class should work on elements or selectors, not
     // names.  Otherwise, it is repeating work the resolver has
     // already done (or should have done).  In this case, the problem
     // is that the resolver is not recording the selectors it is
     // registering in registerBinaryOperator in
     // ResolverVisitor.visitSendSet.
-    if (op == '++') return const SourceString(r'+');
-    else return const SourceString(r'-');
+    String stringValue = op.stringValue;
+    if (stringValue == '++') return const SourceString(r'+');
+    else if (stringValue == '--') return const SourceString(r'-');
+    else return Elements.mapToUserOperatorOrNull(op);
   }
 
   // TODO(polux): handle sendset as expression
   ConcreteType visitSendSet(SendSet node) {
-    Identifier selector = node.selector;
-    final name = node.assignmentOperator.source.stringValue;
+    // Operator []= has a different behaviour than other send sets: it is
+    // actually a send whose return type is that of its second argument.
+    if (node.selector.asIdentifier().source.stringValue == '[]') {
+      ConcreteType receiverType = analyze(node.receiver);
+      ArgumentsTypes argumentsTypes = analyzeArguments(node.arguments);
+      analyzeDynamicSend(receiverType, const SourceString('[]='),
+                         argumentsTypes);
+      return argumentsTypes.positional[1];
+    }
+
+    // All other operators have a single argument (++ and -- have an implicit
+    // argument: 1). We will store its type in argumentType.
     ConcreteType argumentType;
-    if (name == '++' || name == '--') {
+    SourceString operatorName = node.assignmentOperator.source;
+    SourceString compoundOperatorName =
+        canonicalizeCompoundOperator(node.assignmentOperator.source);
+    // ++, --, +=, -=, ...
+    if (compoundOperatorName != null) {
       ConcreteType receiverType = visitGetterSend(node);
-      SourceString canonicalizedMethodName = canonicalizeCompoundOperator(name);
-      List<ConcreteType> positionalArguments = <ConcreteType>[
-          new ConcreteType.singleton(inferrer.baseTypes.intBaseType)];
-      ArgumentsTypes argumentsTypes =
-          new ArgumentsTypes(positionalArguments, new Map());
-      argumentType = analyzeDynamicSend(receiverType, canonicalizedMethodName,
+      // argumentsTypes is either computed from the actual arguments or [{int}]
+      // in case of ++ or --.
+      ArgumentsTypes argumentsTypes;
+      if (operatorName.stringValue == '++'
+          || operatorName.stringValue == '--') {
+        List<ConcreteType> positionalArguments = <ConcreteType>[
+            new ConcreteType.singleton(inferrer.baseTypes.intBaseType)];
+        argumentsTypes = new ArgumentsTypes(positionalArguments, new Map());
+      } else {
+        argumentsTypes = analyzeArguments(node.arguments);
+      }
+      argumentType = analyzeDynamicSend(receiverType, compoundOperatorName,
                                         argumentsTypes);
+    // The simple assignment case: receiver = argument.
     } else {
       argumentType = analyze(node.argumentsNode);
     }
@@ -1098,6 +1134,12 @@
   }
 
   ConcreteType visitLiteralString(LiteralString node) {
+    // TODO(polux): get rid of this hack once we have a natural way of inferring
+    // the unknown type.
+    if (inferrer.testMode
+        && node.dartString.slowToString() == "__dynamic_for_test") {
+      return new ConcreteType.unknown();
+    }
     return new ConcreteType.singleton(inferrer.baseTypes.stringBaseType);
   }
 
@@ -1316,22 +1358,24 @@
       assert(node.receiver != null);
 
       ConcreteType result = new ConcreteType.empty();
-      void augmentResult(BaseType baseReceiverType, Element getterOrField) {
-        if (getterOrField.isField()) {
-          result = result.union(analyzeFieldRead(getterOrField));
-        } else {
+      void augmentResult(BaseType baseReceiverType, Element member) {
+        if (member.isField()) {
+          result = result.union(analyzeFieldRead(member));
+        } else if (member.isAbstractField()){
           // call to a getter
-          AbstractFieldElement abstractField = getterOrField;
+          AbstractFieldElement abstractField = member;
           result = result.union(analyzeGetterSend(baseReceiverType,
                                                   abstractField.getter));
         }
+        // since this is a get we ignore non-fields
       }
 
       ConcreteType receiverType = analyze(node.receiver);
       if (receiverType.isUnkown()) {
         List<Element> members =
             inferrer.getMembersByName(node.selector.asIdentifier().source);
-        for (final member in members) {
+        for (Element member in members) {
+          if (!(member.isField() || member.isAbstractField())) continue;
           Element classElement = member.getEnclosingClass();
           ClassBaseType baseReceiverType = new ClassBaseType(classElement);
           augmentResult(baseReceiverType, member);
@@ -1356,56 +1400,19 @@
     inferrer.fail(node, 'not implemented');
   }
 
-  // TODO(polux): handle unary operators and share this list with the rest of
-  // dart2js.
-  final Set<SourceString> operators = new Set<SourceString>()
-      ..add(const SourceString('=='))
-      ..add(const SourceString('!='))
-      ..add(const SourceString('~'))
-      ..add(const SourceString('[]'))
-      ..add(const SourceString('[]='))
-      ..add(const SourceString('*'))
-      ..add(const SourceString('*='))
-      ..add(const SourceString('/'))
-      ..add(const SourceString('/='))
-      ..add(const SourceString('%'))
-      ..add(const SourceString('%='))
-      ..add(const SourceString('~/'))
-      ..add(const SourceString('~/='))
-      ..add(const SourceString('+'))
-      ..add(const SourceString('+='))
-      ..add(const SourceString('-'))
-      ..add(const SourceString('-='))
-      ..add(const SourceString('<<'))
-      ..add(const SourceString('<<='))
-      ..add(const SourceString('>>'))
-      ..add(const SourceString('>>='))
-      ..add(const SourceString('>='))
-      ..add(const SourceString('>'))
-      ..add(const SourceString('<='))
-      ..add(const SourceString('<'))
-      ..add(const SourceString('&'))
-      ..add(const SourceString('&='))
-      ..add(const SourceString('^'))
-      ..add(const SourceString('^='))
-      ..add(const SourceString('|'))
-      ..add(const SourceString('|='));
-
-  SourceString canonicalizeMethodName(SourceString s) {
-    return operators.contains(s)
-        ? Elements.constructOperatorName(s, false)
-        : s;
-  }
-
   ConcreteType analyzeDynamicSend(ConcreteType receiverType,
                                   SourceString canonicalizedMethodName,
                                   ArgumentsTypes argumentsTypes) {
     ConcreteType result = new ConcreteType.empty();
 
     if (receiverType.isUnkown()) {
-      List<FunctionElement> methods =
+      List<Element> methods =
           inferrer.getMembersByName(canonicalizedMethodName);
-      for (FunctionElement method in methods) {
+      for (Element element in methods) {
+        // TODO(polux): when we handle closures, we must handle sends to fields
+        // that are closures.
+        if (!element.isFunction()) continue;
+        FunctionElement method = element;
         inferrer.addCaller(method, currentMethod);
         Element classElem = method.enclosingElement;
         ClassBaseType baseReceiverType = new ClassBaseType(classElem);
@@ -1430,6 +1437,14 @@
     return result;
   }
 
+  SourceString canonicalizeMethodName(SourceString name) {
+    // TODO(polux): handle unary-
+    SourceString operatorName =
+        Elements.constructOperatorNameOrNull(name, false);
+    if (operatorName != null) return operatorName;
+    return name;
+  }
+
   ConcreteType visitDynamicSend(Send node) {
     ConcreteType receiverType = (node.receiver != null)
         ? analyze(node.receiver)
@@ -1438,7 +1453,16 @@
     SourceString name =
         canonicalizeMethodName(node.selector.asIdentifier().source);
     ArgumentsTypes argumentsTypes = analyzeArguments(node.arguments);
-    return analyzeDynamicSend(receiverType, name, argumentsTypes);
+    if (name.stringValue == '!=') {
+      ConcreteType returnType = analyzeDynamicSend(receiverType,
+                                                   const SourceString('=='),
+                                                   argumentsTypes);
+      return returnType.isEmpty()
+          ? returnType
+          : new ConcreteType.singleton(inferrer.baseTypes.boolBaseType);
+    } else {
+      return analyzeDynamicSend(receiverType, name, argumentsTypes);
+    }
   }
 
   ConcreteType visitForeignSend(Send node) {
diff --git a/sdk/lib/_internal/compiler/implementation/universe/universe.dart b/sdk/lib/_internal/compiler/implementation/universe/universe.dart
index 57f445d..be913e2 100644
--- a/sdk/lib/_internal/compiler/implementation/universe/universe.dart
+++ b/sdk/lib/_internal/compiler/implementation/universe/universe.dart
@@ -330,6 +330,7 @@
 
   bool equalsUntyped(Selector other) {
     return name == other.name
+           && kind == other.kind
            && identical(library, other.library)
            && argumentCount == other.argumentCount
            && namedArguments.length == other.namedArguments.length
diff --git a/sdk/lib/_internal/compiler/implementation/warnings.dart b/sdk/lib/_internal/compiler/implementation/warnings.dart
index 536f5fc..8381bd5 100644
--- a/sdk/lib/_internal/compiler/implementation/warnings.dart
+++ b/sdk/lib/_internal/compiler/implementation/warnings.dart
@@ -327,6 +327,8 @@
   static const ASSERT_IS_GIVEN_NAMED_ARGUMENTS = const MessageKind(
       "assert takes no named arguments, but given #{1}.");
 
+  static const MALFORMED_TYPE_REFERENCE = const MessageKind(
+      "Malformed type reference encountered in #{1}.");
 
   static const COMPILER_CRASHED = const MessageKind(
       "Error: The compiler crashed when compiling this element.");
diff --git a/sdk/lib/_internal/compiler/implementation/world.dart b/sdk/lib/_internal/compiler/implementation/world.dart
index 9116478..2dbc6a9 100644
--- a/sdk/lib/_internal/compiler/implementation/world.dart
+++ b/sdk/lib/_internal/compiler/implementation/world.dart
@@ -76,7 +76,7 @@
     compiler.resolverWorld.isChecks.forEach((DartType type) {
       if (type is InterfaceType) {
         InterfaceType itf = type;
-        if (!itf.typeArguments.isEmpty) {
+        if (!itf.isRaw) {
           potentiallyAddForRti(itf.element, null);
         }
       }
diff --git a/sdk/lib/_internal/dartdoc/lib/dartdoc.dart b/sdk/lib/_internal/dartdoc/lib/dartdoc.dart
index a4714bb..ec86fd3 100644
--- a/sdk/lib/_internal/dartdoc/lib/dartdoc.dart
+++ b/sdk/lib/_internal/dartdoc/lib/dartdoc.dart
@@ -25,10 +25,13 @@
 import '../../compiler/implementation/mirrors/mirrors_util.dart';
 import '../../compiler/implementation/mirrors/dart2js_mirror.dart' as dart2js;
 import 'classify.dart';
+import 'universe_serializer.dart';
 import 'markdown.dart' as md;
+import 'src/json_serializer.dart' as json_serializer;
 import '../../compiler/implementation/scanner/scannerlib.dart' as dart2js;
 import '../../libraries.dart';
 
+
 // TODO(rnystrom): Use "package:" URL (#4968).
 part 'src/dartdoc/comment_map.dart';
 part 'src/dartdoc/nav.dart';
@@ -355,6 +358,12 @@
     if (generateAppCache) {
       generateAppCacheManifest();
     }
+
+    startFile("apidoc.json");
+    var libraries = _sortedLibraries.map(
+        (lib) => new LibraryElement(lib.qualifiedName, lib, _comments));
+    write(json_serializer.serialize(libraries));
+    endFile();
   }
 
   void startFile(String path) {
diff --git a/sdk/lib/_internal/dartdoc/lib/src/json_serializer.dart b/sdk/lib/_internal/dartdoc/lib/src/json_serializer.dart
new file mode 100755
index 0000000..d67cd72
--- /dev/null
+++ b/sdk/lib/_internal/dartdoc/lib/src/json_serializer.dart
@@ -0,0 +1,238 @@
+// Copyright (c) 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.
+
+/**
+ * Simple library to serialize acyclic Dart types to JSON.
+ * This library is not intended for broad consumption and should be replaced
+ * with a more generic Dart serialization library when one is available.
+ */
+library json_serializer;
+
+import 'dart:mirrors';
+import 'dart:json';
+
+String serialize(Object o) {
+  var printer = new JsonPrinter();
+  _serialize(null, o, printer);
+  return printer.toString();
+}
+
+void _serialize(String name, Object o, JsonPrinter printer) {
+  if (o == null) return;
+
+  if (o is List) {
+    _serializeList(name, o, printer);
+  } else if (o is Map) {
+    _serializeMap(name, o, printer);
+  } else if (o is String) {
+    printer.addString(name, o);
+  } else if (o is bool) {
+    printer.addBool(name, o);
+  } else {
+    _serializeObject(name, o, printer);
+  }
+}
+
+void _serializeObject(String name, Object o, JsonPrinter printer) {
+  printer.startObject(name);
+
+  var mirror = reflect(o);
+  var classMirror = mirror.type;
+  var members = <String>[];
+  determineAllMembers(classMirror, members);
+
+  // TODO(jacobr): this code works only because futures for mirrors return
+  // immediately.
+  for(String memberName in members) {
+    mirror.getField(memberName).then((result) {
+      _serialize(memberName, result.reflectee, printer);
+    });
+  }
+  printer.endObject();
+}
+
+void determineAllMembers(ClassMirror classMirror,
+    List<String> members) {
+  for(String getterName in classMirror.getters.keys) {
+    if (!members.contains(getterName)) {
+      members.add(getterName);
+    }
+  }
+  for(String fieldName in classMirror.variables.keys) {
+    if (!members.contains(fieldName)) {
+      members.add(fieldName);
+    }
+  }
+  if (classMirror.superclass != null &&
+      classMirror.superclass.qualifiedName != classMirror.qualifiedName &&
+      classMirror.superclass.qualifiedName != 'dart:core.Object') {
+    determineAllMembers(classMirror.superclass, members);
+  }
+}
+
+void _serializeList(String name, List l, JsonPrinter printer) {
+  printer.startList(name);
+  for(var o in l) {
+    _serialize(null, o, printer);
+  }
+  printer.endList();
+}
+
+void _serializeMap(String name, Map m, JsonPrinter printer) {
+}
+
+class JsonPrinter {
+  static const int BACKSPACE = 8;
+  static const int TAB = 9;
+  static const int NEW_LINE = 10;
+  static const int FORM_FEED = 12;
+  static const int CARRIAGE_RETURN = 13;
+  static const int QUOTE = 34;
+  static const int BACKSLASH = 92;
+  static const int CHAR_B = 98;
+  static const int CHAR_F = 102;
+  static const int CHAR_N = 110;
+  static const int CHAR_R = 114;
+  static const int CHAR_T = 116;
+  static const int CHAR_U = 117;
+
+  StringBuffer _sb;
+  int _indent = 0;
+  bool _inSet = false;
+
+  bool _prettyPrint;
+  JsonPrinter({this._prettyPrint: true}) {
+    _sb = new StringBuffer();
+  }
+
+  void startObject(String name) {
+    _start(name);
+    _sb.add('{');
+
+    _indent += 1;
+    _inSet = false;
+  }
+
+  void endObject() {
+    _indent -= 1;
+    if (_inSet) {
+      _newline();
+    }
+    _sb.add('}');
+    _inSet = true;
+  }
+
+  void startList(String name) {
+    _start(name);
+    _inSet = false;
+
+    _sb.add('[');
+    _indent += 1;
+  }
+
+  void endList() {
+    _indent -= 1;
+    if (_inSet) {
+      _newline();
+    }
+    _sb.add(']');
+    _inSet = true;
+  }
+
+  void addString(String name, String value) {
+    _start(name);
+    _sb.add('"');
+    _escape(_sb, value);
+    _sb.add('"');
+    _inSet = true;
+  }
+
+  void addBool(String name, bool value) {
+    _start(name);
+    _sb.add(value.toString());
+    _inSet = true;
+  }
+
+  void addNum(String name, num value) {
+    _start(name);
+    _sb.add(value.toString());
+    _inSet = true;
+  }
+
+  void _start(String name) {
+    if (_inSet) {
+      _sb.add(',');
+    }
+    _newline();
+    if (name != null) {
+      _sb.add('"$name": ');
+    }
+  }
+
+  void _newline([int indent = 0]) {
+    _sb.add('\n');
+    _indent += indent;
+
+    for (var i = 0; i < _indent; ++i) {
+      _sb.add('  ');
+    }
+  }
+
+  String toString() {
+    if (_prettyPrint) {
+      return _sb.toString();
+    } else {
+      // Convenient hack to remove the pretty printing this serializer adds by
+      // default.
+      return JSON.stringify(JSON.parse(_sb.toString()));
+    }
+  }
+
+  static int _hexDigit(int x) => x < 10 ? 48 + x : 87 + x;
+
+  static void _escape(StringBuffer sb, String s) {
+    final int length = s.length;
+    bool needsEscape = false;
+    final charCodes = new List<int>();
+    for (int i = 0; i < length; i++) {
+      int charCode = s.charCodeAt(i);
+      if (charCode < 32) {
+        needsEscape = true;
+        charCodes.add(JsonPrinter.BACKSLASH);
+        switch (charCode) {
+        case JsonPrinter.BACKSPACE:
+          charCodes.add(JsonPrinter.CHAR_B);
+          break;
+        case JsonPrinter.TAB:
+          charCodes.add(JsonPrinter.CHAR_T);
+          break;
+        case JsonPrinter.NEW_LINE:
+          charCodes.add(JsonPrinter.CHAR_N);
+          break;
+        case JsonPrinter.FORM_FEED:
+          charCodes.add(JsonPrinter.CHAR_F);
+          break;
+        case JsonPrinter.CARRIAGE_RETURN:
+          charCodes.add(JsonPrinter.CHAR_R);
+          break;
+        default:
+          charCodes.add(JsonPrinter.CHAR_U);
+          charCodes.add(_hexDigit((charCode >> 12) & 0xf));
+          charCodes.add(_hexDigit((charCode >> 8) & 0xf));
+          charCodes.add(_hexDigit((charCode >> 4) & 0xf));
+          charCodes.add(_hexDigit(charCode & 0xf));
+          break;
+        }
+      } else if (charCode == JsonPrinter.QUOTE ||
+          charCode == JsonPrinter.BACKSLASH) {
+        needsEscape = true;
+        charCodes.add(JsonPrinter.BACKSLASH);
+        charCodes.add(charCode);
+      } else {
+        charCodes.add(charCode);
+      }
+    }
+    sb.add(needsEscape ? new String.fromCharCodes(charCodes) : s);
+  }
+}
diff --git a/sdk/lib/_internal/dartdoc/lib/universe_serializer.dart b/sdk/lib/_internal/dartdoc/lib/universe_serializer.dart
new file mode 100755
index 0000000..c6c1ec0
--- /dev/null
+++ b/sdk/lib/_internal/dartdoc/lib/universe_serializer.dart
@@ -0,0 +1,231 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/**
+ * This library serializes the Dart2Js AST into a compact and easy to use
+ * [Element] tree useful for code exploration tools such as DartDoc.
+ */
+library universe_serializer;
+
+import '../../compiler/implementation/mirrors/mirrors.dart';
+import '../../compiler/implementation/mirrors/mirrors_util.dart';
+import '../../compiler/implementation/mirrors/dart2js_mirror.dart' as dart2js;
+import '../../libraries.dart';
+import 'dartdoc.dart';
+
+/**
+ * Base class for all nodes.
+ */
+class Element {
+  /** Human readable type name for the node. */
+  final String kind;
+  /** Human readable name for the element. */
+  final String name;
+  /** Id for the node that is unique within its parent's children. */
+  final String id;
+  /** Raw text of the comment associated with the Element if any. */
+  final String comment;
+  /** Children of the node. */
+  List<Element> children;
+
+  Element(this.kind, this.name, this.id, this.comment);
+
+  void addChild(Element child) {
+    if (children == null) {
+      children = <Element>[];
+    }
+    children.add(child);
+  }
+}
+
+/**
+ * Converts false to null.  Useful as the serialization scheme we use
+ * omits null values.
+ */
+bool _optionalBool(bool value) => value == true ? true : null;
+
+/**
+ * [Element] describing a Dart library.
+ */
+class LibraryElement extends Element {
+  LibraryElement(String name, LibraryMirror mirror, CommentMap comments)
+      : super('library', name, mirror.uri.toString(),
+              comments.findLibrary(mirror.location)) {
+
+    mirror.functions.forEach((childName, childMirror) {
+      addChild(new MethodElement(childName, childMirror, comments));
+    });
+
+    mirror.getters.forEach((childName, childMirror) {
+      addChild(new GetterElement(childName, childMirror, comments));
+    });
+
+    mirror.variables.forEach((childName, childMirror) {
+        addChild(new VariableElement(childName, childMirror));
+    });
+
+    mirror.classes.forEach((className, classMirror) {
+      if (!classMirror.isPrivate) {
+        if (classMirror is TypedefMirror) {
+          addChild(new TypedefElement(className, classMirror, comments));
+        } else {
+          addChild(new ClassElement(className, classMirror, comments));
+        }
+      }
+    });
+  }
+}
+
+/**
+ * [Element] describing a Dart class.
+ */
+class ClassElement extends Element {
+  /** Base class.*/
+  final Reference superclass;
+  /** Interfaces the class implements. */
+  List<Reference> interfaces;
+
+  ClassElement(String name, ClassMirror mirror, CommentMap comments)
+      : super('class', mirror.simpleName, name,
+              comments.find(mirror.location)),
+        superclass = mirror.superclass != null ?
+            new Reference(mirror.superclass) : null {
+    for (var interface in mirror.superinterfaces) {
+      if (this.interfaces == null) {
+        this.interfaces = <Reference>[];
+      }
+      this.interfaces.add(new Reference(interface));
+    }
+
+    mirror.methods.forEach((childName, childMirror) {
+      addChild(new MethodElement(childName, childMirror, comments));
+    });
+
+    mirror.getters.forEach((childName, childMirror) {
+      addChild(new GetterElement(childName, childMirror, comments));
+    });
+
+    mirror.variables.forEach((childName, childMirror) {
+        addChild(new VariableElement(childName, childMirror));
+    });
+
+    mirror.constructors.forEach((constructorName, methodMirror) {
+      addChild(new MethodElement(constructorName, methodMirror, comments, 'constructor'));
+    });
+  }
+}
+
+/**
+ * [Element] describing a getter.
+ */
+class GetterElement extends Element {
+  /** Type of the getter. */
+  final Reference ref;
+  final bool isStatic;
+
+  GetterElement(String name, MethodMirror mirror, CommentMap comments)
+      : super('property', mirror.simpleName, name,
+              comments.find(mirror.location)),
+        ref = mirror.returnType != null ?
+            new Reference(mirror.returnType) : null,
+        isStatic = _optionalBool(mirror.isStatic);
+}
+
+/**
+ * [Element] describing a method which may be a regular method, a setter, or an
+ * operator.
+ */
+class MethodElement extends Element {
+  final Reference returnType;
+  final bool isSetter;
+  final bool isOperator;
+  final bool isStatic;
+
+  MethodElement(String name, MethodMirror mirror, CommentMap comments, [String kind = 'method'])
+      : super(kind, name, '$name${mirror.parameters.length}()',
+              comments.find(mirror.location)),
+        returnType = mirror.returnType != null ?
+            new Reference(mirror.returnType) : null,
+        isSetter = _optionalBool(mirror.isSetter),
+        isOperator = _optionalBool(mirror.isOperator),
+        isStatic = _optionalBool(mirror.isStatic) {
+
+    for (var param in mirror.parameters) {
+      addChild(new ParameterElement(param));
+    }
+  }
+}
+
+/**
+ * Element describing a parameter.
+ */
+class ParameterElement extends Element {
+  /** Type of the parameter. */
+  final Reference ref;
+  /** Whether the parameter is optional. */
+  final bool isOptional;
+
+  ParameterElement(ParameterMirror mirror)
+      : super('param', mirror.simpleName, mirror.simpleName, null),
+        ref = new Reference(mirror.type),
+        isOptional = _optionalBool(mirror.isOptional) {
+  }
+}
+
+/**
+ * Element describing a variable.
+ */
+class VariableElement extends Element {
+  /** Type of the variable. */
+  final Reference ref;
+  final bool isStatic;
+
+  VariableElement(String name, VariableMirror mirror)
+      : super('property', mirror.simpleName, name, null),
+        ref = new Reference(mirror.type),
+        isStatic = _optionalBool(mirror.isStatic);
+}
+// TODO(jacobr): this seems incomplete.
+/**
+ * Element describing a typedef element.
+ */
+class TypedefElement extends Element {
+  TypedefElement(String name, TypedefMirror mirror, CommentMap comments)
+      : super('typedef', mirror.simpleName, name,
+              comments.find(mirror.location));
+}
+
+/**
+ * Reference to an Element with type argument if the reference is parameterized.
+ */
+class Reference {
+  final String name;
+  final String refId;
+  List<Reference> arguments;
+
+  Reference(Mirror mirror)
+      : name = mirror.simpleName,
+        refId = getId(mirror) {
+    if (mirror is ClassMirror) {
+      if (mirror is !TypedefMirror
+          && mirror.typeArguments.length > 0) {
+        arguments = <Reference>[];
+        for (var typeArg in mirror.typeArguments) {
+          arguments.add(new Reference(typeArg));
+        }
+      }
+    }
+  }
+
+  static String getId(Mirror mirror) {
+    String id = mirror.simpleName;
+    if (mirror is MemberMirror) {
+      MemberMirror memberMirror = mirror;
+      if (memberMirror.owner != null) {
+        id = '${getId(memberMirror.owner)}/$id';
+      }
+    }
+    return id;
+  }
+}
diff --git a/sdk/lib/_internal/libraries.dart b/sdk/lib/_internal/libraries.dart
index 50bb70a..645a547 100644
--- a/sdk/lib/_internal/libraries.dart
+++ b/sdk/lib/_internal/libraries.dart
@@ -81,6 +81,11 @@
   "utf": const LibraryInfo(
       "utf/utf.dart"),
 
+  "web_audio": const LibraryInfo(
+        "web_audio/dartium/web_audio_dartium.dart",
+        category: "Client",
+        dart2jsPath: "web_audio/dart2js/web_audio_dart2js.dart"),
+
   "_js_helper": const LibraryInfo(
       "_internal/compiler/implementation/lib/js_helper.dart",
       category: "Internal",
diff --git a/sdk/lib/collection/collections.dart b/sdk/lib/collection/collections.dart
index f0f0546..646f6e7 100644
--- a/sdk/lib/collection/collections.dart
+++ b/sdk/lib/collection/collections.dart
@@ -157,7 +157,7 @@
    */
   static _containsRef(Collection c, Object ref) {
     for (var e in c) {
-      if (e === ref) return true;
+      if (identical(e, ref)) return true;
     }
     return false;
   }
diff --git a/sdk/lib/core/future.dart b/sdk/lib/core/future.dart
index c14318b..c6cc374 100644
--- a/sdk/lib/core/future.dart
+++ b/sdk/lib/core/future.dart
@@ -259,4 +259,21 @@
     }
     return result;
   }
+
+  /**
+   * Runs [f] for each element in [input] in order, moving to the next element
+   * only when the [Future] returned by [f] completes. Returns a [Future] that
+   * completes when all elements have been processed.
+   *
+   * The return values of all [Future]s are discarded. Any errors will cause the
+   * iteration to stop and will be piped through the returned [Future].
+   */
+  static Future forEach(Iterable input, Future f(element)) {
+    var iterator = input.iterator();
+    Future nextElement(_) {
+      if (!iterator.hasNext) return new Future.immediate(null);
+      return f(iterator.next()).chain(nextElement);
+    }
+    return nextElement(null);
+  }
 }
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index f9891b3..e900b2a 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -3,6 +3,7 @@
 import 'dart:isolate';
 import 'dart:json';
 import 'dart:svg' as svg;
+import 'dart:web_audio' as web_audio;
 // Copyright (c) 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.
@@ -11,6 +12,7 @@
 // Auto-generated dart:html library.
 
 
+// Not actually used, but imported since dart:html can generate these objects.
 
 
 
@@ -25,7 +27,7 @@
 
 // Workaround for tags like <cite> that lack their own Element subclass --
 // Dart issue 1990.
-class HTMLElement extends Element native "*HTMLElement" {
+class _HTMLElement extends Element native "*HTMLElement" {
 }
 
 // Support for Send/ReceivePortSync.
@@ -56,13 +58,16 @@
     new AbstractWorkerEvents(this);
 
   /// @domName AbstractWorker.addEventListener; @docsEditable true
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+  @JSName('addEventListener')
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   /// @domName AbstractWorker.dispatchEvent; @docsEditable true
-  bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
+  @JSName('dispatchEvent')
+  bool $dom_dispatchEvent(Event evt) native;
 
   /// @domName AbstractWorker.removeEventListener; @docsEditable true
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+  @JSName('removeEventListener')
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 }
 
 class AbstractWorkerEvents extends Events {
@@ -75,38 +80,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName AnalyserNode; @docsEditable true
-class AnalyserNode extends AudioNode native "*AnalyserNode" {
-
-  /// @domName AnalyserNode.fftSize; @docsEditable true
-  int fftSize;
-
-  /// @domName AnalyserNode.frequencyBinCount; @docsEditable true
-  final int frequencyBinCount;
-
-  /// @domName AnalyserNode.maxDecibels; @docsEditable true
-  num maxDecibels;
-
-  /// @domName AnalyserNode.minDecibels; @docsEditable true
-  num minDecibels;
-
-  /// @domName AnalyserNode.smoothingTimeConstant; @docsEditable true
-  num smoothingTimeConstant;
-
-  /// @domName AnalyserNode.getByteFrequencyData; @docsEditable true
-  void getByteFrequencyData(Uint8Array array) native;
-
-  /// @domName AnalyserNode.getByteTimeDomainData; @docsEditable true
-  void getByteTimeDomainData(Uint8Array array) native;
-
-  /// @domName AnalyserNode.getFloatFrequencyData; @docsEditable true
-  void getFloatFrequencyData(Float32Array array) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
 /// @domName HTMLAnchorElement; @docsEditable true
 class AnchorElement extends Element implements Element native "*HTMLAnchorElement" {
 
@@ -400,361 +373,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName AudioBuffer; @docsEditable true
-class AudioBuffer native "*AudioBuffer" {
-
-  /// @domName AudioBuffer.duration; @docsEditable true
-  final num duration;
-
-  /// @domName AudioBuffer.gain; @docsEditable true
-  num gain;
-
-  /// @domName AudioBuffer.length; @docsEditable true
-  final int length;
-
-  /// @domName AudioBuffer.numberOfChannels; @docsEditable true
-  final int numberOfChannels;
-
-  /// @domName AudioBuffer.sampleRate; @docsEditable true
-  final num sampleRate;
-
-  /// @domName AudioBuffer.getChannelData; @docsEditable true
-  Float32Array getChannelData(int channelIndex) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-typedef void AudioBufferCallback(AudioBuffer audioBuffer);
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-class AudioBufferSourceNode extends AudioSourceNode native "*AudioBufferSourceNode" {
-
-  // TODO(efortuna): Remove these methods when Chrome stable also uses start
-  // instead of noteOn.
-  void start(num when, [num grainOffset, num grainDuration]) {
-    if (JS('bool', '!!#.start', this)) {
-      if (?grainDuration) {
-        JS('void', '#.start(#, #, #)', this, when, grainOffset, grainDuration);
-      } else if (?grainOffset) {
-        JS('void', '#.start(#, #)', this, when, grainOffset);
-      } else {
-        JS('void', '#.start(#)', this, when);
-      }
-    } else {
-      if (?grainDuration) {
-        JS('void', '#.noteOn(#, #, #)', this, when, grainOffset, grainDuration);
-      } else if (?grainOffset) {
-        JS('void', '#.noteOn(#, #)', this, when, grainOffset);
-      } else {
-        JS('void', '#.noteOn(#)', this, when);
-      }
-    }
-  }
-
-  void stop(num when) {
-    if (JS('bool', '!!#.stop', this)) {
-      JS('void', '#.stop(#)', this, when);
-    } else {
-      JS('void', '#.noteOff(#)', this, when);
-    }
-  }
-
-  static const int FINISHED_STATE = 3;
-
-  static const int PLAYING_STATE = 2;
-
-  static const int SCHEDULED_STATE = 1;
-
-  static const int UNSCHEDULED_STATE = 0;
-
-  /// @domName AudioBufferSourceNode.buffer; @docsEditable true
-  AudioBuffer buffer;
-
-  /// @domName AudioBufferSourceNode.gain; @docsEditable true
-  final AudioGain gain;
-
-  /// @domName AudioBufferSourceNode.loop; @docsEditable true
-  bool loop;
-
-  /// @domName AudioBufferSourceNode.loopEnd; @docsEditable true
-  num loopEnd;
-
-  /// @domName AudioBufferSourceNode.loopStart; @docsEditable true
-  num loopStart;
-
-  /// @domName AudioBufferSourceNode.playbackRate; @docsEditable true
-  final AudioParam playbackRate;
-
-  /// @domName AudioBufferSourceNode.playbackState; @docsEditable true
-  final int playbackState;
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-class AudioContext extends EventTarget native "*AudioContext" {
-  factory AudioContext() => _AudioContextFactoryProvider.createAudioContext();
-
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
-  AudioContextEvents get on =>
-    new AudioContextEvents(this);
-
-  /// @domName AudioContext.activeSourceCount; @docsEditable true
-  final int activeSourceCount;
-
-  /// @domName AudioContext.currentTime; @docsEditable true
-  final num currentTime;
-
-  /// @domName AudioContext.destination; @docsEditable true
-  final AudioDestinationNode destination;
-
-  /// @domName AudioContext.listener; @docsEditable true
-  final AudioListener listener;
-
-  /// @domName AudioContext.sampleRate; @docsEditable true
-  final num sampleRate;
-
-  /// @domName AudioContext.createAnalyser; @docsEditable true
-  AnalyserNode createAnalyser() native;
-
-  /// @domName AudioContext.createBiquadFilter; @docsEditable true
-  BiquadFilterNode createBiquadFilter() native;
-
-  /// @domName AudioContext.createBuffer; @docsEditable true
-  AudioBuffer createBuffer(buffer_OR_numberOfChannels, mixToMono_OR_numberOfFrames, [num sampleRate]) native;
-
-  /// @domName AudioContext.createBufferSource; @docsEditable true
-  AudioBufferSourceNode createBufferSource() native;
-
-  /// @domName AudioContext.createChannelMerger; @docsEditable true
-  ChannelMergerNode createChannelMerger([int numberOfInputs]) native;
-
-  /// @domName AudioContext.createChannelSplitter; @docsEditable true
-  ChannelSplitterNode createChannelSplitter([int numberOfOutputs]) native;
-
-  /// @domName AudioContext.createConvolver; @docsEditable true
-  ConvolverNode createConvolver() native;
-
-  /// @domName AudioContext.createDelay; @docsEditable true
-  DelayNode createDelay([num maxDelayTime]) native;
-
-  /// @domName AudioContext.createDynamicsCompressor; @docsEditable true
-  DynamicsCompressorNode createDynamicsCompressor() native;
-
-  /// @domName AudioContext.createMediaElementSource; @docsEditable true
-  MediaElementAudioSourceNode createMediaElementSource(MediaElement mediaElement) native;
-
-  /// @domName AudioContext.createMediaStreamSource; @docsEditable true
-  MediaStreamAudioSourceNode createMediaStreamSource(MediaStream mediaStream) native;
-
-  /// @domName AudioContext.createOscillator; @docsEditable true
-  OscillatorNode createOscillator() native;
-
-  /// @domName AudioContext.createPanner; @docsEditable true
-  PannerNode createPanner() native;
-
-  /// @domName AudioContext.createWaveShaper; @docsEditable true
-  WaveShaperNode createWaveShaper() native;
-
-  /// @domName AudioContext.createWaveTable; @docsEditable true
-  WaveTable createWaveTable(Float32Array real, Float32Array imag) native;
-
-  /// @domName AudioContext.decodeAudioData; @docsEditable true
-  void decodeAudioData(ArrayBuffer audioData, AudioBufferCallback successCallback, [AudioBufferCallback errorCallback]) native;
-
-  /// @domName AudioContext.startRendering; @docsEditable true
-  void startRendering() native;
-
-  GainNode createGain() {
-    if (JS('bool', '#.createGain !== undefined', this)) {
-      return JS('GainNode', '#.createGain()', this);
-    } else {
-      return JS('GainNode', '#.createGainNode()', this);
-    }
-  }
-
-  ScriptProcessorNode createScriptProcessor(int bufferSize,
-      [int numberOfInputChannels, int numberOfOutputChannels]) {
-    var function = JS('dynamic', '#.createScriptProcessor || '
-        '#.createJavaScriptNode', this, this);
-    if (?numberOfOutputChannels) {
-      return JS('ScriptProcessorNode', '#.call(#, #, #, #)', function, this,
-          bufferSize, numberOfInputChannels, numberOfOutputChannels);
-    } else if (?numberOfInputChannels) {
-      return JS('ScriptProcessorNode', '#.call(#, #, #)', function, this,
-          bufferSize, numberOfInputChannels);
-    } else {
-      return JS('ScriptProcessorNode', '#.call(#, #)', function, this,
-          bufferSize);
-    }
-  }
-}
-
-class AudioContextEvents extends Events {
-  AudioContextEvents(EventTarget _ptr) : super(_ptr);
-
-  EventListenerList get complete => this['complete'];
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-/// @domName AudioDestinationNode; @docsEditable true
-class AudioDestinationNode extends AudioNode native "*AudioDestinationNode" {
-
-  /// @domName AudioDestinationNode.numberOfChannels; @docsEditable true
-  final int numberOfChannels;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-/// @domName HTMLAudioElement; @docsEditable true
-class AudioElement extends MediaElement native "*HTMLAudioElement" {
-
-  factory AudioElement([String src]) {
-    if (!?src) {
-      return _AudioElementFactoryProvider.createAudioElement();
-    }
-    return _AudioElementFactoryProvider.createAudioElement(src);
-  }
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-/// @domName AudioGain; @docsEditable true
-class AudioGain extends AudioParam native "*AudioGain" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-/// @domName AudioListener; @docsEditable true
-class AudioListener native "*AudioListener" {
-
-  /// @domName AudioListener.dopplerFactor; @docsEditable true
-  num dopplerFactor;
-
-  /// @domName AudioListener.speedOfSound; @docsEditable true
-  num speedOfSound;
-
-  /// @domName AudioListener.setOrientation; @docsEditable true
-  void setOrientation(num x, num y, num z, num xUp, num yUp, num zUp) native;
-
-  /// @domName AudioListener.setPosition; @docsEditable true
-  void setPosition(num x, num y, num z) native;
-
-  /// @domName AudioListener.setVelocity; @docsEditable true
-  void setVelocity(num x, num y, num z) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-/// @domName AudioNode; @docsEditable true
-class AudioNode native "*AudioNode" {
-
-  /// @domName AudioNode.context; @docsEditable true
-  final AudioContext context;
-
-  /// @domName AudioNode.numberOfInputs; @docsEditable true
-  final int numberOfInputs;
-
-  /// @domName AudioNode.numberOfOutputs; @docsEditable true
-  final int numberOfOutputs;
-
-  /// @domName AudioNode.connect; @docsEditable true
-  void connect(destination, int output, [int input]) native;
-
-  /// @domName AudioNode.disconnect; @docsEditable true
-  void disconnect(int output) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-/// @domName AudioParam; @docsEditable true
-class AudioParam native "*AudioParam" {
-
-  /// @domName AudioParam.defaultValue; @docsEditable true
-  final num defaultValue;
-
-  /// @domName AudioParam.maxValue; @docsEditable true
-  final num maxValue;
-
-  /// @domName AudioParam.minValue; @docsEditable true
-  final num minValue;
-
-  /// @domName AudioParam.name; @docsEditable true
-  final String name;
-
-  /// @domName AudioParam.units; @docsEditable true
-  final int units;
-
-  /// @domName AudioParam.value; @docsEditable true
-  num value;
-
-  /// @domName AudioParam.cancelScheduledValues; @docsEditable true
-  void cancelScheduledValues(num startTime) native;
-
-  /// @domName AudioParam.exponentialRampToValueAtTime; @docsEditable true
-  void exponentialRampToValueAtTime(num value, num time) native;
-
-  /// @domName AudioParam.linearRampToValueAtTime; @docsEditable true
-  void linearRampToValueAtTime(num value, num time) native;
-
-  /// @domName AudioParam.setTargetAtTime; @docsEditable true
-  void setTargetAtTime(num target, num time, num timeConstant) native;
-
-  /// @domName AudioParam.setValueAtTime; @docsEditable true
-  void setValueAtTime(num value, num time) native;
-
-  /// @domName AudioParam.setValueCurveAtTime; @docsEditable true
-  void setValueCurveAtTime(Float32Array values, num time, num duration) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-/// @domName AudioProcessingEvent; @docsEditable true
-class AudioProcessingEvent extends Event native "*AudioProcessingEvent" {
-
-  /// @domName AudioProcessingEvent.inputBuffer; @docsEditable true
-  final AudioBuffer inputBuffer;
-
-  /// @domName AudioProcessingEvent.outputBuffer; @docsEditable true
-  final AudioBuffer outputBuffer;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-/// @domName AudioSourceNode; @docsEditable true
-class AudioSourceNode extends AudioNode native "*AudioSourceNode" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
 /// @domName HTMLBRElement; @docsEditable true
 class BRElement extends Element implements Element native "*HTMLBRElement" {
 
@@ -832,13 +450,16 @@
   final num level;
 
   /// @domName BatteryManager.addEventListener; @docsEditable true
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+  @JSName('addEventListener')
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   /// @domName BatteryManager.dispatchEvent; @docsEditable true
-  bool $dom_dispatchEvent(Event event) native "dispatchEvent";
+  @JSName('dispatchEvent')
+  bool $dom_dispatchEvent(Event event) native;
 
   /// @domName BatteryManager.removeEventListener; @docsEditable true
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+  @JSName('removeEventListener')
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 }
 
 class BatteryManagerEvents extends Events {
@@ -868,45 +489,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName BiquadFilterNode; @docsEditable true
-class BiquadFilterNode extends AudioNode native "*BiquadFilterNode" {
-
-  static const int ALLPASS = 7;
-
-  static const int BANDPASS = 2;
-
-  static const int HIGHPASS = 1;
-
-  static const int HIGHSHELF = 4;
-
-  static const int LOWPASS = 0;
-
-  static const int LOWSHELF = 3;
-
-  static const int NOTCH = 6;
-
-  static const int PEAKING = 5;
-
-  /// @domName BiquadFilterNode.Q; @docsEditable true
-  final AudioParam Q;
-
-  /// @domName BiquadFilterNode.frequency; @docsEditable true
-  final AudioParam frequency;
-
-  /// @domName BiquadFilterNode.gain; @docsEditable true
-  final AudioParam gain;
-
-  /// @domName BiquadFilterNode.type; @docsEditable true
-  int type;
-
-  /// @domName BiquadFilterNode.getFrequencyResponse; @docsEditable true
-  void getFrequencyResponse(Float32Array frequencyHz, Float32Array magResponse, Float32Array phaseResponse) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
 /// @domName Blob; @docsEditable true
 class Blob native "*Blob" {
 
@@ -1023,7 +605,7 @@
   String formTarget;
 
   /// @domName HTMLButtonElement.labels; @docsEditable true
-  @Returns('_NodeList') @Creates('_NodeList')
+  @Returns('NodeList') @Creates('NodeList')
   final List<Node> labels;
 
   /// @domName HTMLButtonElement.name; @docsEditable true
@@ -1357,7 +939,8 @@
   num getFloatValue(int unitType) native;
 
   /// @domName CSSPrimitiveValue.getRGBColorValue; @docsEditable true
-  RGBColor getRGBColorValue() native;
+  @JSName('getRGBColorValue')
+  RGBColor getRgbColorValue() native;
 
   /// @domName CSSPrimitiveValue.getRectValue; @docsEditable true
   Rect getRectValue() native;
@@ -1431,6 +1014,7 @@
   return _cachedBrowserPrefix;
 }
 
+/// @domName CSSStyleDeclaration
 class CSSStyleDeclaration native "*CSSStyleDeclaration" {
   factory CSSStyleDeclaration() => _CSSStyleDeclarationFactoryProvider.createCSSStyleDeclaration();
   factory CSSStyleDeclaration.css(String css) =>
@@ -1447,7 +1031,8 @@
   final CSSRule parentRule;
 
   /// @domName CSSStyleDeclaration.getPropertyCSSValue; @docsEditable true
-  CSSValue getPropertyCSSValue(String propertyName) native;
+  @JSName('getPropertyCSSValue')
+  CSSValue getPropertyCssValue(String propertyName) native;
 
   /// @domName CSSStyleDeclaration.getPropertyPriority; @docsEditable true
   String getPropertyPriority(String propertyName) native;
@@ -1456,7 +1041,8 @@
   String getPropertyShorthand(String propertyName) native;
 
   /// @domName CSSStyleDeclaration._getPropertyValue; @docsEditable true
-  String _getPropertyValue(String propertyName) native "getPropertyValue";
+  @JSName('getPropertyValue')
+  String _getPropertyValue(String propertyName) native;
 
   /// @domName CSSStyleDeclaration.isPropertyImplicit; @docsEditable true
   bool isPropertyImplicit(String propertyName) native;
@@ -4765,6 +4351,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
+/// @domName HTMLCanvasElement
 class CanvasElement extends Element implements Element native "*HTMLCanvasElement" {
 
   factory CanvasElement({int width, int height}) {
@@ -4781,7 +4368,8 @@
   int width;
 
   /// @domName HTMLCanvasElement.toDataURL; @docsEditable true
-  String toDataURL(String type, [num quality]) native;
+  @JSName('toDataURL')
+  String toDataUrl(String type, [num quality]) native;
 
 
   CanvasRenderingContext getContext(String contextId) native;
@@ -4822,6 +4410,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
+/// @domName CanvasRenderingContext2D
 class CanvasRenderingContext2D extends CanvasRenderingContext native "*CanvasRenderingContext2D" {
 
   /// @domName CanvasRenderingContext2D.fillStyle; @docsEditable true
@@ -4920,10 +4509,12 @@
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
+  @JSName('createImageData')
   @Creates('ImageData|=Object')
-  _createImageData_1(imagedata) native "createImageData";
+  _createImageData_1(imagedata) native;
+  @JSName('createImageData')
   @Creates('ImageData|=Object')
-  _createImageData_2(num sw, sh) native "createImageData";
+  _createImageData_2(num sw, sh) native;
 
   /// @domName CanvasRenderingContext2D.createLinearGradient; @docsEditable true
   CanvasGradient createLinearGradient(num x0, num y0, num x1, num y1) native;
@@ -4953,8 +4544,9 @@
   ImageData getImageData(num sx, num sy, num sw, num sh) {
     return _convertNativeToDart_ImageData(_getImageData_1(sx, sy, sw, sh));
   }
+  @JSName('getImageData')
   @Creates('ImageData|=Object')
-  _getImageData_1(sx, sy, sw, sh) native "getImageData";
+  _getImageData_1(sx, sy, sw, sh) native;
 
   /// @domName CanvasRenderingContext2D.getLineDash; @docsEditable true
   List<num> getLineDash() native;
@@ -4986,8 +4578,10 @@
     return;
     throw new ArgumentError("Incorrect number or type of arguments");
   }
-  void _putImageData_1(imagedata, dx, dy) native "putImageData";
-  void _putImageData_2(imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) native "putImageData";
+  @JSName('putImageData')
+  void _putImageData_1(imagedata, dx, dy) native;
+  @JSName('putImageData')
+  void _putImageData_2(imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) native;
 
   /// @domName CanvasRenderingContext2D.quadraticCurveTo; @docsEditable true
   void quadraticCurveTo(num cpx, num cpy, num x, num y) native;
@@ -5053,8 +4647,9 @@
   ImageData webkitGetImageDataHD(num sx, num sy, num sw, num sh) {
     return _convertNativeToDart_ImageData(_webkitGetImageDataHD_1(sx, sy, sw, sh));
   }
+  @JSName('webkitGetImageDataHD')
   @Creates('ImageData|=Object')
-  _webkitGetImageDataHD_1(sx, sy, sw, sh) native "webkitGetImageDataHD";
+  _webkitGetImageDataHD_1(sx, sy, sw, sh) native;
 
   /// @domName CanvasRenderingContext2D.webkitPutImageDataHD; @docsEditable true
   void webkitPutImageDataHD(ImageData imagedata, num dx, num dy, [num dirtyX, num dirtyY, num dirtyWidth, num dirtyHeight]) {
@@ -5071,8 +4666,10 @@
     return;
     throw new ArgumentError("Incorrect number or type of arguments");
   }
-  void _webkitPutImageDataHD_1(imagedata, dx, dy) native "webkitPutImageDataHD";
-  void _webkitPutImageDataHD_2(imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) native "webkitPutImageDataHD";
+  @JSName('webkitPutImageDataHD')
+  void _webkitPutImageDataHD_1(imagedata, dx, dy) native;
+  @JSName('webkitPutImageDataHD')
+  void _webkitPutImageDataHD_2(imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) native;
 
 
   /**
@@ -5116,22 +4713,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName ChannelMergerNode; @docsEditable true
-class ChannelMergerNode extends AudioNode native "*ChannelMergerNode" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-/// @domName ChannelSplitterNode; @docsEditable true
-class ChannelSplitterNode extends AudioNode native "*ChannelSplitterNode" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
 /// @domName CharacterData; @docsEditable true
 class CharacterData extends Node native "*CharacterData" {
 
@@ -5265,6 +4846,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
+/// @domName Console
 class Console
     // Console is sometimes a singleton bag-of-properties without a prototype.
     native "=(typeof console == 'undefined' ? {} : console)" {
@@ -5350,7 +4932,7 @@
   String select;
 
   /// @domName HTMLContentElement.getDistributedNodes; @docsEditable true
-  @Returns('_NodeList') @Creates('_NodeList')
+  @Returns('NodeList') @Creates('NodeList')
   List<Node> getDistributedNodes() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5358,20 +4940,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName ConvolverNode; @docsEditable true
-class ConvolverNode extends AudioNode native "*ConvolverNode" {
-
-  /// @domName ConvolverNode.buffer; @docsEditable true
-  AudioBuffer buffer;
-
-  /// @domName ConvolverNode.normalize; @docsEditable true
-  bool normalize;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
 /// @domName Coordinates; @docsEditable true
 class Coordinates native "*Coordinates" {
 
@@ -5431,6 +4999,7 @@
 // WARNING: Do not edit - generated code.
 
 
+/// @domName CustomEvent
 class CustomEvent extends Event native "*CustomEvent" {
   factory CustomEvent(String type, [bool canBubble = true, bool cancelable = true,
       Object detail]) => _CustomEventFactoryProvider.createCustomEvent(
@@ -5440,7 +5009,8 @@
   final Object detail;
 
   /// @domName CustomEvent.initCustomEvent; @docsEditable true
-  void $dom_initCustomEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object detailArg) native "initCustomEvent";
+  @JSName('initCustomEvent')
+  void $dom_initCustomEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object detailArg) native;
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5487,13 +5057,16 @@
   void abort() native;
 
   /// @domName DOMApplicationCache.addEventListener; @docsEditable true
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+  @JSName('addEventListener')
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   /// @domName DOMApplicationCache.dispatchEvent; @docsEditable true
-  bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
+  @JSName('dispatchEvent')
+  bool $dom_dispatchEvent(Event evt) native;
 
   /// @domName DOMApplicationCache.removeEventListener; @docsEditable true
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+  @JSName('removeEventListener')
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   /// @domName DOMApplicationCache.swapCache; @docsEditable true
   void swapCache() native;
@@ -5639,7 +5212,8 @@
 class DOMImplementation native "*DOMImplementation" {
 
   /// @domName DOMImplementation.createCSSStyleSheet; @docsEditable true
-  CSSStyleSheet createCSSStyleSheet(String title, String media) native;
+  @JSName('createCSSStyleSheet')
+  CSSStyleSheet createCssStyleSheet(String title, String media) native;
 
   /// @domName DOMImplementation.createDocument; @docsEditable true
   Document createDocument(String namespaceURI, String qualifiedName, DocumentType doctype) native;
@@ -5648,7 +5222,8 @@
   DocumentType createDocumentType(String qualifiedName, String publicId, String systemId) native;
 
   /// @domName DOMImplementation.createHTMLDocument; @docsEditable true
-  HtmlDocument createHTMLDocument(String title) native;
+  @JSName('createHTMLDocument')
+  HtmlDocument createHtmlDocument(String title) native;
 
   /// @domName DOMImplementation.hasFeature; @docsEditable true
   bool hasFeature(String feature, String version) native;
@@ -6243,8 +5818,10 @@
     _postMessage_2(message_2);
     return;
   }
-  void _postMessage_1(message, List messagePorts) native "postMessage";
-  void _postMessage_2(message) native "postMessage";
+  @JSName('postMessage')
+  void _postMessage_1(message, List messagePorts) native;
+  @JSName('postMessage')
+  void _postMessage_2(message) native;
 }
 
 class DedicatedWorkerContextEvents extends WorkerContextEvents {
@@ -6257,17 +5834,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName DelayNode; @docsEditable true
-class DelayNode extends AudioNode native "*DelayNode" {
-
-  /// @domName DelayNode.delayTime; @docsEditable true
-  final AudioParam delayTime;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
 /// @domName HTMLDetailsElement; @docsEditable true
 class DetailsElement extends Element implements Element native "*HTMLDetailsElement" {
 
@@ -6352,10 +5918,14 @@
     _getDirectory_4(path);
     return;
   }
-  void _getDirectory_1(path, options, EntryCallback successCallback, ErrorCallback errorCallback) native "getDirectory";
-  void _getDirectory_2(path, options, EntryCallback successCallback) native "getDirectory";
-  void _getDirectory_3(path, options) native "getDirectory";
-  void _getDirectory_4(path) native "getDirectory";
+  @JSName('getDirectory')
+  void _getDirectory_1(path, options, EntryCallback successCallback, ErrorCallback errorCallback) native;
+  @JSName('getDirectory')
+  void _getDirectory_2(path, options, EntryCallback successCallback) native;
+  @JSName('getDirectory')
+  void _getDirectory_3(path, options) native;
+  @JSName('getDirectory')
+  void _getDirectory_4(path) native;
 
   /// @domName DirectoryEntry.getFile; @docsEditable true
   void getFile(String path, {Map options, EntryCallback successCallback, ErrorCallback errorCallback}) {
@@ -6377,10 +5947,14 @@
     _getFile_4(path);
     return;
   }
-  void _getFile_1(path, options, EntryCallback successCallback, ErrorCallback errorCallback) native "getFile";
-  void _getFile_2(path, options, EntryCallback successCallback) native "getFile";
-  void _getFile_3(path, options) native "getFile";
-  void _getFile_4(path) native "getFile";
+  @JSName('getFile')
+  void _getFile_1(path, options, EntryCallback successCallback, ErrorCallback errorCallback) native;
+  @JSName('getFile')
+  void _getFile_2(path, options, EntryCallback successCallback) native;
+  @JSName('getFile')
+  void _getFile_3(path, options) native;
+  @JSName('getFile')
+  void _getFile_4(path) native;
 
   /// @domName DirectoryEntry.removeRecursively; @docsEditable true
   void removeRecursively(VoidCallback successCallback, [ErrorCallback errorCallback]) native;
@@ -6401,14 +5975,16 @@
     var flags_1 = _convertDartToNative_Dictionary(flags);
     return _getDirectory_1(path, flags_1);
   }
-  DirectoryEntrySync _getDirectory_1(path, flags) native "getDirectory";
+  @JSName('getDirectory')
+  DirectoryEntrySync _getDirectory_1(path, flags) native;
 
   /// @domName DirectoryEntrySync.getFile; @docsEditable true
   FileEntrySync getFile(String path, Map flags) {
     var flags_1 = _convertDartToNative_Dictionary(flags);
     return _getFile_1(path, flags_1);
   }
-  FileEntrySync _getFile_1(path, flags) native "getFile";
+  @JSName('getFile')
+  FileEntrySync _getFile_1(path, flags) native;
 
   /// @domName DirectoryEntrySync.removeRecursively; @docsEditable true
   void removeRecursively() native;
@@ -6441,6 +6017,27 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
+/**
+ * Represents an HTML <div> element.
+ *
+ * The [DivElement] is a generic container for content and does not have any
+ * special significance. It is functionally similar to [SpanElement].
+ *
+ * The [DivElement] is a block-level element, as opposed to [SpanElement],
+ * which is an inline-level element.
+ *
+ * Example usage:
+ *
+ *     DivElement div = new DivElement();
+ *     div.text = 'Here's my new DivElem
+ *     document.body.elements.add(elem);
+ *
+ * See also:
+ *
+ * * [HTML <div> element](http://www.w3.org/TR/html-markup/div.html) from W3C.
+ * * [Block-level element](http://www.w3.org/TR/CSS2/visuren.html#block-boxes) from W3C.
+ * * [Inline-level element](http://www.w3.org/TR/CSS2/visuren.html#inline-boxes) from W3C.
+ */
 /// @domName HTMLDivElement; @docsEditable true
 class DivElement extends Element implements Element native "*HTMLDivElement" {
 
@@ -6451,6 +6048,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
+/// @domName Document
 class Document extends Node  native "*Document"
 {
 
@@ -6460,12 +6058,8 @@
     new DocumentEvents(this);
 
   /// @domName Document.body; @docsEditable true
-  Element get $dom_body => JS("Element", "#.body", this);
-
-  /// @domName Document.body; @docsEditable true
-  void set $dom_body(Element value) {
-    JS("void", "#.body = #", this, value);
-  }
+  @JSName('body')
+  Element $dom_body;
 
   /// @domName Document.charset; @docsEditable true
   String charset;
@@ -6475,7 +6069,9 @@
 
   /// @domName Document.defaultView; @docsEditable true
   Window get window => _convertNativeToDart_Window(this._window);
-  dynamic get _window => JS("dynamic", "#.defaultView", this);
+  @JSName('defaultView')
+  @Creates('LocalWindow|=Object') @Returns('LocalWindow|=Object')
+  final dynamic _window;
 
   /// @domName Document.documentElement; @docsEditable true
   final Element documentElement;
@@ -6484,13 +6080,15 @@
   final String domain;
 
   /// @domName Document.head; @docsEditable true
-  HeadElement get $dom_head => JS("HeadElement", "#.head", this);
+  @JSName('head')
+  final HeadElement $dom_head;
 
   /// @domName Document.implementation; @docsEditable true
   final DOMImplementation implementation;
 
   /// @domName Document.lastModified; @docsEditable true
-  String get $dom_lastModified => JS("String", "#.lastModified", this);
+  @JSName('lastModified')
+  final String $dom_lastModified;
 
   /// @domName Document.preferredStylesheetSet; @docsEditable true
   final String preferredStylesheetSet;
@@ -6499,97 +6097,116 @@
   final String readyState;
 
   /// @domName Document.referrer; @docsEditable true
-  String get $dom_referrer => JS("String", "#.referrer", this);
+  @JSName('referrer')
+  final String $dom_referrer;
 
   /// @domName Document.selectedStylesheetSet; @docsEditable true
   String selectedStylesheetSet;
 
   /// @domName Document.styleSheets; @docsEditable true
-  List<StyleSheet> get $dom_styleSheets => JS("_StyleSheetList", "#.styleSheets", this);
+  @JSName('styleSheets')
+  @Returns('_StyleSheetList') @Creates('_StyleSheetList')
+  final List<StyleSheet> $dom_styleSheets;
 
   /// @domName Document.title; @docsEditable true
-  String get $dom_title => JS("String", "#.title", this);
-
-  /// @domName Document.title; @docsEditable true
-  void set $dom_title(String value) {
-    JS("void", "#.title = #", this, value);
-  }
+  @JSName('title')
+  String $dom_title;
 
   /// @domName Document.webkitFullscreenElement; @docsEditable true
-  Element get $dom_webkitFullscreenElement => JS("Element", "#.webkitFullscreenElement", this);
+  @JSName('webkitFullscreenElement')
+  final Element $dom_webkitFullscreenElement;
 
   /// @domName Document.webkitFullscreenEnabled; @docsEditable true
-  bool get $dom_webkitFullscreenEnabled => JS("bool", "#.webkitFullscreenEnabled", this);
+  @JSName('webkitFullscreenEnabled')
+  final bool $dom_webkitFullscreenEnabled;
 
   /// @domName Document.webkitHidden; @docsEditable true
-  bool get $dom_webkitHidden => JS("bool", "#.webkitHidden", this);
+  @JSName('webkitHidden')
+  final bool $dom_webkitHidden;
 
   /// @domName Document.webkitIsFullScreen; @docsEditable true
-  bool get $dom_webkitIsFullScreen => JS("bool", "#.webkitIsFullScreen", this);
+  @JSName('webkitIsFullScreen')
+  final bool $dom_webkitIsFullScreen;
 
   /// @domName Document.webkitPointerLockElement; @docsEditable true
-  Element get $dom_webkitPointerLockElement => JS("Element", "#.webkitPointerLockElement", this);
+  @JSName('webkitPointerLockElement')
+  final Element $dom_webkitPointerLockElement;
 
   /// @domName Document.webkitVisibilityState; @docsEditable true
-  String get $dom_webkitVisibilityState => JS("String", "#.webkitVisibilityState", this);
+  @JSName('webkitVisibilityState')
+  final String $dom_webkitVisibilityState;
 
   /// @domName Document.caretRangeFromPoint; @docsEditable true
-  Range $dom_caretRangeFromPoint(int x, int y) native "caretRangeFromPoint";
+  @JSName('caretRangeFromPoint')
+  Range $dom_caretRangeFromPoint(int x, int y) native;
 
   /// @domName Document.createCDATASection; @docsEditable true
-  CDATASection createCDATASection(String data) native;
+  @JSName('createCDATASection')
+  CDATASection createCDataSection(String data) native;
 
   /// @domName Document.createDocumentFragment; @docsEditable true
   DocumentFragment createDocumentFragment() native;
 
   /// @domName Document.createElement; @docsEditable true
-  Element $dom_createElement(String tagName) native "createElement";
+  @JSName('createElement')
+  Element $dom_createElement(String tagName) native;
 
   /// @domName Document.createElementNS; @docsEditable true
-  Element $dom_createElementNS(String namespaceURI, String qualifiedName) native "createElementNS";
+  @JSName('createElementNS')
+  Element $dom_createElementNS(String namespaceURI, String qualifiedName) native;
 
   /// @domName Document.createEvent; @docsEditable true
-  Event $dom_createEvent(String eventType) native "createEvent";
+  @JSName('createEvent')
+  Event $dom_createEvent(String eventType) native;
 
   /// @domName Document.createRange; @docsEditable true
   Range createRange() native;
 
   /// @domName Document.createTextNode; @docsEditable true
-  Text $dom_createTextNode(String data) native "createTextNode";
+  @JSName('createTextNode')
+  Text $dom_createTextNode(String data) native;
 
   /// @domName Document.createTouch; @docsEditable true
   Touch createTouch(LocalWindow window, EventTarget target, int identifier, int pageX, int pageY, int screenX, int screenY, int webkitRadiusX, int webkitRadiusY, num webkitRotationAngle, num webkitForce) {
     var target_1 = _convertDartToNative_EventTarget(target);
     return _createTouch_1(window, target_1, identifier, pageX, pageY, screenX, screenY, webkitRadiusX, webkitRadiusY, webkitRotationAngle, webkitForce);
   }
-  Touch _createTouch_1(LocalWindow window, target, identifier, pageX, pageY, screenX, screenY, webkitRadiusX, webkitRadiusY, webkitRotationAngle, webkitForce) native "createTouch";
+  @JSName('createTouch')
+  Touch _createTouch_1(LocalWindow window, target, identifier, pageX, pageY, screenX, screenY, webkitRadiusX, webkitRadiusY, webkitRotationAngle, webkitForce) native;
 
   /// @domName Document.createTouchList; @docsEditable true
-  TouchList $dom_createTouchList() native "createTouchList";
+  @JSName('createTouchList')
+  TouchList $dom_createTouchList() native;
 
   /// @domName Document.elementFromPoint; @docsEditable true
-  Element $dom_elementFromPoint(int x, int y) native "elementFromPoint";
+  @JSName('elementFromPoint')
+  Element $dom_elementFromPoint(int x, int y) native;
 
   /// @domName Document.execCommand; @docsEditable true
   bool execCommand(String command, bool userInterface, String value) native;
 
   /// @domName Document.getCSSCanvasContext; @docsEditable true
-  CanvasRenderingContext getCSSCanvasContext(String contextId, String name, int width, int height) native;
+  @JSName('getCSSCanvasContext')
+  CanvasRenderingContext getCssCanvasContext(String contextId, String name, int width, int height) native;
 
   /// @domName Document.getElementById; @docsEditable true
-  Element $dom_getElementById(String elementId) native "getElementById";
+  @JSName('getElementById')
+  Element $dom_getElementById(String elementId) native;
 
   /// @domName Document.getElementsByClassName; @docsEditable true
-  @Returns('_NodeList') @Creates('_NodeList')
-  List<Node> $dom_getElementsByClassName(String tagname) native "getElementsByClassName";
+  @JSName('getElementsByClassName')
+  @Returns('NodeList') @Creates('NodeList')
+  List<Node> $dom_getElementsByClassName(String tagname) native;
 
   /// @domName Document.getElementsByName; @docsEditable true
-  @Returns('_NodeList') @Creates('_NodeList')
-  List<Node> $dom_getElementsByName(String elementName) native "getElementsByName";
+  @JSName('getElementsByName')
+  @Returns('NodeList') @Creates('NodeList')
+  List<Node> $dom_getElementsByName(String elementName) native;
 
   /// @domName Document.getElementsByTagName; @docsEditable true
-  @Returns('_NodeList') @Creates('_NodeList')
-  List<Node> $dom_getElementsByTagName(String tagname) native "getElementsByTagName";
+  @JSName('getElementsByTagName')
+  @Returns('NodeList') @Creates('NodeList')
+  List<Node> $dom_getElementsByTagName(String tagname) native;
 
   /// @domName Document.queryCommandEnabled; @docsEditable true
   bool queryCommandEnabled(String command) native;
@@ -6607,20 +6224,25 @@
   String queryCommandValue(String command) native;
 
   /// @domName Document.querySelector; @docsEditable true
-  Element $dom_querySelector(String selectors) native "querySelector";
+  @JSName('querySelector')
+  Element $dom_querySelector(String selectors) native;
 
   /// @domName Document.querySelectorAll; @docsEditable true
-  @Returns('_NodeList') @Creates('_NodeList')
-  List<Node> $dom_querySelectorAll(String selectors) native "querySelectorAll";
+  @JSName('querySelectorAll')
+  @Returns('NodeList') @Creates('NodeList')
+  List<Node> $dom_querySelectorAll(String selectors) native;
 
   /// @domName Document.webkitCancelFullScreen; @docsEditable true
-  void $dom_webkitCancelFullScreen() native "webkitCancelFullScreen";
+  @JSName('webkitCancelFullScreen')
+  void $dom_webkitCancelFullScreen() native;
 
   /// @domName Document.webkitExitFullscreen; @docsEditable true
-  void $dom_webkitExitFullscreen() native "webkitExitFullscreen";
+  @JSName('webkitExitFullscreen')
+  void $dom_webkitExitFullscreen() native;
 
   /// @domName Document.webkitExitPointerLock; @docsEditable true
-  void $dom_webkitExitPointerLock() native "webkitExitPointerLock";
+  @JSName('webkitExitPointerLock')
+  void $dom_webkitExitPointerLock() native;
 
   // TODO(jacobr): implement all Element methods not on Document.
 
@@ -6660,100 +6282,10 @@
 class DocumentEvents extends ElementEvents {
   DocumentEvents(EventTarget _ptr) : super(_ptr);
 
-  EventListenerList get abort => this['abort'];
-
-  EventListenerList get beforeCopy => this['beforecopy'];
-
-  EventListenerList get beforeCut => this['beforecut'];
-
-  EventListenerList get beforePaste => this['beforepaste'];
-
-  EventListenerList get blur => this['blur'];
-
-  EventListenerList get change => this['change'];
-
-  EventListenerList get click => this['click'];
-
-  EventListenerList get contextMenu => this['contextmenu'];
-
-  EventListenerList get copy => this['copy'];
-
-  EventListenerList get cut => this['cut'];
-
-  EventListenerList get doubleClick => this['dblclick'];
-
-  EventListenerList get drag => this['drag'];
-
-  EventListenerList get dragEnd => this['dragend'];
-
-  EventListenerList get dragEnter => this['dragenter'];
-
-  EventListenerList get dragLeave => this['dragleave'];
-
-  EventListenerList get dragOver => this['dragover'];
-
-  EventListenerList get dragStart => this['dragstart'];
-
-  EventListenerList get drop => this['drop'];
-
-  EventListenerList get error => this['error'];
-
-  EventListenerList get focus => this['focus'];
-
-  EventListenerList get input => this['input'];
-
-  EventListenerList get invalid => this['invalid'];
-
-  EventListenerList get keyDown => this['keydown'];
-
-  EventListenerList get keyPress => this['keypress'];
-
-  EventListenerList get keyUp => this['keyup'];
-
-  EventListenerList get load => this['load'];
-
-  EventListenerList get mouseDown => this['mousedown'];
-
-  EventListenerList get mouseMove => this['mousemove'];
-
-  EventListenerList get mouseOut => this['mouseout'];
-
-  EventListenerList get mouseOver => this['mouseover'];
-
-  EventListenerList get mouseUp => this['mouseup'];
-
-  EventListenerList get mouseWheel => this['mousewheel'];
-
-  EventListenerList get paste => this['paste'];
-
   EventListenerList get readyStateChange => this['readystatechange'];
 
-  EventListenerList get reset => this['reset'];
-
-  EventListenerList get scroll => this['scroll'];
-
-  EventListenerList get search => this['search'];
-
-  EventListenerList get select => this['select'];
-
   EventListenerList get selectionChange => this['selectionchange'];
 
-  EventListenerList get selectStart => this['selectstart'];
-
-  EventListenerList get submit => this['submit'];
-
-  EventListenerList get touchCancel => this['touchcancel'];
-
-  EventListenerList get touchEnd => this['touchend'];
-
-  EventListenerList get touchMove => this['touchmove'];
-
-  EventListenerList get touchStart => this['touchstart'];
-
-  EventListenerList get fullscreenChange => this['webkitfullscreenchange'];
-
-  EventListenerList get fullscreenError => this['webkitfullscreenerror'];
-
   EventListenerList get pointerLockChange => this['webkitpointerlockchange'];
 
   EventListenerList get pointerLockError => this['webkitpointerlockerror'];
@@ -6778,6 +6310,7 @@
   bool get frozen => true;
 }
 
+/// @domName DocumentFragment
 class DocumentFragment extends Node native "*DocumentFragment" {
   factory DocumentFragment() => _DocumentFragmentFactoryProvider.createDocumentFragment();
 
@@ -6819,21 +6352,21 @@
   List<Element> queryAll(String selectors) =>
     new _FrozenElementList._wrap($dom_querySelectorAll(selectors));
 
-  String get innerHTML {
+  String get innerHtml {
     final e = new Element.tag("div");
     e.nodes.add(this.clone(true));
-    return e.innerHTML;
+    return e.innerHtml;
   }
 
-  String get outerHTML => innerHTML;
+  String get outerHtml => innerHtml;
 
-  // TODO(nweiz): Do we want to support some variant of innerHTML for XML and/or
+  // TODO(nweiz): Do we want to support some variant of innerHtml for XML and/or
   // SVG strings?
-  void set innerHTML(String value) {
+  void set innerHtml(String value) {
     this.nodes.clear();
 
     final e = new Element.tag("div");
-    e.innerHTML = value;
+    e.innerHtml = value;
 
     // Copy list first since we don't want liveness during iteration.
     List nodes = new List.from(e.nodes);
@@ -6863,16 +6396,20 @@
     this._insertAdjacentNode(where, new Text(text));
   }
 
-  void insertAdjacentHTML(String where, String text) {
+  void insertAdjacentHtml(String where, String text) {
     this._insertAdjacentNode(where, new DocumentFragment.html(text));
   }
 
-  void addText(String text) {
+  void append(Element element) {
+    this.children.add(element);
+  }
+
+  void appendText(String text) {
     this.insertAdjacentText('beforeend', text);
   }
 
-  void addHtml(String text) {
-    this.insertAdjacentHTML('beforeend', text);
+  void appendHtml(String text) {
+    this.insertAdjacentHtml('beforeend', text);
   }
 
   // If we can come up with a semi-reasonable default value for an Element
@@ -6896,7 +6433,7 @@
     }
     return null;
   }
-  Element get $m_lastElementChild() => elements.last;
+  Element get $m_lastElementChild => elements.last;
   Element get nextElementSibling => null;
   Element get previousElementSibling => null;
   Element get offsetParent => null;
@@ -7025,11 +6562,13 @@
     new ElementEvents(this);
 
   /// @domName DocumentFragment.querySelector; @docsEditable true
-  Element $dom_querySelector(String selectors) native "querySelector";
+  @JSName('querySelector')
+  Element $dom_querySelector(String selectors) native;
 
   /// @domName DocumentFragment.querySelectorAll; @docsEditable true
-  @Returns('_NodeList') @Creates('_NodeList')
-  List<Node> $dom_querySelectorAll(String selectors) native "querySelectorAll";
+  @JSName('querySelectorAll')
+  @Returns('NodeList') @Creates('NodeList')
+  List<Node> $dom_querySelectorAll(String selectors) native;
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7066,32 +6605,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName DynamicsCompressorNode; @docsEditable true
-class DynamicsCompressorNode extends AudioNode native "*DynamicsCompressorNode" {
-
-  /// @domName DynamicsCompressorNode.attack; @docsEditable true
-  final AudioParam attack;
-
-  /// @domName DynamicsCompressorNode.knee; @docsEditable true
-  final AudioParam knee;
-
-  /// @domName DynamicsCompressorNode.ratio; @docsEditable true
-  final AudioParam ratio;
-
-  /// @domName DynamicsCompressorNode.reduction; @docsEditable true
-  final AudioParam reduction;
-
-  /// @domName DynamicsCompressorNode.release; @docsEditable true
-  final AudioParam release;
-
-  /// @domName DynamicsCompressorNode.threshold; @docsEditable true
-  final AudioParam threshold;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
 /// @domName EXTTextureFilterAnisotropic; @docsEditable true
 class EXTTextureFilterAnisotropic native "*EXTTextureFilterAnisotropic" {
 
@@ -7401,171 +6914,6 @@
   bool get hasNext => _index < _list.length;
 }
 
-class _ElementAttributeMap implements Map<String, String> {
-
-  final Element _element;
-
-  _ElementAttributeMap(this._element);
-
-  bool containsValue(String value) {
-    final attributes = _element.$dom_attributes;
-    for (int i = 0, len = attributes.length; i < len; i++) {
-      if(value == attributes[i].value) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  bool containsKey(String key) {
-    return _element.$dom_hasAttribute(key);
-  }
-
-  String operator [](String key) {
-    return _element.$dom_getAttribute(key);
-  }
-
-  void operator []=(String key, value) {
-    _element.$dom_setAttribute(key, '$value');
-  }
-
-  String putIfAbsent(String key, String ifAbsent()) {
-    if (!containsKey(key)) {
-      this[key] = ifAbsent();
-    }
-    return this[key];
-  }
-
-  String remove(String key) {
-    String value = _element.$dom_getAttribute(key);
-    _element.$dom_removeAttribute(key);
-    return value;
-  }
-
-  void clear() {
-    final attributes = _element.$dom_attributes;
-    for (int i = attributes.length - 1; i >= 0; i--) {
-      remove(attributes[i].name);
-    }
-  }
-
-  void forEach(void f(String key, String value)) {
-    final attributes = _element.$dom_attributes;
-    for (int i = 0, len = attributes.length; i < len; i++) {
-      final item = attributes[i];
-      f(item.name, item.value);
-    }
-  }
-
-  Collection<String> get keys {
-    // TODO(jacobr): generate a lazy collection instead.
-    final attributes = _element.$dom_attributes;
-    final keys = new List<String>(attributes.length);
-    for (int i = 0, len = attributes.length; i < len; i++) {
-      keys[i] = attributes[i].name;
-    }
-    return keys;
-  }
-
-  Collection<String> get values {
-    // TODO(jacobr): generate a lazy collection instead.
-    final attributes = _element.$dom_attributes;
-    final values = new List<String>(attributes.length);
-    for (int i = 0, len = attributes.length; i < len; i++) {
-      values[i] = attributes[i].value;
-    }
-    return values;
-  }
-
-  /**
-   * The number of {key, value} pairs in the map.
-   */
-  int get length {
-    return _element.$dom_attributes.length;
-  }
-
-  /**
-   * Returns true if there is no {key, value} pair in the map.
-   */
-  bool get isEmpty {
-    return length == 0;
-  }
-}
-
-/**
- * Provides a Map abstraction on top of data-* attributes, similar to the
- * dataSet in the old DOM.
- */
-class _DataAttributeMap implements Map<String, String> {
-
-  final Map<String, String> $dom_attributes;
-
-  _DataAttributeMap(this.$dom_attributes);
-
-  // interface Map
-
-  // TODO: Use lazy iterator when it is available on Map.
-  bool containsValue(String value) => values.some((v) => v == value);
-
-  bool containsKey(String key) => $dom_attributes.containsKey(_attr(key));
-
-  String operator [](String key) => $dom_attributes[_attr(key)];
-
-  void operator []=(String key, value) {
-    $dom_attributes[_attr(key)] = '$value';
-  }
-
-  String putIfAbsent(String key, String ifAbsent()) =>
-    $dom_attributes.putIfAbsent(_attr(key), ifAbsent);
-
-  String remove(String key) => $dom_attributes.remove(_attr(key));
-
-  void clear() {
-    // Needs to operate on a snapshot since we are mutating the collection.
-    for (String key in keys) {
-      remove(key);
-    }
-  }
-
-  void forEach(void f(String key, String value)) {
-    $dom_attributes.forEach((String key, String value) {
-      if (_matches(key)) {
-        f(_strip(key), value);
-      }
-    });
-  }
-
-  Collection<String> get keys {
-    final keys = new List<String>();
-    $dom_attributes.forEach((String key, String value) {
-      if (_matches(key)) {
-        keys.add(_strip(key));
-      }
-    });
-    return keys;
-  }
-
-  Collection<String> get values {
-    final values = new List<String>();
-    $dom_attributes.forEach((String key, String value) {
-      if (_matches(key)) {
-        values.add(value);
-      }
-    });
-    return values;
-  }
-
-  int get length => keys.length;
-
-  // TODO: Use lazy iterator when it is available on Map.
-  bool get isEmpty => length == 0;
-
-  // Helpers.
-  String _attr(String key) => 'data-$key';
-  bool _matches(String key) => key.startsWith('data-');
-  String _strip(String key) => key.substring(5);
-}
-
 class _ElementCssClassSet extends CssClassSet {
 
   final Element _element;
@@ -7591,24 +6939,7 @@
   }
 }
 
-class _SimpleClientRect implements ClientRect {
-  final num left;
-  final num top;
-  final num width;
-  final num height;
-  num get right => left + width;
-  num get bottom => top + height;
-
-  const _SimpleClientRect(this.left, this.top, this.width, this.height);
-
-  bool operator ==(ClientRect other) {
-    return other != null && left == other.left && top == other.top
-        && width == other.width && height == other.height;
-  }
-
-  String toString() => "($left, $top, $width, $height)";
-}
-
+/// @domName Element
 abstract class Element extends Node implements ElementTraversal native "*Element" {
 
   factory Element.html(String html) =>
@@ -7630,6 +6961,14 @@
     }
   }
 
+  /**
+   * Deprecated, use innerHtml instead.
+   */
+  String get innerHTML => this.innerHtml;
+  void set innerHTML(String value) {
+    this.innerHtml = value;
+  }
+
   void set elements(Collection<Element> value) {
     this.children = value;
   }
@@ -7678,6 +7017,14 @@
     }
   }
 
+  /**
+   * Gets a map for manipulating the attributes of a particular namespace.
+   * This is primarily useful for SVG attributes such as xref:link.
+   */
+  Map<String, String> getNamespacedAttributes(String namespace) {
+    return new _NamespacedAttributeMap(this, namespace);
+  }
+
   /** @domName Window.getComputedStyle */
   Future<CSSStyleDeclaration> get computedStyle {
      // TODO(jacobr): last param should be null, see b/5045788
@@ -7692,9 +7039,16 @@
   }
 
   /**
+   * Adds the specified element to after the last child of this.
+   */
+  void append(Element e) {
+    this.children.add(e);
+  }
+
+  /**
    * Adds the specified text as a text node after the last child of this.
    */
-  void addText(String text) {
+  void appendText(String text) {
     this.insertAdjacentText('beforeend', text);
   }
 
@@ -7702,8 +7056,8 @@
    * Parses the specified text as HTML and adds the resulting node after the
    * last child of this.
    */
-  void addHtml(String text) {
-    this.insertAdjacentHTML('beforeend', text);
+  void appendHtml(String text) {
+    this.insertAdjacentHtml('beforeend', text);
   }
 
   // Hooks to support custom WebComponents.
@@ -7731,20 +7085,20 @@
     }
   }
 
-  void _insertAdjacentText(String where, String text)
-      native 'insertAdjacentText';
+  @JSName('insertAdjacentText')
+  void _insertAdjacentText(String where, String text) native;
 
   /** @domName Element.insertAdjacentHTML */
-  void insertAdjacentHTML(String where, String text) {
-    if (JS('bool', '!!#.insertAdjacentHTML', this)) {
-      _insertAdjacentHTML(where, text);
+  void insertAdjacentHtml(String where, String text) {
+    if (JS('bool', '!!#.insertAdjacentHtml', this)) {
+      _insertAdjacentHtml(where, text);
     } else {
       _insertAdjacentNode(where, new DocumentFragment.html(text));
     }
   }
 
-  void _insertAdjacentHTML(String where, String text)
-      native 'insertAdjacentHTML';
+  @JSName('insertAdjacentHTML')
+  void _insertAdjacentHTML(String where, String text) native;
 
   /** @domName Element.insertAdjacentHTML */
   Element insertAdjacentElement(String where, Element element) {
@@ -7756,8 +7110,8 @@
     return element;
   }
 
-  void _insertAdjacentElement(String where, Element element)
-      native 'insertAdjacentElement';
+  @JSName('insertAdjacentElement')
+  void _insertAdjacentElement(String where, Element element) native;
 
   void _insertAdjacentNode(String where, Node node) {
     switch (where.toLowerCase()) {
@@ -7785,7 +7139,8 @@
     new ElementEvents(this);
 
   /// @domName HTMLElement.children; @docsEditable true
-  HTMLCollection get $dom_children => JS("HTMLCollection", "#.children", this);
+  @JSName('children')
+  final HTMLCollection $dom_children;
 
   /// @domName HTMLElement.contentEditable; @docsEditable true
   String contentEditable;
@@ -7803,7 +7158,8 @@
   String id;
 
   /// @domName HTMLElement.innerHTML; @docsEditable true
-  String innerHTML;
+  @JSName('innerHTML')
+  String innerHtml;
 
   /// @domName HTMLElement.isContentEditable; @docsEditable true
   final bool isContentEditable;
@@ -7812,7 +7168,8 @@
   String lang;
 
   /// @domName HTMLElement.outerHTML; @docsEditable true
-  final String outerHTML;
+  @JSName('outerHTML')
+  final String outerHtml;
 
   /// @domName HTMLElement.spellcheck; @docsEditable true
   bool spellcheck;
@@ -7835,15 +7192,12 @@
   static const int ALLOW_KEYBOARD_INPUT = 1;
 
   /// @domName Element.childElementCount; @docsEditable true
-  int get $dom_childElementCount => JS("int", "#.childElementCount", this);
+  @JSName('childElementCount')
+  final int $dom_childElementCount;
 
   /// @domName Element.className; @docsEditable true
-  String get $dom_className => JS("String", "#.className", this);
-
-  /// @domName Element.className; @docsEditable true
-  void set $dom_className(String value) {
-    JS("void", "#.className = #", this, value);
-  }
+  @JSName('className')
+  String $dom_className;
 
   /// @domName Element.clientHeight; @docsEditable true
   final int clientHeight;
@@ -7861,10 +7215,12 @@
   final Map<String, String> dataset;
 
   /// @domName Element.firstElementChild; @docsEditable true
-  Element get $dom_firstElementChild => JS("Element", "#.firstElementChild", this);
+  @JSName('firstElementChild')
+  final Element $dom_firstElementChild;
 
   /// @domName Element.lastElementChild; @docsEditable true
-  Element get $dom_lastElementChild => JS("Element", "#.lastElementChild", this);
+  @JSName('lastElementChild')
+  final Element $dom_lastElementChild;
 
   /// @domName Element.nextElementSibling; @docsEditable true
   final Element nextElementSibling;
@@ -7912,7 +7268,12 @@
   void focus() native;
 
   /// @domName Element.getAttribute; @docsEditable true
-  String $dom_getAttribute(String name) native "getAttribute";
+  @JSName('getAttribute')
+  String $dom_getAttribute(String name) native;
+
+  /// @domName Element.getAttributeNS; @docsEditable true
+  @JSName('getAttributeNS')
+  String $dom_getAttributeNS(String namespaceURI, String localName) native;
 
   /// @domName Element.getBoundingClientRect; @docsEditable true
   ClientRect getBoundingClientRect() native;
@@ -7922,25 +7283,39 @@
   List<ClientRect> getClientRects() native;
 
   /// @domName Element.getElementsByClassName; @docsEditable true
-  @Returns('_NodeList') @Creates('_NodeList')
-  List<Node> $dom_getElementsByClassName(String name) native "getElementsByClassName";
+  @JSName('getElementsByClassName')
+  @Returns('NodeList') @Creates('NodeList')
+  List<Node> $dom_getElementsByClassName(String name) native;
 
   /// @domName Element.getElementsByTagName; @docsEditable true
-  @Returns('_NodeList') @Creates('_NodeList')
-  List<Node> $dom_getElementsByTagName(String name) native "getElementsByTagName";
+  @JSName('getElementsByTagName')
+  @Returns('NodeList') @Creates('NodeList')
+  List<Node> $dom_getElementsByTagName(String name) native;
 
   /// @domName Element.hasAttribute; @docsEditable true
-  bool $dom_hasAttribute(String name) native "hasAttribute";
+  @JSName('hasAttribute')
+  bool $dom_hasAttribute(String name) native;
+
+  /// @domName Element.hasAttributeNS; @docsEditable true
+  @JSName('hasAttributeNS')
+  bool $dom_hasAttributeNS(String namespaceURI, String localName) native;
 
   /// @domName Element.querySelector; @docsEditable true
-  Element $dom_querySelector(String selectors) native "querySelector";
+  @JSName('querySelector')
+  Element $dom_querySelector(String selectors) native;
 
   /// @domName Element.querySelectorAll; @docsEditable true
-  @Returns('_NodeList') @Creates('_NodeList')
-  List<Node> $dom_querySelectorAll(String selectors) native "querySelectorAll";
+  @JSName('querySelectorAll')
+  @Returns('NodeList') @Creates('NodeList')
+  List<Node> $dom_querySelectorAll(String selectors) native;
 
   /// @domName Element.removeAttribute; @docsEditable true
-  void $dom_removeAttribute(String name) native "removeAttribute";
+  @JSName('removeAttribute')
+  void $dom_removeAttribute(String name) native;
+
+  /// @domName Element.removeAttributeNS; @docsEditable true
+  @JSName('removeAttributeNS')
+  void $dom_removeAttributeNS(String namespaceURI, String localName) native;
 
   /// @domName Element.scrollByLines; @docsEditable true
   void scrollByLines(int lines) native;
@@ -7949,13 +7324,20 @@
   void scrollByPages(int pages) native;
 
   /// @domName Element.scrollIntoViewIfNeeded; @docsEditable true
-  void scrollIntoView([bool centerIfNeeded]) native "scrollIntoViewIfNeeded";
+  @JSName('scrollIntoViewIfNeeded')
+  void scrollIntoView([bool centerIfNeeded]) native;
 
   /// @domName Element.setAttribute; @docsEditable true
-  void $dom_setAttribute(String name, String value) native "setAttribute";
+  @JSName('setAttribute')
+  void $dom_setAttribute(String name, String value) native;
+
+  /// @domName Element.setAttributeNS; @docsEditable true
+  @JSName('setAttributeNS')
+  void $dom_setAttributeNS(String namespaceURI, String qualifiedName, String value) native;
 
   /// @domName Element.webkitMatchesSelector; @docsEditable true
-  bool matchesSelector(String selectors) native "webkitMatchesSelector";
+  @JSName('webkitMatchesSelector')
+  bool matchesSelector(String selectors) native;
 
   /// @domName Element.webkitRequestFullScreen; @docsEditable true
   void webkitRequestFullScreen(int flags) native;
@@ -8005,7 +7387,7 @@
       }
     }
     final Element temp = new Element.tag(parentTag);
-    temp.innerHTML = html;
+    temp.innerHtml = html;
 
     Element element;
     if (temp.children.length == 1) {
@@ -8265,7 +7647,8 @@
   void remove(VoidCallback successCallback, [ErrorCallback errorCallback]) native;
 
   /// @domName Entry.toURL; @docsEditable true
-  String toURL() native;
+  @JSName('toURL')
+  String toUrl() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -8314,7 +7697,8 @@
   void remove() native;
 
   /// @domName EntrySync.toURL; @docsEditable true
-  String toURL() native;
+  @JSName('toURL')
+  String toUrl() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -8348,6 +7732,7 @@
 // WARNING: Do not edit - generated code.
 
 
+/// @domName Event
 class Event native "*Event" {
   // In JS, canBubble and cancelable are technically required parameters to
   // init*Event. In practice, though, if they aren't provided they simply
@@ -8412,7 +7797,9 @@
 
   /// @domName Event.currentTarget; @docsEditable true
   EventTarget get currentTarget => _convertNativeToDart_EventTarget(this._currentTarget);
-  dynamic get _currentTarget => JS("dynamic", "#.currentTarget", this);
+  @JSName('currentTarget')
+  @Creates('EventTarget|=Object') @Returns('EventTarget|=Object')
+  final dynamic _currentTarget;
 
   /// @domName Event.defaultPrevented; @docsEditable true
   final bool defaultPrevented;
@@ -8425,7 +7812,9 @@
 
   /// @domName Event.target; @docsEditable true
   EventTarget get target => _convertNativeToDart_EventTarget(this._target);
-  dynamic get _target => JS("dynamic", "#.target", this);
+  @JSName('target')
+  @Creates('EventTarget|=Object') @Returns('EventTarget|=Object')
+  final dynamic _target;
 
   /// @domName Event.timeStamp; @docsEditable true
   final int timeStamp;
@@ -8434,7 +7823,8 @@
   final String type;
 
   /// @domName Event.initEvent; @docsEditable true
-  void $dom_initEvent(String eventTypeArg, bool canBubbleArg, bool cancelableArg) native "initEvent";
+  @JSName('initEvent')
+  void $dom_initEvent(String eventTypeArg, bool canBubbleArg, bool cancelableArg) native;
 
   /// @domName Event.preventDefault; @docsEditable true
   void preventDefault() native;
@@ -8490,9 +7880,6 @@
 
   static const int OPEN = 1;
 
-  /// @domName EventSource.URL; @docsEditable true
-  final String URL;
-
   /// @domName EventSource.readyState; @docsEditable true
   final int readyState;
 
@@ -8500,16 +7887,19 @@
   final String url;
 
   /// @domName EventSource.addEventListener; @docsEditable true
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+  @JSName('addEventListener')
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   /// @domName EventSource.close; @docsEditable true
   void close() native;
 
   /// @domName EventSource.dispatchEvent; @docsEditable true
-  bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
+  @JSName('dispatchEvent')
+  bool $dom_dispatchEvent(Event evt) native;
 
   /// @domName EventSource.removeEventListener; @docsEditable true
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+  @JSName('removeEventListener')
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 }
 
 class EventSourceEvents extends Events {
@@ -8571,20 +7961,23 @@
   }
 }
 
-
+/// @domName EventTarget
 class EventTarget native "*EventTarget" {
 
   /** @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent */
   Events get on => new Events(this);
 
   /// @domName EventTarget.addEventListener; @docsEditable true
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+  @JSName('addEventListener')
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   /// @domName EventTarget.dispatchEvent; @docsEditable true
-  bool $dom_dispatchEvent(Event event) native "dispatchEvent";
+  @JSName('dispatchEvent')
+  bool $dom_dispatchEvent(Event event) native;
 
   /// @domName EventTarget.removeEventListener; @docsEditable true
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+  @JSName('removeEventListener')
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8793,10 +8186,12 @@
   void abort() native;
 
   /// @domName FileReader.addEventListener; @docsEditable true
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+  @JSName('addEventListener')
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   /// @domName FileReader.dispatchEvent; @docsEditable true
-  bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
+  @JSName('dispatchEvent')
+  bool $dom_dispatchEvent(Event evt) native;
 
   /// @domName FileReader.readAsArrayBuffer; @docsEditable true
   void readAsArrayBuffer(Blob blob) native;
@@ -8805,13 +8200,15 @@
   void readAsBinaryString(Blob blob) native;
 
   /// @domName FileReader.readAsDataURL; @docsEditable true
-  void readAsDataURL(Blob blob) native;
+  @JSName('readAsDataURL')
+  void readAsDataUrl(Blob blob) native;
 
   /// @domName FileReader.readAsText; @docsEditable true
   void readAsText(Blob blob, [String encoding]) native;
 
   /// @domName FileReader.removeEventListener; @docsEditable true
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+  @JSName('removeEventListener')
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 }
 
 class FileReaderEvents extends Events {
@@ -8846,7 +8243,8 @@
   String readAsBinaryString(Blob blob) native;
 
   /// @domName FileReaderSync.readAsDataURL; @docsEditable true
-  String readAsDataURL(Blob blob) native;
+  @JSName('readAsDataURL')
+  String readAsDataUrl(Blob blob) native;
 
   /// @domName FileReaderSync.readAsText; @docsEditable true
   String readAsText(Blob blob, [String encoding]) native;
@@ -8893,13 +8291,16 @@
   void abort() native;
 
   /// @domName FileWriter.addEventListener; @docsEditable true
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+  @JSName('addEventListener')
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   /// @domName FileWriter.dispatchEvent; @docsEditable true
-  bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
+  @JSName('dispatchEvent')
+  bool $dom_dispatchEvent(Event evt) native;
 
   /// @domName FileWriter.removeEventListener; @docsEditable true
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+  @JSName('removeEventListener')
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   /// @domName FileWriter.seek; @docsEditable true
   void seek(int position) native;
@@ -9062,7 +8463,8 @@
   // -- end List<num> mixins.
 
   /// @domName Float32Array.setElements; @docsEditable true
-  void setElements(Object array, [int offset]) native "set";
+  @JSName('set')
+  void setElements(Object array, [int offset]) native;
 
   /// @domName Float32Array.subarray; @docsEditable true
   Float32Array subarray(int start, [int end]) native;
@@ -9172,7 +8574,8 @@
   // -- end List<num> mixins.
 
   /// @domName Float64Array.setElements; @docsEditable true
-  void setElements(Object array, [int offset]) native "set";
+  @JSName('set')
+  void setElements(Object array, [int offset]) native;
 
   /// @domName Float64Array.subarray; @docsEditable true
   Float64Array subarray(int start, [int end]) native;
@@ -9271,7 +8674,9 @@
 
   /// @domName HTMLFrameElement.contentWindow; @docsEditable true
   Window get contentWindow => _convertNativeToDart_Window(this._contentWindow);
-  dynamic get _contentWindow => JS("dynamic", "#.contentWindow", this);
+  @JSName('contentWindow')
+  @Creates('LocalWindow|=Object') @Returns('LocalWindow|=Object')
+  final dynamic _contentWindow;
 
   /// @domName HTMLFrameElement.frameBorder; @docsEditable true
   String frameBorder;
@@ -9359,17 +8764,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName GainNode; @docsEditable true
-class GainNode extends AudioNode native "*GainNode" {
-
-  /// @domName GainNode.gain; @docsEditable true
-  final AudioGain gain;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
 /// @domName Gamepad; @docsEditable true
 class Gamepad native "*Gamepad" {
 
@@ -9544,7 +8938,7 @@
   Node namedItem(String name) native;
 
   /// @domName HTMLAllCollection.tags; @docsEditable true
-  @Returns('_NodeList') @Creates('_NodeList')
+  @Returns('NodeList') @Creates('NodeList')
   List<Node> tags(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -9681,10 +9075,12 @@
 class HashChangeEvent extends Event native "*HashChangeEvent" {
 
   /// @domName HashChangeEvent.newURL; @docsEditable true
-  final String newURL;
+  @JSName('newURL')
+  final String newUrl;
 
   /// @domName HashChangeEvent.oldURL; @docsEditable true
-  final String oldURL;
+  @JSName('oldURL')
+  final String oldUrl;
 
   /// @domName HashChangeEvent.initHashChangeEvent; @docsEditable true
   void initHashChangeEvent(String type, bool canBubble, bool cancelable, String oldURL, String newURL) native;
@@ -9732,6 +9128,7 @@
 // WARNING: Do not edit - generated code.
 
 
+/// @domName HTMLDocument
 class HtmlDocument extends Document native "*HTMLDocument" {
 
   /// @domName HTMLDocument.activeElement; @docsEditable true
@@ -9824,6 +9221,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
+/// @domName XMLHttpRequest
 class HttpRequest extends EventTarget native "*XMLHttpRequest" {
   factory HttpRequest.get(String url, onComplete(HttpRequest request)) =>
       _HttpRequestFactoryProvider.createHttpRequest_get(url, onComplete);
@@ -9864,7 +9262,8 @@
   String responseType;
 
   /// @domName XMLHttpRequest.responseXML; @docsEditable true
-  final Document responseXML;
+  @JSName('responseXML')
+  final Document responseXml;
 
   /// @domName XMLHttpRequest.status; @docsEditable true
   final int status;
@@ -9882,10 +9281,12 @@
   void abort() native;
 
   /// @domName XMLHttpRequest.addEventListener; @docsEditable true
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+  @JSName('addEventListener')
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   /// @domName XMLHttpRequest.dispatchEvent; @docsEditable true
-  bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
+  @JSName('dispatchEvent')
+  bool $dom_dispatchEvent(Event evt) native;
 
   /// @domName XMLHttpRequest.getAllResponseHeaders; @docsEditable true
   String getAllResponseHeaders() native;
@@ -9900,7 +9301,8 @@
   void overrideMimeType(String override) native;
 
   /// @domName XMLHttpRequest.removeEventListener; @docsEditable true
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+  @JSName('removeEventListener')
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   /// @domName XMLHttpRequest.send; @docsEditable true
   void send([data]) native;
@@ -9978,13 +9380,16 @@
     new HttpRequestUploadEvents(this);
 
   /// @domName XMLHttpRequestUpload.addEventListener; @docsEditable true
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+  @JSName('addEventListener')
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   /// @domName XMLHttpRequestUpload.dispatchEvent; @docsEditable true
-  bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
+  @JSName('dispatchEvent')
+  bool $dom_dispatchEvent(Event evt) native;
 
   /// @domName XMLHttpRequestUpload.removeEventListener; @docsEditable true
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+  @JSName('removeEventListener')
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 }
 
 class HttpRequestUploadEvents extends Events {
@@ -10052,8 +9457,10 @@
     _continueFunction_2();
     return;
   }
-  void _continueFunction_1(key) native "continue";
-  void _continueFunction_2() native "continue";
+  @JSName('continue')
+  void _continueFunction_1(key) native;
+  @JSName('continue')
+  void _continueFunction_2() native;
 
   /// @domName IDBCursor.delete; @docsEditable true
   IDBRequest delete() native;
@@ -10063,7 +9470,8 @@
     var value_1 = _convertDartToNative_SerializedScriptValue(value);
     return _update_1(value_1);
   }
-  IDBRequest _update_1(value) native "update";
+  @JSName('update')
+  IDBRequest _update_1(value) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -10082,6 +9490,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
+/// @domName IDBDatabase
 class IDBDatabase extends EventTarget native "*IDBDatabase" {
 
   IDBTransaction transaction(storeName_OR_storeNames, String mode) {
@@ -10120,7 +9529,8 @@
     return db._transaction(stores, intMode);
   }
 
-  IDBTransaction _transaction(stores, mode) native 'transaction';
+  @JSName('transaction')
+  IDBTransaction _transaction(stores, mode) native;
 
   static bool _hasNumericMode(txn) =>
       JS('bool', 'typeof(#.mode) === "number"', txn);
@@ -10141,7 +9551,8 @@
   final dynamic version;
 
   /// @domName IDBDatabase.addEventListener; @docsEditable true
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+  @JSName('addEventListener')
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   /// @domName IDBDatabase.close; @docsEditable true
   void close() native;
@@ -10154,17 +9565,21 @@
     }
     return _createObjectStore_2(name);
   }
-  IDBObjectStore _createObjectStore_1(name, options) native "createObjectStore";
-  IDBObjectStore _createObjectStore_2(name) native "createObjectStore";
+  @JSName('createObjectStore')
+  IDBObjectStore _createObjectStore_1(name, options) native;
+  @JSName('createObjectStore')
+  IDBObjectStore _createObjectStore_2(name) native;
 
   /// @domName IDBDatabase.deleteObjectStore; @docsEditable true
   void deleteObjectStore(String name) native;
 
   /// @domName IDBDatabase.dispatchEvent; @docsEditable true
-  bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
+  @JSName('dispatchEvent')
+  bool $dom_dispatchEvent(Event evt) native;
 
   /// @domName IDBDatabase.removeEventListener; @docsEditable true
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+  @JSName('removeEventListener')
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   /// @domName IDBDatabase.setVersion; @docsEditable true
   IDBVersionChangeRequest setVersion(String version) native;
@@ -10243,7 +9658,8 @@
     var second_2 = _convertDartToNative_IDBKey(second);
     return _cmp_1(first_1, second_2);
   }
-  int _cmp_1(first, second) native "cmp";
+  @JSName('cmp')
+  int _cmp_1(first, second) native;
 
   /// @domName IDBFactory.deleteDatabase; @docsEditable true
   IDBVersionChangeRequest deleteDatabase(String name) native;
@@ -10292,9 +9708,12 @@
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
-  IDBRequest _count_1() native "count";
-  IDBRequest _count_2(IDBKeyRange range) native "count";
-  IDBRequest _count_3(key) native "count";
+  @JSName('count')
+  IDBRequest _count_1() native;
+  @JSName('count')
+  IDBRequest _count_2(IDBKeyRange range) native;
+  @JSName('count')
+  IDBRequest _count_3(key) native;
 
   /// @domName IDBIndex.get; @docsEditable true
   IDBRequest get(key) {
@@ -10307,10 +9726,12 @@
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
+  @JSName('get')
   @Returns('IDBRequest') @Creates('IDBRequest') @_annotation_Creates_SerializedScriptValue
-  IDBRequest _get_1(IDBKeyRange key) native "get";
+  IDBRequest _get_1(IDBKeyRange key) native;
+  @JSName('get')
   @Returns('IDBRequest') @Creates('IDBRequest') @_annotation_Creates_SerializedScriptValue
-  IDBRequest _get_2(key) native "get";
+  IDBRequest _get_2(key) native;
 
   /// @domName IDBIndex.getKey; @docsEditable true
   IDBRequest getKey(key) {
@@ -10323,10 +9744,12 @@
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
+  @JSName('getKey')
   @Returns('IDBRequest') @Creates('IDBRequest') @_annotation_Creates_SerializedScriptValue @Creates('IDBObjectStore')
-  IDBRequest _getKey_1(IDBKeyRange key) native "getKey";
+  IDBRequest _getKey_1(IDBKeyRange key) native;
+  @JSName('getKey')
   @Returns('IDBRequest') @Creates('IDBRequest') @_annotation_Creates_SerializedScriptValue @Creates('IDBObjectStore')
-  IDBRequest _getKey_2(key) native "getKey";
+  IDBRequest _getKey_2(key) native;
 
   /// @domName IDBIndex.openCursor; @docsEditable true
   IDBRequest openCursor([key_OR_range, String direction]) {
@@ -10352,16 +9775,21 @@
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
+  @JSName('openCursor')
   @Returns('IDBRequest') @Creates('IDBRequest') @Creates('IDBCursor')
-  IDBRequest _openCursor_1() native "openCursor";
+  IDBRequest _openCursor_1() native;
+  @JSName('openCursor')
   @Returns('IDBRequest') @Creates('IDBRequest') @Creates('IDBCursor')
-  IDBRequest _openCursor_2(IDBKeyRange range) native "openCursor";
+  IDBRequest _openCursor_2(IDBKeyRange range) native;
+  @JSName('openCursor')
   @Returns('IDBRequest') @Creates('IDBRequest') @Creates('IDBCursor')
-  IDBRequest _openCursor_3(IDBKeyRange range, direction) native "openCursor";
+  IDBRequest _openCursor_3(IDBKeyRange range, direction) native;
+  @JSName('openCursor')
   @Returns('IDBRequest') @Creates('IDBRequest') @Creates('IDBCursor')
-  IDBRequest _openCursor_4(key) native "openCursor";
+  IDBRequest _openCursor_4(key) native;
+  @JSName('openCursor')
   @Returns('IDBRequest') @Creates('IDBRequest') @Creates('IDBCursor')
-  IDBRequest _openCursor_5(key, direction) native "openCursor";
+  IDBRequest _openCursor_5(key, direction) native;
 
   /// @domName IDBIndex.openKeyCursor; @docsEditable true
   IDBRequest openKeyCursor([key_OR_range, String direction]) {
@@ -10387,16 +9815,21 @@
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
+  @JSName('openKeyCursor')
   @Returns('IDBRequest') @Creates('IDBRequest') @Creates('IDBCursor')
-  IDBRequest _openKeyCursor_1() native "openKeyCursor";
+  IDBRequest _openKeyCursor_1() native;
+  @JSName('openKeyCursor')
   @Returns('IDBRequest') @Creates('IDBRequest') @Creates('IDBCursor')
-  IDBRequest _openKeyCursor_2(IDBKeyRange range) native "openKeyCursor";
+  IDBRequest _openKeyCursor_2(IDBKeyRange range) native;
+  @JSName('openKeyCursor')
   @Returns('IDBRequest') @Creates('IDBRequest') @Creates('IDBCursor')
-  IDBRequest _openKeyCursor_3(IDBKeyRange range, direction) native "openKeyCursor";
+  IDBRequest _openKeyCursor_3(IDBKeyRange range, direction) native;
+  @JSName('openKeyCursor')
   @Returns('IDBRequest') @Creates('IDBRequest') @Creates('IDBCursor')
-  IDBRequest _openKeyCursor_4(key) native "openKeyCursor";
+  IDBRequest _openKeyCursor_4(key) native;
+  @JSName('openKeyCursor')
   @Returns('IDBRequest') @Creates('IDBRequest') @Creates('IDBCursor')
-  IDBRequest _openKeyCursor_5(key, direction) native "openKeyCursor";
+  IDBRequest _openKeyCursor_5(key, direction) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -10411,6 +9844,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
+/// @domName IDBKeyRange
 class IDBKeyRange native "*IDBKeyRange" {
   /**
    * @domName IDBKeyRange.only
@@ -10441,14 +9875,16 @@
 
   /// @domName IDBKeyRange.lower; @docsEditable true
   dynamic get lower => _convertNativeToDart_IDBKey(this._lower);
-  dynamic get _lower => JS("dynamic", "#.lower", this);
+  @JSName('lower')
+  final dynamic _lower;
 
   /// @domName IDBKeyRange.lowerOpen; @docsEditable true
   final bool lowerOpen;
 
   /// @domName IDBKeyRange.upper; @docsEditable true
   dynamic get upper => _convertNativeToDart_IDBKey(this._upper);
-  dynamic get _upper => JS("dynamic", "#.upper", this);
+  @JSName('upper')
+  final dynamic _upper;
 
   /// @domName IDBKeyRange.upperOpen; @docsEditable true
   final bool upperOpen;
@@ -10469,9 +9905,12 @@
     var upper_6 = _convertDartToNative_IDBKey(upper);
     return _bound__3(lower_5, upper_6);
   }
-  static IDBKeyRange _bound__1(lower, upper, lowerOpen, upperOpen) native "bound";
-  static IDBKeyRange _bound__2(lower, upper, lowerOpen) native "bound";
-  static IDBKeyRange _bound__3(lower, upper) native "bound";
+  @JSName('bound')
+  static IDBKeyRange _bound__1(lower, upper, lowerOpen, upperOpen) native;
+  @JSName('bound')
+  static IDBKeyRange _bound__2(lower, upper, lowerOpen) native;
+  @JSName('bound')
+  static IDBKeyRange _bound__3(lower, upper) native;
 
   /// @domName IDBKeyRange.lowerBound_; @docsEditable true
   static IDBKeyRange lowerBound_(/*IDBKey*/ bound, [bool open]) {
@@ -10482,15 +9921,18 @@
     var bound_2 = _convertDartToNative_IDBKey(bound);
     return _lowerBound__2(bound_2);
   }
-  static IDBKeyRange _lowerBound__1(bound, open) native "lowerBound";
-  static IDBKeyRange _lowerBound__2(bound) native "lowerBound";
+  @JSName('lowerBound')
+  static IDBKeyRange _lowerBound__1(bound, open) native;
+  @JSName('lowerBound')
+  static IDBKeyRange _lowerBound__2(bound) native;
 
   /// @domName IDBKeyRange.only_; @docsEditable true
   static IDBKeyRange only_(/*IDBKey*/ value) {
     var value_1 = _convertDartToNative_IDBKey(value);
     return _only__1(value_1);
   }
-  static IDBKeyRange _only__1(value) native "only";
+  @JSName('only')
+  static IDBKeyRange _only__1(value) native;
 
   /// @domName IDBKeyRange.upperBound_; @docsEditable true
   static IDBKeyRange upperBound_(/*IDBKey*/ bound, [bool open]) {
@@ -10501,8 +9943,10 @@
     var bound_2 = _convertDartToNative_IDBKey(bound);
     return _upperBound__2(bound_2);
   }
-  static IDBKeyRange _upperBound__1(bound, open) native "upperBound";
-  static IDBKeyRange _upperBound__2(bound) native "upperBound";
+  @JSName('upperBound')
+  static IDBKeyRange _upperBound__1(bound, open) native;
+  @JSName('upperBound')
+  static IDBKeyRange _upperBound__2(bound) native;
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -10539,10 +9983,12 @@
     var value_3 = _convertDartToNative_SerializedScriptValue(value);
     return _add_2(value_3);
   }
+  @JSName('add')
   @Returns('IDBRequest') @Creates('IDBRequest') @_annotation_Creates_IDBKey
-  IDBRequest _add_1(value, key) native "add";
+  IDBRequest _add_1(value, key) native;
+  @JSName('add')
   @Returns('IDBRequest') @Creates('IDBRequest') @_annotation_Creates_IDBKey
-  IDBRequest _add_2(value) native "add";
+  IDBRequest _add_2(value) native;
 
   /// @domName IDBObjectStore.clear; @docsEditable true
   IDBRequest clear() native;
@@ -10561,9 +10007,12 @@
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
-  IDBRequest _count_1() native "count";
-  IDBRequest _count_2(IDBKeyRange range) native "count";
-  IDBRequest _count_3(key) native "count";
+  @JSName('count')
+  IDBRequest _count_1() native;
+  @JSName('count')
+  IDBRequest _count_2(IDBKeyRange range) native;
+  @JSName('count')
+  IDBRequest _count_3(key) native;
 
   /// @domName IDBObjectStore.createIndex; @docsEditable true
   IDBIndex createIndex(String name, keyPath, [Map options]) {
@@ -10587,10 +10036,14 @@
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
-  IDBIndex _createIndex_1(name, List keyPath) native "createIndex";
-  IDBIndex _createIndex_2(name, List keyPath, options) native "createIndex";
-  IDBIndex _createIndex_3(name, String keyPath) native "createIndex";
-  IDBIndex _createIndex_4(name, String keyPath, options) native "createIndex";
+  @JSName('createIndex')
+  IDBIndex _createIndex_1(name, List keyPath) native;
+  @JSName('createIndex')
+  IDBIndex _createIndex_2(name, List keyPath, options) native;
+  @JSName('createIndex')
+  IDBIndex _createIndex_3(name, String keyPath) native;
+  @JSName('createIndex')
+  IDBIndex _createIndex_4(name, String keyPath, options) native;
 
   /// @domName IDBObjectStore.delete; @docsEditable true
   IDBRequest delete(key_OR_keyRange) {
@@ -10603,8 +10056,10 @@
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
-  IDBRequest _delete_1(IDBKeyRange keyRange) native "delete";
-  IDBRequest _delete_2(key) native "delete";
+  @JSName('delete')
+  IDBRequest _delete_1(IDBKeyRange keyRange) native;
+  @JSName('delete')
+  IDBRequest _delete_2(key) native;
 
   /// @domName IDBObjectStore.deleteIndex; @docsEditable true
   void deleteIndex(String name) native;
@@ -10620,10 +10075,12 @@
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
+  @JSName('get')
   @Returns('IDBRequest') @Creates('IDBRequest') @_annotation_Creates_SerializedScriptValue
-  IDBRequest _getObject_1(IDBKeyRange key) native "get";
+  IDBRequest _getObject_1(IDBKeyRange key) native;
+  @JSName('get')
   @Returns('IDBRequest') @Creates('IDBRequest') @_annotation_Creates_SerializedScriptValue
-  IDBRequest _getObject_2(key) native "get";
+  IDBRequest _getObject_2(key) native;
 
   /// @domName IDBObjectStore.index; @docsEditable true
   IDBIndex index(String name) native;
@@ -10652,16 +10109,21 @@
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
+  @JSName('openCursor')
   @Returns('IDBRequest') @Creates('IDBRequest') @Creates('IDBCursor')
-  IDBRequest _openCursor_1() native "openCursor";
+  IDBRequest _openCursor_1() native;
+  @JSName('openCursor')
   @Returns('IDBRequest') @Creates('IDBRequest') @Creates('IDBCursor')
-  IDBRequest _openCursor_2(IDBKeyRange range) native "openCursor";
+  IDBRequest _openCursor_2(IDBKeyRange range) native;
+  @JSName('openCursor')
   @Returns('IDBRequest') @Creates('IDBRequest') @Creates('IDBCursor')
-  IDBRequest _openCursor_3(IDBKeyRange range, direction) native "openCursor";
+  IDBRequest _openCursor_3(IDBKeyRange range, direction) native;
+  @JSName('openCursor')
   @Returns('IDBRequest') @Creates('IDBRequest') @Creates('IDBCursor')
-  IDBRequest _openCursor_4(key) native "openCursor";
+  IDBRequest _openCursor_4(key) native;
+  @JSName('openCursor')
   @Returns('IDBRequest') @Creates('IDBRequest') @Creates('IDBCursor')
-  IDBRequest _openCursor_5(key, direction) native "openCursor";
+  IDBRequest _openCursor_5(key, direction) native;
 
   /// @domName IDBObjectStore.put; @docsEditable true
   IDBRequest put(/*any*/ value, [/*IDBKey*/ key]) {
@@ -10673,10 +10135,12 @@
     var value_3 = _convertDartToNative_SerializedScriptValue(value);
     return _put_2(value_3);
   }
+  @JSName('put')
   @Returns('IDBRequest') @Creates('IDBRequest') @_annotation_Creates_IDBKey
-  IDBRequest _put_1(value, key) native "put";
+  IDBRequest _put_1(value, key) native;
+  @JSName('put')
   @Returns('IDBRequest') @Creates('IDBRequest') @_annotation_Creates_IDBKey
-  IDBRequest _put_2(value) native "put";
+  IDBRequest _put_2(value) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -10721,7 +10185,9 @@
 
   /// @domName IDBRequest.result; @docsEditable true
   dynamic get result => _convertNativeToDart_IDBAny(this._result);
-  dynamic get _result => JS("dynamic", "#.result", this);
+  @JSName('result')
+  @Creates('Null')
+  final dynamic _result;
 
   /// @domName IDBRequest.source; @docsEditable true
   @Creates('Null')
@@ -10734,13 +10200,16 @@
   final String webkitErrorMessage;
 
   /// @domName IDBRequest.addEventListener; @docsEditable true
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+  @JSName('addEventListener')
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   /// @domName IDBRequest.dispatchEvent; @docsEditable true
-  bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
+  @JSName('dispatchEvent')
+  bool $dom_dispatchEvent(Event evt) native;
 
   /// @domName IDBRequest.removeEventListener; @docsEditable true
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+  @JSName('removeEventListener')
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 }
 
 class IDBRequestEvents extends Events {
@@ -10781,16 +10250,19 @@
   void abort() native;
 
   /// @domName IDBTransaction.addEventListener; @docsEditable true
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+  @JSName('addEventListener')
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   /// @domName IDBTransaction.dispatchEvent; @docsEditable true
-  bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
+  @JSName('dispatchEvent')
+  bool $dom_dispatchEvent(Event evt) native;
 
   /// @domName IDBTransaction.objectStore; @docsEditable true
   IDBObjectStore objectStore(String name) native;
 
   /// @domName IDBTransaction.removeEventListener; @docsEditable true
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+  @JSName('removeEventListener')
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 }
 
 class IDBTransactionEvents extends Events {
@@ -10860,7 +10332,9 @@
 
   /// @domName HTMLIFrameElement.contentWindow; @docsEditable true
   Window get contentWindow => _convertNativeToDart_Window(this._contentWindow);
-  dynamic get _contentWindow => JS("dynamic", "#.contentWindow", this);
+  @JSName('contentWindow')
+  @Creates('LocalWindow|=Object') @Returns('LocalWindow|=Object')
+  final dynamic _contentWindow;
 
   /// @domName HTMLIFrameElement.frameBorder; @docsEditable true
   String frameBorder;
@@ -11089,7 +10563,7 @@
   bool indeterminate;
 
   /// @domName HTMLInputElement.labels; @docsEditable true
-  @Returns('_NodeList') @Creates('_NodeList')
+  @Returns('NodeList') @Creates('NodeList')
   final List<Node> labels;
 
   /// @domName HTMLInputElement.list; @docsEditable true
@@ -11312,7 +10786,8 @@
   // -- end List<int> mixins.
 
   /// @domName Int16Array.setElements; @docsEditable true
-  void setElements(Object array, [int offset]) native "set";
+  @JSName('set')
+  void setElements(Object array, [int offset]) native;
 
   /// @domName Int16Array.subarray; @docsEditable true
   Int16Array subarray(int start, [int end]) native;
@@ -11422,7 +10897,8 @@
   // -- end List<int> mixins.
 
   /// @domName Int32Array.setElements; @docsEditable true
-  void setElements(Object array, [int offset]) native "set";
+  @JSName('set')
+  void setElements(Object array, [int offset]) native;
 
   /// @domName Int32Array.subarray; @docsEditable true
   Int32Array subarray(int start, [int end]) native;
@@ -11532,7 +11008,8 @@
   // -- end List<int> mixins.
 
   /// @domName Int8Array.setElements; @docsEditable true
-  void setElements(Object array, [int offset]) native "set";
+  @JSName('set')
+  void setElements(Object array, [int offset]) native;
 
   /// @domName Int8Array.subarray; @docsEditable true
   Int8Array subarray(int start, [int end]) native;
@@ -11596,6 +11073,36 @@
 /// @domName KeyboardEvent; @docsEditable true
 class KeyboardEvent extends UIEvent native "*KeyboardEvent" {
 
+  factory KeyboardEvent(String type, Window view,
+      [bool canBubble = true, bool cancelable = true, 
+      String keyIdentifier = null, int keyLocation = 1, bool ctrlKey = false,
+      bool altKey = false, bool shiftKey = false, bool metaKey = false,
+      bool altGraphKey = false]) {
+    final e = document.$dom_createEvent("KeyboardEvent");
+    e.$dom_initKeyboardEvent(type, canBubble, cancelable, view, keyIdentifier,
+        keyLocation, ctrlKey, altKey, shiftKey, metaKey, altGraphKey);
+    return e;
+  }
+
+  /** @domName KeyboardEvent.initKeyboardEvent */
+  void $dom_initKeyboardEvent(String type, bool canBubble, bool cancelable,
+      LocalWindow view, String keyIdentifier, int keyLocation, bool ctrlKey,
+      bool altKey, bool shiftKey, bool metaKey, bool altGraphKey) {
+    // initKeyEvent is the call in Firefox, initKeyboardEvent for all other
+    // browsers.
+    var function = JS('dynamic', '#.initKeyboardEvent || #.initKeyEvent', this,
+        this);
+    JS('void', '#(#, #, #, #, #, #, #, #, #, #, #)', function, type,
+        canBubble, cancelable, view, keyIdentifier, keyLocation, ctrlKey,
+        altKey, shiftKey, metaKey, altGraphKey);
+  }
+
+  /** @domName KeyboardEvent.keyCode */
+  int get keyCode => $dom_keyCode;
+
+  /** @domName KeyboardEvent.charCode */
+  int get charCode => $dom_charCode;
+
   /// @domName KeyboardEvent.altGraphKey; @docsEditable true
   final bool altGraphKey;
 
@@ -11606,7 +11113,8 @@
   final bool ctrlKey;
 
   /// @domName KeyboardEvent.keyIdentifier; @docsEditable true
-  final String keyIdentifier;
+  @JSName('keyIdentifier')
+  final String $dom_keyIdentifier;
 
   /// @domName KeyboardEvent.keyLocation; @docsEditable true
   final int keyLocation;
@@ -11617,8 +11125,6 @@
   /// @domName KeyboardEvent.shiftKey; @docsEditable true
   final bool shiftKey;
 
-  /// @domName KeyboardEvent.initKeyboardEvent; @docsEditable true
-  void initKeyboardEvent(String type, bool canBubble, bool cancelable, LocalWindow view, String keyIdentifier, int keyLocation, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, bool altGraphKey) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -11646,7 +11152,7 @@
   String keytype;
 
   /// @domName HTMLKeygenElement.labels; @docsEditable true
-  @Returns('_NodeList') @Creates('_NodeList')
+  @Returns('NodeList') @Creates('NodeList')
   final List<Node> labels;
 
   /// @domName HTMLKeygenElement.name; @docsEditable true
@@ -11776,7 +11282,10 @@
   final int length;
 
   /// @domName History.state; @docsEditable true
-  final dynamic state;
+  dynamic get state => _convertNativeToDart_SerializedScriptValue(this._state);
+  @JSName('state')
+  @_annotation_Creates_SerializedScriptValue @_annotation_Returns_SerializedScriptValue
+  final dynamic _state;
 
   /// @domName History.back; @docsEditable true
   void back() native;
@@ -11860,6 +11369,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
+/// @domName Window
 class LocalWindow extends EventTarget implements Window native "@*DOMWindow" {
 
   Document get document => JS('Document', '#.document', this);
@@ -11880,7 +11390,7 @@
   // API level getter and setter for Location.
   // TODO: The cross domain safe wrapper can be inserted here or folded into
   // _LocationWrapper.
-  LocalLocation get location() {
+  LocalLocation get location {
     // Firefox work-around for Location.  The Firefox location object cannot be
     // made to behave like a Dart object so must be wrapped.
     var result = _location;
@@ -11913,7 +11423,8 @@
   }
   // Prevent compiled from thinking 'location' property is available for a Dart
   // member.
-  _protect_location() native 'location';
+  @JSName('location')
+  _protect_location() native;
 
   static _isDartLocation(thing) {
     // On Firefox the code that implements 'is Location' fails to find the patch
@@ -11945,11 +11456,11 @@
     _cancelAnimationFrame(id);
   }
 
-  int _requestAnimationFrame(RequestAnimationFrameCallback callback)
-      native 'requestAnimationFrame';
+  @JSName('requestAnimationFrame')
+  int _requestAnimationFrame(RequestAnimationFrameCallback callback) native;
 
-  void _cancelAnimationFrame(int id)
-      native 'cancelAnimationFrame';
+  @JSName('cancelAnimationFrame')
+  void _cancelAnimationFrame(int id) native;
 
   _ensureRequestAnimationFrame() {
     if (JS('bool',
@@ -11977,7 +11488,7 @@
        this);
   }
 
-  IDBFactory get indexedDB() =>
+  IDBFactory get indexedDB =>
       JS('IDBFactory',
          '#.indexedDB || #.webkitIndexedDB || #.mozIndexedDB',
          this, this, this);
@@ -12063,7 +11574,9 @@
 
   /// @domName Window.opener; @docsEditable true
   Window get opener => _convertNativeToDart_Window(this._opener);
-  dynamic get _opener => JS("dynamic", "#.opener", this);
+  @JSName('opener')
+  @Creates('LocalWindow|=Object') @Returns('LocalWindow|=Object')
+  final dynamic _opener;
 
   /// @domName Window.outerHeight; @docsEditable true
   final int outerHeight;
@@ -12082,7 +11595,9 @@
 
   /// @domName Window.parent; @docsEditable true
   Window get parent => _convertNativeToDart_Window(this._parent);
-  dynamic get _parent => JS("dynamic", "#.parent", this);
+  @JSName('parent')
+  @Creates('LocalWindow|=Object') @Returns('LocalWindow|=Object')
+  final dynamic _parent;
 
   /// @domName Window.performance; @docsEditable true
   final Performance performance;
@@ -12116,7 +11631,9 @@
 
   /// @domName Window.self; @docsEditable true
   Window get self => _convertNativeToDart_Window(this._self);
-  dynamic get _self => JS("dynamic", "#.self", this);
+  @JSName('self')
+  @Creates('LocalWindow|=Object') @Returns('LocalWindow|=Object')
+  final dynamic _self;
 
   /// @domName Window.sessionStorage; @docsEditable true
   final Storage sessionStorage;
@@ -12135,7 +11652,9 @@
 
   /// @domName Window.top; @docsEditable true
   Window get top => _convertNativeToDart_Window(this._top);
-  dynamic get _top => JS("dynamic", "#.top", this);
+  @JSName('top')
+  @Creates('LocalWindow|=Object') @Returns('LocalWindow|=Object')
+  final dynamic _top;
 
   /// @domName DOMWindow.webkitIndexedDB; @docsEditable true
   final IDBFactory webkitIndexedDB;
@@ -12148,10 +11667,13 @@
 
   /// @domName Window.window; @docsEditable true
   Window get window => _convertNativeToDart_Window(this._window);
-  dynamic get _window => JS("dynamic", "#.window", this);
+  @JSName('window')
+  @Creates('LocalWindow|=Object') @Returns('LocalWindow|=Object')
+  final dynamic _window;
 
   /// @domName Window.addEventListener; @docsEditable true
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+  @JSName('addEventListener')
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   /// @domName Window.alert; @docsEditable true
   void alert(String message) native;
@@ -12178,17 +11700,20 @@
   bool confirm(String message) native;
 
   /// @domName Window.dispatchEvent; @docsEditable true
-  bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
+  @JSName('dispatchEvent')
+  bool $dom_dispatchEvent(Event evt) native;
 
   /// @domName Window.find; @docsEditable true
   bool find(String string, bool caseSensitive, bool backwards, bool wrap, bool wholeWord, bool searchInFrames, bool showDialog) native;
 
   /// @domName Window.getComputedStyle; @docsEditable true
-  CSSStyleDeclaration $dom_getComputedStyle(Element element, String pseudoElement) native "getComputedStyle";
+  @JSName('getComputedStyle')
+  CSSStyleDeclaration $dom_getComputedStyle(Element element, String pseudoElement) native;
 
   /// @domName Window.getMatchedCSSRules; @docsEditable true
+  @JSName('getMatchedCSSRules')
   @Returns('_CSSRuleList') @Creates('_CSSRuleList')
-  List<CSSRule> getMatchedCSSRules(Element element, String pseudoElement) native;
+  List<CSSRule> getMatchedCssRules(Element element, String pseudoElement) native;
 
   /// @domName Window.getSelection; @docsEditable true
   DOMSelection getSelection() native;
@@ -12221,8 +11746,10 @@
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
-  void _postMessage_1(message, targetOrigin) native "postMessage";
-  void _postMessage_2(message, targetOrigin, List messagePorts) native "postMessage";
+  @JSName('postMessage')
+  void _postMessage_1(message, targetOrigin) native;
+  @JSName('postMessage')
+  void _postMessage_2(message, targetOrigin, List messagePorts) native;
 
   /// @domName Window.print; @docsEditable true
   void print() native;
@@ -12231,7 +11758,8 @@
   void releaseEvents() native;
 
   /// @domName Window.removeEventListener; @docsEditable true
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+  @JSName('removeEventListener')
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   /// @domName Window.resizeBy; @docsEditable true
   void resizeBy(num x, num y) native;
@@ -12270,7 +11798,8 @@
   void webkitRequestFileSystem(int type, int size, FileSystemCallback successCallback, [ErrorCallback errorCallback]) native;
 
   /// @domName DOMWindow.webkitResolveLocalFileSystemURL; @docsEditable true
-  void webkitResolveLocalFileSystemURL(String url, EntryCallback successCallback, [ErrorCallback errorCallback]) native;
+  @JSName('webkitResolveLocalFileSystemURL')
+  void webkitResolveLocalFileSystemUrl(String url, EntryCallback successCallback, [ErrorCallback errorCallback]) native;
 
 }
 
@@ -12527,10 +12056,12 @@
   num volume;
 
   /// @domName MediaController.addEventListener; @docsEditable true
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+  @JSName('addEventListener')
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   /// @domName MediaController.dispatchEvent; @docsEditable true
-  bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
+  @JSName('dispatchEvent')
+  bool $dom_dispatchEvent(Event evt) native;
 
   /// @domName MediaController.pause; @docsEditable true
   void pause() native;
@@ -12539,7 +12070,8 @@
   void play() native;
 
   /// @domName MediaController.removeEventListener; @docsEditable true
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+  @JSName('removeEventListener')
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -12750,17 +12282,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName MediaElementAudioSourceNode; @docsEditable true
-class MediaElementAudioSourceNode extends AudioSourceNode native "*MediaElementAudioSourceNode" {
-
-  /// @domName MediaElementAudioSourceNode.mediaElement; @docsEditable true
-  final MediaElement mediaElement;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
 /// @domName MediaError; @docsEditable true
 class MediaError native "*MediaError" {
 
@@ -12809,7 +12330,8 @@
 class MediaKeyEvent extends Event native "*MediaKeyEvent" {
 
   /// @domName MediaKeyEvent.defaultURL; @docsEditable true
-  final String defaultURL;
+  @JSName('defaultURL')
+  final String defaultUrl;
 
   /// @domName MediaKeyEvent.errorCode; @docsEditable true
   final MediaKeyError errorCode;
@@ -12906,19 +12428,22 @@
   final SourceBufferList sourceBuffers;
 
   /// @domName MediaSource.addEventListener; @docsEditable true
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+  @JSName('addEventListener')
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   /// @domName MediaSource.addSourceBuffer; @docsEditable true
   SourceBuffer addSourceBuffer(String type) native;
 
   /// @domName MediaSource.dispatchEvent; @docsEditable true
-  bool $dom_dispatchEvent(Event event) native "dispatchEvent";
+  @JSName('dispatchEvent')
+  bool $dom_dispatchEvent(Event event) native;
 
   /// @domName MediaSource.endOfStream; @docsEditable true
   void endOfStream(String error) native;
 
   /// @domName MediaSource.removeEventListener; @docsEditable true
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+  @JSName('removeEventListener')
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   /// @domName MediaSource.removeSourceBuffer; @docsEditable true
   void removeSourceBuffer(SourceBuffer buffer) native;
@@ -12954,13 +12479,16 @@
   final MediaStreamTrackList videoTracks;
 
   /// @domName MediaStream.addEventListener; @docsEditable true
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+  @JSName('addEventListener')
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   /// @domName MediaStream.dispatchEvent; @docsEditable true
-  bool $dom_dispatchEvent(Event event) native "dispatchEvent";
+  @JSName('dispatchEvent')
+  bool $dom_dispatchEvent(Event event) native;
 
   /// @domName MediaStream.removeEventListener; @docsEditable true
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+  @JSName('removeEventListener')
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 }
 
 class MediaStreamEvents extends Events {
@@ -12973,17 +12501,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName MediaStreamAudioSourceNode; @docsEditable true
-class MediaStreamAudioSourceNode extends AudioSourceNode native "*MediaStreamAudioSourceNode" {
-
-  /// @domName MediaStreamAudioSourceNode.mediaStream; @docsEditable true
-  final MediaStream mediaStream;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
 /// @domName MediaStreamEvent; @docsEditable true
 class MediaStreamEvent extends Event native "*MediaStreamEvent" {
 
@@ -13021,13 +12538,16 @@
   final int readyState;
 
   /// @domName MediaStreamTrack.addEventListener; @docsEditable true
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+  @JSName('addEventListener')
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   /// @domName MediaStreamTrack.dispatchEvent; @docsEditable true
-  bool $dom_dispatchEvent(Event event) native "dispatchEvent";
+  @JSName('dispatchEvent')
+  bool $dom_dispatchEvent(Event event) native;
 
   /// @domName MediaStreamTrack.removeEventListener; @docsEditable true
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+  @JSName('removeEventListener')
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 }
 
 class MediaStreamTrackEvents extends Events {
@@ -13069,10 +12589,12 @@
   void add(MediaStreamTrack track) native;
 
   /// @domName MediaStreamTrackList.addEventListener; @docsEditable true
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+  @JSName('addEventListener')
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   /// @domName MediaStreamTrackList.dispatchEvent; @docsEditable true
-  bool $dom_dispatchEvent(Event event) native "dispatchEvent";
+  @JSName('dispatchEvent')
+  bool $dom_dispatchEvent(Event event) native;
 
   /// @domName MediaStreamTrackList.item; @docsEditable true
   MediaStreamTrack item(int index) native;
@@ -13081,7 +12603,8 @@
   void remove(MediaStreamTrack track) native;
 
   /// @domName MediaStreamTrackList.removeEventListener; @docsEditable true
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+  @JSName('removeEventListener')
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 }
 
 class MediaStreamTrackListEvents extends Events {
@@ -13113,13 +12636,20 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
+/**
+ * An HTML <menu> element.
+ *
+ * A <menu> element represents an unordered list of menu commands.
+ *
+ * See also:
+ *
+ *  * [Menu Element](https://developer.mozilla.org/en-US/docs/HTML/Element/menu) from MDN.
+ *  * [Menu Element](http://www.w3.org/TR/html5/the-menu-element.html#the-menu-element) from the W3C.
+ */
 /// @domName HTMLMenuElement; @docsEditable true
 class MenuElement extends Element implements Element native "*HTMLMenuElement" {
 
   factory MenuElement() => document.$dom_createElement("menu");
-
-  /// @domName HTMLMenuElement.compact; @docsEditable true
-  bool compact;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -13147,7 +12677,9 @@
 
   /// @domName MessageEvent.data; @docsEditable true
   dynamic get data => _convertNativeToDart_SerializedScriptValue(this._data);
-  dynamic get _data => JS("dynamic", "#.data", this);
+  @JSName('data')
+  @_annotation_Creates_SerializedScriptValue @_annotation_Returns_SerializedScriptValue
+  final dynamic _data;
 
   /// @domName MessageEvent.lastEventId; @docsEditable true
   final String lastEventId;
@@ -13161,7 +12693,9 @@
 
   /// @domName MessageEvent.source; @docsEditable true
   Window get source => _convertNativeToDart_Window(this._source);
-  dynamic get _source => JS("dynamic", "#.source", this);
+  @JSName('source')
+  @Creates('LocalWindow|=Object') @Returns('LocalWindow|=Object')
+  final dynamic _source;
 
   /// @domName MessageEvent.initMessageEvent; @docsEditable true
   void initMessageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object dataArg, String originArg, String lastEventIdArg, LocalWindow sourceArg, List messagePorts) native;
@@ -13182,13 +12716,15 @@
     new MessagePortEvents(this);
 
   /// @domName MessagePort.addEventListener; @docsEditable true
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+  @JSName('addEventListener')
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   /// @domName MessagePort.close; @docsEditable true
   void close() native;
 
   /// @domName MessagePort.dispatchEvent; @docsEditable true
-  bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
+  @JSName('dispatchEvent')
+  bool $dom_dispatchEvent(Event evt) native;
 
   /// @domName MessagePort.postMessage; @docsEditable true
   void postMessage(/*any*/ message, [List messagePorts]) {
@@ -13201,11 +12737,14 @@
     _postMessage_2(message_2);
     return;
   }
-  void _postMessage_1(message, List messagePorts) native "postMessage";
-  void _postMessage_2(message) native "postMessage";
+  @JSName('postMessage')
+  void _postMessage_1(message, List messagePorts) native;
+  @JSName('postMessage')
+  void _postMessage_2(message) native;
 
   /// @domName MessagePort.removeEventListener; @docsEditable true
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+  @JSName('removeEventListener')
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   /// @domName MessagePort.start; @docsEditable true
   void start() native;
@@ -13272,7 +12811,7 @@
   num high;
 
   /// @domName HTMLMeterElement.labels; @docsEditable true
-  @Returns('_NodeList') @Creates('_NodeList')
+  @Returns('NodeList') @Creates('NodeList')
   final List<Node> labels;
 
   /// @domName HTMLMeterElement.low; @docsEditable true
@@ -13309,6 +12848,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
+/// @domName MouseEvent
 class MouseEvent extends UIEvent native "*MouseEvent" {
   factory MouseEvent(String type, Window view, int detail, int screenX,
       int screenY, int clientX, int clientY, int button, [bool canBubble = true,
@@ -13347,7 +12887,9 @@
 
   /// @domName MouseEvent.relatedTarget; @docsEditable true
   EventTarget get relatedTarget => _convertNativeToDart_EventTarget(this._relatedTarget);
-  dynamic get _relatedTarget => JS("dynamic", "#.relatedTarget", this);
+  @JSName('relatedTarget')
+  @Creates('EventTarget|=Object') @Returns('EventTarget|=Object')
+  final dynamic _relatedTarget;
 
   /// @domName MouseEvent.screenX; @docsEditable true
   final int screenX;
@@ -13379,7 +12921,8 @@
     _$dom_initMouseEvent_1(type, canBubble, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget_1);
     return;
   }
-  void _$dom_initMouseEvent_1(type, canBubble, cancelable, LocalWindow view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget) native "initMouseEvent";
+  @JSName('initMouseEvent')
+  void _$dom_initMouseEvent_1(type, canBubble, cancelable, LocalWindow view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget) native;
 
 
   int get offsetX {
@@ -13455,6 +12998,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
+/// @domName MutationObserver
 class MutationObserver native "*MutationObserver" {
 
   factory MutationObserver(MutationCallback callback) => _MutationObserverFactoryProvider.createMutationObserver(callback);
@@ -13468,7 +13012,8 @@
     __observe_1(target, options_1);
     return;
   }
-  void __observe_1(Node target, options) native "observe";
+  @JSName('observe')
+  void __observe_1(Node target, options) native;
 
   /// @domName MutationObserver.takeRecords; @docsEditable true
   List<MutationRecord> takeRecords() native;
@@ -13532,7 +13077,8 @@
   static _fixupList(list) => list;  // TODO: Ensure is a JavaScript Array.
 
   // Call native function with no conversions.
-  void _call(target, options) native 'observe';
+  @JSName('observe')
+  void _call(target, options) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -13543,7 +13089,7 @@
 class MutationRecord native "*MutationRecord" {
 
   /// @domName MutationRecord.addedNodes; @docsEditable true
-  @Returns('_NodeList') @Creates('_NodeList')
+  @Returns('NodeList') @Creates('NodeList')
   final List<Node> addedNodes;
 
   /// @domName MutationRecord.attributeName; @docsEditable true
@@ -13562,7 +13108,7 @@
   final Node previousSibling;
 
   /// @domName MutationRecord.removedNodes; @docsEditable true
-  @Returns('_NodeList') @Creates('_NodeList')
+  @Returns('NodeList') @Creates('NodeList')
   final List<Node> removedNodes;
 
   /// @domName MutationRecord.target; @docsEditable true
@@ -13765,8 +13311,10 @@
     _webkitGetUserMedia_2(options_2, successCallback);
     return;
   }
-  void _webkitGetUserMedia_1(options, NavigatorUserMediaSuccessCallback successCallback, NavigatorUserMediaErrorCallback errorCallback) native "webkitGetUserMedia";
-  void _webkitGetUserMedia_2(options, NavigatorUserMediaSuccessCallback successCallback) native "webkitGetUserMedia";
+  @JSName('webkitGetUserMedia')
+  void _webkitGetUserMedia_1(options, NavigatorUserMediaSuccessCallback successCallback, NavigatorUserMediaErrorCallback errorCallback) native;
+  @JSName('webkitGetUserMedia')
+  void _webkitGetUserMedia_2(options, NavigatorUserMediaSuccessCallback successCallback) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -13905,6 +13453,7 @@
   Node operator[](int index) => _this.$dom_childNodes[index];
 }
 
+/// @domName Node
 class Node extends EventTarget native "*Node" {
   _ChildNodeListLazy get nodes {
     return new _ChildNodeListLazy(this);
@@ -13985,54 +13534,71 @@
   static const int TEXT_NODE = 3;
 
   /// @domName Node.attributes; @docsEditable true
-  NamedNodeMap get $dom_attributes => JS("NamedNodeMap", "#.attributes", this);
+  @JSName('attributes')
+  final NamedNodeMap $dom_attributes;
 
   /// @domName Node.childNodes; @docsEditable true
-  List<Node> get $dom_childNodes => JS("_NodeList", "#.childNodes", this);
+  @JSName('childNodes')
+  @Returns('NodeList') @Creates('NodeList')
+  final List<Node> $dom_childNodes;
 
   /// @domName Node.firstChild; @docsEditable true
-  Node get $dom_firstChild => JS("Node", "#.firstChild", this);
+  @JSName('firstChild')
+  final Node $dom_firstChild;
 
   /// @domName Node.lastChild; @docsEditable true
-  Node get $dom_lastChild => JS("Node", "#.lastChild", this);
+  @JSName('lastChild')
+  final Node $dom_lastChild;
+
+  /// @domName Node.localName; @docsEditable true
+  @JSName('localName')
+  final String $dom_localName;
+
+  /// @domName Node.namespaceURI; @docsEditable true
+  @JSName('namespaceURI')
+  final String $dom_namespaceUri;
 
   /// @domName Node.nextSibling; @docsEditable true
-  Node get nextNode => JS("Node", "#.nextSibling", this);
+  @JSName('nextSibling')
+  final Node nextNode;
 
   /// @domName Node.nodeType; @docsEditable true
   final int nodeType;
 
   /// @domName Node.ownerDocument; @docsEditable true
-  Document get document => JS("Document", "#.ownerDocument", this);
+  @JSName('ownerDocument')
+  final Document document;
 
   /// @domName Node.parentNode; @docsEditable true
-  Node get parent => JS("Node", "#.parentNode", this);
+  @JSName('parentNode')
+  final Node parent;
 
   /// @domName Node.previousSibling; @docsEditable true
-  Node get previousNode => JS("Node", "#.previousSibling", this);
+  @JSName('previousSibling')
+  final Node previousNode;
 
   /// @domName Node.textContent; @docsEditable true
-  String get text => JS("String", "#.textContent", this);
-
-  /// @domName Node.textContent; @docsEditable true
-  void set text(String value) {
-    JS("void", "#.textContent = #", this, value);
-  }
+  @JSName('textContent')
+  String text;
 
   /// @domName Node.addEventListener; @docsEditable true
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+  @JSName('addEventListener')
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   /// @domName Node.appendChild; @docsEditable true
-  Node $dom_appendChild(Node newChild) native "appendChild";
+  @JSName('appendChild')
+  Node $dom_appendChild(Node newChild) native;
 
   /// @domName Node.cloneNode; @docsEditable true
-  Node clone(bool deep) native "cloneNode";
+  @JSName('cloneNode')
+  Node clone(bool deep) native;
 
   /// @domName Node.contains; @docsEditable true
   bool contains(Node other) native;
 
   /// @domName Node.dispatchEvent; @docsEditable true
-  bool $dom_dispatchEvent(Event event) native "dispatchEvent";
+  @JSName('dispatchEvent')
+  bool $dom_dispatchEvent(Event event) native;
 
   /// @domName Node.hasChildNodes; @docsEditable true
   bool hasChildNodes() native;
@@ -14041,13 +13607,16 @@
   Node insertBefore(Node newChild, Node refChild) native;
 
   /// @domName Node.removeChild; @docsEditable true
-  Node $dom_removeChild(Node oldChild) native "removeChild";
+  @JSName('removeChild')
+  Node $dom_removeChild(Node oldChild) native;
 
   /// @domName Node.removeEventListener; @docsEditable true
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+  @JSName('removeEventListener')
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   /// @domName Node.replaceChild; @docsEditable true
-  Node $dom_replaceChild(Node newChild, Node oldChild) native "replaceChild";
+  @JSName('replaceChild')
+  Node $dom_replaceChild(Node newChild, Node oldChild) native;
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14133,6 +13702,106 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
+/// @domName NodeList; @docsEditable true
+class NodeList implements JavaScriptIndexingBehavior, List<Node> native "*NodeList" {
+
+  /// @domName NodeList.length; @docsEditable true
+  final int length;
+
+  Node operator[](int index) => JS("Node", "#[#]", this, index);
+
+  void operator[]=(int index, Node value) {
+    throw new UnsupportedError("Cannot assign element of immutable List.");
+  }
+  // -- start List<Node> mixins.
+  // Node is the element type.
+
+  // From Iterable<Node>:
+
+  Iterator<Node> iterator() {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new FixedSizeListIterator<Node>(this);
+  }
+
+  // From Collection<Node>:
+
+  void add(Node value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addLast(Node value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addAll(Collection<Node> collection) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  bool contains(Node element) => _Collections.contains(this, element);
+
+  void forEach(void f(Node element)) => _Collections.forEach(this, f);
+
+  Collection map(f(Node element)) => _Collections.map(this, [], f);
+
+  Collection<Node> filter(bool f(Node element)) =>
+     _Collections.filter(this, <Node>[], f);
+
+  bool every(bool f(Node element)) => _Collections.every(this, f);
+
+  bool some(bool f(Node element)) => _Collections.some(this, f);
+
+  bool get isEmpty => this.length == 0;
+
+  // From List<Node>:
+
+  void sort([Comparator<Node> compare = Comparable.compare]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(Node element, [int start = 0]) =>
+      _Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(Node element, [int start]) {
+    if (start == null) start = length - 1;
+    return _Lists.lastIndexOf(this, element, start);
+  }
+
+  Node get first => this[0];
+
+  Node get last => this[length - 1];
+
+  Node removeLast() {
+    throw new UnsupportedError("Cannot removeLast on immutable List.");
+  }
+
+  void setRange(int start, int rangeLength, List<Node> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+
+  void insertRange(int start, int rangeLength, [Node initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+
+  List<Node> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <Node>[]);
+
+  // -- end List<Node> mixins.
+
+  /// @domName NodeList.item; @docsEditable true
+  @JSName('item')
+  Node _item(int index) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
 /// @domName Notation; @docsEditable true
 class Notation extends Node native "*Notation" {
 
@@ -14174,7 +13843,8 @@
   String tag;
 
   /// @domName Notification.addEventListener; @docsEditable true
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+  @JSName('addEventListener')
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   /// @domName Notification.cancel; @docsEditable true
   void cancel() native;
@@ -14183,10 +13853,12 @@
   void close() native;
 
   /// @domName Notification.dispatchEvent; @docsEditable true
-  bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
+  @JSName('dispatchEvent')
+  bool $dom_dispatchEvent(Event evt) native;
 
   /// @domName Notification.removeEventListener; @docsEditable true
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+  @JSName('removeEventListener')
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   /// @domName Notification.requestPermission; @docsEditable true
   static void requestPermission(NotificationPermissionCallback callback) native;
@@ -14220,7 +13892,8 @@
   int checkPermission() native;
 
   /// @domName NotificationCenter.createHTMLNotification; @docsEditable true
-  Notification createHTMLNotification(String url) native;
+  @JSName('createHTMLNotification')
+  Notification createHtmlNotification(String url) native;
 
   /// @domName NotificationCenter.createNotification; @docsEditable true
   Notification createNotification(String iconUrl, String title, String body) native;
@@ -14273,16 +13946,20 @@
   static const int VERTEX_ARRAY_BINDING_OES = 0x85B5;
 
   /// @domName OESVertexArrayObject.bindVertexArrayOES; @docsEditable true
-  void bindVertexArrayOES(WebGLVertexArrayObjectOES arrayObject) native;
+  @JSName('bindVertexArrayOES')
+  void bindVertexArray(WebGLVertexArrayObjectOES arrayObject) native;
 
   /// @domName OESVertexArrayObject.createVertexArrayOES; @docsEditable true
-  WebGLVertexArrayObjectOES createVertexArrayOES() native;
+  @JSName('createVertexArrayOES')
+  WebGLVertexArrayObjectOES createVertexArray() native;
 
   /// @domName OESVertexArrayObject.deleteVertexArrayOES; @docsEditable true
-  void deleteVertexArrayOES(WebGLVertexArrayObjectOES arrayObject) native;
+  @JSName('deleteVertexArrayOES')
+  void deleteVertexArray(WebGLVertexArrayObjectOES arrayObject) native;
 
   /// @domName OESVertexArrayObject.isVertexArrayOES; @docsEditable true
-  bool isVertexArrayOES(WebGLVertexArrayObjectOES arrayObject) native;
+  @JSName('isVertexArrayOES')
+  bool isVertexArray(WebGLVertexArrayObjectOES arrayObject) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -14387,17 +14064,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName OfflineAudioCompletionEvent; @docsEditable true
-class OfflineAudioCompletionEvent extends Event native "*OfflineAudioCompletionEvent" {
-
-  /// @domName OfflineAudioCompletionEvent.renderedBuffer; @docsEditable true
-  final AudioBuffer renderedBuffer;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
 /// @domName HTMLOptGroupElement; @docsEditable true
 class OptGroupElement extends Element implements Element native "*HTMLOptGroupElement" {
 
@@ -14459,53 +14125,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName OscillatorNode; @docsEditable true
-class OscillatorNode extends AudioSourceNode native "*OscillatorNode" {
-
-  static const int CUSTOM = 4;
-
-  static const int FINISHED_STATE = 3;
-
-  static const int PLAYING_STATE = 2;
-
-  static const int SAWTOOTH = 2;
-
-  static const int SCHEDULED_STATE = 1;
-
-  static const int SINE = 0;
-
-  static const int SQUARE = 1;
-
-  static const int TRIANGLE = 3;
-
-  static const int UNSCHEDULED_STATE = 0;
-
-  /// @domName OscillatorNode.detune; @docsEditable true
-  final AudioParam detune;
-
-  /// @domName OscillatorNode.frequency; @docsEditable true
-  final AudioParam frequency;
-
-  /// @domName OscillatorNode.playbackState; @docsEditable true
-  final int playbackState;
-
-  /// @domName OscillatorNode.type; @docsEditable true
-  int type;
-
-  /// @domName OscillatorNode.setWaveTable; @docsEditable true
-  void setWaveTable(WaveTable waveTable) native;
-
-  /// @domName OscillatorNode.start; @docsEditable true
-  void start(num when) native;
-
-  /// @domName OscillatorNode.stop; @docsEditable true
-  void stop(num when) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
 /// @domName HTMLOutputElement; @docsEditable true
 class OutputElement extends Element implements Element native "*HTMLOutputElement" {
 
@@ -14521,7 +14140,7 @@
   DOMSettableTokenList htmlFor;
 
   /// @domName HTMLOutputElement.labels; @docsEditable true
-  @Returns('_NodeList') @Creates('_NodeList')
+  @Returns('NodeList') @Creates('NodeList')
   final List<Node> labels;
 
   /// @domName HTMLOutputElement.name; @docsEditable true
@@ -14601,65 +14220,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName PannerNode; @docsEditable true
-class PannerNode extends AudioNode native "*PannerNode" {
-
-  static const int EQUALPOWER = 0;
-
-  static const int EXPONENTIAL_DISTANCE = 2;
-
-  static const int HRTF = 1;
-
-  static const int INVERSE_DISTANCE = 1;
-
-  static const int LINEAR_DISTANCE = 0;
-
-  static const int SOUNDFIELD = 2;
-
-  /// @domName PannerNode.coneGain; @docsEditable true
-  final AudioGain coneGain;
-
-  /// @domName PannerNode.coneInnerAngle; @docsEditable true
-  num coneInnerAngle;
-
-  /// @domName PannerNode.coneOuterAngle; @docsEditable true
-  num coneOuterAngle;
-
-  /// @domName PannerNode.coneOuterGain; @docsEditable true
-  num coneOuterGain;
-
-  /// @domName PannerNode.distanceGain; @docsEditable true
-  final AudioGain distanceGain;
-
-  /// @domName PannerNode.distanceModel; @docsEditable true
-  int distanceModel;
-
-  /// @domName PannerNode.maxDistance; @docsEditable true
-  num maxDistance;
-
-  /// @domName PannerNode.panningModel; @docsEditable true
-  int panningModel;
-
-  /// @domName PannerNode.refDistance; @docsEditable true
-  num refDistance;
-
-  /// @domName PannerNode.rolloffFactor; @docsEditable true
-  num rolloffFactor;
-
-  /// @domName PannerNode.setOrientation; @docsEditable true
-  void setOrientation(num x, num y, num z) native;
-
-  /// @domName PannerNode.setPosition; @docsEditable true
-  void setPosition(num x, num y, num z) native;
-
-  /// @domName PannerNode.setVelocity; @docsEditable true
-  void setVelocity(num x, num y, num z) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
 /// @domName HTMLParagraphElement; @docsEditable true
 class ParagraphElement extends Element implements Element native "*HTMLParagraphElement" {
 
@@ -14753,7 +14313,8 @@
   final List<MediaStream> remoteStreams;
 
   /// @domName PeerConnection00.addEventListener; @docsEditable true
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+  @JSName('addEventListener')
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   /// @domName PeerConnection00.addStream; @docsEditable true
   void addStream(MediaStream stream, [Map mediaStreamHints]) {
@@ -14765,8 +14326,10 @@
     _addStream_2(stream);
     return;
   }
-  void _addStream_1(MediaStream stream, mediaStreamHints) native "addStream";
-  void _addStream_2(MediaStream stream) native "addStream";
+  @JSName('addStream')
+  void _addStream_1(MediaStream stream, mediaStreamHints) native;
+  @JSName('addStream')
+  void _addStream_2(MediaStream stream) native;
 
   /// @domName PeerConnection00.close; @docsEditable true
   void close() native;
@@ -14779,8 +14342,10 @@
     }
     return _createAnswer_2(offer);
   }
-  SessionDescription _createAnswer_1(offer, mediaHints) native "createAnswer";
-  SessionDescription _createAnswer_2(offer) native "createAnswer";
+  @JSName('createAnswer')
+  SessionDescription _createAnswer_1(offer, mediaHints) native;
+  @JSName('createAnswer')
+  SessionDescription _createAnswer_2(offer) native;
 
   /// @domName PeerConnection00.createOffer; @docsEditable true
   SessionDescription createOffer([Map mediaHints]) {
@@ -14790,17 +14355,21 @@
     }
     return _createOffer_2();
   }
-  SessionDescription _createOffer_1(mediaHints) native "createOffer";
-  SessionDescription _createOffer_2() native "createOffer";
+  @JSName('createOffer')
+  SessionDescription _createOffer_1(mediaHints) native;
+  @JSName('createOffer')
+  SessionDescription _createOffer_2() native;
 
   /// @domName PeerConnection00.dispatchEvent; @docsEditable true
-  bool $dom_dispatchEvent(Event event) native "dispatchEvent";
+  @JSName('dispatchEvent')
+  bool $dom_dispatchEvent(Event event) native;
 
   /// @domName PeerConnection00.processIceMessage; @docsEditable true
   void processIceMessage(IceCandidate candidate) native;
 
   /// @domName PeerConnection00.removeEventListener; @docsEditable true
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+  @JSName('removeEventListener')
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   /// @domName PeerConnection00.removeStream; @docsEditable true
   void removeStream(MediaStream stream) native;
@@ -14821,8 +14390,10 @@
     _startIce_2();
     return;
   }
-  void _startIce_1(iceOptions) native "startIce";
-  void _startIce_2() native "startIce";
+  @JSName('startIce')
+  void _startIce_1(iceOptions) native;
+  @JSName('startIce')
+  void _startIce_2() native;
 }
 
 class PeerConnection00Events extends Events {
@@ -14958,6 +14529,7 @@
 // WARNING: Do not edit - generated code.
 
 
+/// @domName WebKitPoint
 class Point native "*WebKitPoint" {
   factory Point(num x, num y) => _PointFactoryProvider.createPoint(x, y);
 
@@ -14978,7 +14550,9 @@
 
   /// @domName PopStateEvent.state; @docsEditable true
   dynamic get state => _convertNativeToDart_SerializedScriptValue(this._state);
-  dynamic get _state => JS("dynamic", "#.state", this);
+  @JSName('state')
+  @_annotation_Creates_SerializedScriptValue @_annotation_Returns_SerializedScriptValue
+  final dynamic _state;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -15060,7 +14634,7 @@
   factory ProgressElement() => document.$dom_createElement("progress");
 
   /// @domName HTMLProgressElement.labels; @docsEditable true
-  @Returns('_NodeList') @Creates('_NodeList')
+  @Returns('NodeList') @Creates('NodeList')
   final List<Node> labels;
 
   /// @domName HTMLProgressElement.max; @docsEditable true
@@ -15145,16 +14719,19 @@
   final bool reliable;
 
   /// @domName RTCDataChannel.addEventListener; @docsEditable true
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+  @JSName('addEventListener')
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   /// @domName RTCDataChannel.close; @docsEditable true
   void close() native;
 
   /// @domName RTCDataChannel.dispatchEvent; @docsEditable true
-  bool $dom_dispatchEvent(Event event) native "dispatchEvent";
+  @JSName('dispatchEvent')
+  bool $dom_dispatchEvent(Event event) native;
 
   /// @domName RTCDataChannel.removeEventListener; @docsEditable true
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+  @JSName('removeEventListener')
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   /// @domName RTCDataChannel.send; @docsEditable true
   void send(data) native;
@@ -15260,7 +14837,8 @@
   final List<MediaStream> remoteStreams;
 
   /// @domName RTCPeerConnection.addEventListener; @docsEditable true
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+  @JSName('addEventListener')
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   /// @domName RTCPeerConnection.addIceCandidate; @docsEditable true
   void addIceCandidate(RTCIceCandidate candidate) native;
@@ -15275,8 +14853,10 @@
     _addStream_2(stream);
     return;
   }
-  void _addStream_1(MediaStream stream, mediaConstraints) native "addStream";
-  void _addStream_2(MediaStream stream) native "addStream";
+  @JSName('addStream')
+  void _addStream_1(MediaStream stream, mediaConstraints) native;
+  @JSName('addStream')
+  void _addStream_2(MediaStream stream) native;
 
   /// @domName RTCPeerConnection.close; @docsEditable true
   void close() native;
@@ -15291,8 +14871,10 @@
     _createAnswer_2(successCallback, failureCallback);
     return;
   }
-  void _createAnswer_1(RTCSessionDescriptionCallback successCallback, RTCErrorCallback failureCallback, mediaConstraints) native "createAnswer";
-  void _createAnswer_2(RTCSessionDescriptionCallback successCallback, RTCErrorCallback failureCallback) native "createAnswer";
+  @JSName('createAnswer')
+  void _createAnswer_1(RTCSessionDescriptionCallback successCallback, RTCErrorCallback failureCallback, mediaConstraints) native;
+  @JSName('createAnswer')
+  void _createAnswer_2(RTCSessionDescriptionCallback successCallback, RTCErrorCallback failureCallback) native;
 
   /// @domName RTCPeerConnection.createDataChannel; @docsEditable true
   RTCDataChannel createDataChannel(String label, [Map options]) {
@@ -15302,8 +14884,10 @@
     }
     return _createDataChannel_2(label);
   }
-  RTCDataChannel _createDataChannel_1(label, options) native "createDataChannel";
-  RTCDataChannel _createDataChannel_2(label) native "createDataChannel";
+  @JSName('createDataChannel')
+  RTCDataChannel _createDataChannel_1(label, options) native;
+  @JSName('createDataChannel')
+  RTCDataChannel _createDataChannel_2(label) native;
 
   /// @domName RTCPeerConnection.createOffer; @docsEditable true
   void createOffer(RTCSessionDescriptionCallback successCallback, [RTCErrorCallback failureCallback, Map mediaConstraints]) {
@@ -15315,17 +14899,21 @@
     _createOffer_2(successCallback, failureCallback);
     return;
   }
-  void _createOffer_1(RTCSessionDescriptionCallback successCallback, RTCErrorCallback failureCallback, mediaConstraints) native "createOffer";
-  void _createOffer_2(RTCSessionDescriptionCallback successCallback, RTCErrorCallback failureCallback) native "createOffer";
+  @JSName('createOffer')
+  void _createOffer_1(RTCSessionDescriptionCallback successCallback, RTCErrorCallback failureCallback, mediaConstraints) native;
+  @JSName('createOffer')
+  void _createOffer_2(RTCSessionDescriptionCallback successCallback, RTCErrorCallback failureCallback) native;
 
   /// @domName RTCPeerConnection.dispatchEvent; @docsEditable true
-  bool $dom_dispatchEvent(Event event) native "dispatchEvent";
+  @JSName('dispatchEvent')
+  bool $dom_dispatchEvent(Event event) native;
 
   /// @domName RTCPeerConnection.getStats; @docsEditable true
   void getStats(RTCStatsCallback successCallback, MediaStreamTrack selector) native;
 
   /// @domName RTCPeerConnection.removeEventListener; @docsEditable true
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+  @JSName('removeEventListener')
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   /// @domName RTCPeerConnection.removeStream; @docsEditable true
   void removeStream(MediaStream stream) native;
@@ -15352,9 +14940,12 @@
     _updateIce_3();
     return;
   }
-  void _updateIce_1(configuration, mediaConstraints) native "updateIce";
-  void _updateIce_2(configuration) native "updateIce";
-  void _updateIce_3() native "updateIce";
+  @JSName('updateIce')
+  void _updateIce_1(configuration, mediaConstraints) native;
+  @JSName('updateIce')
+  void _updateIce_2(configuration) native;
+  @JSName('updateIce')
+  void _updateIce_3() native;
 }
 
 class RTCPeerConnectionEvents extends Events {
@@ -15451,7 +15042,7 @@
 
 
 /// @domName RadioNodeList; @docsEditable true
-class RadioNodeList extends _NodeList native "*RadioNodeList" {
+class RadioNodeList extends NodeList native "*RadioNodeList" {
 
   /// @domName RadioNodeList.value; @docsEditable true
   String value;
@@ -15803,8 +15394,9 @@
   Map item(int index) {
     return _convertNativeToDart_Dictionary(_item_1(index));
   }
+  @JSName('item')
   @Creates('=Object')
-  _item_1(index) native "item";
+  _item_1(index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -15939,27 +15531,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName ScriptProcessorNode; @docsEditable true
-class ScriptProcessorNode extends AudioNode implements EventTarget native "*ScriptProcessorNode" {
-
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
-  ScriptProcessorNodeEvents get on =>
-    new ScriptProcessorNodeEvents(this);
-
-  /// @domName ScriptProcessorNode.bufferSize; @docsEditable true
-  final int bufferSize;
-}
-
-class ScriptProcessorNodeEvents extends Events {
-  ScriptProcessorNodeEvents(EventTarget _ptr) : super(_ptr);
-
-  EventListenerList get audioProcess => this['audioprocess'];
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
 /// @domName ScriptProfile; @docsEditable true
 class ScriptProfile native "*ScriptProfile" {
 
@@ -15981,7 +15552,8 @@
 class ScriptProfileNode native "*ScriptProfileNode" {
 
   /// @domName ScriptProfileNode.callUID; @docsEditable true
-  final int callUID;
+  @JSName('callUID')
+  final int callUid;
 
   /// @domName ScriptProfileNode.functionName; @docsEditable true
   final String functionName;
@@ -16012,6 +15584,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
+/// @domName HTMLSelectElement
 class SelectElement extends Element implements Element native "*HTMLSelectElement" {
 
   factory SelectElement() => document.$dom_createElement("select");
@@ -16026,7 +15599,7 @@
   final FormElement form;
 
   /// @domName HTMLSelectElement.labels; @docsEditable true
-  @Returns('_NodeList') @Creates('_NodeList')
+  @Returns('NodeList') @Creates('NodeList')
   final List<Node> labels;
 
   /// @domName HTMLSelectElement.length; @docsEditable true
@@ -16124,6 +15697,7 @@
 // WARNING: Do not edit - generated code.
 
 
+/// @domName ShadowRoot
 class ShadowRoot extends DocumentFragment native "*ShadowRoot" {
 
   factory ShadowRoot(Element host) => _ShadowRootFactoryProvider.createShadowRoot(host);
@@ -16135,24 +15709,29 @@
   bool applyAuthorStyles;
 
   /// @domName ShadowRoot.innerHTML; @docsEditable true
-  String innerHTML;
+  @JSName('innerHTML')
+  String innerHtml;
 
   /// @domName ShadowRoot.resetStyleInheritance; @docsEditable true
   bool resetStyleInheritance;
 
   /// @domName ShadowRoot.cloneNode; @docsEditable true
-  Node clone(bool deep) native "cloneNode";
+  @JSName('cloneNode')
+  Node clone(bool deep) native;
 
   /// @domName ShadowRoot.getElementById; @docsEditable true
-  Element $dom_getElementById(String elementId) native "getElementById";
+  @JSName('getElementById')
+  Element $dom_getElementById(String elementId) native;
 
   /// @domName ShadowRoot.getElementsByClassName; @docsEditable true
-  @Returns('_NodeList') @Creates('_NodeList')
-  List<Node> $dom_getElementsByClassName(String className) native "getElementsByClassName";
+  @JSName('getElementsByClassName')
+  @Returns('NodeList') @Creates('NodeList')
+  List<Node> $dom_getElementsByClassName(String className) native;
 
   /// @domName ShadowRoot.getElementsByTagName; @docsEditable true
-  @Returns('_NodeList') @Creates('_NodeList')
-  List<Node> $dom_getElementsByTagName(String tagName) native "getElementsByTagName";
+  @JSName('getElementsByTagName')
+  @Returns('NodeList') @Creates('NodeList')
+  List<Node> $dom_getElementsByTagName(String tagName) native;
 
   /// @domName ShadowRoot.getSelection; @docsEditable true
   DOMSelection getSelection() native;
@@ -16316,16 +15895,19 @@
   // -- end List<SourceBuffer> mixins.
 
   /// @domName SourceBufferList.addEventListener; @docsEditable true
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+  @JSName('addEventListener')
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   /// @domName SourceBufferList.dispatchEvent; @docsEditable true
-  bool $dom_dispatchEvent(Event event) native "dispatchEvent";
+  @JSName('dispatchEvent')
+  bool $dom_dispatchEvent(Event event) native;
 
   /// @domName SourceBufferList.item; @docsEditable true
   SourceBuffer item(int index) native;
 
   /// @domName SourceBufferList.removeEventListener; @docsEditable true
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+  @JSName('removeEventListener')
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -16538,13 +16120,16 @@
   void abort() native;
 
   /// @domName SpeechRecognition.addEventListener; @docsEditable true
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+  @JSName('addEventListener')
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   /// @domName SpeechRecognition.dispatchEvent; @docsEditable true
-  bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
+  @JSName('dispatchEvent')
+  bool $dom_dispatchEvent(Event evt) native;
 
   /// @domName SpeechRecognition.removeEventListener; @docsEditable true
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+  @JSName('removeEventListener')
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   /// @domName SpeechRecognition.start; @docsEditable true
   void start() native;
@@ -16654,7 +16239,8 @@
   final Document emma;
 
   /// @domName SpeechRecognitionResult.finalValue; @docsEditable true
-  bool get finalValue => JS("bool", "#.final", this);
+  @JSName('final')
+  final bool finalValue;
 
   /// @domName SpeechRecognitionResult.length; @docsEditable true
   final int length;
@@ -16667,6 +16253,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
+/// @domName Storage
 class Storage implements Map<String, String>  native "*Storage" {
 
   // TODO(nweiz): update this when maps support lazy iteration
@@ -16717,22 +16304,28 @@
   bool get isEmpty => $dom_key(0) == null;
 
   /// @domName Storage.length; @docsEditable true
-  int get $dom_length => JS("int", "#.length", this);
+  @JSName('length')
+  final int $dom_length;
 
   /// @domName Storage.clear; @docsEditable true
-  void $dom_clear() native "clear";
+  @JSName('clear')
+  void $dom_clear() native;
 
   /// @domName Storage.getItem; @docsEditable true
-  String $dom_getItem(String key) native "getItem";
+  @JSName('getItem')
+  String $dom_getItem(String key) native;
 
   /// @domName Storage.key; @docsEditable true
-  String $dom_key(int index) native "key";
+  @JSName('key')
+  String $dom_key(int index) native;
 
   /// @domName Storage.removeItem; @docsEditable true
-  void $dom_removeItem(String key) native "removeItem";
+  @JSName('removeItem')
+  void $dom_removeItem(String key) native;
 
   /// @domName Storage.setItem; @docsEditable true
-  void $dom_setItem(String key, String data) native "setItem";
+  @JSName('setItem')
+  void $dom_setItem(String key, String data) native;
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16980,6 +16573,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
+/// @domName HTMLTableElement
 class TableElement extends Element implements Element native "*HTMLTableElement" {
 
   factory TableElement() => document.$dom_createElement("table");
@@ -17060,7 +16654,8 @@
     return tbody;
   }
 
-  Element _createTBody() native 'createTBody';
+  @JSName('createTBody')
+  Element _createTBody() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -17138,6 +16733,7 @@
 // WARNING: Do not edit - generated code.
 
 
+/// @domName Text
 class Text extends CharacterData native "*Text" {
   factory Text(String data) => _TextFactoryProvider.createText(data);
 
@@ -17180,7 +16776,7 @@
   final FormElement form;
 
   /// @domName HTMLTextAreaElement.labels; @docsEditable true
-  @Returns('_NodeList') @Creates('_NodeList')
+  @Returns('NodeList') @Creates('NodeList')
   final List<Node> labels;
 
   /// @domName HTMLTextAreaElement.maxLength; @docsEditable true
@@ -17305,16 +16901,19 @@
   void addCue(TextTrackCue cue) native;
 
   /// @domName TextTrack.addEventListener; @docsEditable true
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+  @JSName('addEventListener')
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   /// @domName TextTrack.dispatchEvent; @docsEditable true
-  bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
+  @JSName('dispatchEvent')
+  bool $dom_dispatchEvent(Event evt) native;
 
   /// @domName TextTrack.removeCue; @docsEditable true
   void removeCue(TextTrackCue cue) native;
 
   /// @domName TextTrack.removeEventListener; @docsEditable true
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+  @JSName('removeEventListener')
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 }
 
 class TextTrackEvents extends Events {
@@ -17373,16 +16972,20 @@
   String vertical;
 
   /// @domName TextTrackCue.addEventListener; @docsEditable true
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+  @JSName('addEventListener')
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   /// @domName TextTrackCue.dispatchEvent; @docsEditable true
-  bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
+  @JSName('dispatchEvent')
+  bool $dom_dispatchEvent(Event evt) native;
 
   /// @domName TextTrackCue.getCueAsHTML; @docsEditable true
-  DocumentFragment getCueAsHTML() native;
+  @JSName('getCueAsHTML')
+  DocumentFragment getCueAsHtml() native;
 
   /// @domName TextTrackCue.removeEventListener; @docsEditable true
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+  @JSName('removeEventListener')
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 }
 
 class TextTrackCueEvents extends Events {
@@ -17595,16 +17198,19 @@
   // -- end List<TextTrack> mixins.
 
   /// @domName TextTrackList.addEventListener; @docsEditable true
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+  @JSName('addEventListener')
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   /// @domName TextTrackList.dispatchEvent; @docsEditable true
-  bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
+  @JSName('dispatchEvent')
+  bool $dom_dispatchEvent(Event evt) native;
 
   /// @domName TextTrackList.item; @docsEditable true
   TextTrack item(int index) native;
 
   /// @domName TextTrackList.removeEventListener; @docsEditable true
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+  @JSName('removeEventListener')
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 }
 
 class TextTrackListEvents extends Events {
@@ -17678,7 +17284,9 @@
 
   /// @domName Touch.target; @docsEditable true
   EventTarget get target => _convertNativeToDart_EventTarget(this._target);
-  dynamic get _target => JS("dynamic", "#.target", this);
+  @JSName('target')
+  @Creates('EventTarget|=Object') @Returns('EventTarget|=Object')
+  final dynamic _target;
 
   /// @domName Touch.webkitForce; @docsEditable true
   final num webkitForce;
@@ -17842,12 +17450,8 @@
   static const int NONE = 0;
 
   /// @domName HTMLTrackElement.defaultValue; @docsEditable true
-  bool get defaultValue => JS("bool", "#.default", this);
-
-  /// @domName HTMLTrackElement.defaultValue; @docsEditable true
-  void set defaultValue(bool value) {
-    JS("void", "#.default = #", this, value);
-  }
+  @JSName('default')
+  bool defaultValue;
 
   /// @domName HTMLTrackElement.kind; @docsEditable true
   String kind;
@@ -17940,18 +17544,34 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// WARNING: Do not edit - generated code.
+
 
 /// @domName UIEvent; @docsEditable true
 class UIEvent extends Event native "*UIEvent" {
+  // In JS, canBubble and cancelable are technically required parameters to
+  // init*Event. In practice, though, if they aren't provided they simply
+  // default to false (since that's Boolean(undefined)).
+  //
+  // Contrary to JS, we default canBubble and cancelable to true, since that's
+  // what people want most of the time anyway.
+  factory UIEvent(String type, Window view, int detail,
+      [bool canBubble = true, bool cancelable = true]) {
+    final e = document.$dom_createEvent("UIEvent");
+    e.$dom_initUIEvent(type, canBubble, cancelable, view, detail);
+    return e;
+  }
 
   /// @domName UIEvent.charCode; @docsEditable true
-  final int charCode;
+  @JSName('charCode')
+  final int $dom_charCode;
 
   /// @domName UIEvent.detail; @docsEditable true
   final int detail;
 
   /// @domName UIEvent.keyCode; @docsEditable true
-  final int keyCode;
+  @JSName('keyCode')
+  final int $dom_keyCode;
 
   /// @domName UIEvent.layerX; @docsEditable true
   final int layerX;
@@ -17967,13 +17587,17 @@
 
   /// @domName UIEvent.view; @docsEditable true
   Window get view => _convertNativeToDart_Window(this._view);
-  dynamic get _view => JS("dynamic", "#.view", this);
+  @JSName('view')
+  @Creates('LocalWindow|=Object') @Returns('LocalWindow|=Object')
+  final dynamic _view;
 
   /// @domName UIEvent.which; @docsEditable true
   final int which;
 
   /// @domName UIEvent.initUIEvent; @docsEditable true
-  void initUIEvent(String type, bool canBubble, bool cancelable, LocalWindow view, int detail) native;
+  @JSName('initUIEvent')
+  void $dom_initUIEvent(String type, bool canBubble, bool cancelable, LocalWindow view, int detail) native;
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -18096,7 +17720,8 @@
   // -- end List<int> mixins.
 
   /// @domName Uint16Array.setElements; @docsEditable true
-  void setElements(Object array, [int offset]) native "set";
+  @JSName('set')
+  void setElements(Object array, [int offset]) native;
 
   /// @domName Uint16Array.subarray; @docsEditable true
   Uint16Array subarray(int start, [int end]) native;
@@ -18206,7 +17831,8 @@
   // -- end List<int> mixins.
 
   /// @domName Uint32Array.setElements; @docsEditable true
-  void setElements(Object array, [int offset]) native "set";
+  @JSName('set')
+  void setElements(Object array, [int offset]) native;
 
   /// @domName Uint32Array.subarray; @docsEditable true
   Uint32Array subarray(int start, [int end]) native;
@@ -18316,7 +17942,8 @@
   // -- end List<int> mixins.
 
   /// @domName Uint8Array.setElements; @docsEditable true
-  void setElements(Object array, [int offset]) native "set";
+  @JSName('set')
+  void setElements(Object array, [int offset]) native;
 
   /// @domName Uint8Array.subarray; @docsEditable true
   Uint8Array subarray(int start, [int end]) native;
@@ -18342,7 +17969,8 @@
   // final int length;
 
   /// @domName Uint8ClampedArray.setElements; @docsEditable true
-  void setElements(Object array, [int offset]) native "set";
+  @JSName('set')
+  void setElements(Object array, [int offset]) native;
 
   /// @domName Uint8ClampedArray.subarray; @docsEditable true
   Uint8ClampedArray subarray(int start, [int end]) native;
@@ -18360,6 +17988,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
+/// @domName URL
 class Url native "*URL" {
 
   static String createObjectUrl(blob_OR_source_OR_stream) =>
@@ -18469,17 +18098,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WaveShaperNode; @docsEditable true
-class WaveShaperNode extends AudioNode native "*WaveShaperNode" {
-
-  /// @domName WaveShaperNode.curve; @docsEditable true
-  Float32Array curve;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
 /// @domName WaveTable; @docsEditable true
 class WaveTable native "*WaveTable" {
 }
@@ -19579,11 +19197,16 @@
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
-  void _texImage2D_1(target, level, internalformat, width, height, int border, format, type, ArrayBufferView pixels) native "texImage2D";
-  void _texImage2D_2(target, level, internalformat, format, type, pixels) native "texImage2D";
-  void _texImage2D_3(target, level, internalformat, format, type, ImageElement image) native "texImage2D";
-  void _texImage2D_4(target, level, internalformat, format, type, CanvasElement canvas) native "texImage2D";
-  void _texImage2D_5(target, level, internalformat, format, type, VideoElement video) native "texImage2D";
+  @JSName('texImage2D')
+  void _texImage2D_1(target, level, internalformat, width, height, int border, format, type, ArrayBufferView pixels) native;
+  @JSName('texImage2D')
+  void _texImage2D_2(target, level, internalformat, format, type, pixels) native;
+  @JSName('texImage2D')
+  void _texImage2D_3(target, level, internalformat, format, type, ImageElement image) native;
+  @JSName('texImage2D')
+  void _texImage2D_4(target, level, internalformat, format, type, CanvasElement canvas) native;
+  @JSName('texImage2D')
+  void _texImage2D_5(target, level, internalformat, format, type, VideoElement video) native;
 
   /// @domName WebGLRenderingContext.texParameterf; @docsEditable true
   void texParameterf(int target, int pname, num param) native;
@@ -19624,11 +19247,16 @@
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
-  void _texSubImage2D_1(target, level, xoffset, yoffset, width, height, int format, type, ArrayBufferView pixels) native "texSubImage2D";
-  void _texSubImage2D_2(target, level, xoffset, yoffset, format, type, pixels) native "texSubImage2D";
-  void _texSubImage2D_3(target, level, xoffset, yoffset, format, type, ImageElement image) native "texSubImage2D";
-  void _texSubImage2D_4(target, level, xoffset, yoffset, format, type, CanvasElement canvas) native "texSubImage2D";
-  void _texSubImage2D_5(target, level, xoffset, yoffset, format, type, VideoElement video) native "texSubImage2D";
+  @JSName('texSubImage2D')
+  void _texSubImage2D_1(target, level, xoffset, yoffset, width, height, int format, type, ArrayBufferView pixels) native;
+  @JSName('texSubImage2D')
+  void _texSubImage2D_2(target, level, xoffset, yoffset, format, type, pixels) native;
+  @JSName('texSubImage2D')
+  void _texSubImage2D_3(target, level, xoffset, yoffset, format, type, ImageElement image) native;
+  @JSName('texSubImage2D')
+  void _texSubImage2D_4(target, level, xoffset, yoffset, format, type, CanvasElement canvas) native;
+  @JSName('texSubImage2D')
+  void _texSubImage2D_5(target, level, xoffset, yoffset, format, type, VideoElement video) native;
 
   /// @domName WebGLRenderingContext.uniform1f; @docsEditable true
   void uniform1f(WebGLUniformLocation location, num x) native;
@@ -19825,25 +19453,28 @@
   final bool overset;
 
   /// @domName WebKitNamedFlow.addEventListener; @docsEditable true
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+  @JSName('addEventListener')
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   /// @domName WebKitNamedFlow.dispatchEvent; @docsEditable true
-  bool $dom_dispatchEvent(Event event) native "dispatchEvent";
+  @JSName('dispatchEvent')
+  bool $dom_dispatchEvent(Event event) native;
 
   /// @domName WebKitNamedFlow.getContent; @docsEditable true
-  @Returns('_NodeList') @Creates('_NodeList')
+  @Returns('NodeList') @Creates('NodeList')
   List<Node> getContent() native;
 
   /// @domName WebKitNamedFlow.getRegions; @docsEditable true
-  @Returns('_NodeList') @Creates('_NodeList')
+  @Returns('NodeList') @Creates('NodeList')
   List<Node> getRegions() native;
 
   /// @domName WebKitNamedFlow.getRegionsByContent; @docsEditable true
-  @Returns('_NodeList') @Creates('_NodeList')
+  @Returns('NodeList') @Creates('NodeList')
   List<Node> getRegionsByContent(Node contentNode) native;
 
   /// @domName WebKitNamedFlow.removeEventListener; @docsEditable true
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+  @JSName('removeEventListener')
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -19852,6 +19483,7 @@
 // WARNING: Do not edit - generated code.
 
 
+/// @domName WebSocket
 class WebSocket extends EventTarget native "*WebSocket" {
   factory WebSocket(String url) => _WebSocketFactoryProvider.createWebSocket(url);
 
@@ -19868,7 +19500,8 @@
   static const int OPEN = 1;
 
   /// @domName WebSocket.URL; @docsEditable true
-  final String URL;
+  @JSName('URL')
+  final String Url;
 
   /// @domName WebSocket.binaryType; @docsEditable true
   String binaryType;
@@ -19889,16 +19522,19 @@
   final String url;
 
   /// @domName WebSocket.addEventListener; @docsEditable true
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+  @JSName('addEventListener')
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   /// @domName WebSocket.close; @docsEditable true
   void close([int code, String reason]) native;
 
   /// @domName WebSocket.dispatchEvent; @docsEditable true
-  bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
+  @JSName('dispatchEvent')
+  bool $dom_dispatchEvent(Event evt) native;
 
   /// @domName WebSocket.removeEventListener; @docsEditable true
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+  @JSName('removeEventListener')
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   /// @domName WebSocket.send; @docsEditable true
   void send(data) native;
@@ -19921,6 +19557,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
+/// @domName WheelEvent
 class WheelEvent extends MouseEvent native "*WheelEvent" {
 
   /// @domName WheelEvent.webkitDirectionInvertedFromDevice; @docsEditable true
@@ -20028,8 +19665,10 @@
     _postMessage_2(message_2);
     return;
   }
-  void _postMessage_1(message, List messagePorts) native "postMessage";
-  void _postMessage_2(message) native "postMessage";
+  @JSName('postMessage')
+  void _postMessage_1(message, List messagePorts) native;
+  @JSName('postMessage')
+  void _postMessage_2(message) native;
 
   /// @domName Worker.terminate; @docsEditable true
   void terminate() native;
@@ -20075,7 +19714,8 @@
   final NotificationCenter webkitNotifications;
 
   /// @domName WorkerContext.addEventListener; @docsEditable true
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+  @JSName('addEventListener')
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   /// @domName WorkerContext.clearInterval; @docsEditable true
   void clearInterval(int handle) native;
@@ -20087,7 +19727,8 @@
   void close() native;
 
   /// @domName WorkerContext.dispatchEvent; @docsEditable true
-  bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
+  @JSName('dispatchEvent')
+  bool $dom_dispatchEvent(Event evt) native;
 
   /// @domName WorkerContext.importScripts; @docsEditable true
   void importScripts() native;
@@ -20099,7 +19740,8 @@
   DatabaseSync openDatabaseSync(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) native;
 
   /// @domName WorkerContext.removeEventListener; @docsEditable true
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+  @JSName('removeEventListener')
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   /// @domName WorkerContext.setInterval; @docsEditable true
   int setInterval(TimeoutHandler handler, int timeout) native;
@@ -20114,10 +19756,12 @@
   DOMFileSystemSync webkitRequestFileSystemSync(int type, int size) native;
 
   /// @domName WorkerContext.webkitResolveLocalFileSystemSyncURL; @docsEditable true
-  EntrySync webkitResolveLocalFileSystemSyncURL(String url) native;
+  @JSName('webkitResolveLocalFileSystemSyncURL')
+  EntrySync webkitResolveLocalFileSystemSyncUrl(String url) native;
 
   /// @domName WorkerContext.webkitResolveLocalFileSystemURL; @docsEditable true
-  void webkitResolveLocalFileSystemURL(String url, EntryCallback successCallback, [ErrorCallback errorCallback]) native;
+  @JSName('webkitResolveLocalFileSystemURL')
+  void webkitResolveLocalFileSystemUrl(String url, EntryCallback successCallback, [ErrorCallback errorCallback]) native;
 }
 
 class WorkerContextEvents extends Events {
@@ -20259,7 +19903,8 @@
 class XPathNSResolver native "*XPathNSResolver" {
 
   /// @domName XPathNSResolver.lookupNamespaceURI; @docsEditable true
-  String lookupNamespaceURI(String prefix) native;
+  @JSName('lookupNamespaceURI')
+  String lookupNamespaceUri(String prefix) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -20364,17 +20009,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-class _AudioElementFactoryProvider {
-  static AudioElement createAudioElement([String src = null]) {
-    if (src == null) return JS('AudioElement', 'new Audio()');
-    return JS('AudioElement', 'new Audio(#)', src);
-  }
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
 class _BlobFactoryProvider {
   static Blob createBlob([List blobParts = null, String type, String endings]) {
     // TODO: validate that blobParts is a JS Array and convert if not.
@@ -21455,105 +21089,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName NodeList; @docsEditable true
-class _NodeList implements JavaScriptIndexingBehavior, List<Node> native "*NodeList" {
-
-  /// @domName NodeList.length; @docsEditable true
-  final int length;
-
-  Node operator[](int index) => JS("Node", "#[#]", this, index);
-
-  void operator[]=(int index, Node value) {
-    throw new UnsupportedError("Cannot assign element of immutable List.");
-  }
-  // -- start List<Node> mixins.
-  // Node is the element type.
-
-  // From Iterable<Node>:
-
-  Iterator<Node> iterator() {
-    // Note: NodeLists are not fixed size. And most probably length shouldn't
-    // be cached in both iterator _and_ forEach method. For now caching it
-    // for consistency.
-    return new FixedSizeListIterator<Node>(this);
-  }
-
-  // From Collection<Node>:
-
-  void add(Node value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addLast(Node value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addAll(Collection<Node> collection) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  bool contains(Node element) => _Collections.contains(this, element);
-
-  void forEach(void f(Node element)) => _Collections.forEach(this, f);
-
-  Collection map(f(Node element)) => _Collections.map(this, [], f);
-
-  Collection<Node> filter(bool f(Node element)) =>
-     _Collections.filter(this, <Node>[], f);
-
-  bool every(bool f(Node element)) => _Collections.every(this, f);
-
-  bool some(bool f(Node element)) => _Collections.some(this, f);
-
-  bool get isEmpty => this.length == 0;
-
-  // From List<Node>:
-
-  void sort([Comparator<Node> compare = Comparable.compare]) {
-    throw new UnsupportedError("Cannot sort immutable List.");
-  }
-
-  int indexOf(Node element, [int start = 0]) =>
-      _Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(Node element, [int start]) {
-    if (start == null) start = length - 1;
-    return _Lists.lastIndexOf(this, element, start);
-  }
-
-  Node get first => this[0];
-
-  Node get last => this[length - 1];
-
-  Node removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<Node> from, [int startFrom]) {
-    throw new UnsupportedError("Cannot setRange on immutable List.");
-  }
-
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError("Cannot removeRange on immutable List.");
-  }
-
-  void insertRange(int start, int rangeLength, [Node initialValue]) {
-    throw new UnsupportedError("Cannot insertRange on immutable List.");
-  }
-
-  List<Node> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <Node>[]);
-
-  // -- end List<Node> mixins.
-
-  /// @domName NodeList.item; @docsEditable true
-  Node _item(int index) native "item";
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
 class _NotificationFactoryProvider {
   static Notification createNotification(String title, [Map options]) =>
       JS('Notification', 'new Notification(#,#)', title, options);
@@ -22137,6 +21672,228 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
+abstract class _AttributeMap implements Map<String, String> {
+
+  bool containsValue(String value) {
+    for (var v in this.values) {
+      if (value == v) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  String putIfAbsent(String key, String ifAbsent()) {
+    if (!containsKey(key)) {
+      this[key] = ifAbsent();
+    }
+    return this[key];
+  }
+
+  void clear() {
+    for (var key in keys) {
+      remove(key);
+    }
+  }
+
+  void forEach(void f(String key, String value)) {
+    for (var key in keys) {
+      var value = this[key];
+      f(key, value);
+    }
+  }
+
+  Collection<String> get keys {
+    // TODO: generate a lazy collection instead.
+    var attributes = _element.$dom_attributes;
+    var keys = new List<String>();
+    for (int i = 0, len = attributes.length; i < len; i++) {
+      if (_matches(attributes[i])) {
+        keys.add(attributes[i].$dom_localName);
+      }
+    }
+    return keys;
+  }
+
+  Collection<String> get values {
+    // TODO: generate a lazy collection instead.
+    var attributes = _element.$dom_attributes;
+    var values = new List<String>();
+    for (int i = 0, len = attributes.length; i < len; i++) {
+      if (_matches(attributes[i])) {
+        values.add(attributes[i].value);
+      }
+    }
+    return values;
+  }
+
+  /**
+   * Returns true if there is no {key, value} pair in the map.
+   */
+  bool get isEmpty {
+    return length == 0;
+  }
+
+  /**
+   * Checks to see if the node should be included in this map.
+   */
+  bool _matches(Node node);
+}
+
+/**
+ * Wrapper to expose [Element.attributes] as a typed map.
+ */
+class _ElementAttributeMap extends _AttributeMap {
+
+  final Element _element;
+
+  _ElementAttributeMap(this._element);
+
+  bool containsKey(String key) {
+    return _element.$dom_hasAttribute(key);
+  }
+
+  String operator [](String key) {
+    return _element.$dom_getAttribute(key);
+  }
+
+  void operator []=(String key, value) {
+    _element.$dom_setAttribute(key, '$value');
+  }
+
+  String remove(String key) {
+    String value = _element.$dom_getAttribute(key);
+    _element.$dom_removeAttribute(key);
+    return value;
+  }
+
+  /**
+   * The number of {key, value} pairs in the map.
+   */
+  int get length {
+    return keys.length;
+  }
+
+  bool _matches(Node node) => node.$dom_namespaceUri == null;
+}
+
+/**
+ * Wrapper to expose namespaced attributes as a typed map.
+ */
+class _NamespacedAttributeMap extends _AttributeMap {
+
+  final Element _element;
+  final String _namespace;
+
+  _NamespacedAttributeMap(this._element, this._namespace);
+
+  bool containsKey(String key) {
+    return _element.$dom_hasAttributeNS(_namespace, key);
+  }
+
+  String operator [](String key) {
+    return _element.$dom_getAttributeNS(_namespace, key);
+  }
+
+  void operator []=(String key, value) {
+    _element.$dom_setAttributeNS(_namespace, key, '$value');
+  }
+
+  String remove(String key) {
+    String value = this[key];
+    _element.$dom_removeAttributeNS(_namespace, key);
+    return value;
+  }
+
+  /**
+   * The number of {key, value} pairs in the map.
+   */
+  int get length {
+    return keys.length;
+  }
+
+  bool _matches(Node node) => node.$dom_namespaceUri == _namespace;
+}
+
+
+/**
+ * Provides a Map abstraction on top of data-* attributes, similar to the
+ * dataSet in the old DOM.
+ */
+class _DataAttributeMap implements Map<String, String> {
+
+  final Map<String, String> $dom_attributes;
+
+  _DataAttributeMap(this.$dom_attributes);
+
+  // interface Map
+
+  // TODO: Use lazy iterator when it is available on Map.
+  bool containsValue(String value) => values.some((v) => v == value);
+
+  bool containsKey(String key) => $dom_attributes.containsKey(_attr(key));
+
+  String operator [](String key) => $dom_attributes[_attr(key)];
+
+  void operator []=(String key, value) {
+    $dom_attributes[_attr(key)] = '$value';
+  }
+
+  String putIfAbsent(String key, String ifAbsent()) =>
+    $dom_attributes.putIfAbsent(_attr(key), ifAbsent);
+
+  String remove(String key) => $dom_attributes.remove(_attr(key));
+
+  void clear() {
+    // Needs to operate on a snapshot since we are mutating the collection.
+    for (String key in keys) {
+      remove(key);
+    }
+  }
+
+  void forEach(void f(String key, String value)) {
+    $dom_attributes.forEach((String key, String value) {
+      if (_matches(key)) {
+        f(_strip(key), value);
+      }
+    });
+  }
+
+  Collection<String> get keys {
+    final keys = new List<String>();
+    $dom_attributes.forEach((String key, String value) {
+      if (_matches(key)) {
+        keys.add(_strip(key));
+      }
+    });
+    return keys;
+  }
+
+  Collection<String> get values {
+    final values = new List<String>();
+    $dom_attributes.forEach((String key, String value) {
+      if (_matches(key)) {
+        values.add(value);
+      }
+    });
+    return values;
+  }
+
+  int get length => keys.length;
+
+  // TODO: Use lazy iterator when it is available on Map.
+  bool get isEmpty => length == 0;
+
+  // Helpers.
+  String _attr(String key) => 'data-$key';
+  bool _matches(String key) => key.startsWith('data-');
+  String _strip(String key) => key.substring(5);
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
 /**
  * An object representing the top-level context object for web scripting.
  *
@@ -22166,7 +21923,7 @@
   History get history;
 
   /**
-   * Indicates whether this window is closed.
+   * Indicates whether this window has been closed.
    *
    *     print(window.closed); // 'false'
    *     window.close();
@@ -22219,6 +21976,34 @@
   Window get top;
 
   // Methods.
+  /**
+   * Closes the window.
+   *
+   * This method should only succeed if the [Window] object is
+   * **script-closeable** and the window calling [close] is allowed to navigate
+   * the window.
+   *
+   * A window is script-closeable if it is either a window
+   * that was opened by another window, or if it is a window with only one
+   * document in its history.
+   *
+   * A window might not be allowed to navigate, and therefore close, another
+   * window due to browser security features.
+   *
+   *     var other = window.open('http://www.example.com', 'foo');
+   *     // Closes other window, as it is script-closeable.
+   *     other.close();
+   *     print(other.closed()); // 'true'
+   *
+   *     window.location('http://www.mysite.com', 'foo');
+   *     // Does not close this window, as the history has changed.
+   *     window.close();
+   *     print(window.closed()); // 'false'
+   *
+   * See also:
+   *
+   * * [Window close discussion](http://www.w3.org/TR/html5/browsers.html#dom-window-close) from the W3C
+   */
   void close();
   void postMessage(var message, String targetOrigin, [List messagePorts = null]);
 }
@@ -22509,6 +22294,410 @@
 
 
 /**
+ * Works with KeyboardEvent and KeyEvent to determine how to expose information
+ * about Key(board)Events. This class functions like an EventListenerList, and
+ * provides a consistent interface for the Dart
+ * user, despite the fact that a multitude of browsers that have varying
+ * keyboard default behavior.
+ *
+ * This class is very much a work in progress, and we'd love to get information
+ * on how we can make this class work with as many international keyboards as
+ * possible. Bugs welcome! 
+ */
+class KeyboardEventController {
+  // This code inspired by Closure's KeyHandling library.
+  // http://closure-library.googlecode.com/svn/docs/closure_goog_events_keyhandler.js.source.html
+  
+  /**
+   * The set of keys that have been pressed down without seeing their
+   * corresponding keyup event.
+   */
+  List<KeyboardEvent> _keyDownList;
+
+  /** The set of functions that wish to be notified when a KeyEvent happens. */
+  List<Function> _callbacks;
+
+  /** The type of KeyEvent we are tracking (keyup, keydown, keypress). */
+  String _type;
+
+  /** The element we are watching for events to happen on. */
+  EventTarget _target;
+
+  // The distance to shift from upper case alphabet Roman letters to lower case.
+  int _ROMAN_ALPHABET_OFFSET = "a".charCodes[0] - "A".charCodes[0];
+
+  // Instance members referring to the internal event handlers because closures
+  // are not hashable.
+  var _keyUp, _keyDown, _keyPress;
+
+  /**
+   * An enumeration of key identifiers currently part of the W3C draft for DOM3
+   * and their mappings to keyCodes.
+   * http://www.w3.org/TR/DOM-Level-3-Events/keyset.html#KeySet-Set
+   */
+  static Map<String, int> _keyIdentifier = {
+    'Up': KeyCode.UP,
+    'Down': KeyCode.DOWN,
+    'Left': KeyCode.LEFT,
+    'Right': KeyCode.RIGHT,
+    'Enter': KeyCode.ENTER,
+    'F1': KeyCode.F1,
+    'F2': KeyCode.F2,
+    'F3': KeyCode.F3,
+    'F4': KeyCode.F4,
+    'F5': KeyCode.F5,
+    'F6': KeyCode.F6,
+    'F7': KeyCode.F7,
+    'F8': KeyCode.F8,
+    'F9': KeyCode.F9,
+    'F10': KeyCode.F10,
+    'F11': KeyCode.F11,
+    'F12': KeyCode.F12,
+    'U+007F': KeyCode.DELETE,
+    'Home': KeyCode.HOME,
+    'End': KeyCode.END,
+    'PageUp': KeyCode.PAGE_UP,
+    'PageDown': KeyCode.PAGE_DOWN,
+    'Insert': KeyCode.INSERT
+  };
+
+  /** Named constructor to add an onKeyPress event listener to our handler. */
+  KeyboardEventController.keypress(EventTarget target) {
+    _KeyboardEventController(target, 'keypress');
+  }
+  
+  /** Named constructor to add an onKeyUp event listener to our handler. */
+  KeyboardEventController.keyup(EventTarget target) {
+    _KeyboardEventController(target, 'keyup');
+  }
+
+  /** Named constructor to add an onKeyDown event listener to our handler. */
+  KeyboardEventController.keydown(EventTarget target) {
+    _KeyboardEventController(target, 'keydown');
+  }
+  
+  /**
+   * General constructor, performs basic initialization for our improved
+   * KeyboardEvent controller.
+   */
+  _KeyboardEventController(EventTarget target, String type) {
+    _callbacks = [];
+    _type = type;
+    _target = target;
+    _keyDown = processKeyDown;
+    _keyUp = processKeyUp;
+    _keyPress = processKeyPress;
+  }
+
+  /**
+   * Hook up all event listeners under the covers so we can estimate keycodes
+   * and charcodes when they are not provided.
+   */
+  void _initializeAllEventListeners() {
+    _keyDownList = [];
+    _target.on.keyDown.add(_keyDown, true);
+    _target.on.keyPress.add(_keyPress, true);
+    _target.on.keyUp.add(_keyUp, true);
+  }
+
+  /** Add a callback that wishes to be notified when a KeyEvent occurs. */
+  void add(void callback(KeyEvent)) {
+    if (_callbacks.length == 0) {
+      _initializeAllEventListeners();
+    }
+    _callbacks.add(callback);
+  }
+  
+  /**
+   * Notify all callback listeners that a KeyEvent of the relevant type has
+   * occurred.
+   */
+  bool _dispatch(KeyEvent event) {
+    if (event.type == _type) {
+      // Make a copy of the listeners in case a callback gets removed while
+      // dispatching from the list.
+      List callbacksCopy = new List.from(_callbacks);
+      for(var callback in callbacksCopy) {
+        callback(event);
+      }
+    }
+  }
+
+  /** Remove the given callback from the listeners list. */
+  void remove(void callback(KeyEvent)) {
+    var index = _callbacks.indexOf(callback);
+    if (index != -1) {
+      _callbacks.removeAt(index);
+    }
+    if (_callbacks.length == 0) {
+      // If we have no listeners, don't bother keeping track of keypresses.
+      _target.on.keyDown.remove(_keyDown);
+      _target.on.keyPress.remove(_keyPress);
+      _target.on.keyUp.remove(_keyUp);
+    }
+  }
+
+  /** Determine if caps lock is one of the currently depressed keys. */
+  bool get _capsLockOn =>
+      _keyDownList.some((var element) => element.keyCode == KeyCode.CAPS_LOCK);
+
+  /**
+   * Given the previously recorded keydown key codes, see if we can determine
+   * the keycode of this keypress [event]. (Generally browsers only provide
+   * charCode information for keypress events, but with a little
+   * reverse-engineering, we can also determine the keyCode.) Returns
+   * KeyCode.UNKNOWN if the keycode could not be determined.
+   */
+  int _determineKeyCodeForKeypress(KeyboardEvent event) {
+    // Note: This function is a work in progress. We'll expand this function
+    // once we get more information about other keyboards.
+    for (var prevEvent in _keyDownList) {
+      if (prevEvent._shadowCharCode == event.charCode) {
+        return prevEvent.keyCode;
+      }
+      if ((event.shiftKey || _capsLockOn) && event.charCode >= "A".charCodes[0]
+          && event.charCode <= "Z".charCodes[0] && event.charCode +
+          _ROMAN_ALPHABET_OFFSET == prevEvent._shadowCharCode) {
+        return prevEvent.keyCode;
+      }
+    }
+    return KeyCode.UNKNOWN;
+  }
+
+  /**
+   * Given the charater code returned from a keyDown [event], try to ascertain
+   * and return the corresponding charCode for the character that was pressed.
+   * This information is not shown to the user, but used to help polyfill
+   * keypress events.
+   */
+  int _findCharCodeKeyDown(KeyboardEvent event) {
+    if (event.keyLocation == 3) { // Numpad keys.
+      switch (event.keyCode) {
+        case KeyCode.NUM_ZERO:
+          // Even though this function returns _charCodes_, for some cases the
+          // KeyCode == the charCode we want, in which case we use the keycode
+          // constant for readability.
+          return KeyCode.ZERO;
+        case KeyCode.NUM_ONE:
+          return KeyCode.ONE;
+        case KeyCode.NUM_TWO:
+          return KeyCode.TWO;
+        case KeyCode.NUM_THREE:
+          return KeyCode.THREE;
+        case KeyCode.NUM_FOUR:
+          return KeyCode.FOUR;
+        case KeyCode.NUM_FIVE:
+          return KeyCode.FIVE;
+        case KeyCode.NUM_SIX:
+          return KeyCode.SIX;
+        case KeyCode.NUM_SEVEN:
+          return KeyCode.SEVEN;
+        case KeyCode.NUM_EIGHT:
+          return KeyCode.EIGHT;
+        case KeyCode.NUM_NINE:
+          return KeyCode.NINE;
+        case KeyCode.NUM_MULTIPLY:
+          return 42; // Char code for *
+        case KeyCode.NUM_PLUS:
+          return 43; // +
+        case KeyCode.NUM_MINUS:
+          return 45; // -
+        case KeyCode.NUM_PERIOD:
+          return 46; // .
+        case KeyCode.NUM_DIVISION:
+          return 47; // /
+      }
+    } else if (event.keyCode >= 65 && event.keyCode <= 90) {
+      // Set the "char code" for key down as the lower case letter. Again, this
+      // will not show up for the user, but will be helpful in estimating
+      // keyCode locations and other information during the keyPress event.
+      return event.keyCode + _ROMAN_ALPHABET_OFFSET;
+    }
+    switch(event.keyCode) {
+      case KeyCode.SEMICOLON:
+        return KeyCode.FF_SEMICOLON;
+      case KeyCode.EQUALS:
+        return KeyCode.FF_EQUALS;
+      case KeyCode.COMMA:
+        return 44; // Ascii value for ,
+      case KeyCode.DASH:
+        return 45; // -
+      case KeyCode.PERIOD:
+        return 46; // .
+      case KeyCode.SLASH:
+        return 47; // /
+      case KeyCode.APOSTROPHE:
+        return 96; // `
+      case KeyCode.OPEN_SQUARE_BRACKET:
+        return 91; // [
+      case KeyCode.BACKSLASH:
+        return 92; // \
+      case KeyCode.CLOSE_SQUARE_BRACKET:
+        return 93; // ]
+      case KeyCode.SINGLE_QUOTE:
+        return 39; // '
+    }
+    return event.keyCode;
+  }
+
+  /**
+   * Returns true if the key fires a keypress event in the current browser.
+   */
+  bool _firesKeyPressEvent(KeyEvent event) {
+    if (!_Device.isIE && !_Device.isWebKit) {
+      return true;
+    }
+    
+    if (_Device.userAgent.contains('Mac') && event.altKey) {
+      return KeyCode.isCharacterKey(event.keyCode);
+    }
+ 
+    // Alt but not AltGr which is represented as Alt+Ctrl.
+    if (event.altKey && !event.ctrlKey) {
+      return false;
+    }
+ 
+    // Saves Ctrl or Alt + key for IE and WebKit, which won't fire keypress.
+    if (!event.shiftKey &&
+        (_keyDownList.last.keyCode == KeyCode.CTRL ||
+         _keyDownList.last.keyCode == KeyCode.ALT ||
+         _Device.userAgent.contains('Mac') &&
+         _keyDownList.last.keyCode == KeyCode.META)) {
+      return false;
+    }
+ 
+    // Some keys with Ctrl/Shift do not issue keypress in WebKit.
+    if (_Device.isWebKit && event.ctrlKey && event.shiftKey && (
+        event.keycode == KeyCode.BACKSLASH ||
+        event.keycode == KeyCode.OPEN_SQUARE_BRACKET ||
+        event.keycode == KeyCode.CLOSE_SQUARE_BRACKET ||
+        event.keycode == KeyCode.TILDE ||
+        event.keycode == KeyCode.SEMICOLON || event.keycode == KeyCode.DASH ||
+        event.keycode == KeyCode.EQUALS || event.keycode == KeyCode.COMMA ||
+        event.keycode == KeyCode.PERIOD || event.keycode == KeyCode.SLASH ||
+        event.keycode == KeyCode.APOSTROPHE ||
+        event.keycode == KeyCode.SINGLE_QUOTE)) {
+      return false;
+    }
+ 
+    switch (event.keyCode) {
+      case KeyCode.ENTER:
+        // IE9 does not fire keypress on ENTER.
+        return !_Device.isIE;
+      case KeyCode.ESC:
+        return !_Device.isWebKit;
+    }
+ 
+    return KeyCode.isCharacterKey(event.keyCode);
+  }
+
+  /**
+   * Normalize the keycodes to the IE KeyCodes (this is what Chrome, IE, and
+   * Opera all use).
+   */
+  int _normalizeKeyCodes(KeyboardEvent event) {
+    // Note: This may change once we get input about non-US keyboards.
+    if (_Device.isFirefox) {
+      switch(event.keyCode) {
+        case KeyCode.FF_EQUALS:
+          return KeyCode.EQUALS;
+        case KeyCode.FF_SEMICOLON:
+          return KeyCode.SEMICOLON;
+        case KeyCode.MAC_FF_META:
+          return KeyCode.META;
+        case KeyCode.WIN_KEY_FF_LINUX:
+          return KeyCode.WIN_KEY;
+      }
+    }
+    return event.keyCode;
+  }
+
+  /** Handle keydown events. */
+  void processKeyDown(KeyboardEvent e) {
+    // Ctrl-Tab and Alt-Tab can cause the focus to be moved to another window
+    // before we've caught a key-up event.  If the last-key was one of these
+    // we reset the state.
+    if (_keyDownList.length > 0 &&
+        (_keyDownList.last.keyCode == KeyCode.CTRL && !e.ctrlKey ||
+         _keyDownList.last.keyCode == KeyCode.ALT && !e.altKey ||
+         _Device.userAgent.contains('Mac') &&
+         _keyDownList.last.keyCode == KeyCode.META && !e.metaKey)) {
+      _keyDownList = [];
+    }
+
+    var event = new KeyEvent(e);
+    event._shadowKeyCode = _normalizeKeyCodes(event);
+    // Technically a "keydown" event doesn't have a charCode. This is
+    // calculated nonetheless to provide us with more information in giving
+    // as much information as possible on keypress about keycode and also
+    // charCode.
+    event._shadowCharCode = _findCharCodeKeyDown(event);
+    if (_keyDownList.length > 0 && event.keyCode != _keyDownList.last.keyCode &&
+        !_firesKeyPressEvent(event)) {
+      // Some browsers have quirks not firing keypress events where all other
+      // browsers do. This makes them more consistent.
+      processKeyPress(event);
+    }
+    _keyDownList.add(event);
+    _dispatch(event);
+  }
+
+  /** Handle keypress events. */
+  void processKeyPress(KeyboardEvent event) {
+    var e = new KeyEvent(event);
+    // IE reports the character code in the keyCode field for keypress events.
+    // There are two exceptions however, Enter and Escape.
+    if (_Device.isIE) {
+      if (e.keyCode == KeyCode.ENTER || e.keyCode == KeyCode.ESC) {
+        e._shadowCharCode = 0;
+      } else {
+        e._shadowCharCode = e.keyCode;
+      }
+    } else if (_Device.isOpera) {
+      // Opera reports the character code in the keyCode field.
+      e._shadowCharCode = KeyCode.isCharacterKey(keyCode) ? e.keyCode : 0;
+    }
+    // Now we guestimate about what the keycode is that was actually
+    // pressed, given previous keydown information.
+    e._shadowKeyCode = _determineKeyCodeForKeypress(e);
+
+    // Correct the key value for certain browser-specific quirks.
+    if (e._shadowKeyIdentifier &&
+        _keyIdentifier.contains(e._shadowKeyIdentifier)) {
+      // This is needed for Safari Windows because it currently doesn't give a
+      // keyCode/which for non printable keys.
+      e._shadowKeyCode = _keyIdentifier[keyIdentifier];
+    }
+    e._shadowAltKey = _keyDownList.some((var element) => element.altKey);
+    _dispatch(e);
+  }
+
+  /** Handle keyup events. */
+  void processKeyUp(KeyboardEvent event) {
+    var e = new KeyEvent(event);
+    KeyboardEvent toRemove = null;
+    for (var key in _keyDownList) {
+      if (key.keyCode == e.keyCode) {
+        toRemove = key;
+      }
+    }
+    if (toRemove != null) {
+      _keyDownList = _keyDownList.filter((element) => element != toRemove);
+    } else if (_keyDownList.length > 0) {
+      // This happens when we've reached some international keyboard case we
+      // haven't accounted for or we haven't correctly eliminated all browser
+      // inconsistencies. Filing bugs on when this is reached is welcome! 
+      _keyDownList.removeLast(); 
+    }
+    _dispatch(e);
+  }
+}
+// Copyright (c) 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.
+
+
+/**
  * Defines the keycode values for keys that are returned by 
  * KeyboardEvent.keyCode.
  * 
@@ -22699,6 +22888,36 @@
   static const int WIN_KEY = 224;
   static const int MAC_FF_META = 224;
   static const int WIN_IME = 229;
+
+  /** A sentinel value if the keycode could not be determined. */
+  static const int UNKNOWN = -1;
+
+  /**
+   * Returns true if the keyCode produces a (US keyboard) character.
+   * Note: This does not (yet) cover characters on non-US keyboards (Russian,
+   * Hebrew, etc.).
+   */
+  static bool isCharacterKey(int keyCode) {
+    if ((keyCode >= ZERO && keyCode <= NINE) ||
+        (keyCode >= NUM_ZERO && keyCode <= NUM_MULTIPLY) ||
+        (keyCode >= A && keyCode <= Z)) {
+      return true;
+    }
+ 
+    // Safari sends zero key code for non-latin characters.
+    if (_Device.isWebKit && keyCode == 0) {
+      return true;
+    }
+ 
+    return (keyCode == SPACE || keyCode == QUESTION_MARK || keyCode == NUM_PLUS
+        || keyCode == NUM_MINUS || keyCode == NUM_PERIOD ||
+        keyCode == NUM_DIVISION || keyCode == SEMICOLON ||
+        keyCode == FF_SEMICOLON || keyCode == DASH || keyCode == EQUALS ||
+        keyCode == FF_EQUALS || keyCode == COMMA || keyCode == PERIOD ||
+        keyCode == SLASH || keyCode == APOSTROPHE || keyCode == SINGLE_QUOTE ||
+        keyCode == OPEN_SQUARE_BRACKET || keyCode == BACKSLASH ||
+        keyCode == CLOSE_SQUARE_BRACKET);
+  }
 }
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -24054,7 +24273,7 @@
 
   static DocumentFragment createDocumentFragment_html(String html) {
     final fragment = new DocumentFragment();
-    fragment.innerHTML = html;
+    fragment.innerHtml = html;
     return fragment;
   }
 
@@ -24062,7 +24281,7 @@
   // factory DocumentFragment.xml(String xml) {
   //   final fragment = new DocumentFragment();
   //   final e = new XMLElement.tag("xml");
-  //   e.innerHTML = xml;
+  //   e.innerHtml = xml;
   //
   //   // Copy list first since we don't want liveness during iteration.
   //   final List nodes = new List.from(e.nodes);
@@ -24073,7 +24292,7 @@
   static DocumentFragment createDocumentFragment_svg(String svgContent) {
     final fragment = new DocumentFragment();
     final e = new svg.SVGSVGElement();
-    e.innerHTML = svgContent;
+    e.innerHtml = svgContent;
 
     // Copy list first since we don't want liveness during iteration.
     final List nodes = new List.from(e.nodes);
@@ -24632,19 +24851,114 @@
     }
   }
 }
+/**
+ * A custom KeyboardEvent that attempts to eliminate cross-browser
+ * inconsistencies, and also provide both keyCode and charCode information
+ * for all key events (when such information can be determined).
+ *
+ * This class is very much a work in progress, and we'd love to get information
+ * on how we can make this class work with as many international keyboards as
+ * possible. Bugs welcome!
+ */
+class KeyEvent implements KeyboardEvent {
+  /** The parent KeyboardEvent that this KeyEvent is wrapping and "fixing". */
+  KeyboardEvent _parent;
+
+  /** The "fixed" value of whether the alt key is being pressed. */
+  bool _shadowAltKey;
+
+  /** Caculated value of what the estimated charCode is for this event. */
+  int _shadowCharCode;
+
+  /** Caculated value of what the estimated keyCode is for this event. */
+  int _shadowKeyCode;
+
+  /** Caculated value of what the estimated keyCode is for this event. */
+  int get keyCode => _shadowKeyCode;
+
+  /** Caculated value of what the estimated charCode is for this event. */
+  int get charCode => this.type == 'keypress' ? _shadowCharCode : 0;
+
+  /** Caculated value of whether the alt key is pressed is for this event. */
+  bool get altKey => _shadowAltKey;
+
+  /** Caculated value of what the estimated keyCode is for this event. */
+  int get which => keyCode;
+
+  /** Accessor to the underlying keyCode value is the parent event. */
+  int get _realKeyCode => JS('int', '#.keyCode', _parent);
+  
+  /** Accessor to the underlying charCode value is the parent event. */
+  int get _realCharCode => JS('int', '#.charCode', _parent);
+
+  /** Accessor to the underlying altKey value is the parent event. */
+  bool get _realAltKey => JS('int', '#.altKey', _parent);
+
+  /** Construct a KeyEvent with [parent] as event we're emulating. */
+  KeyEvent(KeyboardEvent parent) {
+    _parent = parent;
+    _shadowAltKey = _realAltKey;
+    _shadowCharCode = _realCharCode;
+    _shadowKeyCode = _realKeyCode;
+  }
+
+  /** True if the altGraphKey is pressed during this event. */
+  bool get altGraphKey => _parent.altGraphKey;
+  bool get bubbles => _parent.bubbles;
+  /** True if this event can be cancelled. */
+  bool get cancelable => _parent.cancelable;
+  bool get cancelBubble => _parent.cancelBubble;
+  set cancelBubble(bool cancel) => _parent = cancel;  
+  /** Accessor to the clipboardData available for this event. */
+  Clipboard get clipboardData => _parent.clipboardData;
+  /** True if the ctrl key is pressed during this event. */
+  bool get ctrlKey => _parent.ctrlKey;
+  /** Accessor to the target this event is listening to for changes. */
+  EventTarget get currentTarget => _parent.currentTarget;
+  bool get defaultPrevented => _parent.defaultPrevented;
+  int get detail => _parent.detail;
+  int get eventPhase => _parent.eventPhase;
+  /**
+   * Accessor to the part of the keyboard that the key was pressed from (one of
+   * KeyLocation.STANDARD, KeyLocation.RIGHT, KeyLocation.LEFT,
+   * KeyLocation.NUMPAD, KeyLocation.MOBILE, KeyLocation.JOYSTICK).
+   */
+  int get keyLocation => _parent.keyLocation;
+  int get layerX => _parent.layerX;
+  int get layerY => _parent.layerY;
+  /** True if the Meta (or Mac command) key is pressed during this event. */
+  bool get metaKey => _parent.metaKey;
+  int get pageX => _parent.pageX;
+  int get pageY => _parent.pageY;
+  bool get returnValue => _parent.returnValue;
+  set returnValue(bool value) => _parent = value;  
+  /** True if the shift key was pressed during this event. */
+  bool get shiftKey => _parent.shiftKey;
+  int get timeStamp => _parent.timeStamp;
+  /**
+   * The type of key event that occurred. One of "keydown", "keyup", or
+   * "keypress".
+   */
+  String get type => _parent.type;
+  Window get view => _parent.view;
+  void preventDefault() => _parent.preventDefault();
+  void stopImmediatePropagation() => _parent.stopImmediatePropagation();
+  void stopPropagation() => _parent.stopPropagation();
+  void $dom_initUIEvent(String type, bool canBubble, bool cancelable,
+      LocalWindow view, int detail) {
+    throw new UnsupportedError("Cannot initialize a UI Event from a KeyEvent.");
+  }
+  void $dom_initEvent(String eventTypeArg, bool canBubbleArg,
+      bool cancelableArg) {
+    throw new UnsupportedError("Cannot initialize an Event from a KeyEvent.");
+  }
+  String get _shadowKeyIdentifier => JS('String', '#.keyIdentifier', _parent);
+}
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 
-class _AudioContextFactoryProvider {
-
-  static AudioContext createAudioContext() {
-    return JS('AudioContext',
-              'new (window.AudioContext || window.webkitAudioContext)()');
-  }
-}
-
 class _PointFactoryProvider {
   static Point createPoint(num x, num y) =>
       JS('Point', 'new WebKitPoint(#, #)', x, y);
diff --git a/sdk/lib/html/dartium/html_dartium.dart b/sdk/lib/html/dartium/html_dartium.dart
index e430f59..a20b646 100644
--- a/sdk/lib/html/dartium/html_dartium.dart
+++ b/sdk/lib/html/dartium/html_dartium.dart
@@ -4,6 +4,7 @@
 import 'dart:json';
 import 'dart:nativewrappers';
 import 'dart:svg' as svg;
+import 'dart:web_audio' as web_audio;
 // Copyright (c) 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.
@@ -12,6 +13,7 @@
 // Auto-generated dart:html library.
 
 
+// Not actually used, but imported since dart:html can generate these objects.
 
 
 
@@ -100,66 +102,6 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName AnalyserNode
-class AnalyserNode extends AudioNode {
-  AnalyserNode.internal(): super.internal();
-
-
-  /** @domName AnalyserNode.fftSize */
-  int get fftSize native "AnalyserNode_fftSize_Getter";
-
-
-  /** @domName AnalyserNode.fftSize */
-  void set fftSize(int value) native "AnalyserNode_fftSize_Setter";
-
-
-  /** @domName AnalyserNode.frequencyBinCount */
-  int get frequencyBinCount native "AnalyserNode_frequencyBinCount_Getter";
-
-
-  /** @domName AnalyserNode.maxDecibels */
-  num get maxDecibels native "AnalyserNode_maxDecibels_Getter";
-
-
-  /** @domName AnalyserNode.maxDecibels */
-  void set maxDecibels(num value) native "AnalyserNode_maxDecibels_Setter";
-
-
-  /** @domName AnalyserNode.minDecibels */
-  num get minDecibels native "AnalyserNode_minDecibels_Getter";
-
-
-  /** @domName AnalyserNode.minDecibels */
-  void set minDecibels(num value) native "AnalyserNode_minDecibels_Setter";
-
-
-  /** @domName AnalyserNode.smoothingTimeConstant */
-  num get smoothingTimeConstant native "AnalyserNode_smoothingTimeConstant_Getter";
-
-
-  /** @domName AnalyserNode.smoothingTimeConstant */
-  void set smoothingTimeConstant(num value) native "AnalyserNode_smoothingTimeConstant_Setter";
-
-
-  /** @domName AnalyserNode.getByteFrequencyData */
-  void getByteFrequencyData(Uint8Array array) native "AnalyserNode_getByteFrequencyData_Callback";
-
-
-  /** @domName AnalyserNode.getByteTimeDomainData */
-  void getByteTimeDomainData(Uint8Array array) native "AnalyserNode_getByteTimeDomainData_Callback";
-
-
-  /** @domName AnalyserNode.getFloatFrequencyData */
-  void getFloatFrequencyData(Float32Array array) native "AnalyserNode_getFloatFrequencyData_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
 /// @domName HTMLAnchorElement
 class AnchorElement extends _Element_Merged {
 
@@ -721,554 +663,6 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName AudioBuffer
-class AudioBuffer extends NativeFieldWrapperClass1 {
-  AudioBuffer.internal();
-
-
-  /** @domName AudioBuffer.duration */
-  num get duration native "AudioBuffer_duration_Getter";
-
-
-  /** @domName AudioBuffer.gain */
-  num get gain native "AudioBuffer_gain_Getter";
-
-
-  /** @domName AudioBuffer.gain */
-  void set gain(num value) native "AudioBuffer_gain_Setter";
-
-
-  /** @domName AudioBuffer.length */
-  int get length native "AudioBuffer_length_Getter";
-
-
-  /** @domName AudioBuffer.numberOfChannels */
-  int get numberOfChannels native "AudioBuffer_numberOfChannels_Getter";
-
-
-  /** @domName AudioBuffer.sampleRate */
-  num get sampleRate native "AudioBuffer_sampleRate_Getter";
-
-
-  /** @domName AudioBuffer.getChannelData */
-  Float32Array getChannelData(int channelIndex) native "AudioBuffer_getChannelData_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-typedef void AudioBufferCallback(AudioBuffer audioBuffer);
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-/// @domName AudioBufferSourceNode
-class AudioBufferSourceNode extends AudioSourceNode {
-  AudioBufferSourceNode.internal(): super.internal();
-
-  static const int FINISHED_STATE = 3;
-
-  static const int PLAYING_STATE = 2;
-
-  static const int SCHEDULED_STATE = 1;
-
-  static const int UNSCHEDULED_STATE = 0;
-
-
-  /** @domName AudioBufferSourceNode.buffer */
-  AudioBuffer get buffer native "AudioBufferSourceNode_buffer_Getter";
-
-
-  /** @domName AudioBufferSourceNode.buffer */
-  void set buffer(AudioBuffer value) native "AudioBufferSourceNode_buffer_Setter";
-
-
-  /** @domName AudioBufferSourceNode.gain */
-  AudioGain get gain native "AudioBufferSourceNode_gain_Getter";
-
-
-  /** @domName AudioBufferSourceNode.loop */
-  bool get loop native "AudioBufferSourceNode_loop_Getter";
-
-
-  /** @domName AudioBufferSourceNode.loop */
-  void set loop(bool value) native "AudioBufferSourceNode_loop_Setter";
-
-
-  /** @domName AudioBufferSourceNode.loopEnd */
-  num get loopEnd native "AudioBufferSourceNode_loopEnd_Getter";
-
-
-  /** @domName AudioBufferSourceNode.loopEnd */
-  void set loopEnd(num value) native "AudioBufferSourceNode_loopEnd_Setter";
-
-
-  /** @domName AudioBufferSourceNode.loopStart */
-  num get loopStart native "AudioBufferSourceNode_loopStart_Getter";
-
-
-  /** @domName AudioBufferSourceNode.loopStart */
-  void set loopStart(num value) native "AudioBufferSourceNode_loopStart_Setter";
-
-
-  /** @domName AudioBufferSourceNode.playbackRate */
-  AudioParam get playbackRate native "AudioBufferSourceNode_playbackRate_Getter";
-
-
-  /** @domName AudioBufferSourceNode.playbackState */
-  int get playbackState native "AudioBufferSourceNode_playbackState_Getter";
-
-  void start(/*double*/ when, [/*double*/ grainOffset, /*double*/ grainDuration]) {
-    if ((when is num || when == null) && !?grainOffset && !?grainDuration) {
-      _start_1(when);
-      return;
-    }
-    if ((when is num || when == null) && (grainOffset is num || grainOffset == null) && (grainDuration is num || grainDuration == null)) {
-      _start_2(when, grainOffset, grainDuration);
-      return;
-    }
-    throw "Incorrect number or type of arguments";
-  }
-
-
-  /** @domName AudioBufferSourceNode.start_1 */
-  void _start_1(when) native "AudioBufferSourceNode_start_1_Callback";
-
-
-  /** @domName AudioBufferSourceNode.start_2 */
-  void _start_2(when, grainOffset, grainDuration) native "AudioBufferSourceNode_start_2_Callback";
-
-
-  /** @domName AudioBufferSourceNode.stop */
-  void stop(num when) native "AudioBufferSourceNode_stop_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-class AudioContext extends EventTarget {
-  factory AudioContext() => _AudioContextFactoryProvider.createAudioContext();
-  AudioContext.internal(): super.internal();
-
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
-  AudioContextEvents get on =>
-    new AudioContextEvents(this);
-
-
-  /** @domName AudioContext.activeSourceCount */
-  int get activeSourceCount native "AudioContext_activeSourceCount_Getter";
-
-
-  /** @domName AudioContext.currentTime */
-  num get currentTime native "AudioContext_currentTime_Getter";
-
-
-  /** @domName AudioContext.destination */
-  AudioDestinationNode get destination native "AudioContext_destination_Getter";
-
-
-  /** @domName AudioContext.listener */
-  AudioListener get listener native "AudioContext_listener_Getter";
-
-
-  /** @domName AudioContext.sampleRate */
-  num get sampleRate native "AudioContext_sampleRate_Getter";
-
-
-  /** @domName AudioContext.createAnalyser */
-  AnalyserNode createAnalyser() native "AudioContext_createAnalyser_Callback";
-
-
-  /** @domName AudioContext.createBiquadFilter */
-  BiquadFilterNode createBiquadFilter() native "AudioContext_createBiquadFilter_Callback";
-
-  AudioBuffer createBuffer(buffer_OR_numberOfChannels, mixToMono_OR_numberOfFrames, [/*float*/ sampleRate]) {
-    if ((buffer_OR_numberOfChannels is int || buffer_OR_numberOfChannels == null) && (mixToMono_OR_numberOfFrames is int || mixToMono_OR_numberOfFrames == null) && (sampleRate is num || sampleRate == null)) {
-      return _createBuffer_1(buffer_OR_numberOfChannels, mixToMono_OR_numberOfFrames, sampleRate);
-    }
-    if ((buffer_OR_numberOfChannels is ArrayBuffer || buffer_OR_numberOfChannels == null) && (mixToMono_OR_numberOfFrames is bool || mixToMono_OR_numberOfFrames == null) && !?sampleRate) {
-      return _createBuffer_2(buffer_OR_numberOfChannels, mixToMono_OR_numberOfFrames);
-    }
-    throw "Incorrect number or type of arguments";
-  }
-
-
-  /** @domName AudioContext.createBuffer_1 */
-  AudioBuffer _createBuffer_1(buffer_OR_numberOfChannels, mixToMono_OR_numberOfFrames, sampleRate) native "AudioContext_createBuffer_1_Callback";
-
-
-  /** @domName AudioContext.createBuffer_2 */
-  AudioBuffer _createBuffer_2(buffer_OR_numberOfChannels, mixToMono_OR_numberOfFrames) native "AudioContext_createBuffer_2_Callback";
-
-
-  /** @domName AudioContext.createBufferSource */
-  AudioBufferSourceNode createBufferSource() native "AudioContext_createBufferSource_Callback";
-
-  ChannelMergerNode createChannelMerger([/*unsigned long*/ numberOfInputs]) {
-    if (?numberOfInputs) {
-      return _createChannelMerger_1(numberOfInputs);
-    }
-    return _createChannelMerger_2();
-  }
-
-
-  /** @domName AudioContext.createChannelMerger_1 */
-  ChannelMergerNode _createChannelMerger_1(numberOfInputs) native "AudioContext_createChannelMerger_1_Callback";
-
-
-  /** @domName AudioContext.createChannelMerger_2 */
-  ChannelMergerNode _createChannelMerger_2() native "AudioContext_createChannelMerger_2_Callback";
-
-  ChannelSplitterNode createChannelSplitter([/*unsigned long*/ numberOfOutputs]) {
-    if (?numberOfOutputs) {
-      return _createChannelSplitter_1(numberOfOutputs);
-    }
-    return _createChannelSplitter_2();
-  }
-
-
-  /** @domName AudioContext.createChannelSplitter_1 */
-  ChannelSplitterNode _createChannelSplitter_1(numberOfOutputs) native "AudioContext_createChannelSplitter_1_Callback";
-
-
-  /** @domName AudioContext.createChannelSplitter_2 */
-  ChannelSplitterNode _createChannelSplitter_2() native "AudioContext_createChannelSplitter_2_Callback";
-
-
-  /** @domName AudioContext.createConvolver */
-  ConvolverNode createConvolver() native "AudioContext_createConvolver_Callback";
-
-  DelayNode createDelay([/*double*/ maxDelayTime]) {
-    if (?maxDelayTime) {
-      return _createDelay_1(maxDelayTime);
-    }
-    return _createDelay_2();
-  }
-
-
-  /** @domName AudioContext.createDelay_1 */
-  DelayNode _createDelay_1(maxDelayTime) native "AudioContext_createDelay_1_Callback";
-
-
-  /** @domName AudioContext.createDelay_2 */
-  DelayNode _createDelay_2() native "AudioContext_createDelay_2_Callback";
-
-
-  /** @domName AudioContext.createDynamicsCompressor */
-  DynamicsCompressorNode createDynamicsCompressor() native "AudioContext_createDynamicsCompressor_Callback";
-
-
-  /** @domName AudioContext.createGain */
-  GainNode createGain() native "AudioContext_createGain_Callback";
-
-
-  /** @domName AudioContext.createMediaElementSource */
-  MediaElementAudioSourceNode createMediaElementSource(MediaElement mediaElement) native "AudioContext_createMediaElementSource_Callback";
-
-
-  /** @domName AudioContext.createMediaStreamSource */
-  MediaStreamAudioSourceNode createMediaStreamSource(MediaStream mediaStream) native "AudioContext_createMediaStreamSource_Callback";
-
-
-  /** @domName AudioContext.createOscillator */
-  OscillatorNode createOscillator() native "AudioContext_createOscillator_Callback";
-
-
-  /** @domName AudioContext.createPanner */
-  PannerNode createPanner() native "AudioContext_createPanner_Callback";
-
-  ScriptProcessorNode createScriptProcessor(/*unsigned long*/ bufferSize, [/*unsigned long*/ numberOfInputChannels, /*unsigned long*/ numberOfOutputChannels]) {
-    if (?numberOfOutputChannels) {
-      return _createScriptProcessor_1(bufferSize, numberOfInputChannels, numberOfOutputChannels);
-    }
-    if (?numberOfInputChannels) {
-      return _createScriptProcessor_2(bufferSize, numberOfInputChannels);
-    }
-    return _createScriptProcessor_3(bufferSize);
-  }
-
-
-  /** @domName AudioContext.createScriptProcessor_1 */
-  ScriptProcessorNode _createScriptProcessor_1(bufferSize, numberOfInputChannels, numberOfOutputChannels) native "AudioContext_createScriptProcessor_1_Callback";
-
-
-  /** @domName AudioContext.createScriptProcessor_2 */
-  ScriptProcessorNode _createScriptProcessor_2(bufferSize, numberOfInputChannels) native "AudioContext_createScriptProcessor_2_Callback";
-
-
-  /** @domName AudioContext.createScriptProcessor_3 */
-  ScriptProcessorNode _createScriptProcessor_3(bufferSize) native "AudioContext_createScriptProcessor_3_Callback";
-
-
-  /** @domName AudioContext.createWaveShaper */
-  WaveShaperNode createWaveShaper() native "AudioContext_createWaveShaper_Callback";
-
-
-  /** @domName AudioContext.createWaveTable */
-  WaveTable createWaveTable(Float32Array real, Float32Array imag) native "AudioContext_createWaveTable_Callback";
-
-
-  /** @domName AudioContext.decodeAudioData */
-  void decodeAudioData(ArrayBuffer audioData, AudioBufferCallback successCallback, [AudioBufferCallback errorCallback]) native "AudioContext_decodeAudioData_Callback";
-
-
-  /** @domName AudioContext.startRendering */
-  void startRendering() native "AudioContext_startRendering_Callback";
-
-}
-
-class AudioContextEvents extends Events {
-  AudioContextEvents(EventTarget _ptr) : super(_ptr);
-
-  EventListenerList get complete => this['complete'];
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-/// @domName AudioDestinationNode
-class AudioDestinationNode extends AudioNode {
-  AudioDestinationNode.internal(): super.internal();
-
-
-  /** @domName AudioDestinationNode.numberOfChannels */
-  int get numberOfChannels native "AudioDestinationNode_numberOfChannels_Getter";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-/// @domName HTMLAudioElement
-class AudioElement extends MediaElement {
-
-  factory AudioElement([String src]) {
-    if (!?src) {
-      return _AudioElementFactoryProvider.createAudioElement();
-    }
-    return _AudioElementFactoryProvider.createAudioElement(src);
-  }
-  AudioElement.internal(): super.internal();
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-/// @domName AudioGain
-class AudioGain extends AudioParam {
-  AudioGain.internal(): super.internal();
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-/// @domName AudioListener
-class AudioListener extends NativeFieldWrapperClass1 {
-  AudioListener.internal();
-
-
-  /** @domName AudioListener.dopplerFactor */
-  num get dopplerFactor native "AudioListener_dopplerFactor_Getter";
-
-
-  /** @domName AudioListener.dopplerFactor */
-  void set dopplerFactor(num value) native "AudioListener_dopplerFactor_Setter";
-
-
-  /** @domName AudioListener.speedOfSound */
-  num get speedOfSound native "AudioListener_speedOfSound_Getter";
-
-
-  /** @domName AudioListener.speedOfSound */
-  void set speedOfSound(num value) native "AudioListener_speedOfSound_Setter";
-
-
-  /** @domName AudioListener.setOrientation */
-  void setOrientation(num x, num y, num z, num xUp, num yUp, num zUp) native "AudioListener_setOrientation_Callback";
-
-
-  /** @domName AudioListener.setPosition */
-  void setPosition(num x, num y, num z) native "AudioListener_setPosition_Callback";
-
-
-  /** @domName AudioListener.setVelocity */
-  void setVelocity(num x, num y, num z) native "AudioListener_setVelocity_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-/// @domName AudioNode
-class AudioNode extends NativeFieldWrapperClass1 {
-  AudioNode.internal();
-
-
-  /** @domName AudioNode.context */
-  AudioContext get context native "AudioNode_context_Getter";
-
-
-  /** @domName AudioNode.numberOfInputs */
-  int get numberOfInputs native "AudioNode_numberOfInputs_Getter";
-
-
-  /** @domName AudioNode.numberOfOutputs */
-  int get numberOfOutputs native "AudioNode_numberOfOutputs_Getter";
-
-  void connect(destination, /*unsigned long*/ output, [/*unsigned long*/ input]) {
-    if ((destination is AudioNode || destination == null) && (output is int || output == null) && (input is int || input == null)) {
-      _connect_1(destination, output, input);
-      return;
-    }
-    if ((destination is AudioParam || destination == null) && (output is int || output == null) && !?input) {
-      _connect_2(destination, output);
-      return;
-    }
-    throw "Incorrect number or type of arguments";
-  }
-
-
-  /** @domName AudioNode.connect_1 */
-  void _connect_1(destination, output, input) native "AudioNode_connect_1_Callback";
-
-
-  /** @domName AudioNode.connect_2 */
-  void _connect_2(destination, output) native "AudioNode_connect_2_Callback";
-
-
-  /** @domName AudioNode.disconnect */
-  void disconnect(int output) native "AudioNode_disconnect_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-/// @domName AudioParam
-class AudioParam extends NativeFieldWrapperClass1 {
-  AudioParam.internal();
-
-
-  /** @domName AudioParam.defaultValue */
-  num get defaultValue native "AudioParam_defaultValue_Getter";
-
-
-  /** @domName AudioParam.maxValue */
-  num get maxValue native "AudioParam_maxValue_Getter";
-
-
-  /** @domName AudioParam.minValue */
-  num get minValue native "AudioParam_minValue_Getter";
-
-
-  /** @domName AudioParam.name */
-  String get name native "AudioParam_name_Getter";
-
-
-  /** @domName AudioParam.units */
-  int get units native "AudioParam_units_Getter";
-
-
-  /** @domName AudioParam.value */
-  num get value native "AudioParam_value_Getter";
-
-
-  /** @domName AudioParam.value */
-  void set value(num value) native "AudioParam_value_Setter";
-
-
-  /** @domName AudioParam.cancelScheduledValues */
-  void cancelScheduledValues(num startTime) native "AudioParam_cancelScheduledValues_Callback";
-
-
-  /** @domName AudioParam.exponentialRampToValueAtTime */
-  void exponentialRampToValueAtTime(num value, num time) native "AudioParam_exponentialRampToValueAtTime_Callback";
-
-
-  /** @domName AudioParam.linearRampToValueAtTime */
-  void linearRampToValueAtTime(num value, num time) native "AudioParam_linearRampToValueAtTime_Callback";
-
-
-  /** @domName AudioParam.setTargetAtTime */
-  void setTargetAtTime(num target, num time, num timeConstant) native "AudioParam_setTargetAtTime_Callback";
-
-
-  /** @domName AudioParam.setValueAtTime */
-  void setValueAtTime(num value, num time) native "AudioParam_setValueAtTime_Callback";
-
-
-  /** @domName AudioParam.setValueCurveAtTime */
-  void setValueCurveAtTime(Float32Array values, num time, num duration) native "AudioParam_setValueCurveAtTime_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-/// @domName AudioProcessingEvent
-class AudioProcessingEvent extends Event {
-  AudioProcessingEvent.internal(): super.internal();
-
-
-  /** @domName AudioProcessingEvent.inputBuffer */
-  AudioBuffer get inputBuffer native "AudioProcessingEvent_inputBuffer_Getter";
-
-
-  /** @domName AudioProcessingEvent.outputBuffer */
-  AudioBuffer get outputBuffer native "AudioProcessingEvent_outputBuffer_Getter";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-/// @domName AudioSourceNode
-class AudioSourceNode extends AudioNode {
-  AudioSourceNode.internal(): super.internal();
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
 /// @domName HTMLBRElement
 class BRElement extends _Element_Merged {
 
@@ -1445,58 +839,6 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName BiquadFilterNode
-class BiquadFilterNode extends AudioNode {
-  BiquadFilterNode.internal(): super.internal();
-
-  static const int ALLPASS = 7;
-
-  static const int BANDPASS = 2;
-
-  static const int HIGHPASS = 1;
-
-  static const int HIGHSHELF = 4;
-
-  static const int LOWPASS = 0;
-
-  static const int LOWSHELF = 3;
-
-  static const int NOTCH = 6;
-
-  static const int PEAKING = 5;
-
-
-  /** @domName BiquadFilterNode.Q */
-  AudioParam get Q native "BiquadFilterNode_Q_Getter";
-
-
-  /** @domName BiquadFilterNode.frequency */
-  AudioParam get frequency native "BiquadFilterNode_frequency_Getter";
-
-
-  /** @domName BiquadFilterNode.gain */
-  AudioParam get gain native "BiquadFilterNode_gain_Getter";
-
-
-  /** @domName BiquadFilterNode.type */
-  int get type native "BiquadFilterNode_type_Getter";
-
-
-  /** @domName BiquadFilterNode.type */
-  void set type(int value) native "BiquadFilterNode_type_Setter";
-
-
-  /** @domName BiquadFilterNode.getFrequencyResponse */
-  void getFrequencyResponse(Float32Array frequencyHz, Float32Array magResponse, Float32Array phaseResponse) native "BiquadFilterNode_getFrequencyResponse_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
 /// @domName Blob
 class Blob extends NativeFieldWrapperClass1 {
 
@@ -2261,7 +1603,7 @@
 
 
   /** @domName CSSPrimitiveValue.getRGBColorValue */
-  RGBColor getRGBColorValue() native "CSSPrimitiveValue_getRGBColorValue_Callback";
+  RGBColor getRgbColorValue() native "CSSPrimitiveValue_getRGBColorValue_Callback";
 
 
   /** @domName CSSPrimitiveValue.getRectValue */
@@ -2352,6 +1694,7 @@
   return _cachedBrowserPrefix;
 }
 
+/// @domName CSSStyleDeclaration
 class CSSStyleDeclaration extends NativeFieldWrapperClass1 {
   factory CSSStyleDeclaration() => _CSSStyleDeclarationFactoryProvider.createCSSStyleDeclaration();
   factory CSSStyleDeclaration.css(String css) =>
@@ -2377,7 +1720,7 @@
 
 
   /** @domName CSSStyleDeclaration.getPropertyCSSValue */
-  CSSValue getPropertyCSSValue(String propertyName) native "CSSStyleDeclaration_getPropertyCSSValue_Callback";
+  CSSValue getPropertyCssValue(String propertyName) native "CSSStyleDeclaration_getPropertyCSSValue_Callback";
 
 
   /** @domName CSSStyleDeclaration.getPropertyPriority */
@@ -5747,6 +5090,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
+/// @domName HTMLCanvasElement
 class CanvasElement extends _Element_Merged {
 
   factory CanvasElement({int width, int height}) {
@@ -5779,7 +5123,7 @@
 
 
   /** @domName HTMLCanvasElement.toDataURL */
-  String toDataURL(String type, [num quality]) native "HTMLCanvasElement_toDataURL_Callback";
+  String toDataUrl(String type, [num quality]) native "HTMLCanvasElement_toDataURL_Callback";
 
 
   CanvasRenderingContext2D get context2d => getContext('2d');
@@ -5833,6 +5177,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
+/// @domName CanvasRenderingContext2D
 class CanvasRenderingContext2D extends CanvasRenderingContext {
   CanvasRenderingContext2D.internal(): super.internal();
 
@@ -6520,30 +5865,6 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName ChannelMergerNode
-class ChannelMergerNode extends AudioNode {
-  ChannelMergerNode.internal(): super.internal();
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-/// @domName ChannelSplitterNode
-class ChannelSplitterNode extends AudioNode {
-  ChannelSplitterNode.internal(): super.internal();
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
 /// @domName CharacterData
 class CharacterData extends Node {
   CharacterData.internal(): super.internal();
@@ -6870,34 +6191,6 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName ConvolverNode
-class ConvolverNode extends AudioNode {
-  ConvolverNode.internal(): super.internal();
-
-
-  /** @domName ConvolverNode.buffer */
-  AudioBuffer get buffer native "ConvolverNode_buffer_Getter";
-
-
-  /** @domName ConvolverNode.buffer */
-  void set buffer(AudioBuffer value) native "ConvolverNode_buffer_Setter";
-
-
-  /** @domName ConvolverNode.normalize */
-  bool get normalize native "ConvolverNode_normalize_Getter";
-
-
-  /** @domName ConvolverNode.normalize */
-  void set normalize(bool value) native "ConvolverNode_normalize_Setter";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
 /// @domName Coordinates
 class Coordinates extends NativeFieldWrapperClass1 {
   Coordinates.internal();
@@ -6978,6 +6271,7 @@
 // WARNING: Do not edit - generated code.
 
 
+/// @domName CustomEvent
 class CustomEvent extends Event {
   factory CustomEvent(String type, [bool canBubble = true, bool cancelable = true,
       Object detail]) => _CustomEventFactoryProvider.createCustomEvent(
@@ -7238,7 +6532,7 @@
 
 
   /** @domName DOMImplementation.createCSSStyleSheet */
-  CSSStyleSheet createCSSStyleSheet(String title, String media) native "DOMImplementation_createCSSStyleSheet_Callback";
+  CSSStyleSheet createCssStyleSheet(String title, String media) native "DOMImplementation_createCSSStyleSheet_Callback";
 
 
   /** @domName DOMImplementation.createDocument */
@@ -7250,7 +6544,7 @@
 
 
   /** @domName DOMImplementation.createHTMLDocument */
-  HtmlDocument createHTMLDocument(String title) native "DOMImplementation_createHTMLDocument_Callback";
+  HtmlDocument createHtmlDocument(String title) native "DOMImplementation_createHTMLDocument_Callback";
 
 
   /** @domName DOMImplementation.hasFeature */
@@ -8171,22 +7465,6 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName DelayNode
-class DelayNode extends AudioNode {
-  DelayNode.internal(): super.internal();
-
-
-  /** @domName DelayNode.delayTime */
-  AudioParam get delayTime native "DelayNode_delayTime_Getter";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
 /// @domName HTMLDetailsElement
 class DetailsElement extends _Element_Merged {
 
@@ -8377,6 +7655,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
+/// @domName Document
 class Document extends Node 
 {
 
@@ -8496,7 +7775,7 @@
 
 
   /** @domName Document.createCDATASection */
-  CDATASection createCDATASection(String data) native "Document_createCDATASection_Callback";
+  CDATASection createCDataSection(String data) native "Document_createCDATASection_Callback";
 
 
   /** @domName Document.createDocumentFragment */
@@ -8540,7 +7819,7 @@
 
 
   /** @domName Document.getCSSCanvasContext */
-  CanvasRenderingContext getCSSCanvasContext(String contextId, String name, int width, int height) native "Document_getCSSCanvasContext_Callback";
+  CanvasRenderingContext getCssCanvasContext(String contextId, String name, int width, int height) native "Document_getCSSCanvasContext_Callback";
 
 
   /** @domName Document.getElementById */
@@ -8636,100 +7915,10 @@
 class DocumentEvents extends ElementEvents {
   DocumentEvents(EventTarget _ptr) : super(_ptr);
 
-  EventListenerList get abort => this['abort'];
-
-  EventListenerList get beforeCopy => this['beforecopy'];
-
-  EventListenerList get beforeCut => this['beforecut'];
-
-  EventListenerList get beforePaste => this['beforepaste'];
-
-  EventListenerList get blur => this['blur'];
-
-  EventListenerList get change => this['change'];
-
-  EventListenerList get click => this['click'];
-
-  EventListenerList get contextMenu => this['contextmenu'];
-
-  EventListenerList get copy => this['copy'];
-
-  EventListenerList get cut => this['cut'];
-
-  EventListenerList get doubleClick => this['dblclick'];
-
-  EventListenerList get drag => this['drag'];
-
-  EventListenerList get dragEnd => this['dragend'];
-
-  EventListenerList get dragEnter => this['dragenter'];
-
-  EventListenerList get dragLeave => this['dragleave'];
-
-  EventListenerList get dragOver => this['dragover'];
-
-  EventListenerList get dragStart => this['dragstart'];
-
-  EventListenerList get drop => this['drop'];
-
-  EventListenerList get error => this['error'];
-
-  EventListenerList get focus => this['focus'];
-
-  EventListenerList get input => this['input'];
-
-  EventListenerList get invalid => this['invalid'];
-
-  EventListenerList get keyDown => this['keydown'];
-
-  EventListenerList get keyPress => this['keypress'];
-
-  EventListenerList get keyUp => this['keyup'];
-
-  EventListenerList get load => this['load'];
-
-  EventListenerList get mouseDown => this['mousedown'];
-
-  EventListenerList get mouseMove => this['mousemove'];
-
-  EventListenerList get mouseOut => this['mouseout'];
-
-  EventListenerList get mouseOver => this['mouseover'];
-
-  EventListenerList get mouseUp => this['mouseup'];
-
-  EventListenerList get mouseWheel => this['mousewheel'];
-
-  EventListenerList get paste => this['paste'];
-
   EventListenerList get readyStateChange => this['readystatechange'];
 
-  EventListenerList get reset => this['reset'];
-
-  EventListenerList get scroll => this['scroll'];
-
-  EventListenerList get search => this['search'];
-
-  EventListenerList get select => this['select'];
-
   EventListenerList get selectionChange => this['selectionchange'];
 
-  EventListenerList get selectStart => this['selectstart'];
-
-  EventListenerList get submit => this['submit'];
-
-  EventListenerList get touchCancel => this['touchcancel'];
-
-  EventListenerList get touchEnd => this['touchend'];
-
-  EventListenerList get touchMove => this['touchmove'];
-
-  EventListenerList get touchStart => this['touchstart'];
-
-  EventListenerList get fullscreenChange => this['webkitfullscreenchange'];
-
-  EventListenerList get fullscreenError => this['webkitfullscreenerror'];
-
   EventListenerList get pointerLockChange => this['webkitpointerlockchange'];
 
   EventListenerList get pointerLockError => this['webkitpointerlockerror'];
@@ -8754,6 +7943,7 @@
   bool get frozen => true;
 }
 
+/// @domName DocumentFragment
 class DocumentFragment extends Node {
   factory DocumentFragment() => _DocumentFragmentFactoryProvider.createDocumentFragment();
 
@@ -8792,21 +7982,21 @@
   List<Element> queryAll(String selectors) =>
     new _FrozenElementList._wrap($dom_querySelectorAll(selectors));
 
-  String get innerHTML {
+  String get innerHtml {
     final e = new Element.tag("div");
     e.nodes.add(this.clone(true));
-    return e.innerHTML;
+    return e.innerHtml;
   }
 
-  String get outerHTML => innerHTML;
+  String get outerHtml => innerHtml;
 
-  // TODO(nweiz): Do we want to support some variant of innerHTML for XML and/or
+  // TODO(nweiz): Do we want to support some variant of innerHtml for XML and/or
   // SVG strings?
-  void set innerHTML(String value) {
+  void set innerHtml(String value) {
     this.nodes.clear();
 
     final e = new Element.tag("div");
-    e.innerHTML = value;
+    e.innerHtml = value;
 
     // Copy list first since we don't want liveness during iteration.
     List nodes = new List.from(e.nodes);
@@ -8836,16 +8026,20 @@
     this._insertAdjacentNode(where, new Text(text));
   }
 
-  void insertAdjacentHTML(String where, String text) {
+  void insertAdjacentHtml(String where, String text) {
     this._insertAdjacentNode(where, new DocumentFragment.html(text));
   }
 
-  void addText(String text) {
+  void append(Element element) {
+    this.children.add(element);
+  }
+
+  void appendText(String text) {
     this.insertAdjacentText('beforeend', text);
   }
 
-  void addHtml(String text) {
-    this.insertAdjacentHTML('beforeend', text);
+  void appendHtml(String text) {
+    this.insertAdjacentHtml('beforeend', text);
   }
 
   // If we can come up with a semi-reasonable default value for an Element
@@ -8869,7 +8063,7 @@
     }
     return null;
   }
-  Element get $m_lastElementChild() => elements.last;
+  Element get $m_lastElementChild => elements.last;
   Element get nextElementSibling => null;
   Element get previousElementSibling => null;
   Element get offsetParent => null;
@@ -9054,42 +8248,6 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName DynamicsCompressorNode
-class DynamicsCompressorNode extends AudioNode {
-  DynamicsCompressorNode.internal(): super.internal();
-
-
-  /** @domName DynamicsCompressorNode.attack */
-  AudioParam get attack native "DynamicsCompressorNode_attack_Getter";
-
-
-  /** @domName DynamicsCompressorNode.knee */
-  AudioParam get knee native "DynamicsCompressorNode_knee_Getter";
-
-
-  /** @domName DynamicsCompressorNode.ratio */
-  AudioParam get ratio native "DynamicsCompressorNode_ratio_Getter";
-
-
-  /** @domName DynamicsCompressorNode.reduction */
-  AudioParam get reduction native "DynamicsCompressorNode_reduction_Getter";
-
-
-  /** @domName DynamicsCompressorNode.release */
-  AudioParam get release native "DynamicsCompressorNode_release_Getter";
-
-
-  /** @domName DynamicsCompressorNode.threshold */
-  AudioParam get threshold native "DynamicsCompressorNode_threshold_Getter";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
 /// @domName EXTTextureFilterAnisotropic
 class EXTTextureFilterAnisotropic extends NativeFieldWrapperClass1 {
   EXTTextureFilterAnisotropic.internal();
@@ -9401,171 +8559,6 @@
   bool get hasNext => _index < _list.length;
 }
 
-class _ElementAttributeMap implements Map<String, String> {
-
-  final Element _element;
-
-  _ElementAttributeMap(this._element);
-
-  bool containsValue(String value) {
-    final attributes = _element.$dom_attributes;
-    for (int i = 0, len = attributes.length; i < len; i++) {
-      if(value == attributes[i].value) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  bool containsKey(String key) {
-    return _element.$dom_hasAttribute(key);
-  }
-
-  String operator [](String key) {
-    return _element.$dom_getAttribute(key);
-  }
-
-  void operator []=(String key, value) {
-    _element.$dom_setAttribute(key, '$value');
-  }
-
-  String putIfAbsent(String key, String ifAbsent()) {
-    if (!containsKey(key)) {
-      this[key] = ifAbsent();
-    }
-    return this[key];
-  }
-
-  String remove(String key) {
-    String value = _element.$dom_getAttribute(key);
-    _element.$dom_removeAttribute(key);
-    return value;
-  }
-
-  void clear() {
-    final attributes = _element.$dom_attributes;
-    for (int i = attributes.length - 1; i >= 0; i--) {
-      remove(attributes[i].name);
-    }
-  }
-
-  void forEach(void f(String key, String value)) {
-    final attributes = _element.$dom_attributes;
-    for (int i = 0, len = attributes.length; i < len; i++) {
-      final item = attributes[i];
-      f(item.name, item.value);
-    }
-  }
-
-  Collection<String> get keys {
-    // TODO(jacobr): generate a lazy collection instead.
-    final attributes = _element.$dom_attributes;
-    final keys = new List<String>(attributes.length);
-    for (int i = 0, len = attributes.length; i < len; i++) {
-      keys[i] = attributes[i].name;
-    }
-    return keys;
-  }
-
-  Collection<String> get values {
-    // TODO(jacobr): generate a lazy collection instead.
-    final attributes = _element.$dom_attributes;
-    final values = new List<String>(attributes.length);
-    for (int i = 0, len = attributes.length; i < len; i++) {
-      values[i] = attributes[i].value;
-    }
-    return values;
-  }
-
-  /**
-   * The number of {key, value} pairs in the map.
-   */
-  int get length {
-    return _element.$dom_attributes.length;
-  }
-
-  /**
-   * Returns true if there is no {key, value} pair in the map.
-   */
-  bool get isEmpty {
-    return length == 0;
-  }
-}
-
-/**
- * Provides a Map abstraction on top of data-* attributes, similar to the
- * dataSet in the old DOM.
- */
-class _DataAttributeMap implements Map<String, String> {
-
-  final Map<String, String> $dom_attributes;
-
-  _DataAttributeMap(this.$dom_attributes);
-
-  // interface Map
-
-  // TODO: Use lazy iterator when it is available on Map.
-  bool containsValue(String value) => values.some((v) => v == value);
-
-  bool containsKey(String key) => $dom_attributes.containsKey(_attr(key));
-
-  String operator [](String key) => $dom_attributes[_attr(key)];
-
-  void operator []=(String key, value) {
-    $dom_attributes[_attr(key)] = '$value';
-  }
-
-  String putIfAbsent(String key, String ifAbsent()) =>
-    $dom_attributes.putIfAbsent(_attr(key), ifAbsent);
-
-  String remove(String key) => $dom_attributes.remove(_attr(key));
-
-  void clear() {
-    // Needs to operate on a snapshot since we are mutating the collection.
-    for (String key in keys) {
-      remove(key);
-    }
-  }
-
-  void forEach(void f(String key, String value)) {
-    $dom_attributes.forEach((String key, String value) {
-      if (_matches(key)) {
-        f(_strip(key), value);
-      }
-    });
-  }
-
-  Collection<String> get keys {
-    final keys = new List<String>();
-    $dom_attributes.forEach((String key, String value) {
-      if (_matches(key)) {
-        keys.add(_strip(key));
-      }
-    });
-    return keys;
-  }
-
-  Collection<String> get values {
-    final values = new List<String>();
-    $dom_attributes.forEach((String key, String value) {
-      if (_matches(key)) {
-        values.add(value);
-      }
-    });
-    return values;
-  }
-
-  int get length => keys.length;
-
-  // TODO: Use lazy iterator when it is available on Map.
-  bool get isEmpty => length == 0;
-
-  // Helpers.
-  String _attr(String key) => 'data-$key';
-  bool _matches(String key) => key.startsWith('data-');
-  String _strip(String key) => key.substring(5);
-}
-
 class _ElementCssClassSet extends CssClassSet {
 
   final Element _element;
@@ -9591,24 +8584,7 @@
   }
 }
 
-class _SimpleClientRect implements ClientRect {
-  final num left;
-  final num top;
-  final num width;
-  final num height;
-  num get right => left + width;
-  num get bottom => top + height;
-
-  const _SimpleClientRect(this.left, this.top, this.width, this.height);
-
-  bool operator ==(ClientRect other) {
-    return other != null && left == other.left && top == other.top
-        && width == other.width && height == other.height;
-  }
-
-  String toString() => "($left, $top, $width, $height)";
-}
-
+/// @domName Element
 abstract class Element extends Node implements ElementTraversal {
 
   factory Element.html(String html) =>
@@ -9630,6 +8606,14 @@
     }
   }
 
+  /**
+   * Deprecated, use innerHtml instead.
+   */
+  String get innerHTML => this.innerHtml;
+  void set innerHTML(String value) {
+    this.innerHtml = value;
+  }
+
   void set elements(Collection<Element> value) {
     this.children = value;
   }
@@ -9678,6 +8662,14 @@
     }
   }
 
+  /**
+   * Gets a map for manipulating the attributes of a particular namespace.
+   * This is primarily useful for SVG attributes such as xref:link.
+   */
+  Map<String, String> getNamespacedAttributes(String namespace) {
+    return new _NamespacedAttributeMap(this, namespace);
+  }
+
   /** @domName Window.getComputedStyle */
   Future<CSSStyleDeclaration> get computedStyle {
      // TODO(jacobr): last param should be null, see b/5045788
@@ -9692,9 +8684,16 @@
   }
 
   /**
+   * Adds the specified element to after the last child of this.
+   */
+  void append(Element e) {
+    this.children.add(e);
+  }
+
+  /**
    * Adds the specified text as a text node after the last child of this.
    */
-  void addText(String text) {
+  void appendText(String text) {
     this.insertAdjacentText('beforeend', text);
   }
 
@@ -9702,8 +8701,8 @@
    * Parses the specified text as HTML and adds the resulting node after the
    * last child of this.
    */
-  void addHtml(String text) {
-    this.insertAdjacentHTML('beforeend', text);
+  void appendHtml(String text) {
+    this.insertAdjacentHtml('beforeend', text);
   }
 
   // Hooks to support custom WebComponents.
@@ -9760,7 +8759,7 @@
   String id;
 
   /// @domName HTMLElement.innerHTML; @docsEditable true
-  String innerHTML;
+  String innerHtml;
 
   /// @domName HTMLElement.isContentEditable; @docsEditable true
   bool get isContentEditable;
@@ -9769,7 +8768,7 @@
   String lang;
 
   /// @domName HTMLElement.outerHTML; @docsEditable true
-  String get outerHTML;
+  String get outerHtml;
 
   /// @domName HTMLElement.spellcheck; @docsEditable true
   bool spellcheck;
@@ -9793,7 +8792,7 @@
   Element insertAdjacentElement(String where, Element element);
 
   /// @domName HTMLElement.insertAdjacentHTML; @docsEditable true
-  void insertAdjacentHTML(String where, String html);
+  void insertAdjacentHtml(String where, String html);
 
   /// @domName HTMLElement.insertAdjacentText; @docsEditable true
   void insertAdjacentText(String where, String text);
@@ -9913,6 +8912,10 @@
   String $dom_getAttribute(String name) native "Element_getAttribute_Callback";
 
 
+  /** @domName Element.getAttributeNS */
+  String $dom_getAttributeNS(String namespaceURI, String localName) native "Element_getAttributeNS_Callback";
+
+
   /** @domName Element.getBoundingClientRect */
   ClientRect getBoundingClientRect() native "Element_getBoundingClientRect_Callback";
 
@@ -9933,6 +8936,10 @@
   bool $dom_hasAttribute(String name) native "Element_hasAttribute_Callback";
 
 
+  /** @domName Element.hasAttributeNS */
+  bool $dom_hasAttributeNS(String namespaceURI, String localName) native "Element_hasAttributeNS_Callback";
+
+
   /** @domName Element.querySelector */
   Element $dom_querySelector(String selectors) native "Element_querySelector_Callback";
 
@@ -9949,6 +8956,10 @@
   void $dom_removeAttribute(String name) native "Element_removeAttribute_Callback";
 
 
+  /** @domName Element.removeAttributeNS */
+  void $dom_removeAttributeNS(String namespaceURI, String localName) native "Element_removeAttributeNS_Callback";
+
+
   /** @domName Element.scrollByLines */
   void scrollByLines(int lines) native "Element_scrollByLines_Callback";
 
@@ -9977,6 +8988,10 @@
   void $dom_setAttribute(String name, String value) native "Element_setAttribute_Callback";
 
 
+  /** @domName Element.setAttributeNS */
+  void $dom_setAttributeNS(String namespaceURI, String qualifiedName, String value) native "Element_setAttributeNS_Callback";
+
+
   /** @domName Element.webkitMatchesSelector */
   bool matchesSelector(String selectors) native "Element_webkitMatchesSelector_Callback";
 
@@ -10031,7 +9046,7 @@
       }
     }
     final Element temp = new Element.tag(parentTag);
-    temp.innerHTML = html;
+    temp.innerHtml = html;
 
     Element element;
     if (temp.children.length == 1) {
@@ -10372,7 +9387,7 @@
 
 
   /** @domName Entry.toURL */
-  String toURL() native "Entry_toURL_Callback";
+  String toUrl() native "Entry_toURL_Callback";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -10436,7 +9451,7 @@
 
 
   /** @domName EntrySync.toURL */
-  String toURL() native "EntrySync_toURL_Callback";
+  String toUrl() native "EntrySync_toURL_Callback";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -10478,6 +9493,7 @@
 // WARNING: Do not edit - generated code.
 
 
+/// @domName Event
 class Event extends NativeFieldWrapperClass1 {
   // In JS, canBubble and cancelable are technically required parameters to
   // init*Event. In practice, though, if they aren't provided they simply
@@ -10654,10 +9670,6 @@
   static const int OPEN = 1;
 
 
-  /** @domName EventSource.URL */
-  String get URL native "EventSource_URL_Getter";
-
-
   /** @domName EventSource.readyState */
   int get readyState native "EventSource_readyState_Getter";
 
@@ -10742,7 +9754,7 @@
   }
 }
 
-
+/// @domName EventTarget
 class EventTarget extends NativeFieldWrapperClass1 {
 
   /** @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent */
@@ -11045,7 +10057,7 @@
 
 
   /** @domName FileReader.readAsDataURL */
-  void readAsDataURL(Blob blob) native "FileReader_readAsDataURL_Callback";
+  void readAsDataUrl(Blob blob) native "FileReader_readAsDataURL_Callback";
 
   void readAsText(/*Blob*/ blob, [/*DOMString*/ encoding]) {
     if (?encoding) {
@@ -11107,7 +10119,7 @@
 
 
   /** @domName FileReaderSync.readAsDataURL */
-  String readAsDataURL(Blob blob) native "FileReaderSync_readAsDataURL_Callback";
+  String readAsDataUrl(Blob blob) native "FileReaderSync_readAsDataURL_Callback";
 
   String readAsText(/*Blob*/ blob, [/*DOMString*/ encoding]) {
     if (?encoding) {
@@ -11847,22 +10859,6 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName GainNode
-class GainNode extends AudioNode {
-  GainNode.internal(): super.internal();
-
-
-  /** @domName GainNode.gain */
-  AudioGain get gain native "GainNode_gain_Getter";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
 /// @domName Gamepad
 class Gamepad extends NativeFieldWrapperClass1 {
   Gamepad.internal();
@@ -12249,11 +11245,11 @@
 
 
   /** @domName HashChangeEvent.newURL */
-  String get newURL native "HashChangeEvent_newURL_Getter";
+  String get newUrl native "HashChangeEvent_newURL_Getter";
 
 
   /** @domName HashChangeEvent.oldURL */
-  String get oldURL native "HashChangeEvent_oldURL_Getter";
+  String get oldUrl native "HashChangeEvent_oldURL_Getter";
 
 
   /** @domName HashChangeEvent.initHashChangeEvent */
@@ -12321,6 +11317,7 @@
 // WARNING: Do not edit - generated code.
 
 
+/// @domName HTMLDocument
 class HtmlDocument extends Document {
   HtmlDocument.internal(): super.internal();
 
@@ -12419,6 +11416,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
+/// @domName XMLHttpRequest
 class HttpRequest extends EventTarget {
   factory HttpRequest.get(String url, onComplete(HttpRequest request)) =>
       _HttpRequestFactoryProvider.createHttpRequest_get(url, onComplete);
@@ -12468,7 +11466,7 @@
 
 
   /** @domName XMLHttpRequest.responseXML */
-  Document get responseXML native "XMLHttpRequest_responseXML_Getter";
+  Document get responseXml native "XMLHttpRequest_responseXML_Getter";
 
 
   /** @domName XMLHttpRequest.status */
@@ -13103,6 +12101,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
+/// @domName IDBKeyRange
 class IDBKeyRange extends NativeFieldWrapperClass1 {
   /**
    * @domName IDBKeyRange.only
@@ -14858,11 +13857,32 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// WARNING: Do not edit - generated code.
 
-
-/// @domName KeyboardEvent
+/// @domName KeyboardEvent; @docsEditable true
 class KeyboardEvent extends UIEvent {
+
+  factory KeyboardEvent(String type, Window view,
+      [bool canBubble = true, bool cancelable = true, 
+      String keyIdentifier = null, int keyLocation = 1, bool ctrlKey = false,
+      bool altKey = false, bool shiftKey = false, bool metaKey = false,
+      bool altGraphKey = false]) {
+    final e = document.$dom_createEvent("KeyboardEvent");
+    e.$dom_initKeyboardEvent(type, canBubble, cancelable, view, keyIdentifier,
+        keyLocation, ctrlKey, altKey, shiftKey, metaKey, altGraphKey);
+    return e;
+  }
+
+  /** @domName KeyboardEvent.initKeyboardEvent */
+  void $dom_initKeyboardEvent(String type, bool canBubble, bool cancelable,
+      LocalWindow view, String keyIdentifier, int keyLocation, bool ctrlKey,
+      bool altKey, bool shiftKey, bool metaKey,
+      bool altGraphKey) native "KeyboardEvent_initKeyboardEvent_Callback";
+ 
+  /** @domName KeyboardEvent.keyCode */
+  int get keyCode => $dom_keyCode;
+  
+  /** @domName KeyboardEvent.charCode */
+  int get charCode => $dom_charCode;
   KeyboardEvent.internal(): super.internal();
 
 
@@ -14879,7 +13899,7 @@
 
 
   /** @domName KeyboardEvent.keyIdentifier */
-  String get keyIdentifier native "KeyboardEvent_keyIdentifier_Getter";
+  String get $dom_keyIdentifier native "KeyboardEvent_keyIdentifier_Getter";
 
 
   /** @domName KeyboardEvent.keyLocation */
@@ -14893,10 +13913,6 @@
   /** @domName KeyboardEvent.shiftKey */
   bool get shiftKey native "KeyboardEvent_shiftKey_Getter";
 
-
-  /** @domName KeyboardEvent.initKeyboardEvent */
-  void initKeyboardEvent(String type, bool canBubble, bool cancelable, LocalWindow view, String keyIdentifier, int keyLocation, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, bool altGraphKey) native "KeyboardEvent_initKeyboardEvent_Callback";
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -15329,6 +14345,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
+/// @domName Window
 class LocalWindow extends EventTarget implements Window {
 
   /**
@@ -15635,7 +14652,7 @@
 
 
   /** @domName DOMWindow.getMatchedCSSRules */
-  List<CSSRule> getMatchedCSSRules(Element element, String pseudoElement) native "DOMWindow_getMatchedCSSRules_Callback";
+  List<CSSRule> getMatchedCssRules(Element element, String pseudoElement) native "DOMWindow_getMatchedCSSRules_Callback";
 
 
   /** @domName DOMWindow.getSelection */
@@ -15739,7 +14756,7 @@
 
 
   /** @domName DOMWindow.webkitResolveLocalFileSystemURL */
-  void webkitResolveLocalFileSystemURL(String url, EntryCallback successCallback, [ErrorCallback errorCallback]) native "DOMWindow_webkitResolveLocalFileSystemURL_Callback";
+  void webkitResolveLocalFileSystemUrl(String url, EntryCallback successCallback, [ErrorCallback errorCallback]) native "DOMWindow_webkitResolveLocalFileSystemURL_Callback";
 
 }
 
@@ -16477,22 +15494,6 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName MediaElementAudioSourceNode
-class MediaElementAudioSourceNode extends AudioSourceNode {
-  MediaElementAudioSourceNode.internal(): super.internal();
-
-
-  /** @domName MediaElementAudioSourceNode.mediaElement */
-  MediaElement get mediaElement native "MediaElementAudioSourceNode_mediaElement_Getter";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
 /// @domName MediaError
 class MediaError extends NativeFieldWrapperClass1 {
   MediaError.internal();
@@ -16553,7 +15554,7 @@
 
 
   /** @domName MediaKeyEvent.defaultURL */
-  String get defaultURL native "MediaKeyEvent_defaultURL_Getter";
+  String get defaultUrl native "MediaKeyEvent_defaultURL_Getter";
 
 
   /** @domName MediaKeyEvent.errorCode */
@@ -16781,22 +15782,6 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName MediaStreamAudioSourceNode
-class MediaStreamAudioSourceNode extends AudioSourceNode {
-  MediaStreamAudioSourceNode.internal(): super.internal();
-
-
-  /** @domName MediaStreamAudioSourceNode.mediaStream */
-  MediaStream get mediaStream native "MediaStreamAudioSourceNode_mediaStream_Getter";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
 /// @domName MediaStreamEvent
 class MediaStreamEvent extends Event {
   MediaStreamEvent.internal(): super.internal();
@@ -16975,14 +15960,6 @@
   factory MenuElement() => document.$dom_createElement("menu");
   MenuElement.internal(): super.internal();
 
-
-  /** @domName HTMLMenuElement.compact */
-  bool get compact native "HTMLMenuElement_compact_Getter";
-
-
-  /** @domName HTMLMenuElement.compact */
-  void set compact(bool value) native "HTMLMenuElement_compact_Setter";
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -17265,6 +16242,7 @@
 // WARNING: Do not edit - generated code.
 
 
+/// @domName MouseEvent
 class MouseEvent extends UIEvent {
   factory MouseEvent(String type, Window view, int detail, int screenX,
       int screenY, int clientX, int clientY, int button, [bool canBubble = true,
@@ -17414,6 +16392,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
+/// @domName MutationObserver
 class MutationObserver extends NativeFieldWrapperClass1 {
 
   factory MutationObserver(MutationCallback callback) => _MutationObserverFactoryProvider.createMutationObserver(callback);
@@ -17904,6 +16883,7 @@
   Node operator[](int index) => _this.$dom_childNodes[index];
 }
 
+/// @domName Node
 class Node extends EventTarget {
   _ChildNodeListLazy get nodes {
     return new _ChildNodeListLazy(this);
@@ -18001,6 +16981,14 @@
   Node get $dom_lastChild native "Node_lastChild_Getter";
 
 
+  /** @domName Node.localName */
+  String get $dom_localName native "Node_localName_Getter";
+
+
+  /** @domName Node.namespaceURI */
+  String get $dom_namespaceUri native "Node_namespaceURI_Getter";
+
+
   /** @domName Node.nextSibling */
   Node get nextNode native "Node_nextSibling_Getter";
 
@@ -18172,6 +17160,111 @@
 // WARNING: Do not edit - generated code.
 
 
+/// @domName NodeList
+class NodeList extends NativeFieldWrapperClass1 implements List<Node> {
+  NodeList.internal();
+
+
+  /** @domName NodeList.length */
+  int get length native "NodeList_length_Getter";
+
+  Node operator[](int index) native "NodeList_item_Callback";
+
+  void operator[]=(int index, Node value) {
+    throw new UnsupportedError("Cannot assign element of immutable List.");
+  }
+  // -- start List<Node> mixins.
+  // Node is the element type.
+
+  // From Iterable<Node>:
+
+  Iterator<Node> iterator() {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new FixedSizeListIterator<Node>(this);
+  }
+
+  // From Collection<Node>:
+
+  void add(Node value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addLast(Node value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addAll(Collection<Node> collection) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  bool contains(Node element) => _Collections.contains(this, element);
+
+  void forEach(void f(Node element)) => _Collections.forEach(this, f);
+
+  Collection map(f(Node element)) => _Collections.map(this, [], f);
+
+  Collection<Node> filter(bool f(Node element)) =>
+     _Collections.filter(this, <Node>[], f);
+
+  bool every(bool f(Node element)) => _Collections.every(this, f);
+
+  bool some(bool f(Node element)) => _Collections.some(this, f);
+
+  bool get isEmpty => this.length == 0;
+
+  // From List<Node>:
+
+  void sort([Comparator<Node> compare = Comparable.compare]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(Node element, [int start = 0]) =>
+      _Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(Node element, [int start]) {
+    if (start == null) start = length - 1;
+    return _Lists.lastIndexOf(this, element, start);
+  }
+
+  Node get first => this[0];
+
+  Node get last => this[length - 1];
+
+  Node removeLast() {
+    throw new UnsupportedError("Cannot removeLast on immutable List.");
+  }
+
+  void setRange(int start, int rangeLength, List<Node> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+
+  void insertRange(int start, int rangeLength, [Node initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+
+  List<Node> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <Node>[]);
+
+  // -- end List<Node> mixins.
+
+
+  /** @domName NodeList.item */
+  Node _item(int index) native "NodeList_item_Callback";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
 /// @domName Notation
 class Notation extends Node {
   Notation.internal(): super.internal();
@@ -18295,7 +17388,7 @@
 
 
   /** @domName NotificationCenter.createHTMLNotification */
-  Notification createHTMLNotification(String url) native "NotificationCenter_createHTMLNotification_Callback";
+  Notification createHtmlNotification(String url) native "NotificationCenter_createHTMLNotification_Callback";
 
 
   /** @domName NotificationCenter.createNotification */
@@ -18367,19 +17460,19 @@
 
 
   /** @domName OESVertexArrayObject.bindVertexArrayOES */
-  void bindVertexArrayOES(WebGLVertexArrayObjectOES arrayObject) native "OESVertexArrayObject_bindVertexArrayOES_Callback";
+  void bindVertexArray(WebGLVertexArrayObjectOES arrayObject) native "OESVertexArrayObject_bindVertexArrayOES_Callback";
 
 
   /** @domName OESVertexArrayObject.createVertexArrayOES */
-  WebGLVertexArrayObjectOES createVertexArrayOES() native "OESVertexArrayObject_createVertexArrayOES_Callback";
+  WebGLVertexArrayObjectOES createVertexArray() native "OESVertexArrayObject_createVertexArrayOES_Callback";
 
 
   /** @domName OESVertexArrayObject.deleteVertexArrayOES */
-  void deleteVertexArrayOES(WebGLVertexArrayObjectOES arrayObject) native "OESVertexArrayObject_deleteVertexArrayOES_Callback";
+  void deleteVertexArray(WebGLVertexArrayObjectOES arrayObject) native "OESVertexArrayObject_deleteVertexArrayOES_Callback";
 
 
   /** @domName OESVertexArrayObject.isVertexArrayOES */
-  bool isVertexArrayOES(WebGLVertexArrayObjectOES arrayObject) native "OESVertexArrayObject_isVertexArrayOES_Callback";
+  bool isVertexArray(WebGLVertexArrayObjectOES arrayObject) native "OESVertexArrayObject_isVertexArrayOES_Callback";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18601,22 +17694,6 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName OfflineAudioCompletionEvent
-class OfflineAudioCompletionEvent extends Event {
-  OfflineAudioCompletionEvent.internal(): super.internal();
-
-
-  /** @domName OfflineAudioCompletionEvent.renderedBuffer */
-  AudioBuffer get renderedBuffer native "OfflineAudioCompletionEvent_renderedBuffer_Getter";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
 /// @domName HTMLOptGroupElement
 class OptGroupElement extends _Element_Merged {
 
@@ -18723,68 +17800,6 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName OscillatorNode
-class OscillatorNode extends AudioSourceNode {
-  OscillatorNode.internal(): super.internal();
-
-  static const int CUSTOM = 4;
-
-  static const int FINISHED_STATE = 3;
-
-  static const int PLAYING_STATE = 2;
-
-  static const int SAWTOOTH = 2;
-
-  static const int SCHEDULED_STATE = 1;
-
-  static const int SINE = 0;
-
-  static const int SQUARE = 1;
-
-  static const int TRIANGLE = 3;
-
-  static const int UNSCHEDULED_STATE = 0;
-
-
-  /** @domName OscillatorNode.detune */
-  AudioParam get detune native "OscillatorNode_detune_Getter";
-
-
-  /** @domName OscillatorNode.frequency */
-  AudioParam get frequency native "OscillatorNode_frequency_Getter";
-
-
-  /** @domName OscillatorNode.playbackState */
-  int get playbackState native "OscillatorNode_playbackState_Getter";
-
-
-  /** @domName OscillatorNode.type */
-  int get type native "OscillatorNode_type_Getter";
-
-
-  /** @domName OscillatorNode.type */
-  void set type(int value) native "OscillatorNode_type_Setter";
-
-
-  /** @domName OscillatorNode.setWaveTable */
-  void setWaveTable(WaveTable waveTable) native "OscillatorNode_setWaveTable_Callback";
-
-
-  /** @domName OscillatorNode.start */
-  void start(num when) native "OscillatorNode_start_Callback";
-
-
-  /** @domName OscillatorNode.stop */
-  void stop(num when) native "OscillatorNode_stop_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
 /// @domName HTMLOutputElement
 class OutputElement extends _Element_Merged {
 
@@ -18929,114 +17944,6 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName PannerNode
-class PannerNode extends AudioNode {
-  PannerNode.internal(): super.internal();
-
-  static const int EQUALPOWER = 0;
-
-  static const int EXPONENTIAL_DISTANCE = 2;
-
-  static const int HRTF = 1;
-
-  static const int INVERSE_DISTANCE = 1;
-
-  static const int LINEAR_DISTANCE = 0;
-
-  static const int SOUNDFIELD = 2;
-
-
-  /** @domName PannerNode.coneGain */
-  AudioGain get coneGain native "PannerNode_coneGain_Getter";
-
-
-  /** @domName PannerNode.coneInnerAngle */
-  num get coneInnerAngle native "PannerNode_coneInnerAngle_Getter";
-
-
-  /** @domName PannerNode.coneInnerAngle */
-  void set coneInnerAngle(num value) native "PannerNode_coneInnerAngle_Setter";
-
-
-  /** @domName PannerNode.coneOuterAngle */
-  num get coneOuterAngle native "PannerNode_coneOuterAngle_Getter";
-
-
-  /** @domName PannerNode.coneOuterAngle */
-  void set coneOuterAngle(num value) native "PannerNode_coneOuterAngle_Setter";
-
-
-  /** @domName PannerNode.coneOuterGain */
-  num get coneOuterGain native "PannerNode_coneOuterGain_Getter";
-
-
-  /** @domName PannerNode.coneOuterGain */
-  void set coneOuterGain(num value) native "PannerNode_coneOuterGain_Setter";
-
-
-  /** @domName PannerNode.distanceGain */
-  AudioGain get distanceGain native "PannerNode_distanceGain_Getter";
-
-
-  /** @domName PannerNode.distanceModel */
-  int get distanceModel native "PannerNode_distanceModel_Getter";
-
-
-  /** @domName PannerNode.distanceModel */
-  void set distanceModel(int value) native "PannerNode_distanceModel_Setter";
-
-
-  /** @domName PannerNode.maxDistance */
-  num get maxDistance native "PannerNode_maxDistance_Getter";
-
-
-  /** @domName PannerNode.maxDistance */
-  void set maxDistance(num value) native "PannerNode_maxDistance_Setter";
-
-
-  /** @domName PannerNode.panningModel */
-  int get panningModel native "PannerNode_panningModel_Getter";
-
-
-  /** @domName PannerNode.panningModel */
-  void set panningModel(int value) native "PannerNode_panningModel_Setter";
-
-
-  /** @domName PannerNode.refDistance */
-  num get refDistance native "PannerNode_refDistance_Getter";
-
-
-  /** @domName PannerNode.refDistance */
-  void set refDistance(num value) native "PannerNode_refDistance_Setter";
-
-
-  /** @domName PannerNode.rolloffFactor */
-  num get rolloffFactor native "PannerNode_rolloffFactor_Getter";
-
-
-  /** @domName PannerNode.rolloffFactor */
-  void set rolloffFactor(num value) native "PannerNode_rolloffFactor_Setter";
-
-
-  /** @domName PannerNode.setOrientation */
-  void setOrientation(num x, num y, num z) native "PannerNode_setOrientation_Callback";
-
-
-  /** @domName PannerNode.setPosition */
-  void setPosition(num x, num y, num z) native "PannerNode_setPosition_Callback";
-
-
-  /** @domName PannerNode.setVelocity */
-  void setVelocity(num x, num y, num z) native "PannerNode_setVelocity_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
 /// @domName HTMLParagraphElement
 class ParagraphElement extends _Element_Merged {
 
@@ -19389,6 +18296,7 @@
 // WARNING: Do not edit - generated code.
 
 
+/// @domName WebKitPoint
 class Point extends NativeFieldWrapperClass1 {
   factory Point(num x, num y) => _PointFactoryProvider.createPoint(x, y);
   Point.internal();
@@ -20033,7 +18941,7 @@
 
 
 /// @domName RadioNodeList
-class RadioNodeList extends _NodeList {
+class RadioNodeList extends NodeList {
   RadioNodeList.internal(): super.internal();
 
 
@@ -20667,32 +19575,6 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName ScriptProcessorNode
-class ScriptProcessorNode extends AudioNode implements EventTarget {
-  ScriptProcessorNode.internal(): super.internal();
-
-  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
-  ScriptProcessorNodeEvents get on =>
-    new ScriptProcessorNodeEvents(this);
-
-
-  /** @domName ScriptProcessorNode.bufferSize */
-  int get bufferSize native "ScriptProcessorNode_bufferSize_Getter";
-
-}
-
-class ScriptProcessorNodeEvents extends Events {
-  ScriptProcessorNodeEvents(EventTarget _ptr) : super(_ptr);
-
-  EventListenerList get audioProcess => this['audioprocess'];
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
 /// @domName ScriptProfile
 class ScriptProfile extends NativeFieldWrapperClass1 {
   ScriptProfile.internal();
@@ -20723,7 +19605,7 @@
 
 
   /** @domName ScriptProfileNode.callUID */
-  int get callUID native "ScriptProfileNode_callUID_Getter";
+  int get callUid native "ScriptProfileNode_callUID_Getter";
 
 
   /** @domName ScriptProfileNode.functionName */
@@ -20941,6 +19823,7 @@
 // WARNING: Do not edit - generated code.
 
 
+/// @domName ShadowRoot
 class ShadowRoot extends DocumentFragment {
 
   factory ShadowRoot(Element host) => _ShadowRootFactoryProvider.createShadowRoot(host);
@@ -20960,11 +19843,11 @@
 
 
   /** @domName ShadowRoot.innerHTML */
-  String get innerHTML native "ShadowRoot_innerHTML_Getter";
+  String get innerHtml native "ShadowRoot_innerHTML_Getter";
 
 
   /** @domName ShadowRoot.innerHTML */
-  void set innerHTML(String value) native "ShadowRoot_innerHTML_Setter";
+  void set innerHtml(String value) native "ShadowRoot_innerHTML_Setter";
 
 
   /** @domName ShadowRoot.resetStyleInheritance */
@@ -21674,6 +20557,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
+/// @domName Storage
 class Storage extends NativeFieldWrapperClass1 implements Map<String, String>  {
 
   // TODO(nweiz): update this when maps support lazy iteration
@@ -22460,6 +21344,7 @@
 // WARNING: Do not edit - generated code.
 
 
+/// @domName Text
 class Text extends CharacterData {
   factory Text(String data) => _TextFactoryProvider.createText(data);
   Text.internal(): super.internal();
@@ -22920,7 +21805,7 @@
 
 
   /** @domName TextTrackCue.getCueAsHTML */
-  DocumentFragment getCueAsHTML() native "TextTrackCue_getCueAsHTML_Callback";
+  DocumentFragment getCueAsHtml() native "TextTrackCue_getCueAsHTML_Callback";
 
 
   /** @domName TextTrackCue.removeEventListener */
@@ -23603,13 +22488,25 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName UIEvent
+/// @domName UIEvent; @docsEditable true
 class UIEvent extends Event {
+  // In JS, canBubble and cancelable are technically required parameters to
+  // init*Event. In practice, though, if they aren't provided they simply
+  // default to false (since that's Boolean(undefined)).
+  //
+  // Contrary to JS, we default canBubble and cancelable to true, since that's
+  // what people want most of the time anyway.
+  factory UIEvent(String type, Window view, int detail,
+      [bool canBubble = true, bool cancelable = true]) {
+    final e = document.$dom_createEvent("UIEvent");
+    e.$dom_initUIEvent(type, canBubble, cancelable, view, detail);
+    return e;
+  }
   UIEvent.internal(): super.internal();
 
 
   /** @domName UIEvent.charCode */
-  int get charCode native "UIEvent_charCode_Getter";
+  int get $dom_charCode native "UIEvent_charCode_Getter";
 
 
   /** @domName UIEvent.detail */
@@ -23617,7 +22514,7 @@
 
 
   /** @domName UIEvent.keyCode */
-  int get keyCode native "UIEvent_keyCode_Getter";
+  int get $dom_keyCode native "UIEvent_keyCode_Getter";
 
 
   /** @domName UIEvent.layerX */
@@ -23645,7 +22542,7 @@
 
 
   /** @domName UIEvent.initUIEvent */
-  void initUIEvent(String type, bool canBubble, bool cancelable, LocalWindow view, int detail) native "UIEvent_initUIEvent_Callback";
+  void $dom_initUIEvent(String type, bool canBubble, bool cancelable, LocalWindow view, int detail) native "UIEvent_initUIEvent_Callback";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -24323,26 +23220,6 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName WaveShaperNode
-class WaveShaperNode extends AudioNode {
-  WaveShaperNode.internal(): super.internal();
-
-
-  /** @domName WaveShaperNode.curve */
-  Float32Array get curve native "WaveShaperNode_curve_Getter";
-
-
-  /** @domName WaveShaperNode.curve */
-  void set curve(Float32Array value) native "WaveShaperNode_curve_Setter";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
 /// @domName WaveTable
 class WaveTable extends NativeFieldWrapperClass1 {
   WaveTable.internal();
@@ -26027,6 +24904,7 @@
 // WARNING: Do not edit - generated code.
 
 
+/// @domName WebSocket
 class WebSocket extends EventTarget {
   factory WebSocket(String url) => _WebSocketFactoryProvider.createWebSocket(url);
   WebSocket.internal(): super.internal();
@@ -26045,7 +24923,7 @@
 
 
   /** @domName WebSocket.URL */
-  String get URL native "WebSocket_URL_Getter";
+  String get Url native "WebSocket_URL_Getter";
 
 
   /** @domName WebSocket.binaryType */
@@ -26133,6 +25011,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
+/// @domName WheelEvent
 class WheelEvent extends MouseEvent {
   WheelEvent.internal(): super.internal();
 
@@ -26290,11 +25169,11 @@
 
 
   /** @domName WorkerContext.webkitResolveLocalFileSystemSyncURL */
-  EntrySync webkitResolveLocalFileSystemSyncURL(String url) native "WorkerContext_webkitResolveLocalFileSystemSyncURL_Callback";
+  EntrySync webkitResolveLocalFileSystemSyncUrl(String url) native "WorkerContext_webkitResolveLocalFileSystemSyncURL_Callback";
 
 
   /** @domName WorkerContext.webkitResolveLocalFileSystemURL */
-  void webkitResolveLocalFileSystemURL(String url, EntryCallback successCallback, [ErrorCallback errorCallback]) native "WorkerContext_webkitResolveLocalFileSystemURL_Callback";
+  void webkitResolveLocalFileSystemUrl(String url, EntryCallback successCallback, [ErrorCallback errorCallback]) native "WorkerContext_webkitResolveLocalFileSystemURL_Callback";
 
 }
 
@@ -26488,7 +25367,7 @@
 
 
   /** @domName XPathNSResolver.lookupNamespaceURI */
-  String lookupNamespaceURI(String prefix) native "XPathNSResolver_lookupNamespaceURI_Callback";
+  String lookupNamespaceUri(String prefix) native "XPathNSResolver_lookupNamespaceURI_Callback";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26618,14 +25497,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-class _AudioElementFactoryProvider {
-  static AudioElement createAudioElement([String src]) native "HTMLAudioElement_constructor_Callback";
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
 class _BlobFactoryProvider {
   static Blob createBlob(List blobParts, [String type, String endings]) native "Blob_constructor_Callback";
 }
@@ -27134,11 +26005,11 @@
 
 
   /** @domName HTMLElement.innerHTML */
-  String get innerHTML native "HTMLElement_innerHTML_Getter";
+  String get innerHtml native "HTMLElement_innerHTML_Getter";
 
 
   /** @domName HTMLElement.innerHTML */
-  void set innerHTML(String value) native "HTMLElement_innerHTML_Setter";
+  void set innerHtml(String value) native "HTMLElement_innerHTML_Setter";
 
 
   /** @domName HTMLElement.isContentEditable */
@@ -27154,7 +26025,7 @@
 
 
   /** @domName HTMLElement.outerHTML */
-  String get outerHTML native "HTMLElement_outerHTML_Getter";
+  String get outerHtml native "HTMLElement_outerHTML_Getter";
 
 
   /** @domName HTMLElement.spellcheck */
@@ -27206,7 +26077,7 @@
 
 
   /** @domName HTMLElement.insertAdjacentHTML */
-  void insertAdjacentHTML(String where, String html) native "HTMLElement_insertAdjacentHTML_Callback";
+  void insertAdjacentHtml(String where, String html) native "HTMLElement_insertAdjacentHTML_Callback";
 
 
   /** @domName HTMLElement.insertAdjacentText */
@@ -27839,111 +26710,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// WARNING: Do not edit - generated code.
-
-
-/// @domName NodeList
-class _NodeList extends NativeFieldWrapperClass1 implements List<Node> {
-  _NodeList.internal();
-
-
-  /** @domName NodeList.length */
-  int get length native "NodeList_length_Getter";
-
-  Node operator[](int index) native "NodeList_item_Callback";
-
-  void operator[]=(int index, Node value) {
-    throw new UnsupportedError("Cannot assign element of immutable List.");
-  }
-  // -- start List<Node> mixins.
-  // Node is the element type.
-
-  // From Iterable<Node>:
-
-  Iterator<Node> iterator() {
-    // Note: NodeLists are not fixed size. And most probably length shouldn't
-    // be cached in both iterator _and_ forEach method. For now caching it
-    // for consistency.
-    return new FixedSizeListIterator<Node>(this);
-  }
-
-  // From Collection<Node>:
-
-  void add(Node value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addLast(Node value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addAll(Collection<Node> collection) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  bool contains(Node element) => _Collections.contains(this, element);
-
-  void forEach(void f(Node element)) => _Collections.forEach(this, f);
-
-  Collection map(f(Node element)) => _Collections.map(this, [], f);
-
-  Collection<Node> filter(bool f(Node element)) =>
-     _Collections.filter(this, <Node>[], f);
-
-  bool every(bool f(Node element)) => _Collections.every(this, f);
-
-  bool some(bool f(Node element)) => _Collections.some(this, f);
-
-  bool get isEmpty => this.length == 0;
-
-  // From List<Node>:
-
-  void sort([Comparator<Node> compare = Comparable.compare]) {
-    throw new UnsupportedError("Cannot sort immutable List.");
-  }
-
-  int indexOf(Node element, [int start = 0]) =>
-      _Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(Node element, [int start]) {
-    if (start == null) start = length - 1;
-    return _Lists.lastIndexOf(this, element, start);
-  }
-
-  Node get first => this[0];
-
-  Node get last => this[length - 1];
-
-  Node removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<Node> from, [int startFrom]) {
-    throw new UnsupportedError("Cannot setRange on immutable List.");
-  }
-
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError("Cannot removeRange on immutable List.");
-  }
-
-  void insertRange(int start, int rangeLength, [Node initialValue]) {
-    throw new UnsupportedError("Cannot insertRange on immutable List.");
-  }
-
-  List<Node> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <Node>[]);
-
-  // -- end List<Node> mixins.
-
-
-  /** @domName NodeList.item */
-  Node _item(int index) native "NodeList_item_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
 
 class _NotificationFactoryProvider {
   static Notification createNotification(String title, [Map options]) native "Notification_constructor_Callback";
@@ -28501,6 +27267,228 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
+abstract class _AttributeMap implements Map<String, String> {
+
+  bool containsValue(String value) {
+    for (var v in this.values) {
+      if (value == v) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  String putIfAbsent(String key, String ifAbsent()) {
+    if (!containsKey(key)) {
+      this[key] = ifAbsent();
+    }
+    return this[key];
+  }
+
+  void clear() {
+    for (var key in keys) {
+      remove(key);
+    }
+  }
+
+  void forEach(void f(String key, String value)) {
+    for (var key in keys) {
+      var value = this[key];
+      f(key, value);
+    }
+  }
+
+  Collection<String> get keys {
+    // TODO: generate a lazy collection instead.
+    var attributes = _element.$dom_attributes;
+    var keys = new List<String>();
+    for (int i = 0, len = attributes.length; i < len; i++) {
+      if (_matches(attributes[i])) {
+        keys.add(attributes[i].$dom_localName);
+      }
+    }
+    return keys;
+  }
+
+  Collection<String> get values {
+    // TODO: generate a lazy collection instead.
+    var attributes = _element.$dom_attributes;
+    var values = new List<String>();
+    for (int i = 0, len = attributes.length; i < len; i++) {
+      if (_matches(attributes[i])) {
+        values.add(attributes[i].value);
+      }
+    }
+    return values;
+  }
+
+  /**
+   * Returns true if there is no {key, value} pair in the map.
+   */
+  bool get isEmpty {
+    return length == 0;
+  }
+
+  /**
+   * Checks to see if the node should be included in this map.
+   */
+  bool _matches(Node node);
+}
+
+/**
+ * Wrapper to expose [Element.attributes] as a typed map.
+ */
+class _ElementAttributeMap extends _AttributeMap {
+
+  final Element _element;
+
+  _ElementAttributeMap(this._element);
+
+  bool containsKey(String key) {
+    return _element.$dom_hasAttribute(key);
+  }
+
+  String operator [](String key) {
+    return _element.$dom_getAttribute(key);
+  }
+
+  void operator []=(String key, value) {
+    _element.$dom_setAttribute(key, '$value');
+  }
+
+  String remove(String key) {
+    String value = _element.$dom_getAttribute(key);
+    _element.$dom_removeAttribute(key);
+    return value;
+  }
+
+  /**
+   * The number of {key, value} pairs in the map.
+   */
+  int get length {
+    return keys.length;
+  }
+
+  bool _matches(Node node) => node.$dom_namespaceUri == null;
+}
+
+/**
+ * Wrapper to expose namespaced attributes as a typed map.
+ */
+class _NamespacedAttributeMap extends _AttributeMap {
+
+  final Element _element;
+  final String _namespace;
+
+  _NamespacedAttributeMap(this._element, this._namespace);
+
+  bool containsKey(String key) {
+    return _element.$dom_hasAttributeNS(_namespace, key);
+  }
+
+  String operator [](String key) {
+    return _element.$dom_getAttributeNS(_namespace, key);
+  }
+
+  void operator []=(String key, value) {
+    _element.$dom_setAttributeNS(_namespace, key, '$value');
+  }
+
+  String remove(String key) {
+    String value = this[key];
+    _element.$dom_removeAttributeNS(_namespace, key);
+    return value;
+  }
+
+  /**
+   * The number of {key, value} pairs in the map.
+   */
+  int get length {
+    return keys.length;
+  }
+
+  bool _matches(Node node) => node.$dom_namespaceUri == _namespace;
+}
+
+
+/**
+ * Provides a Map abstraction on top of data-* attributes, similar to the
+ * dataSet in the old DOM.
+ */
+class _DataAttributeMap implements Map<String, String> {
+
+  final Map<String, String> $dom_attributes;
+
+  _DataAttributeMap(this.$dom_attributes);
+
+  // interface Map
+
+  // TODO: Use lazy iterator when it is available on Map.
+  bool containsValue(String value) => values.some((v) => v == value);
+
+  bool containsKey(String key) => $dom_attributes.containsKey(_attr(key));
+
+  String operator [](String key) => $dom_attributes[_attr(key)];
+
+  void operator []=(String key, value) {
+    $dom_attributes[_attr(key)] = '$value';
+  }
+
+  String putIfAbsent(String key, String ifAbsent()) =>
+    $dom_attributes.putIfAbsent(_attr(key), ifAbsent);
+
+  String remove(String key) => $dom_attributes.remove(_attr(key));
+
+  void clear() {
+    // Needs to operate on a snapshot since we are mutating the collection.
+    for (String key in keys) {
+      remove(key);
+    }
+  }
+
+  void forEach(void f(String key, String value)) {
+    $dom_attributes.forEach((String key, String value) {
+      if (_matches(key)) {
+        f(_strip(key), value);
+      }
+    });
+  }
+
+  Collection<String> get keys {
+    final keys = new List<String>();
+    $dom_attributes.forEach((String key, String value) {
+      if (_matches(key)) {
+        keys.add(_strip(key));
+      }
+    });
+    return keys;
+  }
+
+  Collection<String> get values {
+    final values = new List<String>();
+    $dom_attributes.forEach((String key, String value) {
+      if (_matches(key)) {
+        values.add(value);
+      }
+    });
+    return values;
+  }
+
+  int get length => keys.length;
+
+  // TODO: Use lazy iterator when it is available on Map.
+  bool get isEmpty => length == 0;
+
+  // Helpers.
+  String _attr(String key) => 'data-$key';
+  bool _matches(String key) => key.startsWith('data-');
+  String _strip(String key) => key.substring(5);
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
 /**
  * An object representing the top-level context object for web scripting.
  *
@@ -28530,7 +27518,7 @@
   History get history;
 
   /**
-   * Indicates whether this window is closed.
+   * Indicates whether this window has been closed.
    *
    *     print(window.closed); // 'false'
    *     window.close();
@@ -28583,6 +27571,34 @@
   Window get top;
 
   // Methods.
+  /**
+   * Closes the window.
+   *
+   * This method should only succeed if the [Window] object is
+   * **script-closeable** and the window calling [close] is allowed to navigate
+   * the window.
+   *
+   * A window is script-closeable if it is either a window
+   * that was opened by another window, or if it is a window with only one
+   * document in its history.
+   *
+   * A window might not be allowed to navigate, and therefore close, another
+   * window due to browser security features.
+   *
+   *     var other = window.open('http://www.example.com', 'foo');
+   *     // Closes other window, as it is script-closeable.
+   *     other.close();
+   *     print(other.closed()); // 'true'
+   *
+   *     window.location('http://www.mysite.com', 'foo');
+   *     // Does not close this window, as the history has changed.
+   *     window.close();
+   *     print(window.closed()); // 'false'
+   *
+   * See also:
+   *
+   * * [Window close discussion](http://www.w3.org/TR/html5/browsers.html#dom-window-close) from the W3C
+   */
   void close();
   void postMessage(var message, String targetOrigin, [List messagePorts = null]);
 }
@@ -28837,6 +27853,410 @@
 
 
 /**
+ * Works with KeyboardEvent and KeyEvent to determine how to expose information
+ * about Key(board)Events. This class functions like an EventListenerList, and
+ * provides a consistent interface for the Dart
+ * user, despite the fact that a multitude of browsers that have varying
+ * keyboard default behavior.
+ *
+ * This class is very much a work in progress, and we'd love to get information
+ * on how we can make this class work with as many international keyboards as
+ * possible. Bugs welcome! 
+ */
+class KeyboardEventController {
+  // This code inspired by Closure's KeyHandling library.
+  // http://closure-library.googlecode.com/svn/docs/closure_goog_events_keyhandler.js.source.html
+  
+  /**
+   * The set of keys that have been pressed down without seeing their
+   * corresponding keyup event.
+   */
+  List<KeyboardEvent> _keyDownList;
+
+  /** The set of functions that wish to be notified when a KeyEvent happens. */
+  List<Function> _callbacks;
+
+  /** The type of KeyEvent we are tracking (keyup, keydown, keypress). */
+  String _type;
+
+  /** The element we are watching for events to happen on. */
+  EventTarget _target;
+
+  // The distance to shift from upper case alphabet Roman letters to lower case.
+  int _ROMAN_ALPHABET_OFFSET = "a".charCodes[0] - "A".charCodes[0];
+
+  // Instance members referring to the internal event handlers because closures
+  // are not hashable.
+  var _keyUp, _keyDown, _keyPress;
+
+  /**
+   * An enumeration of key identifiers currently part of the W3C draft for DOM3
+   * and their mappings to keyCodes.
+   * http://www.w3.org/TR/DOM-Level-3-Events/keyset.html#KeySet-Set
+   */
+  static Map<String, int> _keyIdentifier = {
+    'Up': KeyCode.UP,
+    'Down': KeyCode.DOWN,
+    'Left': KeyCode.LEFT,
+    'Right': KeyCode.RIGHT,
+    'Enter': KeyCode.ENTER,
+    'F1': KeyCode.F1,
+    'F2': KeyCode.F2,
+    'F3': KeyCode.F3,
+    'F4': KeyCode.F4,
+    'F5': KeyCode.F5,
+    'F6': KeyCode.F6,
+    'F7': KeyCode.F7,
+    'F8': KeyCode.F8,
+    'F9': KeyCode.F9,
+    'F10': KeyCode.F10,
+    'F11': KeyCode.F11,
+    'F12': KeyCode.F12,
+    'U+007F': KeyCode.DELETE,
+    'Home': KeyCode.HOME,
+    'End': KeyCode.END,
+    'PageUp': KeyCode.PAGE_UP,
+    'PageDown': KeyCode.PAGE_DOWN,
+    'Insert': KeyCode.INSERT
+  };
+
+  /** Named constructor to add an onKeyPress event listener to our handler. */
+  KeyboardEventController.keypress(EventTarget target) {
+    _KeyboardEventController(target, 'keypress');
+  }
+  
+  /** Named constructor to add an onKeyUp event listener to our handler. */
+  KeyboardEventController.keyup(EventTarget target) {
+    _KeyboardEventController(target, 'keyup');
+  }
+
+  /** Named constructor to add an onKeyDown event listener to our handler. */
+  KeyboardEventController.keydown(EventTarget target) {
+    _KeyboardEventController(target, 'keydown');
+  }
+  
+  /**
+   * General constructor, performs basic initialization for our improved
+   * KeyboardEvent controller.
+   */
+  _KeyboardEventController(EventTarget target, String type) {
+    _callbacks = [];
+    _type = type;
+    _target = target;
+    _keyDown = processKeyDown;
+    _keyUp = processKeyUp;
+    _keyPress = processKeyPress;
+  }
+
+  /**
+   * Hook up all event listeners under the covers so we can estimate keycodes
+   * and charcodes when they are not provided.
+   */
+  void _initializeAllEventListeners() {
+    _keyDownList = [];
+    _target.on.keyDown.add(_keyDown, true);
+    _target.on.keyPress.add(_keyPress, true);
+    _target.on.keyUp.add(_keyUp, true);
+  }
+
+  /** Add a callback that wishes to be notified when a KeyEvent occurs. */
+  void add(void callback(KeyEvent)) {
+    if (_callbacks.length == 0) {
+      _initializeAllEventListeners();
+    }
+    _callbacks.add(callback);
+  }
+  
+  /**
+   * Notify all callback listeners that a KeyEvent of the relevant type has
+   * occurred.
+   */
+  bool _dispatch(KeyEvent event) {
+    if (event.type == _type) {
+      // Make a copy of the listeners in case a callback gets removed while
+      // dispatching from the list.
+      List callbacksCopy = new List.from(_callbacks);
+      for(var callback in callbacksCopy) {
+        callback(event);
+      }
+    }
+  }
+
+  /** Remove the given callback from the listeners list. */
+  void remove(void callback(KeyEvent)) {
+    var index = _callbacks.indexOf(callback);
+    if (index != -1) {
+      _callbacks.removeAt(index);
+    }
+    if (_callbacks.length == 0) {
+      // If we have no listeners, don't bother keeping track of keypresses.
+      _target.on.keyDown.remove(_keyDown);
+      _target.on.keyPress.remove(_keyPress);
+      _target.on.keyUp.remove(_keyUp);
+    }
+  }
+
+  /** Determine if caps lock is one of the currently depressed keys. */
+  bool get _capsLockOn =>
+      _keyDownList.some((var element) => element.keyCode == KeyCode.CAPS_LOCK);
+
+  /**
+   * Given the previously recorded keydown key codes, see if we can determine
+   * the keycode of this keypress [event]. (Generally browsers only provide
+   * charCode information for keypress events, but with a little
+   * reverse-engineering, we can also determine the keyCode.) Returns
+   * KeyCode.UNKNOWN if the keycode could not be determined.
+   */
+  int _determineKeyCodeForKeypress(KeyboardEvent event) {
+    // Note: This function is a work in progress. We'll expand this function
+    // once we get more information about other keyboards.
+    for (var prevEvent in _keyDownList) {
+      if (prevEvent._shadowCharCode == event.charCode) {
+        return prevEvent.keyCode;
+      }
+      if ((event.shiftKey || _capsLockOn) && event.charCode >= "A".charCodes[0]
+          && event.charCode <= "Z".charCodes[0] && event.charCode +
+          _ROMAN_ALPHABET_OFFSET == prevEvent._shadowCharCode) {
+        return prevEvent.keyCode;
+      }
+    }
+    return KeyCode.UNKNOWN;
+  }
+
+  /**
+   * Given the charater code returned from a keyDown [event], try to ascertain
+   * and return the corresponding charCode for the character that was pressed.
+   * This information is not shown to the user, but used to help polyfill
+   * keypress events.
+   */
+  int _findCharCodeKeyDown(KeyboardEvent event) {
+    if (event.keyLocation == 3) { // Numpad keys.
+      switch (event.keyCode) {
+        case KeyCode.NUM_ZERO:
+          // Even though this function returns _charCodes_, for some cases the
+          // KeyCode == the charCode we want, in which case we use the keycode
+          // constant for readability.
+          return KeyCode.ZERO;
+        case KeyCode.NUM_ONE:
+          return KeyCode.ONE;
+        case KeyCode.NUM_TWO:
+          return KeyCode.TWO;
+        case KeyCode.NUM_THREE:
+          return KeyCode.THREE;
+        case KeyCode.NUM_FOUR:
+          return KeyCode.FOUR;
+        case KeyCode.NUM_FIVE:
+          return KeyCode.FIVE;
+        case KeyCode.NUM_SIX:
+          return KeyCode.SIX;
+        case KeyCode.NUM_SEVEN:
+          return KeyCode.SEVEN;
+        case KeyCode.NUM_EIGHT:
+          return KeyCode.EIGHT;
+        case KeyCode.NUM_NINE:
+          return KeyCode.NINE;
+        case KeyCode.NUM_MULTIPLY:
+          return 42; // Char code for *
+        case KeyCode.NUM_PLUS:
+          return 43; // +
+        case KeyCode.NUM_MINUS:
+          return 45; // -
+        case KeyCode.NUM_PERIOD:
+          return 46; // .
+        case KeyCode.NUM_DIVISION:
+          return 47; // /
+      }
+    } else if (event.keyCode >= 65 && event.keyCode <= 90) {
+      // Set the "char code" for key down as the lower case letter. Again, this
+      // will not show up for the user, but will be helpful in estimating
+      // keyCode locations and other information during the keyPress event.
+      return event.keyCode + _ROMAN_ALPHABET_OFFSET;
+    }
+    switch(event.keyCode) {
+      case KeyCode.SEMICOLON:
+        return KeyCode.FF_SEMICOLON;
+      case KeyCode.EQUALS:
+        return KeyCode.FF_EQUALS;
+      case KeyCode.COMMA:
+        return 44; // Ascii value for ,
+      case KeyCode.DASH:
+        return 45; // -
+      case KeyCode.PERIOD:
+        return 46; // .
+      case KeyCode.SLASH:
+        return 47; // /
+      case KeyCode.APOSTROPHE:
+        return 96; // `
+      case KeyCode.OPEN_SQUARE_BRACKET:
+        return 91; // [
+      case KeyCode.BACKSLASH:
+        return 92; // \
+      case KeyCode.CLOSE_SQUARE_BRACKET:
+        return 93; // ]
+      case KeyCode.SINGLE_QUOTE:
+        return 39; // '
+    }
+    return event.keyCode;
+  }
+
+  /**
+   * Returns true if the key fires a keypress event in the current browser.
+   */
+  bool _firesKeyPressEvent(KeyEvent event) {
+    if (!_Device.isIE && !_Device.isWebKit) {
+      return true;
+    }
+    
+    if (_Device.userAgent.contains('Mac') && event.altKey) {
+      return KeyCode.isCharacterKey(event.keyCode);
+    }
+ 
+    // Alt but not AltGr which is represented as Alt+Ctrl.
+    if (event.altKey && !event.ctrlKey) {
+      return false;
+    }
+ 
+    // Saves Ctrl or Alt + key for IE and WebKit, which won't fire keypress.
+    if (!event.shiftKey &&
+        (_keyDownList.last.keyCode == KeyCode.CTRL ||
+         _keyDownList.last.keyCode == KeyCode.ALT ||
+         _Device.userAgent.contains('Mac') &&
+         _keyDownList.last.keyCode == KeyCode.META)) {
+      return false;
+    }
+ 
+    // Some keys with Ctrl/Shift do not issue keypress in WebKit.
+    if (_Device.isWebKit && event.ctrlKey && event.shiftKey && (
+        event.keycode == KeyCode.BACKSLASH ||
+        event.keycode == KeyCode.OPEN_SQUARE_BRACKET ||
+        event.keycode == KeyCode.CLOSE_SQUARE_BRACKET ||
+        event.keycode == KeyCode.TILDE ||
+        event.keycode == KeyCode.SEMICOLON || event.keycode == KeyCode.DASH ||
+        event.keycode == KeyCode.EQUALS || event.keycode == KeyCode.COMMA ||
+        event.keycode == KeyCode.PERIOD || event.keycode == KeyCode.SLASH ||
+        event.keycode == KeyCode.APOSTROPHE ||
+        event.keycode == KeyCode.SINGLE_QUOTE)) {
+      return false;
+    }
+ 
+    switch (event.keyCode) {
+      case KeyCode.ENTER:
+        // IE9 does not fire keypress on ENTER.
+        return !_Device.isIE;
+      case KeyCode.ESC:
+        return !_Device.isWebKit;
+    }
+ 
+    return KeyCode.isCharacterKey(event.keyCode);
+  }
+
+  /**
+   * Normalize the keycodes to the IE KeyCodes (this is what Chrome, IE, and
+   * Opera all use).
+   */
+  int _normalizeKeyCodes(KeyboardEvent event) {
+    // Note: This may change once we get input about non-US keyboards.
+    if (_Device.isFirefox) {
+      switch(event.keyCode) {
+        case KeyCode.FF_EQUALS:
+          return KeyCode.EQUALS;
+        case KeyCode.FF_SEMICOLON:
+          return KeyCode.SEMICOLON;
+        case KeyCode.MAC_FF_META:
+          return KeyCode.META;
+        case KeyCode.WIN_KEY_FF_LINUX:
+          return KeyCode.WIN_KEY;
+      }
+    }
+    return event.keyCode;
+  }
+
+  /** Handle keydown events. */
+  void processKeyDown(KeyboardEvent e) {
+    // Ctrl-Tab and Alt-Tab can cause the focus to be moved to another window
+    // before we've caught a key-up event.  If the last-key was one of these
+    // we reset the state.
+    if (_keyDownList.length > 0 &&
+        (_keyDownList.last.keyCode == KeyCode.CTRL && !e.ctrlKey ||
+         _keyDownList.last.keyCode == KeyCode.ALT && !e.altKey ||
+         _Device.userAgent.contains('Mac') &&
+         _keyDownList.last.keyCode == KeyCode.META && !e.metaKey)) {
+      _keyDownList = [];
+    }
+
+    var event = new KeyEvent(e);
+    event._shadowKeyCode = _normalizeKeyCodes(event);
+    // Technically a "keydown" event doesn't have a charCode. This is
+    // calculated nonetheless to provide us with more information in giving
+    // as much information as possible on keypress about keycode and also
+    // charCode.
+    event._shadowCharCode = _findCharCodeKeyDown(event);
+    if (_keyDownList.length > 0 && event.keyCode != _keyDownList.last.keyCode &&
+        !_firesKeyPressEvent(event)) {
+      // Some browsers have quirks not firing keypress events where all other
+      // browsers do. This makes them more consistent.
+      processKeyPress(event);
+    }
+    _keyDownList.add(event);
+    _dispatch(event);
+  }
+
+  /** Handle keypress events. */
+  void processKeyPress(KeyboardEvent event) {
+    var e = new KeyEvent(event);
+    // IE reports the character code in the keyCode field for keypress events.
+    // There are two exceptions however, Enter and Escape.
+    if (_Device.isIE) {
+      if (e.keyCode == KeyCode.ENTER || e.keyCode == KeyCode.ESC) {
+        e._shadowCharCode = 0;
+      } else {
+        e._shadowCharCode = e.keyCode;
+      }
+    } else if (_Device.isOpera) {
+      // Opera reports the character code in the keyCode field.
+      e._shadowCharCode = KeyCode.isCharacterKey(keyCode) ? e.keyCode : 0;
+    }
+    // Now we guestimate about what the keycode is that was actually
+    // pressed, given previous keydown information.
+    e._shadowKeyCode = _determineKeyCodeForKeypress(e);
+
+    // Correct the key value for certain browser-specific quirks.
+    if (e._shadowKeyIdentifier &&
+        _keyIdentifier.contains(e._shadowKeyIdentifier)) {
+      // This is needed for Safari Windows because it currently doesn't give a
+      // keyCode/which for non printable keys.
+      e._shadowKeyCode = _keyIdentifier[keyIdentifier];
+    }
+    e._shadowAltKey = _keyDownList.some((var element) => element.altKey);
+    _dispatch(e);
+  }
+
+  /** Handle keyup events. */
+  void processKeyUp(KeyboardEvent event) {
+    var e = new KeyEvent(event);
+    KeyboardEvent toRemove = null;
+    for (var key in _keyDownList) {
+      if (key.keyCode == e.keyCode) {
+        toRemove = key;
+      }
+    }
+    if (toRemove != null) {
+      _keyDownList = _keyDownList.filter((element) => element != toRemove);
+    } else if (_keyDownList.length > 0) {
+      // This happens when we've reached some international keyboard case we
+      // haven't accounted for or we haven't correctly eliminated all browser
+      // inconsistencies. Filing bugs on when this is reached is welcome! 
+      _keyDownList.removeLast(); 
+    }
+    _dispatch(e);
+  }
+}
+// Copyright (c) 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.
+
+
+/**
  * Defines the keycode values for keys that are returned by 
  * KeyboardEvent.keyCode.
  * 
@@ -29027,6 +28447,36 @@
   static const int WIN_KEY = 224;
   static const int MAC_FF_META = 224;
   static const int WIN_IME = 229;
+
+  /** A sentinel value if the keycode could not be determined. */
+  static const int UNKNOWN = -1;
+
+  /**
+   * Returns true if the keyCode produces a (US keyboard) character.
+   * Note: This does not (yet) cover characters on non-US keyboards (Russian,
+   * Hebrew, etc.).
+   */
+  static bool isCharacterKey(int keyCode) {
+    if ((keyCode >= ZERO && keyCode <= NINE) ||
+        (keyCode >= NUM_ZERO && keyCode <= NUM_MULTIPLY) ||
+        (keyCode >= A && keyCode <= Z)) {
+      return true;
+    }
+ 
+    // Safari sends zero key code for non-latin characters.
+    if (_Device.isWebKit && keyCode == 0) {
+      return true;
+    }
+ 
+    return (keyCode == SPACE || keyCode == QUESTION_MARK || keyCode == NUM_PLUS
+        || keyCode == NUM_MINUS || keyCode == NUM_PERIOD ||
+        keyCode == NUM_DIVISION || keyCode == SEMICOLON ||
+        keyCode == FF_SEMICOLON || keyCode == DASH || keyCode == EQUALS ||
+        keyCode == FF_EQUALS || keyCode == COMMA || keyCode == PERIOD ||
+        keyCode == SLASH || keyCode == APOSTROPHE || keyCode == SINGLE_QUOTE ||
+        keyCode == OPEN_SQUARE_BRACKET || keyCode == BACKSLASH ||
+        keyCode == CLOSE_SQUARE_BRACKET);
+  }
 }
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -29767,7 +29217,7 @@
 
   static DocumentFragment createDocumentFragment_html(String html) {
     final fragment = new DocumentFragment();
-    fragment.innerHTML = html;
+    fragment.innerHtml = html;
     return fragment;
   }
 
@@ -29775,7 +29225,7 @@
   // factory DocumentFragment.xml(String xml) {
   //   final fragment = new DocumentFragment();
   //   final e = new XMLElement.tag("xml");
-  //   e.innerHTML = xml;
+  //   e.innerHtml = xml;
   //
   //   // Copy list first since we don't want liveness during iteration.
   //   final List nodes = new List.from(e.nodes);
@@ -29786,7 +29236,7 @@
   static DocumentFragment createDocumentFragment_svg(String svgContent) {
     final fragment = new DocumentFragment();
     final e = new svg.SVGSVGElement();
-    e.innerHTML = svgContent;
+    e.innerHtml = svgContent;
 
     // Copy list first since we don't want liveness during iteration.
     final List nodes = new List.from(e.nodes);
@@ -29794,19 +29244,114 @@
     return fragment;
   }
 }
+/**
+ * A custom KeyboardEvent that attempts to eliminate cross-browser
+ * inconsistencies, and also provide both keyCode and charCode information
+ * for all key events (when such information can be determined).
+ *
+ * This class is very much a work in progress, and we'd love to get information
+ * on how we can make this class work with as many international keyboards as
+ * possible. Bugs welcome!
+ */
+class KeyEvent implements KeyboardEvent {
+  /** The parent KeyboardEvent that this KeyEvent is wrapping and "fixing". */
+  KeyboardEvent _parent;
+
+  /** The "fixed" value of whether the alt key is being pressed. */
+  bool _shadowAltKey;
+
+  /** Caculated value of what the estimated charCode is for this event. */
+  int _shadowCharCode;
+
+  /** Caculated value of what the estimated keyCode is for this event. */
+  int _shadowKeyCode;
+
+  /** Caculated value of what the estimated keyCode is for this event. */
+  int get keyCode => _shadowKeyCode;
+
+  /** Caculated value of what the estimated charCode is for this event. */
+  int get charCode => this.type == 'keypress' ? _shadowCharCode : 0;
+
+  /** Caculated value of whether the alt key is pressed is for this event. */
+  bool get altKey => _shadowAltKey;
+
+  /** Caculated value of what the estimated keyCode is for this event. */
+  int get which => keyCode;
+
+  /** Accessor to the underlying keyCode value is the parent event. */
+  int get _realKeyCode => _parent.keyCode;
+  
+  /** Accessor to the underlying charCode value is the parent event. */
+  int get _realCharCode => _parent.charCode;
+
+  /** Accessor to the underlying altKey value is the parent event. */
+  bool get _realAltKey => _parent.altKey;
+
+  /** Construct a KeyEvent with [parent] as event we're emulating. */
+  KeyEvent(KeyboardEvent parent) {
+    _parent = parent;
+    _shadowAltKey = _realAltKey;
+    _shadowCharCode = _realCharCode;
+    _shadowKeyCode = _realKeyCode;
+  }
+ 
+  /** True if the altGraphKey is pressed during this event. */
+  bool get altGraphKey => _parent.altGraphKey;
+  bool get bubbles => _parent.bubbles;
+  /** True if this event can be cancelled. */
+  bool get cancelable => _parent.cancelable;
+  bool get cancelBubble => _parent.cancelBubble;
+  set cancelBubble(bool cancel) => _parent = cancel;
+  /** Accessor to the clipboardData available for this event. */
+  Clipboard get clipboardData => _parent.clipboardData;
+  /** True if the ctrl key is pressed during this event. */
+  bool get ctrlKey => _parent.ctrlKey;
+  /** Accessor to the target this event is listening to for changes. */
+  EventTarget get currentTarget => _parent.currentTarget;
+  bool get defaultPrevented => _parent.defaultPrevented;
+  int get detail => _parent.detail;
+  int get eventPhase => _parent.eventPhase;
+  /**
+   * Accessor to the part of the keyboard that the key was pressed from (one of
+   * KeyLocation.STANDARD, KeyLocation.RIGHT, KeyLocation.LEFT,
+   * KeyLocation.NUMPAD, KeyLocation.MOBILE, KeyLocation.JOYSTICK).
+   */
+  int get keyLocation => _parent.keyLocation;
+  int get layerX => _parent.layerX;
+  int get layerY => _parent.layerY;
+  /** True if the Meta (or Mac command) key is pressed during this event. */
+  bool get metaKey => _parent.metaKey;
+  int get pageX => _parent.pageX;
+  int get pageY => _parent.pageY;
+  bool get returnValue => _parent.returnValue;
+  set returnValue(bool value) => _parent = value;
+  /** True if the shift key was pressed during this event. */
+  bool get shiftKey => _parent.shiftKey;
+  int get timeStamp => _parent.timeStamp;
+  /**
+   * The type of key event that occurred. One of "keydown", "keyup", or
+   * "keypress".
+   */
+  String get type => _parent.type;
+  Window get view => _parent.view;
+  void preventDefault() => _parent.preventDefault();
+  void stopImmediatePropagation() => _parent.stopImmediatePropagation();
+  void stopPropagation() => _parent.stopPropagation();
+  void $dom_initUIEvent(String type, bool canBubble, bool cancelable,
+      LocalWindow view, int detail) {
+    throw new UnsupportedError("Cannot initialize a UI Event from a KeyEvent.");
+  }
+  void $dom_initEvent(String eventTypeArg, bool canBubbleArg,
+      bool cancelableArg) {
+    throw new UnsupportedError("Cannot initialize an Event from a KeyEvent.");
+  }
+  String get _shadowKeyIdentifier => _parent.$dom_keyIdentifier;
+}
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 
-class _AudioContextFactoryProvider {
-  static AudioContext createAudioContext() => _createAudioContext();
-  static _createAudioContext([int numberOfChannels,
-                              int numberOfFrames,
-                              int sampleRate])
-      native "AudioContext_constructor_Callback";
-}
-
 class _IDBKeyRangeFactoryProvider {
 
   static IDBKeyRange createIDBKeyRange_only(/*IDBKey*/ value) =>
@@ -30774,13 +30319,13 @@
   _DOMWindowCrossFrame.internal();
 
   // Fields.
-  History get history() native "DOMWindow_history_cross_frame_Getter";
-  Location get location() native "DOMWindow_location_cross_frame_Getter";
-  bool get closed() native "DOMWindow_closed_Getter";
-  int get length() native "DOMWindow_length_Getter";
-  Window get opener() native "DOMWindow_opener_Getter";
-  Window get parent() native "DOMWindow_parent_Getter";
-  Window get top() native "DOMWindow_top_Getter";
+  History get history native "DOMWindow_history_cross_frame_Getter";
+  Location get location native "DOMWindow_location_cross_frame_Getter";
+  bool get closed native "DOMWindow_closed_Getter";
+  int get length native "DOMWindow_length_Getter";
+  Window get opener native "DOMWindow_opener_Getter";
+  Window get parent native "DOMWindow_parent_Getter";
+  Window get top native "DOMWindow_top_Getter";
 
   // Methods.
   void close() native "DOMWindow_close_Callback";
diff --git a/sdk/lib/html/docs/html_docs.json b/sdk/lib/html/docs/html_docs.json
new file mode 100644
index 0000000..6ab4273
--- /dev/null
+++ b/sdk/lib/html/docs/html_docs.json
@@ -0,0 +1,1657 @@
+{
+"MenuElement.dart":
+  {
+  "class MenuElement extends Element implements Element native \"*HTMLMenuElement\" {":
+    [
+      "/**",
+      " * An HTML <menu> element.",
+      " *",
+      " * A <menu> element represents an unordered list of menu commands.",
+      " *",
+      " * See also:",
+      " *",
+      " *  * [Menu Element](https://developer.mozilla.org/en-US/docs/HTML/Element/menu) from MDN.",
+      " *  * [Menu Element](http://www.w3.org/TR/html5/the-menu-element.html#the-menu-element) from the W3C.",
+      " */"
+    ]
+  },
+"RTCIceCandidateEvent.dart":
+  {
+
+  },
+"BRElement.dart":
+  {
+
+  },
+"NavigatorUserMediaError.dart":
+  {
+
+  },
+"WorkerContext.dart":
+  {
+
+  },
+"TextTrackCue.dart":
+  {
+
+  },
+"DOMParser.dart":
+  {
+
+  },
+"EntryCallback.dart":
+  {
+
+  },
+"SQLTransactionSync.dart":
+  {
+
+  },
+"ProgressElement.dart":
+  {
+
+  },
+"HtmlElement.dart":
+  {
+
+  },
+"Worker.dart":
+  {
+
+  },
+"XMLSerializer.dart":
+  {
+
+  },
+"PositionErrorCallback.dart":
+  {
+
+  },
+"MapElement.dart":
+  {
+
+  },
+"Rect.dart":
+  {
+
+  },
+"SourceElement.dart":
+  {
+
+  },
+"FileWriter.dart":
+  {
+
+  },
+"CSSMatrix.dart":
+  {
+
+  },
+"Metadata.dart":
+  {
+
+  },
+"StorageInfoUsageCallback.dart":
+  {
+
+  },
+"WebGLDebugShaders.dart":
+  {
+
+  },
+"WebGLShaderPrecisionFormat.dart":
+  {
+
+  },
+"NodeFilter.dart":
+  {
+
+  },
+"Float64Array.dart":
+  {
+
+  },
+"BodyElement.dart":
+  {
+
+  },
+"OESElementIndexUint.dart":
+  {
+
+  },
+"WebGLLoseContext.dart":
+  {
+
+  },
+"TableElement.dart":
+  {
+
+  },
+"ScriptElement.dart":
+  {
+
+  },
+"WebGLCompressedTextureS3TC.dart":
+  {
+
+  },
+"CharacterData.dart":
+  {
+
+  },
+"OESStandardDerivatives.dart":
+  {
+
+  },
+"IDBUpgradeNeededEvent.dart":
+  {
+
+  },
+"RTCIceCandidate.dart":
+  {
+
+  },
+"IDBKeyRange.dart":
+  {
+
+  },
+"XPathException.dart":
+  {
+
+  },
+"MediaError.dart":
+  {
+
+  },
+"SQLException.dart":
+  {
+
+  },
+"WorkerLocation.dart":
+  {
+
+  },
+"ClientRect.dart":
+  {
+
+  },
+"MediaController.dart":
+  {
+
+  },
+"CustomEvent.dart":
+  {
+
+  },
+"IDBVersionChangeEvent.dart":
+  {
+
+  },
+"StorageEvent.dart":
+  {
+
+  },
+"EntityReference.dart":
+  {
+
+  },
+"FileException.dart":
+  {
+
+  },
+"Notation.dart":
+  {
+
+  },
+"HTMLCollection.dart":
+  {
+
+  },
+"Int8Array.dart":
+  {
+
+  },
+"BaseFontElement.dart":
+  {
+
+  },
+"CSSPageRule.dart":
+  {
+
+  },
+"FileEntry.dart":
+  {
+
+  },
+"UListElement.dart":
+  {
+
+  },
+"HRElement.dart":
+  {
+
+  },
+"LocalHistory.dart":
+  {
+
+  },
+"WebGLRenderbuffer.dart":
+  {
+
+  },
+"StorageInfoErrorCallback.dart":
+  {
+
+  },
+"TimeRanges.dart":
+  {
+
+  },
+"CanvasRenderingContext.dart":
+  {
+
+  },
+"IDBOpenDBRequest.dart":
+  {
+
+  },
+"TableSectionElement.dart":
+  {
+
+  },
+"Point.dart":
+  {
+
+  },
+"OESTextureFloat.dart":
+  {
+
+  },
+"Uint8ClampedArray.dart":
+  {
+
+  },
+"TransitionEvent.dart":
+  {
+
+  },
+"WebGLActiveInfo.dart":
+  {
+
+  },
+"SharedWorkerContext.dart":
+  {
+
+  },
+"HttpRequestProgressEvent.dart":
+  {
+
+  },
+"Comment.dart":
+  {
+
+  },
+"BaseElement.dart":
+  {
+
+  },
+"CloseEvent.dart":
+  {
+
+  },
+"DOMPluginArray.dart":
+  {
+
+  },
+"PopStateEvent.dart":
+  {
+
+  },
+"RGBColor.dart":
+  {
+
+  },
+"DOMSettableTokenList.dart":
+  {
+
+  },
+"Geolocation.dart":
+  {
+
+  },
+"DataTransferItem.dart":
+  {
+
+  },
+"DOMError.dart":
+  {
+
+  },
+"FormData.dart":
+  {
+
+  },
+"SQLTransactionErrorCallback.dart":
+  {
+
+  },
+"OverflowEvent.dart":
+  {
+
+  },
+"AnimationEvent.dart":
+  {
+
+  },
+"FontElement.dart":
+  {
+
+  },
+"ScriptProfileNode.dart":
+  {
+
+  },
+"SpeechRecognition.dart":
+  {
+
+  },
+"WebGLContextEvent.dart":
+  {
+
+  },
+"SpeechRecognitionEvent.dart":
+  {
+
+  },
+"RadioNodeList.dart":
+  {
+
+  },
+"BatteryManager.dart":
+  {
+
+  },
+"SelectElement.dart":
+  {
+
+  },
+"EventException.dart":
+  {
+
+  },
+"DOMImplementation.dart":
+  {
+
+  },
+"WebGLFramebuffer.dart":
+  {
+
+  },
+"Navigator.dart":
+  {
+
+  },
+"WebGLShader.dart":
+  {
+
+  },
+"IceCandidate.dart":
+  {
+
+  },
+"WebSocket.dart":
+  {
+
+  },
+"RequestAnimationFrameCallback.dart":
+  {
+
+  },
+"RTCStatsElement.dart":
+  {
+
+  },
+"HeadElement.dart":
+  {
+
+  },
+"CanvasRenderingContext2D.dart":
+  {
+
+  },
+"IDBKey.dart":
+  {
+
+  },
+"ElementTraversal.dart":
+  {
+
+  },
+"Float32Array.dart":
+  {
+
+  },
+"RTCSessionDescription.dart":
+  {
+
+  },
+"DOMTokenList.dart":
+  {
+
+  },
+"RTCStatsCallback.dart":
+  {
+
+  },
+"FrameSetElement.dart":
+  {
+
+  },
+"IDBIndex.dart":
+  {
+
+  },
+"EventSource.dart":
+  {
+
+  },
+"MediaStreamAudioSourceNode.dart":
+  {
+
+  },
+"DeviceOrientationEvent.dart":
+  {
+
+  },
+"DOMFileSystem.dart":
+  {
+
+  },
+"SpeechInputResult.dart":
+  {
+
+  },
+"DataView.dart":
+  {
+
+  },
+"LocalLocation.dart":
+  {
+
+  },
+"AnchorElement.dart":
+  {
+
+  },
+"HtmlDocument.dart":
+  {
+
+  },
+"ImageData.dart":
+  {
+
+  },
+"PageTransitionEvent.dart":
+  {
+
+  },
+"AudioGain.dart":
+  {
+
+  },
+"PannerNode.dart":
+  {
+
+  },
+"UIEvent.dart":
+  {
+
+  },
+"SourceBuffer.dart":
+  {
+
+  },
+"CSSPrimitiveValue.dart":
+  {
+
+  },
+"MediaQueryList.dart":
+  {
+
+  },
+"TableCellElement.dart":
+  {
+
+  },
+"ScriptProcessorNode.dart":
+  {
+
+  },
+"ShadowRoot.dart":
+  {
+
+  },
+"MeterElement.dart":
+  {
+
+  },
+"WebKitNamedFlow.dart":
+  {
+
+  },
+"HashChangeEvent.dart":
+  {
+
+  },
+"WebGLBuffer.dart":
+  {
+
+  },
+"TouchEvent.dart":
+  {
+
+  },
+"LegendElement.dart":
+  {
+
+  },
+"CDATASection.dart":
+  {
+
+  },
+"HttpRequestUpload.dart":
+  {
+
+  },
+"Uint8Array.dart":
+  {
+
+  },
+"StyleSheet.dart":
+  {
+
+  },
+"DataTransferItemList.dart":
+  {
+
+  },
+"RTCErrorCallback.dart":
+  {
+
+  },
+"IDBDatabase.dart":
+  {
+
+  },
+"AppletElement.dart":
+  {
+
+  },
+"TextTrackList.dart":
+  {
+
+  },
+"NodeIterator.dart":
+  {
+
+  },
+"DynamicsCompressorNode.dart":
+  {
+
+  },
+"TextMetrics.dart":
+  {
+
+  },
+"Database.dart":
+  {
+
+  },
+"OfflineAudioCompletionEvent.dart":
+  {
+
+  },
+"SQLTransaction.dart":
+  {
+
+  },
+"TableRowElement.dart":
+  {
+
+  },
+"MediaStream.dart":
+  {
+
+  },
+"MetadataCallback.dart":
+  {
+
+  },
+"TreeWalker.dart":
+  {
+
+  },
+"IDBTransaction.dart":
+  {
+
+  },
+"WebGLContextAttributes.dart":
+  {
+
+  },
+"FileEntrySync.dart":
+  {
+
+  },
+"ProgressEvent.dart":
+  {
+
+  },
+"OscillatorNode.dart":
+  {
+
+  },
+"CSSKeyframesRule.dart":
+  {
+
+  },
+"ConvolverNode.dart":
+  {
+
+  },
+"MouseEvent.dart":
+  {
+
+  },
+"Notification.dart":
+  {
+
+  },
+"ChannelSplitterNode.dart":
+  {
+
+  },
+"DirectoryReaderSync.dart":
+  {
+
+  },
+"MemoryInfo.dart":
+  {
+
+  },
+"CSSCharsetRule.dart":
+  {
+
+  },
+"RTCStatsResponse.dart":
+  {
+
+  },
+"SQLError.dart":
+  {
+
+  },
+"EntriesCallback.dart":
+  {
+
+  },
+"CanvasPattern.dart":
+  {
+
+  },
+"WebGLUniformLocation.dart":
+  {
+
+  },
+"NotificationCenter.dart":
+  {
+
+  },
+"WorkerNavigator.dart":
+  {
+
+  },
+"MarqueeElement.dart":
+  {
+
+  },
+"EXTTextureFilterAnisotropic.dart":
+  {
+
+  },
+"WebGLVertexArrayObjectOES.dart":
+  {
+
+  },
+"InputElement.dart":
+  {
+
+  },
+"ImageElement.dart":
+  {
+
+  },
+"WebGLDebugRendererInfo.dart":
+  {
+
+  },
+"SpeechRecognitionError.dart":
+  {
+
+  },
+"XPathResult.dart":
+  {
+
+  },
+"ErrorEvent.dart":
+  {
+
+  },
+"FileWriterCallback.dart":
+  {
+
+  },
+"ArrayBuffer.dart":
+  {
+
+  },
+"MessagePort.dart":
+  {
+
+  },
+"CSSKeyframeRule.dart":
+  {
+
+  },
+"NavigatorUserMediaErrorCallback.dart":
+  {
+
+  },
+"TextTrackCueList.dart":
+  {
+
+  },
+"PositionError.dart":
+  {
+
+  },
+"File.dart":
+  {
+
+  },
+"LinkElement.dart":
+  {
+
+  },
+"DeviceMotionEvent.dart":
+  {
+
+  },
+"KeygenElement.dart":
+  {
+
+  },
+"VoidCallback.dart":
+  {
+
+  },
+"ShadowElement.dart":
+  {
+
+  },
+"NotificationPermissionCallback.dart":
+  {
+
+  },
+"WebKitCSSFilterValue.dart":
+  {
+
+  },
+"CompositionEvent.dart":
+  {
+
+  },
+"LocalMediaStream.dart":
+  {
+
+  },
+"RTCSessionDescriptionCallback.dart":
+  {
+
+  },
+"HeadingElement.dart":
+  {
+
+  },
+"ScriptProfile.dart":
+  {
+
+  },
+"DOMMimeType.dart":
+  {
+
+  },
+"MutationObserver.dart":
+  {
+
+  },
+"MetaElement.dart":
+  {
+
+  },
+"SpeechRecognitionResult.dart":
+  {
+
+  },
+"FrameElement.dart":
+  {
+
+  },
+"TitleElement.dart":
+  {
+
+  },
+"Uint16Array.dart":
+  {
+
+  },
+"AudioBufferCallback.dart":
+  {
+
+  },
+"IDBCursorWithValue.dart":
+  {
+
+  },
+"HttpRequest.dart":
+  {
+
+  },
+"MediaStreamTrackList.dart":
+  {
+
+  },
+"MediaStreamEvent.dart":
+  {
+
+  },
+"IFrameElement.dart":
+  {
+
+  },
+"ParagraphElement.dart":
+  {
+
+  },
+"CSSRule.dart":
+  {
+
+  },
+"QuoteElement.dart":
+  {
+
+  },
+"AudioDestinationNode.dart":
+  {
+
+  },
+"DListElement.dart":
+  {
+
+  },
+"RTCDataChannelEvent.dart":
+  {
+
+  },
+"TableCaptionElement.dart":
+  {
+
+  },
+"SpanElement.dart":
+  {
+
+  },
+"DirectoryEntry.dart":
+  {
+
+  },
+"MediaStreamTrackEvent.dart":
+  {
+
+  },
+"OutputElement.dart":
+  {
+
+  },
+"WheelEvent.dart":
+  {
+
+  },
+"SpeechGrammarList.dart":
+  {
+
+  },
+"PositionCallback.dart":
+  {
+
+  },
+"BarInfo.dart":
+  {
+
+  },
+"FileWriterSync.dart":
+  {
+
+  },
+"AudioListener.dart":
+  {
+
+  },
+"SQLStatementErrorCallback.dart":
+  {
+
+  },
+"BeforeLoadEvent.dart":
+  {
+
+  },
+"CSSMediaRule.dart":
+  {
+
+  },
+"MediaStreamTrack.dart":
+  {
+
+  },
+"XPathEvaluator.dart":
+  {
+
+  },
+"AreaElement.dart":
+  {
+
+  },
+"Node.dart":
+  {
+
+  },
+"IDBAny.dart":
+  {
+
+  },
+"BiquadFilterNode.dart":
+  {
+
+  },
+"DOMPlugin.dart":
+  {
+
+  },
+"DatabaseSync.dart":
+  {
+
+  },
+"CSSStyleSheet.dart":
+  {
+
+  },
+"DocumentType.dart":
+  {
+
+  },
+"Uint32Array.dart":
+  {
+
+  },
+"EmbedElement.dart":
+  {
+
+  },
+"Int32Array.dart":
+  {
+
+  },
+"PerformanceNavigation.dart":
+  {
+
+  },
+"MutationCallback.dart":
+  {
+
+  },
+"WebGLRenderingContext.dart":
+  {
+
+  },
+"SpeechInputEvent.dart":
+  {
+
+  },
+"IceCallback.dart":
+  {
+
+  },
+"RangeException.dart":
+  {
+
+  },
+"DirectoryReader.dart":
+  {
+
+  },
+"UnknownElement.dart":
+  {
+
+  },
+"ErrorCallback.dart":
+  {
+
+  },
+"CanvasGradient.dart":
+  {
+
+  },
+"SQLTransactionCallback.dart":
+  {
+
+  },
+"Coordinates.dart":
+  {
+
+  },
+"JavaScriptCallFrame.dart":
+  {
+
+  },
+"StyleMedia.dart":
+  {
+
+  },
+"IDBDatabaseException.dart":
+  {
+
+  },
+"ArrayBufferView.dart":
+  {
+
+  },
+"Console.dart":
+  {
+
+  },
+"CanvasElement.dart":
+  {
+
+  },
+"RTCDataChannel.dart":
+  {
+
+  },
+"Int16Array.dart":
+  {
+
+  },
+"KeyboardEvent.dart":
+  {
+
+  },
+"FileSystemCallback.dart":
+  {
+
+  },
+"StorageInfoQuotaCallback.dart":
+  {
+
+  },
+"Screen.dart":
+  {
+
+  },
+"SessionDescription.dart":
+  {
+
+  },
+"Range.dart":
+  {
+
+  },
+"VideoElement.dart":
+  {
+
+  },
+"DirectoryElement.dart":
+  {
+
+  },
+"ModElement.dart":
+  {
+
+  },
+"Animation.dart":
+  {
+
+  },
+"WebGLProgram.dart":
+  {
+
+  },
+"Gamepad.dart":
+  {
+
+  },
+"Clipboard.dart":
+  {
+
+  },
+"Storage.dart":
+  {
+
+  },
+"LocalWindow.dart":
+  {
+
+  },
+"MediaQueryListListener.dart":
+  {
+
+  },
+"TextAreaElement.dart":
+  {
+
+  },
+"DOMApplicationCache.dart":
+  {
+
+  },
+"ParamElement.dart":
+  {
+
+  },
+"HTMLOptionsCollection.dart":
+  {
+
+  },
+"MessageEvent.dart":
+  {
+
+  },
+"AbstractWorker.dart":
+  {
+
+  },
+"OListElement.dart":
+  {
+
+  },
+"FileReader.dart":
+  {
+
+  },
+"Blob.dart":
+  {
+
+  },
+"NamedNodeMap.dart":
+  {
+
+  },
+"DataListElement.dart":
+  {
+
+  },
+"CSSImportRule.dart":
+  {
+
+  },
+"AudioParam.dart":
+  {
+
+  },
+"DOMException.dart":
+  {
+
+  },
+"ObjectElement.dart":
+  {
+
+  },
+"CSSStyleRule.dart":
+  {
+
+  },
+"TouchList.dart":
+  {
+
+  },
+"MediaElementAudioSourceNode.dart":
+  {
+
+  },
+"CSSValue.dart":
+  {
+
+  },
+"Geoposition.dart":
+  {
+
+  },
+"MediaKeyEvent.dart":
+  {
+
+  },
+"MutationRecord.dart":
+  {
+
+  },
+"CSSTransformValue.dart":
+  {
+
+  },
+"FileError.dart":
+  {
+
+  },
+"Performance.dart":
+  {
+
+  },
+"DivElement.dart":
+  {
+  "class DivElement extends Element implements Element native \"*HTMLDivElement\" {":
+    [
+      "/**",
+      " * Represents an HTML <div> element.",
+      " *",
+      " * The [DivElement] is a generic container for content and does not have any",
+      " * special significance. It is functionally similar to [SpanElement].",
+      " *",
+      " * The [DivElement] is a block-level element, as opposed to [SpanElement],",
+      " * which is an inline-level element.",
+      " *",
+      " * Example usage:",
+      " *",
+      " *     DivElement div = new DivElement();",
+      " *     div.text = 'Here's my new DivElem",
+      " *     document.body.elements.add(elem);",
+      " *",
+      " * See also:",
+      " *",
+      " * * [HTML <div> element](http://www.w3.org/TR/html-markup/div.html) from W3C.",
+      " * * [Block-level element](http://www.w3.org/TR/CSS2/visuren.html#block-boxes) from W3C.",
+      " * * [Inline-level element](http://www.w3.org/TR/CSS2/visuren.html#inline-boxes) from W3C.",
+      " */"
+    ]
+  },
+"AnalyserNode.dart":
+  {
+
+  },
+"AudioBuffer.dart":
+  {
+
+  },
+"SQLTransactionSyncCallback.dart":
+  {
+
+  },
+"StorageInfo.dart":
+  {
+
+  },
+"GainNode.dart":
+  {
+
+  },
+"TimeoutHandler.dart":
+  {
+
+  },
+"MutationEvent.dart":
+  {
+
+  },
+"SpeechRecognitionAlternative.dart":
+  {
+
+  },
+"AudioNode.dart":
+  {
+
+  },
+"SQLResultSetRowList.dart":
+  {
+
+  },
+"ContentElement.dart":
+  {
+
+  },
+"OESVertexArrayObject.dart":
+  {
+
+  },
+"TableColElement.dart":
+  {
+
+  },
+"RTCPeerConnection.dart":
+  {
+
+  },
+"Crypto.dart":
+  {
+
+  },
+"StyleElement.dart":
+  {
+
+  },
+"TrackElement.dart":
+  {
+
+  },
+"IDBVersionChangeRequest.dart":
+  {
+
+  },
+"TextEvent.dart":
+  {
+
+  },
+"ElementTimeControl.dart":
+  {
+
+  },
+"Touch.dart":
+  {
+
+  },
+"FieldSetElement.dart":
+  {
+
+  },
+"XSLTProcessor.dart":
+  {
+
+  },
+"EventTarget.dart":
+  {
+
+  },
+"Document.dart":
+  {
+
+  },
+"CSSStyleDeclaration.dart":
+  {
+
+  },
+"DocumentFragment.dart":
+  {
+
+  },
+"XPathNSResolver.dart":
+  {
+
+  },
+"DedicatedWorkerContext.dart":
+  {
+
+  },
+"IDBRequest.dart":
+  {
+
+  },
+"XPathExpression.dart":
+  {
+
+  },
+"IDBObjectStore.dart":
+  {
+
+  },
+"DelayNode.dart":
+  {
+
+  },
+"SQLResultSet.dart":
+  {
+
+  },
+"ButtonElement.dart":
+  {
+
+  },
+"ValidityState.dart":
+  {
+
+  },
+"Text.dart":
+  {
+
+  },
+"DirectoryEntrySync.dart":
+  {
+
+  },
+"Url.dart":
+  {
+
+  },
+"CSSFontFaceRule.dart":
+  {
+
+  },
+"NavigatorUserMediaSuccessCallback.dart":
+  {
+
+  },
+"OptGroupElement.dart":
+  {
+
+  },
+"Entry.dart":
+  {
+
+  },
+"IDBFactory.dart":
+  {
+
+  },
+"OptionElement.dart":
+  {
+
+  },
+"AudioContext.dart":
+  {
+
+  },
+"DetailsElement.dart":
+  {
+
+  },
+"DOMSelection.dart":
+  {
+
+  },
+"LabelElement.dart":
+  {
+
+  },
+"CSSUnknownRule.dart":
+  {
+
+  },
+"ProcessingInstruction.dart":
+  {
+
+  },
+"HTMLAllCollection.dart":
+  {
+
+  },
+"TrackEvent.dart":
+  {
+
+  },
+"SharedWorker.dart":
+  {
+
+  },
+"Element.dart":
+  {
+
+  },
+"MediaSource.dart":
+  {
+
+  },
+"MediaList.dart":
+  {
+
+  },
+"StringCallback.dart":
+  {
+
+  },
+"DOMFileSystemSync.dart":
+  {
+
+  },
+"DOMStringMap.dart":
+  {
+
+  },
+"AudioProcessingEvent.dart":
+  {
+
+  },
+"Attr.dart":
+  {
+
+  },
+"ChannelMergerNode.dart":
+  {
+
+  },
+"IDBCursor.dart":
+  {
+
+  },
+"MessageChannel.dart":
+  {
+
+  },
+"FileCallback.dart":
+  {
+
+  },
+"PerformanceTiming.dart":
+  {
+
+  },
+"SourceBufferList.dart":
+  {
+
+  },
+"AudioElement.dart":
+  {
+
+  },
+"Event.dart":
+  {
+
+  },
+"FileReaderSync.dart":
+  {
+
+  },
+"TextTrack.dart":
+  {
+
+  },
+"Counter.dart":
+  {
+
+  },
+"MediaElement.dart":
+  {
+
+  },
+"DOMMimeTypeArray.dart":
+  {
+
+  },
+"PreElement.dart":
+  {
+
+  },
+"WebGLDepthTexture.dart":
+  {
+
+  },
+"FormElement.dart":
+  {
+
+  },
+"HttpRequestException.dart":
+  {
+
+  },
+"PeerConnection00.dart":
+  {
+
+  },
+"PagePopupController.dart":
+  {
+
+  },
+"LIElement.dart":
+  {
+
+  },
+"AudioBufferSourceNode.dart":
+  {
+
+  },
+"AudioSourceNode.dart":
+  {
+
+  },
+"RTCStatsReport.dart":
+  {
+
+  },
+"SQLStatementCallback.dart":
+  {
+
+  },
+"WaveTable.dart":
+  {
+
+  },
+"DatabaseCallback.dart":
+  {
+
+  },
+"WebGLTexture.dart":
+  {
+
+  },
+"EntrySync.dart":
+  {
+
+  },
+"SpeechGrammar.dart":
+  {
+
+  },
+"WaveShaperNode.dart":
+  {
+
+  },
+"MediaKeyError.dart":
+  {
+
+  }
+}
\ No newline at end of file
diff --git a/sdk/lib/html/docs/svg_docs.json b/sdk/lib/html/docs/svg_docs.json
new file mode 100644
index 0000000..f01683a
--- /dev/null
+++ b/sdk/lib/html/docs/svg_docs.json
@@ -0,0 +1,606 @@
+{
+"PathSegLinetoVerticalRel.dart":
+  {
+
+  },
+"DefsElement.dart":
+  {
+
+  },
+"LineElement.dart":
+  {
+
+  },
+"SwitchElement.dart":
+  {
+
+  },
+"Rect.dart":
+  {
+
+  },
+"Matrix.dart":
+  {
+
+  },
+"VKernElement.dart":
+  {
+
+  },
+"RenderingIntent.dart":
+  {
+
+  },
+"AnimatedBoolean.dart":
+  {
+
+  },
+"Angle.dart":
+  {
+
+  },
+"MissingGlyphElement.dart":
+  {
+
+  },
+"ZoomEvent.dart":
+  {
+
+  },
+"RadialGradientElement.dart":
+  {
+
+  },
+"AltGlyphDefElement.dart":
+  {
+
+  },
+"PathSegCurvetoQuadraticRel.dart":
+  {
+
+  },
+"FEPointLightElement.dart":
+  {
+
+  },
+"ScriptElement.dart":
+  {
+
+  },
+"GradientElement.dart":
+  {
+
+  },
+"FETileElement.dart":
+  {
+
+  },
+"PathSegList.dart":
+  {
+
+  },
+"AnimateTransformElement.dart":
+  {
+
+  },
+"TSpanElement.dart":
+  {
+
+  },
+"FEGaussianBlurElement.dart":
+  {
+
+  },
+"PathSegCurvetoQuadraticAbs.dart":
+  {
+
+  },
+"AnimateElement.dart":
+  {
+
+  },
+"ExternalResourcesRequired.dart":
+  {
+
+  },
+"FontFaceNameElement.dart":
+  {
+
+  },
+"UriReference.dart":
+  {
+
+  },
+"Length.dart":
+  {
+
+  },
+"FEMergeElement.dart":
+  {
+
+  },
+"Point.dart":
+  {
+
+  },
+"AnimatedTransformList.dart":
+  {
+
+  },
+"ViewSpec.dart":
+  {
+
+  },
+"Transformable.dart":
+  {
+
+  },
+"FEDisplacementMapElement.dart":
+  {
+
+  },
+"PathSegArcRel.dart":
+  {
+
+  },
+"Stylable.dart":
+  {
+
+  },
+"PathSegLinetoRel.dart":
+  {
+
+  },
+"PathSegCurvetoCubicSmoothRel.dart":
+  {
+
+  },
+"FEMorphologyElement.dart":
+  {
+
+  },
+"ElementInstance.dart":
+  {
+
+  },
+"AnimateMotionElement.dart":
+  {
+
+  },
+"AElement.dart":
+  {
+
+  },
+"FontElement.dart":
+  {
+
+  },
+"AnimatedInteger.dart":
+  {
+
+  },
+"PathElement.dart":
+  {
+
+  },
+"FEColorMatrixElement.dart":
+  {
+
+  },
+"PathSegLinetoHorizontalAbs.dart":
+  {
+
+  },
+"NumberList.dart":
+  {
+
+  },
+"RectElement.dart":
+  {
+
+  },
+"MPathElement.dart":
+  {
+
+  },
+"PathSegClosePath.dart":
+  {
+
+  },
+"FEFloodElement.dart":
+  {
+
+  },
+"FontFaceSrcElement.dart":
+  {
+
+  },
+"Number.dart":
+  {
+
+  },
+"PolylineElement.dart":
+  {
+
+  },
+"AnimatedLengthList.dart":
+  {
+
+  },
+"FECompositeElement.dart":
+  {
+
+  },
+"FontFaceFormatElement.dart":
+  {
+
+  },
+"TransformList.dart":
+  {
+
+  },
+"FEDropShadowElement.dart":
+  {
+
+  },
+"SvgSvgElement.dart":
+  {
+
+  },
+"PreserveAspectRatio.dart":
+  {
+
+  },
+"ForeignObjectElement.dart":
+  {
+
+  },
+"FESpotLightElement.dart":
+  {
+
+  },
+"DescElement.dart":
+  {
+
+  },
+"FontFaceUriElement.dart":
+  {
+
+  },
+"ImageElement.dart":
+  {
+
+  },
+"AnimatedPreserveAspectRatio.dart":
+  {
+
+  },
+"PathSegCurvetoQuadraticSmoothAbs.dart":
+  {
+
+  },
+"GElement.dart":
+  {
+
+  },
+"PathSegMovetoRel.dart":
+  {
+
+  },
+"Paint.dart":
+  {
+
+  },
+"AnimatedEnumeration.dart":
+  {
+
+  },
+"FEFuncAElement.dart":
+  {
+
+  },
+"CircleElement.dart":
+  {
+
+  },
+"SetElement.dart":
+  {
+
+  },
+"TitleElement.dart":
+  {
+
+  },
+"PatternElement.dart":
+  {
+
+  },
+"AnimatedString.dart":
+  {
+
+  },
+"FEFuncRElement.dart":
+  {
+
+  },
+"SvgDocument.dart":
+  {
+
+  },
+"FEMergeNodeElement.dart":
+  {
+
+  },
+"Exception.dart":
+  {
+
+  },
+"UseElement.dart":
+  {
+
+  },
+"PathSegLinetoVerticalAbs.dart":
+  {
+
+  },
+"FontFaceElement.dart":
+  {
+
+  },
+"PathSegCurvetoCubicRel.dart":
+  {
+
+  },
+"Color.dart":
+  {
+
+  },
+"PathSegArcAbs.dart":
+  {
+
+  },
+"FilterPrimitiveStandardAttributes.dart":
+  {
+
+  },
+"AnimationElement.dart":
+  {
+
+  },
+"AltGlyphElement.dart":
+  {
+
+  },
+"MarkerElement.dart":
+  {
+
+  },
+"FEDiffuseLightingElement.dart":
+  {
+
+  },
+"FETurbulenceElement.dart":
+  {
+
+  },
+"SvgElement.dart":
+  {
+
+  },
+"Transform.dart":
+  {
+
+  },
+"Locatable.dart":
+  {
+
+  },
+"UnitTypes.dart":
+  {
+
+  },
+"ViewElement.dart":
+  {
+
+  },
+"FEConvolveMatrixElement.dart":
+  {
+
+  },
+"FEDistantLightElement.dart":
+  {
+
+  },
+"PolygonElement.dart":
+  {
+
+  },
+"MetadataElement.dart":
+  {
+
+  },
+"ZoomAndPan.dart":
+  {
+
+  },
+"ClipPathElement.dart":
+  {
+
+  },
+"TextPositioningElement.dart":
+  {
+
+  },
+"StopElement.dart":
+  {
+
+  },
+"SymbolElement.dart":
+  {
+
+  },
+"HKernElement.dart":
+  {
+
+  },
+"GlyphRefElement.dart":
+  {
+
+  },
+"PathSegCurvetoCubicAbs.dart":
+  {
+
+  },
+"GlyphElement.dart":
+  {
+
+  },
+"MaskElement.dart":
+  {
+
+  },
+"TextContentElement.dart":
+  {
+
+  },
+"FilterElement.dart":
+  {
+
+  },
+"FEFuncGElement.dart":
+  {
+
+  },
+"EllipseElement.dart":
+  {
+
+  },
+"Tests.dart":
+  {
+
+  },
+"AnimatedLength.dart":
+  {
+
+  },
+"PathSegCurvetoQuadraticSmoothRel.dart":
+  {
+
+  },
+"StyleElement.dart":
+  {
+
+  },
+"CursorElement.dart":
+  {
+
+  },
+"FitToViewBox.dart":
+  {
+
+  },
+"TextElement.dart":
+  {
+
+  },
+"FEFuncBElement.dart":
+  {
+
+  },
+"FEOffsetElement.dart":
+  {
+
+  },
+"FEImageElement.dart":
+  {
+
+  },
+"LangSpace.dart":
+  {
+
+  },
+"FESpecularLightingElement.dart":
+  {
+
+  },
+"PointList.dart":
+  {
+
+  },
+"LinearGradientElement.dart":
+  {
+
+  },
+"PathSegMovetoAbs.dart":
+  {
+
+  },
+"AnimatedNumberList.dart":
+  {
+
+  },
+"PathSegLinetoHorizontalRel.dart":
+  {
+
+  },
+"LengthList.dart":
+  {
+
+  },
+"ComponentTransferFunctionElement.dart":
+  {
+
+  },
+"StringList.dart":
+  {
+
+  },
+"FEComponentTransferElement.dart":
+  {
+
+  },
+"PathSegCurvetoCubicSmoothAbs.dart":
+  {
+
+  },
+"PathSegLinetoAbs.dart":
+  {
+
+  },
+"AnimatedNumber.dart":
+  {
+
+  },
+"TextPathElement.dart":
+  {
+
+  },
+"AnimatedRect.dart":
+  {
+
+  },
+"AnimatedAngle.dart":
+  {
+
+  },
+"AltGlyphItemElement.dart":
+  {
+
+  },
+"TRefElement.dart":
+  {
+
+  },
+"AnimateColorElement.dart":
+  {
+
+  },
+"PathSeg.dart":
+  {
+
+  },
+"FEBlendElement.dart":
+  {
+
+  }
+}
\ No newline at end of file
diff --git a/sdk/lib/html/scripts/dartdomgenerator.py b/sdk/lib/html/scripts/dartdomgenerator.py
index 18cba86..d15f894 100755
--- a/sdk/lib/html/scripts/dartdomgenerator.py
+++ b/sdk/lib/html/scripts/dartdomgenerator.py
@@ -25,6 +25,8 @@
 
 _logger = logging.getLogger('dartdomgenerator')
 
+_libraries = ['html', 'svg', 'web_audio']
+
 class GeneratorOptions(object):
   def __init__(self, templates, database, type_registry, renamer):
     self.templates = templates
@@ -85,6 +87,7 @@
       interface_generator.Generate()
 
     generator.Generate(webkit_database, common_database, generate_interface)
+
     dart_library_emitter.EmitLibraries(auxiliary_dir)
 
   if dart2js_output_dir:
@@ -99,7 +102,7 @@
 
     dart_output_dir = os.path.join(dart2js_output_dir, 'dart')
     dart_libraries = DartLibraries(
-        template_loader, 'dart2js', dart2js_output_dir)
+        _libraries, template_loader, 'dart2js', dart2js_output_dir)
 
     RunGenerator(dart_libraries, dart_output_dir,
         template_loader, backend_factory)
@@ -118,7 +121,7 @@
 
     dart_output_dir = os.path.join(dartium_output_dir, 'dart')
     dart_libraries = DartLibraries(
-        template_loader, 'dartium', dartium_output_dir)
+        _libraries, template_loader, 'dartium', dartium_output_dir)
 
     RunGenerator(dart_libraries, dart_output_dir,
                  template_loader, backend_factory)
@@ -131,7 +134,7 @@
   _logger.info('Flush...')
   emitters.Flush()
 
-def GenerateSingleFile(library_path, output_dir):
+def GenerateSingleFile(library_path, output_dir, generated_output_dir=None):
   library_dir = os.path.dirname(library_path)
   library_filename = os.path.basename(library_path)
   copy_dart_script = os.path.relpath('../../../../tools/copy_dart.py',
@@ -170,6 +173,7 @@
   systems = options.systems.split(',')
 
   output_dir = options.output_dir or os.path.join(current_dir, '../generated')
+
   dart2js_output_dir = None
   if 'htmldart2js' in systems:
     dart2js_output_dir = os.path.join(output_dir, 'dart2js')
@@ -185,18 +189,33 @@
     database = LoadDatabase(database_dir, options.use_database_cache)
   GenerateFromDatabase(database, dart2js_output_dir, dartium_output_dir)
 
+  _logger.info('Add documentation to generated classes.')
+  html_to_json_script = os.path.relpath(
+      '../../../../tools/html_json_doc/bin/html_json_doc.dart',
+      current_dir)
+  html_output_dir = os.path.join(output_dir, 'dart2js/dart/html/')
+  svg_output_dir = os.path.join(output_dir, 'dart2js/dart/svg/')
+  html_json_path = os.path.relpath('../docs/html_docs.json')
+  svg_json_path = os.path.relpath('../docs/svg_docs.json')
+  html_command = ' '.join(['dart', html_to_json_script, '--mode=json-to-html',
+                      html_output_dir, html_json_path])
+  svg_command = ' '.join(['dart', html_to_json_script, '--mode=json-to-html',
+                      svg_output_dir, svg_json_path])
+  subprocess.call([html_command], shell=True)
+  subprocess.call([svg_command], shell=True)
+
   if 'htmldart2js' in systems:
     _logger.info('Generating dart2js single files.')
-    GenerateSingleFile(os.path.join(dart2js_output_dir, 'html_dart2js.dart'),
-                       '../dart2js')
-    GenerateSingleFile(os.path.join(dart2js_output_dir, 'svg_dart2js.dart'),
-        '../../svg/dart2js')
+    for library_name in _libraries:
+      GenerateSingleFile(
+          os.path.join(dart2js_output_dir, '%s_dart2js.dart' % library_name),
+          '../../%s/dart2js' % library_name)
   if 'htmldartium' in systems:
     _logger.info('Generating dartium single files.')
-    GenerateSingleFile(os.path.join(dartium_output_dir, 'html_dartium.dart'),
-                       '../dartium')
-    GenerateSingleFile(os.path.join(dartium_output_dir, 'svg_dartium.dart'),
-        '../../svg/dartium')
+    for library_name in _libraries:
+      GenerateSingleFile(
+          os.path.join(dartium_output_dir, '%s_dartium.dart' % library_name),
+          '../../%s/dartium' % library_name)
 
 if __name__ == '__main__':
   sys.exit(main())
diff --git a/sdk/lib/html/scripts/databasebuilder.py b/sdk/lib/html/scripts/databasebuilder.py
index d75d033..81d6c0e 100755
--- a/sdk/lib/html/scripts/databasebuilder.py
+++ b/sdk/lib/html/scripts/databasebuilder.py
@@ -74,19 +74,7 @@
   except SyntaxError, e:
     raise RuntimeError('Failed to load file %s: %s'
                        % (file_name, e))
- 
-def _load_idl_file_to_queue(file_name, import_options, result_queue):
-  """Loads an IDL file into a result_queue to process in the master thread"""
-  try:
-    result = _load_idl_file(file_name, import_options)
-    result_queue.put(result, False)
-    return 0
-  except RuntimeError, e:
-    result_queue.put(e, False)
-    return 1
-  except:
-    result_queue.put('Unknown error loading %s' % file_name, False)
-    return 1
+
 
 class DatabaseBuilder(object):
   def __init__(self, database):
@@ -429,25 +417,17 @@
   def import_idl_files(self, file_paths, import_options, parallel):
     if parallel:
       # Parse the IDL files in parallel.
-      result_queue = multiprocessing.Queue(len(file_paths))
-      jobs = [ multiprocessing.Process(target=_load_idl_file_to_queue,
-                                       args=(file_path, import_options,
-                                             result_queue))
-               for file_path in file_paths ]
+      pool = multiprocessing.Pool()
       try:
-        for job in jobs:
-          job.start()
-        for job in jobs:
-          # Timeout and throw after 5 sec.
-          result = result_queue.get(True, 5)
-          if isinstance(result, IDLFile):
-            self._process_idl_file(result, import_options)
-          else:
-            raise result
+        for file_path in file_paths:
+          pool.apply_async(_load_idl_file,
+                           [ file_path, import_options],
+                           callback = lambda idl_file:
+                             self._process_idl_file(idl_file, import_options))
+        pool.close()
+        pool.join()
       except:
-        # Clean up child processes on error.
-        for job in jobs:
-          job.terminate()
+        pool.terminate()
         raise
     else:
       # Parse the IDL files in serial.
diff --git a/sdk/lib/html/scripts/generator.py b/sdk/lib/html/scripts/generator.py
index 76b5ecf..30b0333 100644
--- a/sdk/lib/html/scripts/generator.py
+++ b/sdk/lib/html/scripts/generator.py
@@ -545,11 +545,15 @@
     'SerializedScriptValue set Worker.postMessage': _serialize_SSV,
 
     # receiving message via MessageEvent
-    'DOMObject get MessageEvent.data':
+    '* get MessageEvent.data':
       Conversion('_convertNativeToDart_SerializedScriptValue',
                  'dynamic', 'dynamic'),
 
-    'DOMObject get PopStateEvent.state':
+    '* get History.state':
+      Conversion('_convertNativeToDart_SerializedScriptValue',
+                 'dynamic', 'dynamic'),
+
+    '* get PopStateEvent.state':
       Conversion('_convertNativeToDart_SerializedScriptValue',
                  'dynamic', 'dynamic'),
 
@@ -577,13 +581,14 @@
 def FindConversion(idl_type, direction, interface, member):
   table = dart2js_conversions
   return (table.get('%s %s %s.%s' % (idl_type, direction, interface, member)) or
+          table.get('* %s %s.%s' % (direction, interface, member)) or
           table.get('%s %s %s.*' % (idl_type, direction, interface)) or
           table.get('%s %s' % (idl_type, direction)))
   return None
 
 # ------------------------------------------------------------------------------
 
-# Annotations to be placed on members.  The table is indexed by the IDL
+# Annotations to be placed on native members.  The table is indexed by the IDL
 # interface and member name, and by IDL return or field type name.  Both are
 # used to assemble the annotations:
 #
@@ -602,8 +607,18 @@
     'CanvasRenderingContext2D.webkitGetImageDataHD':
       "@Creates('ImageData|=Object')",
 
+    # Methods returning Window can return a local window, or a cross-frame
+    # window (=Object) that needs wrapping.
+    'DOMWindow':
+      "@Creates('LocalWindow|=Object') @Returns('LocalWindow|=Object')",
+
     'DOMWindow.openDatabase': "@Creates('Database') @Creates('DatabaseSync')",
 
+    # Cross-frame windows are EventTargets.
+    'EventTarget':
+      #"@Creates('Null') @Returns('EventTarget|=Object')",
+      "@Creates('EventTarget|=Object') @Returns('EventTarget|=Object')",
+
     'FileReader.result': "@Creates('String|ArrayBuffer|Null')",
 
     # Rather than have the result of an IDBRequest as a union over all possible
@@ -645,6 +660,16 @@
 
     'MessageEvent.ports': "@Creates('=List')",
 
+    'MessageEvent.data':
+      "@_annotation_Creates_SerializedScriptValue "
+      "@_annotation_Returns_SerializedScriptValue",
+    'PopStateEvent.state':
+      "@_annotation_Creates_SerializedScriptValue "
+      "@_annotation_Returns_SerializedScriptValue",
+    'SerializedScriptValue':
+      "@_annotation_Creates_SerializedScriptValue "
+      "@_annotation_Returns_SerializedScriptValue",
+
     'SQLResultSetRowList.item': "@Creates('=Object')",
 
     'XMLHttpRequest.response':
@@ -1096,7 +1121,7 @@
         item_type='MediaStream', suppress_interface=True),
     'NamedNodeMap': TypeData(clazz='Interface', item_type='Node'),
     'NodeList': TypeData(clazz='Interface', item_type='Node',
-                         suppress_interface=True),
+                         suppress_interface=False, dart_type='List<Node>'),
     'SVGAnimatedLengthList': TypeData(clazz='Interface',
         item_type='SVGAnimatedLength'),
     'SVGAnimatedNumberList': TypeData(clazz='Interface',
diff --git a/sdk/lib/html/scripts/htmleventgenerator.py b/sdk/lib/html/scripts/htmleventgenerator.py
index c36a892..4bedc32 100644
--- a/sdk/lib/html/scripts/htmleventgenerator.py
+++ b/sdk/lib/html/scripts/htmleventgenerator.py
@@ -196,16 +196,25 @@
 
   def ProcessInterface(self, interface, html_interface_name, custom_events,
                        events_implementation_emitter):
-    events = set([attr for attr in interface.attributes
+    event_names = set([attr.id[2:] for attr in interface.attributes
                   if attr.type.id == 'EventListener'])
-    if not events and interface.id not in _html_explicit_event_classes:
+
+    # Document and DocumentFragment actually derive from Element, so omit
+    # any events which are duplicated with that.
+    if interface.id == 'Document' or interface.id == 'DocumentFragment':
+      element_interface = self._database.GetInterface('Element')
+      for attr in element_interface.attributes:
+        if attr.type.id == 'EventListener' and attr.id[2:] in event_names:
+          event_names.remove(attr.id[2:])
+
+    if not event_names and interface.id not in _html_explicit_event_classes:
       return None
 
     self._event_classes.add(interface.id)
     events_class_name = html_interface_name + 'Events'
     parent_events_class_name = self._GetParentEventsClassName(interface)
 
-    if not events:
+    if not event_names:
       return parent_events_class_name
 
     template_file = 'impl_%s.darttemplate' % events_class_name
@@ -222,8 +231,8 @@
         SUPER='%s' % parent_events_class_name)
 
     dom_event_names = set()
-    for event in events:
-      dom_name = event.id[2:]
+    for event in event_names:
+      dom_name = event
       dom_name = _on_attribute_to_event_name_mapping.get(dom_name, dom_name)
       dom_event_names.add(dom_name)
     if html_interface_name in _html_manual_events:
@@ -239,7 +248,7 @@
         implementation_events_members.Emit(
             "\n"
             "  EventListenerList get $NAME => this['$DOM_NAME'];\n",
-            NAME=html_name,
+          NAME=html_name,
             DOM_NAME=dom_name)
 
     return events_class_name
diff --git a/sdk/lib/html/scripts/htmlrenamer.py b/sdk/lib/html/scripts/htmlrenamer.py
index 2f26d06..9c43084 100644
--- a/sdk/lib/html/scripts/htmlrenamer.py
+++ b/sdk/lib/html/scripts/htmlrenamer.py
@@ -14,6 +14,7 @@
     'Location': 'LocalLocation',
     'SVGDocument': 'SvgDocument', # Manual to avoid name conflicts.
     'SVGElement': 'SvgElement', # Manual to avoid name conflicts.
+    'SVGException': 'SvgException', # Manual of avoid conflict with Exception.
     'SVGSVGElement': 'SvgSvgElement', # Manual to avoid name conflicts.
     'WebKitAnimation': 'Animation',
     'WebKitAnimationEvent': 'AnimationEvent',
@@ -75,18 +76,24 @@
   'Element.className',
   'Element.firstElementChild',
   'Element.getAttribute',
+  'Element.getAttributeNS',
   'Element.getElementsByClassName',
   'Element.getElementsByTagName',
   'Element.hasAttribute',
+  'Element.hasAttributeNS',
   'Element.lastElementChild',
   'Element.querySelector',
   'Element.querySelectorAll',
   'Element.removeAttribute',
+  'Element.removeAttributeNS',
   'Element.setAttribute',
+  'Element.setAttributeNS',
   'Event.initEvent',
+  'UIEvent.initUIEvent',
   'EventTarget.addEventListener',
   'EventTarget.dispatchEvent',
   'EventTarget.removeEventListener',
+  'KeyboardEvent.keyIdentifier',
   'LocalWindow.getComputedStyle',
   'MouseEvent.initMouseEvent',
   'Node.appendChild',
@@ -94,8 +101,12 @@
   'Node.childNodes',
   'Node.firstChild',
   'Node.lastChild',
+  "Node.localName",
+  'Node.namespaceURI',
   'Node.removeChild',
   'Node.replaceChild',
+  'UIEvent.keyCode',
+  'UIEvent.charCode',
   'ShadowRoot.getElementById',
   'ShadowRoot.getElementsByClassName',
   'ShadowRoot.getElementsByTagName',
@@ -112,6 +123,7 @@
 # Members from the standard dom that exist in the dart:html library with
 # identical functionality but with cleaner names.
 _renamed_html_members = {
+    'Document.createCDATASection': 'createCDataSection',
     'Document.defaultView': 'window',
     'Element.webkitMatchesSelector' : 'matchesSelector',
     'Element.scrollIntoViewIfNeeded': 'scrollIntoView',
@@ -191,16 +203,13 @@
     'Document.webkitCurrentFullScreenElement',
     'Document.webkitFullScreenKeyboardInputAllowed',
     "DocumentType.*",
-    "Element.hasAttributeNS",
-    "Element.getAttributeNS",
     "Element.setAttributeNode",
     "Element.getAttributeNode",
     "Element.removeAttributeNode",
-    "Element.removeAttributeNS",
     "Element.setAttributeNodeNS",
     "Element.getAttributeNodeNS",
-    "Element.setAttributeNS",
     "Event.srcElement",
+    "EventSource.URL",
     "BodyElement.text",
     "AnchorElement.text",
     "OptionElement.text",
@@ -249,8 +258,10 @@
     "Document.version",
     "Document.manifest",
     "HTMLIsIndexElement.*",
+    "MenuElement.compact",
     "HTMLOptionsCollection.*",
     "HTMLPropertiesCollection.*",
+    "KeyboardEvent.initKeyboardEvent",
     "SelectElement.remove",
     "NamedNodeMap.*",
     "Node.isEqualNode",
@@ -260,9 +271,7 @@
     "Node.get:DOCUMENT_POSITION_FOLLOWING",
     "Node.lookupNamespaceURI",
     "Node.get:ELEMENT_NODE",
-    "Node.get:namespaceURI",
     "Node.get:DOCUMENT_FRAGMENT_NODE",
-    "Node.get:localName",
     "Node.isDefaultNamespace",
     "Node.compareDocumentPosition",
     "Node.get:baseURI",
@@ -313,6 +322,7 @@
         return interface.id[len('HTML'):]
     return self.DartifyTypeName(interface.id)
 
+
   def RenameMember(self, interface_name, member_node, member, member_prefix=''):
     """
     Returns the name of the member in the HTML library or None if the member is
@@ -328,10 +338,13 @@
 
     name = self._FindMatch(interface, member, member_prefix,
                            _renamed_html_members)
+
     target_name = _renamed_html_members[name] if name else member
     if self._FindMatch(interface, member, member_prefix, _private_html_members):
       if not target_name.startswith('$dom_'):  # e.g. $dom_svgClassName
         target_name = '$dom_' + target_name
+
+    target_name = self._DartifyMemberName(target_name)
     return target_name
 
   def _FindMatch(self, interface, member, member_prefix, candidates):
@@ -352,11 +365,20 @@
     Gets the name of the library this type should live in.
     This is private because this should use interfaces to resolve the library.
     """
-
     if idl_type_name.startswith('SVG'):
       return 'svg'
+    if 'Audio' in idl_type_name:
+      return 'web_audio'
+
+    if self._database.HasInterface(idl_type_name):
+      interface = self._database.GetInterface(idl_type_name)
+      for parent in self._database.Hierarchy(interface):
+        if parent.id == 'AudioNode':
+          return 'web_audio'
+
     return 'html'
 
+
   def DartifyTypeName(self, type_name):
     """Converts a DOM name to a Dart-friendly class name. """
     library_name = self._GetLibraryName(type_name)
@@ -366,6 +388,14 @@
 
     # Strip off the SVG prefix.
     name = re.sub(r'^SVG', '', type_name)
+    return self._CamelCaseName(name)
+
+  def _DartifyMemberName(self, member_name):
+    # Strip off any OpenGL ES suffixes.
+    name = re.sub(r'OES$', '', member_name)
+    return self._CamelCaseName(name)
+
+  def _CamelCaseName(self, name):
 
     def toLower(match):
       return match.group(1) + match.group(2).lower() + match.group(3)
diff --git a/sdk/lib/html/scripts/systemhtml.py b/sdk/lib/html/scripts/systemhtml.py
index 38ad58c..345a3f1 100644
--- a/sdk/lib/html/scripts/systemhtml.py
+++ b/sdk/lib/html/scripts/systemhtml.py
@@ -202,7 +202,8 @@
 
 _element_constructors = {
   'html': _html_element_constructors,
-  'svg': _svg_element_constructors
+  'svg': _svg_element_constructors,
+  'web_audio': {},
 }
 
 _factory_ctr_strings = {
@@ -214,6 +215,10 @@
     'provider_name': '_SvgElementFactoryProvider',
     'constructor_name': 'createSvgElement_tag',
   },
+  'web_audio': {
+    'provider_name': 'document',
+    'constructor_name': '$dom_createElement'
+  },
 }
 
 def ElementConstructorInfos(typename, element_constructors,
@@ -507,11 +512,7 @@
       return
 
     if IsPureInterface(self._interface.id):
-      self._AddInterfaceAttribute(attribute)
-      return
-
-    if attribute.id != html_name:
-      self._AddAttributeUsingProperties(attribute, html_name, read_only)
+      self._AddInterfaceAttribute(attribute, html_name)
       return
 
     # If the attribute is shadowing, we can't generate a shadowing
@@ -532,7 +533,7 @@
               '  // Use implementation from $SUPER.\n'
               '  // final $TYPE $NAME;\n',
               SUPER=super_attribute_interface,
-              NAME=DartDomNameOfAttribute(attribute),
+              NAME=html_name,
               TYPE=self.SecureOutputType(attribute.type.id))
           return
       self._members_emitter.Emit('\n  // Shadowing definition.')
@@ -549,20 +550,23 @@
     output_type = self.SecureOutputType(attribute.type.id)
     input_type = self._NarrowInputType(attribute.type.id)
     annotations = self._Annotations(attribute.type.id, attribute.id)
+    rename = self._RenamingAnnotation(attribute.id, html_name)
     self.EmitAttributeDocumentation(attribute)
     if not read_only:
       self._members_emitter.Emit(
-          '\n  $ANNOTATIONS$TYPE $NAME;'
+          '\n  $RENAME$ANNOTATIONS$TYPE $NAME;'
           '\n',
+          RENAME=rename,
           ANNOTATIONS=annotations,
-          NAME=DartDomNameOfAttribute(attribute),
+          NAME=html_name,
           TYPE=output_type)
     else:
       self._members_emitter.Emit(
-          '\n  $(ANNOTATIONS)final $TYPE $NAME;'
+          '\n  $RENAME$(ANNOTATIONS)final $TYPE $NAME;'
           '\n',
+          RENAME=rename,
           ANNOTATIONS=annotations,
-          NAME=DartDomNameOfAttribute(attribute),
+          NAME=html_name,
           TYPE=output_type)
 
   def _AddAttributeUsingProperties(self, attribute, html_name, read_only):
@@ -570,11 +574,11 @@
     if not read_only:
       self._AddRenamingSetter(attribute, html_name)
 
-  def _AddInterfaceAttribute(self, attribute):
+  def _AddInterfaceAttribute(self, attribute, html_name):
     self._members_emitter.Emit(
         '\n  $TYPE $NAME;'
         '\n',
-        NAME=DartDomNameOfAttribute(attribute),
+        NAME=html_name,
         TYPE=self.SecureOutputType(attribute.type.id))
 
   def _AddRenamingGetter(self, attr, html_name):
@@ -612,11 +616,11 @@
 
   def _AddConvertingGetter(self, attr, html_name, conversion):
     self._members_emitter.Emit(
-        # TODO(sra): Use metadata to provide native name.
         '\n  $RETURN_TYPE get $HTML_NAME => $CONVERT(this._$(HTML_NAME));'
-        '\n  $NATIVE_TYPE get _$HTML_NAME =>'
-        ' JS("$NATIVE_TYPE", "#.$NAME", this);'
+        "\n  @JSName('$NAME')"
+        '\n  $(ANNOTATIONS)final $NATIVE_TYPE _$HTML_NAME;'
         '\n',
+        ANNOTATIONS=self._Annotations(attr.type.id, html_name),
         CONVERT=conversion.function_name,
         HTML_NAME=html_name,
         NAME=attr.id,
@@ -661,32 +665,15 @@
       self._AddDirectNativeOperation(info, html_name)
 
   def _AddDirectNativeOperation(self, info, html_name):
-    # Do we need a native body?
-    if html_name != info.declared_name:
-      return_type = self.SecureOutputType(info.type_name)
-
-      operation_emitter = self._members_emitter.Emit(
-          '$!SCOPE',
-          MODIFIERS='static ' if info.IsStatic() else '',
-          ANNOTATIONS=self._Annotations(info.type_name, info.declared_name),
-          TYPE=return_type,
-          HTML_NAME=html_name,
-          NAME=info.declared_name,
-          PARAMS=info.ParametersDeclaration(self._NarrowInputType))
-
-      operation_emitter.Emit(
-          '\n'
-          '  $ANNOTATIONS'
-          '$MODIFIERS$TYPE $(HTML_NAME)($PARAMS) native "$NAME";\n')
-    else:
-      self._members_emitter.Emit(
-          '\n'
-          '  $ANNOTATIONS$MODIFIERS$TYPE $NAME($PARAMS) native;\n',
-          MODIFIERS='static ' if info.IsStatic() else '',
-          ANNOTATIONS=self._Annotations(info.type_name, info.declared_name),
-          TYPE=self.SecureOutputType(info.type_name),
-          NAME=info.name,
-          PARAMS=info.ParametersDeclaration(self._NarrowInputType))
+    self._members_emitter.Emit(
+        '\n'
+        '  $RENAME$ANNOTATIONS$MODIFIERS$TYPE $NAME($PARAMS) native;\n',
+        RENAME=self._RenamingAnnotation(info.declared_name, html_name),
+        ANNOTATIONS=self._Annotations(info.type_name, info.declared_name),
+        MODIFIERS='static ' if info.IsStatic() else '',
+        TYPE=self.SecureOutputType(info.type_name),
+        NAME=html_name,
+        PARAMS=info.ParametersDeclaration(self._NarrowInputType))
 
   def _AddOperationWithConversions(self, info, html_name):
     # Assert all operations have same return type.
@@ -785,13 +772,13 @@
         call_emitter.Emit('$(INDENT)return $CALL;\n', CALL=call)
 
       self._members_emitter.Emit(
-          '  $MODIFIERS$ANNOTATIONS$TYPE$TARGET($PARAMS) native "$NATIVE";\n',
-          MODIFIERS='static ' if info.IsStatic() else '',
+          '  $RENAME$ANNOTATIONS$MODIFIERS$TYPE$TARGET($PARAMS) native;\n',
+          RENAME=self._RenamingAnnotation(info.declared_name, target),
           ANNOTATIONS=self._Annotations(info.type_name, info.declared_name),
+          MODIFIERS='static ' if info.IsStatic() else '',
           TYPE=TypeOrNothing(native_return_type),
           TARGET=target,
-          PARAMS=', '.join(target_parameters),
-          NATIVE=info.declared_name)
+          PARAMS=', '.join(target_parameters))
 
     def GenerateChecksAndCall(operation, argument_count):
       checks = []
@@ -871,8 +858,13 @@
                              member_name)
     return member_name in _js_custom_members
 
-  def _Annotations(self, idl_type, member_name):
-    annotations = FindAnnotations(idl_type, self._interface.id, member_name)
+  def _RenamingAnnotation(self, idl_name, member_name):
+    if member_name != idl_name:
+      return  "@JSName('%s')\n  " % idl_name
+    return ''
+
+  def _Annotations(self, idl_type, idl_member_name):
+    annotations = FindAnnotations(idl_type, self._interface.id, idl_member_name)
     if annotations:
       return '%s\n  ' % annotations
     return_type = self.SecureOutputType(idl_type)
@@ -985,11 +977,11 @@
 # ------------------------------------------------------------------------------
 
 class DartLibraries():
-  def __init__(self, template_loader, library_type, output_dir):
-    self._libraries = {
-      'svg': DartLibrary('svg', template_loader, library_type, output_dir),
-      'html': DartLibrary('html', template_loader, library_type, output_dir),
-    }
+  def __init__(self, libraries, template_loader, library_type, output_dir):
+    self._libraries = {}
+    for library_name in libraries:
+      self._libraries[library_name] = DartLibrary(
+          library_name, template_loader, library_type, output_dir)
 
   def AddFile(self, basename, library_name, path):
     self._libraries[library_name].AddFile(path)
diff --git a/sdk/lib/html/src/AttributeMap.dart b/sdk/lib/html/src/AttributeMap.dart
new file mode 100644
index 0000000..e5e6e26
--- /dev/null
+++ b/sdk/lib/html/src/AttributeMap.dart
@@ -0,0 +1,223 @@
+// Copyright (c) 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.
+
+part of html;
+
+abstract class _AttributeMap implements Map<String, String> {
+
+  bool containsValue(String value) {
+    for (var v in this.values) {
+      if (value == v) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  String putIfAbsent(String key, String ifAbsent()) {
+    if (!containsKey(key)) {
+      this[key] = ifAbsent();
+    }
+    return this[key];
+  }
+
+  void clear() {
+    for (var key in keys) {
+      remove(key);
+    }
+  }
+
+  void forEach(void f(String key, String value)) {
+    for (var key in keys) {
+      var value = this[key];
+      f(key, value);
+    }
+  }
+
+  Collection<String> get keys {
+    // TODO: generate a lazy collection instead.
+    var attributes = _element.$dom_attributes;
+    var keys = new List<String>();
+    for (int i = 0, len = attributes.length; i < len; i++) {
+      if (_matches(attributes[i])) {
+        keys.add(attributes[i].$dom_localName);
+      }
+    }
+    return keys;
+  }
+
+  Collection<String> get values {
+    // TODO: generate a lazy collection instead.
+    var attributes = _element.$dom_attributes;
+    var values = new List<String>();
+    for (int i = 0, len = attributes.length; i < len; i++) {
+      if (_matches(attributes[i])) {
+        values.add(attributes[i].value);
+      }
+    }
+    return values;
+  }
+
+  /**
+   * Returns true if there is no {key, value} pair in the map.
+   */
+  bool get isEmpty {
+    return length == 0;
+  }
+
+  /**
+   * Checks to see if the node should be included in this map.
+   */
+  bool _matches(Node node);
+}
+
+/**
+ * Wrapper to expose [Element.attributes] as a typed map.
+ */
+class _ElementAttributeMap extends _AttributeMap {
+
+  final Element _element;
+
+  _ElementAttributeMap(this._element);
+
+  bool containsKey(String key) {
+    return _element.$dom_hasAttribute(key);
+  }
+
+  String operator [](String key) {
+    return _element.$dom_getAttribute(key);
+  }
+
+  void operator []=(String key, value) {
+    _element.$dom_setAttribute(key, '$value');
+  }
+
+  String remove(String key) {
+    String value = _element.$dom_getAttribute(key);
+    _element.$dom_removeAttribute(key);
+    return value;
+  }
+
+  /**
+   * The number of {key, value} pairs in the map.
+   */
+  int get length {
+    return keys.length;
+  }
+
+  bool _matches(Node node) => node.$dom_namespaceUri == null;
+}
+
+/**
+ * Wrapper to expose namespaced attributes as a typed map.
+ */
+class _NamespacedAttributeMap extends _AttributeMap {
+
+  final Element _element;
+  final String _namespace;
+
+  _NamespacedAttributeMap(this._element, this._namespace);
+
+  bool containsKey(String key) {
+    return _element.$dom_hasAttributeNS(_namespace, key);
+  }
+
+  String operator [](String key) {
+    return _element.$dom_getAttributeNS(_namespace, key);
+  }
+
+  void operator []=(String key, value) {
+    _element.$dom_setAttributeNS(_namespace, key, '$value');
+  }
+
+  String remove(String key) {
+    String value = this[key];
+    _element.$dom_removeAttributeNS(_namespace, key);
+    return value;
+  }
+
+  /**
+   * The number of {key, value} pairs in the map.
+   */
+  int get length {
+    return keys.length;
+  }
+
+  bool _matches(Node node) => node.$dom_namespaceUri == _namespace;
+}
+
+
+/**
+ * Provides a Map abstraction on top of data-* attributes, similar to the
+ * dataSet in the old DOM.
+ */
+class _DataAttributeMap implements Map<String, String> {
+
+  final Map<String, String> $dom_attributes;
+
+  _DataAttributeMap(this.$dom_attributes);
+
+  // interface Map
+
+  // TODO: Use lazy iterator when it is available on Map.
+  bool containsValue(String value) => values.some((v) => v == value);
+
+  bool containsKey(String key) => $dom_attributes.containsKey(_attr(key));
+
+  String operator [](String key) => $dom_attributes[_attr(key)];
+
+  void operator []=(String key, value) {
+    $dom_attributes[_attr(key)] = '$value';
+  }
+
+  String putIfAbsent(String key, String ifAbsent()) =>
+    $dom_attributes.putIfAbsent(_attr(key), ifAbsent);
+
+  String remove(String key) => $dom_attributes.remove(_attr(key));
+
+  void clear() {
+    // Needs to operate on a snapshot since we are mutating the collection.
+    for (String key in keys) {
+      remove(key);
+    }
+  }
+
+  void forEach(void f(String key, String value)) {
+    $dom_attributes.forEach((String key, String value) {
+      if (_matches(key)) {
+        f(_strip(key), value);
+      }
+    });
+  }
+
+  Collection<String> get keys {
+    final keys = new List<String>();
+    $dom_attributes.forEach((String key, String value) {
+      if (_matches(key)) {
+        keys.add(_strip(key));
+      }
+    });
+    return keys;
+  }
+
+  Collection<String> get values {
+    final values = new List<String>();
+    $dom_attributes.forEach((String key, String value) {
+      if (_matches(key)) {
+        values.add(value);
+      }
+    });
+    return values;
+  }
+
+  int get length => keys.length;
+
+  // TODO: Use lazy iterator when it is available on Map.
+  bool get isEmpty => length == 0;
+
+  // Helpers.
+  String _attr(String key) => 'data-$key';
+  bool _matches(String key) => key.startsWith('data-');
+  String _strip(String key) => key.substring(5);
+}
diff --git a/sdk/lib/html/src/CrossFrameTypes.dart b/sdk/lib/html/src/CrossFrameTypes.dart
index b77284c..e8db94c 100644
--- a/sdk/lib/html/src/CrossFrameTypes.dart
+++ b/sdk/lib/html/src/CrossFrameTypes.dart
@@ -33,7 +33,7 @@
   History get history;
 
   /**
-   * Indicates whether this window is closed.
+   * Indicates whether this window has been closed.
    *
    *     print(window.closed); // 'false'
    *     window.close();
@@ -86,6 +86,34 @@
   Window get top;
 
   // Methods.
+  /**
+   * Closes the window.
+   *
+   * This method should only succeed if the [Window] object is
+   * **script-closeable** and the window calling [close] is allowed to navigate
+   * the window.
+   *
+   * A window is script-closeable if it is either a window
+   * that was opened by another window, or if it is a window with only one
+   * document in its history.
+   *
+   * A window might not be allowed to navigate, and therefore close, another
+   * window due to browser security features.
+   *
+   *     var other = window.open('http://www.example.com', 'foo');
+   *     // Closes other window, as it is script-closeable.
+   *     other.close();
+   *     print(other.closed()); // 'true'
+   *
+   *     window.location('http://www.mysite.com', 'foo');
+   *     // Does not close this window, as the history has changed.
+   *     window.close();
+   *     print(window.closed()); // 'false'
+   *
+   * See also:
+   *
+   * * [Window close discussion](http://www.w3.org/TR/html5/browsers.html#dom-window-close) from the W3C
+   */
   void close();
   void postMessage(var message, String targetOrigin, [List messagePorts = null]);
 }
diff --git a/sdk/lib/html/src/KeyCode.dart b/sdk/lib/html/src/KeyCode.dart
index 4faa53d..b2c81b3 100644
--- a/sdk/lib/html/src/KeyCode.dart
+++ b/sdk/lib/html/src/KeyCode.dart
@@ -195,4 +195,34 @@
   static const int WIN_KEY = 224;
   static const int MAC_FF_META = 224;
   static const int WIN_IME = 229;
+
+  /** A sentinel value if the keycode could not be determined. */
+  static const int UNKNOWN = -1;
+
+  /**
+   * Returns true if the keyCode produces a (US keyboard) character.
+   * Note: This does not (yet) cover characters on non-US keyboards (Russian,
+   * Hebrew, etc.).
+   */
+  static bool isCharacterKey(int keyCode) {
+    if ((keyCode >= ZERO && keyCode <= NINE) ||
+        (keyCode >= NUM_ZERO && keyCode <= NUM_MULTIPLY) ||
+        (keyCode >= A && keyCode <= Z)) {
+      return true;
+    }
+ 
+    // Safari sends zero key code for non-latin characters.
+    if (_Device.isWebKit && keyCode == 0) {
+      return true;
+    }
+ 
+    return (keyCode == SPACE || keyCode == QUESTION_MARK || keyCode == NUM_PLUS
+        || keyCode == NUM_MINUS || keyCode == NUM_PERIOD ||
+        keyCode == NUM_DIVISION || keyCode == SEMICOLON ||
+        keyCode == FF_SEMICOLON || keyCode == DASH || keyCode == EQUALS ||
+        keyCode == FF_EQUALS || keyCode == COMMA || keyCode == PERIOD ||
+        keyCode == SLASH || keyCode == APOSTROPHE || keyCode == SINGLE_QUOTE ||
+        keyCode == OPEN_SQUARE_BRACKET || keyCode == BACKSLASH ||
+        keyCode == CLOSE_SQUARE_BRACKET);
+  }
 }
diff --git a/sdk/lib/html/src/KeyboardEventController.dart b/sdk/lib/html/src/KeyboardEventController.dart
new file mode 100644
index 0000000..34da7d5
--- /dev/null
+++ b/sdk/lib/html/src/KeyboardEventController.dart
@@ -0,0 +1,405 @@
+// Copyright (c) 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.
+
+part of html;
+
+/**
+ * Works with KeyboardEvent and KeyEvent to determine how to expose information
+ * about Key(board)Events. This class functions like an EventListenerList, and
+ * provides a consistent interface for the Dart
+ * user, despite the fact that a multitude of browsers that have varying
+ * keyboard default behavior.
+ *
+ * This class is very much a work in progress, and we'd love to get information
+ * on how we can make this class work with as many international keyboards as
+ * possible. Bugs welcome! 
+ */
+class KeyboardEventController {
+  // This code inspired by Closure's KeyHandling library.
+  // http://closure-library.googlecode.com/svn/docs/closure_goog_events_keyhandler.js.source.html
+  
+  /**
+   * The set of keys that have been pressed down without seeing their
+   * corresponding keyup event.
+   */
+  List<KeyboardEvent> _keyDownList;
+
+  /** The set of functions that wish to be notified when a KeyEvent happens. */
+  List<Function> _callbacks;
+
+  /** The type of KeyEvent we are tracking (keyup, keydown, keypress). */
+  String _type;
+
+  /** The element we are watching for events to happen on. */
+  EventTarget _target;
+
+  // The distance to shift from upper case alphabet Roman letters to lower case.
+  int _ROMAN_ALPHABET_OFFSET = "a".charCodes[0] - "A".charCodes[0];
+
+  // Instance members referring to the internal event handlers because closures
+  // are not hashable.
+  var _keyUp, _keyDown, _keyPress;
+
+  /**
+   * An enumeration of key identifiers currently part of the W3C draft for DOM3
+   * and their mappings to keyCodes.
+   * http://www.w3.org/TR/DOM-Level-3-Events/keyset.html#KeySet-Set
+   */
+  static Map<String, int> _keyIdentifier = {
+    'Up': KeyCode.UP,
+    'Down': KeyCode.DOWN,
+    'Left': KeyCode.LEFT,
+    'Right': KeyCode.RIGHT,
+    'Enter': KeyCode.ENTER,
+    'F1': KeyCode.F1,
+    'F2': KeyCode.F2,
+    'F3': KeyCode.F3,
+    'F4': KeyCode.F4,
+    'F5': KeyCode.F5,
+    'F6': KeyCode.F6,
+    'F7': KeyCode.F7,
+    'F8': KeyCode.F8,
+    'F9': KeyCode.F9,
+    'F10': KeyCode.F10,
+    'F11': KeyCode.F11,
+    'F12': KeyCode.F12,
+    'U+007F': KeyCode.DELETE,
+    'Home': KeyCode.HOME,
+    'End': KeyCode.END,
+    'PageUp': KeyCode.PAGE_UP,
+    'PageDown': KeyCode.PAGE_DOWN,
+    'Insert': KeyCode.INSERT
+  };
+
+  /** Named constructor to add an onKeyPress event listener to our handler. */
+  KeyboardEventController.keypress(EventTarget target) {
+    _KeyboardEventController(target, 'keypress');
+  }
+  
+  /** Named constructor to add an onKeyUp event listener to our handler. */
+  KeyboardEventController.keyup(EventTarget target) {
+    _KeyboardEventController(target, 'keyup');
+  }
+
+  /** Named constructor to add an onKeyDown event listener to our handler. */
+  KeyboardEventController.keydown(EventTarget target) {
+    _KeyboardEventController(target, 'keydown');
+  }
+  
+  /**
+   * General constructor, performs basic initialization for our improved
+   * KeyboardEvent controller.
+   */
+  _KeyboardEventController(EventTarget target, String type) {
+    _callbacks = [];
+    _type = type;
+    _target = target;
+    _keyDown = processKeyDown;
+    _keyUp = processKeyUp;
+    _keyPress = processKeyPress;
+  }
+
+  /**
+   * Hook up all event listeners under the covers so we can estimate keycodes
+   * and charcodes when they are not provided.
+   */
+  void _initializeAllEventListeners() {
+    _keyDownList = [];
+    _target.on.keyDown.add(_keyDown, true);
+    _target.on.keyPress.add(_keyPress, true);
+    _target.on.keyUp.add(_keyUp, true);
+  }
+
+  /** Add a callback that wishes to be notified when a KeyEvent occurs. */
+  void add(void callback(KeyEvent)) {
+    if (_callbacks.length == 0) {
+      _initializeAllEventListeners();
+    }
+    _callbacks.add(callback);
+  }
+  
+  /**
+   * Notify all callback listeners that a KeyEvent of the relevant type has
+   * occurred.
+   */
+  bool _dispatch(KeyEvent event) {
+    if (event.type == _type) {
+      // Make a copy of the listeners in case a callback gets removed while
+      // dispatching from the list.
+      List callbacksCopy = new List.from(_callbacks);
+      for(var callback in callbacksCopy) {
+        callback(event);
+      }
+    }
+  }
+
+  /** Remove the given callback from the listeners list. */
+  void remove(void callback(KeyEvent)) {
+    var index = _callbacks.indexOf(callback);
+    if (index != -1) {
+      _callbacks.removeAt(index);
+    }
+    if (_callbacks.length == 0) {
+      // If we have no listeners, don't bother keeping track of keypresses.
+      _target.on.keyDown.remove(_keyDown);
+      _target.on.keyPress.remove(_keyPress);
+      _target.on.keyUp.remove(_keyUp);
+    }
+  }
+
+  /** Determine if caps lock is one of the currently depressed keys. */
+  bool get _capsLockOn =>
+      _keyDownList.some((var element) => element.keyCode == KeyCode.CAPS_LOCK);
+
+  /**
+   * Given the previously recorded keydown key codes, see if we can determine
+   * the keycode of this keypress [event]. (Generally browsers only provide
+   * charCode information for keypress events, but with a little
+   * reverse-engineering, we can also determine the keyCode.) Returns
+   * KeyCode.UNKNOWN if the keycode could not be determined.
+   */
+  int _determineKeyCodeForKeypress(KeyboardEvent event) {
+    // Note: This function is a work in progress. We'll expand this function
+    // once we get more information about other keyboards.
+    for (var prevEvent in _keyDownList) {
+      if (prevEvent._shadowCharCode == event.charCode) {
+        return prevEvent.keyCode;
+      }
+      if ((event.shiftKey || _capsLockOn) && event.charCode >= "A".charCodes[0]
+          && event.charCode <= "Z".charCodes[0] && event.charCode +
+          _ROMAN_ALPHABET_OFFSET == prevEvent._shadowCharCode) {
+        return prevEvent.keyCode;
+      }
+    }
+    return KeyCode.UNKNOWN;
+  }
+
+  /**
+   * Given the charater code returned from a keyDown [event], try to ascertain
+   * and return the corresponding charCode for the character that was pressed.
+   * This information is not shown to the user, but used to help polyfill
+   * keypress events.
+   */
+  int _findCharCodeKeyDown(KeyboardEvent event) {
+    if (event.keyLocation == 3) { // Numpad keys.
+      switch (event.keyCode) {
+        case KeyCode.NUM_ZERO:
+          // Even though this function returns _charCodes_, for some cases the
+          // KeyCode == the charCode we want, in which case we use the keycode
+          // constant for readability.
+          return KeyCode.ZERO;
+        case KeyCode.NUM_ONE:
+          return KeyCode.ONE;
+        case KeyCode.NUM_TWO:
+          return KeyCode.TWO;
+        case KeyCode.NUM_THREE:
+          return KeyCode.THREE;
+        case KeyCode.NUM_FOUR:
+          return KeyCode.FOUR;
+        case KeyCode.NUM_FIVE:
+          return KeyCode.FIVE;
+        case KeyCode.NUM_SIX:
+          return KeyCode.SIX;
+        case KeyCode.NUM_SEVEN:
+          return KeyCode.SEVEN;
+        case KeyCode.NUM_EIGHT:
+          return KeyCode.EIGHT;
+        case KeyCode.NUM_NINE:
+          return KeyCode.NINE;
+        case KeyCode.NUM_MULTIPLY:
+          return 42; // Char code for *
+        case KeyCode.NUM_PLUS:
+          return 43; // +
+        case KeyCode.NUM_MINUS:
+          return 45; // -
+        case KeyCode.NUM_PERIOD:
+          return 46; // .
+        case KeyCode.NUM_DIVISION:
+          return 47; // /
+      }
+    } else if (event.keyCode >= 65 && event.keyCode <= 90) {
+      // Set the "char code" for key down as the lower case letter. Again, this
+      // will not show up for the user, but will be helpful in estimating
+      // keyCode locations and other information during the keyPress event.
+      return event.keyCode + _ROMAN_ALPHABET_OFFSET;
+    }
+    switch(event.keyCode) {
+      case KeyCode.SEMICOLON:
+        return KeyCode.FF_SEMICOLON;
+      case KeyCode.EQUALS:
+        return KeyCode.FF_EQUALS;
+      case KeyCode.COMMA:
+        return 44; // Ascii value for ,
+      case KeyCode.DASH:
+        return 45; // -
+      case KeyCode.PERIOD:
+        return 46; // .
+      case KeyCode.SLASH:
+        return 47; // /
+      case KeyCode.APOSTROPHE:
+        return 96; // `
+      case KeyCode.OPEN_SQUARE_BRACKET:
+        return 91; // [
+      case KeyCode.BACKSLASH:
+        return 92; // \
+      case KeyCode.CLOSE_SQUARE_BRACKET:
+        return 93; // ]
+      case KeyCode.SINGLE_QUOTE:
+        return 39; // '
+    }
+    return event.keyCode;
+  }
+
+  /**
+   * Returns true if the key fires a keypress event in the current browser.
+   */
+  bool _firesKeyPressEvent(KeyEvent event) {
+    if (!_Device.isIE && !_Device.isWebKit) {
+      return true;
+    }
+    
+    if (_Device.userAgent.contains('Mac') && event.altKey) {
+      return KeyCode.isCharacterKey(event.keyCode);
+    }
+ 
+    // Alt but not AltGr which is represented as Alt+Ctrl.
+    if (event.altKey && !event.ctrlKey) {
+      return false;
+    }
+ 
+    // Saves Ctrl or Alt + key for IE and WebKit, which won't fire keypress.
+    if (!event.shiftKey &&
+        (_keyDownList.last.keyCode == KeyCode.CTRL ||
+         _keyDownList.last.keyCode == KeyCode.ALT ||
+         _Device.userAgent.contains('Mac') &&
+         _keyDownList.last.keyCode == KeyCode.META)) {
+      return false;
+    }
+ 
+    // Some keys with Ctrl/Shift do not issue keypress in WebKit.
+    if (_Device.isWebKit && event.ctrlKey && event.shiftKey && (
+        event.keycode == KeyCode.BACKSLASH ||
+        event.keycode == KeyCode.OPEN_SQUARE_BRACKET ||
+        event.keycode == KeyCode.CLOSE_SQUARE_BRACKET ||
+        event.keycode == KeyCode.TILDE ||
+        event.keycode == KeyCode.SEMICOLON || event.keycode == KeyCode.DASH ||
+        event.keycode == KeyCode.EQUALS || event.keycode == KeyCode.COMMA ||
+        event.keycode == KeyCode.PERIOD || event.keycode == KeyCode.SLASH ||
+        event.keycode == KeyCode.APOSTROPHE ||
+        event.keycode == KeyCode.SINGLE_QUOTE)) {
+      return false;
+    }
+ 
+    switch (event.keyCode) {
+      case KeyCode.ENTER:
+        // IE9 does not fire keypress on ENTER.
+        return !_Device.isIE;
+      case KeyCode.ESC:
+        return !_Device.isWebKit;
+    }
+ 
+    return KeyCode.isCharacterKey(event.keyCode);
+  }
+
+  /**
+   * Normalize the keycodes to the IE KeyCodes (this is what Chrome, IE, and
+   * Opera all use).
+   */
+  int _normalizeKeyCodes(KeyboardEvent event) {
+    // Note: This may change once we get input about non-US keyboards.
+    if (_Device.isFirefox) {
+      switch(event.keyCode) {
+        case KeyCode.FF_EQUALS:
+          return KeyCode.EQUALS;
+        case KeyCode.FF_SEMICOLON:
+          return KeyCode.SEMICOLON;
+        case KeyCode.MAC_FF_META:
+          return KeyCode.META;
+        case KeyCode.WIN_KEY_FF_LINUX:
+          return KeyCode.WIN_KEY;
+      }
+    }
+    return event.keyCode;
+  }
+
+  /** Handle keydown events. */
+  void processKeyDown(KeyboardEvent e) {
+    // Ctrl-Tab and Alt-Tab can cause the focus to be moved to another window
+    // before we've caught a key-up event.  If the last-key was one of these
+    // we reset the state.
+    if (_keyDownList.length > 0 &&
+        (_keyDownList.last.keyCode == KeyCode.CTRL && !e.ctrlKey ||
+         _keyDownList.last.keyCode == KeyCode.ALT && !e.altKey ||
+         _Device.userAgent.contains('Mac') &&
+         _keyDownList.last.keyCode == KeyCode.META && !e.metaKey)) {
+      _keyDownList = [];
+    }
+
+    var event = new KeyEvent(e);
+    event._shadowKeyCode = _normalizeKeyCodes(event);
+    // Technically a "keydown" event doesn't have a charCode. This is
+    // calculated nonetheless to provide us with more information in giving
+    // as much information as possible on keypress about keycode and also
+    // charCode.
+    event._shadowCharCode = _findCharCodeKeyDown(event);
+    if (_keyDownList.length > 0 && event.keyCode != _keyDownList.last.keyCode &&
+        !_firesKeyPressEvent(event)) {
+      // Some browsers have quirks not firing keypress events where all other
+      // browsers do. This makes them more consistent.
+      processKeyPress(event);
+    }
+    _keyDownList.add(event);
+    _dispatch(event);
+  }
+
+  /** Handle keypress events. */
+  void processKeyPress(KeyboardEvent event) {
+    var e = new KeyEvent(event);
+    // IE reports the character code in the keyCode field for keypress events.
+    // There are two exceptions however, Enter and Escape.
+    if (_Device.isIE) {
+      if (e.keyCode == KeyCode.ENTER || e.keyCode == KeyCode.ESC) {
+        e._shadowCharCode = 0;
+      } else {
+        e._shadowCharCode = e.keyCode;
+      }
+    } else if (_Device.isOpera) {
+      // Opera reports the character code in the keyCode field.
+      e._shadowCharCode = KeyCode.isCharacterKey(keyCode) ? e.keyCode : 0;
+    }
+    // Now we guestimate about what the keycode is that was actually
+    // pressed, given previous keydown information.
+    e._shadowKeyCode = _determineKeyCodeForKeypress(e);
+
+    // Correct the key value for certain browser-specific quirks.
+    if (e._shadowKeyIdentifier &&
+        _keyIdentifier.contains(e._shadowKeyIdentifier)) {
+      // This is needed for Safari Windows because it currently doesn't give a
+      // keyCode/which for non printable keys.
+      e._shadowKeyCode = _keyIdentifier[keyIdentifier];
+    }
+    e._shadowAltKey = _keyDownList.some((var element) => element.altKey);
+    _dispatch(e);
+  }
+
+  /** Handle keyup events. */
+  void processKeyUp(KeyboardEvent event) {
+    var e = new KeyEvent(event);
+    KeyboardEvent toRemove = null;
+    for (var key in _keyDownList) {
+      if (key.keyCode == e.keyCode) {
+        toRemove = key;
+      }
+    }
+    if (toRemove != null) {
+      _keyDownList = _keyDownList.filter((element) => element != toRemove);
+    } else if (_keyDownList.length > 0) {
+      // This happens when we've reached some international keyboard case we
+      // haven't accounted for or we haven't correctly eliminated all browser
+      // inconsistencies. Filing bugs on when this is reached is welcome! 
+      _keyDownList.removeLast(); 
+    }
+    _dispatch(e);
+  }
+}
diff --git a/sdk/lib/html/src/dart2js_FactoryProviders.dart b/sdk/lib/html/src/dart2js_FactoryProviders.dart
index a28e592..09c7efa 100644
--- a/sdk/lib/html/src/dart2js_FactoryProviders.dart
+++ b/sdk/lib/html/src/dart2js_FactoryProviders.dart
@@ -4,14 +4,6 @@
 
 part of html;
 
-class _AudioContextFactoryProvider {
-
-  static AudioContext createAudioContext() {
-    return JS('AudioContext',
-              'new (window.AudioContext || window.webkitAudioContext)()');
-  }
-}
-
 class _PointFactoryProvider {
   static Point createPoint(num x, num y) =>
       JS('Point', 'new WebKitPoint(#, #)', x, y);
diff --git a/sdk/lib/html/src/dart2js_KeyEvent.dart b/sdk/lib/html/src/dart2js_KeyEvent.dart
new file mode 100644
index 0000000..4974d51
--- /dev/null
+++ b/sdk/lib/html/src/dart2js_KeyEvent.dart
@@ -0,0 +1,103 @@
+/**
+ * A custom KeyboardEvent that attempts to eliminate cross-browser
+ * inconsistencies, and also provide both keyCode and charCode information
+ * for all key events (when such information can be determined).
+ *
+ * This class is very much a work in progress, and we'd love to get information
+ * on how we can make this class work with as many international keyboards as
+ * possible. Bugs welcome!
+ */
+class KeyEvent implements KeyboardEvent {
+  /** The parent KeyboardEvent that this KeyEvent is wrapping and "fixing". */
+  KeyboardEvent _parent;
+
+  /** The "fixed" value of whether the alt key is being pressed. */
+  bool _shadowAltKey;
+
+  /** Caculated value of what the estimated charCode is for this event. */
+  int _shadowCharCode;
+
+  /** Caculated value of what the estimated keyCode is for this event. */
+  int _shadowKeyCode;
+
+  /** Caculated value of what the estimated keyCode is for this event. */
+  int get keyCode => _shadowKeyCode;
+
+  /** Caculated value of what the estimated charCode is for this event. */
+  int get charCode => this.type == 'keypress' ? _shadowCharCode : 0;
+
+  /** Caculated value of whether the alt key is pressed is for this event. */
+  bool get altKey => _shadowAltKey;
+
+  /** Caculated value of what the estimated keyCode is for this event. */
+  int get which => keyCode;
+
+  /** Accessor to the underlying keyCode value is the parent event. */
+  int get _realKeyCode => JS('int', '#.keyCode', _parent);
+  
+  /** Accessor to the underlying charCode value is the parent event. */
+  int get _realCharCode => JS('int', '#.charCode', _parent);
+
+  /** Accessor to the underlying altKey value is the parent event. */
+  bool get _realAltKey => JS('int', '#.altKey', _parent);
+
+  /** Construct a KeyEvent with [parent] as event we're emulating. */
+  KeyEvent(KeyboardEvent parent) {
+    _parent = parent;
+    _shadowAltKey = _realAltKey;
+    _shadowCharCode = _realCharCode;
+    _shadowKeyCode = _realKeyCode;
+  }
+
+  /** True if the altGraphKey is pressed during this event. */
+  bool get altGraphKey => _parent.altGraphKey;
+  bool get bubbles => _parent.bubbles;
+  /** True if this event can be cancelled. */
+  bool get cancelable => _parent.cancelable;
+  bool get cancelBubble => _parent.cancelBubble;
+  set cancelBubble(bool cancel) => _parent = cancel;  
+  /** Accessor to the clipboardData available for this event. */
+  Clipboard get clipboardData => _parent.clipboardData;
+  /** True if the ctrl key is pressed during this event. */
+  bool get ctrlKey => _parent.ctrlKey;
+  /** Accessor to the target this event is listening to for changes. */
+  EventTarget get currentTarget => _parent.currentTarget;
+  bool get defaultPrevented => _parent.defaultPrevented;
+  int get detail => _parent.detail;
+  int get eventPhase => _parent.eventPhase;
+  /**
+   * Accessor to the part of the keyboard that the key was pressed from (one of
+   * KeyLocation.STANDARD, KeyLocation.RIGHT, KeyLocation.LEFT,
+   * KeyLocation.NUMPAD, KeyLocation.MOBILE, KeyLocation.JOYSTICK).
+   */
+  int get keyLocation => _parent.keyLocation;
+  int get layerX => _parent.layerX;
+  int get layerY => _parent.layerY;
+  /** True if the Meta (or Mac command) key is pressed during this event. */
+  bool get metaKey => _parent.metaKey;
+  int get pageX => _parent.pageX;
+  int get pageY => _parent.pageY;
+  bool get returnValue => _parent.returnValue;
+  set returnValue(bool value) => _parent = value;  
+  /** True if the shift key was pressed during this event. */
+  bool get shiftKey => _parent.shiftKey;
+  int get timeStamp => _parent.timeStamp;
+  /**
+   * The type of key event that occurred. One of "keydown", "keyup", or
+   * "keypress".
+   */
+  String get type => _parent.type;
+  Window get view => _parent.view;
+  void preventDefault() => _parent.preventDefault();
+  void stopImmediatePropagation() => _parent.stopImmediatePropagation();
+  void stopPropagation() => _parent.stopPropagation();
+  void $dom_initUIEvent(String type, bool canBubble, bool cancelable,
+      LocalWindow view, int detail) {
+    throw new UnsupportedError("Cannot initialize a UI Event from a KeyEvent.");
+  }
+  void $dom_initEvent(String eventTypeArg, bool canBubbleArg,
+      bool cancelableArg) {
+    throw new UnsupportedError("Cannot initialize an Event from a KeyEvent.");
+  }
+  String get _shadowKeyIdentifier => JS('String', '#.keyIdentifier', _parent);
+}
diff --git a/sdk/lib/html/src/dartium_FactoryProviders.dart b/sdk/lib/html/src/dartium_FactoryProviders.dart
index d270c89..c0ac5b9 100644
--- a/sdk/lib/html/src/dartium_FactoryProviders.dart
+++ b/sdk/lib/html/src/dartium_FactoryProviders.dart
@@ -4,14 +4,6 @@
 
 part of html;
 
-class _AudioContextFactoryProvider {
-  static AudioContext createAudioContext() => _createAudioContext();
-  static _createAudioContext([int numberOfChannels,
-                              int numberOfFrames,
-                              int sampleRate])
-      native "AudioContext_constructor_Callback";
-}
-
 class _IDBKeyRangeFactoryProvider {
 
   static IDBKeyRange createIDBKeyRange_only(/*IDBKey*/ value) =>
diff --git a/sdk/lib/html/src/dartium_KeyEvent.dart b/sdk/lib/html/src/dartium_KeyEvent.dart
new file mode 100644
index 0000000..6ff5c5b
--- /dev/null
+++ b/sdk/lib/html/src/dartium_KeyEvent.dart
@@ -0,0 +1,103 @@
+/**
+ * A custom KeyboardEvent that attempts to eliminate cross-browser
+ * inconsistencies, and also provide both keyCode and charCode information
+ * for all key events (when such information can be determined).
+ *
+ * This class is very much a work in progress, and we'd love to get information
+ * on how we can make this class work with as many international keyboards as
+ * possible. Bugs welcome!
+ */
+class KeyEvent implements KeyboardEvent {
+  /** The parent KeyboardEvent that this KeyEvent is wrapping and "fixing". */
+  KeyboardEvent _parent;
+
+  /** The "fixed" value of whether the alt key is being pressed. */
+  bool _shadowAltKey;
+
+  /** Caculated value of what the estimated charCode is for this event. */
+  int _shadowCharCode;
+
+  /** Caculated value of what the estimated keyCode is for this event. */
+  int _shadowKeyCode;
+
+  /** Caculated value of what the estimated keyCode is for this event. */
+  int get keyCode => _shadowKeyCode;
+
+  /** Caculated value of what the estimated charCode is for this event. */
+  int get charCode => this.type == 'keypress' ? _shadowCharCode : 0;
+
+  /** Caculated value of whether the alt key is pressed is for this event. */
+  bool get altKey => _shadowAltKey;
+
+  /** Caculated value of what the estimated keyCode is for this event. */
+  int get which => keyCode;
+
+  /** Accessor to the underlying keyCode value is the parent event. */
+  int get _realKeyCode => _parent.keyCode;
+  
+  /** Accessor to the underlying charCode value is the parent event. */
+  int get _realCharCode => _parent.charCode;
+
+  /** Accessor to the underlying altKey value is the parent event. */
+  bool get _realAltKey => _parent.altKey;
+
+  /** Construct a KeyEvent with [parent] as event we're emulating. */
+  KeyEvent(KeyboardEvent parent) {
+    _parent = parent;
+    _shadowAltKey = _realAltKey;
+    _shadowCharCode = _realCharCode;
+    _shadowKeyCode = _realKeyCode;
+  }
+ 
+  /** True if the altGraphKey is pressed during this event. */
+  bool get altGraphKey => _parent.altGraphKey;
+  bool get bubbles => _parent.bubbles;
+  /** True if this event can be cancelled. */
+  bool get cancelable => _parent.cancelable;
+  bool get cancelBubble => _parent.cancelBubble;
+  set cancelBubble(bool cancel) => _parent = cancel;
+  /** Accessor to the clipboardData available for this event. */
+  Clipboard get clipboardData => _parent.clipboardData;
+  /** True if the ctrl key is pressed during this event. */
+  bool get ctrlKey => _parent.ctrlKey;
+  /** Accessor to the target this event is listening to for changes. */
+  EventTarget get currentTarget => _parent.currentTarget;
+  bool get defaultPrevented => _parent.defaultPrevented;
+  int get detail => _parent.detail;
+  int get eventPhase => _parent.eventPhase;
+  /**
+   * Accessor to the part of the keyboard that the key was pressed from (one of
+   * KeyLocation.STANDARD, KeyLocation.RIGHT, KeyLocation.LEFT,
+   * KeyLocation.NUMPAD, KeyLocation.MOBILE, KeyLocation.JOYSTICK).
+   */
+  int get keyLocation => _parent.keyLocation;
+  int get layerX => _parent.layerX;
+  int get layerY => _parent.layerY;
+  /** True if the Meta (or Mac command) key is pressed during this event. */
+  bool get metaKey => _parent.metaKey;
+  int get pageX => _parent.pageX;
+  int get pageY => _parent.pageY;
+  bool get returnValue => _parent.returnValue;
+  set returnValue(bool value) => _parent = value;
+  /** True if the shift key was pressed during this event. */
+  bool get shiftKey => _parent.shiftKey;
+  int get timeStamp => _parent.timeStamp;
+  /**
+   * The type of key event that occurred. One of "keydown", "keyup", or
+   * "keypress".
+   */
+  String get type => _parent.type;
+  Window get view => _parent.view;
+  void preventDefault() => _parent.preventDefault();
+  void stopImmediatePropagation() => _parent.stopImmediatePropagation();
+  void stopPropagation() => _parent.stopPropagation();
+  void $dom_initUIEvent(String type, bool canBubble, bool cancelable,
+      LocalWindow view, int detail) {
+    throw new UnsupportedError("Cannot initialize a UI Event from a KeyEvent.");
+  }
+  void $dom_initEvent(String eventTypeArg, bool canBubbleArg,
+      bool cancelableArg) {
+    throw new UnsupportedError("Cannot initialize an Event from a KeyEvent.");
+  }
+  String get _shadowKeyIdentifier => _parent.$dom_keyIdentifier;
+}
diff --git a/sdk/lib/html/src/native_DOMImplementation.dart b/sdk/lib/html/src/native_DOMImplementation.dart
index 1d1eceb..4b8b72a 100644
--- a/sdk/lib/html/src/native_DOMImplementation.dart
+++ b/sdk/lib/html/src/native_DOMImplementation.dart
@@ -51,13 +51,13 @@
   _DOMWindowCrossFrame.internal();
 
   // Fields.
-  History get history() native "DOMWindow_history_cross_frame_Getter";
-  Location get location() native "DOMWindow_location_cross_frame_Getter";
-  bool get closed() native "DOMWindow_closed_Getter";
-  int get length() native "DOMWindow_length_Getter";
-  Window get opener() native "DOMWindow_opener_Getter";
-  Window get parent() native "DOMWindow_parent_Getter";
-  Window get top() native "DOMWindow_top_Getter";
+  History get history native "DOMWindow_history_cross_frame_Getter";
+  Location get location native "DOMWindow_location_cross_frame_Getter";
+  bool get closed native "DOMWindow_closed_Getter";
+  int get length native "DOMWindow_length_Getter";
+  Window get opener native "DOMWindow_opener_Getter";
+  Window get parent native "DOMWindow_parent_Getter";
+  Window get top native "DOMWindow_top_Getter";
 
   // Methods.
   void close() native "DOMWindow_close_Callback";
diff --git a/sdk/lib/html/src/shared_FactoryProviders.dart b/sdk/lib/html/src/shared_FactoryProviders.dart
index 428a60d..8929121 100644
--- a/sdk/lib/html/src/shared_FactoryProviders.dart
+++ b/sdk/lib/html/src/shared_FactoryProviders.dart
@@ -55,7 +55,7 @@
 
   static DocumentFragment createDocumentFragment_html(String html) {
     final fragment = new DocumentFragment();
-    fragment.innerHTML = html;
+    fragment.innerHtml = html;
     return fragment;
   }
 
@@ -63,7 +63,7 @@
   // factory DocumentFragment.xml(String xml) {
   //   final fragment = new DocumentFragment();
   //   final e = new XMLElement.tag("xml");
-  //   e.innerHTML = xml;
+  //   e.innerHtml = xml;
   //
   //   // Copy list first since we don't want liveness during iteration.
   //   final List nodes = new List.from(e.nodes);
@@ -74,7 +74,7 @@
   static DocumentFragment createDocumentFragment_svg(String svgContent) {
     final fragment = new DocumentFragment();
     final e = new svg.SVGSVGElement();
-    e.innerHTML = svgContent;
+    e.innerHtml = svgContent;
 
     // Copy list first since we don't want liveness during iteration.
     final List nodes = new List.from(e.nodes);
diff --git a/sdk/lib/html/src/shared_SVGFactoryProviders.dart b/sdk/lib/html/src/shared_SVGFactoryProviders.dart
index 7a5759a..0fd92a4 100644
--- a/sdk/lib/html/src/shared_SVGFactoryProviders.dart
+++ b/sdk/lib/html/src/shared_SVGFactoryProviders.dart
@@ -22,7 +22,7 @@
       parentTag = new SvgSvgElement();
     }
 
-    parentTag.innerHTML = svg;
+    parentTag.innerHtml = svg;
     if (parentTag.elements.length == 1) return parentTag.elements.removeLast();
 
     throw new ArgumentError(
diff --git a/sdk/lib/html/templates/html/dart2js/html_dart2js.darttemplate b/sdk/lib/html/templates/html/dart2js/html_dart2js.darttemplate
index b2de0d3..32c14e5 100644
--- a/sdk/lib/html/templates/html/dart2js/html_dart2js.darttemplate
+++ b/sdk/lib/html/templates/html/dart2js/html_dart2js.darttemplate
@@ -9,15 +9,19 @@
 
 import 'dart:isolate';
 import 'dart:json';
+// Not actually used, but imported since dart:html can generate these objects.
 import 'dart:svg' as svg;
+import 'dart:web_audio' as web_audio;
 
 $!GENERATED_DART_FILES
 
+part '$AUXILIARY_DIR/AttributeMap.dart';
 part '$AUXILIARY_DIR/CrossFrameTypes.dart';
 part '$AUXILIARY_DIR/CssClassSet.dart';
 part '$AUXILIARY_DIR/Device.dart';
 part '$AUXILIARY_DIR/EventListener.dart';
 part '$AUXILIARY_DIR/FilteredElementList.dart';
+part '$AUXILIARY_DIR/KeyboardEventController.dart';
 part '$AUXILIARY_DIR/KeyCode.dart';
 part '$AUXILIARY_DIR/KeyLocation.dart';
 part '$AUXILIARY_DIR/KeyName.dart';
@@ -31,6 +35,7 @@
 part '$AUXILIARY_DIR/shared_FactoryProviders.dart';
 part '$AUXILIARY_DIR/dart2js_Conversions.dart';
 part '$AUXILIARY_DIR/dart2js_DOMImplementation.dart';
+part '$AUXILIARY_DIR/dart2js_KeyEvent.dart';
 part '$AUXILIARY_DIR/dart2js_FactoryProviders.dart';
 part '$AUXILIARY_DIR/dart2js_IDBKeyRangeFactoryProvider.dart';
 part '$AUXILIARY_DIR/dart2js_LocationWrapper.dart';
@@ -50,7 +55,7 @@
 
 // Workaround for tags like <cite> that lack their own Element subclass --
 // Dart issue 1990.
-class HTMLElement extends Element native "*HTMLElement" {
+class _HTMLElement extends Element native "*HTMLElement" {
 }
 
 // Support for Send/ReceivePortSync.
diff --git a/sdk/lib/html/templates/html/dart2js/impl_AudioBufferSourceNode.darttemplate b/sdk/lib/html/templates/html/dart2js/impl_AudioBufferSourceNode.darttemplate
index fc2081d..060434c 100644
--- a/sdk/lib/html/templates/html/dart2js/impl_AudioBufferSourceNode.darttemplate
+++ b/sdk/lib/html/templates/html/dart2js/impl_AudioBufferSourceNode.darttemplate
@@ -4,6 +4,7 @@
 
 part of html;
 
+/// @domName $DOMNAME
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
 
   // TODO(efortuna): Remove these methods when Chrome stable also uses start
diff --git a/sdk/lib/html/templates/html/dart2js/impl_Console.darttemplate b/sdk/lib/html/templates/html/dart2js/impl_Console.darttemplate
index afa4b5b..97f1a20 100644
--- a/sdk/lib/html/templates/html/dart2js/impl_Console.darttemplate
+++ b/sdk/lib/html/templates/html/dart2js/impl_Console.darttemplate
@@ -4,6 +4,7 @@
 
 part of html;
 
+/// @domName $DOMNAME
 class $CLASSNAME
     // Console is sometimes a singleton bag-of-properties without a prototype.
     native "=(typeof console == 'undefined' ? {} : console)" {
diff --git a/sdk/lib/html/templates/html/dart2js/impl_IDBDatabase.darttemplate b/sdk/lib/html/templates/html/dart2js/impl_IDBDatabase.darttemplate
index c40b2bb..f34af4b 100644
--- a/sdk/lib/html/templates/html/dart2js/impl_IDBDatabase.darttemplate
+++ b/sdk/lib/html/templates/html/dart2js/impl_IDBDatabase.darttemplate
@@ -4,6 +4,7 @@
 
 part of html;
 
+/// @domName $DOMNAME
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
 
   IDBTransaction transaction(storeName_OR_storeNames, String mode) {
@@ -42,7 +43,8 @@
     return db._transaction(stores, intMode);
   }
 
-  IDBTransaction _transaction(stores, mode) native 'transaction';
+  @JSName('transaction')
+  IDBTransaction _transaction(stores, mode) native;
 
   static bool _hasNumericMode(txn) =>
       JS('bool', 'typeof(#.mode) === "number"', txn);
diff --git a/sdk/lib/html/templates/html/dart2js/impl_KeyboardEvent.darttemplate b/sdk/lib/html/templates/html/dart2js/impl_KeyboardEvent.darttemplate
new file mode 100644
index 0000000..414cc1d
--- /dev/null
+++ b/sdk/lib/html/templates/html/dart2js/impl_KeyboardEvent.darttemplate
@@ -0,0 +1,39 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+/// @domName KeyboardEvent; @docsEditable true
+class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
+
+  factory $CLASSNAME(String type, Window view,
+      [bool canBubble = true, bool cancelable = true, 
+      String keyIdentifier = null, int keyLocation = 1, bool ctrlKey = false,
+      bool altKey = false, bool shiftKey = false, bool metaKey = false,
+      bool altGraphKey = false]) {
+    final e = document.$dom_createEvent("KeyboardEvent");
+    e.$dom_initKeyboardEvent(type, canBubble, cancelable, view, keyIdentifier,
+        keyLocation, ctrlKey, altKey, shiftKey, metaKey, altGraphKey);
+    return e;
+  }
+
+  /** @domName KeyboardEvent.initKeyboardEvent */
+  void $dom_initKeyboardEvent(String type, bool canBubble, bool cancelable,
+      LocalWindow view, String keyIdentifier, int keyLocation, bool ctrlKey,
+      bool altKey, bool shiftKey, bool metaKey, bool altGraphKey) {
+    // initKeyEvent is the call in Firefox, initKeyboardEvent for all other
+    // browsers.
+    var function = JS('dynamic', '#.initKeyboardEvent || #.initKeyEvent', this,
+        this);
+    JS('void', '#(#, #, #, #, #, #, #, #, #, #, #)', function, type,
+        canBubble, cancelable, view, keyIdentifier, keyLocation, ctrlKey,
+        altKey, shiftKey, metaKey, altGraphKey);
+  }
+
+  /** @domName KeyboardEvent.keyCode */
+  int get keyCode => $dom_keyCode;
+
+  /** @domName KeyboardEvent.charCode */
+  int get charCode => $dom_charCode;
+$!MEMBERS
+}
diff --git a/sdk/lib/html/templates/html/dart2js/impl_LocalWindow.darttemplate b/sdk/lib/html/templates/html/dart2js/impl_LocalWindow.darttemplate
index 5542bf8..d05349c 100644
--- a/sdk/lib/html/templates/html/dart2js/impl_LocalWindow.darttemplate
+++ b/sdk/lib/html/templates/html/dart2js/impl_LocalWindow.darttemplate
@@ -4,6 +4,7 @@
 
 part of html;
 
+/// @domName $DOMNAME
 class $CLASSNAME$EXTENDS$IMPLEMENTS native "@*DOMWindow" {
 
   Document get document => JS('Document', '#.document', this);
@@ -24,7 +25,7 @@
   // API level getter and setter for Location.
   // TODO: The cross domain safe wrapper can be inserted here or folded into
   // _LocationWrapper.
-  LocalLocation get location() {
+  LocalLocation get location {
     // Firefox work-around for Location.  The Firefox location object cannot be
     // made to behave like a Dart object so must be wrapped.
     var result = _location;
@@ -57,7 +58,8 @@
   }
   // Prevent compiled from thinking 'location' property is available for a Dart
   // member.
-  _protect_location() native 'location';
+  @JSName('location')
+  _protect_location() native;
 
   static _isDartLocation(thing) {
     // On Firefox the code that implements 'is Location' fails to find the patch
@@ -89,11 +91,11 @@
     _cancelAnimationFrame(id);
   }
 
-  int _requestAnimationFrame(RequestAnimationFrameCallback callback)
-      native 'requestAnimationFrame';
+  @JSName('requestAnimationFrame')
+  int _requestAnimationFrame(RequestAnimationFrameCallback callback) native;
 
-  void _cancelAnimationFrame(int id)
-      native 'cancelAnimationFrame';
+  @JSName('cancelAnimationFrame')
+  void _cancelAnimationFrame(int id) native;
 
   _ensureRequestAnimationFrame() {
     if (JS('bool',
@@ -121,7 +123,7 @@
        this);
   }
 
-  IDBFactory get indexedDB() =>
+  IDBFactory get indexedDB =>
       JS('IDBFactory',
          '#.indexedDB || #.webkitIndexedDB || #.mozIndexedDB',
          this, this, this);
diff --git a/sdk/lib/html/templates/html/dart2js/impl_MouseEvent.darttemplate b/sdk/lib/html/templates/html/dart2js/impl_MouseEvent.darttemplate
index 4386d4c..32ad37d 100644
--- a/sdk/lib/html/templates/html/dart2js/impl_MouseEvent.darttemplate
+++ b/sdk/lib/html/templates/html/dart2js/impl_MouseEvent.darttemplate
@@ -4,6 +4,7 @@
 
 part of html;
 
+/// @domName $DOMNAME
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
   factory $CLASSNAME(String type, Window view, int detail, int screenX,
       int screenY, int clientX, int clientY, int button, [bool canBubble = true,
diff --git a/sdk/lib/html/templates/html/dart2js/impl_SelectElement.darttemplate b/sdk/lib/html/templates/html/dart2js/impl_SelectElement.darttemplate
index 10b2673..f424a19 100644
--- a/sdk/lib/html/templates/html/dart2js/impl_SelectElement.darttemplate
+++ b/sdk/lib/html/templates/html/dart2js/impl_SelectElement.darttemplate
@@ -4,6 +4,7 @@
 
 part of html;
 
+/// @domName $DOMNAME
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
 $!MEMBERS
 
diff --git a/sdk/lib/html/templates/html/dart2js/impl_TableElement.darttemplate b/sdk/lib/html/templates/html/dart2js/impl_TableElement.darttemplate
index af3eed4..5f8153c 100644
--- a/sdk/lib/html/templates/html/dart2js/impl_TableElement.darttemplate
+++ b/sdk/lib/html/templates/html/dart2js/impl_TableElement.darttemplate
@@ -4,6 +4,7 @@
 
 part of html;
 
+/// @domName $DOMNAME
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
 $!MEMBERS
 
@@ -16,5 +17,6 @@
     return tbody;
   }
 
-  Element _createTBody() native 'createTBody';
+  @JSName('createTBody')
+  Element _createTBody() native;
 }
diff --git a/sdk/lib/html/templates/html/dart2js/impl_Url.darttemplate b/sdk/lib/html/templates/html/dart2js/impl_Url.darttemplate
index 74019c5e..beb55ec 100644
--- a/sdk/lib/html/templates/html/dart2js/impl_Url.darttemplate
+++ b/sdk/lib/html/templates/html/dart2js/impl_Url.darttemplate
@@ -4,6 +4,7 @@
 
 part of html;
 
+/// @domName $DOMNAME
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
 
   static String createObjectUrl(blob_OR_source_OR_stream) =>
diff --git a/sdk/lib/html/templates/html/dart2js/web_audio_dart2js.darttemplate b/sdk/lib/html/templates/html/dart2js/web_audio_dart2js.darttemplate
new file mode 100644
index 0000000..0ab6538
--- /dev/null
+++ b/sdk/lib/html/templates/html/dart2js/web_audio_dart2js.darttemplate
@@ -0,0 +1,8 @@
+// DO NOT EDIT
+// Auto-generated dart:audio library.
+
+library web_audio;
+
+import 'dart:html';
+
+$!GENERATED_DART_FILES
diff --git a/sdk/lib/html/templates/html/dartium/html_dartium.darttemplate b/sdk/lib/html/templates/html/dartium/html_dartium.darttemplate
index b357f74..1f6b637 100644
--- a/sdk/lib/html/templates/html/dartium/html_dartium.darttemplate
+++ b/sdk/lib/html/templates/html/dartium/html_dartium.darttemplate
@@ -10,14 +10,18 @@
 import 'dart:isolate';
 import 'dart:json';
 import 'dart:nativewrappers';
+// Not actually used, but imported since dart:html can generate these objects.
 import 'dart:svg' as svg;
+import 'dart:web_audio' as web_audio;
 
 $!GENERATED_DART_FILES
 
+part '$AUXILIARY_DIR/AttributeMap.dart';
 part '$AUXILIARY_DIR/CrossFrameTypes.dart';
 part '$AUXILIARY_DIR/CssClassSet.dart';
 part '$AUXILIARY_DIR/EventListener.dart';
 part '$AUXILIARY_DIR/FilteredElementList.dart';
+part '$AUXILIARY_DIR/KeyboardEventController.dart';
 part '$AUXILIARY_DIR/KeyCode.dart';
 part '$AUXILIARY_DIR/KeyLocation.dart';
 part '$AUXILIARY_DIR/KeyName.dart';
@@ -26,6 +30,7 @@
 part '$AUXILIARY_DIR/_Collections.dart';
 part '$AUXILIARY_DIR/_HttpRequestUtils.dart';
 part '$AUXILIARY_DIR/shared_FactoryProviders.dart';
+part '$AUXILIARY_DIR/dartium_KeyEvent.dart';
 part '$AUXILIARY_DIR/dartium_FactoryProviders.dart';
 part '$AUXILIARY_DIR/Device.dart';
 part '$AUXILIARY_DIR/Isolates.dart';
diff --git a/sdk/lib/html/templates/html/dartium/impl_KeyboardEvent.darttemplate b/sdk/lib/html/templates/html/dartium/impl_KeyboardEvent.darttemplate
new file mode 100644
index 0000000..cc66b4f
--- /dev/null
+++ b/sdk/lib/html/templates/html/dartium/impl_KeyboardEvent.darttemplate
@@ -0,0 +1,32 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+/// @domName KeyboardEvent; @docsEditable true
+class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
+
+  factory $CLASSNAME(String type, Window view,
+      [bool canBubble = true, bool cancelable = true, 
+      String keyIdentifier = null, int keyLocation = 1, bool ctrlKey = false,
+      bool altKey = false, bool shiftKey = false, bool metaKey = false,
+      bool altGraphKey = false]) {
+    final e = document.$dom_createEvent("KeyboardEvent");
+    e.$dom_initKeyboardEvent(type, canBubble, cancelable, view, keyIdentifier,
+        keyLocation, ctrlKey, altKey, shiftKey, metaKey, altGraphKey);
+    return e;
+  }
+
+  /** @domName KeyboardEvent.initKeyboardEvent */
+  void $dom_initKeyboardEvent(String type, bool canBubble, bool cancelable,
+      LocalWindow view, String keyIdentifier, int keyLocation, bool ctrlKey,
+      bool altKey, bool shiftKey, bool metaKey,
+      bool altGraphKey) native "KeyboardEvent_initKeyboardEvent_Callback";
+ 
+  /** @domName KeyboardEvent.keyCode */
+  int get keyCode => $dom_keyCode;
+  
+  /** @domName KeyboardEvent.charCode */
+  int get charCode => $dom_charCode;
+$!MEMBERS
+}
diff --git a/sdk/lib/html/templates/html/dartium/impl_LocalWindow.darttemplate b/sdk/lib/html/templates/html/dartium/impl_LocalWindow.darttemplate
index 476d8dd..d463470 100644
--- a/sdk/lib/html/templates/html/dartium/impl_LocalWindow.darttemplate
+++ b/sdk/lib/html/templates/html/dartium/impl_LocalWindow.darttemplate
@@ -4,6 +4,7 @@
 
 part of html;
 
+/// @domName $DOMNAME
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
 
   /**
diff --git a/sdk/lib/html/templates/html/dartium/impl_MouseEvent.darttemplate b/sdk/lib/html/templates/html/dartium/impl_MouseEvent.darttemplate
index 9042195..bc4e47e 100644
--- a/sdk/lib/html/templates/html/dartium/impl_MouseEvent.darttemplate
+++ b/sdk/lib/html/templates/html/dartium/impl_MouseEvent.darttemplate
@@ -6,6 +6,7 @@
 
 part of html;
 
+/// @domName $DOMNAME
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
   factory $CLASSNAME(String type, Window view, int detail, int screenX,
       int screenY, int clientX, int clientY, int button, [bool canBubble = true,
diff --git a/sdk/lib/html/templates/html/dartium/web_audio_dartium.darttemplate b/sdk/lib/html/templates/html/dartium/web_audio_dartium.darttemplate
new file mode 100644
index 0000000..6496166
--- /dev/null
+++ b/sdk/lib/html/templates/html/dartium/web_audio_dartium.darttemplate
@@ -0,0 +1,9 @@
+// DO NOT EDIT
+// Auto-generated dart:audio library.
+
+library web_audio;
+
+import 'dart:html';
+import 'dart:nativewrappers';
+
+$!GENERATED_DART_FILES
diff --git a/sdk/lib/html/templates/html/impl/impl_AudioContext.darttemplate b/sdk/lib/html/templates/html/impl/impl_AudioContext.darttemplate
index b648c9c..e624fbd 100644
--- a/sdk/lib/html/templates/html/impl/impl_AudioContext.darttemplate
+++ b/sdk/lib/html/templates/html/impl/impl_AudioContext.darttemplate
@@ -4,8 +4,20 @@
 
 part of html;
 
+/// @domName $DOMNAME
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
-  factory $CLASSNAME() => _$(CLASSNAME)FactoryProvider.create$CLASSNAME();
+$if DART2JS
+  factory AudioContext() => JS('AudioContext',
+      'new (window.AudioContext || window.webkitAudioContext)()');
+$else
+  factory AudioContext() => _createAudioContext();
+
+  static _createAudioContext([int numberOfChannels,
+                              int numberOfFrames,
+                              int sampleRate])
+      native "AudioContext_constructor_Callback";
+$endif
+
 $!MEMBERS
 $if DART2JS
   GainNode createGain() {
diff --git a/sdk/lib/html/templates/html/impl/impl_CSSStyleDeclaration.darttemplate b/sdk/lib/html/templates/html/impl/impl_CSSStyleDeclaration.darttemplate
index 347acfc..2bd9338 100644
--- a/sdk/lib/html/templates/html/impl/impl_CSSStyleDeclaration.darttemplate
+++ b/sdk/lib/html/templates/html/impl/impl_CSSStyleDeclaration.darttemplate
@@ -21,6 +21,7 @@
   return _cachedBrowserPrefix;
 }
 
+/// @domName $DOMNAME
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
   factory $CLASSNAME() => _$(CLASSNAME)FactoryProvider.create$CLASSNAME();
   factory $CLASSNAME.css(String css) =>
diff --git a/sdk/lib/html/templates/html/impl/impl_CanvasElement.darttemplate b/sdk/lib/html/templates/html/impl/impl_CanvasElement.darttemplate
index 5264681..cb5aa2a 100644
--- a/sdk/lib/html/templates/html/impl/impl_CanvasElement.darttemplate
+++ b/sdk/lib/html/templates/html/impl/impl_CanvasElement.darttemplate
@@ -4,6 +4,7 @@
 
 part of html;
 
+/// @domName $DOMNAME
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
 $!MEMBERS
 
diff --git a/sdk/lib/html/templates/html/impl/impl_CanvasRenderingContext2D.darttemplate b/sdk/lib/html/templates/html/impl/impl_CanvasRenderingContext2D.darttemplate
index 1466cea..eb5ad08 100644
--- a/sdk/lib/html/templates/html/impl/impl_CanvasRenderingContext2D.darttemplate
+++ b/sdk/lib/html/templates/html/impl/impl_CanvasRenderingContext2D.darttemplate
@@ -4,6 +4,7 @@
 
 part of html;
 
+/// @domName $DOMNAME
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
 $!MEMBERS
 
diff --git a/sdk/lib/html/templates/html/impl/impl_CustomEvent.darttemplate b/sdk/lib/html/templates/html/impl/impl_CustomEvent.darttemplate
index 7c84852..e302fb0 100644
--- a/sdk/lib/html/templates/html/impl/impl_CustomEvent.darttemplate
+++ b/sdk/lib/html/templates/html/impl/impl_CustomEvent.darttemplate
@@ -6,6 +6,7 @@
 
 part of html;
 
+/// @domName $DOMNAME
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
   factory $CLASSNAME(String type, [bool canBubble = true, bool cancelable = true,
       Object detail]) => _$(CLASSNAME)FactoryProvider.create$CLASSNAME(
diff --git a/sdk/lib/html/templates/html/impl/impl_Document.darttemplate b/sdk/lib/html/templates/html/impl/impl_Document.darttemplate
index 3e7824d..0ddb965 100644
--- a/sdk/lib/html/templates/html/impl/impl_Document.darttemplate
+++ b/sdk/lib/html/templates/html/impl/impl_Document.darttemplate
@@ -4,6 +4,7 @@
 
 part of html;
 
+/// @domName $DOMNAME
 class $CLASSNAME extends Node $NATIVESPEC
 {
 
diff --git a/sdk/lib/html/templates/html/impl/impl_DocumentFragment.darttemplate b/sdk/lib/html/templates/html/impl/impl_DocumentFragment.darttemplate
index 2106a73..6fa79c8 100644
--- a/sdk/lib/html/templates/html/impl/impl_DocumentFragment.darttemplate
+++ b/sdk/lib/html/templates/html/impl/impl_DocumentFragment.darttemplate
@@ -19,6 +19,7 @@
   bool get frozen => true;
 }
 
+/// @domName $DOMNAME
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
   factory $CLASSNAME() => _$(CLASSNAME)FactoryProvider.createDocumentFragment();
 
@@ -62,21 +63,21 @@
   List<Element> queryAll(String selectors) =>
     new _FrozenElementList._wrap($dom_querySelectorAll(selectors));
 
-  String get innerHTML {
+  String get innerHtml {
     final e = new Element.tag("div");
     e.nodes.add(this.clone(true));
-    return e.innerHTML;
+    return e.innerHtml;
   }
 
-  String get outerHTML => innerHTML;
+  String get outerHtml => innerHtml;
 
-  // TODO(nweiz): Do we want to support some variant of innerHTML for XML and/or
+  // TODO(nweiz): Do we want to support some variant of innerHtml for XML and/or
   // SVG strings?
-  void set innerHTML(String value) {
+  void set innerHtml(String value) {
     this.nodes.clear();
 
     final e = new Element.tag("div");
-    e.innerHTML = value;
+    e.innerHtml = value;
 
     // Copy list first since we don't want liveness during iteration.
     List nodes = new List.from(e.nodes);
@@ -106,16 +107,20 @@
     this._insertAdjacentNode(where, new Text(text));
   }
 
-  void insertAdjacentHTML(String where, String text) {
+  void insertAdjacentHtml(String where, String text) {
     this._insertAdjacentNode(where, new DocumentFragment.html(text));
   }
 
-  void addText(String text) {
+  void append(Element element) {
+    this.children.add(element);
+  }
+
+  void appendText(String text) {
     this.insertAdjacentText('beforeend', text);
   }
 
-  void addHtml(String text) {
-    this.insertAdjacentHTML('beforeend', text);
+  void appendHtml(String text) {
+    this.insertAdjacentHtml('beforeend', text);
   }
 
   // If we can come up with a semi-reasonable default value for an Element
@@ -139,7 +144,7 @@
     }
     return null;
   }
-  Element get $m_lastElementChild() => elements.last;
+  Element get $m_lastElementChild => elements.last;
   Element get nextElementSibling => null;
   Element get previousElementSibling => null;
   Element get offsetParent => null;
diff --git a/sdk/lib/html/templates/html/impl/impl_Element.darttemplate b/sdk/lib/html/templates/html/impl/impl_Element.darttemplate
index bf6e19a..bae3ab0 100644
--- a/sdk/lib/html/templates/html/impl/impl_Element.darttemplate
+++ b/sdk/lib/html/templates/html/impl/impl_Element.darttemplate
@@ -301,171 +301,6 @@
   bool get hasNext => _index < _list.length;
 }
 
-class _ElementAttributeMap implements Map<String, String> {
-
-  final Element _element;
-
-  _ElementAttributeMap(this._element);
-
-  bool containsValue(String value) {
-    final attributes = _element.$dom_attributes;
-    for (int i = 0, len = attributes.length; i < len; i++) {
-      if(value == attributes[i].value) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  bool containsKey(String key) {
-    return _element.$dom_hasAttribute(key);
-  }
-
-  String operator [](String key) {
-    return _element.$dom_getAttribute(key);
-  }
-
-  void operator []=(String key, value) {
-    _element.$dom_setAttribute(key, '$value');
-  }
-
-  String putIfAbsent(String key, String ifAbsent()) {
-    if (!containsKey(key)) {
-      this[key] = ifAbsent();
-    }
-    return this[key];
-  }
-
-  String remove(String key) {
-    String value = _element.$dom_getAttribute(key);
-    _element.$dom_removeAttribute(key);
-    return value;
-  }
-
-  void clear() {
-    final attributes = _element.$dom_attributes;
-    for (int i = attributes.length - 1; i >= 0; i--) {
-      remove(attributes[i].name);
-    }
-  }
-
-  void forEach(void f(String key, String value)) {
-    final attributes = _element.$dom_attributes;
-    for (int i = 0, len = attributes.length; i < len; i++) {
-      final item = attributes[i];
-      f(item.name, item.value);
-    }
-  }
-
-  Collection<String> get keys {
-    // TODO(jacobr): generate a lazy collection instead.
-    final attributes = _element.$dom_attributes;
-    final keys = new List<String>(attributes.length);
-    for (int i = 0, len = attributes.length; i < len; i++) {
-      keys[i] = attributes[i].name;
-    }
-    return keys;
-  }
-
-  Collection<String> get values {
-    // TODO(jacobr): generate a lazy collection instead.
-    final attributes = _element.$dom_attributes;
-    final values = new List<String>(attributes.length);
-    for (int i = 0, len = attributes.length; i < len; i++) {
-      values[i] = attributes[i].value;
-    }
-    return values;
-  }
-
-  /**
-   * The number of {key, value} pairs in the map.
-   */
-  int get length {
-    return _element.$dom_attributes.length;
-  }
-
-  /**
-   * Returns true if there is no {key, value} pair in the map.
-   */
-  bool get isEmpty {
-    return length == 0;
-  }
-}
-
-/**
- * Provides a Map abstraction on top of data-* attributes, similar to the
- * dataSet in the old DOM.
- */
-class _DataAttributeMap implements Map<String, String> {
-
-  final Map<String, String> $dom_attributes;
-
-  _DataAttributeMap(this.$dom_attributes);
-
-  // interface Map
-
-  // TODO: Use lazy iterator when it is available on Map.
-  bool containsValue(String value) => values.some((v) => v == value);
-
-  bool containsKey(String key) => $dom_attributes.containsKey(_attr(key));
-
-  String operator [](String key) => $dom_attributes[_attr(key)];
-
-  void operator []=(String key, value) {
-    $dom_attributes[_attr(key)] = '$value';
-  }
-
-  String putIfAbsent(String key, String ifAbsent()) =>
-    $dom_attributes.putIfAbsent(_attr(key), ifAbsent);
-
-  String remove(String key) => $dom_attributes.remove(_attr(key));
-
-  void clear() {
-    // Needs to operate on a snapshot since we are mutating the collection.
-    for (String key in keys) {
-      remove(key);
-    }
-  }
-
-  void forEach(void f(String key, String value)) {
-    $dom_attributes.forEach((String key, String value) {
-      if (_matches(key)) {
-        f(_strip(key), value);
-      }
-    });
-  }
-
-  Collection<String> get keys {
-    final keys = new List<String>();
-    $dom_attributes.forEach((String key, String value) {
-      if (_matches(key)) {
-        keys.add(_strip(key));
-      }
-    });
-    return keys;
-  }
-
-  Collection<String> get values {
-    final values = new List<String>();
-    $dom_attributes.forEach((String key, String value) {
-      if (_matches(key)) {
-        values.add(value);
-      }
-    });
-    return values;
-  }
-
-  int get length => keys.length;
-
-  // TODO: Use lazy iterator when it is available on Map.
-  bool get isEmpty => length == 0;
-
-  // Helpers.
-  String _attr(String key) => 'data-$key';
-  bool _matches(String key) => key.startsWith('data-');
-  String _strip(String key) => key.substring(5);
-}
-
 class _ElementCssClassSet extends CssClassSet {
 
   final Element _element;
@@ -491,24 +326,7 @@
   }
 }
 
-class _SimpleClientRect implements ClientRect {
-  final num left;
-  final num top;
-  final num width;
-  final num height;
-  num get right => left + width;
-  num get bottom => top + height;
-
-  const _SimpleClientRect(this.left, this.top, this.width, this.height);
-
-  bool operator ==(ClientRect other) {
-    return other != null && left == other.left && top == other.top
-        && width == other.width && height == other.height;
-  }
-
-  String toString() => "($left, $top, $width, $height)";
-}
-
+/// @domName $DOMNAME
 abstract class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
 
   factory $CLASSNAME.html(String html) =>
@@ -530,6 +348,14 @@
     }
   }
 
+  /**
+   * Deprecated, use innerHtml instead.
+   */
+  String get innerHTML => this.innerHtml;
+  void set innerHTML(String value) {
+    this.innerHtml = value;
+  }
+
   void set elements(Collection<Element> value) {
     this.children = value;
   }
@@ -578,6 +404,14 @@
     }
   }
 
+  /**
+   * Gets a map for manipulating the attributes of a particular namespace.
+   * This is primarily useful for SVG attributes such as xref:link.
+   */
+  Map<String, String> getNamespacedAttributes(String namespace) {
+    return new _NamespacedAttributeMap(this, namespace);
+  }
+
   /** @domName Window.getComputedStyle */
   Future<CSSStyleDeclaration> get computedStyle {
      // TODO(jacobr): last param should be null, see b/5045788
@@ -592,9 +426,16 @@
   }
 
   /**
+   * Adds the specified element to after the last child of this.
+   */
+  void append(Element e) {
+    this.children.add(e);
+  }
+
+  /**
    * Adds the specified text as a text node after the last child of this.
    */
-  void addText(String text) {
+  void appendText(String text) {
     this.insertAdjacentText('beforeend', text);
   }
 
@@ -602,8 +443,8 @@
    * Parses the specified text as HTML and adds the resulting node after the
    * last child of this.
    */
-  void addHtml(String text) {
-    this.insertAdjacentHTML('beforeend', text);
+  void appendHtml(String text) {
+    this.insertAdjacentHtml('beforeend', text);
   }
 
   // Hooks to support custom WebComponents.
@@ -651,20 +492,20 @@
     }
   }
 
-  void _insertAdjacentText(String where, String text)
-      native 'insertAdjacentText';
+  @JSName('insertAdjacentText')
+  void _insertAdjacentText(String where, String text) native;
 
   /** @domName Element.insertAdjacentHTML */
-  void insertAdjacentHTML(String where, String text) {
-    if (JS('bool', '!!#.insertAdjacentHTML', this)) {
-      _insertAdjacentHTML(where, text);
+  void insertAdjacentHtml(String where, String text) {
+    if (JS('bool', '!!#.insertAdjacentHtml', this)) {
+      _insertAdjacentHtml(where, text);
     } else {
       _insertAdjacentNode(where, new DocumentFragment.html(text));
     }
   }
 
-  void _insertAdjacentHTML(String where, String text)
-      native 'insertAdjacentHTML';
+  @JSName('insertAdjacentHTML')
+  void _insertAdjacentHTML(String where, String text) native;
 
   /** @domName Element.insertAdjacentHTML */
   Element insertAdjacentElement(String where, Element element) {
@@ -676,8 +517,8 @@
     return element;
   }
 
-  void _insertAdjacentElement(String where, Element element)
-      native 'insertAdjacentElement';
+  @JSName('insertAdjacentElement')
+  void _insertAdjacentElement(String where, Element element) native;
 
   void _insertAdjacentNode(String where, Node node) {
     switch (where.toLowerCase()) {
@@ -741,7 +582,7 @@
       }
     }
     final Element temp = new Element.tag(parentTag);
-    temp.innerHTML = html;
+    temp.innerHtml = html;
 
     Element element;
     if (temp.children.length == 1) {
diff --git a/sdk/lib/html/templates/html/impl/impl_Event.darttemplate b/sdk/lib/html/templates/html/impl/impl_Event.darttemplate
index deead54..c1cf096 100644
--- a/sdk/lib/html/templates/html/impl/impl_Event.darttemplate
+++ b/sdk/lib/html/templates/html/impl/impl_Event.darttemplate
@@ -6,6 +6,7 @@
 
 part of html;
 
+/// @domName $DOMNAME
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
   // In JS, canBubble and cancelable are technically required parameters to
   // init*Event. In practice, though, if they aren't provided they simply
diff --git a/sdk/lib/html/templates/html/impl/impl_EventTarget.darttemplate b/sdk/lib/html/templates/html/impl/impl_EventTarget.darttemplate
index da4a6c2..a602e94 100644
--- a/sdk/lib/html/templates/html/impl/impl_EventTarget.darttemplate
+++ b/sdk/lib/html/templates/html/impl/impl_EventTarget.darttemplate
@@ -49,7 +49,7 @@
   }
 }
 
-
+/// @domName $DOMNAME
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
 
   /** @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent */
diff --git a/sdk/lib/html/templates/html/impl/impl_HtmlDocument.darttemplate b/sdk/lib/html/templates/html/impl/impl_HtmlDocument.darttemplate
index a4b8033..918f83a 100644
--- a/sdk/lib/html/templates/html/impl/impl_HtmlDocument.darttemplate
+++ b/sdk/lib/html/templates/html/impl/impl_HtmlDocument.darttemplate
@@ -6,6 +6,7 @@
 
 part of html;
 
+/// @domName $DOMNAME
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
 $!MEMBERS
   /** @domName Document.body */
diff --git a/sdk/lib/html/templates/html/impl/impl_HttpRequest.darttemplate b/sdk/lib/html/templates/html/impl/impl_HttpRequest.darttemplate
index 213f434..8a834a7 100644
--- a/sdk/lib/html/templates/html/impl/impl_HttpRequest.darttemplate
+++ b/sdk/lib/html/templates/html/impl/impl_HttpRequest.darttemplate
@@ -4,6 +4,7 @@
 
 part of html;
 
+/// @domName $DOMNAME
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
   factory $CLASSNAME.get(String url, onComplete($CLASSNAME request)) =>
       _$(CLASSNAME)FactoryProvider.create$(CLASSNAME)_get(url, onComplete);
diff --git a/sdk/lib/html/templates/html/impl/impl_IDBKeyRange.darttemplate b/sdk/lib/html/templates/html/impl/impl_IDBKeyRange.darttemplate
index 2b60eba..253134f 100644
--- a/sdk/lib/html/templates/html/impl/impl_IDBKeyRange.darttemplate
+++ b/sdk/lib/html/templates/html/impl/impl_IDBKeyRange.darttemplate
@@ -4,6 +4,7 @@
 
 part of html;
 
+/// @domName $DOMNAME
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
   /**
    * @domName IDBKeyRange.only
diff --git a/sdk/lib/html/templates/html/impl/impl_MutationObserver.darttemplate b/sdk/lib/html/templates/html/impl/impl_MutationObserver.darttemplate
index 2bfbd2e..dda5aee 100644
--- a/sdk/lib/html/templates/html/impl/impl_MutationObserver.darttemplate
+++ b/sdk/lib/html/templates/html/impl/impl_MutationObserver.darttemplate
@@ -4,6 +4,7 @@
 
 part of html;
 
+/// @domName $DOMNAME
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
 $!MEMBERS
   void observe(Node target,
@@ -75,6 +76,7 @@
   static _fixupList(list) => list;  // TODO: Ensure is a JavaScript Array.
 
   // Call native function with no conversions.
-  void _call(target, options) native 'observe';
+  @JSName('observe')
+  void _call(target, options) native;
 $endif
 }
diff --git a/sdk/lib/html/templates/html/impl/impl_Node.darttemplate b/sdk/lib/html/templates/html/impl/impl_Node.darttemplate
index cf46de2..a2f4e0a 100644
--- a/sdk/lib/html/templates/html/impl/impl_Node.darttemplate
+++ b/sdk/lib/html/templates/html/impl/impl_Node.darttemplate
@@ -112,6 +112,7 @@
   Node operator[](int index) => _this.$dom_childNodes[index];
 }
 
+/// @domName $DOMNAME
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
   _ChildNodeListLazy get nodes {
     return new _ChildNodeListLazy(this);
diff --git a/sdk/lib/html/templates/html/impl/impl_Point.darttemplate b/sdk/lib/html/templates/html/impl/impl_Point.darttemplate
index 1ce9455..bfa4684 100644
--- a/sdk/lib/html/templates/html/impl/impl_Point.darttemplate
+++ b/sdk/lib/html/templates/html/impl/impl_Point.darttemplate
@@ -6,6 +6,7 @@
 
 part of html;
 
+/// @domName $DOMNAME
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
   factory $CLASSNAME(num x, num y) => _$(CLASSNAME)FactoryProvider.create$CLASSNAME(x, y);
 $!MEMBERS
diff --git a/sdk/lib/html/templates/html/impl/impl_ShadowRoot.darttemplate b/sdk/lib/html/templates/html/impl/impl_ShadowRoot.darttemplate
index 50f732b..9f0649b 100644
--- a/sdk/lib/html/templates/html/impl/impl_ShadowRoot.darttemplate
+++ b/sdk/lib/html/templates/html/impl/impl_ShadowRoot.darttemplate
@@ -6,6 +6,7 @@
 
 part of html;
 
+/// @domName $DOMNAME
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
 $!MEMBERS
 $if DART2JS
diff --git a/sdk/lib/html/templates/html/impl/impl_Storage.darttemplate b/sdk/lib/html/templates/html/impl/impl_Storage.darttemplate
index 47d10d6..a48e3da 100644
--- a/sdk/lib/html/templates/html/impl/impl_Storage.darttemplate
+++ b/sdk/lib/html/templates/html/impl/impl_Storage.darttemplate
@@ -4,6 +4,7 @@
 
 part of html;
 
+/// @domName $DOMNAME
 class $CLASSNAME$EXTENDS implements Map<String, String> $NATIVESPEC {
 
   // TODO(nweiz): update this when maps support lazy iteration
diff --git a/sdk/lib/html/templates/html/impl/impl_SvgElement.darttemplate b/sdk/lib/html/templates/html/impl/impl_SvgElement.darttemplate
index 1c15a0f..df0ed3b 100644
--- a/sdk/lib/html/templates/html/impl/impl_SvgElement.darttemplate
+++ b/sdk/lib/html/templates/html/impl/impl_SvgElement.darttemplate
@@ -31,6 +31,7 @@
   }
 }
 
+/// @domName $DOMNAME
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
   factory $CLASSNAME.tag(String tag) =>
       _$(CLASSNAME)FactoryProvider.create$(CLASSNAME)_tag(tag);
@@ -61,25 +62,25 @@
     children.addAll(value);
   }
 
-  String get outerHTML {
+  String get outerHtml {
     final container = new Element.tag("div");
     final SvgElement cloned = this.clone(true);
     container.children.add(cloned);
-    return container.innerHTML;
+    return container.innerHtml;
   }
 
-  String get innerHTML {
+  String get innerHtml {
     final container = new Element.tag("div");
     final SvgElement cloned = this.clone(true);
     container.children.addAll(cloned.children);
-    return container.innerHTML;
+    return container.innerHtml;
   }
 
-  void set innerHTML(String svg) {
+  void set innerHtml(String svg) {
     final container = new Element.tag("div");
     // Wrap the SVG string in <svg> so that SvgElements are created, rather than
     // HTMLElements.
-    container.innerHTML = '<svg version="1.1">$svg</svg>';
+    container.innerHtml = '<svg version="1.1">$svg</svg>';
     this.children = container.children[0].children;
   }
 
diff --git a/sdk/lib/html/templates/html/impl/impl_SvgSvgElement.darttemplate b/sdk/lib/html/templates/html/impl/impl_SvgSvgElement.darttemplate
index 2e00aea..cc7ba42 100644
--- a/sdk/lib/html/templates/html/impl/impl_SvgSvgElement.darttemplate
+++ b/sdk/lib/html/templates/html/impl/impl_SvgSvgElement.darttemplate
@@ -4,6 +4,7 @@
 
 part of svg;
 
+/// @domName $DOMNAME
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
   factory $CLASSNAME() => _$(CLASSNAME)FactoryProvider.createSvgSvgElement();
 
diff --git a/sdk/lib/html/templates/html/impl/impl_Text.darttemplate b/sdk/lib/html/templates/html/impl/impl_Text.darttemplate
index 6f8560f..74e385c 100644
--- a/sdk/lib/html/templates/html/impl/impl_Text.darttemplate
+++ b/sdk/lib/html/templates/html/impl/impl_Text.darttemplate
@@ -6,6 +6,7 @@
 
 part of html;
 
+/// @domName $DOMNAME
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
   factory $CLASSNAME(String data) => _$(CLASSNAME)FactoryProvider.create$CLASSNAME(data);
 $!MEMBERS
diff --git a/sdk/lib/html/templates/html/impl/impl_UIEvent.darttemplate b/sdk/lib/html/templates/html/impl/impl_UIEvent.darttemplate
new file mode 100644
index 0000000..ce957c8
--- /dev/null
+++ b/sdk/lib/html/templates/html/impl/impl_UIEvent.darttemplate
@@ -0,0 +1,24 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+part of html;
+
+/// @domName $DOMNAME; @docsEditable true
+class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
+  // In JS, canBubble and cancelable are technically required parameters to
+  // init*Event. In practice, though, if they aren't provided they simply
+  // default to false (since that's Boolean(undefined)).
+  //
+  // Contrary to JS, we default canBubble and cancelable to true, since that's
+  // what people want most of the time anyway.
+  factory $CLASSNAME(String type, Window view, int detail,
+      [bool canBubble = true, bool cancelable = true]) {
+    final e = document.$dom_createEvent("UIEvent");
+    e.$dom_initUIEvent(type, canBubble, cancelable, view, detail);
+    return e;
+  }
+$!MEMBERS
+}
diff --git a/sdk/lib/html/templates/html/impl/impl_WebSocket.darttemplate b/sdk/lib/html/templates/html/impl/impl_WebSocket.darttemplate
index 564c30f..6fb4d40 100644
--- a/sdk/lib/html/templates/html/impl/impl_WebSocket.darttemplate
+++ b/sdk/lib/html/templates/html/impl/impl_WebSocket.darttemplate
@@ -6,6 +6,7 @@
 
 part of html;
 
+/// @domName $DOMNAME
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
   factory $CLASSNAME(String url) => _$(CLASSNAME)FactoryProvider.create$CLASSNAME(url);
 $!MEMBERS
diff --git a/sdk/lib/html/templates/html/impl/impl_WheelEvent.darttemplate b/sdk/lib/html/templates/html/impl/impl_WheelEvent.darttemplate
index c0fad3f..d660a21 100644
--- a/sdk/lib/html/templates/html/impl/impl_WheelEvent.darttemplate
+++ b/sdk/lib/html/templates/html/impl/impl_WheelEvent.darttemplate
@@ -4,6 +4,7 @@
 
 part of html;
 
+/// @domName $DOMNAME
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
 $!MEMBERS
 
diff --git a/sdk/lib/io/directory_impl.dart b/sdk/lib/io/directory_impl.dart
index 85968f1..ecf7959 100644
--- a/sdk/lib/io/directory_impl.dart
+++ b/sdk/lib/io/directory_impl.dart
@@ -51,27 +51,55 @@
     return (result == 1);
   }
 
+  Future<int> _computeExistingIndex(List dirsToCreate) {
+    var future;
+    for (var i = 0; i < dirsToCreate.length; i++) {
+      if (future == null) {
+        future = dirsToCreate[i].exists().transform((e) => e ? i : -1);
+      } else {
+        future = future.chain((index) {
+          if (index != -1) {
+            return new Future.immediate(index);
+          }
+          return dirsToCreate[i].exists().transform((e) => e ? i : -1);
+        });
+      }
+    }
+    if (future == null) {
+      return new Future.immedidate(-1);
+    } else {
+      return future;
+    }
+  }
+
   Future<Directory> createRecursively() {
     if (_path is !String) {
       throw new ArgumentError();
     }
     var path = new Path.fromNative(_path);
-    var current = new Path(path.isAbsolute ? '/' : '');
-    var future = null;
-    for (var segment in path.segments()) {
-      var next = current.append(segment);
-      if (future == null) {
-        future = new Directory.fromPath(current).create();
-      } else {
-        future = future.chain((_) => new Directory.fromPath(next).create());
+    var dirsToCreate = [];
+    var terminator = path.isAbsolute ? '/' : '';
+    while (path.toString() != terminator) {
+      dirsToCreate.add(new Directory.fromPath(path));
+      path = path.directoryPath;
+    }
+    return _computeExistingIndex(dirsToCreate).chain((index) {
+      var future;
+      for (var i = index - 1; i >= 0 ; i--) {
+        if (future == null) {
+          future = dirsToCreate[i].create();
+        } else {
+          future = future.chain((_) {
+            return dirsToCreate[i].create();
+          });
+        }
       }
-      current = next;
-    }
-    if (future == null) {
-      return new Future.immediate(this);
-    } else {
-      return future.transform((result) => this);
-    }
+      if (future == null) {
+        return new Future.immediate(this);
+      } else {
+        return future.transform((_) => this);
+      }
+    });
   }
 
   Future<Directory> create({recursive: false}) {
@@ -90,10 +118,16 @@
 
   void createRecursivelySync() {
     var path = new Path.fromNative(_path);
-    var current = new Path(path.isAbsolute ? '/' : '');
-    for (var segment in path.segments()) {
-      current = current.append(segment);
-      new Directory.fromPath(current).createSync();
+    var dirsToCreate = [];
+    var terminator = path.isAbsolute ? '/' : '';
+    while (path.toString() != terminator) {
+      var dir = new Directory.fromPath(path);
+      if (dir.existsSync()) break;
+      dirsToCreate.add(dir);
+      path = path.directoryPath;
+    }
+    for (var i = dirsToCreate.length - 1; i >= 0; i--) {
+      dirsToCreate[i].createSync();
     }
   }
 
diff --git a/sdk/lib/io/file.dart b/sdk/lib/io/file.dart
index 7937aa0..bef2d68 100644
--- a/sdk/lib/io/file.dart
+++ b/sdk/lib/io/file.dart
@@ -304,6 +304,17 @@
   int readByteSync();
 
   /**
+   * Reads from a file and returns the result as a list of bytes.
+   */
+  Future<List<int>> read(int bytes);
+
+  /**
+   * Synchronously reads from a file and returns the result in a
+   * list of bytes.
+   */
+  List<int> readSync(int bytes);
+
+  /**
    * Read a List<int> from the file. Returns a [:Future<int>:] that
    * completes with an indication of how much was read.
    */
diff --git a/sdk/lib/io/file_impl.dart b/sdk/lib/io/file_impl.dart
index 17dc2ab..0d7a548 100644
--- a/sdk/lib/io/file_impl.dart
+++ b/sdk/lib/io/file_impl.dart
@@ -65,22 +65,15 @@
       _closeFile();
       return;
     }
-    // If there is currently a _fillBuffer call waiting on readList,
+    // If there is currently a _fillBuffer call waiting on read,
     // let it fill the buffer instead of us.
     if (_activeFillBufferCall) return;
     _activeFillBufferCall = true;
-    if (_data.length != size) {
-      _data = new Uint8List(size);
-      // Maintain the invariant signalling that the buffer is empty.
-      _position = _data.length;
-    }
-    var future = _openedFile.readList(_data, 0, _data.length);
-    future.then((read) {
-      _filePosition += read;
-      if (read != _data.length) {
-        _data = _data.getRange(0, read);
-      }
+    var future = _openedFile.read(size);
+    future.then((data) {
+      _data = data;
       _position = 0;
+      _filePosition += _data.length;
       _activeFillBufferCall = false;
 
       if (_fileLength == _filePosition) {
@@ -319,8 +312,9 @@
 const int _FLUSH_REQUEST = 13;
 const int _READ_BYTE_REQUEST = 14;
 const int _WRITE_BYTE_REQUEST = 15;
-const int _READ_LIST_REQUEST = 16;
-const int _WRITE_LIST_REQUEST = 17;
+const int _READ_REQUEST = 16;
+const int _READ_LIST_REQUEST = 17;
+const int _WRITE_LIST_REQUEST = 18;
 
 // Base class for _File and _RandomAccessFile with shared functions.
 class _FileBase {
@@ -787,6 +781,43 @@
     return result;
   }
 
+  Future<List<int>> read(int bytes) {
+    _ensureFileService();
+    Completer<List<int>> completer = new Completer<List<int>>();
+    if (bytes is !int) {
+      // Complete asynchronously so the user has a chance to setup
+      // handlers without getting exceptions when registering the
+      // then handler.
+      new Timer(0, (t) {
+        completer.completeException(new FileIOException(
+            "Invalid arguments to read for file '$_name'"));
+      });
+      return completer.future;
+    };
+    if (closed) return _completeWithClosedException(completer);
+    List request = new List(3);
+    request[0] = _READ_REQUEST;
+    request[1] = _id;
+    request[2] = bytes;
+    return _fileService.call(request).transform((response) {
+      if (_isErrorResponse(response)) {
+        throw _exceptionFromResponse(response,
+                                     "read failed for file '$_name'");
+      }
+      return response[1];
+    });
+  }
+
+  external static _read(int id, int bytes);
+
+  List<int> readSync(int bytes) {
+    if (bytes is !int) {
+      throw new FileIOException(
+          "Invalid arguments to readSync for file '$_name'");
+    }
+    return _read(_id, bytes);
+  }
+
   Future<int> readList(List<int> buffer, int offset, int bytes) {
     _ensureFileService();
     Completer<int> completer = new Completer<int>();
diff --git a/sdk/lib/io/http.dart b/sdk/lib/io/http.dart
index 2274673..5c8a2f0 100644
--- a/sdk/lib/io/http.dart
+++ b/sdk/lib/io/http.dart
@@ -62,11 +62,16 @@
    * Start listening for HTTP requests on the specified [host] and
    * [port]. If a [port] of 0 is specified the server will choose an
    * ephemeral port. The optional argument [backlog] can be used to
-   * specify the listen backlog for the underlying OS listen
-   * setup. See [addRequestHandler] and [defaultRequestHandler] for
+   * specify the listen backlog for the underlying OS listen.
+   * The optional argument [certificate_name] is used by the HttpsServer
+   * class, which shares the same interface.
+   * See [addRequestHandler] and [defaultRequestHandler] for
    * information on how incoming HTTP requests are handled.
    */
-  void listen(String host, int port, {int backlog: 128});
+  void listen(String host,
+              int port,
+              {int backlog: 128,
+              String certificate_name});
 
   /**
    * Attach the HTTP server to an existing [:ServerSocket:]. If the
@@ -127,6 +132,14 @@
 
 
 /**
+ * HTTPS server.
+ */
+abstract class HttpsServer implements HttpServer {
+  factory HttpsServer() => new _HttpServer.httpsServer();
+}
+
+
+/**
  * Overview information of the [:HttpServer:] socket connections.
  */
 class HttpConnectionsInfo {
@@ -734,6 +747,7 @@
  */
 abstract class HttpClient {
   static const int DEFAULT_HTTP_PORT = 80;
+  static const int DEFAULT_HTTPS_PORT = 443;
 
   factory HttpClient() => new _HttpClient();
 
diff --git a/sdk/lib/io/http_impl.dart b/sdk/lib/io/http_impl.dart
index c783481..5539f3a 100644
--- a/sdk/lib/io/http_impl.dart
+++ b/sdk/lib/io/http_impl.dart
@@ -925,17 +925,40 @@
 
 // HTTP server waiting for socket connections. The connections are
 // managed by the server and as requests are received the request.
-class _HttpServer implements HttpServer {
-  _HttpServer() : _connections = new Set<_HttpConnection>(),
-                  _handlers = new List<_RequestHandlerRegistration>(),
-                  _closeQueue = new _CloseQueue();
+// HTTPS connections are also supported, if the _HttpServer.httpsServer
+// constructor is used and a certificate name is provided in listen,
+// or a SecureServerSocket is provided to listenOn.
+class _HttpServer implements HttpServer, HttpsServer {
+  _HttpServer() : this._internal(isSecure: false);
 
-  void listen(String host, int port, {int backlog: 128}) {
-    listenOn(new ServerSocket(host, port, backlog));
+  _HttpServer.httpsServer() : this._internal(isSecure: true);
+
+  _HttpServer._internal({ bool isSecure: false })
+      : _secure = isSecure,
+        _connections = new Set<_HttpConnection>(),
+        _handlers = new List<_RequestHandlerRegistration>(),
+        _closeQueue = new _CloseQueue();
+
+  void listen(String host,
+              int port,
+              {int backlog: 128,
+              String certificate_name}) {
+    if (_secure) {
+      listenOn(new SecureServerSocket(host, port, backlog, certificate_name));
+    } else {
+      listenOn(new ServerSocket(host, port, backlog));
+    }
     _closeServer = true;
   }
 
   void listenOn(ServerSocket serverSocket) {
+    if (_secure && serverSocket is! SecureServerSocket) {
+        throw new HttpException(
+            'HttpsServer.listenOn was called with non-secure server socket');
+    } else if (!_secure && serverSocket is SecureServerSocket) {
+        throw new HttpException(
+            'HttpServer.listenOn was called with a secure server socket');
+    }
     void onConnection(Socket socket) {
       // Accept the client connection.
       _HttpConnection connection = new _HttpConnection(this);
@@ -1051,6 +1074,7 @@
 
   ServerSocket _server;  // The server listen socket.
   bool _closeServer = false;
+  bool _secure;
   Set<_HttpConnection> _connections;  // Set of currently connected clients.
   List<_RequestHandlerRegistration> _handlers;
   Object _defaultHandler;
@@ -1463,18 +1487,19 @@
   }
 
   void _onError(e) {
+    // Cancel any pending data in the HTTP parser.
+    _httpParser.cancel();
     if (_socketConn != null) {
       _client._closeSocketConnection(_socketConn);
     }
-    if (_onErrorCallback != null) {
+    // Report the error.
+    if (_response != null && _response._streamErrorHandler != null) {
+       _response._streamErrorHandler(e);
+    } else if (_onErrorCallback != null) {
       _onErrorCallback(e);
     } else {
       throw e;
     }
-    // Propagate the error to the streams.
-    if (_response != null && _response._streamErrorHandler != null) {
-       _response._streamErrorHandler(e);
-    }
   }
 
   void _onResponseReceived(int statusCode,
@@ -1704,7 +1729,7 @@
   HttpClientConnection _openUrl(String method,
                                 Uri url,
                                 [_HttpClientConnection connection]) {
-    if (url.scheme != "http") {
+    if (url.scheme != "http" && url.scheme != "https") {
       throw new HttpException("Unsupported URL scheme ${url.scheme}");
     }
     return _open(method, url, connection);
@@ -1743,8 +1768,8 @@
     });
     if (force) {
       _activeSockets.forEach((_SocketConnection socketConn) {
-        socketConn._socket.close();
         socketConn._httpClientConnection._onClientShutdown();
+        socketConn._close();
       });
     }
     if (_evictionTimer != null) _cancelEvictionTimer();
@@ -1769,7 +1794,8 @@
                               int port,
                               _ProxyConfiguration proxyConfiguration,
                               int proxyIndex,
-                              bool reusedConnection) {
+                              bool reusedConnection,
+                              bool secure) {
 
       void _connectionOpened(_SocketConnection socketConn,
                              _HttpClientConnection connection,
@@ -1821,8 +1847,15 @@
       // otherwise create a new one.
       String key = _connectionKey(connectHost, connectPort);
       Queue socketConnections = _openSockets[key];
+      // Remove active connections that are of the wrong type (HTTP or HTTPS).
+      while (socketConnections != null &&
+             !socketConnections.isEmpty &&
+             secure != (socketConnections.first._socket is SecureSocket)) {
+        socketConnection.removeFirst()._close();
+      }
       if (socketConnections == null || socketConnections.isEmpty) {
-        Socket socket = new Socket(connectHost, connectPort);
+        Socket socket = secure ? new SecureSocket(connectHost, connectPort) :
+                                 new Socket(connectHost, connectPort);
         // Until the connection is established handle connection errors
         // here as the HttpClientConnection object is not yet associated
         // with the socket.
@@ -1831,7 +1864,7 @@
           if (proxyIndex < proxyConfiguration.proxies.length) {
             // Try the next proxy in the list.
             _establishConnection(
-                host, port, proxyConfiguration, proxyIndex, false);
+                host, port, proxyConfiguration, proxyIndex, false, secure);
           } else {
             // Report the error through the HttpClientConnection object to
             // the client.
@@ -1845,7 +1878,7 @@
           // the connected socket.
           socket.onError = null;
           _SocketConnection socketConn =
-          new _SocketConnection(connectHost, connectPort, socket);
+              new _SocketConnection(connectHost, connectPort, socket);
           _activeSockets.add(socketConn);
           _connectionOpened(socketConn, connection, !proxy.isDirect);
         };
@@ -1861,10 +1894,17 @@
       }
     }
 
+    // Find out if we want a secure socket.
+    bool is_secure = (url.scheme == "https");
+
     // Find the TCP host and port.
     String host = url.domain;
-    int port = url.port == 0 ? HttpClient.DEFAULT_HTTP_PORT : url.port;
-
+    int port = url.port;
+    if (port == 0) {
+      port = is_secure ?
+          HttpClient.DEFAULT_HTTPS_PORT :
+          HttpClient.DEFAULT_HTTP_PORT;
+    }
     // Create a new connection object if we are not re-using an existing one.
     var reusedConnection = false;
     if (connection == null) {
@@ -1883,7 +1923,12 @@
     }
 
     // Establish the connection starting with the first proxy configured.
-    _establishConnection(host, port, proxyConfiguration, 0, reusedConnection);
+    _establishConnection(host,
+                         port,
+                         proxyConfiguration,
+                         0,
+                         reusedConnection,
+                         is_secure);
 
     return connection;
   }
diff --git a/sdk/lib/io/http_parser.dart b/sdk/lib/io/http_parser.dart
index 1acd7eb..05db7ad 100644
--- a/sdk/lib/io/http_parser.dart
+++ b/sdk/lib/io/http_parser.dart
@@ -72,7 +72,8 @@
   static const int BODY = 24;
   static const int CLOSED = 25;
   static const int UPGRADED = 26;
-  static const int FAILURE = 27;
+  static const int CANCELED = 27;
+  static const int FAILURE = 28;
 
   static const int FIRST_BODY_STATE = CHUNK_SIZE_STARTING_CR;
 }
@@ -152,8 +153,12 @@
       if (_state == _State.FAILURE) {
         throw new HttpParserException("Data on failed connection");
       }
+      if (_state == _State.CANCELED) {
+        throw new HttpParserException("Data on canceled connection");
+      }
       while (_buffer != null &&
              _index < _lastIndex &&
+             _state != _State.CANCELED &&
              _state != _State.FAILURE &&
              _state != _State.UPGRADED) {
         int byte = _buffer[_index++];
@@ -450,6 +455,7 @@
                             version,
                             _headers);
             }
+            if (_state == _State.CANCELED) continue;
             _method_or_status_code.clear();
             _uri_or_reason_phrase.clear();
             if (!_connectionUpgrade) {
@@ -464,6 +470,7 @@
                 // If there is no message body get ready to process the
                 // next request.
                 _bodyEnd();
+                if (_state == _State.CANCELED) continue;
                 _reset();
               } else if (_contentLength > 0) {
                 _remainingContent = _contentLength;
@@ -520,6 +527,7 @@
           case _State.CHUNKED_BODY_DONE_LF:
             _expect(byte, _CharCode.LF);
             _bodyEnd();
+            if (_state == _State.CANCELED) continue;
             _reset();
             break;
 
@@ -538,6 +546,7 @@
             }
 
             dataReceived(data);
+            if (_state == _State.CANCELED) continue;
             if (_remainingContent != null) {
               _remainingContent -= data.length;
             }
@@ -545,6 +554,7 @@
             if (_remainingContent == 0) {
               if (!_chunked) {
                 _bodyEnd();
+                if (_state == _State.CANCELED) continue;
                 _reset();
               } else {
                 _state = _State.CHUNK_SIZE_STARTING_CR;
@@ -641,6 +651,10 @@
     return null;
   }
 
+  void cancel() {
+    _state = _State.CANCELED;
+  }
+
   int get messageType => _messageType;
   int get contentLength => _contentLength;
   bool get upgrade => _connectionUpgrade && _state == _State.UPGRADED;
diff --git a/sdk/lib/io/path.dart b/sdk/lib/io/path.dart
index 4061f7e..dcf492e 100644
--- a/sdk/lib/io/path.dart
+++ b/sdk/lib/io/path.dart
@@ -19,9 +19,25 @@
 
   /**
    * Creates a Path from a String that uses the native filesystem's conventions.
-   * On Windows, this converts '\' to '/', and adds a '/' before a drive letter.
+   *
+   * On Windows, this converts '\' to '/' and has special handling for drive
+   * letters and shares.
+   *
+   * If the path contains a drive letter a '/' is added before the drive letter.
+   *
+   *     new Path.fromNative(r'c:\a\b').toString() == '/c:/a/b'
+   *
    * A path starting with '/c:/' (or any other character instead of 'c') is
    * treated specially.  Backwards links ('..') cannot cancel the drive letter.
+   *
+   * If the path is a share path this is recorded in the Path object and
+   * maintained in operations on the Path object.
+   *
+   *     var share = new Path.fromNative(r'\\share\a\b\c');
+   *     share.isWindowsShare == true
+   *     share.toString() == '/share/a/b/c'
+   *     share.toNativePath() == r'\\share\a\b\c'
+   *     share.append('final').isWindowsShare == true
    */
   factory Path.fromNative(String source) => new _Path.fromNative(source);
 
@@ -36,6 +52,11 @@
   bool get isAbsolute;
 
   /**
+   * Is this path a Windows share path?
+   */
+  bool get isWindowsShare;
+
+  /**
    * Does this path end with a path separator?
    */
   bool get hasTrailingSeparator;
diff --git a/sdk/lib/io/path_impl.dart b/sdk/lib/io/path_impl.dart
index 58e7ce3..2a661e0 100644
--- a/sdk/lib/io/path_impl.dart
+++ b/sdk/lib/io/path_impl.dart
@@ -4,31 +4,38 @@
 
 class _Path implements Path {
   final String _path;
+  final bool isWindowsShare;
 
-  _Path(String source) : _path = source;
-  _Path.fromNative(String source) : _path = _clean(source);
+  _Path(String source) : _path = source, isWindowsShare = false;
 
-  int get hashCode => _path.hashCode;
+  _Path.fromNative(String source)
+      : _path = _clean(source), isWindowsShare = _isWindowsShare(source);
+
+  _Path._internal(String this._path, bool this.isWindowsShare);
 
   static String _clean(String source) {
-    switch (Platform.operatingSystem) {
-      case 'windows':
-        return _cleanWindows(source);
-      default:
-        return source;
-    }
+    if (Platform.operatingSystem == 'windows') return _cleanWindows(source);
+    return source;
   }
 
-  static String _cleanWindows(source) {
+  static String _cleanWindows(String source) {
     // Change \ to /.
     var clean = source.replaceAll('\\', '/');
     // Add / before intial [Drive letter]:
     if (clean.length >= 2 && clean[1] == ':') {
       clean = '/$clean';
     }
+    if (_isWindowsShare(source)) {
+      return clean.substring(1, clean.length);
+    }
     return clean;
   }
 
+  static bool _isWindowsShare(String source) {
+    return Platform.operatingSystem == 'windows' && source.startsWith('\\\\');
+  }
+
+  int get hashCode => _path.hashCode;
   bool get isEmpty => _path.isEmpty;
   bool get isAbsolute => _path.startsWith('/');
   bool get hasTrailingSeparator => _path.endsWith('/');
@@ -42,7 +49,8 @@
     // Throws an exception if no such path exists, or the case is not
     // implemented yet.
     var basePath = base.toString();
-    if (base.isAbsolute && _path.startsWith(basePath)) {
+    if (base.isAbsolute && _path.startsWith(basePath) &&
+        base.isWindowsShare == isWindowsShare) {
       if (_path == basePath) return new Path('.');
       if (base.hasTrailingSeparator) {
         return new Path(_path.substring(basePath.length));
@@ -50,7 +58,8 @@
       if (_path[basePath.length] == '/') {
         return new Path(_path.substring(basePath.length + 1));
       }
-    } else if (base.isAbsolute && isAbsolute) {
+    } else if (base.isAbsolute && isAbsolute &&
+               base.isWindowsShare == isWindowsShare) {
       List<String> baseSegments = base.canonicalize().segments();
       List<String> pathSegments = canonicalize().segments();
       int common = 0;
@@ -90,9 +99,11 @@
       return further.canonicalize();
     }
     if (hasTrailingSeparator) {
-      return new Path('$_path${further}').canonicalize();
+      var joined = new _Path._internal('$_path${further}', isWindowsShare);
+      return joined.canonicalize();
     }
-    return new Path('$_path/${further}').canonicalize();
+    var joined = new _Path._internal('$_path/${further}', isWindowsShare);
+    return joined.canonicalize();
   }
 
   // Note: The URI RFC names for these operations are normalize, resolve, and
@@ -182,7 +193,8 @@
         segmentsToJoin.add('');
       }
     }
-    return new Path(Strings.join(segmentsToJoin, '/'));
+    return new _Path._internal(Strings.join(segmentsToJoin, '/'),
+                               isWindowsShare);
   }
 
   String toNativePath() {
@@ -195,6 +207,9 @@
         nativePath = nativePath.substring(1);
       }
       nativePath = nativePath.replaceAll('/', '\\');
+      if (isWindowsShare) {
+        return '\\$nativePath';
+      }
       return nativePath;
     }
     return _path;
@@ -209,11 +224,11 @@
 
   Path append(String finalSegment) {
     if (isEmpty) {
-      return new Path(finalSegment);
+      return new _Path._internal(finalSegment, isWindowsShare);
     } else if (hasTrailingSeparator) {
-      return new Path('$_path$finalSegment');
+      return new _Path._internal('$_path$finalSegment', isWindowsShare);
     } else {
-      return new Path('$_path/$finalSegment');
+      return new _Path._internal('$_path/$finalSegment', isWindowsShare);
     }
   }
 
@@ -234,7 +249,8 @@
     int pos = _path.lastIndexOf('/');
     if (pos < 0) return new Path('');
     while (pos > 0 && _path[pos - 1] == '/') --pos;
-    return new Path((pos > 0) ? _path.substring(0, pos) : '/');
+    var dirPath = (pos > 0) ? _path.substring(0, pos) : '/';
+    return new _Path._internal(dirPath, isWindowsShare);
   }
 
   String get filename {
diff --git a/sdk/lib/io/secure_socket.dart b/sdk/lib/io/secure_socket.dart
index 9efbacb..5d894d4 100644
--- a/sdk/lib/io/secure_socket.dart
+++ b/sdk/lib/io/secure_socket.dart
@@ -78,6 +78,7 @@
     _socket.onConnect = _secureConnectHandler;
     _socket.onData = _secureDataHandler;
     _socket.onClosed = _secureCloseHandler;
+    _socket.onError = _secureErrorHandler;
     _secureFilter.init();
     _secureFilter.registerHandshakeCompleteCallback(_secureHandshakeCompleteHandler);
   }
@@ -89,7 +90,7 @@
   int get remotePort => _socket.remotePort;
 
   void set onClosed(void callback()) {
-    if (_inputStream != null) {
+    if (_inputStream != null && callback != null) {
       throw new StreamException(
            "Cannot set close handler when input stream is used");
     }
@@ -101,10 +102,6 @@
   }
 
   void set onConnect(void callback()) {
-    if (_outputStream != null) {
-      throw new StreamException(
-          "Cannot set connect handler when output stream is used");
-    }
     if (_status == CONNECTED || _status == CLOSED) {
       throw new StreamException(
           "Cannot set connect handler when already connected");
@@ -117,7 +114,7 @@
   }
 
   void set onData(void callback()) {
-    if (_outputStream != null) {
+    if (_outputStream != null && callback != null) {
       throw new StreamException(
           "Cannot set data handler when input stream is used");
     }
@@ -128,8 +125,12 @@
     _socketDataHandler = callback;
   }
 
+  void set onError(void callback(e)) {
+    _socketErrorHandler = callback;
+  }
+
   void set onWrite(void callback()) {
-    if (_outputStream != null) {
+    if (_outputStream != null && callback != null) {
       throw new StreamException(
           "Cannot set write handler when output stream is used");
     }
@@ -155,9 +156,9 @@
 
   OutputStream get outputStream {
     if (_outputStream == null) {
-      if (_socketConnectHandler != null || _socketWriteHandler != null) {
+      if (_socketWriteHandler != null) {
         throw new StreamException(
-            "Cannot get output stream when socket handlers are used");
+            "Cannot get output stream when socket write handler is used");
       }
       _outputStream = new _SocketOutputStream(this);
     }
@@ -168,7 +169,7 @@
     throw new UnimplementedError("SecureSocket.available not implemented yet");
   }
 
-  void close([bool halfClose]) {
+  void close([bool halfClose = false]) {
     if (halfClose) {
       _closedWrite = true;
       _writeEncryptedData();
@@ -314,6 +315,35 @@
     }
   }
 
+  void _secureErrorHandler(e) {
+    _reportError(e, 'Error on underlying Socket');
+  }
+
+  void _reportError(error, String message) {
+    // TODO(whesse): Call _reportError from all internal functions that throw.
+    var e;
+    if (error is SocketIOException) {
+      e = new SocketIOException('$message (${error.message})', error.osError);
+    } else if (error is OSError) {
+      e = new SocketIOException(message, error);
+    } else {
+      e = new SocketIOException('$message (${error.toString()})', null);
+    }
+    bool reported = false;
+    if (_socketErrorHandler != null) {
+      reported = true;
+      _socketErrorHandler(e);
+    }
+    if (_inputStream != null) {
+      reported = reported || _inputStream._onSocketError(e);
+    }
+    if (_outputStream != null) {
+      reported = reported || _outputStream._onSocketError(e);
+    }
+
+    if (!reported) throw e;
+  }
+
   void _secureCloseHandler() {
     _socketClosedRead = true;
     if (_filterReadEmpty) {
@@ -494,6 +524,7 @@
   Function _socketConnectHandler;
   Function _socketWriteHandler;
   Function _socketDataHandler;
+  Function _socketErrorHandler;
   Function _socketCloseHandler;
   Timer scheduledDataEvent;
 
diff --git a/sdk/lib/svg/dart2js/svg_dart2js.dart b/sdk/lib/svg/dart2js/svg_dart2js.dart
index d018a6d..be4cb44 100644
--- a/sdk/lib/svg/dart2js/svg_dart2js.dart
+++ b/sdk/lib/svg/dart2js/svg_dart2js.dart
@@ -31,7 +31,7 @@
       parentTag = new SvgSvgElement();
     }
 
-    parentTag.innerHTML = svg;
+    parentTag.innerHtml = svg;
     if (parentTag.elements.length == 1) return parentTag.elements.removeLast();
 
     throw new ArgumentError(
@@ -86,16 +86,19 @@
   Rect getBBox() native;
 
   /// @domName SVGLocatable.getCTM; @docsEditable true
-  Matrix getCTM() native;
+  @JSName('getCTM')
+  Matrix getCtm() native;
 
   /// @domName SVGLocatable.getScreenCTM; @docsEditable true
-  Matrix getScreenCTM() native;
+  @JSName('getScreenCTM')
+  Matrix getScreenCtm() native;
 
   /// @domName SVGLocatable.getTransformToElement; @docsEditable true
   Matrix getTransformToElement(SvgElement element) native;
 
   // From SVGStylable
 
+  // Shadowing definition.
   /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
@@ -762,16 +765,19 @@
   Rect getBBox() native;
 
   /// @domName SVGLocatable.getCTM; @docsEditable true
-  Matrix getCTM() native;
+  @JSName('getCTM')
+  Matrix getCtm() native;
 
   /// @domName SVGLocatable.getScreenCTM; @docsEditable true
-  Matrix getScreenCTM() native;
+  @JSName('getScreenCTM')
+  Matrix getScreenCtm() native;
 
   /// @domName SVGLocatable.getTransformToElement; @docsEditable true
   Matrix getTransformToElement(SvgElement element) native;
 
   // From SVGStylable
 
+  // Shadowing definition.
   /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
@@ -838,16 +844,19 @@
   Rect getBBox() native;
 
   /// @domName SVGLocatable.getCTM; @docsEditable true
-  Matrix getCTM() native;
+  @JSName('getCTM')
+  Matrix getCtm() native;
 
   /// @domName SVGLocatable.getScreenCTM; @docsEditable true
-  Matrix getScreenCTM() native;
+  @JSName('getScreenCTM')
+  Matrix getScreenCtm() native;
 
   /// @domName SVGLocatable.getTransformToElement; @docsEditable true
   Matrix getTransformToElement(SvgElement element) native;
 
   // From SVGStylable
 
+  // Shadowing definition.
   /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
@@ -902,10 +911,12 @@
   void setColor(int colorType, String rgbColor, String iccColor) native;
 
   /// @domName SVGColor.setRGBColor; @docsEditable true
-  void setRGBColor(String rgbColor) native;
+  @JSName('setRGBColor')
+  void setRgbColor(String rgbColor) native;
 
   /// @domName SVGColor.setRGBColorICCColor; @docsEditable true
-  void setRGBColorICCColor(String rgbColor, String iccColor) native;
+  @JSName('setRGBColorICCColor')
+  void setRgbColorIccColor(String rgbColor, String iccColor) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -1023,16 +1034,19 @@
   Rect getBBox() native;
 
   /// @domName SVGLocatable.getCTM; @docsEditable true
-  Matrix getCTM() native;
+  @JSName('getCTM')
+  Matrix getCtm() native;
 
   /// @domName SVGLocatable.getScreenCTM; @docsEditable true
-  Matrix getScreenCTM() native;
+  @JSName('getScreenCTM')
+  Matrix getScreenCtm() native;
 
   /// @domName SVGLocatable.getTransformToElement; @docsEditable true
   Matrix getTransformToElement(SvgElement element) native;
 
   // From SVGStylable
 
+  // Shadowing definition.
   /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
@@ -1081,6 +1095,7 @@
 
   // From SVGStylable
 
+  // Shadowing definition.
   /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
@@ -1258,16 +1273,19 @@
   Rect getBBox() native;
 
   /// @domName SVGLocatable.getCTM; @docsEditable true
-  Matrix getCTM() native;
+  @JSName('getCTM')
+  Matrix getCtm() native;
 
   /// @domName SVGLocatable.getScreenCTM; @docsEditable true
-  Matrix getScreenCTM() native;
+  @JSName('getScreenCTM')
+  Matrix getScreenCtm() native;
 
   /// @domName SVGLocatable.getTransformToElement; @docsEditable true
   Matrix getTransformToElement(SvgElement element) native;
 
   // From SVGStylable
 
+  // Shadowing definition.
   /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
@@ -1301,32 +1319,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGException; @docsEditable true
-class Exception native "*SVGException" {
-
-  static const int SVG_INVALID_VALUE_ERR = 1;
-
-  static const int SVG_MATRIX_NOT_INVERTABLE = 2;
-
-  static const int SVG_WRONG_TYPE_ERR = 0;
-
-  /// @domName SVGException.code; @docsEditable true
-  final int code;
-
-  /// @domName SVGException.message; @docsEditable true
-  final String message;
-
-  /// @domName SVGException.name; @docsEditable true
-  final String name;
-
-  /// @domName SVGException.toString; @docsEditable true
-  String toString() native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
 /// @domName SVGExternalResourcesRequired
 abstract class ExternalResourcesRequired {
 
@@ -1380,6 +1372,7 @@
 
   // From SVGStylable
 
+  // Shadowing definition.
   /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
@@ -1435,6 +1428,7 @@
 
   // From SVGStylable
 
+  // Shadowing definition.
   /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
@@ -1474,6 +1468,7 @@
 
   // From SVGStylable
 
+  // Shadowing definition.
   /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
@@ -1545,6 +1540,7 @@
 
   // From SVGStylable
 
+  // Shadowing definition.
   /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
@@ -1625,6 +1621,7 @@
 
   // From SVGStylable
 
+  // Shadowing definition.
   /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
@@ -1676,6 +1673,7 @@
 
   // From SVGStylable
 
+  // Shadowing definition.
   /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
@@ -1737,6 +1735,7 @@
 
   // From SVGStylable
 
+  // Shadowing definition.
   /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
@@ -1805,6 +1804,7 @@
 
   // From SVGStylable
 
+  // Shadowing definition.
   /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
@@ -1841,6 +1841,7 @@
 
   // From SVGStylable
 
+  // Shadowing definition.
   /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
@@ -1921,6 +1922,7 @@
 
   // From SVGStylable
 
+  // Shadowing definition.
   /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
@@ -1973,6 +1975,7 @@
 
   // From SVGStylable
 
+  // Shadowing definition.
   /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
@@ -2014,6 +2017,7 @@
 
   // From SVGStylable
 
+  // Shadowing definition.
   /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
@@ -2082,6 +2086,7 @@
 
   // From SVGStylable
 
+  // Shadowing definition.
   /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
@@ -2127,6 +2132,7 @@
 
   // From SVGStylable
 
+  // Shadowing definition.
   /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
@@ -2192,6 +2198,7 @@
 
   // From SVGStylable
 
+  // Shadowing definition.
   /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
@@ -2263,6 +2270,7 @@
 
   // From SVGStylable
 
+  // Shadowing definition.
   /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
@@ -2329,6 +2337,7 @@
 
   // From SVGStylable
 
+  // Shadowing definition.
   /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
@@ -2390,6 +2399,7 @@
 
   // From SVGStylable
 
+  // Shadowing definition.
   /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
@@ -2424,7 +2434,7 @@
 
   // From SVGStylable
 
-  AnimatedString className;
+  AnimatedString $dom_svgClassName;
 
   CSSStyleDeclaration style;
 
@@ -2550,16 +2560,19 @@
   Rect getBBox() native;
 
   /// @domName SVGLocatable.getCTM; @docsEditable true
-  Matrix getCTM() native;
+  @JSName('getCTM')
+  Matrix getCtm() native;
 
   /// @domName SVGLocatable.getScreenCTM; @docsEditable true
-  Matrix getScreenCTM() native;
+  @JSName('getScreenCTM')
+  Matrix getScreenCtm() native;
 
   /// @domName SVGLocatable.getTransformToElement; @docsEditable true
   Matrix getTransformToElement(SvgElement element) native;
 
   // From SVGStylable
 
+  // Shadowing definition.
   /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
@@ -2623,16 +2636,19 @@
   Rect getBBox() native;
 
   /// @domName SVGLocatable.getCTM; @docsEditable true
-  Matrix getCTM() native;
+  @JSName('getCTM')
+  Matrix getCtm() native;
 
   /// @domName SVGLocatable.getScreenCTM; @docsEditable true
-  Matrix getScreenCTM() native;
+  @JSName('getScreenCTM')
+  Matrix getScreenCtm() native;
 
   /// @domName SVGLocatable.getTransformToElement; @docsEditable true
   Matrix getTransformToElement(SvgElement element) native;
 
   // From SVGStylable
 
+  // Shadowing definition.
   /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
@@ -2699,6 +2715,7 @@
 
   // From SVGStylable
 
+  // Shadowing definition.
   /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
@@ -2745,6 +2762,7 @@
 
   // From SVGStylable
 
+  // Shadowing definition.
   /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
@@ -2819,16 +2837,19 @@
   Rect getBBox() native;
 
   /// @domName SVGLocatable.getCTM; @docsEditable true
-  Matrix getCTM() native;
+  @JSName('getCTM')
+  Matrix getCtm() native;
 
   /// @domName SVGLocatable.getScreenCTM; @docsEditable true
-  Matrix getScreenCTM() native;
+  @JSName('getScreenCTM')
+  Matrix getScreenCtm() native;
 
   /// @domName SVGLocatable.getTransformToElement; @docsEditable true
   Matrix getTransformToElement(SvgElement element) native;
 
   // From SVGStylable
 
+  // Shadowing definition.
   /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
@@ -3086,16 +3107,19 @@
   Rect getBBox() native;
 
   /// @domName SVGLocatable.getCTM; @docsEditable true
-  Matrix getCTM() native;
+  @JSName('getCTM')
+  Matrix getCtm() native;
 
   /// @domName SVGLocatable.getScreenCTM; @docsEditable true
-  Matrix getScreenCTM() native;
+  @JSName('getScreenCTM')
+  Matrix getScreenCtm() native;
 
   /// @domName SVGLocatable.getTransformToElement; @docsEditable true
   Matrix getTransformToElement(SvgElement element) native;
 
   // From SVGStylable
 
+  // Shadowing definition.
   /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
@@ -3262,6 +3286,7 @@
 
   // From SVGStylable
 
+  // Shadowing definition.
   /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
@@ -3314,6 +3339,7 @@
 
   // From SVGStylable
 
+  // Shadowing definition.
   /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
@@ -3606,61 +3632,80 @@
   final PathSegList pathSegList;
 
   /// @domName SVGPathElement.createSVGPathSegArcAbs; @docsEditable true
-  PathSegArcAbs createSVGPathSegArcAbs(num x, num y, num r1, num r2, num angle, bool largeArcFlag, bool sweepFlag) native;
+  @JSName('createSVGPathSegArcAbs')
+  PathSegArcAbs createSvgPathSegArcAbs(num x, num y, num r1, num r2, num angle, bool largeArcFlag, bool sweepFlag) native;
 
   /// @domName SVGPathElement.createSVGPathSegArcRel; @docsEditable true
-  PathSegArcRel createSVGPathSegArcRel(num x, num y, num r1, num r2, num angle, bool largeArcFlag, bool sweepFlag) native;
+  @JSName('createSVGPathSegArcRel')
+  PathSegArcRel createSvgPathSegArcRel(num x, num y, num r1, num r2, num angle, bool largeArcFlag, bool sweepFlag) native;
 
   /// @domName SVGPathElement.createSVGPathSegClosePath; @docsEditable true
-  PathSegClosePath createSVGPathSegClosePath() native;
+  @JSName('createSVGPathSegClosePath')
+  PathSegClosePath createSvgPathSegClosePath() native;
 
   /// @domName SVGPathElement.createSVGPathSegCurvetoCubicAbs; @docsEditable true
-  PathSegCurvetoCubicAbs createSVGPathSegCurvetoCubicAbs(num x, num y, num x1, num y1, num x2, num y2) native;
+  @JSName('createSVGPathSegCurvetoCubicAbs')
+  PathSegCurvetoCubicAbs createSvgPathSegCurvetoCubicAbs(num x, num y, num x1, num y1, num x2, num y2) native;
 
   /// @domName SVGPathElement.createSVGPathSegCurvetoCubicRel; @docsEditable true
-  PathSegCurvetoCubicRel createSVGPathSegCurvetoCubicRel(num x, num y, num x1, num y1, num x2, num y2) native;
+  @JSName('createSVGPathSegCurvetoCubicRel')
+  PathSegCurvetoCubicRel createSvgPathSegCurvetoCubicRel(num x, num y, num x1, num y1, num x2, num y2) native;
 
   /// @domName SVGPathElement.createSVGPathSegCurvetoCubicSmoothAbs; @docsEditable true
-  PathSegCurvetoCubicSmoothAbs createSVGPathSegCurvetoCubicSmoothAbs(num x, num y, num x2, num y2) native;
+  @JSName('createSVGPathSegCurvetoCubicSmoothAbs')
+  PathSegCurvetoCubicSmoothAbs createSvgPathSegCurvetoCubicSmoothAbs(num x, num y, num x2, num y2) native;
 
   /// @domName SVGPathElement.createSVGPathSegCurvetoCubicSmoothRel; @docsEditable true
-  PathSegCurvetoCubicSmoothRel createSVGPathSegCurvetoCubicSmoothRel(num x, num y, num x2, num y2) native;
+  @JSName('createSVGPathSegCurvetoCubicSmoothRel')
+  PathSegCurvetoCubicSmoothRel createSvgPathSegCurvetoCubicSmoothRel(num x, num y, num x2, num y2) native;
 
   /// @domName SVGPathElement.createSVGPathSegCurvetoQuadraticAbs; @docsEditable true
-  PathSegCurvetoQuadraticAbs createSVGPathSegCurvetoQuadraticAbs(num x, num y, num x1, num y1) native;
+  @JSName('createSVGPathSegCurvetoQuadraticAbs')
+  PathSegCurvetoQuadraticAbs createSvgPathSegCurvetoQuadraticAbs(num x, num y, num x1, num y1) native;
 
   /// @domName SVGPathElement.createSVGPathSegCurvetoQuadraticRel; @docsEditable true
-  PathSegCurvetoQuadraticRel createSVGPathSegCurvetoQuadraticRel(num x, num y, num x1, num y1) native;
+  @JSName('createSVGPathSegCurvetoQuadraticRel')
+  PathSegCurvetoQuadraticRel createSvgPathSegCurvetoQuadraticRel(num x, num y, num x1, num y1) native;
 
   /// @domName SVGPathElement.createSVGPathSegCurvetoQuadraticSmoothAbs; @docsEditable true
-  PathSegCurvetoQuadraticSmoothAbs createSVGPathSegCurvetoQuadraticSmoothAbs(num x, num y) native;
+  @JSName('createSVGPathSegCurvetoQuadraticSmoothAbs')
+  PathSegCurvetoQuadraticSmoothAbs createSvgPathSegCurvetoQuadraticSmoothAbs(num x, num y) native;
 
   /// @domName SVGPathElement.createSVGPathSegCurvetoQuadraticSmoothRel; @docsEditable true
-  PathSegCurvetoQuadraticSmoothRel createSVGPathSegCurvetoQuadraticSmoothRel(num x, num y) native;
+  @JSName('createSVGPathSegCurvetoQuadraticSmoothRel')
+  PathSegCurvetoQuadraticSmoothRel createSvgPathSegCurvetoQuadraticSmoothRel(num x, num y) native;
 
   /// @domName SVGPathElement.createSVGPathSegLinetoAbs; @docsEditable true
-  PathSegLinetoAbs createSVGPathSegLinetoAbs(num x, num y) native;
+  @JSName('createSVGPathSegLinetoAbs')
+  PathSegLinetoAbs createSvgPathSegLinetoAbs(num x, num y) native;
 
   /// @domName SVGPathElement.createSVGPathSegLinetoHorizontalAbs; @docsEditable true
-  PathSegLinetoHorizontalAbs createSVGPathSegLinetoHorizontalAbs(num x) native;
+  @JSName('createSVGPathSegLinetoHorizontalAbs')
+  PathSegLinetoHorizontalAbs createSvgPathSegLinetoHorizontalAbs(num x) native;
 
   /// @domName SVGPathElement.createSVGPathSegLinetoHorizontalRel; @docsEditable true
-  PathSegLinetoHorizontalRel createSVGPathSegLinetoHorizontalRel(num x) native;
+  @JSName('createSVGPathSegLinetoHorizontalRel')
+  PathSegLinetoHorizontalRel createSvgPathSegLinetoHorizontalRel(num x) native;
 
   /// @domName SVGPathElement.createSVGPathSegLinetoRel; @docsEditable true
-  PathSegLinetoRel createSVGPathSegLinetoRel(num x, num y) native;
+  @JSName('createSVGPathSegLinetoRel')
+  PathSegLinetoRel createSvgPathSegLinetoRel(num x, num y) native;
 
   /// @domName SVGPathElement.createSVGPathSegLinetoVerticalAbs; @docsEditable true
-  PathSegLinetoVerticalAbs createSVGPathSegLinetoVerticalAbs(num y) native;
+  @JSName('createSVGPathSegLinetoVerticalAbs')
+  PathSegLinetoVerticalAbs createSvgPathSegLinetoVerticalAbs(num y) native;
 
   /// @domName SVGPathElement.createSVGPathSegLinetoVerticalRel; @docsEditable true
-  PathSegLinetoVerticalRel createSVGPathSegLinetoVerticalRel(num y) native;
+  @JSName('createSVGPathSegLinetoVerticalRel')
+  PathSegLinetoVerticalRel createSvgPathSegLinetoVerticalRel(num y) native;
 
   /// @domName SVGPathElement.createSVGPathSegMovetoAbs; @docsEditable true
-  PathSegMovetoAbs createSVGPathSegMovetoAbs(num x, num y) native;
+  @JSName('createSVGPathSegMovetoAbs')
+  PathSegMovetoAbs createSvgPathSegMovetoAbs(num x, num y) native;
 
   /// @domName SVGPathElement.createSVGPathSegMovetoRel; @docsEditable true
-  PathSegMovetoRel createSVGPathSegMovetoRel(num x, num y) native;
+  @JSName('createSVGPathSegMovetoRel')
+  PathSegMovetoRel createSvgPathSegMovetoRel(num x, num y) native;
 
   /// @domName SVGPathElement.getPathSegAtLength; @docsEditable true
   int getPathSegAtLength(num distance) native;
@@ -3696,16 +3741,19 @@
   Rect getBBox() native;
 
   /// @domName SVGLocatable.getCTM; @docsEditable true
-  Matrix getCTM() native;
+  @JSName('getCTM')
+  Matrix getCtm() native;
 
   /// @domName SVGLocatable.getScreenCTM; @docsEditable true
-  Matrix getScreenCTM() native;
+  @JSName('getScreenCTM')
+  Matrix getScreenCtm() native;
 
   /// @domName SVGLocatable.getTransformToElement; @docsEditable true
   Matrix getTransformToElement(SvgElement element) native;
 
   // From SVGStylable
 
+  // Shadowing definition.
   /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
@@ -4285,6 +4333,7 @@
 
   // From SVGStylable
 
+  // Shadowing definition.
   /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
@@ -4320,6 +4369,7 @@
 // WARNING: Do not edit - generated code.
 
 
+/// @domName SVGPoint
 class Point native "*SVGPoint" {
   factory Point(num x, num y) => _PointFactoryProvider.createPoint(x, y);
 
@@ -4406,16 +4456,19 @@
   Rect getBBox() native;
 
   /// @domName SVGLocatable.getCTM; @docsEditable true
-  Matrix getCTM() native;
+  @JSName('getCTM')
+  Matrix getCtm() native;
 
   /// @domName SVGLocatable.getScreenCTM; @docsEditable true
-  Matrix getScreenCTM() native;
+  @JSName('getScreenCTM')
+  Matrix getScreenCtm() native;
 
   /// @domName SVGLocatable.getTransformToElement; @docsEditable true
   Matrix getTransformToElement(SvgElement element) native;
 
   // From SVGStylable
 
+  // Shadowing definition.
   /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
@@ -4485,16 +4538,19 @@
   Rect getBBox() native;
 
   /// @domName SVGLocatable.getCTM; @docsEditable true
-  Matrix getCTM() native;
+  @JSName('getCTM')
+  Matrix getCtm() native;
 
   /// @domName SVGLocatable.getScreenCTM; @docsEditable true
-  Matrix getScreenCTM() native;
+  @JSName('getScreenCTM')
+  Matrix getScreenCtm() native;
 
   /// @domName SVGLocatable.getTransformToElement; @docsEditable true
   Matrix getTransformToElement(SvgElement element) native;
 
   // From SVGStylable
 
+  // Shadowing definition.
   /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
@@ -4666,16 +4722,19 @@
   Rect getBBox() native;
 
   /// @domName SVGLocatable.getCTM; @docsEditable true
-  Matrix getCTM() native;
+  @JSName('getCTM')
+  Matrix getCtm() native;
 
   /// @domName SVGLocatable.getScreenCTM; @docsEditable true
-  Matrix getScreenCTM() native;
+  @JSName('getScreenCTM')
+  Matrix getScreenCtm() native;
 
   /// @domName SVGLocatable.getTransformToElement; @docsEditable true
   Matrix getTransformToElement(SvgElement element) native;
 
   // From SVGStylable
 
+  // Shadowing definition.
   /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
@@ -4772,6 +4831,7 @@
 
   // From SVGStylable
 
+  // Shadowing definition.
   /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
@@ -4906,7 +4966,7 @@
 /// @domName SVGStylable
 abstract class Stylable {
 
-  AnimatedString className;
+  AnimatedString $dom_svgClassName;
 
   CSSStyleDeclaration style;
 
@@ -4961,7 +5021,8 @@
   final SvgSvgElement rootElement;
 
   /// @domName SVGDocument.createEvent; @docsEditable true
-  Event $dom_createEvent(String eventType) native "createEvent";
+  @JSName('createEvent')
+  Event $dom_createEvent(String eventType) native;
 }
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -4995,6 +5056,7 @@
   }
 }
 
+/// @domName SVGElement
 class SvgElement extends Element native "*SVGElement" {
   factory SvgElement.tag(String tag) =>
       _SvgElementFactoryProvider.createSvgElement_tag(tag);
@@ -5025,25 +5087,25 @@
     children.addAll(value);
   }
 
-  String get outerHTML {
+  String get outerHtml {
     final container = new Element.tag("div");
     final SvgElement cloned = this.clone(true);
     container.children.add(cloned);
-    return container.innerHTML;
+    return container.innerHtml;
   }
 
-  String get innerHTML {
+  String get innerHtml {
     final container = new Element.tag("div");
     final SvgElement cloned = this.clone(true);
     container.children.addAll(cloned.children);
-    return container.innerHTML;
+    return container.innerHtml;
   }
 
-  void set innerHTML(String svg) {
+  void set innerHtml(String svg) {
     final container = new Element.tag("div");
     // Wrap the SVG string in <svg> so that SvgElements are created, rather than
     // HTMLElements.
-    container.innerHTML = '<svg version="1.1">$svg</svg>';
+    container.innerHtml = '<svg version="1.1">$svg</svg>';
     this.children = container.children[0].children;
   }
 
@@ -5058,7 +5120,8 @@
   }
 
   /// @domName SVGElement.ownerSVGElement; @docsEditable true
-  final SvgSvgElement ownerSVGElement;
+  @JSName('ownerSVGElement')
+  final SvgSvgElement ownerSvgElement;
 
   /// @domName SVGElement.viewportElement; @docsEditable true
   final SvgElement viewportElement;
@@ -5072,6 +5135,33 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
+/// @domName SVGException; @docsEditable true
+class SvgException native "*SVGException" {
+
+  static const int SVG_INVALID_VALUE_ERR = 1;
+
+  static const int SVG_MATRIX_NOT_INVERTABLE = 2;
+
+  static const int SVG_WRONG_TYPE_ERR = 0;
+
+  /// @domName SVGException.code; @docsEditable true
+  final int code;
+
+  /// @domName SVGException.message; @docsEditable true
+  final String message;
+
+  /// @domName SVGException.name; @docsEditable true
+  final String name;
+
+  /// @domName SVGException.toString; @docsEditable true
+  String toString() native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+/// @domName SVGSVGElement
 class SvgSvgElement extends SvgElement implements FitToViewBox, Tests, Stylable, Locatable, ExternalResourcesRequired, ZoomAndPan, LangSpace native "*SVGSVGElement" {
   factory SvgSvgElement() => _SvgSvgElementFactoryProvider.createSvgSvgElement();
 
@@ -5131,28 +5221,36 @@
   bool checkIntersection(SvgElement element, Rect rect) native;
 
   /// @domName SVGSVGElement.createSVGAngle; @docsEditable true
-  Angle createSVGAngle() native;
+  @JSName('createSVGAngle')
+  Angle createSvgAngle() native;
 
   /// @domName SVGSVGElement.createSVGLength; @docsEditable true
-  Length createSVGLength() native;
+  @JSName('createSVGLength')
+  Length createSvgLength() native;
 
   /// @domName SVGSVGElement.createSVGMatrix; @docsEditable true
-  Matrix createSVGMatrix() native;
+  @JSName('createSVGMatrix')
+  Matrix createSvgMatrix() native;
 
   /// @domName SVGSVGElement.createSVGNumber; @docsEditable true
-  Number createSVGNumber() native;
+  @JSName('createSVGNumber')
+  Number createSvgNumber() native;
 
   /// @domName SVGSVGElement.createSVGPoint; @docsEditable true
-  Point createSVGPoint() native;
+  @JSName('createSVGPoint')
+  Point createSvgPoint() native;
 
   /// @domName SVGSVGElement.createSVGRect; @docsEditable true
-  Rect createSVGRect() native;
+  @JSName('createSVGRect')
+  Rect createSvgRect() native;
 
   /// @domName SVGSVGElement.createSVGTransform; @docsEditable true
-  Transform createSVGTransform() native;
+  @JSName('createSVGTransform')
+  Transform createSvgTransform() native;
 
   /// @domName SVGSVGElement.createSVGTransformFromMatrix; @docsEditable true
-  Transform createSVGTransformFromMatrix(Matrix matrix) native;
+  @JSName('createSVGTransformFromMatrix')
+  Transform createSvgTransformFromMatrix(Matrix matrix) native;
 
   /// @domName SVGSVGElement.deselectAll; @docsEditable true
   void deselectAll() native;
@@ -5167,11 +5265,11 @@
   Element getElementById(String elementId) native;
 
   /// @domName SVGSVGElement.getEnclosureList; @docsEditable true
-  @Returns('_NodeList') @Creates('_NodeList')
+  @Returns('NodeList') @Creates('NodeList')
   List<Node> getEnclosureList(Rect rect, SvgElement referenceElement) native;
 
   /// @domName SVGSVGElement.getIntersectionList; @docsEditable true
-  @Returns('_NodeList') @Creates('_NodeList')
+  @Returns('NodeList') @Creates('NodeList')
   List<Node> getIntersectionList(Rect rect, SvgElement referenceElement) native;
 
   /// @domName SVGSVGElement.pauseAnimations; @docsEditable true
@@ -5225,16 +5323,19 @@
   Rect getBBox() native;
 
   /// @domName SVGLocatable.getCTM; @docsEditable true
-  Matrix getCTM() native;
+  @JSName('getCTM')
+  Matrix getCtm() native;
 
   /// @domName SVGLocatable.getScreenCTM; @docsEditable true
-  Matrix getScreenCTM() native;
+  @JSName('getScreenCTM')
+  Matrix getScreenCtm() native;
 
   /// @domName SVGLocatable.getTransformToElement; @docsEditable true
   Matrix getTransformToElement(SvgElement element) native;
 
   // From SVGStylable
 
+  // Shadowing definition.
   /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
@@ -5299,16 +5400,19 @@
   Rect getBBox() native;
 
   /// @domName SVGLocatable.getCTM; @docsEditable true
-  Matrix getCTM() native;
+  @JSName('getCTM')
+  Matrix getCtm() native;
 
   /// @domName SVGLocatable.getScreenCTM; @docsEditable true
-  Matrix getScreenCTM() native;
+  @JSName('getScreenCTM')
+  Matrix getScreenCtm() native;
 
   /// @domName SVGLocatable.getTransformToElement; @docsEditable true
   Matrix getTransformToElement(SvgElement element) native;
 
   // From SVGStylable
 
+  // Shadowing definition.
   /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
@@ -5370,6 +5474,7 @@
 
   // From SVGStylable
 
+  // Shadowing definition.
   /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
@@ -5483,6 +5588,7 @@
 
   // From SVGStylable
 
+  // Shadowing definition.
   /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
@@ -5528,10 +5634,12 @@
   Rect getBBox() native;
 
   /// @domName SVGLocatable.getCTM; @docsEditable true
-  Matrix getCTM() native;
+  @JSName('getCTM')
+  Matrix getCtm() native;
 
   /// @domName SVGLocatable.getScreenCTM; @docsEditable true
-  Matrix getScreenCTM() native;
+  @JSName('getScreenCTM')
+  Matrix getScreenCtm() native;
 
   /// @domName SVGLocatable.getTransformToElement; @docsEditable true
   Matrix getTransformToElement(SvgElement element) native;
@@ -5618,6 +5726,7 @@
 
   // From SVGStylable
 
+  // Shadowing definition.
   /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
@@ -5782,7 +5891,8 @@
   Transform consolidate() native;
 
   /// @domName SVGTransformList.createSVGTransformFromMatrix; @docsEditable true
-  Transform createSVGTransformFromMatrix(Matrix matrix) native;
+  @JSName('createSVGTransformFromMatrix')
+  Transform createSvgTransformFromMatrix(Matrix matrix) native;
 
   /// @domName SVGTransformList.getItem; @docsEditable true
   Transform getItem(int index) native;
@@ -5904,16 +6014,19 @@
   Rect getBBox() native;
 
   /// @domName SVGLocatable.getCTM; @docsEditable true
-  Matrix getCTM() native;
+  @JSName('getCTM')
+  Matrix getCtm() native;
 
   /// @domName SVGLocatable.getScreenCTM; @docsEditable true
-  Matrix getScreenCTM() native;
+  @JSName('getScreenCTM')
+  Matrix getScreenCtm() native;
 
   /// @domName SVGLocatable.getTransformToElement; @docsEditable true
   Matrix getTransformToElement(SvgElement element) native;
 
   // From SVGStylable
 
+  // Shadowing definition.
   /// @domName SVGStylable.className; @docsEditable true
   AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
diff --git a/sdk/lib/svg/dartium/svg_dartium.dart b/sdk/lib/svg/dartium/svg_dartium.dart
index 9a60401..490443c 100644
--- a/sdk/lib/svg/dartium/svg_dartium.dart
+++ b/sdk/lib/svg/dartium/svg_dartium.dart
@@ -32,7 +32,7 @@
       parentTag = new SvgSvgElement();
     }
 
-    parentTag.innerHTML = svg;
+    parentTag.innerHtml = svg;
     if (parentTag.elements.length == 1) return parentTag.elements.removeLast();
 
     throw new ArgumentError(
@@ -100,11 +100,11 @@
 
 
   /** @domName SVGAElement.getCTM */
-  Matrix getCTM() native "SVGAElement_getCTM_Callback";
+  Matrix getCtm() native "SVGAElement_getCTM_Callback";
 
 
   /** @domName SVGAElement.getScreenCTM */
-  Matrix getScreenCTM() native "SVGAElement_getScreenCTM_Callback";
+  Matrix getScreenCtm() native "SVGAElement_getScreenCTM_Callback";
 
 
   /** @domName SVGAElement.getTransformToElement */
@@ -957,11 +957,11 @@
 
 
   /** @domName SVGCircleElement.getCTM */
-  Matrix getCTM() native "SVGCircleElement_getCTM_Callback";
+  Matrix getCtm() native "SVGCircleElement_getCTM_Callback";
 
 
   /** @domName SVGCircleElement.getScreenCTM */
-  Matrix getScreenCTM() native "SVGCircleElement_getScreenCTM_Callback";
+  Matrix getScreenCtm() native "SVGCircleElement_getScreenCTM_Callback";
 
 
   /** @domName SVGCircleElement.getTransformToElement */
@@ -1051,11 +1051,11 @@
 
 
   /** @domName SVGClipPathElement.getCTM */
-  Matrix getCTM() native "SVGClipPathElement_getCTM_Callback";
+  Matrix getCtm() native "SVGClipPathElement_getCTM_Callback";
 
 
   /** @domName SVGClipPathElement.getScreenCTM */
-  Matrix getScreenCTM() native "SVGClipPathElement_getScreenCTM_Callback";
+  Matrix getScreenCtm() native "SVGClipPathElement_getScreenCTM_Callback";
 
 
   /** @domName SVGClipPathElement.getTransformToElement */
@@ -1127,11 +1127,11 @@
 
 
   /** @domName SVGColor.setRGBColor */
-  void setRGBColor(String rgbColor) native "SVGColor_setRGBColor_Callback";
+  void setRgbColor(String rgbColor) native "SVGColor_setRGBColor_Callback";
 
 
   /** @domName SVGColor.setRGBColorICCColor */
-  void setRGBColorICCColor(String rgbColor, String iccColor) native "SVGColor_setRGBColorICCColor_Callback";
+  void setRgbColorIccColor(String rgbColor, String iccColor) native "SVGColor_setRGBColorICCColor_Callback";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1279,11 +1279,11 @@
 
 
   /** @domName SVGDefsElement.getCTM */
-  Matrix getCTM() native "SVGDefsElement_getCTM_Callback";
+  Matrix getCtm() native "SVGDefsElement_getCTM_Callback";
 
 
   /** @domName SVGDefsElement.getScreenCTM */
-  Matrix getScreenCTM() native "SVGDefsElement_getScreenCTM_Callback";
+  Matrix getScreenCtm() native "SVGDefsElement_getScreenCTM_Callback";
 
 
   /** @domName SVGDefsElement.getTransformToElement */
@@ -1559,11 +1559,11 @@
 
 
   /** @domName SVGEllipseElement.getCTM */
-  Matrix getCTM() native "SVGEllipseElement_getCTM_Callback";
+  Matrix getCtm() native "SVGEllipseElement_getCTM_Callback";
 
 
   /** @domName SVGEllipseElement.getScreenCTM */
-  Matrix getScreenCTM() native "SVGEllipseElement_getScreenCTM_Callback";
+  Matrix getScreenCtm() native "SVGEllipseElement_getScreenCTM_Callback";
 
 
   /** @domName SVGEllipseElement.getTransformToElement */
@@ -1609,40 +1609,6 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGException
-class Exception extends NativeFieldWrapperClass1 {
-  Exception.internal();
-
-  static const int SVG_INVALID_VALUE_ERR = 1;
-
-  static const int SVG_MATRIX_NOT_INVERTABLE = 2;
-
-  static const int SVG_WRONG_TYPE_ERR = 0;
-
-
-  /** @domName SVGException.code */
-  int get code native "SVGException_code_Getter";
-
-
-  /** @domName SVGException.message */
-  String get message native "SVGException_message_Getter";
-
-
-  /** @domName SVGException.name */
-  String get name native "SVGException_name_Getter";
-
-
-  /** @domName SVGException.toString */
-  String toString() native "SVGException_toString_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
 /// @domName SVGExternalResourcesRequired
 class ExternalResourcesRequired extends NativeFieldWrapperClass1 {
   ExternalResourcesRequired.internal();
@@ -3209,11 +3175,11 @@
 
 
   /** @domName SVGForeignObjectElement.getCTM */
-  Matrix getCTM() native "SVGForeignObjectElement_getCTM_Callback";
+  Matrix getCtm() native "SVGForeignObjectElement_getCTM_Callback";
 
 
   /** @domName SVGForeignObjectElement.getScreenCTM */
-  Matrix getScreenCTM() native "SVGForeignObjectElement_getScreenCTM_Callback";
+  Matrix getScreenCtm() native "SVGForeignObjectElement_getScreenCTM_Callback";
 
 
   /** @domName SVGForeignObjectElement.getTransformToElement */
@@ -3299,11 +3265,11 @@
 
 
   /** @domName SVGGElement.getCTM */
-  Matrix getCTM() native "SVGGElement_getCTM_Callback";
+  Matrix getCtm() native "SVGGElement_getCTM_Callback";
 
 
   /** @domName SVGGElement.getScreenCTM */
-  Matrix getScreenCTM() native "SVGGElement_getScreenCTM_Callback";
+  Matrix getScreenCtm() native "SVGGElement_getScreenCTM_Callback";
 
 
   /** @domName SVGGElement.getTransformToElement */
@@ -3565,11 +3531,11 @@
 
 
   /** @domName SVGImageElement.getCTM */
-  Matrix getCTM() native "SVGImageElement_getCTM_Callback";
+  Matrix getCtm() native "SVGImageElement_getCTM_Callback";
 
 
   /** @domName SVGImageElement.getScreenCTM */
-  Matrix getScreenCTM() native "SVGImageElement_getScreenCTM_Callback";
+  Matrix getScreenCtm() native "SVGImageElement_getScreenCTM_Callback";
 
 
   /** @domName SVGImageElement.getTransformToElement */
@@ -3902,11 +3868,11 @@
 
 
   /** @domName SVGLineElement.getCTM */
-  Matrix getCTM() native "SVGLineElement_getCTM_Callback";
+  Matrix getCtm() native "SVGLineElement_getCTM_Callback";
 
 
   /** @domName SVGLineElement.getScreenCTM */
-  Matrix getScreenCTM() native "SVGLineElement_getScreenCTM_Callback";
+  Matrix getScreenCtm() native "SVGLineElement_getScreenCTM_Callback";
 
 
   /** @domName SVGLineElement.getTransformToElement */
@@ -4000,11 +3966,11 @@
 
 
   /** @domName SVGLocatable.getCTM */
-  Matrix getCTM() native "SVGLocatable_getCTM_Callback";
+  Matrix getCtm() native "SVGLocatable_getCTM_Callback";
 
 
   /** @domName SVGLocatable.getScreenCTM */
-  Matrix getScreenCTM() native "SVGLocatable_getScreenCTM_Callback";
+  Matrix getScreenCtm() native "SVGLocatable_getScreenCTM_Callback";
 
 
   /** @domName SVGLocatable.getTransformToElement */
@@ -4581,79 +4547,79 @@
 
 
   /** @domName SVGPathElement.createSVGPathSegArcAbs */
-  PathSegArcAbs createSVGPathSegArcAbs(num x, num y, num r1, num r2, num angle, bool largeArcFlag, bool sweepFlag) native "SVGPathElement_createSVGPathSegArcAbs_Callback";
+  PathSegArcAbs createSvgPathSegArcAbs(num x, num y, num r1, num r2, num angle, bool largeArcFlag, bool sweepFlag) native "SVGPathElement_createSVGPathSegArcAbs_Callback";
 
 
   /** @domName SVGPathElement.createSVGPathSegArcRel */
-  PathSegArcRel createSVGPathSegArcRel(num x, num y, num r1, num r2, num angle, bool largeArcFlag, bool sweepFlag) native "SVGPathElement_createSVGPathSegArcRel_Callback";
+  PathSegArcRel createSvgPathSegArcRel(num x, num y, num r1, num r2, num angle, bool largeArcFlag, bool sweepFlag) native "SVGPathElement_createSVGPathSegArcRel_Callback";
 
 
   /** @domName SVGPathElement.createSVGPathSegClosePath */
-  PathSegClosePath createSVGPathSegClosePath() native "SVGPathElement_createSVGPathSegClosePath_Callback";
+  PathSegClosePath createSvgPathSegClosePath() native "SVGPathElement_createSVGPathSegClosePath_Callback";
 
 
   /** @domName SVGPathElement.createSVGPathSegCurvetoCubicAbs */
-  PathSegCurvetoCubicAbs createSVGPathSegCurvetoCubicAbs(num x, num y, num x1, num y1, num x2, num y2) native "SVGPathElement_createSVGPathSegCurvetoCubicAbs_Callback";
+  PathSegCurvetoCubicAbs createSvgPathSegCurvetoCubicAbs(num x, num y, num x1, num y1, num x2, num y2) native "SVGPathElement_createSVGPathSegCurvetoCubicAbs_Callback";
 
 
   /** @domName SVGPathElement.createSVGPathSegCurvetoCubicRel */
-  PathSegCurvetoCubicRel createSVGPathSegCurvetoCubicRel(num x, num y, num x1, num y1, num x2, num y2) native "SVGPathElement_createSVGPathSegCurvetoCubicRel_Callback";
+  PathSegCurvetoCubicRel createSvgPathSegCurvetoCubicRel(num x, num y, num x1, num y1, num x2, num y2) native "SVGPathElement_createSVGPathSegCurvetoCubicRel_Callback";
 
 
   /** @domName SVGPathElement.createSVGPathSegCurvetoCubicSmoothAbs */
-  PathSegCurvetoCubicSmoothAbs createSVGPathSegCurvetoCubicSmoothAbs(num x, num y, num x2, num y2) native "SVGPathElement_createSVGPathSegCurvetoCubicSmoothAbs_Callback";
+  PathSegCurvetoCubicSmoothAbs createSvgPathSegCurvetoCubicSmoothAbs(num x, num y, num x2, num y2) native "SVGPathElement_createSVGPathSegCurvetoCubicSmoothAbs_Callback";
 
 
   /** @domName SVGPathElement.createSVGPathSegCurvetoCubicSmoothRel */
-  PathSegCurvetoCubicSmoothRel createSVGPathSegCurvetoCubicSmoothRel(num x, num y, num x2, num y2) native "SVGPathElement_createSVGPathSegCurvetoCubicSmoothRel_Callback";
+  PathSegCurvetoCubicSmoothRel createSvgPathSegCurvetoCubicSmoothRel(num x, num y, num x2, num y2) native "SVGPathElement_createSVGPathSegCurvetoCubicSmoothRel_Callback";
 
 
   /** @domName SVGPathElement.createSVGPathSegCurvetoQuadraticAbs */
-  PathSegCurvetoQuadraticAbs createSVGPathSegCurvetoQuadraticAbs(num x, num y, num x1, num y1) native "SVGPathElement_createSVGPathSegCurvetoQuadraticAbs_Callback";
+  PathSegCurvetoQuadraticAbs createSvgPathSegCurvetoQuadraticAbs(num x, num y, num x1, num y1) native "SVGPathElement_createSVGPathSegCurvetoQuadraticAbs_Callback";
 
 
   /** @domName SVGPathElement.createSVGPathSegCurvetoQuadraticRel */
-  PathSegCurvetoQuadraticRel createSVGPathSegCurvetoQuadraticRel(num x, num y, num x1, num y1) native "SVGPathElement_createSVGPathSegCurvetoQuadraticRel_Callback";
+  PathSegCurvetoQuadraticRel createSvgPathSegCurvetoQuadraticRel(num x, num y, num x1, num y1) native "SVGPathElement_createSVGPathSegCurvetoQuadraticRel_Callback";
 
 
   /** @domName SVGPathElement.createSVGPathSegCurvetoQuadraticSmoothAbs */
-  PathSegCurvetoQuadraticSmoothAbs createSVGPathSegCurvetoQuadraticSmoothAbs(num x, num y) native "SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothAbs_Callback";
+  PathSegCurvetoQuadraticSmoothAbs createSvgPathSegCurvetoQuadraticSmoothAbs(num x, num y) native "SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothAbs_Callback";
 
 
   /** @domName SVGPathElement.createSVGPathSegCurvetoQuadraticSmoothRel */
-  PathSegCurvetoQuadraticSmoothRel createSVGPathSegCurvetoQuadraticSmoothRel(num x, num y) native "SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothRel_Callback";
+  PathSegCurvetoQuadraticSmoothRel createSvgPathSegCurvetoQuadraticSmoothRel(num x, num y) native "SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothRel_Callback";
 
 
   /** @domName SVGPathElement.createSVGPathSegLinetoAbs */
-  PathSegLinetoAbs createSVGPathSegLinetoAbs(num x, num y) native "SVGPathElement_createSVGPathSegLinetoAbs_Callback";
+  PathSegLinetoAbs createSvgPathSegLinetoAbs(num x, num y) native "SVGPathElement_createSVGPathSegLinetoAbs_Callback";
 
 
   /** @domName SVGPathElement.createSVGPathSegLinetoHorizontalAbs */
-  PathSegLinetoHorizontalAbs createSVGPathSegLinetoHorizontalAbs(num x) native "SVGPathElement_createSVGPathSegLinetoHorizontalAbs_Callback";
+  PathSegLinetoHorizontalAbs createSvgPathSegLinetoHorizontalAbs(num x) native "SVGPathElement_createSVGPathSegLinetoHorizontalAbs_Callback";
 
 
   /** @domName SVGPathElement.createSVGPathSegLinetoHorizontalRel */
-  PathSegLinetoHorizontalRel createSVGPathSegLinetoHorizontalRel(num x) native "SVGPathElement_createSVGPathSegLinetoHorizontalRel_Callback";
+  PathSegLinetoHorizontalRel createSvgPathSegLinetoHorizontalRel(num x) native "SVGPathElement_createSVGPathSegLinetoHorizontalRel_Callback";
 
 
   /** @domName SVGPathElement.createSVGPathSegLinetoRel */
-  PathSegLinetoRel createSVGPathSegLinetoRel(num x, num y) native "SVGPathElement_createSVGPathSegLinetoRel_Callback";
+  PathSegLinetoRel createSvgPathSegLinetoRel(num x, num y) native "SVGPathElement_createSVGPathSegLinetoRel_Callback";
 
 
   /** @domName SVGPathElement.createSVGPathSegLinetoVerticalAbs */
-  PathSegLinetoVerticalAbs createSVGPathSegLinetoVerticalAbs(num y) native "SVGPathElement_createSVGPathSegLinetoVerticalAbs_Callback";
+  PathSegLinetoVerticalAbs createSvgPathSegLinetoVerticalAbs(num y) native "SVGPathElement_createSVGPathSegLinetoVerticalAbs_Callback";
 
 
   /** @domName SVGPathElement.createSVGPathSegLinetoVerticalRel */
-  PathSegLinetoVerticalRel createSVGPathSegLinetoVerticalRel(num y) native "SVGPathElement_createSVGPathSegLinetoVerticalRel_Callback";
+  PathSegLinetoVerticalRel createSvgPathSegLinetoVerticalRel(num y) native "SVGPathElement_createSVGPathSegLinetoVerticalRel_Callback";
 
 
   /** @domName SVGPathElement.createSVGPathSegMovetoAbs */
-  PathSegMovetoAbs createSVGPathSegMovetoAbs(num x, num y) native "SVGPathElement_createSVGPathSegMovetoAbs_Callback";
+  PathSegMovetoAbs createSvgPathSegMovetoAbs(num x, num y) native "SVGPathElement_createSVGPathSegMovetoAbs_Callback";
 
 
   /** @domName SVGPathElement.createSVGPathSegMovetoRel */
-  PathSegMovetoRel createSVGPathSegMovetoRel(num x, num y) native "SVGPathElement_createSVGPathSegMovetoRel_Callback";
+  PathSegMovetoRel createSvgPathSegMovetoRel(num x, num y) native "SVGPathElement_createSVGPathSegMovetoRel_Callback";
 
 
   /** @domName SVGPathElement.getPathSegAtLength */
@@ -4701,11 +4667,11 @@
 
 
   /** @domName SVGPathElement.getCTM */
-  Matrix getCTM() native "SVGPathElement_getCTM_Callback";
+  Matrix getCtm() native "SVGPathElement_getCTM_Callback";
 
 
   /** @domName SVGPathElement.getScreenCTM */
-  Matrix getScreenCTM() native "SVGPathElement_getScreenCTM_Callback";
+  Matrix getScreenCtm() native "SVGPathElement_getScreenCTM_Callback";
 
 
   /** @domName SVGPathElement.getTransformToElement */
@@ -5734,6 +5700,7 @@
 // WARNING: Do not edit - generated code.
 
 
+/// @domName SVGPoint
 class Point extends NativeFieldWrapperClass1 {
   factory Point(num x, num y) => _PointFactoryProvider.createPoint(x, y);
   Point.internal();
@@ -5858,11 +5825,11 @@
 
 
   /** @domName SVGPolygonElement.getCTM */
-  Matrix getCTM() native "SVGPolygonElement_getCTM_Callback";
+  Matrix getCtm() native "SVGPolygonElement_getCTM_Callback";
 
 
   /** @domName SVGPolygonElement.getScreenCTM */
-  Matrix getScreenCTM() native "SVGPolygonElement_getScreenCTM_Callback";
+  Matrix getScreenCtm() native "SVGPolygonElement_getScreenCTM_Callback";
 
 
   /** @domName SVGPolygonElement.getTransformToElement */
@@ -5956,11 +5923,11 @@
 
 
   /** @domName SVGPolylineElement.getCTM */
-  Matrix getCTM() native "SVGPolylineElement_getCTM_Callback";
+  Matrix getCtm() native "SVGPolylineElement_getCTM_Callback";
 
 
   /** @domName SVGPolylineElement.getScreenCTM */
-  Matrix getScreenCTM() native "SVGPolylineElement_getScreenCTM_Callback";
+  Matrix getScreenCtm() native "SVGPolylineElement_getScreenCTM_Callback";
 
 
   /** @domName SVGPolylineElement.getTransformToElement */
@@ -6208,11 +6175,11 @@
 
 
   /** @domName SVGRectElement.getCTM */
-  Matrix getCTM() native "SVGRectElement_getCTM_Callback";
+  Matrix getCtm() native "SVGRectElement_getCTM_Callback";
 
 
   /** @domName SVGRectElement.getScreenCTM */
-  Matrix getScreenCTM() native "SVGRectElement_getScreenCTM_Callback";
+  Matrix getScreenCtm() native "SVGRectElement_getScreenCTM_Callback";
 
 
   /** @domName SVGRectElement.getTransformToElement */
@@ -6616,6 +6583,7 @@
   }
 }
 
+/// @domName SVGElement
 class SvgElement extends Element {
   factory SvgElement.tag(String tag) =>
       _SvgElementFactoryProvider.createSvgElement_tag(tag);
@@ -6646,25 +6614,25 @@
     children.addAll(value);
   }
 
-  String get outerHTML {
+  String get outerHtml {
     final container = new Element.tag("div");
     final SvgElement cloned = this.clone(true);
     container.children.add(cloned);
-    return container.innerHTML;
+    return container.innerHtml;
   }
 
-  String get innerHTML {
+  String get innerHtml {
     final container = new Element.tag("div");
     final SvgElement cloned = this.clone(true);
     container.children.addAll(cloned.children);
-    return container.innerHTML;
+    return container.innerHtml;
   }
 
-  void set innerHTML(String svg) {
+  void set innerHtml(String svg) {
     final container = new Element.tag("div");
     // Wrap the SVG string in <svg> so that SvgElements are created, rather than
     // HTMLElements.
-    container.innerHTML = '<svg version="1.1">$svg</svg>';
+    container.innerHtml = '<svg version="1.1">$svg</svg>';
     this.children = container.children[0].children;
   }
 
@@ -6680,7 +6648,7 @@
 
 
   /** @domName SVGElement.ownerSVGElement */
-  SvgSvgElement get ownerSVGElement native "SVGElement_ownerSVGElement_Getter";
+  SvgSvgElement get ownerSvgElement native "SVGElement_ownerSVGElement_Getter";
 
 
   /** @domName SVGElement.viewportElement */
@@ -6699,7 +6667,42 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// WARNING: Do not edit - generated code.
 
+
+/// @domName SVGException
+class SvgException extends NativeFieldWrapperClass1 {
+  SvgException.internal();
+
+  static const int SVG_INVALID_VALUE_ERR = 1;
+
+  static const int SVG_MATRIX_NOT_INVERTABLE = 2;
+
+  static const int SVG_WRONG_TYPE_ERR = 0;
+
+
+  /** @domName SVGException.code */
+  int get code native "SVGException_code_Getter";
+
+
+  /** @domName SVGException.message */
+  String get message native "SVGException_message_Getter";
+
+
+  /** @domName SVGException.name */
+  String get name native "SVGException_name_Getter";
+
+
+  /** @domName SVGException.toString */
+  String toString() native "SVGException_toString_Callback";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+/// @domName SVGSVGElement
 class SvgSvgElement extends SvgElement implements FitToViewBox, Tests, Stylable, Locatable, ExternalResourcesRequired, ZoomAndPan, LangSpace {
   factory SvgSvgElement() => _SvgSvgElementFactoryProvider.createSvgSvgElement();
 
@@ -6791,35 +6794,35 @@
 
 
   /** @domName SVGSVGElement.createSVGAngle */
-  Angle createSVGAngle() native "SVGSVGElement_createSVGAngle_Callback";
+  Angle createSvgAngle() native "SVGSVGElement_createSVGAngle_Callback";
 
 
   /** @domName SVGSVGElement.createSVGLength */
-  Length createSVGLength() native "SVGSVGElement_createSVGLength_Callback";
+  Length createSvgLength() native "SVGSVGElement_createSVGLength_Callback";
 
 
   /** @domName SVGSVGElement.createSVGMatrix */
-  Matrix createSVGMatrix() native "SVGSVGElement_createSVGMatrix_Callback";
+  Matrix createSvgMatrix() native "SVGSVGElement_createSVGMatrix_Callback";
 
 
   /** @domName SVGSVGElement.createSVGNumber */
-  Number createSVGNumber() native "SVGSVGElement_createSVGNumber_Callback";
+  Number createSvgNumber() native "SVGSVGElement_createSVGNumber_Callback";
 
 
   /** @domName SVGSVGElement.createSVGPoint */
-  Point createSVGPoint() native "SVGSVGElement_createSVGPoint_Callback";
+  Point createSvgPoint() native "SVGSVGElement_createSVGPoint_Callback";
 
 
   /** @domName SVGSVGElement.createSVGRect */
-  Rect createSVGRect() native "SVGSVGElement_createSVGRect_Callback";
+  Rect createSvgRect() native "SVGSVGElement_createSVGRect_Callback";
 
 
   /** @domName SVGSVGElement.createSVGTransform */
-  Transform createSVGTransform() native "SVGSVGElement_createSVGTransform_Callback";
+  Transform createSvgTransform() native "SVGSVGElement_createSVGTransform_Callback";
 
 
   /** @domName SVGSVGElement.createSVGTransformFromMatrix */
-  Transform createSVGTransformFromMatrix(Matrix matrix) native "SVGSVGElement_createSVGTransformFromMatrix_Callback";
+  Transform createSvgTransformFromMatrix(Matrix matrix) native "SVGSVGElement_createSVGTransformFromMatrix_Callback";
 
 
   /** @domName SVGSVGElement.deselectAll */
@@ -6911,11 +6914,11 @@
 
 
   /** @domName SVGSVGElement.getCTM */
-  Matrix getCTM() native "SVGSVGElement_getCTM_Callback";
+  Matrix getCtm() native "SVGSVGElement_getCTM_Callback";
 
 
   /** @domName SVGSVGElement.getScreenCTM */
-  Matrix getScreenCTM() native "SVGSVGElement_getScreenCTM_Callback";
+  Matrix getScreenCtm() native "SVGSVGElement_getScreenCTM_Callback";
 
 
   /** @domName SVGSVGElement.getTransformToElement */
@@ -7005,11 +7008,11 @@
 
 
   /** @domName SVGSwitchElement.getCTM */
-  Matrix getCTM() native "SVGSwitchElement_getCTM_Callback";
+  Matrix getCtm() native "SVGSwitchElement_getCTM_Callback";
 
 
   /** @domName SVGSwitchElement.getScreenCTM */
-  Matrix getScreenCTM() native "SVGSwitchElement_getScreenCTM_Callback";
+  Matrix getScreenCtm() native "SVGSwitchElement_getScreenCTM_Callback";
 
 
   /** @domName SVGSwitchElement.getTransformToElement */
@@ -7299,11 +7302,11 @@
 
 
   /** @domName SVGTextElement.getCTM */
-  Matrix getCTM() native "SVGTextElement_getCTM_Callback";
+  Matrix getCtm() native "SVGTextElement_getCTM_Callback";
 
 
   /** @domName SVGTextElement.getScreenCTM */
-  Matrix getScreenCTM() native "SVGTextElement_getScreenCTM_Callback";
+  Matrix getScreenCtm() native "SVGTextElement_getScreenCTM_Callback";
 
 
   /** @domName SVGTextElement.getTransformToElement */
@@ -7604,7 +7607,7 @@
 
 
   /** @domName SVGTransformList.createSVGTransformFromMatrix */
-  Transform createSVGTransformFromMatrix(Matrix matrix) native "SVGTransformList_createSVGTransformFromMatrix_Callback";
+  Transform createSvgTransformFromMatrix(Matrix matrix) native "SVGTransformList_createSVGTransformFromMatrix_Callback";
 
 
   /** @domName SVGTransformList.getItem */
@@ -7656,11 +7659,11 @@
 
 
   /** @domName SVGTransformable.getCTM */
-  Matrix getCTM() native "SVGTransformable_getCTM_Callback";
+  Matrix getCtm() native "SVGTransformable_getCTM_Callback";
 
 
   /** @domName SVGTransformable.getScreenCTM */
-  Matrix getScreenCTM() native "SVGTransformable_getScreenCTM_Callback";
+  Matrix getScreenCtm() native "SVGTransformable_getScreenCTM_Callback";
 
 
   /** @domName SVGTransformable.getTransformToElement */
@@ -7772,11 +7775,11 @@
 
 
   /** @domName SVGUseElement.getCTM */
-  Matrix getCTM() native "SVGUseElement_getCTM_Callback";
+  Matrix getCtm() native "SVGUseElement_getCTM_Callback";
 
 
   /** @domName SVGUseElement.getScreenCTM */
-  Matrix getScreenCTM() native "SVGUseElement_getScreenCTM_Callback";
+  Matrix getScreenCtm() native "SVGUseElement_getScreenCTM_Callback";
 
 
   /** @domName SVGUseElement.getTransformToElement */
diff --git a/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart b/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
new file mode 100644
index 0000000..4a50eba
--- /dev/null
+++ b/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
@@ -0,0 +1,699 @@
+library web_audio;
+
+import 'dart:html';
+// DO NOT EDIT
+// Auto-generated dart:audio library.
+
+
+
+
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+/// @domName AnalyserNode; @docsEditable true
+class AnalyserNode extends AudioNode native "*AnalyserNode" {
+
+  /// @domName AnalyserNode.fftSize; @docsEditable true
+  int fftSize;
+
+  /// @domName AnalyserNode.frequencyBinCount; @docsEditable true
+  final int frequencyBinCount;
+
+  /// @domName AnalyserNode.maxDecibels; @docsEditable true
+  num maxDecibels;
+
+  /// @domName AnalyserNode.minDecibels; @docsEditable true
+  num minDecibels;
+
+  /// @domName AnalyserNode.smoothingTimeConstant; @docsEditable true
+  num smoothingTimeConstant;
+
+  /// @domName AnalyserNode.getByteFrequencyData; @docsEditable true
+  void getByteFrequencyData(Uint8Array array) native;
+
+  /// @domName AnalyserNode.getByteTimeDomainData; @docsEditable true
+  void getByteTimeDomainData(Uint8Array array) native;
+
+  /// @domName AnalyserNode.getFloatFrequencyData; @docsEditable true
+  void getFloatFrequencyData(Float32Array array) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+/// @domName AudioBuffer; @docsEditable true
+class AudioBuffer native "*AudioBuffer" {
+
+  /// @domName AudioBuffer.duration; @docsEditable true
+  final num duration;
+
+  /// @domName AudioBuffer.gain; @docsEditable true
+  num gain;
+
+  /// @domName AudioBuffer.length; @docsEditable true
+  final int length;
+
+  /// @domName AudioBuffer.numberOfChannels; @docsEditable true
+  final int numberOfChannels;
+
+  /// @domName AudioBuffer.sampleRate; @docsEditable true
+  final num sampleRate;
+
+  /// @domName AudioBuffer.getChannelData; @docsEditable true
+  Float32Array getChannelData(int channelIndex) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+typedef void AudioBufferCallback(AudioBuffer audioBuffer);
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+/// @domName AudioBufferSourceNode
+class AudioBufferSourceNode extends AudioSourceNode native "*AudioBufferSourceNode" {
+
+  // TODO(efortuna): Remove these methods when Chrome stable also uses start
+  // instead of noteOn.
+  void start(num when, [num grainOffset, num grainDuration]) {
+    if (JS('bool', '!!#.start', this)) {
+      if (?grainDuration) {
+        JS('void', '#.start(#, #, #)', this, when, grainOffset, grainDuration);
+      } else if (?grainOffset) {
+        JS('void', '#.start(#, #)', this, when, grainOffset);
+      } else {
+        JS('void', '#.start(#)', this, when);
+      }
+    } else {
+      if (?grainDuration) {
+        JS('void', '#.noteOn(#, #, #)', this, when, grainOffset, grainDuration);
+      } else if (?grainOffset) {
+        JS('void', '#.noteOn(#, #)', this, when, grainOffset);
+      } else {
+        JS('void', '#.noteOn(#)', this, when);
+      }
+    }
+  }
+
+  void stop(num when) {
+    if (JS('bool', '!!#.stop', this)) {
+      JS('void', '#.stop(#)', this, when);
+    } else {
+      JS('void', '#.noteOff(#)', this, when);
+    }
+  }
+
+  static const int FINISHED_STATE = 3;
+
+  static const int PLAYING_STATE = 2;
+
+  static const int SCHEDULED_STATE = 1;
+
+  static const int UNSCHEDULED_STATE = 0;
+
+  /// @domName AudioBufferSourceNode.buffer; @docsEditable true
+  AudioBuffer buffer;
+
+  /// @domName AudioBufferSourceNode.gain; @docsEditable true
+  final AudioGain gain;
+
+  /// @domName AudioBufferSourceNode.loop; @docsEditable true
+  bool loop;
+
+  /// @domName AudioBufferSourceNode.loopEnd; @docsEditable true
+  num loopEnd;
+
+  /// @domName AudioBufferSourceNode.loopStart; @docsEditable true
+  num loopStart;
+
+  /// @domName AudioBufferSourceNode.playbackRate; @docsEditable true
+  final AudioParam playbackRate;
+
+  /// @domName AudioBufferSourceNode.playbackState; @docsEditable true
+  final int playbackState;
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+/// @domName AudioContext
+class AudioContext extends EventTarget native "*AudioContext" {
+  factory AudioContext() => JS('AudioContext',
+      'new (window.AudioContext || window.webkitAudioContext)()');
+
+
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  AudioContextEvents get on =>
+    new AudioContextEvents(this);
+
+  /// @domName AudioContext.activeSourceCount; @docsEditable true
+  final int activeSourceCount;
+
+  /// @domName AudioContext.currentTime; @docsEditable true
+  final num currentTime;
+
+  /// @domName AudioContext.destination; @docsEditable true
+  final AudioDestinationNode destination;
+
+  /// @domName AudioContext.listener; @docsEditable true
+  final AudioListener listener;
+
+  /// @domName AudioContext.sampleRate; @docsEditable true
+  final num sampleRate;
+
+  /// @domName AudioContext.createAnalyser; @docsEditable true
+  AnalyserNode createAnalyser() native;
+
+  /// @domName AudioContext.createBiquadFilter; @docsEditable true
+  BiquadFilterNode createBiquadFilter() native;
+
+  /// @domName AudioContext.createBuffer; @docsEditable true
+  AudioBuffer createBuffer(buffer_OR_numberOfChannels, mixToMono_OR_numberOfFrames, [num sampleRate]) native;
+
+  /// @domName AudioContext.createBufferSource; @docsEditable true
+  AudioBufferSourceNode createBufferSource() native;
+
+  /// @domName AudioContext.createChannelMerger; @docsEditable true
+  ChannelMergerNode createChannelMerger([int numberOfInputs]) native;
+
+  /// @domName AudioContext.createChannelSplitter; @docsEditable true
+  ChannelSplitterNode createChannelSplitter([int numberOfOutputs]) native;
+
+  /// @domName AudioContext.createConvolver; @docsEditable true
+  ConvolverNode createConvolver() native;
+
+  /// @domName AudioContext.createDelay; @docsEditable true
+  DelayNode createDelay([num maxDelayTime]) native;
+
+  /// @domName AudioContext.createDynamicsCompressor; @docsEditable true
+  DynamicsCompressorNode createDynamicsCompressor() native;
+
+  /// @domName AudioContext.createMediaElementSource; @docsEditable true
+  MediaElementAudioSourceNode createMediaElementSource(MediaElement mediaElement) native;
+
+  /// @domName AudioContext.createMediaStreamSource; @docsEditable true
+  MediaStreamAudioSourceNode createMediaStreamSource(MediaStream mediaStream) native;
+
+  /// @domName AudioContext.createOscillator; @docsEditable true
+  OscillatorNode createOscillator() native;
+
+  /// @domName AudioContext.createPanner; @docsEditable true
+  PannerNode createPanner() native;
+
+  /// @domName AudioContext.createWaveShaper; @docsEditable true
+  WaveShaperNode createWaveShaper() native;
+
+  /// @domName AudioContext.createWaveTable; @docsEditable true
+  WaveTable createWaveTable(Float32Array real, Float32Array imag) native;
+
+  /// @domName AudioContext.decodeAudioData; @docsEditable true
+  void decodeAudioData(ArrayBuffer audioData, AudioBufferCallback successCallback, [AudioBufferCallback errorCallback]) native;
+
+  /// @domName AudioContext.startRendering; @docsEditable true
+  void startRendering() native;
+
+  GainNode createGain() {
+    if (JS('bool', '#.createGain !== undefined', this)) {
+      return JS('GainNode', '#.createGain()', this);
+    } else {
+      return JS('GainNode', '#.createGainNode()', this);
+    }
+  }
+
+  ScriptProcessorNode createScriptProcessor(int bufferSize,
+      [int numberOfInputChannels, int numberOfOutputChannels]) {
+    var function = JS('dynamic', '#.createScriptProcessor || '
+        '#.createJavaScriptNode', this, this);
+    if (?numberOfOutputChannels) {
+      return JS('ScriptProcessorNode', '#.call(#, #, #, #)', function, this,
+          bufferSize, numberOfInputChannels, numberOfOutputChannels);
+    } else if (?numberOfInputChannels) {
+      return JS('ScriptProcessorNode', '#.call(#, #, #)', function, this,
+          bufferSize, numberOfInputChannels);
+    } else {
+      return JS('ScriptProcessorNode', '#.call(#, #)', function, this,
+          bufferSize);
+    }
+  }
+}
+
+class AudioContextEvents extends Events {
+  AudioContextEvents(EventTarget _ptr) : super(_ptr);
+
+  EventListenerList get complete => this['complete'];
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+/// @domName AudioDestinationNode; @docsEditable true
+class AudioDestinationNode extends AudioNode native "*AudioDestinationNode" {
+
+  /// @domName AudioDestinationNode.numberOfChannels; @docsEditable true
+  final int numberOfChannels;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+/// @domName HTMLAudioElement; @docsEditable true
+class AudioElement extends MediaElement native "*HTMLAudioElement" {
+
+  factory AudioElement([String src]) {
+    if (!?src) {
+      return _AudioElementFactoryProvider.createAudioElement();
+    }
+    return _AudioElementFactoryProvider.createAudioElement(src);
+  }
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+/// @domName AudioGain; @docsEditable true
+class AudioGain extends AudioParam native "*AudioGain" {
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+/// @domName AudioListener; @docsEditable true
+class AudioListener native "*AudioListener" {
+
+  /// @domName AudioListener.dopplerFactor; @docsEditable true
+  num dopplerFactor;
+
+  /// @domName AudioListener.speedOfSound; @docsEditable true
+  num speedOfSound;
+
+  /// @domName AudioListener.setOrientation; @docsEditable true
+  void setOrientation(num x, num y, num z, num xUp, num yUp, num zUp) native;
+
+  /// @domName AudioListener.setPosition; @docsEditable true
+  void setPosition(num x, num y, num z) native;
+
+  /// @domName AudioListener.setVelocity; @docsEditable true
+  void setVelocity(num x, num y, num z) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+/// @domName AudioNode; @docsEditable true
+class AudioNode native "*AudioNode" {
+
+  /// @domName AudioNode.context; @docsEditable true
+  final AudioContext context;
+
+  /// @domName AudioNode.numberOfInputs; @docsEditable true
+  final int numberOfInputs;
+
+  /// @domName AudioNode.numberOfOutputs; @docsEditable true
+  final int numberOfOutputs;
+
+  /// @domName AudioNode.connect; @docsEditable true
+  void connect(destination, int output, [int input]) native;
+
+  /// @domName AudioNode.disconnect; @docsEditable true
+  void disconnect(int output) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+/// @domName AudioParam; @docsEditable true
+class AudioParam native "*AudioParam" {
+
+  /// @domName AudioParam.defaultValue; @docsEditable true
+  final num defaultValue;
+
+  /// @domName AudioParam.maxValue; @docsEditable true
+  final num maxValue;
+
+  /// @domName AudioParam.minValue; @docsEditable true
+  final num minValue;
+
+  /// @domName AudioParam.name; @docsEditable true
+  final String name;
+
+  /// @domName AudioParam.units; @docsEditable true
+  final int units;
+
+  /// @domName AudioParam.value; @docsEditable true
+  num value;
+
+  /// @domName AudioParam.cancelScheduledValues; @docsEditable true
+  void cancelScheduledValues(num startTime) native;
+
+  /// @domName AudioParam.exponentialRampToValueAtTime; @docsEditable true
+  void exponentialRampToValueAtTime(num value, num time) native;
+
+  /// @domName AudioParam.linearRampToValueAtTime; @docsEditable true
+  void linearRampToValueAtTime(num value, num time) native;
+
+  /// @domName AudioParam.setTargetAtTime; @docsEditable true
+  void setTargetAtTime(num target, num time, num timeConstant) native;
+
+  /// @domName AudioParam.setValueAtTime; @docsEditable true
+  void setValueAtTime(num value, num time) native;
+
+  /// @domName AudioParam.setValueCurveAtTime; @docsEditable true
+  void setValueCurveAtTime(Float32Array values, num time, num duration) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+/// @domName AudioProcessingEvent; @docsEditable true
+class AudioProcessingEvent extends Event native "*AudioProcessingEvent" {
+
+  /// @domName AudioProcessingEvent.inputBuffer; @docsEditable true
+  final AudioBuffer inputBuffer;
+
+  /// @domName AudioProcessingEvent.outputBuffer; @docsEditable true
+  final AudioBuffer outputBuffer;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+/// @domName AudioSourceNode; @docsEditable true
+class AudioSourceNode extends AudioNode native "*AudioSourceNode" {
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+/// @domName BiquadFilterNode; @docsEditable true
+class BiquadFilterNode extends AudioNode native "*BiquadFilterNode" {
+
+  static const int ALLPASS = 7;
+
+  static const int BANDPASS = 2;
+
+  static const int HIGHPASS = 1;
+
+  static const int HIGHSHELF = 4;
+
+  static const int LOWPASS = 0;
+
+  static const int LOWSHELF = 3;
+
+  static const int NOTCH = 6;
+
+  static const int PEAKING = 5;
+
+  /// @domName BiquadFilterNode.Q; @docsEditable true
+  final AudioParam Q;
+
+  /// @domName BiquadFilterNode.frequency; @docsEditable true
+  final AudioParam frequency;
+
+  /// @domName BiquadFilterNode.gain; @docsEditable true
+  final AudioParam gain;
+
+  /// @domName BiquadFilterNode.type; @docsEditable true
+  int type;
+
+  /// @domName BiquadFilterNode.getFrequencyResponse; @docsEditable true
+  void getFrequencyResponse(Float32Array frequencyHz, Float32Array magResponse, Float32Array phaseResponse) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+/// @domName ChannelMergerNode; @docsEditable true
+class ChannelMergerNode extends AudioNode native "*ChannelMergerNode" {
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+/// @domName ChannelSplitterNode; @docsEditable true
+class ChannelSplitterNode extends AudioNode native "*ChannelSplitterNode" {
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+/// @domName ConvolverNode; @docsEditable true
+class ConvolverNode extends AudioNode native "*ConvolverNode" {
+
+  /// @domName ConvolverNode.buffer; @docsEditable true
+  AudioBuffer buffer;
+
+  /// @domName ConvolverNode.normalize; @docsEditable true
+  bool normalize;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+/// @domName DelayNode; @docsEditable true
+class DelayNode extends AudioNode native "*DelayNode" {
+
+  /// @domName DelayNode.delayTime; @docsEditable true
+  final AudioParam delayTime;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+/// @domName DynamicsCompressorNode; @docsEditable true
+class DynamicsCompressorNode extends AudioNode native "*DynamicsCompressorNode" {
+
+  /// @domName DynamicsCompressorNode.attack; @docsEditable true
+  final AudioParam attack;
+
+  /// @domName DynamicsCompressorNode.knee; @docsEditable true
+  final AudioParam knee;
+
+  /// @domName DynamicsCompressorNode.ratio; @docsEditable true
+  final AudioParam ratio;
+
+  /// @domName DynamicsCompressorNode.reduction; @docsEditable true
+  final AudioParam reduction;
+
+  /// @domName DynamicsCompressorNode.release; @docsEditable true
+  final AudioParam release;
+
+  /// @domName DynamicsCompressorNode.threshold; @docsEditable true
+  final AudioParam threshold;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+/// @domName GainNode; @docsEditable true
+class GainNode extends AudioNode native "*GainNode" {
+
+  /// @domName GainNode.gain; @docsEditable true
+  final AudioGain gain;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+/// @domName MediaElementAudioSourceNode; @docsEditable true
+class MediaElementAudioSourceNode extends AudioSourceNode native "*MediaElementAudioSourceNode" {
+
+  /// @domName MediaElementAudioSourceNode.mediaElement; @docsEditable true
+  final MediaElement mediaElement;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+/// @domName MediaStreamAudioSourceNode; @docsEditable true
+class MediaStreamAudioSourceNode extends AudioSourceNode native "*MediaStreamAudioSourceNode" {
+
+  /// @domName MediaStreamAudioSourceNode.mediaStream; @docsEditable true
+  final MediaStream mediaStream;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+/// @domName OfflineAudioCompletionEvent; @docsEditable true
+class OfflineAudioCompletionEvent extends Event native "*OfflineAudioCompletionEvent" {
+
+  /// @domName OfflineAudioCompletionEvent.renderedBuffer; @docsEditable true
+  final AudioBuffer renderedBuffer;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+/// @domName OscillatorNode; @docsEditable true
+class OscillatorNode extends AudioSourceNode native "*OscillatorNode" {
+
+  static const int CUSTOM = 4;
+
+  static const int FINISHED_STATE = 3;
+
+  static const int PLAYING_STATE = 2;
+
+  static const int SAWTOOTH = 2;
+
+  static const int SCHEDULED_STATE = 1;
+
+  static const int SINE = 0;
+
+  static const int SQUARE = 1;
+
+  static const int TRIANGLE = 3;
+
+  static const int UNSCHEDULED_STATE = 0;
+
+  /// @domName OscillatorNode.detune; @docsEditable true
+  final AudioParam detune;
+
+  /// @domName OscillatorNode.frequency; @docsEditable true
+  final AudioParam frequency;
+
+  /// @domName OscillatorNode.playbackState; @docsEditable true
+  final int playbackState;
+
+  /// @domName OscillatorNode.type; @docsEditable true
+  int type;
+
+  /// @domName OscillatorNode.setWaveTable; @docsEditable true
+  void setWaveTable(WaveTable waveTable) native;
+
+  /// @domName OscillatorNode.start; @docsEditable true
+  void start(num when) native;
+
+  /// @domName OscillatorNode.stop; @docsEditable true
+  void stop(num when) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+/// @domName PannerNode; @docsEditable true
+class PannerNode extends AudioNode native "*PannerNode" {
+
+  static const int EQUALPOWER = 0;
+
+  static const int EXPONENTIAL_DISTANCE = 2;
+
+  static const int HRTF = 1;
+
+  static const int INVERSE_DISTANCE = 1;
+
+  static const int LINEAR_DISTANCE = 0;
+
+  static const int SOUNDFIELD = 2;
+
+  /// @domName PannerNode.coneGain; @docsEditable true
+  final AudioGain coneGain;
+
+  /// @domName PannerNode.coneInnerAngle; @docsEditable true
+  num coneInnerAngle;
+
+  /// @domName PannerNode.coneOuterAngle; @docsEditable true
+  num coneOuterAngle;
+
+  /// @domName PannerNode.coneOuterGain; @docsEditable true
+  num coneOuterGain;
+
+  /// @domName PannerNode.distanceGain; @docsEditable true
+  final AudioGain distanceGain;
+
+  /// @domName PannerNode.distanceModel; @docsEditable true
+  int distanceModel;
+
+  /// @domName PannerNode.maxDistance; @docsEditable true
+  num maxDistance;
+
+  /// @domName PannerNode.panningModel; @docsEditable true
+  int panningModel;
+
+  /// @domName PannerNode.refDistance; @docsEditable true
+  num refDistance;
+
+  /// @domName PannerNode.rolloffFactor; @docsEditable true
+  num rolloffFactor;
+
+  /// @domName PannerNode.setOrientation; @docsEditable true
+  void setOrientation(num x, num y, num z) native;
+
+  /// @domName PannerNode.setPosition; @docsEditable true
+  void setPosition(num x, num y, num z) native;
+
+  /// @domName PannerNode.setVelocity; @docsEditable true
+  void setVelocity(num x, num y, num z) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+/// @domName ScriptProcessorNode; @docsEditable true
+class ScriptProcessorNode extends AudioNode implements EventTarget native "*ScriptProcessorNode" {
+
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  ScriptProcessorNodeEvents get on =>
+    new ScriptProcessorNodeEvents(this);
+
+  /// @domName ScriptProcessorNode.bufferSize; @docsEditable true
+  final int bufferSize;
+}
+
+class ScriptProcessorNodeEvents extends Events {
+  ScriptProcessorNodeEvents(EventTarget _ptr) : super(_ptr);
+
+  EventListenerList get audioProcess => this['audioprocess'];
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+/// @domName WaveShaperNode; @docsEditable true
+class WaveShaperNode extends AudioNode native "*WaveShaperNode" {
+
+  /// @domName WaveShaperNode.curve; @docsEditable true
+  Float32Array curve;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+class _AudioElementFactoryProvider {
+  static AudioElement createAudioElement([String src = null]) {
+    if (src == null) return JS('AudioElement', 'new Audio()');
+    return JS('AudioElement', 'new Audio(#)', src);
+  }
+}
diff --git a/sdk/lib/web_audio/dartium/web_audio_dartium.dart b/sdk/lib/web_audio/dartium/web_audio_dartium.dart
new file mode 100644
index 0000000..908a772
--- /dev/null
+++ b/sdk/lib/web_audio/dartium/web_audio_dartium.dart
@@ -0,0 +1,1069 @@
+library web_audio;
+
+import 'dart:html';
+import 'dart:nativewrappers';
+// DO NOT EDIT
+// Auto-generated dart:audio library.
+
+
+
+
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+/// @domName AnalyserNode
+class AnalyserNode extends AudioNode {
+  AnalyserNode.internal(): super.internal();
+
+
+  /** @domName AnalyserNode.fftSize */
+  int get fftSize native "AnalyserNode_fftSize_Getter";
+
+
+  /** @domName AnalyserNode.fftSize */
+  void set fftSize(int value) native "AnalyserNode_fftSize_Setter";
+
+
+  /** @domName AnalyserNode.frequencyBinCount */
+  int get frequencyBinCount native "AnalyserNode_frequencyBinCount_Getter";
+
+
+  /** @domName AnalyserNode.maxDecibels */
+  num get maxDecibels native "AnalyserNode_maxDecibels_Getter";
+
+
+  /** @domName AnalyserNode.maxDecibels */
+  void set maxDecibels(num value) native "AnalyserNode_maxDecibels_Setter";
+
+
+  /** @domName AnalyserNode.minDecibels */
+  num get minDecibels native "AnalyserNode_minDecibels_Getter";
+
+
+  /** @domName AnalyserNode.minDecibels */
+  void set minDecibels(num value) native "AnalyserNode_minDecibels_Setter";
+
+
+  /** @domName AnalyserNode.smoothingTimeConstant */
+  num get smoothingTimeConstant native "AnalyserNode_smoothingTimeConstant_Getter";
+
+
+  /** @domName AnalyserNode.smoothingTimeConstant */
+  void set smoothingTimeConstant(num value) native "AnalyserNode_smoothingTimeConstant_Setter";
+
+
+  /** @domName AnalyserNode.getByteFrequencyData */
+  void getByteFrequencyData(Uint8Array array) native "AnalyserNode_getByteFrequencyData_Callback";
+
+
+  /** @domName AnalyserNode.getByteTimeDomainData */
+  void getByteTimeDomainData(Uint8Array array) native "AnalyserNode_getByteTimeDomainData_Callback";
+
+
+  /** @domName AnalyserNode.getFloatFrequencyData */
+  void getFloatFrequencyData(Float32Array array) native "AnalyserNode_getFloatFrequencyData_Callback";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+/// @domName AudioBuffer
+class AudioBuffer extends NativeFieldWrapperClass1 {
+  AudioBuffer.internal();
+
+
+  /** @domName AudioBuffer.duration */
+  num get duration native "AudioBuffer_duration_Getter";
+
+
+  /** @domName AudioBuffer.gain */
+  num get gain native "AudioBuffer_gain_Getter";
+
+
+  /** @domName AudioBuffer.gain */
+  void set gain(num value) native "AudioBuffer_gain_Setter";
+
+
+  /** @domName AudioBuffer.length */
+  int get length native "AudioBuffer_length_Getter";
+
+
+  /** @domName AudioBuffer.numberOfChannels */
+  int get numberOfChannels native "AudioBuffer_numberOfChannels_Getter";
+
+
+  /** @domName AudioBuffer.sampleRate */
+  num get sampleRate native "AudioBuffer_sampleRate_Getter";
+
+
+  /** @domName AudioBuffer.getChannelData */
+  Float32Array getChannelData(int channelIndex) native "AudioBuffer_getChannelData_Callback";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+typedef void AudioBufferCallback(AudioBuffer audioBuffer);
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+/// @domName AudioBufferSourceNode
+class AudioBufferSourceNode extends AudioSourceNode {
+  AudioBufferSourceNode.internal(): super.internal();
+
+  static const int FINISHED_STATE = 3;
+
+  static const int PLAYING_STATE = 2;
+
+  static const int SCHEDULED_STATE = 1;
+
+  static const int UNSCHEDULED_STATE = 0;
+
+
+  /** @domName AudioBufferSourceNode.buffer */
+  AudioBuffer get buffer native "AudioBufferSourceNode_buffer_Getter";
+
+
+  /** @domName AudioBufferSourceNode.buffer */
+  void set buffer(AudioBuffer value) native "AudioBufferSourceNode_buffer_Setter";
+
+
+  /** @domName AudioBufferSourceNode.gain */
+  AudioGain get gain native "AudioBufferSourceNode_gain_Getter";
+
+
+  /** @domName AudioBufferSourceNode.loop */
+  bool get loop native "AudioBufferSourceNode_loop_Getter";
+
+
+  /** @domName AudioBufferSourceNode.loop */
+  void set loop(bool value) native "AudioBufferSourceNode_loop_Setter";
+
+
+  /** @domName AudioBufferSourceNode.loopEnd */
+  num get loopEnd native "AudioBufferSourceNode_loopEnd_Getter";
+
+
+  /** @domName AudioBufferSourceNode.loopEnd */
+  void set loopEnd(num value) native "AudioBufferSourceNode_loopEnd_Setter";
+
+
+  /** @domName AudioBufferSourceNode.loopStart */
+  num get loopStart native "AudioBufferSourceNode_loopStart_Getter";
+
+
+  /** @domName AudioBufferSourceNode.loopStart */
+  void set loopStart(num value) native "AudioBufferSourceNode_loopStart_Setter";
+
+
+  /** @domName AudioBufferSourceNode.playbackRate */
+  AudioParam get playbackRate native "AudioBufferSourceNode_playbackRate_Getter";
+
+
+  /** @domName AudioBufferSourceNode.playbackState */
+  int get playbackState native "AudioBufferSourceNode_playbackState_Getter";
+
+  void start(/*double*/ when, [/*double*/ grainOffset, /*double*/ grainDuration]) {
+    if ((when is num || when == null) && !?grainOffset && !?grainDuration) {
+      _start_1(when);
+      return;
+    }
+    if ((when is num || when == null) && (grainOffset is num || grainOffset == null) && (grainDuration is num || grainDuration == null)) {
+      _start_2(when, grainOffset, grainDuration);
+      return;
+    }
+    throw "Incorrect number or type of arguments";
+  }
+
+
+  /** @domName AudioBufferSourceNode.start_1 */
+  void _start_1(when) native "AudioBufferSourceNode_start_1_Callback";
+
+
+  /** @domName AudioBufferSourceNode.start_2 */
+  void _start_2(when, grainOffset, grainDuration) native "AudioBufferSourceNode_start_2_Callback";
+
+
+  /** @domName AudioBufferSourceNode.stop */
+  void stop(num when) native "AudioBufferSourceNode_stop_Callback";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+/// @domName AudioContext
+class AudioContext extends EventTarget {
+  factory AudioContext() => _createAudioContext();
+
+  static _createAudioContext([int numberOfChannels,
+                              int numberOfFrames,
+                              int sampleRate])
+      native "AudioContext_constructor_Callback";
+
+  AudioContext.internal(): super.internal();
+
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  AudioContextEvents get on =>
+    new AudioContextEvents(this);
+
+
+  /** @domName AudioContext.activeSourceCount */
+  int get activeSourceCount native "AudioContext_activeSourceCount_Getter";
+
+
+  /** @domName AudioContext.currentTime */
+  num get currentTime native "AudioContext_currentTime_Getter";
+
+
+  /** @domName AudioContext.destination */
+  AudioDestinationNode get destination native "AudioContext_destination_Getter";
+
+
+  /** @domName AudioContext.listener */
+  AudioListener get listener native "AudioContext_listener_Getter";
+
+
+  /** @domName AudioContext.sampleRate */
+  num get sampleRate native "AudioContext_sampleRate_Getter";
+
+
+  /** @domName AudioContext.createAnalyser */
+  AnalyserNode createAnalyser() native "AudioContext_createAnalyser_Callback";
+
+
+  /** @domName AudioContext.createBiquadFilter */
+  BiquadFilterNode createBiquadFilter() native "AudioContext_createBiquadFilter_Callback";
+
+  AudioBuffer createBuffer(buffer_OR_numberOfChannels, mixToMono_OR_numberOfFrames, [/*float*/ sampleRate]) {
+    if ((buffer_OR_numberOfChannels is int || buffer_OR_numberOfChannels == null) && (mixToMono_OR_numberOfFrames is int || mixToMono_OR_numberOfFrames == null) && (sampleRate is num || sampleRate == null)) {
+      return _createBuffer_1(buffer_OR_numberOfChannels, mixToMono_OR_numberOfFrames, sampleRate);
+    }
+    if ((buffer_OR_numberOfChannels is ArrayBuffer || buffer_OR_numberOfChannels == null) && (mixToMono_OR_numberOfFrames is bool || mixToMono_OR_numberOfFrames == null) && !?sampleRate) {
+      return _createBuffer_2(buffer_OR_numberOfChannels, mixToMono_OR_numberOfFrames);
+    }
+    throw "Incorrect number or type of arguments";
+  }
+
+
+  /** @domName AudioContext.createBuffer_1 */
+  AudioBuffer _createBuffer_1(buffer_OR_numberOfChannels, mixToMono_OR_numberOfFrames, sampleRate) native "AudioContext_createBuffer_1_Callback";
+
+
+  /** @domName AudioContext.createBuffer_2 */
+  AudioBuffer _createBuffer_2(buffer_OR_numberOfChannels, mixToMono_OR_numberOfFrames) native "AudioContext_createBuffer_2_Callback";
+
+
+  /** @domName AudioContext.createBufferSource */
+  AudioBufferSourceNode createBufferSource() native "AudioContext_createBufferSource_Callback";
+
+  ChannelMergerNode createChannelMerger([/*unsigned long*/ numberOfInputs]) {
+    if (?numberOfInputs) {
+      return _createChannelMerger_1(numberOfInputs);
+    }
+    return _createChannelMerger_2();
+  }
+
+
+  /** @domName AudioContext.createChannelMerger_1 */
+  ChannelMergerNode _createChannelMerger_1(numberOfInputs) native "AudioContext_createChannelMerger_1_Callback";
+
+
+  /** @domName AudioContext.createChannelMerger_2 */
+  ChannelMergerNode _createChannelMerger_2() native "AudioContext_createChannelMerger_2_Callback";
+
+  ChannelSplitterNode createChannelSplitter([/*unsigned long*/ numberOfOutputs]) {
+    if (?numberOfOutputs) {
+      return _createChannelSplitter_1(numberOfOutputs);
+    }
+    return _createChannelSplitter_2();
+  }
+
+
+  /** @domName AudioContext.createChannelSplitter_1 */
+  ChannelSplitterNode _createChannelSplitter_1(numberOfOutputs) native "AudioContext_createChannelSplitter_1_Callback";
+
+
+  /** @domName AudioContext.createChannelSplitter_2 */
+  ChannelSplitterNode _createChannelSplitter_2() native "AudioContext_createChannelSplitter_2_Callback";
+
+
+  /** @domName AudioContext.createConvolver */
+  ConvolverNode createConvolver() native "AudioContext_createConvolver_Callback";
+
+  DelayNode createDelay([/*double*/ maxDelayTime]) {
+    if (?maxDelayTime) {
+      return _createDelay_1(maxDelayTime);
+    }
+    return _createDelay_2();
+  }
+
+
+  /** @domName AudioContext.createDelay_1 */
+  DelayNode _createDelay_1(maxDelayTime) native "AudioContext_createDelay_1_Callback";
+
+
+  /** @domName AudioContext.createDelay_2 */
+  DelayNode _createDelay_2() native "AudioContext_createDelay_2_Callback";
+
+
+  /** @domName AudioContext.createDynamicsCompressor */
+  DynamicsCompressorNode createDynamicsCompressor() native "AudioContext_createDynamicsCompressor_Callback";
+
+
+  /** @domName AudioContext.createGain */
+  GainNode createGain() native "AudioContext_createGain_Callback";
+
+
+  /** @domName AudioContext.createMediaElementSource */
+  MediaElementAudioSourceNode createMediaElementSource(MediaElement mediaElement) native "AudioContext_createMediaElementSource_Callback";
+
+
+  /** @domName AudioContext.createMediaStreamSource */
+  MediaStreamAudioSourceNode createMediaStreamSource(MediaStream mediaStream) native "AudioContext_createMediaStreamSource_Callback";
+
+
+  /** @domName AudioContext.createOscillator */
+  OscillatorNode createOscillator() native "AudioContext_createOscillator_Callback";
+
+
+  /** @domName AudioContext.createPanner */
+  PannerNode createPanner() native "AudioContext_createPanner_Callback";
+
+  ScriptProcessorNode createScriptProcessor(/*unsigned long*/ bufferSize, [/*unsigned long*/ numberOfInputChannels, /*unsigned long*/ numberOfOutputChannels]) {
+    if (?numberOfOutputChannels) {
+      return _createScriptProcessor_1(bufferSize, numberOfInputChannels, numberOfOutputChannels);
+    }
+    if (?numberOfInputChannels) {
+      return _createScriptProcessor_2(bufferSize, numberOfInputChannels);
+    }
+    return _createScriptProcessor_3(bufferSize);
+  }
+
+
+  /** @domName AudioContext.createScriptProcessor_1 */
+  ScriptProcessorNode _createScriptProcessor_1(bufferSize, numberOfInputChannels, numberOfOutputChannels) native "AudioContext_createScriptProcessor_1_Callback";
+
+
+  /** @domName AudioContext.createScriptProcessor_2 */
+  ScriptProcessorNode _createScriptProcessor_2(bufferSize, numberOfInputChannels) native "AudioContext_createScriptProcessor_2_Callback";
+
+
+  /** @domName AudioContext.createScriptProcessor_3 */
+  ScriptProcessorNode _createScriptProcessor_3(bufferSize) native "AudioContext_createScriptProcessor_3_Callback";
+
+
+  /** @domName AudioContext.createWaveShaper */
+  WaveShaperNode createWaveShaper() native "AudioContext_createWaveShaper_Callback";
+
+
+  /** @domName AudioContext.createWaveTable */
+  WaveTable createWaveTable(Float32Array real, Float32Array imag) native "AudioContext_createWaveTable_Callback";
+
+
+  /** @domName AudioContext.decodeAudioData */
+  void decodeAudioData(ArrayBuffer audioData, AudioBufferCallback successCallback, [AudioBufferCallback errorCallback]) native "AudioContext_decodeAudioData_Callback";
+
+
+  /** @domName AudioContext.startRendering */
+  void startRendering() native "AudioContext_startRendering_Callback";
+
+}
+
+class AudioContextEvents extends Events {
+  AudioContextEvents(EventTarget _ptr) : super(_ptr);
+
+  EventListenerList get complete => this['complete'];
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+/// @domName AudioDestinationNode
+class AudioDestinationNode extends AudioNode {
+  AudioDestinationNode.internal(): super.internal();
+
+
+  /** @domName AudioDestinationNode.numberOfChannels */
+  int get numberOfChannels native "AudioDestinationNode_numberOfChannels_Getter";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+/// @domName HTMLAudioElement
+class AudioElement extends MediaElement {
+
+  factory AudioElement([String src]) {
+    if (!?src) {
+      return _AudioElementFactoryProvider.createAudioElement();
+    }
+    return _AudioElementFactoryProvider.createAudioElement(src);
+  }
+  AudioElement.internal(): super.internal();
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+/// @domName AudioGain
+class AudioGain extends AudioParam {
+  AudioGain.internal(): super.internal();
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+/// @domName AudioListener
+class AudioListener extends NativeFieldWrapperClass1 {
+  AudioListener.internal();
+
+
+  /** @domName AudioListener.dopplerFactor */
+  num get dopplerFactor native "AudioListener_dopplerFactor_Getter";
+
+
+  /** @domName AudioListener.dopplerFactor */
+  void set dopplerFactor(num value) native "AudioListener_dopplerFactor_Setter";
+
+
+  /** @domName AudioListener.speedOfSound */
+  num get speedOfSound native "AudioListener_speedOfSound_Getter";
+
+
+  /** @domName AudioListener.speedOfSound */
+  void set speedOfSound(num value) native "AudioListener_speedOfSound_Setter";
+
+
+  /** @domName AudioListener.setOrientation */
+  void setOrientation(num x, num y, num z, num xUp, num yUp, num zUp) native "AudioListener_setOrientation_Callback";
+
+
+  /** @domName AudioListener.setPosition */
+  void setPosition(num x, num y, num z) native "AudioListener_setPosition_Callback";
+
+
+  /** @domName AudioListener.setVelocity */
+  void setVelocity(num x, num y, num z) native "AudioListener_setVelocity_Callback";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+/// @domName AudioNode
+class AudioNode extends NativeFieldWrapperClass1 {
+  AudioNode.internal();
+
+
+  /** @domName AudioNode.context */
+  AudioContext get context native "AudioNode_context_Getter";
+
+
+  /** @domName AudioNode.numberOfInputs */
+  int get numberOfInputs native "AudioNode_numberOfInputs_Getter";
+
+
+  /** @domName AudioNode.numberOfOutputs */
+  int get numberOfOutputs native "AudioNode_numberOfOutputs_Getter";
+
+  void connect(destination, /*unsigned long*/ output, [/*unsigned long*/ input]) {
+    if ((destination is AudioNode || destination == null) && (output is int || output == null) && (input is int || input == null)) {
+      _connect_1(destination, output, input);
+      return;
+    }
+    if ((destination is AudioParam || destination == null) && (output is int || output == null) && !?input) {
+      _connect_2(destination, output);
+      return;
+    }
+    throw "Incorrect number or type of arguments";
+  }
+
+
+  /** @domName AudioNode.connect_1 */
+  void _connect_1(destination, output, input) native "AudioNode_connect_1_Callback";
+
+
+  /** @domName AudioNode.connect_2 */
+  void _connect_2(destination, output) native "AudioNode_connect_2_Callback";
+
+
+  /** @domName AudioNode.disconnect */
+  void disconnect(int output) native "AudioNode_disconnect_Callback";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+/// @domName AudioParam
+class AudioParam extends NativeFieldWrapperClass1 {
+  AudioParam.internal();
+
+
+  /** @domName AudioParam.defaultValue */
+  num get defaultValue native "AudioParam_defaultValue_Getter";
+
+
+  /** @domName AudioParam.maxValue */
+  num get maxValue native "AudioParam_maxValue_Getter";
+
+
+  /** @domName AudioParam.minValue */
+  num get minValue native "AudioParam_minValue_Getter";
+
+
+  /** @domName AudioParam.name */
+  String get name native "AudioParam_name_Getter";
+
+
+  /** @domName AudioParam.units */
+  int get units native "AudioParam_units_Getter";
+
+
+  /** @domName AudioParam.value */
+  num get value native "AudioParam_value_Getter";
+
+
+  /** @domName AudioParam.value */
+  void set value(num value) native "AudioParam_value_Setter";
+
+
+  /** @domName AudioParam.cancelScheduledValues */
+  void cancelScheduledValues(num startTime) native "AudioParam_cancelScheduledValues_Callback";
+
+
+  /** @domName AudioParam.exponentialRampToValueAtTime */
+  void exponentialRampToValueAtTime(num value, num time) native "AudioParam_exponentialRampToValueAtTime_Callback";
+
+
+  /** @domName AudioParam.linearRampToValueAtTime */
+  void linearRampToValueAtTime(num value, num time) native "AudioParam_linearRampToValueAtTime_Callback";
+
+
+  /** @domName AudioParam.setTargetAtTime */
+  void setTargetAtTime(num target, num time, num timeConstant) native "AudioParam_setTargetAtTime_Callback";
+
+
+  /** @domName AudioParam.setValueAtTime */
+  void setValueAtTime(num value, num time) native "AudioParam_setValueAtTime_Callback";
+
+
+  /** @domName AudioParam.setValueCurveAtTime */
+  void setValueCurveAtTime(Float32Array values, num time, num duration) native "AudioParam_setValueCurveAtTime_Callback";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+/// @domName AudioProcessingEvent
+class AudioProcessingEvent extends Event {
+  AudioProcessingEvent.internal(): super.internal();
+
+
+  /** @domName AudioProcessingEvent.inputBuffer */
+  AudioBuffer get inputBuffer native "AudioProcessingEvent_inputBuffer_Getter";
+
+
+  /** @domName AudioProcessingEvent.outputBuffer */
+  AudioBuffer get outputBuffer native "AudioProcessingEvent_outputBuffer_Getter";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+/// @domName AudioSourceNode
+class AudioSourceNode extends AudioNode {
+  AudioSourceNode.internal(): super.internal();
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+/// @domName BiquadFilterNode
+class BiquadFilterNode extends AudioNode {
+  BiquadFilterNode.internal(): super.internal();
+
+  static const int ALLPASS = 7;
+
+  static const int BANDPASS = 2;
+
+  static const int HIGHPASS = 1;
+
+  static const int HIGHSHELF = 4;
+
+  static const int LOWPASS = 0;
+
+  static const int LOWSHELF = 3;
+
+  static const int NOTCH = 6;
+
+  static const int PEAKING = 5;
+
+
+  /** @domName BiquadFilterNode.Q */
+  AudioParam get Q native "BiquadFilterNode_Q_Getter";
+
+
+  /** @domName BiquadFilterNode.frequency */
+  AudioParam get frequency native "BiquadFilterNode_frequency_Getter";
+
+
+  /** @domName BiquadFilterNode.gain */
+  AudioParam get gain native "BiquadFilterNode_gain_Getter";
+
+
+  /** @domName BiquadFilterNode.type */
+  int get type native "BiquadFilterNode_type_Getter";
+
+
+  /** @domName BiquadFilterNode.type */
+  void set type(int value) native "BiquadFilterNode_type_Setter";
+
+
+  /** @domName BiquadFilterNode.getFrequencyResponse */
+  void getFrequencyResponse(Float32Array frequencyHz, Float32Array magResponse, Float32Array phaseResponse) native "BiquadFilterNode_getFrequencyResponse_Callback";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+/// @domName ChannelMergerNode
+class ChannelMergerNode extends AudioNode {
+  ChannelMergerNode.internal(): super.internal();
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+/// @domName ChannelSplitterNode
+class ChannelSplitterNode extends AudioNode {
+  ChannelSplitterNode.internal(): super.internal();
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+/// @domName ConvolverNode
+class ConvolverNode extends AudioNode {
+  ConvolverNode.internal(): super.internal();
+
+
+  /** @domName ConvolverNode.buffer */
+  AudioBuffer get buffer native "ConvolverNode_buffer_Getter";
+
+
+  /** @domName ConvolverNode.buffer */
+  void set buffer(AudioBuffer value) native "ConvolverNode_buffer_Setter";
+
+
+  /** @domName ConvolverNode.normalize */
+  bool get normalize native "ConvolverNode_normalize_Getter";
+
+
+  /** @domName ConvolverNode.normalize */
+  void set normalize(bool value) native "ConvolverNode_normalize_Setter";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+/// @domName DelayNode
+class DelayNode extends AudioNode {
+  DelayNode.internal(): super.internal();
+
+
+  /** @domName DelayNode.delayTime */
+  AudioParam get delayTime native "DelayNode_delayTime_Getter";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+/// @domName DynamicsCompressorNode
+class DynamicsCompressorNode extends AudioNode {
+  DynamicsCompressorNode.internal(): super.internal();
+
+
+  /** @domName DynamicsCompressorNode.attack */
+  AudioParam get attack native "DynamicsCompressorNode_attack_Getter";
+
+
+  /** @domName DynamicsCompressorNode.knee */
+  AudioParam get knee native "DynamicsCompressorNode_knee_Getter";
+
+
+  /** @domName DynamicsCompressorNode.ratio */
+  AudioParam get ratio native "DynamicsCompressorNode_ratio_Getter";
+
+
+  /** @domName DynamicsCompressorNode.reduction */
+  AudioParam get reduction native "DynamicsCompressorNode_reduction_Getter";
+
+
+  /** @domName DynamicsCompressorNode.release */
+  AudioParam get release native "DynamicsCompressorNode_release_Getter";
+
+
+  /** @domName DynamicsCompressorNode.threshold */
+  AudioParam get threshold native "DynamicsCompressorNode_threshold_Getter";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+/// @domName GainNode
+class GainNode extends AudioNode {
+  GainNode.internal(): super.internal();
+
+
+  /** @domName GainNode.gain */
+  AudioGain get gain native "GainNode_gain_Getter";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+/// @domName MediaElementAudioSourceNode
+class MediaElementAudioSourceNode extends AudioSourceNode {
+  MediaElementAudioSourceNode.internal(): super.internal();
+
+
+  /** @domName MediaElementAudioSourceNode.mediaElement */
+  MediaElement get mediaElement native "MediaElementAudioSourceNode_mediaElement_Getter";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+/// @domName MediaStreamAudioSourceNode
+class MediaStreamAudioSourceNode extends AudioSourceNode {
+  MediaStreamAudioSourceNode.internal(): super.internal();
+
+
+  /** @domName MediaStreamAudioSourceNode.mediaStream */
+  MediaStream get mediaStream native "MediaStreamAudioSourceNode_mediaStream_Getter";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+/// @domName OfflineAudioCompletionEvent
+class OfflineAudioCompletionEvent extends Event {
+  OfflineAudioCompletionEvent.internal(): super.internal();
+
+
+  /** @domName OfflineAudioCompletionEvent.renderedBuffer */
+  AudioBuffer get renderedBuffer native "OfflineAudioCompletionEvent_renderedBuffer_Getter";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+/// @domName OscillatorNode
+class OscillatorNode extends AudioSourceNode {
+  OscillatorNode.internal(): super.internal();
+
+  static const int CUSTOM = 4;
+
+  static const int FINISHED_STATE = 3;
+
+  static const int PLAYING_STATE = 2;
+
+  static const int SAWTOOTH = 2;
+
+  static const int SCHEDULED_STATE = 1;
+
+  static const int SINE = 0;
+
+  static const int SQUARE = 1;
+
+  static const int TRIANGLE = 3;
+
+  static const int UNSCHEDULED_STATE = 0;
+
+
+  /** @domName OscillatorNode.detune */
+  AudioParam get detune native "OscillatorNode_detune_Getter";
+
+
+  /** @domName OscillatorNode.frequency */
+  AudioParam get frequency native "OscillatorNode_frequency_Getter";
+
+
+  /** @domName OscillatorNode.playbackState */
+  int get playbackState native "OscillatorNode_playbackState_Getter";
+
+
+  /** @domName OscillatorNode.type */
+  int get type native "OscillatorNode_type_Getter";
+
+
+  /** @domName OscillatorNode.type */
+  void set type(int value) native "OscillatorNode_type_Setter";
+
+
+  /** @domName OscillatorNode.setWaveTable */
+  void setWaveTable(WaveTable waveTable) native "OscillatorNode_setWaveTable_Callback";
+
+
+  /** @domName OscillatorNode.start */
+  void start(num when) native "OscillatorNode_start_Callback";
+
+
+  /** @domName OscillatorNode.stop */
+  void stop(num when) native "OscillatorNode_stop_Callback";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+/// @domName PannerNode
+class PannerNode extends AudioNode {
+  PannerNode.internal(): super.internal();
+
+  static const int EQUALPOWER = 0;
+
+  static const int EXPONENTIAL_DISTANCE = 2;
+
+  static const int HRTF = 1;
+
+  static const int INVERSE_DISTANCE = 1;
+
+  static const int LINEAR_DISTANCE = 0;
+
+  static const int SOUNDFIELD = 2;
+
+
+  /** @domName PannerNode.coneGain */
+  AudioGain get coneGain native "PannerNode_coneGain_Getter";
+
+
+  /** @domName PannerNode.coneInnerAngle */
+  num get coneInnerAngle native "PannerNode_coneInnerAngle_Getter";
+
+
+  /** @domName PannerNode.coneInnerAngle */
+  void set coneInnerAngle(num value) native "PannerNode_coneInnerAngle_Setter";
+
+
+  /** @domName PannerNode.coneOuterAngle */
+  num get coneOuterAngle native "PannerNode_coneOuterAngle_Getter";
+
+
+  /** @domName PannerNode.coneOuterAngle */
+  void set coneOuterAngle(num value) native "PannerNode_coneOuterAngle_Setter";
+
+
+  /** @domName PannerNode.coneOuterGain */
+  num get coneOuterGain native "PannerNode_coneOuterGain_Getter";
+
+
+  /** @domName PannerNode.coneOuterGain */
+  void set coneOuterGain(num value) native "PannerNode_coneOuterGain_Setter";
+
+
+  /** @domName PannerNode.distanceGain */
+  AudioGain get distanceGain native "PannerNode_distanceGain_Getter";
+
+
+  /** @domName PannerNode.distanceModel */
+  int get distanceModel native "PannerNode_distanceModel_Getter";
+
+
+  /** @domName PannerNode.distanceModel */
+  void set distanceModel(int value) native "PannerNode_distanceModel_Setter";
+
+
+  /** @domName PannerNode.maxDistance */
+  num get maxDistance native "PannerNode_maxDistance_Getter";
+
+
+  /** @domName PannerNode.maxDistance */
+  void set maxDistance(num value) native "PannerNode_maxDistance_Setter";
+
+
+  /** @domName PannerNode.panningModel */
+  int get panningModel native "PannerNode_panningModel_Getter";
+
+
+  /** @domName PannerNode.panningModel */
+  void set panningModel(int value) native "PannerNode_panningModel_Setter";
+
+
+  /** @domName PannerNode.refDistance */
+  num get refDistance native "PannerNode_refDistance_Getter";
+
+
+  /** @domName PannerNode.refDistance */
+  void set refDistance(num value) native "PannerNode_refDistance_Setter";
+
+
+  /** @domName PannerNode.rolloffFactor */
+  num get rolloffFactor native "PannerNode_rolloffFactor_Getter";
+
+
+  /** @domName PannerNode.rolloffFactor */
+  void set rolloffFactor(num value) native "PannerNode_rolloffFactor_Setter";
+
+
+  /** @domName PannerNode.setOrientation */
+  void setOrientation(num x, num y, num z) native "PannerNode_setOrientation_Callback";
+
+
+  /** @domName PannerNode.setPosition */
+  void setPosition(num x, num y, num z) native "PannerNode_setPosition_Callback";
+
+
+  /** @domName PannerNode.setVelocity */
+  void setVelocity(num x, num y, num z) native "PannerNode_setVelocity_Callback";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+/// @domName ScriptProcessorNode
+class ScriptProcessorNode extends AudioNode implements EventTarget {
+  ScriptProcessorNode.internal(): super.internal();
+
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  ScriptProcessorNodeEvents get on =>
+    new ScriptProcessorNodeEvents(this);
+
+
+  /** @domName ScriptProcessorNode.bufferSize */
+  int get bufferSize native "ScriptProcessorNode_bufferSize_Getter";
+
+}
+
+class ScriptProcessorNodeEvents extends Events {
+  ScriptProcessorNodeEvents(EventTarget _ptr) : super(_ptr);
+
+  EventListenerList get audioProcess => this['audioprocess'];
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+/// @domName WaveShaperNode
+class WaveShaperNode extends AudioNode {
+  WaveShaperNode.internal(): super.internal();
+
+
+  /** @domName WaveShaperNode.curve */
+  Float32Array get curve native "WaveShaperNode_curve_Getter";
+
+
+  /** @domName WaveShaperNode.curve */
+  void set curve(Float32Array value) native "WaveShaperNode_curve_Setter";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+class _AudioElementFactoryProvider {
+  static AudioElement createAudioElement([String src]) native "HTMLAudioElement_constructor_Callback";
+}
diff --git a/tests/co19/co19-compiler.status b/tests/co19/co19-compiler.status
index b076d5c..a4a880f 100644
--- a/tests/co19/co19-compiler.status
+++ b/tests/co19/co19-compiler.status
@@ -3,13 +3,6 @@
 # BSD-style license that can be found in the LICENSE file.
 
 [ $compiler == dartc ]
-Language/03_Overview/1_Scoping_A02_t05: Fail # TODO(analyzer-team): Please triage this failure.
-Language/03_Overview/1_Scoping_A02_t06: Fail # TODO(analyzer-team): Please triage this failure.
-Language/03_Overview/2_Privacy_A01_t05: Fail # TODO(analyzer-team): Please triage this failure.
-Language/03_Overview/2_Privacy_A01_t09: Fail # TODO(analyzer-team): Please triage this failure.
-Language/03_Overview/2_Privacy_A01_t10: Fail # TODO(analyzer-team): Please triage this failure.
-Language/03_Overview/2_Privacy_A01_t19: Fail # TODO(analyzer-team): Please triage this failure.
-Language/03_Overview/2_Privacy_A01_t20: Fail # TODO(analyzer-team): Please triage this failure.
 Language/05_Variables/05_Variables_A05_t11: Fail # TODO(analyzer-team): Please triage this failure.
 Language/05_Variables/05_Variables_A05_t12: Fail # TODO(analyzer-team): Please triage this failure.
 Language/05_Variables/05_Variables_A05_t13: Fail # TODO(analyzer-team): Please triage this failure.
@@ -18,23 +11,16 @@
 Language/05_Variables/05_Variables_A06_t01: Fail # TODO(analyzer-team): Please triage this failure.
 Language/05_Variables/05_Variables_A11_t01: Fail # TODO(analyzer-team): Please triage this failure.
 Language/05_Variables/1_Evaluation_of_Implicit_Variable_Getters_A01_t05: Fail # TODO(analyzer-team): Please triage this failure.
-Language/06_Functions/1_Function_Declaration_A02_t03: Fail # TODO(analyzer-team): Please triage this failure.
-Language/06_Functions/1_Function_Declaration_A03_t03: Fail # TODO(analyzer-team): Please triage this failure.
 Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A01_t10: Fail # TODO(analyzer-team): Please triage this failure.
-Language/07_Classes/6_Constructors/2_Factories_A02_t01: Fail # TODO(analyzer-team): Please triage this failure.
-Language/07_Classes/6_Constructors/2_Factories_A02_t02: Fail # TODO(analyzer-team): Please triage this failure.
-Language/07_Classes/6_Constructors/2_Factories_A05_t02: Fail # TODO(analyzer-team): Please triage this failure.
-Language/07_Classes/6_Constructors/2_Factories_A05_t04: Fail # TODO(analyzer-team): Please triage this failure.
+Language/07_Classes/6_Constructors/1_Generative_Constructors_A04_t15: Fail # TODO(analyzer-team): Please triage this failure.
+Language/07_Classes/6_Constructors/2_Factories_A02_t03: Fail # TODO(analyzer-team): Please triage this failure.
+Language/07_Classes/6_Constructors/2_Factories_A02_t05: Fail # TODO(analyzer-team): Please triage this failure.
 Language/08_Interfaces/5_Superinterfaces_A01_t02: Fail # TODO(analyzer-team): Please triage this failure.
-Language/09_Generics/09_Generics_A05_t01: Fail # TODO(analyzer-team): Please triage this failure.
-Language/09_Generics/09_Generics_A05_t02: Fail # TODO(analyzer-team): Please triage this failure.
 Language/11_Expressions/01_Constants_A03_t01: Fail # TODO(analyzer-team): Please triage this failure.
 Language/11_Expressions/01_Constants_A05_t01: Fail # TODO(analyzer-team): Please triage this failure.
 Language/11_Expressions/01_Constants_A14_t01: Fail # TODO(analyzer-team): Please triage this failure.
 Language/11_Expressions/01_Constants_A20_t03: Fail # TODO(analyzer-team): Please triage this failure.
 Language/11_Expressions/08_Throw_A05_t01: Fail # TODO(analyzer-team): Please triage this failure.
-Language/11_Expressions/11_Instance_Creation/1_New_A02_t07: Fail # TODO(analyzer-team): Please triage this failure.
-Language/11_Expressions/11_Instance_Creation/1_New_A06_t06: Fail # TODO(analyzer-team): Please triage this failure.
 Language/11_Expressions/11_Instance_Creation/2_Const_A10_t01: Fail # TODO(analyzer-team): Please triage this failure.
 Language/11_Expressions/18_Assignment_A05_t05: Fail # TODO(analyzer-team): Please triage this failure.
 Language/11_Expressions/31_Type_Test_A01_t02: Fail # TODO(analyzer-team): Please triage this failure.
@@ -45,6 +31,9 @@
 Language/12_Statements/03_Variable_Declaration_A01_t16: Fail # TODO(analyzer-team): Please triage this failure.
 Language/12_Statements/06_For_A01_t11: Fail # TODO(analyzer-team): Please triage this failure.
 Language/12_Statements/09_Switch_A02_t03: Fail # TODO(analyzer-team): Please triage this failure.
+Language/12_Statements/10_Try_A03_t01: Fail # TODO(analyzer-team): Please triage this failure.
+Language/12_Statements/10_Try_A03_t02: Fail # TODO(analyzer-team): Please triage this failure.
+Language/12_Statements/10_Try_A03_t03: Fail # TODO(analyzer-team): Please triage this failure.
 Language/13_Libraries_and_Scripts/1_Imports_A02_t29: Fail # TODO(analyzer-team): Please triage this failure.
 Language/13_Libraries_and_Scripts/1_Imports_A05_t01: Fail # TODO(analyzer-team): Please triage this failure.
 Language/13_Libraries_and_Scripts/2_Exports_A05_t01: Fail # TODO(analyzer-team): Please triage this failure.
@@ -52,6 +41,10 @@
 Language/13_Libraries_and_Scripts/4_Scripts_A01_t23: Fail # TODO(analyzer-team): Please triage this failure.
 Language/13_Libraries_and_Scripts/5_URIs_A01_t01: Fail # TODO(analyzer-team): Please triage this failure.
 Language/13_Libraries_and_Scripts/5_URIs_A01_t21: Fail # TODO(analyzer-team): Please triage this failure.
+Language/14_Types/5_Function_Types_A04_t01: Fail # TODO(analyzer-team): Please triage this failure.
+Language/15_Reference/1_Lexical_Rules_A01_t09: Fail # TODO(analyzer-team): Please triage this failure.
+Language/15_Reference/1_Lexical_Rules_A01_t11: Fail # TODO(analyzer-team): Please triage this failure.
+
 
 # co19 issue 320
 Language/13_Libraries_and_Scripts/1_Imports_A02_t12: Fail, OK
@@ -59,18 +52,8 @@
 Language/13_Libraries_and_Scripts/1_Imports_A02_t18: Fail, OK
 Language/13_Libraries_and_Scripts/1_Imports_A02_t19: Fail, OK
 
-
-# co19 issue 330
-# was issue 6824
-Language/13_Libraries_and_Scripts/2_Exports_A04_t05: Fail
-Language/13_Libraries_and_Scripts/2_Exports_A04_t06: Fail
-
-
 # co19 issue 327
-Language/03_Overview/1_Scoping_A02_t17: Fail, OK
 Language/03_Overview/1_Scoping_A02_t32: Fail, OK
-Language/12_Statements/03_Variable_Declaration_A01_t10: Fail, OK
-Language/12_Statements/03_Variable_Declaration_A01_t17: Fail, OK
 
 Language/03_Overview/2_Privacy_A01_t08: pass # http://dartbug.com/5179
 Language/03_Overview/2_Privacy_A01_t11: pass # http://dartbug.com/5179
@@ -110,19 +93,11 @@
 Language/13_Libraries_and_Scripts/13_Libraries_and_Scripts_A05_t01: pass # http://dartbug.com/5179
 
 # co19 issue 298
-Language/03_Overview/2_Privacy_A01_t07: Fail, OK
 Language/13_Libraries_and_Scripts/1_Imports_A02_t16: Fail, OK
 Language/13_Libraries_and_Scripts/1_Imports_A02_t17: Fail, OK
 
-Language/07_Classes/6_Constructors/2_Factories_A03_t01: Fail, OK # co19 issue 307
-
-# co19 issue 329
-Language/13_Libraries_and_Scripts/4_Scripts_A01_t20: Fail
-
-Language/13_Libraries_and_Scripts/13_Libraries_and_Scripts_A05_t03: Fail, OK # contains syntax error
 Language/13_Libraries_and_Scripts/13_Libraries_and_Scripts_A05_t04: Fail, OK # contains syntax error
 Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A03_t02: Fail, OK # deprecated parameter syntax
-Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A04_t04: Fail # Issue 5294
 
 # The following tests use NoSuchMethodException instead of NoSuchMethodError.
 Language/06_Functions/4_External_Functions_A01_t01: Fail, OK # co19 issue 195
@@ -140,7 +115,6 @@
 Language/11_Expressions/01_Constants_A16_t02: Fail # Issue 1473
 Language/11_Expressions/01_Constants_A16_t03: Fail # Issue 1473
 Language/11_Expressions/01_Constants_A17_t03: Fail # Issue 1473
-Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t03: Fail # Issue 3524
 Language/11_Expressions/22_Equality_A01_t19: Fail # language change 3368
 Language/11_Expressions/22_Equality_A01_t20: Fail # language change 3368
 Language/11_Expressions/22_Equality_A02_t03: Fail, OK # co19 issue 169
diff --git a/tests/co19/co19-dart2dart.status b/tests/co19/co19-dart2dart.status
index 1614758..b0ef1f2 100644
--- a/tests/co19/co19-dart2dart.status
+++ b/tests/co19/co19-dart2dart.status
@@ -3,6 +3,25 @@
 # BSD-style license that can be found in the LICENSE file.
 
 [ $compiler == dart2dart ]
+Language/03_Overview/1_Scoping_A02_t32: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/07_Classes/6_Constructors/1_Generative_Constructors_A04_t15: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/07_Classes/6_Constructors/2_Factories_A02_t01: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/07_Classes/6_Constructors/2_Factories_A02_t02: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/07_Classes/6_Constructors/2_Factories_A02_t03: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/07_Classes/6_Constructors/2_Factories_A02_t04: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/07_Classes/6_Constructors/2_Factories_A02_t05: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/11_Expressions/11_Instance_Creation/2_Const_A03_t01: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/12_Statements/03_Variable_Declaration_A04_t07: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/12_Statements/09_Switch_A04_t01: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/12_Statements/10_Try_A03_t01: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/12_Statements/10_Try_A03_t02: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/12_Statements/10_Try_A03_t03: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/13_Libraries_and_Scripts/4_Scripts_A01_t20: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/14_Types/5_Function_Types_A04_t01: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/15_Reference/1_Lexical_Rules_A01_t09: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/15_Reference/1_Lexical_Rules_A01_t11: Fail # TODO(dart2dart-team): Please triage this failure.
+
+
 # Calling unresolved class constructor:
 Language/03_Overview/2_Privacy_A01_t19: Fail
 Language/03_Overview/2_Privacy_A01_t20: Fail
@@ -57,10 +76,6 @@
 Language/06_Functions/06_Functions_A01_t22: Fail # inherited from VM
 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
-Language/06_Functions/1_Function_Declaration_A02_t03: Fail # inherited from VM
-Language/06_Functions/1_Function_Declaration_A03_t02: Fail # http://dartbug.com/5519
-Language/06_Functions/1_Function_Declaration_A03_t03: Fail # inherited from VM
 Language/06_Functions/2_Formal_Parameters/1_Required_Formals_A02_t03: Fail # http://dartbug.com/5519
 Language/06_Functions/2_Formal_Parameters/1_Required_Formals_A02_t04: Fail # http://dartbug.com/5519
 Language/06_Functions/2_Formal_Parameters/1_Required_Formals_A02_t05: Fail # http://dartbug.com/5519
@@ -128,7 +143,6 @@
 Language/07_Classes/1_Instance_Methods_A02_t05: Fail # http://dartbug.com/5519
 Language/07_Classes/1_Instance_Methods_A06_t01: Fail # Inherited from dart2js
 Language/07_Classes/1_Instance_Methods_A06_t02: Fail # Inherited from dart2js
-Language/07_Classes/1_Instance_Methods_A07_t01: Fail # Inherited from dart2js
 Language/07_Classes/2_Getters_A01_t03: Fail # inherited from VM
 Language/07_Classes/2_Getters_A01_t04: Fail # http://dartbug.com/5519
 Language/07_Classes/2_Getters_A01_t05: Fail # inherited from VM
@@ -158,13 +172,7 @@
 Language/07_Classes/6_Constructors/1_Generative_Constructors_A16_t07: Fail # http://dartbug.com/6242
 Language/07_Classes/6_Constructors/1_Generative_Constructors_A21_t01: Fail # http://dartbug.com/5519
 Language/07_Classes/6_Constructors/2_Factories_A01_t05: Fail # Inherited from dartjs
-Language/07_Classes/6_Constructors/2_Factories_A05_t01: Fail # Inherited from dart2js
-Language/07_Classes/6_Constructors/2_Factories_A05_t02: Fail # Inherited from dart2js
-Language/07_Classes/6_Constructors/2_Factories_A05_t03: Fail # Inherited from dart2js
-Language/07_Classes/6_Constructors/2_Factories_A05_t04: Fail # Inherited from dart2js
 Language/07_Classes/6_Constructors/2_Factories_A07_t01: Fail # inherited from VM
-Language/07_Classes/6_Constructors/3_Constant_Constructors_A02_t01: Fail # http://dartbug.com/5519
-Language/07_Classes/6_Constructors/3_Constant_Constructors_A02_t03: Fail # http://dartbug.com/5519
 Language/07_Classes/6_Constructors/3_Constant_Constructors_A03_t01: Fail # http://dartbug.com/5519
 Language/07_Classes/6_Constructors/3_Constant_Constructors_A03_t02: Fail # http://dartbug.com/5519
 Language/07_Classes/6_Constructors/3_Constant_Constructors_A04_t01: Fail # inherited from VM
@@ -257,7 +265,6 @@
 Language/11_Expressions/11_Instance_Creation/1_New_A03_t01: Fail # http://dartbug.com/6895
 Language/11_Expressions/11_Instance_Creation/1_New_A03_t02: Fail # http://dartbug.com/6895
 Language/11_Expressions/11_Instance_Creation/1_New_A04_t01: Fail # http://dartbug.com/6895
-Language/11_Expressions/11_Instance_Creation/1_New_A04_t02: Fail # http://dartbug.com/6895
 Language/11_Expressions/11_Instance_Creation/1_New_A09_t09: Fail # inherited from VM
 Language/11_Expressions/11_Instance_Creation/2_Const_A01_t02: Fail # http://dartbug.com/5519
 Language/11_Expressions/11_Instance_Creation/2_Const_A06_t01: Fail # http://dartbug.com/5519
@@ -361,12 +368,8 @@
 Language/13_Libraries_and_Scripts/1_Imports_A02_t14: Fail # Inherited from dart2js
 Language/13_Libraries_and_Scripts/1_Imports_A02_t16: Fail # Inherited from dart2js
 Language/13_Libraries_and_Scripts/1_Imports_A02_t17: Fail # Inherited from dart2js
-Language/13_Libraries_and_Scripts/1_Imports_A02_t18: Fail # Inherited from dart2js
 Language/13_Libraries_and_Scripts/1_Imports_A02_t28: Fail # Inherited from dart2js
-Language/13_Libraries_and_Scripts/1_Imports_A03_t31: Fail # Inherited from dart2js
 Language/13_Libraries_and_Scripts/1_Imports_A05_t01: Fail # Inherited from dart2js
-Language/13_Libraries_and_Scripts/2_Exports_A04_t05: Fail # Inherited from dart2js
-Language/13_Libraries_and_Scripts/2_Exports_A04_t06: Fail # Inherited from dart2js
 Language/13_Libraries_and_Scripts/3_Parts_A03_t02: Fail # Inherited from dart2js
 Language/13_Libraries_and_Scripts/4_Scripts_A01_t21: Fail # Inherited from dart2js
 Language/13_Libraries_and_Scripts/4_Scripts_A01_t22: Fail # Inherited from dart2js
@@ -374,11 +377,7 @@
 Language/13_Libraries_and_Scripts/4_Scripts_A03_t01: Fail # http://dartbug.com/5519
 Language/13_Libraries_and_Scripts/4_Scripts_A03_t03: Fail # http://dartbug.com/5519
 Language/13_Libraries_and_Scripts/5_URIs_A01_t01: Fail # Inherited from dart2js
-Language/13_Libraries_and_Scripts/5_URIs_A01_t04: Fail # Inherited from dart2js
-Language/13_Libraries_and_Scripts/5_URIs_A01_t05: Fail # Inherited from dart2js
 Language/13_Libraries_and_Scripts/5_URIs_A01_t11: Fail # Inherited from dart2js
-Language/13_Libraries_and_Scripts/5_URIs_A01_t14: Fail # Inherited from dart2js
-Language/13_Libraries_and_Scripts/5_URIs_A01_t15: Fail # Inherited from dart2js
 Language/13_Libraries_and_Scripts/5_URIs_A01_t21: Fail # Inherited from dart2js
 Language/13_Libraries_and_Scripts/5_URIs_A01_t24: Fail # Inherited from dart2js
 Language/13_Libraries_and_Scripts/5_URIs_A01_t25: Fail # Inherited from dart2js
@@ -400,8 +399,6 @@
 LibTest/core/Date/Date.fromString_A03_t01: Fail, OK # Issue co19 - 121
 LibTest/core/Date/toString_A02_t01: Fail, OK # inherited from VM
 LibTest/core/Date/year_A01_t01: Fail, OK # inherited from VM
-LibTest/core/Future/chain_A03_t01: Fail, OK # co19 issue 328
-LibTest/core/Future/transform_A03_t01: Fail, OK # co19 issue 328
 LibTest/core/LinkedHashMap/LinkedHashMap_class_A01_t01: Fail, OK # co19 issue 293
 LibTest/core/Map/getKeys_A01_t01: Fail, OK # co19 issue 293
 LibTest/core/Map/getKeys_A01_t02: Fail, OK # co19 issue 293
@@ -431,8 +428,8 @@
 LibTest/core/int/operator_left_shift_A01_t02: Fail, OK # co19 issue 129
 LibTest/core/int/toRadixString_A01_t01: Fail # inherited from VM
 LibTest/isolate/ReceivePort/receive_A01_t02: Fail, OK # co19 issue 276
-LibTest/isolate/SendPort/send_A02_t02: Fail, OK # co19 issue 293
-LibTest/isolate/SendPort/send_A02_t03: Fail, OK # co19 issue 293
+LibTest/isolate/SendPort/send_A02_t02: Fail, Timeout, OK # co19 issue 293
+LibTest/isolate/SendPort/send_A02_t03: Fail, Timeout, OK # co19 issue 293
 LibTest/isolate/SendPort/send_A02_t04: Fail, OK # co19 issue 293
 LibTest/isolate/isolate_api/port_A01_t01: Skip # Times out.
 LibTest/isolate/isolate_api/spawnUri_A01_t01: Fail, OK # Problems with the test: encoded file name
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index b878b65..42c838e 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -4,6 +4,10 @@
 
 # Crashes first, please. Then untriaged bugs. There is a section below
 # for co19 bugs.
+[ $compiler == dart2js && $host_checked ]
+Language/13_Libraries_and_Scripts/5_URIs_A01_t15: Crash # Issue 6931
+Language/13_Libraries_and_Scripts/5_URIs_A01_t14: Crash # Issue 6931
+
 [ $compiler == dart2js ]
 Language/03_Overview/1_Scoping_A02_t05: Fail # TODO(ahe): Please triage this failure.
 Language/03_Overview/1_Scoping_A02_t06: Fail # TODO(ahe): Please triage this failure.
@@ -35,11 +39,12 @@
 Language/07_Classes/07_Classes_A03_t07: Fail # TODO(ahe): Please triage this failure.
 Language/07_Classes/1_Instance_Methods_A06_t01: Fail # TODO(ahe): Please triage this failure.
 Language/07_Classes/1_Instance_Methods_A06_t02: Fail # TODO(ahe): Please triage this failure.
-Language/07_Classes/1_Instance_Methods_A07_t01: Fail # TODO(ahe): Please triage this failure.
-Language/07_Classes/6_Constructors/2_Factories_A05_t01: Fail # TODO(ahe): Please triage this failure.
-Language/07_Classes/6_Constructors/2_Factories_A05_t02: Fail # TODO(ahe): Please triage this failure.
-Language/07_Classes/6_Constructors/2_Factories_A05_t03: Fail # TODO(ahe): Please triage this failure.
-Language/07_Classes/6_Constructors/2_Factories_A05_t04: Fail # TODO(ahe): Please triage this failure.
+Language/07_Classes/6_Constructors/1_Generative_Constructors_A04_t15: Fail # TODO(ahe): Please triage this failure.
+Language/07_Classes/6_Constructors/2_Factories_A02_t01: Fail # TODO(ahe): Please triage this failure.
+Language/07_Classes/6_Constructors/2_Factories_A02_t02: Fail # TODO(ahe): Please triage this failure.
+Language/07_Classes/6_Constructors/2_Factories_A02_t03: Fail # TODO(ahe): Please triage this failure.
+Language/07_Classes/6_Constructors/2_Factories_A02_t04: Fail # TODO(ahe): Please triage this failure.
+Language/07_Classes/6_Constructors/2_Factories_A02_t05: Fail # TODO(ahe): Please triage this failure.
 Language/07_Classes/6_Constructors/2_Factories_A07_t01: Fail # TODO(ahe): Please triage this failure.
 Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t01: Fail # TODO(ahe): Please triage this failure.
 Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t03: Fail # TODO(ahe): Please triage this failure.
@@ -63,6 +68,7 @@
 Language/11_Expressions/11_Instance_Creation/1_New_A02_t06: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/11_Instance_Creation/1_New_A02_t07: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/11_Instance_Creation/2_Const_A01_t02: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/11_Instance_Creation/2_Const_A03_t01: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/17_Getter_Invocation_A02_t01: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/18_Assignment_A05_t02: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/18_Assignment_A05_t04: Fail # TODO(ahe): Please triage this failure.
@@ -105,6 +111,7 @@
 Language/12_Statements/03_Variable_Declaration_A04_t04: Fail # TODO(ahe): Please triage this failure.
 Language/12_Statements/03_Variable_Declaration_A04_t05: Fail # TODO(ahe): Please triage this failure.
 Language/12_Statements/03_Variable_Declaration_A04_t06: Fail # TODO(ahe): Please triage this failure.
+Language/12_Statements/03_Variable_Declaration_A04_t07: Fail # TODO(ahe): Please triage this failure.
 Language/12_Statements/04_Local_Function_Declaration_A01_t01: Fail # TODO(ahe): Please triage this failure.
 Language/12_Statements/04_Local_Function_Declaration_A02_t02: Fail # TODO(ahe): Please triage this failure.
 Language/12_Statements/06_For_A01_t11: Fail # TODO(ahe): Please triage this failure.
@@ -114,7 +121,11 @@
 Language/12_Statements/09_Switch_A02_t03: Fail # TODO(ahe): Please triage this failure.
 Language/12_Statements/09_Switch_A03_t01: Fail # TODO(ahe): Please triage this failure.
 Language/12_Statements/09_Switch_A03_t02: Fail # TODO(ahe): Please triage this failure.
+Language/12_Statements/09_Switch_A04_t01: Fail # TODO(ahe): Please triage this failure.
 Language/12_Statements/09_Switch_A06_t02: Fail # TODO(ahe): Please triage this failure.
+Language/12_Statements/10_Try_A03_t01: Fail # TODO(ahe): Please triage this failure.
+Language/12_Statements/10_Try_A03_t02: Fail # TODO(ahe): Please triage this failure.
+Language/12_Statements/10_Try_A03_t03: Fail # TODO(ahe): Please triage this failure.
 Language/12_Statements/10_Try_A06_t01: Fail # TODO(ahe): Please triage this failure.
 Language/12_Statements/10_Try_A07_t03: Fail # TODO(ahe): Please triage this failure.
 Language/12_Statements/11_Return_A05_t01: Fail # TODO(ahe): Please triage this failure.
@@ -126,25 +137,19 @@
 Language/13_Libraries_and_Scripts/1_Imports_A02_t14: Fail # TODO(ahe): Please triage this failure.
 Language/13_Libraries_and_Scripts/1_Imports_A02_t16: Fail # TODO(ahe): Please triage this failure.
 Language/13_Libraries_and_Scripts/1_Imports_A02_t17: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A02_t18: Fail # TODO(ahe): Please triage this failure.
 Language/13_Libraries_and_Scripts/1_Imports_A02_t19: Fail # TODO(ahe): Please triage this failure.
 Language/13_Libraries_and_Scripts/1_Imports_A02_t27: Fail # TODO(ahe): Please triage this failure.
 Language/13_Libraries_and_Scripts/1_Imports_A02_t28: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A03_t31: Fail # TODO(ahe): Please triage this failure.
 Language/13_Libraries_and_Scripts/1_Imports_A03_t51: Fail # TODO(ahe): Please triage this failure.
 Language/13_Libraries_and_Scripts/1_Imports_A05_t01: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/2_Exports_A04_t05: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/2_Exports_A04_t06: Fail # TODO(ahe): Please triage this failure.
+Language/13_Libraries_and_Scripts/2_Exports_A06_t02: Fail # TODO(ahe): Please triage this failure.
 Language/13_Libraries_and_Scripts/3_Parts_A03_t02: Fail # TODO(ahe): Please triage this failure.
+Language/13_Libraries_and_Scripts/4_Scripts_A01_t20: Fail # TODO(ahe): Please triage this failure.
 Language/13_Libraries_and_Scripts/4_Scripts_A01_t21: Fail # TODO(ahe): Please triage this failure.
 Language/13_Libraries_and_Scripts/4_Scripts_A01_t22: Fail # TODO(ahe): Please triage this failure.
 Language/13_Libraries_and_Scripts/4_Scripts_A01_t23: Fail # TODO(ahe): Please triage this failure.
 Language/13_Libraries_and_Scripts/5_URIs_A01_t01: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/5_URIs_A01_t04: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/5_URIs_A01_t05: Fail # TODO(ahe): Please triage this failure.
 Language/13_Libraries_and_Scripts/5_URIs_A01_t11: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/5_URIs_A01_t14: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/5_URIs_A01_t15: Fail # TODO(ahe): Please triage this failure.
 Language/13_Libraries_and_Scripts/5_URIs_A01_t21: Fail # TODO(ahe): Please triage this failure.
 Language/13_Libraries_and_Scripts/5_URIs_A01_t24: Fail # TODO(ahe): Please triage this failure.
 Language/13_Libraries_and_Scripts/5_URIs_A01_t25: Fail # TODO(ahe): Please triage this failure.
@@ -174,8 +179,11 @@
 Language/14_Types/5_Function_Types_A03_t11: Fail # TODO(ahe): Please triage this failure.
 Language/14_Types/5_Function_Types_A03_t12: Fail # TODO(ahe): Please triage this failure.
 Language/14_Types/5_Function_Types_A03_t13: Fail # TODO(ahe): Please triage this failure.
+Language/14_Types/5_Function_Types_A04_t01: Fail # TODO(ahe): Please triage this failure.
 Language/14_Types/5_Function_Types_A06_t01: 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_t09: Fail # TODO(ahe): Please triage this failure.
+Language/15_Reference/1_Lexical_Rules_A01_t11: Fail # TODO(ahe): Please triage this failure.
 LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterClassEscape_A01_t01: Fail # TODO(ahe): Please triage this failure.
 LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterClassEscape_A02_t01: Fail # TODO(ahe): Please triage this failure.
 LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterClassEscape_A06_t01: Fail # TODO(ahe): Please triage this failure.
@@ -184,7 +192,6 @@
 LibTest/core/double/parse_A01_t01: Fail # TODO(ahe): Please triage this failure.
 LibTest/isolate/ReceivePort/receive_A01_t02: Fail # TODO(ahe): Please triage this failure.
 LibTest/math/Random/nextDouble_A01_t01: Fail # TODO(ahe): Please triage this failure.
-LibTest/math/exp_A01_t01: Fail # TODO(ahe): Please triage this failure.
 LibTest/math/pow_A01_t01: Fail # TODO(ahe): Please triage this failure.
 LibTest/math/pow_A11_t01: Fail # TODO(ahe): Please triage this failure.
 LibTest/math/pow_A13_t01: Fail # TODO(ahe): Please triage this failure.
@@ -194,6 +201,8 @@
 # Partially implemented rediriecting constructors makes this fail.
 Language/07_Classes/6_Constructors/2_Factories_A01_t05: Fail
 
+[ $compiler == dart2js && ($system == linux || $system == macos)]
+LibTest/math/exp_A01_t01: Fail # TODO(ahe): Please triage this failure.
 
 [ $compiler == dart2js && $unchecked ]
 LibTest/core/Date/Date.fromMillisecondsSinceEpoch_A03_t01: Fail # TODO(ahe): Please triage this failure.
@@ -246,6 +255,7 @@
 Language/12_Statements/09_Switch_A05_t01: Fail # TODO(ahe): Please triage this failure.
 Language/13_Libraries_and_Scripts/1_Imports_A03_t06: Fail # TODO(ahe): Please triage this failure.
 Language/13_Libraries_and_Scripts/1_Imports_A03_t26: Fail # TODO(ahe): Please triage this failure.
+Language/13_Libraries_and_Scripts/1_Imports_A03_t31: Fail # TODO(ahe): Please triage this failure.
 Language/13_Libraries_and_Scripts/1_Imports_A03_t46: Fail # TODO(ahe): Please triage this failure.
 Language/13_Libraries_and_Scripts/1_Imports_A03_t66: Fail # TODO(ahe): Please triage this failure.
 Language/14_Types/4_Interface_Types_A08_t03: Fail # TODO(ahe): Please triage this failure.
@@ -318,9 +328,6 @@
 
 Language/09_Generics/09_Generics_A05_t01: Fail # co19 issue 297
 
-[ $compiler == dart2js && $system == windows && $jscl ]
-LibTest/core/double/operator_remainder_A01_t04: Fail
-
 [ $compiler == dart2js ]
 Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A03_t03: Fail # TODO(ahe): Enforce optional parameter semantics.
 Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A01_t01: Fail # http://dartbug.com/5026
@@ -385,8 +392,6 @@
 Language/11_Expressions/22_Equality_A01_t01: Fail, OK # Function declaration takes precedence over function expression.
 Language/11_Expressions/28_Postfix_Expressions_A01_t01: Fail, OK # A map literal cannot start an expression statement.
 
-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
 Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A01_t15: Fail, OK # co19 issue 210
 Language/11_Expressions/05_Strings/1_String_Interpolation_A01_t09: Fail, OK # co19 issue 210
@@ -403,8 +408,6 @@
 
 Language/03_Overview/2_Privacy_A01_t11: Pass, OK # co19 issue 316
 Language/11_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A03_t01: Pass, OK # co19 issue 316
-LibTest/core/Future/chain_A03_t01: Fail, OK # co19 issue 328
-LibTest/core/Future/transform_A03_t01: Fail, OK # co19 issue 328
 
 [ $compiler == dart2js && $jscl ]
 LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterClassEscape_A04_t01: Fail, Pass # issue 3333
@@ -501,8 +504,6 @@
 Language/05_Variables/05_Variables_A05_t01: Fail # Checks that a compile-time error occurs if a constant variable is not initialized.
 Language/06_Functions/06_Functions_A01_t31: Fail # Checks that functions can't be declared as static inside of a function body.
 Language/06_Functions/1_Function_Declaration_A01_t01: Fail # Checks that it is a compile-time error to preface library function with 'static'.
-Language/06_Functions/1_Function_Declaration_A02_t02: Fail # Checks that 'id' is not assignable since its declaration is equivalent to a final variable declaration.
-Language/06_Functions/1_Function_Declaration_A03_t02: Fail # Checks that 'id' is not assignable since its declaration is equivalent to the final variable declaration.
 Language/06_Functions/2_Formal_Parameters/1_Required_Formals_A02_t03: Fail # Checks that a required parameter can be constant. Reassigning it should produce a compile-time error.
 Language/06_Functions/2_Formal_Parameters/1_Required_Formals_A02_t04: Fail # Checks that static variable declaration can't be a required formal parameter
 Language/06_Functions/2_Formal_Parameters/1_Required_Formals_A02_t05: Fail # Checks that reassigning a final required parameter produces a compile-time error.
@@ -554,8 +555,6 @@
 Language/07_Classes/6_Constructors/1_Generative_Constructors_A03_t05: Fail # Checks that redirecting constructor can not have initializing formals.
 Language/07_Classes/6_Constructors/1_Generative_Constructors_A09_t01: Fail # Checks that error is produced if a final variable is not initialized in one  of the specified ways.
 Language/07_Classes/6_Constructors/1_Generative_Constructors_A21_t01: Fail # Checks that a compile-time error occur if k’s initializer list contains an initializer for a final variable whose declaration includes an initialization expression.
-Language/07_Classes/6_Constructors/3_Constant_Constructors_A02_t01: Fail # Checks that it is a compile-time error when a constant constructor  declaration has a body.
-Language/07_Classes/6_Constructors/3_Constant_Constructors_A02_t03: Fail # Checks that it is a compile-time error if a named constant constructor has a body.
 Language/07_Classes/6_Constructors/3_Constant_Constructors_A03_t01: Fail # Checks that a compile-time error is produced when a class with constant  constructor also declares a non-final instance variable.
 Language/07_Classes/6_Constructors/3_Constant_Constructors_A03_t02: Fail # Checks that compile-time error is produced when a class with constant constructor inherits a non-final instance variable.
 Language/07_Classes/6_Constructors_A01_t01: Fail # Checks that a compile-error is produced when a constructor's id coincides with the name of a field in the same class.
diff --git a/tests/co19/co19-runtime.status b/tests/co19/co19-runtime.status
index 60702b9..95a04a4 100644
--- a/tests/co19/co19-runtime.status
+++ b/tests/co19/co19-runtime.status
@@ -3,19 +3,11 @@
 # BSD-style license that can be found in the LICENSE file.
 
 [ $compiler == none && $runtime == vm ]
-Language/13_Libraries_and_Scripts/1_Imports_A02_t21: Crash # TODO(vm-team): Please triage this crash.
-Language/13_Libraries_and_Scripts/1_Imports_A02_t22: Crash # TODO(vm-team): Please triage this crash.
+Language/13_Libraries_and_Scripts/1_Imports_A02_t21: Crash # Dart issue 6060
+Language/13_Libraries_and_Scripts/1_Imports_A02_t22: Crash # Dart issue 6060
 
-Language/05_Variables/05_Variables_A05_t04: Fail # TODO(vm-team): Please triage this failure.
-Language/05_Variables/05_Variables_A05_t11: Fail # TODO(vm-team): Please triage this failure.
-Language/05_Variables/05_Variables_A05_t13: Fail # TODO(vm-team): Please triage this failure.
-Language/05_Variables/05_Variables_A05_t14: Fail # TODO(vm-team): Please triage this failure.
-Language/05_Variables/05_Variables_A05_t15: Fail # TODO(vm-team): Please triage this failure.
-Language/05_Variables/1_Evaluation_of_Implicit_Variable_Getters_A01_t02: Fail # TODO(vm-team): Please triage this failure.
-Language/05_Variables/1_Evaluation_of_Implicit_Variable_Getters_A01_t05: Fail # TODO(vm-team): Please triage this failure.
+Language/03_Overview/1_Scoping_A02_t32: Fail # TODO(vm-team): Please triage this failure.
 Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A01_t10: Fail # TODO(vm-team): Please triage this failure.
-Language/07_Classes/2_Getters_A01_t03: Fail # Expects compile-time error when getter has empty parameter list.
-Language/07_Classes/2_Getters_A01_t05: Fail # Expects compile-time error when getter has empty parameter list.
 Language/07_Classes/3_Setters_A04_t01: Fail # TODO(vm-team): Please triage this failure.
 Language/07_Classes/3_Setters_A04_t04: Fail # TODO(vm-team): Please triage this failure.
 Language/07_Classes/3_Setters_A04_t05: Fail # TODO(vm-team): Please triage this failure.
@@ -25,9 +17,7 @@
 Language/07_Classes/4_Abstract_Instance_Members_A03_t05: Fail # TODO(vm-team): Please triage this failure.
 Language/07_Classes/4_Abstract_Instance_Members_A04_t05: Fail # TODO(vm-team): Please triage this failure.
 Language/07_Classes/4_Abstract_Instance_Members_A04_t06: Fail # TODO(vm-team): Please triage this failure.
-Language/07_Classes/6_Constructors/2_Factories_A05_t01: Fail # TODO(vm-team): Please triage this failure.
-Language/07_Classes/6_Constructors/2_Factories_A05_t03: Fail # TODO(vm-team): Please triage this failure.
-Language/07_Classes/6_Constructors/2_Factories_A05_t04: Fail # TODO(vm-team): Please triage this failure.
+Language/07_Classes/6_Constructors/1_Generative_Constructors_A04_t15: Fail # TODO(vm-team): Please triage this failure.
 Language/07_Classes/6_Constructors/3_Constant_Constructors_A04_t01: Fail # TODO(vm-team): Please triage this failure.
 Language/07_Classes/6_Constructors/3_Constant_Constructors_A04_t02: Fail # TODO(vm-team): Please triage this failure.
 Language/07_Classes/6_Constructors/3_Constant_Constructors_A04_t03: Fail # TODO(vm-team): Please triage this failure.
@@ -123,6 +113,7 @@
 Language/11_Expressions/30_Identifier_Reference_A08_t02: Fail # TODO(vm-team): Please triage this failure.
 Language/11_Expressions/31_Type_Test_A01_t02: Fail # TODO(vm-team): Please triage this failure.
 Language/11_Expressions/31_Type_Test_A01_t04: Fail # TODO(vm-team): Please triage this failure.
+Language/12_Statements/03_Variable_Declaration_A04_t07: Fail # TODO(vm-team): Please triage this failure.
 Language/12_Statements/04_Local_Function_Declaration_A02_t02: Fail # TODO(vm-team): Please triage this failure.
 Language/12_Statements/06_For_A01_t11: Fail # TODO(vm-team): Please triage this failure.
 Language/12_Statements/09_Switch_A01_t02: Fail # TODO(vm-team): Please triage this failure.
@@ -131,7 +122,11 @@
 Language/12_Statements/09_Switch_A02_t03: Fail # TODO(vm-team): Please triage this failure.
 Language/12_Statements/09_Switch_A03_t01: Fail # TODO(vm-team): Please triage this failure.
 Language/12_Statements/09_Switch_A03_t02: Fail # TODO(vm-team): Please triage this failure.
+Language/12_Statements/09_Switch_A04_t01: Fail # TODO(vm-team): Please triage this failure.
 Language/12_Statements/09_Switch_A06_t02: Fail # TODO(vm-team): Please triage this failure.
+Language/12_Statements/10_Try_A03_t01: Fail # TODO(vm-team): Please triage this failure.
+Language/12_Statements/10_Try_A03_t02: Fail # TODO(vm-team): Please triage this failure.
+Language/12_Statements/10_Try_A03_t03: Fail # TODO(vm-team): Please triage this failure.
 Language/12_Statements/10_Try_A11_t01: Fail # TODO(vm-team): Please triage this failure.
 Language/12_Statements/12_Labels_A01_t03: Fail # TODO(vm-team): Please triage this failure.
 Language/13_Libraries_and_Scripts/13_Libraries_and_Scripts_A05_t04: Fail # TODO(vm-team): Please triage this failure.
@@ -139,13 +134,17 @@
 Language/13_Libraries_and_Scripts/1_Imports_A05_t01: Fail # TODO(vm-team): Please triage this failure.
 Language/13_Libraries_and_Scripts/2_Exports_A04_t02: Fail # TODO(vm-team): Please triage this failure.
 Language/13_Libraries_and_Scripts/2_Exports_A04_t03: Fail # TODO(vm-team): Please triage this failure.
-Language/13_Libraries_and_Scripts/2_Exports_A04_t05: Fail # TODO(vm-team): Please triage this failure.
-Language/13_Libraries_and_Scripts/2_Exports_A04_t06: Fail # TODO(vm-team): Please triage this failure.
-Language/13_Libraries_and_Scripts/4_Scripts_A01_t20: Fail # TODO(vm-team): Please triage this failure.
 Language/13_Libraries_and_Scripts/5_URIs_A01_t01: Fail # TODO(vm-team): Please triage this failure.
+Language/13_Libraries_and_Scripts/5_URIs_A01_t04: Fail # TODO(vm-team): Please triage this failure.
+Language/13_Libraries_and_Scripts/5_URIs_A01_t05: Fail # TODO(vm-team): Please triage this failure.
 Language/13_Libraries_and_Scripts/5_URIs_A01_t11: Fail # TODO(vm-team): Please triage this failure.
+Language/13_Libraries_and_Scripts/5_URIs_A01_t14: Fail # TODO(vm-team): Please triage this failure.
+Language/13_Libraries_and_Scripts/5_URIs_A01_t15: Fail # TODO(vm-team): Please triage this failure.
 Language/13_Libraries_and_Scripts/5_URIs_A01_t21: Fail # TODO(vm-team): Please triage this failure.
+Language/14_Types/5_Function_Types_A04_t01: Fail # TODO(vm-team): Please triage this failure.
 Language/14_Types/5_Function_Types_A06_t01: Fail # TODO(vm-team): Please triage this failure.
+Language/15_Reference/1_Lexical_Rules_A01_t09: Fail # TODO(vm-team): Please triage this failure.
+Language/15_Reference/1_Lexical_Rules_A01_t11: Fail # TODO(vm-team): Please triage this failure.
 LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterClassEscape_A01_t01: Fail # TODO(vm-team): Please triage this failure.
 LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterClassEscape_A02_t01: Fail # TODO(vm-team): Please triage this failure.
 LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterClassEscape_A06_t01: Fail # TODO(vm-team): Please triage this failure.
@@ -158,10 +157,16 @@
 LibTest/math/pow_A13_t01: Fail # TODO(vm-team): Please triage this failure.
 LibTest/math/sin_A01_t01: Fail # TODO(vm-team): Please triage this failure.
 
+Language/05_Variables/05_Variables_A05_t04: Fail # Dart issue 5881
+Language/05_Variables/05_Variables_A05_t11: Fail # Dart issue 5885
+Language/05_Variables/05_Variables_A05_t13: Fail # Dart issue 5885
+Language/05_Variables/05_Variables_A05_t14: Fail # Dart issue 5885
+Language/05_Variables/05_Variables_A05_t15: Fail # Dart issue 5885
+Language/05_Variables/1_Evaluation_of_Implicit_Variable_Getters_A01_t02: Fail # Dart issue 5802
+Language/05_Variables/1_Evaluation_of_Implicit_Variable_Getters_A01_t05: Fail # Dart issue 5894
+
 LibTest/isolate/isolate_api/port_A01_t01: Skip # Times out.
 
-Language/06_Functions/1_Function_Declaration_A02_t03: Fail # issue 6058
-Language/06_Functions/1_Function_Declaration_A03_t03: Fail # issue 6058
 Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A03_t01: Fail # issue 6085
 Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A03_t02: Fail # issue 6085
 Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A03_t03: Fail # issue 6085
@@ -169,17 +174,12 @@
 
 [ $compiler == none && $runtime == vm && $checked ]
 Language/12_Statements/09_Switch_A05_t01: Fail # TODO(vm-team): Please triage this failure.
-Language/14_Types/5_Function_Types_A03_t12: Fail # TODO(vm-team): Please triage this failure.
 
 Language/11_Expressions/11_Instance_Creation_A05_t02: Fail # co19 issue 234
 
 [ $compiler == none && $runtime == vm && $unchecked ]
-Language/13_Libraries_and_Scripts/1_Imports_A03_t31: Fail # TODO(vm-team): Please triage this failure.
 LibTest/core/Date/Date.fromMillisecondsSinceEpoch_A03_t01: Fail # TODO(vm-team): Please triage this failure.
 
-Language/11_Expressions/11_Instance_Creation/2_Const_A03_t01: Fail, OK # co19 issue 282
-Language/11_Expressions/11_Instance_Creation/2_Const_A03_t02: Fail, OK # co19 issue 282
-
 [ $compiler == none && $runtime == vm ]
 # Not properly reporting exception in initializer expressions
 Language/11_Expressions/01_Constants_A16_t01: Fail
@@ -226,12 +226,8 @@
 LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterClassEscape_A04_t01: Fail
 LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t01: Fail
 
-# New failures
 LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterEscape_A06_t02: Fail
 
-LibTest/core/Future/chain_A03_t01: Fail, OK # co19 issue 328
-LibTest/core/Future/transform_A03_t01: Fail, OK # co19 issue 328
-
 [ $compiler == none && $runtime == vm ]
 LibTest/core/Date/Date.fromString_A03_t01: Fail # Issue co19 - 121
 LibTest/core/Match/operator_subscript_A01_t01: Fail
@@ -262,15 +258,6 @@
 [ $compiler == none && $runtime == vm && $arch == x64 && $mode == debug ]
 LibTest/core/Map/Map_class_A01_t04: Skip # Timeout
 
-[ $compiler == none && $runtime == vm && $system == windows ]
-LibTest/math/atan2_A01_t03: Fail # http://dartbug.com/5407
-LibTest/core/double/operator_remainder_A01_t04: Fail # http://dartbug.com/5407
-LibTest/core/double/remainder_A01_t04: Fail # http://dartbug.com/5407
-LibTest/core/double/round_A01_t01: Fail # http://dartbug.com/5407
-LibTest/core/int/operator_remainder_A01_t02: Fail # TODO(vm-team): Please triage this failure.
-LibTest/core/int/remainder_A01_t02: Fail # TODO(vm-team): Please triage this failure.
-
-
 [ $compiler == none && $runtime == vm ]
 
 # The following tests use the deprecated Date interface.
@@ -278,8 +265,8 @@
 LibTest/core/Date/toString_A02_t01: Fail, OK
 LibTest/core/Date/year_A01_t01: Fail, OK
 
-LibTest/isolate/SendPort/send_A02_t02: Fail, OK # co19 issue 293
-LibTest/isolate/SendPort/send_A02_t03: Fail, OK # co19 issue 293
+LibTest/isolate/SendPort/send_A02_t02: Skip # co19 issue 293
+LibTest/isolate/SendPort/send_A02_t03: Skip # co19 issue 293
 LibTest/isolate/SendPort/send_A02_t04: Fail, OK # co19 issue 293
 LibTest/core/LinkedHashMap/LinkedHashMap_class_A01_t01: Fail, OK # co19 issue 293
 LibTest/core/Map/getKeys_A01_t01: Fail, OK # co19 issue 293
diff --git a/tests/compiler/dart2js/class_codegen_test.dart b/tests/compiler/dart2js/class_codegen_test.dart
index 51b2d07..0aba4ec 100644
--- a/tests/compiler/dart2js/class_codegen_test.dart
+++ b/tests/compiler/dart2js/class_codegen_test.dart
@@ -64,14 +64,14 @@
 
 twoClasses() {
   String generated = compileAll(TEST_ONE);
-  Expect.isTrue(generated.contains('\$.A = {\n "super": "Object"'));
-  Expect.isTrue(generated.contains('\$.B = {\n "super": "Object"'));
+  Expect.isTrue(generated.contains('\$.A = {"":"Object;"'));
+  Expect.isTrue(generated.contains('\$.B = {"":"Object;"'));
 }
 
 subClass() {
   checkOutput(String generated) {
-    Expect.isTrue(generated.contains('\$.A = {\n "super": "Object"'));
-    Expect.isTrue(generated.contains('\$.B = {\n "super": "A"'));
+    Expect.isTrue(generated.contains('\$.A = {"":"Object;"'));
+    Expect.isTrue(generated.contains('\$.B = {"":"A;"'));
   }
 
   checkOutput(compileAll(TEST_TWO));
@@ -81,8 +81,7 @@
 fieldTest() {
   String generated = compileAll(TEST_FOUR);
   Expect.isTrue(generated.contains(r"""
-$.B = {"": ["y", "z", "x"],
- "super": "A"
+$.B = {"":"A;y,z,x"
 }"""));
 }
 
diff --git a/tests/compiler/dart2js/cpa_inference_test.dart b/tests/compiler/dart2js/cpa_inference_test.dart
index a8db3d5..9b9a1ba 100644
--- a/tests/compiler/dart2js/cpa_inference_test.dart
+++ b/tests/compiler/dart2js/cpa_inference_test.dart
@@ -111,6 +111,14 @@
   }
 
   /**
+   * Checks that the inferred type of the node corresponding to the last
+   * occurence of [: variable; :] in the program is the unknown concrete type.
+   */
+  void checkNodeHasUnknownType(String variable) {
+    return Expect.isTrue(inferrer.inferredTypes[findNode(variable)].isUnkown());
+  }
+
+  /**
    * Checks that [: className#fieldName :]'s inferred type is the concrete type
    * made of [baseTypes].
    */
@@ -120,11 +128,26 @@
         concreteFrom(baseTypes),
         inferrer.inferredFieldTypes[findField(className, fieldName)]);
   }
+
+  /**
+   * Checks that [: className#fieldName :]'s inferred type is the unknown
+   * concrete type.
+   */
+  void checkFieldHasUknownType(String className, String fieldName) {
+    return Expect.isTrue(
+        inferrer.inferredFieldTypes[findField(className, fieldName)]
+                .isUnkown());
+  }
 }
 
 const String CORELIB = r'''
   print(var obj) {}
-  abstract class num { operator +(x); operator *(x); operator -(x); }
+  abstract class num { 
+    operator +(x);
+    operator *(x);
+    operator -(x);
+    operator ==(x);
+  }
   abstract class int extends num { }
   abstract class double extends num { }
   class bool {}
@@ -144,10 +167,22 @@
   MockCompiler compiler = new MockCompiler(coreSource: CORELIB,
                                            enableConcreteTypeInference: true);
   compiler.sourceFiles[uri.toString()] = new SourceFile(uri.toString(), code);
+  compiler.typesTask.concreteTypesInferrer.testMode = true;
   compiler.runCompiler(uri);
   return new AnalysisResult(compiler);
 }
 
+testDynamicBackDoor() {
+  final String source = r"""
+    main () {
+      var x = "__dynamic_for_test";
+      x;
+    }
+    """;
+  AnalysisResult result = analyze(source);
+  result.checkNodeHasUnknownType('x');
+}
+
 testLiterals() {
   final String source = r"""
       main() {
@@ -267,6 +302,15 @@
   result.checkNodeHasType('bar', [result.int]);
 }
 
+testToplevelVariable() {
+  final String source = r"""
+      final top = 'abc';
+      main() { var foo = top; foo; }
+      """;
+  AnalysisResult result = analyze(source);
+  result.checkNodeHasType('foo', [result.string]);
+}
+
 testNonRecusiveFunction() {
   final String source = r"""
       f(x, y) => true ? x : y;
@@ -298,6 +342,49 @@
   result.checkNodeHasType('foo', [result.int, result.string]);
 }
 
+testSimpleSend() {
+  final String source = r"""
+      class A {
+        f(x) => x;
+      }
+      class B {
+        f(x) => 'abc';
+      }
+      class C {
+        f(x) => 3.14;
+      }
+      class D {
+        var f;  // we check that this field is ignored in calls to dynamic.f() 
+        D(this.f);
+      }
+      main() {
+        new B(); new D(42); // we instantiate B and D but not C
+        var foo = new A().f(42);
+        var bar = "__dynamic_for_test".f(42);
+        foo; bar;
+      }
+      """;
+  AnalysisResult result = analyze(source);
+  result.checkNodeHasType('foo', [result.int]);
+  result.checkNodeHasType('bar', [result.int, result.string]);
+}
+
+testSendToClosureField() {
+  final String source = r"""
+      f(x) => x;
+      class A {
+        var g;
+        A(this.g);
+      }
+      main() {
+        var foo = new A(f).g(42);
+        foo;
+      }
+      """;
+  AnalysisResult result = analyze(source);
+  result.checkNodeHasType('foo', [result.int]);
+}
+
 testSendToThis1() {
   final String source = r"""
       class A {
@@ -356,18 +443,27 @@
         get y => x;
         get z => y;
       }
+      class B {
+        var x;
+        B(this.x);
+      }
       main() {
         var a = new A(42);
+        var b = new B('abc');
         var foo = a.x;
         var bar = a.y;
         var baz = a.z;
-        foo; bar; baz;
+        var qux = null.x;
+        var quux = "__dynamic_for_test".x;
+        foo; bar; baz; qux; quux;
       }
       """;
   AnalysisResult result = analyze(source);
   result.checkNodeHasType('foo', [result.int]);
   result.checkNodeHasType('bar', [result.int]);
   result.checkNodeHasType('baz', [result.int]);
+  result.checkNodeHasType('qux', []);
+  result.checkNodeHasType('quux', [result.int, result.string]);
 }
 
 testSetters() {
@@ -379,15 +475,34 @@
         set y(a) { x = a; z = a; }
         set z(a) { w = a; }
       }
+      class B {
+        var x;
+        B(this.x);
+      }
       main() {
         var a = new A(42, 42);
+        var b = new B(42);
         a.x = 'abc';
         a.y = true;
+        null.x = 42;  // should be ignored
+        "__dynamic_for_test".x = null;
+        "__dynamic_for_test".y = 3.14;
       }
       """;
   AnalysisResult result = analyze(source);
-  result.checkFieldHasType('A', 'x', [result.int, result.string, result.bool]);
-  result.checkFieldHasType('A', 'w', [result.int, result.bool]);
+  result.checkFieldHasType('B', 'x',
+                           [result.int,         // new B(42)
+                            result.nullType]);  // dynamic.x = null
+  result.checkFieldHasType('A', 'x',
+                           [result.int,       // new A(42, ...)
+                            result.string,    // a.x = 'abc'
+                            result.bool,      // a.y = true
+                            result.nullType,  // dynamic.x = null
+                            result.double]);  // dynamic.y = 3.14
+  result.checkFieldHasType('A', 'w',
+                           [result.int,       // new A(..., 42)
+                            result.bool,      // a.y = true
+                            result.double]);  // dynamic.y = double
 }
 
 testNamedParameters() {
@@ -527,25 +642,55 @@
   result.checkNodeHasType('y', [result.string]);
 }
 
+testSetIndexOperator() {
+  final String source = r"""
+      class A {
+        var witness1;
+        var witness2;
+        operator []=(i, x) { witness1 = i; witness2 = x; }
+      }
+      main() {
+        var x = new A()[42] = "abc";
+        x;
+      }
+      """;
+  AnalysisResult result = analyze(source);
+  result.checkNodeHasType('x', [result.string]);
+  // TODO(polux): the two following results should be [:[null, string:], see
+  // testFieldInitialization().
+  result.checkFieldHasType('A', 'witness1', [result.int]);
+  result.checkFieldHasType('A', 'witness2', [result.string]);
+}
+
 testCompoundOperators1() {
   final String source = r"""
       class A {
         operator +(x) => "foo";
       }
       main() {
-        var x1 = 1; x1++;
-        var x2 = 1; ++x2;
-        var x3 = new A(); x3++;
-        var x4 = new A(); ++x4;
+        var x1 = 1;
+        x1++;
+        var x2 = 1;
+        ++x2;
+        var x3 = 1;
+        x3 += 42;
+        var x4 = new A();
+        x4++;
+        var x5 = new A();
+        ++x5;
+        var x6 = new A();
+        x6 += true;
 
-        x1; x2; x3; x4;
+        x1; x2; x3; x4; x5; x6;
       }
       """;
   AnalysisResult result = analyze(source);
   result.checkNodeHasType('x1', [result.int]);
   result.checkNodeHasType('x2', [result.int]);
-  result.checkNodeHasType('x3', [result.string]);
+  result.checkNodeHasType('x3', [result.int]);
   result.checkNodeHasType('x4', [result.string]);
+  result.checkNodeHasType('x5', [result.string]);
+  result.checkNodeHasType('x6', [result.string]);
 }
 
 
@@ -553,24 +698,58 @@
   final String source = r"""
     class A {
       var xx;
+      var yy;
       var witness1;
       var witness2;
+      var witness3;
+      var witness4;
 
-      A(this.xx);
+      A(this.xx, this.yy);
       get x { witness1 = "foo"; return xx; }
-      set x(y) { witness2 = "foo"; xx = y; }
+      set x(a) { witness2 = "foo"; xx = a; }
+      get y { witness3 = "foo"; return yy; }
+      set y(a) { witness4 = "foo"; yy = a; }
     }
     main () {
-      var a = new A(1);
+      var a = new A(1, 1);
       a.x++;
+      a.y++; 
     }
     """;
   AnalysisResult result = analyze(source);
   result.checkFieldHasType('A', 'xx', [result.int]);
-  // TODO(polux): the two following results should be {null, string}, see
-  // fieldInitialization().
+  result.checkFieldHasType('A', 'yy', [result.int]);
+  // TODO(polux): the four following results should be [:[null, string]:], see
+  // testFieldInitialization().
   result.checkFieldHasType('A', 'witness1', [result.string]);
   result.checkFieldHasType('A', 'witness2', [result.string]);
+  result.checkFieldHasType('A', 'witness3', [result.string]);
+  result.checkFieldHasType('A', 'witness4', [result.string]);
+}
+
+testInequality() {
+  final String source = r"""
+      class A {
+        var witness;
+        operator ==(x) { witness = "foo"; return "abc"; }
+      }
+      class B {
+        operator ==(x) { throw "error"; }
+      }
+      main() {
+        var foo = 1 != 2;
+        var bar = new A() != 2;
+        var baz = new B() != 2;
+        foo; bar; baz;
+      }
+      """;
+  AnalysisResult result = analyze(source);
+  result.checkNodeHasType('foo', [result.bool]);
+  result.checkNodeHasType('bar', [result.bool]);
+  result.checkNodeHasType('baz', []);
+  // TODO(polux): the following result should be [:[null, string]:], see
+  // fieldInitialization().
+  result.checkFieldHasType('A', 'witness', [result.string]);
 }
 
 testFieldInitialization() {
@@ -588,7 +767,43 @@
   result.checkFieldHasType('A', 'y', [result.int]);
 }
 
+testSendWithWrongArity() {
+  final String source = r"""
+    f(x) { }
+    class A { g(x) { } }
+    main () {
+      var x = f();
+      var y = f(1, 2);
+      var z = new A().g();
+      var w = new A().g(1, 2);
+      x; y; z; w;
+    }
+    """;
+  AnalysisResult result = analyze(source);
+  result.checkNodeHasType('x', []);
+  result.checkNodeHasType('y', []);
+  result.checkNodeHasType('z', []);
+  result.checkNodeHasType('w', []);
+}
+
+testDynamicIsAbsorbing() {
+  final String source = r"""
+    main () {
+      var x = 1;
+      if (true) {
+        x = "__dynamic_for_test";
+      } else {
+        x = 42;
+      }
+      x;
+    }
+    """;
+  AnalysisResult result = analyze(source);
+  result.checkNodeHasUnknownType('x');
+}
+
 void main() {
+  testDynamicBackDoor();
   testLiterals();
   testRedefinition();
   testIfThenElse();
@@ -596,9 +811,12 @@
   testWhile();
   testFor1();
   testFor2();
+  // testToplevelVariable();  // toplevel variables are not yet supported
   testNonRecusiveFunction();
   testRecusiveFunction();
   testMutuallyRecusiveFunction();
+  testSimpleSend();
+  // testSendToClosureField();  // closures are not yet supported
   testSendToThis1();
   testSendToThis2();
   testConstructor();
@@ -613,5 +831,9 @@
   testOperators();
   testCompoundOperators1();
   testCompoundOperators2();
+  testSetIndexOperator();
+  testInequality();
   // testFieldInitialization(); // TODO(polux)
+  testSendWithWrongArity();
+  testDynamicIsAbsorbing();
 }
diff --git a/tests/compiler/dart2js/mock_compiler.dart b/tests/compiler/dart2js/mock_compiler.dart
index 42b0300..8fa9030 100644
--- a/tests/compiler/dart2js/mock_compiler.dart
+++ b/tests/compiler/dart2js/mock_compiler.dart
@@ -45,7 +45,8 @@
   abstract class JavaScriptIndexingBehavior {}
   class JSInvocationMirror {}
   S() {}
-  assertHelper(a){}''';
+  assertHelper(a){}
+  throwNoSuchMethod(obj, name, arguments, expectedArgumentNames) {}''';
 
 const String DEFAULT_INTERCEPTORSLIB = r'''
   class JSArray {
@@ -54,6 +55,10 @@
   class JSString {
     var length;
   }
+  class JSNumber {
+  }
+  class ObjectInterceptor {
+  }
   getInterceptor(x) {}''';
 
 const String DEFAULT_CORELIB = r'''
diff --git a/tests/compiler/dart2js/no_constructor_body_test.dart b/tests/compiler/dart2js/no_constructor_body_test.dart
index 2193286..80cbeb2 100644
--- a/tests/compiler/dart2js/no_constructor_body_test.dart
+++ b/tests/compiler/dart2js/no_constructor_body_test.dart
@@ -18,5 +18,5 @@
 main() {
   String generated = compileAll(TEST);
   Expect.isTrue(
-      generated.contains('\$.A = {\n "super": "Object"\n}'));
+      generated.contains('\$.A = {"":"Object;"\n}'));
 }
diff --git a/tests/compiler/dart2js/no_duplicate_constructor_body_test.dart b/tests/compiler/dart2js/no_duplicate_constructor_body_test.dart
index 67fa8fc..c1a2e3b 100644
--- a/tests/compiler/dart2js/no_duplicate_constructor_body_test.dart
+++ b/tests/compiler/dart2js/no_duplicate_constructor_body_test.dart
@@ -16,7 +16,7 @@
 
 main() {
   String generated = compileAll(CODE);
-  RegExp regexp = new RegExp(r'\$.A = {\n "super"');
+  RegExp regexp = new RegExp(r'\$.A = {"":"[A-za-z]+;"');
   Iterator<Match> matches = regexp.allMatches(generated).iterator();
   checkNumberOfMatches(matches, 1);
 }
diff --git a/tests/compiler/dart2js/parser_helper.dart b/tests/compiler/dart2js/parser_helper.dart
index ed2af77..9946eca 100644
--- a/tests/compiler/dart2js/parser_helper.dart
+++ b/tests/compiler/dart2js/parser_helper.dart
@@ -85,8 +85,9 @@
   return unit.localMembers;
 }
 
-NodeList fullParseUnit(String source) {
-  return parseBodyCode(source, (parser, tokens) => parser.parseUnit(tokens));
+NodeList fullParseUnit(String source, {DiagnosticListener diagnosticHandler}) {
+  return parseBodyCode(source, (parser, tokens) => parser.parseUnit(tokens),
+                       diagnosticHandler: diagnosticHandler);
 }
 
 // TODO(ahe): We define this method to avoid having to import
diff --git a/tests/compiler/dart2js/parser_test.dart b/tests/compiler/dart2js/parser_test.dart
index 2bb1b49..bb78175 100644
--- a/tests/compiler/dart2js/parser_test.dart
+++ b/tests/compiler/dart2js/parser_test.dart
@@ -293,6 +293,18 @@
   Expect.throws(parse, check);
 }
 
+void testMissingCloseBraceInClass() {
+  final String source = 'class Foo {'; // Missing close '}'.
+  parse() {
+    fullParseUnit(source, diagnosticHandler: new Collector());
+  }
+  check(Collector c) {
+    Expect.equals(EOF_TOKEN, c.token);
+    return true;
+  }
+  Expect.throws(parse, check);
+}
+
 void main() {
   testGenericTypes();
   // TODO(ahe): Enable this test when we handle library prefixes.
@@ -308,4 +320,5 @@
   testPostfix();
   testOperatorParse();
   testMissingCloseParen();
+  testMissingCloseBraceInClass();
 }
diff --git a/tests/compiler/dart2js/value_range_test.dart b/tests/compiler/dart2js/value_range_test.dart
index 177eae5..45b6328 100644
--- a/tests/compiler/dart2js/value_range_test.dart
+++ b/tests/compiler/dart2js/value_range_test.dart
@@ -64,7 +64,7 @@
   return a.removeLast();
 }
 """,
-REMOVED, // TODO(6829): Put it back to KEPT
+KEPT,
 
 """
 main() {
diff --git a/tests/compiler/dart2js_native/native_field_name_test.dart b/tests/compiler/dart2js_native/native_field_name_test.dart
new file mode 100644
index 0000000..d479d82
--- /dev/null
+++ b/tests/compiler/dart2js_native/native_field_name_test.dart
@@ -0,0 +1,63 @@
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Check that native fields are not incorrectly renamed.
+
+class A native "*A" {
+  int myLongPropertyName;
+  int getValue;
+
+  int method(int z) => myLongPropertyName;
+}
+
+
+// This code is inside the setup function, so the function names are not 
+// accessible, but the makeA variable is global through the magic of JS scoping.
+// The contents of this are of course not analyzable by the compiler.
+void setup() native r"""
+function getter() {
+  return ++this.getValue;
+}
+
+function setter(x) {
+  this.getValue += 10;
+}
+  
+function A(){
+  var a = Object.create(
+      { constructor: { name: 'A'}},
+      { myLongPropertyName: { get: getter,
+                              set: setter,
+                              configurable: false,
+                              writeable: false
+                            }
+      });
+  a.getValue = 0;
+  return a;
+}
+
+makeA = function(){return new A;};
+""";
+
+A makeA() native { return new A(); }
+
+main() {
+  setup();
+  var a = makeA();
+  a.myLongPropertyName = 21;
+  int gotten = a.myLongPropertyName;
+  Expect.equals(11, gotten);
+
+  var a2 = makeA();
+  if (a2 is A) {
+    // Inside this 'if' the compiler knows that a2 is an A, so it is tempted
+    // to access myLongPropertyName directly, using its minified name.  But
+    // renaming of native properties can only work using getters and setters
+    // that access the original name.
+    a2.myLongPropertyName = 21;
+    int gotten = a2.myLongPropertyName;
+    Expect.equals(11, gotten);
+  }
+}
+
diff --git a/tests/compiler/dart2js_native/native_field_rename_1_frog_test.dart b/tests/compiler/dart2js_native/native_field_rename_1_frog_test.dart
index 112854f..317ce35 100644
--- a/tests/compiler/dart2js_native/native_field_rename_1_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_field_rename_1_frog_test.dart
@@ -18,10 +18,12 @@
 }
 
 class X native "*X" {
-  int native_key_method() native 'key';
+  @JSName('key')
+  int native_key_method() native;
   // This should cause B.key to be renamed, but not A.key.
 
-  int key() native 'key';
+  @JSName('key')
+  int key() native;
 }
 
 A makeA() native;
diff --git a/tests/compiler/dart2js_native/native_field_rename_2_frog_test.dart b/tests/compiler/dart2js_native/native_field_rename_2_frog_test.dart
index c6ae9c7..edbc3b3 100644
--- a/tests/compiler/dart2js_native/native_field_rename_2_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_field_rename_2_frog_test.dart
@@ -22,9 +22,11 @@
 }
 
 class X native "*X" {
-  int native_key_method() native 'key';
+  @JSName('key')
+  int native_key_method() native;
   // This should cause B.key to be renamed, but not A.key.
-  int key() native 'key';
+  @JSName('key')
+  int key() native;
 }
 
 A makeA() native;
diff --git a/tests/compiler/dart2js_native/native_method_rename1_frog_test.dart b/tests/compiler/dart2js_native/native_method_rename1_frog_test.dart
index 820763e..a4add4c 100644
--- a/tests/compiler/dart2js_native/native_method_rename1_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_method_rename1_frog_test.dart
@@ -5,9 +5,14 @@
 // Test the feature where the native string declares the native method's name.
 
 class A native "*A" {
-  int foo() native 'fooA';
-  int bar() native 'barA';
-  int baz() native 'bazA';
+  @JSName('fooA')
+  int foo() native;
+
+  @JSName('barA')
+  int bar() native;
+
+  @JSName('bazA')
+  int baz() native;
 }
 
 A makeA() native;
diff --git a/tests/compiler/dart2js_native/native_method_rename2_frog_test.dart b/tests/compiler/dart2js_native/native_method_rename2_frog_test.dart
index f3d4bff..c030c7e 100644
--- a/tests/compiler/dart2js_native/native_method_rename2_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_method_rename2_frog_test.dart
@@ -5,11 +5,13 @@
 // Test the feature where the native string declares the native method's name.
 
 class A native "*A" {
-  int foo() native 'fooA';
+  @JSName('fooA')
+  int foo() native;
 }
 
 class B extends A native "*B" {
-  int foo() native 'fooB';
+  @JSName('fooB')
+  int foo() native;
 }
 
 makeA() native;
diff --git a/tests/compiler/dart2js_native/native_method_rename3_frog_test.dart b/tests/compiler/dart2js_native/native_method_rename3_frog_test.dart
index d1ec6aa..88fc641 100644
--- a/tests/compiler/dart2js_native/native_method_rename3_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_method_rename3_frog_test.dart
@@ -6,11 +6,13 @@
 // #3. The name does not get
 
 class A native "*A" {
-  int foo() native 'fooA';
+  @JSName('fooA')
+  int foo() native;
 }
 
 class B extends A native "*B" {
-  int foo() native 'fooB';
+  @JSName('fooB')
+  int foo() native;
   int fooA() => 333;
 }
 
diff --git a/tests/corelib/futures_test.dart b/tests/corelib/futures_test.dart
index e5daa1d..70a54bf 100644
--- a/tests/corelib/futures_test.dart
+++ b/tests/corelib/futures_test.dart
@@ -27,18 +27,47 @@
   return Futures.wait(futures);
 }
 
+Future testForEachEmpty() {
+  return Futures.forEach([], (_) {
+    throw 'should not be called';
+  });
+}
+
+Future testForEach() {
+  var seen = <int>[];
+  return Futures.forEach([1, 2, 3, 4, 5], (n) {
+    seen.add(n);
+    return new Future.immediate(null);
+  }).transform((_) => Expect.listEquals([1, 2, 3, 4, 5], seen));
+}
+
+Future testForEachWithException() {
+  var seen = <int>[];
+  return Futures.forEach([1, 2, 3, 4, 5], (n) {
+    if (n == 4) throw 'correct exception';
+    seen.add(n);
+    return new Future.immediate(null);
+  }).transform((_) {
+    throw 'incorrect exception';
+  }).transformException((e) {
+    Expect.equals('correct exception', e);
+  });
+}
+
 main() {
   List<Future> futures = new List<Future>();
 
   futures.add(testWaitEmpty());
   futures.add(testCompleteAfterWait());
   futures.add(testCompleteBeforeWait());
+  futures.add(testForEachEmpty());
+  futures.add(testForEach());
 
   // Use a receive port for blocking the test. 
   // Note that if the test fails, the program will not end.
   ReceivePort port = new ReceivePort();
   Futures.wait(futures).then((List list) {
-    Expect.equals(3, list.length);
+    Expect.equals(5, list.length);
     port.close();
   });
 }
diff --git a/tests/html/audiobuffersourcenode_test.dart b/tests/html/audiobuffersourcenode_test.dart
index 54d0b6a..3e19ba6 100644
--- a/tests/html/audiobuffersourcenode_test.dart
+++ b/tests/html/audiobuffersourcenode_test.dart
@@ -1,7 +1,7 @@
 library AudioBufferSourceNodeTest;
 import '../../pkg/unittest/lib/unittest.dart';
 import '../../pkg/unittest/lib/html_config.dart';
-import 'dart:html';
+import 'dart:web_audio';
 
 main() {
 
diff --git a/tests/html/audiocontext_test.dart b/tests/html/audiocontext_test.dart
index 8e78436..6236753 100644
--- a/tests/html/audiocontext_test.dart
+++ b/tests/html/audiocontext_test.dart
@@ -2,6 +2,7 @@
 import '../../pkg/unittest/lib/unittest.dart';
 import '../../pkg/unittest/lib/html_config.dart';
 import 'dart:html';
+import 'dart:web_audio';
 
 main() {
 
diff --git a/tests/html/audioelement_test.dart b/tests/html/audioelement_test.dart
index 0b518e0..bf66654 100644
--- a/tests/html/audioelement_test.dart
+++ b/tests/html/audioelement_test.dart
@@ -1,7 +1,7 @@
 library AudioElementTest;
 import '../../pkg/unittest/lib/unittest.dart';
 import '../../pkg/unittest/lib/html_config.dart';
-import 'dart:html';
+import 'dart:web_audio';
 
 main() {
   useHtmlConfiguration();
diff --git a/tests/html/client_rect_test.dart b/tests/html/client_rect_test.dart
index 4086a0d..2363bfc 100644
--- a/tests/html/client_rect_test.dart
+++ b/tests/html/client_rect_test.dart
@@ -10,7 +10,7 @@
 
   insertTestDiv() {
     var element = new Element.tag('div');
-    element.innerHTML = r'''
+    element.innerHtml = r'''
     A large block of text should go here. Click this
     block of text multiple times to see each line
     highlight with every click of the mouse button.
diff --git a/tests/html/cssstyledeclaration_test.dart b/tests/html/cssstyledeclaration_test.dart
index 1383561..d2783f4 100644
--- a/tests/html/cssstyledeclaration_test.dart
+++ b/tests/html/cssstyledeclaration_test.dart
@@ -25,7 +25,7 @@
     expect(style, hasLength(0));
     // These assertions throw a UnimplementedError in dartium:
     // expect(style.parentRule, isNull);
-    // expect(style.getPropertyCSSValue('color'), isNull);
+    // expect(style.getPropertyCssValue('color'), isNull);
     // expect(style.getPropertyShorthand('color'), isNull);
   });
 
diff --git a/tests/html/datalistelement_test.dart b/tests/html/datalistelement_test.dart
index e6022cb..7b41aad 100644
--- a/tests/html/datalistelement_test.dart
+++ b/tests/html/datalistelement_test.dart
@@ -18,7 +18,7 @@
   setUp(() {
       div = new DivElement();
       document.body.nodes.add(div);
-      div.innerHTML = """
+      div.innerHtml = """
 <input id="input" list="browsers" />
 <datalist id="browsers">
   <option value="Chrome">
diff --git a/tests/html/documentfragment_test.dart b/tests/html/documentfragment_test.dart
index cd47c38..63d4e23 100644
--- a/tests/html/documentfragment_test.dart
+++ b/tests/html/documentfragment_test.dart
@@ -45,7 +45,7 @@
     expect(style.length, isZero);
     // TODO(jacobr): these checks throw UnimplementedErrors in dartium.
     // expect(style.parentRule, isNull);
-    // expect(style.getPropertyCSSValue('color'), isNull);
+    // expect(style.getPropertyCssValue('color'), isNull);
     // expect(style.getPropertyShorthand('color'), isNull);
     // expect(style.isPropertyImplicit('color'), isFalse);
 
@@ -182,18 +182,18 @@
     });
   });
 
-  test('setting innerHTML works', () {
+  test('setting innerHtml works', () {
     var fragment = new DocumentFragment();
     fragment.nodes.add(new Text("foo"));
-    fragment.innerHTML = "<a>bar</a>baz";
+    fragment.innerHtml = "<a>bar</a>baz";
     expect(_nodeStrings(fragment.nodes), equals(["A", "baz"]));
   });
 
-  test('getting innerHTML works', () {
+  test('getting innerHtml works', () {
     var fragment = new DocumentFragment();
     fragment.nodes.addAll([new Text("foo"), new Element.html("<A>bar</A>")]);
-    expect(fragment.innerHTML, "foo<a>bar</a>");
-    expect(fragment.outerHTML, "foo<a>bar</a>");
+    expect(fragment.innerHtml, "foo<a>bar</a>");
+    expect(fragment.outerHtml, "foo<a>bar</a>");
   });
 
   group('insertAdjacentElement', () {
@@ -203,28 +203,28 @@
       var fragment = getFragment();
       expect(fragment.insertAdjacentElement("beforeBegin",
           new Element.tag("b")), isNull);
-      expect(fragment.innerHTML, "<a>foo</a>");
+      expect(fragment.innerHtml, "<a>foo</a>");
     });
 
     test('afterEnd does nothing', () {
       var fragment = getFragment();
       expect(fragment.insertAdjacentElement("afterEnd",
           new Element.tag("b")), isNull);
-      expect(fragment.innerHTML, "<a>foo</a>");
+      expect(fragment.innerHtml, "<a>foo</a>");
     });
 
     test('afterBegin inserts the element', () {
       var fragment = getFragment();
       var el = new Element.tag("b");
       expect(fragment.insertAdjacentElement("afterBegin", el), equals(el));
-      expect(fragment.innerHTML, "<b></b><a>foo</a>");
+      expect(fragment.innerHtml, "<b></b><a>foo</a>");
     });
 
     test('beforeEnd inserts the element', () {
       var fragment = getFragment();
       var el = new Element.tag("b");
       expect(fragment.insertAdjacentElement("beforeEnd", el), equals(el));
-      expect(fragment.innerHTML, "<a>foo</a><b></b>");
+      expect(fragment.innerHtml, "<a>foo</a><b></b>");
     });
   });
 
@@ -234,53 +234,53 @@
     test('beforeBegin does nothing', () {
       var fragment = getFragment();
       fragment.insertAdjacentText("beforeBegin", "foo");
-      expect(fragment.innerHTML, "<a>foo</a>");
+      expect(fragment.innerHtml, "<a>foo</a>");
     });
 
     test('afterEnd does nothing', () {
       var fragment = getFragment();
       fragment.insertAdjacentText("afterEnd", "foo");
-      expect(fragment.innerHTML, "<a>foo</a>");
+      expect(fragment.innerHtml, "<a>foo</a>");
     });
 
     test('afterBegin inserts the text', () {
       var fragment = getFragment();
       fragment.insertAdjacentText("afterBegin", "foo");
-      expect(fragment.innerHTML, "foo<a>foo</a>");
+      expect(fragment.innerHtml, "foo<a>foo</a>");
     });
 
     test('beforeEnd inserts the text', () {
       var fragment = getFragment();
       fragment.insertAdjacentText("beforeEnd", "foo");
-      expect(fragment.innerHTML, "<a>foo</a>foo");
+      expect(fragment.innerHtml, "<a>foo</a>foo");
     });
   });
 
-  group('insertAdjacentHTML', () {
+  group('insertAdjacentHtml', () {
     getFragment() => new DocumentFragment.html("<a>foo</a>");
 
     test('beforeBegin does nothing', () {
       var fragment = getFragment();
-      fragment.insertAdjacentHTML("beforeBegin", "foo<br>");
-      expect(fragment.innerHTML, "<a>foo</a>");
+      fragment.insertAdjacentHtml("beforeBegin", "foo<br>");
+      expect(fragment.innerHtml, "<a>foo</a>");
     });
 
     test('afterEnd does nothing', () {
       var fragment = getFragment();
-      fragment.insertAdjacentHTML("afterEnd", "<br>foo");
-      expect(fragment.innerHTML, "<a>foo</a>");
+      fragment.insertAdjacentHtml("afterEnd", "<br>foo");
+      expect(fragment.innerHtml, "<a>foo</a>");
     });
 
     test('afterBegin inserts the HTML', () {
       var fragment = getFragment();
-      fragment.insertAdjacentHTML("afterBegin", "foo<br>");
-      expect(fragment.innerHTML, "foo<br><a>foo</a>");
+      fragment.insertAdjacentHtml("afterBegin", "foo<br>");
+      expect(fragment.innerHtml, "foo<br><a>foo</a>");
     });
 
     test('beforeEnd inserts the HTML', () {
       var fragment = getFragment();
-      fragment.insertAdjacentHTML("beforeEnd", "<br>foo");
-      expect(fragment.innerHTML, "<a>foo</a><br>foo");
+      fragment.insertAdjacentHtml("beforeEnd", "<br>foo");
+      expect(fragment.innerHtml, "<a>foo</a><br>foo");
     });
   });
 
diff --git a/tests/html/element_add_test.dart b/tests/html/element_add_test.dart
index ef911fdd..ece267d 100644
--- a/tests/html/element_add_test.dart
+++ b/tests/html/element_add_test.dart
@@ -18,15 +18,15 @@
   void expectNoSuchMethod(void fn()) =>
     expect(fn, throwsNoSuchMethodError);
 
-  group('addHtml', () {
+   group('append', () {
     test('htmlelement', () {
       var el = new DivElement();
-      el.addHtml('<span></span>');
+      el.append(new SpanElement());
       expect(el.children.length, equals(1));
       var span = el.children[0];
       expect(span, isSpanElement);
 
-      el.addHtml('<div></div>');
+      el.append(new DivElement());
       expect(el.children.length, equals(2));
       // Validate that the first item is still first.
       expect(el.children[0], equals(span));
@@ -35,16 +35,39 @@
 
     test('documentFragment', () {
       var fragment = new DocumentFragment();
-      fragment.addHtml('<span>something</span>');
+      fragment.append(new SpanElement());
       expect(fragment.children.length, equals(1));
       expect(fragment.children[0], isSpanElement);
     });
   });
 
-  group('addText', () {
+  group('appendHtml', () {
     test('htmlelement', () {
       var el = new DivElement();
-      el.addText('foo');
+      el.appendHtml('<span></span>');
+      expect(el.children.length, equals(1));
+      var span = el.children[0];
+      expect(span, isSpanElement);
+
+      el.appendHtml('<div></div>');
+      expect(el.children.length, equals(2));
+      // Validate that the first item is still first.
+      expect(el.children[0], equals(span));
+      expect(el.children[1], isDivElement);
+    });
+
+    test('documentFragment', () {
+      var fragment = new DocumentFragment();
+      fragment.appendHtml('<span>something</span>');
+      expect(fragment.children.length, equals(1));
+      expect(fragment.children[0], isSpanElement);
+    });
+  });
+
+  group('appendText', () {
+    test('htmlelement', () {
+      var el = new DivElement();
+      el.appendText('foo');
       // No children were created.
       expect(el.children.length, equals(0));
       // One text node was added.
@@ -53,7 +76,7 @@
 
     test('documentFragment', () {
       var fragment = new DocumentFragment();
-      fragment.addText('foo');
+      fragment.appendText('foo');
       // No children were created.
       expect(fragment.children.length, equals(0));
       // One text node was added.
@@ -111,13 +134,13 @@
     });
   });
 
-  group('insertAdjacentHTML', () {
+  group('insertAdjacentHtml', () {
     test('beforebegin', () {
       var parent = new DivElement();
       var child = new DivElement();
       parent.children.add(child);
 
-      child.insertAdjacentHTML('beforebegin', '<span></span>');
+      child.insertAdjacentHtml('beforebegin', '<span></span>');
 
       expect(parent.children.length, 2);
       expect(parent.children[0], isSpanElement);
@@ -128,7 +151,7 @@
       var child = new DivElement();
       parent.children.add(child);
 
-      child.insertAdjacentHTML('afterend', '<span></span>');
+      child.insertAdjacentHtml('afterend', '<span></span>');
 
       expect(parent.children.length, 2);
       expect(parent.children[1], isSpanElement);
@@ -139,7 +162,7 @@
       var child = new DivElement();
       parent.children.add(child);
 
-      parent.insertAdjacentHTML('afterbegin', '<span></span>');
+      parent.insertAdjacentHtml('afterbegin', '<span></span>');
 
       expect(parent.children.length, 2);
       expect(parent.children[0], isSpanElement);
@@ -150,7 +173,7 @@
       var child = new DivElement();
       parent.children.add(child);
 
-      parent.insertAdjacentHTML('beforeend', '<span></span>');
+      parent.insertAdjacentHtml('beforeend', '<span></span>');
 
       expect(parent.children.length, 2);
       expect(parent.children[1], isSpanElement);
diff --git a/tests/html/element_classes_test.dart b/tests/html/element_classes_test.dart
index ab0be3b..2ef18cc 100644
--- a/tests/html/element_classes_test.dart
+++ b/tests/html/element_classes_test.dart
@@ -21,7 +21,7 @@
   Set<String> makeClassSet() => makeElementWithClasses().classes;
 
   Set<String> extractClasses(Element el) {
-    final match = new RegExp('class="([^"]+)"').firstMatch(el.outerHTML);
+    final match = new RegExp('class="([^"]+)"').firstMatch(el.outerHtml);
     return new Set.from(match[1].split(' '));
   }
 
@@ -45,7 +45,7 @@
   });
 
   test('toString', () {
-    expect(makeClassSet().toString().split(' '), 
+    expect(makeClassSet().toString().split(' '),
         unorderedEquals(['foo', 'bar', 'baz']));
     expect(makeElement().classes.toString(), '');
   });
diff --git a/tests/html/element_test.dart b/tests/html/element_test.dart
index 2a5d460..6825c91 100644
--- a/tests/html/element_test.dart
+++ b/tests/html/element_test.dart
@@ -464,6 +464,34 @@
         attributes['style'] = 'width: 300px;';
         expect(attributes.length, 5);
       });
+
+      test('namespaces', () {
+        var element = new svg.SvgElement.svg(
+          '''<svg xmlns="http://www.w3.org/2000/svg"
+                  xmlns:xlink="http://www.w3.org/1999/xlink">
+            <image xlink:href="foo" data-foo="bar"/>
+          </svg>''').elements[0];
+
+        var attributes = element.attributes;
+        expect(attributes.length, 1);
+        expect(attributes['data-foo'], 'bar');
+
+        var xlinkAttrs =
+            element.getNamespacedAttributes('http://www.w3.org/1999/xlink');
+        expect(xlinkAttrs.length, 1);
+        expect(xlinkAttrs['href'], 'foo');
+
+        xlinkAttrs.remove('href');
+        expect(xlinkAttrs.length, 0);
+
+        xlinkAttrs['href'] = 'bar';
+        expect(xlinkAttrs['href'], 'bar');
+
+        var randomAttrs = element.getNamespacedAttributes('http://example.com');
+        expect(randomAttrs.length, 0);
+        randomAttrs['href'] = 'bar';
+        expect(randomAttrs.length, 1);
+      });
   });
 
   group('children', () {
diff --git a/tests/html/event_test.dart b/tests/html/event_test.dart
index e676fb4..c4c4609 100644
--- a/tests/html/event_test.dart
+++ b/tests/html/event_test.dart
@@ -90,8 +90,8 @@
   eventTest('HashChangeEvent',
       () => new HashChangeEvent('foo', 'http://old.url', 'http://new.url'),
       (ev) {
-    expect(ev.oldURL, equals('http//old.url'));
-    expect(ev.newURL, equals('http://new.url'));
+    expect(ev.oldUrl, equals('http//old.url'));
+    expect(ev.newUrl, equals('http://new.url'));
   });
 
   eventTest('KeyboardEvent',
diff --git a/tests/html/form_element_test.dart b/tests/html/form_element_test.dart
index 9539387..b7d030c 100644
--- a/tests/html/form_element_test.dart
+++ b/tests/html/form_element_test.dart
@@ -21,11 +21,11 @@
 
   test('checkValidityTest', () {
     var form = new FormElement();
-    form.innerHTML = '<label>Google: <input type="search" name="q"></label> '
+    form.innerHtml = '<label>Google: <input type="search" name="q"></label> '
                      '<input type="submit" value="Search...">';
     expect(form.checkValidity(), isTrue);
     // TODO(efortuna): Issue 4832.
-    form.innerHTML = '<input type="email" value="notemail" blaber="test"'
+    form.innerHtml = '<input type="email" value="notemail" blaber="test"'
                      ' required>';
     expect(form.checkValidity(), isFalse);
   });
@@ -36,47 +36,47 @@
     form.acceptCharset = charset;
     expect(form.acceptCharset, charset);
   });
-  
+
   test('actionTest', () {
     var action = 'http://dartlang.org/';
     form.action = action;
     expect(form.action, action);
   });
-  
+
   test('autocompleteTest', () {
     var auto = 'on';
     form.autocomplete = auto;
     expect(form.autocomplete, auto);
   });
-  
+
   test('encodingAndEnctypeTest', () {
     expect(form.enctype, form.encoding);
   });
-  
+
   test('lengthTest', () {
     expect(form.length, 0);
-    form.innerHTML = '<label>Google: <input type="search" name="q"></label> '
+    form.innerHtml = '<label>Google: <input type="search" name="q"></label> '
                      '<input type="submit" value="Search...">';
     expect(form.length, 2);
   });
-  
+
   test('methodTest', () {
     var method = 'post';
     form.method = method;
     expect(form.method, method);
   });
-  
+
   test('nameTest', () {
     var name = 'aname';
     form.name = name;
     expect(form.name, name);
   });
-  
+
   test('noValidateTest', () {
     form.noValidate = true;
     expect(form.noValidate, true);
   });
-  
+
   test('targetTest', () {
     var target = 'target';
     form.target = target;
diff --git a/tests/html/html.status b/tests/html/html.status
index 49e137f..17d95df 100644
--- a/tests/html/html.status
+++ b/tests/html/html.status
@@ -33,7 +33,6 @@
 audioelement_test: Fail # Issue 4517
 blob_constructor_test: Fail # Issue 4517
 css_test: Fail # Issue 4517
-htmlaudioelement_test: Fail # Issue 4517
 form_data_test: Fail # Possibly Issue 4517
 fileapi_test: Fail # Possibly Issue 4517
 websql_test: Pass, Fail # Possibly Issue 4517
@@ -76,7 +75,6 @@
 indexeddb_4_test: Fail
 inner_frame_test: Skip
 isolates_test: Skip
-js_interop_2_test: Fail
 localstorage_test: Fail
 measurement_test: Fail, Pass
 messageevent_test: Fail
@@ -85,8 +83,8 @@
 storage_test: Fail, Pass
 svgelement_test/additionalConstructors: Fail
 svgelement_test/elementset: Fail
-svgelement_test/innerHTML: Fail
-svgelement_test/outerHTML: Fail
+svgelement_test/innerHtml: Fail
+svgelement_test/outerHtml: Fail
 svgelement2_test: Fail
 svg_3_test: Fail
 typed_arrays_1_test: Fail
@@ -134,7 +132,6 @@
 indexeddb_2_test: Fail
 indexeddb_3_test: Fail
 indexeddb_4_test: Fail
-js_interop_2_test: Fail
 messageevent_test: Fail
 mutationobserver_test: Fail
 postmessage_structured_test: Skip   # BUG(5685): times out.
@@ -146,8 +143,8 @@
 svgelement_test/additionalConstructors: Fail
 svgelement_test/elementset: Fail
 element_test/eventListening: Fail
-svgelement_test/innerHTML: Fail
-svgelement_test/outerHTML: Fail
+svgelement_test/innerHtml: Fail
+svgelement_test/outerHtml: Fail
 svgelement2_test: Fail
 url_test: Fail              # IE9 does not support createObjectURL (it is supported in IE10)
 websocket_test: Fail
@@ -201,8 +198,8 @@
 svgelement_test/additionalConstructors: Fail
 svgelement_test/elementget: Fail
 svgelement_test/elementset: Fail
-svgelement_test/innerHTML: Crash, Fail
-svgelement_test/outerHTML: Fail
+svgelement_test/innerHtml: Crash, Fail
+svgelement_test/outerHtml: Fail
 svgelement_test/svg: Fail
 url_test: Fail
 
diff --git a/tests/html/htmlaudioelement_test.dart b/tests/html/htmlaudioelement_test.dart
deleted file mode 100644
index b3bcc08..0000000
--- a/tests/html/htmlaudioelement_test.dart
+++ /dev/null
@@ -1,25 +0,0 @@
-library AudioElementTest;
-import '../../pkg/unittest/lib/unittest.dart';
-import '../../pkg/unittest/lib/html_config.dart';
-import 'dart:html';
-
-main() {
-
-  useHtmlConfiguration();
-
-  var isAudioElement =
-      predicate((x) => x is AudioElement, 'is an AudioElement');
-
-  test('constructorTest1', () {
-      var audio = new AudioElement();   // would be new Audio() in JS
-      expect(audio, isNotNull);
-      expect(audio, isAudioElement);
-    });
-
-  test('constructorTest2', () {
-      var audio = new AudioElement('hahaURL');
-      expect(audio, isNotNull);
-      expect(audio, isAudioElement);
-      expect(audio.src.indexOf('hahaURL'), greaterThanOrEqualTo(0));
-    });
-}
diff --git a/tests/html/htmlcollection_test.dart b/tests/html/htmlcollection_test.dart
index ad993ff..cf7f184 100644
--- a/tests/html/htmlcollection_test.dart
+++ b/tests/html/htmlcollection_test.dart
@@ -7,7 +7,7 @@
 main() {
   Element insertTestDiv() {
     Element element = new Element.tag('div');
-    element.innerHTML = r"""
+    element.innerHtml = r"""
 <div id='allChecked'>
 <input type="checkbox" name="c1" value="1" checked="yes">
 <input type="checkbox" name="c2" value="2" checked="yes">
diff --git a/tests/html/htmlelement_test.dart b/tests/html/htmlelement_test.dart
index b7964c2..f9455df 100644
--- a/tests/html/htmlelement_test.dart
+++ b/tests/html/htmlelement_test.dart
@@ -8,11 +8,11 @@
   test('InnerHTML', () {
     Element element = new Element.tag('div');
     element.id = 'test';
-    element.innerHTML = 'Hello World';
+    element.innerHtml = 'Hello World';
     document.body.nodes.add(element);
 
     element = document.query('#test');
-    expect(element.innerHTML, 'Hello World');
+    expect(element.innerHtml, 'Hello World');
     element.remove();
   });
   test('HTMLTable', () {
@@ -68,7 +68,7 @@
     expect(keys, unorderedEquals(['foo', 'bar']));
     expect(values, unorderedEquals(['foo-value', 'bar-value']));
 
-    expect(new List<String>.from(div.dataAttributes.keys), 
+    expect(new List<String>.from(div.dataAttributes.keys),
         unorderedEquals(['foo', 'bar']));
     expect(new List<String>.from(div.dataAttributes.values),
         unorderedEquals(['foo-value', 'bar-value']));
diff --git a/tests/html/instance_of_test.dart b/tests/html/instance_of_test.dart
index 0643507..dd4355b 100644
--- a/tests/html/instance_of_test.dart
+++ b/tests/html/instance_of_test.dart
@@ -43,8 +43,8 @@
     // expect(context, isNot(isCanvasPixelArray));
 
     // FIXME(b/5286633): Interface injection type check workaround.
-    var image = context.createImageData(canvas.width as Dynamic,
-                                        canvas.height as Dynamic);
+    var image = context.createImageData(canvas.width as dynamic,
+                                        canvas.height as dynamic);
     expect(image, isNot(isCanvasRenderingContext));
     expect(image, isNot(isCanvasRenderingContext2D));
     expect(image, isNot(isElement));
diff --git a/tests/html/js_interop_1_test.dart b/tests/html/js_interop_1_test.dart
index 610d873..168294f 100644
--- a/tests/html/js_interop_1_test.dart
+++ b/tests/html/js_interop_1_test.dart
@@ -11,7 +11,7 @@
 injectSource(code) {
   final script = new ScriptElement();
   script.type = 'text/javascript';
-  script.innerHTML = code;
+  script.innerHtml = code;
   document.body.nodes.add(script);
 }
 
diff --git a/tests/html/js_interop_2_test.dart b/tests/html/js_interop_2_test.dart
index 0f03f54..7f7550a 100644
--- a/tests/html/js_interop_2_test.dart
+++ b/tests/html/js_interop_2_test.dart
@@ -11,7 +11,7 @@
 injectSource(code) {
   final script = new ScriptElement();
   script.type = 'text/javascript';
-  script.innerHTML = code;
+  script.innerHtml = code;
   document.body.nodes.add(script);
 }
 
diff --git a/tests/html/js_interop_3_test.dart b/tests/html/js_interop_3_test.dart
index 844dd11..142c4d9 100644
--- a/tests/html/js_interop_3_test.dart
+++ b/tests/html/js_interop_3_test.dart
@@ -11,7 +11,7 @@
 injectSource(code) {
   final script = new ScriptElement();
   script.type = 'text/javascript';
-  script.innerHTML = code;
+  script.innerHtml = code;
   document.body.nodes.add(script);
 }
 
diff --git a/tests/html/keyboard_event_test.dart b/tests/html/keyboard_event_test.dart
new file mode 100644
index 0000000..4f32f2d
--- /dev/null
+++ b/tests/html/keyboard_event_test.dart
@@ -0,0 +1,30 @@
+library KeyboardEventTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
+
+// Test that we are correctly determining keyCode and charCode uniformly across
+// browsers.
+
+main() {
+
+  useHtmlConfiguration();
+
+  keydownHandlerTest(KeyEvent e) {
+    expect(e.charCode, 0);
+  }
+
+  test('keys', () {
+    // This test currently is pretty much a no-op because we
+    // can't (right now) construct KeyboardEvents with specific keycode/charcode
+    // values (a KeyboardEvent can be "init"-ed but not all the information can
+    // be programmatically populated. It exists as an example for how to use
+    // KeyboardEventController more than anything else.
+    var controller = new KeyboardEventController.keydown(document.window);
+    var func = keydownHandlerTest;
+    controller.add(func);
+    document.window.on.keyDown.add((e) => print('regular listener'), false);
+  });
+}
+
+
diff --git a/tests/html/postmessage_structured_test.dart b/tests/html/postmessage_structured_test.dart
index f3999c3..8581dc2 100644
--- a/tests/html/postmessage_structured_test.dart
+++ b/tests/html/postmessage_structured_test.dart
@@ -12,7 +12,7 @@
 injectSource(code) {
   final script = new ScriptElement();
   script.type = 'text/javascript';
-  script.innerHTML = code;
+  script.innerHtml = code;
   document.body.nodes.add(script);
 }
 
diff --git a/tests/html/svg_1_test.dart b/tests/html/svg_1_test.dart
index a6bfc44..d5033c4 100644
--- a/tests/html/svg_1_test.dart
+++ b/tests/html/svg_1_test.dart
@@ -14,7 +14,7 @@
   test('simpleRect', () {
       var div = new Element.tag('div');
       document.body.nodes.add(div);
-      div.innerHTML = r'''
+      div.innerHtml = r'''
 <svg id='svg1' width='200' height='100'>
 <rect id='rect1' x='10' y='20' width='130' height='40' rx='5'fill='blue'></rect>
 </svg>
diff --git a/tests/html/svg_2_test.dart b/tests/html/svg_2_test.dart
index 2b12818..89f4fe2 100644
--- a/tests/html/svg_2_test.dart
+++ b/tests/html/svg_2_test.dart
@@ -11,7 +11,7 @@
 
   insertTestDiv() {
     var element = new Element.tag('div');
-    element.innerHTML = r'''
+    element.innerHtml = r'''
 <svg id='svg1' width='200' height='100'>
 <rect id='rect1' x='10' y='20' width='130' height='40' rx='5'fill='blue'></rect>
 </svg>
diff --git a/tests/html/svg_3_test.dart b/tests/html/svg_3_test.dart
index d5a4e4f..b076ed6 100644
--- a/tests/html/svg_3_test.dart
+++ b/tests/html/svg_3_test.dart
@@ -27,7 +27,7 @@
 
   insertTestDiv() {
     var element = new Element.tag('div');
-    element.innerHTML = r'''
+    element.innerHtml = r'''
 <svg id='svg1' width='200' height='100'>
 <rect id='rect1' x='10' y='20' width='130' height='40' rx='5'fill='blue'></rect>
 </svg>
@@ -105,10 +105,10 @@
     var bbox = e.getBBox();
     expect(bbox, isSvgRect);
 
-    var ctm = e.getCTM();
+    var ctm = e.getCtm();
     expect(ctm, isSvgMatrix);
 
-    var sctm = e.getScreenCTM();
+    var sctm = e.getScreenCtm();
     expect(sctm, isSvgMatrix);
 
     var xf2e = e.getTransformToElement(e);
diff --git a/tests/html/svgelement_test.dart b/tests/html/svgelement_test.dart
index e41c35614..21f8205 100644
--- a/tests/html/svgelement_test.dart
+++ b/tests/html/svgelement_test.dart
@@ -44,8 +44,8 @@
 </svg>""";
         final el = new svg.SvgElement.svg(svgContent);
         expect(el, isSvgSvgElement);
-        expect(el.innerHTML, "<circle></circle><path></path>");
-        expect(el.outerHTML, svgContent);
+        expect(el.innerHtml, "<circle></circle><path></path>");
+        expect(el.outerHtml, svgContent);
       });
 
       test('has no parent', () =>
@@ -149,29 +149,29 @@
     testConstructor('view', (e) => e is svg.ViewElement);
   });
 
-  group('outerHTML', () {
-    test('outerHTML', () {
+  group('outerHtml', () {
+    test('outerHtml', () {
       final el = new svg.SvgSvgElement();
       el.children.add(new svg.CircleElement());
       el.children.add(new svg.PathElement());
-      expect(el.outerHTML,
+      expect(el.outerHtml,
           '<svg version="1.1"><circle></circle><path></path></svg>');
     });
   });
 
-  group('innerHTML', () {
+  group('innerHtml', () {
     test('get', () {
       final el = new svg.SvgSvgElement();
       el.children.add(new svg.CircleElement());
       el.children.add(new svg.PathElement());
-      expect(el.innerHTML, '<circle></circle><path></path>');
+      expect(el.innerHtml, '<circle></circle><path></path>');
     });
 
     test('set', () {
       final el = new svg.SvgSvgElement();
       el.children.add(new svg.CircleElement());
       el.children.add(new svg.PathElement());
-      el.innerHTML = '<rect></rect><a></a>';
+      el.innerHtml = '<rect></rect><a></a>';
       expect(_nodeStrings(el.children), ["rect", "a"]);
     });
   });
@@ -192,7 +192,7 @@
     test('set', () {
       final el = new svg.SvgSvgElement();
       el.children = [new svg.SvgElement.tag("circle"), new svg.SvgElement.tag("path")];
-      expect(el.innerHTML, '<circle></circle><path></path>');
+      expect(el.innerHtml, '<circle></circle><path></path>');
     });
   });
 
diff --git a/tests/html/url_test.dart b/tests/html/url_test.dart
index 4b784ca..c52b7c6 100644
--- a/tests/html/url_test.dart
+++ b/tests/html/url_test.dart
@@ -19,7 +19,7 @@
     context.fillStyle = 'red';
     context.fillRect(0, 0, canvas.width, canvas.height);
 
-    var dataUri = canvas.toDataURL('image/png');
+    var dataUri = canvas.toDataUrl('image/png');
     var byteString = window.atob(dataUri.split(',')[1]);
     var mimeString = dataUri.split(',')[0].split(':')[1].split(';')[0];
 
diff --git a/tests/html/window_open_test.dart b/tests/html/window_open_test.dart
index 664953f..8fbe664 100644
--- a/tests/html/window_open_test.dart
+++ b/tests/html/window_open_test.dart
@@ -7,7 +7,7 @@
   useHtmlConfiguration();
   evaluateJavaScript(code) {
     final scriptTag = new Element.tag('script');
-    scriptTag.innerHTML = code;
+    scriptTag.innerHtml = code;
     document.body.nodes.add(scriptTag);
   }
   evaluateJavaScript('(testRunner || layoutTestController).setCanOpenWindows()');
diff --git a/tests/html/xmldocument_test.dart b/tests/html/xmldocument_test.dart
index 53c3bc4..35666e6 100644
--- a/tests/html/xmldocument_test.dart
+++ b/tests/html/xmldocument_test.dart
@@ -47,7 +47,7 @@
     test('overwrites nodes when set', () {
       final doc = new XMLDocument.xml("<xml>1<a/><b/>2<c/>3<d/></xml>");
       doc.children = [new XMLElement.tag('x'), new XMLElement.tag('y')];
-      expect(doc.outerHTML, "<xml><x></x><y></y></xml>");
+      expect(doc.outerHtml, "<xml><x></x><y></y></xml>");
     });
   });
 
@@ -58,7 +58,7 @@
     Set<String> makeClassSet() => makeDocumentWithClasses().classes;
 
     Set<String> extractClasses(Document doc) {
-      final match = new RegExp('class="([^"]+)"').firstMatch(doc.outerHTML);
+      final match = new RegExp('class="([^"]+)"').firstMatch(doc.outerHtml);
       return new Set.from(match[1].split(' '));
     }
 
@@ -398,9 +398,9 @@
     });
   });
 
-  test('set innerHTML', () {
+  test('set innerHtml', () {
     final doc = makeDocument();
-    doc.innerHTML = "<foo>Bar<baz/></foo>";
+    doc.innerHtml = "<foo>Bar<baz/></foo>";
     expect(doc.nodes.length, 1);
     final node = doc.nodes[0];
     expect(node, isXMLElement);
@@ -409,13 +409,13 @@
     expect(node.nodes[1].tagName, 'baz');
   });
 
-  test('get innerHTML/outerHTML', () {
+  test('get innerHtml/outerHtml', () {
     final doc = makeDocument();
-    expect(doc.innerHTML, "<foo></foo><bar></bar>");
+    expect(doc.innerHtml, "<foo></foo><bar></bar>");
     doc.nodes.clear();
     doc.nodes.addAll([new Text("foo"), new XMLElement.xml("<a>bar</a>")]);
-    expect(doc.innertHTML, "foo<a>bar</a>");
-    expect(doc.outerHTML, "<xml>foo<a>bar</a></xml>");
+    expect(doc.innerHtml, "foo<a>bar</a>");
+    expect(doc.outerHtml, "<xml>foo<a>bar</a></xml>");
   });
 
   test('query', () {
@@ -447,28 +447,28 @@
       final doc = getDoc();
       expect(doc.insertAdjacentElement("beforeBegin", new XMLElement.tag("b")),
           isNull);
-      expect(doc.innerHTML, "<a>foo</a>");
+      expect(doc.innerHtml, "<a>foo</a>");
     });
 
     test('afterEnd does nothing', () {
       final doc = getDoc();
       expect(doc.insertAdjacentElement("afterEnd", new XMLElement.tag("b")),
           isNull);
-      expect(doc.innerHTML, "<a>foo</a>");
+      expect(doc.innerHtml, "<a>foo</a>");
     });
 
     test('afterBegin inserts the element', () {
       final doc = getDoc();
       final el = new XMLElement.tag("b");
       expect(doc.insertAdjacentElement("afterBegin", el), el);
-      expect(doc.innerHTML, "<b></b><a>foo</a>");
+      expect(doc.innerHtml, "<b></b><a>foo</a>");
     });
 
     test('beforeEnd inserts the element', () {
       final doc = getDoc();
       final el = new XMLElement.tag("b");
       expect(doc.insertAdjacentElement("beforeEnd", el), el);
-      expect(doc.innerHTML, "<a>foo</a><b></b>");
+      expect(doc.innerHtml, "<a>foo</a><b></b>");
     });
   });
 
@@ -478,53 +478,53 @@
     test('beforeBegin does nothing', () {
       final doc = getDoc();
       doc.insertAdjacentText("beforeBegin", "foo");
-      expect(doc.innerHTML, "<a>foo</a>");
+      expect(doc.innerHtml, "<a>foo</a>");
     });
 
     test('afterEnd does nothing', () {
       final doc = getDoc();
       doc.insertAdjacentText("afterEnd", "foo");
-      expect(doc.innerHTML, "<a>foo</a>");
+      expect(doc.innerHtml, "<a>foo</a>");
     });
 
     test('afterBegin inserts the text', () {
       final doc = getDoc();
       doc.insertAdjacentText("afterBegin", "foo");
-      expect(doc.innerHTML, "foo<a>foo</a>");
+      expect(doc.innerHtml, "foo<a>foo</a>");
     });
 
     test('beforeEnd inserts the text', () {
       final doc = getDoc();
       doc.insertAdjacentText("beforeEnd", "foo");
-      expect(doc.innerHTML, "<a>foo</a>foo");
+      expect(doc.innerHtml, "<a>foo</a>foo");
     });
   });
 
-  group('insertAdjacentHTML', () {
+  group('insertAdjacentHtml', () {
     getDoc() => new XMLDocument.xml("<xml><a>foo</a></xml>");
 
     test('beforeBegin does nothing', () {
       final doc = getDoc();
-      doc.insertAdjacentHTML("beforeBegin", "foo<b/>");
-      expect(doc.innerHTML, "<a>foo</a>");
+      doc.insertAdjacentHtml("beforeBegin", "foo<b/>");
+      expect(doc.innerHtml, "<a>foo</a>");
     });
 
     test('afterEnd does nothing', () {
       final doc = getDoc();
-      doc.insertAdjacentHTML("afterEnd", "<b/>foo");
-      expect(doc.innerHTML, "<a>foo</a>");
+      doc.insertAdjacentHtml("afterEnd", "<b/>foo");
+      expect(doc.innerHtml, "<a>foo</a>");
     });
 
     test('afterBegin inserts the HTML', () {
       final doc = getDoc();
-      doc.insertAdjacentHTML("afterBegin", "foo<b/>");
-      expect(doc.innerHTML, "foo<b></b><a>foo</a>");
+      doc.insertAdjacentHtml("afterBegin", "foo<b/>");
+      expect(doc.innerHtml, "foo<b></b><a>foo</a>");
     });
 
     test('beforeEnd inserts the HTML', () {
       final doc = getDoc();
-      doc.insertAdjacentHTML("beforeEnd", "<b/>foo");
-      expect(doc.innerHTML, "<a>foo</a><b></b>foo");
+      doc.insertAdjacentHtml("beforeEnd", "<b/>foo");
+      expect(doc.innerHtml, "<a>foo</a><b></b>foo");
     });
   });
 
diff --git a/tests/html/xmlelement_test.dart b/tests/html/xmlelement_test.dart
index 1436b18..94cfb1a 100644
--- a/tests/html/xmlelement_test.dart
+++ b/tests/html/xmlelement_test.dart
@@ -63,7 +63,7 @@
     test('overwrites nodes when set', () {
       final el = new XMLElement.xml("<xml>1<a/><b/>2<c/>3<d/></xml>");
       el.children = [new XMLElement.tag('x'), new XMLElement.tag('y')];
-      expect(el.outerHTML, "<xml><x></x><y></y></xml>");
+      expect(el.outerHtml, "<xml><x></x><y></y></xml>");
     });
   });
 
@@ -388,9 +388,9 @@
     });
   });
 
-  test('set innerHTML', () {
+  test('set innerHtml', () {
     final el = makeElement();
-    el.innerHTML = "<foo>Bar<baz/></foo>";
+    el.innerHtml = "<foo>Bar<baz/></foo>";
     expect(el.nodes.length, 1);
     final node = el.nodes[0];
     expect(node, isXMLElement);
@@ -399,13 +399,13 @@
     expect(node.nodes[1].tagName, 'baz');
   });
 
-  test('get innerHTML/outerHTML', () {
+  test('get innerHtml/outerHtml', () {
     final el = makeElement();
-    expect(el.innerHTML, "<foo></foo><bar></bar>");
+    expect(el.innerHtml, "<foo></foo><bar></bar>");
     el.nodes.clear();
     el.nodes.addAll([new Text("foo"), new XMLElement.xml("<a>bar</a>")]);
-    expect(el.innerHTML, "foo<a>bar</a>");
-    expect(el.outerHTML, "<xml>foo<a>bar</a></xml>");
+    expect(el.innerHtml, "foo<a>bar</a>");
+    expect(el.outerHtml, "<xml>foo<a>bar</a></xml>");
   });
 
   test('query', () {
@@ -435,22 +435,22 @@
       final el = makeElement();
       expect(el.insertAdjacentElement("beforeBegin", new XMLElement.tag("b")),
           isNull);
-      expect(el.innerHTML, "<foo></foo><bar></bar>");
+      expect(el.innerHtml, "<foo></foo><bar></bar>");
     });
 
     test('afterEnd with no parent does nothing', () {
       final el = makeElement();
       expect(
         el.insertAdjacentElement("afterEnd", new XMLElement.tag("b")), isNull);
-      expect(el.innerHTML, "<foo></foo><bar></bar>");
+      expect(el.innerHtml, "<foo></foo><bar></bar>");
     });
 
     test('beforeBegin with parent inserts the element', () {
       final el = makeElementWithParent();
       final newEl = new XMLElement.tag("b");
       expect(el.insertAdjacentElement("beforeBegin", newEl), newEl);
-      expect(el.innerHTML, "<foo></foo><bar></bar>");
-      expect(el.parent.innerHTML,
+      expect(el.innerHtml, "<foo></foo><bar></bar>");
+      expect(el.parent.innerHtml,
           "<before></before><b></b><xml><foo></foo><bar></bar>"
           "</xml><after></after>");
     });
@@ -459,8 +459,8 @@
       final el = makeElementWithParent();
       final newEl = new XMLElement.tag("b");
       expect(el.insertAdjacentElement("afterEnd", newEl), newEl);
-      expect(el.innerHTML, "<foo></foo><bar></bar>");
-      expect(el.parent.innerHTML,
+      expect(el.innerHtml, "<foo></foo><bar></bar>");
+      expect(el.parent.innerHtml,
           "<before></before><xml><foo></foo><bar></bar></xml><b>"
           "</b><after></after>");
     });
@@ -469,14 +469,14 @@
       final el = makeElement();
       final newEl = new XMLElement.tag("b");
       expect(el.insertAdjacentElement("afterBegin", newEl), newEl);
-      expect(el.innerHTML, "<b></b><foo></foo><bar></bar>");
+      expect(el.innerHtml, "<b></b><foo></foo><bar></bar>");
     });
 
     test('beforeEnd inserts the element', () {
       final el = makeElement();
       final newEl = new XMLElement.tag("b");
       expect(el.insertAdjacentElement("beforeEnd", newEl), newEl);
-      expect(el.innerHTML, "<foo></foo><bar></bar><b></b>");
+      expect(el.innerHtml, "<foo></foo><bar></bar><b></b>");
     });
   });
 
@@ -484,20 +484,20 @@
     test('beforeBegin with no parent does nothing', () {
       final el = makeElement();
       el.insertAdjacentText("beforeBegin", "foo");
-      expect(el.innerHTML, "<foo></foo><bar></bar>");
+      expect(el.innerHtml, "<foo></foo><bar></bar>");
     });
 
     test('afterEnd with no parent does nothing', () {
       final el = makeElement();
       el.insertAdjacentText("afterEnd", "foo");
-      expect(el.innerHTML, "<foo></foo><bar></bar>");
+      expect(el.innerHtml, "<foo></foo><bar></bar>");
     });
 
     test('beforeBegin with parent inserts the text', () {
       final el = makeElementWithParent();
       el.insertAdjacentText("beforeBegin", "foo");
-      expect(el.innerHTML, "<foo></foo><bar></bar>");
-      expect(el.parent.innerHTML,
+      expect(el.innerHtml, "<foo></foo><bar></bar>");
+      expect(el.parent.innerHtml,
           "<before></before>foo<xml><foo></foo><bar></bar></xml>"
           "<after></after>");
     });
@@ -505,8 +505,8 @@
     test('afterEnd with parent inserts the text', () {
       final el = makeElementWithParent();
       el.insertAdjacentText("afterEnd", "foo");
-      expect(el.innerHTML, "<foo></foo><bar></bar>");
-      expect(el.parent.innerHTML,
+      expect(el.innerHtml, "<foo></foo><bar></bar>");
+      expect(el.parent.innerHtml,
           "<before></before><xml><foo></foo><bar></bar></xml>foo"
           "<after></after>");
     });
@@ -514,57 +514,57 @@
     test('afterBegin inserts the text', () {
       final el = makeElement();
       el.insertAdjacentText("afterBegin", "foo");
-      expect(el.innerHTML, "foo<foo></foo><bar></bar>");
+      expect(el.innerHtml, "foo<foo></foo><bar></bar>");
     });
 
     test('beforeEnd inserts the text', () {
       final el = makeElement();
       el.insertAdjacentText("beforeEnd", "foo");
-      expect(el.innerHTML, "<foo></foo><bar></bar>foo");
+      expect(el.innerHtml, "<foo></foo><bar></bar>foo");
     });
   });
 
-  group('insertAdjacentHTML', () {
+  group('insertAdjacentHtml', () {
     test('beforeBegin with no parent does nothing', () {
       final el = makeElement();
-      el.insertAdjacentHTML("beforeBegin", "foo<b/>");
-      expect(el.innerHTML, "<foo></foo><bar></bar>");
+      el.insertAdjacentHtml("beforeBegin", "foo<b/>");
+      expect(el.innerHtml, "<foo></foo><bar></bar>");
     });
 
     test('afterEnd with no parent does nothing', () {
       final el = makeElement();
-      el.insertAdjacentHTML("afterEnd", "<b/>foo");
-      expect(el.innerHTML, "<foo></foo><bar></bar>");
+      el.insertAdjacentHtml("afterEnd", "<b/>foo");
+      expect(el.innerHtml, "<foo></foo><bar></bar>");
     });
 
     test('beforeBegin with parent inserts the HTML', () {
       final el = makeElementWithParent();
-      el.insertAdjacentHTML("beforeBegin", "foo<b/>");
-      expect(el.innerHTML, "<foo></foo><bar></bar>");
-      expect(el.parent.innerHTML,
+      el.insertAdjacentHtml("beforeBegin", "foo<b/>");
+      expect(el.innerHtml, "<foo></foo><bar></bar>");
+      expect(el.parent.innerHtml,
           "<before></before>foo<b></b><xml><foo></foo><bar></bar>"
           "</xml><after></after>");
     });
 
     test('afterEnd with parent inserts the HTML', () {
       final el = makeElementWithParent();
-      el.insertAdjacentHTML("afterEnd", "foo<b/>");
-      expect(el.innerHTML, "<foo></foo><bar></bar>");
-      expect(el.parent.innerHTML,
+      el.insertAdjacentHtml("afterEnd", "foo<b/>");
+      expect(el.innerHtml, "<foo></foo><bar></bar>");
+      expect(el.parent.innerHtml,
           "<before></before><xml><foo></foo><bar></bar></xml>foo"
           "<b></b><after></after>");
     });
 
     test('afterBegin inserts the HTML', () {
       final el = makeElement();
-      el.insertAdjacentHTML("afterBegin", "foo<b/>");
-      expect(el.innerHTML, "foo<b></b><foo></foo><bar></bar>");
+      el.insertAdjacentHtml("afterBegin", "foo<b/>");
+      expect(el.innerHtml, "foo<b></b><foo></foo><bar></bar>");
     });
 
     test('beforeEnd inserts the HTML', () {
       final el = makeElement();
-      el.insertAdjacentHTML("beforeEnd", "<b/>foo");
-      expect(el.innerHTML, "<foo></foo><bar></bar><b></b>foo");
+      el.insertAdjacentHtml("beforeEnd", "<b/>foo");
+      expect(el.innerHtml, "<foo></foo><bar></bar><b></b>foo");
     });
   });
 
diff --git a/tests/isolate/isolate.status b/tests/isolate/isolate.status
index 5d7fc3e..e176844 100644
--- a/tests/isolate/isolate.status
+++ b/tests/isolate/isolate.status
@@ -4,22 +4,26 @@
 
 [ $runtime == vm ]
 isolate2_negative_test: Skip  # Need to resolve correct behaviour.
+isolate3_negative_test: Skip  # test depends on isolate error exiting process.
 serialization_test: Skip  # tests dart2js-specific serialization code
 spawn_uri_test: Fail, OK # test uses a ".js" suffix that is bogus on vm.
 compute_this_script_browser_test: Skip # browser specific test
 timer_not_available_test: Fail, OK # only meant to test when there is no way to
                                    # implement timer (currently only in d8)
 timer_isolate_test: Skip # See Issue 4997
+unresolved_ports_negative_test: Skip # See Issue 6839
 
 [ $compiler == none && $runtime == drt ]
+isolate2_negative_test: Skip  # Inherited from VM.
+isolate3_negative_test: Skip  # Inherited from VM.
 serialization_test: Skip  # tests dart2js-specific serialization code
 spawn_uri_test: Skip # uses a .js extension (not for dartium)
 spawn_uri_negative_test: Skip # ditto
 spawn_uri_vm_test: Skip # not implemented in dartium yet.
 spawn_uri_vm_negative_test: Skip
-timer_isolate_test: Pass, Fail # See Issue 4997
-timer_not_available_test: Fail, OK # only meant to test when there is no way to
-                                   # implement timer (currently only in d8)
+timer_isolate_test: Skip # See Issue 4997
+timer_not_available_test: Skip # only meant to test when there is no way to
+                               # implement timer (currently only in d8)
 
 [ $compiler == dartc ]
 serialization_test: Skip  # tests dart2js-specific serialization code
@@ -68,7 +72,7 @@
 [ $runtime == opera ]
 multiple_timer_test: Pass, Fail
 isolate2_negative_test: Skip # Timeout.
-unresolved_ports_negative_test: Skip # Timeout.
+unresolved_ports_negative_test: Skip # See Issue 6839
 
 [ $runtime == opera && $system == windows]
 # TODO(efortuna): Investigate.
diff --git a/sdk/lib/html/templates/interface.darttemplate b/tests/language/built_in_identifier_prefix_library_abstract.dart
similarity index 68%
copy from sdk/lib/html/templates/interface.darttemplate
copy to tests/language/built_in_identifier_prefix_library_abstract.dart
index 671dbb5..01018c2 100644
--- a/sdk/lib/html/templates/interface.darttemplate
+++ b/tests/language/built_in_identifier_prefix_library_abstract.dart
@@ -2,9 +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.
 
-// WARNING: Do not edit - generated code.
+library abstract;
 
-part of html;
+class A {
+}
 
-abstract class $ID$EXTENDS {
-$!MEMBERS}
+class B<T> {
+}
+
+class C<T, S> {
+}
diff --git a/sdk/lib/html/templates/interface.darttemplate b/tests/language/built_in_identifier_prefix_library_as.dart
similarity index 68%
copy from sdk/lib/html/templates/interface.darttemplate
copy to tests/language/built_in_identifier_prefix_library_as.dart
index 671dbb5..96ce332 100644
--- a/sdk/lib/html/templates/interface.darttemplate
+++ b/tests/language/built_in_identifier_prefix_library_as.dart
@@ -2,9 +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.
 
-// WARNING: Do not edit - generated code.
+library as;
 
-part of html;
+class A {
+}
 
-abstract class $ID$EXTENDS {
-$!MEMBERS}
+class B<T> {
+}
+
+class C<T, S> {
+}
diff --git a/sdk/lib/html/templates/interface.darttemplate b/tests/language/built_in_identifier_prefix_library_dynamic.dart
similarity index 68%
copy from sdk/lib/html/templates/interface.darttemplate
copy to tests/language/built_in_identifier_prefix_library_dynamic.dart
index 671dbb5..a112109 100644
--- a/sdk/lib/html/templates/interface.darttemplate
+++ b/tests/language/built_in_identifier_prefix_library_dynamic.dart
@@ -2,9 +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.
 
-// WARNING: Do not edit - generated code.
+library dynamic;
 
-part of html;
+class A {
+}
 
-abstract class $ID$EXTENDS {
-$!MEMBERS}
+class B<T> {
+}
+
+class C<T, S> {
+}
diff --git a/sdk/lib/html/templates/interface.darttemplate b/tests/language/built_in_identifier_prefix_library_export.dart
similarity index 68%
copy from sdk/lib/html/templates/interface.darttemplate
copy to tests/language/built_in_identifier_prefix_library_export.dart
index 671dbb5..0349001 100644
--- a/sdk/lib/html/templates/interface.darttemplate
+++ b/tests/language/built_in_identifier_prefix_library_export.dart
@@ -2,9 +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.
 
-// WARNING: Do not edit - generated code.
+library export;
 
-part of html;
+class A {
+}
 
-abstract class $ID$EXTENDS {
-$!MEMBERS}
+class B<T> {
+}
+
+class C<T, S> {
+}
diff --git a/sdk/lib/html/templates/interface.darttemplate b/tests/language/built_in_identifier_prefix_library_external.dart
similarity index 68%
rename from sdk/lib/html/templates/interface.darttemplate
rename to tests/language/built_in_identifier_prefix_library_external.dart
index 671dbb5..f4b90cb 100644
--- a/sdk/lib/html/templates/interface.darttemplate
+++ b/tests/language/built_in_identifier_prefix_library_external.dart
@@ -2,9 +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.
 
-// WARNING: Do not edit - generated code.
+library external;
 
-part of html;
+class A {
+}
 
-abstract class $ID$EXTENDS {
-$!MEMBERS}
+class B<T> {
+}
+
+class C<T, S> {
+}
diff --git a/sdk/lib/html/templates/interface.darttemplate b/tests/language/built_in_identifier_prefix_library_factory.dart
similarity index 68%
copy from sdk/lib/html/templates/interface.darttemplate
copy to tests/language/built_in_identifier_prefix_library_factory.dart
index 671dbb5..22edf72 100644
--- a/sdk/lib/html/templates/interface.darttemplate
+++ b/tests/language/built_in_identifier_prefix_library_factory.dart
@@ -2,9 +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.
 
-// WARNING: Do not edit - generated code.
+library factory;
 
-part of html;
+class A {
+}
 
-abstract class $ID$EXTENDS {
-$!MEMBERS}
+class B<T> {
+}
+
+class C<T, S> {
+}
diff --git a/sdk/lib/html/templates/interface.darttemplate b/tests/language/built_in_identifier_prefix_library_get.dart
similarity index 68%
copy from sdk/lib/html/templates/interface.darttemplate
copy to tests/language/built_in_identifier_prefix_library_get.dart
index 671dbb5..73b2232 100644
--- a/sdk/lib/html/templates/interface.darttemplate
+++ b/tests/language/built_in_identifier_prefix_library_get.dart
@@ -2,9 +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.
 
-// WARNING: Do not edit - generated code.
+library get;
 
-part of html;
+class A {
+}
 
-abstract class $ID$EXTENDS {
-$!MEMBERS}
+class B<T> {
+}
+
+class C<T, S> {
+}
diff --git a/sdk/lib/html/templates/interface.darttemplate b/tests/language/built_in_identifier_prefix_library_implements.dart
similarity index 68%
copy from sdk/lib/html/templates/interface.darttemplate
copy to tests/language/built_in_identifier_prefix_library_implements.dart
index 671dbb5..f492b55 100644
--- a/sdk/lib/html/templates/interface.darttemplate
+++ b/tests/language/built_in_identifier_prefix_library_implements.dart
@@ -2,9 +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.
 
-// WARNING: Do not edit - generated code.
+library implements;
 
-part of html;
+class A {
+}
 
-abstract class $ID$EXTENDS {
-$!MEMBERS}
+class B<T> {
+}
+
+class C<T, S> {
+}
diff --git a/sdk/lib/html/templates/interface.darttemplate b/tests/language/built_in_identifier_prefix_library_import.dart
similarity index 68%
copy from sdk/lib/html/templates/interface.darttemplate
copy to tests/language/built_in_identifier_prefix_library_import.dart
index 671dbb5..c06338a0 100644
--- a/sdk/lib/html/templates/interface.darttemplate
+++ b/tests/language/built_in_identifier_prefix_library_import.dart
@@ -2,9 +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.
 
-// WARNING: Do not edit - generated code.
+library import;
 
-part of html;
+class A {
+}
 
-abstract class $ID$EXTENDS {
-$!MEMBERS}
+class B<T> {
+}
+
+class C<T, S> {
+}
diff --git a/sdk/lib/html/templates/interface.darttemplate b/tests/language/built_in_identifier_prefix_library_library.dart
similarity index 68%
copy from sdk/lib/html/templates/interface.darttemplate
copy to tests/language/built_in_identifier_prefix_library_library.dart
index 671dbb5..b77ed20 100644
--- a/sdk/lib/html/templates/interface.darttemplate
+++ b/tests/language/built_in_identifier_prefix_library_library.dart
@@ -2,9 +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.
 
-// WARNING: Do not edit - generated code.
+library library;
 
-part of html;
+class A {
+}
 
-abstract class $ID$EXTENDS {
-$!MEMBERS}
+class B<T> {
+}
+
+class C<T, S> {
+}
diff --git a/sdk/lib/html/templates/interface.darttemplate b/tests/language/built_in_identifier_prefix_library_operator.dart
similarity index 68%
copy from sdk/lib/html/templates/interface.darttemplate
copy to tests/language/built_in_identifier_prefix_library_operator.dart
index 671dbb5..8c43373 100644
--- a/sdk/lib/html/templates/interface.darttemplate
+++ b/tests/language/built_in_identifier_prefix_library_operator.dart
@@ -2,9 +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.
 
-// WARNING: Do not edit - generated code.
+library operator;
 
-part of html;
+class A {
+}
 
-abstract class $ID$EXTENDS {
-$!MEMBERS}
+class B<T> {
+}
+
+class C<T, S> {
+}
diff --git a/sdk/lib/html/templates/interface.darttemplate b/tests/language/built_in_identifier_prefix_library_part.dart
similarity index 68%
copy from sdk/lib/html/templates/interface.darttemplate
copy to tests/language/built_in_identifier_prefix_library_part.dart
index 671dbb5..04276aa 100644
--- a/sdk/lib/html/templates/interface.darttemplate
+++ b/tests/language/built_in_identifier_prefix_library_part.dart
@@ -2,9 +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.
 
-// WARNING: Do not edit - generated code.
+library part;
 
-part of html;
+class A {
+}
 
-abstract class $ID$EXTENDS {
-$!MEMBERS}
+class B<T> {
+}
+
+class C<T, S> {
+}
diff --git a/sdk/lib/html/templates/interface.darttemplate b/tests/language/built_in_identifier_prefix_library_set.dart
similarity index 68%
copy from sdk/lib/html/templates/interface.darttemplate
copy to tests/language/built_in_identifier_prefix_library_set.dart
index 671dbb5..2533ed4 100644
--- a/sdk/lib/html/templates/interface.darttemplate
+++ b/tests/language/built_in_identifier_prefix_library_set.dart
@@ -2,9 +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.
 
-// WARNING: Do not edit - generated code.
+library set;
 
-part of html;
+class A {
+}
 
-abstract class $ID$EXTENDS {
-$!MEMBERS}
+class B<T> {
+}
+
+class C<T, S> {
+}
diff --git a/sdk/lib/html/templates/interface.darttemplate b/tests/language/built_in_identifier_prefix_library_static.dart
similarity index 68%
copy from sdk/lib/html/templates/interface.darttemplate
copy to tests/language/built_in_identifier_prefix_library_static.dart
index 671dbb5..7b21503 100644
--- a/sdk/lib/html/templates/interface.darttemplate
+++ b/tests/language/built_in_identifier_prefix_library_static.dart
@@ -2,9 +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.
 
-// WARNING: Do not edit - generated code.
+library static;
 
-part of html;
+class A {
+}
 
-abstract class $ID$EXTENDS {
-$!MEMBERS}
+class B<T> {
+}
+
+class C<T, S> {
+}
diff --git a/sdk/lib/html/templates/interface.darttemplate b/tests/language/built_in_identifier_prefix_library_typedef.dart
similarity index 68%
copy from sdk/lib/html/templates/interface.darttemplate
copy to tests/language/built_in_identifier_prefix_library_typedef.dart
index 671dbb5..88ee7c1 100644
--- a/sdk/lib/html/templates/interface.darttemplate
+++ b/tests/language/built_in_identifier_prefix_library_typedef.dart
@@ -2,9 +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.
 
-// WARNING: Do not edit - generated code.
+library typedef;
 
-part of html;
+class A {
+}
 
-abstract class $ID$EXTENDS {
-$!MEMBERS}
+class B<T> {
+}
+
+class C<T, S> {
+}
diff --git a/tests/language/built_in_identifier_prefix_test.dart b/tests/language/built_in_identifier_prefix_test.dart
new file mode 100644
index 0000000..cb08c87
--- /dev/null
+++ b/tests/language/built_in_identifier_prefix_test.dart
@@ -0,0 +1,215 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test that built-in identifiers can be used as library prefixes.
+
+// From The Dart Programming Language Specification, section 11.30
+// "Identifier Reference":
+//
+// "A built-in identifier is one of the identifiers produced by the
+// production BUILT IN IDENTIFIER. It is a compile-time error if a
+// built-in identifier is used as the declared name of a class, type
+// parameter or type alias. It is a compile-time error to use a
+// built-in identifier other than dynamic as a type annotation."
+//
+// Observation: it is not illegal to use a built-in identifier as a library
+// prefix.
+//
+// Observation: it is not legal to use a built-in identifer as a type
+// annotation. A type annotation is not fully defined in the
+// specification, so we assume this means that the grammar production
+// "type" cannot match a built-in identifier. Unfortunately, this
+// doesn't prevent us from using built-in identifiers *in* type
+// annotations. For example, "final abstract foo;" is illegal as
+// "abstract" is used as a type annotation. However, "final
+// abstract<dynamic> foo;" is not illegal because "abstract" is used
+// as a typeName.
+
+import 'built_in_identifier_prefix_library_abstract.dart' as abstract;
+import 'built_in_identifier_prefix_library_as.dart' as as;
+import 'built_in_identifier_prefix_library_dynamic.dart' as dynamic;
+import 'built_in_identifier_prefix_library_export.dart' as export;
+import 'built_in_identifier_prefix_library_external.dart' as external;
+import 'built_in_identifier_prefix_library_factory.dart' as factory;
+import 'built_in_identifier_prefix_library_get.dart' as get;
+import 'built_in_identifier_prefix_library_implements.dart' as implements;
+import 'built_in_identifier_prefix_library_import.dart' as import;
+import 'built_in_identifier_prefix_library_library.dart' as library;
+import 'built_in_identifier_prefix_library_operator.dart' as operator;
+import 'built_in_identifier_prefix_library_part.dart' as part;
+import 'built_in_identifier_prefix_library_set.dart' as set;
+import 'built_in_identifier_prefix_library_static.dart' as static;
+import 'built_in_identifier_prefix_library_typedef.dart' as typedef;
+
+abstract.A _abstract = new abstract.A();
+as.A _as = new as.A();
+dynamic.A _dynamic = new dynamic.A();
+export.A _export = new export.A();
+external.A _external = new external.A();
+factory.A _factory = new factory.A();
+get.A _get = new get.A();
+implements.A _implements = new implements.A();
+import.A _import = new import.A();
+library.A _library = new library.A();
+operator.A _operator = new operator.A();
+part.A _part = new part.A();
+set.A _set = new set.A();
+static.A _static = new static.A();
+typedef.A _typedef = new typedef.A();
+
+abstract<dynamic> generic_abstract = new abstract.A();
+as<dynamic> generic_as = new as.A();
+dynamic<dynamic> generic_dynamic = new dynamic.A();
+export<dynamic> generic_export = new export.A();
+external<dynamic> generic_external = new external.A();
+factory<dynamic> generic_factory = new factory.A();
+get<dynamic> generic_get = new get.A();
+implements<dynamic> generic_implements = new implements.A();
+import<dynamic> generic_import = new import.A();
+library<dynamic> generic_library = new library.A();
+operator<dynamic> generic_operator = new operator.A();
+part<dynamic> generic_part = new part.A();
+set<dynamic> generic_set = new set.A();
+static<dynamic> generic_static = new static.A();
+typedef<dynamic> generic_typedef = new typedef.A();
+
+abstract.B<dynamic> dynamic_B_abstract = new abstract.B();
+as.B<dynamic> dynamic_B_as = new as.B();
+dynamic.B<dynamic> dynamic_B_dynamic = new dynamic.B();
+export.B<dynamic> dynamic_B_export = new export.B();
+external.B<dynamic> dynamic_B_external = new external.B();
+factory.B<dynamic> dynamic_B_factory = new factory.B();
+get.B<dynamic> dynamic_B_get = new get.B();
+implements.B<dynamic> dynamic_B_implements = new implements.B();
+import.B<dynamic> dynamic_B_import = new import.B();
+library.B<dynamic> dynamic_B_library = new library.B();
+operator.B<dynamic> dynamic_B_operator = new operator.B();
+part.B<dynamic> dynamic_B_part = new part.B();
+set.B<dynamic> dynamic_B_set = new set.B();
+static.B<dynamic> dynamic_B_static = new static.B();
+typedef.B<dynamic> dynamic_B_typedef = new typedef.B();
+
+abstract.B<abstract<dynamic>> parameterized_B_abstract = new abstract.B();
+as.B<as<dynamic>> parameterized_B_as = new as.B();
+dynamic.B<dynamic<dynamic>> parameterized_B_dynamic = new dynamic.B();
+export.B<export<dynamic>> parameterized_B_export = new export.B();
+external.B<external<dynamic>> parameterized_B_external = new external.B();
+factory.B<factory<dynamic>> parameterized_B_factory = new factory.B();
+get.B<get<dynamic>> parameterized_B_get = new get.B();
+implements.B<implements<dynamic>> parameterized_B_implements =
+  new implements.B();
+import.B<import<dynamic>> parameterized_B_import = new import.B();
+library.B<library<dynamic>> parameterized_B_library = new library.B();
+operator.B<operator<dynamic>> parameterized_B_operator = new operator.B();
+part.B<part<dynamic>> parameterized_B_part = new part.B();
+set.B<set<dynamic>> parameterized_B_set = new set.B();
+static.B<static<dynamic>> parameterized_B_static = new static.B();
+typedef.B<typedef<dynamic>> parameterized_B_typedef = new typedef.B();
+
+class UseA {
+  abstract.A abstract = new abstract.A();
+  as.A as = new as.A();
+  dynamic.A dynamic = new dynamic.A();
+  export.A export = new export.A();
+  external.A external = new external.A();
+  factory.A factory = new factory.A();
+  get.A get = new get.A();
+  implements.A implements = new implements.A();
+  import.A import = new import.A();
+  library.A library = new library.A();
+  operator.A operator = new operator.A();
+  part.A part = new part.A();
+  set.A set = new set.A();
+  static.A static = new static.A();
+  typedef.A typedef = new typedef.A();
+}
+
+main() {
+  bool assertionsEnabled = false;
+  assert(assertionsEnabled = true);
+
+  Expect.isTrue(_abstract is abstract.A);
+  Expect.isTrue(_as is as.A);
+  Expect.isTrue(_dynamic is dynamic.A);
+  Expect.isTrue(_export is export.A);
+  Expect.isTrue(_external is external.A);
+  Expect.isTrue(_factory is factory.A);
+  Expect.isTrue(_get is get.A);
+  Expect.isTrue(_implements is implements.A);
+  Expect.isTrue(_import is import.A);
+  Expect.isTrue(_library is library.A);
+  Expect.isTrue(_operator is operator.A);
+  Expect.isTrue(_part is part.A);
+  Expect.isTrue(_set is set.A);
+  Expect.isTrue(_static is static.A);
+  Expect.isTrue(_typedef is typedef.A);
+
+  Expect.isTrue(dynamic_B_abstract is abstract.B);
+  Expect.isTrue(dynamic_B_as is as.B);
+  Expect.isTrue(dynamic_B_dynamic is dynamic.B);
+  Expect.isTrue(dynamic_B_export is export.B);
+  Expect.isTrue(dynamic_B_external is external.B);
+  Expect.isTrue(dynamic_B_factory is factory.B);
+  Expect.isTrue(dynamic_B_get is get.B);
+  Expect.isTrue(dynamic_B_implements is implements.B);
+  Expect.isTrue(dynamic_B_import is import.B);
+  Expect.isTrue(dynamic_B_library is library.B);
+  Expect.isTrue(dynamic_B_operator is operator.B);
+  Expect.isTrue(dynamic_B_part is part.B);
+  Expect.isTrue(dynamic_B_set is set.B);
+  Expect.isTrue(dynamic_B_static is static.B);
+  Expect.isTrue(dynamic_B_typedef is typedef.B);
+
+  var x = new UseA();
+  Expect.isTrue(x.abstract is abstract.A);
+  Expect.isTrue(x.as is as.A);
+  Expect.isTrue(x.dynamic is dynamic.A);
+  Expect.isTrue(x.export is export.A);
+  Expect.isTrue(x.external is external.A);
+  Expect.isTrue(x.factory is factory.A);
+  Expect.isTrue(x.get is get.A);
+  Expect.isTrue(x.implements is implements.A);
+  Expect.isTrue(x.import is import.A);
+  Expect.isTrue(x.library is library.A);
+  Expect.isTrue(x.operator is operator.A);
+  Expect.isTrue(x.part is part.A);
+  Expect.isTrue(x.set is set.A);
+  Expect.isTrue(x.static is static.A);
+  Expect.isTrue(x.typedef is typedef.A);
+
+  // Most of the following variables have malformed type annotations.
+  if (assertionsEnabled) return;
+
+  Expect.isTrue(generic_abstract is abstract.A);
+  Expect.isTrue(generic_as is as.A);
+  Expect.isTrue(generic_dynamic is dynamic.A);
+  Expect.isTrue(generic_export is export.A);
+  Expect.isTrue(generic_external is external.A);
+  Expect.isTrue(generic_factory is factory.A);
+  Expect.isTrue(generic_get is get.A);
+  Expect.isTrue(generic_implements is implements.A);
+  Expect.isTrue(generic_import is import.A);
+  Expect.isTrue(generic_library is library.A);
+  Expect.isTrue(generic_operator is operator.A);
+  Expect.isTrue(generic_part is part.A);
+  Expect.isTrue(generic_set is set.A);
+  Expect.isTrue(generic_static is static.A);
+  Expect.isTrue(generic_typedef is typedef.A);
+
+  Expect.isTrue(parameterized_B_abstract is abstract.B);
+  Expect.isTrue(parameterized_B_as is as.B);
+  Expect.isTrue(parameterized_B_dynamic is dynamic.B);
+  Expect.isTrue(parameterized_B_export is export.B);
+  Expect.isTrue(parameterized_B_external is external.B);
+  Expect.isTrue(parameterized_B_factory is factory.B);
+  Expect.isTrue(parameterized_B_get is get.B);
+  Expect.isTrue(parameterized_B_implements is implements.B);
+  Expect.isTrue(parameterized_B_import is import.B);
+  Expect.isTrue(parameterized_B_library is library.B);
+  Expect.isTrue(parameterized_B_operator is operator.B);
+  Expect.isTrue(parameterized_B_part is part.B);
+  Expect.isTrue(parameterized_B_set is set.B);
+  Expect.isTrue(parameterized_B_static is static.B);
+  Expect.isTrue(parameterized_B_typedef is typedef.B);
+}
diff --git a/sdk/lib/html/templates/interface.darttemplate b/tests/language/class_syntax_test.dart
similarity index 64%
copy from sdk/lib/html/templates/interface.darttemplate
copy to tests/language/class_syntax_test.dart
index 671dbb5..f14822d 100644
--- a/sdk/lib/html/templates/interface.darttemplate
+++ b/tests/language/class_syntax_test.dart
@@ -2,9 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// WARNING: Do not edit - generated code.
+main() {
+  new ClassSyntaxTest();
+}
 
-part of html;
-
-abstract class $ID$EXTENDS {
-$!MEMBERS}
+class ClassSyntaxTest {
+  /* /// 01: compile-time error
+}
+*/ /// 01: continued
diff --git a/tests/language/const_factory_redirection_test.dart b/tests/language/const_factory_redirection_test.dart
index 95c0690..01390a8 100644
--- a/tests/language/const_factory_redirection_test.dart
+++ b/tests/language/const_factory_redirection_test.dart
@@ -12,12 +12,15 @@
 class D implements C {
   final int i;
   const D(this.i);
+  m() => 'called m';
 }
 
 main() {
   const C c = const C(42);
   D d = c;
   Expect.equals(42, d.i);
+  Expect.equals('called m', d.m());
   d = new C(42);
   Expect.equals(42, d.i);
+  Expect.equals('called m', d.m());
 }
diff --git a/tests/language/interceptor2_test.dart b/tests/language/interceptor2_test.dart
new file mode 100644
index 0000000..3cff1be
--- /dev/null
+++ b/tests/language/interceptor2_test.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Regression test for issue http://dartbug.com/6903: dart2js used to
+// not generate an interceptor forwarder when a getter call and a
+// method call on an intercepted method were both used.
+
+class A { get iterator => () => 499; }
+
+main() {
+  var a = [new A(), [1, 1]];
+  Expect.equals(499, a[0].iterator());
+  Expect.equals(499, (a[0].iterator)());
+  for (var i in a[1]) {
+    Expect.equals(1, i);
+  }
+}
diff --git a/tests/language/interceptor3_test.dart b/tests/language/interceptor3_test.dart
new file mode 100644
index 0000000..ec9cc6d
--- /dev/null
+++ b/tests/language/interceptor3_test.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test that code motion in the presence of interceptors work in dart2js.
+
+main() {
+  var a = [2, '2'];
+  var b = a[1];
+  if (a[0] == 2 && b is String) {
+    Expect.isTrue(b.contains('2'));
+  } else {
+    b.isEven();
+  }
+}
diff --git a/tests/language/language.status b/tests/language/language.status
index 1cf55b7..f7c3283 100644
--- a/tests/language/language.status
+++ b/tests/language/language.status
@@ -16,6 +16,7 @@
 # 3) Update the language/src directory with the updated test.
 
 [ $compiler == none ]
+built_in_identifier_prefix_test: Fail # http://dartbug.com/6970
 library_juxtaposition_test: Fail # Issue 6877
 part_test: Fail
 part2_test: Fail
@@ -57,6 +58,155 @@
 duplicate_export_negative_test: Fail # issue 6134
 invocation_mirror_indirect_test: Fail # Issue 3326
 
+# Test issue 6324
+generic_instanceof3_test: Fail, OK
+interface_factory_test: Fail, OK
+factory4_test: Fail, OK
+list_literal_syntax_test/none: Fail, OK
+default_class_implicit_constructor_test: Fail, OK
+interface_factory_constructor_negative_test: Pass, OK
+implied_interface_test: Fail, OK
+throw2_test: Fail, OK
+class_override_negative_test: Pass, OK
+default_implementation2_test: Fail, OK
+implicit_this_test/none: Fail, OK
+implicit_this_test/01: Fail, OK
+implicit_this_test/04: Fail, OK
+interface_factory3_negative_test: Pass, OK
+factory_implementation_test: Fail, OK
+interface_factory_multi_test: Fail, OK
+interface_function_type_alias2_negative_test: Pass, OK
+throw1_test: Fail, OK
+factory2_negative_test: Pass, OK
+named_parameters_test/none: Fail, OK
+prefix14_test: Fail, OK
+prefix15_test: Fail, OK
+prefix16_test: Fail, OK
+prefix17_test: Fail, OK
+prefix22_test: Fail, OK
+prefix23_test: Fail, OK
+type_checks_in_factory_method_test: Fail, OK
+interface_static_method_negative_test: Pass, OK
+method_override2_test/none: Fail, OK
+interface_injection1_negative_test: Pass, OK
+extend_type_parameter2_negative_test: Pass, OK
+generic_syntax_test: Fail, OK
+is_operator_test: Fail, OK
+dynamic_test: Fail, OK
+generic_deep_test: Fail, OK
+default_factory2_test: Fail, OK
+default_implementation_test: Fail, OK
+non_parameterized_factory2_test: Fail, OK
+interface_function_type_alias1_negative_test: Pass, OK
+default_factory3_test: Fail, OK
+interface_inherit_field_test: Fail, OK
+class_test: Fail, OK
+interface2_negative_test: Pass, OK
+instanceof_test: Fail, OK
+default_interface1_negative_test: Pass, OK
+default_factory_test: Fail, OK
+default_factory_library_test: Fail, OK
+duplicate_implements_test/none: Fail, OK
+syntax_test/none: Fail, OK
+type_variable_scope_test: Fail, OK
+cyclic_type_variable_test: Fail, OK
+interface_function_type_alias3_negative_test: Pass, OK
+compile_time_constant_h_test: Fail, OK
+try_catch3_test: Fail, OK
+ct_const_test: Fail, OK
+factory_negative_test: Pass, OK
+instanceof2_test: Fail, OK
+interface_constants_test: Fail, OK
+interface_test: Fail, OK
+library_same_name_used_test: Fail, OK
+pseudo_kw_illegal_test/09: Fail, OK
+interface_injection2_negative_test: Pass, OK
+factory2_test: Fail, OK
+non_parameterized_factory_test: Fail, OK
+try_catch2_test: Fail, OK
+factory3_negative_test: Pass, OK
+class_extends_negative_test: Pass, OK
+interface_static_non_final_fields_negative_test: Pass, OK
+interface_cycle_negative_test: Pass, OK
+factory3_test: Fail, OK
+interface_factory1_negative_test: Pass, OK
+factory5_test: Fail, OK
+interface_factory2_negative_test: Pass, OK
+class_test: Fail, OK
+interface_test/none: Fail, OK
+interface_test/00: Fail, OK
+compile_time_constant_h_test: Fail, OK
+const_constructor_syntax_test/none: Fail, OK
+default_class_implicit_constructor_test: Fail, OK
+named_parameters_test/none: Fail, OK
+type_checks_in_factory_method_test: Fail, OK
+default_factory2_test/none: Fail, OK
+default_factory3_test: Fail, OK
+default_factory_library_test: Fail, OK
+default_implementation2_test: Fail, OK
+default_factory_test: Fail, OK
+default_implementation_test: Fail, OK
+factory2_test: Fail, OK
+factory3_test: Fail, OK
+factory5_test/none: Fail, OK
+factory5_test/00: Fail, OK
+factory4_test: Fail, OK
+factory_implementation_test: Fail, OK
+interface_factory_test: Fail, OK
+interface_factory_multi_test: Fail, OK
+type_variable_bounds_test/none: Fail, OK
+type_variable_bounds_test/00: Fail, OK
+type_variable_bounds_test/03: Fail, OK
+type_variable_bounds_test/06: Fail, OK
+type_variable_bounds_test/09: Fail, OK
+type_variable_bounds_test/10: Fail, OK
+non_parameterized_factory2_test: Fail, OK
+non_parameterized_factory_test: Fail, OK
+default_factory_test: Fail, OK
+default_factory_library_test: Fail, OK
+default_factory_test: Fail, OK
+type_variable_scope_test/none: Fail, OK
+
+[ $compiler == none && $unchecked ]
+# Test issue 6324 (continued)
+default_factory2_test/01: Fail, OK
+type_variable_bounds_test/01: Fail, OK
+type_variable_bounds_test/02: Fail, OK
+type_variable_bounds_test/04: Fail, OK
+type_variable_bounds_test/05: Fail, OK
+type_variable_bounds_test/07: Fail, OK
+type_variable_bounds2_test: Fail, OK
+type_variable_scope_test/00: Fail, OK
+type_variable_scope_test/01: Fail, OK
+type_variable_scope_test/02: Fail, OK
+type_variable_scope_test/03: Fail, OK
+type_variable_scope_test/04: Fail, OK
+type_variable_scope_test/05: Fail, OK
+
+[ $compiler == none && $checked ]
+# Test issue 6324 (continued)
+# Pass for the wrong reason: no distinction between compile-time error and dynamic error
+default_factory2_test/01: Pass
+type_variable_bounds_test/01: Pass
+type_variable_bounds_test/02: Pass
+type_variable_bounds_test/04: Pass
+type_variable_bounds_test/05: Pass
+type_variable_bounds_test/07: Pass
+type_variable_bounds2_test/none: Fail, OK
+type_variable_bounds2_test/00: Pass
+type_variable_bounds2_test/01: Fail, OK
+type_variable_bounds2_test/02: Pass
+type_variable_bounds2_test/03: Pass
+type_variable_bounds2_test/04: Fail, OK
+type_variable_bounds2_test/05: Pass
+type_variable_bounds2_test/06: Pass
+type_variable_scope_test/00: Pass
+type_variable_scope_test/01: Pass
+type_variable_scope_test/02: Pass
+type_variable_scope_test/03: Pass
+type_variable_scope_test/04: Pass
+type_variable_scope_test/05: Pass
+
 [ $compiler == none && ($system == macos || $system == linux) && $arch == ia32 && $checked ]
 gc_test: Skip  # Issue 1487, flaky.
 
@@ -82,6 +232,7 @@
 compile_time_constant_checked3_test/06: Fail, OK
 
 [ $compiler == dartc ]
+built_in_identifier_prefix_test: Fail # http://dartbug.com/6971
 library_juxtaposition_test: Fail # Issue 6881
 new_expression_type_args_test/0*: Fail # Wrongly reports compile-time error.
 redirecting_factory_infinite_steps_test/01: Fail # http://dartbug.com/6560
@@ -176,12 +327,10 @@
 type_variable_bounds_test/00: Fail # issue 3079
 
 # test issue 5291
-type_parameter_test/none: Fail, OK
 type_parameter_test/01: Fail, OK
 type_parameter_test/02: Fail, OK
 type_parameter_test/03: Fail, OK
 type_parameter_test/04: Fail, OK
-type_variable_scope2_test: Fail, OK
 
 
 # test issue 5337
@@ -222,6 +371,7 @@
 cyclic_type_variable_test/04: Fail, OK
 default_class_implicit_constructor_test: Fail, OK
 default_factory2_test/none: Fail, OK
+default_factory2_test/none: Fail, OK
 default_factory2_test/01: Fail, OK
 default_factory3_test: Fail, OK
 default_factory_library_test: Fail, OK
@@ -346,6 +496,10 @@
 # test issue 6871
 block_scope_test: Fail, OK
 
+# test issue 7021
+instantiate_type_variable_negative_test: Fail
+type_variable_static_context_negative_test: Fail
+
 
 #
 # Add new dartc annotations above in alphabetical order
@@ -391,6 +545,7 @@
 *: Skip
 
 [ $compiler == dart2dart ]
+built_in_identifier_prefix_test: Fail # Inherited from dart2js.
 factory_redirection2_test/01: Fail # Inherited from dart2js.
 const_factory_redirection_test: Fail # http://dartbug.com/6894
 
@@ -418,6 +573,53 @@
 # factory2_negative_test: Fail
 # factory3_negative_test: Fail
 # factory_negative_test: Fail
+ct_const_test: Fail, OK
+cyclic_type_variable_test/01: Fail, OK
+cyclic_type_variable_test/02: Fail, OK
+cyclic_type_variable_test/03: Fail, OK
+cyclic_type_variable_test/04: Fail, OK
+cyclic_type_variable_test/none: Fail, OK
+dynamic_test: Fail, OK
+generic_deep_test: Fail, OK
+generic_instanceof3_test: Fail, OK
+generic_syntax_test: Fail, OK
+implicit_this_test/01: Fail, OK
+implicit_this_test/04: Fail, OK
+implicit_this_test/none: Fail, OK
+implied_interface_test: Fail, OK
+instanceof2_test: Fail, OK
+instanceof_test: Fail, OK
+interface_constants_test: Fail, OK
+interface_inherit_field_test: Fail, OK
+is_operator_test: Fail, OK
+library_same_name_used_test: Fail, OK
+method_override2_test/none: Fail, OK
+prefix14_test: Fail, OK
+prefix15_test: Fail, OK
+syntax_test/none: Fail, OK
+throw1_test: Fail, OK
+throw2_test: Fail, OK
+try_catch2_test: Fail, OK
+try_catch3_test: Fail, OK
+type_variable_bounds2_test/00: Fail, OK
+type_variable_bounds2_test/01: Fail, OK
+type_variable_bounds2_test/02: Fail, OK
+type_variable_bounds2_test/03: Fail, OK
+type_variable_bounds2_test/04: Fail, OK
+type_variable_bounds2_test/05: Fail, OK
+type_variable_bounds2_test/06: Fail, OK
+type_variable_bounds2_test/none: Fail, OK
+default_class_implicit_constructor_test: Fail, OK
+default_implementation2_test:Fail, OK
+named_parameters_test/none: Fail, OK
+type_checks_in_factory_method_test: Fail, OK
+default_factory2_test/01: Fail, OK
+default_implementation_test: Fail, OK
+default_factory3_test: Fail, OK
+class_test: Fail, OK
+compile_time_constant_h_test: Fail, OK
+interface_test/00: Fail, OK
+default_implementation2_test: Fail, OK
 default_factory_test: Fail
 factory2_test: Fail
 factory3_test: Fail
diff --git a/tests/language/language_dart2js.status b/tests/language/language_dart2js.status
index 572215f..b7d3a74 100644
--- a/tests/language/language_dart2js.status
+++ b/tests/language/language_dart2js.status
@@ -2,6 +2,9 @@
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
 
+[ $compiler == dart2js && $host_checked && $checked]
+new_expression_type_args_test/02: Crash # Issue 6931
+
 [ $compiler == dart2js || $compiler == dart2dart ]
 class_literal_test/01: Fail # Class literals are expression now; delete this test.
 class_literal_test/02: Fail # Class literals are expression now; delete this test.
@@ -82,6 +85,7 @@
 compile_time_constant_checked3_test/06: Fail, OK
 
 [ $compiler == dart2js ]
+built_in_identifier_prefix_test: Fail # http://dartbug.com/6972
 number_identity2_test: Fail # identity of NaN
 factory_redirection2_test/01: Fail # http://dartbug.com/6791
 new_expression_type_args_test/00: Fail # Wrongly reports compile-time error.
diff --git a/tests/language/load_to_load_forwarding_test.dart b/tests/language/load_to_load_forwarding_test.dart
new file mode 100644
index 0000000..5738263
--- /dev/null
+++ b/tests/language/load_to_load_forwarding_test.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+// Test correctness of side effects tracking used by load to load forwarding.
+
+class A {
+  var x, y;
+  A(this.x, this.y);
+}
+
+foo(a) {
+  var value1 = a.x;
+  var value2 = a.y;
+  for (var j = 1; j < 4; j++) {
+    value1 |= a.x << (j * 8);
+    a.y += 1;
+    a.x += 1;
+    value2 |= a.y << (j * 8);
+  }
+  return [value1, value2];
+}
+
+bar(a, mode) {
+  var value1 = a.x;
+  var value2 = a.y;
+  for (var j = 1; j < 4; j++) {
+    value1 |= a.x << (j * 8);
+    a.y += 1;
+    if (mode) a.x += 1;
+    a.x += 1;
+    value2 |= a.y << (j * 8);
+  }
+  return [value1, value2];
+}
+
+main() {
+  for (var i = 0; i < 2000; i++) {
+    Expect.listEquals([0x02010000, 0x03020100], foo(new A(0, 0)));
+    Expect.listEquals([0x02010000, 0x03020100], bar(new A(0, 0), false));
+    Expect.listEquals([0x04020000, 0x03020100], bar(new A(0, 0), true));
+  }
+}
\ No newline at end of file
diff --git a/tests/standalone/io/http_content_length_test.dart b/tests/standalone/io/http_content_length_test.dart
index 47ef941..5a082f2 100644
--- a/tests/standalone/io/http_content_length_test.dart
+++ b/tests/standalone/io/http_content_length_test.dart
@@ -37,10 +37,9 @@
     conn.onResponse = (HttpClientResponse response) {
       Expect.equals("0", response.headers.value('content-length'));
       Expect.equals(0, response.contentLength);
-      count++;
       response.inputStream.onData = response.inputStream.read;
       response.inputStream.onClosed = () {
-        if (count == totalConnections) {
+        if (++count == totalConnections) {
           client.shutdown();
           server.close();
         }
@@ -84,10 +83,9 @@
     conn.onResponse = (HttpClientResponse response) {
       Expect.equals("2", response.headers.value('content-length'));
       Expect.equals(2, response.contentLength);
-      count++;
       response.inputStream.onData = response.inputStream.read;
       response.inputStream.onClosed = () {
-        if (count == totalConnections) {
+        if (++count == totalConnections) {
           client.shutdown();
           server.close();
         }
diff --git a/tests/standalone/io/https_client_test.dart b/tests/standalone/io/https_client_test.dart
new file mode 100644
index 0000000..d639426
--- /dev/null
+++ b/tests/standalone/io/https_client_test.dart
@@ -0,0 +1,66 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "dart:io";
+import "dart:uri";
+import "dart:isolate";
+
+
+int testGoogleUrlCount = 0;
+void testGoogleUrl() {
+  HttpClient client = new HttpClient();
+
+  void testUrl(String url) {
+    var requestUri = new Uri.fromString(url);
+    var conn = client.getUrl(requestUri);
+
+    conn.onRequest = (HttpClientRequest request) {
+      request.outputStream.close();
+    };
+    conn.onResponse = (HttpClientResponse response) {
+      testGoogleUrlCount++;
+      Expect.isTrue(response.statusCode < 500);
+      if (requestUri.path.length == 0) {
+        Expect.isTrue(response.statusCode != 404);
+      }
+      response.inputStream.onData = () {
+        response.inputStream.read();
+      };
+      response.inputStream.onClosed = () {
+        if (testGoogleUrlCount == 4) client.shutdown();
+      };
+    };
+    conn.onError = (error) => Expect.fail("Unexpected IO error $error");
+  }
+
+  testUrl('https://www.google.dk');
+  testUrl('https://www.google.dk');
+  testUrl('https://www.google.dk/#q=foo');
+  testUrl('https://www.google.dk/#hl=da&q=foo');
+}
+
+void testBadHostName() {
+  HttpClient client = new HttpClient();
+  HttpClientConnection connection = client.getUrl(
+      new Uri.fromString("https://some.bad.host.name.7654321/"));
+  connection.onRequest = (HttpClientRequest request) {
+    Expect.fail("Should not open a request on bad hostname");
+  };
+  ReceivePort port = new ReceivePort();
+  connection.onError = (Exception error) {
+    port.close();  // We expect onError to be called, due to bad host name.
+  };
+}
+
+void InitializeSSL() {
+  var testPkcertDatabase =
+      new Path.fromNative(new Options().script).directoryPath.append('pkcert/');
+  SecureSocket.setCertificateDatabase(testPkcertDatabase.toNativePath());
+}
+
+void main() {
+  InitializeSSL();
+  testGoogleUrl();
+  testBadHostName();
+}
diff --git a/tests/standalone/io/https_server_test.dart b/tests/standalone/io/https_server_test.dart
new file mode 100644
index 0000000..8eb639f
--- /dev/null
+++ b/tests/standalone/io/https_server_test.dart
@@ -0,0 +1,73 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "dart:io";
+import "dart:uri";
+import "dart:isolate";
+
+const SERVER_ADDRESS = "127.0.0.1";
+const HOST_NAME = "localhost";
+
+void testListenOn() {
+  void test(void onDone()) {
+    HttpsServer server = new HttpsServer();
+    Expect.throws(() => server.port);
+
+    ReceivePort serverPort = new ReceivePort();
+    server.defaultRequestHandler =
+        (HttpRequest request, HttpResponse response) {
+          request.inputStream.onClosed = () {
+            response.outputStream.close();
+            serverPort.close();
+          };
+        };
+
+    server.onError = (Exception e) {
+      Expect.fail("Unexpected error in Https Server: $e");
+    };
+
+    server.listen(SERVER_ADDRESS,
+                  0,
+                  backlog: 5,
+                  certificate_name: 'CN=$HOST_NAME');
+
+    HttpClient client = new HttpClient();
+    HttpClientConnection conn =
+        client.getUrl(new Uri.fromString("https://$HOST_NAME:${server.port}/"));
+    conn.onRequest = (HttpClientRequest request) {
+      request.outputStream.close();
+    };
+    ReceivePort clientPort = new ReceivePort();
+    conn.onResponse = (HttpClientResponse response) {
+      response.inputStream.onClosed = () {
+        client.shutdown();
+        clientPort.close();
+        server.close();
+        Expect.throws(() => server.port);
+        onDone();
+      };
+    };
+    conn.onError = (Exception e) {
+      Expect.fail("Unexpected error in Https Client: $e");
+    };
+  };
+
+  // Test two connection after each other.
+  test(() {
+    test(() {
+    });
+  });
+}
+
+void InitializeSSL() {
+  var testPkcertDatabase =
+      new Path.fromNative(new Options().script).directoryPath.append('pkcert/');
+  SecureSocket.setCertificateDatabase(testPkcertDatabase.toNativePath(),
+                                      'dartdart');
+}
+
+void main() {
+  InitializeSSL();
+  testListenOn();
+}
diff --git a/tests/standalone/io/path_test.dart b/tests/standalone/io/path_test.dart
index a2b39a6..fbc2ce9 100644
--- a/tests/standalone/io/path_test.dart
+++ b/tests/standalone/io/path_test.dart
@@ -11,6 +11,7 @@
   testCanonicalize();
   testJoinAppend();
   testRelativeTo();
+  testWindowsShare();
 }
 
 void testBaseFunctions() {
@@ -194,3 +195,36 @@
   Expect.throws(() =>
                 new Path('a/b').relativeTo(new Path('../../d')));
 }
+
+// Test that Windows share information is maintain through
+// Path operations.
+void testWindowsShare() {
+  // Windows share information only makes sense on Windows.
+  if (Platform.operatingSystem != 'windows') return;
+  var path = new Path.fromNative(r'\\share\a\b\..\c');
+  Expect.isTrue(path.isAbsolute);
+  Expect.isTrue(path.isWindowsShare);
+  Expect.isFalse(path.hasTrailingSeparator);
+  var canonical = path.canonicalize();
+  Expect.isTrue(canonical.isAbsolute);
+  Expect.isTrue(canonical.isWindowsShare);
+  Expect.isFalse(path.isCanonical);
+  Expect.isTrue(canonical.isCanonical);
+  var joined = canonical.join(new Path('d/e/f'));
+  Expect.isTrue(joined.isAbsolute);
+  Expect.isTrue(joined.isWindowsShare);
+  var relativeTo = joined.relativeTo(canonical);
+  Expect.isFalse(relativeTo.isAbsolute);
+  Expect.isFalse(relativeTo.isWindowsShare);
+  var nonShare = new Path('/share/a/c/d/e');
+  Expect.throws(() => nonShare.relativeTo(canonical));
+  Expect.isTrue(canonical.toString().startsWith('/share/a'));
+  Expect.isTrue(canonical.toNativePath().startsWith(r'\\share\a'));
+  Expect.listEquals(['share', 'a', 'c'], canonical.segments());
+  var appended = canonical.append('d');
+  Expect.isTrue(appended.isAbsolute);
+  Expect.isTrue(appended.isWindowsShare);
+  var directoryPath = canonical.directoryPath;
+  Expect.isTrue(directoryPath.isAbsolute);
+  Expect.isTrue(directoryPath.isWindowsShare);
+}
diff --git a/tests/standalone/package/package_isolate_test.dart b/tests/standalone/package/package_isolate_test.dart
index 7f4bc61..fad10c8 100644
--- a/tests/standalone/package/package_isolate_test.dart
+++ b/tests/standalone/package/package_isolate_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// PackageRoot=tests/standalone/package/packages/
+// PackageRoot=packages/
 
 library package_isolate_test;
 import 'package:shared.dart' as shared;
diff --git a/tests/standalone/standalone.status b/tests/standalone/standalone.status
index d64d1e6..f4bccf8 100644
--- a/tests/standalone/standalone.status
+++ b/tests/standalone/standalone.status
@@ -43,6 +43,7 @@
 [ $runtime == vm && $system == windows ]
 io/file_system_links_test: Skip  # No links on Windows.
 io/secure_server_stream_test: Pass, Crash, Timeout  # Issue 6893
+io/secure_server_test: Pass, Crash, Fail, Timeout  # Issue 6893
 
 [ $compiler == none && $runtime == drt ]
 io/*: Skip # Don't run tests using dart:io in the browser
@@ -67,7 +68,7 @@
 typed_array_test: Skip # This is a VM test
 float_array_test: Skip # This is a VM test
 int_array_test: Skip  # This is a VM test
-medium_integer_test: Fail, OK # cannot resolve type Mint
+medium_integer_test: Fail, OK # Test fails with JS number semantics: issue 1533.
 io/process_exit_negative_test: Fail, OK # relies on a static error that is a warning now.
 package/package_isolate_test: Skip # spawnUri does not work in dart2js. See issue 3051
 
@@ -81,6 +82,7 @@
 
 [ $compiler == dart2js && $runtime == none ]
 io/options_test: Fail
+medium_integer_test: Pass # The test only fails at runtime, not at compilation.
 
 [ $compiler == dart2js && $browser ]
 *: Skip
diff --git a/tests/utils/dummy_compiler_test.dart b/tests/utils/dummy_compiler_test.dart
index f7096f1..af4c06a 100644
--- a/tests/utils/dummy_compiler_test.dart
+++ b/tests/utils/dummy_compiler_test.dart
@@ -34,6 +34,9 @@
                   eqNullB(a) {}""";
     } else if (uri.path.endsWith('_patch.dart')) {
       source = '';
+    } else if (uri.path.endsWith('interceptors.dart')) {
+      source = """class ObjectInterceptor {}
+                  var getInterceptor;""";
     } else if (uri.path.endsWith('js_helper.dart')) {
       source = 'library jshelper; class JSInvocationMirror {}';
     } else {
diff --git a/tools/VERSION b/tools/VERSION
index 9b6bee7..84b242a 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -1,4 +1,4 @@
 MAJOR 0
 MINOR 2
-BUILD 6
+BUILD 7
 PATCH 0
diff --git a/tools/create_sdk.py b/tools/create_sdk.py
index 5793e3e..d8396602 100755
--- a/tools/create_sdk.py
+++ b/tools/create_sdk.py
@@ -59,6 +59,8 @@
 import tempfile
 import utils
 
+HOST_OS = utils.GuessOS()
+
 # TODO(dgrove): Only import modules following Google style guide.
 from os.path import basename, dirname, join, realpath, exists, isdir
 
@@ -85,15 +87,14 @@
 # TODO(zundel): this excludes the analyzer from the sdk build until builders
 # have all prerequisite software installed.  Also update dart.gyp.
 def ShouldCopyAnalyzer():
-  os = utils.GuessOS()
-  return os == 'linux' or os == 'macos'
+  return HOST_OS == 'linux' or HOST_OS == 'macos'
 
 
 def CopyShellScript(src_file, dest_dir):
   '''Copies a shell/batch script to the given destination directory. Handles
      using the appropriate platform-specific file extension.'''
   file_extension = ''
-  if utils.GuessOS() == 'win32':
+  if HOST_OS == 'win32':
     file_extension = '.bat'
 
   src = src_file + file_extension
@@ -149,7 +150,7 @@
   build_dir = os.path.dirname(argv[1])
   dart_file_extension = ''
   analyzer_file_extension = ''
-  if utils.GuessOS() == 'win32':
+  if HOST_OS == 'win32':
     dart_file_extension = '.exe'
     analyzer_file_extension = '.bat'  # TODO(zundel): test on Windows
     dart_import_lib_src = join(HOME, build_dir, 'dart.lib')
@@ -159,8 +160,11 @@
   dart_dest_binary = join(BIN, 'dart' + dart_file_extension)
   copyfile(dart_src_binary, dart_dest_binary)
   copymode(dart_src_binary, dart_dest_binary)
-  if utils.GuessOS() != 'win32':
+  # Strip the binaries on platforms where that is supported.
+  if HOST_OS == 'linux':
     subprocess.call(['strip', dart_dest_binary])
+  elif HOST_OS == 'macos':
+    subprocess.call(['strip', '-x', dart_dest_binary])
 
   if ShouldCopyAnalyzer():
     # Copy analyzer into sdk/bin
@@ -201,7 +205,8 @@
   for library in ['_internal', 'collection', 'core', 'crypto', 'io', 'isolate',
                   join('html', 'dart2js'), join('html', 'dartium'), 'json',
                   'math', 'mirrors', 'scalarlist', join('svg', 'dart2js'),
-                  join('svg', 'dartium'), 'uri', 'utf']:
+                  join('svg', 'dartium'), 'uri', 'utf',
+                  join('web_audio', 'dart2js'), join('web_audio', 'dartium')]:
     copytree(join(HOME, 'sdk', 'lib', library), join(LIB, library),
              ignore=ignore_patterns('*.svn', 'doc', '*.py', '*.gypi', '*.sh'))
 
@@ -211,11 +216,11 @@
   os.makedirs(PKG)
 
   #
-  # Create and populate pkg/{args, intl, logging, meta, unittest}
+  # Create and populate pkg/{args, intl, logging, meta, unittest, ...}
   #
 
-  for library in ['args', 'htmlescape', 'intl', 'logging',
-                  'meta', 'unittest']:
+  for library in ['args', 'htmlescape', 'http', 'intl', 'logging',
+                  'meta', 'oauth2', 'unittest']:
     copytree(join(HOME, 'pkg', library), join(PKG, library),
              ignore=ignore_patterns('*.svn', 'doc', 'docs',
                                     '*.py', '*.gypi', '*.sh'))
@@ -249,21 +254,21 @@
            ignore=ignore_patterns('.svn', 'sdk'))
 
   # Copy in 7zip for Windows.
-  if utils.GuessOS() == 'win32':
+  if HOST_OS == 'win32':
     copytree(join(HOME, 'third_party', '7zip'),
              join(join(UTIL, 'pub'), '7zip'),
              ignore=ignore_patterns('.svn'))
 
-    ReplaceInFiles([
-        join(UTIL, 'pub', 'io.dart'),
-      ], [
-        ("var pathTo7zip = '../../third_party/7zip/7za.exe';",
-         "var pathTo7zip = '7zip/7za.exe';"),
-      ])
+  ReplaceInFiles([
+      join(UTIL, 'pub', 'io.dart'),
+    ], [
+      ("../../third_party/7zip/7za.exe",
+       "7zip/7za.exe"),
+    ])
 
   # Copy in cURL on all operating systems, since we need the certificates file
   # even outside Windows. Leave out the EXE on non-Windows systems, though.
-  curl_ignore_patterns = ignore_patterns('.svn') if utils.GuessOS() == 'win32' \
+  curl_ignore_patterns = ignore_patterns('.svn') if HOST_OS == 'win32' \
       else ignore_patterns('.svn', '*.exe')
   copytree(join(HOME, 'third_party', 'curl'),
            join(join(UTIL, 'pub'), 'curl'),
@@ -272,10 +277,10 @@
   ReplaceInFiles([
       join(UTIL, 'pub', 'curl_client.dart'),
     ], [
-      ("var pathToCurl = '../../third_party/curl/curl.exe';",
-       "var pathToCurl = 'curl/curl.exe';"),
-      ("var pathToCertificates = '../../third_party/curl/ca-certificates.crt';",
-       "var pathToCertificates = 'curl/ca-certificates.crt';"),
+      ("../../third_party/curl/curl.exe",
+       "curl/curl.exe"),
+      ("../../third_party/curl/ca-certificates.crt",
+       "curl/ca-certificates.crt"),
     ])
 
   version = utils.GetVersion()
diff --git a/tools/ddbg.dart b/tools/ddbg.dart
index e51516f..3c2f643 100644
--- a/tools/ddbg.dart
+++ b/tools/ddbg.dart
@@ -526,7 +526,7 @@
 }
 
 
-void main() {
+void debuggerMain() {
   outstandingCommands = new Map<int, Completer>();
   vmSock = new Socket("127.0.0.1", 5858);
   vmStream = vmSock.outputStream;
@@ -548,3 +548,26 @@
     quitShell();
   };
 }
+
+void main() {
+  Options options = new Options();
+  List<String> arguments = options.arguments;
+  if (arguments.length > 0) {
+    arguments = <String>['--debug', '--verbose_debug']..addAll(arguments);
+    Process.start(options.executable, arguments).then((Process process) {
+      process.onExit = (int exitCode) {
+        print('${Strings.join(arguments, " ")} exited with $exitCode');
+      };
+      process.stdin.close();
+      // Redirecting both stdout and stderr of the child process to
+      // stdout.  This should help users keep track of which errors
+      // are coming from the debugger, and which errors are coming
+      // from the process being debugged.
+      process.stderr.pipe(stdout);
+      process.stdout.pipe(stdout);
+      debuggerMain();
+    });
+  } else {
+    debuggerMain();
+  }
+}
diff --git a/tools/gyp/configurations_android.gypi b/tools/gyp/configurations_android.gypi
index fc393cf..f7d9da9 100644
--- a/tools/gyp/configurations_android.gypi
+++ b/tools/gyp/configurations_android.gypi
@@ -40,7 +40,15 @@
       'ANDROID',
     ],
     'configurations': {
-      'Release': {
+      'Dart_Debug': {
+        'defines': [
+          'DEBUG',
+        ],
+      },
+      'Dart_Release': {
+        'defines': [
+          'NDEBUG',
+        ],
         'cflags!': [
           '-O2',
           '-Os',
@@ -51,7 +59,7 @@
           '-fomit-frame-pointer',
           '-O3',
         ],
-      },  # Release
+      },
     },  # configurations
     'cflags': [ '-Wno-abi', '-Wall', '-W', '-Wno-unused-parameter',
                 '-Wnon-virtual-dtor', '-fno-rtti', '-fno-exceptions', ],
diff --git a/tools/html_json_doc/bin/html_json_doc.dart b/tools/html_json_doc/bin/html_json_doc.dart
new file mode 100644
index 0000000..7c5b726
--- /dev/null
+++ b/tools/html_json_doc/bin/html_json_doc.dart
@@ -0,0 +1,69 @@
+// Copyright (c) 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.
+
+/**
+ * TODO(amouravski): Document stuff here.
+ */
+
+import 'dart:io';
+
+import '../lib/html_to_json.dart' as html_to_json;
+import '../lib/json_to_html.dart' as json_to_html;
+import '../../../pkg/args/lib/args.dart';
+
+// Need this because ArgParser.getUsage doesn't show command invocation.
+const USAGE = 'Usage htmlJsonDoc [options] --mode=<mode> <HTML.dart directory> '
+    '<json path>\n[options] include:';
+final argParser = new ArgParser();
+
+main() {
+  final args = new Options().arguments;
+
+  if (args.isEmpty) {
+    printUsage('No arguments provided.');
+    return;
+  }
+
+  var mode;
+  argParser.addOption('mode', abbr: 'm',
+      help: '(Required) Convert from HTML docs to JSON or vice versa.',
+      allowed: ['html-to-json', 'json-to-html'], allowedHelp: {
+        'html-to-json': 'Processes all HTML .dart files at given\n'
+          'location and outputs JSON.',
+          'json-to-html': 'Takes JSON file at location and inserts docs into\n'
+      'HTML .dart files.'},
+      callback: (m) => mode = m
+  );
+  
+  final argResults = argParser.parse(args);
+
+  if (mode == null) {
+    printUsage('Mode is a required option.');
+    return;
+  } else if (argResults.rest.length < 2) {
+    printUsage('Insufficient arguments.');
+    return;
+  }
+
+  var htmlPath = new Path.fromNative(argResults.rest[0]);
+  var jsonPath = new Path.fromNative(argResults.rest[1]);
+
+  var convertFuture;
+  if (mode == 'html-to-json') {
+    convertFuture = html_to_json.convert(htmlPath, jsonPath);
+  } else {
+    convertFuture = json_to_html.convert(htmlPath, jsonPath);
+  }
+
+  convertFuture.then((anyErrors) {
+    print('Completed ${anyErrors ? "with" : "without"} errors.');
+  });
+}
+
+/// Prints the usage of the tool. [message] is printed if provided.
+void printUsage([String message]) {
+  print(message);
+  print(USAGE);
+  print(argParser.getUsage());
+}
\ No newline at end of file
diff --git a/tools/html_json_doc/lib/html_to_json.dart b/tools/html_json_doc/lib/html_to_json.dart
new file mode 100644
index 0000000..ddfb5eb
--- /dev/null
+++ b/tools/html_json_doc/lib/html_to_json.dart
@@ -0,0 +1,314 @@
+// Copyright (c) 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 for extracting the documentation comments from files generated by
+ * the HTML library. The comments are stored in a JSON file.
+ *
+ * Comments must be in either the block style with leading *s:
+ *
+ *     /**
+ *      * Comment here.
+ *      */
+ *
+ * Or the triple-slash style:
+ *
+ *     /// Docs go here.
+ *     /// And here.
+ *
+ * Each member that is to be documented should be preceeded by a meta-comment
+ * containing the string `@docsEditable` such as:
+ *
+ *     /// @docsEditable
+ */
+library html_to_json;
+
+import 'dart:json';
+import 'dart:io';
+
+
+/// True if any errors were triggered through the conversion.
+bool _anyErrors = false;
+
+
+/**
+ * Convert files on [htmlPath] and write JSON to [jsonPath].
+ */
+Future<bool> convert(Path htmlPath, Path jsonPath) {
+  var completer = new Completer();
+  
+  // TODO(amouravski): make this transform once I know what I want this file to
+  // return.
+  _convertFiles(htmlPath).then((convertedJson) {
+    final jsonFile = new File.fromPath(jsonPath);
+    var writeJson = convertedJson;
+
+    if (jsonFile.existsSync()) {
+      writeJson = _mergeJsonAndFile(convertedJson, jsonFile);
+    }
+
+    var outputStream = jsonFile.openOutputStream();
+    outputStream.writeString(prettyPrintJson(writeJson));
+
+    outputStream.onNoPendingWrites = () {
+      completer.complete(_anyErrors);
+    };
+
+    outputStream.onClosed = () {
+      completer.complete(_anyErrors);
+    };
+    
+    outputStream.onError = completer.completeException;
+  });
+
+  return completer.future;
+}
+
+
+/**
+ * Convert all files on [htmlPath].
+ *
+ * Returns a future that completes to the converted JSON object.
+ */
+Future<Object> _convertFiles(Path htmlPath) {
+  var completer = new Completer();
+
+  List<Future> fileFutures = [];
+
+  // Get a list of all HTML dart files.
+  // TODO(amouravski): discriminate .dart files.
+  final htmlDir = new Directory.fromPath(htmlPath);
+  final lister = htmlDir.list(recursive: false);
+
+  lister.onFile = (String path) {
+    final name = new Path.fromNative(path).filename;
+
+    // Ignore private classes.
+    if (name.startsWith('_')) return;
+
+    // Ignore non-dart files.
+    if (!name.endsWith('.dart')) return;
+
+    File file = new File(path);
+
+    // TODO(amouravski): Handle missing file.
+    if (!file.existsSync()) {
+      print('ERROR: cannot find file $path');
+      _anyErrors = true;
+      return;
+    }
+
+    fileFutures.add(_convertFile(file));
+  };
+
+
+  // Combine all JSON objects
+  lister.onDone = (_) {
+    Futures.wait(fileFutures).then((jsonList) {
+      var convertedJson = {};
+      jsonList.forEach((json) {
+        final k = json.keys[0];
+        convertedJson.putIfAbsent(k, () => json[k]);
+      });
+      completer.complete(convertedJson);
+    });
+  };
+
+  // TODO(amouravski): add more error handling.
+
+  return completer.future;
+}
+
+
+/**
+ * Convert a single file to JSON docs.
+ *
+ * Returns a map with one entry whose key is the file name and whose value is
+ * the list of comment lines.
+ */
+Future<Map> _convertFile(File file) {
+  var completer = new Completer();
+
+  var comments = {};
+
+  // Find all /// @docsEditable annotations.
+  InputStream file_stream = file.openInputStream();
+  StringInputStream inputLines = new StringInputStream(file_stream);
+
+  // TODO(amouravski): Re-write as file.readAsLine().thin((lines) {...}
+  inputLines.onLine = () {
+    var comment = <String>[];
+
+    var docCommentFound = false;
+    String line;
+    while ((line = inputLines.readLine()) != null) {
+      var trimmedLine = line.trim();
+
+      // Sentinel found. Process the comment block.
+      if (trimmedLine.startsWith('///') &&
+          trimmedLine.contains('@docsEditable')) {
+        if (docCommentFound == true) {
+          var nextLine = inputLines.readLine();
+
+          if (nextLine == null) return false;
+
+          var lineObject = {};
+
+          if (comments[nextLine] != null) {
+            print('WARNING: duplicate line ${nextLine} found in'
+                '${new Path(file.fullPathSync()).filename}');
+          }
+          comments.putIfAbsent(nextLine, () => comment);
+        }
+
+        // Reset.
+        docCommentFound = false;
+        comment = <String>[];
+      } else if ( // Start a comment block.
+          trimmedLine.startsWith('/**') ||
+          trimmedLine.startsWith('///')) {
+        docCommentFound = true;
+        comment.add(line);
+      } else if (docCommentFound &&
+          // TODO(amouravski): This will barf on:
+          // /// blah
+          // *
+          (trimmedLine.startsWith('*') || trimmedLine.startsWith('///'))) {
+        comment.add(line);
+      } else {
+        // Reset if we're not in a comment.
+        docCommentFound = false;
+        comment = <String>[];
+      }
+    }
+  };
+
+  inputLines.onClosed = () {
+    var jsonObject = {};
+    jsonObject[new Path(file.fullPathSync()).filename] = comments;
+    completer.complete(jsonObject);
+  };
+
+  // TODO(amouravski): better error handling.
+
+  return completer.future;
+}
+
+
+/**
+ * Merge the new JSON object and the existing file.
+ */
+Object _mergeJsonAndFile(Object json, File file) {
+  var completer = new Completer();
+
+  var fileJson = {};
+  var jsonRead = file.readAsStringSync();
+
+  if (jsonRead == '') {
+    print('WARNING: no data read from '
+        '${new Path(file.fullPathSync()).filename}');
+    _anyErrors = true;
+  } else {
+    fileJson = JSON.parse(jsonRead);
+  }
+  return _mergeJson(json, fileJson);
+}
+
+
+/**
+ * Merge two JSON objects, such that the returned JSON object is the
+ * union of both.
+ *
+ * Each JSON must be a map, with each value being a map.
+ */
+Object _mergeJson(Object json1, Object json2) {
+  if (json1 is Map && json2 is Map) {
+    // Then check if [json2] contains any key form [json1], in which case
+    // add all of the values from [json2] to the values of [json1].
+    json2.forEach((k, v) {
+      if (json1.containsKey(k)) {
+        v.forEach((vk, vv) {
+          if (json1[k].containsKey(vk) &&
+              !_listsEqual(json1[k][vk],vv)) {
+            // Assume that json1 is more current and take its data as opposed
+            // to json2's.
+            // TODO(amouravski): add better warning message and only if there's
+            // a conflict.
+            print('INFO: duplicate keys.');
+            _anyErrors = false;
+          } else {
+            json1[k].putIfAbsent(vk, () => vv);
+          }
+        });
+      } else {
+        json1.putIfAbsent(k, () => v);
+      }
+    });
+  } else {
+    throw new ArgumentError('JSON objects must both be Maps');
+  }
+
+  // TODO(amouravski): more error handling.
+
+  return json1;
+}
+
+
+/**
+ * Tests for equality between two lists.
+ *
+ * This checks the first level of depth, so does not work for nested lists.
+ */
+bool _listsEqual(List list1, List list2) {
+  return list1.every((e) => list2.contains(e)) &&
+      list2.every((e) => list1.contains(e));
+}
+
+
+/**
+ * Print JSON in a much nicer format.
+ *
+ * For example:
+ * 
+ *     {"foo":["bar","baz"],"boo":{"far:"faz"}}
+ *
+ * becomes:
+ *
+ *     {
+ *       "foo":
+ *         [
+ *           "bar",
+ *           "baz"
+ *         ],
+ *       "boo":
+ *         {
+ *           "far":
+ *             "faz"
+ *         }
+ *     }
+ */
+String prettyPrintJson(Object json, [String indentation = '']) {
+  var output;
+
+  if (json is List) {
+    var recursiveOutput =
+        Strings.join(json.map((e) => 
+            prettyPrintJson(e, '$indentation  ')), ',\n');
+    output = '$indentation[\n'
+      '$recursiveOutput'
+      '\n$indentation]';
+  } else if (json is Map) {
+    // TODO(amouravski): No newline after :
+    var mapList = json.keys.map((key) =>
+        '$indentation${JSON.stringify(key)}:\n'
+        '${prettyPrintJson(json[key], '$indentation  ')}');
+    var recursiveOutput = Strings.join(mapList, ',\n');
+    output = '$indentation{\n'
+      '$recursiveOutput'
+      '\n$indentation}';
+  } else {
+    output = '$indentation${JSON.stringify(json)}';
+  }
+  return output;
+}
\ No newline at end of file
diff --git a/tools/html_json_doc/lib/json_to_html.dart b/tools/html_json_doc/lib/json_to_html.dart
new file mode 100644
index 0000000..d25aa4d
--- /dev/null
+++ b/tools/html_json_doc/lib/json_to_html.dart
@@ -0,0 +1,151 @@
+// Copyright (c) 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 for taking a JSON file and putting the comments located within into
+ * the HTML files the comments are associated with.
+ *
+ * The format of the JSON file is:
+ * 
+ *     {
+ *       "$filename":
+ *         {
+ *           "$lineInHtml":
+ *             [
+ *               "lines of comment",
+ *               "here"
+ *             ]
+ *          },
+ *       ...
+ *     }
+ */
+library json_to_html;
+
+import 'dart:json';
+import 'dart:io';
+
+
+/// True if any errors were triggered through the conversion.
+bool _anyErrors = false;
+
+
+/**
+ * Take comments from [jsonPath] and apply them to all the files found in
+ * [htmlPath]. This will overwrite the files in htmlPath.
+ */
+Future<bool> convert(Path htmlPath, Path jsonPath) {
+  final completer = new Completer();
+
+  final jsonFile = new File.fromPath(jsonPath);
+  final htmlDir = new Directory.fromPath(htmlPath);
+
+  if (!jsonFile.existsSync()) {
+    print("ERROR: No JSON file found at: ${jsonPath}");
+    _anyErrors = true;
+    completer.complete(false);
+  } else if (!htmlDir.existsSync()) {
+    print("ERROR: No HTML directory found at: ${htmlPath}");
+    _anyErrors = true;
+    completer.complete(false);
+  }
+
+
+  var fileJson = {};
+  var jsonRead = jsonFile.readAsStringSync();
+
+  if (jsonRead == '') {
+    print('WARNING: no data read from ${jsonPath.filename}');
+    _anyErrors = true;
+    completer.complete(false);
+  } else {
+    fileJson = JSON.parse(jsonRead);
+  }
+
+  // TODO(amouravski): Refactor to not duplicate code here and in html-to-json.
+  // Find html files. (lister)
+  final lister = htmlDir.list(recursive: false);
+
+  lister.onFile = (String path) {
+    final name = new Path.fromNative(path).filename;
+
+    // Ignore private classes.
+    if (name.startsWith('_')) return;
+
+    // Ignore non-dart files.
+    if (!name.endsWith('.dart')) return;
+
+    File file = new File(path);
+
+    // TODO(amouravski): Handle missing file.
+    if (!file.existsSync()) {
+      print('ERROR: cannot find file: $path');
+      _anyErrors = true;
+      return;
+    }
+
+    if (!fileJson.containsKey(name)) {
+      print('WARNING: file found that is not in JSON: $path');
+      _anyErrors = true;
+      return;
+    }
+
+    var comments = fileJson[name];
+
+    _convertFile(file, comments);
+
+    fileJson.remove(name);
+  };
+
+  lister.onDone = (_) {
+
+    fileJson.forEach((key, _) {
+      print('WARNING: the following filename was found in the JSON but not in '
+          '${htmlDir.path}:\n"$key"');
+      _anyErrors = true;
+    });
+
+    completer.complete(_anyErrors);
+  };
+
+  return completer.future;
+}
+
+
+/**
+ * Inserts the comments from JSON into a single file.
+ */
+void _convertFile(File file, Map<String, List<String>> comments) {
+  var fileLines = file.readAsLinesSync();
+
+  var unusedComments = {};
+
+  comments.forEach((key, comments) {
+    var index = fileLines.indexOf(key);
+    // If the key is found in any line past the first one.
+    if (index > 0 && fileLines[index - 1].trim().startsWith('///') &&
+      fileLines[index - 1].contains('@docsEditable')) {
+
+      // Add comments.
+      fileLines.insertRange(index - 1, comments.length);
+      fileLines.setRange(index - 1, comments.length, comments);
+    } else {
+      unusedComments.putIfAbsent(key, () => comments);
+    }
+  });
+
+  unusedComments.forEach((String key, _) {
+    print('WARNING: the following key was found in the JSON but not in '
+        '${new Path(file.fullPathSync()).filename}:\n"$key"');
+    _anyErrors = true;
+  });
+  
+  // TODO(amouravski): file.writeAsStringSync('${Strings.join(fileLines, '\n')}\n');
+  var outputStream = file.openOutputStream();
+  outputStream.writeString(Strings.join(fileLines, '\n'));
+  outputStream.writeString('\n');
+
+  outputStream.onNoPendingWrites = () {
+    outputStream.close();
+  };
+}
diff --git a/tools/html_json_doc/test/html_json_doc_test.dart b/tools/html_json_doc/test/html_json_doc_test.dart
new file mode 100644
index 0000000..4d721dc
--- /dev/null
+++ b/tools/html_json_doc/test/html_json_doc_test.dart
@@ -0,0 +1,103 @@
+import '../../../pkg/unittest/lib/unittest.dart';
+import '../lib/html_to_json.dart' as html_to_json;
+import '../lib/json_to_html.dart' as json_to_html;
+import 'dart:json';
+import 'dart:io';
+
+void main() {
+  var scriptPath = new Path(new Options().script).directoryPath.toString();
+
+  test('HTML Doc to JSON', () {
+    var htmlPath = new Path('$scriptPath/test_data/html_to_json');
+    var jsonPath = new Path('$scriptPath/test_output/html_to_json_test.json');
+
+    var convertFuture = html_to_json.convert(htmlPath, jsonPath);
+
+    convertFuture.then(expectAsync1((anyErrors) {
+      var output = new File.fromPath(jsonPath);
+
+      var goldenFile = new File(
+          '$scriptPath/test_data/html_to_json/'
+          'html_to_json_test_golden_output.json');
+
+      expect(anyErrors, false, reason:'The conversion completed with errors.');
+      expect(output.readAsStringSync(), goldenFile.readAsStringSync());
+    }));
+  });
+
+  test('JSON to HTML Doc', () {
+    var preHtmlPath = new Path('$scriptPath/test_data/json_to_html');
+    var goldenHtmlPath = new Path('$scriptPath/test_data/html_to_json');
+    var htmlPath = new Path('$scriptPath/test_output');
+    var jsonPath = new Path('$scriptPath/test_output/html_to_json_test.json');
+
+    var copyFuture = _copyFiles(preHtmlPath, htmlPath);
+
+    copyFuture.then(expectAsync1((_) {
+      var convertFuture = json_to_html.convert(htmlPath, jsonPath);
+
+      convertFuture.then((anyErrors) {
+        expect(anyErrors, false,
+            reason:'The conversion completed with errors.');
+
+        _compareFilesInDirectories(goldenHtmlPath, htmlPath);
+
+      });
+    }));
+  });
+}
+
+void _compareFilesInDirectories(Path path1, Path path2) {
+  final dir1 = new Directory.fromPath(path1);
+  final dir2 = new Directory.fromPath(path2);
+  final lister1 = dir1.list(recursive: false);
+  final lister2 = dir2.list(recursive: false);
+
+  // True once one of the listers is finished.
+  var oneFinished = false;
+
+  var list1 = <String, File>{};
+
+  lister1.onFile = (String path) {
+    if (path.endsWith('.dart')) {
+      list1.putIfAbsent(new Path(path).filename, () => new File(path));
+    }
+  };
+
+  lister1.onDone = (_) {
+    lister2.onFile = (String path) {
+      if (path.endsWith('.dart')) {
+        expect(list1[new Path(path).filename].readAsStringSync(),
+            new File(path).readAsStringSync());
+      }
+    };
+  };
+}
+
+Future _copyFiles(Path fromDir, Path toDir) {
+  // First copy the files into a new place to keep the old files.
+  final completer = new Completer();
+  final htmlDir = new Directory.fromPath(fromDir);
+  final lister = htmlDir.list(recursive: false);
+
+  lister.onFile = (String path) {
+    final name = new Path.fromNative(path).filename;
+
+    // Ignore private classes.
+    if (name.startsWith('_')) return;
+
+    // Ignore non-dart files.
+    if (!name.endsWith('.dart')) return;
+
+    File file = new File(path);
+    File newFile = new File.fromPath(toDir.append(name));
+
+    var outputStream = newFile.openOutputStream();
+    outputStream.writeString(file.readAsStringSync());
+  };
+
+  lister.onDone = (_) {
+    completer.complete(null);
+  };
+  return completer.future;
+}
\ No newline at end of file
diff --git a/tools/html_json_doc/test/test_data/html_to_json/html_to_json_test_golden_output.json b/tools/html_json_doc/test/test_data/html_to_json/html_to_json_test_golden_output.json
new file mode 100644
index 0000000..8495eed
--- /dev/null
+++ b/tools/html_json_doc/test/test_data/html_to_json/html_to_json_test_golden_output.json
@@ -0,0 +1,79 @@
+{
+"test_html_input2.dart":
+  {
+  "class InputTestCase1 {":
+    [
+      "/**",
+      " * This is a multi-line dartdoc comment.",
+      " * This is one line.",
+      " * And it keeps going to this line, too.",
+      " */"
+    ],
+  "class InputTestCase2 extends InputTestCase1 {":
+    [
+      "/// This is a single line dartdoc comment."
+    ],
+  "class InputTestCase3 extends InputTestCase2 {":
+    [
+      "/// This is a multi-line dartdoc comment.",
+      "/// It happens to use multiple single line dartdoc comments."
+    ],
+  "  var InputTestCase8;":
+    [
+      "  /**",
+      "   * This is a multi-line comment on a member.",
+      "   */"
+    ],
+  "  var InputTestCase9;":
+    [
+      "  /// This is a single line dartdoc comment on a member."
+    ],
+  "  var InputTestCase10;":
+    [
+      "  /// This is a multi-line dartdoc comment on a member.",
+      "  /// It is split over two lines."
+    ]
+  },
+"test_html_input.dart":
+  {
+  "library testInput;":
+    [
+      "/**",
+      " * YES. This is a library level dartdoc comment.",
+      " * This should show up correctly in the JSON.",
+      " */"
+    ],
+  "class InputTestCase1 {":
+    [
+      "/**",
+      " * YES. This is a multi-line dartdoc comment.",
+      " * This is one line.",
+      " * And it keeps going to this line, too.",
+      " */"
+    ],
+  "class InputTestCase2 extends InputTestCase1 {":
+    [
+      "/// YES. This is a single line dartdoc comment."
+    ],
+  "class InputTestCase3 extends InputTestCase2 {":
+    [
+      "/// YES. This is a multi-line dartdoc comment.",
+      "/// It happens to use multiple single line dartdoc comments."
+    ],
+  "  var InputTestCase8;":
+    [
+      "  /**",
+      "   * YES. This is a multi-line comment on a member.",
+      "   */"
+    ],
+  "  var InputTestCase9;":
+    [
+      "  /// YES. This is a single line dartdoc comment on a member."
+    ],
+  "  var InputTestCase10;":
+    [
+      "  /// YES. This is a multi-line dartdoc comment on a member.",
+      "  /// It is split over two lines."
+    ]
+  }
+}
\ No newline at end of file
diff --git a/tools/html_json_doc/test/test_data/html_to_json/test_html_input.dart b/tools/html_json_doc/test/test_data/html_to_json/test_html_input.dart
new file mode 100644
index 0000000..291d0dd
--- /dev/null
+++ b/tools/html_json_doc/test/test_data/html_to_json/test_html_input.dart
@@ -0,0 +1,80 @@
+/**
+ * YES. This is a library level dartdoc comment.
+ * This should show up correctly in the JSON.
+ */
+/// @docsEditable
+library testInput;
+
+/**
+ * YES. This is a multi-line dartdoc comment.
+ * This is one line.
+ * And it keeps going to this line, too.
+ */
+/// @docsEditable
+class InputTestCase1 {
+
+}
+
+/// YES. This is a single line dartdoc comment.
+/// @docsEditable
+class InputTestCase2 extends InputTestCase1 {
+
+}
+
+/// YES. This is a multi-line dartdoc comment.
+/// It happens to use multiple single line dartdoc comments.
+/// @docsEditable
+class InputTestCase3 extends InputTestCase2 {
+
+}
+
+/*
+ * NO. This is not a dartdoc comment and should not be picked up.
+ * The output of this comment should be nothing.
+ */
+/// @docsEditable
+class InputTestCase4 {
+
+}
+
+/**
+ * NO. This multi-line dartdoc comment doesn't have the /// @docsEditable stuff.
+ * This comment should not show up in the JSON.
+ * Note that the /// @docsEditable in this line and the one above are ignored.
+ */
+class InputTestCase5 {
+
+}
+
+/// NO. This is a single line dartdoc comment that is ignored.
+class InputTestCase6 {
+
+}
+
+/// NO. This is a multi-line dartdoc comment that is ignored.
+/// It is made of multiple single line dartdoc comments.
+class InputTestCase7 {
+
+  /**
+   * YES. This is a multi-line comment on a member.
+   */
+  /// @docsEditable
+  var InputTestCase8;
+
+  /// YES. This is a single line dartdoc comment on a member.
+  /// @docsEditable
+  var InputTestCase9;
+
+  /// YES. This is a multi-line dartdoc comment on a member.
+  /// It is split over two lines.
+  /// @docsEditable
+  var InputTestCase10;
+
+  /**
+   * NO.This multi-line comment on a member is ignored.
+   */
+  var InputTestCase11;
+
+  /// NO. This single line dartdoc comment on a member is ignored.
+  var InputTestCase12;
+}
diff --git a/tools/html_json_doc/test/test_data/html_to_json/test_html_input2.dart b/tools/html_json_doc/test/test_data/html_to_json/test_html_input2.dart
new file mode 100644
index 0000000..1f9615b
--- /dev/null
+++ b/tools/html_json_doc/test/test_data/html_to_json/test_html_input2.dart
@@ -0,0 +1,79 @@
+/**
+ * This is a library level dartdoc comment.
+ * This should be ignored.
+ */
+library testInput2;
+
+/**
+ * This is a multi-line dartdoc comment.
+ * This is one line.
+ * And it keeps going to this line, too.
+ */
+/// @docsEditable
+class InputTestCase1 {
+
+}
+
+/// This is a single line dartdoc comment.
+/// @docsEditable
+class InputTestCase2 extends InputTestCase1 {
+
+}
+
+/// This is a multi-line dartdoc comment.
+/// It happens to use multiple single line dartdoc comments.
+/// @docsEditable
+class InputTestCase3 extends InputTestCase2 {
+
+}
+
+/*
+ * This is not a dartdoc comment and should not be picked up.
+ * The output of this comment should be nothing.
+ */
+/// @docsEditable
+class InputTestCase4 {
+
+}
+
+/**
+ * This multi-line dartdoc comment doesn't have the /// @docsEditable stuff.
+ * This comment should not show up in the JSON.
+ * Note that the /// @docsEditable in this line and the one above are ignored.
+ */
+class InputTestCase5 {
+
+}
+
+/// This is a single line dartdoc comment that is ignored.
+class InputTestCase6 {
+
+}
+
+/// This is a multi-line dartdoc comment that is ignored.
+/// It is made of multiple single line dartdoc comments.
+class InputTestCase7 {
+
+  /**
+   * This is a multi-line comment on a member.
+   */
+  /// @docsEditable
+  var InputTestCase8;
+
+  /// This is a single line dartdoc comment on a member.
+  /// @docsEditable
+  var InputTestCase9;
+
+  /// This is a multi-line dartdoc comment on a member.
+  /// It is split over two lines.
+  /// @docsEditable
+  var InputTestCase10;
+
+  /**
+   * This multi-line comment on a member is ignored.
+   */
+  var InputTestCase11;
+
+  /// This single line dartdoc comment on a member is ignored.
+  var InputTestCase12;
+}
diff --git a/tools/html_json_doc/test/test_data/json_to_html/test_html_input.dart b/tools/html_json_doc/test/test_data/json_to_html/test_html_input.dart
new file mode 100644
index 0000000..70b6041
--- /dev/null
+++ b/tools/html_json_doc/test/test_data/json_to_html/test_html_input.dart
@@ -0,0 +1,62 @@
+/// @docsEditable
+library testInput;
+
+/// @docsEditable
+class InputTestCase1 {
+
+}
+
+/// @docsEditable
+class InputTestCase2 extends InputTestCase1 {
+
+}
+
+/// @docsEditable
+class InputTestCase3 extends InputTestCase2 {
+
+}
+
+/*
+ * NO. This is not a dartdoc comment and should not be picked up.
+ * The output of this comment should be nothing.
+ */
+/// @docsEditable
+class InputTestCase4 {
+
+}
+
+/**
+ * NO. This multi-line dartdoc comment doesn't have the /// @docsEditable stuff.
+ * This comment should not show up in the JSON.
+ * Note that the /// @docsEditable in this line and the one above are ignored.
+ */
+class InputTestCase5 {
+
+}
+
+/// NO. This is a single line dartdoc comment that is ignored.
+class InputTestCase6 {
+
+}
+
+/// NO. This is a multi-line dartdoc comment that is ignored.
+/// It is made of multiple single line dartdoc comments.
+class InputTestCase7 {
+
+  /// @docsEditable
+  var InputTestCase8;
+
+  /// @docsEditable
+  var InputTestCase9;
+
+  /// @docsEditable
+  var InputTestCase10;
+
+  /**
+   * NO.This multi-line comment on a member is ignored.
+   */
+  var InputTestCase11;
+
+  /// NO. This single line dartdoc comment on a member is ignored.
+  var InputTestCase12;
+}
diff --git a/tools/html_json_doc/test/test_data/json_to_html/test_html_input2.dart b/tools/html_json_doc/test/test_data/json_to_html/test_html_input2.dart
new file mode 100644
index 0000000..a6b286d
--- /dev/null
+++ b/tools/html_json_doc/test/test_data/json_to_html/test_html_input2.dart
@@ -0,0 +1,65 @@
+/**
+ * This is a library level dartdoc comment.
+ * This should be ignored.
+ */
+library testInput2;
+
+/// @docsEditable
+class InputTestCase1 {
+
+}
+
+/// @docsEditable
+class InputTestCase2 extends InputTestCase1 {
+
+}
+
+/// @docsEditable
+class InputTestCase3 extends InputTestCase2 {
+
+}
+
+/*
+ * This is not a dartdoc comment and should not be picked up.
+ * The output of this comment should be nothing.
+ */
+/// @docsEditable
+class InputTestCase4 {
+
+}
+
+/**
+ * This multi-line dartdoc comment doesn't have the /// @docsEditable stuff.
+ * This comment should not show up in the JSON.
+ * Note that the /// @docsEditable in this line and the one above are ignored.
+ */
+class InputTestCase5 {
+
+}
+
+/// This is a single line dartdoc comment that is ignored.
+class InputTestCase6 {
+
+}
+
+/// This is a multi-line dartdoc comment that is ignored.
+/// It is made of multiple single line dartdoc comments.
+class InputTestCase7 {
+
+  /// @docsEditable
+  var InputTestCase8;
+
+  /// @docsEditable
+  var InputTestCase9;
+
+  /// @docsEditable
+  var InputTestCase10;
+
+  /**
+   * This multi-line comment on a member is ignored.
+   */
+  var InputTestCase11;
+
+  /// This single line dartdoc comment on a member is ignored.
+  var InputTestCase12;
+}
diff --git a/tools/html_json_doc/test/test_output/html_to_json_test.json b/tools/html_json_doc/test/test_output/html_to_json_test.json
new file mode 100644
index 0000000..8495eed
--- /dev/null
+++ b/tools/html_json_doc/test/test_output/html_to_json_test.json
@@ -0,0 +1,79 @@
+{
+"test_html_input2.dart":
+  {
+  "class InputTestCase1 {":
+    [
+      "/**",
+      " * This is a multi-line dartdoc comment.",
+      " * This is one line.",
+      " * And it keeps going to this line, too.",
+      " */"
+    ],
+  "class InputTestCase2 extends InputTestCase1 {":
+    [
+      "/// This is a single line dartdoc comment."
+    ],
+  "class InputTestCase3 extends InputTestCase2 {":
+    [
+      "/// This is a multi-line dartdoc comment.",
+      "/// It happens to use multiple single line dartdoc comments."
+    ],
+  "  var InputTestCase8;":
+    [
+      "  /**",
+      "   * This is a multi-line comment on a member.",
+      "   */"
+    ],
+  "  var InputTestCase9;":
+    [
+      "  /// This is a single line dartdoc comment on a member."
+    ],
+  "  var InputTestCase10;":
+    [
+      "  /// This is a multi-line dartdoc comment on a member.",
+      "  /// It is split over two lines."
+    ]
+  },
+"test_html_input.dart":
+  {
+  "library testInput;":
+    [
+      "/**",
+      " * YES. This is a library level dartdoc comment.",
+      " * This should show up correctly in the JSON.",
+      " */"
+    ],
+  "class InputTestCase1 {":
+    [
+      "/**",
+      " * YES. This is a multi-line dartdoc comment.",
+      " * This is one line.",
+      " * And it keeps going to this line, too.",
+      " */"
+    ],
+  "class InputTestCase2 extends InputTestCase1 {":
+    [
+      "/// YES. This is a single line dartdoc comment."
+    ],
+  "class InputTestCase3 extends InputTestCase2 {":
+    [
+      "/// YES. This is a multi-line dartdoc comment.",
+      "/// It happens to use multiple single line dartdoc comments."
+    ],
+  "  var InputTestCase8;":
+    [
+      "  /**",
+      "   * YES. This is a multi-line comment on a member.",
+      "   */"
+    ],
+  "  var InputTestCase9;":
+    [
+      "  /// YES. This is a single line dartdoc comment on a member."
+    ],
+  "  var InputTestCase10;":
+    [
+      "  /// YES. This is a multi-line dartdoc comment on a member.",
+      "  /// It is split over two lines."
+    ]
+  }
+}
\ No newline at end of file
diff --git a/tools/html_json_doc/test/test_output/test_html_input.dart b/tools/html_json_doc/test/test_output/test_html_input.dart
new file mode 100644
index 0000000..291d0dd
--- /dev/null
+++ b/tools/html_json_doc/test/test_output/test_html_input.dart
@@ -0,0 +1,80 @@
+/**
+ * YES. This is a library level dartdoc comment.
+ * This should show up correctly in the JSON.
+ */
+/// @docsEditable
+library testInput;
+
+/**
+ * YES. This is a multi-line dartdoc comment.
+ * This is one line.
+ * And it keeps going to this line, too.
+ */
+/// @docsEditable
+class InputTestCase1 {
+
+}
+
+/// YES. This is a single line dartdoc comment.
+/// @docsEditable
+class InputTestCase2 extends InputTestCase1 {
+
+}
+
+/// YES. This is a multi-line dartdoc comment.
+/// It happens to use multiple single line dartdoc comments.
+/// @docsEditable
+class InputTestCase3 extends InputTestCase2 {
+
+}
+
+/*
+ * NO. This is not a dartdoc comment and should not be picked up.
+ * The output of this comment should be nothing.
+ */
+/// @docsEditable
+class InputTestCase4 {
+
+}
+
+/**
+ * NO. This multi-line dartdoc comment doesn't have the /// @docsEditable stuff.
+ * This comment should not show up in the JSON.
+ * Note that the /// @docsEditable in this line and the one above are ignored.
+ */
+class InputTestCase5 {
+
+}
+
+/// NO. This is a single line dartdoc comment that is ignored.
+class InputTestCase6 {
+
+}
+
+/// NO. This is a multi-line dartdoc comment that is ignored.
+/// It is made of multiple single line dartdoc comments.
+class InputTestCase7 {
+
+  /**
+   * YES. This is a multi-line comment on a member.
+   */
+  /// @docsEditable
+  var InputTestCase8;
+
+  /// YES. This is a single line dartdoc comment on a member.
+  /// @docsEditable
+  var InputTestCase9;
+
+  /// YES. This is a multi-line dartdoc comment on a member.
+  /// It is split over two lines.
+  /// @docsEditable
+  var InputTestCase10;
+
+  /**
+   * NO.This multi-line comment on a member is ignored.
+   */
+  var InputTestCase11;
+
+  /// NO. This single line dartdoc comment on a member is ignored.
+  var InputTestCase12;
+}
diff --git a/tools/html_json_doc/test/test_output/test_html_input2.dart b/tools/html_json_doc/test/test_output/test_html_input2.dart
new file mode 100644
index 0000000..1f9615b
--- /dev/null
+++ b/tools/html_json_doc/test/test_output/test_html_input2.dart
@@ -0,0 +1,79 @@
+/**
+ * This is a library level dartdoc comment.
+ * This should be ignored.
+ */
+library testInput2;
+
+/**
+ * This is a multi-line dartdoc comment.
+ * This is one line.
+ * And it keeps going to this line, too.
+ */
+/// @docsEditable
+class InputTestCase1 {
+
+}
+
+/// This is a single line dartdoc comment.
+/// @docsEditable
+class InputTestCase2 extends InputTestCase1 {
+
+}
+
+/// This is a multi-line dartdoc comment.
+/// It happens to use multiple single line dartdoc comments.
+/// @docsEditable
+class InputTestCase3 extends InputTestCase2 {
+
+}
+
+/*
+ * This is not a dartdoc comment and should not be picked up.
+ * The output of this comment should be nothing.
+ */
+/// @docsEditable
+class InputTestCase4 {
+
+}
+
+/**
+ * This multi-line dartdoc comment doesn't have the /// @docsEditable stuff.
+ * This comment should not show up in the JSON.
+ * Note that the /// @docsEditable in this line and the one above are ignored.
+ */
+class InputTestCase5 {
+
+}
+
+/// This is a single line dartdoc comment that is ignored.
+class InputTestCase6 {
+
+}
+
+/// This is a multi-line dartdoc comment that is ignored.
+/// It is made of multiple single line dartdoc comments.
+class InputTestCase7 {
+
+  /**
+   * This is a multi-line comment on a member.
+   */
+  /// @docsEditable
+  var InputTestCase8;
+
+  /// This is a single line dartdoc comment on a member.
+  /// @docsEditable
+  var InputTestCase9;
+
+  /// This is a multi-line dartdoc comment on a member.
+  /// It is split over two lines.
+  /// @docsEditable
+  var InputTestCase10;
+
+  /**
+   * This multi-line comment on a member is ignored.
+   */
+  var InputTestCase11;
+
+  /// This single line dartdoc comment on a member is ignored.
+  var InputTestCase12;
+}
diff --git a/tools/make_links.py b/tools/make_links.py
index 3f54004..e47d02f 100644
--- a/tools/make_links.py
+++ b/tools/make_links.py
@@ -50,12 +50,14 @@
 
 def main(argv):
   target = os.path.relpath(argv[1])
+  if not os.path.exists(target):
+    os.makedirs(target)
   for source in argv[2:]:
-    # Assume the source directory is named ".../TARGET_NAME/lib".
+    # Assume the source directory is named ".../NAME/lib".
     (name, lib) = os.path.split(source)
     if lib != 'lib':
       name = source
-    # Remove any addtional path components preceding TARGET_NAME.
+    # Remove any addtional path components preceding NAME.
     (path, name) = os.path.split(name)
     if utils.GuessOS() == 'win32':
       source = os.path.relpath(source)
diff --git a/tools/publish_pkg.py b/tools/publish_pkg.py
new file mode 100755
index 0000000..91ac8db
--- /dev/null
+++ b/tools/publish_pkg.py
@@ -0,0 +1,129 @@
+#!/usr/bin/env python
+#
+# Copyright (c) 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.
+#
+# Script to push a package to pub. 
+#
+# Usage: publish_pkg.py pkg_dir
+#
+# "pub" must be in PATH.
+
+
+import os
+import os.path
+import re
+import shutil
+import sys
+import subprocess
+import tempfile
+
+def ReplaceInFiles(paths, subs):
+  '''Reads a series of files, applies a series of substitutions to each, and
+     saves them back out. subs should be a list of (pattern, replace) tuples.'''
+  for path in paths:
+    contents = open(path).read()
+    for pattern, replace in subs:
+      contents = re.sub(pattern, replace, contents)
+
+    dest = open(path, 'w')
+    dest.write(contents)
+    dest.close()
+
+
+def ReadVersion(file, field):
+  for line in open(file).read().split('\n'):
+    [k, v] = re.split('\s+', line)
+    if field == k:
+      return int(v)
+  
+def Main(argv):
+  HOME = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
+
+  versionFile = os.path.join(HOME, 'tools', 'VERSION')
+  major = ReadVersion(versionFile, 'MAJOR')
+  minor = ReadVersion(versionFile, 'MINOR')
+  build = ReadVersion(versionFile, 'BUILD')
+  patch = ReadVersion(versionFile, 'PATCH')
+  
+  # bleeding_edge has a fixed version number of 0.1.x.y . Don't allow users
+  # to publish packages from bleeding_edge.
+  if major == 0 and minor <= 1:
+    print 'Error: Do not run this script from a bleeding_edge checkout.'
+    return -1
+
+  version = '%d.%d.%d+%d' % (major, minor, build, patch)
+
+  tmpDir = tempfile.mkdtemp()
+  pkgName = argv[1].split('/').pop()
+
+  pubspec = os.path.join(tmpDir, pkgName, 'pubspec.yaml')
+
+  if os.path.exists(os.path.join(HOME, argv[1], 'pubspec.yaml')):
+    #
+    # If pubspec.yaml exists, add the SDK's version number if
+    # no version number is present.
+    #
+    shutil.copytree(os.path.join(HOME, argv[1]), 
+                    os.path.join(tmpDir, pkgName))
+    with open(pubspec) as pubspecFile:
+      lines = pubspecFile.readlines()
+    with open(pubspec, 'w') as pubspecFile:
+      foundVersion = False
+      inDependencies = False
+      for line in lines:
+        if line.startswith('dependencies:'):
+          inDependencies = True
+        elif line[0].isalpha():
+          inDependencies = False
+        if line.startswith('version:'):
+          foundVersion = True
+        if inDependencies:
+          #
+          # Within dependencies, don't print line that start with "    sdk:"
+          # and strip out "{ sdk: package_name }".
+          #
+          if not line.startswith('    sdk:'):
+            line = re.sub(r'{(\s*)sdk:(\s+)([a-z0-9_]+)(\s*)}', '', line)
+            pubspecFile.write(line)
+        else:
+          pubspecFile.write(line)
+      if not foundVersion:
+        pubspecFile.write('\nversion: ' + version + '\n')
+  else:
+    #
+    # If there's a lib/ directory in the package, copy the package.
+    # Otherwise, move the package's contents to lib/.
+    #
+    if os.path.exists(os.path.join(HOME, argv[1], 'lib')):
+      shutil.copytree(os.path.join(HOME, argv[1]), 
+                      os.path.join(tmpDir, pkgName))
+    else:
+      os.makedirs(os.path.join(tmpDir, pkgName))
+      shutil.copytree(os.path.join(HOME, argv[1]),
+                      os.path.join(tmpDir, pkgName, 'lib'))
+
+    # Create pubspec.yaml .
+    with open(pubspec, 'w') as pubspecFile:
+      pubspecFile.write('name: ' + pkgName + '_unsupported\n')
+      pubspecFile.write('version: ' + version + '\n')
+      pubspecFile.write("description: >\n")
+      pubspecFile.write('  A completely unsupported clone of Dart SDK library\n')
+      pubspecFile.write('  ' + argv[1] + ' . This package will change in\n')
+      pubspecFile.write('  unpredictable/incompatible ways without warning.\n')
+      pubspecFile.write('dependencies:\n')
+
+  # Replace '../*/pkg' imports and parts.
+  for root, dirs, files in os.walk(os.path.join(tmpDir, pkgName)):
+    for name in files:
+      if name.endswith('.dart'):
+        ReplaceInFiles([os.path.join(root, name)], 
+            [(r'(import|part)(\s+)(\'|")(\.\./)+pkg/', r'\1\2\3package:')])
+  
+  print 'publishing version ' + version + ' of ' + argv[1] + ' to pub.\n'
+  subprocess.call(['pub', 'publish'], cwd=os.path.join(tmpDir, pkgName))
+  shutil.rmtree(tmpDir)
+
+if __name__ == '__main__':
+  sys.exit(Main(sys.argv))
diff --git a/tools/testing/dart/co19_test.dart b/tools/testing/dart/co19_test.dart
index 0adda23..9c6de09 100644
--- a/tools/testing/dart/co19_test.dart
+++ b/tools/testing/dart/co19_test.dart
@@ -35,7 +35,8 @@
     const <String>['-mrelease', '-rd8', '-cdart2js', '--use-sdk', '--checked']];
 
 void main() {
-  File scriptFile = new File(new Options().script);
+  Options options = new Options();
+  File scriptFile = new File(options.script);
   Path scriptPath =
       new Path.fromNative(scriptFile.fullPathSync())
       .directoryPath.directoryPath.directoryPath.append('test.dart');
@@ -46,6 +47,7 @@
   for (var commandLine in COMMAND_LINES) {
     List arguments = <String>[];
     arguments.addAll(COMMON_ARGUMENTS);
+    arguments.addAll(options.arguments);
     arguments.addAll(commandLine);
     arguments.add('co19');
     configurations.addAll(optionsParser.parse(arguments));
diff --git a/tools/testing/dart/test_options.dart b/tools/testing/dart/test_options.dart
index 8a3a2a6..fc9adac 100644
--- a/tools/testing/dart/test_options.dart
+++ b/tools/testing/dart/test_options.dart
@@ -12,7 +12,7 @@
 List<String> defaultTestSelectors =
     const ['dartc', 'samples', 'standalone', 'corelib', 'co19', 'language',
            'isolate', 'vm', 'html', 'json', 'benchmark_smoke',
-           'utils', 'pub', 'lib', 'pkg'];
+           'utils', 'lib', 'pkg'];
 
 /**
  * Specification of a single test option.
diff --git a/tools/testing/dart/test_runner.dart b/tools/testing/dart/test_runner.dart
index 30f5259..4c7498d 100644
--- a/tools/testing/dart/test_runner.dart
+++ b/tools/testing/dart/test_runner.dart
@@ -785,8 +785,13 @@
     void processExitHandler(int returnCode) {
       commandCompleteHandler(command, returnCode);
     }
-    
-    Future processFuture = Process.start(command.executable, command.arguments);
+    ProcessOptions options = new ProcessOptions();
+    options.environment = new Map<String, String>.from(Platform.environment);
+    options.environment['DART_CONFIGURATION'] =
+        TestUtils.configurationDir(testCase.configuration);
+    Future processFuture = Process.start(command.executable,
+                                         command.arguments,
+                                         options);
     processFuture.then((Process p) {
       process = p;
       process.onExit = processExitHandler;
diff --git a/tools/testing/dart/test_suite.dart b/tools/testing/dart/test_suite.dart
index 4ce2287..841c13a 100644
--- a/tools/testing/dart/test_suite.dart
+++ b/tools/testing/dart/test_suite.dart
@@ -115,7 +115,29 @@
     if (configuration['compiler'] == 'none') {
       return null;  // No separate compiler for dartium tests.
     }
-    var name = '$buildDir/${compilerName}';
+    var name;
+    switch (configuration['compiler']) {
+      case 'dartc':
+        name = '$buildDir/$executableName';
+      case 'dart2js':
+      case 'dart2dart':
+        var prefix = 'sdk/bin/';
+        String suffix = getExecutableSuffix(configuration['compiler']);
+        if (configuration['host_checked']) {
+          // The script dart2js_developer is not included in the
+          // shipped SDK, that is the script is not installed in
+          // "$buildDir/dart-sdk/bin/"
+          name = '$prefix/dart2js_developer$suffix';
+        } else {
+          if (configuration['use_sdk']) {
+            prefix = '$buildDir/dart-sdk/bin/';
+          }
+          name = '${prefix}dart2js$suffix';
+        }
+        break;
+      default:
+        throw "Unknown compiler for: ${configuration['compiler']}";
+    }
     if (!(new File(name)).existsSync() && !configuration['list']) {
       throw "Executable '$name' does not exist";
     }
@@ -123,21 +145,6 @@
   }
 
   /**
-   * The name of the compiler for this suite's configuration. Throws an error
-   * if the configuration does not use a compiler.
-   */
-  String get compilerName {
-    switch (configuration['compiler']) {
-      case 'dartc':
-      case 'dart2js':
-      case 'dart2dart':
-        return executableName;
-      default:
-        throw "Unknown compiler for: ${configuration['compiler']}";
-    }
-  }
-
-  /**
    * The file name of the executable used to run this suite's tests.
    */
   String get executableName {
@@ -147,19 +154,6 @@
         return 'dart$suffix';
       case 'dartc':
         return 'analyzer/bin/dart_analyzer$suffix';
-      case 'dart2js':
-      case 'dart2dart':
-        var prefix = '';
-        if (configuration['use_sdk']) {
-          prefix = 'dart-sdk/bin/';
-        }
-        if (configuration['host_checked']) {
-          // The script dart2js_developer is not in the SDK.
-          return 'dart2js_developer$suffix';
-        } else {
-          return '${prefix}dart2js$suffix';
-        }
-        break;
       default:
         throw "Unknown executable for: ${configuration['compiler']}";
     }
@@ -695,7 +689,7 @@
       args = new List.from(args);
       String tempDir = createOutputDirectory(info.filePath, '');
       args.add('--out=$tempDir/out.js');
-      List<Command> commands = <Command>[new Command(dartShellFileName, args)];
+      List<Command> commands = <Command>[new Command(compilerPath, args)];
       if (info.hasCompileError) {
         // Do not attempt to run the compiled result. A compilation
         // error should be reported by the compilation command.
@@ -712,7 +706,7 @@
       String tempDir = createOutputDirectory(info.filePath, '');
       compilerArguments.add('--out=$tempDir/out.dart');
       List<Command> commands =
-          <Command>[new Command(dartShellFileName, compilerArguments)];
+          <Command>[new Command(compilerPath, compilerArguments)];
       if (info.hasCompileError) {
         // Do not attempt to run the compiled result. A compilation
         // error should be reported by the compilation command.
@@ -1028,10 +1022,16 @@
 
     // Create '[build dir]/generated_tests/$compiler-$runtime/$testUniqueName',
     // including any intermediate directories that don't exist.
+    // If the tests are run in checked or minified mode we add that to the
+    // '$compile-$runtime' directory name.
+    var checked = configuration['checked'] ? '-checked' : '';
+    var minified = configuration['minified'] ? '-minified' : '';
+    var dirName = "${configuration['compiler']}-${configuration['runtime']}"
+                  "$checked$minified";
     var generatedTestPath = Strings.join([
         buildDir,
         'generated_tests',
-        "${configuration['compiler']}-${configuration['runtime']}",
+        dirName,
         testUniqueName
     ], '/');
 
@@ -1262,6 +1262,10 @@
             'More than one "// PackageRoot=" line in test $filePath');
       }
       packageRoot = match[1];
+      if (packageRoot != 'none') {
+        // PackageRoot=none means that no package-root option should be given.
+        packageRoot = '${filePath.directoryPath.join(new Path(packageRoot))}';
+      }
     }
 
     matches = staticCleanRegExp.allMatches(contents);
@@ -1610,9 +1614,13 @@
     } else if (system == 'windows') {
       outputDir = 'build/';
     }
+    return "$outputDir${configurationDir(configuration)}";
+  }
+
+  static String configurationDir(Map configuration) {
     var mode = (configuration['mode'] == 'debug') ? 'Debug' : 'Release';
     var arch = configuration['arch'].toUpperCase();
-    return "$outputDir$mode$arch";
+    return '$mode$arch';
   }
 }
 
diff --git a/utils/apidoc/.gitignore b/utils/apidoc/.gitignore
index 7d4ce82..adaa849 100644
--- a/utils/apidoc/.gitignore
+++ b/utils/apidoc/.gitignore
@@ -1,9 +1,22 @@
-/apidoc.Makefile
-/apidoc.xcodeproj
-/api_docs.target.mk
-/api_docs.vcxproj.filters
-/api_docs.vcproj
+/Makefile
+/out
+/runtime
+/xcodebuild
+/*.Makefile
+/*.sln
+/*.target.mk
+/*.vcproj
+/*.vcxproj
+/*.vcxproj.filters
+/*.vcxproj.user
+/*.xcodeproj
 /Debug
-/api_docs.vcxproj.user
-/apidoc.sln
+/DebugARM
 /DebugIA32
+/DebugSIMARM
+/DebugX64
+/Release
+/ReleaseARM
+/ReleaseIA32
+/ReleaseSIMARM
+/ReleaseX64
diff --git a/utils/apidoc/apidoc.gyp b/utils/apidoc/apidoc.gyp
index c029b94..ab17574 100644
--- a/utils/apidoc/apidoc.gyp
+++ b/utils/apidoc/apidoc.gyp
@@ -32,7 +32,7 @@
             '<(PRODUCT_DIR)/dart2js',
             '<(PRODUCT_DIR)/dart2js.bat',
             '<!@(["python", "../../tools/list_files.py", "\\.(css|ico|js|json|png|sh|txt|yaml|py)$", ".", "../../sdk/lib/_internal/dartdoc"])',
-            '<!@(["python", "../../tools/list_files.py", "\\.dart$", "../../lib", "../../runtime/lib", "../../runtime/bin", "../../sdk/lib/_internal/dartdoc"])',
+            '<!@(["python", "../../tools/list_files.py", "\\.dart$", "../../sdk/lib", "../../runtime/lib", "../../runtime/bin"])',
           ],
           'outputs': [
             '<(PRODUCT_DIR)/api_docs/index.html',
diff --git a/utils/apidoc/html_diff.dart b/utils/apidoc/html_diff.dart
index cc37f9f..f39cb12 100644
--- a/utils/apidoc/html_diff.dart
+++ b/utils/apidoc/html_diff.dart
@@ -18,8 +18,14 @@
 // TODO(amouravski): There is currently magic that looks at dart:* libraries
 // rather than the declared library names. This changed due to recent syntax
 // changes. We should only need to look at the library 'html'.
-const List<String> HTML_LIBRARY_NAMES = const ['dart:html', 'dart:svg'];
-const List<String> HTML_DECLARED_NAMES = const ['html', 'svg'];
+const List<String> HTML_LIBRARY_NAMES = const [
+    'dart:html',
+    'dart:svg',
+    'dart:web_audio'];
+const List<String> HTML_DECLARED_NAMES = const [
+    'html',
+    'svg',
+    'web_audio'];
 
 /**
  * A class for computing a many-to-many mapping between the types and
diff --git a/utils/compiler/.gitignore b/utils/compiler/.gitignore
index a2b2950..cfb192d 100644
--- a/utils/compiler/.gitignore
+++ b/utils/compiler/.gitignore
@@ -1,8 +1,14 @@
-/compiler.Makefile
-/compiler.xcodeproj
-/dart2js.target.mk
+/Makefile
 /out
 /xcodebuild
+/*.Makefile
+/*.sln
+/*.target.mk
+/*.vcproj
+/*.vcxproj
+/*.vcxproj.filters
+/*.vcxproj.user
+/*.xcodeproj
 /Debug
 /DebugARM
 /DebugIA32
@@ -13,9 +19,3 @@
 /ReleaseIA32
 /ReleaseSIMARM
 /ReleaseX64
-/api_docs.vcxproj
-/dart2js.vcxproj.user
-/dart2js.vcxproj
-/compiler.sln
-/dart2js.vcxproj.filters
-/dart2js.vcproj
diff --git a/utils/compiler/build_helper.dart b/utils/compiler/build_helper.dart
index fa2ec0c..79bfb63 100644
--- a/utils/compiler/build_helper.dart
+++ b/utils/compiler/build_helper.dart
@@ -94,12 +94,12 @@
   // Tell the VM to grow the heap more aggressively. This should only
   // be necessary temporarily until the VM is better at detecting how
   // applications use memory.
-  // TODO(ahe): Remove this option.
-  options = ' --heap_growth_rate=32$options';
+  // TODO(ahe): Remove this option (http://dartbug.com/6495).
+  options = ' --heap_growth_rate=512$options';
 
   // Tell the VM to don't bother inlining methods. So far it isn't
   // paying off but the VM team is working on fixing that.
-  // TODO(ahe): Remove this option.
+  // TODO(ahe): Remove this option (http://dartbug.com/6495).
   options = ' --no_use_inlining$options';
 
   return [
@@ -143,8 +143,12 @@
 if %SCRIPTPATH:~-1%==\ set SCRIPTPATH=%SCRIPTPATH:~0,-1%
 
 set arguments=%*
-set SNAPSHOTNAME=%SCRIPTPATH%dart2js.snapshot
-if exist %SNAPSHOTNAME% set SNAPSHOT=--use_script_snapshot=%SNAPSHOTNAME%
+set SNAPSHOT=
+set SNAPSHOTNAME=%SCRIPTPATH%${pathWin}.snapshot
+if exist %SNAPSHOTNAME% (
+  echo Using snapshot "%SNAPSHOTNAME%" 1>&2
+  set SNAPSHOT=--use_script_snapshot=%SNAPSHOTNAME%
+)
 
 "%SCRIPTPATH%\dart.exe"$options %SNAPSHOT% "%SCRIPTPATH%$pathWin" %arguments%
 '''.replaceAll('\n', '\r\n')];
diff --git a/utils/compiler/compiler.gyp b/utils/compiler/compiler.gyp
index 2dee58f..bcba6cc 100644
--- a/utils/compiler/compiler.gyp
+++ b/utils/compiler/compiler.gyp
@@ -57,10 +57,6 @@
           ],
           'action': [
             '<(PRODUCT_DIR)/<(EXECUTABLE_PREFIX)gen_snapshot<(EXECUTABLE_SUFFIX)',
-
-            # TODO(ahe): Remove option when http://dartbug.com/5989 is fixed.
-            '--optimization_counter_threshold=-1',
-
             # Note: we don't store the snapshot in the location where
             # the dart2js script is looking for it.  The motivation
             # for that is to support an incremental development model
diff --git a/utils/pub/command_lish.dart b/utils/pub/command_lish.dart
new file mode 100644
index 0000000..7563bb1
--- /dev/null
+++ b/utils/pub/command_lish.dart
@@ -0,0 +1,167 @@
+// Copyright (c) 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 command_lish;
+
+import 'dart:io';
+import 'dart:json';
+import 'dart:uri';
+
+import '../../pkg/args/lib/args.dart';
+import '../../pkg/http/lib/http.dart' as http;
+import 'pub.dart';
+import 'io.dart';
+import 'git.dart' as git;
+import 'oauth2.dart' as oauth2;
+
+// TODO(nweiz): Make "publish" the primary name for this command. See issue
+// 6949.
+/// Handles the `lish` and `publish` pub commands.
+class LishCommand extends PubCommand {
+  final description = "publish the current package to pub.dartlang.org";
+  final usage = "pub publish [options]";
+  final aliases = const ["lish", "lush"];
+
+  ArgParser get commandParser {
+    var parser = new ArgParser();
+    parser.addOption('server', defaultsTo: 'http://pub.dartlang.org',
+        help: 'The package server to which to upload this package');
+    return parser;
+  }
+
+  /// The URL of the server to which to upload the package.
+  Uri get server => new Uri.fromString(commandOptions['server']);
+
+  Future onRun() {
+    var cloudStorageUrl;
+    return oauth2.withClient(cache, (client) {
+      // TODO(nweiz): Better error-handling. There are a few cases we need to
+      // handle better:
+      //
+      // * The server can tell us we need new credentials (a 401 error). The
+      //   oauth2 package should throw an AuthorizationException in this case
+      //   (contingent on issue 6813 and 6275). We should have the user
+      //   re-authorize the client, then restart the command. We should also do
+      //   this in case of an ExpirationException. See issue 6950.
+      //
+      // * Cloud Storage can provide an XML-formatted error. We should report
+      //   that error and exit.
+      return Futures.wait([
+        client.get(server.resolve("/packages/versions/new.json")),
+        _filesToPublish.transform((files) {
+          return createTarGz(files, baseDir: entrypoint.root.dir);
+        }).chain(consumeInputStream)
+      ]).chain((results) {
+        var response = results[0];
+        var packageBytes = results[1];
+        var parameters = _parseJson(response);
+
+        var url = _expectField(parameters, 'url', response);
+        if (url is! String) _invalidServerResponse(response);
+        cloudStorageUrl = new Uri.fromString(url);
+        var request = new http.MultipartRequest('POST', cloudStorageUrl);
+
+        var fields = _expectField(parameters, 'fields', response);
+        if (fields is! Map) _invalidServerResponse(response);
+        fields.forEach((key, value) {
+          if (value is! String) _invalidServerResponse(response);
+          request.fields[key] = value;
+        });
+
+        request.followRedirects = false;
+        request.files.add(new http.MultipartFile.fromBytes(
+            'file', packageBytes, filename: 'package.tar.gz'));
+        return client.send(request);
+      }).chain(http.Response.fromStream).transform((response) {
+        var location = response.headers['location'];
+        if (location == null) throw new PubHttpException(response);
+        return location;
+      }).chain((location) => client.get(location)).transform((response) {
+        var parsed = _parseJson(response);
+        if (parsed['success'] is! Map ||
+            !parsed['success'].containsKey('message') ||
+            parsed['success']['message'] is! String) {
+          _invalidServerResponse(response);
+        }
+        print(parsed['success']['message']);
+      });
+    }).transformException((e) {
+      if (e is PubHttpException) {
+        var url = e.response.request.url;
+        if (url.toString() == cloudStorageUrl.toString()) {
+          // TODO(nweiz): the response may have XML-formatted information about
+          // the error. Try to parse that out once we have an easily-accessible
+          // XML parser.
+          throw 'Failed to upload the package.';
+        } else if (url.origin == server.origin) {
+          var errorMap = _parseJson(e.response);
+          if (errorMap['error'] is! Map ||
+              !errorMap['error'].containsKey('message') ||
+              errorMap['error']['message'] is! String) {
+            _invalidServerResponse(e.response);
+          }
+          throw errorMap['error']['message'];
+        }
+      }
+
+      if (e is! oauth2.ExpirationException) throw e;
+
+      printError("Pub's authorization to upload packages has expired and can't "
+          "be automatically refreshed.");
+      return onRun();
+    });
+  }
+
+  /// Returns a list of files that should be included in the published package.
+  /// If this is a Git repository, this will respect .gitignore; otherwise, it
+  /// will return all non-hidden files.
+  Future<List<String>> get _filesToPublish {
+    var rootDir = entrypoint.root.dir;
+    return Futures.wait([
+      dirExists(join(rootDir, '.git')),
+      git.isInstalled
+    ]).chain((results) {
+      if (results[0] && results[1]) {
+        // List all files that aren't gitignored, including those not checked in
+        // to Git.
+        return git.run(["ls-files", "--cached", "--others"]);
+      }
+
+      return listDir(rootDir, recursive: true).chain((entries) {
+        return Futures.wait(entries.map((entry) {
+          return fileExists(entry).transform((isFile) => isFile ? entry : null);
+        }));
+      });
+    }).transform((files) => files.filter((file) {
+      return file != null && basename(file) != 'packages';
+    }));
+  }
+
+  /// Parses a response body, assuming it's JSON-formatted. Throws a
+  /// user-friendly error if the response body is invalid JSON, or if it's not a
+  /// map.
+  Map _parseJson(http.Response response) {
+    var value;
+    try {
+      value = JSON.parse(response.body);
+    } catch (e) {
+      // TODO(nweiz): narrow this catch clause once issue 6775 is fixed.
+      _invalidServerResponse(response);
+    }
+    if (value is! Map) _invalidServerResponse(response);
+    return value;
+  }
+
+  /// Returns the value associated with [key] in [map]. Throws a user-friendly
+  /// error if [map] doens't contain [key].
+  _expectField(Map map, String key, http.Response response) {
+    if (map.containsKey(key)) return map[key];
+    _invalidServerResponse(response);
+  }
+
+  /// Throws an error describing an invalid response from the server.
+  void _invalidServerResponse(http.Response response) {
+    throw 'Invalid server response:\n${response.body}';
+  }
+}
diff --git a/utils/pub/curl_client.dart b/utils/pub/curl_client.dart
index 20a1027..e1afc2d 100644
--- a/utils/pub/curl_client.dart
+++ b/utils/pub/curl_client.dart
@@ -45,7 +45,7 @@
 
         return _waitForHeaders(process, expectBody: request.method != "HEAD");
       }).chain((_) => new File(headerFile).readAsLines())
-        .transform((lines) => _buildResponse(process, lines));
+        .transform((lines) => _buildResponse(request, process, lines));
     });
   }
 
@@ -105,12 +105,17 @@
   /// receiving the response headers. [expectBody] indicates that the server is
   /// expected to send a response body (which is not the case for HEAD
   /// requests).
+  ///
+  /// Curl prints the headers to a file and then prints the body to stdout. So,
+  /// in theory, we could read the headers as soon as we see anything appear
+  /// in stdout. However, that seems to be too early to successfully read the
+  /// file (at least on Mac). Instead, this just waits until the entire process
+  /// has completed.
   Future _waitForHeaders(Process process, {bool expectBody}) {
-    var exitCompleter = new Completer<int>();
-    var exitFuture = exitCompleter.future;
+    var completer = new Completer();
     process.onExit = (exitCode) {
       if (exitCode == 0) {
-        exitCompleter.complete(0);
+        completer.complete(null);
         return;
       }
 
@@ -122,7 +127,7 @@
         } else {
           throw new HttpException(message);
         }
-      }), exitCompleter);
+      }), completer);
     };
 
     // If there's not going to be a response body (e.g. for HEAD requests), curl
@@ -131,38 +136,17 @@
     if (!expectBody) {
       return Futures.wait([
         consumeInputStream(process.stdout),
-        exitFuture
+        completer.future
       ]);
     }
 
-    var completer = new Completer();
-    resetCallbacks() {
-      process.stdout.onData = null;
-      process.stdout.onError = null;
-      process.stdout.onClosed = null;
-    }
-    process.stdout.onData = () {
-      // TODO(nweiz): If an error happens after the body data starts being
-      // received, it should be piped through Response.stream once issue
-      // 3657 is fixed.
-      exitFuture.handleException((e) => true);
-      resetCallbacks();
-      completer.complete(null);
-    };
-    process.stdout.onError = (e) {
-      resetCallbacks();
-      completer.completeException(e);
-    };
-    process.stdout.onClosed = () {
-      resetCallbacks();
-      chainToCompleter(exitFuture, completer);
-    };
     return completer.future;
   }
 
   /// Returns a [http.StreamedResponse] from the response data printed by the
   /// `curl` [process]. [lines] are the headers that `curl` wrote to a file.
-  http.StreamedResponse _buildResponse(Process process, List<String> lines) {
+  http.StreamedResponse _buildResponse(
+      http.BaseRequest request, Process process, List<String> lines) {
     // When curl follows redirects, it prints the redirect headers as well as
     // the headers of the final request. Each block is separated by a blank
     // line. We just care about the last block. There is one trailing empty
@@ -192,6 +176,7 @@
     }
 
     return new http.StreamedResponse(responseStream, status, contentLength,
+        request: request,
         headers: headers,
         isRedirect: isRedirect,
         reasonPhrase: reasonPhrase);
diff --git a/utils/pub/hosted_source.dart b/utils/pub/hosted_source.dart
index 07ea60f..8315acd 100644
--- a/utils/pub/hosted_source.dart
+++ b/utils/pub/hosted_source.dart
@@ -8,6 +8,8 @@
 import 'dart:json';
 import 'dart:uri';
 
+// TODO(nweiz): Make this import better.
+import '../../pkg/http/lib/http.dart' as http;
 import 'io.dart';
 import 'package.dart';
 import 'pubspec.dart';
@@ -37,7 +39,7 @@
     var parsed = _parseDescription(description);
     var fullUrl = "${parsed.last}/packages/${parsed.first}.json";
 
-    return httpGetString(fullUrl).transform((body) {
+    return httpClient.read(fullUrl).transform((body) {
       var doc = JSON.parse(body);
       return doc['versions'].map((version) => new Version.parse(version));
     }).transformException((ex) {
@@ -54,7 +56,7 @@
     var fullUrl = "${parsed.last}/packages/${parsed.first}/versions/"
       "${id.version}.yaml";
 
-    return httpGetString(fullUrl).transform((yaml) {
+    return httpClient.read(fullUrl).transform((yaml) {
       return new Pubspec.parse(yaml, systemCache.sources);
     }).transformException((ex) {
       _throwFriendlyError(ex, id, parsed.last);
@@ -75,11 +77,14 @@
 
     // Download and extract the archive to a temp directory.
     var tempDir;
-    return Futures.wait([httpGet(fullUrl),
-                         systemCache.createTempDir()]).chain((args) {
+    return Futures.wait([
+      httpClient.send(new http.Request("GET", new Uri.fromString(fullUrl)))
+          .transform((response) => response.stream),
+      systemCache.createTempDir()
+    ]).chain((args) {
       tempDir = args[1];
       return timeout(extractTarGz(args[0], tempDir), HTTP_TIMEOUT,
-          'Timed out while fetching URL "$fullUrl".');
+          'fetching URL "$fullUrl"');
     }).chain((_) {
       // Now that the install has succeeded, move it to the real location in
       // the cache. This ensures that we don't leave half-busted ghost
@@ -123,7 +128,7 @@
   /// this tries to translate into a more user friendly error message. Always
   /// throws an error, either the original one or a better one.
   void _throwFriendlyError(ex, package, url) {
-    if (ex is PubHttpException && ex.statusCode == 404) {
+    if (ex is PubHttpException && ex.response.statusCode == 404) {
       throw 'Could not find package "$package" at $url.';
     }
 
diff --git a/utils/pub/io.dart b/utils/pub/io.dart
index ed5dee6..0c6903f 100644
--- a/utils/pub/io.dart
+++ b/utils/pub/io.dart
@@ -11,7 +11,10 @@
 import 'dart:isolate';
 import 'dart:uri';
 
+// TODO(nweiz): Make this import better.
+import '../../pkg/http/lib/http.dart' as http;
 import 'utils.dart';
+import 'curl_client.dart';
 
 bool _isGitInstalledCache;
 
@@ -31,13 +34,14 @@
   stderr.writeString('\n');
 }
 
+
 /**
  * Joins a number of path string parts into a single path. Handles
  * platform-specific path separators. Parts can be [String], [Directory], or
  * [File] objects.
  */
 String join(part1, [part2, part3, part4]) {
-  final parts = _getPath(part1).replaceAll('\\', '/').split('/');
+  final parts = _sanitizePath(part1).split('/');
 
   for (final part in [part2, part3, part4]) {
     if (part == null) continue;
@@ -65,7 +69,7 @@
 // TODO(rnystrom): Copied from file_system (so that we don't have to add
 // file_system to the SDK). Should unify.
 String basename(file) {
-  file = _getPath(file).replaceAll('\\', '/');
+  file = _sanitizePath(file);
 
   int lastSlash = file.lastIndexOf('/', file.length);
   if (lastSlash == -1) {
@@ -82,7 +86,7 @@
 // TODO(nweiz): Copied from file_system (so that we don't have to add
 // file_system to the SDK). Should unify.
 String dirname(file) {
-  file = _getPath(file).replaceAll('\\', '/');
+  file = _sanitizePath(file);
 
   int lastSlash = file.lastIndexOf('/', file.length);
   if (lastSlash == -1) {
@@ -92,6 +96,11 @@
   }
 }
 
+/// Returns whether or not [entry] is nested somewhere within [dir]. This just
+/// performs a path comparison; it doesn't look at the actual filesystem.
+bool isBeneath(entry, dir) =>
+  _sanitizePath(entry).startsWith('${_sanitizePath(dir)}/');
+
 /**
  * Asynchronously determines if [path], which can be a [String] file path, a
  * [File], or a [Directory] exists on the file system. Returns a [Future] that
@@ -157,8 +166,16 @@
     completer.complete(file);
   };
 
+  // TODO(nweiz): remove this when issue 4061 is fixed.
+  var stackTrace;
+  try {
+    throw "";
+  } catch (_, localStackTrace) {
+    stackTrace = localStackTrace;
+  }
+
   completeError(error) {
-    if (!completer.isComplete) completer.completeException(error);
+    if (!completer.isComplete) completer.completeException(error, stackTrace);
   }
 
   stream.onError = completeError;
@@ -228,12 +245,11 @@
 /**
  * Asynchronously lists the contents of [dir], which can be a [String] directory
  * path or a [Directory]. If [recursive] is `true`, lists subdirectory contents
- * (defaults to `false`). If [includeSpecialFiles] is `true`, includes
- * hidden `.DS_Store` files (defaults to `false`, other hidden files may be
- * omitted later).
+ * (defaults to `false`). If [includeHiddenFiles] is `true`, includes files
+ * beginning with `.` (defaults to `false`).
  */
 Future<List<String>> listDir(dir,
-    [bool recursive = false, bool includeSpecialFiles = false]) {
+    {bool recursive: false, bool includeHiddenFiles: false}) {
   final completer = new Completer<List<String>>();
   final contents = <String>[];
 
@@ -246,12 +262,18 @@
     if (done) completer.complete(contents);
   };
 
-  lister.onError = (error) => completer.completeException(error);
+  // TODO(nweiz): remove this when issue 4061 is fixed.
+  var stackTrace;
+  try {
+    throw "";
+  } catch (_, localStackTrace) {
+    stackTrace = localStackTrace;
+  }
+
+  lister.onError = (error) => completer.completeException(error, stackTrace);
   lister.onDir = (file) => contents.add(file);
   lister.onFile = (file) {
-    if (!includeSpecialFiles) {
-      if (basename(file) == '.DS_Store') return;
-    }
+    if (!includeHiddenFiles && basename(file).startsWith('.')) return;
     contents.add(file);
   };
 
@@ -368,8 +390,60 @@
 /// Resolves [path] relative to the location of pub.dart.
 String relativeToPub(String path) {
   var scriptPath = new File(new Options().script).fullPathSync();
-  var scriptDir = new Path.fromNative(scriptPath).directoryPath;
-  return scriptDir.append(path).canonicalize().toNativePath();
+
+  // Walk up until we hit the "util(s)" directory. This lets us figure out where
+  // we are if this function is called from pub.dart, or one of the tests,
+  // which also live under "utils", or from the SDK where pub is in "util".
+  var utilDir = new Path.fromNative(scriptPath).directoryPath;
+  while (utilDir.filename != 'utils' && utilDir.filename != 'util') {
+    if (utilDir.filename == '') throw 'Could not find path to pub.';
+    utilDir = utilDir.directoryPath;
+  }
+
+  return utilDir.append('pub').append(path).canonicalize().toNativePath();
+}
+
+/// A StringInputStream reading from stdin.
+final _stringStdin = new StringInputStream(stdin);
+
+/// Returns a single line read from a [StringInputStream]. By default, reads
+/// from stdin.
+///
+/// A [StringInputStream] passed to this should have no callbacks registered.
+Future<String> readLine([StringInputStream stream]) {
+  if (stream == null) stream = _stringStdin;
+  if (stream.closed) return new Future.immediate('');
+  void removeCallbacks() {
+    stream.onClosed = null;
+    stream.onLine = null;
+    stream.onError = null;
+  }
+
+  // TODO(nweiz): remove this when issue 4061 is fixed.
+  var stackTrace;
+  try {
+    throw "";
+  } catch (_, localStackTrace) {
+    stackTrace = localStackTrace;
+  }
+
+  var completer = new Completer();
+  stream.onClosed = () {
+    removeCallbacks();
+    completer.complete('');
+  };
+
+  stream.onLine = () {
+    removeCallbacks();
+    completer.complete(stream.readLine());
+  };
+
+  stream.onError = (e) {
+    removeCallbacks();
+    completer.completeException(e, stackTrace);
+  };
+
+  return completer.future;
 }
 
 // TODO(nweiz): make this configurable
@@ -379,106 +453,149 @@
  */
 final HTTP_TIMEOUT = 30 * 1000;
 
-/**
- * Opens an input stream for a HTTP GET request to [uri], which may be a
- * [String] or [Uri].
- *
- * Callers should be sure to use [timeout] to make sure that the HTTP request
- * doesn't last indefinitely
- */
-Future<InputStream> httpGet(uri) {
-  // TODO(nweiz): This could return an InputStream synchronously if issue 3657
-  // were fixed and errors could be propagated through it. Then we could also
-  // automatically attach a timeout to that stream.
-  uri = _getUri(uri);
+/// An HTTP client that transforms 40* errors and socket exceptions into more
+/// user-friendly error messages.
+class PubHttpClient extends http.BaseClient {
+  final http.Client _inner;
 
-  var completer = new Completer<InputStream>();
-  var client = new HttpClient();
-  var connection = client.getUrl(uri);
+  PubHttpClient([http.Client inner])
+    : _inner = inner == null ? new http.Client() : inner;
 
-  connection.onError = (e) {
-    // Show a friendly error if the URL couldn't be resolved.
-    if (e is SocketIOException &&
-        e.osError != null &&
-        (e.osError.errorCode == 8 ||
-         e.osError.errorCode == -2 ||
-         e.osError.errorCode == -5 ||
-         e.osError.errorCode == 11004)) {
-      e = 'Could not resolve URL "${uri.origin}".';
+  Future<http.StreamedResponse> send(http.BaseRequest request) {
+    // TODO(nweiz): remove this when issue 4061 is fixed.
+    var stackTrace;
+    try {
+      throw null;
+    } catch (_, localStackTrace) {
+      stackTrace = localStackTrace;
     }
 
-    client.shutdown();
-    completer.completeException(e);
-  };
+    // TODO(nweiz): Ideally the timeout would extend to reading from the
+    // response input stream, but until issue 3657 is fixed that's not feasible.
+    return timeout(_inner.send(request).chain((streamedResponse) {
+      if (streamedResponse.statusCode < 400) {
+        return new Future.immediate(streamedResponse);
+      }
 
-  connection.onResponse = (response) {
-    if (response.statusCode >= 400) {
-      client.shutdown();
-      completer.completeException(
-          new PubHttpException(response.statusCode, response.reasonPhrase));
-      return;
-    }
-
-    completer.complete(response.inputStream);
-  };
-
-  return completer.future;
+      return http.Response.fromStream(streamedResponse).transform((response) {
+        throw new PubHttpException(response);
+      });
+    }).transformException((e) {
+      if (e is SocketIOException &&
+          e.osError != null &&
+          (e.osError.errorCode == 8 ||
+           e.osError.errorCode == -2 ||
+           e.osError.errorCode == -5 ||
+           e.osError.errorCode == 11004)) {
+        throw 'Could not resolve URL "${request.url.origin}".';
+      }
+      throw e;
+    }), HTTP_TIMEOUT, 'fetching URL "${request.url}"');
+  }
 }
 
-/**
- * Opens an input stream for a HTTP GET request to [uri], which may be a
- * [String] or [Uri]. Completes with the result of the request as a String.
- */
-Future<String> httpGetString(uri) {
-  var future = httpGet(uri).chain((stream) => consumeInputStream(stream))
-      .transform((bytes) => new String.fromCharCodes(bytes));
-  return timeout(future, HTTP_TIMEOUT, 'Timed out while fetching URL "$uri".');
-}
+/// The HTTP client to use for all HTTP requests.
+final httpClient = new PubHttpClient();
+
+final curlClient = new PubHttpClient(new CurlClient());
 
 /**
  * Takes all input from [source] and writes it to [sink].
  *
- * [onClosed] is called when [source] is closed.
+ * Returns a future that completes when [source] is closed.
  */
-void pipeInputToInput(InputStream source, ListInputStream sink,
-    [void onClosed()]) {
+Future pipeInputToInput(InputStream source, ListInputStream sink) {
+  var completer = new Completer();
   source.onClosed = () {
     sink.markEndOfStream();
-    if (onClosed != null) onClosed();
+    completer.complete(null);
   };
   source.onData = () => sink.write(source.read());
   // TODO(nweiz): propagate this error to the sink. See issue 3657.
   source.onError = (e) { throw e; };
+  return completer.future;
 }
 
 /**
  * Buffers all input from an InputStream and returns it as a future.
  */
 Future<List<int>> consumeInputStream(InputStream stream) {
+  if (stream.closed) return new Future.immediate(<int>[]);
+
+  // TODO(nweiz): remove this when issue 4061 is fixed.
+  var stackTrace;
+  try {
+    throw "";
+  } catch (_, localStackTrace) {
+    stackTrace = localStackTrace;
+  }
+
   var completer = new Completer<List<int>>();
   var buffer = <int>[];
   stream.onClosed = () => completer.complete(buffer);
   stream.onData = () => buffer.addAll(stream.read());
-  stream.onError = (e) => completer.completeException(e);
+  stream.onError = (e) => completer.completeException(e, stackTrace);
+  return completer.future;
+}
+
+/// Buffers all input from a StringInputStream and returns it as a future.
+Future<String> consumeStringInputStream(StringInputStream stream) {
+  if (stream.closed) return new Future.immediate('');
+
+  // TODO(nweiz): remove this when issue 4061 is fixed.
+  var stackTrace;
+  try {
+    throw "";
+  } catch (_, localStackTrace) {
+    stackTrace = localStackTrace;
+  }
+
+  var completer = new Completer<String>();
+  var buffer = new StringBuffer();
+  stream.onClosed = () => completer.complete(buffer.toString());
+  stream.onData = () => buffer.add(stream.read());
+  stream.onError = (e) => completer.completeException(e, stackTrace);
   return completer.future;
 }
 
 /// Spawns and runs the process located at [executable], passing in [args].
-/// Returns a [Future] that will complete the results of the process after it
-/// has ended.
+/// Returns a [Future] that will complete with the results of the process after
+/// it has ended.
 ///
 /// The spawned process will inherit its parent's environment variables. If
 /// [environment] is provided, that will be used to augment (not replace) the
 /// the inherited variables.
-///
-/// If [pipeStdout] and/or [pipeStderr] are set, all output from the
-/// subprocess's output streams are sent to the parent process's output streams.
-/// Output from piped streams won't be available in the result object.
 Future<PubProcessResult> runProcess(String executable, List<String> args,
-    {workingDir, Map<String, String> environment, bool pipeStdout: false,
-    bool pipeStderr: false}) {
-  int exitCode;
+    {workingDir, Map<String, String> environment}) {
+  return _doProcess(Process.run, executable, args, workingDir, environment)
+      .transform((result) {
+    // TODO(rnystrom): Remove this and change to returning one string.
+    List<String> toLines(String output) {
+      var lines = output.split(NEWLINE_PATTERN);
+      if (!lines.isEmpty && lines.last == "") lines.removeLast();
+      return lines;
+    }
+    return new PubProcessResult(toLines(result.stdout),
+                                toLines(result.stderr),
+                                result.exitCode);
+  });
+}
 
+/// Spawns the process located at [executable], passing in [args]. Returns a
+/// [Future] that will complete with the [Process] once it's been started.
+///
+/// The spawned process will inherit its parent's environment variables. If
+/// [environment] is provided, that will be used to augment (not replace) the
+/// the inherited variables.
+Future<Process> startProcess(String executable, List<String> args,
+    {workingDir, Map<String, String> environment}) =>
+  _doProcess(Process.start, executable, args, workingDir, environment);
+
+/// Calls [fn] with appropriately modified arguments. [fn] should have the same
+/// signature as [Process.start], except that the returned [Future] may have a
+/// type other than [Process].
+Future _doProcess(Function fn, String executable, List<String> args, workingDir,
+    Map<String, String> environment) {
   // TODO(rnystrom): Should dart:io just handle this?
   // Spawning a process on Windows will not look for the executable in the
   // system path. So, if executable looks like it needs that (i.e. it doesn't
@@ -499,39 +616,55 @@
     environment.forEach((key, value) => options.environment[key] = value);
   }
 
-  var future = Process.run(executable, args, options);
-  return future.transform((result) {
-    // TODO(rnystrom): Remove this and change to returning one string.
-    List<String> toLines(String output) {
-      var lines = output.split(NEWLINE_PATTERN);
-      if (!lines.isEmpty && lines.last == "") lines.removeLast();
-      return lines;
-    }
-    return new PubProcessResult(toLines(result.stdout),
-                                toLines(result.stderr),
-                                result.exitCode);
-  });
+  return fn(executable, args, options);
+}
+
+/// Closes [response] while ignoring the body of [request]. Returns a Future
+/// that completes once the response is closed.
+///
+/// Due to issue 6984, it's necessary to drain the request body before closing
+/// the response.
+Future closeHttpResponse(HttpRequest request, HttpResponse response) {
+  // TODO(nweiz): remove this when issue 4061 is fixed.
+  var stackTrace;
+  try {
+    throw "";
+  } catch (_, localStackTrace) {
+    stackTrace = localStackTrace;
+  }
+
+  var completer = new Completer();
+  request.inputStream.onError = (e) =>
+      completer.completeException(e, stackTrace);
+  request.inputStream.onData = request.inputStream.read;
+  request.inputStream.onClosed = () {
+    response.outputStream.close();
+    completer.complete(null);
+  };
+  return completer.future;
 }
 
 /**
  * Wraps [input] to provide a timeout. If [input] completes before
  * [milliseconds] have passed, then the return value completes in the same way.
  * However, if [milliseconds] pass before [input] has completed, it completes
- * with a [TimeoutException] with [message].
+ * with a [TimeoutException] with [description] (which should be a fragment
+ * describing the action that timed out).
  *
  * Note that timing out will not cancel the asynchronous operation behind
  * [input].
  */
-Future timeout(Future input, int milliseconds, String message) {
+Future timeout(Future input, int milliseconds, String description) {
   var completer = new Completer();
   var timer = new Timer(milliseconds, (_) {
     if (completer.future.isComplete) return;
-    completer.completeException(new TimeoutException(message));
+    completer.completeException(new TimeoutException(
+        'Timed out while $description.'));
   });
   input.handleException((e) {
     if (completer.future.isComplete) return false;
     timer.cancel();
-    completer.completeException(e);
+    completer.completeException(e, input.stackTrace);
     return true;
   });
   input.then((value) {
@@ -547,7 +680,7 @@
 /// will be deleted.
 Future withTempDir(Future fn(String path)) {
   var tempDir;
-  var future = new Directory('').createTemp().chain((dir) {
+  var future = createTempDir().chain((dir) {
     tempDir = dir;
     return fn(tempDir.path);
   });
@@ -638,7 +771,7 @@
     process.stderr.pipe(stderr, close: false);
   });
   processFuture.handleException((error) {
-    completer.completeException(error);
+    completer.completeException(error, processFuture.stackTrace);
     return true;
   });
 
@@ -660,6 +793,7 @@
 
   var tempDir;
 
+  // TODO(rnystrom): Use withTempDir().
   return createTempDir().chain((temp) {
     // Write the archive to a temp file.
     tempDir = temp;
@@ -704,16 +838,76 @@
   }).transform((_) => true);
 }
 
+/// Create a .tar.gz archive from a list of entries. Each entry can be a
+/// [String], [Directory], or [File] object. The root of the archive is
+/// considered to be [baseDir], which defaults to the current working directory.
+/// Returns an [InputStream] that will emit the contents of the archive.
+InputStream createTarGz(List contents, {baseDir}) {
+  // TODO(nweiz): Propagate errors to the returned stream (including non-zero
+  // exit codes). See issue 3657.
+  var stream = new ListInputStream();
+
+  if (baseDir == null) baseDir = currentWorkingDir;
+  baseDir = getFullPath(baseDir);
+  contents = contents.map((entry) {
+    entry = getFullPath(entry);
+    if (!isBeneath(entry, baseDir)) {
+      throw 'Entry $entry is not inside $baseDir.';
+    }
+    return new Path.fromNative(entry).relativeTo(new Path.fromNative(baseDir))
+        .toNativePath();
+  });
+
+  if (Platform.operatingSystem != "windows") {
+    var args = ["--create", "--gzip", "--directory", baseDir];
+    args.addAll(contents.map(_getPath));
+    // TODO(nweiz): It's possible that enough command-line arguments will make
+    // the process choke, so at some point we should save the arguments to a
+    // file and pass them in via --files-from for tar and -i@filename for 7zip.
+    startProcess("tar", args).then((process) {
+      pipeInputToInput(process.stdout, stream);
+      process.stderr.pipe(stderr, close: false);
+    });
+    return stream;
+  }
+
+  withTempDir((tempDir) {
+    // Create the tar file.
+    var tarFile = join(tempDir, "intermediate.tar");
+    var args = ["a", "-w$baseDir", tarFile];
+    args.addAll(contents.map((entry) => '-i!"$entry"'));
+
+    // Note: This line of code gets munged by create_sdk.py to be the correct
+    // relative path to 7zip in the SDK.
+    var pathTo7zip = '../../third_party/7zip/7za.exe';
+    var command = relativeToPub(pathTo7zip);
+
+    // We're passing 'baseDir' both as '-w' and setting it as the working
+    // directory explicitly here intentionally. The former ensures that the
+    // files added to the archive have the correct relative path in the archive.
+    // The latter enables relative paths in the "-i" args to be resolved.
+    return runProcess(command, args, workingDir: baseDir).chain((_) {
+      // GZIP it. 7zip doesn't support doing both as a single operation. Send
+      // the output to stdout.
+      args = ["a", "unused", "-tgzip", "-so", tarFile];
+      return startProcess(command, args);
+    }).chain((process) {
+      process.stderr.pipe(stderr, close: false);
+      return pipeInputToInput(process.stdout, stream);
+    });
+  });
+  return stream;
+}
+
 /**
  * Exception thrown when an HTTP operation fails.
  */
 class PubHttpException implements Exception {
-  final int statusCode;
-  final String reason;
+  final http.Response response;
 
-  const PubHttpException(this.statusCode, this.reason);
+  const PubHttpException(this.response);
 
-  String toString() => 'HTTP error $statusCode: $reason';
+  String toString() => 'HTTP error ${response.statusCode}: ${response.reason}';
 }
 
 /**
@@ -752,6 +946,16 @@
   throw 'Entry $entry is not a supported type.';
 }
 
+/// Gets the path string for [entry] as in [_getPath], but normalizes
+/// backslashes to forward slashes on Windows.
+String _sanitizePath(entry) {
+  entry = _getPath(entry);
+  if (Platform.operatingSystem == 'windows') {
+    entry = entry.replaceAll('\\', '/');
+  }
+  return entry;
+}
+
 /**
  * Gets a [Directory] for [entry], which can either already be one, or be a
  * [String].
diff --git a/utils/pub/oauth2.dart b/utils/pub/oauth2.dart
new file mode 100644
index 0000000..7cc5c85
--- /dev/null
+++ b/utils/pub/oauth2.dart
@@ -0,0 +1,182 @@
+// Copyright (c) 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 oauth2;
+
+import 'dart:io';
+import 'dart:uri';
+
+// TODO(nweiz): Make this a "package:" URL, or something nicer than this.
+import '../../pkg/oauth2/lib/oauth2.dart';
+import 'io.dart';
+import 'system_cache.dart';
+import 'utils.dart';
+
+export '../../pkg/oauth2/lib/oauth2.dart';
+
+/// The pub client's OAuth2 identifier.
+final _identifier = '818368855108-8grd2eg9tj9f38os6f1urbcvsq399u8n.apps.'
+    'googleusercontent.com';
+
+/// The pub client's OAuth2 secret. This isn't actually meant to be kept a
+/// secret.
+final _secret = 'SWeqj8seoJW0w7_CpEPFLX0K';
+
+/// The URL to which the user will be directed to authorize the pub client to
+/// get an OAuth2 access token.
+///
+/// `access_type=offline` and `approval_prompt=force` ensures that we always get
+/// a refresh token from the server. See the [Google OAuth2 documentation][].
+///
+/// [Google OAuth2 documentation]: https://developers.google.com/accounts/docs/OAuth2WebServer#offline
+final _authorizationEndpoint = new Uri.fromString(
+    'https://accounts.google.com/o/oauth2/auth?access_type=offline'
+    '&approval_prompt=force');
+
+/// The URL from which the pub client will request an access token once it's
+/// been authorized by the user.
+final _tokenEndpoint = new Uri.fromString(
+    'https://accounts.google.com/o/oauth2/token');
+
+/// The OAuth2 scopes that the pub client needs. Currently the client only needs
+/// the user's email so that the server can verify their identity.
+final _scopes = ['https://www.googleapis.com/auth/userinfo.email'];
+
+/// An in-memory cache of the user's OAuth2 credentials. This should always be
+/// the same as the credentials file stored in the system cache.
+Credentials _credentials;
+
+/// Asynchronously passes an OAuth2 [Client] to [fn], and closes the client when
+/// the [Future] returned by [fn] completes.
+///
+/// This takes care of loading and saving the client's credentials, as well as
+/// prompting the user for their authorization.
+Future withClient(SystemCache cache, Future fn(Client client)) {
+  return _getClient(cache).chain((client) {
+    var completer = new Completer();
+    var future = fn(client);
+    future.onComplete((_) {
+      try {
+        client.close();
+        // Be sure to save the credentials even when an error happens. Also be
+        // sure to pipe the exception from `future` to `completer`.
+        chainToCompleter(
+            _saveCredentials(cache, client.credentials).chain((_) => future),
+            completer);
+      } catch (e, stackTrace) {
+        // onComplete will drop exceptions on the floor. We want to ensure that
+        // any programming errors here don't go un-noticed. See issue 4127.
+        completer.completeException(e, stackTrace);
+      }
+    });
+    return completer.future;
+  });
+}
+
+/// Gets a new OAuth2 client. If saved credentials are available, those are
+/// used; otherwise, the user is prompted to authorize the pub client.
+Future<Client> _getClient(SystemCache cache) {
+  return _loadCredentials(cache).chain((credentials) {
+    if (credentials == null) return _authorize();
+    return new Future.immediate(new Client(
+        _identifier, _secret, credentials, httpClient: curlClient));
+  }).chain((client) {
+    return _saveCredentials(cache, client.credentials).transform((_) => client);
+  });
+}
+
+/// Loads the user's OAuth2 credentials from the in-memory cache or the
+/// filesystem if possible. If the credentials can't be loaded for any reason,
+/// the returned [Future] will complete to null.
+Future<Credentials> _loadCredentials(SystemCache cache) {
+  if (_credentials != null) return new Future.immediate(_credentials);
+  return fileExists(_credentialsFile(cache)).chain((credentialsExist) {
+    if (!credentialsExist) return new Future.immediate(null);
+
+    return readTextFile(_credentialsFile(cache)).transform((credentialsJson) {
+      var credentials = new Credentials.fromJson(credentialsJson);
+      if (credentials.isExpired && !credentials.canRefresh) {
+        printError("Pub's authorization to upload packages has expired and "
+            "can't be automatically refreshed.");
+        return null; // null means re-authorize
+      }
+
+      return credentials;
+    });
+  }).transformException((e) {
+    printError('Warning: could not load the saved OAuth2 credentials:'
+        '  $e\n'
+        'Obtaining new credentials...');
+    return null; // null means re-authorize
+  });
+}
+
+/// Save the user's OAuth2 credentials to the in-memory cache and the
+/// filesystem.
+Future _saveCredentials(SystemCache cache, Credentials credentials) {
+  _credentials = credentials;
+  var credentialsFile = _credentialsFile(cache);
+  return ensureDir(dirname(credentialsFile)).chain((_) =>
+      writeTextFile(credentialsFile, credentials.toJson()));
+}
+
+/// The path to the file in which the user's OAuth2 credentials are stored.
+String _credentialsFile(SystemCache cache) =>
+  join(cache.rootDir, 'credentials.json');
+
+/// Gets the user to authorize pub as a client of pub.dartlang.org via oauth2.
+/// Returns a Future that will complete to a fully-authorized [Client].
+Future<Client> _authorize() {
+  // Allow the tests to inject their own token endpoint URL.
+  var tokenEndpoint = Platform.environment['_PUB_TEST_TOKEN_ENDPOINT'];
+  if (tokenEndpoint != null) {
+    tokenEndpoint = new Uri.fromString(tokenEndpoint);
+  } else {
+    tokenEndpoint = _tokenEndpoint;
+  }
+
+  var grant = new AuthorizationCodeGrant(
+      _identifier,
+      _secret,
+      _authorizationEndpoint,
+      tokenEndpoint,
+      httpClient: curlClient);
+
+  // Spin up a one-shot HTTP server to receive the authorization code from the
+  // Google OAuth2 server via redirect. This server will close itself as soon as
+  // the code is received.
+  var completer = new Completer();
+  var server = new HttpServer();
+  server.addRequestHandler((request) => request.path == "/",
+      (request, response) {
+    chainToCompleter(new Future.immediate(null).chain((_) {
+      print('Authorization received, processing...');
+      var queryString = request.queryString;
+      if (queryString == null) queryString = '';
+      response.statusCode = 302;
+      response.headers.set('location', 'http://pub.dartlang.org/authorized');
+      return Futures.wait([
+        closeHttpResponse(request, response),
+        grant.handleAuthorizationResponse(queryToMap(queryString))
+      ]);
+    }).transform((results) {
+      server.close();
+      return results[1];
+    }), completer);
+  });
+  server.listen('127.0.0.1', 0);
+
+  var authUrl = grant.getAuthorizationUrl(
+      new Uri.fromString('http://localhost:${server.port}'), scopes: _scopes);
+
+  print('Pub needs your authorization to upload packages on your behalf.\n'
+        'In a web browser, go to $authUrl\n'
+        'Then click "Allow access".\n\n'
+        'Waiting for your authorization...');
+
+  return completer.future.transform((client) {
+    print('Successfully authorized.\n');
+    return client;
+  });
+}
\ No newline at end of file
diff --git a/utils/pub/pub.dart b/utils/pub/pub.dart
index 4c2f77e..9bb12ee 100644
--- a/utils/pub/pub.dart
+++ b/utils/pub/pub.dart
@@ -13,6 +13,7 @@
 import 'io.dart';
 import 'command_help.dart';
 import 'command_install.dart';
+import 'command_lish.dart';
 import 'command_update.dart';
 import 'command_version.dart';
 import 'entrypoint.dart';
@@ -33,12 +34,21 @@
 /**
  * The commands that Pub understands.
  */
-Map<String, PubCommand> get pubCommands => {
-  'help': new HelpCommand(),
-  'install': new InstallCommand(),
-  'update': new UpdateCommand(),
-  'version': new VersionCommand()
-};
+Map<String, PubCommand> get pubCommands {
+  var commands = {
+    'help': new HelpCommand(),
+    'install': new InstallCommand(),
+    'publish': new LishCommand(),
+    'update': new UpdateCommand(),
+    'version': new VersionCommand()
+  };
+  for (var command in commands.values) {
+    for (var alias in command.aliases) {
+      commands[alias] = command;
+    }
+  }
+  return commands;
+}
 
 /**
  * The parser for arguments that are global to Pub rather than specific to a
@@ -124,6 +134,8 @@
   int length = 0;
   var names = <String>[];
   for (var command in pubCommands.keys) {
+    // Hide aliases.
+    if (pubCommands[command].aliases.indexOf(command) >= 0) continue;
     length = max(length, command.length);
     names.add(command);
   }
@@ -162,7 +174,11 @@
   /// Whether or not this command requires [entrypoint] to be defined. If false,
   /// Pub won't look for a pubspec and [entrypoint] will be null when the
   /// command runs.
-  bool get requiresEntrypoint => true;
+  final requiresEntrypoint = true;
+
+  /// Alternate names for this command. These names won't be used in the
+  /// documentation, but they will work when invoked on the command line.
+  final aliases = const <String>[];
 
   /**
    * Override this to define command-specific options. The results will be made
diff --git a/utils/pub/utils.dart b/utils/pub/utils.dart
index 4097885..d9932b8 100644
--- a/utils/pub/utils.dart
+++ b/utils/pub/utils.dart
@@ -9,6 +9,7 @@
 
 import 'dart:crypto';
 import 'dart:isolate';
+import 'dart:uri';
 
 /** A pair of values. */
 class Pair<E, F> {
@@ -122,11 +123,11 @@
   CryptoUtils.bytesToHex(new SHA1().update(source.charCodes).digest());
 
 /**
- * Returns a [Future] that completes in [milliSeconds].
+ * Returns a [Future] that completes in [milliseconds].
  */
-Future sleep(int milliSeconds) {
+Future sleep(int milliseconds) {
   var completer = new Completer();
-  new Timer(milliSeconds, completer.complete);
+  new Timer(milliseconds, completer.complete);
   return completer.future;
 }
 
@@ -134,12 +135,15 @@
 /// to [completer].
 void chainToCompleter(Future future, Completer completer) {
   future.handleException((e) {
-    completer.completeException(e);
+    completer.completeException(e, future.stackTrace);
     return true;
   });
   future.then(completer.complete);
 }
 
+// TODO(nweiz): unify the following functions with the utility functions in
+// pkg/http.
+
 /// Like [String.split], but only splits on the first occurrence of the pattern.
 /// This will always return an array of two elements or fewer.
 List<String> split1(String toSplit, String pattern) {
@@ -150,3 +154,49 @@
   return [toSplit.substring(0, index),
     toSplit.substring(index + pattern.length)];
 }
+
+/// Adds additional query parameters to [url], overwriting the original
+/// parameters if a name conflict occurs.
+Uri addQueryParameters(Uri url, Map<String, String> parameters) {
+  var queryMap = queryToMap(url.query);
+  mapAddAll(queryMap, parameters);
+  return url.resolve("?${mapToQuery(queryMap)}");
+}
+
+/// Convert a URL query string (or `application/x-www-form-urlencoded` body)
+/// into a [Map] from parameter names to values.
+Map<String, String> queryToMap(String queryList) {
+  var map = <String>{};
+  for (var pair in queryList.split("&")) {
+    var split = split1(pair, "=");
+    if (split.isEmpty) continue;
+    var key = urlDecode(split[0]);
+    var value = split.length > 1 ? urlDecode(split[1]) : "";
+    map[key] = value;
+  }
+  return map;
+}
+
+/// Convert a [Map] from parameter names to values to a URL query string.
+String mapToQuery(Map<String, String> map) {
+  var pairs = <List<String>>[];
+  map.forEach((key, value) {
+    key = encodeUriComponent(key);
+    value = (value == null || value.isEmpty) ? null : encodeUriComponent(value);
+    pairs.add([key, value]);
+  });
+  return Strings.join(pairs.map((pair) {
+    if (pair[1] == null) return pair[0];
+    return "${pair[0]}=${pair[1]}";
+  }), "&");
+}
+
+/// Add all key/value pairs from [source] to [destination], overwriting any
+/// pre-existing values.
+void mapAddAll(Map destination, Map source) =>
+  source.forEach((key, value) => destination[key] = value);
+
+/// Decodes a URL-encoded string. Unlike [decodeUriComponent], this includes
+/// replacing `+` with ` `.
+String urlDecode(String encoded) =>
+  decodeUriComponent(encoded.replaceAll("+", " "));
diff --git a/utils/pub/version.dart b/utils/pub/version.dart
index b6e8e8f..50174cc 100644
--- a/utils/pub/version.dart
+++ b/utils/pub/version.dart
@@ -197,11 +197,11 @@
  * version that is "2.0.0" or greater. Version objects themselves implement
  * this to match a specific version.
  */
-interface VersionConstraint default _VersionConstraintFactory {
+abstract class VersionConstraint {
   /**
    * A [VersionConstraint] that allows no versions: i.e. the empty set.
    */
-  VersionConstraint.empty();
+  factory VersionConstraint.empty() => const _EmptyVersion();
 
   /**
    * Parses a version constraint. This string is a space-separated series of
@@ -218,7 +218,19 @@
    *     <=5.1.4
    *     >2.0.4 <=2.4.6
    */
-  VersionConstraint.parse(String text);
+  factory VersionConstraint.parse(String text) {
+    if (text.trim() == '') {
+      throw new FormatException('Cannot parse an empty string.');
+    }
+
+    // Split it into space-separated parts.
+    var constraints = <VersionConstraint>[];
+    for (var part in text.split(' ')) {
+      constraints.add(_parseSingleConstraint(part));
+    }
+
+    return new VersionConstraint.intersection(constraints);
+  }
 
   /**
    * Creates a new version constraint that is the intersection of [constraints].
@@ -226,7 +238,14 @@
    * constraints is empty, then it returns a VersionConstraint that allows all
    * versions.
    */
-  VersionConstraint.intersect(Collection<VersionConstraint> constraints);
+  factory VersionConstraint.intersection(
+      Collection<VersionConstraint> constraints) {
+    var constraint = new VersionRange();
+    for (var other in constraints) {
+      constraint = constraint.intersect(other);
+    }
+    return constraint;
+  }
 
   /**
    * Returns `true` if this constraint allows no versions.
@@ -243,6 +262,32 @@
    * both this and [other].
    */
   VersionConstraint intersect(VersionConstraint other);
+
+  static VersionConstraint _parseSingleConstraint(String text) {
+    if (text == 'any') {
+      return new VersionRange();
+    }
+
+    // TODO(rnystrom): Consider other syntaxes for version constraints. This
+    // one is whitespace sensitive (you can't do "< 1.2.3") and "<" is
+    // unfortunately meaningful in YAML, requiring it to be quoted in a
+    // pubspec.
+    // See if it's a comparison operator followed by a version, like ">1.2.3".
+    var match = new RegExp(r"^([<>]=?)?(.*)$").firstMatch(text);
+    if (match != null) {
+      var comparison = match[1];
+      var version = new Version.parse(match[2]);
+      switch (match[1]) {
+        case '<=': return new VersionRange(max: version, includeMax: true);
+        case '<': return new VersionRange(max: version, includeMax: false);
+        case '>=': return new VersionRange(min: version, includeMin: true);
+        case '>': return new VersionRange(min: version, includeMin: false);
+      }
+    }
+
+    // Otherwise, it must be an explicit version.
+    return new Version.parse(text);
+  }
 }
 
 /**
@@ -374,56 +419,3 @@
   VersionConstraint intersect(VersionConstraint other) => this;
   String toString() => '<empty>';
 }
-
-class _VersionConstraintFactory {
-  factory VersionConstraint.empty() => const _EmptyVersion();
-
-  factory VersionConstraint.parse(String text) {
-    if (text.trim() == '') {
-      throw new FormatException('Cannot parse an empty string.');
-    }
-
-    // Split it into space-separated parts.
-    var constraints = <VersionConstraint>[];
-    for (var part in text.split(' ')) {
-      constraints.add(parseSingleConstraint(part));
-    }
-
-    return new VersionConstraint.intersect(constraints);
-  }
-
-  factory VersionConstraint.intersect(
-      Collection<VersionConstraint> constraints) {
-    var constraint = new VersionRange();
-    for (var other in constraints) {
-      constraint = constraint.intersect(other);
-    }
-    return constraint;
-  }
-
-  static VersionConstraint parseSingleConstraint(String text) {
-    if (text == 'any') {
-      return new VersionRange();
-    }
-
-    // TODO(rnystrom): Consider other syntaxes for version constraints. This
-    // one is whitespace sensitive (you can't do "< 1.2.3") and "<" is
-    // unfortunately meaningful in YAML, requiring it to be quoted in a
-    // pubspec.
-    // See if it's a comparison operator followed by a version, like ">1.2.3".
-    var match = new RegExp(r"^([<>]=?)?(.*)$").firstMatch(text);
-    if (match != null) {
-      var comparison = match[1];
-      var version = new Version.parse(match[2]);
-      switch (match[1]) {
-        case '<=': return new VersionRange(max: version, includeMax: true);
-        case '<': return new VersionRange(max: version, includeMax: false);
-        case '>=': return new VersionRange(min: version, includeMin: true);
-        case '>': return new VersionRange(min: version, includeMin: false);
-      }
-    }
-
-    // Otherwise, it must be an explicit version.
-    return new Version.parse(text);
-  }
-}
diff --git a/utils/pub/version_solver.dart b/utils/pub/version_solver.dart
index 0b1a46b..e0cf2be 100644
--- a/utils/pub/version_solver.dart
+++ b/utils/pub/version_solver.dart
@@ -557,7 +557,7 @@
    */
   VersionConstraint get constraint {
     if (_refs.isEmpty) return null;
-    return new VersionConstraint.intersect(
+    return new VersionConstraint.intersection(
         _refs.values.map((ref) => ref.constraint));
   }
 
diff --git a/utils/pub/yaml/model.dart b/utils/pub/yaml/model.dart
index f709536..2ba1416 100644
--- a/utils/pub/yaml/model.dart
+++ b/utils/pub/yaml/model.dart
@@ -50,7 +50,7 @@
 }
 
 /** The abstract class for YAML nodes. */
-class _Node {
+abstract class _Node {
   /** Every YAML node has a tag that describes its type. */
   _Tag tag;
 
@@ -66,7 +66,7 @@
 
   int get hashCode => _hashCode([tag, anchor]);
 
-  abstract visit(_Visitor v);
+  visit(_Visitor v);
 }
 
 /** A sequence node represents an ordered list of nodes. */
diff --git a/utils/tests/pub/oauth2_test.dart b/utils/tests/pub/oauth2_test.dart
new file mode 100644
index 0000000..e739a96
--- /dev/null
+++ b/utils/tests/pub/oauth2_test.dart
@@ -0,0 +1,185 @@
+// Copyright (c) 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 oauth2_test;
+
+import 'dart:io';
+import 'dart:json';
+import 'dart:uri';
+
+import 'test_pub.dart';
+import '../../../pkg/http/lib/http.dart' as http;
+import '../../../pkg/unittest/lib/unittest.dart';
+import '../../pub/io.dart';
+import '../../pub/utils.dart';
+
+main() {
+  setUp(() => dir(appPath, [libPubspec("test_pkg", "1.0.0")]).scheduleCreate());
+
+  test('with no credentials.json, authenticates and saves credentials.json',
+      () {
+    var server = new ScheduledServer();
+    var pub = startPubLish(server);
+    authorizePub(pub, server);
+
+    server.handle('GET', '/packages/versions/new.json', (request, response) {
+      expect(request.headers.value('authorization'),
+          equals('Bearer access token'));
+
+      return closeHttpResponse(request, response);
+    });
+
+    pub.kill();
+
+    credentialsFile(server, 'access token').scheduleValidate();
+
+    run();
+  });
+
+  test('with a pre-existing credentials.json does not authenticate', () {
+    var server = new ScheduledServer();
+    credentialsFile(server, 'access token').scheduleCreate();
+    var pub = startPubLish(server);
+
+    server.handle('GET', '/packages/versions/new.json', (request, response) {
+      expect(request.headers.value('authorization'),
+          equals('Bearer access token'));
+
+      return closeHttpResponse(request, response);
+    });
+
+    pub.kill();
+
+    run();
+  });
+
+  test('with an expired credentials.json, refreshes and saves the refreshed '
+      'access token to credentials.json', () {
+    var server = new ScheduledServer();
+    credentialsFile(server, 'access token',
+        refreshToken: 'refresh token',
+        expiration: new Date.now().subtract(new Duration(hours: 1)))
+        .scheduleCreate();
+
+    var pub = startPubLish(server);
+
+    server.handle('POST', '/token', (request, response) {
+      return consumeInputStream(request.inputStream).transform((bytes) {
+        var body = new String.fromCharCodes(bytes);
+        expect(body, matches(
+            new RegExp(r'(^|&)refresh_token=refresh%20token(&|$)')));
+
+        response.headers.contentType = new ContentType("application", "json");
+        response.outputStream.writeString(JSON.stringify({
+          "access_token": "new access token",
+          "token_type": "bearer"
+        }));
+        response.outputStream.close();
+      });
+    });
+
+    server.handle('GET', '/packages/versions/new.json', (request, response) {
+      expect(request.headers.value('authorization'),
+          equals('Bearer new access token'));
+
+      return closeHttpResponse(request, response);
+    });
+
+    pub.shouldExit();
+
+    credentialsFile(server, 'new access token', refreshToken: 'refresh token')
+        .scheduleValidate();
+
+    run();
+  });
+
+  test('with an expired credentials.json without a refresh token, '
+       'authenticates again and saves credentials.json', () {
+    var server = new ScheduledServer();
+    credentialsFile(server, 'access token',
+        expiration: new Date.now().subtract(new Duration(hours: 1)))
+        .scheduleCreate();
+
+    var pub = startPubLish(server);
+
+    expectLater(pub.nextErrLine(), equals("Pub's authorization to upload "
+          "packages has expired and can't be automatically refreshed."));
+    authorizePub(pub, server, "new access token");
+
+    server.handle('GET', '/packages/versions/new.json', (request, response) {
+      expect(request.headers.value('authorization'),
+          equals('Bearer new access token'));
+
+      return closeHttpResponse(request, response);
+    });
+
+    pub.kill();
+
+    credentialsFile(server, 'new access token').scheduleValidate();
+
+    run();
+  });
+
+  test('with a malformed credentials.json, authenticates again and saves '
+      'credentials.json', () {
+    var server = new ScheduledServer();
+    dir(cachePath, [
+      file('credentials.json', '{bad json')
+    ]).scheduleCreate();
+
+    var pub = startPubLish(server);
+    authorizePub(pub, server, "new access token");
+
+    server.handle('GET', '/packages/versions/new.json', (request, response) {
+      expect(request.headers.value('authorization'),
+          equals('Bearer new access token'));
+
+      return closeHttpResponse(request, response);
+    });
+
+    pub.kill();
+
+    credentialsFile(server, 'new access token').scheduleValidate();
+
+    run();
+  });
+}
+
+void authorizePub(ScheduledProcess pub, ScheduledServer server,
+    [String accessToken="access token"]) {
+  expectLater(pub.nextLine(), equals('Pub needs your '
+     'authorization to upload packages on your behalf.'));
+
+  expectLater(pub.nextLine().chain((line) {
+    var match = new RegExp(r'[?&]redirect_uri=([0-9a-zA-Z%+-]+)[$&]')
+        .firstMatch(line);
+    expect(match, isNotNull);
+
+    var redirectUrl = new Uri.fromString(decodeUriComponent(match.group(1)));
+    redirectUrl = addQueryParameters(redirectUrl, {'code': 'access code'});
+    return (new http.Request('GET', redirectUrl)..followRedirects = false)
+      .send();
+  }).transform((response) {
+    expect(response.headers['location'],
+        equals(['http://pub.dartlang.org/authorized']));
+  }), anything);
+
+  handleAccessTokenRequest(server, accessToken);
+}
+
+void handleAccessTokenRequest(ScheduledServer server, String accessToken) {
+  server.handle('POST', '/token', (request, response) {
+    return consumeInputStream(request.inputStream).transform((bytes) {
+      var body = new String.fromCharCodes(bytes);
+      expect(body, matches(new RegExp(r'(^|&)code=access%20code(&|$)')));
+
+      response.headers.contentType = new ContentType("application", "json");
+      response.outputStream.writeString(JSON.stringify({
+        "access_token": accessToken,
+        "token_type": "bearer"
+      }));
+      response.outputStream.close();
+    });
+  });
+}
diff --git a/utils/tests/pub/pub.status b/utils/tests/pub/pub.status
index 03af2a0..5197714 100644
--- a/utils/tests/pub/pub.status
+++ b/utils/tests/pub/pub.status
@@ -10,8 +10,11 @@
 [ $runtime == drt || $runtime == dartium || $runtime == opera]
 *: Skip
 
-# Git on Windows is embarrassingly slow.
-# TODO(rnystrom): Get them fast enough to reliably not time out (#5271).
+# TODO(nweiz): Figure out why this is failing.
 [ $system == windows ]
-install/git/*: Slow, Pass, Timeout
-update/git/*: Slow, Pass, Timeout
+pub_lish_test: Fail
+
+# TODO(nweiz): The "pub lish" and oauth2 tests often fail mysteriously on
+# Windows. See issues 7015 and 7016.
+oauth2_test: Skip
+curl_client_test: Skip
diff --git a/utils/tests/pub/pub_lish_test.dart b/utils/tests/pub/pub_lish_test.dart
new file mode 100644
index 0000000..aa67161
--- /dev/null
+++ b/utils/tests/pub/pub_lish_test.dart
@@ -0,0 +1,326 @@
+// Copyright (c) 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 pub_lish_test;
+
+import 'dart:io';
+import 'dart:json';
+
+import 'test_pub.dart';
+import '../../../pkg/unittest/lib/unittest.dart';
+import '../../pub/io.dart';
+
+void handleUploadForm(ScheduledServer server, [Map body]) {
+  server.handle('GET', '/packages/versions/new.json', (request, response) {
+    return server.url.chain((url) {
+      expect(request.headers.value('authorization'),
+          equals('Bearer access token'));
+
+      if (body == null) {
+        body = {
+          'url': url.resolve('/upload').toString(),
+          'fields': {
+            'field1': 'value1',
+            'field2': 'value2'
+          }
+        };
+      }
+
+      response.headers.contentType = new ContentType("application", "json");
+      response.outputStream.writeString(JSON.stringify(body));
+      return closeHttpResponse(request, response);
+    });
+  });
+}
+
+void handleUpload(ScheduledServer server) {
+  server.handle('POST', '/upload', (request, response) {
+    // TODO(nweiz): Once a multipart/form-data parser in Dart exists, validate
+    // that the request body is correctly formatted. See issue 6952.
+    return server.url.chain((url) {
+      response.statusCode = 302;
+      response.headers.set('location', url.resolve('/create').toString());
+      return closeHttpResponse(request, response);
+    });
+  });
+}
+
+main() {
+  setUp(() => dir(appPath, [libPubspec("test_pkg", "1.0.0")]).scheduleCreate());
+
+  test('archives and uploads a package', () {
+    var server = new ScheduledServer();
+    credentialsFile(server, 'access token').scheduleCreate();
+    var pub = startPubLish(server);
+    handleUploadForm(server);
+    handleUpload(server);
+
+    server.handle('GET', '/create', (request, response) {
+      response.outputStream.writeString(JSON.stringify({
+        'success': {'message': 'Package test_pkg 1.0.0 uploaded!'}
+      }));
+      return closeHttpResponse(request, response);
+    });
+
+    expectLater(pub.nextLine(), equals('Package test_pkg 1.0.0 uploaded!'));
+    pub.shouldExit(0);
+
+    run();
+  });
+
+  // TODO(nweiz): Once a multipart/form-data parser in Dart exists, we should
+  // test that "pub lish" chooses the correct files to publish.
+
+  // TODO(nweiz): Once issue 6813 is fixed, test that OAuth2 authentication
+  // errors cause the client to try re-authenticating.
+
+  test('upload form provides an error', () {
+    var server = new ScheduledServer();
+    credentialsFile(server, 'access token').scheduleCreate();
+    var pub = startPubLish(server);
+
+    server.handle('GET', '/packages/versions/new.json', (request, response) {
+      response.statusCode = 400;
+      response.outputStream.writeString(JSON.stringify({
+        'error': {'message': 'your request sucked'}
+      }));
+      return closeHttpResponse(request, response);
+    });
+
+    expectLater(pub.nextErrLine(), equals('your request sucked'));
+    pub.shouldExit(1);
+
+    run();
+  });
+
+  test('upload form provides invalid JSON', () {
+    var server = new ScheduledServer();
+    credentialsFile(server, 'access token').scheduleCreate();
+    var pub = startPubLish(server);
+
+    server.handle('GET', '/packages/versions/new.json', (request, response) {
+      response.outputStream.writeString('{not json');
+      return closeHttpResponse(request, response);
+    });
+
+    expectLater(pub.nextErrLine(), equals('Invalid server response:'));
+    expectLater(pub.nextErrLine(), equals('{not json'));
+    pub.shouldExit(1);
+
+    run();
+  });
+
+  test('upload form is missing url', () {
+    var server = new ScheduledServer();
+    credentialsFile(server, 'access token').scheduleCreate();
+    var pub = startPubLish(server);
+
+    var body = {
+      'fields': {
+        'field1': 'value1',
+        'field2': 'value2'
+      }
+    };
+
+    handleUploadForm(server, body);
+    expectLater(pub.nextErrLine(), equals('Invalid server response:'));
+    expectLater(pub.nextErrLine(), equals(JSON.stringify(body)));
+    pub.shouldExit(1);
+
+    run();
+  });
+
+  test('upload form url is not a string', () {
+    var server = new ScheduledServer();
+    credentialsFile(server, 'access token').scheduleCreate();
+    var pub = startPubLish(server);
+
+    var body = {
+      'url': 12,
+      'fields': {
+        'field1': 'value1',
+        'field2': 'value2'
+      }
+    };
+
+    handleUploadForm(server, body);
+    expectLater(pub.nextErrLine(), equals('Invalid server response:'));
+    expectLater(pub.nextErrLine(), equals(JSON.stringify(body)));
+    pub.shouldExit(1);
+
+    run();
+  });
+
+  test('upload form is missing fields', () {
+    var server = new ScheduledServer();
+    credentialsFile(server, 'access token').scheduleCreate();
+    var pub = startPubLish(server);
+
+    var body = {'url': 'http://example.com/upload'};
+    handleUploadForm(server, body);
+    expectLater(pub.nextErrLine(), equals('Invalid server response:'));
+    expectLater(pub.nextErrLine(), equals(JSON.stringify(body)));
+    pub.shouldExit(1);
+
+    run();
+  });
+
+  test('upload form fields is not a map', () {
+    var server = new ScheduledServer();
+    credentialsFile(server, 'access token').scheduleCreate();
+    var pub = startPubLish(server);
+
+    var body = {'url': 'http://example.com/upload', 'fields': 12};
+    handleUploadForm(server, body);
+    expectLater(pub.nextErrLine(), equals('Invalid server response:'));
+    expectLater(pub.nextErrLine(), equals(JSON.stringify(body)));
+    pub.shouldExit(1);
+
+    run();
+  });
+
+  test('upload form fields has a non-string value', () {
+    var server = new ScheduledServer();
+    credentialsFile(server, 'access token').scheduleCreate();
+    var pub = startPubLish(server);
+
+    var body = {
+      'url': 'http://example.com/upload',
+      'fields': {'field': 12}
+    };
+    handleUploadForm(server, body);
+    expectLater(pub.nextErrLine(), equals('Invalid server response:'));
+    expectLater(pub.nextErrLine(), equals(JSON.stringify(body)));
+    pub.shouldExit(1);
+
+    run();
+  });
+
+  test('cloud storage upload provides an error', () {
+    var server = new ScheduledServer();
+    credentialsFile(server, 'access token').scheduleCreate();
+    var pub = startPubLish(server);
+    handleUploadForm(server);
+
+    server.handle('POST', '/upload', (request, response) {
+      // TODO(rnystrom): HTTP requires that you don't start sending a response
+      // until the request has been completely sent, but dart:io doesn't
+      // ensure that (#7044). Workaround it by manually consuming the entire
+      // input stream before we start responding. If we don't do this, curl
+      // will choke on this on Mac and Windows.
+      return consumeInputStream(request.inputStream).transform((_) {
+        response.statusCode = 400;
+        response.headers.contentType = new ContentType('application', 'xml');
+        response.outputStream.writeString('<Error><Message>Your request sucked.'
+        '</Message></Error>');
+        response.outputStream.close();
+      });
+    });
+
+    // TODO(nweiz): This should use the server's error message once the client
+    // can parse the XML.
+    expectLater(pub.nextErrLine(), equals('Failed to upload the package.'));
+    pub.shouldExit(1);
+
+    run();
+  });
+
+  test("cloud storage upload doesn't redirect", () {
+    var server = new ScheduledServer();
+    credentialsFile(server, 'access token').scheduleCreate();
+    var pub = startPubLish(server);
+    handleUploadForm(server);
+
+    server.handle('POST', '/upload', (request, response) {
+      // don't set the location header
+      return closeHttpResponse(request, response);
+    });
+
+    expectLater(pub.nextErrLine(), equals('Failed to upload the package.'));
+    pub.shouldExit(1);
+
+    run();
+  });
+
+  test('package creation provides an error', () {
+    var server = new ScheduledServer();
+    credentialsFile(server, 'access token').scheduleCreate();
+    var pub = startPubLish(server);
+    handleUploadForm(server);
+    handleUpload(server);
+
+    server.handle('GET', '/create', (request, response) {
+      response.statusCode = 400;
+      response.outputStream.writeString(JSON.stringify({
+        'error': {'message': 'Your package was too boring.'}
+      }));
+      return closeHttpResponse(request, response);
+    });
+
+    expectLater(pub.nextErrLine(), equals('Your package was too boring.'));
+    pub.shouldExit(1);
+
+    run();
+  });
+
+  test('package creation provides invalid JSON', () {
+    var server = new ScheduledServer();
+    credentialsFile(server, 'access token').scheduleCreate();
+    var pub = startPubLish(server);
+    handleUploadForm(server);
+    handleUpload(server);
+
+    server.handle('GET', '/create', (request, response) {
+      response.outputStream.writeString('{not json');
+      return closeHttpResponse(request, response);
+    });
+
+    expectLater(pub.nextErrLine(), equals('Invalid server response:'));
+    expectLater(pub.nextErrLine(), equals('{not json'));
+    pub.shouldExit(1);
+
+    run();
+  });
+
+  test('package creation provides a malformed error', () {
+    var server = new ScheduledServer();
+    credentialsFile(server, 'access token').scheduleCreate();
+    var pub = startPubLish(server);
+    handleUploadForm(server);
+    handleUpload(server);
+
+    var body = {'error': 'Your package was too boring.'};
+    server.handle('GET', '/create', (request, response) {
+      response.statusCode = 400;
+      response.outputStream.writeString(JSON.stringify(body));
+      return closeHttpResponse(request, response);
+    });
+
+    expectLater(pub.nextErrLine(), equals('Invalid server response:'));
+    expectLater(pub.nextErrLine(), equals(JSON.stringify(body)));
+    pub.shouldExit(1);
+
+    run();
+  });
+
+  test('package creation provides a malformed success', () {
+    var server = new ScheduledServer();
+    credentialsFile(server, 'access token').scheduleCreate();
+    var pub = startPubLish(server);
+    handleUploadForm(server);
+    handleUpload(server);
+
+    var body = {'success': 'Your package was awesome.'};
+    server.handle('GET', '/create', (request, response) {
+      response.outputStream.writeString(JSON.stringify(body));
+      return closeHttpResponse(request, response);
+    });
+
+    expectLater(pub.nextErrLine(), equals('Invalid server response:'));
+    expectLater(pub.nextErrLine(), equals(JSON.stringify(body)));
+    pub.shouldExit(1);
+
+    run();
+  });
+}
diff --git a/utils/tests/pub/pub_test.dart b/utils/tests/pub/pub_test.dart
index bc18d9d..aa5454a 100644
--- a/utils/tests/pub/pub_test.dart
+++ b/utils/tests/pub/pub_test.dart
@@ -22,6 +22,7 @@
     Available commands:
       help      display help information for Pub
       install   install the current package's dependencies
+      publish   publish the current package to pub.dartlang.org
       update    update the current package's dependencies to the latest versions
       version   print Pub version
 
diff --git a/utils/tests/pub/test_pub.dart b/utils/tests/pub/test_pub.dart
index 3b6a612..ef6cd7f 100644
--- a/utils/tests/pub/test_pub.dart
+++ b/utils/tests/pub/test_pub.dart
@@ -16,6 +16,7 @@
 import 'dart:math';
 import 'dart:uri';
 
+import '../../../pkg/oauth2/lib/oauth2.dart' as oauth2;
 import '../../../pkg/unittest/lib/unittest.dart';
 import '../../lib/file_system.dart' as fs;
 import '../../pub/git_source.dart';
@@ -104,7 +105,7 @@
         } catch (e) {
           response.statusCode = 404;
           response.contentLength = 0;
-          response.outputStream.close();
+          closeHttpResponse(request, response);
           return;
         }
 
@@ -113,14 +114,14 @@
           response.statusCode = 200;
           response.contentLength = data.length;
           response.outputStream.write(data);
-          response.outputStream.close();
+          closeHttpResponse(request, response);
         });
 
         future.handleException((e) {
           print("Exception while handling ${request.uri}: $e");
           response.statusCode = 500;
           response.reasonPhrase = e.message;
-          response.outputStream.close();
+          closeHttpResponse(request, response);
         });
       };
       _server.listen("127.0.0.1", 0);
@@ -364,6 +365,26 @@
   ]);
 }
 
+/// Describes the file in the system cache that contains the client's OAuth2
+/// credentials. The URL "/token" on [server] will be used as the token
+/// endpoint for refreshing the access token.
+Descriptor credentialsFile(
+    ScheduledServer server,
+    String accessToken,
+    {String refreshToken,
+     Date expiration}) {
+  return async(server.url.transform((url) {
+    return dir(cachePath, [
+      file('credentials.json', new oauth2.Credentials(
+          accessToken,
+          refreshToken,
+          url.resolve('/token'),
+          ['https://www.googleapis.com/auth/userinfo.email'],
+          expiration).toJson())
+    ]);
+  }));
+}
+
 /**
  * Describes the application directory, containing only a pubspec specifying the
  * given [dependencies].
@@ -460,6 +481,10 @@
  */
 List<_ScheduledEvent> _scheduledCleanup;
 
+/// The list of events that are scheduled to run after the test case only if it
+/// failed.
+List<_ScheduledEvent> _scheduledOnException;
+
 /**
  * Set to true when the current batch of scheduled events should be aborted.
  */
@@ -477,6 +502,8 @@
   Future cleanup() {
     return _runScheduled(createdSandboxDir, _scheduledCleanup).chain((_) {
       _scheduled = null;
+      _scheduledCleanup = null;
+      _scheduledOnException = null;
       if (createdSandboxDir != null) return deleteDir(createdSandboxDir);
       return new Future.immediate(null);
     });
@@ -491,7 +518,15 @@
     // If an error occurs during testing, delete the sandbox, throw the error so
     // that the test framework sees it, then finally call asyncDone so that the
     // test framework knows we're done doing asynchronous stuff.
-    cleanup().then((_) => registerException(error, future.stackTrace));
+    var future = _runScheduled(createdSandboxDir, _scheduledOnException)
+        .chain((_) => cleanup());
+    future.handleException((e) {
+      print("Exception while cleaning up: $e");
+      print(future.stackTrace);
+      registerException(error, future.stackTrace);
+      return true;
+    });
+    future.then((_) => registerException(error, future.stackTrace));
     return true;
   });
 
@@ -513,36 +548,10 @@
  * validates that its results match [output], [error], and [exitCode].
  */
 void schedulePub({List<String> args, Pattern output, Pattern error,
-    int exitCode: 0}) {
+    Future<Uri> tokenEndpoint, int exitCode: 0}) {
   _schedule((sandboxDir) {
-    String pathInSandbox(path) => join(getFullPath(sandboxDir), path);
-
-    return ensureDir(pathInSandbox(appPath)).chain((_) {
-      // Find a Dart executable we can use to spawn. Use the same one that was
-      // used to run this script itself.
-      var dartBin = new Options().executable;
-
-      // If the executable looks like a path, get its full path. That way we
-      // can still find it when we spawn it with a different working directory.
-      if (dartBin.contains(Platform.pathSeparator)) {
-        dartBin = new File(dartBin).fullPathSync();
-      }
-
-      // Find the main pub entrypoint.
-      var pubPath = fs.joinPaths(testDirectory, '../../pub/pub.dart');
-
-      var dartArgs =
-          ['--enable-type-checks', '--enable-asserts', pubPath, '--trace'];
-      dartArgs.addAll(args);
-
-      var environment = {
-        'PUB_CACHE': pathInSandbox(cachePath),
-        'DART_SDK': pathInSandbox(sdkPath)
-      };
-
-      return runProcess(dartBin, dartArgs, workingDir: pathInSandbox(appPath),
-          environment: environment);
-    }).transform((result) {
+    return _doPub(runProcess, sandboxDir, args, tokenEndpoint)
+        .transform((result) {
       var failures = [];
 
       _validateOutput(failures, 'stdout', output, result.stdout);
@@ -578,6 +587,66 @@
   run();
 }
 
+/// Starts a Pub process and returns a [ScheduledProcess] that supports
+/// interaction with that process.
+ScheduledProcess startPub({List<String> args}) {
+  var process = _scheduleValue((sandboxDir) =>
+      _doPub(startProcess, sandboxDir, args));
+  return new ScheduledProcess("pub", process);
+}
+
+/// Like [startPub], but runs `pub lish` in particular with [server] used both
+/// as the OAuth2 server (with "/token" as the token endpoint) and as the
+/// package server.
+ScheduledProcess startPubLish(ScheduledServer server, {List<String> args}) {
+  var process = _scheduleValue((sandboxDir) {
+    return server.url.chain((url) {
+      var tokenEndpoint = url.resolve('/token');
+      if (args == null) args = [];
+      args = flatten(['lish', '--server', url.toString(), args]);
+      return _doPub(startProcess, sandboxDir, args, tokenEndpoint);
+    });
+  });
+  return new ScheduledProcess("pub lish", process);
+}
+
+/// Calls [fn] with appropriately modified arguments to run a pub process. [fn]
+/// should have the same signature as [startProcess], except that the returned
+/// [Future] may have a type other than [Process].
+Future _doPub(Function fn, sandboxDir, List<String> args, Uri tokenEndpoint) {
+  String pathInSandbox(path) => join(getFullPath(sandboxDir), path);
+
+  return ensureDir(pathInSandbox(appPath)).chain((_) {
+    // Find a Dart executable we can use to spawn. Use the same one that was
+    // used to run this script itself.
+    var dartBin = new Options().executable;
+
+    // If the executable looks like a path, get its full path. That way we
+    // can still find it when we spawn it with a different working directory.
+    if (dartBin.contains(Platform.pathSeparator)) {
+      dartBin = new File(dartBin).fullPathSync();
+    }
+
+    // Find the main pub entrypoint.
+    var pubPath = fs.joinPaths(testDirectory, '../../pub/pub.dart');
+
+    var dartArgs =
+        ['--enable-type-checks', '--enable-asserts', pubPath, '--trace'];
+    dartArgs.addAll(args);
+
+    var environment = {
+      'PUB_CACHE': pathInSandbox(cachePath),
+      'DART_SDK': pathInSandbox(sdkPath)
+    };
+    if (tokenEndpoint != null) {
+      environment['_PUB_TEST_TOKEN_ENDPOINT'] = tokenEndpoint.toString();
+    }
+
+    return fn(dartBin, dartArgs, workingDir: pathInSandbox(appPath),
+        environment: environment);
+  });
+}
+
 /**
  * Skips the current test if Git is not installed. This validates that the
  * current test is running on a buildbot in which case we expect git to be
@@ -598,9 +667,7 @@
   });
 }
 
-Future<Directory> _setUpSandbox() {
-  return createTempDir();
-}
+Future<Directory> _setUpSandbox() => createTempDir();
 
 Future _runScheduled(Directory parentDir, List<_ScheduledEvent> scheduled) {
   if (scheduled == null) return new Future.immediate(null);
@@ -781,6 +848,14 @@
       });
     }
 
+    // TODO(nweiz): remove this when issue 4061 is fixed.
+    var stackTrace;
+    try {
+      throw "";
+    } catch (_, localStackTrace) {
+      stackTrace = localStackTrace;
+    }
+
     return listDir(dir).chain((files) {
       var matches = files.filter((file) => endsWithPattern(file, name));
       if (matches.length == 0) {
@@ -803,7 +878,8 @@
         for (var failure in failures) {
           error.add("  ").add(failure).add("\n");
         }
-        completer.completeException(new ExpectException(error.toString()));
+        completer.completeException(
+            new ExpectException(error.toString()), stackTrace);
       }
 
       for (var match in matches) {
@@ -1019,16 +1095,11 @@
    * to by [ref] at the current point in the scheduled test run.
    */
   Future<String> revParse(String ref) {
-    var completer = new Completer<String>();
-    _schedule((parentDir) {
+    return _scheduleValue((parentDir) {
       return super.create(parentDir).chain((rootDir) {
         return _runGit(['rev-parse', ref], rootDir);
-      }).transform((output) {
-        completer.complete(output[0]);
-        return null;
-      });
+      }).transform((output) => output[0]);
     });
-    return completer.future;
   }
 
   /// Schedule a Git command to run in this repository.
@@ -1090,41 +1161,17 @@
    * compresses them, and saves the result to [parentDir].
    */
   Future<File> create(parentDir) {
+    // TODO(rnystrom): Use withTempDir().
     var tempDir;
-    return parentDir.createTemp().chain((_tempDir) {
+    return createTempDir().chain((_tempDir) {
       tempDir = _tempDir;
       return Futures.wait(contents.map((child) => child.create(tempDir)));
-    }).chain((_) {
-      if (Platform.operatingSystem != "windows") {
-        var args = ["--directory", tempDir.path, "--create", "--gzip",
-            "--file", join(parentDir, _stringName)];
-        args.addAll(contents.map((child) => child.name));
-        return runProcess("tar", args);
-      } else {
-        // Create the tar file.
-        var tarFile = join(tempDir, _stringName.replaceAll("tar.gz", "tar"));
-        var args = ["a", tarFile];
-        args.addAll(contents.map(
-            (child) => '-i!"${join(tempDir, child.name)}"'));
-
-        // Find 7zip.
-        var command = fs.joinPaths(testDirectory,
-            '../../../third_party/7zip/7za.exe');
-
-        return runProcess(command, args).chain((_) {
-          // GZIP it. 7zip doesn't support doing both as a single operation.
-          args = ["a", join(parentDir, _stringName), tarFile];
-          return runProcess(command, args);
-        });
-      }
-    }).chain((result) {
-      if (!result.success) {
-        throw "Failed to create tar file $name.\n"
-            "STDERR: ${Strings.join(result.stderr, "\n")}";
-      }
-      return deleteDir(tempDir);
-    }).transform((_) {
-      return new File(join(parentDir, _stringName));
+    }).chain((createdContents) {
+      return consumeInputStream(createTarGz(createdContents, baseDir: tempDir));
+    }).chain((bytes) {
+      return new File(join(parentDir, _stringName)).writeAsBytes(bytes);
+    }).chain((file) {
+      return deleteDir(tempDir).transform((_) => file);
     });
   }
 
@@ -1150,15 +1197,16 @@
 
     var sinkStream = new ListInputStream();
     var tempDir;
+    // TODO(rnystrom): Use withTempDir() here.
     // TODO(nweiz): propagate any errors to the return value. See issue 3657.
     createTempDir().chain((_tempDir) {
       tempDir = _tempDir;
       return create(tempDir);
     }).then((tar) {
       var sourceStream = tar.openInputStream();
-      pipeInputToInput(sourceStream,
-                       sinkStream,
-                       () => tempDir.delete(recursive: true));
+      pipeInputToInput(sourceStream, sinkStream).then((_) {
+        tempDir.delete(recursive: true);
+      });
     });
     return sinkStream;
   }
@@ -1189,6 +1237,240 @@
   }
 }
 
+/// A class representing a [Process] that is scheduled to run in the course of
+/// the test. This class allows actions on the process to be scheduled
+/// synchronously. All operations on this class are scheduled.
+///
+/// Before running the test, either [shouldExit] or [kill] must be called on
+/// this to ensure that the process terminates when expected.
+///
+/// If the test fails, this will automatically print out any remaining stdout
+/// and stderr from the process to aid debugging.
+class ScheduledProcess {
+  /// The name of the process. Used for error reporting.
+  final String name;
+
+  /// The process that's scheduled to run.
+  final Future<Process> _process;
+
+  /// A [StringInputStream] wrapping the stdout of the process that's scheduled
+  /// to run.
+  final Future<StringInputStream> _stdout;
+
+  /// A [StringInputStream] wrapping the stderr of the process that's scheduled
+  /// to run.
+  final Future<StringInputStream> _stderr;
+
+  /// The exit code of the process that's scheduled to run. This will naturally
+  /// only complete once the process has terminated.
+  Future<int> get _exitCode => _exitCodeCompleter.future;
+
+  /// The completer for [_exitCode].
+  final Completer<int> _exitCodeCompleter = new Completer();
+
+  /// Whether the user has scheduled the end of this process by calling either
+  /// [shouldExit] or [kill].
+  bool _endScheduled = false;
+
+  /// Whether the process is expected to terminate at this point.
+  bool _endExpected = false;
+
+  /// Wraps a [Process] [Future] in a scheduled process.
+  ScheduledProcess(this.name, Future<Process> process)
+    : _process = process,
+      _stdout = process.transform((p) => new StringInputStream(p.stdout)),
+      _stderr = process.transform((p) => new StringInputStream(p.stderr)) {
+
+    _schedule((_) {
+      if (!_endScheduled) {
+        throw new StateError("Scheduled process $name must have shouldExit() "
+            "or kill() called before the test is run.");
+      }
+
+      return _process.transform((p) {
+        p.onExit = (c) {
+          if (_endExpected) {
+            _exitCodeCompleter.complete(c);
+            return;
+          }
+
+          // Sleep for half a second in case _endExpected is set in the next
+          // scheduled event.
+          sleep(500).then((_) {
+            if (_endExpected) {
+              _exitCodeCompleter.complete(c);
+              return;
+            }
+
+            _printStreams().then((_) {
+              registerException(new ExpectException("Process $name ended "
+                  "earlier than scheduled with exit code $c"));
+            });
+          });
+        };
+      });
+    });
+
+    _scheduleOnException((_) {
+      if (!_process.hasValue) return;
+
+      if (!_exitCode.hasValue) {
+        print("\nKilling process $name prematurely.");
+        _endExpected = true;
+        _process.value.kill();
+      }
+
+      return _printStreams();
+    });
+
+    _scheduleCleanup((_) {
+      if (!_process.hasValue) return;
+      // Ensure that the process is dead and we aren't waiting on any IO.
+      var process = _process.value;
+      process.kill();
+      process.stdout.close();
+      process.stderr.close();
+    });
+  }
+
+  /// Reads the next line of stdout from the process.
+  Future<String> nextLine() {
+    return _scheduleValue((_) {
+      return timeout(_stdout.chain(readLine), 5000,
+          "waiting for the next stdout line from process $name");
+    });
+  }
+
+  /// Reads the next line of stderr from the process.
+  Future<String> nextErrLine() {
+    return _scheduleValue((_) {
+      return timeout(_stderr.chain(readLine), 5000,
+          "waiting for the next stderr line from process $name");
+    });
+  }
+
+  /// Writes [line] to the process as stdin.
+  void writeLine(String line) {
+    _schedule((_) => _process.transform((p) => p.stdin.writeString('$line\n')));
+  }
+
+  /// Kills the process, and waits until it's dead.
+  void kill() {
+    _endScheduled = true;
+    _schedule((_) {
+      _endExpected = true;
+      return _process.chain((p) {
+        p.kill();
+        return timeout(_exitCode, 5000, "waiting for process $name to die");
+      });
+    });
+  }
+
+  /// Waits for the process to exit, and verifies that the exit code matches
+  /// [expectedExitCode] (if given).
+  void shouldExit([int expectedExitCode]) {
+    _endScheduled = true;
+    _schedule((_) {
+      _endExpected = true;
+      return timeout(_exitCode, 5000, "waiting for process $name to exit")
+          .transform((exitCode) {
+        if (expectedExitCode != null) {
+          expect(exitCode, equals(expectedExitCode));
+        }
+      });
+    });
+  }
+
+  /// Prints the remaining data in the process's stdout and stderr streams.
+  /// Prints nothing if the straems are empty.
+  Future _printStreams() {
+    Future printStream(String streamName, StringInputStream stream) {
+      return consumeStringInputStream(stream).transform((output) {
+        if (output.isEmpty) return;
+
+        print('\nProcess $name $streamName:');
+        for (var line in output.trim().split("\n")) {
+          print('| $line');
+        }
+        return;
+      });
+    }
+
+    return printStream('stdout', _stdout.value)
+        .chain((_) => printStream('stderr', _stderr.value));
+  }
+}
+
+/// A class representing an [HttpServer] that's scheduled to run in the course
+/// of the test. This class allows the server's request handling to be scheduled
+/// synchronously. All operations on this class are scheduled.
+class ScheduledServer {
+  /// The wrapped server.
+  final Future<HttpServer> _server;
+
+  /// The queue of handlers to run for upcoming requests.
+  final _handlers = new Queue<Future>();
+
+  ScheduledServer._(this._server);
+
+  /// Creates a new server listening on an automatically-allocated port on
+  /// localhost.
+  factory ScheduledServer() {
+    var scheduledServer;
+    scheduledServer = new ScheduledServer._(_scheduleValue((_) {
+      var server = new HttpServer();
+      server.defaultRequestHandler = scheduledServer._awaitHandle;
+      server.listen("127.0.0.1", 0);
+      _scheduleCleanup((_) => server.close());
+      return new Future.immediate(server);
+    }));
+    return scheduledServer;
+  }
+
+  /// The port on which the server is listening.
+  Future<int> get port => _server.transform((s) => s.port);
+
+  /// The base URL of the server, including its port.
+  Future<Uri> get url =>
+    port.transform((p) => new Uri.fromString("http://localhost:$p"));
+
+  /// Assert that the next request has the given [method] and [path], and pass
+  /// it to [handler] to handle. If [handler] returns a [Future], wait until
+  /// it's completed to continue the schedule.
+  void handle(String method, String path,
+      Future handler(HttpRequest request, HttpResponse response)) {
+    var handlerCompleter = new Completer<Function>();
+    _scheduleValue((_) {
+      var requestCompleteCompleter = new Completer();
+      handlerCompleter.complete((request, response) {
+        expect(request.method, equals(method));
+        expect(request.path, equals(path));
+
+        var future = handler(request, response);
+        if (future == null) future = new Future.immediate(null);
+        chainToCompleter(future, requestCompleteCompleter);
+      });
+      return timeout(requestCompleteCompleter.future,
+          5000, "waiting for $method $path");
+    });
+    _handlers.add(handlerCompleter.future);
+  }
+
+  /// Raises an error complaining of an unexpected request.
+  void _awaitHandle(HttpRequest request, HttpResponse response) {
+    var future = timeout(new Future.immediate(null).chain((_) {
+      var handlerFuture = _handlers.removeFirst();
+      if (handlerFuture == null) {
+        fail('Unexpected ${request.method} request to ${request.path}.');
+      }
+      return handlerFuture;
+    }).transform((handler) {
+      handler(request, response);
+    }), 5000, "waiting for a handler for ${request.method} ${request.path}");
+    expect(future, completes);
+  }
+}
+
 /**
  * Takes a simple data structure (composed of [Map]s, [List]s, scalar objects,
  * and [Future]s) and recursively resolves all the [Future]s contained within.
@@ -1222,11 +1504,43 @@
   _scheduled.add(event);
 }
 
-/**
- * Schedules a callback to be called after Pub is run with [runPub], even if it
- * fails.
- */
+/// Like [_schedule], but pipes the return value of [event] to a returned
+/// [Future].
+Future _scheduleValue(_ScheduledEvent event) {
+  var completer = new Completer();
+  _schedule((parentDir) {
+    chainToCompleter(event(parentDir), completer);
+    return completer.future;
+  });
+  return completer.future;
+}
+
+/// Schedules a callback to be called after the test case has completed, even if
+/// it failed.
 void _scheduleCleanup(_ScheduledEvent event) {
   if (_scheduledCleanup == null) _scheduledCleanup = [];
   _scheduledCleanup.add(event);
 }
+
+/// Schedules a callback to be called after the test case has completed, but
+/// only if it failed.
+void _scheduleOnException(_ScheduledEvent event) {
+  if (_scheduledOnException == null) _scheduledOnException = [];
+  _scheduledOnException.add(event);
+}
+
+/// Like [expect], but for [Future]s that complete as part of the scheduled
+/// test. This is necessary to ensure that the exception thrown by the
+/// expectation failing is handled by the scheduler.
+///
+/// Note that [matcher] matches against the completed value of [actual], so
+/// calling [completion] is unnecessary.
+void expectLater(Future actual, matcher, {String reason,
+    FailureHandler failureHandler, bool verbose: false}) {
+  _schedule((_) {
+    return actual.transform((value) {
+      expect(value, matcher, reason: reason, failureHandler: failureHandler,
+          verbose: false);
+    });
+  });
+}