diff --git a/.gitignore b/.gitignore
index 5c2afd1..ce9b95f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -74,3 +74,6 @@
 
 # Pub generated "packages" directories
 packages
+
+# Vim temporary swap files.
+*.swp
diff --git a/client/dart.js b/client/dart.js
index c76e3fa..1c8b333 100644
--- a/client/dart.js
+++ b/client/dart.js
@@ -159,11 +159,21 @@
 
   window.registerPort = function(name, port) {
     var stringified = JSON.stringify(serialize(port));
-    window.localStorage['dart-port:' + name] = stringified;
+    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;
   };
 
   window.lookupPort = function(name) {
-    var stringified = window.localStorage['dart-port:' + name];
+    var attrName = 'dart-port:' + name;
+    var stringified = document.documentElement.getAttribute(attrName);
+    // TODO(vsm): Phase out usage of localStorage.  We're leaving it in
+    // temporarily for backwards compatibility.
+    if (!stringified) {
+      stringified = window.localStorage[attrName];
+    }
     return deserialize(JSON.parse(stringified));
   };
 
diff --git a/compiler/java/com/google/dart/compiler/UrlLibrarySource.java b/compiler/java/com/google/dart/compiler/UrlLibrarySource.java
index efc71d3..f5ec48c 100644
--- a/compiler/java/com/google/dart/compiler/UrlLibrarySource.java
+++ b/compiler/java/com/google/dart/compiler/UrlLibrarySource.java
@@ -70,6 +70,12 @@
     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();
+      if (PackageLibraryManager.isPackageUri(uri)) {
+        URI fileUri = packageLibraryManager.resolveDartUri(uri);
+        if (fileUri != null) {
+          uri = fileUri;
+        }
+      }
       return createDartSource(uri, relPath, this, packageLibraryManager);
     } catch (Throwable e) {
       return null;
diff --git a/compiler/java/com/google/dart/compiler/ast/DartDeclaration.java b/compiler/java/com/google/dart/compiler/ast/DartDeclaration.java
index 5080bb1..35f3013 100644
--- a/compiler/java/com/google/dart/compiler/ast/DartDeclaration.java
+++ b/compiler/java/com/google/dart/compiler/ast/DartDeclaration.java
@@ -10,7 +10,8 @@
  * considered a part of the declaration, not an independent node. So the name is not visited when
  * traversing the AST.
  */
-public abstract class DartDeclaration<N extends DartExpression> extends DartNodeWithMetadata {
+public abstract class DartDeclaration<N extends DartExpression> extends DartNodeWithMetadata
+    implements HasObsoleteMetadata {
 
   private N name; // Not visited.
   private DartComment dartDoc;
diff --git a/compiler/java/com/google/dart/compiler/ast/DartDirective.java b/compiler/java/com/google/dart/compiler/ast/DartDirective.java
index ad1a9ec..7c039c1 100644
--- a/compiler/java/com/google/dart/compiler/ast/DartDirective.java
+++ b/compiler/java/com/google/dart/compiler/ast/DartDirective.java
@@ -1,4 +1,4 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
@@ -9,9 +9,19 @@
 /**
  * Base class for directives.
  */
-public abstract class DartDirective extends DartNodeWithMetadata {
+public abstract class DartDirective extends DartNodeWithMetadata implements HasObsoleteMetadata {
+  private DartObsoleteMetadata obsoleteMetadata = DartObsoleteMetadata.EMPTY;
+
   @Override
   public NodeElement getElement() {
     throw new UnsupportedOperationException(getClass().getSimpleName());
   }
+
+  public DartObsoleteMetadata getObsoleteMetadata() {
+    return obsoleteMetadata;
+  }
+
+  public void setObsoleteMetadata(DartObsoleteMetadata metadata) {
+    this.obsoleteMetadata = metadata;
+  }
 }
diff --git a/compiler/java/com/google/dart/compiler/ast/DartStringLiteral.java b/compiler/java/com/google/dart/compiler/ast/DartStringLiteral.java
index 91c69d9..e2a83bf 100644
--- a/compiler/java/com/google/dart/compiler/ast/DartStringLiteral.java
+++ b/compiler/java/com/google/dart/compiler/ast/DartStringLiteral.java
@@ -5,6 +5,7 @@
 package com.google.dart.compiler.ast;
 
 import com.google.common.collect.ImmutableList;
+import com.google.dart.compiler.resolver.Element;
 
 import java.util.List;
 
@@ -12,6 +13,8 @@
  * Represents a Dart string literal value.
  */
 public class DartStringLiteral extends DartLiteral {
+  
+  private Element element;
 
   public static DartStringLiteral get(String x) {
     return new DartStringLiteral(x, null);
@@ -43,6 +46,16 @@
     }
     return parts;
   }
+  
+  @Override
+  public void setElement(Element element) {
+    this.element = element;
+  }
+  
+  @Override
+  public Element getElement() {
+    return element;
+  }
 
   @Override
   public void visitChildren(ASTVisitor<?> visitor) {
diff --git a/compiler/java/com/google/dart/compiler/ast/HasObsoleteMetadata.java b/compiler/java/com/google/dart/compiler/ast/HasObsoleteMetadata.java
new file mode 100644
index 0000000..b1648aa
--- /dev/null
+++ b/compiler/java/com/google/dart/compiler/ast/HasObsoleteMetadata.java
@@ -0,0 +1,12 @@
+// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.google.dart.compiler.ast;
+
+public interface HasObsoleteMetadata {
+
+  DartObsoleteMetadata getObsoleteMetadata();
+
+  void setObsoleteMetadata(DartObsoleteMetadata metadata);
+}
diff --git a/compiler/java/com/google/dart/compiler/ast/LibraryUnit.java b/compiler/java/com/google/dart/compiler/ast/LibraryUnit.java
index d6e2a31..2bd491f 100644
--- a/compiler/java/com/google/dart/compiler/ast/LibraryUnit.java
+++ b/compiler/java/com/google/dart/compiler/ast/LibraryUnit.java
@@ -187,6 +187,14 @@
 
   public void setSelfDartUnit(DartUnit unit) {
     this.selfDartUnit = unit;
+    // set DartObsoleteMetadata for LibraryElement
+    if (unit != null) {
+      List<DartDirective> directives = unit.getDirectives();
+      if (!directives.isEmpty() && directives.get(0) instanceof DartLibraryDirective) {
+        DartLibraryDirective libraryDirective = (DartLibraryDirective) directives.get(0);
+        Elements.setLibraryMetadata(element, libraryDirective.getObsoleteMetadata());
+      }
+    }
   }
 
   /**
diff --git a/compiler/java/com/google/dart/compiler/parser/DartParser.java b/compiler/java/com/google/dart/compiler/parser/DartParser.java
index 7537e43..a79148c 100644
--- a/compiler/java/com/google/dart/compiler/parser/DartParser.java
+++ b/compiler/java/com/google/dart/compiler/parser/DartParser.java
@@ -96,6 +96,7 @@
 import com.google.dart.compiler.ast.DartVariable;
 import com.google.dart.compiler.ast.DartVariableStatement;
 import com.google.dart.compiler.ast.DartWhileStatement;
+import com.google.dart.compiler.ast.HasObsoleteMetadata;
 import com.google.dart.compiler.ast.ImportCombinator;
 import com.google.dart.compiler.ast.ImportHideCombinator;
 import com.google.dart.compiler.ast.ImportShowCombinator;
@@ -336,8 +337,7 @@
           // TODO(scheglov) remove after http://code.google.com/p/dart/issues/detail?id=6318 
           if (!Elements.isCoreLibrarySource(source)
               && !Elements.isLibrarySource(source, "/isolate/isolate.dart")
-              && !Elements.isLibrarySource(source, "crypto/crypto.dart")
-              && !Elements.isDart2JsLibrarySource(source)) {
+              && !Elements.isLibrarySource(source, "crypto/crypto.dart")) {
             reportError(position(), ParserErrorCode.DEPRECATED_INTERFACE);
           }
           node = done(parseClass());
@@ -385,19 +385,26 @@
    * @param metadata the metadata to be associated with the node
    */
   private void setMetadata(DartNodeWithMetadata node, List<DartAnnotation> annotations) {
+    if (node instanceof DartFieldDefinition) {
+      DartFieldDefinition fieldDefinition = (DartFieldDefinition) node;
+      List<DartField> fields = fieldDefinition.getFields();
+      for (DartField field : fields) {
+        setMetadata(field, annotations);
+      }
+      return;
+    }
     if (annotations != null && !annotations.isEmpty()) {
       node.setMetadata(annotations);
-      if (node instanceof DartDeclaration<?>) {
+      if (node instanceof HasObsoleteMetadata) {
+        HasObsoleteMetadata declaration = (HasObsoleteMetadata) node;
         for (int i = 0, size = annotations.size(); i < size; i++) {
           DartAnnotation annotation = annotations.get(i);
           DartExpression nameNode = annotation.getName();
           if (nameNode instanceof DartIdentifier) {
             String name = ((DartIdentifier) nameNode).getName();
             if (name.equals("deprecated")) {
-              DartDeclaration<?> declaration = (DartDeclaration<?>) node;
               declaration.setObsoleteMetadata(declaration.getObsoleteMetadata().makeDeprecated());
             } else if (name.equals("override")) {
-              DartDeclaration<?> declaration = (DartDeclaration<?>) node;
               declaration.setObsoleteMetadata(declaration.getObsoleteMetadata().makeOverride());
             }
           }
@@ -1319,8 +1326,7 @@
           && !Elements.isLibrarySource(source, "/math/math.dart")
           && !Elements.isLibrarySource(source, "/io/io_runtime.dart")
           && !Elements.isLibrarySource(source, "/crypto/crypto.dart")
-          && !Elements.isLibrarySource(source, "/utf/utf.dart")
-          && !Elements.isDart2JsLibrarySource(source)) {
+          && !Elements.isLibrarySource(source, "/utf/utf.dart")) {
         reportError(position(), ParserErrorCode.DEPRECATED_ABSTRACT_METHOD);
       }
     }
@@ -3750,9 +3756,8 @@
           constructor = doneWithoutConsuming(toPrefixedType(parts));
         } else {
           // Named constructor.
-          DartIdentifier identifier = (DartIdentifier)part2.getIdentifier();
-          constructor = doneWithoutConsuming(new DartPropertyAccess(doneWithoutConsuming(part1),
-                                                                    identifier));
+          DartIdentifier identifier = (DartIdentifier) part2.getIdentifier();
+          constructor = doneWithoutConsuming(new DartPropertyAccess(part1, identifier));
         }
         break;
       }
diff --git a/compiler/java/com/google/dart/compiler/resolver/Elements.java b/compiler/java/com/google/dart/compiler/resolver/Elements.java
index 5fadc57..b95d48c 100644
--- a/compiler/java/com/google/dart/compiler/resolver/Elements.java
+++ b/compiler/java/com/google/dart/compiler/resolver/Elements.java
@@ -87,6 +87,10 @@
     return new LibraryElementImplementation(libraryUnit);
   }
   
+  public static void setLibraryMetadata(LibraryElement element, DartObsoleteMetadata metadata) {
+    ((LibraryElementImplementation) element).setMetadata(metadata);
+  }
+  
   public static void addExportedElement(LibraryElement libraryElement, Element element) {
     ((LibraryElementImplementation) libraryElement).addExportedElements(element);
   }
@@ -744,21 +748,6 @@
     }
     return false;
   }
-  
-  /**
-   * @return <code>true</code> if given {@link Source} represents library with given name.
-   */
-  public static boolean isDart2JsLibrarySource(Source source) {
-    if (source instanceof DartSource) {
-      DartSource dartSource = (DartSource) source;
-      LibrarySource library = dartSource.getLibrary();
-      if (library != null) {
-        String libraryName = library.getName();
-        return libraryName.contains("lib/compiler/implementation/");
-      }
-    }
-    return false;
-  }
 
   /**
    * @return <code>true</code> if given {@link Source} represents code library declaration or
diff --git a/compiler/java/com/google/dart/compiler/resolver/LibraryElementImplementation.java b/compiler/java/com/google/dart/compiler/resolver/LibraryElementImplementation.java
index 8059600..ea4d530 100644
--- a/compiler/java/com/google/dart/compiler/resolver/LibraryElementImplementation.java
+++ b/compiler/java/com/google/dart/compiler/resolver/LibraryElementImplementation.java
@@ -5,6 +5,7 @@
 package com.google.dart.compiler.resolver;
 
 import com.google.common.collect.Lists;
+import com.google.dart.compiler.ast.DartObsoleteMetadata;
 import com.google.dart.compiler.ast.LibraryUnit;
 
 import java.util.Collection;
@@ -17,6 +18,7 @@
   private final List<Element> exportedElements = Lists.newArrayList();
   private LibraryUnit libraryUnit;
   private MethodElement entryPoint;
+  private DartObsoleteMetadata metadata;
 
   public LibraryElementImplementation(LibraryUnit libraryUnit) {
     // TODO(ngeoffray): What should we pass the super? Should a LibraryUnit be a node?
@@ -85,4 +87,13 @@
   void addMethod(MethodElement method) {
     scope.declareElement(method.getName(), method);
   }
+  
+  @Override
+  public DartObsoleteMetadata getMetadata() {
+    return metadata;
+  }
+
+  public void setMetadata(DartObsoleteMetadata metadata) {
+    this.metadata = metadata;
+  }
 }
diff --git a/compiler/java/com/google/dart/compiler/resolver/ResolveVisitor.java b/compiler/java/com/google/dart/compiler/resolver/ResolveVisitor.java
index ad1da78..3068877 100644
--- a/compiler/java/com/google/dart/compiler/resolver/ResolveVisitor.java
+++ b/compiler/java/com/google/dart/compiler/resolver/ResolveVisitor.java
@@ -16,6 +16,7 @@
 import com.google.dart.compiler.ast.DartThisExpression;
 import com.google.dart.compiler.ast.DartTypeNode;
 import com.google.dart.compiler.ast.DartTypeParameter;
+import com.google.dart.compiler.common.HasSourceInfo;
 import com.google.dart.compiler.type.FunctionType;
 import com.google.dart.compiler.type.Type;
 import com.google.dart.compiler.type.Types;
@@ -143,11 +144,15 @@
     node.setType(type);
     Element element = type.getElement();
     recordElement(node.getIdentifier(), element);
+    checkDeprecated(node, element);
+    return type;
+  }
+
+  protected final void checkDeprecated(HasSourceInfo nameNode, Element element) {
     if (element != null && element.getMetadata().isDeprecated()) {
-      getContext().onError(node.getIdentifier(), TypeErrorCode.DEPRECATED_ELEMENT,
+      getContext().onError(nameNode, TypeErrorCode.DEPRECATED_ELEMENT,
          Elements.getDeprecatedElementTitle(element));
     }
-    return type;
   }
 
   protected <E extends Element> E recordElement(DartNode node, E element) {
diff --git a/compiler/java/com/google/dart/compiler/resolver/Resolver.java b/compiler/java/com/google/dart/compiler/resolver/Resolver.java
index 71d67b2..88b06e4 100644
--- a/compiler/java/com/google/dart/compiler/resolver/Resolver.java
+++ b/compiler/java/com/google/dart/compiler/resolver/Resolver.java
@@ -40,6 +40,7 @@
 import com.google.dart.compiler.ast.DartGotoStatement;
 import com.google.dart.compiler.ast.DartIdentifier;
 import com.google.dart.compiler.ast.DartIfStatement;
+import com.google.dart.compiler.ast.DartImportDirective;
 import com.google.dart.compiler.ast.DartInitializer;
 import com.google.dart.compiler.ast.DartIntegerLiteral;
 import com.google.dart.compiler.ast.DartInvocation;
@@ -76,6 +77,8 @@
 import com.google.dart.compiler.ast.DartVariable;
 import com.google.dart.compiler.ast.DartVariableStatement;
 import com.google.dart.compiler.ast.DartWhileStatement;
+import com.google.dart.compiler.ast.LibraryImport;
+import com.google.dart.compiler.ast.LibraryUnit;
 import com.google.dart.compiler.ast.Modifiers;
 import com.google.dart.compiler.common.HasSourceInfo;
 import com.google.dart.compiler.common.SourceInfo;
@@ -230,11 +233,33 @@
 
     @Override
     public Element visitUnit(DartUnit unit) {
+      List<DartImportDirective> importDirectives = Lists.newArrayList();
       for (DartDirective directive : unit.getDirectives()) {
+        if (directive instanceof DartImportDirective) {
+          importDirectives.add((DartImportDirective) directive);
+        }
         if (directive instanceof DartPartOfDirective) {
           directive.accept(this);
         }
       }
+      // set LibraryElement for "import" directives
+      {
+        LibraryUnit library = unit.getLibrary();
+        if (library != null) {
+          Iterator<LibraryImport> importIterator = library.getImports().iterator();
+          Iterator<DartImportDirective> directiveIterator = importDirectives.iterator();
+          while (importIterator.hasNext() && directiveIterator.hasNext()) {
+            LibraryImport imp = importIterator.next();
+            DartImportDirective dir = directiveIterator.next();
+            DartStringLiteral uri = dir.getLibraryUri();
+            LibraryUnit impLibrary = imp.getLibrary();
+            if (uri != null && impLibrary != null) {
+              uri.setElement(impLibrary.getElement());
+            }
+          }
+        }
+      }
+      // visit top-level nodes
       for (DartNode node : unit.getTopLevelNodes()) {
         node.accept(this);
       }
@@ -715,10 +740,19 @@
       }
       resolve(functionNode.getBody());
 
-      if (Elements.isNonFactoryConstructor(member)
-          && !(body instanceof DartNativeBlock)) {
+      if (Elements.isNonFactoryConstructor(member) && !(body instanceof DartNativeBlock)) {
         resolveInitializers(node, initializedFields);
       }
+
+      // only generative constructor can have initializers, so resolve them, but report error 
+      if (!member.isConstructor() || member.getModifiers().isFactory()) {
+        for (DartInitializer initializer : node.getInitializers()) {
+          resolve(initializer);
+          if (initializer.getName() != null) {
+            onError(initializer, ResolverErrorCode.INITIALIZER_ONLY_IN_GENERATIVE_CONSTRUCTOR);
+          }
+        }
+      }
       
       // resolve redirecting factory constructor
       {
@@ -1253,6 +1287,20 @@
         }
       }
 
+      if (ElementKind.of(element) == ElementKind.FIELD) {
+        FieldElement fieldElement = (FieldElement) element;
+        if (fieldElement.getModifiers().isAbstractField()) {
+          if (fieldElement.getGetter() == null && ASTNodes.inGetterContext(x)) {
+            topLevelContext.onError(x, ResolverErrorCode.FIELD_DOES_NOT_HAVE_A_GETTER);
+            x.markResolutionAlreadyReportedThatTheMethodCouldNotBeFound();
+          }
+          if (fieldElement.getSetter() == null && ASTNodes.inSetterContext(x)) {
+            topLevelContext.onError(x, ResolverErrorCode.FIELD_DOES_NOT_HAVE_A_SETTER);
+            x.markResolutionAlreadyReportedThatTheMethodCouldNotBeFound();
+          }
+        }
+      }
+
       // May be local variable declared in lexical scope, but its declaration is not visited yet.
       if (getContext().getScope().isDeclaredButNotReachedVariable(name)) {
         onError(x, ResolverErrorCode.USING_LOCAL_VARIABLE_BEFORE_DECLARATION, x);
@@ -1278,6 +1326,7 @@
       // If we we haven't resolved the identifier, it will be normalized to
       // this.<identifier>.
 
+      checkDeprecated(x, element);
       return recordElement(x, element);
     }
 
@@ -1319,19 +1368,9 @@
             return typeProvider.getTypeType().getElement();
           }
           break;
+        case FUNCTION_TYPE_ALIAS:
         case TYPE_VARIABLE:
-          // Type variables are not legal in identifier expressions, but the type variable
-          // may be hiding a class element.
-          LibraryElement libraryElement = scope.getLibrary();
-          Scope libraryScope = libraryElement.getScope();
-          // dip again at the library level.
-          element = libraryScope.findElement(libraryElement, name);
-          if (element == null) {
-            onError(x, ResolverErrorCode.TYPE_VARIABLE_NOT_ALLOWED_IN_IDENTIFIER);
-          } else {
-            return checkResolvedIdentifier(x, isQualifier, libraryScope, name, element);
-          }
-          break;
+          return typeProvider.getTypeType().getElement();
         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 550ea7e..f6d91c6 100644
--- a/compiler/java/com/google/dart/compiler/resolver/ResolverErrorCode.java
+++ b/compiler/java/com/google/dart/compiler/resolver/ResolverErrorCode.java
@@ -127,6 +127,7 @@
   ILLEGAL_ACCESS_TO_PRIVATE_MEMBER("\"%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"),
   INIT_FIELD_ONLY_IMMEDIATELY_SURROUNDING_CLASS(
       "Only fields of immediately surrounding class can be initialized"),
   INSTANCE_METHOD_FROM_INITIALIZER("Instance methods cannot be referenced from constructor initializer"),
diff --git a/compiler/java/com/google/dart/compiler/type/InterfaceType.java b/compiler/java/com/google/dart/compiler/type/InterfaceType.java
index 7a746c1..99b7c9d 100644
--- a/compiler/java/com/google/dart/compiler/type/InterfaceType.java
+++ b/compiler/java/com/google/dart/compiler/type/InterfaceType.java
@@ -35,6 +35,10 @@
   
   void registerSubClass(ClassElement subClass);
   void unregisterSubClass(ClassElement subClass);
+  /**
+   * @return the unique {@link Member} with given name, defined in one of the subtypes. May be
+   *         <code>null</code> if not found or not unique.
+   */
   Member lookupSubTypeMember(String name);
 
   interface Member {
diff --git a/compiler/java/com/google/dart/compiler/type/InterfaceTypeImplementation.java b/compiler/java/com/google/dart/compiler/type/InterfaceTypeImplementation.java
index fac151a..52c63ce 100644
--- a/compiler/java/com/google/dart/compiler/type/InterfaceTypeImplementation.java
+++ b/compiler/java/com/google/dart/compiler/type/InterfaceTypeImplementation.java
@@ -233,21 +233,32 @@
   
   @Override
   public Member lookupSubTypeMember(String name) {
+    Member foundMember = null;
     for (ClassElement subClass : subClasses.keySet()) {
+      // find one or more members in subClass elements
       {
         Element element = subClass.lookupLocalElement(name);
         if (element != null) {
-          return new MemberImplementation(this, element);
+          if (foundMember != null) {
+            return null;
+          }
+          foundMember = new MemberImplementation(this, element);
+          continue;
         }
       }
+      // try to find deeper
       InterfaceType type = subClass.getType();
       if (type != null) {
         Member member = type.lookupSubTypeMember(name);
         if (member != null) {
-          return member;
+          if (foundMember != null) {
+            return null;
+          }
+          foundMember = member;
         }
       }
     }
-    return null;
+    // may be found
+    return foundMember;
   }
 }
diff --git a/compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java b/compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java
index 1ca3593..e6a6419 100644
--- a/compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java
+++ b/compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java
@@ -1860,7 +1860,7 @@
     @Override
     public Type visitFunctionExpression(DartFunctionExpression node) {
       node.visitChildren(this);
-      Type result = ((Element) node.getElement()).getType();
+      Type result = node.getElement().getType();
       result.getClass(); // quick null check
       return result;
     }
diff --git a/compiler/javatests/com/google/dart/compiler/resolver/ResolverTest.java b/compiler/javatests/com/google/dart/compiler/resolver/ResolverTest.java
index 75dfde1..90d8486 100644
--- a/compiler/javatests/com/google/dart/compiler/resolver/ResolverTest.java
+++ b/compiler/javatests/com/google/dart/compiler/resolver/ResolverTest.java
@@ -823,8 +823,7 @@
         "  try {",
         "    0.25 - f;",
         "  } catch(e) {}",
-        "}"),
-        ResolverErrorCode.CANNOT_USE_TYPE);
+        "}"));
   }
 
   public void test_classUsedAsExpression() {
@@ -841,11 +840,11 @@
         "class A<B> {",
         "  var field = B;",
         "  f() {",
-        "    0.25 - B;",
+        "    process(x);",
         "  }",
-        "}"),
-        ResolverErrorCode.TYPE_VARIABLE_NOT_ALLOWED_IN_IDENTIFIER,
-    ResolverErrorCode.TYPE_VARIABLE_NOT_ALLOWED_IN_IDENTIFIER);
+        "}",
+        "process(x) {}",
+        ""));
   }
 
   public void test_shadowType_withVariable() throws Exception {
@@ -1057,6 +1056,8 @@
         "  result = instance.setter3;",
         "  instance.setter3 = 1;",
         "}"),
+        errEx(ResolverErrorCode.FIELD_DOES_NOT_HAVE_A_SETTER, 13, 3, 7),
+        errEx(ResolverErrorCode.FIELD_DOES_NOT_HAVE_A_GETTER, 14, 12, 7),
         errEx(ResolverErrorCode.FIELD_DOES_NOT_HAVE_A_SETTER, 17, 5, 7),
         errEx(ResolverErrorCode.FIELD_DOES_NOT_HAVE_A_GETTER, 18, 14, 7));
   }
diff --git a/compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerCompilerTest.java b/compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerCompilerTest.java
index f1a8dcb..5f72504 100644
--- a/compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerCompilerTest.java
+++ b/compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerCompilerTest.java
@@ -3707,6 +3707,8 @@
         "const deprecated = 0;",
         "@deprecated",
         "ttt() {}",
+        "@deprecated",
+        "get topLevelGet => 42;",
         "class A {",
         "  var @deprecated fff;",
         "  @deprecated",
@@ -3716,6 +3718,7 @@
         "}",
         "method() {",
         "  ttt();",
+        "  print(topLevelGet);",
         "  A a = new A();",
         "  a.fff = 0;",
         "  a.mmmm();",
@@ -3724,10 +3727,11 @@
         "");
     assertErrors(
         libraryResult.getErrors(),
-        errEx(TypeErrorCode.DEPRECATED_ELEMENT, 13, 3, 3),
-        errEx(TypeErrorCode.DEPRECATED_ELEMENT, 15, 5, 3),
-        errEx(TypeErrorCode.DEPRECATED_ELEMENT, 16, 5, 4),
-        errEx(TypeErrorCode.DEPRECATED_ELEMENT, 17, 5, 1));
+        errEx(TypeErrorCode.DEPRECATED_ELEMENT, 16, 9, 11),
+        errEx(TypeErrorCode.DEPRECATED_ELEMENT, 15, 3, 3),
+        errEx(TypeErrorCode.DEPRECATED_ELEMENT, 18, 5, 3),
+        errEx(TypeErrorCode.DEPRECATED_ELEMENT, 19, 5, 4),
+        errEx(TypeErrorCode.DEPRECATED_ELEMENT, 20, 5, 1));
   }
 
   public void test_metadataComment_deprecated_2() throws Exception {
@@ -5351,6 +5355,32 @@
     assertErrors(result.getErrors(), errEx(TypeErrorCode.CANNOT_BE_RESOLVED, 5, 5, 1));
   }
 
+  public void test_field_unqualifiedAccess_read() throws Exception {
+    AnalyzeLibraryResult result = analyzeLibrary(
+        "// filler filler filler filler filler filler filler filler filler filler",
+        "class A {",
+        "  set f(x) {}",
+        "  run() {",
+        "    var v = f;",
+        "  }",
+        "}",
+        "");
+    assertErrors(result.getErrors(), errEx(ResolverErrorCode.FIELD_DOES_NOT_HAVE_A_GETTER, 5, 13, 1));
+  }
+  
+  public void test_field_unqualifiedAccess_write() throws Exception {
+    AnalyzeLibraryResult result = analyzeLibrary(
+        "// filler filler filler filler filler filler filler filler filler filler",
+        "class A {",
+        "  get f => 0;",
+        "  run() {",
+        "    f = 1;",
+        "  }",
+        "}",
+        "");
+    assertErrors(result.getErrors(), errEx(ResolverErrorCode.FIELD_DOES_NOT_HAVE_A_SETTER, 5, 5, 1));
+  }
+
   public void test_typeVariableScope_staticField() throws Exception {
     AnalyzeLibraryResult result = analyzeLibrary(
         "// filler filler filler filler filler filler filler filler filler filler",
@@ -5470,6 +5500,41 @@
   }
   
   /**
+   * We should resolve sub-type member only if there is only sub-type with such member.
+   * <p>
+   * http://code.google.com/p/dart/issues/detail?id=6776
+   */
+  public void test_trySubTypeMember_moreThanOneMember() throws Exception {
+    compilerConfiguration = new DefaultCompilerConfiguration(new CompilerOptions() {
+      @Override
+      public boolean typeChecksForInferredTypes() {
+        return true;
+      }
+    });
+    AnalyzeLibraryResult result = analyzeLibrary(
+        "// filler filler filler filler filler filler filler filler filler filler",
+        "class Event {}",
+        "class MouseEvent extends Event {",
+        "  int clientX;",
+        "}",
+        "class ScreenEvent extends Event {",
+        "  int clientX;",
+        "}",
+        "typedef Listener(Event event);",
+        "class Button {",
+        "  addListener(Listener listener) {}",
+        "}",
+        "main() {",
+        "  Button button = new Button();",
+        "  button.addListener((event) {",
+        "    event.clientX;",
+        "  });",
+        "}",
+        "");
+    assertErrors(result.getErrors(), errEx(TypeErrorCode.NOT_A_MEMBER_OF_INFERRED, 16, 11, 7));
+  }
+  
+  /**
    * <p>
    * http://code.google.com/p/dart/issues/detail?id=6491
    */
@@ -5625,4 +5690,20 @@
     assertErrors(result.getErrors(),
         errEx(ResolverErrorCode.NOT_GENERATIVE_SUPER_CONSTRUCTOR, 8, 9, 13));
   }
+  
+  /**
+   * <p>
+   * http://code.google.com/p/dart/issues/detail?id=6718
+   */
+  public void test_initializerInMethod() throws Exception {
+    AnalyzeLibraryResult result = analyzeLibrary(
+        "// filler filler filler filler filler filler filler filler filler filler",
+        "class A {",
+        "  var x;",
+        "  B() : x = (foo() { }) {}",
+        "}",
+        "");
+    assertErrors(result.getErrors(),
+        errEx(ResolverErrorCode.INITIALIZER_ONLY_IN_GENERATIVE_CONSTRUCTOR, 4, 9, 15));
+  }
 }
diff --git a/dart.gyp b/dart.gyp
index 3ec8489..b76a758 100644
--- a/dart.gyp
+++ b/dart.gyp
@@ -13,6 +13,9 @@
       'actions': []
     },
     {
+      # This is the target that is built on the VM build bots.  It
+      # must depend on anything that is required by the VM test
+      # suites.
       'target_name': 'runtime',
       'type': 'none',
       'dependencies': [
@@ -21,6 +24,7 @@
         'runtime/dart-runtime.gyp:run_vm_tests',
         'runtime/dart-runtime.gyp:process_test',
         'runtime/dart-runtime.gyp:test_extension',
+        'packages',
       ],
     },
     {
@@ -104,11 +108,15 @@
       ],
     },
     {
+      # This is the target that is built on the dart2js build bots.
+      # It must depend on anything that is required by the dart2js
+      # test suites.
       'target_name': 'dart2js_bot',
       'type': 'none',
       'dependencies': [
         'third_party/v8/src/d8.gyp:d8',
         'create_sdk',
+        'packages',
       ],
     },
     {
@@ -125,5 +133,12 @@
         'samples/sample_extension/sample_extension.gyp:sample_extension',
       ],
     },
+    {
+      'target_name': 'packages',
+      'type': 'none',
+      'dependencies': [
+        'pkg/pkg.gyp:pkg_packages',
+      ],
+    },
   ],
 }
diff --git a/pkg/args/test/args_test.dart b/pkg/args/test/args_test.dart
index 10c68fe..728ff7d 100644
--- a/pkg/args/test/args_test.dart
+++ b/pkg/args/test/args_test.dart
@@ -6,8 +6,7 @@
 
 import '../../../pkg/unittest/lib/unittest.dart';
 
-// TODO(rnystrom): Use "package:" URL here when test.dart can handle pub.
-import '../lib/args.dart';
+import 'package:args/args.dart';
 
 main() {
   group('ArgParser.addFlag()', () {
diff --git a/pkg/fixnum/lib/src/int32.dart b/pkg/fixnum/lib/src/int32.dart
index 80f5f3c..ac92a7e 100644
--- a/pkg/fixnum/lib/src/int32.dart
+++ b/pkg/fixnum/lib/src/int32.dart
@@ -142,7 +142,7 @@
   // will be truncated.
   int _convert(other) {
     if (other == null) {
-      throw new NullPointerException();
+      throw new ArgumentError(null);
     } else if (other is intx) {
       return other.toInt32()._i;
     } else if (other is int) {
diff --git a/pkg/fixnum/lib/src/int64.dart b/pkg/fixnum/lib/src/int64.dart
index cefb2c0..3ef0bc0 100644
--- a/pkg/fixnum/lib/src/int64.dart
+++ b/pkg/fixnum/lib/src/int64.dart
@@ -242,7 +242,7 @@
 
   int64 _promote(other) {
     if (other == null) {
-      throw new NullPointerException();
+      throw new ArgumentError(null);
     } else if (other is intx) {
       other = other.toInt64();
     } else if (other is int) {
diff --git a/pkg/fixnum/test/int_32_test.dart b/pkg/fixnum/test/int_32_test.dart
index 7ea6591..e719fa6 100644
--- a/pkg/fixnum/test/int_32_test.dart
+++ b/pkg/fixnum/test/int_32_test.dart
@@ -132,26 +132,26 @@
 
   try {
     new int32.fromInt(17) < null;
-    Expect.fail("x < null should throw NullPointerException");
-  } on NullPointerException catch (e) {
+    Expect.fail("x < null should throw ArgumentError");
+  } on ArgumentError catch (e) {
   }
 
   try {
     new int32.fromInt(17) <= null;
-    Expect.fail("x <= null should throw NullPointerException");
-  } on NullPointerException catch (e) {
+    Expect.fail("x <= null should throw ArgumentError");
+  } on ArgumentError catch (e) {
   }
 
   try {
     new int32.fromInt(17) > null;
-    Expect.fail("x > null should throw NullPointerException");
-  } on NullPointerException catch (e) {
+    Expect.fail("x > null should throw ArgumentError");
+  } on ArgumentError catch (e) {
   }
 
   try {
     new int32.fromInt(17) < null;
-    Expect.fail("x >= null should throw NullPointerException");
-  } on NullPointerException catch (e) {
+    Expect.fail("x >= null should throw ArgumentError");
+  } on ArgumentError catch (e) {
   }
 
   Expect.isFalse(new int32.fromInt(17) == null);
diff --git a/pkg/fixnum/test/int_64_test.dart b/pkg/fixnum/test/int_64_test.dart
index 65d47b3..f41f45c 100644
--- a/pkg/fixnum/test/int_64_test.dart
+++ b/pkg/fixnum/test/int_64_test.dart
@@ -145,26 +145,26 @@
 
   try {
     new int64.fromInt(17) < null;
-    Expect.fail("x < null should throw NullPointerException");
-  } on NullPointerException catch (e) {
+    Expect.fail("x < null should throw ArgumentError");
+  } on ArgumentError catch (e) {
   }
 
   try {
     new int64.fromInt(17) <= null;
-    Expect.fail("x <= null should throw NullPointerException");
-  } on NullPointerException catch (e) {
+    Expect.fail("x <= null should throw ArgumentError");
+  } on ArgumentError catch (e) {
   }
 
   try {
     new int64.fromInt(17) > null;
-    Expect.fail("x > null should throw NullPointerException");
-  } on NullPointerException catch (e) {
+    Expect.fail("x > null should throw ArgumentError");
+  } on ArgumentError catch (e) {
   }
 
   try {
     new int64.fromInt(17) < null;
-    Expect.fail("x >= null should throw NullPointerException");
-  } on NullPointerException catch (e) {
+    Expect.fail("x >= null should throw ArgumentError");
+  } on ArgumentError catch (e) {
   }
 
   Expect.isFalse(new int64.fromInt(17) == null);
diff --git a/pkg/http/lib/http.dart b/pkg/http/lib/http.dart
index 4ee2c61..ee074f7 100644
--- a/pkg/http/lib/http.dart
+++ b/pkg/http/lib/http.dart
@@ -37,11 +37,11 @@
 /// This package is designed to be composable. This makes it easy for external
 /// libraries to work with one another to add behavior to it. Libraries wishing
 /// to add behavior should create a subclass of [BaseClient] that wraps another
-/// [BaseClient] and adds the desired behavior:
+/// [Client] and adds the desired behavior:
 ///
 ///     class UserAgentClient extends http.BaseClient {
 ///       final String userAgent;
-///       final HttpClient _inner;
+///       final http.Client _inner;
 ///
 ///       UserAgentClient(this.userAgent, this._inner);
 ///
@@ -50,9 +50,6 @@
 ///         return _inner.send(request);
 ///       }
 ///     }
-///
-/// In turn, libraries using [Client] should take a [BaseClient] so that the
-/// decorated clients can be used transparently.
 
 library http;
 
@@ -65,7 +62,6 @@
 export 'src/base_client.dart';
 export 'src/base_request.dart';
 export 'src/base_response.dart';
-export 'src/curl_client.dart';
 export 'src/client.dart';
 export 'src/multipart_file.dart';
 export 'src/multipart_request.dart';
diff --git a/pkg/http/lib/src/base_client.dart b/pkg/http/lib/src/base_client.dart
index 0b9c52d..1662f00 100644
--- a/pkg/http/lib/src/base_client.dart
+++ b/pkg/http/lib/src/base_client.dart
@@ -9,6 +9,7 @@
 import 'dart:uri';
 
 import 'base_request.dart';
+import 'client.dart';
 import 'request.dart';
 import 'response.dart';
 import 'streamed_response.dart';
@@ -17,7 +18,7 @@
 /// The abstract base class for an HTTP client. This is a mixin-style class;
 /// subclasses only need to implement [send] and maybe [close], and then they
 /// get various convenience methods for free.
-abstract class BaseClient {
+abstract class BaseClient implements Client {
   /// Sends an HTTP HEAD request with the given headers to the given URL, which
   /// can be a [Uri] or a [String].
   ///
diff --git a/pkg/http/lib/src/client.dart b/pkg/http/lib/src/client.dart
index bbee58d..d60df93 100644
--- a/pkg/http/lib/src/client.dart
+++ b/pkg/http/lib/src/client.dart
@@ -8,75 +8,89 @@
 
 import 'base_client.dart';
 import 'base_request.dart';
+import 'io_client.dart';
 import 'streamed_response.dart';
 import 'utils.dart';
 
-/// An HTTP client which takes care of maintaining persistent connections across
-/// multiple requests to the same server. If you only need to send a single
-/// request, it's usually easier to use [head], [get], [post],
+/// The interface for HTTP clients that take care of maintaining persistent
+/// connections across multiple requests to the same server. If you only need to
+/// send a single request, it's usually easier to use [head], [get], [post],
 /// [put], or [delete] instead.
 ///
-/// When creating an HTTP client class with additional functionality, it's
-/// recommended that you subclass [BaseClient] and wrap another instance of
-/// [BaseClient] rather than subclassing [Client] directly. This allows all
-/// subclasses of [BaseClient] to be mutually composable.
-class Client extends BaseClient {
-  /// The underlying `dart:io` HTTP client.
-  HttpClient _inner;
+/// When creating an HTTP client class with additional functionality, you must
+/// extend [BaseClient] rather than [Client]. In most cases, you can wrap
+/// another instance of [Client] and add functionality on top of that. This
+/// allows all classes implementing [Client] to be mutually composable.
+abstract class Client {
+  /// Creates a new Client using the default implementation. This implementation
+  /// uses an underlying `dart:io` [HttpClient] to make requests.
+  factory Client() => new IOClient();
 
-  /// Creates a new HTTP client.
-  Client() : _inner = new HttpClient();
+  /// Sends an HTTP HEAD request with the given headers to the given URL, which
+  /// can be a [Uri] or a [String].
+  ///
+  /// For more fine-grained control over the request, use [send] instead.
+  Future<Response> head(url, {Map<String, String> headers});
+
+  /// Sends an HTTP GET request with the given headers to the given URL, which
+  /// can be a [Uri] or a [String].
+  ///
+  /// For more fine-grained control over the request, use [send] instead.
+  Future<Response> get(url, {Map<String, String> headers});
+
+  /// Sends an HTTP POST request with the given headers and fields to the given
+  /// URL, which can be a [Uri] or a [String]. If any fields are specified, the
+  /// content-type is automatically set to
+  /// `"application/x-www-form-urlencoded"`.
+  ///
+  /// For more fine-grained control over the request, use [send] instead.
+  Future<Response> post(url,
+      {Map<String, String> headers,
+       Map<String, String> fields});
+
+  /// Sends an HTTP PUT request with the given headers and fields to the given
+  /// URL, which can be a [Uri] or a [String]. If any fields are specified, the
+  /// content-type is automatically set to
+  /// `"application/x-www-form-urlencoded"`.
+  ///
+  /// For more fine-grained control over the request, use [send] instead.
+  Future<Response> put(url,
+      {Map<String, String> headers,
+       Map<String, String> fields});
+
+  /// Sends an HTTP DELETE request with the given headers to the given URL,
+  /// which can be a [Uri] or a [String].
+  ///
+  /// For more fine-grained control over the request, use [send] instead.
+  Future<Response> delete(url, {Map<String, String> headers});
+
+  /// Sends an HTTP GET request with the given headers to the given URL, which
+  /// can be a [Uri] or a [String], and returns a Future that completes to the
+  /// body of the response as a String.
+  ///
+  /// The Future will emit an [HttpException] if the response doesn't have a
+  /// success status code.
+  ///
+  /// For more fine-grained control over the request and response, use [send] or
+  /// [get] instead.
+  Future<String> read(url, {Map<String, String> headers});
+
+  /// Sends an HTTP GET request with the given headers to the given URL, which
+  /// can be a [Uri] or a [String], and returns a Future that completes to the
+  /// body of the response as a list of bytes.
+  ///
+  /// The Future will emit an [HttpException] if the response doesn't have a
+  /// success status code.
+  ///
+  /// For more fine-grained control over the request and response, use [send] or
+  /// [get] instead.
+  Future<Uint8List> readBytes(url, {Map<String, String> headers});
 
   /// Sends an HTTP request and asynchronously returns the response.
-  Future<StreamedResponse> send(BaseRequest request) {
-    var stream = request.finalize();
+  Future<StreamedResponse> send(BaseRequest request);
 
-    var completer = new Completer<StreamedResponse>();
-    var connection = _inner.openUrl(request.method, request.url);
-    connection.onError = (e) {
-      async.then((_) {
-        // TODO(nweiz): remove this when issue 4974 is fixed
-        if (completer.future.isComplete) throw e;
-
-        completer.completeException(e);
-      });
-    };
-
-    connection.onRequest = (underlyingRequest) {
-      underlyingRequest.contentLength = request.contentLength;
-      underlyingRequest.persistentConnection = request.persistentConnection;
-      request.headers.forEach((name, value) {
-        underlyingRequest.headers.set(name, value);
-      });
-
-      if (stream.closed) {
-        underlyingRequest.outputStream.close();
-      } else {
-        stream.pipe(underlyingRequest.outputStream);
-      }
-    };
-
-    connection.onResponse = (response) {
-      var headers = <String>{};
-      response.headers.forEach((key, value) => headers[key] = value);
-
-      completer.complete(new StreamedResponse(
-          response.inputStream,
-          response.statusCode,
-          response.contentLength,
-          headers: headers,
-          isRedirect: response.isRedirect,
-          persistentConnection: response.persistentConnection,
-          reasonPhrase: response.reasonPhrase));
-    };
-
-    return completer.future;
-  }
-
-  /// 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();
-    _inner = null;
-  }
+  /// Closes the client and cleans up any resources associated with it. It's
+  /// important to close each client when it's done being used; failing to do so
+  /// can cause the Dart process to hang.
+  void close();
 }
diff --git a/pkg/http/lib/src/io_client.dart b/pkg/http/lib/src/io_client.dart
new file mode 100644
index 0000000..995ff3b
--- /dev/null
+++ b/pkg/http/lib/src/io_client.dart
@@ -0,0 +1,74 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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 io_client;
+
+import 'dart:io';
+
+import 'base_client.dart';
+import 'base_request.dart';
+import 'streamed_response.dart';
+import 'utils.dart';
+
+/// A `dart:io`-based HTTP client. This is the default client.
+class IOClient extends BaseClient {
+  /// The underlying `dart:io` HTTP client.
+  HttpClient _inner;
+
+  /// Creates a new HTTP client.
+  IOClient() : _inner = new HttpClient();
+
+  /// Sends an HTTP request and asynchronously returns the response.
+  Future<StreamedResponse> send(BaseRequest request) {
+    var stream = request.finalize();
+
+    var completer = new Completer<StreamedResponse>();
+    var connection = _inner.openUrl(request.method, request.url);
+    connection.onError = (e) {
+      async.then((_) {
+        // TODO(nweiz): remove this when issue 4974 is fixed
+        if (completer.future.isComplete) throw e;
+
+        completer.completeException(e);
+      });
+    };
+
+    connection.onRequest = (underlyingRequest) {
+      underlyingRequest.contentLength = request.contentLength;
+      underlyingRequest.persistentConnection = request.persistentConnection;
+      request.headers.forEach((name, value) {
+        underlyingRequest.headers.set(name, value);
+      });
+
+      if (stream.closed) {
+        underlyingRequest.outputStream.close();
+      } else {
+        stream.pipe(underlyingRequest.outputStream);
+      }
+    };
+
+    connection.onResponse = (response) {
+      var headers = <String>{};
+      response.headers.forEach((key, value) => headers[key] = value);
+
+      completer.complete(new StreamedResponse(
+          response.inputStream,
+          response.statusCode,
+          response.contentLength,
+          headers: headers,
+          isRedirect: response.isRedirect,
+          persistentConnection: response.persistentConnection,
+          reasonPhrase: response.reasonPhrase));
+    };
+
+    return completer.future;
+  }
+
+  /// 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();
+    _inner = null;
+  }
+}
diff --git a/pkg/http/lib/src/utils.dart b/pkg/http/lib/src/utils.dart
index 665ee1e..8431603 100644
--- a/pkg/http/lib/src/utils.dart
+++ b/pkg/http/lib/src/utils.dart
@@ -185,26 +185,3 @@
   }
   return nextElement(null);
 }
-
-/// Creates a temporary directory and passes its path to [fn]. Once the [Future]
-/// returned by [fn] completes, the temporary directory and all its contents
-/// will be deleted.
-Future withTempDir(Future fn(String path)) {
-  var tempDir;
-  var future = new Directory('').createTemp().chain((dir) {
-    tempDir = dir;
-    return fn(tempDir.path);
-  });
-  future.onComplete((_) => tempDir.delete(recursive: true));
-  return future;
-}
-
-/// Configures [future] so that its result (success or exception) is passed on
-/// to [completer].
-void chainToCompleter(Future future, Completer completer) {
-  future.handleException((e) {
-    completer.completeException(e);
-    return true;
-  });
-  future.then(completer.complete);
-}
diff --git a/pkg/http/test/request_test.dart b/pkg/http/test/request_test.dart
index 5c2d98c..319abfb 100644
--- a/pkg/http/test/request_test.dart
+++ b/pkg/http/test/request_test.dart
@@ -13,23 +13,16 @@
 
 void main() {
   test('.send', () {
-    print("This test is known to be flaky, please ignore "
-          "(debug prints below added by sgjesse@)");
-    print(".send test starting server...");
     startServer();
-    print(".send test server running");
 
     var request = new http.Request('POST', serverUrl);
     request.body = "hello";
     var future = request.send().chain((response) {
-      print(".send test response received");
       expect(response.statusCode, equals(200));
       return consumeInputStream(response.stream);
     }).transform((bytes) => new String.fromCharCodes(bytes));
     future.onComplete((_) {
-      print(".send test stopping server...");
       stopServer();
-      print(".send test server stopped");
     });
 
     expect(future, completion(parse(equals({
@@ -41,7 +34,6 @@
       },
       'body': 'hello'
     }))));
-    print(".send test started");
   });
 
   group('#contentLength', () {
diff --git a/pkg/oauth2/lib/oauth2.dart b/pkg/oauth2/lib/oauth2.dart
new file mode 100644
index 0000000..a7e9307
--- /dev/null
+++ b/pkg/oauth2/lib/oauth2.dart
@@ -0,0 +1,109 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// A client library for authenticating with a remote service via OAuth2 on
+/// behalf of a user, and making authorized HTTP requests with the user's OAuth2
+/// credentials.
+///
+/// OAuth2 allows a client (the program using this library) to access and
+/// manipulate a resource that's owned by a resource owner (the end user) and
+/// lives on a remote server. The client directs the resource owner to an
+/// authorization server (usually but not always the same as the server that
+/// hosts the resource), where the resource owner tells the authorization server
+/// to give the client an access token. This token serves as proof that the
+/// client has permission to access resources on behalf of the resource owner.
+///
+/// OAuth2 provides several different methods for the client to obtain
+/// authorization. At the time of writing, this library only supports the
+/// [AuthorizationCodeGrant] method, but further methods may be added in the
+/// future. The following example uses this method to authenticate, and assumes
+/// that the library is being used by a server-side application.
+///
+///     import 'dart:io'
+///     import 'dart:uri'
+///     import 'package:oauth2/oauth2.dart' as oauth2;
+///
+///     // These URLs are endpoints that are provided by the authorization
+///     // server. They're usually included in the server's documentation of its
+///     // OAuth2 API.
+///     final authorizationEndpoint =
+///         new Uri.fromString("http://example.com/oauth2/authorization");
+///     final tokenEndpoint =
+///         new Uri.fromString("http://example.com/oauth2/token");
+///     
+///     // The authorization server will issue each client a separate client
+///     // identifier and secret, which allows the server to tell which client
+///     // is accessing it. Some servers may also have an anonymous
+///     // identifier/secret pair that any client may use.
+///     //
+///     // Note that clients whose source code or binary executable is readily
+///     // available may not be able to make sure the client secret is kept a
+///     // secret. This is fine; OAuth2 servers generally won't rely on knowing
+///     // with certainty that a client is who it claims to be.
+///     final identifier = "my client identifier";
+///     final secret = "my client secret";
+///
+///     // This is a URL on your application's server. The authorization server
+///     // will redirect the resource owner here once they've authorized the
+///     // client. The redirection will include the authorization code in the
+///     // query parameters.
+///     final redirectUrl = new Uri.fromString(
+///         "http://my-site.com/oauth2-redirect");
+///     
+///     var credentialsFile = new File("~/.myapp/credentials.json");
+///     return credentialsFile.exists().chain((exists) {
+///       // If the OAuth2 credentials have already been saved from a previous
+///       // run, we just want to reload them.
+///       if (exists) {
+///         return credentialsFile.readAsText().transform((json) {
+///           var credentials = new oauth2.Credentials.fromJson(json);
+///           return new oauth2.Client(identifier, secret, credentials);
+///         });
+///       }
+///     
+///       // If we don't have OAuth2 credentials yet, we need to get the
+///       // resource owner to authorize us. We're assuming here that we're a
+///       // command-line application.
+///       var grant = new oauth2.AuthorizationCodeGrant(
+///           identifier, secret, authorizationEndpoint, tokenEndpoint);
+///     
+///       // Redirect the resource owner to the authorization URL. This will be
+///       // a URL on the authorization server (authorizationEndpoint with some
+///       // additional query parameters). Once the resource owner has
+///       // authorized, they'll be redirected to `redirectUrl` with an
+///       // authorization code.
+///       //
+///       // `redirect` is an imaginary function that redirects the resource
+///       // owner's browser.
+///       return redirect(grant.getAuthorizationUrl(redirectUrl)).chain((_) {
+///         // Another imaginary function that listens for a request to
+///         // `redirectUrl`.
+///         return listen(redirectUrl);
+///       }).transform((request) {
+///         // Once the user is redirected to `redirectUrl`, pass the query
+///         // parameters to the AuthorizationCodeGrant. It will validate them
+///         // and extract the authorization code to create a new Client.
+///         return grant.handleAuthorizationResponse(request.queryParameters);
+///       })
+///     }).chain((client) {
+///       // Once you have a Client, you can use it just like any other HTTP
+///       // client.
+///       return client.read("http://example.com/protected-resources.txt")
+///           .transform((result) {
+///         // Once we're done with the client, save the credentials file. This
+///         // ensures that if the credentials were automatically refreshed
+///         // while using the client, the new credentials are available for the
+///         // next run of the program.
+///         return credentialsFile.open(FileMode.WRITE).chain((file) {
+///           return file.writeString(client.credentials.toJson());
+///         }).chain((file) => file.close()).transform((_) => result);
+///       });
+///     }).then(print);
+library oauth2;
+
+export 'src/authorization_code_grant.dart';
+export 'src/client.dart';
+export 'src/credentials.dart';
+export 'src/authorization_exception.dart';
+export 'src/expiration_exception.dart';
diff --git a/pkg/oauth2/lib/src/authorization_code_grant.dart b/pkg/oauth2/lib/src/authorization_code_grant.dart
new file mode 100644
index 0000000..dcb36d06
--- /dev/null
+++ b/pkg/oauth2/lib/src/authorization_code_grant.dart
@@ -0,0 +1,258 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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 authorization_code_grant;
+
+import 'dart:uri';
+
+// TODO(nweiz): This should be a "package:" import. See issue 6745.
+import '../../../http/lib/http.dart' as http;
+
+import 'client.dart';
+import 'authorization_exception.dart';
+import 'handle_access_token_response.dart';
+import 'utils.dart';
+
+/// A class for obtaining credentials via an [authorization code grant][]. This
+/// method of authorization involves sending the resource owner to the
+/// authorization server where they will authorize the client. They're then
+/// redirected back to your server, along with an authorization code. This is
+/// used to obtain [Credentials] and create a fully-authorized [Client].
+///
+/// To use this class, you must first call [getAuthorizationUrl] to get the URL
+/// to which to redirect the resource owner. Then once they've been redirected
+/// back to your application, call [handleAuthorizationResponse] or
+/// [handleAuthorizationCode] to process the authorization server's response and
+/// construct a [Client].
+///
+/// [authorization code grant]: http://tools.ietf.org/html/draft-ietf-oauth-v2-31#section-4.1
+class AuthorizationCodeGrant {
+  /// An enum value for [_state] indicating that [getAuthorizationUrl] has not
+  /// yet been called for this grant.
+  static const _INITIAL_STATE = 0;
+
+  // An enum value for [_state] indicating that [getAuthorizationUrl] has been
+  // called but neither [handleAuthorizationResponse] nor
+  // [handleAuthorizationCode] has been called.
+  static const _AWAITING_RESPONSE_STATE = 1;
+
+  // An enum value for [_state] indicating that [getAuthorizationUrl] and either
+  // [handleAuthorizationResponse] or [handleAuthorizationCode] have been
+  // called.
+  static const _FINISHED_STATE = 2;
+
+  /// The client identifier for this client. The authorization server will issue
+  /// each client a separate client identifier and secret, which allows the
+  /// server to tell which client is accessing it. Some servers may also have an
+  /// anonymous identifier/secret pair that any client may use.
+  ///
+  /// This is usually global to the program using this library.
+  final String identifier;
+
+  /// The client secret for this client. The authorization server will issue
+  /// each client a separate client identifier and secret, which allows the
+  /// server to tell which client is accessing it. Some servers may also have an
+  /// anonymous identifier/secret pair that any client may use.
+  ///
+  /// This is usually global to the program using this library.
+  ///
+  /// Note that clients whose source code or binary executable is readily
+  /// available may not be able to make sure the client secret is kept a secret.
+  /// This is fine; OAuth2 servers generally won't rely on knowing with
+  /// certainty that a client is who it claims to be.
+  final String secret;
+
+  /// A URL provided by the authorization server that serves as the base for the
+  /// URL that the resource owner will be redirected to to authorize this
+  /// client. This will usually be listed in the authorization server's
+  /// OAuth2 API documentation.
+  final Uri authorizationEndpoint;
+
+  /// A URL provided by the authorization server that this library uses to
+  /// obtain long-lasting credentials. This will usually be listed in the
+  /// authorization server's OAuth2 API documentation.
+  final Uri tokenEndpoint;
+
+  /// The HTTP client used to make HTTP requests.
+  http.Client _httpClient;
+
+  /// The URL to which the resource owner will be redirected after they
+  /// authorize this client with the authorization server.
+  Uri _redirectEndpoint;
+
+  /// The scopes that the client is requesting access to.
+  List<String> _scopes;
+
+  /// An opaque string that users of this library may specify that will be
+  /// included in the response query parameters.
+  String _stateString;
+
+  /// The current state of the grant object. One of [_INITIAL_STATE],
+  /// [_AWAITING_RESPONSE_STATE], or [_FINISHED_STATE].
+  int _state = _INITIAL_STATE;
+
+  /// Creates a new grant.
+  ///
+  /// [httpClient] is used for all HTTP requests made by this grant, as well as
+  /// those of the [Client] is constructs.
+  AuthorizationCodeGrant(
+      this.identifier,
+      this.secret,
+      this.authorizationEndpoint,
+      this.tokenEndpoint,
+      {http.Client httpClient})
+    : _httpClient = httpClient == null ? new http.Client() : httpClient;
+
+  /// Returns the URL to which the resource owner should be redirected to
+  /// authorize this client. The resource owner will then be redirected to
+  /// [redirect], which should point to a server controlled by the client. This
+  /// redirect will have additional query parameters that should be passed to
+  /// [handleAuthorizationResponse].
+  ///
+  /// The specific permissions being requested from the authorization server may
+  /// be specified via [scopes]. The scope strings are specific to the
+  /// authorization server and may be found in its documentation. Note that you
+  /// may not be granted access to every scope you request; you may check the
+  /// [Credentials.scopes] field of [Client.credentials] to see which scopes you
+  /// were granted.
+  ///
+  /// An opaque [state] string may also be passed that will be present in the
+  /// query parameters provided to the redirect URL.
+  ///
+  /// It is a [StateError] to call this more than once.
+  Uri getAuthorizationUrl(Uri redirect,
+      {List<String> scopes: const <String>[], String state}) {
+    if (_state != _INITIAL_STATE) {
+      throw new StateError('The authorization URL has already been generated.');
+    }
+    _state = _AWAITING_RESPONSE_STATE;
+
+    this._redirectEndpoint = redirect;
+    this._scopes = scopes;
+    this._stateString = state;
+    var parameters = {
+      "response_type": "code",
+      "client_id": this.identifier,
+      "redirect_uri": redirect.toString()
+    };
+
+    if (state != null) parameters['state'] = state;
+    if (!scopes.isEmpty) parameters['scope'] = Strings.join(scopes, ' ');
+
+    return addQueryParameters(this.authorizationEndpoint, parameters);
+  }
+
+  /// Processes the query parameters added to a redirect from the authorization
+  /// server. Note that this "response" is not an HTTP response, but rather the
+  /// data passed to a server controlled by the client as query parameters on
+  /// the redirect URL.
+  ///
+  /// It is a [StateError] to call this more than once, to call it before
+  /// [getAuthorizationUrl] is called, or to call it after
+  /// [handleAuthorizationCode] is called.
+  ///
+  /// Throws [FormatError] if [parameters] is invalid according to the OAuth2
+  /// spec or if the authorization server otherwise provides invalid responses.
+  /// If `state` was passed to [getAuthorizationUrl], this will throw a
+  /// [FormatError] if the `state` parameter doesn't match the original value.
+  ///
+  /// Throws [AuthorizationException] if the authorization fails.
+  Future<Client> handleAuthorizationResponse(Map<String, String> parameters) {
+    return async.chain((_) {
+      if (_state == _INITIAL_STATE) {
+        throw new StateError(
+            'The authorization URL has not yet been generated.');
+      } else if (_state == _FINISHED_STATE) {
+        throw new StateError(
+            'The authorization code has already been received.');
+      }
+      _state = _FINISHED_STATE;
+
+      if (_stateString != null) {
+        if (!parameters.containsKey('state')) {
+          throw new FormatException('Invalid OAuth response for '
+              '"$authorizationEndpoint": parameter "state" expected to be '
+              '"$_stateString", was missing.');
+        } else if (parameters['state'] != _stateString) {
+          throw new FormatException('Invalid OAuth response for '
+              '"$authorizationEndpoint": parameter "state" expected to be '
+              '"$_stateString", was "${parameters['state']}".');
+        }
+      }
+
+      if (parameters.containsKey('error')) {
+        var description = parameters['error_description'];
+        var uriString = parameters['error_uri'];
+        var uri = uriString == null ? null : new Uri.fromString(uriString);
+        throw new AuthorizationException(parameters['error'], description, uri);
+      } else if (!parameters.containsKey('code')) {
+        throw new FormatException('Invalid OAuth response for '
+            '"$authorizationEndpoint": did not contain required parameter '
+            '"code".');
+      }
+
+      return _handleAuthorizationCode(parameters['code']);
+    });
+  }
+
+  /// Processes an authorization code directly. Usually
+  /// [handleAuthorizationResponse] is preferable to this method, since it
+  /// validates all of the query parameters. However, some authorization servers
+  /// allow the user to copy and paste an authorization code into a command-line
+  /// application, in which case this method must be used.
+  ///
+  /// It is a [StateError] to call this more than once, to call it before
+  /// [getAuthorizationUrl] is called, or to call it after
+  /// [handleAuthorizationCode] is called.
+  ///
+  /// Throws [FormatError] if the authorization server provides invalid
+  /// responses while retrieving credentials.
+  ///
+  /// Throws [AuthorizationException] if the authorization fails.
+  Future<Client> handleAuthorizationCode(String authorizationCode) {
+    return async.chain((_) {
+      if (_state == _INITIAL_STATE) {
+        throw new StateError(
+            'The authorization URL has not yet been generated.');
+      } else if (_state == _FINISHED_STATE) {
+        throw new StateError(
+            'The authorization code has already been received.');
+      }
+      _state = _FINISHED_STATE;
+
+      return _handleAuthorizationCode(authorizationCode);
+    });
+  }
+
+  /// This works just like [handleAuthorizationCode], except it doesn't validate
+  /// the state beforehand.
+  Future<Client> _handleAuthorizationCode(String authorizationCode) {
+    var startTime = new Date.now();
+    return _httpClient.post(this.tokenEndpoint, fields: {
+      "grant_type": "authorization_code",
+      "code": authorizationCode,
+      "redirect_uri": this._redirectEndpoint.toString(),
+      // TODO(nweiz): the spec recommends that HTTP basic auth be used in
+      // preference to form parameters, but Google doesn't support that. Should
+      // it be configurable?
+      "client_id": this.identifier,
+      "client_secret": this.secret
+    }).transform((response) {
+      var credentials = handleAccessTokenResponse(
+          response, tokenEndpoint, startTime, _scopes);
+      return new Client(
+          this.identifier, this.secret, credentials, httpClient: _httpClient);
+    });
+  }
+
+  /// Closes the grant and frees its resources.
+  ///
+  /// This will close the underlying HTTP client, which is shared by the
+  /// [Client] created by this grant, so it's not safe to close the grant and
+  /// continue using the client.
+  void close() {
+    if (_httpClient != null) _httpClient.close();
+    _httpClient = null;
+  }
+}
diff --git a/pkg/oauth2/lib/src/authorization_exception.dart b/pkg/oauth2/lib/src/authorization_exception.dart
new file mode 100644
index 0000000..1062aa9
--- /dev/null
+++ b/pkg/oauth2/lib/src/authorization_exception.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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 authorization_exception;
+
+import 'dart:io';
+import 'dart:uri';
+
+/// An exception raised when OAuth2 authorization fails.
+class AuthorizationException implements Exception {
+  /// The name of the error. Possible names are enumerated in [the spec][].
+  ///
+  /// [the spec]: http://tools.ietf.org/html/draft-ietf-oauth-v2-31#section-5.2
+  final String error;
+
+  /// The description of the error, provided by the server. Defaults to null.
+  final String description;
+
+  /// A URI for a page that describes the error in more detail, provided by the
+  /// server. Defaults to null.
+  final Uri uri;
+
+  /// Creates an AuthorizationException.
+  AuthorizationException(this.error, this.description, this.uri);
+
+  /// Provides a string description of the AuthorizationException.
+  String toString() {
+    var header = 'OAuth authorization error ($error)';
+    if (description != null) {
+      header = '$header: $description';
+    } else if (uri != null) {
+      header = '$header: $uri';
+    }
+    return '$header.';
+  }
+}
diff --git a/pkg/oauth2/lib/src/client.dart b/pkg/oauth2/lib/src/client.dart
new file mode 100644
index 0000000..7322afa
--- /dev/null
+++ b/pkg/oauth2/lib/src/client.dart
@@ -0,0 +1,124 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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 client;
+
+import 'dart:uri';
+
+import '../../../http/lib/http.dart' as http;
+
+import 'credentials.dart';
+import 'expiration_exception.dart';
+import 'utils.dart';
+
+// TODO(nweiz): Add an onCredentialsRefreshed event once we have some event
+// infrastructure.
+/// An OAuth2 client. This acts as a drop-in replacement for an [http.Client],
+/// while sending OAuth2 authorization credentials along with each request.
+///
+/// The client also automatically refreshes its credentials if possible. When it
+/// makes a request, if its credentials are expired, it will first refresh them.
+/// This means that any request may throw an [AuthorizationException] if the
+/// refresh is not authorized for some reason, a [FormatException] if the
+/// authorization server provides ill-formatted responses, or an
+/// [ExpirationException] if the credentials are expired and can't be refreshed.
+///
+/// Currently this client doesn't attempt to identify errors from the resource
+/// server that are caused by authentication failure. However, it may throw
+/// [AuthorizationException]s for such errors in the future.
+///
+/// If you already have a set of [Credentials], you can construct a [Client]
+/// directly. However, in order to first obtain the credentials, you must
+/// authorize. At the time of writing, the only authorization method this
+/// library supports is [AuthorizationCodeGrant].
+class Client extends http.BaseClient {
+  /// The client identifier for this client. The authorization server will issue
+  /// each client a separate client identifier and secret, which allows the
+  /// server to tell which client is accessing it. Some servers may also have an
+  /// anonymous identifier/secret pair that any client may use.
+  ///
+  /// This is usually global to the program using this library.
+  final String identifier;
+
+  /// The client secret for this client. The authorization server will issue
+  /// each client a separate client identifier and secret, which allows the
+  /// server to tell which client is accessing it. Some servers may also have an
+  /// anonymous identifier/secret pair that any client may use.
+  ///
+  /// This is usually global to the program using this library.
+  ///
+  /// Note that clients whose source code or binary executable is readily
+  /// available may not be able to make sure the client secret is kept a secret.
+  /// This is fine; OAuth2 servers generally won't rely on knowing with
+  /// certainty that a client is who it claims to be.
+  final String secret;
+
+  /// The credentials this client uses to prove to the resource server that it's
+  /// authorized. This may change from request to request as the credentials
+  /// expire and the client refreshes them automatically.
+  Credentials get credentials => _credentials;
+  Credentials _credentials;
+
+  /// The underlying HTTP client.
+  http.Client _httpClient;
+
+  /// Creates a new client from a pre-existing set of credentials. When
+  /// authorizing a client for the first time, you should use
+  /// [AuthorizationCodeGrant] instead of constructing a [Client] directly.
+  ///
+  /// [httpClient] is the underlying client that this forwards requests to after
+  /// adding authorization credentials to them.
+  Client(
+      this.identifier,
+      this.secret,
+      this._credentials,
+      {http.Client httpClient})
+    : _httpClient = httpClient == null ? new http.Client() : httpClient;
+
+  /// Sends an HTTP request with OAuth2 authorization credentials attached. This
+  /// will also automatically refresh this client's [Credentials] before sending
+  /// the request if necessary.
+  Future<http.StreamedResponse> send(http.BaseRequest request) {
+    return async.chain((_) {
+      if (!credentials.isExpired) return new Future.immediate(null);
+      if (!credentials.canRefresh) throw new ExpirationException(credentials);
+      return refreshCredentials();
+    }).chain((_) {
+      request.headers['authorization'] = "Bearer ${credentials.accessToken}";
+      return _httpClient.send(request);
+    });
+    // TODO(nweiz): parse 401 errors that are caused by OAuth errors here.
+  }
+
+  /// Explicitly refreshes this client's credentials. Returns this client.
+  ///
+  /// This will throw a [StateError] if the [Credentials] can't be refreshed, an
+  /// [AuthorizationException] if refreshing the credentials fails, or a
+  /// [FormatError] if the authorization server returns invalid responses.
+  ///
+  /// You may request different scopes than the default by passing in
+  /// [newScopes]. These must be a subset of the scopes in the
+  /// [Credentials.scopes] field of [Client.credentials].
+  Future<Client> refreshCredentials([List<String> newScopes]) {
+    return async.chain((_) {
+      if (!credentials.canRefresh) {
+        var prefix = "OAuth credentials";
+        if (credentials.isExpired) prefix = "$prefix have expired and";
+        throw new StateError("$prefix can't be refreshed.");
+      }
+
+      return credentials.refresh(identifier, secret,
+          newScopes: newScopes, httpClient: _httpClient);
+    }).transform((credentials) {
+      _credentials = credentials;
+      return this;
+    });
+  }
+
+  /// Closes this client and its underlying HTTP client.
+  void close() {
+    if (_httpClient != null) _httpClient.close();
+    _httpClient = null;
+  }
+}
diff --git a/pkg/oauth2/lib/src/credentials.dart b/pkg/oauth2/lib/src/credentials.dart
new file mode 100644
index 0000000..89af777
--- /dev/null
+++ b/pkg/oauth2/lib/src/credentials.dart
@@ -0,0 +1,191 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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 credentials;
+
+import 'dart:json';
+import 'dart:uri';
+
+import '../../../http/lib/http.dart' as http;
+import 'handle_access_token_response.dart';
+import 'utils.dart';
+
+/// Credentials that prove that a client is allowed to access a resource on the
+/// resource owner's behalf. These credentials are long-lasting and can be
+/// safely persisted across multiple runs of the program.
+///
+/// Many authorization servers will attach an expiration date to a set of
+/// credentials, along with a token that can be used to refresh the credentials
+/// once they've expired. The [Client] will automatically refresh its
+/// credentials when necessary. It's also possible to explicitly refresh them
+/// via [Client.refreshCredentials] or [Credentials.refresh].
+///
+/// Note that a given set of credentials can only be refreshed once, so be sure
+/// to save the refreshed credentials for future use.
+class Credentials {
+  /// The token that is sent to the resource server to prove the authorization
+  /// of a client.
+  final String accessToken;
+
+  /// The token that is sent to the authorization server to refresh the
+  /// credentials. This is optional.
+  final String refreshToken;
+
+  /// The URL of the authorization server endpoint that's used to refresh the
+  /// credentials. This is optional.
+  final Uri tokenEndpoint;
+
+  /// The specific permissions being requested from the authorization server.
+  /// The scope strings are specific to the authorization server and may be
+  /// found in its documentation.
+  final List<String> scopes;
+
+  /// The date at which these credentials will expire. This is likely to be a
+  /// few seconds earlier than the server's idea of the expiration date.
+  final Date expiration;
+
+  /// Whether or not these credentials have expired. Note that it's possible the
+  /// credentials will expire shortly after this is called. However, since the
+  /// client's expiration date is kept a few seconds earlier than the server's,
+  /// there should be enough leeway to rely on this.
+  bool get isExpired => expiration != null && new Date.now() > expiration;
+
+  /// Whether it's possible to refresh these credentials.
+  bool get canRefresh => refreshToken != null && tokenEndpoint != null;
+
+  /// Creates a new set of credentials.
+  ///
+  /// This class is usually not constructed directly; rather, it's accessed via
+  /// [Client.credentials] after a [Client] is created by
+  /// [AuthorizationCodeGrant]. Alternately, it may be loaded from a serialized
+  /// form via [Credentials.fromJson].
+  Credentials(
+      this.accessToken,
+      [this.refreshToken,
+       this.tokenEndpoint,
+       this.scopes,
+       this.expiration]);
+
+  /// Loads a set of credentials from a JSON-serialized form. Throws
+  /// [FormatException] if the JSON is incorrectly formatted.
+  factory Credentials.fromJson(String json) {
+    void validate(bool condition, String message) {
+      if (condition) return;
+      throw new FormatException(
+          "Failed to load credentials: $message.\n\n$json");
+    }
+
+    var parsed;
+    try {
+      parsed = JSON.parse(json);
+    } catch (e) {
+      // TODO(nweiz): narrow this catch clause once issue 6775 is fixed.
+      validate(false, 'invalid JSON');
+    }
+
+    validate(parsed is Map, 'was not a JSON map');
+    validate(parsed.containsKey('accessToken'),
+        'did not contain required field "accessToken"');
+    validate(parsed['accessToken'] is String,
+        'required field "accessToken" was not a string, was '
+        '${parsed["accessToken"]}');
+
+
+    for (var stringField in ['refreshToken', 'tokenEndpoint']) {
+      var value = parsed[stringField];
+      validate(value == null || value is String,
+          'field "$stringField" was not a string, was "$value"');
+    }
+
+    var scopes = parsed['scopes'];
+    validate(scopes == null || scopes is List,
+        'field "scopes" was not a list, was "$scopes"');
+
+    var tokenEndpoint = parsed['tokenEndpoint'];
+    if (tokenEndpoint != null) {
+      tokenEndpoint = new Uri.fromString(tokenEndpoint);
+    }
+    var expiration = parsed['expiration'];
+    if (expiration != null) {
+      validate(expiration is int,
+          'field "expiration" was not an int, was "$expiration"');
+      expiration = new Date.fromMillisecondsSinceEpoch(expiration);
+    }
+
+    return new Credentials(
+        parsed['accessToken'],
+        parsed['refreshToken'],
+        tokenEndpoint,
+        scopes,
+        expiration);
+  }
+
+  /// Serializes a set of credentials to JSON. Nothing is guaranteed about the
+  /// output except that it's valid JSON and compatible with
+  /// [Credentials.toJson].
+  String toJson() => JSON.stringify({
+    'accessToken': accessToken,
+    'refreshToken': refreshToken,
+    'tokenEndpoint': tokenEndpoint == null ? null : tokenEndpoint.toString(),
+    'scopes': scopes,
+    'expiration': expiration == null ? null : expiration.millisecondsSinceEpoch
+  });
+
+  /// Returns a new set of refreshed credentials. See [Client.identifier] and
+  /// [Client.secret] for explanations of those parameters.
+  ///
+  /// You may request different scopes than the default by passing in
+  /// [newScopes]. These must be a subset of [scopes].
+  ///
+  /// This will throw a [StateError] if these credentials can't be refreshed, an
+  /// [AuthorizationException] if refreshing the credentials fails, or a
+  /// [FormatError] if the authorization server returns invalid responses.
+  Future<Credentials> refresh(
+      String identifier,
+      String secret,
+      {List<String> newScopes,
+       http.Client httpClient}) {
+    var scopes = this.scopes;
+    if (newScopes != null) scopes = newScopes;
+    if (scopes == null) scopes = <String>[];
+    if (httpClient == null) httpClient = new http.Client();
+
+    var startTime = new Date.now();
+    return async.chain((_) {
+      if (refreshToken == null) {
+        throw new StateError("Can't refresh credentials without a refresh "
+            "token.");
+      } else if (tokenEndpoint == null) {
+        throw new StateError("Can't refresh credentials without a token "
+            "endpoint.");
+      }
+
+      var fields = {
+        "grant_type": "refresh_token",
+        "refresh_token": refreshToken,
+        // TODO(nweiz): the spec recommends that HTTP basic auth be used in
+        // preference to form parameters, but Google doesn't support that.
+        // Should it be configurable?
+        "client_id": identifier,
+        "client_secret": secret
+      };
+      if (!scopes.isEmpty) fields["scope"] = Strings.join(scopes, ' ');
+
+      return httpClient.post(tokenEndpoint, fields: fields);
+    }).transform((response) {
+      return handleAccessTokenResponse(
+          response, tokenEndpoint, startTime, scopes);
+    }).transform((credentials) {
+      // The authorization server may issue a new refresh token. If it doesn't,
+      // we should re-use the one we already have.
+      if (credentials.refreshToken != null) return credentials;
+      return new Credentials(
+          credentials.accessToken,
+          this.refreshToken,
+          credentials.tokenEndpoint,
+          credentials.scopes,
+          credentials.expiration);
+    });
+  }
+}
diff --git a/pkg/oauth2/lib/src/expiration_exception.dart b/pkg/oauth2/lib/src/expiration_exception.dart
new file mode 100644
index 0000000..8c8ad1f
--- /dev/null
+++ b/pkg/oauth2/lib/src/expiration_exception.dart
@@ -0,0 +1,22 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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 expiration_exception;
+
+import 'dart:io';
+
+import 'credentials.dart';
+
+/// An exception raised when attempting to use expired OAuth2 credentials.
+class ExpirationException implements Exception {
+  /// The expired credentials.
+  final Credentials credentials;
+
+  /// Creates an ExpirationException.
+  ExpirationException(this.credentials);
+
+  /// Provides a string description of the ExpirationException.
+  String toString() =>
+    "OAuth2 credentials have expired and can't be refreshed.";
+}
diff --git a/pkg/oauth2/lib/src/handle_access_token_response.dart b/pkg/oauth2/lib/src/handle_access_token_response.dart
new file mode 100644
index 0000000..cb08d8f
--- /dev/null
+++ b/pkg/oauth2/lib/src/handle_access_token_response.dart
@@ -0,0 +1,145 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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 handle_access_token_response;
+
+import 'dart:io';
+import 'dart:json';
+import 'dart:uri';
+
+import '../../../http/lib/http.dart' as http;
+
+import 'credentials.dart';
+import 'authorization_exception.dart';
+
+/// The amount of time, in seconds, to add as a "grace period" for credential
+/// expiration. This allows credential expiration checks to remain valid for a
+/// reasonable amount of time.
+const _EXPIRATION_GRACE = 10;
+
+/// Handles a response from the authorization server that contains an access
+/// token. This response format is common across several different components of
+/// the OAuth2 flow.
+Credentials handleAccessTokenResponse(
+    http.Response response,
+    Uri tokenEndpoint,
+    Date startTime,
+    List<String> scopes) {
+  if (response.statusCode != 200) _handleErrorResponse(response, tokenEndpoint);
+
+  void validate(bool condition, String message) =>
+    _validate(response, tokenEndpoint, condition, message);
+
+  var contentType = response.headers['content-type'];
+  if (contentType != null) {
+    contentType = new ContentType.fromString(contentType);
+  }
+  validate(contentType != null && contentType.value == "application/json",
+      'content-type was "$contentType", expected "application/json"');
+
+  var parameters;
+  try {
+    parameters = JSON.parse(response.body);
+  } catch (e) {
+    // TODO(nweiz): narrow this catch clause once issue 6775 is fixed.
+    validate(false, 'invalid JSON');
+  }
+
+  for (var requiredParameter in ['access_token', 'token_type']) {
+    validate(parameters.containsKey(requiredParameter),
+        'did not contain required parameter "$requiredParameter"');
+    validate(parameters[requiredParameter] is String,
+        'required parameter "$requiredParameter" was not a string, was '
+        '"${parameters[requiredParameter]}"');
+  }
+
+  // TODO(nweiz): support the "mac" token type
+  // (http://tools.ietf.org/html/draft-ietf-oauth-v2-http-mac-01)
+  validate(parameters['token_type'].toLowerCase() == 'bearer',
+      '"$tokenEndpoint": unknown token type "${parameters['token_type']}"');
+
+  var expiresIn = parameters['expires_in'];
+  validate(expiresIn == null || expiresIn is int,
+      'parameter "expires_in" was not an int, was "$expiresIn"');
+
+  for (var name in ['refresh_token', 'scope']) {
+    var value = parameters[name];
+    validate(value == null || value is String,
+        'parameter "$name" was not a string, was "$value"');
+  }
+
+  var scope = parameters['scope'];
+  if (scope != null) scopes = scope.split(" ");
+
+  var expiration = expiresIn == null ? null :
+      startTime.add(new Duration(seconds: expiresIn - _EXPIRATION_GRACE));
+
+  return new Credentials(
+      parameters['access_token'],
+      parameters['refresh_token'],
+      tokenEndpoint,
+      scopes,
+      expiration);
+}
+
+/// Throws the appropriate exception for an error response from the
+/// authorization server.
+void _handleErrorResponse(http.Response response, Uri tokenEndpoint) {
+  void validate(bool condition, String message) =>
+    _validate(response, tokenEndpoint, condition, message);
+
+  // OAuth2 mandates a 400 or 401 response code for access token error
+  // responses. If it's not a 400 reponse, the server is either broken or
+  // off-spec.
+  if (response.statusCode != 400 && response.statusCode != 401) {
+    var reason = '';
+    if (response.reasonPhrase != null && !response.reasonPhrase.isEmpty) {
+      ' ${response.reasonPhrase}';
+    }
+    throw new FormatException('OAuth request for "$tokenEndpoint" failed '
+        'with status ${response.statusCode}$reason.\n\n${response.body}');
+  }
+
+  var contentType = response.headers['content-type'];
+  if (contentType != null) {
+    contentType = new ContentType.fromString(contentType);
+  }
+  validate(contentType != null && contentType.value == "application/json",
+      'content-type was "$contentType", expected "application/json"');
+
+  var parameters;
+  try {
+    parameters = JSON.parse(response.body);
+  } catch (e) {
+    // TODO(nweiz): narrow this catch clause once issue 6775 is fixed.
+    validate(false, 'invalid JSON');
+  }
+
+  validate(parameters.containsKey('error'),
+      'did not contain required parameter "error"');
+  validate(parameters["error"] is String,
+      'required parameter "error" was not a string, was '
+      '"${parameters["error"]}"');
+
+  for (var name in ['error_description', 'error_uri']) {
+    var value = parameters[name];
+    validate(value == null || value is String,
+        'parameter "$name" was not a string, was "$value"');
+  }
+
+  var description = parameters['error_description'];
+  var uriString = parameters['error_uri'];
+  var uri = uriString == null ? null : new Uri.fromString(uriString);
+  throw new AuthorizationException(parameters['error'], description, uri);
+}
+
+void _validate(
+    http.Response response,
+    Uri tokenEndpoint,
+    bool condition,
+    String message) {
+  if (condition) return;
+  throw new FormatException('Invalid OAuth response for "$tokenEndpoint": '
+      '$message.\n\n${response.body}');
+}
diff --git a/pkg/oauth2/lib/src/utils.dart b/pkg/oauth2/lib/src/utils.dart
new file mode 100644
index 0000000..583a5bc
--- /dev/null
+++ b/pkg/oauth2/lib/src/utils.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.
+
+library utils;
+
+import 'dart:uri';
+import 'dart:isolate';
+import 'dart:crypto';
+
+/// 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);
+
+/// Decode a URL-encoded string. Unlike [decodeUriComponent], this includes
+/// replacing `+` with ` `.
+String urlDecode(String encoded) =>
+  decodeUriComponent(encoded.replaceAll("+", " "));
+
+/// Like [String.split], but only splits on the first occurrence of the pattern.
+/// This will always return a list of two elements or fewer.
+List<String> split1(String toSplit, String pattern) {
+  if (toSplit.isEmpty) return <String>[];
+
+  var index = toSplit.indexOf(pattern);
+  if (index == -1) return [toSplit];
+  return [toSplit.substring(0, index),
+      toSplit.substring(index + pattern.length)];
+}
+
+/// Returns a [Future] that asynchronously completes to `null`.
+Future get async {
+  var completer = new Completer();
+  new Timer(0, (_) => completer.complete(null));
+  return completer.future;
+}
diff --git a/pkg/oauth2/test/authorization_code_grant_test.dart b/pkg/oauth2/test/authorization_code_grant_test.dart
new file mode 100644
index 0000000..c4ccc21
--- /dev/null
+++ b/pkg/oauth2/test/authorization_code_grant_test.dart
@@ -0,0 +1,196 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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 authorization_code_grant_test;
+
+import 'dart:io';
+import 'dart:json';
+import 'dart:uri';
+
+import '../../unittest/lib/unittest.dart';
+import '../../http/lib/http.dart' as http;
+import '../../http/lib/testing.dart';
+import '../lib/oauth2.dart' as oauth2;
+import 'utils.dart';
+
+final redirectUrl = new Uri.fromString('http://example.com/redirect');
+
+ExpectClient client;
+
+oauth2.AuthorizationCodeGrant grant;
+
+void createGrant() {
+  client = new ExpectClient();
+  grant = new oauth2.AuthorizationCodeGrant(
+      'identifier',
+      'secret',
+      new Uri.fromString('https://example.com/authorization'),
+      new Uri.fromString('https://example.com/token'),
+      httpClient: client);
+}
+
+void main() {
+  group('.getAuthorizationUrl', () {
+    setUp(createGrant);
+
+    test('builds the correct URL', () {
+      expect(grant.getAuthorizationUrl(redirectUrl).toString(),
+          equals('https://example.com/authorization'
+              '?response_type=code'
+              '&client_id=identifier'
+              '&redirect_uri=http%3A%2F%2Fexample.com%2Fredirect'));
+    });
+
+    test('builds the correct URL with scopes', () {
+      var authorizationUrl = grant.getAuthorizationUrl(
+          redirectUrl, scopes: ['scope', 'other/scope']);
+      expect(authorizationUrl.toString(),
+          equals('https://example.com/authorization'
+              '?response_type=code'
+              '&client_id=identifier'
+              '&redirect_uri=http%3A%2F%2Fexample.com%2Fredirect'
+              '&scope=scope%20other%2Fscope'));
+    });
+
+    test('builds the correct URL with state', () {
+      var authorizationUrl = grant.getAuthorizationUrl(
+          redirectUrl, state: 'state');
+      expect(authorizationUrl.toString(),
+          equals('https://example.com/authorization'
+              '?response_type=code'
+              '&client_id=identifier'
+              '&redirect_uri=http%3A%2F%2Fexample.com%2Fredirect'
+              '&state=state'));
+    });
+
+    test('merges with existing query parameters', () {
+      grant = new oauth2.AuthorizationCodeGrant(
+          'identifier',
+          'secret',
+          new Uri.fromString('https://example.com/authorization?query=value'),
+          new Uri.fromString('https://example.com/token'),
+          httpClient: client);
+
+      var authorizationUrl = grant.getAuthorizationUrl(redirectUrl);
+      expect(authorizationUrl.toString(),
+          equals('https://example.com/authorization'
+              '?query=value'
+              '&response_type=code'
+              '&client_id=identifier'
+              '&redirect_uri=http%3A%2F%2Fexample.com%2Fredirect'));
+    });
+
+    test("can't be called twice", () {
+      grant.getAuthorizationUrl(redirectUrl);
+      expect(() => grant.getAuthorizationUrl(redirectUrl), throwsStateError);
+    });
+  });
+
+  group('.handleAuthorizationResponse', () {
+    setUp(createGrant);
+
+    test("can't be called before .getAuthorizationUrl", () {
+      expect(grant.handleAuthorizationResponse({}), throwsStateError);
+    });
+
+    test("can't be called twice", () {
+      grant.getAuthorizationUrl(redirectUrl);
+      grant.handleAuthorizationResponse({'code': 'auth code'});
+      expect(grant.handleAuthorizationResponse({'code': 'auth code'}),
+          throwsStateError);
+    });
+
+    test('must have a state parameter if the authorization URL did', () {
+      grant.getAuthorizationUrl(redirectUrl, state: 'state');
+      expect(grant.handleAuthorizationResponse({'code': 'auth code'}),
+          throwsFormatException);
+    });
+
+    test('must have the same state parameter the authorization URL did', () {
+      grant.getAuthorizationUrl(redirectUrl, state: 'state');
+      expect(grant.handleAuthorizationResponse({
+        'code': 'auth code',
+        'state': 'other state'
+      }), throwsFormatException);
+    });
+
+    test('must have a code parameter', () {
+      grant.getAuthorizationUrl(redirectUrl);
+      expect(grant.handleAuthorizationResponse({}), throwsFormatException);
+    });
+
+    test('with an error parameter throws an AuthorizationException', () {
+      grant.getAuthorizationUrl(redirectUrl);
+      expect(grant.handleAuthorizationResponse({'error': 'invalid_request'}),
+          throwsAuthorizationException);
+    });
+
+    test('sends an authorization code request', () {
+      grant.getAuthorizationUrl(redirectUrl);
+      client.expectRequest((request) {
+        expect(request.method, equals('POST'));
+        expect(request.url.toString(), equals(grant.tokenEndpoint.toString()));
+        expect(request.bodyFields, equals({
+          'grant_type': 'authorization_code',
+          'code': 'auth code',
+          'redirect_uri': redirectUrl.toString(),
+          'client_id': 'identifier',
+          'client_secret': 'secret'
+        }));
+
+        return new Future.immediate(new http.Response(JSON.stringify({
+          'access_token': 'access token',
+          'token_type': 'bearer',
+        }), 200, headers: {'content-type': 'application/json'}));
+      });
+
+      expect(grant.handleAuthorizationResponse({'code': 'auth code'}),
+          completion(predicate((client) {
+            expect(client.credentials.accessToken, equals('access token'));
+            return true;
+          })));
+    });
+  });
+
+  group('.handleAuthorizationCode', () {
+    setUp(createGrant);
+
+    test("can't be called before .getAuthorizationUrl", () {
+      expect(grant.handleAuthorizationCode('auth code'), throwsStateError);
+    });
+
+    test("can't be called twice", () {
+      grant.getAuthorizationUrl(redirectUrl);
+      grant.handleAuthorizationCode('auth code');
+      expect(grant.handleAuthorizationCode('auth code'),
+          throwsStateError);
+    });
+
+    test('sends an authorization code request', () {
+      grant.getAuthorizationUrl(redirectUrl);
+      client.expectRequest((request) {
+        expect(request.method, equals('POST'));
+        expect(request.url.toString(), equals(grant.tokenEndpoint.toString()));
+        expect(request.bodyFields, equals({
+          'grant_type': 'authorization_code',
+          'code': 'auth code',
+          'redirect_uri': redirectUrl.toString(),
+          'client_id': 'identifier',
+          'client_secret': 'secret'
+        }));
+
+        return new Future.immediate(new http.Response(JSON.stringify({
+          'access_token': 'access token',
+          'token_type': 'bearer',
+        }), 200, headers: {'content-type': 'application/json'}));
+      });
+
+      expect(grant.handleAuthorizationCode('auth code'),
+          completion(predicate((client) {
+            expect(client.credentials.accessToken, equals('access token'));
+            return true;
+          })));
+    });
+  });
+}
diff --git a/pkg/oauth2/test/client_test.dart b/pkg/oauth2/test/client_test.dart
new file mode 100644
index 0000000..94b7920
--- /dev/null
+++ b/pkg/oauth2/test/client_test.dart
@@ -0,0 +1,120 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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 client_test;
+
+import 'dart:io';
+import 'dart:json';
+import 'dart:uri';
+
+import '../../unittest/lib/unittest.dart';
+import '../../http/lib/http.dart' as http;
+import '../lib/oauth2.dart' as oauth2;
+import 'utils.dart';
+
+final Uri requestUri = new Uri.fromString("http://example.com/resource");
+
+final Uri tokenEndpoint = new Uri.fromString('http://example.com/token');
+
+ExpectClient httpClient;
+
+void createHttpClient() {
+  httpClient = new ExpectClient();
+}
+
+void main() {
+  group('with expired credentials', () {
+    setUp(createHttpClient);
+
+    test("that can't be refreshed throws an ExpirationException on send", () {
+      var expiration = new Date.now().subtract(new Duration(hours: 1));
+      var credentials = new oauth2.Credentials(
+          'access token', null, null, [], expiration);
+      var client = new oauth2.Client('identifier', 'secret', credentials,
+          httpClient: httpClient);
+
+      expect(client.get(requestUri), throwsExpirationException);
+    });
+
+    test("that can be refreshed refreshes the credentials and sends the "
+        "request", () {
+      var expiration = new Date.now().subtract(new Duration(hours: 1));
+      var credentials = new oauth2.Credentials(
+          'access token', 'refresh token', tokenEndpoint, [], expiration);
+      var client = new oauth2.Client('identifier', 'secret', credentials,
+          httpClient: httpClient);
+
+      httpClient.expectRequest((request) {
+        expect(request.method, equals('POST'));
+        expect(request.url.toString(), equals(tokenEndpoint.toString()));
+        return new Future.immediate(new http.Response(JSON.stringify({
+          'access_token': 'new access token',
+          'token_type': 'bearer'
+        }), 200, headers: {'content-type': 'application/json'}));
+      });
+
+      httpClient.expectRequest((request) {
+        expect(request.method, equals('GET'));
+        expect(request.url.toString(), equals(requestUri.toString()));
+        expect(request.headers['authorization'],
+            equals('Bearer new access token'));
+
+        return new Future.immediate(new http.Response('good job', 200));
+      });
+
+      expect(client.read(requestUri).transform((_) {
+        expect(client.credentials.accessToken, equals('new access token'));
+      }), completes);
+    });
+  });
+
+  group('with valid credentials', () {
+    setUp(createHttpClient);
+
+    test("sends a request with bearer authorization", () {
+      var credentials = new oauth2.Credentials('access token');
+      var client = new oauth2.Client('identifier', 'secret', credentials,
+          httpClient: httpClient);
+
+      httpClient.expectRequest((request) {
+        expect(request.method, equals('GET'));
+        expect(request.url.toString(), equals(requestUri.toString()));
+        expect(request.headers['authorization'],
+            equals('Bearer access token'));
+
+        return new Future.immediate(new http.Response('good job', 200));
+      });
+
+      expect(client.read(requestUri), completion(equals('good job')));
+    });
+
+    test("can manually refresh the credentials", () {
+      var credentials = new oauth2.Credentials(
+          'access token', 'refresh token', tokenEndpoint);
+      var client = new oauth2.Client('identifier', 'secret', credentials,
+          httpClient: httpClient);
+
+      httpClient.expectRequest((request) {
+        expect(request.method, equals('POST'));
+        expect(request.url.toString(), equals(tokenEndpoint.toString()));
+        return new Future.immediate(new http.Response(JSON.stringify({
+          'access_token': 'new access token',
+          'token_type': 'bearer'
+        }), 200, headers: {'content-type': 'application/json'}));
+      });
+
+      expect(client.refreshCredentials().transform((_) {
+        expect(client.credentials.accessToken, equals('new access token'));
+      }), completes);
+    });
+
+    test("without a refresh token can't manually refresh the credentials", () {
+      var credentials = new oauth2.Credentials('access token');
+      var client = new oauth2.Client('identifier', 'secret', credentials,
+          httpClient: httpClient);
+
+      expect(client.refreshCredentials(), throwsStateError);
+    });
+  });
+}
diff --git a/pkg/oauth2/test/credentials_test.dart b/pkg/oauth2/test/credentials_test.dart
new file mode 100644
index 0000000..5faf2d0
--- /dev/null
+++ b/pkg/oauth2/test/credentials_test.dart
@@ -0,0 +1,174 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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 credentials_test;
+
+import 'dart:io';
+import 'dart:json';
+import 'dart:uri';
+
+import '../../unittest/lib/unittest.dart';
+import '../../http/lib/http.dart' as http;
+import '../lib/oauth2.dart' as oauth2;
+import 'utils.dart';
+
+final Uri tokenEndpoint = new Uri.fromString('http://example.com/token');
+
+ExpectClient httpClient;
+
+void main() {
+  setUp(() => httpClient = new ExpectClient());
+
+  test('is not expired if no expiration exists', () {
+    var credentials = new oauth2.Credentials('access token');
+    expect(credentials.isExpired, isFalse);
+  });
+
+  test('is not expired if the expiration is in the future', () {
+    var expiration = new Date.now().add(new Duration(hours: 1));
+    var credentials = new oauth2.Credentials(
+        'access token', null, null, null, expiration);
+    expect(credentials.isExpired, isFalse);
+  });
+
+  test('is expired if the expiration is in the past', () {
+    var expiration = new Date.now().subtract(new Duration(hours: 1));
+    var credentials = new oauth2.Credentials(
+        'access token', null, null, null, expiration);
+    expect(credentials.isExpired, isTrue);
+  });
+
+  test("can't refresh without a refresh token", () {
+    var credentials = new oauth2.Credentials(
+        'access token', null, tokenEndpoint);
+    expect(credentials.canRefresh, false);
+    expect(credentials.refresh('identifier', 'secret', httpClient: httpClient),
+        throwsStateError);
+  });
+
+  test("can't refresh without a token endpoint", () {
+    var credentials = new oauth2.Credentials('access token', 'refresh token');
+    expect(credentials.canRefresh, false);
+    expect(credentials.refresh('identifier', 'secret', httpClient: httpClient),
+        throwsStateError);
+  });
+
+  test("can refresh with a refresh token and a token endpoint", () {
+    var credentials = new oauth2.Credentials(
+        'access token', 'refresh token', tokenEndpoint, ['scope1', 'scope2']);
+    expect(credentials.canRefresh, true);
+
+    httpClient.expectRequest((request) {
+      expect(request.method, equals('POST'));
+      expect(request.url.toString(), equals(tokenEndpoint.toString()));
+      expect(request.bodyFields, equals({
+        "grant_type": "refresh_token",
+        "refresh_token": "refresh token",
+        "scope": "scope1 scope2",
+        "client_id": "identifier",
+        "client_secret": "secret"
+      }));
+
+      return new Future.immediate(new http.Response(JSON.stringify({
+        'access_token': 'new access token',
+        'token_type': 'bearer',
+        'refresh_token': 'new refresh token'
+      }), 200, headers: {'content-type': 'application/json'}));
+    });
+
+    
+    expect(credentials.refresh('identifier', 'secret', httpClient: httpClient)
+        .transform((credentials) {
+      expect(credentials.accessToken, equals('new access token'));
+      expect(credentials.refreshToken, equals('new refresh token'));
+    }), completes);
+  });
+
+  test("uses the old refresh token if a new one isn't provided", () {
+    var credentials = new oauth2.Credentials(
+        'access token', 'refresh token', tokenEndpoint);
+    expect(credentials.canRefresh, true);
+
+    httpClient.expectRequest((request) {
+      expect(request.method, equals('POST'));
+      expect(request.url.toString(), equals(tokenEndpoint.toString()));
+      expect(request.bodyFields, equals({
+        "grant_type": "refresh_token",
+        "refresh_token": "refresh token",
+        "client_id": "identifier",
+        "client_secret": "secret"
+      }));
+
+      return new Future.immediate(new http.Response(JSON.stringify({
+        'access_token': 'new access token',
+        'token_type': 'bearer'
+      }), 200, headers: {'content-type': 'application/json'}));
+    });
+
+    
+    expect(credentials.refresh('identifier', 'secret', httpClient: httpClient)
+        .transform((credentials) {
+      expect(credentials.accessToken, equals('new access token'));
+      expect(credentials.refreshToken, equals('refresh token'));
+    }), completes);
+  });
+
+  group("fromJson", () {
+    oauth2.Credentials fromMap(Map map) =>
+      new oauth2.Credentials.fromJson(JSON.stringify(map));
+
+    test("should load the same credentials from toJson", () {
+      var expiration = new Date.now().subtract(new Duration(hours: 1));
+      var credentials = new oauth2.Credentials(
+          'access token', 'refresh token', tokenEndpoint, ['scope1', 'scope2'],
+          expiration);
+      var reloaded = new oauth2.Credentials.fromJson(credentials.toJson());
+
+      expect(reloaded.accessToken, equals(credentials.accessToken));
+      expect(reloaded.refreshToken, equals(credentials.refreshToken));
+      expect(reloaded.tokenEndpoint.toString(),
+          equals(credentials.tokenEndpoint.toString()));
+      expect(reloaded.scopes, equals(credentials.scopes));
+      expect(reloaded.expiration, equals(credentials.expiration));
+    });
+
+    test("should throw a FormatException for invalid JSON", () {
+      expect(() => new oauth2.Credentials.fromJson("foo bar"),
+          throwsFormatException);
+    });
+
+    test("should throw a FormatException for JSON that's not a map", () {
+      expect(() => new oauth2.Credentials.fromJson("null"),
+          throwsFormatException);
+    });
+
+    test("should throw a FormatException if there is no accessToken", () {
+      expect(() => fromMap({}), throwsFormatException);
+    });
+
+    test("should throw a FormatException if accessToken is not a string", () {
+      expect(() => fromMap({"accessToken": 12}), throwsFormatException);
+    });
+
+    test("should throw a FormatException if refreshToken is not a string", () {
+      expect(() => fromMap({"accessToken": "foo", "refreshToken": 12}),
+          throwsFormatException);
+    });
+
+    test("should throw a FormatException if tokenEndpoint is not a string", () {
+      expect(() => fromMap({"accessToken": "foo", "tokenEndpoint": 12}),
+          throwsFormatException);
+    });
+
+    test("should throw a FormatException if scopes is not a list", () {
+      expect(() => fromMap({"accessToken": "foo", "scopes": 12}),
+          throwsFormatException);
+    });
+
+    test("should throw a FormatException if expiration is not an int", () {
+      expect(() => fromMap({"accessToken": "foo", "expiration": "12"}),
+          throwsFormatException);
+    });
+  });
+}
diff --git a/pkg/oauth2/test/handle_access_token_response_test.dart b/pkg/oauth2/test/handle_access_token_response_test.dart
new file mode 100644
index 0000000..4757dc1
--- /dev/null
+++ b/pkg/oauth2/test/handle_access_token_response_test.dart
@@ -0,0 +1,191 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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 handle_access_token_response_test;
+
+import 'dart:io';
+import 'dart:json';
+import 'dart:uri';
+
+import '../../unittest/lib/unittest.dart';
+import '../../http/lib/http.dart' as http;
+import '../lib/oauth2.dart' as oauth2;
+import '../lib/src/handle_access_token_response.dart';
+import 'utils.dart';
+
+final Uri tokenEndpoint = new Uri.fromString("https://example.com/token");
+
+final Date startTime = new Date.now();
+
+oauth2.Credentials handle(http.Response response) =>
+  handleAccessTokenResponse(response, tokenEndpoint, startTime, ["scope"]);
+
+void main() {
+  group('an error response', () {
+    oauth2.Credentials handleError(
+        {String body: '{"error": "invalid_request"}',
+         int statusCode: 400,
+         Map<String, String> headers:
+             const {"content-type": "application/json"}}) =>
+      handle(new http.Response(body, statusCode, headers: headers));
+
+    test('causes an AuthorizationException', () {
+      expect(() => handleError(), throwsAuthorizationException);
+    });
+
+    test('with a 401 code causes an AuthorizationException', () {
+      expect(() => handleError(statusCode: 401), throwsAuthorizationException);
+    });
+
+    test('with an unexpected code causes a FormatException', () {
+      expect(() => handleError(statusCode: 500),
+          throwsFormatException);
+    });
+
+    test('with no content-type causes a FormatException', () {
+      expect(() => handleError(headers: {}), throwsFormatException);
+    });
+
+    test('with a non-JSON content-type causes a FormatException', () {
+      expect(() => handleError(headers: {
+        'content-type': 'text/plain'
+      }), throwsFormatException);
+    });
+
+    test('with a JSON content-type and charset causes an '
+        'AuthorizationException', () {
+      expect(() => handleError(headers: {
+        'content-type': 'application/json; charset=UTF-8'
+      }), throwsAuthorizationException);
+    });
+
+    test('with invalid JSON causes a FormatException', () {
+      expect(() => handleError(body: 'not json'),
+          throwsFormatException);
+    });
+
+    test('with a non-string error causes a FormatException', () {
+      expect(() => handleError(body: '{"error": 12}'),
+          throwsFormatException);
+    });
+
+    test('with a non-string error_description causes a FormatException', () {
+      expect(() => handleError(body: JSON.stringify({
+        "error": "invalid_request",
+        "error_description": 12
+      })), throwsFormatException);
+    });
+
+    test('with a non-string error_uri causes a FormatException', () {
+      expect(() => handleError(body: JSON.stringify({
+        "error": "invalid_request",
+        "error_uri": 12
+      })), throwsFormatException);
+    });
+
+    test('with a string error_description causes a AuthorizationException', () {
+      expect(() => handleError(body: JSON.stringify({
+        "error": "invalid_request",
+        "error_description": "description"
+      })), throwsAuthorizationException);
+    });
+
+    test('with a string error_uri causes a AuthorizationException', () {
+      expect(() => handleError(body: JSON.stringify({
+        "error": "invalid_request",
+        "error_uri": "http://example.com/error"
+      })), throwsAuthorizationException);
+    });
+  });
+
+  group('a success response', () {
+    oauth2.Credentials handleSuccess(
+        {String contentType: "application/json",
+         accessToken: 'access token',
+         tokenType: 'bearer',
+         expiresIn,
+         refreshToken,
+         scope}) {
+      return handle(new http.Response(JSON.stringify({
+        'access_token': accessToken,
+        'token_type': tokenType,
+        'expires_in': expiresIn,
+        'refresh_token': refreshToken,
+        'scope': scope
+      }), 200, headers: {'content-type': contentType}));
+    }
+
+    test('returns the correct credentials', () {
+      var credentials = handleSuccess();
+      expect(credentials.accessToken, equals('access token'));
+      expect(credentials.tokenEndpoint.toString(),
+          equals(tokenEndpoint.toString()));
+    });
+
+    test('with no content-type causes a FormatException', () {
+      expect(() => handleSuccess(contentType: null), throwsFormatException);
+    });
+
+    test('with a non-JSON content-type causes a FormatException', () {
+      expect(() => handleSuccess(contentType: 'text/plain'),
+          throwsFormatException);
+    });
+
+    test('with a JSON content-type and charset returns the correct '
+        'credentials', () {
+      var credentials = handleSuccess(
+          contentType: 'application/json; charset=UTF-8');
+      expect(credentials.accessToken, equals('access token'));
+    });
+
+    test('with a null access token throws a FormatException', () {
+      expect(() => handleSuccess(accessToken: null), throwsFormatException);
+    });
+
+    test('with a non-string access token throws a FormatException', () {
+      expect(() => handleSuccess(accessToken: 12), throwsFormatException);
+    });
+
+    test('with a null token type throws a FormatException', () {
+      expect(() => handleSuccess(tokenType: null), throwsFormatException);
+    });
+
+    test('with a non-string token type throws a FormatException', () {
+      expect(() => handleSuccess(tokenType: 12), throwsFormatException);
+    });
+
+    test('with a non-"bearer" token type throws a FormatException', () {
+      expect(() => handleSuccess(tokenType: "mac"), throwsFormatException);
+    });
+
+    test('with a non-int expires-in throws a FormatException', () {
+      expect(() => handleSuccess(expiresIn: "whenever"), throwsFormatException);
+    });
+
+    test('with expires-in sets the expiration to ten seconds earlier than the '
+        'server says', () {
+      var credentials = handleSuccess(expiresIn: 100);
+      expect(credentials.expiration.millisecondsSinceEpoch,
+          startTime.millisecondsSinceEpoch + 90 * 1000);
+    });
+
+    test('with a non-string refresh token throws a FormatException', () {
+      expect(() => handleSuccess(refreshToken: 12), throwsFormatException);
+    });
+
+    test('with a refresh token sets the refresh token', () {
+      var credentials = handleSuccess(refreshToken: "refresh me");
+      expect(credentials.refreshToken, equals("refresh me"));
+    });
+
+    test('with a non-string scope throws a FormatException', () {
+      expect(() => handleSuccess(scope: 12), throwsFormatException);
+    });
+
+    test('with a scope sets the scopes', () {
+      var credentials = handleSuccess(scope: "scope1 scope2");
+      expect(credentials.scopes, equals(["scope1", "scope2"]));
+    });
+  });
+}
diff --git a/pkg/oauth2/test/utils.dart b/pkg/oauth2/test/utils.dart
new file mode 100644
index 0000000..631ea95
--- /dev/null
+++ b/pkg/oauth2/test/utils.dart
@@ -0,0 +1,82 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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 utils;
+
+import '../../unittest/lib/unittest.dart';
+import '../../http/lib/http.dart' as http;
+import '../../http/lib/testing.dart';
+import '../lib/oauth2.dart' as oauth2;
+
+class ExpectClient extends MockClient {
+  final Queue<MockClientHandler> _handlers;
+
+  ExpectClient._(MockClientHandler fn)
+    : _handlers = new Queue<MockClientHandler>(),
+      super(fn);
+
+  factory ExpectClient() {
+    var client;
+    client = new ExpectClient._((request) =>
+        client._handleRequest(request));
+    return client;
+  }
+
+  void expectRequest(MockClientHandler fn) {
+    var completer = new Completer();
+    expect(completer.future, completes);
+
+    _handlers.add((request) {
+      completer.complete(null);
+      return fn(request);
+    });
+  }
+
+  Future<http.Response> _handleRequest(http.Request request) {
+    if (_handlers.isEmpty) {
+      return new Future.immediate(new http.Response('not found', 404));
+    } else {
+      return _handlers.removeFirst()(request);
+    }
+  }
+}
+
+// TODO(nweiz): remove this once it's built in to unittest
+/// A matcher for StateErrors.
+const isStateError = const _StateError();
+
+/// A matcher for functions that throw StateError.
+const Matcher throwsStateError =
+    const Throws(isStateError);
+
+class _StateError extends TypeMatcher {
+  const _StateError() : super("StateError");
+  bool matches(item, MatchState matchState) => item is StateError;
+}
+
+/// A matcher for AuthorizationExceptions.
+const isAuthorizationException = const _AuthorizationException();
+
+/// A matcher for functions that throw AuthorizationException.
+const Matcher throwsAuthorizationException =
+    const Throws(isAuthorizationException);
+
+class _AuthorizationException extends TypeMatcher {
+  const _AuthorizationException() : super("AuthorizationException");
+  bool matches(item, MatchState matchState) =>
+    item is oauth2.AuthorizationException;
+}
+
+/// A matcher for ExpirationExceptions.
+const isExpirationException = const _ExpirationException();
+
+/// A matcher for functions that throw ExpirationException.
+const Matcher throwsExpirationException =
+    const Throws(isExpirationException);
+
+class _ExpirationException extends TypeMatcher {
+  const _ExpirationException() : super("ExpirationException");
+  bool matches(item, MatchState matchState) =>
+    item is oauth2.ExpirationException;
+}
diff --git a/pkg/pkg.gyp b/pkg/pkg.gyp
new file mode 100644
index 0000000..e5c2c35
--- /dev/null
+++ b/pkg/pkg.gyp
@@ -0,0 +1,45 @@
+# Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+{
+  'targets': [
+    {
+      'target_name': 'pkg_packages',
+      'type': 'none',
+      'actions': [
+        {
+          'action_name': 'make_pkg_packages',
+          'inputs': [
+            '../tools/make_links.py',
+            'args/lib',
+            'fixnum/lib',
+            'htmlescape/lib',
+            'http/lib',
+            'intl/lib',
+            'logging/lib',
+            'meta/lib',
+            'unittest/lib',
+            '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',
+          ],
+          'action': [
+            'python', '../tools/make_links.py',
+            '<(PRODUCT_DIR)/packages',
+            '<@(_inputs)',
+          ],
+        },
+      ],
+    }
+  ],
+}
diff --git a/pkg/pkg.status b/pkg/pkg.status
index d7aadb7..32d4068 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -9,20 +9,18 @@
 # arithmetic natively, i.e., the VM.
 fixnum/test/int_64_vm_test: Skip
 
-# Skip the cURL tests until we have bundled binaries to run them on all
-# platforms.
-http/test/curl_client_test: Skip
-
 [$compiler == dart2dart]
 *: Skip
 
 # Don't compiile tests that use dart:io to JS
 [ $compiler == dart2js || $compiler == dart2dart || $compiler == dartc ]
 http/test/*: Skip
+oauth2/test/*: Skip
 
 # Skip tests that use local file access if we're running in any browser
 [ $runtime == opera || $runtime == ff || $runtime == ie9 || $runtime == dartium || $runtime == chrome || $runtime == safari || $runtime == drt ]
 http/test/*: Skip
+oauth2/test/*: Skip
 intl/test/date_time_format_file_even_test: Skip
 intl/test/date_time_format_file_odd_test: Skip
 intl/test/find_default_locale_standalone_test: Skip
@@ -50,13 +48,11 @@
 [ $compiler == dartc ]
 unittest/test/mock_regexp_negative_test: Fail
 unittest/test/mock_stepwise_negative_test: Fail
-
-[ $system == windows ]
-http/test/request_test: Pass, Timeout # Issue 6594
+args/test/args_test: Fail # http://dartbug.com/6790
 
 [ $compiler == dart2js || $compiler == dartc ]
 unittest/test/instance_test: Skip
 
 [ $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/src/core_matchers.dart b/pkg/unittest/lib/src/core_matchers.dart
index 20e9db2..3846fdd 100644
--- a/pkg/unittest/lib/src/core_matchers.dart
+++ b/pkg/unittest/lib/src/core_matchers.dart
@@ -489,18 +489,6 @@
   bool matches(item, MatchState matchState) => item is UnimplementedError;
 }
 
-/** A matcher for NullPointerExceptions. */
-const isNullPointerException = const _NullPointerException();
-
-/** A matcher for functions that throw NotNullPointerException. */
-const Matcher throwsNullPointerException =
-    const Throws(isNullPointerException);
-
-class _NullPointerException extends TypeMatcher {
-  const _NullPointerException() : super("NullPointerException");
-  bool matches(item, MatchState matchState) => item is NullPointerException;
-}
-
 /** A matcher for UnsupportedError. */
 const isUnsupportedError = const _UnsupportedError();
 
diff --git a/pkg/unittest/test/matchers_test.dart b/pkg/unittest/test/matchers_test.dart
index c9045ad..81be8fb 100644
--- a/pkg/unittest/test/matchers_test.dart
+++ b/pkg/unittest/test/matchers_test.dart
@@ -155,16 +155,6 @@
             "UnimplementedError.");
     });
 
-    test('throwsNullPointerException', () {
-      shouldPass(() { throw new NullPointerException(''); },
-          throwsNullPointerException);
-      shouldFail(() { throw new Exception(); },
-          throwsNullPointerException,
-        "Expected: throws an exception which matches NullPointerException "
-        "but:  exception <Exception> does not match "
-            "NullPointerException.");
-    });
-
     test('throwsUnsupportedError', () {
       shouldPass(() { throw new UnsupportedError(''); },
           throwsUnsupportedError);
diff --git a/runtime/bin/bin.gypi b/runtime/bin/bin.gypi
index 084cd51..c8108b7 100644
--- a/runtime/bin/bin.gypi
+++ b/runtime/bin/bin.gypi
@@ -268,6 +268,10 @@
         'builtin_natives.cc',
         'builtin.h',
         'io_natives.h',
+        'log_android.cc',
+        'log_linux.cc',
+        'log_macos.cc',
+        'log_win.cc',
       ],
       'includes': [
         'builtin_impl_sources.gypi',
@@ -391,7 +395,13 @@
           'link_settings': {
             'libraries': [ '-lws2_32.lib', '-lRpcrt4.lib' ],
           },
-       }]],
+       }],
+        ['OS=="android"', {
+          'link_settings': {
+            'libraries': [ '-llog' ],
+          },
+       }]
+      ],
     },
     {
       # Generate snapshot bin file.
@@ -482,7 +492,14 @@
             },
           },
         }],
-       ],
+        ['OS=="linux"', {
+          # Have the linker add all symbols to the dynamic symbol table
+          # so that extensions can look them up dynamically in the binary.
+          'ldflags': [
+            '-rdynamic',
+          ],
+        }],
+      ],
     },
     {
       # dart binary without any snapshot built in.
@@ -521,7 +538,15 @@
               'AdditionalOptions': [ '/EXPORT:Dart_True' ],
             },
           },
-       }]],
+        }],
+        ['OS=="linux"', {
+          # Have the linker add all symbols to the dynamic symbol table
+          # so that extensions can look them up dynamically in the binary.
+          'ldflags': [
+            '-rdynamic',
+          ],
+        }],
+      ],
     },
     {
       'target_name': 'process_test',
diff --git a/runtime/bin/builtin.dart b/runtime/bin/builtin.dart
index 4aea641..f84a50f 100644
--- a/runtime/bin/builtin.dart
+++ b/runtime/bin/builtin.dart
@@ -71,12 +71,20 @@
   var baseUri = new Uri.fromString(base);
   _logResolution("# Resolving: $userString from $base");
 
-  // Relative URIs with scheme dart-ext should be resolved as if with no scheme.
   var uri = new Uri.fromString(userString);
   var resolved;
   if ('dart-ext' == uri.scheme) {
+    // Relative URIs with scheme dart-ext should be resolved as if with no
+    // scheme.
     resolved = baseUri.resolve(uri.path);
-    resolved = new Uri.fromComponents(scheme: "dart-ext", path: resolved.path);
+    var path = resolved.path;
+    if (resolved.scheme == 'package') {
+      // If we are resolving relative to a package URI we go directly to the
+      // file path and keep the dart-ext scheme. Otherwise, we will lose the
+      // package URI path part.
+      path = _filePathFromPackageUri(resolved);
+    }
+    resolved = new Uri.fromComponents(scheme: "dart-ext", path: path);
   } else {
     resolved = baseUri.resolve(userString);
   }
diff --git a/runtime/bin/dbg_connection.cc b/runtime/bin/dbg_connection.cc
index 4c23dd4..4918d0d 100644
--- a/runtime/bin/dbg_connection.cc
+++ b/runtime/bin/dbg_connection.cc
@@ -5,6 +5,7 @@
 #include "bin/dbg_connection.h"
 #include "bin/dbg_message.h"
 #include "bin/dartutils.h"
+#include "bin/log.h"
 #include "bin/socket.h"
 #include "bin/thread.h"
 #include "bin/utils.h"
@@ -198,7 +199,8 @@
       FATAL("Illegal JSON message received");
     }
     if (!found) {
-      printf("'command' not found in JSON message: '%s'\n", msgbuf_->buf());
+      Log::Print("'command' not found in JSON message: '%s'\n",
+                      msgbuf_->buf());
       msgbuf_->PopMessage();
     }
 
@@ -242,7 +244,7 @@
       }
 
       // This is an unrecognized command, report error and move on to next.
-      printf("unrecognized command received: '%s'\n", msgbuf_->buf());
+      Log::Print("unrecognized command received: '%s'\n", msgbuf_->buf());
       HandleUnknownMsg();
       msgbuf_->PopMessage();
     }
diff --git a/runtime/bin/dbg_connection_android.cc b/runtime/bin/dbg_connection_android.cc
index 7fe7e94..a0bce37 100644
--- a/runtime/bin/dbg_connection_android.cc
+++ b/runtime/bin/dbg_connection_android.cc
@@ -9,6 +9,7 @@
 
 #include "bin/dbg_connection.h"
 #include "bin/fdutils.h"
+#include "bin/log.h"
 #include "bin/socket.h"
 
 int DebuggerConnectionImpl::epoll_fd_ = -1;
@@ -32,7 +33,7 @@
     // Sync message. Not yet implemented.
     UNIMPLEMENTED();
   } else {
-    printf("unexpected: receiving debugger connection event.\n");
+    Log::Print("unexpected: receiving debugger connection event.\n");
     UNIMPLEMENTED();
   }
 }
diff --git a/runtime/bin/dbg_connection_linux.cc b/runtime/bin/dbg_connection_linux.cc
index 7fe7e94..a0bce37 100644
--- a/runtime/bin/dbg_connection_linux.cc
+++ b/runtime/bin/dbg_connection_linux.cc
@@ -9,6 +9,7 @@
 
 #include "bin/dbg_connection.h"
 #include "bin/fdutils.h"
+#include "bin/log.h"
 #include "bin/socket.h"
 
 int DebuggerConnectionImpl::epoll_fd_ = -1;
@@ -32,7 +33,7 @@
     // Sync message. Not yet implemented.
     UNIMPLEMENTED();
   } else {
-    printf("unexpected: receiving debugger connection event.\n");
+    Log::Print("unexpected: receiving debugger connection event.\n");
     UNIMPLEMENTED();
   }
 }
diff --git a/runtime/bin/dbg_connection_macos.cc b/runtime/bin/dbg_connection_macos.cc
index cc0f13a..8464abf 100644
--- a/runtime/bin/dbg_connection_macos.cc
+++ b/runtime/bin/dbg_connection_macos.cc
@@ -12,6 +12,7 @@
 #include "bin/dartutils.h"
 #include "bin/dbg_connection.h"
 #include "bin/fdutils.h"
+#include "bin/log.h"
 #include "bin/socket.h"
 #include "platform/thread.h"
 #include "platform/utils.h"
@@ -87,10 +88,10 @@
   } else if (ident == wakeup_fds_[0]) {
     Message msg;
     if (ReceiveMessage(&msg)) {
-      printf("Received sync message id %d.\n", msg.msg_id);
+      Log::Print("Received sync message id %d.\n", msg.msg_id);
     }
   } else {
-    printf("unexpected: receiving debugger connection event.\n");
+    Log::Print("unexpected: receiving debugger connection event.\n");
     UNIMPLEMENTED();
   }
 }
@@ -113,7 +114,7 @@
       }
     }
   }
-  printf("shutting down debugger thread\n");
+  Log::Print("shutting down debugger thread\n");
 }
 
 
diff --git a/runtime/bin/directory_win.cc b/runtime/bin/directory_win.cc
index 9508dae..ca6c601 100644
--- a/runtime/bin/directory_win.cc
+++ b/runtime/bin/directory_win.cc
@@ -7,8 +7,7 @@
 #include <errno.h>
 #include <sys/stat.h>
 
-#include "bin/platform.h"
-
+#include "bin/log.h"
 
 static int SetOsErrorMessage(char* os_error_message,
                              int os_error_message_len) {
@@ -23,7 +22,7 @@
                     NULL);
   if (message_size == 0) {
     if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) {
-      fprintf(stderr, "FormatMessage failed %d\n", GetLastError());
+      Log::PrintErr("FormatMessage failed %d\n", GetLastError());
     }
     snprintf(os_error_message, os_error_message_len, "OS Error %d", error_code);
   }
diff --git a/runtime/bin/eventhandler_android.cc b/runtime/bin/eventhandler_android.cc
index de28f03..878c7eb 100644
--- a/runtime/bin/eventhandler_android.cc
+++ b/runtime/bin/eventhandler_android.cc
@@ -15,6 +15,7 @@
 
 #include "bin/dartutils.h"
 #include "bin/fdutils.h"
+#include "bin/log.h"
 #include "platform/hashmap.h"
 #include "platform/thread.h"
 #include "platform/utils.h"
@@ -229,21 +230,21 @@
 
 #ifdef DEBUG_POLL
 static void PrintEventMask(intptr_t fd, intptr_t events) {
-  printf("%d ", fd);
-  if ((events & EPOLLIN) != 0) printf("EPOLLIN ");
-  if ((events & EPOLLPRI) != 0) printf("EPOLLPRI ");
-  if ((events & EPOLLOUT) != 0) printf("EPOLLOUT ");
-  if ((events & EPOLLERR) != 0) printf("EPOLLERR ");
-  if ((events & EPOLLHUP) != 0) printf("EPOLLHUP ");
-  if ((events & EPOLLRDHUP) != 0) printf("EPOLLRDHUP ");
+  Log::Print("%d ", fd);
+  if ((events & EPOLLIN) != 0) Log::Print("EPOLLIN ");
+  if ((events & EPOLLPRI) != 0) Log::Print("EPOLLPRI ");
+  if ((events & EPOLLOUT) != 0) Log::Print("EPOLLOUT ");
+  if ((events & EPOLLERR) != 0) Log::Print("EPOLLERR ");
+  if ((events & EPOLLHUP) != 0) Log::Print("EPOLLHUP ");
+  if ((events & EPOLLRDHUP) != 0) Log::Print("EPOLLRDHUP ");
   int all_events = EPOLLIN | EPOLLPRI | EPOLLOUT |
       EPOLLERR | EPOLLHUP | EPOLLRDHUP;
   if ((events & ~all_events) != 0) {
-    printf("(and %08x) ", events & ~all_events);
+    Log::Print("(and %08x) ", events & ~all_events);
   }
-  printf("(available %d) ", FDUtils::AvailableBytes(fd));
+  Log::Print("(available %d) ", FDUtils::AvailableBytes(fd));
 
-  printf("\n");
+  Log::Print("\n");
 }
 #endif
 
@@ -299,7 +300,7 @@
             event_mask = (1 << kCloseEvent);
             sd->MarkClosedRead();
           } else if (errno != EWOULDBLOCK) {
-            fprintf(stderr, "Error recv: %s\n", strerror(errno));
+            Log::PrintErr("Error recv: %s\n", strerror(errno));
           }
         }
       }
diff --git a/runtime/bin/eventhandler_linux.cc b/runtime/bin/eventhandler_linux.cc
index 886388f3..49b6ca1 100644
--- a/runtime/bin/eventhandler_linux.cc
+++ b/runtime/bin/eventhandler_linux.cc
@@ -15,6 +15,7 @@
 
 #include "bin/dartutils.h"
 #include "bin/fdutils.h"
+#include "bin/log.h"
 #include "platform/hashmap.h"
 #include "platform/thread.h"
 #include "platform/utils.h"
@@ -229,21 +230,21 @@
 
 #ifdef DEBUG_POLL
 static void PrintEventMask(intptr_t fd, intptr_t events) {
-  printf("%d ", fd);
-  if ((events & EPOLLIN) != 0) printf("EPOLLIN ");
-  if ((events & EPOLLPRI) != 0) printf("EPOLLPRI ");
-  if ((events & EPOLLOUT) != 0) printf("EPOLLOUT ");
-  if ((events & EPOLLERR) != 0) printf("EPOLLERR ");
-  if ((events & EPOLLHUP) != 0) printf("EPOLLHUP ");
-  if ((events & EPOLLRDHUP) != 0) printf("EPOLLRDHUP ");
+  Log::Print("%d ", fd);
+  if ((events & EPOLLIN) != 0) Log::Print("EPOLLIN ");
+  if ((events & EPOLLPRI) != 0) Log::Print("EPOLLPRI ");
+  if ((events & EPOLLOUT) != 0) Log::Print("EPOLLOUT ");
+  if ((events & EPOLLERR) != 0) Log::Print("EPOLLERR ");
+  if ((events & EPOLLHUP) != 0) Log::Print("EPOLLHUP ");
+  if ((events & EPOLLRDHUP) != 0) Log::Print("EPOLLRDHUP ");
   int all_events = EPOLLIN | EPOLLPRI | EPOLLOUT |
       EPOLLERR | EPOLLHUP | EPOLLRDHUP;
   if ((events & ~all_events) != 0) {
-    printf("(and %08x) ", events & ~all_events);
+    Log::Print("(and %08x) ", events & ~all_events);
   }
-  printf("(available %d) ", FDUtils::AvailableBytes(fd));
+  Log::Print("(available %d) ", FDUtils::AvailableBytes(fd));
 
-  printf("\n");
+  Log::Print("\n");
 }
 #endif
 
@@ -299,7 +300,7 @@
             event_mask = (1 << kCloseEvent);
             sd->MarkClosedRead();
           } else if (errno != EWOULDBLOCK) {
-            fprintf(stderr, "Error recv: %s\n", strerror(errno));
+            Log::PrintErr("Error recv: %s\n", strerror(errno));
           }
         }
       }
diff --git a/runtime/bin/eventhandler_macos.cc b/runtime/bin/eventhandler_macos.cc
index 59a3d65..3954190 100644
--- a/runtime/bin/eventhandler_macos.cc
+++ b/runtime/bin/eventhandler_macos.cc
@@ -14,6 +14,7 @@
 
 #include "bin/dartutils.h"
 #include "bin/fdutils.h"
+#include "bin/log.h"
 #include "platform/hashmap.h"
 #include "platform/thread.h"
 #include "platform/utils.h"
@@ -240,15 +241,16 @@
 
 #ifdef DEBUG_KQUEUE
 static void PrintEventMask(intptr_t fd, struct kevent* event) {
-  printf("%d ", static_cast<int>(fd));
-  if (event->filter == EVFILT_READ) printf("EVFILT_READ ");
-  if (event->filter == EVFILT_WRITE) printf("EVFILT_WRITE ");
-  printf("flags: %x: ", event->flags);
-  if ((event->flags & EV_EOF) != 0) printf("EV_EOF ");
-  if ((event->flags & EV_ERROR) != 0) printf("EV_ERROR ");
-  printf("- fflags: %d ", event->fflags);
-  printf("(available %d) ", static_cast<int>(FDUtils::AvailableBytes(fd)));
-  printf("\n");
+  Log::Print("%d ", static_cast<int>(fd));
+  if (event->filter == EVFILT_READ) Log::Print("EVFILT_READ ");
+  if (event->filter == EVFILT_WRITE) Log::Print("EVFILT_WRITE ");
+  Log::Print("flags: %x: ", event->flags);
+  if ((event->flags & EV_EOF) != 0) Log::Print("EV_EOF ");
+  if ((event->flags & EV_ERROR) != 0) Log::Print("EV_ERROR ");
+  Log::Print("- fflags: %d ", event->fflags);
+  Log::Print("(available %d) ",
+      static_cast<int>(FDUtils::AvailableBytes(fd)));
+  Log::Print("\n");
 }
 #endif
 
diff --git a/runtime/bin/eventhandler_win.cc b/runtime/bin/eventhandler_win.cc
index 2d4343b..bc2f480 100644
--- a/runtime/bin/eventhandler_win.cc
+++ b/runtime/bin/eventhandler_win.cc
@@ -11,6 +11,7 @@
 
 #include "bin/builtin.h"
 #include "bin/dartutils.h"
+#include "bin/log.h"
 #include "bin/socket.h"
 #include "platform/thread.h"
 
@@ -143,7 +144,7 @@
                                             reinterpret_cast<ULONG_PTR>(this),
                                             0);
   if (completion_port_ == NULL) {
-    fprintf(stderr, "Error CreateIoCompletionPort: %d\n", GetLastError());
+    Log::PrintErr("Error CreateIoCompletionPort: %d\n", GetLastError());
     return false;
   }
   return true;
@@ -224,7 +225,7 @@
                      NULL);
   if (!ok) {
     if (GetLastError() != ERROR_BROKEN_PIPE) {
-      fprintf(stderr, "ReadFile failed %d\n", GetLastError());
+      Log::PrintErr("ReadFile failed %d\n", GetLastError());
     }
     bytes_read = 0;
   }
@@ -259,7 +260,7 @@
     }
 
     if (GetLastError() != ERROR_BROKEN_PIPE) {
-      fprintf(stderr, "ReadFile failed: %d\n", GetLastError());
+      Log::PrintErr("ReadFile failed: %d\n", GetLastError());
     }
     event_handler_->HandleClosed(this);
     IOBuffer::DisposeBuffer(buffer);
@@ -298,7 +299,7 @@
   }
 
   if (GetLastError() != ERROR_BROKEN_PIPE) {
-    fprintf(stderr, "WriteFile failed: %d\n", GetLastError());
+    Log::PrintErr("WriteFile failed: %d\n", GetLastError());
   }
   event_handler_->HandleClosed(this);
   IOBuffer::DisposeBuffer(buffer);
@@ -344,7 +345,7 @@
                         NULL,
                         NULL);
   if (status == SOCKET_ERROR) {
-    fprintf(stderr, "Error WSAIoctl failed: %d\n", WSAGetLastError());
+    Log::PrintErr("Error WSAIoctl failed: %d\n", WSAGetLastError());
     return false;
   }
   return true;
@@ -376,7 +377,7 @@
                  buffer->GetCleanOverlapped());
   if (!ok) {
     if (WSAGetLastError() != WSA_IO_PENDING) {
-      fprintf(stderr, "AcceptEx failed: %d\n", WSAGetLastError());
+      Log::PrintErr("AcceptEx failed: %d\n", WSAGetLastError());
       closesocket(buffer->client());
       IOBuffer::DisposeBuffer(buffer);
       return false;
@@ -422,7 +423,7 @@
         accepted_tail_ = client_socket;
       }
     } else {
-      fprintf(stderr, "setsockopt failed: %d\n", WSAGetLastError());
+      Log::PrintErr("setsockopt failed: %d\n", WSAGetLastError());
       closesocket(buffer->client());
     }
   }
@@ -514,7 +515,7 @@
                         NULL);
     if (!ok) {
       if (GetLastError() != ERROR_BROKEN_PIPE) {
-        fprintf(stderr, "WriteFile failed: %d\n", GetLastError());
+        Log::PrintErr("WriteFile failed: %d\n", GetLastError());
       }
       event_handler_->HandleClosed(this);
     }
@@ -526,7 +527,7 @@
 void ClientSocket::Shutdown(int how) {
   int rc = shutdown(socket(), how);
   if (rc == SOCKET_ERROR) {
-    fprintf(stderr, "shutdown failed: %d %d\n", socket(), WSAGetLastError());
+    Log::PrintErr("shutdown failed: %d %d\n", socket(), WSAGetLastError());
   }
   if (how == SD_RECEIVE) MarkClosedRead();
   if (how == SD_SEND) MarkClosedWrite();
@@ -559,7 +560,7 @@
   }
 
   if (WSAGetLastError() != WSAECONNRESET) {
-    fprintf(stderr, "WSARecv failed: %d\n", WSAGetLastError());
+    Log::PrintErr("WSARecv failed: %d\n", WSAGetLastError());
   }
   event_handler_->HandleClosed(this);
   IOBuffer::DisposeBuffer(buffer);
@@ -584,7 +585,7 @@
     return true;
   }
 
-  fprintf(stderr, "WSASend failed: %d\n", WSAGetLastError());
+  Log::PrintErr("WSASend failed: %d\n", WSAGetLastError());
   IOBuffer::DisposeBuffer(pending_write_);
   pending_write_ = NULL;
   return false;
@@ -876,7 +877,7 @@
     if (!ok && overlapped == NULL) {
       if (GetLastError() == ERROR_ABANDONED_WAIT_0) {
         // The completion port should never be closed.
-        printf("Completion port closed\n");
+        Log::Print("Completion port closed\n");
         UNREACHABLE();
       } else {
         // Timeout is signalled by false result and NULL in overlapped.
diff --git a/runtime/bin/extensions.cc b/runtime/bin/extensions.cc
index 244a631..d8b13f9 100644
--- a/runtime/bin/extensions.cc
+++ b/runtime/bin/extensions.cc
@@ -15,17 +15,18 @@
 Dart_Handle Extensions::LoadExtension(const char* extension_url,
                                       Dart_Handle parent_library) {
   char* library_path = strdup(extension_url);
-  if (!library_path || !File::IsAbsolutePath(library_path)) {
-    free(library_path);
-    return Dart_Error("unexpected error in library path");
+
+  if (library_path == NULL) {
+    return Dart_Error("Out of memory in LoadExtension");
   }
+
   // Extract the path and the extension name from the url.
   char* last_path_separator = strrchr(library_path, '/');
   char* extension_name = last_path_separator + 1;
   *last_path_separator = '\0';  // Terminate library_path at last separator.
 
   void* library_handle = LoadExtensionLibrary(library_path, extension_name);
-  if (!library_handle) {
+  if (library_handle == NULL) {
     free(library_path);
     return Dart_Error("cannot find extension library");
   }
diff --git a/runtime/bin/file_android.cc b/runtime/bin/file_android.cc
index 66e6251..ddcec13 100644
--- a/runtime/bin/file_android.cc
+++ b/runtime/bin/file_android.cc
@@ -11,6 +11,7 @@
 #include <libgen.h>
 
 #include "bin/builtin.h"
+#include "bin/log.h"
 
 class FileHandle {
  public:
@@ -42,7 +43,7 @@
     const int kBufferSize = 1024;
     char error_message[kBufferSize];
     strerror_r(errno, error_message, kBufferSize);
-    fprintf(stderr, "%s\n", error_message);
+    Log::PrintErr("%s\n", error_message);
   }
   handle_->set_fd(kClosedFd);
 }
diff --git a/runtime/bin/file_linux.cc b/runtime/bin/file_linux.cc
index 66e6251..ddcec13 100644
--- a/runtime/bin/file_linux.cc
+++ b/runtime/bin/file_linux.cc
@@ -11,6 +11,7 @@
 #include <libgen.h>
 
 #include "bin/builtin.h"
+#include "bin/log.h"
 
 class FileHandle {
  public:
@@ -42,7 +43,7 @@
     const int kBufferSize = 1024;
     char error_message[kBufferSize];
     strerror_r(errno, error_message, kBufferSize);
-    fprintf(stderr, "%s\n", error_message);
+    Log::PrintErr("%s\n", error_message);
   }
   handle_->set_fd(kClosedFd);
 }
diff --git a/runtime/bin/file_macos.cc b/runtime/bin/file_macos.cc
index b5bc95a..0fd0c8d 100644
--- a/runtime/bin/file_macos.cc
+++ b/runtime/bin/file_macos.cc
@@ -13,6 +13,7 @@
 
 #include "bin/builtin.h"
 #include "bin/fdutils.h"
+#include "bin/log.h"
 
 class FileHandle {
  public:
@@ -44,7 +45,7 @@
     const int kBufferSize = 1024;
     char error_message[kBufferSize];
     strerror_r(errno, error_message, kBufferSize);
-    fprintf(stderr, "%s\n", error_message);
+    Log::PrintErr("%s\n", error_message);
   }
   handle_->set_fd(kClosedFd);
 }
diff --git a/runtime/bin/file_win.cc b/runtime/bin/file_win.cc
index 97a98a6..a9cef38 100644
--- a/runtime/bin/file_win.cc
+++ b/runtime/bin/file_win.cc
@@ -11,6 +11,7 @@
 #include <sys/stat.h>
 
 #include "bin/builtin.h"
+#include "bin/log.h"
 
 class FileHandle {
  public:
@@ -39,7 +40,7 @@
   ASSERT(handle_->fd() >= 0);
   int err = close(handle_->fd());
   if (err != 0) {
-    fprintf(stderr, "%s\n", strerror(errno));
+    Log::PrintErr("%s\n", strerror(errno));
   }
   handle_->set_fd(kClosedFd);
 }
diff --git a/runtime/bin/gen_snapshot.cc b/runtime/bin/gen_snapshot.cc
index b3513e4..2f2c6f2 100644
--- a/runtime/bin/gen_snapshot.cc
+++ b/runtime/bin/gen_snapshot.cc
@@ -14,12 +14,14 @@
 #include "bin/builtin.h"
 #include "bin/dartutils.h"
 #include "bin/file.h"
+#include "bin/log.h"
+
 #include "platform/globals.h"
 
 #define CHECK_RESULT(result)                                                   \
   if (Dart_IsError(result)) {                                                  \
     free(snapshot_buffer);                                                     \
-    fprintf(stderr, "Error: %s", Dart_GetError(result));                       \
+    Log::PrintErr("Error: %s", Dart_GetError(result));                    \
     Dart_ExitScope();                                                          \
     Dart_ShutdownIsolate();                                                    \
     exit(255);                                                                 \
@@ -205,16 +207,14 @@
 
 
 static void PrintUsage() {
-  fprintf(stderr,
-          "dart [<vm-flags>] "
-          "[<dart-script-file>]\n");
+  Log::PrintErr("dart [<vm-flags>] [<dart-script-file>]\n");
 }
 
 
 static void VerifyLoaded(Dart_Handle library) {
   if (Dart_IsError(library)) {
     const char* err_msg = Dart_GetError(library);
-    fprintf(stderr, "Errors encountered while loading: %s\n", err_msg);
+    Log::PrintErr("Errors encountered while loading: %s\n", err_msg);
     Dart_ExitScope();
     Dart_ShutdownIsolate();
     exit(255);
@@ -251,7 +251,7 @@
   // Set up the library tag handler for this isolate.
   Dart_Handle result = Dart_SetLibraryTagHandler(DartUtils::LibraryTagHandler);
   if (Dart_IsError(result)) {
-    fprintf(stderr, "%s", Dart_GetError(result));
+    Log::PrintErr("%s", Dart_GetError(result));
     Dart_ExitScope();
     Dart_ShutdownIsolate();
     exit(255);
@@ -290,7 +290,7 @@
   }
 
   if (snapshot_filename == NULL) {
-    fprintf(stderr, "No snapshot output file specified\n");
+    Log::PrintErr("No snapshot output file specified\n");
     return 255;
   }
 
@@ -302,14 +302,14 @@
   // Note: We don't expect isolates to be created from dart code during
   // snapshot generation.
   if (!Dart_Initialize(NULL, NULL, NULL)) {
-    fprintf(stderr, "VM initialization failed\n");
+    Log::PrintErr("VM initialization failed\n");
     return 255;
   }
 
   char* error;
   Dart_Isolate isolate = Dart_CreateIsolate(NULL, NULL, NULL, NULL, &error);
   if (isolate == NULL) {
-    fprintf(stderr, "Error: %s", error);
+    Log::PrintErr("Error: %s", error);
     free(error);
     exit(255);
   }
@@ -360,7 +360,7 @@
                                                 NULL,
                                                 &error);
       if (isolate == NULL) {
-        fprintf(stderr, "%s", error);
+        Log::PrintErr("%s", error);
         free(error);
         free(snapshot_buffer);
         exit(255);
diff --git a/runtime/bin/io_impl_sources.gypi b/runtime/bin/io_impl_sources.gypi
index f86ca02..552ac3d 100644
--- a/runtime/bin/io_impl_sources.gypi
+++ b/runtime/bin/io_impl_sources.gypi
@@ -41,7 +41,7 @@
     'socket_linux.cc',
     'socket_macos.cc',
     'socket_win.cc',
-    'tls_socket.cc',
-    'tls_socket.h',
+    'secure_socket.cc',
+    'secure_socket.h',
   ],
 }
diff --git a/runtime/bin/io_natives.cc b/runtime/bin/io_natives.cc
index 1cd0236..16fd532 100644
--- a/runtime/bin/io_natives.cc
+++ b/runtime/bin/io_natives.cc
@@ -40,13 +40,13 @@
   V(Socket_GetError, 1)                                                        \
   V(Socket_GetStdioHandle, 2)                                                  \
   V(Socket_NewServicePort, 0)                                                  \
-  V(TlsSocket_Connect, 3)                                                      \
-  V(TlsSocket_Destroy, 1)                                                      \
-  V(TlsSocket_Handshake, 1)                                                    \
-  V(TlsSocket_Init, 1)                                                         \
-  V(TlsSocket_ProcessBuffer, 2)                                                \
-  V(TlsSocket_RegisterHandshakeCompleteCallback, 2)                            \
-  V(TlsSocket_SetCertificateDatabase, 1)
+  V(SecureSocket_Connect, 5)                                                   \
+  V(SecureSocket_Destroy, 1)                                                   \
+  V(SecureSocket_Handshake, 1)                                                 \
+  V(SecureSocket_Init, 1)                                                      \
+  V(SecureSocket_ProcessBuffer, 2)                                             \
+  V(SecureSocket_RegisterHandshakeCompleteCallback, 2)                         \
+  V(SecureSocket_SetCertificateDatabase, 2)
 
 IO_NATIVE_LIST(DECLARE_FUNCTION);
 
diff --git a/runtime/bin/io_sources.gypi b/runtime/bin/io_sources.gypi
index 9300c1c..69100f0 100644
--- a/runtime/bin/io_sources.gypi
+++ b/runtime/bin/io_sources.gypi
@@ -14,6 +14,6 @@
     'process_patch.dart',
     'socket_patch.dart',
     'stdio_patch.dart',
-    'tls_socket_patch.dart',
+    'secure_socket_patch.dart',
   ],
 }
diff --git a/runtime/bin/log.h b/runtime/bin/log.h
new file mode 100644
index 0000000..c495840
--- /dev/null
+++ b/runtime/bin/log.h
@@ -0,0 +1,37 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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 BIN_LOG_H_
+#define BIN_LOG_H_
+
+#include <stdarg.h>
+
+#include "platform/globals.h"
+
+class Log {
+ public:
+  // Print formatted output for debugging.
+  static void Print(const char* format, ...) PRINTF_ATTRIBUTE(1, 2) {
+    va_list args;
+    va_start(args, format);
+    VPrint(format, args);
+    va_end(args);
+  }
+
+  static void VPrint(const char* format, va_list args);
+
+  static void PrintErr(const char* format, ...) PRINTF_ATTRIBUTE(1, 2) {
+    va_list args;
+    va_start(args, format);
+    VPrintErr(format, args);
+    va_end(args);
+  }
+
+  static void VPrintErr(const char* format, va_list args);
+
+  DISALLOW_ALLOCATION();
+  DISALLOW_IMPLICIT_CONSTRUCTORS(Log);
+};
+
+#endif  // BIN_LOG_H_
diff --git a/runtime/bin/log_android.cc b/runtime/bin/log_android.cc
new file mode 100644
index 0000000..0a6b552
--- /dev/null
+++ b/runtime/bin/log_android.cc
@@ -0,0 +1,20 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "bin/log.h"
+
+#include <stdio.h>
+#include <android/log.h>
+
+// TODO(gram): We should be buffering the data and only outputting
+// it when we see a '\n'.
+
+void Log::VPrint(const char* format, va_list args) {
+  __android_log_vprint(ANDROID_LOG_INFO, "Dart", format, args);
+}
+
+void Log::VPrintErr(const char* format, va_list args) {
+  __android_log_vprint(ANDROID_LOG_ERROR, "Dart", format, args);
+}
+
diff --git a/runtime/bin/log_linux.cc b/runtime/bin/log_linux.cc
new file mode 100644
index 0000000..1b99c70
--- /dev/null
+++ b/runtime/bin/log_linux.cc
@@ -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.
+
+#include "bin/log.h"
+
+#include <stdio.h>
+
+void Log::VPrint(const char* format, va_list args) {
+  vfprintf(stdout, format, args);
+  fflush(stdout);
+}
+
+void Log::VPrintErr(const char* format, va_list args) {
+  vfprintf(stderr, format, args);
+  fflush(stdout);
+}
+
diff --git a/runtime/bin/log_macos.cc b/runtime/bin/log_macos.cc
new file mode 100644
index 0000000..2f0d371
--- /dev/null
+++ b/runtime/bin/log_macos.cc
@@ -0,0 +1,17 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "bin/log.h"
+
+#include <stdio.h>
+
+void Log::VPrint(const char* format, va_list args) {
+  vfprintf(stdout, format, args);
+  fflush(stdout);
+}
+
+void Log::VPrintErr(const char* format, va_list args) {
+  vfprintf(stderr, format, args);
+  fflush(stderr);
+}
diff --git a/runtime/bin/log_win.cc b/runtime/bin/log_win.cc
new file mode 100644
index 0000000..2f0d371
--- /dev/null
+++ b/runtime/bin/log_win.cc
@@ -0,0 +1,17 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "bin/log.h"
+
+#include <stdio.h>
+
+void Log::VPrint(const char* format, va_list args) {
+  vfprintf(stdout, format, args);
+  fflush(stdout);
+}
+
+void Log::VPrintErr(const char* format, va_list args) {
+  vfprintf(stderr, format, args);
+  fflush(stderr);
+}
diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
index 534f886..81c1373 100644
--- a/runtime/bin/main.cc
+++ b/runtime/bin/main.cc
@@ -17,6 +17,7 @@
 #include "bin/extensions.h"
 #include "bin/file.h"
 #include "bin/isolate_data.h"
+#include "bin/log.h"
 #include "bin/platform.h"
 #include "bin/process.h"
 #include "platform/globals.h"
@@ -142,7 +143,7 @@
     }
   }
   if (debug_port == 0) {
-    fprintf(stderr, "unrecognized --debug option syntax. "
+    Log::PrintErr("unrecognized --debug option syntax. "
                     "Use --debug[:<port number>]\n");
     return false;
   }
@@ -516,25 +517,25 @@
 
 
 static void PrintVersion() {
-  fprintf(stderr, "Dart VM version: %s\n", Dart_VersionString());
+  Log::PrintErr("Dart VM version: %s\n", Dart_VersionString());
 }
 
 
 static void PrintUsage() {
-  fprintf(stderr,
+  Log::PrintErr(
       "Usage: dart [<vm-flags>] <dart-script-file> [<dart-options>]\n"
       "\n"
       "Executes the Dart script passed as <dart-script-file>.\n"
       "\n");
   if (!has_verbose_option) {
-    fprintf(stderr,
+    Log::PrintErr(
 "Common options:\n"
 "--checked Insert runtime type checks and enable assertions (checked mode).\n"
 "--version Print the VM version.\n"
 "--help    Display this message (add --verbose for information about all\n"
 "          VM options).\n");
   } else {
-    fprintf(stderr,
+    Log::PrintErr(
 "Supported options:\n"
 "--checked\n"
 "  Insert runtime type checks and enable assertions (checked mode).\n"
@@ -626,8 +627,9 @@
 static int ErrorExit(const char* format, ...) {
   va_list arguments;
   va_start(arguments, format);
-  vfprintf(stderr, format, arguments);
+  Log::VPrintErr(format, arguments);
   va_end(arguments);
+  fflush(stderr);
 
   Dart_ExitScope();
   Dart_ShutdownIsolate();
@@ -653,7 +655,7 @@
 
   // Perform platform specific initialization.
   if (!Platform::Initialize()) {
-    fprintf(stderr, "Initialization failed\n");
+    Log::PrintErr("Initialization failed\n");
   }
 
   // On Windows, the argv strings are code page encoded and not
@@ -691,7 +693,9 @@
   if (!Dart_Initialize(CreateIsolateAndSetup,
                        NULL,
                        ShutdownIsolate)) {
-    return ErrorExit("VM initialization failed\n");
+    fprintf(stderr, "%s", "VM initialization failed\n");
+    fflush(stderr);
+    return kErrorExitCode;
   }
 
   DartUtils::SetOriginalWorkingDirectory();
@@ -710,7 +714,7 @@
                                    "main",
                                    new IsolateData(),
                                    &error)) {
-    fprintf(stderr, "%s\n", error);
+    Log::PrintErr("%s\n", error);
     free(error);
     delete [] isolate_name;
     return kErrorExitCode;  // Indicates we encountered an error.
diff --git a/runtime/bin/net/nss.gyp b/runtime/bin/net/nss.gyp
index ad5d888..64402b5 100644
--- a/runtime/bin/net/nss.gyp
+++ b/runtime/bin/net/nss.gyp
@@ -7,7 +7,7 @@
 # BSD-style license that can be found in the LICENSE file.
 
 # This file is a modified copy of Chromium's deps/third_party/nss/nss.gyp.
-# Revision 165464 (this should agree with "nss_rev" in DEPS).
+# Revision 169195 (this should agree with "nss_rev" in DEPS).
 {
   # Added by Dart. All Dart comments refer to the following block or line.
   'includes': [
@@ -88,7 +88,7 @@
   'conditions': [[ 'dart_io_support==1', {
   'targets': [
     {
-      'target_name': 'nspr_dart',
+      'target_name': 'nspr_dart',  # Added by Dart (the _dart postfix)
       'product_name': 'crnspr',
       'type': '<(component)',
       # Changed by Dart: '<(nss_directory)/' added to all paths.
@@ -455,14 +455,14 @@
       ],
     },
     {
-      'target_name': 'nss_dart',
+      'target_name': 'nss_dart',  # Added by Dart (the _dart postfix)
       'product_name': 'crnss',
       'type': '<(component)',
       'dependencies': [
-        'nss_static_dart',
+        'nss_static_dart',  # Added by Dart (the _dart postfix)
       ],
       'export_dependent_settings': [
-        'nss_static_dart',
+        'nss_static_dart',  # Added by Dart (the _dart postfix)
       ],
       'sources': [
         # Ensure at least one object file is produced, so that MSVC does not
@@ -473,10 +473,10 @@
       'conditions': [
         ['exclude_nss_root_certs==0', {
           'dependencies': [
-            'nssckbi_dart',
+            'nssckbi_dart',  # Added by Dart (the _dart postfix)
           ],
           'export_dependent_settings': [
-            'nssckbi_dart',
+            'nssckbi_dart',  # Added by Dart (the _dart postfix)
           ],
         }],
         ['OS == "mac" and component == "shared_library"', {
@@ -506,7 +506,7 @@
       #
       # TODO(rsleevi): http://crbug.com/128134 - Break the circular dependency
       # without requiring nssckbi to be built as a shared library.
-      'target_name': 'nssckbi_dart',
+      'target_name': 'nssckbi_dart',  # Added by Dart (the _dart postfix)
       'product_name': 'crnssckbi',
       'type': 'static_library',
       # This target is an implementation detail - the public dependencies
@@ -554,10 +554,10 @@
         '<(nss_directory)/mozilla/security/nss/lib/ckfw/wrap.c',
       ],
       'dependencies': [
-        'nss_static_dart',
+        'nss_static_dart',  # Added by Dart (the _dart postfix)
       ],
       'export_dependent_settings': [
-        'nss_static_dart',
+        'nss_static_dart',  # Added by Dart (the _dart postfix)
       ],
       'include_dirs': [
         '<(nss_directory)/mozilla/security/nss/lib/ckfw',
@@ -569,7 +569,7 @@
       },
     },
     {
-      'target_name': 'nss_static_dart',
+      'target_name': 'nss_static_dart',  # Added by Dart (the _dart postfix)
       'type': 'static_library',
       # This target is an implementation detail - the public dependencies
       # should be on 'nss'.
@@ -630,6 +630,7 @@
         '<(nss_directory)/mozilla/security/nss/lib/cryptohi/keyt.h',
         '<(nss_directory)/mozilla/security/nss/lib/cryptohi/keythi.h',
         '<(nss_directory)/mozilla/security/nss/lib/cryptohi/sechash.c',
+        '<(nss_directory)/mozilla/security/nss/lib/cryptohi/sechash.h',
         '<(nss_directory)/mozilla/security/nss/lib/cryptohi/seckey.c',
         '<(nss_directory)/mozilla/security/nss/lib/cryptohi/secsign.c',
         '<(nss_directory)/mozilla/security/nss/lib/cryptohi/secvfy.c',
@@ -678,7 +679,6 @@
         '<(nss_directory)/mozilla/security/nss/lib/freebl/ecl/ecp_jm.c',
         '<(nss_directory)/mozilla/security/nss/lib/freebl/ecl/ecp_mont.c',
         '<(nss_directory)/mozilla/security/nss/lib/freebl/ecl/ec_naf.c',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/hasht.h',
         '<(nss_directory)/mozilla/security/nss/lib/freebl/jpake.c',
         '<(nss_directory)/mozilla/security/nss/lib/freebl/md2.c',
         '<(nss_directory)/mozilla/security/nss/lib/freebl/md5.c',
@@ -700,12 +700,12 @@
         '<(nss_directory)/mozilla/security/nss/lib/freebl/mpi/mp_gf2m.h',
         '<(nss_directory)/mozilla/security/nss/lib/freebl/mpi/primes.c',
         '<(nss_directory)/mozilla/security/nss/lib/freebl/pqg.c',
+        '<(nss_directory)/mozilla/security/nss/lib/freebl/pqg.h',
         '<(nss_directory)/mozilla/security/nss/lib/freebl/rawhash.c',
         '<(nss_directory)/mozilla/security/nss/lib/freebl/rijndael.c',
         '<(nss_directory)/mozilla/security/nss/lib/freebl/rijndael.h',
         '<(nss_directory)/mozilla/security/nss/lib/freebl/rijndael32.tab',
         '<(nss_directory)/mozilla/security/nss/lib/freebl/rsa.c',
-        '<(nss_directory)/mozilla/security/nss/lib/freebl/sechash.h',
         '<(nss_directory)/mozilla/security/nss/lib/freebl/secmpi.h',
         '<(nss_directory)/mozilla/security/nss/lib/freebl/secrng.h',
         '<(nss_directory)/mozilla/security/nss/lib/freebl/seed.c',
@@ -920,6 +920,7 @@
         '<(nss_directory)/mozilla/security/nss/lib/pk11wrap/pk11util.c',
         '<(nss_directory)/mozilla/security/nss/lib/pk11wrap/secmod.h',
         '<(nss_directory)/mozilla/security/nss/lib/pk11wrap/secmodi.h',
+        '<(nss_directory)/mozilla/security/nss/lib/pk11wrap/secmodt.h',
         '<(nss_directory)/mozilla/security/nss/lib/pk11wrap/secmodti.h',
         '<(nss_directory)/mozilla/security/nss/lib/pk11wrap/secpkcs5.h',
         '<(nss_directory)/mozilla/security/nss/lib/pkcs7/certread.c',
@@ -969,8 +970,6 @@
         '<(nss_directory)/mozilla/security/nss/lib/softoken/lowpbe.c',
         '<(nss_directory)/mozilla/security/nss/lib/softoken/lowpbe.h',
         '<(nss_directory)/mozilla/security/nss/lib/softoken/padbuf.c',
-        '<(nss_directory)/mozilla/security/nss/lib/softoken/pk11init.h',
-        '<(nss_directory)/mozilla/security/nss/lib/softoken/pk11pars.h',
         '<(nss_directory)/mozilla/security/nss/lib/softoken/pkcs11.c',
         '<(nss_directory)/mozilla/security/nss/lib/softoken/pkcs11c.c',
         '<(nss_directory)/mozilla/security/nss/lib/softoken/pkcs11i.h',
@@ -979,12 +978,10 @@
         '<(nss_directory)/mozilla/security/nss/lib/softoken/rsawrapr.c',
         '<(nss_directory)/mozilla/security/nss/lib/softoken/sdb.c',
         '<(nss_directory)/mozilla/security/nss/lib/softoken/sdb.h',
-        '<(nss_directory)/mozilla/security/nss/lib/softoken/secmodt.h',
         '<(nss_directory)/mozilla/security/nss/lib/softoken/sftkdb.c',
         '<(nss_directory)/mozilla/security/nss/lib/softoken/sftkdb.h',
         '<(nss_directory)/mozilla/security/nss/lib/softoken/sftkdbt.h',
         '<(nss_directory)/mozilla/security/nss/lib/softoken/sftkdbti.h',
-        '<(nss_directory)/mozilla/security/nss/lib/softoken/sftkmod.c',
         '<(nss_directory)/mozilla/security/nss/lib/softoken/sftkpars.c',
         '<(nss_directory)/mozilla/security/nss/lib/softoken/sftkpars.h',
         '<(nss_directory)/mozilla/security/nss/lib/softoken/sftkpwd.c',
@@ -1002,6 +999,7 @@
         '<(nss_directory)/mozilla/security/nss/lib/util/dersubr.c',
         '<(nss_directory)/mozilla/security/nss/lib/util/dertime.c',
         '<(nss_directory)/mozilla/security/nss/lib/util/errstrs.c',
+        '<(nss_directory)/mozilla/security/nss/lib/util/hasht.h',
         '<(nss_directory)/mozilla/security/nss/lib/util/nssb64.h',
         '<(nss_directory)/mozilla/security/nss/lib/util/nssb64d.c',
         '<(nss_directory)/mozilla/security/nss/lib/util/nssb64e.c',
@@ -1047,6 +1045,11 @@
         '<(nss_directory)/mozilla/security/nss/lib/util/sectime.c',
         '<(nss_directory)/mozilla/security/nss/lib/util/templates.c',
         '<(nss_directory)/mozilla/security/nss/lib/util/utf8.c',
+        '<(nss_directory)/mozilla/security/nss/lib/util/utilmod.c',
+        '<(nss_directory)/mozilla/security/nss/lib/util/utilmodt.h',
+        '<(nss_directory)/mozilla/security/nss/lib/util/utilpars.c',
+        '<(nss_directory)/mozilla/security/nss/lib/util/utilpars.h',
+        '<(nss_directory)/mozilla/security/nss/lib/util/utilparst.h',
         '<(nss_directory)/mozilla/security/nss/lib/util/utilrename.h',
       ],
       'sources!': [
@@ -1059,11 +1062,11 @@
         '<(nss_directory)/mozilla/security/nss/lib/pk11wrap/debug_module.c',
       ],
       'dependencies': [
-        'nspr_dart',
-        'sqlite.gyp:sqlite_dart',
+        'nspr_dart',  # Added by Dart (the _dart postfix)
+        'sqlite.gyp:sqlite_dart',  # Changed by Dart prefix ../sqllite removed _dart postfix added.
       ],
       'export_dependent_settings': [
-        'nspr_dart',
+        'nspr_dart',  # Added by Dart (the _dart postfix)
       ],
       'defines': [
         'MP_API_COMPATIBLE',
@@ -1148,6 +1151,9 @@
           'defines': [
             'NSS_DISABLE_LIBPKIX',
           ],
+          # Changed by Dart:
+          # nss_directory contains .., which is bad in a regular expression.
+          # So we use the partial match by dropping '^' from '^mozilla/...
           'sources/': [
             ['exclude', 'mozilla/security/nss/lib/libpkix/'],
           ],
@@ -1155,6 +1161,9 @@
             '<(nss_directory)/mozilla/security/nss/lib/certhigh/certvfypkix.c',
             '<(nss_directory)/mozilla/security/nss/lib/certhigh/certvfypkixprint.c',
           ],
+          # Changed by Dart:
+          # nss_directory contains .., which is bad in a regular expression.
+          # So we use the partial match by dropping '^' from '^mozilla/...
           'include_dirs/': [
             ['exclude', 'mozilla/security/nss/lib/libpkix/'],
           ],
@@ -1164,7 +1173,6 @@
             ['exclude', 'amd64'],
           ],
         }],
-        # Added by Dart.
         ['OS=="linux"', {
           'defines': [
             'XP_UNIX',
diff --git a/runtime/bin/net/sqlite.gyp b/runtime/bin/net/sqlite.gyp
index 543ca77..aa7ec81 100644
--- a/runtime/bin/net/sqlite.gyp
+++ b/runtime/bin/net/sqlite.gyp
@@ -7,7 +7,7 @@
 # BSD-style license that can be found in the LICENSE file.
 
 # This file is a modified copy of Chromium's src/third_party/sqlite/sqlite.gyp.
-# Revision 165464 (this should agree with "nss_rev" in DEPS).
+# Revision 169195 (this should agree with "nss_rev" in DEPS).
 {
   # Added by Dart. All Dart comments refer to the following block or line.
   'includes': [
@@ -38,7 +38,7 @@
   'conditions': [[ 'dart_io_support==1', {
   'targets': [
     {
-      'target_name': 'sqlite_dart',
+      'target_name': 'sqlite_dart',  # Added by Dart (the _dart postfix)
       'conditions': [
         [ 'chromeos==1' , {
             'defines': [
@@ -184,12 +184,12 @@
     ['os_posix == 1 and OS != "mac" and OS != "ios" and OS != "android" and not use_system_sqlite', {
       'targets': [
         {
-          'target_name': 'sqlite_shell_dart',
+          'target_name': 'sqlite_shell_dart',  # Added by Dart (the _dart postfix)
           'type': 'executable',
           'dependencies': [
             # Disabled by Dart.
             # '../icu/icu.gyp:icuuc',
-            'sqlite_dart',
+            'sqlite_dart',  # Added by Dart (the _dart postfix)
           ],
           'sources': [
             '<(sqlite_directory)/src/src/shell.c',
diff --git a/runtime/bin/net/ssl.gyp b/runtime/bin/net/ssl.gyp
index cee5997..3798baa 100644
--- a/runtime/bin/net/ssl.gyp
+++ b/runtime/bin/net/ssl.gyp
@@ -7,7 +7,7 @@
 # BSD-style license that can be found in the LICENSE file.
 
 # This file is a modified copy of Chromium's src/net/third_party/nss/ssl.gyp.
-# Revision 165464 (this should agree with "nss_rev" in DEPS).
+# Revision 169195 (this should agree with "nss_rev" in DEPS).
 {
   # Conditions section for ssl-bodge (Compiling SSL on linux using system
   # NSS and NSPR libraries) removed:
@@ -30,15 +30,14 @@
   'conditions': [[ 'dart_io_support==1', {
   'targets': [
     {
-      'target_name': 'libssl_dart',
+      'target_name': 'libssl_dart',  # Added by Dart (the _dart postfix)
       'type': 'static_library',
       # Changed by Dart: '<(ssl_directory)/' added to all paths.
       'sources': [
         '<(ssl_directory)/ssl/authcert.c',
         '<(ssl_directory)/ssl/cmpcert.c',
         '<(ssl_directory)/ssl/derive.c',
-        '<(ssl_directory)/ssl/dtls1con.c',
-        '<(ssl_directory)/ssl/nsskea.c',
+        '<(ssl_directory)/ssl/dtlscon.c',
         '<(ssl_directory)/ssl/os2_err.c',
         '<(ssl_directory)/ssl/os2_err.h',
         '<(ssl_directory)/ssl/preenc.h',
@@ -77,7 +76,9 @@
         '<(ssl_directory)/ssl/unix_err.h',
         '<(ssl_directory)/ssl/win32err.c',
         '<(ssl_directory)/ssl/win32err.h',
+        # Changed by Dart: All files under '<(ssl_directory)/ssl/bodge' removed.
       ],
+      # Changed by Dart: '<(ssl_directory)/' added to all paths.
       'sources!': [
         '<(ssl_directory)/ssl/os2_err.c',
         '<(ssl_directory)/ssl/os2_err.h',
@@ -92,14 +93,15 @@
         'NO_NSPR_10_SUPPORT',
       ],
       'dependencies': [
-        'zlib.gyp:zlib_dart',
+        # Changed by Dart.
+        'zlib.gyp:zlib_dart',  # Added by Dart (the _dart postfix)
         # Dart: Start of copy of code from 'bodge' conditions section below.
-        'nss.gyp:nspr_dart',
-        'nss.gyp:nss_dart',
+        'nss.gyp:nspr_dart',  # Added by Dart (the _dart postfix)
+        'nss.gyp:nss_dart',  # Added by Dart (the _dart postfix)
       ],
       'export_dependent_settings': [
-        'nss.gyp:nspr_dart',
-        'nss.gyp:nss_dart',
+        'nss.gyp:nspr_dart',  # Added by Dart (the _dart postfix)
+        'nss.gyp:nss_dart',  # Added by Dart (the _dart postfix)
       ],
       'direct_dependent_settings': {
         'include_dirs': [
diff --git a/runtime/bin/net/zlib.gyp b/runtime/bin/net/zlib.gyp
index e2dcd3f..99bca0f 100644
--- a/runtime/bin/net/zlib.gyp
+++ b/runtime/bin/net/zlib.gyp
@@ -7,7 +7,7 @@
 # BSD-style license that can be found in the LICENSE file.
 
 # This file is a modified copy of src/third_party/zlib/zlib.gyp from Chromium.
-# Revision 165464 (this should agree with "nss_rev" in DEPS).
+# Revision 169195 (this should agree with "nss_rev" in DEPS).
 {
   # Added by Dart. All Dart comments refer to the following block or line.
   'includes': [
@@ -33,7 +33,7 @@
   'conditions': [[ 'dart_io_support==1', {
   'targets': [
     {
-      'target_name': 'zlib_dart',
+      'target_name': 'zlib_dart',  # Added by Dart (the _dart postfix)
       'type': 'static_library',
       'conditions': [
         ['use_system_zlib==0', {
@@ -96,7 +96,7 @@
       ],
     },
     {
-      'target_name': 'minizip_dart',
+      'target_name': 'minizip_dart',  # Added by Dart (the _dart postfix)
       'type': 'static_library',
       'conditions': [
         ['use_system_minizip==0', {
diff --git a/runtime/bin/platform_win.cc b/runtime/bin/platform_win.cc
index 0af539d..750caa6 100644
--- a/runtime/bin/platform_win.cc
+++ b/runtime/bin/platform_win.cc
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "bin/platform.h"
+#include "bin/log.h"
 #include "bin/socket.h"
 
 bool Platform::Initialize() {
@@ -73,7 +74,7 @@
                     NULL);
   if (message_size == 0) {
     if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) {
-      fprintf(stderr, "FormatMessage failed %d\n", GetLastError());
+      Log::PrintErr("FormatMessage failed %d\n", GetLastError());
     }
     snprintf(error, kBufferSize, "OS Error %d", error_code);
   }
diff --git a/runtime/bin/process_android.cc b/runtime/bin/process_android.cc
index c834988..3d593e2 100644
--- a/runtime/bin/process_android.cc
+++ b/runtime/bin/process_android.cc
@@ -15,6 +15,7 @@
 #include <unistd.h>
 
 #include "bin/fdutils.h"
+#include "bin/log.h"
 #include "bin/thread.h"
 
 
@@ -326,16 +327,15 @@
   bool initialized = ExitCodeHandler::EnsureInitialized();
   if (!initialized) {
     SetChildOsErrorMessage(os_error_message, os_error_message_len);
-    fprintf(stderr,
-            "Error initializing exit code handler: %s\n",
-            os_error_message);
+    Log::PrintErr("Error initializing exit code handler: %s\n",
+                 os_error_message);
     return errno;
   }
 
   result = TEMP_FAILURE_RETRY(pipe(read_in));
   if (result < 0) {
     SetChildOsErrorMessage(os_error_message, os_error_message_len);
-    fprintf(stderr, "Error pipe creation failed: %s\n", os_error_message);
+    Log::PrintErr("Error pipe creation failed: %s\n", os_error_message);
     return errno;
   }
 
@@ -344,7 +344,7 @@
     SetChildOsErrorMessage(os_error_message, os_error_message_len);
     TEMP_FAILURE_RETRY(close(read_in[0]));
     TEMP_FAILURE_RETRY(close(read_in[1]));
-    fprintf(stderr, "Error pipe creation failed: %s\n", os_error_message);
+    Log::PrintErr("Error pipe creation failed: %s\n", os_error_message);
     return errno;
   }
 
@@ -355,7 +355,7 @@
     TEMP_FAILURE_RETRY(close(read_in[1]));
     TEMP_FAILURE_RETRY(close(read_err[0]));
     TEMP_FAILURE_RETRY(close(read_err[1]));
-    fprintf(stderr, "Error pipe creation failed: %s\n", os_error_message);
+    Log::PrintErr("Error pipe creation failed: %s\n", os_error_message);
     return errno;
   }
 
@@ -368,7 +368,7 @@
     TEMP_FAILURE_RETRY(close(read_err[1]));
     TEMP_FAILURE_RETRY(close(write_out[0]));
     TEMP_FAILURE_RETRY(close(write_out[1]));
-    fprintf(stderr, "Error pipe creation failed: %s\n", os_error_message);
+    Log::PrintErr("Error pipe creation failed: %s\n", os_error_message);
     return errno;
   }
 
@@ -387,7 +387,7 @@
     TEMP_FAILURE_RETRY(close(write_out[1]));
     TEMP_FAILURE_RETRY(close(exec_control[0]));
     TEMP_FAILURE_RETRY(close(exec_control[1]));
-    fprintf(stderr, "fcntl failed: %s\n", os_error_message);
+    Log::PrintErr("fcntl failed: %s\n", os_error_message);
     return errno;
   }
 
@@ -488,7 +488,7 @@
     TEMP_FAILURE_RETRY(close(read_err[1]));
     TEMP_FAILURE_RETRY(close(write_out[0]));
     TEMP_FAILURE_RETRY(close(write_out[1]));
-    fprintf(stderr, "Error pipe creation failed: %s\n", os_error_message);
+    Log::PrintErr("Error pipe creation failed: %s\n", os_error_message);
     return errno;
   }
 
diff --git a/runtime/bin/process_linux.cc b/runtime/bin/process_linux.cc
index ffc5c88..bd4ed87 100644
--- a/runtime/bin/process_linux.cc
+++ b/runtime/bin/process_linux.cc
@@ -15,6 +15,7 @@
 #include <unistd.h>
 
 #include "bin/fdutils.h"
+#include "bin/log.h"
 #include "bin/thread.h"
 
 extern char **environ;
@@ -327,7 +328,7 @@
   bool initialized = ExitCodeHandler::EnsureInitialized();
   if (!initialized) {
     SetChildOsErrorMessage(os_error_message, os_error_message_len);
-    fprintf(stderr,
+    Log::PrintErr(
             "Error initializing exit code handler: %s\n",
             os_error_message);
     return errno;
@@ -336,7 +337,7 @@
   result = TEMP_FAILURE_RETRY(pipe(read_in));
   if (result < 0) {
     SetChildOsErrorMessage(os_error_message, os_error_message_len);
-    fprintf(stderr, "Error pipe creation failed: %s\n", os_error_message);
+    Log::PrintErr("Error pipe creation failed: %s\n", os_error_message);
     return errno;
   }
 
@@ -345,7 +346,7 @@
     SetChildOsErrorMessage(os_error_message, os_error_message_len);
     TEMP_FAILURE_RETRY(close(read_in[0]));
     TEMP_FAILURE_RETRY(close(read_in[1]));
-    fprintf(stderr, "Error pipe creation failed: %s\n", os_error_message);
+    Log::PrintErr("Error pipe creation failed: %s\n", os_error_message);
     return errno;
   }
 
@@ -356,7 +357,7 @@
     TEMP_FAILURE_RETRY(close(read_in[1]));
     TEMP_FAILURE_RETRY(close(read_err[0]));
     TEMP_FAILURE_RETRY(close(read_err[1]));
-    fprintf(stderr, "Error pipe creation failed: %s\n", os_error_message);
+    Log::PrintErr("Error pipe creation failed: %s\n", os_error_message);
     return errno;
   }
 
@@ -369,7 +370,7 @@
     TEMP_FAILURE_RETRY(close(read_err[1]));
     TEMP_FAILURE_RETRY(close(write_out[0]));
     TEMP_FAILURE_RETRY(close(write_out[1]));
-    fprintf(stderr, "Error pipe creation failed: %s\n", os_error_message);
+    Log::PrintErr("Error pipe creation failed: %s\n", os_error_message);
     return errno;
   }
 
@@ -388,7 +389,7 @@
     TEMP_FAILURE_RETRY(close(write_out[1]));
     TEMP_FAILURE_RETRY(close(exec_control[0]));
     TEMP_FAILURE_RETRY(close(exec_control[1]));
-    fprintf(stderr, "fcntl failed: %s\n", os_error_message);
+    Log::PrintErr("fcntl failed: %s\n", os_error_message);
     return errno;
   }
 
@@ -487,7 +488,7 @@
     TEMP_FAILURE_RETRY(close(read_err[1]));
     TEMP_FAILURE_RETRY(close(write_out[0]));
     TEMP_FAILURE_RETRY(close(write_out[1]));
-    fprintf(stderr, "Error pipe creation failed: %s\n", os_error_message);
+    Log::PrintErr("Error pipe creation failed: %s\n", os_error_message);
     return errno;
   }
 
diff --git a/runtime/bin/process_macos.cc b/runtime/bin/process_macos.cc
index 11aac9f..aa15940 100644
--- a/runtime/bin/process_macos.cc
+++ b/runtime/bin/process_macos.cc
@@ -14,6 +14,7 @@
 #include <unistd.h>
 
 #include "bin/fdutils.h"
+#include "bin/log.h"
 #include "bin/thread.h"
 
 extern char **environ;
@@ -326,16 +327,15 @@
   bool initialized = ExitCodeHandler::EnsureInitialized();
   if (!initialized) {
     SetChildOsErrorMessage(os_error_message, os_error_message_len);
-    fprintf(stderr,
-            "Error initializing exit code handler: %s\n",
-            os_error_message);
+    Log::PrintErr("Error initializing exit code handler: %s\n",
+                       os_error_message);
     return errno;
   }
 
   result = TEMP_FAILURE_RETRY(pipe(read_in));
   if (result < 0) {
     SetChildOsErrorMessage(os_error_message, os_error_message_len);
-    fprintf(stderr, "Error pipe creation failed: %s\n", os_error_message);
+    Log::PrintErr("Error pipe creation failed: %s\n", os_error_message);
     return errno;
   }
 
@@ -344,7 +344,7 @@
     SetChildOsErrorMessage(os_error_message, os_error_message_len);
     TEMP_FAILURE_RETRY(close(read_in[0]));
     TEMP_FAILURE_RETRY(close(read_in[1]));
-    fprintf(stderr, "Error pipe creation failed: %s\n", os_error_message);
+    Log::PrintErr("Error pipe creation failed: %s\n", os_error_message);
     return errno;
   }
 
@@ -355,7 +355,7 @@
     TEMP_FAILURE_RETRY(close(read_in[1]));
     TEMP_FAILURE_RETRY(close(read_err[0]));
     TEMP_FAILURE_RETRY(close(read_err[1]));
-    fprintf(stderr, "Error pipe creation failed: %s\n", os_error_message);
+    Log::PrintErr("Error pipe creation failed: %s\n", os_error_message);
     return errno;
   }
 
@@ -368,7 +368,7 @@
     TEMP_FAILURE_RETRY(close(read_err[1]));
     TEMP_FAILURE_RETRY(close(write_out[0]));
     TEMP_FAILURE_RETRY(close(write_out[1]));
-    fprintf(stderr, "Error pipe creation failed: %s\n", os_error_message);
+    Log::PrintErr("Error pipe creation failed: %s\n", os_error_message);
     return errno;
   }
 
@@ -387,7 +387,7 @@
     TEMP_FAILURE_RETRY(close(write_out[1]));
     TEMP_FAILURE_RETRY(close(exec_control[0]));
     TEMP_FAILURE_RETRY(close(exec_control[1]));
-    fprintf(stderr, "fcntl failed: %s\n", os_error_message);
+    Log::PrintErr("fcntl failed: %s\n", os_error_message);
     return errno;
   }
 
@@ -486,7 +486,7 @@
     TEMP_FAILURE_RETRY(close(read_err[1]));
     TEMP_FAILURE_RETRY(close(write_out[0]));
     TEMP_FAILURE_RETRY(close(write_out[1]));
-    fprintf(stderr, "Error pipe creation failed: %s\n", os_error_message);
+    Log::PrintErr("Error pipe creation failed: %s\n", os_error_message);
     return errno;
   }
 
diff --git a/runtime/bin/process_win.cc b/runtime/bin/process_win.cc
index 3094176..0a9eb52 100644
--- a/runtime/bin/process_win.cc
+++ b/runtime/bin/process_win.cc
@@ -7,6 +7,7 @@
 #include "bin/builtin.h"
 #include "bin/process.h"
 #include "bin/eventhandler.h"
+#include "bin/log.h"
 #include "bin/thread.h"
 #include "bin/utils.h"
 #include "platform/globals.h"
@@ -221,7 +222,7 @@
                         NULL);
 
     if (handles[kWriteHandle] == INVALID_HANDLE_VALUE) {
-      fprintf(stderr, "CreateNamedPipe failed %d\n", GetLastError());
+      Log::PrintErr("CreateNamedPipe failed %d\n", GetLastError());
       return false;
     }
 
@@ -234,7 +235,7 @@
                    FILE_READ_ATTRIBUTES | FILE_FLAG_OVERLAPPED,
                    NULL);
     if (handles[kReadHandle] == INVALID_HANDLE_VALUE) {
-      fprintf(stderr, "CreateFile failed %d\n", GetLastError());
+      Log::PrintErr("CreateFile failed %d\n", GetLastError());
       return false;
     }
   } else {
@@ -250,7 +251,7 @@
                         NULL);
 
     if (handles[kReadHandle] == INVALID_HANDLE_VALUE) {
-      fprintf(stderr, "CreateNamedPipe failed %d\n", GetLastError());
+      Log::PrintErr("CreateNamedPipe failed %d\n", GetLastError());
       return false;
     }
 
@@ -263,7 +264,7 @@
                    FILE_WRITE_ATTRIBUTES | FILE_FLAG_OVERLAPPED,
                    NULL);
     if (handles[kWriteHandle] == INVALID_HANDLE_VALUE) {
-      fprintf(stderr, "CreateFile failed %d\n", GetLastError());
+      Log::PrintErr("CreateFile failed %d\n", GetLastError());
       return false;
     }
   }
@@ -275,7 +276,7 @@
   for (int i = kReadHandle; i < kWriteHandle; i++) {
     if (handles[i] != INVALID_HANDLE_VALUE) {
       if (!CloseHandle(handles[i])) {
-        fprintf(stderr, "CloseHandle failed %d\n", GetLastError());
+        Log::PrintErr("CloseHandle failed %d\n", GetLastError());
       }
       handles[i] = INVALID_HANDLE_VALUE;
     }
@@ -306,7 +307,7 @@
                     NULL);
   if (message_size == 0) {
     if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) {
-      fprintf(stderr, "FormatMessage failed %d\n", GetLastError());
+      Log::PrintErr("FormatMessage failed %d\n", GetLastError());
     }
     snprintf(os_error_message, os_error_message_len, "OS Error %d", error_code);
   }
@@ -338,14 +339,14 @@
   UUID uuid;
   RPC_STATUS status = UuidCreateSequential(&uuid);
   if (status != RPC_S_OK && status != RPC_S_UUID_LOCAL_ONLY) {
-    fprintf(stderr, "UuidCreateSequential failed %d\n", status);
+    Log::PrintErr("UuidCreateSequential failed %d\n", status);
     SetOsErrorMessage(os_error_message, os_error_message_len);
     return status;
   }
   RPC_CSTR uuid_string;
   status = UuidToString(&uuid, &uuid_string);
   if (status != RPC_S_OK) {
-    fprintf(stderr, "UuidToString failed %d\n", status);
+    Log::PrintErr("UuidToString failed %d\n", status);
     SetOsErrorMessage(os_error_message, os_error_message_len);
     return status;
   }
@@ -357,7 +358,7 @@
   }
   status = RpcStringFree(&uuid_string);
   if (status != RPC_S_OK) {
-    fprintf(stderr, "RpcStringFree failed %d\n", status);
+    Log::PrintErr("RpcStringFree failed %d\n", status);
     SetOsErrorMessage(os_error_message, os_error_message_len);
     return status;
   }
diff --git a/runtime/bin/run_vm_tests.cc b/runtime/bin/run_vm_tests.cc
index f539d31..d73b046 100644
--- a/runtime/bin/run_vm_tests.cc
+++ b/runtime/bin/run_vm_tests.cc
@@ -138,8 +138,8 @@
   bool set_vm_flags_success = Flags::ProcessCommandLineFlags(dart_argc,
                                                              dart_argv);
   ASSERT(set_vm_flags_success);
-  bool init_success = Dart::InitOnce(NULL, NULL, NULL);
-  ASSERT(init_success);
+  const char* err_msg = Dart::InitOnce(NULL, NULL, NULL);
+  ASSERT(err_msg == NULL);
   // Apply the filter to all registered tests.
   TestCaseBase::RunAll();
   // Apply the filter to all registered benchmarks.
diff --git a/runtime/bin/secure_socket.cc b/runtime/bin/secure_socket.cc
new file mode 100644
index 0000000..f297aed
--- /dev/null
+++ b/runtime/bin/secure_socket.cc
@@ -0,0 +1,484 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "bin/secure_socket.h"
+
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <nss.h>
+#include <pk11pub.h>
+#include <prerror.h>
+#include <prinit.h>
+#include <prnetdb.h>
+#include <ssl.h>
+#include <sslproto.h>
+
+#include "bin/builtin.h"
+#include "bin/dartutils.h"
+#include "bin/net/nss_memio.h"
+#include "bin/thread.h"
+#include "bin/utils.h"
+#include "platform/utils.h"
+
+#include "include/dart_api.h"
+
+bool SSLFilter::library_initialized_ = false;
+dart::Mutex SSLFilter::mutex_;  // To protect library initialization.
+// The password is needed when creating secure server sockets.  It can
+// be null if only secure client sockets are used.
+const char* SSLFilter::password_ = NULL;
+
+static const int kSSLFilterNativeFieldIndex = 0;
+
+static SSLFilter* GetFilter(Dart_NativeArguments args) {
+  SSLFilter* filter;
+  Dart_Handle dart_this = ThrowIfError(Dart_GetNativeArgument(args, 0));
+  ASSERT(Dart_IsInstance(dart_this));
+  ThrowIfError(Dart_GetNativeInstanceField(
+      dart_this,
+      kSSLFilterNativeFieldIndex,
+      reinterpret_cast<intptr_t*>(&filter)));
+  return filter;
+}
+
+
+static void SetFilter(Dart_NativeArguments args, SSLFilter* filter) {
+  Dart_Handle dart_this = ThrowIfError(Dart_GetNativeArgument(args, 0));
+  ASSERT(Dart_IsInstance(dart_this));
+  ThrowIfError(Dart_SetNativeInstanceField(
+      dart_this,
+      kSSLFilterNativeFieldIndex,
+      reinterpret_cast<intptr_t>(filter)));
+}
+
+
+void FUNCTION_NAME(SecureSocket_Init)(Dart_NativeArguments args) {
+  Dart_EnterScope();
+  Dart_Handle dart_this = ThrowIfError(Dart_GetNativeArgument(args, 0));
+  SSLFilter* filter = new SSLFilter;
+  SetFilter(args, filter);
+  filter->Init(dart_this);
+  Dart_ExitScope();
+}
+
+
+void FUNCTION_NAME(SecureSocket_Connect)(Dart_NativeArguments args) {
+  Dart_EnterScope();
+  Dart_Handle host_name_object = ThrowIfError(Dart_GetNativeArgument(args, 1));
+  Dart_Handle port_object = ThrowIfError(Dart_GetNativeArgument(args, 2));
+  Dart_Handle is_server_object = ThrowIfError(Dart_GetNativeArgument(args, 3));
+  Dart_Handle certificate_name_object =
+      ThrowIfError(Dart_GetNativeArgument(args, 4));
+
+  const char* host_name = NULL;
+  // TODO(whesse): Is truncating a Dart string containing \0 what we want?
+  ThrowIfError(Dart_StringToCString(host_name_object, &host_name));
+
+  int64_t port;
+  if (!DartUtils::GetInt64Value(port_object, &port) ||
+      port < 0 || port > 65535) {
+    Dart_ThrowException(DartUtils::NewDartArgumentError(
+      "Illegal port parameter in _SSLFilter.connect"));
+  }
+
+  if (!Dart_IsBoolean(is_server_object)) {
+    Dart_ThrowException(DartUtils::NewDartArgumentError(
+      "Illegal is_server parameter in _SSLFilter.connect"));
+  }
+  bool is_server = DartUtils::GetBooleanValue(is_server_object);
+
+  const char* certificate_name = NULL;
+  // If this is a server connection, get the certificate to connect with.
+  // TODO(whesse): Use this parameter for a client certificate as well.
+  if (is_server) {
+    if (!Dart_IsString(certificate_name_object)) {
+      Dart_ThrowException(DartUtils::NewDartArgumentError(
+          "Non-String certificate parameter in _SSLFilter.connect"));
+    }
+    ThrowIfError(Dart_StringToCString(certificate_name_object,
+                                      &certificate_name));
+  }
+
+  GetFilter(args)->Connect(host_name,
+                              static_cast<int>(port),
+                              is_server,
+                              certificate_name);
+  Dart_ExitScope();
+}
+
+
+void FUNCTION_NAME(SecureSocket_Destroy)(Dart_NativeArguments args) {
+  Dart_EnterScope();
+  SSLFilter* filter = GetFilter(args);
+  SetFilter(args, NULL);
+  filter->Destroy();
+  delete filter;
+  Dart_ExitScope();
+}
+
+
+void FUNCTION_NAME(SecureSocket_Handshake)(Dart_NativeArguments args) {
+  Dart_EnterScope();
+  GetFilter(args)->Handshake();
+  Dart_ExitScope();
+}
+
+
+void FUNCTION_NAME(SecureSocket_RegisterHandshakeCompleteCallback)(
+    Dart_NativeArguments args) {
+  Dart_EnterScope();
+  Dart_Handle handshake_complete =
+      ThrowIfError(Dart_GetNativeArgument(args, 1));
+  if (!Dart_IsClosure(handshake_complete)) {
+    Dart_ThrowException(DartUtils::NewDartArgumentError(
+        "Illegal argument to RegisterHandshakeCompleteCallback"));
+  }
+  GetFilter(args)->RegisterHandshakeCompleteCallback(handshake_complete);
+  Dart_ExitScope();
+}
+
+
+void FUNCTION_NAME(SecureSocket_ProcessBuffer)(Dart_NativeArguments args) {
+  Dart_EnterScope();
+  Dart_Handle buffer_id_object = ThrowIfError(Dart_GetNativeArgument(args, 1));
+  int64_t buffer_id = DartUtils::GetIntegerValue(buffer_id_object);
+  if (buffer_id < 0 || buffer_id >= SSLFilter::kNumBuffers) {
+    Dart_ThrowException(DartUtils::NewDartArgumentError(
+        "Illegal argument to ProcessBuffer"));
+  }
+
+  intptr_t bytes_read =
+      GetFilter(args)->ProcessBuffer(static_cast<int>(buffer_id));
+  Dart_SetReturnValue(args, Dart_NewInteger(bytes_read));
+  Dart_ExitScope();
+}
+
+
+void FUNCTION_NAME(SecureSocket_SetCertificateDatabase)
+    (Dart_NativeArguments args) {
+  Dart_EnterScope();
+  Dart_Handle certificate_database_object =
+      ThrowIfError(Dart_GetNativeArgument(args, 0));
+  // Check that the type is string, and get the UTF-8 C string value from it.
+  const char* certificate_database = NULL;
+  if (Dart_IsString(certificate_database_object)) {
+    ThrowIfError(Dart_StringToCString(certificate_database_object,
+                                      &certificate_database));
+  } else {
+    Dart_ThrowException(DartUtils::NewDartArgumentError(
+        "Non-String certificate directory argument to SetCertificateDatabase"));
+  }
+
+  Dart_Handle password_object = ThrowIfError(Dart_GetNativeArgument(args, 1));
+  // Check that the type is string or null,
+  // and get the UTF-8 C string value from it.
+  const char* password = NULL;
+  if (Dart_IsString(password_object)) {
+    ThrowIfError(Dart_StringToCString(password_object, &password));
+  } else if (Dart_IsNull(password_object)) {
+    // Pass the empty string as the password.
+    password = "";
+  } else {
+    Dart_ThrowException(DartUtils::NewDartArgumentError(
+        "Password argument to SetCertificateDatabase is not a String or null"));
+  }
+
+  SSLFilter::InitializeLibrary(certificate_database, password);
+  Dart_ExitScope();
+}
+
+
+void SSLFilter::Init(Dart_Handle dart_this) {
+  string_start_ = ThrowIfError(
+      Dart_NewPersistentHandle(DartUtils::NewString("start")));
+  string_length_ = ThrowIfError(
+      Dart_NewPersistentHandle(DartUtils::NewString("length")));
+
+  InitializeBuffers(dart_this);
+  filter_ = memio_CreateIOLayer(kMemioBufferSize);
+}
+
+
+void SSLFilter::InitializeBuffers(Dart_Handle dart_this) {
+  // Create SSLFilter buffers as ExternalUint8Array objects.
+  Dart_Handle dart_buffers_object = ThrowIfError(
+      Dart_GetField(dart_this, DartUtils::NewString("buffers")));
+  Dart_Handle dart_buffer_object =
+      Dart_ListGetAt(dart_buffers_object, kReadPlaintext);
+  Dart_Handle external_buffer_class =
+      Dart_InstanceGetClass(dart_buffer_object);
+  Dart_Handle dart_buffer_size = ThrowIfError(
+      Dart_GetField(external_buffer_class, DartUtils::NewString("SIZE")));
+  buffer_size_ = DartUtils::GetIntegerValue(dart_buffer_size);
+  if (buffer_size_ <= 0 || buffer_size_ > 1024 * 1024) {
+    Dart_ThrowException(
+        DartUtils::NewString("Invalid buffer size in _ExternalBuffer"));
+  }
+
+  Dart_Handle data_identifier = DartUtils::NewString("data");
+  for (int i = 0; i < kNumBuffers; ++i) {
+    dart_buffer_objects_[i] = ThrowIfError(
+        Dart_NewPersistentHandle(Dart_ListGetAt(dart_buffers_object, i)));
+    buffers_[i] = new uint8_t[buffer_size_];
+    Dart_Handle data = ThrowIfError(
+      Dart_NewExternalByteArray(buffers_[i], buffer_size_, NULL, NULL));
+    ThrowIfError(Dart_SetField(dart_buffer_objects_[i],
+                               data_identifier,
+                               data));
+  }
+}
+
+
+void SSLFilter::RegisterHandshakeCompleteCallback(Dart_Handle complete) {
+  ASSERT(NULL == handshake_complete_);
+  handshake_complete_ = ThrowIfError(Dart_NewPersistentHandle(complete));
+}
+
+
+void SSLFilter::InitializeLibrary(const char* certificate_database,
+                                  const char* password) {
+  MutexLocker locker(&mutex_);
+  if (!library_initialized_) {
+    library_initialized_ = true;
+    password_ = strdup(password);  // This one copy persists until Dart exits.
+    PR_Init(PR_USER_THREAD, PR_PRIORITY_NORMAL, 0);
+    // TODO(whesse): Verify there are no UTF-8 issues here.
+    SECStatus status = NSS_Init(certificate_database);
+    if (status != SECSuccess) {
+      ThrowPRException("Unsuccessful NSS_Init call.");
+    }
+
+    status = NSS_SetDomesticPolicy();
+    if (status != SECSuccess) {
+      ThrowPRException("Unsuccessful NSS_SetDomesticPolicy call.");
+    }
+    // Enable TLS, as well as SSL3 and SSL2.
+    status = SSL_OptionSetDefault(SSL_ENABLE_TLS, PR_TRUE);
+    if (status != SECSuccess) {
+      ThrowPRException("Unsuccessful SSL_OptionSetDefault enable TLS call.");
+    }
+  } else {
+    ThrowException("Called SSLFilter::InitializeLibrary more than once");
+  }
+}
+
+char* PasswordCallback(PK11SlotInfo* slot, PRBool retry, void* arg) {
+  if (!retry) {
+    return PL_strdup(static_cast<char*>(arg));  // Freed by NSS internals.
+  }
+  return NULL;
+}
+
+void SSLFilter::Connect(const char* host_name,
+                        int port,
+                        bool is_server,
+                        const char* certificate_name) {
+  is_server_ = is_server;
+  if (in_handshake_) {
+    ThrowException("Connect called while already in handshake state.");
+  }
+
+  filter_ = SSL_ImportFD(NULL, filter_);
+  if (filter_ == NULL) {
+    ThrowPRException("Unsuccessful SSL_ImportFD call");
+  }
+
+  SECStatus status;
+  if (is_server) {
+    PK11_SetPasswordFunc(PasswordCallback);
+    CERTCertDBHandle* certificate_database = CERT_GetDefaultCertDB();
+    if (certificate_database == NULL) {
+      ThrowPRException("Certificate database cannot be loaded");
+    }
+    CERTCertificate* certificate = CERT_FindCertByNameString(
+        certificate_database,
+        const_cast<char*>(certificate_name));
+    if (certificate == NULL) {
+      ThrowPRException("Cannot find server certificate by name");
+    }
+    SECKEYPrivateKey* key = PK11_FindKeyByAnyCert(
+        certificate,
+        static_cast<void*>(const_cast<char*>(password_)));
+    if (key == NULL) {
+      if (PR_GetError() == -8177) {
+        ThrowPRException("Certificate database password incorrect");
+      } else {
+        ThrowPRException("Unsuccessful PK11_FindKeyByAnyCert call."
+                         " Cannot find private key for certificate");
+      }
+    }
+    // kt_rsa (key type RSA) is an enum constant from the NSS libraries.
+    // TODO(whesse): Allow different key types.
+    status = SSL_ConfigSecureServer(filter_, certificate, key, kt_rsa);
+    if (status != SECSuccess) {
+      ThrowPRException("Unsuccessful SSL_ConfigSecureServer call");
+    }
+  } else {  // Client.
+    if (SSL_SetURL(filter_, host_name) == -1) {
+      ThrowPRException("Unsuccessful SetURL call");
+    }
+  }
+
+  PRBool as_server = is_server ? PR_TRUE : PR_FALSE;  // Convert bool to PRBool.
+  status = SSL_ResetHandshake(filter_, as_server);
+  if (status != SECSuccess) {
+    ThrowPRException("Unsuccessful SSL_ResetHandshake call");
+  }
+
+  // SetPeerAddress
+  PRNetAddr host_address;
+  char host_entry_buffer[PR_NETDB_BUF_SIZE];
+  PRHostEnt host_entry;
+  PRStatus rv = PR_GetHostByName(host_name, host_entry_buffer,
+                                 PR_NETDB_BUF_SIZE, &host_entry);
+  if (rv != PR_SUCCESS) {
+    ThrowPRException("Unsuccessful PR_GetHostByName call");
+  }
+
+  int index = PR_EnumerateHostEnt(0, &host_entry, port, &host_address);
+  if (index == -1 || index == 0) {
+    ThrowPRException("Unsuccessful PR_EnumerateHostEnt call");
+  }
+  memio_SetPeerName(filter_, &host_address);
+}
+
+
+void SSLFilter::Handshake() {
+  SECStatus status = SSL_ForceHandshake(filter_);
+  if (status == SECSuccess) {
+    if (in_handshake_) {
+      ThrowIfError(Dart_InvokeClosure(handshake_complete_, 0, NULL));
+      in_handshake_ = false;
+    }
+  } else {
+    PRErrorCode error = PR_GetError();
+    if (error == PR_WOULD_BLOCK_ERROR) {
+      if (!in_handshake_) {
+        in_handshake_ = true;
+      }
+    } else {
+      if (is_server_) {
+        ThrowPRException("Unexpected handshake error in server");
+      } else {
+        ThrowPRException("Unexpected handshake error in client");
+      }
+    }
+  }
+}
+
+
+void SSLFilter::Destroy() {
+  for (int i = 0; i < kNumBuffers; ++i) {
+    Dart_DeletePersistentHandle(dart_buffer_objects_[i]);
+    delete[] buffers_[i];
+  }
+  Dart_DeletePersistentHandle(string_start_);
+  Dart_DeletePersistentHandle(string_length_);
+  Dart_DeletePersistentHandle(handshake_complete_);
+  // TODO(whesse): Free NSS objects here.
+}
+
+
+intptr_t SSLFilter::ProcessBuffer(int buffer_index) {
+  Dart_Handle buffer_object = dart_buffer_objects_[buffer_index];
+  Dart_Handle start_object = ThrowIfError(
+      Dart_GetField(buffer_object, string_start_));
+  Dart_Handle length_object = ThrowIfError(
+      Dart_GetField(buffer_object, string_length_));
+  int64_t unsafe_start = DartUtils::GetIntegerValue(start_object);
+  int64_t unsafe_length = DartUtils::GetIntegerValue(length_object);
+  ASSERT(unsafe_start >= 0);
+  ASSERT(unsafe_start < buffer_size_);
+  ASSERT(unsafe_length >= 0);
+  ASSERT(unsafe_length <= buffer_size_);
+  intptr_t start = static_cast<intptr_t>(unsafe_start);
+  intptr_t length = static_cast<intptr_t>(unsafe_length);
+  uint8_t* buffer = buffers_[buffer_index];
+
+  int bytes_processed = 0;
+  switch (buffer_index) {
+    case kReadPlaintext: {
+      int bytes_free = buffer_size_ - start - length;
+      bytes_processed = PR_Read(filter_,
+                                buffer + start + length,
+                                bytes_free);
+      if (bytes_processed < 0) {
+        ASSERT(bytes_processed == -1);
+        // TODO(whesse): Handle unexpected errors here.
+        PRErrorCode pr_error = PR_GetError();
+        if (PR_WOULD_BLOCK_ERROR != pr_error) {
+          ThrowPRException("Error reading plaintext from SSLFilter");
+        }
+        bytes_processed = 0;
+      }
+      break;
+    }
+
+    case kWriteEncrypted: {
+      const uint8_t* buf1;
+      const uint8_t* buf2;
+      unsigned int len1;
+      unsigned int len2;
+      int bytes_free = buffer_size_ - start - length;
+      memio_Private* secret = memio_GetSecret(filter_);
+      memio_GetWriteParams(secret, &buf1, &len1, &buf2, &len2);
+      int bytes_to_send =
+          dart::Utils::Minimum(len1, static_cast<unsigned>(bytes_free));
+      if (bytes_to_send > 0) {
+        memmove(buffer + start + length, buf1, bytes_to_send);
+        bytes_processed = bytes_to_send;
+      }
+      bytes_to_send = dart::Utils::Minimum(len2,
+          static_cast<unsigned>(bytes_free - bytes_processed));
+      if (bytes_to_send > 0) {
+        memmove(buffer + start + length + bytes_processed, buf2,
+                bytes_to_send);
+        bytes_processed += bytes_to_send;
+      }
+      if (bytes_processed > 0) {
+        memio_PutWriteResult(secret, bytes_processed);
+      }
+      break;
+    }
+
+    case kReadEncrypted: {
+      if (length > 0) {
+        bytes_processed = length;
+        memio_Private* secret = memio_GetSecret(filter_);
+        uint8_t* filter_buf;
+        int free_bytes = memio_GetReadParams(secret, &filter_buf);
+        if (free_bytes < bytes_processed) bytes_processed = free_bytes;
+        memmove(filter_buf,
+                buffer + start,
+                bytes_processed);
+        memio_PutReadResult(secret, bytes_processed);
+      }
+      break;
+    }
+
+    case kWritePlaintext: {
+      if (length > 0) {
+        bytes_processed = PR_Write(filter_,
+                                   buffer + start,
+                                   length);
+      }
+
+      if (bytes_processed < 0) {
+        ASSERT(bytes_processed == -1);
+        // TODO(whesse): Handle unexpected errors here.
+        PRErrorCode pr_error = PR_GetError();
+        if (PR_WOULD_BLOCK_ERROR != pr_error) {
+          ThrowPRException("Error reading plaintext from SSLFilter");
+        }
+        bytes_processed = 0;
+      }
+      break;
+    }
+  }
+  return bytes_processed;
+}
diff --git a/runtime/bin/tls_socket.h b/runtime/bin/secure_socket.h
similarity index 77%
rename from runtime/bin/tls_socket.h
rename to runtime/bin/secure_socket.h
index fc39b70..22ef7dc 100644
--- a/runtime/bin/tls_socket.h
+++ b/runtime/bin/secure_socket.h
@@ -2,8 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#ifndef BIN_TLS_SOCKET_H_
-#define BIN_TLS_SOCKET_H_
+#ifndef BIN_SECURE_SOCKET_H_
+#define BIN_SECURE_SOCKET_H_
 
 #include <stdlib.h>
 #include <string.h>
@@ -44,15 +44,15 @@
 }
 
 /*
- * TlsFilter encapsulates the NSS SSL(TLS) code in a filter, that communicates
- * with the containing _TlsFilterImpl Dart object through four shared
+ * SSLFilter encapsulates the NSS SSL(TLS) code in a filter, that communicates
+ * with the containing _SecureFilterImpl Dart object through four shared
  * ExternalByteArray buffers, for reading and writing plaintext, and
  * reading and writing encrypted text.  The filter handles handshaking
  * and certificate verification.
  */
-class TlsFilter {
+class SSLFilter {
  public:
-  // These enums must agree with those in sdk/lib/io/tls_socket.dart.
+  // These enums must agree with those in sdk/lib/io/secure_socket.dart.
   enum BufferIndex {
     kReadPlaintext,
     kWritePlaintext,
@@ -61,26 +61,30 @@
     kNumBuffers
   };
 
-  TlsFilter()
+  SSLFilter()
       : string_start_(NULL),
         string_length_(NULL),
         handshake_complete_(NULL),
         in_handshake_(false),
-        memio_(NULL) { }
+        filter_(NULL) { }
 
   void Init(Dart_Handle dart_this);
-  void Connect(const char* host, int port);
+  void Connect(const char* host,
+               int port,
+               bool is_server,
+               const char* certificate_name);
   void Destroy();
-  void DestroyPlatformIndependent();
   void Handshake();
   void RegisterHandshakeCompleteCallback(Dart_Handle handshake_complete);
-  static void InitializeLibrary(const char* pkcert_directory);
+  static void InitializeLibrary(const char* certificate_database,
+                                const char* password);
 
   intptr_t ProcessBuffer(int bufferIndex);
 
  private:
   static const int kMemioBufferSize = 20 * KB;
   static bool library_initialized_;
+  static const char* password_;
   static dart::Mutex mutex_;  // To protect library initialization.
 
   uint8_t* buffers_[kNumBuffers];
@@ -90,12 +94,13 @@
   Dart_Handle dart_buffer_objects_[kNumBuffers];
   Dart_Handle handshake_complete_;
   bool in_handshake_;
-  PRFileDesc* memio_;
+  bool is_server_;
+  PRFileDesc* filter_;
 
   void InitializeBuffers(Dart_Handle dart_this);
   void InitializePlatformData();
 
-  DISALLOW_COPY_AND_ASSIGN(TlsFilter);
+  DISALLOW_COPY_AND_ASSIGN(SSLFilter);
 };
 
-#endif  // BIN_TLS_SOCKET_H_
+#endif  // BIN_SECURE_SOCKET_H_
diff --git a/runtime/bin/secure_socket_patch.dart b/runtime/bin/secure_socket_patch.dart
new file mode 100644
index 0000000..34edc7e
--- /dev/null
+++ b/runtime/bin/secure_socket_patch.dart
@@ -0,0 +1,58 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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 SecureSocket {
+  /* patch */ static void setCertificateDatabase(String certificateDatabase,
+                                                 [String password])
+      native "SecureSocket_SetCertificateDatabase";
+}
+
+
+patch class _SecureFilter {
+  /* patch */ factory _SecureFilter() => new _SecureFilterImpl();
+}
+
+
+/**
+ * _SecureFilterImpl wraps a filter that encrypts and decrypts data travelling
+ * over an encrypted socket.  The filter also handles the handshaking
+ * and certificate verification.
+ *
+ * The filter exposes its input and output buffers as Dart objects that
+ * are backed by an external C array of bytes, so that both Dart code and
+ * native code can access the same data.
+ */
+class _SecureFilterImpl
+    extends NativeFieldWrapperClass1
+    implements _SecureFilter {
+  _SecureFilterImpl() {
+    buffers = new List<_ExternalBuffer>(_SecureSocket.NUM_BUFFERS);
+    for (int i = 0; i < _SecureSocket.NUM_BUFFERS; ++i) {
+      buffers[i] = new _ExternalBuffer();
+    }
+  }
+
+  void connect(String hostName,
+               int port,
+               bool is_server,
+               String certificate_name) native "SecureSocket_Connect";
+
+  void destroy() {
+    buffers = null;
+    _destroy();
+  }
+
+  void _destroy() native "SecureSocket_Destroy";
+
+  void handshake() native "SecureSocket_Handshake";
+
+  void init() native "SecureSocket_Init";
+
+  int processBuffer(int bufferIndex) native "SecureSocket_ProcessBuffer";
+
+  void registerHandshakeCompleteCallback(Function handshakeCompleteHandler)
+      native "SecureSocket_RegisterHandshakeCompleteCallback";
+
+  List<_ExternalBuffer> buffers;
+}
diff --git a/runtime/bin/socket_android.cc b/runtime/bin/socket_android.cc
index eac7d12..cffae9f 100644
--- a/runtime/bin/socket_android.cc
+++ b/runtime/bin/socket_android.cc
@@ -8,8 +8,9 @@
 #include <string.h>
 #include <unistd.h>
 
-#include "bin/fdutils.h"
 #include "bin/socket.h"
+#include "bin/fdutils.h"
+#include "bin/log.h"
 
 
 bool Socket::Initialize() {
@@ -25,7 +26,7 @@
 
   fd = TEMP_FAILURE_RETRY(socket(AF_INET, SOCK_STREAM, 0));
   if (fd < 0) {
-    fprintf(stderr, "Error CreateConnect: %s\n", strerror(errno));
+    Log::PrintErr("Error CreateConnect: %s\n", strerror(errno));
     return -1;
   }
 
@@ -35,7 +36,7 @@
   server = gethostbyname(host);
   if (server == NULL) {
     TEMP_FAILURE_RETRY(close(fd));
-    fprintf(stderr, "Error CreateConnect: %s\n", strerror(errno));
+    Log::PrintErr("Error CreateConnect: %s\n", strerror(errno));
     return -1;
   }
 
@@ -93,7 +94,7 @@
           getsockname(fd,
                       reinterpret_cast<struct sockaddr *>(&socket_address),
                       &size))) {
-    fprintf(stderr, "Error getsockname: %s\n", strerror(errno));
+    Log::PrintErr("Error getsockname: %s\n", strerror(errno));
     return 0;
   }
   return ntohs(socket_address.sin_port);
@@ -108,14 +109,14 @@
           getpeername(fd,
                       reinterpret_cast<struct sockaddr *>(&socket_address),
                       &size))) {
-    fprintf(stderr, "Error getpeername: %s\n", strerror(errno));
+    Log::PrintErr("Error getpeername: %s\n", strerror(errno));
     return false;
   }
   if (inet_ntop(socket_address.sin_family,
                 reinterpret_cast<const void *>(&socket_address.sin_addr),
                 host,
                 INET_ADDRSTRLEN) == NULL) {
-    fprintf(stderr, "Error inet_ntop: %s\n", strerror(errno));
+    Log::PrintErr("Error inet_ntop: %s\n", strerror(errno));
     return false;
   }
   *port = ntohs(socket_address.sin_port);
@@ -185,7 +186,7 @@
 
   fd = TEMP_FAILURE_RETRY(socket(AF_INET, SOCK_STREAM, 0));
   if (fd < 0) {
-    fprintf(stderr, "Error CreateBind: %s\n", strerror(errno));
+    Log::PrintErr("Error CreateBind: %s\n", strerror(errno));
     return -1;
   }
 
@@ -205,12 +206,12 @@
                reinterpret_cast<struct sockaddr *>(&server_address),
                sizeof(server_address))) < 0) {
     TEMP_FAILURE_RETRY(close(fd));
-    fprintf(stderr, "Error Bind: %s\n", strerror(errno));
+    Log::PrintErr("Error Bind: %s\n", strerror(errno));
     return -1;
   }
 
   if (TEMP_FAILURE_RETRY(listen(fd, backlog)) != 0) {
-    fprintf(stderr, "Error Listen: %s\n", strerror(errno));
+    Log::PrintErr("Error Listen: %s\n", strerror(errno));
     return -1;
   }
 
diff --git a/runtime/bin/socket_linux.cc b/runtime/bin/socket_linux.cc
index 89dd267..d8be1dc 100644
--- a/runtime/bin/socket_linux.cc
+++ b/runtime/bin/socket_linux.cc
@@ -9,6 +9,7 @@
 #include <unistd.h>
 
 #include "bin/fdutils.h"
+#include "bin/log.h"
 #include "bin/socket.h"
 
 
@@ -25,7 +26,7 @@
 
   fd = TEMP_FAILURE_RETRY(socket(AF_INET, SOCK_STREAM, 0));
   if (fd < 0) {
-    fprintf(stderr, "Error CreateConnect: %s\n", strerror(errno));
+    Log::PrintErr("Error CreateConnect: %s\n", strerror(errno));
     return -1;
   }
 
@@ -39,7 +40,7 @@
   if (gethostbyname_r(
           host, &server, temp_buf, kTempBufSize, &unused, &err) != 0) {
     TEMP_FAILURE_RETRY(close(fd));
-    fprintf(stderr, "Error CreateConnect: %s\n", strerror(errno));
+    Log::PrintErr("Error CreateConnect: %s\n", strerror(errno));
     return -1;
   }
 
@@ -97,7 +98,7 @@
           getsockname(fd,
                       reinterpret_cast<struct sockaddr *>(&socket_address),
                       &size))) {
-    fprintf(stderr, "Error getsockname: %s\n", strerror(errno));
+    Log::PrintErr("Error getsockname: %s\n", strerror(errno));
     return 0;
   }
   return ntohs(socket_address.sin_port);
@@ -112,14 +113,14 @@
           getpeername(fd,
                       reinterpret_cast<struct sockaddr *>(&socket_address),
                       &size))) {
-    fprintf(stderr, "Error getpeername: %s\n", strerror(errno));
+    Log::PrintErr("Error getpeername: %s\n", strerror(errno));
     return false;
   }
   if (inet_ntop(socket_address.sin_family,
                 reinterpret_cast<const void *>(&socket_address.sin_addr),
                 host,
                 INET_ADDRSTRLEN) == NULL) {
-    fprintf(stderr, "Error inet_ntop: %s\n", strerror(errno));
+    Log::PrintErr("Error inet_ntop: %s\n", strerror(errno));
     return false;
   }
   *port = ntohs(socket_address.sin_port);
@@ -188,7 +189,7 @@
 
   fd = TEMP_FAILURE_RETRY(socket(AF_INET, SOCK_STREAM, 0));
   if (fd < 0) {
-    fprintf(stderr, "Error CreateBind: %s\n", strerror(errno));
+    Log::PrintErr("Error CreateBind: %s\n", strerror(errno));
     return -1;
   }
 
@@ -208,12 +209,12 @@
                reinterpret_cast<struct sockaddr *>(&server_address),
                sizeof(server_address))) < 0) {
     TEMP_FAILURE_RETRY(close(fd));
-    fprintf(stderr, "Error Bind: %s\n", strerror(errno));
+    Log::PrintErr("Error Bind: %s\n", strerror(errno));
     return -1;
   }
 
   if (TEMP_FAILURE_RETRY(listen(fd, backlog)) != 0) {
-    fprintf(stderr, "Error Listen: %s\n", strerror(errno));
+    Log::PrintErr("Error Listen: %s\n", strerror(errno));
     return -1;
   }
 
diff --git a/runtime/bin/socket_macos.cc b/runtime/bin/socket_macos.cc
index 32db433..275169f 100644
--- a/runtime/bin/socket_macos.cc
+++ b/runtime/bin/socket_macos.cc
@@ -9,6 +9,7 @@
 #include <unistd.h>
 
 #include "bin/fdutils.h"
+#include "bin/log.h"
 #include "bin/socket.h"
 
 
@@ -25,7 +26,7 @@
 
   fd = TEMP_FAILURE_RETRY(socket(AF_INET, SOCK_STREAM, 0));
   if (fd < 0) {
-    fprintf(stderr, "Error CreateConnect: %s\n", strerror(errno));
+    Log::PrintErr("Error CreateConnect: %s\n", strerror(errno));
     return -1;
   }
 
@@ -35,7 +36,7 @@
   server = gethostbyname(host);
   if (server == NULL) {
     TEMP_FAILURE_RETRY(close(fd));
-    fprintf(stderr, "Error CreateConnect: %s\n", strerror(errno));
+    Log::PrintErr("Error CreateConnect: %s\n", strerror(errno));
     return -1;
   }
 
@@ -93,7 +94,7 @@
           getsockname(fd,
                       reinterpret_cast<struct sockaddr *>(&socket_address),
                       &size))) {
-    fprintf(stderr, "Error getsockname: %s\n", strerror(errno));
+    Log::PrintErr("Error getsockname: %s\n", strerror(errno));
     return 0;
   }
   return ntohs(socket_address.sin_port);
@@ -108,14 +109,14 @@
           getpeername(fd,
                       reinterpret_cast<struct sockaddr *>(&socket_address),
                       &size))) {
-    fprintf(stderr, "Error getpeername: %s\n", strerror(errno));
+    Log::PrintErr("Error getpeername: %s\n", strerror(errno));
     return false;
   }
   if (inet_ntop(socket_address.sin_family,
                 reinterpret_cast<const void *>(&socket_address.sin_addr),
                 host,
                 INET_ADDRSTRLEN) == NULL) {
-    fprintf(stderr, "Error inet_ntop: %s\n", strerror(errno));
+    Log::PrintErr("Error inet_ntop: %s\n", strerror(errno));
     return false;
   }
   *port = ntohs(socket_address.sin_port);
@@ -184,7 +185,7 @@
 
   fd = TEMP_FAILURE_RETRY(socket(AF_INET, SOCK_STREAM, 0));
   if (fd < 0) {
-    fprintf(stderr, "Error CreateBind: %s\n", strerror(errno));
+    Log::PrintErr("Error CreateBind: %s\n", strerror(errno));
     return -1;
   }
 
@@ -204,12 +205,12 @@
                reinterpret_cast<struct sockaddr *>(&server_address),
                sizeof(server_address))) < 0) {
     TEMP_FAILURE_RETRY(close(fd));
-    fprintf(stderr, "Error Bind: %s\n", strerror(errno));
+    Log::PrintErr("Error Bind: %s\n", strerror(errno));
     return -1;
   }
 
   if (TEMP_FAILURE_RETRY(listen(fd, backlog)) != 0) {
-    fprintf(stderr, "Error Listen: %s\n", strerror(errno));
+    Log::PrintErr("Error Listen: %s\n", strerror(errno));
     return -1;
   }
 
diff --git a/runtime/bin/socket_patch.dart b/runtime/bin/socket_patch.dart
index 7ce75d3..6e58985 100644
--- a/runtime/bin/socket_patch.dart
+++ b/runtime/bin/socket_patch.dart
@@ -239,8 +239,8 @@
 
   bool _propagateError(Exception e) => false;
 
-  abstract bool _isListenSocket();
-  abstract bool _isPipe();
+  bool _isListenSocket();
+  bool _isPipe();
 
   // Is this socket closed.
   bool _closed;
@@ -465,7 +465,7 @@
   }
 
   void set onConnect(void callback()) {
-    if (_seenFirstOutEvent || _outputStream != null) {
+    if (_seenFirstOutEvent) {
       throw new StreamException(
           "Cannot set connect handler when already connected");
     }
@@ -509,7 +509,7 @@
     if (_outputStream == null) {
       if (_handlerMap[_SocketBase._OUT_EVENT] != null) {
         throw new StreamException(
-            "Cannot get input stream when socket handlers are used");
+            "Cannot get output stream when socket handlers are used");
       }
       _outputStream = new _SocketOutputStream(this);
     }
diff --git a/runtime/bin/socket_win.cc b/runtime/bin/socket_win.cc
index 102f078..6e1a0bc 100644
--- a/runtime/bin/socket_win.cc
+++ b/runtime/bin/socket_win.cc
@@ -4,6 +4,7 @@
 
 #include "bin/builtin.h"
 #include "bin/eventhandler.h"
+#include "bin/log.h"
 #include "bin/socket.h"
 
 bool Socket::Initialize() {
@@ -12,7 +13,7 @@
   WORD version_requested = MAKEWORD(1, 0);
   err = WSAStartup(version_requested, &winsock_data);
   if (err != 0) {
-    fprintf(stderr, "Unable to initialize Winsock: %d\n", WSAGetLastError());
+    Log::PrintErr("Unable to initialize Winsock: %d\n", WSAGetLastError());
   }
   return err == 0;
 }
@@ -43,7 +44,7 @@
   if (getsockname(socket_handle->socket(),
                   reinterpret_cast<struct sockaddr *>(&socket_address),
                   &size)) {
-    fprintf(stderr, "Error getsockname: %s\n", strerror(errno));
+    Log::PrintErr("Error getsockname: %s\n", strerror(errno));
     return 0;
   }
   return ntohs(socket_address.sin_port);
@@ -58,7 +59,7 @@
   if (getpeername(socket_handle->socket(),
                   reinterpret_cast<struct sockaddr *>(&socket_address),
                   &size)) {
-    fprintf(stderr, "Error getpeername: %s\n", strerror(errno));
+    Log::PrintErr("Error getpeername: %s\n", strerror(errno));
     return false;
   }
   *port = ntohs(socket_address.sin_port);
@@ -72,7 +73,7 @@
                                host,
                                &len);
   if (err != 0) {
-    fprintf(stderr, "Error WSAAddressToString: %d\n", WSAGetLastError());
+    Log::PrintErr("Error WSAAddressToString: %d\n", WSAGetLastError());
     return false;
   }
   return true;
diff --git a/runtime/bin/tls_socket.cc b/runtime/bin/tls_socket.cc
deleted file mode 100644
index c4bc0a5..0000000
--- a/runtime/bin/tls_socket.cc
+++ /dev/null
@@ -1,385 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-#include "bin/tls_socket.h"
-
-#include <errno.h>
-#include <fcntl.h>
-#include <sys/stat.h>
-#include <stdio.h>
-#include <string.h>
-
-#include <nss.h>
-#include <prerror.h>
-#include <prinit.h>
-#include <prnetdb.h>
-#include <ssl.h>
-
-#include "bin/builtin.h"
-#include "bin/dartutils.h"
-#include "bin/net/nss_memio.h"
-#include "bin/thread.h"
-#include "bin/utils.h"
-#include "platform/utils.h"
-
-#include "include/dart_api.h"
-
-bool TlsFilter::library_initialized_ = false;
-dart::Mutex TlsFilter::mutex_;  // To protect library initialization.
-static const int kTlsFilterNativeFieldIndex = 0;
-
-static TlsFilter* GetTlsFilter(Dart_NativeArguments args) {
-  TlsFilter* filter;
-  Dart_Handle dart_this = ThrowIfError(Dart_GetNativeArgument(args, 0));
-  ASSERT(Dart_IsInstance(dart_this));
-  ThrowIfError(Dart_GetNativeInstanceField(
-      dart_this,
-      kTlsFilterNativeFieldIndex,
-      reinterpret_cast<intptr_t*>(&filter)));
-  return filter;
-}
-
-
-static void SetTlsFilter(Dart_NativeArguments args, TlsFilter* filter) {
-  Dart_Handle dart_this = ThrowIfError(Dart_GetNativeArgument(args, 0));
-  ASSERT(Dart_IsInstance(dart_this));
-  ThrowIfError(Dart_SetNativeInstanceField(
-      dart_this,
-      kTlsFilterNativeFieldIndex,
-      reinterpret_cast<intptr_t>(filter)));
-}
-
-
-void FUNCTION_NAME(TlsSocket_Init)(Dart_NativeArguments args) {
-  Dart_EnterScope();
-  Dart_Handle dart_this = ThrowIfError(Dart_GetNativeArgument(args, 0));
-  TlsFilter* filter = new TlsFilter;
-  SetTlsFilter(args, filter);
-  filter->Init(dart_this);
-  Dart_ExitScope();
-}
-
-
-void FUNCTION_NAME(TlsSocket_Connect)(Dart_NativeArguments args) {
-  Dart_EnterScope();
-  Dart_Handle host_name = ThrowIfError(Dart_GetNativeArgument(args, 1));
-  Dart_Handle port_object = ThrowIfError(Dart_GetNativeArgument(args, 2));
-
-  const char* host_name_string = NULL;
-  // TODO(whesse): Is truncating a Dart string containing \0 what we want?
-  ThrowIfError(Dart_StringToCString(host_name, &host_name_string));
-
-  int64_t port;
-  if (!DartUtils::GetInt64Value(port_object, &port) ||
-      port < 0 || port > 65535) {
-    Dart_ThrowException(DartUtils::NewDartArgumentError(
-      "Illegal port parameter in TlsSocket"));
-  }
-
-  GetTlsFilter(args)->Connect(host_name_string, static_cast<int>(port));
-  Dart_ExitScope();
-}
-
-
-void FUNCTION_NAME(TlsSocket_Destroy)(Dart_NativeArguments args) {
-  Dart_EnterScope();
-  TlsFilter* filter = GetTlsFilter(args);
-  SetTlsFilter(args, NULL);
-  filter->Destroy();
-  delete filter;
-  Dart_ExitScope();
-}
-
-
-void FUNCTION_NAME(TlsSocket_Handshake)(Dart_NativeArguments args) {
-  Dart_EnterScope();
-  GetTlsFilter(args)->Handshake();
-  Dart_ExitScope();
-}
-
-
-void FUNCTION_NAME(TlsSocket_RegisterHandshakeCompleteCallback)(
-    Dart_NativeArguments args) {
-  Dart_EnterScope();
-  Dart_Handle handshake_complete =
-      ThrowIfError(Dart_GetNativeArgument(args, 1));
-  if (!Dart_IsClosure(handshake_complete)) {
-    Dart_ThrowException(DartUtils::NewDartArgumentError(
-        "Illegal argument to RegisterHandshakeCompleteCallback"));
-  }
-  GetTlsFilter(args)->RegisterHandshakeCompleteCallback(handshake_complete);
-  Dart_ExitScope();
-}
-
-
-void FUNCTION_NAME(TlsSocket_ProcessBuffer)(Dart_NativeArguments args) {
-  Dart_EnterScope();
-  Dart_Handle buffer_id_object = ThrowIfError(Dart_GetNativeArgument(args, 1));
-  int64_t buffer_id = DartUtils::GetIntegerValue(buffer_id_object);
-  if (buffer_id < 0 || buffer_id >= TlsFilter::kNumBuffers) {
-    Dart_ThrowException(DartUtils::NewDartArgumentError(
-        "Illegal argument to ProcessBuffer"));
-  }
-
-  intptr_t bytes_read =
-      GetTlsFilter(args)->ProcessBuffer(static_cast<int>(buffer_id));
-  Dart_SetReturnValue(args, Dart_NewInteger(bytes_read));
-  Dart_ExitScope();
-}
-
-
-void FUNCTION_NAME(TlsSocket_SetCertificateDatabase)
-    (Dart_NativeArguments args) {
-  Dart_EnterScope();
-  Dart_Handle dart_pkcert_dir = ThrowIfError(Dart_GetNativeArgument(args, 0));
-  // Check that the type is string, and get the UTF-8 C string value from it.
-  if (Dart_IsString(dart_pkcert_dir)) {
-    const char* pkcert_dir = NULL;
-    ThrowIfError(Dart_StringToCString(dart_pkcert_dir, &pkcert_dir));
-    TlsFilter::InitializeLibrary(pkcert_dir);
-  } else {
-    Dart_ThrowException(DartUtils::NewDartArgumentError(
-        "Non-String argument to SetCertificateDatabase"));
-  }
-  Dart_ExitScope();
-}
-
-
-void TlsFilter::Init(Dart_Handle dart_this) {
-  string_start_ = ThrowIfError(
-      Dart_NewPersistentHandle(DartUtils::NewString("start")));
-  string_length_ = ThrowIfError(
-      Dart_NewPersistentHandle(DartUtils::NewString("length")));
-
-  InitializeBuffers(dart_this);
-  memio_ = memio_CreateIOLayer(kMemioBufferSize);
-}
-
-
-void TlsFilter::InitializeBuffers(Dart_Handle dart_this) {
-  // Create TlsFilter buffers as ExternalUint8Array objects.
-  Dart_Handle dart_buffers_object = ThrowIfError(
-      Dart_GetField(dart_this, DartUtils::NewString("buffers")));
-  Dart_Handle dart_buffer_object =
-      Dart_ListGetAt(dart_buffers_object, kReadPlaintext);
-  Dart_Handle tls_external_buffer_class =
-      Dart_InstanceGetClass(dart_buffer_object);
-  Dart_Handle dart_buffer_size = ThrowIfError(
-      Dart_GetField(tls_external_buffer_class, DartUtils::NewString("SIZE")));
-  buffer_size_ = DartUtils::GetIntegerValue(dart_buffer_size);
-  if (buffer_size_ <= 0 || buffer_size_ > 1024 * 1024) {
-    Dart_ThrowException(
-        DartUtils::NewString("Invalid buffer size in _TlsExternalBuffer"));
-  }
-
-  Dart_Handle data_identifier = DartUtils::NewString("data");
-  for (int i = 0; i < kNumBuffers; ++i) {
-    dart_buffer_objects_[i] = ThrowIfError(
-        Dart_NewPersistentHandle(Dart_ListGetAt(dart_buffers_object, i)));
-    buffers_[i] = new uint8_t[buffer_size_];
-    Dart_Handle data = ThrowIfError(
-      Dart_NewExternalByteArray(buffers_[i], buffer_size_, NULL, NULL));
-    ThrowIfError(Dart_SetField(dart_buffer_objects_[i],
-                               data_identifier,
-                               data));
-  }
-}
-
-
-void TlsFilter::RegisterHandshakeCompleteCallback(Dart_Handle complete) {
-  ASSERT(NULL == handshake_complete_);
-  handshake_complete_ = ThrowIfError(Dart_NewPersistentHandle(complete));
-}
-
-
-void TlsFilter::InitializeLibrary(const char* pkcert_database) {
-  MutexLocker locker(&mutex_);
-  if (!library_initialized_) {
-    PR_Init(PR_USER_THREAD, PR_PRIORITY_NORMAL, 0);
-    // TODO(whesse): Verify there are no UTF-8 issues here.
-    SECStatus status = NSS_Init(pkcert_database);
-    if (status != SECSuccess) {
-      ThrowPRException("Unsuccessful NSS_Init call.");
-    }
-
-    status = NSS_SetDomesticPolicy();
-    if (status != SECSuccess) {
-      ThrowPRException("Unsuccessful NSS_SetDomesticPolicy call.");
-    }
-  } else {
-    ThrowException("Called TlsFilter::InitializeLibrary more than once");
-  }
-}
-
-
-void TlsFilter::Connect(const char* host, int port) {
-  if (in_handshake_) {
-    ThrowException("Connect called while already in handshake state.");
-  }
-  PRFileDesc* my_socket = memio_;
-
-  my_socket = SSL_ImportFD(NULL, my_socket);
-  if (my_socket == NULL) {
-    ThrowPRException("Unsuccessful SSL_ImportFD call");
-  }
-
-  if (SSL_SetURL(my_socket, host) == -1) {
-    ThrowPRException("Unsuccessful SetURL call");
-  }
-
-  SECStatus status = SSL_ResetHandshake(my_socket, PR_FALSE);
-  if (status != SECSuccess) {
-    ThrowPRException("Unsuccessful SSL_ResetHandshake call");
-  }
-
-  // SetPeerAddress
-  PRNetAddr host_address;
-  char host_entry_buffer[PR_NETDB_BUF_SIZE];
-  PRHostEnt host_entry;
-  PRStatus rv = PR_GetHostByName(host, host_entry_buffer,
-                                 PR_NETDB_BUF_SIZE, &host_entry);
-  if (rv != PR_SUCCESS) {
-    ThrowPRException("Unsuccessful PR_GetHostByName call");
-  }
-
-  int index = PR_EnumerateHostEnt(0, &host_entry, port, &host_address);
-  if (index == -1 || index == 0) {
-    ThrowPRException("Unsuccessful PR_EnumerateHostEnt call");
-  }
-
-  memio_SetPeerName(my_socket, &host_address);
-  memio_ = my_socket;
-}
-
-
-void TlsFilter::Handshake() {
-  SECStatus status = SSL_ForceHandshake(memio_);
-  if (status == SECSuccess) {
-    if (in_handshake_) {
-      ThrowIfError(Dart_InvokeClosure(handshake_complete_, 0, NULL));
-      in_handshake_ = false;
-    }
-  } else {
-    PRErrorCode error = PR_GetError();
-    if (error == PR_WOULD_BLOCK_ERROR) {
-      if (!in_handshake_) {
-        in_handshake_ = true;
-      }
-    } else {
-      ThrowPRException("Unexpected handshake error");
-    }
-  }
-}
-
-
-void TlsFilter::Destroy() {
-  for (int i = 0; i < kNumBuffers; ++i) {
-    Dart_DeletePersistentHandle(dart_buffer_objects_[i]);
-    delete[] buffers_[i];
-  }
-  Dart_DeletePersistentHandle(string_start_);
-  Dart_DeletePersistentHandle(string_length_);
-  Dart_DeletePersistentHandle(handshake_complete_);
-  // TODO(whesse): Free NSS objects here.
-}
-
-
-intptr_t TlsFilter::ProcessBuffer(int buffer_index) {
-  Dart_Handle buffer_object = dart_buffer_objects_[buffer_index];
-  Dart_Handle start_object = ThrowIfError(
-      Dart_GetField(buffer_object, string_start_));
-  Dart_Handle length_object = ThrowIfError(
-      Dart_GetField(buffer_object, string_length_));
-  int64_t unsafe_start = DartUtils::GetIntegerValue(start_object);
-  int64_t unsafe_length = DartUtils::GetIntegerValue(length_object);
-  ASSERT(unsafe_start >= 0);
-  ASSERT(unsafe_start < buffer_size_);
-  ASSERT(unsafe_length >= 0);
-  ASSERT(unsafe_length <= buffer_size_);
-  intptr_t start = static_cast<intptr_t>(unsafe_start);
-  intptr_t length = static_cast<intptr_t>(unsafe_length);
-  uint8_t* buffer = buffers_[buffer_index];
-
-  int bytes_processed = 0;
-  switch (buffer_index) {
-    case kReadPlaintext: {
-      int bytes_free = buffer_size_ - start - length;
-      bytes_processed = PR_Read(memio_,
-                                buffer + start + length,
-                                bytes_free);
-      if (bytes_processed < 0) {
-        ASSERT(bytes_processed == -1);
-        // TODO(whesse): Handle unexpected errors here.
-        PRErrorCode pr_error = PR_GetError();
-        if (PR_WOULD_BLOCK_ERROR != pr_error) {
-          ThrowPRException("Error reading plaintext from TlsFilter");
-        }
-        bytes_processed = 0;
-      }
-      break;
-    }
-
-    case kWriteEncrypted: {
-      const uint8_t* buf1;
-      const uint8_t* buf2;
-      unsigned int len1;
-      unsigned int len2;
-      int bytes_free = buffer_size_ - start - length;
-      memio_Private* secret = memio_GetSecret(memio_);
-      memio_GetWriteParams(secret, &buf1, &len1, &buf2, &len2);
-      int bytes_to_send =
-          dart::Utils::Minimum(len1, static_cast<unsigned>(bytes_free));
-      if (bytes_to_send > 0) {
-        memmove(buffer + start + length, buf1, bytes_to_send);
-        bytes_processed = bytes_to_send;
-      }
-      bytes_to_send = dart::Utils::Minimum(len2,
-          static_cast<unsigned>(bytes_free - bytes_processed));
-      if (bytes_to_send > 0) {
-        memmove(buffer + start + length + bytes_processed, buf2,
-                bytes_to_send);
-        bytes_processed += bytes_to_send;
-      }
-      if (bytes_processed > 0) {
-        memio_PutWriteResult(secret, bytes_processed);
-      }
-      break;
-    }
-
-    case kReadEncrypted: {
-      if (length > 0) {
-        bytes_processed = length;
-        memio_Private* secret = memio_GetSecret(memio_);
-        uint8_t* memio_buf;
-        int free_bytes = memio_GetReadParams(secret, &memio_buf);
-        if (free_bytes < bytes_processed) bytes_processed = free_bytes;
-        memmove(memio_buf,
-                buffer + start,
-                bytes_processed);
-        memio_PutReadResult(secret, bytes_processed);
-      }
-      break;
-    }
-
-    case kWritePlaintext: {
-      if (length > 0) {
-        bytes_processed = PR_Write(memio_,
-                                   buffer + start,
-                                   length);
-      }
-
-      if (bytes_processed < 0) {
-        ASSERT(bytes_processed == -1);
-        // TODO(whesse): Handle unexpected errors here.
-        PRErrorCode pr_error = PR_GetError();
-        if (PR_WOULD_BLOCK_ERROR != pr_error) {
-          ThrowPRException("Error reading plaintext from TlsFilter");
-        }
-        bytes_processed = 0;
-      }
-      break;
-    }
-  }
-  return bytes_processed;
-}
diff --git a/runtime/bin/tls_socket_patch.dart b/runtime/bin/tls_socket_patch.dart
deleted file mode 100644
index 73e40e8..0000000
--- a/runtime/bin/tls_socket_patch.dart
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-patch class TlsSocket {
-  /* patch */ static void setCertificateDatabase(String pkcertDirectory)
-      native "TlsSocket_SetCertificateDatabase";
-}
-
-
-patch class _TlsFilter {
-  /* patch */ factory _TlsFilter() => new _TlsFilterImpl();
-}
-
-
-/**
- * _TlsFilterImpl wraps a filter that encrypts and decrypts data travelling
- * over a TLS encrypted socket.  The filter also handles the handshaking
- * and certificate verification.
- *
- * The filter exposes its input and output buffers as Dart objects that
- * are backed by an external C array of bytes, so that both Dart code and
- * native code can access the same data.
- */
-class _TlsFilterImpl extends NativeFieldWrapperClass1 implements _TlsFilter {
-  _TlsFilterImpl() {
-    buffers = new List<_TlsExternalBuffer>(_TlsSocket.NUM_BUFFERS);
-    for (int i = 0; i < _TlsSocket.NUM_BUFFERS; ++i) {
-      buffers[i] = new _TlsExternalBuffer();
-    }
-  }
-
-  void connect(String hostName, int port) native "TlsSocket_Connect";
-
-  void destroy() {
-    buffers = null;
-    _destroy();
-  }
-
-  void _destroy() native "TlsSocket_Destroy";
-
-  void handshake() native "TlsSocket_Handshake";
-
-  void init() native "TlsSocket_Init";
-
-  int processBuffer(int bufferIndex) native "TlsSocket_ProcessBuffer";
-
-  void registerHandshakeCompleteCallback(Function handshakeCompleteHandler)
-      native "TlsSocket_RegisterHandshakeCompleteCallback";
-
-  List<_TlsExternalBuffer> buffers;
-}
diff --git a/runtime/bin/utils_win.cc b/runtime/bin/utils_win.cc
index 9ee1777..f9603f8 100644
--- a/runtime/bin/utils_win.cc
+++ b/runtime/bin/utils_win.cc
@@ -5,6 +5,7 @@
 #include <errno.h>
 
 #include "bin/utils.h"
+#include "bin/log.h"
 
 static void FormatMessageIntoBuffer(DWORD code,
                                     char* buffer,
@@ -19,7 +20,7 @@
                     NULL);
   if (message_size == 0) {
     if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) {
-      fprintf(stderr, "FormatMessage failed %d\n", GetLastError());
+      Log::PrintErr("FormatMessage failed %d\n", GetLastError());
     }
     snprintf(buffer, buffer_length, "OS Error %d", code);
   }
diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h
index 8cc518a..821014c 100755
--- a/runtime/include/dart_api.h
+++ b/runtime/include/dart_api.h
@@ -1388,7 +1388,7 @@
  * \return The String object if no error occurs. Otherwise returns
  *   an error handle.
  */
-DART_EXPORT Dart_Handle Dart_NewStringFromUTF32(const uint32_t* utf32_array,
+DART_EXPORT Dart_Handle Dart_NewStringFromUTF32(const int32_t* utf32_array,
                                                 intptr_t length);
 
 /**
diff --git a/runtime/lib/array.dart b/runtime/lib/array.dart
index 1fb17fb..5bef0d0 100644
--- a/runtime/lib/array.dart
+++ b/runtime/lib/array.dart
@@ -138,6 +138,10 @@
         "Cannot remove in a non-extendable array");
   }
 
+  E get first {
+    return this[0];
+  }
+
   E get last {
     return this[length - 1];
   }
@@ -285,6 +289,10 @@
         "Cannot remove in a non-extendable array");
   }
 
+  E get first {
+    return this[0];
+  }
+
   E get last {
     return this[length - 1];
   }
diff --git a/runtime/lib/array_patch.dart b/runtime/lib/array_patch.dart
index 5bb7ec2c..2887a99 100644
--- a/runtime/lib/array_patch.dart
+++ b/runtime/lib/array_patch.dart
@@ -5,7 +5,7 @@
 // Note that the optimizing compiler depends on the algorithm which
 // returns a _GrowableObjectArray if length is null, otherwise returns
 // fixed size array.
-patch class _ListImpl<E> {
+patch class List<E> {
   /* patch */ factory List([int length = null]) {
     if (length == null) {
       return new _GrowableObjectArray<E>();
@@ -14,14 +14,6 @@
     }
   }
 
-  /* patch */ factory List.from(Iterable<E> other) {
-    _GrowableObjectArray<E> list = new _GrowableObjectArray<E>();
-    for (final e in other) {
-      list.add(e);
-    }
-    return list;
-  }
-
   // Factory constructing a mutable List from a parser generated List literal.
   // [elements] contains elements that are already type checked.
   factory List._fromLiteral(List elements) {
diff --git a/runtime/lib/byte_array.dart b/runtime/lib/byte_array.dart
index 0f97c3d..aa8e5dc 100644
--- a/runtime/lib/byte_array.dart
+++ b/runtime/lib/byte_array.dart
@@ -115,11 +115,11 @@
 
 
 abstract class _ByteArrayBase {
-  abstract int lengthInBytes();
+  int lengthInBytes();
 
-  abstract int bytesPerElement();
+  int bytesPerElement();
 
-  abstract operator[](int index);
+  operator[](int index);
 
   // Methods implementing the Collection interface.
 
@@ -184,7 +184,7 @@
   }
 
   void sort([Comparator compare = Comparable.compare]) {
-    _Sort.sort(this, compare);
+    coreSort(this, compare);
   }
 
   int indexOf(element, [int start = 0]) {
@@ -206,6 +206,10 @@
         "Cannot remove from a non-extendable array");
   }
 
+  get first {
+    return this[0];
+  }
+
   get last {
     return this[length - 1];
   }
@@ -1601,7 +1605,7 @@
 
 
 class _ByteArrayViewBase {
-  abstract num operator[](int index);
+  num operator[](int index);
 
   // Methods implementing the Collection interface.
 
@@ -1637,7 +1641,7 @@
     return this.length == 0;
   }
 
-  abstract int get length;
+  int get length;
 
   // Methods implementing the List interface.
 
@@ -1662,7 +1666,7 @@
   }
 
   void sort([Comparator compare = Comparable.compare]) {
-    _Sort.sort(this, compare);
+    coreSort(this, compare);
   }
 
   int indexOf(element, [int start = 0]) {
@@ -1684,6 +1688,10 @@
         "Cannot remove from a non-extendable array");
   }
 
+  get first {
+    return this[0];
+  }
+
   get last {
     return this[length - 1];
   }
diff --git a/runtime/lib/double.cc b/runtime/lib/double.cc
index 05977ba..76babac 100644
--- a/runtime/lib/double.cc
+++ b/runtime/lib/double.cc
@@ -11,6 +11,7 @@
 #include "vm/exceptions.h"
 #include "vm/native_entry.h"
 #include "vm/object.h"
+#include "vm/symbols.h"
 
 namespace dart {
 
@@ -202,6 +203,61 @@
 }
 
 
+DEFINE_NATIVE_ENTRY(Double_parse, 1) {
+  GET_NATIVE_ARGUMENT(String, value, arguments->NativeArgAt(0));
+  const String& dummy_key = String::Handle(Symbols::Empty());
+  Scanner scanner(value, dummy_key);
+  const Scanner::GrowableTokenStream& tokens = scanner.GetStream();
+  String* number_string;
+  bool is_positive;
+  if (Scanner::IsValidLiteral(tokens,
+                              Token::kDOUBLE,
+                              &is_positive,
+                              &number_string)) {
+    const char* cstr = number_string->ToCString();
+    char* p_end = NULL;
+    double double_value = strtod(cstr, &p_end);
+    ASSERT(p_end != cstr);
+    if (!is_positive) {
+      double_value = -double_value;
+    }
+    return Double::New(double_value);
+  }
+
+  if (Scanner::IsValidLiteral(tokens,
+                              Token::kINTEGER,
+                              &is_positive,
+                              &number_string)) {
+    Integer& res = Integer::Handle(Integer::New(*number_string));
+    if (is_positive) {
+      return Double::New(res.AsDoubleValue());
+    }
+    return Double::New(-res.AsDoubleValue());
+  }
+
+  // Infinity and nan.
+  if (Scanner::IsValidLiteral(tokens,
+                              Token::kIDENT,
+                              &is_positive,
+                              &number_string)) {
+    if (number_string->Equals("NaN")) {
+      return Double::New(NAN);
+    }
+    if (number_string->Equals("Infinity")) {
+      if (is_positive) {
+        return Double::New(INFINITY);
+      }
+      return Double::New(-INFINITY);
+    }
+  }
+
+  GrowableArray<const Object*> args;
+  args.Add(&value);
+  Exceptions::ThrowByType(Exceptions::kFormat, args);
+  return Object::null();
+}
+
+
 DEFINE_NATIVE_ENTRY(Double_toStringAsFixed, 2) {
   // The boundaries are exclusive.
   static const double kLowerBoundary = -1e21;
diff --git a/runtime/lib/double.dart b/runtime/lib/double.dart
index f4025f3..aee84e2 100644
--- a/runtime/lib/double.dart
+++ b/runtime/lib/double.dart
@@ -114,7 +114,9 @@
     if (exponent == 0) {
       return 1.0;  // ECMA-262 15.8.2.13
     }
-    // Throw NullPointerException if exponent is null.
+    if (exponent is! num) {
+      throw new ArgumentError(null);
+    }
     double doubleExponent = exponent.toDouble();
     if (isNaN || exponent.isNaN) {
       return double.NAN;
diff --git a/runtime/lib/double_patch.dart b/runtime/lib/double_patch.dart
index d293249..5e6cc11 100644
--- a/runtime/lib/double_patch.dart
+++ b/runtime/lib/double_patch.dart
@@ -7,5 +7,5 @@
 
 patch class double {
   /* patch */
-  static double parse(String string) native "MathNatives_parseDouble";
+  static double parse(String string) native "Double_parse";
 }
diff --git a/runtime/lib/errors_patch.dart b/runtime/lib/errors_patch.dart
index d09dc3d..12caead 100644
--- a/runtime/lib/errors_patch.dart
+++ b/runtime/lib/errors_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 NoSuchMethodError {
+patch class Error {
   /* patch */ static String _objectToString(Object object) {
     return Object._toString(object);
   }
diff --git a/runtime/lib/expando_patch.dart b/runtime/lib/expando_patch.dart
index a218af6..5c61969 100644
--- a/runtime/lib/expando_patch.dart
+++ b/runtime/lib/expando_patch.dart
@@ -54,10 +54,7 @@
   }
 
   static _checkType(object) {
-    if (object == null) {
-      throw new NullPointerException();
-    }
-    if (object is bool || object is num || object is String) {
+    if (object == null || object is bool || object is num || object is String) {
       throw new ArgumentError(object);
     }
   }
diff --git a/runtime/lib/growable_array.dart b/runtime/lib/growable_array.dart
index a34bca0..2e012c2 100644
--- a/runtime/lib/growable_array.dart
+++ b/runtime/lib/growable_array.dart
@@ -145,6 +145,10 @@
     return elem;
   }
 
+  T get first {
+    return this[0];
+  }
+
   T get last {
     return this[length - 1];
   }
diff --git a/runtime/lib/integers.cc b/runtime/lib/integers.cc
index c9cf18d..9c379ca 100644
--- a/runtime/lib/integers.cc
+++ b/runtime/lib/integers.cc
@@ -9,6 +9,7 @@
 #include "vm/exceptions.h"
 #include "vm/native_entry.h"
 #include "vm/object.h"
+#include "vm/symbols.h"
 
 namespace dart {
 
@@ -172,6 +173,32 @@
 }
 
 
+DEFINE_NATIVE_ENTRY(Integer_parse, 1) {
+  GET_NATIVE_ARGUMENT(String, value, arguments->NativeArgAt(0));
+  const String& dummy_key = String::Handle(Symbols::Empty());
+  Scanner scanner(value, dummy_key);
+  const Scanner::GrowableTokenStream& tokens = scanner.GetStream();
+  String* int_string;
+  bool is_positive;
+  if (Scanner::IsValidLiteral(tokens,
+                             Token::kINTEGER,
+                             &is_positive,
+                             &int_string)) {
+    if (is_positive) {
+      return Integer::New(*int_string);
+    }
+    String& temp = String::Handle();
+    temp = String::Concat(String::Handle(Symbols::New("-")), *int_string);
+    return Integer::New(temp);
+  }
+
+  GrowableArray<const Object*> args;
+  args.Add(&value);
+  Exceptions::ThrowByType(Exceptions::kFormat, args);
+  return Object::null();
+}
+
+
 static RawInteger* ShiftOperationHelper(Token::Kind kind,
                                         const Integer& value,
                                         const Smi& amount) {
diff --git a/runtime/lib/integers_patch.dart b/runtime/lib/integers_patch.dart
index c931ed4..162c050 100644
--- a/runtime/lib/integers_patch.dart
+++ b/runtime/lib/integers_patch.dart
@@ -6,5 +6,5 @@
 // VM implementation of int.
 
 patch class int {
-  /* patch */ static int parse(String str) native "MathNatives_parseInt";
+  /* patch */ static int parse(String str) native "Integer_parse";
 }
diff --git a/runtime/lib/lib_sources.gypi b/runtime/lib/lib_sources.gypi
index 2bffa7e..28c9afd 100644
--- a/runtime/lib/lib_sources.gypi
+++ b/runtime/lib/lib_sources.gypi
@@ -28,8 +28,6 @@
     'integers_patch.dart',
     'invocation_mirror_patch.dart',
     'map_patch.dart',
-    'math.dart',
-    'math.cc',
     'object.cc',
     'object_patch.dart',
     'print_patch.dart',
diff --git a/runtime/lib/math.cc b/runtime/lib/math.cc
index de48b16..ff4e6af 100644
--- a/runtime/lib/math.cc
+++ b/runtime/lib/math.cc
@@ -10,168 +10,60 @@
 #include "vm/exceptions.h"
 #include "vm/native_entry.h"
 #include "vm/object.h"
-#include "vm/random.h"
 #include "vm/scanner.h"
 #include "vm/symbols.h"
 
 namespace dart {
 
-DEFINE_NATIVE_ENTRY(MathNatives_sqrt, 1) {
+DEFINE_NATIVE_ENTRY(Math_sqrt, 1) {
   GET_NATIVE_ARGUMENT(Double, operand, arguments->NativeArgAt(0));
   return Double::New(sqrt(operand.value()));
 }
 
-DEFINE_NATIVE_ENTRY(MathNatives_sin, 1) {
+DEFINE_NATIVE_ENTRY(Math_sin, 1) {
   GET_NATIVE_ARGUMENT(Double, operand, arguments->NativeArgAt(0));
   return Double::New(sin(operand.value()));
 }
 
-DEFINE_NATIVE_ENTRY(MathNatives_cos, 1) {
+DEFINE_NATIVE_ENTRY(Math_cos, 1) {
   GET_NATIVE_ARGUMENT(Double, operand, arguments->NativeArgAt(0));
   return Double::New(cos(operand.value()));
 }
 
-DEFINE_NATIVE_ENTRY(MathNatives_tan, 1) {
+DEFINE_NATIVE_ENTRY(Math_tan, 1) {
   GET_NATIVE_ARGUMENT(Double, operand, arguments->NativeArgAt(0));
   return Double::New(tan(operand.value()));
 }
 
-DEFINE_NATIVE_ENTRY(MathNatives_asin, 1) {
+DEFINE_NATIVE_ENTRY(Math_asin, 1) {
   GET_NATIVE_ARGUMENT(Double, operand, arguments->NativeArgAt(0));
   return Double::New(asin(operand.value()));
 }
 
-DEFINE_NATIVE_ENTRY(MathNatives_acos, 1) {
+DEFINE_NATIVE_ENTRY(Math_acos, 1) {
   GET_NATIVE_ARGUMENT(Double, operand, arguments->NativeArgAt(0));
   return Double::New(acos(operand.value()));
 }
 
-DEFINE_NATIVE_ENTRY(MathNatives_atan, 1) {
+DEFINE_NATIVE_ENTRY(Math_atan, 1) {
   GET_NATIVE_ARGUMENT(Double, operand, arguments->NativeArgAt(0));
   return Double::New(atan(operand.value()));
 }
 
-DEFINE_NATIVE_ENTRY(MathNatives_atan2, 2) {
+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()));
 }
 
-DEFINE_NATIVE_ENTRY(MathNatives_exp, 1) {
+DEFINE_NATIVE_ENTRY(Math_exp, 1) {
   GET_NATIVE_ARGUMENT(Double, operand, arguments->NativeArgAt(0));
   return Double::New(exp(operand.value()));
 }
 
-DEFINE_NATIVE_ENTRY(MathNatives_log, 1) {
+DEFINE_NATIVE_ENTRY(Math_log, 1) {
   GET_NATIVE_ARGUMENT(Double, operand, arguments->NativeArgAt(0));
   return Double::New(log(operand.value()));
 }
 
-DEFINE_NATIVE_ENTRY(MathNatives_random, 0) {
-  return Double::New(static_cast<double>(Random::RandomInt32()-1)/0x80000000);
-}
-
-
-// TODO(srdjan): Investigate for performance hit; the integer and double parsing
-// may not be efficient as we need to generate two extra growable arrays.
-static bool IsValidLiteral(const Scanner::GrowableTokenStream& tokens,
-                           Token::Kind literal_kind,
-                           bool* is_positive,
-                           String** value) {
-  if ((tokens.length() == 2) &&
-      (tokens[0].kind == literal_kind) &&
-      (tokens[1].kind == Token::kEOS)) {
-    *is_positive = true;
-    *value = tokens[0].literal;
-    return true;
-  }
-  if ((tokens.length() == 3) &&
-      ((tokens[0].kind == Token::kTIGHTADD) ||
-          (tokens[0].kind == Token::kSUB)) &&
-      (tokens[1].kind == literal_kind) &&
-      (tokens[2].kind == Token::kEOS)) {
-    // Check there is no space between "+/-" and number.
-    if ((tokens[0].offset + 1) != tokens[1].offset) {
-      return false;
-    }
-    *is_positive = tokens[0].kind == Token::kTIGHTADD;
-    *value = tokens[1].literal;
-    return true;
-  }
-  return false;
-}
-
-
-DEFINE_NATIVE_ENTRY(MathNatives_parseInt, 1) {
-  GET_NATIVE_ARGUMENT(String, value, arguments->NativeArgAt(0));
-  const String& dummy_key = String::Handle(Symbols::Empty());
-  Scanner scanner(value, dummy_key);
-  const Scanner::GrowableTokenStream& tokens = scanner.GetStream();
-  String* int_string;
-  bool is_positive;
-  if (IsValidLiteral(tokens, Token::kINTEGER, &is_positive, &int_string)) {
-    if (is_positive) {
-      return Integer::New(*int_string);
-    } else {
-      String& temp = String::Handle();
-      temp = String::Concat(String::Handle(Symbols::New("-")),
-                            *int_string);
-      return Integer::New(temp);
-    }
-  } else {
-    GrowableArray<const Object*> args;
-    args.Add(&value);
-    Exceptions::ThrowByType(Exceptions::kFormat, args);
-    return Object::null();
-  }
-}
-
-
-DEFINE_NATIVE_ENTRY(MathNatives_parseDouble, 1) {
-  GET_NATIVE_ARGUMENT(String, value, arguments->NativeArgAt(0));
-  const String& dummy_key = String::Handle(Symbols::Empty());
-  Scanner scanner(value, dummy_key);
-  const Scanner::GrowableTokenStream& tokens = scanner.GetStream();
-  String* number_string;
-  bool is_positive;
-  if (IsValidLiteral(tokens, Token::kDOUBLE, &is_positive, &number_string)) {
-    const char* cstr = number_string->ToCString();
-    char* p_end = NULL;
-    double double_value = strtod(cstr, &p_end);
-    ASSERT(p_end != cstr);
-    if (!is_positive) {
-      double_value = -double_value;
-    }
-    return Double::New(double_value);
-  }
-
-  if (IsValidLiteral(tokens, Token::kINTEGER, &is_positive, &number_string)) {
-    Integer& res = Integer::Handle(Integer::New(*number_string));
-    if (is_positive) {
-      return Double::New(res.AsDoubleValue());
-    } else {
-      return Double::New(-res.AsDoubleValue());
-    }
-  }
-
-  // Infinity and nan.
-  if (IsValidLiteral(tokens, Token::kIDENT, &is_positive, &number_string)) {
-    if (number_string->Equals("NaN")) {
-      return Double::New(NAN);
-    }
-    if (number_string->Equals("Infinity")) {
-      if (is_positive) {
-        return Double::New(INFINITY);
-      } else {
-        return Double::New(-INFINITY);
-      }
-    }
-  }
-
-  GrowableArray<const Object*> args;
-  args.Add(&value);
-  Exceptions::ThrowByType(Exceptions::kFormat, args);
-  return Object::null();
-}
-
 }  // namespace dart
diff --git a/runtime/lib/math.dart b/runtime/lib/math.dart
deleted file mode 100644
index bb32560..0000000
--- a/runtime/lib/math.dart
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class MathNatives {
-  static num pow(num value, num exponent) {
-    if (exponent is int) {
-      return value.pow(exponent);
-    }
-    // Double.pow will call exponent.toDouble().
-    return value.toDouble().pow(exponent);
-  }
-  static double random() => _random();
-  static double sqrt(num value) => _sqrt(value.toDouble());
-  static double sin(num value) => _sin(value.toDouble());
-  static double cos(num value) => _cos(value.toDouble());
-  static double tan(num value) => _tan(value.toDouble());
-  static double acos(num value) => _acos(value.toDouble());
-  static double asin(num value) => _asin(value.toDouble());
-  static double atan(num value) => _atan(value.toDouble());
-  static double atan2(num a, num b) => _atan2(a.toDouble(), b.toDouble());
-  static double exp(num value) => _exp(value.toDouble());
-  static double log(num value) => _log(value.toDouble());
-
-  static double _random() native "MathNatives_random";
-  static double _sqrt(double value) native "MathNatives_sqrt";
-  static double _sin(double value) native "MathNatives_sin";
-  static double _cos(double value) native "MathNatives_cos";
-  static double _tan(double value) native "MathNatives_tan";
-  static double _acos(double value) native "MathNatives_acos";
-  static double _asin(double value) native "MathNatives_asin";
-  static double _atan(double value) native "MathNatives_atan";
-  static double _atan2(double a, double b) native "MathNatives_atan2";
-  static double _exp(double value) native "MathNatives_exp";
-  static double _log(double value) native "MathNatives_log";
-}
diff --git a/runtime/lib/math_patch.dart b/runtime/lib/math_patch.dart
index 0612d3d..bfcbacc 100644
--- a/runtime/lib/math_patch.dart
+++ b/runtime/lib/math_patch.dart
@@ -3,17 +3,35 @@
 // BSD-style license that can be found in the LICENSE file.
 
 // A VM patch of the dart:math library.
-patch num pow(num x, num exponent) => MathNatives.pow(x, exponent);
-patch double atan2(num a, num b) => MathNatives.atan2(a, b);
-patch double sin(num x) => MathNatives.sin(x);
-patch double cos(num x) => MathNatives.cos(x);
-patch double tan(num x) => MathNatives.tan(x);
-patch double acos(num x) => MathNatives.acos(x);
-patch double asin(num x) => MathNatives.asin(x);
-patch double atan(num x) => MathNatives.atan(x);
-patch double sqrt(num x) => MathNatives.sqrt(x);
-patch double exp(num x) => MathNatives.exp(x);
-patch double log(num x) => MathNatives.log(x);
+patch num pow(num x, num exponent) {
+  if (exponent is int) {
+    return x.pow(exponent);
+  }
+  // Double.pow will call exponent.toDouble().
+  return x.toDouble().pow(exponent);
+}
+
+patch double atan2(num a, num b) => _atan2(a.toDouble(), b.toDouble());
+patch double sin(num value) => _sin(value.toDouble());
+patch double cos(num value) => _cos(value.toDouble());
+patch double tan(num value) => _tan(value.toDouble());
+patch double acos(num value) => _acos(value.toDouble());
+patch double asin(num value) => _asin(value.toDouble());
+patch double atan(num value) => _atan(value.toDouble());
+patch double sqrt(num value) => _sqrt(value.toDouble());
+patch double exp(num value) => _exp(value.toDouble());
+patch double log(num value) => _log(value.toDouble());
+
+double _atan2(double a, double b) native "Math_atan2";
+double _sin(double x) native "Math_sin";
+double _cos(double x) native "Math_cos";
+double _tan(double x) native "Math_tan";
+double _acos(double x) native "Math_acos";
+double _asin(double x) native "Math_asin";
+double _atan(double x) native "Math_atan";
+double _sqrt(double x) native "Math_sqrt";
+double _exp(double x) native "Math_exp";
+double _log(double x) native "Math_log";
 
 
 // TODO(iposva): Handle patch methods within a patch class correctly.
@@ -33,20 +51,24 @@
 
 class _Random implements Random {
   // Internal state of the random number generator.
-  var _state_lo;
-  var _state_hi;
+  var _state;
+  static const kSTATE_LO = 0;
+  static const kSTATE_HI = 1;
 
-  _Random._internal(state)
-      : _state_lo = (state & _MASK_32), _state_hi = (state >> 32);
+  _Random._internal(state) {
+    _state = new List(2);
+    _state[kSTATE_LO] = state & _MASK_32;
+    _state[kSTATE_HI] = state >> 32;
+  }
 
   // The algorithm used here is Multiply with Carry (MWC) with a Base b = 2^32.
   // http://en.wikipedia.org/wiki/Multiply-with-carry
   // The constant A is selected from "Numerical Recipes 3rd Edition" p.348 B1.
   int _nextInt32() {
-    var state = ((_A * (_state_lo)) + _state_hi) & _MASK_64;
-    _state_lo = state & _MASK_32;
-    _state_hi = state >> 32;
-    return _state_lo;
+    var state = ((_A * (_state[kSTATE_LO])) + _state[kSTATE_HI]) & _MASK_64;
+    _state[kSTATE_LO] = state & _MASK_32;
+    _state[kSTATE_HI] = state >> 32;
+    return _state[kSTATE_LO];
   }
 
   int nextInt(int max) {
diff --git a/runtime/lib/math_sources.gypi b/runtime/lib/math_sources.gypi
index 5fb0d9e..2a18173 100644
--- a/runtime/lib/math_sources.gypi
+++ b/runtime/lib/math_sources.gypi
@@ -4,6 +4,7 @@
 
 {
   'sources': [
+    'math.cc',
     'math_patch.dart',
   ],
 }
diff --git a/runtime/lib/object.cc b/runtime/lib/object.cc
index 3d9ed92..6f1fef5 100644
--- a/runtime/lib/object.cc
+++ b/runtime/lib/object.cc
@@ -22,14 +22,8 @@
       Instance::CheckedHandle(arguments->NativeArgAt(0));
   GET_NATIVE_ARGUMENT(String, function_name, arguments->NativeArgAt(1));
   GET_NATIVE_ARGUMENT(Array, func_args, arguments->NativeArgAt(2));
-  if (instance.IsNull()) {
-    GrowableArray<const Object*> args;
-    args.Add(&function_name);
-    args.Add(&func_args);
-    Exceptions::ThrowByType(Exceptions::kNullPointer, args);
-  }
   const Object& null_object = Object::Handle(Object::null());
-  GrowableArray<const Object*> dart_arguments(3);
+  GrowableArray<const Object*> dart_arguments(4);
   dart_arguments.Add(&instance);
   dart_arguments.Add(&function_name);
   dart_arguments.Add(&func_args);
diff --git a/runtime/lib/regexp.cc b/runtime/lib/regexp.cc
index 00088b5..969d5ff 100644
--- a/runtime/lib/regexp.cc
+++ b/runtime/lib/regexp.cc
@@ -12,19 +12,9 @@
 
 namespace dart {
 
-static void CheckAndThrowExceptionIfNull(const Instance& obj) {
-  if (obj.IsNull()) {
-    GrowableArray<const Object*> args;
-    Exceptions::ThrowByType(Exceptions::kNullPointer, args);
-  }
-}
-
-
 DEFINE_NATIVE_ENTRY(JSSyntaxRegExp_factory, 4) {
   ASSERT(AbstractTypeArguments::CheckedHandle(
       arguments->NativeArgAt(0)).IsNull());
-  const Instance& arg1 = Instance::CheckedHandle(arguments->NativeArgAt(1));
-  CheckAndThrowExceptionIfNull(arg1);
   GET_NATIVE_ARGUMENT(String, pattern, arguments->NativeArgAt(1));
   GET_NATIVE_ARGUMENT(Instance, handle_multi_line, arguments->NativeArgAt(2));
   GET_NATIVE_ARGUMENT(Instance, handle_ignore_case, arguments->NativeArgAt(3));
@@ -75,8 +65,6 @@
 DEFINE_NATIVE_ENTRY(JSSyntaxRegExp_ExecuteMatch, 3) {
   const JSRegExp& regexp = JSRegExp::CheckedHandle(arguments->NativeArgAt(0));
   ASSERT(!regexp.IsNull());
-  const Instance& arg1 = Instance::CheckedHandle(arguments->NativeArgAt(1));
-  CheckAndThrowExceptionIfNull(arg1);
   GET_NATIVE_ARGUMENT(String, str, arguments->NativeArgAt(1));
   GET_NATIVE_ARGUMENT(Smi, start_index, arguments->NativeArgAt(2));
   return Jscre::Execute(regexp, str, start_index.Value());
diff --git a/runtime/lib/regexp_patch.dart b/runtime/lib/regexp_patch.dart
index d6e830c..6a921fa 100644
--- a/runtime/lib/regexp_patch.dart
+++ b/runtime/lib/regexp_patch.dart
@@ -77,6 +77,7 @@
   }
 
   Iterable<Match> allMatches(String str) {
+    if (str is! String) throw new ArgumentError(str);
     List<Match> result = new List<Match>();
     int length = str.length;
     int startIndex = 0;
diff --git a/runtime/lib/string.cc b/runtime/lib/string.cc
index 76c097a..797cad2 100644
--- a/runtime/lib/string.cc
+++ b/runtime/lib/string.cc
@@ -20,7 +20,7 @@
   // Unbox the array and determine the maximum element width.
   bool is_one_byte_string = true;
   intptr_t utf16_len = array_len;
-  uint32_t* utf32_array = zone->Alloc<uint32_t>(array_len);
+  int32_t* utf32_array = zone->Alloc<int32_t>(array_len);
   Object& index_object = Object::Handle(isolate);
   for (intptr_t i = 0; i < array_len; i++) {
     index_object = a.At(i);
@@ -102,7 +102,7 @@
   GET_NATIVE_ARGUMENT(Integer, index, arguments->NativeArgAt(1));
   uint32_t value = StringValueAt(receiver, index);
   ASSERT(value <= 0x10FFFF);
-  return Symbols::New(&value, 1);
+  return Symbols::FromCharCode(value);
 }
 
 DEFINE_NATIVE_ENTRY(String_charCodeAt, 2) {
@@ -144,10 +144,6 @@
   Instance& elem = Instance::Handle();
   for (intptr_t i = 0; i < strings.Length(); i++) {
     elem ^= strings.At(i);
-    if (elem.IsNull()) {
-      GrowableArray<const Object*> args;
-      Exceptions::ThrowByType(Exceptions::kNullPointer, args);
-    }
     if (!elem.IsString()) {
       GrowableArray<const Object*> args;
       args.Add(&elem);
diff --git a/runtime/tests/vm/dart/isolate_mirror_local_test.dart b/runtime/tests/vm/dart/isolate_mirror_local_test.dart
index 821912b..d4b8b88 100644
--- a/runtime/tests/vm/dart/isolate_mirror_local_test.dart
+++ b/runtime/tests/vm/dart/isolate_mirror_local_test.dart
@@ -304,9 +304,8 @@
   Expect.equals('dart:core.List', list_intf.qualifiedName);
   Expect.isFalse(list_intf.isPrivate);
   Expect.equals('Object', list_intf.superclass.simpleName);
-  Expect.equals('_ListImpl', list_intf.defaultFactory.simpleName);
   Expect.equals('dart:core', list_intf.owner.simpleName);
-  Expect.isFalse(list_intf.isClass);
+  Expect.isTrue(list_intf.isClass);
   Expect.equals('Collection', list_intf.superinterfaces[0].simpleName);
   Expect.equals("ClassMirror on 'List'", list_intf.toString());
 
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index 5f2ec21..9b8ab80 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -5,6 +5,8 @@
 # When a spawned isolate throws an uncaught exception, we terminate the vm.
 cc/RunLoop_ExceptionChild: Fail
 
+cc/SymbolUnicode: Fail
+
 # These tests are expected to crash on all platforms.
 cc/ArrayNew_Overflow_Crash: Crash
 cc/AllocGeneric_Overflow: Crash
diff --git a/runtime/tools/gyp/nss_configurations.gypi b/runtime/tools/gyp/nss_configurations.gypi
index 2897c6c..74c857c 100644
--- a/runtime/tools/gyp/nss_configurations.gypi
+++ b/runtime/tools/gyp/nss_configurations.gypi
@@ -37,9 +37,6 @@
       '-Werror',
       '-Wall',
       '-ansi',
-      # This flag would let a certain assembly function be inlined,
-      # causing errors in mpcpucache.c.
-      '-fvisibility=hidden',
       # Not supported for C, only for C++.
       '-Wnon-virtual-dtor',
       '-Wno-conversion-null',
diff --git a/runtime/vm/assembler_ia32.cc b/runtime/vm/assembler_ia32.cc
index ec7f4c1..7fa7e21 100644
--- a/runtime/vm/assembler_ia32.cc
+++ b/runtime/vm/assembler_ia32.cc
@@ -19,15 +19,16 @@
 DEFINE_FLAG(bool, use_sse41, true, "Use SSE 4.1 if available");
 
 
-bool CPUFeatures::sse3_supported_ = false;
+bool CPUFeatures::sse2_supported_ = false;
 bool CPUFeatures::sse4_1_supported_ = false;
 #ifdef DEBUG
 bool CPUFeatures::initialized_ = false;
 #endif
 
-bool CPUFeatures::sse3_supported() {
+
+bool CPUFeatures::sse2_supported() {
   DEBUG_ASSERT(initialized_);
-  return sse3_supported_;
+  return sse2_supported_;
 }
 
 
@@ -60,7 +61,7 @@
   typedef uint64_t (*DetectCPUFeatures)();
   uint64_t features =
       reinterpret_cast<DetectCPUFeatures>(instructions.EntryPoint())();
-  sse3_supported_ = (features & kSSE3BitMask) != 0;
+  sse2_supported_ = (features & kSSE2BitMask) != 0;
   sse4_1_supported_ = (features & kSSE4_1BitMask) != 0;
 #ifdef DEBUG
   initialized_ = true;
diff --git a/runtime/vm/assembler_ia32.h b/runtime/vm/assembler_ia32.h
index 5d80c8b..a738df3 100644
--- a/runtime/vm/assembler_ia32.h
+++ b/runtime/vm/assembler_ia32.h
@@ -258,14 +258,14 @@
 class CPUFeatures : public AllStatic {
  public:
   static void InitOnce();
-  static bool sse3_supported();
+  static bool sse2_supported();
   static bool sse4_1_supported();
 
  private:
-  static const uint64_t kSSE3BitMask = static_cast<uint64_t>(1) << 32;
+  static const uint64_t kSSE2BitMask = static_cast<uint64_t>(1) << 26;
   static const uint64_t kSSE4_1BitMask = static_cast<uint64_t>(1) << 51;
 
-  static bool sse3_supported_;
+  static bool sse2_supported_;
   static bool sse4_1_supported_;
 #ifdef DEBUG
   static bool initialized_;
diff --git a/runtime/vm/assembler_x64.cc b/runtime/vm/assembler_x64.cc
index 373925e..57ffd01 100644
--- a/runtime/vm/assembler_x64.cc
+++ b/runtime/vm/assembler_x64.cc
@@ -19,18 +19,11 @@
 DEFINE_FLAG(bool, use_sse41, true, "Use SSE 4.1 if available");
 
 
-bool CPUFeatures::sse3_supported_ = false;
 bool CPUFeatures::sse4_1_supported_ = false;
 #ifdef DEBUG
 bool CPUFeatures::initialized_ = false;
 #endif
 
-bool CPUFeatures::sse3_supported() {
-  DEBUG_ASSERT(initialized_);
-  return sse3_supported_;
-}
-
-
 bool CPUFeatures::sse4_1_supported() {
   DEBUG_ASSERT(initialized_);
   return sse4_1_supported_ && FLAG_use_sse41;
@@ -63,7 +56,6 @@
   typedef uint64_t (*DetectCPUFeatures)();
   uint64_t features =
       reinterpret_cast<DetectCPUFeatures>(instructions.EntryPoint())();
-  sse3_supported_ = (features & kSSE3BitMask) != 0;
   sse4_1_supported_ = (features & kSSE4_1BitMask) != 0;
 #ifdef DEBUG
   initialized_ = true;
@@ -395,11 +387,10 @@
 
 
 void Assembler::movss(XmmRegister dst, const Address& src) {
-  // TODO(srdjan): implement and test XMM8 - XMM15.
-  ASSERT(dst <= XMM7);
+  ASSERT(dst <= XMM15);
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
   EmitUint8(0xF3);
-  EmitOperandREX(0, src, REX_NONE);
+  EmitREX_RB(dst, src);
   EmitUint8(0x0F);
   EmitUint8(0x10);
   EmitOperand(dst & 7, src);
@@ -407,11 +398,10 @@
 
 
 void Assembler::movss(const Address& dst, XmmRegister src) {
-  // TODO(srdjan): implement and test XMM8 - XMM15.
-  ASSERT(src <= XMM7);
+  ASSERT(src <= XMM15);
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
   EmitUint8(0xF3);
-  EmitOperandREX(0, dst, REX_NONE);
+  EmitREX_RB(src, dst);
   EmitUint8(0x0F);
   EmitUint8(0x11);
   EmitOperand(src & 7, dst);
@@ -419,11 +409,11 @@
 
 
 void Assembler::movss(XmmRegister dst, XmmRegister src) {
-  // TODO(srdjan): implement and test XMM8 - XMM15.
-  ASSERT(src <= XMM7);
-  ASSERT(dst <= XMM7);
+  ASSERT(src <= XMM15);
+  ASSERT(dst <= XMM15);
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
   EmitUint8(0xF3);
+  EmitREX_RB(src, dst);
   EmitUint8(0x0F);
   EmitUint8(0x11);
   EmitXmmRegisterOperand(src & 7, dst);
@@ -431,9 +421,10 @@
 
 
 void Assembler::movd(XmmRegister dst, Register src) {
-  ASSERT(dst <= XMM7);
+  ASSERT(dst <= XMM15);
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
   EmitUint8(0x66);
+  EmitREX_RB(dst, src);
   EmitUint8(0x0F);
   EmitUint8(0x6E);
   EmitOperand(dst & 7, Operand(src));
@@ -441,9 +432,10 @@
 
 
 void Assembler::movd(Register dst, XmmRegister src) {
-  ASSERT(src <= XMM7);
+  ASSERT(src <= XMM15);
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
   EmitUint8(0x66);
+  EmitREX_RB(src, dst);
   EmitUint8(0x0F);
   EmitUint8(0x7E);
   EmitOperand(src & 7, Operand(dst));
@@ -451,59 +443,58 @@
 
 
 void Assembler::addss(XmmRegister dst, XmmRegister src) {
-  // TODO(srdjan): implement and test XMM8 - XMM15.
-  ASSERT(src <= XMM7);
-  ASSERT(dst <= XMM7);
+  ASSERT(src <= XMM15);
+  ASSERT(dst <= XMM15);
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
   EmitUint8(0xF3);
+  EmitREX_RB(dst, src);
   EmitUint8(0x0F);
   EmitUint8(0x58);
-  EmitXmmRegisterOperand(dst, src);
+  EmitXmmRegisterOperand(dst & 7, src);
 }
 
 
 void Assembler::subss(XmmRegister dst, XmmRegister src) {
-  // TODO(srdjan): implement and test XMM8 - XMM15.
-  ASSERT(src <= XMM7);
-  ASSERT(dst <= XMM7);
+  ASSERT(src <= XMM15);
+  ASSERT(dst <= XMM15);
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
   EmitUint8(0xF3);
+  EmitREX_RB(dst, src);
   EmitUint8(0x0F);
   EmitUint8(0x5C);
-  EmitXmmRegisterOperand(dst, src);
+  EmitXmmRegisterOperand(dst & 7, src);
 }
 
 
 void Assembler::mulss(XmmRegister dst, XmmRegister src) {
-  // TODO(srdjan): implement and test XMM8 - XMM15.
-  ASSERT(src <= XMM7);
-  ASSERT(dst <= XMM7);
+  ASSERT(src <= XMM15);
+  ASSERT(dst <= XMM15);
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
   EmitUint8(0xF3);
+  EmitREX_RB(dst, src);
   EmitUint8(0x0F);
   EmitUint8(0x59);
-  EmitXmmRegisterOperand(dst, src);
+  EmitXmmRegisterOperand(dst & 7, src);
 }
 
 
 void Assembler::divss(XmmRegister dst, XmmRegister src) {
-  // TODO(srdjan): implement and test XMM8 - XMM15.
-  ASSERT(src <= XMM7);
-  ASSERT(dst <= XMM7);
+  ASSERT(src <= XMM15);
+  ASSERT(dst <= XMM15);
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
   EmitUint8(0xF3);
+  EmitREX_RB(dst, src);
   EmitUint8(0x0F);
   EmitUint8(0x5E);
-  EmitXmmRegisterOperand(dst, src);
+  EmitXmmRegisterOperand(dst & 7, src);
 }
 
 
 void Assembler::movsd(XmmRegister dst, const Address& src) {
-  // TODO(srdjan): implement and test XMM8 - XMM15.
-  ASSERT(dst <= XMM7);
+  ASSERT(dst <= XMM15);
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
   EmitUint8(0xF2);
-  EmitOperandREX(0, src, REX_NONE);
+  EmitREX_RB(dst, src);
   EmitUint8(0x0F);
   EmitUint8(0x10);
   EmitOperand(dst & 7, src);
@@ -511,11 +502,10 @@
 
 
 void Assembler::movsd(const Address& dst, XmmRegister src) {
-  // TODO(srdjan): implement and test XMM8 - XMM15.
-  ASSERT(src <= XMM7);
+  ASSERT(src <= XMM15);
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
   EmitUint8(0xF2);
-  EmitOperandREX(0, dst, REX_NONE);
+  EmitREX_RB(src, dst);
   EmitUint8(0x0F);
   EmitUint8(0x11);
   EmitOperand(src & 7, dst);
@@ -523,11 +513,11 @@
 
 
 void Assembler::movsd(XmmRegister dst, XmmRegister src) {
-  // TODO(srdjan): implement and test XMM8 - XMM15.
-  ASSERT(src <= XMM7);
-  ASSERT(dst <= XMM7);
+  ASSERT(src <= XMM15);
+  ASSERT(dst <= XMM15);
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
   EmitUint8(0xF2);
+  EmitREX_RB(src, dst);
   EmitUint8(0x0F);
   EmitUint8(0x11);
   EmitXmmRegisterOperand(src & 7, dst);
@@ -535,10 +525,10 @@
 
 
 void Assembler::movaps(XmmRegister dst, XmmRegister src) {
-  // TODO(vegorov): implement and test XMM8 - XMM15.
-  ASSERT(src <= XMM7);
-  ASSERT(dst <= XMM7);
+  ASSERT(src <= XMM15);
+  ASSERT(dst <= XMM15);
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
+  EmitREX_RB(dst, src);
   EmitUint8(0x0F);
   EmitUint8(0x28);
   EmitXmmRegisterOperand(dst & 7, src);
@@ -546,90 +536,93 @@
 
 
 void Assembler::addsd(XmmRegister dst, XmmRegister src) {
-  // TODO(srdjan): implement and test XMM8 - XMM15.
-  ASSERT(src <= XMM7);
-  ASSERT(dst <= XMM7);
+  ASSERT(src <= XMM15);
+  ASSERT(dst <= XMM15);
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
   EmitUint8(0xF2);
+  EmitREX_RB(dst, src);
   EmitUint8(0x0F);
   EmitUint8(0x58);
-  EmitXmmRegisterOperand(dst, src);
+  EmitXmmRegisterOperand(dst & 7, src);
 }
 
 
 void Assembler::subsd(XmmRegister dst, XmmRegister src) {
-  // TODO(srdjan): implement and test XMM8 - XMM15.
-  ASSERT(src <= XMM7);
-  ASSERT(dst <= XMM7);
+  ASSERT(src <= XMM15);
+  ASSERT(dst <= XMM15);
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
   EmitUint8(0xF2);
+  EmitREX_RB(dst, src);
   EmitUint8(0x0F);
   EmitUint8(0x5C);
-  EmitXmmRegisterOperand(dst, src);
+  EmitXmmRegisterOperand(dst & 7, src);
 }
 
 
 void Assembler::mulsd(XmmRegister dst, XmmRegister src) {
-  // TODO(srdjan): implement and test XMM8 - XMM15.
-  ASSERT(src <= XMM7);
-  ASSERT(dst <= XMM7);
+  ASSERT(src <= XMM15);
+  ASSERT(dst <= XMM15);
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
   EmitUint8(0xF2);
+  EmitREX_RB(dst, src);
   EmitUint8(0x0F);
   EmitUint8(0x59);
-  EmitXmmRegisterOperand(dst, src);
+  EmitXmmRegisterOperand(dst & 7, src);
 }
 
 
 void Assembler::divsd(XmmRegister dst, XmmRegister src) {
-  // TODO(srdjan): implement and test XMM8 - XMM15.
-  ASSERT(src <= XMM7);
-  ASSERT(dst <= XMM7);
+  ASSERT(src <= XMM15);
+  ASSERT(dst <= XMM15);
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
   EmitUint8(0xF2);
+  EmitREX_RB(dst, src);
   EmitUint8(0x0F);
   EmitUint8(0x5E);
-  EmitXmmRegisterOperand(dst, src);
+  EmitXmmRegisterOperand(dst & 7, src);
 }
 
 
 void Assembler::comisd(XmmRegister a, XmmRegister b) {
-  ASSERT(a <= XMM7);
-  ASSERT(b <= XMM7);
+  ASSERT(a <= XMM15);
+  ASSERT(b <= XMM15);
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
   EmitUint8(0x66);
+  EmitREX_RB(a, b);
   EmitUint8(0x0F);
   EmitUint8(0x2F);
-  EmitXmmRegisterOperand(a, b);
+  EmitXmmRegisterOperand(a & 7, b);
 }
 
 
 void Assembler::movmskpd(Register dst, XmmRegister src) {
-  ASSERT(src <= XMM7);
+  ASSERT(src <= XMM15);
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
   EmitUint8(0x66);
+  EmitREX_RB(dst, src);
   EmitUint8(0x0F);
   EmitUint8(0x50);
-  EmitXmmRegisterOperand(dst, src);
+  EmitXmmRegisterOperand(dst & 7, src);
 }
 
 
 void Assembler::sqrtsd(XmmRegister dst, XmmRegister src) {
-  ASSERT(dst <= XMM7);
-  ASSERT(src <= XMM7);
+  ASSERT(dst <= XMM15);
+  ASSERT(src <= XMM15);
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
   EmitUint8(0xF2);
+  EmitREX_RB(dst, src);
   EmitUint8(0x0F);
   EmitUint8(0x51);
-  EmitXmmRegisterOperand(dst, src);
+  EmitXmmRegisterOperand(dst & 7, src);
 }
 
 
 void Assembler::xorpd(XmmRegister dst, const Address& src) {
-  ASSERT(dst <= XMM7);
+  ASSERT(dst <= XMM15);
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
   EmitUint8(0x66);
-  EmitOperandREX(0, src, REX_NONE);
+  EmitOperandREX(dst, src, REX_NONE);
   EmitUint8(0x0F);
   EmitUint8(0x57);
   EmitOperand(dst & 7, src);
@@ -637,59 +630,62 @@
 
 
 void Assembler::xorpd(XmmRegister dst, XmmRegister src) {
-  ASSERT(dst <= XMM7);
-  ASSERT(src <= XMM7);
+  ASSERT(dst <= XMM15);
+  ASSERT(src <= XMM15);
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
   EmitUint8(0x66);
+  EmitREX_RB(dst, src);
   EmitUint8(0x0F);
   EmitUint8(0x57);
-  EmitXmmRegisterOperand(dst, src);
+  EmitXmmRegisterOperand(dst & 7, src);
 }
 
 
 void Assembler::cvtsi2sd(XmmRegister dst, Register src) {
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  ASSERT(dst <= XMM7);
+  ASSERT(dst <= XMM15);
   Operand operand(src);
   EmitUint8(0xF2);
-  EmitOperandREX(0, operand, REX_W);
+  EmitOperandREX(dst, operand, REX_W);
   EmitUint8(0x0F);
   EmitUint8(0x2A);
-  EmitOperand(dst, operand);
+  EmitOperand(dst & 7, operand);
 }
 
 
 void Assembler::cvttsd2siq(Register dst, XmmRegister src) {
-  ASSERT(src <= XMM7);
+  ASSERT(src <= XMM15);
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
   EmitUint8(0xF2);
   Operand operand(dst);
-  EmitOperandREX(0, operand, REX_W);
+  EmitREX_RB(dst, src, REX_W);
   EmitUint8(0x0F);
   EmitUint8(0x2C);
-  EmitXmmRegisterOperand(dst, src);
+  EmitXmmRegisterOperand(dst & 7, src);
 }
 
 
 void Assembler::cvtss2sd(XmmRegister dst, XmmRegister src) {
-  ASSERT(src <= XMM7);
-  ASSERT(dst <= XMM7);
+  ASSERT(src <= XMM15);
+  ASSERT(dst <= XMM15);
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
   EmitUint8(0xF3);
+  EmitREX_RB(dst, src);
   EmitUint8(0x0F);
   EmitUint8(0x5A);
-  EmitXmmRegisterOperand(dst, src);
+  EmitXmmRegisterOperand(dst & 7, src);
 }
 
 
 void Assembler::cvtsd2ss(XmmRegister dst, XmmRegister src) {
-  ASSERT(src <= XMM7);
-  ASSERT(dst <= XMM7);
+  ASSERT(src <= XMM15);
+  ASSERT(dst <= XMM15);
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
   EmitUint8(0xF2);
+  EmitREX_RB(dst, src);
   EmitUint8(0x0F);
   EmitUint8(0x5A);
-  EmitXmmRegisterOperand(dst, src);
+  EmitXmmRegisterOperand(dst & 7, src);
 }
 
 
@@ -2107,7 +2103,8 @@
 
 
 static const char* xmm_reg_names[kNumberOfXmmRegisters] = {
-  "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7"
+  "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
+  "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
 };
 
 
diff --git a/runtime/vm/assembler_x64.h b/runtime/vm/assembler_x64.h
index cebc865..ab97b2a 100644
--- a/runtime/vm/assembler_x64.h
+++ b/runtime/vm/assembler_x64.h
@@ -275,14 +275,13 @@
 class CPUFeatures : public AllStatic {
  public:
   static void InitOnce();
-  static bool sse3_supported();
+  // x64 always has at least SSE2.
+  static bool sse2_supported() { return true; }
   static bool sse4_1_supported();
 
  private:
-  static const uint64_t kSSE3BitMask = static_cast<uint64_t>(1) << 32;
   static const uint64_t kSSE4_1BitMask = static_cast<uint64_t>(1) << 51;
 
-  static bool sse3_supported_;
   static bool sse4_1_supported_;
 #ifdef DEBUG
   static bool initialized_;
@@ -678,7 +677,18 @@
   inline void EmitXmmRegisterOperand(int rm, XmmRegister reg);
   inline void EmitFixup(AssemblerFixup* fixup);
   inline void EmitOperandSizeOverride();
-
+  inline void EmitREX_RB(XmmRegister reg,
+                         XmmRegister base,
+                         uint8_t rex = REX_NONE);
+  inline void EmitREX_RB(XmmRegister reg,
+                         const Operand& operand,
+                         uint8_t rex = REX_NONE);
+  inline void EmitREX_RB(XmmRegister reg,
+                         Register base,
+                         uint8_t rex = REX_NONE);
+  inline void EmitREX_RB(Register reg,
+                         XmmRegister base,
+                         uint8_t rex = REX_NONE);
   void EmitOperand(int rm, const Operand& operand);
   void EmitImmediate(const Immediate& imm);
   void EmitComplex(int rm, const Operand& operand, const Immediate& immediate);
@@ -726,6 +736,42 @@
 }
 
 
+inline void Assembler::EmitREX_RB(XmmRegister reg,
+                                  XmmRegister base,
+                                  uint8_t rex) {
+  if (reg > 7) rex |= REX_R;
+  if (base > 7) rex |= REX_B;
+  if (rex != REX_NONE) EmitUint8(REX_PREFIX | rex);
+}
+
+
+inline void Assembler::EmitREX_RB(XmmRegister reg,
+                                  const Operand& operand,
+                                  uint8_t rex) {
+  if (reg > 7) rex |= REX_R;
+  rex |= operand.rex();
+  if (rex != REX_NONE) EmitUint8(REX_PREFIX | rex);
+}
+
+
+inline void Assembler::EmitREX_RB(XmmRegister reg,
+                                  Register base,
+                                  uint8_t rex) {
+  if (reg > 7) rex |= REX_R;
+  if (base > 7) rex |= REX_B;
+  if (rex != REX_NONE) EmitUint8(REX_PREFIX | rex);
+}
+
+
+inline void Assembler::EmitREX_RB(Register reg,
+                                  XmmRegister base,
+                                  uint8_t rex) {
+  if (reg > 7) rex |= REX_R;
+  if (base > 7) rex |= REX_B;
+  if (rex != REX_NONE) EmitUint8(REX_PREFIX | rex);
+}
+
+
 inline void Assembler::EmitFixup(AssemblerFixup* fixup) {
   buffer_.EmitFixup(fixup);
 }
diff --git a/runtime/vm/assembler_x64_test.cc b/runtime/vm/assembler_x64_test.cc
index f2d6fce..32a54fa 100644
--- a/runtime/vm/assembler_x64_test.cc
+++ b/runtime/vm/assembler_x64_test.cc
@@ -1244,6 +1244,14 @@
   __ movss(XMM5, XMM4);
   __ movss(XMM6, XMM5);
   __ movss(XMM7, XMM6);
+  __ movss(XMM8, XMM7);
+  __ movss(XMM9, XMM8);
+  __ movss(XMM10, XMM9);
+  __ movss(XMM11, XMM10);
+  __ movss(XMM12, XMM11);
+  __ movss(XMM13, XMM12);
+  __ movss(XMM14, XMM13);
+  __ movss(XMM15, XMM14);
   __ pushq(R15);  // Callee saved.
   __ pushq(RAX);
   __ movq(Address(RSP, 0), Immediate(0));
@@ -1258,8 +1266,23 @@
   __ movss(XMM3, Address(R15, 0));
   __ movq(RAX, RSP);
   __ movss(Address(RAX, 0), XMM3);
-  __ movss(XMM4, Address(RAX, 0));
-  __ movss(XMM0, Address(RAX, 0));
+  __ movss(XMM1, Address(RAX, 0));
+  __ movss(XMM15, Address(RAX, 0));
+  __ movss(XMM14, XMM15);
+  __ movss(XMM13, XMM14);
+  __ movss(XMM12, XMM13);
+  __ movss(XMM11, XMM12);
+  __ movss(XMM10, XMM11);
+  __ movss(XMM9, XMM10);
+  __ movss(XMM8, XMM9);
+  __ movss(XMM7, XMM8);
+  __ movss(XMM6, XMM7);
+  __ movss(XMM5, XMM6);
+  __ movss(XMM4, XMM5);
+  __ movss(XMM3, XMM4);
+  __ movss(XMM2, XMM3);
+  __ movss(XMM1, XMM2);
+  __ movss(XMM0, XMM1);
   __ popq(RAX);
   __ popq(R15);  // Callee saved.
   __ ret();
@@ -1275,12 +1298,18 @@
 ASSEMBLER_TEST_GENERATE(SingleFPMoves2, assembler) {
   __ movq(RAX, Immediate(bit_cast<int32_t, float>(234.0f)));
   __ movd(XMM0, RAX);
-  __ movss(XMM1, XMM0);
+  __ movd(XMM8, RAX);
+  __ movss(XMM1, XMM8);
   __ pushq(RAX);
   __ movq(Address(RSP, 0), Immediate(0));
   __ movss(XMM0, Address(RSP, 0));
   __ movss(Address(RSP, 0), XMM1);
   __ movss(XMM0, Address(RSP, 0));
+  __ movq(Address(RSP, 0), Immediate(0));
+  __ movss(XMM9, XMM8);
+  __ movss(Address(RSP, 0), XMM9);
+  __ movss(XMM8, Address(RSP, 0));
+  __ movss(XMM0, XMM8);
   __ popq(RAX);
   __ ret();
 }
@@ -1297,12 +1326,19 @@
   __ pushq(RCX);
   __ movq(RBX, Immediate(bit_cast<int32_t, float>(12.3f)));
   __ movd(XMM0, RBX);
+  __ movd(XMM8, RBX);
   __ movq(RCX, Immediate(bit_cast<int32_t, float>(3.4f)));
   __ movd(XMM1, RCX);
+  __ movd(XMM9, RCX);
   __ addss(XMM0, XMM1);  // 15.7f
   __ mulss(XMM0, XMM1);  // 53.38f
   __ subss(XMM0, XMM1);  // 49.98f
   __ divss(XMM0, XMM1);  // 14.7f
+  __ addss(XMM8, XMM9);  // 15.7f
+  __ mulss(XMM8, XMM9);  // 53.38f
+  __ subss(XMM8, XMM9);  // 49.98f
+  __ divss(XMM8, XMM9);  // 14.7f
+  __ subss(XMM0, XMM8);  // 0.0f
   __ popq(RCX);
   __ popq(RBX);
   __ ret();
@@ -1312,7 +1348,7 @@
 ASSEMBLER_TEST_RUN(SingleFPOperations, entry) {
   typedef float (*SingleFPOperationsCode)();
   float res = reinterpret_cast<SingleFPOperationsCode>(entry)();
-  EXPECT_FLOAT_EQ(14.7f, res, 0.001f);
+  EXPECT_FLOAT_EQ(0.0f, res, 0.001f);
 }
 
 
@@ -1328,9 +1364,17 @@
   __ movsd(XMM5, XMM4);
   __ movsd(XMM6, XMM5);
   __ movsd(XMM7, XMM6);
+  __ movsd(XMM8, XMM7);
+  __ movsd(XMM9, XMM8);
+  __ movsd(XMM10, XMM9);
+  __ movsd(XMM11, XMM10);
+  __ movsd(XMM12, XMM11);
+  __ movsd(XMM13, XMM12);
+  __ movsd(XMM14, XMM13);
+  __ movsd(XMM15, XMM14);
   __ movq(Address(RSP, 0), Immediate(0));
   __ movsd(XMM0, Address(RSP, 0));
-  __ movsd(Address(RSP, 0), XMM7);
+  __ movsd(Address(RSP, 0), XMM15);
   __ movsd(XMM1, Address(RSP, 0));
   __ movq(R10, RSP);
   __ movsd(Address(R10, 0), XMM1);
@@ -1341,7 +1385,15 @@
   __ movq(RAX, RSP);
   __ movsd(Address(RAX, 0), XMM3);
   __ movsd(XMM4, Address(RAX, 0));
-  __ movsd(XMM7, Address(RSP, 0));
+  __ movsd(XMM15, Address(RSP, 0));
+  __ movaps(XMM14, XMM15);
+  __ movaps(XMM13, XMM14);
+  __ movaps(XMM12, XMM13);
+  __ movaps(XMM11, XMM12);
+  __ movaps(XMM10, XMM11);
+  __ movaps(XMM9, XMM10);
+  __ movaps(XMM8, XMM9);
+  __ movaps(XMM7, XMM8);
   __ movaps(XMM6, XMM7);
   __ movaps(XMM5, XMM6);
   __ movaps(XMM4, XMM5);
@@ -1365,13 +1417,22 @@
   __ movq(RAX, Immediate(bit_cast<int64_t, double>(12.3)));
   __ pushq(RAX);
   __ movsd(XMM0, Address(RSP, 0));
+  __ movsd(XMM8, Address(RSP, 0));
   __ movq(RAX, Immediate(bit_cast<int64_t, double>(3.4)));
   __ movq(Address(RSP, 0), RAX);
+  __ movsd(XMM12, Address(RSP, 0));
+  __ addsd(XMM8, XMM12);  // 15.7
+  __ mulsd(XMM8, XMM12);  // 53.38
+  __ subsd(XMM8, XMM12);  // 49.98
+  __ divsd(XMM8, XMM12);  // 14.7
+  __ sqrtsd(XMM8, XMM8);  // 3.834
   __ movsd(XMM1, Address(RSP, 0));
   __ addsd(XMM0, XMM1);  // 15.7
   __ mulsd(XMM0, XMM1);  // 53.38
   __ subsd(XMM0, XMM1);  // 49.98
   __ divsd(XMM0, XMM1);  // 14.7
+  __ sqrtsd(XMM0, XMM0);  // 3.834057902
+  __ addsd(XMM0, XMM8);  // 7.6681
   __ popq(RAX);
   __ ret();
 }
@@ -1380,13 +1441,16 @@
 ASSEMBLER_TEST_RUN(DoubleFPOperations, entry) {
   typedef double (*SingleFPOperationsCode)();
   double res = reinterpret_cast<SingleFPOperationsCode>(entry)();
-  EXPECT_FLOAT_EQ(14.7, res, 0.001);
+  EXPECT_FLOAT_EQ(7.668, res, 0.001);
 }
 
 
 ASSEMBLER_TEST_GENERATE(Int32ToDoubleConversion, assembler) {
   __ movl(RDX, Immediate(6));
   __ cvtsi2sd(XMM0, RDX);
+  __ movl(RDX, Immediate(8));
+  __ cvtsi2sd(XMM8, RDX);
+  __ subsd(XMM0, XMM8);
   __ ret();
 }
 
@@ -1394,13 +1458,16 @@
 ASSEMBLER_TEST_RUN(Int32ToDoubleConversion, entry) {
   typedef double (*IntToDoubleConversionCode)();
   double res = reinterpret_cast<IntToDoubleConversionCode>(entry)();
-  EXPECT_FLOAT_EQ(6.0, res, 0.001);
+  EXPECT_FLOAT_EQ(-2.0, res, 0.001);
 }
 
 
 ASSEMBLER_TEST_GENERATE(Int64ToDoubleConversion, assembler) {
   __ movq(RDX, Immediate(12LL << 32));
   __ cvtsi2sd(XMM0, RDX);
+  __ movsd(XMM15, XMM0);  // Move to high register
+  __ addsd(XMM0, XMM0);  // Stomp XMM0
+  __ movsd(XMM0, XMM15);  // Move back to XMM0
   __ ret();
 }
 
@@ -1415,9 +1482,14 @@
 ASSEMBLER_TEST_GENERATE(DoubleToInt64Conversion, assembler) {
   __ movq(RAX, Immediate(bit_cast<int64_t, double>(12.3)));
   __ pushq(RAX);
+  __ movsd(XMM9, Address(RSP, 0));
   __ movsd(XMM6, Address(RSP, 0));
   __ popq(RAX);
+  __ cvttsd2siq(R10, XMM6);
   __ cvttsd2siq(RDX, XMM6);
+  __ cvttsd2siq(R10, XMM9);
+  __ cvttsd2siq(RDX, XMM9);
+  __ subq(RDX, R10);
   __ movq(RAX, RDX);
   __ ret();
 }
@@ -1426,7 +1498,7 @@
 ASSEMBLER_TEST_RUN(DoubleToInt64Conversion, entry) {
   typedef int64_t (*DoubleToInt64ConversionCode)();
   int64_t res = reinterpret_cast<DoubleToInt64ConversionCode>(entry)();
-  EXPECT_EQ(12, res);
+  EXPECT_EQ(0, res);
 }
 
 
@@ -1605,7 +1677,14 @@
 
 
 ASSEMBLER_TEST_GENERATE(XorpdZeroing2, assembler) {
+  Label done;
+  __ xorpd(XMM15, XMM15);
   __ xorpd(XMM0, XMM0);
+  __ xorpd(XMM0, XMM15);
+  __ comisd(XMM0, XMM15);
+  __ j(ZERO, &done);
+  __ int3();
+  __ Bind(&done);
   __ ret();
 }
 
diff --git a/runtime/vm/benchmark_test.cc b/runtime/vm/benchmark_test.cc
index 29a2417..d719b0e 100644
--- a/runtime/vm/benchmark_test.cc
+++ b/runtime/vm/benchmark_test.cc
@@ -275,7 +275,7 @@
   char* script = NULL;
   if (dart_root != NULL) {
     const char* kFormatStr =
-        "#import('%s/sdk/lib/_internal/compiler/compiler.dart');";
+        "import '%s/sdk/lib/_internal/compiler/compiler.dart';";
     intptr_t len = OS::SNPrint(NULL, 0, kFormatStr, dart_root) + 1;
     script = reinterpret_cast<char*>(malloc(len));
     EXPECT(script != NULL);
@@ -286,7 +286,7 @@
     EXPECT_VALID(lib);
   } else {
     Dart_Handle lib = TestCase::LoadTestScript(
-        "#import('sdk/lib/_internal/compiler/compiler.dart');",
+        "import 'sdk/lib/_internal/compiler/compiler.dart';",
         reinterpret_cast<Dart_NativeEntryResolver>(NativeResolver));
     EXPECT_VALID(lib);
   }
diff --git a/runtime/vm/bootstrap_natives.cc b/runtime/vm/bootstrap_natives.cc
index 47a8c3a..9978bf7 100644
--- a/runtime/vm/bootstrap_natives.cc
+++ b/runtime/vm/bootstrap_natives.cc
@@ -60,7 +60,7 @@
   ASSERT(!library.IsNull());
   library.set_native_entry_resolver(resolver);
 
-  library = Library::CollectionLibrary();
+  library = Library::MathLibrary();
   ASSERT(!library.IsNull());
   library.set_native_entry_resolver(resolver);
 
diff --git a/runtime/vm/bootstrap_natives.h b/runtime/vm/bootstrap_natives.h
index 7b424b0..fad33c9 100644
--- a/runtime/vm/bootstrap_natives.h
+++ b/runtime/vm/bootstrap_natives.h
@@ -27,6 +27,7 @@
   V(Integer_moduloFromInteger, 2)                                              \
   V(Integer_greaterThanFromInteger, 2)                                         \
   V(Integer_equalToInteger, 2)                                                 \
+  V(Integer_parse, 1)                                                          \
   V(ReceivePortImpl_factory, 1)                                                \
   V(ReceivePortImpl_closeInternal, 1)                                          \
   V(SendPortImpl_sendInternal_, 3)                                             \
@@ -55,6 +56,7 @@
   V(Double_ceil, 1)                                                            \
   V(Double_truncate, 1)                                                        \
   V(Double_toInt, 1)                                                           \
+  V(Double_parse, 1)                                                           \
   V(Double_toStringAsFixed, 2)                                                 \
   V(Double_toStringAsExponential, 2)                                           \
   V(Double_toStringAsPrecision, 2)                                             \
@@ -80,19 +82,16 @@
   V(String_toLowerCase, 1)                                                     \
   V(String_toUpperCase, 1)                                                     \
   V(Strings_concatAll, 1)                                                      \
-  V(MathNatives_sqrt, 1)                                                       \
-  V(MathNatives_sin, 1)                                                        \
-  V(MathNatives_cos, 1)                                                        \
-  V(MathNatives_tan, 1)                                                        \
-  V(MathNatives_asin, 1)                                                       \
-  V(MathNatives_acos, 1)                                                       \
-  V(MathNatives_atan, 1)                                                       \
-  V(MathNatives_atan2, 2)                                                      \
-  V(MathNatives_exp, 1)                                                        \
-  V(MathNatives_log, 1)                                                        \
-  V(MathNatives_random, 0)                                                     \
-  V(MathNatives_parseInt, 1)                                                   \
-  V(MathNatives_parseDouble, 1)                                                \
+  V(Math_sqrt, 1)                                                              \
+  V(Math_sin, 1)                                                               \
+  V(Math_cos, 1)                                                               \
+  V(Math_tan, 1)                                                               \
+  V(Math_asin, 1)                                                              \
+  V(Math_acos, 1)                                                              \
+  V(Math_atan, 1)                                                              \
+  V(Math_atan2, 2)                                                             \
+  V(Math_exp, 1)                                                               \
+  V(Math_log, 1)                                                               \
   V(DateNatives_currentTimeMillis, 0)                                          \
   V(DateNatives_timeZoneName, 1)                                               \
   V(DateNatives_timeZoneOffsetInSeconds, 1)                                    \
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index 3283db1..bae68fd 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -838,16 +838,6 @@
       type_argument = arguments.TypeAt(i);
       type_argument = FinalizeType(cls, type_argument, finalization);
       if (type_argument.IsMalformed()) {
-        // Malformed type arguments to a constructor of a generic type are
-        // reported as a compile-time error.
-        if (finalization >= kCanonicalizeForCreation) {
-          const Script& script = Script::Handle(cls.script());
-          const String& type_name =
-              String::Handle(parameterized_type.UserVisibleName());
-          ReportError(script, parameterized_type.token_pos(),
-                      "type '%s' has malformed type argument",
-                      type_name.ToCString());
-        }
         // In production mode, malformed type arguments are mapped to dynamic.
         // In checked mode, a type with malformed type arguments is malformed.
         if (FLAG_enable_type_checks || FLAG_error_on_malformed_type) {
@@ -877,7 +867,7 @@
   // However, type parameter bounds are checked below, even for a raw type.
   if (!arguments.IsNull() && (arguments.Length() != num_type_parameters)) {
     // Wrong number of type arguments. The type is malformed.
-    if (finalization >= kCanonicalizeForCreation) {
+    if (finalization >= kCanonicalizeExpression) {
       const Script& script = Script::Handle(cls.script());
       const String& type_name =
           String::Handle(parameterized_type.UserVisibleName());
diff --git a/runtime/vm/class_finalizer.h b/runtime/vm/class_finalizer.h
index 18ce755..2fe9ea6 100644
--- a/runtime/vm/class_finalizer.h
+++ b/runtime/vm/class_finalizer.h
@@ -33,10 +33,13 @@
     kDoNotResolve,             // Type resolution is postponed.
     kTryResolve,               // Type resolution is attempted.
     kFinalize,                 // Type resolution and type finalization are
-                               // required; a malformed type is tolerated.
+                               // required; a malformed type is tolerated, since
+                               // the type may be used as a type annotation.
     kCanonicalize,             // Same as kFinalize, but with canonicalization.
-    kCanonicalizeForCreation,  // Same as kCanonicalize, but do not tolerate
-                               // wrong number of type arguments.
+    kCanonicalizeExpression,   // Same as kCanonicalize, but do not tolerate
+                               // wrong number of type arguments or ambiguous
+                               // type reference, since the type is not used as
+                               // a type annotation, but as a type expression.
     kCanonicalizeWellFormed    // Error-free resolution, finalization, and
                                // canonicalization are required; a malformed
                                // type is not tolerated.
diff --git a/runtime/vm/code_generator.cc b/runtime/vm/code_generator.cc
index 008673f..f24bd03 100644
--- a/runtime/vm/code_generator.cc
+++ b/runtime/vm/code_generator.cc
@@ -770,73 +770,38 @@
 }
 
 
-static bool UpdateResolvedStaticCall(const Code& code,
-                              intptr_t offset,
-                              const Code& target_code) {
-  // PC offsets are mapped to the corresponding code object in the
-  // resolved_static_calls array. The array grows as static calls are being
-  // resolved.
-  const int kOffset = 0;
-  const int kCode = 1;
-  const int kEntrySize = 2;
-
-  GrowableObjectArray& resolved_static_calls =
-      GrowableObjectArray::Handle(code.resolved_static_calls());
-  intptr_t index = -1;
-  if (resolved_static_calls.IsNull()) {
-    resolved_static_calls = GrowableObjectArray::New(2, Heap::kOld);
-    code.set_resolved_static_calls(resolved_static_calls);
-  } else {
-    // Search for the offset in the resolved static calls.
-    const intptr_t len = resolved_static_calls.Length();
-    Object& off = Object::Handle();
-    for (intptr_t i = 0; i < len; i += kEntrySize) {
-      off = resolved_static_calls.At(i + kOffset);
-      if (Smi::Cast(off).Value() == offset) {
-        index = i;
-        break;
-      }
-    }
-  }
-  if (index == -1) {
-    // The static call with this offset is not yet present: Add it.
-    resolved_static_calls.Add(Smi::Handle(Smi::New(offset)));
-    resolved_static_calls.Add(target_code);
-  } else {
-    // Overwrite the currently recorded target.
-    resolved_static_calls.SetAt(index + kCode, target_code);
-  }
-  return index != -1;
-}
-
-
+// Patches static call with the target's entry point. Compiles target if
+// necessary.
 DEFINE_RUNTIME_ENTRY(PatchStaticCall, 0) {
-  // This function is called after successful resolving and compilation of
-  // the target method.
   ASSERT(arguments.ArgCount() == kPatchStaticCallRuntimeEntry.argument_count());
   DartFrameIterator iterator;
   StackFrame* caller_frame = iterator.NextFrame();
   ASSERT(caller_frame != NULL);
-  uword target = 0;
-  Function& target_function = Function::Handle();
-  CodePatcher::GetStaticCallAt(caller_frame->pc(), &target_function, &target);
-  ASSERT(target_function.HasCode());
+  const Code& caller_code = Code::Handle(caller_frame->LookupDartCode());
+  ASSERT(!caller_code.IsNull());
+  const Function& target_function = Function::Handle(
+      caller_code.GetStaticCallTargetFunctionAt(caller_frame->pc()));
+  if (!target_function.HasCode()) {
+    const Error& error =
+        Error::Handle(Compiler::CompileFunction(target_function));
+    if (!error.IsNull()) {
+      Exceptions::PropagateError(error);
+    }
+  }
   const Code& target_code = Code::Handle(target_function.CurrentCode());
-  uword new_target = target_code.EntryPoint();
-  // Verify that we are not patching repeatedly.
-  ASSERT(target != new_target);
-  CodePatcher::PatchStaticCallAt(caller_frame->pc(), new_target);
-  const Code& code = Code::Handle(caller_frame->LookupDartCode());
-  bool found = UpdateResolvedStaticCall(code,
-                                        caller_frame->pc() - code.EntryPoint(),
-                                        target_code);
-  ASSERT(!found);
+  // Before patching verify that we are not repeatedly patching to the same
+  // target.
+  ASSERT(target_code.EntryPoint() !=
+         CodePatcher::GetStaticCallTargetAt(caller_frame->pc()));
+  CodePatcher::PatchStaticCallAt(caller_frame->pc(), target_code.EntryPoint());
+  caller_code.SetStaticCallTargetCodeAt(caller_frame->pc(), target_code);
   if (FLAG_trace_patching) {
     OS::Print("PatchStaticCall: patching from %#"Px" to '%s' %#"Px"\n",
         caller_frame->pc(),
         target_function.ToFullyQualifiedCString(),
-        new_target);
+        target_code.EntryPoint());
   }
+  arguments.SetReturn(target_code);
 }
 
 
@@ -904,8 +869,7 @@
 
 
 // Gets called from debug stub when code reaches a breakpoint.
-//   Arg0: function object of the static function that was about to be called.
-DEFINE_RUNTIME_ENTRY(BreakpointStaticHandler, 1) {
+DEFINE_RUNTIME_ENTRY(BreakpointStaticHandler, 0) {
   ASSERT(arguments.ArgCount() ==
       kBreakpointStaticHandlerRuntimeEntry.argument_count());
   ASSERT(isolate->debugger() != NULL);
@@ -913,13 +877,20 @@
   // Make sure the static function that is about to be called is
   // compiled. The stub will jump to the entry point without any
   // further tests.
-  const Function& function = Function::CheckedHandle(arguments.ArgAt(0));
+  DartFrameIterator iterator;
+  StackFrame* caller_frame = iterator.NextFrame();
+  ASSERT(caller_frame != NULL);
+  const Code& code = Code::Handle(caller_frame->LookupDartCode());
+  const Function& function =
+      Function::Handle(code.GetStaticCallTargetFunctionAt(caller_frame->pc()));
+
   if (!function.HasCode()) {
     const Error& error = Error::Handle(Compiler::CompileFunction(function));
     if (!error.IsNull()) {
       Exceptions::PropagateError(error);
     }
   }
+  arguments.SetReturn(Code::ZoneHandle(function.CurrentCode()));
 }
 
 
@@ -1376,12 +1347,6 @@
   const Array& function_args = Array::CheckedHandle(arguments.ArgAt(1));
   const String& function_name = String::Handle(Symbols::Call());
   GrowableArray<const Object*> dart_arguments(5);
-  if (instance.IsNull()) {
-    dart_arguments.Add(&function_name);
-    dart_arguments.Add(&function_args);
-    Exceptions::ThrowByType(Exceptions::kNullPointer, dart_arguments);
-    UNREACHABLE();
-  }
 
   // TODO(regis): Resolve and invoke "call" method, if existing.
 
@@ -1565,13 +1530,10 @@
 
 
 // The caller must be a static call in a Dart frame, or an entry frame.
-// Patch static call to point to 'new_entry_point'.
-DEFINE_RUNTIME_ENTRY(FixCallersTarget, 1) {
+// Patch static call to point to valid code's entry point.
+DEFINE_RUNTIME_ENTRY(FixCallersTarget, 0) {
   ASSERT(arguments.ArgCount() ==
       kFixCallersTargetRuntimeEntry.argument_count());
-  const Function& function = Function::CheckedHandle(arguments.ArgAt(0));
-  ASSERT(!function.IsNull());
-  ASSERT(function.HasCode());
 
   StackFrameIterator iterator(StackFrameIterator::kDontValidateFrames);
   StackFrame* frame = iterator.NextFrame();
@@ -1579,29 +1541,25 @@
     frame = iterator.NextFrame();
   }
   ASSERT(frame != NULL);
-  if (!frame->IsEntryFrame()) {
-    ASSERT(frame->IsDartFrame());
-    uword target = 0;
-    Function& target_function = Function::Handle();
-    CodePatcher::GetStaticCallAt(frame->pc(), &target_function, &target);
-    ASSERT(target_function.HasCode());
-    ASSERT(target_function.raw() == function.raw());
-    const Code& target_code = Code::Handle(function.CurrentCode());
-    const uword new_entry_point = target_code.EntryPoint();
-    ASSERT(target != new_entry_point);  // Why patch otherwise.
-    CodePatcher::PatchStaticCallAt(frame->pc(), new_entry_point);
-    const Code& code = Code::Handle(frame->LookupDartCode());
-    bool found = UpdateResolvedStaticCall(code,
-                                          frame->pc() - code.EntryPoint(),
-                                          target_code);
-    ASSERT(found);
-    if (FLAG_trace_patching) {
-      OS::Print("FixCallersTarget: patching from %#"Px" to '%s' %#"Px"\n",
-          frame->pc(),
-          target_function.ToFullyQualifiedCString(),
-          new_entry_point);
-    }
+  if (frame->IsEntryFrame()) {
+    // Since function's current code is always unpatched, the entry frame always
+    // calls to unpatched code.
+    UNREACHABLE();
   }
+  ASSERT(frame->IsDartFrame());
+  const Code& caller_code = Code::Handle(frame->LookupDartCode());
+  const Function& target_function = Function::Handle(
+      caller_code.GetStaticCallTargetFunctionAt(frame->pc()));
+  const Code& target_code = Code::Handle(target_function.CurrentCode());
+  CodePatcher::PatchStaticCallAt(frame->pc(), target_code.EntryPoint());
+  caller_code.SetStaticCallTargetCodeAt(frame->pc(), target_code);
+  if (FLAG_trace_patching) {
+    OS::Print("FixCallersTarget: patching from %#"Px" to '%s' %#"Px"\n",
+        frame->pc(),
+        Function::Handle(target_code.function()).ToFullyQualifiedCString(),
+        target_code.EntryPoint());
+  }
+  arguments.SetReturn(target_code);
 }
 
 
diff --git a/runtime/vm/code_patcher.h b/runtime/vm/code_patcher.h
index ebe8980..8377692 100644
--- a/runtime/vm/code_patcher.h
+++ b/runtime/vm/code_patcher.h
@@ -43,10 +43,7 @@
   // or dynamic Dart call.
   static bool IsDartCall(uword return_address);
 
-  // Get static call information.
-  static void GetStaticCallAt(uword return_address,
-                              Function* function,
-                              uword* target);
+  static uword GetStaticCallTargetAt(uword return_address);
 
   // Get instance call information.
   static void GetInstanceCallAt(uword return_address,
diff --git a/runtime/vm/code_patcher_arm.cc b/runtime/vm/code_patcher_arm.cc
index e67ce9d..0211183 100644
--- a/runtime/vm/code_patcher_arm.cc
+++ b/runtime/vm/code_patcher_arm.cc
@@ -10,7 +10,6 @@
 namespace dart {
 
 void CodePatcher::GetStaticCallAt(uword return_address,
-                                  Function* function,
                                   uword* target) {
   UNIMPLEMENTED();
 }
diff --git a/runtime/vm/code_patcher_ia32.cc b/runtime/vm/code_patcher_ia32.cc
index fc9a340..83260ce 100644
--- a/runtime/vm/code_patcher_ia32.cc
+++ b/runtime/vm/code_patcher_ia32.cc
@@ -14,7 +14,7 @@
 
 namespace dart {
 
-// The pattern of a Dart call is:
+// The pattern of a Dart instance call is:
 //  1: mov ECX, immediate 1
 //  2: mov EDX, immediate 2
 //  3: call target_address
@@ -97,27 +97,6 @@
 };
 
 
-// The expected pattern of a dart static call:
-//  mov ECX, function_object
-//  mov EDX, argument_descriptor_array
-//  call target_address
-//  <- return address
-class StaticCall : public DartCallPattern {
- public:
-  explicit StaticCall(uword return_address)
-      : DartCallPattern(return_address) {}
-
-  RawFunction* function() const {
-    Function& f = Function::Handle();
-    f ^= reinterpret_cast<RawObject*>(immediate_one());
-    return f.raw();
-  }
-
- private:
-  DISALLOW_IMPLICIT_CONSTRUCTORS(StaticCall);
-};
-
-
 // The expected pattern of a dart instance call:
 //  mov ECX, ic-data
 //  mov EDX, argument_descriptor_array
@@ -139,14 +118,59 @@
 };
 
 
-void CodePatcher::GetStaticCallAt(uword return_address,
-                                  Function* function,
-                                  uword* target) {
-  ASSERT(function != NULL);
-  ASSERT(target != NULL);
+// The expected pattern of a dart static call:
+//  mov EDX, argument_descriptor_array
+//  call target_address
+//  <- return address
+class StaticCall : public ValueObject {
+ public:
+  explicit StaticCall(uword return_address)
+      : start_(return_address - (kNumInstructions * kInstructionSize)) {
+    ASSERT(IsValid(return_address));
+    ASSERT(kInstructionSize == Assembler::kCallExternalLabelSize);
+  }
+
+  static bool IsValid(uword return_address) {
+    uint8_t* code_bytes =
+        reinterpret_cast<uint8_t*>(
+            return_address - (kNumInstructions * kInstructionSize));
+    return (code_bytes[0] == 0xBA) &&
+           (code_bytes[1 * kInstructionSize] == 0xE8);
+  }
+
+  uword target() const {
+    const uword offset = *reinterpret_cast<uword*>(call_address() + 1);
+    return return_address() + offset;
+  }
+
+  void set_target(uword target) const {
+    uword* target_addr = reinterpret_cast<uword*>(call_address() + 1);
+    uword offset = target - return_address();
+    *target_addr = offset;
+    CPU::FlushICache(call_address(), kInstructionSize);
+  }
+
+  static const int kNumInstructions = 2;
+  static const int kInstructionSize = 5;  // All instructions have same length.
+
+ private:
+  uword return_address() const {
+    return start_ + kNumInstructions * kInstructionSize;
+  }
+
+  uword call_address() const {
+    return start_ + 1 * kInstructionSize;
+  }
+
+  uword start_;
+
+  DISALLOW_IMPLICIT_CONSTRUCTORS(StaticCall);
+};
+
+
+uword CodePatcher::GetStaticCallTargetAt(uword return_address) {
   StaticCall call(return_address);
-  *target = call.target();
-  *function = call.function();
+  return call.target();
 }
 
 
diff --git a/runtime/vm/code_patcher_x64.cc b/runtime/vm/code_patcher_x64.cc
index 059c9cd..58a3785 100644
--- a/runtime/vm/code_patcher_x64.cc
+++ b/runtime/vm/code_patcher_x64.cc
@@ -14,7 +14,7 @@
 
 namespace dart {
 
-// The pattern of a Dart call is:
+// The pattern of a Dart instance call is:
 //  00: 48 bb imm64  mov RBX, immediate 1
 //  10: 49 ba imm64  mov R10, immediate 2
 //  20: 49 bb imm64  mov R11, target_address
@@ -87,24 +87,13 @@
 };
 
 
-// A Dart static call passes the function object in RBX.
-class StaticCall : public DartCallPattern {
- public:
-  explicit StaticCall(uword return_address)
-      : DartCallPattern(return_address) {}
-
-  RawFunction* function() const {
-    Function& f = Function::Handle();
-    f ^= reinterpret_cast<RawObject*>(immediate_one());
-    return f.raw();
-  }
-
- private:
-  DISALLOW_IMPLICIT_CONSTRUCTORS(StaticCall);
-};
-
-
 // A Dart instance call passes the ic-data in RBX.
+// The expected pattern of a dart instance call:
+//  mov RBX, ic-data
+//  mov R10, argument_descriptor_array
+//  mov R11, target_address
+//  call R11
+//  <- return address
 class InstanceCall : public DartCallPattern {
  public:
   explicit InstanceCall(uword return_address)
@@ -121,14 +110,50 @@
 };
 
 
-void CodePatcher::GetStaticCallAt(uword return_address,
-                                  Function* function,
-                                  uword* target) {
-  ASSERT(function != NULL);
-  ASSERT(target != NULL);
+// The expected pattern of a dart static call:
+//  mov R10, argument_descriptor_array (10 bytes)
+//  mov R11, target_address (10 bytes)
+//  call R11  (3 bytes)
+//  <- return address
+class StaticCall : public ValueObject {
+ public:
+  explicit StaticCall(uword return_address)
+      : start_(return_address - kCallPatternSize) {
+    ASSERT(IsValid(return_address));
+    ASSERT((kCallPatternSize - 10) == Assembler::kCallExternalLabelSize);
+  }
+
+  static const int kCallPatternSize = 23;
+
+  static bool IsValid(uword return_address) {
+    uint8_t* code_bytes =
+        reinterpret_cast<uint8_t*>(return_address - kCallPatternSize);
+    return (code_bytes[00] == 0x49) && (code_bytes[01] == 0xBA) &&
+           (code_bytes[10] == 0x49) && (code_bytes[11] == 0xBB) &&
+           (code_bytes[20] == 0x41) && (code_bytes[21] == 0xFF) &&
+           (code_bytes[22] == 0xD3);
+  }
+
+  uword target() const {
+    return *reinterpret_cast<uword*>(start_ + 10 + 2);
+  }
+
+  void set_target(uword target) const {
+    uword* target_addr = reinterpret_cast<uword*>(start_ + 10 + 2);
+    *target_addr = target;
+    CPU::FlushICache(start_ + 10, 2 + 8);
+  }
+
+ private:
+  uword start_;
+
+  DISALLOW_IMPLICIT_CONSTRUCTORS(StaticCall);
+};
+
+
+uword CodePatcher::GetStaticCallTargetAt(uword return_address) {
   StaticCall call(return_address);
-  *target = call.target();
-  *function = call.function();
+  return call.target();
 }
 
 
diff --git a/runtime/vm/compiler.cc b/runtime/vm/compiler.cc
index 4b11672..25cb8a3 100644
--- a/runtime/vm/compiler.cc
+++ b/runtime/vm/compiler.cc
@@ -277,6 +277,7 @@
       graph_compiler.FinalizeVarDescriptors(code);
       graph_compiler.FinalizeExceptionHandlers(code);
       graph_compiler.FinalizeComments(code);
+      graph_compiler.FinalizeStaticCallTargetsTable(code);
       if (optimized) {
         CodePatcher::PatchEntry(Code::Handle(function.CurrentCode()));
         function.SetCode(code);
@@ -416,6 +417,25 @@
   const ExceptionHandlers& handlers =
         ExceptionHandlers::Handle(code.exception_handlers());
   OS::Print("%s}\n", handlers.ToCString());
+
+  {
+    OS::Print("Static call target functions {\n");
+    const Array& table = Array::Handle(code.static_calls_target_table());
+    Smi& offset = Smi::Handle();
+    Function& function = Function::Handle();
+    Code& code = Code::Handle();
+    for (intptr_t i = 0; i < table.Length();
+        i += Code::kSCallTableEntryLength) {
+      offset ^= table.At(i + Code::kSCallTableOffsetEntry);
+      function ^= table.At(i + Code::kSCallTableFunctionEntry);
+      code ^= table.At(i + Code::kSCallTableCodeEntry);
+      OS::Print("  0x%"Px": %s, %p\n",
+          start + offset.Value(),
+          function.ToFullyQualifiedCString(),
+          code.raw());
+    }
+    OS::Print("}\n");
+  }
 }
 
 
diff --git a/runtime/vm/constants_ia32.h b/runtime/vm/constants_ia32.h
index 1c8325f..02a84b7 100644
--- a/runtime/vm/constants_ia32.h
+++ b/runtime/vm/constants_ia32.h
@@ -69,7 +69,8 @@
   TIMES_1 = 0,
   TIMES_2 = 1,
   TIMES_4 = 2,
-  TIMES_8 = 3
+  TIMES_8 = 3,
+  TIMES_HALF_WORD_SIZE = kWordSizeLog2 - 1
 };
 
 
diff --git a/runtime/vm/constants_x64.h b/runtime/vm/constants_x64.h
index 579ea56..38a2046 100644
--- a/runtime/vm/constants_x64.h
+++ b/runtime/vm/constants_x64.h
@@ -51,7 +51,15 @@
   XMM5 = 5,
   XMM6 = 6,
   XMM7 = 7,
-  kNumberOfXmmRegisters = 8,
+  XMM8 = 8,
+  XMM9 = 9,
+  XMM10 = 10,
+  XMM11 = 11,
+  XMM12 = 12,
+  XMM13 = 13,
+  XMM14 = 14,
+  XMM15 = 15,
+  kNumberOfXmmRegisters = 16,
   kNoXmmRegister = -1  // Signals an illegal register.
 };
 
@@ -84,7 +92,8 @@
   TIMES_1 = 0,
   TIMES_2 = 1,
   TIMES_4 = 2,
-  TIMES_8 = 3
+  TIMES_8 = 3,
+  TIMES_HALF_WORD_SIZE = kWordSizeLog2 - 1
 };
 
 
diff --git a/runtime/vm/custom_isolate_test.cc b/runtime/vm/custom_isolate_test.cc
index 2090a7d..d8e2444 100644
--- a/runtime/vm/custom_isolate_test.cc
+++ b/runtime/vm/custom_isolate_test.cc
@@ -24,7 +24,7 @@
 
 
 static const char* kCustomIsolateScriptChars =
-    "#import('dart:isolate');\n"
+    "import 'dart:isolate';\n"
     "\n"
     "ReceivePort mainPort;\n"
     "\n"
diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc
index 99e2886..fcc3501 100644
--- a/runtime/vm/dart.cc
+++ b/runtime/vm/dart.cc
@@ -48,12 +48,12 @@
 
 
 // TODO(turnidge): We should add a corresponding Dart::Cleanup.
-bool Dart::InitOnce(Dart_IsolateCreateCallback create,
+const char* Dart::InitOnce(Dart_IsolateCreateCallback create,
                     Dart_IsolateInterruptCallback interrupt,
                     Dart_IsolateShutdownCallback shutdown) {
   // TODO(iposva): Fix race condition here.
   if (vm_isolate_ != NULL || !Flags::Initialized()) {
-    return false;
+    return "VM already initialized.";
   }
   OS::InitOnce();
   VirtualMemory::InitOnce();
@@ -78,8 +78,10 @@
     Symbols::InitOnce(vm_isolate_);
     CPUFeatures::InitOnce();
 #if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64)
-    // Dart VM requires at least SSE3.
-    if (!CPUFeatures::sse3_supported()) return false;
+    // Dart VM requires at least SSE2.
+    if (!CPUFeatures::sse2_supported()) {
+      return "SSE2 is required.";
+    }
 #endif
     PremarkingVisitor premarker(vm_isolate_);
     vm_isolate_->heap()->IterateOldObjects(&premarker);
@@ -89,7 +91,7 @@
   Isolate::SetCreateCallback(create);
   Isolate::SetInterruptCallback(interrupt);
   Isolate::SetShutdownCallback(shutdown);
-  return true;
+  return NULL;
 }
 
 
diff --git a/runtime/vm/dart.h b/runtime/vm/dart.h
index 4b741e0..585cddd 100644
--- a/runtime/vm/dart.h
+++ b/runtime/vm/dart.h
@@ -18,9 +18,9 @@
 
 class Dart : public AllStatic {
  public:
-  static bool InitOnce(Dart_IsolateCreateCallback create,
-                       Dart_IsolateInterruptCallback interrupt,
-                       Dart_IsolateShutdownCallback shutdown);
+  static const char* InitOnce(Dart_IsolateCreateCallback create,
+                              Dart_IsolateInterruptCallback interrupt,
+                              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 88d0389..aed8a10 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -739,7 +739,12 @@
 DART_EXPORT bool Dart_Initialize(Dart_IsolateCreateCallback create,
                                  Dart_IsolateInterruptCallback interrupt,
                                  Dart_IsolateShutdownCallback shutdown) {
-  return Dart::InitOnce(create, interrupt, shutdown);
+  const char* err_msg = Dart::InitOnce(create, interrupt, shutdown);
+  if (err_msg != NULL) {
+    OS::PrintErr("Dart_Initialize: %s\n", err_msg);
+    return false;
+  }
+  return true;
 }
 
 DART_EXPORT bool Dart_SetVMFlags(int argc, const char** argv) {
@@ -1571,7 +1576,7 @@
 }
 
 
-DART_EXPORT Dart_Handle Dart_NewStringFromUTF32(const uint32_t* utf32_array,
+DART_EXPORT Dart_Handle Dart_NewStringFromUTF32(const int32_t* utf32_array,
                                                 intptr_t length) {
   Isolate* isolate = Isolate::Current();
   DARTSCOPE(isolate);
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index 0fa7e0b..ecc1df1 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -541,7 +541,7 @@
   EXPECT(Dart_IsString(ext16));
   EXPECT(Dart_IsExternalString(ext16));
 
-  uint32_t data32[] = { 'f', 'o', 'u', 'r', 0x10FFFF };
+  int32_t data32[] = { 'f', 'o', 'u', 'r', 0x10FFFF };
 
   Dart_Handle str32 = Dart_NewStringFromUTF32(data32, ARRAY_SIZE(data32));
   EXPECT_VALID(str32);
@@ -2647,7 +2647,7 @@
       "  return new Fields();\n"
       "}\n";
   const char* kImportedScriptChars =
-      "#library('library_name');\n"
+      "library library_name;\n"
       "var imported_fld = 'imported';\n"
       "var _imported_fld = 'hidden imported';\n"
       "get imported_getset_fld { return _gs_fld1; }\n"
@@ -2951,7 +2951,7 @@
 
 TEST_CASE(InjectNativeFields3) {
   const char* kScriptChars =
-      "#import('dart:nativewrappers');"
+      "import 'dart:nativewrappers';"
       "class NativeFields extends NativeFieldWrapperClass2 {\n"
       "  NativeFields(int i, int j) : fld1 = i, fld2 = j {}\n"
       "  int fld1;\n"
@@ -2993,7 +2993,7 @@
 
 TEST_CASE(InjectNativeFields4) {
   const char* kScriptChars =
-      "#import('dart:nativewrappers');"
+      "import 'dart:nativewrappers';"
       "class NativeFields extends NativeFieldWrapperClass2 {\n"
       "  NativeFields(int i, int j) : fld1 = i, fld2 = j {}\n"
       "  int fld1;\n"
@@ -3015,7 +3015,7 @@
   // We expect the test script to fail finalization with the error below:
   EXPECT(Dart_IsError(result));
   Dart_Handle expected_error = Dart_Error(
-      "'dart:test-lib': Error: line 1 pos 38: "
+      "'dart:test-lib': Error: line 1 pos 36: "
       "class 'NativeFields' is trying to extend a native fields class, "
       "but library '%s' has no native resolvers",
       TestCase::url());
@@ -3025,7 +3025,7 @@
 
 TEST_CASE(InjectNativeFieldsSuperClass) {
   const char* kScriptChars =
-      "#import('dart:nativewrappers');"
+      "import 'dart:nativewrappers';"
       "class NativeFieldsSuper extends NativeFieldWrapperClass1 {\n"
       "  NativeFieldsSuper() : fld1 = 42 {}\n"
       "  int fld1;\n"
@@ -3185,7 +3185,7 @@
 
 TEST_CASE(ImplicitNativeFieldAccess) {
   const char* kScriptChars =
-      "#import('dart:nativewrappers');"
+      "import 'dart:nativewrappers';"
       "class NativeFields extends NativeFieldWrapperClass4 {\n"
       "  NativeFields(int i, int j) : fld1 = i, fld2 = j {}\n"
       "  int fld0;\n"
@@ -3811,11 +3811,11 @@
 
 TEST_CASE(Invoke_CrossLibrary) {
   const char* kLibrary1Chars =
-      "#library('library1_name');\n"
+      "library library1_name;\n"
       "void local() {}\n"
       "void _local() {}\n";
   const char* kLibrary2Chars =
-      "#library('library2_name');\n"
+      "library library2_name;\n"
       "void imported() {}\n"
       "void _imported() {}\n";
 
@@ -5115,11 +5115,11 @@
 
 TEST_CASE(LookupLibrary) {
   const char* kScriptChars =
-      "#import('library1.dart');"
+      "import 'library1_dart';"
       "main() {}";
   const char* kLibrary1Chars =
-      "#library('library1.dart');"
-      "#import('library2.dart');";
+      "library library1_dart;"
+      "import 'library2_dart';";
 
   // Create a test library and Load up a test script in it.
   Dart_Handle url = NewString(TestCase::url());
@@ -5129,7 +5129,7 @@
   result = Dart_LoadScript(url, source);
   EXPECT_VALID(result);
 
-  url = NewString("library1.dart");
+  url = NewString("library1_dart");
   source = NewString(kLibrary1Chars);
   result = Dart_LoadLibrary(url, source);
   EXPECT_VALID(result);
@@ -5162,7 +5162,7 @@
 
 TEST_CASE(LibraryName) {
   const char* kLibrary1Chars =
-      "#library('library1_name');";
+      "library library1_name;";
   Dart_Handle url = NewString("library1_url");
   Dart_Handle source = NewString(kLibrary1Chars);
   Dart_Handle lib = Dart_LoadLibrary(url, source);
@@ -5195,7 +5195,7 @@
 
 TEST_CASE(LibraryUrl) {
   const char* kLibrary1Chars =
-      "#library('library1_name');";
+      "library library1_name;";
   Dart_Handle url = NewString("library1_url");
   Dart_Handle source = NewString(kLibrary1Chars);
   Dart_Handle lib = Dart_LoadLibrary(url, source);
@@ -5228,7 +5228,7 @@
 
 TEST_CASE(LibraryGetClassNames) {
   const char* kLibraryChars =
-      "#library('library_name');\n"
+      "library library_name;\n"
       "\n"
       "class A {}\n"
       "class B {}\n"
@@ -5265,7 +5265,7 @@
 
 TEST_CASE(GetFunctionNames) {
   const char* kLibraryChars =
-      "#library('library_name');\n"
+      "library library_name;\n"
       "\n"
       "void A() {}\n"
       "get B => 11;\n"
@@ -5335,7 +5335,7 @@
 
 TEST_CASE(GetVariableNames) {
   const char* kLibraryChars =
-      "#library('library_name');\n"
+      "library library_name;\n"
       "\n"
       "var A;\n"
       "get B => 12;\n"
@@ -5400,9 +5400,9 @@
 
 TEST_CASE(LibraryImportLibrary) {
   const char* kLibrary1Chars =
-      "#library('library1_name');";
+      "library library1_name;";
   const char* kLibrary2Chars =
-      "#library('library2_name');";
+      "library library2_name;";
   Dart_Handle error = Dart_Error("incoming error");
   Dart_Handle result;
 
@@ -5455,7 +5455,7 @@
 
 TEST_CASE(ImportLibraryWithPrefix) {
   const char* kLibrary1Chars =
-      "#library('library1_name');"
+      "library library1_name;"
       "int bar() => 42;";
   Dart_Handle url1 = NewString("library1_url");
   Dart_Handle source1 = NewString(kLibrary1Chars);
@@ -5464,7 +5464,7 @@
   EXPECT(Dart_IsLibrary(lib1));
 
   const char* kLibrary2Chars =
-      "#library('library2_name');"
+      "library library2_name;"
       "int foobar() => foo.bar();";
   Dart_Handle url2 = NewString("library2_url");
   Dart_Handle source2 = NewString(kLibrary2Chars);
@@ -5496,7 +5496,7 @@
 
 TEST_CASE(LoadLibrary) {
   const char* kLibrary1Chars =
-      "#library('library1_name');";
+      "library library1_name;";
   Dart_Handle error = Dart_Error("incoming error");
   Dart_Handle result;
 
@@ -5548,7 +5548,7 @@
 
 TEST_CASE(LoadLibrary_CompileError) {
   const char* kLibrary1Chars =
-      "#library('library1_name');"
+      "library library1_name;"
       ")";
   Dart_Handle url = NewString("library1_url");
   Dart_Handle source = NewString(kLibrary1Chars);
@@ -5560,7 +5560,7 @@
 
 TEST_CASE(LoadSource) {
   const char* kLibrary1Chars =
-      "#library('library1_name');";
+      "library library1_name;";
   const char* kSourceChars =
       "// Something innocuous";
   const char* kBadSourceChars =
@@ -5643,7 +5643,7 @@
 
 TEST_CASE(LoadSource_LateLoad) {
   const char* kLibrary1Chars =
-      "#library('library1_name');\n"
+      "library library1_name;\n"
       "class OldClass {\n"
       "  foo() => 'foo';\n"
       "}\n";
@@ -5688,7 +5688,7 @@
 
 TEST_CASE(LoadPatch) {
   const char* kLibrary1Chars =
-      "#library('library1_name');";
+      "library library1_name;";
   const char* kSourceChars =
       "external int foo();";
   const char* kPatchChars =
@@ -5737,7 +5737,7 @@
 
 TEST_CASE(ParsePatchLibrary) {
   const char* kLibraryChars =
-  "#library('patched_library');\n"
+  "library patched_library;\n"
   "class A {\n"
   "  final fvalue;\n"
   "  var _f;\n"
@@ -5779,7 +5779,7 @@
   "patch(x) => x*3;\n";
 
   const char* kScriptChars =
-  "#import('theLibrary');\n"
+  "import 'theLibrary';\n"
   "e1() => unpatched();\n"
   "m1() => topLevel(2);\n"
   "m2() {\n"
@@ -5982,16 +5982,16 @@
 // in the importing library.
 TEST_CASE(ImportLibrary2) {
   const char* kScriptChars =
-      "#import('library1.dart');\n"
+      "import 'library1_dart';\n"
       "var foo;\n"
       "main() { foo = 0; }\n";
   const char* kLibrary1Chars =
-      "#library('library1.dart');\n"
-      "#import('library2.dart');\n"
+      "library library1_dart;\n"
+      "import 'library2_dart';\n"
       "var foo;\n";
   const char* kLibrary2Chars =
-      "#library('library2.dart');\n"
-      "#import('library1.dart');\n"
+      "library library2_dart;\n"
+      "import 'library1_dart';\n"
       "var foo;\n";
   Dart_Handle result;
   // Create a test library and Load up a test script in it.
@@ -6001,11 +6001,11 @@
   EXPECT_VALID(result);
   result = Dart_LoadScript(url, source);
 
-  url = NewString("library1.dart");
+  url = NewString("library1_dart");
   source = NewString(kLibrary1Chars);
   Dart_LoadLibrary(url, source);
 
-  url = NewString("library2.dart");
+  url = NewString("library2_dart");
   source = NewString(kLibrary2Chars);
   Dart_LoadLibrary(url, source);
 
@@ -6018,15 +6018,15 @@
 // an error if that name is referenced.
 TEST_CASE(ImportLibrary3) {
   const char* kScriptChars =
-      "#import('library2.dart');\n"
-      "#import('library1.dart');\n"
+      "import 'library2_dart';\n"
+      "import 'library1_dart';\n"
       "var foo_top = 10;  // foo has dup def. So should be an error.\n"
       "main() { foo = 0; }\n";
   const char* kLibrary1Chars =
-      "#library('library1.dart');\n"
+      "library library1_dart;\n"
       "var foo;";
   const char* kLibrary2Chars =
-      "#library('library2.dart');\n"
+      "library library2_dart;\n"
       "var foo;";
   Dart_Handle result;
 
@@ -6038,11 +6038,11 @@
   result = Dart_LoadScript(url, source);
   EXPECT_VALID(result);
 
-  url = NewString("library2.dart");
+  url = NewString("library2_dart");
   source = NewString(kLibrary2Chars);
   Dart_LoadLibrary(url, source);
 
-  url = NewString("library1.dart");
+  url = NewString("library1_dart");
   source = NewString(kLibrary1Chars);
   Dart_LoadLibrary(url, source);
 
@@ -6056,14 +6056,14 @@
 // not an error if that name is not used.
 TEST_CASE(ImportLibrary4) {
   const char* kScriptChars =
-      "#import('library2.dart');\n"
-      "#import('library1.dart');\n"
+      "import 'library2_dart';\n"
+      "import 'library1_dart';\n"
       "main() {  }\n";
   const char* kLibrary1Chars =
-      "#library('library1.dart');\n"
+      "library library1_dart;\n"
       "var foo;";
   const char* kLibrary2Chars =
-      "#library('library2.dart');\n"
+      "library library2_dart;\n"
       "var foo;";
   Dart_Handle result;
 
@@ -6075,11 +6075,11 @@
   result = Dart_LoadScript(url, source);
   EXPECT_VALID(result);
 
-  url = NewString("library2.dart");
+  url = NewString("library2_dart");
   source = NewString(kLibrary2Chars);
   Dart_LoadLibrary(url, source);
 
-  url = NewString("library1.dart");
+  url = NewString("library1_dart");
   source = NewString(kLibrary1Chars);
   Dart_LoadLibrary(url, source);
 
@@ -6090,13 +6090,13 @@
 
 TEST_CASE(ImportLibrary5) {
   const char* kScriptChars =
-      "#import('lib.dart');\n"
+      "import 'lib.dart';\n"
       "interface Y {\n"
       "  void set handler(void callback(List<int> x));\n"
       "}\n"
       "void main() {}\n";
   const char* kLibraryChars =
-      "#library('lib.dart');\n"
+      "library lib.dart;\n"
       "interface X {\n"
       "  void set handler(void callback(List<int> x));\n"
       "}\n";
@@ -6161,7 +6161,7 @@
 
   TestIsolateScope __test_isolate__;
   const char* kScriptChars =
-      "#import('dart:isolate');\n"
+      "import 'dart:isolate';\n"
       "void callPort(SendPort port) {\n"
       "    port.call(null).then((message) {\n"
       "      throw new Exception(message);\n"
@@ -6212,8 +6212,8 @@
                                 void* data,
                                 char** error) {
   const char* kScriptChars =
-      "#import('builtin');\n"
-      "#import('dart:isolate');\n"
+      "import 'builtin';\n"
+      "import 'dart:isolate';\n"
       "void entry() {\n"
       "  port.receive((message, replyTo) {\n"
       "    if (message) {\n"
@@ -6770,7 +6770,7 @@
 TEST_CASE(RangeLimits) {
   uint8_t chars8[1] = {'a'};
   uint16_t chars16[1] = {'a'};
-  uint32_t chars32[1] = {'a'};
+  int32_t chars32[1] = {'a'};
 
   EXPECT_ERROR(Dart_NewList(-1),
                "expects argument 'length' to be in the range");
diff --git a/runtime/vm/dart_api_message.cc b/runtime/vm/dart_api_message.cc
index 64eea31..4cee392 100644
--- a/runtime/vm/dart_api_message.cc
+++ b/runtime/vm/dart_api_message.cc
@@ -17,7 +17,8 @@
                                    ReAlloc alloc)
     : BaseReader(buffer, length),
       alloc_(alloc),
-      backward_references_(kNumInitialReferences) {
+      backward_references_(kNumInitialReferences),
+      vm_symbol_references_(NULL) {
   Init();
 }
 
@@ -215,13 +216,29 @@
 
 Dart_CObject* ApiMessageReader::ReadVMSymbol(intptr_t object_id) {
   if (Symbols::IsVMSymbolId(object_id)) {
+    intptr_t symbol_id = object_id - kMaxPredefinedObjectIds;
+    Dart_CObject* object;
+    if (vm_symbol_references_ != NULL &&
+        (object = vm_symbol_references_[symbol_id]) != NULL) {
+      return object;
+    }
+
+    if (vm_symbol_references_ == NULL) {
+      intptr_t size = sizeof(*vm_symbol_references_) * Symbols::kMaxId;
+      vm_symbol_references_ =
+          reinterpret_cast<Dart_CObject**>(alloc_(NULL, 0, size));
+      memset(vm_symbol_references_, 0, size);
+    }
+
     RawOneByteString* str =
         reinterpret_cast<RawOneByteString*>(Symbols::GetVMSymbol(object_id));
     intptr_t len = Smi::Value(str->ptr()->length_);
-    Dart_CObject* object = AllocateDartCObjectString(len);
+    object = AllocateDartCObjectString(len);
     char* p = object->value.as_string;
     memmove(p, str->ptr()->data_, len);
     p[len] = '\0';
+    ASSERT(vm_symbol_references_[symbol_id] == NULL);
+    vm_symbol_references_[symbol_id] = object;
     return object;
   }
   // No other VM isolate objects are supported.
diff --git a/runtime/vm/dart_api_message.h b/runtime/vm/dart_api_message.h
index c37d8fb..dbd7278 100644
--- a/runtime/vm/dart_api_message.h
+++ b/runtime/vm/dart_api_message.h
@@ -109,6 +109,7 @@
   // function.
   ReAlloc alloc_;
   ApiGrowableArray<BackRefNode*> backward_references_;
+  Dart_CObject** vm_symbol_references_;
 
   Dart_CObject type_arguments_marker;
   Dart_CObject dynamic_type_marker;
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index 96019a9..5d5cf71 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -575,8 +575,7 @@
       break;
     }
     case PcDescriptors::kFuncCall: {
-      Function& func = Function::Handle();
-      CodePatcher::GetStaticCallAt(pc_, &func, &saved_bytes_.target_address_);
+      saved_bytes_.target_address_ = CodePatcher::GetStaticCallTargetAt(pc_);
       CodePatcher::PatchStaticCallAt(pc_,
           StubCode::BreakpointStaticEntryPoint());
       break;
@@ -1403,9 +1402,10 @@
       }
     } else if (bpt->breakpoint_kind_ == PcDescriptors::kFuncCall) {
       func_to_instrument = bpt->function();
-      Function& callee = Function::Handle();
-      uword target;
-      CodePatcher::GetStaticCallAt(bpt->pc_, &callee, &target);
+      const Code& code = Code::Handle(func_to_instrument.CurrentCode());
+      const Function& callee =
+          Function::Handle(code.GetStaticCallTargetFunctionAt(bpt->pc_));
+      ASSERT(!callee.IsNull());
       if (IsDebuggable(callee)) {
         func_to_instrument = callee.raw();
       }
diff --git a/runtime/vm/exceptions.cc b/runtime/vm/exceptions.cc
index fc2e2c9..479ad64 100644
--- a/runtime/vm/exceptions.cc
+++ b/runtime/vm/exceptions.cc
@@ -144,7 +144,7 @@
   Instance& exception = Instance::Handle(incoming_exception.raw());
   if (exception.IsNull()) {
     GrowableArray<const Object*> arguments;
-    exception ^= Exceptions::Create(Exceptions::kNullPointer, arguments);
+    exception ^= Exceptions::Create(Exceptions::kNullThrown, arguments);
   }
   uword handler_pc = 0;
   uword handler_sp = 0;
@@ -427,18 +427,14 @@
       library = Library::CoreLibrary();
       class_name = Symbols::New("InternalError");
       break;
-    case kNullPointer:
+    case kNullThrown:
       library = Library::CoreLibrary();
-      class_name = Symbols::New("NullPointerException");
+      class_name = Symbols::New("NullThrownError");
       break;
     case kIllegalJSRegExp:
       library = Library::CoreLibrary();
       class_name = Symbols::New("IllegalJSRegExpException");
       break;
-    case kArgumentError:
-      library = Library::CoreLibrary();
-      class_name = Symbols::New("ArgumentError");
-      break;
     case kIsolateSpawn:
       library = Library::IsolateLibrary();
       class_name = Symbols::New("IsolateSpawnException");
diff --git a/runtime/vm/exceptions.h b/runtime/vm/exceptions.h
index 1fe2665..0cc048f 100644
--- a/runtime/vm/exceptions.h
+++ b/runtime/vm/exceptions.h
@@ -56,9 +56,8 @@
     kStackOverflow,
     kOutOfMemory,
     kInternalError,
-    kNullPointer,
+    kNullThrown,
     kIllegalJSRegExp,
-    kArgumentError,
     kIsolateSpawn
   };
 
diff --git a/runtime/vm/flow_graph_allocator.cc b/runtime/vm/flow_graph_allocator.cc
index 609d1d6..939f393 100644
--- a/runtime/vm/flow_graph_allocator.cc
+++ b/runtime/vm/flow_graph_allocator.cc
@@ -62,6 +62,7 @@
 
 FlowGraphAllocator::FlowGraphAllocator(const FlowGraph& flow_graph)
   : flow_graph_(flow_graph),
+    reaching_defs_(flow_graph),
     mint_values_(NULL),
     block_order_(flow_graph.reverse_postorder()),
     postorder_(flow_graph.postorder()),
@@ -146,9 +147,15 @@
       }
 
       // Handle uses.
+      LocationSummary* locs = current->locs();
+      ASSERT(locs->input_count() == current->InputCount());
       for (intptr_t j = 0; j < current->InputCount(); j++) {
         Value* input = current->InputAt(j);
         const intptr_t use = input->definition()->ssa_temp_index();
+
+        ASSERT(!locs->in(j).IsConstant() || input->BindsToConstant());
+        if (locs->in(j).IsConstant()) continue;
+
         live_in->Add(use);
       }
 
@@ -182,6 +189,8 @@
           // live-in for a predecessor.
           for (intptr_t k = 0; k < phi->InputCount(); k++) {
             Value* val = phi->InputAt(k);
+            if (val->BindsToConstant()) continue;
+
             BlockEntryInstr* pred = block->PredecessorAt(k);
             const intptr_t use = val->definition()->ssa_temp_index();
             if (!kill_[pred->postorder_number()]->Contains(use)) {
@@ -517,9 +526,12 @@
 void FlowGraphAllocator::BuildLiveRanges() {
   const intptr_t block_count = postorder_.length();
   ASSERT(postorder_.Last()->IsGraphEntry());
+  BitVector* current_interference_set = NULL;
   for (intptr_t i = 0; i < (block_count - 1); i++) {
     BlockEntryInstr* block = postorder_[i];
 
+    BlockInfo* block_info = BlockInfoAt(block->start_pos());
+
     // For every SSA value that is live out of this block, create an interval
     // that covers the whole block.  It will be shortened if we encounter a
     // definition of this value in this block.
@@ -528,23 +540,33 @@
       range->AddUseInterval(block->start_pos(), block->end_pos());
     }
 
+    BlockInfo* loop_header = block_info->loop_header();
+    if ((loop_header != NULL) && (loop_header->last_block() == block)) {
+      current_interference_set =
+          new BitVector(flow_graph_.max_virtual_register_number());
+      ASSERT(loop_header->backedge_interference() == NULL);
+      loop_header->set_backedge_interference(
+          current_interference_set);
+    }
+
     // Connect outgoing phi-moves that were created in NumberInstructions
     // and find last instruction that contributes to liveness.
-    Instruction* current = ConnectOutgoingPhiMoves(block);
+    Instruction* current = ConnectOutgoingPhiMoves(block,
+                                                   current_interference_set);
 
     // Now process all instructions in reverse order.
     while (current != block) {
       // Skip parallel moves that we insert while processing instructions.
       if (!current->IsParallelMove()) {
-        ProcessOneInstruction(block, current);
+        ProcessOneInstruction(block, current, current_interference_set);
       }
       current = current->previous();
     }
 
 
     // Check if any values live into the loop can be spilled for free.
-    BlockInfo* block_info = BlockInfoAt(block->start_pos());
     if (block_info->is_loop_header()) {
+      current_interference_set = NULL;
       for (BitVector::Iterator it(live_in_[i]); !it.Done(); it.Advance()) {
         LiveRange* range = GetLiveRange(it.Current());
         if (HasOnlyUnconstrainedUsesInLoop(range, block_info)) {
@@ -650,7 +672,7 @@
 //
 
 Instruction* FlowGraphAllocator::ConnectOutgoingPhiMoves(
-    BlockEntryInstr* block) {
+    BlockEntryInstr* block, BitVector* interfere_at_backedge) {
   Instruction* last = block->last_instruction();
 
   GotoInstr* goto_instr = last->AsGoto();
@@ -696,7 +718,9 @@
     //      value    --*
     //
 
-    LiveRange* range = GetLiveRange(val->definition()->ssa_temp_index());
+    const intptr_t vreg = val->definition()->ssa_temp_index();
+    LiveRange* range = GetLiveRange(vreg);
+    if (interfere_at_backedge != NULL) interfere_at_backedge->Add(vreg);
 
     range->AddUseInterval(block->start_pos(), pos);
     range->AddHintedUse(pos, move->src_slot(), move->dest_slot());
@@ -821,7 +845,8 @@
 // Create and update live ranges corresponding to instruction's inputs,
 // temporaries and output.
 void FlowGraphAllocator::ProcessOneInstruction(BlockEntryInstr* block,
-                                               Instruction* current) {
+                                               Instruction* current,
+                                               BitVector* interference_set) {
   LocationSummary* locs = current->locs();
 
   Definition* def = current->AsDefinition();
@@ -1065,6 +1090,12 @@
     range->AddHintedUse(pos, out, move->src_slot());
     range->AddUse(pos, move->dest_slot());
     range->AddUse(pos, locs->in_slot(0));
+
+    if ((interference_set != NULL) &&
+        (range->vreg() >= 0) &&
+        interference_set->Contains(range->vreg())) {
+      interference_set->Add(input->ssa_temp_index());
+    }
   } else {
     // Normal unallocated location that requires a register. Expected shape of
     // live range:
@@ -1451,7 +1482,7 @@
 LiveRange* FlowGraphAllocator::SplitBetween(LiveRange* range,
                                             intptr_t from,
                                             intptr_t to) {
-  TRACE_ALLOC(OS::Print("split %"Pd" [%"Pd", %"Pd") between [%"Pd", %"Pd")\n",
+  TRACE_ALLOC(OS::Print("split v%"Pd" [%"Pd", %"Pd") between [%"Pd", %"Pd")\n",
                         range->vreg(), range->Start(), range->End(), from, to));
 
   intptr_t split_pos = kIllegalPosition;
@@ -1489,7 +1520,7 @@
                                       intptr_t from,
                                       intptr_t to) {
   ASSERT(from < to);
-  TRACE_ALLOC(OS::Print("spill %"Pd" [%"Pd", %"Pd") "
+  TRACE_ALLOC(OS::Print("spill v%"Pd" [%"Pd", %"Pd") "
                         "between [%"Pd", %"Pd")\n",
                         range->vreg(), range->Start(), range->End(), from, to));
   LiveRange* tail = range->SplitAt(from);
@@ -1507,7 +1538,7 @@
 
 
 void FlowGraphAllocator::SpillAfter(LiveRange* range, intptr_t from) {
-  TRACE_ALLOC(OS::Print("spill %"Pd" [%"Pd", %"Pd") after %"Pd"\n",
+  TRACE_ALLOC(OS::Print("spill v%"Pd" [%"Pd", %"Pd") after %"Pd"\n",
                         range->vreg(), range->Start(), range->End(), from));
 
   // When spilling the value inside the loop check if this spill can
@@ -1614,6 +1645,72 @@
 }
 
 
+void ReachingDefs::AddPhi(PhiInstr* phi) {
+  if (phi->reaching_defs() == NULL) {
+    phi->set_reaching_defs(
+        new BitVector(flow_graph_.max_virtual_register_number()));
+
+    // Compute initial set reaching defs set.
+    bool depends_on_phi = false;
+    for (intptr_t i = 0; i < phi->InputCount(); i++) {
+      Definition* input = phi->InputAt(i)->definition();
+      if (input->IsPhi()) {
+        depends_on_phi = true;
+      }
+      phi->reaching_defs()->Add(input->ssa_temp_index());
+    }
+
+    // If this phi depends on another phi then we need fix point iteration.
+    if (depends_on_phi) phis_.Add(phi);
+  }
+}
+
+
+void ReachingDefs::Compute() {
+  // Transitively collect all phis that are used by the given phi.
+  for (intptr_t i = 0; i < phis_.length(); i++) {
+    PhiInstr* phi = phis_[i];
+
+    // Add all phis that affect this phi to the list.
+    for (intptr_t i = 0; i < phi->InputCount(); i++) {
+      PhiInstr* input_phi = phi->InputAt(i)->definition()->AsPhi();
+      if (input_phi != NULL) {
+        AddPhi(input_phi);
+      }
+    }
+  }
+
+  // Propagate values until fix point is reached.
+  bool changed;
+  do {
+    changed = false;
+    for (intptr_t i = 0; i < phis_.length(); i++) {
+      PhiInstr* phi = phis_[i];
+      for (intptr_t i = 0; i < phi->InputCount(); i++) {
+        PhiInstr* input_phi = phi->InputAt(i)->definition()->AsPhi();
+        if (input_phi != NULL) {
+          if (phi->reaching_defs()->AddAll(input_phi->reaching_defs())) {
+            changed = true;
+          }
+        }
+      }
+    }
+  } while (changed);
+
+  phis_.Clear();
+}
+
+
+BitVector* ReachingDefs::Get(PhiInstr* phi) {
+  if (phi->reaching_defs() == NULL) {
+    ASSERT(phis_.is_empty());
+    AddPhi(phi);
+    Compute();
+  }
+  return phi->reaching_defs();
+}
+
+
 bool FlowGraphAllocator::AllocateFreeRegister(LiveRange* unallocated) {
   intptr_t candidate = kNoRegister;
   intptr_t free_until = 0;
@@ -1628,10 +1725,10 @@
       candidate = hint.register_code();
     }
 
-    TRACE_ALLOC(OS::Print("found hint "));
-    TRACE_ALLOC(hint.Print());
-    TRACE_ALLOC(OS::Print(" for %"Pd": free until %"Pd"\n",
-                          unallocated->vreg(), free_until));
+    TRACE_ALLOC(OS::Print("found hint %s for v%"Pd": free until %"Pd"\n",
+                          hint.Name(),
+                          unallocated->vreg(),
+                          free_until));
   } else if (free_until != kMaxPosition) {
     for (intptr_t reg = 0; reg < NumberOfRegisters(); ++reg) {
       if (!blocked_registers_[reg] && (registers_[reg].length() == 0)) {
@@ -1642,6 +1739,66 @@
     }
   }
 
+  // We have a very good candidate (either hinted to us or completely free).
+  // If we are in a loop try to reduce number of moves on the back edge by
+  // searching for a candidate that does not interfere with phis on the back
+  // edge.
+  BlockInfo* loop_header = BlockInfoAt(unallocated->Start())->loop_header();
+  if ((unallocated->vreg() >= 0) &&
+      (loop_header != NULL) &&
+      (free_until >= loop_header->last_block()->end_pos()) &&
+      loop_header->backedge_interference()->Contains(unallocated->vreg())) {
+    ASSERT(static_cast<intptr_t>(kNumberOfXmmRegisters) <=
+           kNumberOfCpuRegisters);
+    bool used_on_backedge[kNumberOfCpuRegisters] = { false };
+
+    for (PhiIterator it(loop_header->entry()->AsJoinEntry());
+         !it.Done();
+         it.Advance()) {
+      PhiInstr* phi = it.Current();
+      if (phi->is_alive()) {
+        const intptr_t phi_vreg = phi->ssa_temp_index();
+        LiveRange* range = GetLiveRange(phi_vreg);
+        if (range->assigned_location().kind() == register_kind_) {
+          const intptr_t reg = range->assigned_location().register_code();
+
+          if (!reaching_defs_.Get(phi)->Contains(unallocated->vreg())) {
+            used_on_backedge[reg] = true;
+          }
+        }
+      }
+    }
+
+    if (used_on_backedge[candidate]) {
+      TRACE_ALLOC(OS::Print(
+          "considering %s for v%"Pd": has interference on the back edge"
+          " {loop [%"Pd", %"Pd")}\n",
+          MakeRegisterLocation(candidate, Location::kDouble).Name(),
+          unallocated->vreg(),
+          loop_header->entry()->start_pos(),
+          loop_header->last_block()->end_pos()));
+      for (intptr_t reg = 0; reg < NumberOfRegisters(); ++reg) {
+        if (blocked_registers_[reg] ||
+            (reg == candidate) ||
+            used_on_backedge[reg]) {
+          continue;
+        }
+
+        const intptr_t intersection =
+            FirstIntersectionWithAllocated(reg, unallocated);
+        if (intersection >= free_until) {
+          candidate = reg;
+          free_until = intersection;
+          TRACE_ALLOC(OS::Print(
+              "found %s for v%"Pd" with no interference on the back edge\n",
+              MakeRegisterLocation(candidate, Location::kDouble).Name(),
+              candidate));
+          break;
+        }
+      }
+    }
+  }
+
   ASSERT(0 <= kMaxPosition);
   if (free_until != kMaxPosition) {
     for (intptr_t reg = 0; reg < NumberOfRegisters(); ++reg) {
@@ -1661,7 +1818,7 @@
 
   TRACE_ALLOC(OS::Print("assigning free register "));
   TRACE_ALLOC(MakeRegisterLocation(candidate, Location::kDouble).Print());
-  TRACE_ALLOC(OS::Print(" to %"Pd"\n", unallocated->vreg()));
+  TRACE_ALLOC(OS::Print(" to v%"Pd"\n", unallocated->vreg()));
 
   if (free_until != kMaxPosition) {
     // There was an intersection. Split unallocated.
@@ -1764,7 +1921,7 @@
 
   TRACE_ALLOC(OS::Print("assigning blocked register "));
   TRACE_ALLOC(MakeRegisterLocation(candidate, Location::kDouble).Print());
-  TRACE_ALLOC(OS::Print(" to live range %"Pd" until %"Pd"\n",
+  TRACE_ALLOC(OS::Print(" to live range v%"Pd" until %"Pd"\n",
                         unallocated->vreg(), blocked_at));
 
   if (blocked_at < unallocated->End()) {
@@ -2070,6 +2227,7 @@
   const GrowableArray<LiveRange*>& unallocated,
   LiveRange** blocking_ranges,
   bool* blocked_registers) {
+  ASSERT(number_of_registers <= kNumberOfCpuRegisters);
   register_kind_ = register_kind;
   number_of_registers_ = number_of_registers;
 
@@ -2097,7 +2255,7 @@
   while (!unallocated_.is_empty()) {
     LiveRange* range = unallocated_.RemoveLast();
     const intptr_t start = range->Start();
-    TRACE_ALLOC(OS::Print("Processing live range for vreg %"Pd" "
+    TRACE_ALLOC(OS::Print("Processing live range for v%"Pd" "
                           "starting at %"Pd"\n",
                           range->vreg(),
                           start));
@@ -2134,12 +2292,13 @@
 void FlowGraphAllocator::ConnectSplitSiblings(LiveRange* parent,
                                               BlockEntryInstr* source_block,
                                               BlockEntryInstr* target_block) {
-  TRACE_ALLOC(OS::Print("Connect source_block=%"Pd", target_block=%"Pd"\n",
+  TRACE_ALLOC(OS::Print("Connect v%"Pd" on the edge B%"Pd" -> B%"Pd"\n",
+                        parent->vreg(),
                         source_block->block_id(),
                         target_block->block_id()));
   if (parent->next_sibling() == NULL) {
     // Nothing to connect. The whole range was allocated to the same location.
-    TRACE_ALLOC(OS::Print("range %"Pd" has no siblings\n", parent->vreg()));
+    TRACE_ALLOC(OS::Print("range v%"Pd" has no siblings\n", parent->vreg()));
     return;
   }
 
@@ -2176,13 +2335,15 @@
     range = range->next_sibling();
   }
 
-  TRACE_ALLOC(OS::Print("connecting [%"Pd", %"Pd") [",
-                        source_cover->Start(), source_cover->End()));
-  TRACE_ALLOC(source.Print());
-  TRACE_ALLOC(OS::Print("] to [%"Pd", %"Pd") [",
-                        target_cover->Start(), target_cover->End()));
-  TRACE_ALLOC(target.Print());
-  TRACE_ALLOC(OS::Print("]\n"));
+  TRACE_ALLOC(OS::Print("connecting v%"Pd" between [%"Pd", %"Pd") {%s} "
+                        "to [%"Pd", %"Pd") {%s}\n",
+                        parent->vreg(),
+                        source_cover->Start(),
+                        source_cover->End(),
+                        source.Name(),
+                        target_cover->Start(),
+                        target_cover->End(),
+                        target.Name()));
 
   // Siblings were allocated to the same register.
   if (source.Equals(target)) return;
diff --git a/runtime/vm/flow_graph_allocator.h b/runtime/vm/flow_graph_allocator.h
index b98fbb3..d88e6e1 100644
--- a/runtime/vm/flow_graph_allocator.h
+++ b/runtime/vm/flow_graph_allocator.h
@@ -17,6 +17,24 @@
 class UseInterval;
 class UsePosition;
 
+
+class ReachingDefs : public ValueObject {
+ public:
+  explicit ReachingDefs(const FlowGraph& flow_graph)
+      : flow_graph_(flow_graph),
+        phis_(10) { }
+
+  BitVector* Get(PhiInstr* phi);
+
+ private:
+  void AddPhi(PhiInstr* phi);
+  void Compute();
+
+  const FlowGraph& flow_graph_;
+  GrowableArray<PhiInstr*> phis_;
+};
+
+
 class FlowGraphAllocator : public ValueObject {
  public:
   // Number of stack slots needed for a double spill slot.
@@ -94,9 +112,12 @@
   // Visit instructions in the postorder and build live ranges for
   // all SSA values.
   void BuildLiveRanges();
-  Instruction* ConnectOutgoingPhiMoves(BlockEntryInstr* block);
+  Instruction* ConnectOutgoingPhiMoves(BlockEntryInstr* block,
+                                       BitVector* interference_set);
   void ProcessEnvironmentUses(BlockEntryInstr* block, Instruction* current);
-  void ProcessOneInstruction(BlockEntryInstr* block, Instruction* instr);
+  void ProcessOneInstruction(BlockEntryInstr* block,
+                             Instruction* instr,
+                             BitVector* interference_set);
   void ConnectIncomingPhiMoves(BlockEntryInstr* block);
   void BlockLocation(Location loc, intptr_t from, intptr_t to);
   void BlockRegisterLocation(Location loc,
@@ -214,6 +235,8 @@
 
   const FlowGraph& flow_graph_;
 
+  ReachingDefs reaching_defs_;
+
   // Set of SSA values that have unboxed mint representation. Indexed
   // by SSA temp index.
   BitVector* mint_values_;
@@ -299,7 +322,10 @@
 class BlockInfo : public ZoneAllocated {
  public:
   explicit BlockInfo(BlockEntryInstr* entry)
-    : entry_(entry), loop_(NULL), is_loop_header_(false) {
+    : entry_(entry),
+      loop_(NULL),
+      is_loop_header_(false),
+      backedge_interference_(NULL) {
   }
 
   BlockEntryInstr* entry() const { return entry_; }
@@ -307,6 +333,17 @@
   // Returns true is this node is a header of a structural loop.
   bool is_loop_header() const { return is_loop_header_; }
 
+  // Returns header of the innermost loop containing this block.
+  BlockInfo* loop_header() {
+    if (is_loop_header()) {
+      return this;
+    } else if (loop() != NULL) {
+      return loop();
+    } else {
+      return NULL;
+    }
+  }
+
   // Innermost reducible loop containing this node. Loop headers point to
   // outer loop not to themselves.
   BlockInfo* loop() const { return loop_; }
@@ -326,6 +363,14 @@
   intptr_t loop_id() const { return loop_id_; }
   void set_loop_id(intptr_t loop_id) { loop_id_ = loop_id; }
 
+  BitVector* backedge_interference() const {
+    return backedge_interference_;
+  }
+
+  void set_backedge_interference(BitVector* backedge_interference) {
+    backedge_interference_ = backedge_interference;
+  }
+
  private:
   BlockEntryInstr* entry_;
   BlockInfo* loop_;
@@ -334,6 +379,8 @@
   BlockEntryInstr* last_block_;
   intptr_t loop_id_;
 
+  BitVector* backedge_interference_;
+
   DISALLOW_COPY_AND_ASSIGN(BlockInfo);
 };
 
diff --git a/runtime/vm/flow_graph_builder.cc b/runtime/vm/flow_graph_builder.cc
index 96d4cb8..c9d67eb 100644
--- a/runtime/vm/flow_graph_builder.cc
+++ b/runtime/vm/flow_graph_builder.cc
@@ -1763,7 +1763,7 @@
   }
 
   if (node->constructor().IsFactory()) {
-    if ((function_class.Name() == Symbols::ListImplementation()) &&
+    if ((function_class.Name() == Symbols::List()) &&
         (function.name() == Symbols::ListFactory())) {
       // If there are no arguments then the result is guaranteed to be a
       // GrowableObjectArray. However if there is an argument the result
diff --git a/runtime/vm/flow_graph_compiler.cc b/runtime/vm/flow_graph_compiler.cc
index 879799f..02d94fc 100644
--- a/runtime/vm/flow_graph_compiler.cc
+++ b/runtime/vm/flow_graph_compiler.cc
@@ -144,6 +144,8 @@
           is_optimizing ? new StackmapTableBuilder() : NULL),
       block_info_(block_order_.length()),
       deopt_infos_(),
+      static_calls_target_table_(GrowableObjectArray::ZoneHandle(
+          GrowableObjectArray::New())),
       is_optimizing_(is_optimizing),
       may_reoptimize_(false),
       bool_true_(Bool::ZoneHandle(Bool::True())),
@@ -282,6 +284,18 @@
 }
 
 
+void FlowGraphCompiler::AddStaticCallTarget(const Function& func) {
+  ASSERT(Code::kSCallTableEntryLength == 3);
+  ASSERT(Code::kSCallTableOffsetEntry == 0);
+  static_calls_target_table_.Add(
+      Smi::Handle(Smi::New(assembler()->CodeSize())));
+  ASSERT(Code::kSCallTableFunctionEntry == 1);
+  static_calls_target_table_.Add(func);
+  ASSERT(Code::kSCallTableCodeEntry == 2);
+  static_calls_target_table_.Add(Code::Handle());
+}
+
+
 void FlowGraphCompiler::AddDeoptIndexAtCall(intptr_t deopt_id,
                                             intptr_t token_pos) {
   ASSERT(is_optimizing());
@@ -396,6 +410,7 @@
   code.set_deopt_info_array(array);
   const Array& object_array =
       Array::Handle(Array::MakeArray(builder.object_table()));
+  ASSERT(code.object_table() == Array::null());
   code.set_object_table(object_array);
 }
 
@@ -426,6 +441,13 @@
 }
 
 
+void FlowGraphCompiler::FinalizeStaticCallTargetsTable(const Code& code) {
+  ASSERT(code.static_calls_target_table() == Array::null());
+  code.set_static_calls_target_table(
+      Array::Handle(Array::MakeArray(static_calls_target_table_)));
+}
+
+
 // Returns 'true' if code generation for this function is complete, i.e.,
 // no fall-through to regular code is needed.
 bool FlowGraphCompiler::TryIntrinsify() {
diff --git a/runtime/vm/flow_graph_compiler_ia32.cc b/runtime/vm/flow_graph_compiler_ia32.cc
index 3a78f8c..f0236df 100644
--- a/runtime/vm/flow_graph_compiler_ia32.cc
+++ b/runtime/vm/flow_graph_compiler_ia32.cc
@@ -158,7 +158,7 @@
       __ cmpl(kClassIdReg, Immediate(type_class.id()));
       __ j(EQUAL, is_instance_lbl);
     }
-    if (type_class.raw() == Isolate::Current()->object_store()->list_class()) {
+    if (type_class.IsListClass()) {
       GenerateListTypeCheck(kClassIdReg, is_instance_lbl);
     }
     return GenerateSubtype1TestCacheLookup(
@@ -1092,7 +1092,6 @@
                                        intptr_t deopt_id,
                                        intptr_t token_pos,
                                        LocationSummary* locs) {
-  __ LoadObject(ECX, function);
   __ LoadObject(EDX, arguments_descriptor);
   // Do not use the code from the function, but let the code be patched so that
   // we can record the outgoing edges to other code.
@@ -1101,6 +1100,7 @@
                    &StubCode::CallStaticFunctionLabel(),
                    PcDescriptors::kFuncCall,
                    locs);
+  AddStaticCallTarget(function);
   __ Drop(argument_count);
 }
 
diff --git a/runtime/vm/flow_graph_compiler_ia32.h b/runtime/vm/flow_graph_compiler_ia32.h
index f949317..201b964 100644
--- a/runtime/vm/flow_graph_compiler_ia32.h
+++ b/runtime/vm/flow_graph_compiler_ia32.h
@@ -192,6 +192,7 @@
   void FinalizeStackmaps(const Code& code);
   void FinalizeVarDescriptors(const Code& code);
   void FinalizeComments(const Code& code);
+  void FinalizeStaticCallTargetsTable(const Code& code);
 
   const Bool& bool_true() const { return bool_true_; }
   const Bool& bool_false() const { return bool_false_; }
@@ -227,6 +228,8 @@
                                                 Register index);
 
  private:
+  void AddStaticCallTarget(const Function& function);
+
   void GenerateDeferredCode();
 
   void EmitInstructionPrologue(Instruction* instr);
@@ -320,6 +323,8 @@
   GrowableArray<BlockInfo*> block_info_;
   GrowableArray<CompilerDeoptInfo*> deopt_infos_;
   GrowableArray<SlowPathCode*> slow_path_code_;
+  // Stores: [code offset, function, null(code)].
+  const GrowableObjectArray& static_calls_target_table_;
   const bool is_optimizing_;
   // Set to true if optimized code has IC calls.
   bool may_reoptimize_;
diff --git a/runtime/vm/flow_graph_compiler_x64.cc b/runtime/vm/flow_graph_compiler_x64.cc
index eee2c68..a407051 100644
--- a/runtime/vm/flow_graph_compiler_x64.cc
+++ b/runtime/vm/flow_graph_compiler_x64.cc
@@ -158,7 +158,7 @@
       __ cmpl(kClassIdReg, Immediate(type_class.id()));
       __ j(EQUAL, is_instance_lbl);
     }
-    if (type_class.raw() == Isolate::Current()->object_store()->list_class()) {
+    if (type_class.IsListClass()) {
       GenerateListTypeCheck(kClassIdReg, is_instance_lbl);
     }
     return GenerateSubtype1TestCacheLookup(
@@ -1096,7 +1096,6 @@
                                        intptr_t deopt_id,
                                        intptr_t token_pos,
                                        LocationSummary* locs) {
-  __ LoadObject(RBX, function);
   __ LoadObject(R10, arguments_descriptor);
   // Do not use the code from the function, but let the code be patched so that
   // we can record the outgoing edges to other code.
@@ -1105,6 +1104,7 @@
                    &StubCode::CallStaticFunctionLabel(),
                    PcDescriptors::kFuncCall,
                    locs);
+  AddStaticCallTarget(function);
   __ Drop(argument_count);
 }
 
diff --git a/runtime/vm/flow_graph_compiler_x64.h b/runtime/vm/flow_graph_compiler_x64.h
index 146d9eb..3f74bc8 100644
--- a/runtime/vm/flow_graph_compiler_x64.h
+++ b/runtime/vm/flow_graph_compiler_x64.h
@@ -192,6 +192,7 @@
   void FinalizeStackmaps(const Code& code);
   void FinalizeVarDescriptors(const Code& code);
   void FinalizeComments(const Code& code);
+  void FinalizeStaticCallTargetsTable(const Code& code);
 
   const Bool& bool_true() const { return bool_true_; }
   const Bool& bool_false() const { return bool_false_; }
@@ -227,6 +228,8 @@
                                                 Register index);
 
  private:
+  void AddStaticCallTarget(const Function& function);
+
   void GenerateDeferredCode();
 
   void EmitInstructionPrologue(Instruction* instr);
@@ -320,6 +323,8 @@
   GrowableArray<BlockInfo*> block_info_;
   GrowableArray<CompilerDeoptInfo*> deopt_infos_;
   GrowableArray<SlowPathCode*> slow_path_code_;
+  // Stores: [code offset, function, null(code)].
+  const GrowableObjectArray& static_calls_target_table_;
   const bool is_optimizing_;
   // Set to true if optimized code has IC calls.
   bool may_reoptimize_;
diff --git a/runtime/vm/flow_graph_optimizer.cc b/runtime/vm/flow_graph_optimizer.cc
index 6172ca5..2321f54 100644
--- a/runtime/vm/flow_graph_optimizer.cc
+++ b/runtime/vm/flow_graph_optimizer.cc
@@ -1107,6 +1107,43 @@
 }
 
 
+StringCharCodeAtInstr* FlowGraphOptimizer::BuildStringCharCodeAt(
+    InstanceCallInstr* call,
+    intptr_t cid) {
+  Value* str = call->ArgumentAt(0)->value();
+  Value* index = call->ArgumentAt(1)->value();
+  AddCheckClass(call, str->Copy());
+  InsertBefore(call,
+               new CheckSmiInstr(index->Copy(), call->deopt_id()),
+               call->env(),
+               Definition::kEffect);
+  // If both index and string are constants, then do a compile-time check.
+  // TODO(srdjan): Remove once constant propagation handles bounds checks.
+  bool skip_check = false;
+  if (str->BindsToConstant() && index->BindsToConstant()) {
+    ConstantInstr* string_def = str->definition()->AsConstant();
+    const String& constant_string =
+        String::Cast(string_def->value());
+    ConstantInstr* index_def = index->definition()->AsConstant();
+    if (index_def->value().IsSmi()) {
+      intptr_t constant_index = Smi::Cast(index_def->value()).Value();
+      skip_check = (constant_index < constant_string.Length());
+    }
+  }
+  if (!skip_check) {
+    // Insert bounds check.
+    InsertBefore(call,
+                 new CheckArrayBoundInstr(str->Copy(),
+                                          index->Copy(),
+                                          cid,
+                                          call),
+                 call->env(),
+                 Definition::kEffect);
+  }
+  return new StringCharCodeAtInstr(str, index, cid);
+}
+
+
 // Inline only simple, frequently called core library methods.
 bool FlowGraphOptimizer::TryInlineInstanceMethod(InstanceCallInstr* call) {
   ASSERT(call->HasICData());
@@ -1124,42 +1161,24 @@
       (ic_data.NumberOfChecks() == 1) &&
       ((class_ids[0] == kOneByteStringCid) ||
        (class_ids[0] == kTwoByteStringCid))) {
-    Value* str= call->ArgumentAt(0)->value();
-    Value* index = call->ArgumentAt(1)->value();
-    AddCheckClass(call, str->Copy());
-    InsertBefore(call,
-                 new CheckSmiInstr(index->Copy(), call->deopt_id()),
-                 call->env(),
-                 Definition::kEffect);
-    // If both index and string are constants, then do a compile-time check.
-    // TODO(srdjan): Remove once constant propagation handles bounds checks.
-    bool skip_check = false;
-    if (str->BindsToConstant() && index->BindsToConstant()) {
-      ConstantInstr* string_def = str->definition()->AsConstant();
-      const String& constant_string =
-          String::Cast(string_def->value());
-      ConstantInstr* index_def = index->definition()->AsConstant();
-      if (index_def->value().IsSmi()) {
-        intptr_t constant_index = Smi::Cast(index_def->value()).Value();
-        skip_check = (constant_index < constant_string.Length());
-      }
-    }
-    if (!skip_check) {
-      // Insert bounds check.
-      InsertBefore(call,
-                   new CheckArrayBoundInstr(str->Copy(),
-                                            index->Copy(),
-                                            class_ids[0],
-                                            call),
-                   call->env(),
-                   Definition::kEffect);
-    }
-    StringCharCodeAtInstr* instr =
-        new StringCharCodeAtInstr(str, index, class_ids[0]);
+    StringCharCodeAtInstr* instr = BuildStringCharCodeAt(call, class_ids[0]);
     call->ReplaceWith(instr, current_iterator());
     RemovePushArguments(call);
     return true;
   }
+  if ((recognized_kind == MethodRecognizer::kStringBaseCharAt) &&
+      (ic_data.NumberOfChecks() == 1) &&
+      (class_ids[0] == kOneByteStringCid)) {
+    // TODO(fschneider): Handle TwoByteString.
+    StringCharCodeAtInstr* load_char_code =
+        BuildStringCharCodeAt(call, class_ids[0]);
+    InsertBefore(call, load_char_code, NULL, Definition::kValue);
+    StringFromCharCodeInstr* char_at =
+        new StringFromCharCodeInstr(new Value(load_char_code));
+    call->ReplaceWith(char_at, current_iterator());
+    RemovePushArguments(call);
+    return true;
+  }
 
   if ((recognized_kind == MethodRecognizer::kIntegerToDouble) &&
       (class_ids[0] == kSmiCid)) {
@@ -3302,6 +3321,12 @@
 }
 
 
+void ConstantPropagator::VisitStringFromCharCode(
+    StringFromCharCodeInstr* instr) {
+  SetValue(instr, non_constant_);
+}
+
+
 void ConstantPropagator::VisitLoadIndexed(LoadIndexedInstr* instr) {
   SetValue(instr, non_constant_);
 }
diff --git a/runtime/vm/flow_graph_optimizer.h b/runtime/vm/flow_graph_optimizer.h
index 047dd0c..3c81b4a 100644
--- a/runtime/vm/flow_graph_optimizer.h
+++ b/runtime/vm/flow_graph_optimizer.h
@@ -68,6 +68,9 @@
 
   bool TryInlineInstanceMethod(InstanceCallInstr* call);
 
+  StringCharCodeAtInstr* BuildStringCharCodeAt(InstanceCallInstr* call,
+                                               intptr_t cid);
+
   void AddCheckClass(InstanceCallInstr* call, Value* value);
 
   void InsertAfter(Instruction* prev,
diff --git a/runtime/vm/intermediate_language.cc b/runtime/vm/intermediate_language.cc
index 21d220d..70a1ee8 100644
--- a/runtime/vm/intermediate_language.cc
+++ b/runtime/vm/intermediate_language.cc
@@ -241,9 +241,10 @@
   const String& function_name = String::Handle(function.name());
   const String& class_name = String::Handle(function_class.Name());
 
-#define RECOGNIZE_FUNCTION(test_class_name, test_function_name, enum_name)     \
+#define RECOGNIZE_FUNCTION(test_class_name, test_function_name, enum_name, fp) \
   if (CompareNames(lib, #test_function_name, function_name) &&                 \
       CompareNames(lib, #test_class_name, class_name)) {                       \
+    ASSERT(function.CheckSourceFingerprint(fp));                               \
     return k##enum_name;                                                       \
   }
 RECOGNIZED_LIST(RECOGNIZE_FUNCTION)
@@ -253,7 +254,7 @@
 
 
 const char* MethodRecognizer::KindToCString(Kind kind) {
-#define KIND_TO_STRING(class_name, function_name, enum_name)                   \
+#define KIND_TO_STRING(class_name, function_name, enum_name, fp)               \
   if (kind == k##enum_name) return #enum_name;
 RECOGNIZED_LIST(KIND_TO_STRING)
 #undef KIND_TO_STRING
@@ -1128,6 +1129,16 @@
 }
 
 
+RawAbstractType* StringFromCharCodeInstr::CompileType() const {
+  return Type::StringType();
+}
+
+
+intptr_t StringFromCharCodeInstr::ResultCid() const {
+  return kDynamicCid;
+}
+
+
 RawAbstractType* LoadIndexedInstr::CompileType() const {
   switch (class_id_) {
     case kArrayCid:
@@ -2657,6 +2668,7 @@
   }
 }
 
+
 #undef __
 
 }  // namespace dart
diff --git a/runtime/vm/intermediate_language.h b/runtime/vm/intermediate_language.h
index 23af66f..59ba34e 100644
--- a/runtime/vm/intermediate_language.h
+++ b/runtime/vm/intermediate_language.h
@@ -29,18 +29,21 @@
 
 
 // TODO(srdjan): Add _ByteArrayBase, get:length.
-
+// TODO(srdjan): Unify with INTRINSIC_LIST.
+// (class-name, function-name, recognized enum, fingerprint).
+// See intrinsifier for fingerprint computation.
 #define RECOGNIZED_LIST(V)                                                     \
-  V(_ObjectArray, get:length, ObjectArrayLength)                               \
-  V(_ImmutableArray, get:length, ImmutableArrayLength)                         \
-  V(_GrowableObjectArray, get:length, GrowableArrayLength)                     \
-  V(_GrowableObjectArray, get:capacity, GrowableArrayCapacity)                 \
-  V(_StringBase, get:length, StringBaseLength)                                 \
-  V(_StringBase, get:isEmpty, StringBaseIsEmpty)                               \
-  V(_StringBase, charCodeAt, StringBaseCharCodeAt)                             \
-  V(_IntegerImplementation, toDouble, IntegerToDouble)                         \
-  V(_Double, toInt, DoubleToInteger)                                           \
-  V(::, sqrt, MathSqrt)                                                        \
+  V(_ObjectArray, get:length, ObjectArrayLength, 405297088)                    \
+  V(_ImmutableArray, get:length, ImmutableArrayLength, 433698233)              \
+  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, charCodeAt, StringBaseCharCodeAt, 984449525)                  \
+  V(_StringBase, [], StringBaseCharAt, 1062366987)                             \
+  V(_IntegerImplementation, toDouble, IntegerToDouble, 1396338041)             \
+  V(_Double, toInt, DoubleToInteger, 362666636)                                \
+  V(::, sqrt, MathSqrt, 2232519)                                               \
 
 // Class that recognizes the name and owner of a function and returns the
 // corresponding enum. See RECOGNIZED_LIST above for list of recognizable
@@ -49,7 +52,7 @@
  public:
   enum Kind {
     kUnknown,
-#define DEFINE_ENUM_LIST(class_name, function_name, enum_name) k##enum_name,
+#define DEFINE_ENUM_LIST(class_name, function_name, enum_name, fp) k##enum_name,
 RECOGNIZED_LIST(DEFINE_ENUM_LIST)
 #undef DEFINE_ENUM_LIST
   };
@@ -264,7 +267,8 @@
   M(UnaryMintOp)                                                               \
   M(CheckArrayBound)                                                           \
   M(Constraint)                                                                \
-  M(StringCharCodeAt)
+  M(StringCharCodeAt)                                                          \
+  M(StringFromCharCode)
 
 
 #define FORWARD_DECLARATION(type) class type##Instr;
@@ -1162,7 +1166,8 @@
     : block_(block),
       inputs_(num_inputs),
       is_alive_(false),
-      representation_(kTagged) {
+      representation_(kTagged),
+      reaching_defs_(NULL) {
     for (intptr_t i = 0; i < num_inputs; ++i) {
       inputs_.Add(NULL);
     }
@@ -1223,6 +1228,14 @@
 
   virtual void InferRange();
 
+  BitVector* reaching_defs() const {
+    return reaching_defs_;
+  }
+
+  void set_reaching_defs(BitVector* reaching_defs) {
+    reaching_defs_ = reaching_defs;
+  }
+
  private:
   friend class ConstantPropagator;  // Direct access to inputs_.
 
@@ -1231,6 +1244,8 @@
   bool is_alive_;
   Representation representation_;
 
+  BitVector* reaching_defs_;
+
   DISALLOW_COPY_AND_ASSIGN(PhiInstr);
 };
 
@@ -2682,6 +2697,36 @@
 };
 
 
+class StringFromCharCodeInstr : public TemplateDefinition<1> {
+ public:
+  explicit StringFromCharCodeInstr(Value* char_code) {
+    ASSERT(char_code != NULL);
+    ASSERT(char_code->definition()->IsStringCharCodeAt() &&
+           (char_code->definition()->AsStringCharCodeAt()->class_id() ==
+            kOneByteStringCid));
+    inputs_[0] = char_code;
+  }
+
+  DECLARE_INSTRUCTION(StringFromCharCode)
+  virtual RawAbstractType* CompileType() const;
+
+  Value* char_code() const { return inputs_[0]; }
+
+  virtual bool CanDeoptimize() const { return false; }
+
+  virtual bool HasSideEffect() const { return false; }
+
+  virtual intptr_t ResultCid() const;
+
+  virtual bool AttributesEqual(Instruction* other) const { return true; }
+
+  virtual bool AffectedBySideEffect() const { return false; }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(StringFromCharCodeInstr);
+};
+
+
 class LoadIndexedInstr : public TemplateDefinition<2> {
  public:
   LoadIndexedInstr(Value* array, Value* index, intptr_t class_id)
diff --git a/runtime/vm/intermediate_language_ia32.cc b/runtime/vm/intermediate_language_ia32.cc
index 74b2a17..fd2c971 100644
--- a/runtime/vm/intermediate_language_ia32.cc
+++ b/runtime/vm/intermediate_language_ia32.cc
@@ -1124,6 +1124,30 @@
 }
 
 
+LocationSummary* StringFromCharCodeInstr::MakeLocationSummary() const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* locs =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  // TODO(fschneider): Allow immediate operands for the char code.
+  locs->set_in(0, Location::RequiresRegister());
+  locs->set_out(Location::RequiresRegister());
+  return locs;
+}
+
+
+void StringFromCharCodeInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  Register char_code = locs()->in(0).reg();
+  Register result = locs()->out().reg();
+  __ movl(result,
+          Immediate(reinterpret_cast<uword>(Symbols::PredefinedAddress())));
+  __ movl(result, Address(result,
+                          char_code,
+                          TIMES_HALF_WORD_SIZE,  // Char code is a smi.
+                          Symbols::kNullCharId * kWordSize));
+}
+
+
 LocationSummary* LoadIndexedInstr::MakeLocationSummary() const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
diff --git a/runtime/vm/intermediate_language_x64.cc b/runtime/vm/intermediate_language_x64.cc
index 32766ac1..6933867 100644
--- a/runtime/vm/intermediate_language_x64.cc
+++ b/runtime/vm/intermediate_language_x64.cc
@@ -992,6 +992,30 @@
 }
 
 
+LocationSummary* StringFromCharCodeInstr::MakeLocationSummary() const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* locs =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  // TODO(fschneider): Allow immediate operands for the char code.
+  locs->set_in(0, Location::RequiresRegister());
+  locs->set_out(Location::RequiresRegister());
+  return locs;
+}
+
+
+void StringFromCharCodeInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  Register char_code = locs()->in(0).reg();
+  Register result = locs()->out().reg();
+  __ movq(result,
+          Immediate(reinterpret_cast<uword>(Symbols::PredefinedAddress())));
+  __ movq(result, Address(result,
+                          char_code,
+                          TIMES_HALF_WORD_SIZE,  // Char code is a smi.
+                          Symbols::kNullCharId * kWordSize));
+}
+
+
 LocationSummary* LoadIndexedInstr::MakeLocationSummary() const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
diff --git a/runtime/vm/intrinsifier.cc b/runtime/vm/intrinsifier.cc
index 59adb5c..9e4188b 100644
--- a/runtime/vm/intrinsifier.cc
+++ b/runtime/vm/intrinsifier.cc
@@ -64,6 +64,8 @@
 bool Intrinsifier::CanIntrinsify(const Function& function) {
   if (!FLAG_intrinsify) return false;
   if (function.IsClosureFunction()) return false;
+  // Can occur because of compile-all flag.
+  if (function.is_external()) return false;
   // Intrinsic kind is set lazily below.
   if (function.intrinsic_kind() == Function::kIsIntrinsic) return true;
   if (function.intrinsic_kind() == Function::kIsNotIntrinsic) return false;
@@ -77,7 +79,7 @@
     return false;
   }
   const char* class_name = String::Handle(function_class.Name()).ToCString();
-#define FIND_INTRINSICS(test_class_name, test_function_name, destination)      \
+#define FIND_INTRINSICS(test_class_name, test_function_name, destination, fp)  \
   if (TestFunction(function,                                                   \
                    class_name, function_name,                                  \
                    #test_class_name, #test_function_name)) {                   \
@@ -91,15 +93,17 @@
   return false;
 }
 
+
 bool Intrinsifier::Intrinsify(const Function& function, Assembler* assembler) {
   if (!CanIntrinsify(function)) return false;
   const char* function_name = String::Handle(function.name()).ToCString();
   const Class& function_class = Class::Handle(function.Owner());
   const char* class_name = String::Handle(function_class.Name()).ToCString();
-#define FIND_INTRINSICS(test_class_name, test_function_name, destination)      \
+#define FIND_INTRINSICS(test_class_name, test_function_name, destination, fp)  \
   if (TestFunction(function,                                                   \
                    class_name, function_name,                                  \
                    #test_class_name, #test_function_name)) {                   \
+    ASSERT(function.CheckSourceFingerprint(fp));                               \
     return destination(assembler);                                             \
   }                                                                            \
 
diff --git a/runtime/vm/intrinsifier.h b/runtime/vm/intrinsifier.h
index d127750..af4f8d4 100644
--- a/runtime/vm/intrinsifier.h
+++ b/runtime/vm/intrinsifier.h
@@ -10,88 +10,97 @@
 
 namespace dart {
 
-// List of intrinsics: (class-name, function-name, intrinsification method).
+// List of intrinsics:
+// (class-name, function-name, intrinsification method, fingerprint).
+//
+// When adding a new function for intrinsification add a 0 as fingerprint,
+// build and run to get the correct fingerprint from the mismatch error.
 #define INTRINSIC_LIST(V)                                                      \
-  V(_IntegerImplementation, _addFromInteger, Integer_addFromInteger)           \
-  V(_IntegerImplementation, +, Integer_add)                                    \
-  V(_IntegerImplementation, _subFromInteger, Integer_subFromInteger)           \
-  V(_IntegerImplementation, -, Integer_sub)                                    \
-  V(_IntegerImplementation, _mulFromInteger, Integer_mulFromInteger)           \
-  V(_IntegerImplementation, *, Integer_mul)                                    \
-  V(_IntegerImplementation, %, Integer_modulo)                                 \
-  V(_IntegerImplementation, ~/, Integer_truncDivide)                           \
-  V(_IntegerImplementation, unary-, Integer_negate)                            \
-  V(_IntegerImplementation, _bitAndFromInteger, Integer_bitAndFromInteger)     \
-  V(_IntegerImplementation, &, Integer_bitAnd)                                 \
-  V(_IntegerImplementation, _bitOrFromInteger, Integer_bitOrFromInteger)       \
-  V(_IntegerImplementation, |, Integer_bitOr)                                  \
-  V(_IntegerImplementation, _bitXorFromInteger, Integer_bitXorFromInteger)     \
-  V(_IntegerImplementation, ^, Integer_bitXor)                                 \
+  V(_IntegerImplementation, _addFromInteger, Integer_addFromInteger, 726019207)\
+  V(_IntegerImplementation, +, Integer_add, 13708438)                          \
+  V(_IntegerImplementation, _subFromInteger, Integer_subFromInteger, 726019207)\
+  V(_IntegerImplementation, -, Integer_sub, 284482664)                         \
+  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, _bitAndFromInteger,                                \
+    Integer_bitAndFromInteger, 726019207)                                      \
+  V(_IntegerImplementation, &, Integer_bitAnd, 1267520437)                     \
+  V(_IntegerImplementation, _bitOrFromInteger,                                 \
+    Integer_bitOrFromInteger, 726019207)                                       \
+  V(_IntegerImplementation, |, Integer_bitOr, 249432836)                       \
+  V(_IntegerImplementation, _bitXorFromInteger,                                \
+    Integer_bitXorFromInteger, 726019207)                                      \
+  V(_IntegerImplementation, ^, Integer_bitXor, 1177061571)                     \
   V(_IntegerImplementation,                                                    \
     _greaterThanFromInteger,                                                   \
-    Integer_greaterThanFromInt)                                                \
-  V(_IntegerImplementation, >, Integer_greaterThan)                            \
-  V(_IntegerImplementation, ==, Integer_equal)                                 \
-  V(_IntegerImplementation, _equalToInteger, Integer_equalToInteger)           \
-  V(_IntegerImplementation, <, Integer_lessThan)                               \
-  V(_IntegerImplementation, <=, Integer_lessEqualThan)                         \
-  V(_IntegerImplementation, >=, Integer_greaterEqualThan)                      \
-  V(_IntegerImplementation, <<, Integer_shl)                                   \
-  V(_IntegerImplementation, >>, Integer_sar)                                   \
-  V(_Smi, ~, Smi_bitNegate)                                                    \
-  V(_Double, >, Double_greaterThan)                                            \
-  V(_Double, >=, Double_greaterEqualThan)                                      \
-  V(_Double, <, Double_lessThan)                                               \
-  V(_Double, <=, Double_lessEqualThan)                                         \
-  V(_Double, ==, Double_equal)                                                 \
-  V(_Double, +, Double_add)                                                    \
-  V(_Double, -, Double_sub)                                                    \
-  V(_Double, *, Double_mul)                                                    \
-  V(_Double, /, Double_div)                                                    \
-  V(_Double, get:isNaN, Double_getIsNaN)                                       \
-  V(_Double, get:isNegative, Double_getIsNegative)                             \
-  V(_Double, _mulFromInteger, Double_mulFromInteger)                           \
-  V(_Double, .fromInteger, Double_fromInteger)                                 \
-  V(_Double, toInt, Double_toInt)                                              \
-  V(_ObjectArray, ., ObjectArray_Allocate)                                     \
-  V(_ObjectArray, get:length, Array_getLength)                                 \
-  V(_ObjectArray, [], Array_getIndexed)                                        \
-  V(_ObjectArray, []=, Array_setIndexed)                                       \
-  V(_GrowableObjectArray, .fromObjectArray, GArray_Allocate)                   \
-  V(_GrowableObjectArray, get:length, GrowableArray_getLength)                 \
-  V(_GrowableObjectArray, get:capacity, GrowableArray_getCapacity)             \
-  V(_GrowableObjectArray, [], GrowableArray_getIndexed)                        \
-  V(_GrowableObjectArray, []=, GrowableArray_setIndexed)                       \
-  V(_GrowableObjectArray, _setLength, GrowableArray_setLength)                 \
-  V(_GrowableObjectArray, _setData, GrowableArray_setData)                     \
-  V(_GrowableObjectArray, add, GrowableArray_add)                              \
-  V(_ImmutableArray, [], ImmutableArray_getIndexed)                            \
-  V(_ImmutableArray, get:length, ImmutableArray_getLength)                     \
-  V(::, sqrt, Math_sqrt)                                                       \
-  V(::, sin, Math_sin)                                                         \
-  V(::, cos, Math_cos)                                                         \
-  V(Object, ==, Object_equal)                                                  \
-  V(_FixedSizeArrayIterator, get:hasNext, FixedSizeArrayIterator_getHasNext)   \
-  V(_FixedSizeArrayIterator, next, FixedSizeArrayIterator_next)                \
-  V(_StringBase, get:hashCode, String_getHashCode)                             \
-  V(_StringBase, get:isEmpty, String_getIsEmpty)                               \
-  V(_StringBase, get:length, String_getLength)                                 \
-  V(_StringBase, charCodeAt, String_charCodeAt)                                \
-  V(_ByteArrayBase, get:length, ByteArrayBase_getLength)                       \
-  V(_Int8Array, [], Int8Array_getIndexed)                                      \
-  V(_Int8Array, []=, Int8Array_setIndexed)                                     \
-  V(_Uint8Array, [], Uint8Array_getIndexed)                                    \
-  V(_Uint8Array, []=, Uint8Array_setIndexed)                                   \
-  V(_Int16Array, [], Int16Array_getIndexed)                                    \
-  V(_Uint16Array, [], Uint16Array_getIndexed)                                  \
-  V(_Int32Array, [], Int32Array_getIndexed)                                    \
-  V(_Uint32Array, [], Uint32Array_getIndexed)                                  \
-  V(_Int64Array, [], Int64Array_getIndexed)                                    \
-  V(_Uint64Array, [], Uint64Array_getIndexed)                                  \
-  V(_Float32Array, [], Float32Array_getIndexed)                                \
-  V(_Float32Array, []=, Float32Array_setIndexed)                               \
-  V(_Float64Array, [], Float64Array_getIndexed)                                \
-  V(_Float64Array, []=, Float64Array_setIndexed)                               \
+    Integer_greaterThanFromInt, 79222670)                                      \
+  V(_IntegerImplementation, >, Integer_greaterThan, 319553701)                 \
+  V(_IntegerImplementation, ==, Integer_equal, 1163202222)                     \
+  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(_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, get:isNaN, Double_getIsNaN, 54462366)                             \
+  V(_Double, get:isNegative, Double_getIsNegative, 54462366)                   \
+  V(_Double, _mulFromInteger, Double_mulFromInteger, 795128)                   \
+  V(_Double, .fromInteger, Double_fromInteger, 842078193)                      \
+  V(_Double, toInt, Double_toInt, 362666636)                                   \
+  V(_ObjectArray, ., ObjectArray_Allocate, 577949617)                          \
+  V(_ObjectArray, get:length, Array_getLength, 405297088)                      \
+  V(_ObjectArray, [], Array_getIndexed, 71937385)                              \
+  V(_ObjectArray, []=, Array_setIndexed, 255863719)                            \
+  V(_GrowableObjectArray, .fromObjectArray, GArray_Allocate, 989879928)        \
+  V(_GrowableObjectArray, get:length, GrowableArray_getLength, 725548050)      \
+  V(_GrowableObjectArray, get:capacity, GrowableArray_getCapacity, 725548050)  \
+  V(_GrowableObjectArray, [], GrowableArray_getIndexed, 581838973)             \
+  V(_GrowableObjectArray, []=, GrowableArray_setIndexed, 1048007636)           \
+  V(_GrowableObjectArray, _setLength, GrowableArray_setLength, 796709584)      \
+  V(_GrowableObjectArray, _setData, GrowableArray_setData, 477312179)          \
+  V(_GrowableObjectArray, add, GrowableArray_add, 1776744235)                  \
+  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(_FixedSizeArrayIterator, get:hasNext,                                      \
+    FixedSizeArrayIterator_getHasNext, 1847855366)                             \
+  V(_FixedSizeArrayIterator, next, FixedSizeArrayIterator_next, 1739352783)    \
+  V(_StringBase, get:hashCode, String_getHashCode, 320803993)                  \
+  V(_StringBase, get:isEmpty, String_getIsEmpty, 1065961093)                   \
+  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(_Int8Array, []=, Int8Array_setIndexed, 1469038436)                         \
+  V(_Uint8Array, [], Uint8Array_getIndexed, 1635923899)                        \
+  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(_Float32Array, []=, Float32Array_setIndexed, 1270729544)                   \
+  V(_Float64Array, [], Float64Array_getIndexed, 1363897161)                    \
+  V(_Float64Array, []=, Float64Array_setIndexed, 283625119)                    \
+  V(_ExternalUint8Array, [], ExternalUint8Array_getIndexed, 632699940)         \
 
 // Forward declarations.
 class Assembler;
@@ -106,7 +115,7 @@
   static bool CanIntrinsify(const Function& function);
 
  private:
-#define DECLARE_FUNCTION(test_class_name, test_function_name, destination)    \
+#define DECLARE_FUNCTION(test_class_name, test_function_name, destination, fp) \
   static bool destination(Assembler* assembler);
 
 INTRINSIC_LIST(DECLARE_FUNCTION)
diff --git a/runtime/vm/intrinsifier_ia32.cc b/runtime/vm/intrinsifier_ia32.cc
index cf47309..5675214 100644
--- a/runtime/vm/intrinsifier_ia32.cc
+++ b/runtime/vm/intrinsifier_ia32.cc
@@ -538,22 +538,19 @@
   // * EBX has the index into the array.
   // EBX contains the SMI index which is shifted by 1.
   __ SmiUntag(EBX);
-  // Move EBX into EDI.
+  // Free EBX for the value since we want a byte register.
   __ movl(EDI, EBX);
-  // Load the value into EBX.
   __ movl(EBX, Address(ESP, + 1 * kWordSize));  // Value.
-  // If EBX is not an Smi, jump to fall through.
   __ testl(EBX, Immediate(kSmiTagMask));
   __ j(NOT_ZERO, &fall_through, Assembler::kNearJump);
   __ SmiUntag(EBX);
-  // Add 128 to EBX to bring it into 0..FF.
+  // Check that the value is a byte. Add 128 to EBX to bring it into
+  // the range 0..FF.
   __ addl(EBX, Immediate(128));
   __ cmpl(EBX, Immediate(0xFF));
-  // If EBX is too large an Int8, jump to fall through.
   __ j(ABOVE, &fall_through, Assembler::kNearJump);
-  // Remove addition.
+  // Undo addition.
   __ subl(EBX, Immediate(128));
-  // Store BL into array EAX[EDI] = BL.
   __ movb(FieldAddress(EAX, EDI, TIMES_1, Int8Array::data_offset()), BL);
   __ ret();
   __ Bind(&fall_through);
@@ -585,18 +582,15 @@
   // * EBX has the index into the array.
   // EBX contains the SMI index which is shifted by 1.
   __ SmiUntag(EBX);
-  // Move EBX into EDI.
+  // Free EBX for the value since we want a byte register.
   __ movl(EDI, EBX);
-  // Load the value into EBX.
   __ movl(EBX, Address(ESP, + 1 * kWordSize));  // Value.
-  // If EBX is not an Smi, jump to fall through.
   __ testl(EBX, Immediate(kSmiTagMask));
   __ j(NOT_ZERO, &fall_through, Assembler::kNearJump);
   __ SmiUntag(EBX);
-  // If EBX is too large an Uint8, jump to fall through.
+  // Check that the value is a byte.
   __ cmpl(EBX, Immediate(0xFF));
   __ j(ABOVE, &fall_through, Assembler::kNearJump);
-  // Store BL into array EAX[EDI] = BL.
   __ movb(FieldAddress(EAX, EDI, TIMES_1, Uint8Array::data_offset()), BL);
   __ ret();
   __ Bind(&fall_through);
@@ -792,6 +786,20 @@
 }
 
 
+bool Intrinsifier::ExternalUint8Array_getIndexed(Assembler* assembler) {
+  Label fall_through;
+  TestByteArrayIndex(assembler, &fall_through);
+  __ SmiUntag(EBX);
+  __ movl(EAX, FieldAddress(EAX, ExternalUint8Array::external_data_offset()));
+  __ movl(EAX, Address(EAX, ExternalByteArrayData<uint8_t>::data_offset()));
+  __ movzxb(EAX, Address(EAX, EBX, TIMES_1, 0));
+  __ SmiTag(EAX);
+  __ ret();
+  __ Bind(&fall_through);
+  return false;
+}
+
+
 // Tests if two top most arguments are smis, jumps to label not_smi if not.
 // Topmost argument is in EAX.
 static void TestBothArgumentsSmis(Assembler* assembler, Label* not_smi) {
diff --git a/runtime/vm/intrinsifier_x64.cc b/runtime/vm/intrinsifier_x64.cc
index 5f3f96d..8d52b6a 100644
--- a/runtime/vm/intrinsifier_x64.cc
+++ b/runtime/vm/intrinsifier_x64.cc
@@ -471,6 +471,26 @@
 
 bool Intrinsifier::Int8Array_setIndexed(Assembler* assembler) {
   Label fall_through;
+  // Verify that the array index is valid.
+  TestByteArraySetIndex(assembler, &fall_through);
+  // After TestByteArraySetIndex:
+  // * RAX has the base address of the byte array.
+  // * R12 has the index into the array.
+  // R12 contains the SMI index which is shifted by 1.
+  __ SmiUntag(R12);
+  __ movq(RDI, Address(RSP, + 1 * kWordSize));  // Value.
+  __ testq(RDI, Immediate(kSmiTagMask));
+  __ j(NOT_ZERO, &fall_through, Assembler::kNearJump);
+  __ SmiUntag(RDI);
+  // Check that the value is a byte. Add 128 to the value to bring it into
+  // the range 0..FF.
+  __ addq(RDI, Immediate(128));
+  __ cmpq(RDI, Immediate(0xFF));
+  __ j(ABOVE, &fall_through, Assembler::kNearJump);
+  // Undo addition.
+  __ subq(RDI, Immediate(128));
+  __ movb(FieldAddress(RAX, R12, TIMES_1, Uint8Array::data_offset()), RDI);
+  __ ret();
   __ Bind(&fall_through);
   return false;
 }
@@ -478,6 +498,22 @@
 
 bool Intrinsifier::Uint8Array_setIndexed(Assembler* assembler) {
   Label fall_through;
+  // Verify that the array index is valid.
+  TestByteArraySetIndex(assembler, &fall_through);
+  // After TestByteArraySetIndex:
+  // * RAX has the base address of the byte array.
+  // * R12 has the index into the array.
+  // R12 contains the SMI index which is shifted by 1.
+  __ SmiUntag(R12);
+  __ movq(RDI, Address(RSP, + 1 * kWordSize));  // Value.
+  __ testq(RDI, Immediate(kSmiTagMask));
+  __ j(NOT_ZERO, &fall_through, Assembler::kNearJump);
+  __ SmiUntag(RDI);
+  // Check that value is a byte.
+  __ cmpq(RDI, Immediate(0xFF));
+  __ j(ABOVE, &fall_through, Assembler::kNearJump);
+  __ movb(FieldAddress(RAX, R12, TIMES_1, Uint8Array::data_offset()), RDI);
+  __ ret();
   __ Bind(&fall_through);
   return false;
 }
@@ -700,6 +736,20 @@
 }
 
 
+bool Intrinsifier::ExternalUint8Array_getIndexed(Assembler* assembler) {
+  Label fall_through;
+  TestByteArrayIndex(assembler, &fall_through);
+  __ SmiUntag(R12);
+  __ movq(RAX, FieldAddress(RAX, ExternalUint8Array::external_data_offset()));
+  __ movq(RAX, Address(RAX, ExternalByteArrayData<uint8_t>::data_offset()));
+  __ movzxb(RAX, Address(RAX, R12, TIMES_1, 0));
+  __ SmiTag(RAX);
+  __ ret();
+  __ Bind(&fall_through);
+  return false;
+}
+
+
 // Tests if two top most arguments are smis, jumps to label not_smi if not.
 // Topmost argument is in RAX.
 static void TestBothArgumentsSmis(Assembler* assembler, Label* not_smi) {
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index af8f5e3..6b9178d 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -17,7 +17,6 @@
 #include "vm/object_store.h"
 #include "vm/parser.h"
 #include "vm/port.h"
-#include "vm/random.h"
 #include "vm/stack_frame.h"
 #include "vm/stub_code.h"
 #include "vm/symbols.h"
@@ -150,7 +149,6 @@
       heap_(NULL),
       object_store_(NULL),
       top_context_(Context::null()),
-      random_seed_(Random::kDefaultRandomSeed),
       top_exit_frame_info_(0),
       init_callback_data_(NULL),
       library_tag_handler_(NULL),
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index 76afa3e..5849640 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -145,9 +145,6 @@
     return OFFSET_OF(Isolate, top_context_);
   }
 
-  int32_t random_seed() const { return random_seed_; }
-  void set_random_seed(int32_t value) { random_seed_ = value; }
-
   uword top_exit_frame_info() const { return top_exit_frame_info_; }
   void set_top_exit_frame_info(uword value) { top_exit_frame_info_ = value; }
   static intptr_t top_exit_frame_info_offset() {
@@ -326,7 +323,6 @@
   Heap* heap_;
   ObjectStore* object_store_;
   RawContext* top_context_;
-  int32_t random_seed_;
   uword top_exit_frame_info_;
   void* init_callback_data_;
   Dart_LibraryTagHandler library_tag_handler_;
diff --git a/runtime/vm/isolate_test.cc b/runtime/vm/isolate_test.cc
index 2aadf6d..9812840 100644
--- a/runtime/vm/isolate_test.cc
+++ b/runtime/vm/isolate_test.cc
@@ -23,7 +23,7 @@
 // callback has been set by the embedder when an isolate is spawned.
 TEST_CASE(IsolateSpawn) {
   const char* kScriptChars =
-      "#import('dart:isolate');\n"
+      "import 'dart:isolate';\n"
       "void entry() {}\n"
       "int testMain() {\n"
       "  try {\n"
diff --git a/runtime/vm/locations.h b/runtime/vm/locations.h
index 4522b1a..0c2bc09 100644
--- a/runtime/vm/locations.h
+++ b/runtime/vm/locations.h
@@ -277,6 +277,12 @@
     return value_ == other.value_;
   }
 
+  // If current location is constant might return something that
+  // is not equal to any Kind.
+  Kind kind() const {
+    return KindField::decode(value_);
+  }
+
  private:
   explicit Location(uword value) : value_(value) { }
 
@@ -287,12 +293,6 @@
     return PayloadField::decode(value_);
   }
 
-  // If current location is constant might return something that
-  // is not equal to any Kind.
-  Kind kind() const {
-    return KindField::decode(value_);
-  }
-
   typedef BitField<Kind, 0, kBitsForKind> KindField;
   typedef BitField<uword, kBitsForKind, kBitsForPayload> PayloadField;
 
diff --git a/runtime/vm/native_entry_test.cc b/runtime/vm/native_entry_test.cc
index 6f945b4..8c58b66 100644
--- a/runtime/vm/native_entry_test.cc
+++ b/runtime/vm/native_entry_test.cc
@@ -58,14 +58,15 @@
 // Test code patching.
 void TestStaticCallPatching(Dart_NativeArguments args) {
   Dart_EnterScope();
-  uword target_address = 0;
-  Function& target_function = Function::Handle();
   DartFrameIterator iterator;
   iterator.NextFrame();  // Skip native call.
   StackFrame* static_caller_frame = iterator.NextFrame();
-  CodePatcher::GetStaticCallAt(static_caller_frame->pc(),
-                               &target_function,
-                               &target_address);
+  uword target_address =
+      CodePatcher::GetStaticCallTargetAt(static_caller_frame->pc());
+  const Code& code = Code::Handle(static_caller_frame->LookupDartCode());
+  const Function& target_function =
+      Function::Handle(code.GetStaticCallTargetFunctionAt(
+          static_caller_frame->pc()));
   EXPECT(String::Handle(target_function.name()).
       Equals(String::Handle(String::New("NativePatchStaticCall"))));
   const uword function_entry_address =
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 5dc09dd..6867359 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -408,6 +408,8 @@
   isolate->object_store()->set_array_class(cls);
   cls = Class::NewStringClass(kOneByteStringCid);
   isolate->object_store()->set_one_byte_string_class(cls);
+  cls = Class::NewStringClass(kTwoByteStringCid);
+  isolate->object_store()->set_two_byte_string_class(cls);
 
   // Allocate and initialize the empty_array instance.
   {
@@ -516,17 +518,6 @@
 }
 
 
-RawClass* Object::CreateAndRegisterInterface(const char* cname,
-                                             const Script& script,
-                                             const Library& lib) {
-  const String& name = String::Handle(Symbols::New(cname));
-  const Class& cls = Class::Handle(
-      Class::NewInterface(name, script, Scanner::kDummyTokenIndex));
-  lib.AddClass(cls);
-  return cls.raw();
-}
-
-
 void Object::RegisterClass(const Class& cls,
                            const String& name,
                            const Library& lib) {
@@ -590,6 +581,10 @@
   cls = Class::NewStringClass(kOneByteStringCid);
   object_store->set_one_byte_string_class(cls);
 
+  // Pre-allocate the TwoByteString class needed by the symbol table.
+  cls = Class::NewStringClass(kTwoByteStringCid);
+  object_store->set_two_byte_string_class(cls);
+
   // Setup the symbol table for the symbols created in the isolate.
   Symbols::SetupSymbolTable(isolate);
 
@@ -650,8 +645,7 @@
   RegisterPrivateClass(cls, name, core_lib);
   pending_classes.Add(cls, Heap::kOld);
 
-  cls = Class::NewStringClass(kTwoByteStringCid);
-  object_store->set_two_byte_string_class(cls);
+  cls = object_store->two_byte_string_class();  // Was allocated above.
   name = Symbols::TwoByteString();
   RegisterPrivateClass(cls, name, core_lib);
   pending_classes.Add(cls, Heap::kOld);
@@ -886,7 +880,9 @@
   type = Type::NewNonParameterizedType(cls);
   object_store->set_string_type(type);
 
-  cls = CreateAndRegisterInterface("List", script, core_lib);
+  name = Symbols::New("List");
+  cls = Class::New<Instance>(name, script, Scanner::kDummyTokenIndex);
+  RegisterClass(cls, name, core_lib);
   pending_classes.Add(cls, Heap::kOld);
   object_store->set_list_class(cls);
 
@@ -2038,6 +2034,11 @@
 }
 
 
+bool Class::IsListClass() const {
+  return raw() == Isolate::Current()->object_store()->list_class();
+}
+
+
 bool Class::IsCanonicalSignatureClass() const {
   const Function& function = Function::Handle(signature_function());
   return (!function.IsNull() && (function.signature_class() == raw()));
@@ -2476,7 +2477,12 @@
 
 
 const char* UnresolvedClass::ToCString() const {
-  return "UnresolvedClass";
+  const char* format = "unresolved class '%s'";
+  const char* cname =  String::Handle(Name()).ToCString();
+  intptr_t len = OS::SNPrint(NULL, 0, format, cname) + 1;
+  char* chars = Isolate::Current()->current_zone()->Alloc<char>(len);
+  OS::SNPrint(chars, len, format, cname);
+  return chars;
 }
 
 
@@ -4180,6 +4186,45 @@
 }
 
 
+// Construct fingerprint from token stream. The token stream contains also
+// arguments.
+int32_t Function::SourceFingerprint() const {
+  uint32_t result = String::Handle(Signature()).Hash();
+  TokenStream::Iterator tokens_iterator(TokenStream::Handle(
+      Script::Handle(script()).tokens()), token_pos());
+  Object& obj = Object::Handle();
+  String& literal = String::Handle();
+  while (tokens_iterator.CurrentPosition() < end_token_pos()) {
+    uint32_t val = 0;
+    obj = tokens_iterator.CurrentToken();
+    if (obj.IsSmi()) {
+      val = Smi::Cast(obj).Value();
+    } else {
+      literal = tokens_iterator.MakeLiteralToken(obj);
+      val = literal.Hash();
+    }
+    result = 31 * result + val;
+    tokens_iterator.Advance();
+  }
+  result = result & ((static_cast<uint32_t>(1) << 31) - 1);
+  ASSERT(result <= static_cast<uint32_t>(kMaxInt32));
+  return result;
+}
+
+
+bool Function::CheckSourceFingerprint(intptr_t fp) const {
+  if (SourceFingerprint() != fp) {
+    OS::Print("FP mismatch while recogbnizing method %s:"
+      " expecting %"Pd" found %d\n",
+      ToFullyQualifiedCString(),
+      fp,
+      SourceFingerprint());
+    return false;
+  }
+  return true;
+}
+
+
 const char* Function::ToCString() const {
   const char* static_str = is_static() ? " static" : "";
   const char* abstract_str = is_abstract() ? " abstract" : "";
@@ -7002,8 +7047,41 @@
 }
 
 
-void Code::set_resolved_static_calls(const GrowableObjectArray& val) const {
-  StorePointer(&raw_ptr()->resolved_static_calls_, val.raw());
+void Code::set_static_calls_target_table(const Array& value) const {
+  StorePointer(&raw_ptr()->static_calls_target_table_, value.raw());
+}
+
+
+RawFunction* Code::GetStaticCallTargetFunctionAt(uword pc) const {
+  RawObject* raw_code_offset =
+      reinterpret_cast<RawObject*>(Smi::New(pc - EntryPoint()));
+  const Array& array =
+      Array::Handle(raw_ptr()->static_calls_target_table_);
+  for (intptr_t i = 0; i < array.Length(); i += kSCallTableEntryLength) {
+    if (array.At(i) == raw_code_offset) {
+      Function& function = Function::Handle();
+      function ^= array.At(i + kSCallTableFunctionEntry);
+      return function.raw();
+    }
+  }
+  return Function::null();
+}
+
+
+void Code::SetStaticCallTargetCodeAt(uword pc, const Code& code) const {
+  RawObject* raw_code_offset =
+      reinterpret_cast<RawObject*>(Smi::New(pc - EntryPoint()));
+  const Array& array =
+      Array::Handle(raw_ptr()->static_calls_target_table_);
+  for (intptr_t i = 0; i < array.Length(); i += kSCallTableEntryLength) {
+    if (array.At(i) == raw_code_offset) {
+      ASSERT(code.IsNull() ||
+             (code.function() == array.At(i + kSCallTableFunctionEntry)));
+      array.SetAt(i + kSCallTableCodeEntry, code);
+      return;
+    }
+  }
+  UNREACHABLE();
 }
 
 
@@ -7276,12 +7354,11 @@
   deopt_ids->Clear();
   const PcDescriptors& descriptors =
       PcDescriptors::Handle(this->pc_descriptors());
-  Function& function = Function::Handle();
   for (intptr_t i = 0; i < descriptors.Length(); i++) {
     if (descriptors.DescriptorKind(i) == PcDescriptors::kFuncCall) {
       // Static call.
-      uword target_addr;
-      CodePatcher::GetStaticCallAt(descriptors.PC(i), &function, &target_addr);
+      const uword target_addr =
+          CodePatcher::GetStaticCallTargetAt(descriptors.PC(i));
       if (target_addr == StubCode::CallStaticFunctionEntryPoint()) {
         deopt_ids->Add(descriptors.DeoptId(i));
       }
@@ -8977,18 +9054,21 @@
   if (IsResolved()) {
     const AbstractTypeArguments& type_arguments =
         AbstractTypeArguments::Handle(arguments());
+    const char* class_name;
+    if (HasResolvedTypeClass()) {
+      class_name = String::Handle(
+          Class::Handle(type_class()).Name()).ToCString();
+    } else {
+      class_name = UnresolvedClass::Handle(unresolved_class()).ToCString();
+    }
     if (type_arguments.IsNull()) {
       const char* format = "Type: class '%s'";
-      const char* class_name =
-          String::Handle(Class::Handle(type_class()).Name()).ToCString();
       intptr_t len = OS::SNPrint(NULL, 0, format, class_name) + 1;
       char* chars = Isolate::Current()->current_zone()->Alloc<char>(len);
       OS::SNPrint(chars, len, format, class_name);
       return chars;
     } else {
       const char* format = "Type: class '%s', args:[%s]";
-      const char* class_name =
-          String::Handle(Class::Handle(type_class()).Name()).ToCString();
       const char* args_cstr =
           AbstractTypeArguments::Handle(arguments()).ToCString();
       intptr_t len = OS::SNPrint(NULL, 0, format, class_name, args_cstr) + 1;
@@ -9875,11 +9955,11 @@
     hash_ ^= hash_ >> 11;
     hash_ += hash_ << 15;
     hash_ = hash_ & ((static_cast<intptr_t>(1) << bits) - 1);
-    ASSERT(hash_ >= 0);
+    ASSERT(hash_ <= static_cast<uint32_t>(kMaxInt32));
     return hash_ == 0 ? 1 : hash_;
   }
  private:
-  intptr_t hash_;
+  uint32_t hash_;
 };
 
 
@@ -9927,7 +10007,7 @@
 }
 
 
-intptr_t String::Hash(const uint32_t* characters, intptr_t len) {
+intptr_t String::Hash(const int32_t* characters, intptr_t len) {
   return HashImpl(characters, len);
 }
 
@@ -9990,36 +10070,37 @@
 }
 
 
-bool String::Equals(const char* str) const {
-  ASSERT(str != NULL);
-  intptr_t len = strlen(str);
-  for (intptr_t i = 0; i < this->Length(); ++i) {
-    if (*str == '\0') {
+bool String::Equals(const char* cstr) const {
+  ASSERT(cstr != NULL);
+  CodePointIterator it(*this);
+  intptr_t len = strlen(cstr);
+  while (it.Next()) {
+    if (*cstr == '\0') {
       // Lengths don't match.
       return false;
     }
     int32_t ch;
-    intptr_t consumed = Utf8::Decode(reinterpret_cast<const uint8_t*>(str),
+    intptr_t consumed = Utf8::Decode(reinterpret_cast<const uint8_t*>(cstr),
                                      len,
                                      &ch);
-    if (consumed == 0 || this->CharAt(i) != ch) {
+    if (consumed == 0 || it.Current() != ch) {
       return false;
     }
-    str += consumed;
+    cstr += consumed;
     len -= consumed;
   }
-  return *str == '\0';
+  return *cstr == '\0';
 }
 
 
-bool String::Equals(const uint8_t* characters, intptr_t len) const {
+bool String::Equals(const uint8_t* latin1_array, intptr_t len) const {
   if (len != this->Length()) {
     // Lengths don't match.
     return false;
   }
 
   for (intptr_t i = 0; i < len; i++) {
-    if (this->CharAt(i) != characters[i]) {
+    if (this->CharAt(i) != latin1_array[i]) {
       return false;
     }
   }
@@ -10027,14 +10108,14 @@
 }
 
 
-bool String::Equals(const uint16_t* characters, intptr_t len) const {
+bool String::Equals(const uint16_t* utf16_array, intptr_t len) const {
   if (len != this->Length()) {
     // Lengths don't match.
     return false;
   }
 
   for (intptr_t i = 0; i < len; i++) {
-    if (this->CharAt(i) != characters[i]) {
+    if (this->CharAt(i) != utf16_array[i]) {
       return false;
     }
   }
@@ -10042,16 +10123,17 @@
 }
 
 
-bool String::Equals(const uint32_t* characters, intptr_t len) const {
-  if (len != this->Length()) {
-    // Lengths don't match.
-    return false;
-  }
-
-  for (intptr_t i = 0; i < len; i++) {
-    if (this->CharAt(i) != static_cast<int32_t>(characters[i])) {
+bool String::Equals(const int32_t* utf32_array, intptr_t len) const {
+  CodePointIterator it(*this);
+  intptr_t i = 0;
+  while (it.Next()) {
+    if (it.Current() != static_cast<int32_t>(utf32_array[i])) {
       return false;
     }
+    ++i;
+  }
+  if (i != len) {
+    return false;
   }
   return true;
 }
@@ -10121,7 +10203,7 @@
     }
     return strobj.raw();
   }
-  ASSERT((type == Utf8::kBMP) || (type == Utf8::kSMP));
+  ASSERT((type == Utf8::kBMP) || (type == Utf8::kSupplementary));
   const String& strobj = String::Handle(TwoByteString::New(len, space));
   NoGCScope no_gc;
   Utf8::DecodeToUTF16(utf8_array, array_len,
@@ -10147,7 +10229,7 @@
 }
 
 
-RawString* String::New(const uint32_t* utf32_array,
+RawString* String::New(const int32_t* utf32_array,
                        intptr_t array_len,
                        Heap::Space space) {
   bool is_one_byte_string = true;
@@ -10512,10 +10594,9 @@
   ASSERT(!str.IsNull());
   bool has_mapping = false;
   int32_t dst_max = 0;
-  intptr_t len = str.Length();
-  // TODO(cshapiro): assume a transform is required, rollback if not.
-  for (intptr_t i = 0; i < len; ++i) {
-    int32_t src = str.CharAt(i);
+  CodePointIterator it(str);
+  while (it.Next()) {
+    int32_t src = it.Current();
     int32_t dst = mapping(src);
     if (src != dst) {
       has_mapping = true;
@@ -10545,6 +10626,25 @@
 }
 
 
+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);
+    }
+  }
+  return true;
+}
+
+
 RawOneByteString* OneByteString::EscapeSpecialCharacters(const String& str,
                                                          bool raw_str) {
   intptr_t len = str.Length();
@@ -10683,7 +10783,7 @@
 }
 
 
-RawOneByteString* OneByteString::New(const uint32_t* characters,
+RawOneByteString* OneByteString::New(const int32_t* characters,
                                      intptr_t len,
                                      Heap::Space space) {
   const String& result = String::Handle(OneByteString::New(len, space));
@@ -10818,7 +10918,7 @@
 
 
 RawTwoByteString* TwoByteString::New(intptr_t utf16_len,
-                                     const uint32_t* utf32_array,
+                                     const int32_t* utf32_array,
                                      intptr_t array_len,
                                      Heap::Space space) {
   ASSERT((array_len > 0) && (utf16_len >= array_len));
@@ -10829,7 +10929,7 @@
     for (intptr_t i = 0; i < array_len; ++i) {
       if (utf32_array[i] > 0xffff) {
         ASSERT(j < (utf16_len - 1));
-        Utf8::ConvertUTF32ToUTF16(utf32_array[i], CharAddr(result, j));
+        Utf16::Encode(utf32_array[i], CharAddr(result, j));
         j += 2;
       } else {
         ASSERT(j < utf16_len);
@@ -10887,10 +10987,20 @@
   ASSERT(!str.IsNull());
   intptr_t len = str.Length();
   const String& result = String::Handle(TwoByteString::New(len, space));
-  for (intptr_t i = 0; i < len; ++i) {
-    int32_t ch = mapping(str.CharAt(i));
-    ASSERT(ch >= 0 && ch <= 0xFFFF);
-    *CharAddr(result, i) = ch;
+  String::CodePointIterator it(str);
+  intptr_t i = 0;
+  while (it.Next()) {
+    int32_t src = it.Current();
+    int32_t dst = mapping(src);
+    ASSERT(dst >= 0 && dst <= 0x10FFFF);
+    intptr_t len = Utf16::Length(dst);
+    if (len == 1) {
+      *CharAddr(result, i) = dst;
+    } else {
+      ASSERT(len == 2);
+      Utf16::Encode(dst, CharAddr(result, i));
+    }
+    i += len;
   }
   return TwoByteString::raw(result);
 }
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 07cb5bf..e40d545 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -366,9 +366,6 @@
  private:
   static void InitializeObject(uword address, intptr_t id, intptr_t size);
 
-  static RawClass* CreateAndRegisterInterface(const char* cname,
-                                              const Script& script,
-                                              const Library& lib);
   static void RegisterClass(const Class& cls,
                             const String& name,
                             const Library& lib);
@@ -605,6 +602,9 @@
   // Check if this class represents the 'Object' class.
   bool IsObjectClass() const { return id() == kInstanceCid; }
 
+  // Check if this class represents the 'List' class.
+  bool IsListClass() const;
+
   // Check if this class represents a signature class.
   bool IsSignatureClass() const {
     return signature_function() != Object::null();
@@ -1433,6 +1433,13 @@
                                          const Function& parent,
                                          intptr_t token_pos);
 
+  // Slow function, use in asserts to track changes in important library
+  // functions.
+  int32_t SourceFingerprint() const;
+
+  // Return false and report an error if the fingerprint does not match.
+  bool CheckSourceFingerprint(intptr_t fp) const;
+
   static const int kCtorPhaseInit = 1 << 0;
   static const int kCtorPhaseBody = 1 << 1;
   static const int kCtorPhaseAll = (kCtorPhaseInit | kCtorPhaseBody);
@@ -2486,10 +2493,22 @@
   void set_stackmaps(const Array& maps) const;
   RawStackmap* GetStackmap(uword pc, Array* stackmaps, Stackmap* map) const;
 
-  RawGrowableObjectArray* resolved_static_calls() const {
-    return raw_ptr()->resolved_static_calls_;
+  enum {
+    kSCallTableOffsetEntry = 0,
+    kSCallTableFunctionEntry = 1,
+    kSCallTableCodeEntry = 2,
+    kSCallTableEntryLength = 3,
+  };
+
+  void set_static_calls_target_table(const Array& value) const;
+  RawArray* static_calls_target_table() const {
+    return raw_ptr()->static_calls_target_table_;
   }
-  void set_resolved_static_calls(const GrowableObjectArray& val) const;
+
+  // Returns null if there is no static call at 'pc'.
+  RawFunction* GetStaticCallTargetFunctionAt(uword pc) const;
+  // Aborts if there is no static call at 'pc'.
+  void SetStaticCallTargetCodeAt(uword pc, const Code& code) const;
 
   class Comments : public ZoneAllocated {
    public:
@@ -3708,6 +3727,29 @@
   static const intptr_t kSizeofRawString = sizeof(RawObject) + (2 * kWordSize);
   static const intptr_t kMaxElements = kSmiMax / kTwoByteChar;
 
+  class CodePointIterator : public ValueObject {
+   public:
+    explicit CodePointIterator(const String& str)
+        : str_(str),
+          index_(-1),
+          ch_(-1) {
+    }
+
+    int32_t Current() {
+      ASSERT(index_ >= 0);
+      ASSERT(index_ < str_.Length());
+      return ch_;
+    }
+
+    bool Next();
+
+   private:
+    const String& str_;
+    intptr_t index_;
+    int32_t ch_;
+    DISALLOW_IMPLICIT_CONSTRUCTORS(CodePointIterator);
+  };
+
   intptr_t Length() const { return Smi::Value(raw_ptr()->length_); }
   static intptr_t length_offset() { return OFFSET_OF(RawString, length_); }
 
@@ -3716,7 +3758,7 @@
   static intptr_t Hash(const String& str, intptr_t begin_index, intptr_t len);
   static intptr_t Hash(const uint8_t* characters, intptr_t len);
   static intptr_t Hash(const uint16_t* characters, intptr_t len);
-  static intptr_t Hash(const uint32_t* characters, intptr_t len);
+  static intptr_t Hash(const int32_t* characters, intptr_t len);
 
   int32_t CharAt(intptr_t index) const;
 
@@ -3726,10 +3768,18 @@
   inline bool Equals(const String& str,
                      intptr_t begin_index,  // begin index on 'str'.
                      intptr_t len) const;  // len on 'str'.
-  bool Equals(const char* str) const;
+
+  // Compares to a '\0' terminated array of UTF-8 encoded characters.
+  bool Equals(const char* cstr) const;
+
+  // Compares to an array of UTF-8 encoded characters.
   bool Equals(const uint8_t* characters, intptr_t len) const;
+
+  // Compares to an array of UTF-16 encoded characters.
   bool Equals(const uint16_t* characters, intptr_t len) const;
-  bool Equals(const uint32_t* characters, intptr_t len) const;
+
+  // Compares to an array of UTF-32 encoded characters.
+  bool Equals(const int32_t* characters, intptr_t len) const;
 
   virtual bool Equals(const Instance& other) const;
 
@@ -3791,7 +3841,7 @@
                         Heap::Space space = Heap::kNew);
 
   // Creates a new String object from an array of UTF-32 encoded characters.
-  static RawString* New(const uint32_t* utf32_array,
+  static RawString* New(const int32_t* utf32_array,
                         intptr_t array_len,
                         Heap::Space space = Heap::kNew);
 
@@ -3937,7 +3987,7 @@
   static RawOneByteString* New(const uint16_t* characters,
                                intptr_t len,
                                Heap::Space space);
-  static RawOneByteString* New(const uint32_t* characters,
+  static RawOneByteString* New(const int32_t* characters,
                                intptr_t len,
                                Heap::Space space);
   static RawOneByteString* New(const String& str,
@@ -4020,7 +4070,7 @@
                                intptr_t len,
                                Heap::Space space);
   static RawTwoByteString* New(intptr_t utf16_len,
-                               const uint32_t* characters,
+                               const int32_t* characters,
                                intptr_t len,
                                Heap::Space space);
   static RawTwoByteString* New(const String& str,
@@ -4515,7 +4565,7 @@
   static const intptr_t kMaxElements = kSmiMax / kBytesPerElement;
 
   static intptr_t data_offset() {
-    return length_offset() + kWordSize;
+    return OFFSET_OF(RawInt8Array, data_);
   }
 
   static intptr_t InstanceSize() {
@@ -4567,7 +4617,7 @@
   static const intptr_t kMaxElements = kSmiMax / kBytesPerElement;
 
   static intptr_t data_offset() {
-    return length_offset() + kWordSize;
+    return OFFSET_OF(RawUint8Array, data_);
   }
 
   static intptr_t InstanceSize() {
@@ -4619,7 +4669,7 @@
   static const intptr_t kMaxElements = kSmiMax / kBytesPerElement;
 
   static intptr_t data_offset() {
-    return length_offset() + kWordSize;
+    return OFFSET_OF(RawInt16Array, data_);
   }
 
   static intptr_t InstanceSize() {
@@ -4671,7 +4721,7 @@
   static const intptr_t kMaxElements = kSmiMax / kBytesPerElement;
 
   static intptr_t data_offset() {
-    return length_offset() + kWordSize;
+    return OFFSET_OF(RawUint16Array, data_);
   }
 
   static intptr_t InstanceSize() {
@@ -4723,7 +4773,7 @@
   static const intptr_t kMaxElements = kSmiMax / kBytesPerElement;
 
   static intptr_t data_offset() {
-    return length_offset() + kWordSize;
+    return OFFSET_OF(RawInt32Array, data_);
   }
 
   static intptr_t InstanceSize() {
@@ -4775,7 +4825,7 @@
   static const intptr_t kMaxElements = kSmiMax / kBytesPerElement;
 
   static intptr_t data_offset() {
-    return length_offset() + kWordSize;
+    return OFFSET_OF(RawUint32Array, data_);
   }
 
   static intptr_t InstanceSize() {
@@ -4827,7 +4877,7 @@
   static const intptr_t kMaxElements = kSmiMax / kBytesPerElement;
 
   static intptr_t data_offset() {
-    return length_offset() + kWordSize;
+    return OFFSET_OF(RawInt64Array, data_);
   }
 
   static intptr_t InstanceSize() {
@@ -4879,7 +4929,7 @@
   static const intptr_t kMaxElements = kSmiMax / kBytesPerElement;
 
   static intptr_t data_offset() {
-    return length_offset() + kWordSize;
+    return OFFSET_OF(RawUint64Array, data_);
   }
 
   static intptr_t InstanceSize() {
@@ -4931,7 +4981,7 @@
   static const intptr_t kMaxElements = kSmiMax / kBytesPerElement;
 
   static intptr_t data_offset() {
-    return length_offset() + kWordSize;
+    return OFFSET_OF(RawFloat32Array, data_);
   }
 
   static intptr_t InstanceSize() {
@@ -4988,7 +5038,7 @@
   }
 
   static intptr_t data_offset() {
-    return length_offset() + kWordSize;
+    return OFFSET_OF(RawFloat64Array, data_);
   }
 
   static intptr_t InstanceSize(intptr_t len) {
@@ -5107,6 +5157,10 @@
     return RoundedAllocationSize(sizeof(RawExternalUint8Array));
   }
 
+  static intptr_t external_data_offset() {
+    return OFFSET_OF(RawExternalUint8Array, external_data_);
+  }
+
   static RawExternalUint8Array* New(uint8_t* data,
                                     intptr_t len,
                                     void* peer,
diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
index 354c11c..f91f5d6 100644
--- a/runtime/vm/object_test.cc
+++ b/runtime/vm/object_test.cc
@@ -5,6 +5,7 @@
 #include "platform/assert.h"
 #include "vm/assembler.h"
 #include "vm/bigint_operations.h"
+#include "vm/class_finalizer.h"
 #include "vm/isolate.h"
 #include "vm/object.h"
 #include "vm/object_store.h"
@@ -273,6 +274,48 @@
 }
 
 
+TEST_CASE(StringCompareTo) {
+  const String& abcd = String::Handle(String::New("abcd"));
+  const String& abce = String::Handle(String::New("abce"));
+  EXPECT_EQ(0, abcd.CompareTo(abcd));
+  EXPECT_EQ(0, abce.CompareTo(abce));
+  EXPECT(abcd.CompareTo(abce) < 0);
+  EXPECT(abce.CompareTo(abcd) > 0);
+
+  const int kMonkeyLen = 4;
+  const uint8_t monkey_utf8[kMonkeyLen] = { 0xf0, 0x9f, 0x90, 0xb5 };
+  const String& monkey_face =
+      String::Handle(String::New(monkey_utf8, kMonkeyLen));
+  const int kDogLen = 4;
+  // 0x1f436 DOG FACE.
+  const uint8_t dog_utf8[kDogLen] = { 0xf0, 0x9f, 0x90, 0xb6 };
+  const String& dog_face = String::Handle(String::New(dog_utf8, kDogLen));
+  EXPECT_EQ(0, monkey_face.CompareTo(monkey_face));
+  EXPECT_EQ(0, dog_face.CompareTo(dog_face));
+  EXPECT(monkey_face.CompareTo(dog_face) < 0);
+  EXPECT(dog_face.CompareTo(monkey_face) > 0);
+
+  const int kDominoLen = 4;
+  // 0x1f036 DOMINO TILE HORIZONTAL-00-05.
+  const uint8_t domino_utf8[kDominoLen] = { 0xf0, 0x9f, 0x80, 0xb6 };
+  const String& domino = String::Handle(String::New(domino_utf8, kDominoLen));
+  EXPECT_EQ(0, domino.CompareTo(domino));
+  EXPECT(domino.CompareTo(dog_face) < 0);
+  EXPECT(domino.CompareTo(monkey_face) < 0);
+  EXPECT(dog_face.CompareTo(domino) > 0);
+  EXPECT(monkey_face.CompareTo(domino) > 0);
+
+  EXPECT(abcd.CompareTo(monkey_face) < 0);
+  EXPECT(abce.CompareTo(monkey_face) < 0);
+  EXPECT(abcd.CompareTo(domino) < 0);
+  EXPECT(abce.CompareTo(domino) < 0);
+  EXPECT(domino.CompareTo(abcd) > 0);
+  EXPECT(domino.CompareTo(abcd) > 0);
+  EXPECT(monkey_face.CompareTo(abce) > 0);
+  EXPECT(monkey_face.CompareTo(abce) > 0);
+}
+
+
 TEST_CASE(Mint) {
 // On 64-bit architectures a Smi is stored in a 64 bit word. A Midint cannot
 // be allocated if it does fit into a Smi.
@@ -559,7 +602,7 @@
     EXPECT_EQ(false, str1.StartsWith(str3));
   }
 
-  const uint32_t four_chars[] = { 'C', 0xFF, 'h', 0xFFFF, 'a', 0x10FFFF, 'r' };
+  const int32_t four_chars[] = { 'C', 0xFF, 'h', 0xFFFF, 'a', 0x10FFFF, 'r' };
   const String& four_str = String::Handle(String::New(four_chars, 7));
   EXPECT_EQ(four_str.Hash(), four_str.Hash());
   EXPECT(four_str.IsTwoByteString());
@@ -587,7 +630,7 @@
 
   // Create a 1-byte string from an array of 4-byte elements.
   {
-    const uint32_t char32[] = { 0x00, 0x1F, 0x7F };
+    const int32_t char32[] = { 0x00, 0x1F, 0x7F };
     const String& str8 = String::Handle(String::New(char32, 3));
     EXPECT(str8.IsOneByteString());
     EXPECT(!str8.IsTwoByteString());
@@ -598,7 +641,7 @@
 
   // Create a 2-byte string from an array of 4-byte elements.
   {
-    const uint32_t char32[] = { 0, 0x7FFF, 0xFFFF };
+    const int32_t char32[] = { 0, 0x7FFF, 0xFFFF };
     const String& str16 = String::Handle(String::New(char32, 3));
     EXPECT(!str16.IsOneByteString());
     EXPECT(str16.IsTwoByteString());
@@ -943,7 +986,7 @@
     EXPECT(str1.IsOneByteString());
     EXPECT_EQ(0, str1.Length());
 
-    uint32_t four[] = { 0x1D4D5, 0x1D4DE, 0x1D4E4, 0x1D4E1 };
+    int32_t four[] = { 0x1D4D5, 0x1D4DE, 0x1D4E4, 0x1D4E1 };
     intptr_t four_len = sizeof(four) / sizeof(four[0]);
     intptr_t expected_len = (four_len * 2);
     const String& str2 = String::Handle(String::New(four, four_len));
@@ -988,8 +1031,8 @@
     array3.SetAt(2, str2);
     const String& str7 = String::Handle(String::ConcatAll(array3));
     EXPECT(str7.IsTwoByteString());
-    uint32_t fourfour[] = { 0x1D4D5, 0x1D4DE, 0x1D4E4, 0x1D4E1,
-                            0x1D4D5, 0x1D4DE, 0x1D4E4, 0x1D4E1 };
+    int32_t fourfour[] = { 0x1D4D5, 0x1D4DE, 0x1D4E4, 0x1D4E1,
+                           0x1D4D5, 0x1D4DE, 0x1D4E4, 0x1D4E1 };
     intptr_t fourfour_len = sizeof(fourfour) / sizeof(fourfour[0]);
     EXPECT_EQ((fourfour_len * 2), str7.Length());
     const String& fourfour_str =
@@ -999,13 +1042,13 @@
 
   // Concatenate non-empty strings built from 4-byte elements.
   {
-    const uint32_t one[] = { 0x105D0, 0x105D9, 0x105D9, 0x105DF };
+    const int32_t one[] = { 0x105D0, 0x105D9, 0x105D9, 0x105DF };
     intptr_t one_len = sizeof(one) / sizeof(one[0]);
     const String& onestr = String::Handle(String::New(one, one_len));
     EXPECT(onestr.IsTwoByteString());
     EXPECT_EQ((one_len *2), onestr.Length());
 
-    const uint32_t two[] = { 0x105E6, 0x105D5, 0x105D5, 0x105D9, 0x105D9 };
+    const int32_t two[] = { 0x105E6, 0x105D5, 0x105D5, 0x105D9, 0x105D9 };
     intptr_t two_len = sizeof(two) / sizeof(two[0]);
     const String& twostr = String::Handle(String::New(two, two_len));
     EXPECT(twostr.IsTwoByteString());
@@ -1015,8 +1058,8 @@
 
     const String& str1 = String::Handle(String::Concat(onestr, twostr));
     EXPECT(str1.IsTwoByteString());
-    const uint32_t one_two[] = { 0x105D0, 0x105D9, 0x105D9, 0x105DF,
-                                 0x105E6, 0x105D5, 0x105D5, 0x105D9, 0x105D9 };
+    const int32_t one_two[] = { 0x105D0, 0x105D9, 0x105D9, 0x105DF,
+                                0x105E6, 0x105D5, 0x105D5, 0x105D9, 0x105D9 };
     intptr_t one_two_len = sizeof(one_two) / sizeof(one_two[0]);
     EXPECT_EQ((one_two_len * 2), str1.Length());
     const String& one_two_str =
@@ -1025,8 +1068,8 @@
 
     const String& str2 = String::Handle(String::Concat(twostr, onestr));
     EXPECT(str2.IsTwoByteString());
-    const uint32_t two_one[] = { 0x105E6, 0x105D5, 0x105D5, 0x105D9, 0x105D9,
-                                 0x105D0, 0x105D9, 0x105D9, 0x105DF };
+    const int32_t two_one[] = { 0x105E6, 0x105D5, 0x105D5, 0x105D9, 0x105D9,
+                                0x105D0, 0x105D9, 0x105D9, 0x105DF };
     intptr_t two_one_len = sizeof(two_one) / sizeof(two_one[0]);
     EXPECT_EQ((two_one_len * 2), str2.Length());
     const String& two_one_str =
@@ -1060,10 +1103,10 @@
     array3.SetAt(2, onestr);
     const String& str5 = String::Handle(String::ConcatAll(array3));
     EXPECT(str5.IsTwoByteString());
-    const uint32_t one_two_one[] = { 0x105D0, 0x105D9, 0x105D9, 0x105DF,
-                                     0x105E6, 0x105D5, 0x105D5, 0x105D9,
-                                     0x105D9,
-                                     0x105D0, 0x105D9, 0x105D9, 0x105DF };
+    const int32_t one_two_one[] = { 0x105D0, 0x105D9, 0x105D9, 0x105DF,
+                                    0x105E6, 0x105D5, 0x105D5, 0x105D9,
+                                    0x105D9,
+                                    0x105D0, 0x105D9, 0x105D9, 0x105DF };
     intptr_t one_two_one_len = sizeof(one_two_one) / sizeof(one_two_one[0]);
     EXPECT_EQ((one_two_one_len * 2), str5.Length());
     const String& one_two_one_str =
@@ -1077,11 +1120,11 @@
     array4.SetAt(2, twostr);
     const String& str6 = String::Handle(String::ConcatAll(array4));
     EXPECT(str6.IsTwoByteString());
-    const uint32_t two_one_two[] = { 0x105E6, 0x105D5, 0x105D5, 0x105D9,
-                                     0x105D9,
-                                     0x105D0, 0x105D9, 0x105D9, 0x105DF,
-                                     0x105E6, 0x105D5, 0x105D5, 0x105D9,
-                                     0x105D9 };
+    const int32_t two_one_two[] = { 0x105E6, 0x105D5, 0x105D5, 0x105D9,
+                                    0x105D9,
+                                    0x105D0, 0x105D9, 0x105D9, 0x105DF,
+                                    0x105E6, 0x105D5, 0x105D5, 0x105D9,
+                                    0x105D9 };
     intptr_t two_one_two_len = sizeof(two_one_two) / sizeof(two_one_two[0]);
     EXPECT_EQ((two_one_two_len * 2), str6.Length());
     const String& two_one_two_str =
@@ -1312,7 +1355,8 @@
     }
   }
 
-  // Create a SMP 2-byte string from a UTF-8 string literal.
+  // Create a 2-byte string with supplementary characters from a UTF-8
+  // string literal.
   {
     const char* src =
         "\xF0\x9D\x91\xA0\xF0\x9D\x91\xA1"
@@ -1385,6 +1429,37 @@
 }
 
 
+TEST_CASE(StringEqualsUtf8) {
+  const char* onesrc = "abc";
+  const String& onestr = String::Handle(String::New(onesrc));
+  EXPECT(onestr.IsOneByteString());
+  EXPECT(!onestr.Equals(""));
+  EXPECT(!onestr.Equals("a"));
+  EXPECT(!onestr.Equals("ab"));
+  EXPECT(onestr.Equals("abc"));
+  EXPECT(!onestr.Equals("abcd"));
+
+  const char* twosrc = "\xD7\x90\xD7\x91\xD7\x92";
+  const String& twostr = String::Handle(String::New(twosrc));
+  EXPECT(twostr.IsTwoByteString());
+  EXPECT(!twostr.Equals(""));
+  EXPECT(!twostr.Equals("\xD7\x90"));
+  EXPECT(!twostr.Equals("\xD7\x90\xD7\x91"));
+  EXPECT(twostr.Equals("\xD7\x90\xD7\x91\xD7\x92"));
+  EXPECT(!twostr.Equals("\xD7\x90\xD7\x91\xD7\x92\xD7\x93"));
+
+  const char* foursrc = "\xF0\x90\x8E\xA0\xF0\x90\x8E\xA1\xF0\x90\x8E\xA2";
+  const String& fourstr = String::Handle(String::New(foursrc));
+  EXPECT(fourstr.IsTwoByteString());
+  EXPECT(!fourstr.Equals(""));
+  EXPECT(!fourstr.Equals("\xF0\x90\x8E\xA0"));
+  EXPECT(!fourstr.Equals("\xF0\x90\x8E\xA0\xF0\x90\x8E\xA1"));
+  EXPECT(fourstr.Equals("\xF0\x90\x8E\xA0\xF0\x90\x8E\xA1\xF0\x90\x8E\xA2"));
+  EXPECT(!fourstr.Equals("\xF0\x90\x8E\xA0\xF0\x90\x8E\xA1"
+                         "\xF0\x90\x8E\xA2\xF0\x90\x8E\xA3"));
+}
+
+
 TEST_CASE(ExternalOneByteString) {
   uint8_t characters[] = { 0xF6, 0xF1, 0xE9 };
   intptr_t len = ARRAY_SIZE(characters);
@@ -1501,10 +1576,36 @@
   EXPECT_EQ(one.raw(), ein_symbol.raw());
   EXPECT(one.raw() != eins.raw());
 
-  uint32_t char32[] = { 'E', 'l', 'f' };
-  String& elf = String::Handle(Symbols::New(char32, 3));
-  EXPECT(elf.IsSymbol());
-  EXPECT_EQ(elf.raw(), Symbols::New("Elf"));
+  uint16_t char16[] = { 'E', 'l', 'f' };
+  String& elf1 = String::Handle(Symbols::New(char16, 3));
+  int32_t char32[] = { 'E', 'l', 'f' };
+  String& elf2 = String::Handle(Symbols::New(char32, 3));
+  EXPECT(elf1.IsSymbol());
+  EXPECT(elf2.IsSymbol());
+  EXPECT_EQ(elf1.raw(), Symbols::New("Elf"));
+  EXPECT_EQ(elf2.raw(), Symbols::New("Elf"));
+}
+
+
+TEST_CASE(SymbolUnicode) {
+  uint16_t monkey_utf16[] = { 0xd83d, 0xdc35 };  // Unicode Monkey Face.
+  String& monkey = String::Handle(Symbols::New(monkey_utf16, 2));
+  EXPECT(monkey.IsSymbol());
+  const char monkey_utf8[] = {0xf0, 0x9f, 0x90, 0xb5, 0};
+  EXPECT_EQ(monkey.raw(), Symbols::New(monkey_utf8));
+
+  int32_t kMonkeyFace = 0x1f435;
+  String& monkey2 = String::Handle(Symbols::FromCharCode(kMonkeyFace));
+  EXPECT_EQ(monkey.raw(), monkey2.raw());
+
+  // Unicode cat face with tears of joy.
+  int32_t kCatFaceWithTearsOfJoy = 0x1f639;
+  String& cat = String::Handle(Symbols::FromCharCode(kCatFaceWithTearsOfJoy));
+
+  uint16_t cat_utf16[] = { 0xd83d, 0xde39 };
+  String& cat2 = String::Handle(Symbols::New(cat_utf16, 2));
+  EXPECT(cat2.IsSymbol());
+  EXPECT_EQ(cat2.raw(), cat.raw());
 }
 
 
@@ -1552,6 +1653,61 @@
 }
 
 
+TEST_CASE(StringCodePointIterator) {
+  const String& str0 = String::Handle(String::New(""));
+  String::CodePointIterator it0(str0);
+  EXPECT(!it0.Next());
+
+  const String& str1 = String::Handle(String::New(" \xc3\xa7 "));
+  String::CodePointIterator it1(str1);
+  EXPECT(it1.Next());
+  EXPECT_EQ(' ', it1.Current());
+  EXPECT(it1.Next());
+  EXPECT_EQ(0xE7, it1.Current());
+  EXPECT(it1.Next());
+  EXPECT_EQ(' ', it1.Current());
+  EXPECT(!it1.Next());
+
+  const String& str2 = String::Handle(String::New("\xD7\x92\xD7\x9C"
+                                                  "\xD7\xA2\xD7\x93"
+                                                  "\xD7\x91\xD7\xA8"
+                                                  "\xD7\x9B\xD7\x94"));
+  String::CodePointIterator it2(str2);
+  EXPECT(it2.Next());
+  EXPECT_EQ(0x5D2, it2.Current());
+  EXPECT(it2.Next());
+  EXPECT_EQ(0x5DC, it2.Current());
+  EXPECT(it2.Next());
+  EXPECT_EQ(0x5E2, it2.Current());
+  EXPECT(it2.Next());
+  EXPECT_EQ(0x5D3, it2.Current());
+  EXPECT(it2.Next());
+  EXPECT_EQ(0x5D1, it2.Current());
+  EXPECT(it2.Next());
+  EXPECT_EQ(0x5E8, it2.Current());
+  EXPECT(it2.Next());
+  EXPECT_EQ(0x5DB, it2.Current());
+  EXPECT(it2.Next());
+  EXPECT_EQ(0x5D4, it2.Current());
+  EXPECT(!it2.Next());
+
+  const String& str3 = String::Handle(String::New("\xF0\x9D\x91\xA0"
+                                                  "\xF0\x9D\x91\xA1"
+                                                  "\xF0\x9D\x91\xA2"
+                                                  "\xF0\x9D\x91\xA3"));
+  String::CodePointIterator it3(str3);
+  EXPECT(it3.Next());
+  EXPECT_EQ(0x1D460, it3.Current());
+  EXPECT(it3.Next());
+  EXPECT_EQ(0x1D461, it3.Current());
+  EXPECT(it3.Next());
+  EXPECT_EQ(0x1D462, it3.Current());
+  EXPECT(it3.Next());
+  EXPECT_EQ(0x1D463, it3.Current());
+  EXPECT(!it3.Next());
+}
+
+
 TEST_CASE(GrowableObjectArray) {
   const int kArrayLen = 5;
   Smi& value = Smi::Handle();
@@ -3035,6 +3191,64 @@
   EXPECT(weak2.value() == Object::null());
 }
 
+
+static RawFunction* GetFunction(const Class& cls, const char* name) {
+  const Function& result = Function::Handle(cls.LookupDynamicFunction(
+      String::Handle(String::New(name))));
+  ASSERT(!result.IsNull());
+  return result.raw();
+}
+
+
+TEST_CASE(FunctionSourceFingerprint) {
+  const char* kScriptChars =
+      "class A {\n"
+      "  void test1(int a) {\n"
+      "    return a > 1 ? a + 1 : a;\n"
+      "  }\n"
+      "  void test2(int a) {\n"
+      "    return a > 1 ? a + 1 : a;\n"
+      "  }\n"
+      "  void test3(a) {\n"
+      "    return a > 1 ? a + 1 : a;\n"
+      "  }\n"
+      "  void test4(b) {\n"
+      "    return b > 1 ? b + 1 : b;\n"
+      "  }\n"
+      "  void test5(b) {\n"
+      "    return b > 1 ? b - 1 : b;\n"
+      "  }\n"
+      "  void test6(b) {\n"
+      "    return b > 1 ? b - 2 : b;\n"
+      "  }\n"
+      "  void test7(b) {\n"
+      "    return b > 1 ?\n"
+      "        b - 2 : b;\n"
+      "  }\n"
+      "}";
+  TestCase::LoadTestScript(kScriptChars, NULL);
+  EXPECT(ClassFinalizer::FinalizePendingClasses());
+  const String& name = String::Handle(String::New(TestCase::url()));
+  const Library& lib = Library::Handle(Library::LookupLibrary(name));
+  EXPECT(!lib.IsNull());
+
+  const Class& class_a = Class::Handle(
+      lib.LookupClass(String::Handle(Symbols::New("A"))));
+  const Function& test1 = Function::Handle(GetFunction(class_a, "test1"));
+  const Function& test2 = Function::Handle(GetFunction(class_a, "test2"));
+  const Function& test3 = Function::Handle(GetFunction(class_a, "test3"));
+  const Function& test4 = Function::Handle(GetFunction(class_a, "test4"));
+  const Function& test5 = Function::Handle(GetFunction(class_a, "test5"));
+  const Function& test6 = Function::Handle(GetFunction(class_a, "test6"));
+  const Function& test7 = Function::Handle(GetFunction(class_a, "test7"));
+  EXPECT_EQ(test1.SourceFingerprint(), test2.SourceFingerprint());
+  EXPECT_NE(test1.SourceFingerprint(), test3.SourceFingerprint());
+  EXPECT_NE(test3.SourceFingerprint(), test4.SourceFingerprint());
+  EXPECT_NE(test4.SourceFingerprint(), test5.SourceFingerprint());
+  EXPECT_NE(test5.SourceFingerprint(), test6.SourceFingerprint());
+  EXPECT_EQ(test6.SourceFingerprint(), test7.SourceFingerprint());
+}
+
 #endif  // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64).
 
 }  // namespace dart
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index 4c9027b..3273891 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -35,6 +35,8 @@
             "Warning on legacy getter syntax");
 DEFINE_FLAG(bool, strict_function_literals, false,
             "enforce new function literal rules");
+DEFINE_FLAG(bool, fail_legacy_abstract, false,
+            "error on explicit use of abstract on class members");
 
 static void CheckedModeHandler(bool value) {
   FLAG_enable_asserts = value;
@@ -2543,7 +2545,8 @@
     const intptr_t type_pos = TokenPos();
     const AbstractType& type = AbstractType::Handle(
         ParseType(ClassFinalizer::kTryResolve));
-    if (type.IsTypeParameter() || type.IsDynamicType()) {
+    if (!type.IsMalformed() &&
+        (type.IsTypeParameter() || type.IsDynamicType())) {
       // Replace the type with a malformed type and compile a throw when called.
       redirection_type = ClassFinalizer::NewFinalizedMalformedType(
           Error::Handle(),  // No previous error.
@@ -2895,6 +2898,9 @@
   current_member_ = &member;
   if ((CurrentToken() == Token::kABSTRACT) &&
       (LookaheadToken(1) != Token::kLPAREN)) {
+    if (FLAG_fail_legacy_abstract) {
+      ErrorMsg("illegal use of abstract");
+    }
     ConsumeToken();
     member.has_abstract = true;
   }
@@ -3736,10 +3742,7 @@
       // Map a malformed type argument to dynamic, so that malformed types with
       // a resolved type class are handled properly in production mode.
       if (type.IsMalformed()) {
-        ASSERT(finalization != ClassFinalizer::kCanonicalizeWellFormed);
-        if (finalization == ClassFinalizer::kCanonicalizeForCreation) {
-          ErrorMsg(*malformed_error);
-        }
+        ASSERT(finalization < ClassFinalizer::kCanonicalizeWellFormed);
         type = Type::DynamicType();
       }
       types.Add(type);
@@ -5035,9 +5038,13 @@
   // class in the current library (but not in its imports) and only create a new
   // canonical signature class if it does not exist yet.
   const String& signature = String::Handle(function.Signature());
-  Class& signature_class = Class::ZoneHandle(
-      library_.LookupLocalClass(signature));
-
+  Class& signature_class = Class::ZoneHandle();
+  if (!is_new_closure) {
+    signature_class = function.signature_class();
+  }
+  if (signature_class.IsNull()) {
+    signature_class = library_.LookupLocalClass(signature);
+  }
   if (signature_class.IsNull()) {
     // If we don't have a signature class yet, this must be a closure we
     // have not parsed before.
@@ -6179,6 +6186,8 @@
     catch_seen = true;
     if (IsLiteral("on")) {
       ConsumeToken();
+      // TODO(regis): The spec may change in the way a malformed 'on' type is
+      // treated. For now, we require the type to be wellformed.
       exception_param.type = &AbstractType::ZoneHandle(
           ParseType(ClassFinalizer::kCanonicalizeWellFormed));
     } else {
@@ -6736,9 +6745,7 @@
 
 
 bool Parser::IsLiteral(const char* literal) {
-  const uint8_t* characters = reinterpret_cast<const uint8_t*>(literal);
-  intptr_t len = strlen(literal);
-  return IsIdentifier() && CurrentLiteral()->Equals(characters, len);
+  return IsIdentifier() && CurrentLiteral()->Equals(literal);
 }
 
 
@@ -6837,8 +6844,8 @@
           op_kind = Token::kISNOT;
         }
         const intptr_t type_pos = TokenPos();
-        const AbstractType& type =
-            AbstractType::ZoneHandle(ParseType(ClassFinalizer::kCanonicalize));
+        const AbstractType& type = AbstractType::ZoneHandle(
+            ParseType(ClassFinalizer::kCanonicalizeExpression));
         if (!type.IsInstantiated() &&
             (current_block_->scope->function_level() > 0)) {
           // Make sure that the instantiator is captured.
@@ -7804,10 +7811,14 @@
       }
       // Resolve classname in the scope of the current library.
       Error& error = Error::Handle();
-      resolved_type_class =
-          ResolveClassInCurrentLibraryScope(unresolved_class.token_pos(),
-                                            unresolved_class_name,
-                                            &error);
+      // If we finalize a type expression, as opposed to a type annotation, we
+      // tell the resolver (by passing NULL) to immediately report an ambiguous
+      // type as a compile time error.
+      resolved_type_class = ResolveClassInCurrentLibraryScope(
+          unresolved_class.token_pos(),
+          unresolved_class_name,
+          finalization >= ClassFinalizer::kCanonicalizeExpression ?
+              NULL : &error);
       if (!error.IsNull()) {
         *type = ClassFinalizer::NewFinalizedMalformedType(
             error,
@@ -7823,11 +7834,15 @@
           LibraryPrefix::Handle(unresolved_class.library_prefix());
       // Resolve class name in the scope of the library prefix.
       Error& error = Error::Handle();
-      resolved_type_class =
-          ResolveClassInPrefixScope(unresolved_class.token_pos(),
-                                    lib_prefix,
-                                    unresolved_class_name,
-                                    &error);
+      // If we finalize a type expression, as opposed to a type annotation, we
+      // tell the resolver (by passing NULL) to immediately report an ambiguous
+      // type as a compile time error.
+      resolved_type_class = ResolveClassInPrefixScope(
+          unresolved_class.token_pos(),
+          lib_prefix,
+          unresolved_class_name,
+          finalization >= ClassFinalizer::kCanonicalizeExpression ?
+              NULL : &error);
       if (!error.IsNull()) {
         *type = ClassFinalizer::NewFinalizedMalformedType(
             error,
@@ -8695,7 +8710,7 @@
   }
   ASSERT(type_arguments.IsNull() || (type_arguments.Length() == 1));
   const Class& array_class = Class::Handle(
-      Type::Handle(Type::ArrayType()).type_class());
+      Isolate::Current()->object_store()->array_class());
   Type& type = Type::ZoneHandle(
       Type::New(array_class, type_arguments, type_pos));
   type ^= ClassFinalizer::FinalizeType(
@@ -8763,9 +8778,7 @@
     return new LiteralNode(literal_pos, const_list);
   } else {
     // Factory call at runtime.
-    // TODO(regis): Once _ListImpl is removed, use Symbols::List() instead of
-    // Symbols::ListImplementation() on the following line.
-    String& factory_class_name = String::Handle(Symbols::ListImplementation());
+    String& factory_class_name = String::Handle(Symbols::List());
     const Class& factory_class =
         Class::Handle(LookupCoreClass(factory_class_name));
     ASSERT(!factory_class.IsNull());
@@ -9100,11 +9113,10 @@
   }
   intptr_t type_pos = TokenPos();
   AbstractType& type = AbstractType::Handle(
-      ParseType(ClassFinalizer::kCanonicalizeForCreation));
+      ParseType(ClassFinalizer::kCanonicalizeExpression));
   // In case the type is malformed, throw a dynamic type error after finishing
   // parsing the instance creation expression.
-  if (type.IsTypeParameter() || type.IsDynamicType()) {
-    ASSERT(!type.IsMalformed());
+  if (!type.IsMalformed() && (type.IsTypeParameter() || type.IsDynamicType())) {
     // Replace the type with a malformed type.
     type = ClassFinalizer::NewFinalizedMalformedType(
         Error::Handle(),  // No previous error.
diff --git a/runtime/vm/random.cc b/runtime/vm/random.cc
deleted file mode 100644
index ef2455c..0000000
--- a/runtime/vm/random.cc
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-#include "vm/random.h"
-
-#include "platform/assert.h"
-#include "vm/isolate.h"
-
-namespace dart {
-
-// LSFR step with a period of 31-bits.
-// Based on http://en.wikipedia.org/wiki/Linear_feedback_shift_register
-static int32_t LinearFeedbackShiftRegisterStep(int32_t seed) {
-  return (seed >> 1) ^ ((-(seed & 1)) & (1 << 30 | 1 << 27));
-}
-
-
-int32_t Random::RandomInt32() {
-  Isolate* isolate = Isolate::Current();
-  ASSERT(isolate != NULL);
-  int32_t result = isolate->random_seed();
-  int32_t new_random_seed = LinearFeedbackShiftRegisterStep(result);
-  isolate->set_random_seed(new_random_seed);
-  return result;
-}
-
-}  // namespace dart
diff --git a/runtime/vm/random.h b/runtime/vm/random.h
deleted file mode 100644
index ca1d039..0000000
--- a/runtime/vm/random.h
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-#ifndef VM_RANDOM_H_
-#define VM_RANDOM_H_
-
-#include "vm/allocation.h"
-
-namespace dart {
-
-class Random : public AllStatic {
- public:
-  static const int32_t kDefaultRandomSeed = 294967;
-
-  // Generate a random number in the range [1, 2^31[ (will never return 0 or a
-  // negative number). Not cryptographically safe.
-  static int32_t RandomInt32();
-};
-
-}  // namespace dart
-
-#endif  // VM_RANDOM_H_
diff --git a/runtime/vm/random_test.cc b/runtime/vm/random_test.cc
deleted file mode 100644
index 2b7f726..0000000
--- a/runtime/vm/random_test.cc
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-#include "platform/assert.h"
-#include "vm/globals.h"
-#include "vm/random.h"
-#include "vm/unit_test.h"
-
-namespace dart {
-
-TEST_CASE(Random) {
-  EXPECT(Random::RandomInt32() != 0);
-}
-
-}  // namespace dart
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index a29c3ae..a99dde7 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -350,10 +350,9 @@
   static bool IsByteArrayClassId(intptr_t index);
   static bool IsExternalByteArrayClassId(intptr_t index);
 
- protected:
+ private:
   uword tags_;  // Various object tags (bits).
 
- private:
   class FreeBit : public BitField<bool, kFreeBit, 1> {};
 
   class MarkBit : public BitField<bool, kMarkBit, 1> {};
@@ -745,9 +744,9 @@
   RawPcDescriptors* pc_descriptors_;
   RawArray* deopt_info_array_;
   RawArray* object_table_;
+  RawArray* static_calls_target_table_;  // (code-offset, function, code).
   RawArray* stackmaps_;
   RawLocalVarDescriptors* var_descriptors_;
-  RawGrowableObjectArray* resolved_static_calls_;
   RawArray* comments_;
   RawObject** to() {
     return reinterpret_cast<RawObject**>(&ptr()->comments_);
@@ -1364,6 +1363,10 @@
     return peer_;
   }
 
+  static intptr_t data_offset() {
+    return OFFSET_OF(ExternalByteArrayData<T>, data_);
+  }
+
  private:
   T* data_;
   void* peer_;
diff --git a/runtime/vm/scanner.cc b/runtime/vm/scanner.cc
index 229dfdf..26920c6 100644
--- a/runtime/vm/scanner.cc
+++ b/runtime/vm/scanner.cc
@@ -11,6 +11,7 @@
 #include "vm/symbols.h"
 #include "vm/thread.h"
 #include "vm/token.h"
+#include "vm/unicode.h"
 
 namespace dart {
 
@@ -174,6 +175,36 @@
 }
 
 
+// This method is used when parsing integers and doubles in Dart code. We
+// are reusing the Scanner's handling of number literals in that situation.
+bool Scanner::IsValidLiteral(const Scanner::GrowableTokenStream& tokens,
+                             Token::Kind literal_kind,
+                             bool* is_positive,
+                             String** value) {
+  if ((tokens.length() == 2) &&
+      (tokens[0].kind == literal_kind) &&
+      (tokens[1].kind == Token::kEOS)) {
+    *is_positive = true;
+    *value = tokens[0].literal;
+    return true;
+  }
+  if ((tokens.length() == 3) &&
+      ((tokens[0].kind == Token::kTIGHTADD) ||
+       (tokens[0].kind == Token::kSUB)) &&
+      (tokens[1].kind == literal_kind) &&
+      (tokens[2].kind == Token::kEOS)) {
+    // Check there is no space between "+/-" and number.
+    if ((tokens[0].offset + 1) != tokens[1].offset) {
+      return false;
+    }
+    *is_positive = tokens[0].kind == Token::kTIGHTADD;
+    *value = tokens[1].literal;
+    return true;
+  }
+  return false;
+}
+
+
 void Scanner::ReadChar() {
   if (lookahead_pos_ < source_length_) {
     if (c0_ == '\n') {
@@ -438,7 +469,7 @@
 }
 
 
-bool Scanner::ScanHexDigits(int digits, uint32_t* value) {
+bool Scanner::ScanHexDigits(int digits, int32_t* value) {
   *value = 0;
   for (int i = 0; i < digits; ++i) {
     ReadChar();
@@ -453,7 +484,7 @@
 }
 
 
-bool Scanner::ScanHexDigits(int min_digits, int max_digits, uint32_t* value) {
+bool Scanner::ScanHexDigits(int min_digits, int max_digits, int32_t* value) {
   *value = 0;
   ReadChar();
   for (int i = 0; i < max_digits; ++i) {
@@ -472,7 +503,7 @@
 }
 
 
-void Scanner::ScanEscapedCodePoint(uint32_t* code_point) {
+void Scanner::ScanEscapedCodePoint(int32_t* code_point) {
   ASSERT(c0_ == 'u' || c0_ == 'x');
   bool is_valid;
   if (c0_ == 'x') {
@@ -498,7 +529,7 @@
 
 
 void Scanner::ScanLiteralStringChars(bool is_raw) {
-  GrowableArray<uint32_t> string_chars(64);
+  GrowableArray<int32_t> string_chars(64);
 
   ASSERT(IsScanningString());
   // We are at the first character of a string literal piece. A string literal
@@ -511,7 +542,7 @@
     }
     if (c0_ == '\\' && !is_raw) {
       // Parse escape sequence.
-      uint32_t escape_char = '\0';
+      int32_t escape_char = '\0';
       ReadChar();
       switch (c0_) {
         case 'n':
@@ -852,8 +883,11 @@
           ScanNumber(false);
         } else {
           char msg[128];
+          char utf8_char[5];
+          int len = Utf8::Encode(c0_, utf8_char);
+          utf8_char[len] = '\0';
           OS::SNPrint(msg, sizeof(msg),
-                      "unexpected character: %c  (%02x)\n", c0_, c0_);
+                      "unexpected character: '%s' (U+%04X)\n", utf8_char, c0_);
           ErrorMsg(msg);
           ReadChar();
         }
diff --git a/runtime/vm/scanner.h b/runtime/vm/scanner.h
index 5700475..5f1f75e 100644
--- a/runtime/vm/scanner.h
+++ b/runtime/vm/scanner.h
@@ -96,6 +96,13 @@
   // Return true if str is an identifier.
   static bool IsIdent(const String& str);
 
+  // Does the token stream contain a valid literal. This is used to implement
+  // the Dart methods int.parse and double.parse.
+  static bool IsValidLiteral(const Scanner::GrowableTokenStream& tokens,
+                             Token::Kind literal_kind,
+                             bool* is_positive,
+                             String** value);
+
  private:
   struct ScanContext {
     ScanContext* next;
@@ -171,13 +178,13 @@
   void ScanLiteralStringChars(bool is_raw);
 
   // Reads a fixed number of hexadecimal digits.
-  bool ScanHexDigits(int digits, uint32_t* value);
+  bool ScanHexDigits(int digits, int32_t* value);
 
   // Reads a variable number of hexadecimal digits.
-  bool ScanHexDigits(int min_digits, int max_digits, uint32_t* value);
+  bool ScanHexDigits(int min_digits, int max_digits, int32_t* value);
 
   // Reads an escaped code point from within a string literal.
-  void ScanEscapedCodePoint(uint32_t* escaped_char);
+  void ScanEscapedCodePoint(int32_t* escaped_char);
 
   // Reads identifier.
   RawString* ConsumeIdentChars(bool allow_dollar);
diff --git a/runtime/vm/snapshot.cc b/runtime/vm/snapshot.cc
index c11e321..044d34b 100644
--- a/runtime/vm/snapshot.cc
+++ b/runtime/vm/snapshot.cc
@@ -818,7 +818,7 @@
   if (class_id >= kNumPredefinedCids) {
     if (Class::IsSignatureClass(cls)) {
       // We do not allow closure objects in an isolate message.
-      set_exception_type(Exceptions::kArgumentError);
+      set_exception_type(Exceptions::kArgument);
       // TODO(6726): Allocate these constant strings once in the VM isolate.
       set_exception_msg("Illegal argument in isolate message"
                         " : (object is a closure)");
@@ -1073,7 +1073,7 @@
   if (class_id >= kNumPredefinedCids) {
     if (Class::IsSignatureClass(cls)) {
       // We do not allow closure objects in an isolate message.
-      set_exception_type(Exceptions::kArgumentError);
+      set_exception_type(Exceptions::kArgument);
       // TODO(6726): Allocate these constant strings once in the VM isolate.
       set_exception_msg("Illegal argument in isolate message"
                         " : (object is a closure)");
@@ -1081,7 +1081,7 @@
     }
     if (cls->ptr()->num_native_fields_ != 0) {
       // We do not allow objects with native fields in an isolate message.
-      set_exception_type(Exceptions::kArgumentError);
+      set_exception_type(Exceptions::kArgument);
       // TODO(6726): Allocate these constant strings once in the VM isolate.
       set_exception_msg("Illegal argument in isolate message"
                         " : (object extends NativeWrapper)");
diff --git a/runtime/vm/snapshot_test.cc b/runtime/vm/snapshot_test.cc
index 083b28f..07326ae 100644
--- a/runtime/vm/snapshot_test.cc
+++ b/runtime/vm/snapshot_test.cc
@@ -528,13 +528,13 @@
 TEST_CASE(SerializeString) {
   TestString("This string shall be serialized");
   TestString("æøå");  // This file is UTF-8 encoded.
-  char data[] = {0x01,
-                 0x7f,
-                 0xc2, 0x80,         // 0x80
-                 0xdf, 0xbf,         // 0x7ff
-                 0xe0, 0xa0, 0x80,   // 0x800
-                 0xef, 0xbf, 0xbf,   // 0xffff
-                 0x00};              // String termination.
+  const char* data = "\x01"
+                     "\x7F"
+                     "\xC2\x80"       // U+0080
+                     "\xDF\xBF"       // U+07FF
+                     "\xE0\xA0\x80"   // U+0800
+                     "\xEF\xBF\xBF";  // U+FFFF
+
   TestString(data);
   // TODO(sgjesse): Add tests with non-BMP characters.
 }
@@ -1030,7 +1030,7 @@
 
 UNIT_TEST_CASE(ScriptSnapshot) {
   const char* kLibScriptChars =
-      "#library('dart:import-lib');"
+      "library dart_import_lib;"
       "class LibFields  {"
       "  LibFields(int i, int j) : fld1 = i, fld2 = j {}"
       "  int fld1;"
@@ -1095,7 +1095,7 @@
     Dart_EnterScope();  // Start a Dart API scope for invoking API functions.
 
     // Load the library.
-    Dart_Handle import_lib = Dart_LoadLibrary(NewString("dart:import-lib"),
+    Dart_Handle import_lib = Dart_LoadLibrary(NewString("dart_import_lib"),
                                               NewString(kLibScriptChars));
     EXPECT_VALID(import_lib);
 
@@ -1701,7 +1701,7 @@
 UNIT_TEST_CASE(DartGeneratedListMessagesWithBackref) {
   const int kArrayLength = 10;
   static const char* kScriptChars =
-      "#import('dart:scalarlist');\n"
+      "import 'dart:scalarlist';\n"
       "final int kArrayLength = 10;\n"
       "getStringList() {\n"
       "  var s = 'Hello, world!';\n"
@@ -1872,7 +1872,7 @@
 UNIT_TEST_CASE(DartGeneratedArrayLiteralMessagesWithBackref) {
   const int kArrayLength = 10;
   static const char* kScriptChars =
-      "#import('dart:scalarlist');\n"
+      "import 'dart:scalarlist';\n"
       "final int kArrayLength = 10;\n"
       "getStringList() {\n"
       "  var s = 'Hello, world!';\n"
@@ -1911,7 +1911,7 @@
       "getMixedList() {\n"
       "  var list = [];\n"
       "  for (var i = 0; i < kArrayLength; i++) {\n"
-      "    list.add(((i % 2) == 0) ? 'A' : 2.72);\n"
+      "    list.add(((i % 2) == 0) ? '.' : 2.72);\n"
       "  }\n"
       "  return list;\n"
       "}\n"
@@ -2017,7 +2017,7 @@
         if ((i % 2) == 0) {
           EXPECT_EQ(root->value.as_array.values[0], element);
           EXPECT_EQ(Dart_CObject::kString, element->type);
-          EXPECT_STREQ("A", element->value.as_string);
+          EXPECT_STREQ(".", element->value.as_string);
         } else {
           EXPECT_EQ(root->value.as_array.values[1], element);
           EXPECT_EQ(Dart_CObject::kDouble, element->type);
@@ -2048,7 +2048,7 @@
   // Create a native port for posting from C to Dart
   TestIsolateScope __test_isolate__;
   const char* kScriptChars =
-      "#import('dart:isolate');\n"
+      "import 'dart:isolate';\n"
       "main() {\n"
       "  var messageCount = 0;\n"
       "  var exception = '';\n"
@@ -2107,7 +2107,7 @@
   EXPECT(Dart_PostCObject(send_port_id, &object));
 
   // Try to post an invalid UTF-8 sequence (lead surrogate).
-  char data[] = {0xed, 0xa0, 0x80, 0};  // 0xd800
+  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));
diff --git a/runtime/vm/stub_code_ia32.cc b/runtime/vm/stub_code_ia32.cc
index 79badc1..f354cab 100644
--- a/runtime/vm/stub_code_ia32.cc
+++ b/runtime/vm/stub_code_ia32.cc
@@ -183,48 +183,19 @@
 
 
 // Input parameters:
-//   ECX: function object.
 //   EDX: arguments descriptor array (num_args is first Smi element).
 void StubCode::GenerateCallStaticFunctionStub(Assembler* assembler) {
   const Immediate raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
-
-  __ movl(EAX, FieldAddress(ECX, Function::code_offset()));
-  __ cmpl(EAX, raw_null);
-  Label function_compiled;
-  __ j(NOT_EQUAL, &function_compiled, Assembler::kNearJump);
-
-  // Create a stub frame as we are pushing some objects on the stack before
-  // calling into the runtime.
   AssemblerMacros::EnterStubFrame(assembler);
-
   __ pushl(EDX);  // Preserve arguments descriptor array.
-  __ pushl(ECX);
-  __ CallRuntime(kCompileFunctionRuntimeEntry);
-  __ popl(ECX);  // Restore read-only function object argument in ECX.
-  __ popl(EDX);  // Restore arguments descriptor array.
-  // Restore EAX.
-  __ movl(EAX, FieldAddress(ECX, Function::code_offset()));
-
-  // Remove the stub frame as we are about to jump to the dart function.
-  __ LeaveFrame();
-
-  __ Bind(&function_compiled);
-  // Patch caller.
-
-  // Create a stub frame as we are pushing some objects on the stack before
-  // calling into the runtime.
-  AssemblerMacros::EnterStubFrame(assembler);
-
-  __ pushl(EDX);  // Preserve arguments descriptor array.
-  __ pushl(ECX);  // Preserve function object.
+  __ pushl(raw_null);  // Setup space on stack for return value.
   __ CallRuntime(kPatchStaticCallRuntimeEntry);
-  __ popl(ECX);  // Restore function object argument in ECX.
+  __ popl(EAX);  // Get Code object result.
   __ popl(EDX);  // Restore arguments descriptor array.
   // Remove the stub frame as we are about to jump to the dart function.
   __ LeaveFrame();
 
-  __ movl(EAX, FieldAddress(ECX, Function::code_offset()));
   __ movl(ECX, FieldAddress(EAX, Code::instructions_offset()));
   __ addl(ECX, Immediate(Instructions::HeaderSize() - kHeapObjectTag));
   __ jmp(ECX);
@@ -233,20 +204,18 @@
 
 // Called from a static call only when an invalid code has been entered
 // (invalid because its function was optimized or deoptimized).
-// ECX: function object.
 // EDX: arguments descriptor array (num_args is first Smi element).
 void StubCode::GenerateFixCallersTargetStub(Assembler* assembler) {
+  const Immediate raw_null =
+      Immediate(reinterpret_cast<intptr_t>(Object::null()));
   // Create a stub frame as we are pushing some objects on the stack before
   // calling into the runtime.
   AssemblerMacros::EnterStubFrame(assembler);
   __ pushl(EDX);  // Preserve arguments descriptor array.
-  __ pushl(ECX);  // Preserve target function.
-  __ pushl(ECX);  // Target function.
+  __ pushl(raw_null);  // Setup space on stack for return value.
   __ CallRuntime(kFixCallersTargetRuntimeEntry);
-  __ popl(EAX);  // discard argument.
-  __ popl(EAX);  // Restore function.
+  __ popl(EAX);  // Get Code object.
   __ popl(EDX);  // Restore arguments descriptor array.
-  __ movl(EAX, FieldAddress(EAX, Function::code_offset()));
   __ movl(EAX, FieldAddress(EAX, Code::instructions_offset()));
   __ addl(EAX, Immediate(Instructions::HeaderSize() - kHeapObjectTag));
   __ LeaveFrame();
@@ -1816,23 +1785,23 @@
 }
 
 
-//  ECX: Function object.
 //  EDX: Arguments array.
 //  TOS(0): return address (Dart code).
 void StubCode::GenerateBreakpointStaticStub(Assembler* assembler) {
   // Create a stub frame as we are pushing some objects on the stack before
   // calling into the runtime.
   AssemblerMacros::EnterStubFrame(assembler);
-  __ pushl(EDX);
-  __ pushl(ECX);
+  __ pushl(EDX);  // Preserve arguments descriptor.
+  const Immediate raw_null =
+      Immediate(reinterpret_cast<intptr_t>(Object::null()));
+  __ pushl(raw_null);  // Room for result.
   __ CallRuntime(kBreakpointStaticHandlerRuntimeEntry);
-  __ popl(ECX);
-  __ popl(EDX);
+  __ popl(EAX);  // Code object.
+  __ popl(EDX);  // Restore arguments descriptor.
   __ LeaveFrame();
 
   // Now call the static function. The breakpoint handler function
   // ensures that the call target is compiled.
-  __ movl(EAX, FieldAddress(ECX, Function::code_offset()));
   __ movl(ECX, FieldAddress(EAX, Code::instructions_offset()));
   __ addl(ECX, Immediate(Instructions::HeaderSize() - kHeapObjectTag));
   __ jmp(ECX);
diff --git a/runtime/vm/stub_code_x64.cc b/runtime/vm/stub_code_x64.cc
index 5048aa5..65ea307 100644
--- a/runtime/vm/stub_code_x64.cc
+++ b/runtime/vm/stub_code_x64.cc
@@ -182,44 +182,18 @@
 
 
 // Input parameters:
-//   RBX: function object.
 //   R10: arguments descriptor array (num_args is first Smi element).
 void StubCode::GenerateCallStaticFunctionStub(Assembler* assembler) {
   const Immediate raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
-
-  __ movq(RAX, FieldAddress(RBX, Function::code_offset()));
-  __ cmpq(RAX, raw_null);
-  Label function_compiled;
-  __ j(NOT_EQUAL, &function_compiled, Assembler::kNearJump);
-
-  // Create a stub frame as we are pushing some objects on the stack before
-  // calling into the runtime.
   AssemblerMacros::EnterStubFrame(assembler);
-
   __ pushq(R10);  // Preserve arguments descriptor array.
-  __ pushq(RBX);
-  __ CallRuntime(kCompileFunctionRuntimeEntry);
-  __ popq(RBX);  // Restore read-only function object argument in RBX.
-  __ popq(R10);  // Restore arguments descriptor array.
-  // Restore RAX.
-  __ movq(RAX, FieldAddress(RBX, Function::code_offset()));
-
-  // Remove the stub frame as we are about to jump to the dart function.
-  __ LeaveFrame();
-
-  __ Bind(&function_compiled);
-  // Patch caller.
-  AssemblerMacros::EnterStubFrame(assembler);
-
-  __ pushq(R10);  // Preserve arguments descriptor array.
-  __ pushq(RBX);  // Preserve function object.
+  __ pushq(raw_null);  // Setup space on stack for return value.
   __ CallRuntime(kPatchStaticCallRuntimeEntry);
-  __ popq(RBX);  // Restore function object argument in RBX.
+  __ popq(RAX);  // Get Code object result.
   __ popq(R10);  // Restore arguments descriptor array.
   // Remove the stub frame as we are about to jump to the dart function.
   __ LeaveFrame();
-  __ movq(RAX, FieldAddress(RBX, Function::code_offset()));
 
   __ movq(RBX, FieldAddress(RAX, Code::instructions_offset()));
   __ addq(RBX, Immediate(Instructions::HeaderSize() - kHeapObjectTag));
@@ -229,18 +203,16 @@
 
 // Called from a static call only when an invalid code has been entered
 // (invalid because its function was optimized or deoptimized).
-// RBX: function object.
 // R10: arguments descriptor array (num_args is first Smi element).
 void StubCode::GenerateFixCallersTargetStub(Assembler* assembler) {
+  const Immediate raw_null =
+      Immediate(reinterpret_cast<intptr_t>(Object::null()));
   AssemblerMacros::EnterStubFrame(assembler);
   __ pushq(R10);  // Preserve arguments descriptor array.
-  __ pushq(RBX);  // Preserve target function.
-  __ pushq(RBX);  // Target function.
+  __ pushq(raw_null);  // Setup space on stack for return value.
   __ CallRuntime(kFixCallersTargetRuntimeEntry);
-  __ popq(RAX);  // discard argument.
-  __ popq(RAX);  // Restore function.
+  __ popq(RAX);  // Get Code object.
   __ popq(R10);  // Restore arguments descriptor array.
-  __ movq(RAX, FieldAddress(RAX, Function::code_offset()));
   __ movq(RAX, FieldAddress(RAX, Code::instructions_offset()));
   __ addq(RAX, Immediate(Instructions::HeaderSize() - kHeapObjectTag));
   __ LeaveFrame();
@@ -1787,21 +1759,21 @@
   GenerateNArgsCheckInlineCacheStub(assembler, 1);
 }
 
-//  RBX: Function object.
 //  R10: Arguments array.
 //  TOS(0): return address (Dart code).
 void StubCode::GenerateBreakpointStaticStub(Assembler* assembler) {
+  const Immediate raw_null =
+      Immediate(reinterpret_cast<intptr_t>(Object::null()));
   AssemblerMacros::EnterStubFrame(assembler);
-  __ pushq(R10);
-  __ pushq(RBX);
+  __ pushq(R10);  // Preserve arguments descriptor.
+  __ pushq(raw_null);  // Room for result.
   __ CallRuntime(kBreakpointStaticHandlerRuntimeEntry);
-  __ popq(RBX);
-  __ popq(R10);
+  __ popq(RAX);  // Code object.
+  __ popq(R10);  // Restore arguments descriptor.
   __ LeaveFrame();
 
   // Now call the static function. The breakpoint handler function
   // ensures that the call target is compiled.
-  __ movq(RAX, FieldAddress(RBX, Function::code_offset()));
   __ movq(RBX, FieldAddress(RAX, Code::instructions_offset()));
   __ addq(RBX, Immediate(Instructions::HeaderSize() - kHeapObjectTag));
   __ jmp(RBX);
diff --git a/runtime/vm/symbols.cc b/runtime/vm/symbols.cc
index 33c0ac6..c7da37c 100644
--- a/runtime/vm/symbols.cc
+++ b/runtime/vm/symbols.cc
@@ -26,8 +26,8 @@
 };
 
 
-const char* Symbols::Name(intptr_t symbol) {
-  ASSERT((symbol > kIllegal) && (symbol < kMaxId));
+const char* Symbols::Name(SymbolId symbol) {
+  ASSERT((symbol > kIllegal) && (symbol < kMaxPredefinedId));
   return names[symbol];
 }
 
@@ -40,12 +40,12 @@
   SetupSymbolTable(isolate);
 
   // Create all predefined symbols.
-  ASSERT((sizeof(names) / sizeof(const char*)) == Symbols::kMaxId);
+  ASSERT((sizeof(names) / sizeof(const char*)) == Symbols::kMaxPredefinedId);
   ObjectStore* object_store = isolate->object_store();
   Array& symbol_table = Array::Handle();
   dart::String& str = String::Handle();
 
-  for (intptr_t i = 1; i < Symbols::kMaxId; i++) {
+  for (intptr_t i = 1; i < Symbols::kMaxPredefinedId; i++) {
     // The symbol_table needs to be reloaded as it might have grown in the
     // previous iteration.
     symbol_table = object_store->symbol_table();
@@ -54,6 +54,11 @@
     predefined_[i] = str.raw();
   }
   Object::RegisterSingletonClassNames();
+
+  for (int32_t c = 0; c <= kMaxOneCharCodeSymbol; c++) {
+    ASSERT(kMaxPredefinedId + c < kMaxId);
+    predefined_[kMaxPredefinedId + c] = New(&c, 1);
+  }
 }
 
 
@@ -107,7 +112,7 @@
     Utf8::DecodeToLatin1(utf8_array, str_len, characters, len);
     return New(characters, len);
   }
-  ASSERT((type == Utf8::kBMP) || (type == Utf8::kSMP));
+  ASSERT((type == Utf8::kBMP) || (type == Utf8::kSupplementary));
   uint16_t* characters = zone->Alloc<uint16_t>(len);
   Utf8::DecodeToUTF16(utf8_array, str_len, characters, len);
   return New(characters, len);
@@ -117,7 +122,6 @@
 template<typename T>
 RawString* Symbols::New(const T* characters, intptr_t len) {
   Isolate* isolate = Isolate::Current();
-  ASSERT(isolate != Dart::vm_isolate());
   String& symbol = String::Handle(isolate, String::null());
   Array& symbol_table = Array::Handle(isolate, Array::null());
 
@@ -148,7 +152,7 @@
 
 template RawString* Symbols::New(const uint8_t* characters, intptr_t len);
 template RawString* Symbols::New(const uint16_t* characters, intptr_t len);
-template RawString* Symbols::New(const uint32_t* characters, intptr_t len);
+template RawString* Symbols::New(const int32_t* characters, intptr_t len);
 
 
 RawString* Symbols::New(const String& str) {
@@ -200,6 +204,14 @@
 }
 
 
+RawString* Symbols::FromCharCode(int32_t char_code) {
+  if (char_code > kMaxOneCharCodeSymbol) {
+    return New(&char_code, 1);
+  }
+  return predefined_[kNullCharId + char_code];
+}
+
+
 void Symbols::GrowSymbolTable(const Array& symbol_table) {
   // TODO(iposva): Avoid exponential growth.
   intptr_t table_size = symbol_table.Length() - 1;
@@ -277,7 +289,7 @@
                                      intptr_t len,
                                      intptr_t hash);
 template intptr_t Symbols::FindIndex(const Array& symbol_table,
-                                     const uint32_t* characters,
+                                     const int32_t* characters,
                                      intptr_t len,
                                      intptr_t hash);
 
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index 16c1fd4..0e6cc21 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -42,8 +42,8 @@
     "AbstractClassInstantiationErrorImplementation")                           \
   V(NoSuchMethodError, "NoSuchMethodErrorImplementation")                      \
   V(ThrowNew, "_throwNew")                                                     \
+  V(List, "List")                                                              \
   V(ListLiteralFactory, "List._fromLiteral")                                   \
-  V(ListImplementation, "_ListImpl")                                           \
   V(ListFactory, "List.")                                                      \
   V(MapImplementation, "_HashMapImpl")                                         \
   V(MapLiteralFactory, "Map._fromLiteral")                                     \
@@ -146,16 +146,19 @@
 // without having to maintain copies in each isolate.
 class Symbols : public AllStatic {
  public:
+  enum { kMaxOneCharCodeSymbol = 0xFF };
+
   // List of strings that are pre created in the vm isolate.
-  enum {
+  enum SymbolId {
     kIllegal = 0,
 
 #define DEFINE_SYMBOL_INDEX(symbol, literal)                                   \
     k##symbol,
 PREDEFINED_SYMBOLS_LIST(DEFINE_SYMBOL_INDEX)
 #undef DEFINE_SYMBOL_INDEX
-
-    kMaxId,
+    kMaxPredefinedId,
+    kNullCharId = kMaxPredefinedId,
+    kMaxId = kNullCharId + kMaxOneCharCodeSymbol + 1,
   };
 
   // Access methods for symbols stored in the vm isolate.
@@ -183,11 +186,17 @@
                         intptr_t length);
 
   // Returns char* of predefined symbol.
-  static const char* Name(intptr_t symbol);
+  static const char* Name(SymbolId symbol);
+
+  static RawString* FromCharCode(int32_t char_code);
+
+  static RawString** PredefinedAddress() {
+    return reinterpret_cast<RawString**>(&predefined_);
+  }
 
  private:
   enum {
-    kInitialVMIsolateSymtabSize = ((Symbols::kMaxId + 15) & -16),
+    kInitialVMIsolateSymtabSize = ((kMaxId + 15) & -16),
     kInitialSymtabSize = 256
   };
 
@@ -218,11 +227,11 @@
   static RawObject* GetVMSymbol(intptr_t object_id);
   static bool IsVMSymbolId(intptr_t object_id) {
     return (object_id >= kMaxPredefinedObjectIds &&
-            object_id < (kMaxPredefinedObjectIds + Symbols::kMaxId));
+            object_id < (kMaxPredefinedObjectIds + kMaxId));
   }
 
   // List of symbols that are stored in the vm isolate for easy access.
-  static RawString* predefined_[Symbols::kMaxId];
+  static RawString* predefined_[kMaxId];
 
   friend class SnapshotReader;
   friend class SnapshotWriter;
diff --git a/runtime/vm/unicode.cc b/runtime/vm/unicode.cc
index e2e741d8..3129a06 100644
--- a/runtime/vm/unicode.cc
+++ b/runtime/vm/unicode.cc
@@ -64,18 +64,12 @@
 }
 
 
-static bool IsSmpSequenceStart(uint8_t code_unit) {
+static bool IsSupplementarySequenceStart(uint8_t code_unit) {
   // Check is codepoint is >= U+10000.
   return (code_unit >= 0xF0);
 }
 
 
-// Returns true if the code point is a high- or low-surrogate.
-static bool IsSurrogate(uint32_t code_point) {
-  return (code_point & 0xfffff800) == 0xd800;
-}
-
-
 // Returns true if the code point value is above Plane 17.
 static bool IsOutOfRange(uint32_t code_point) {
   return (code_point > 0x10FFFF);
@@ -88,14 +82,6 @@
 }
 
 
-void Utf8::ConvertUTF32ToUTF16(int32_t codepoint, uint16_t* dst) {
-  ASSERT(codepoint > kMaxBmpCodepoint);
-  ASSERT(dst != NULL);
-  dst[0] = (Utf8::kLeadOffset + (codepoint >> 10));
-  dst[1] = (0xDC00 + (codepoint & 0x3FF));
-}
-
-
 // Returns a count of the number of UTF-8 trail bytes.
 intptr_t Utf8::CodePointCount(const uint8_t* utf8_array,
                               intptr_t array_len,
@@ -108,8 +94,8 @@
       ++len;
     }
     if (!IsLatin1SequenceStart(code_unit)) {  // > U+00FF
-      if (IsSmpSequenceStart(code_unit)) {  // >= U+10000
-        char_type = kSMP;
+      if (IsSupplementarySequenceStart(code_unit)) {  // >= U+10000
+        char_type = kSupplementary;
         ++len;
       } else if (char_type == kLatin1) {
         char_type = kBMP;
@@ -144,7 +130,7 @@
             (j == num_trail_bytes) &&
             !IsOutOfRange(ch) &&
             !IsNonShortestForm(ch, j) &&
-            !IsSurrogate(ch))) {
+            !Utf16::IsSurrogate(ch))) {
         return false;
       }
     }
@@ -169,8 +155,9 @@
 
 intptr_t Utf8::Length(const String& str) {
   intptr_t length = 0;
-  for (intptr_t i = 0; i < str.Length(); ++i) {
-    int32_t ch = str.CharAt(i);
+  String::CodePointIterator it(str);
+  while (it.Next()) {
+    int32_t ch = it.Current();
     length += Utf8::Length(ch);
   }
   return length;
@@ -205,8 +192,9 @@
 
 intptr_t Utf8::Encode(const String& src, char* dst, intptr_t len) {
   intptr_t pos = 0;
-  for (intptr_t i = 0; i < src.Length(); ++i) {
-    intptr_t ch = src.CharAt(i);
+  String::CodePointIterator it(src);
+  while (it.Next()) {
+    int32_t ch = it.Current();
     intptr_t num_bytes = Utf8::Length(ch);
     if (pos + num_bytes > len) {
       break;
@@ -224,7 +212,7 @@
   uint32_t ch = utf8_array[0] & 0xFF;
   intptr_t i = 1;
   if (ch >= 0x80) {
-    int32_t num_trail_bytes = kTrailBytes[ch];
+    intptr_t num_trail_bytes = kTrailBytes[ch];
     bool is_malformed = false;
     for (; i < num_trail_bytes; ++i) {
       if (i < array_len) {
@@ -241,7 +229,7 @@
           (i == num_trail_bytes) &&
           !IsOutOfRange(ch) &&
           !IsNonShortestForm(ch, i) &&
-          !IsSurrogate(ch))) {
+          !Utf16::IsSurrogate(ch))) {
       *dst = -1;
       return 0;
     }
@@ -284,13 +272,13 @@
   intptr_t num_bytes;
   for (; (i < array_len) && (j < len); i += num_bytes, ++j) {
     int32_t ch;
-    bool is_smp = IsSmpSequenceStart(utf8_array[i]);
+    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
     }
-    if (is_smp) {
-      ConvertUTF32ToUTF16(ch, &(dst[j]));
+    if (is_supplementary) {
+      Utf16::Encode(ch, &dst[j]);
       j = j + 1;
     } else {
       dst[j] = ch;
@@ -305,7 +293,7 @@
 
 bool Utf8::DecodeToUTF32(const uint8_t* utf8_array,
                          intptr_t array_len,
-                         uint32_t* dst,
+                         int32_t* dst,
                          intptr_t len) {
   intptr_t i = 0;
   intptr_t j = 0;
@@ -324,4 +312,12 @@
   return true;  // success
 }
 
+
+void Utf16::Encode(int32_t codepoint, uint16_t* dst) {
+  ASSERT(codepoint > kMaxBmpCodepoint);
+  ASSERT(dst != NULL);
+  dst[0] = (Utf16::kLeadSurrogateOffset + (codepoint >> 10));
+  dst[1] = (0xDC00 + (codepoint & 0x3FF));
+}
+
 }  // namespace dart
diff --git a/runtime/vm/unicode.h b/runtime/vm/unicode.h
index 28beaad..03a4b29 100644
--- a/runtime/vm/unicode.h
+++ b/runtime/vm/unicode.h
@@ -15,20 +15,16 @@
 class Utf8 : AllStatic {
  public:
   enum Type {
-    kLatin1 = 0,  // Latin-1 character set.
-    kBMP,  // Basic Multilingual Plane.
-    kSMP,  // Supplementary Multilingual Plane.
+    kLatin1 = 0,  // Latin-1 code point [U+0000, U+00FF].
+    kBMP,  // Basic Multilingual Plane code point [U+0000, U+FFFF].
+    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 const intptr_t kMaxBmpCodepoint  = 0xffff;
-  static const int32_t kLeadOffset = (0xD800 - (0x10000 >> 10));
-  static const int32_t kSurrogateOffset = (0x10000 - (0xD800 << 10) - 0xDC00);
 
-  static void ConvertUTF32ToUTF16(int32_t codepoint, uint16_t* dst);
   static intptr_t CodePointCount(const uint8_t* utf8_array,
                                  intptr_t array_len,
                                  Type* type);
@@ -56,10 +52,10 @@
                             intptr_t len);
   static bool DecodeToUTF32(const uint8_t* utf8_array,
                             intptr_t array_len,
-                            uint32_t* dst,
+                            int32_t* dst,
                             intptr_t len);
   static bool DecodeCStringToUTF32(const char* str,
-                                   uint32_t* dst,
+                                   int32_t* dst,
                                    intptr_t len) {
     ASSERT(str != NULL);
     intptr_t array_len = strlen(str);
@@ -69,6 +65,44 @@
 };
 
 
+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;
+  }
+
+  // Returns true if ch is a lead or trail surrogate.
+  static bool IsSurrogate(int32_t ch) {
+    return (ch & 0xFFFFF800) == 0xD800;
+  }
+
+  // Returns true if ch is a lead surrogate.
+  static bool IsLeadSurrogate(int32_t ch) {
+    return (ch & 0xFFFFFC00) == 0xD800;
+  }
+
+  // Returns true if ch is a low surrogate.
+  static bool IsTrailSurrogate(int32_t ch) {
+    return (ch & 0xFFFFFC00) == 0xDC00;
+  }
+
+  // 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);
+  }
+
+  // Encodes a single code point.
+  static void Encode(int32_t codepoint, uint16_t* dst);
+};
+
+
 class CaseMapping : AllStatic {
  public:
   // Maps a code point to uppercase.
diff --git a/runtime/vm/unicode_test.cc b/runtime/vm/unicode_test.cc
index 967e9ca..582a2a6 100644
--- a/runtime/vm/unicode_test.cc
+++ b/runtime/vm/unicode_test.cc
@@ -12,8 +12,8 @@
   // Examples from the Unicode specification, chapter 3
   {
     const char* src = "\x41\xC3\xB1\x42";
-    uint32_t expected[] = { 0x41, 0xF1, 0x42 };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x41, 0xF1, 0x42 };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(is_valid);
@@ -22,8 +22,8 @@
 
   {
     const char* src = "\x4D";
-    uint32_t expected[] = { 0x4D };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x4D };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(is_valid);
@@ -32,8 +32,8 @@
 
   {
     const char* src = "\xD0\xB0";
-    uint32_t expected[] = { 0x430 };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x430 };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(is_valid);
@@ -42,8 +42,8 @@
 
   {
     const char* src = "\xE4\xBA\x8C";
-    uint32_t expected[] = { 0x4E8C };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x4E8C };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(is_valid);
@@ -52,8 +52,8 @@
 
   {
     const char* src = "\xF0\x90\x8C\x82";
-    uint32_t expected[] = { 0x10302 };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x10302 };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(is_valid);
@@ -62,8 +62,8 @@
 
   {
     const char* src = "\x4D\xD0\xB0\xE4\xBA\x8C\xF0\x90\x8C\x82";
-    uint32_t expected[] = { 0x4D, 0x430, 0x4E8C, 0x10302 };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x4D, 0x430, 0x4E8C, 0x10302 };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(is_valid);
@@ -75,10 +75,10 @@
     const char* src = "\xD7\x92\xD7\x9C\xD7\xA2\xD7\x93"
                       "\x20"
                       "\xD7\x91\xD7\xA8\xD7\x9B\xD7\x94";
-    uint32_t expected[] = { 0x5D2, 0x5DC, 0x5E2, 0x5D3,
-                            0x20,
-                            0x5D1, 0x5E8, 0x5DB, 0x5D4 };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x5D2, 0x5DC, 0x5E2, 0x5D3,
+                           0x20,
+                           0x5D1, 0x5E8, 0x5DB, 0x5D4 };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(is_valid);
@@ -90,8 +90,8 @@
   // 1 - Some correct UTF-8 text
   {
     const char* src = "\xCE\xBA\xE1\xBD\xB9\xCF\x83\xCE\xBC\xCE\xB5";
-    uint32_t expected[] = { 0x3BA, 0x1F79, 0x3C3, 0x3BC, 0x3B5 };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x3BA, 0x1F79, 0x3C3, 0x3BC, 0x3B5 };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(is_valid);
@@ -105,8 +105,8 @@
   // 2.1.1 - 1 byte (U-00000000):        "\x00"
   {
     const char* src = "\x00";
-    uint32_t expected[] = { 0x0 };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x0 };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0xFF, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(is_valid);
@@ -116,8 +116,8 @@
   // 2.1.2 - 2 bytes (U-00000080):        "\xC2\x80"
   {
     const char* src = "\xC2\x80";
-    uint32_t expected[] = { 0x80 };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x80 };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(is_valid);
@@ -127,8 +127,8 @@
   // 2.1.3 - 3 bytes (U-00000800):        "\xE0\xA0\x80"
   {
     const char* src = "\xE0\xA0\x80";
-    uint32_t expected[] = { 0x800 };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x800 };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(is_valid);
@@ -138,8 +138,8 @@
   // 2.1.4 - 4 bytes (U-00010000):        "\xF0\x90\x80\x80"
   {
     const char* src = "\xF0\x90\x80\x80";
-    uint32_t expected[] = { 0x10000 };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x10000 };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(is_valid);
@@ -149,8 +149,8 @@
   // 2.1.5 - 5 bytes (U-00200000):        "\xF8\x88\x80\x80\x80"
   {
     const char* src = "\xF8\x88\x80\x80\x80";
-    uint32_t expected[] = { 0x200000 };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x200000 };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
@@ -160,8 +160,8 @@
   // 2.1.6 - 6 bytes (U-04000000):        "\xFC\x84\x80\x80\x80\x80"
   {
     const char* src = "\xFC\x84\x80\x80\x80\x80";
-    uint32_t expected[] = { 0x400000 };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x400000 };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
@@ -173,8 +173,8 @@
   // 2.2.1 - 1 byte (U-0000007F):        "\x7F"
   {
     const char* src = "\x7F";
-    uint32_t expected[] = { 0x7F };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x7F };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(is_valid);
@@ -184,8 +184,8 @@
   // 2.2.2 - 2 bytes (U-000007FF):        "\xDF\xBF"
   {
     const char* src = "\xDF\xBF";
-    uint32_t expected[] = { 0x7FF };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x7FF };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(is_valid);
@@ -195,8 +195,8 @@
   // 2.2.3 - 3 bytes (U-0000FFFF):        "\xEF\xBF\xBF"
   {
     const char* src = "\xEF\xBF\xBF";
-    uint32_t expected[] = { 0xFFFF };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0xFFFF };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(is_valid);
@@ -206,8 +206,8 @@
   // 2.2.4 - 4 bytes (U-001FFFFF):        "\xF7\xBF\xBF\xBF"
   {
     const char* src = "\xF7\xBF\xBF\xBF";
-    uint32_t expected[] = { 0x1FFFF };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x1FFFF };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
@@ -217,8 +217,8 @@
   // 2.2.5 - 5 bytes (U-03FFFFFF):        "\xFB\xBF\xBF\xBF\xBF"
   {
     const char* src = "\xFB\xBF\xBF\xBF\xBF";
-    uint32_t expected[] = { 0x3FFFFFF };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x3FFFFFF };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
@@ -228,8 +228,8 @@
   // 2.2.6 - 6 bytes (U-7FFFFFFF):        "\xFD\xBF\xBF\xBF\xBF\xBF"
   {
     const char* src = "\xFD\xBF\xBF\xBF\xBF\xBF";
-    uint32_t expected[] = { 0x7FFFFFF };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x7FFFFFF };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
@@ -241,8 +241,8 @@
   // 2.3.1 - U-0000D7FF = ed 9f bf = "\xED\x9F\xBF"
   {
     const char* src = "\xED\x9F\xBF";
-    uint32_t expected[] = { 0xD7FF };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0xD7FF };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(is_valid);
@@ -252,8 +252,8 @@
   // 2.3.2 - U-0000E000 = ee 80 80 = "\xEE\x80\x80"
   {
     const char* src = "\xEE\x80\x80";
-    uint32_t expected[] = { 0xE000 };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0xE000 };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(is_valid);
@@ -263,8 +263,8 @@
   // 2.3.3 - U-0000FFFD = ef bf bd = "\xEF\xBF\xBD"
   {
     const char* src = "\xEF\xBF\xBD";
-    uint32_t expected[] = { 0xFFFD };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0xFFFD };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(is_valid);
@@ -274,8 +274,8 @@
   // 2.3.4 - U-0010FFFF = f4 8f bf bf = "\xF4\x8F\xBF\xBF"
   {
     const char* src = "\xF4\x8F\xBF\xBF";
-    uint32_t expected[] = { 0x10FFFF };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x10FFFF };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(is_valid);
@@ -285,8 +285,8 @@
   // 2.3.5 - U-00110000 = f4 90 80 80 = "\xF4\x90\x80\x80"
   {
     const char* src = "\xF4\x90\x80\x80";
-    uint32_t expected[] = { 0x110000 };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x110000 };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
@@ -300,8 +300,8 @@
   // 3.1.1 - First continuation byte 0x80: "\x80"
   {
     const char* src = "\x80";
-    uint32_t expected[] = { 0x80 };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x80 };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
@@ -311,8 +311,8 @@
   // 3.1.2 - Last continuation byte 0xbf: "\xBF"
   {
     const char* src = "\xBF";
-    uint32_t expected[] = { 0xBF };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0xBF };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
@@ -322,8 +322,8 @@
   // 3.1.3 - 2 continuation bytes: "\x80\xBF"
   {
     const char* src = "\x80\xBF";
-    uint32_t expected[] = { 0x80, 0xBF };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x80, 0xBF };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
@@ -333,8 +333,8 @@
   // 3.1.4 - 3 continuation bytes: "\x80\xBF\x80"
   {
     const char* src = "\x80\xBF\x80";
-    uint32_t expected[] = { 0x80, 0xBF, 0x80 };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x80, 0xBF, 0x80 };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
@@ -344,8 +344,8 @@
   // 3.1.5 - 4 continuation bytes: "\x80\xBF\x80\xBF"
   {
     const char* src = "\x80\xBF\x80\xBF";
-    uint32_t expected[] = { 0x80, 0xBF, 0x80, 0xBF  };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x80, 0xBF, 0x80, 0xBF  };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
@@ -355,8 +355,8 @@
   // 3.1.6 - 5 continuation bytes: "\x80\xBF\x80\xBF\x80"
   {
     const char* src = "\x80\xBF\x80\xBF\x80";
-    uint32_t expected[] = { 0x80, 0xBF, 0x80, 0xBF, 0x80 };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x80, 0xBF, 0x80, 0xBF, 0x80 };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
@@ -366,8 +366,8 @@
   // 3.1.7 - 6 continuation bytes: "\x80\xBF\x80\xBF\x80\xBF"
   {
     const char* src = "\x80\xBF\x80\xBF\x80\xBF";
-    uint32_t expected[] = { 0x80, 0xBF, 0x80, 0xBF, 0x80, 0xBF };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x80, 0xBF, 0x80, 0xBF, 0x80, 0xBF };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
@@ -377,8 +377,8 @@
   // 3.1.8 - 7 continuation bytes: "\x80\xBF\x80\xBF\x80\xBF\x80"
   {
     const char* src = "\x80\xBF\x80\xBF\x80\xBF\x80";
-    uint32_t expected[] = { 0x80, 0xBF, 0x80, 0xBF, 0x80, 0xBF, 0x80 };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x80, 0xBF, 0x80, 0xBF, 0x80, 0xBF, 0x80 };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
@@ -395,8 +395,8 @@
                       "\xA8\xA9\xAA\xAB\xAC\xAD\xAE\xAF"
                       "\xB0\xB1\xB2\xB3\xB4\xB5\xB6\xB7"
                       "\xB8\xB9\xBA\xBB\xBC\xBD\xBE\xBF";
-    uint32_t expected[] = { 0x0 };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x0 };
+    int32_t dst[ARRAY_SIZE(expected)];
     for (size_t i = 0; i < strlen(src); ++i) {
       memset(dst, 0xFF, sizeof(dst));
       bool is_valid = Utf8::DecodeCStringToUTF32(&src[i], dst, ARRAY_SIZE(dst));
@@ -418,8 +418,8 @@
                       "\xD4\x20\xD5\x20\xD6\x20\xD7\x20"
                       "\xD8\x20\xD9\x20\xDA\x20\xDB\x20"
                       "\xDC\x20\xDD\x20\xDE\x20\xDF\x20";
-    uint32_t expected[] = { 0x0 };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x0 };
+    int32_t dst[ARRAY_SIZE(expected)];
     for (size_t i = 0; i < strlen(src); i += 2) {
       memset(dst, 0xFF, sizeof(dst));
       bool is_valid = Utf8::DecodeCStringToUTF32(&src[i], dst, ARRAY_SIZE(dst));
@@ -435,8 +435,8 @@
                       "\xE4\x20\xE5\x20\xE6\x20\xE7\x20"
                       "\xE8\x20\xE9\x20\xEA\x20\xEB\x20"
                       "\xEC\x20\xED\x20\xEE\x20\xEF\x20";
-    uint32_t expected[] = { 0x0 };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x0 };
+    int32_t dst[ARRAY_SIZE(expected)];
     for (size_t i = 0; i < strlen(src); i += 2) {
       memset(dst, 0xFF, sizeof(dst));
       bool is_valid = Utf8::DecodeCStringToUTF32(&src[i], dst, ARRAY_SIZE(dst));
@@ -450,8 +450,8 @@
   {
     const char* src = "\xF0\x20\xF1\x20\xF2\x20\xF3\x20"
                       "\xF4\x20\xF5\x20\xF6\x20\xF7\x20";
-    uint32_t expected[] = { 0x0 };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x0 };
+    int32_t dst[ARRAY_SIZE(expected)];
     for (size_t i = 0; i < strlen(src); i += 2) {
       memset(dst, 0xFF, sizeof(dst));
       bool is_valid = Utf8::DecodeCStringToUTF32(&src[i], dst, ARRAY_SIZE(dst));
@@ -464,8 +464,8 @@
   //         followed by a space character:
   {
     const char* src = "\xF8\x20\xF9\x20\xFA\x20\xFB\x20";
-    uint32_t expected[] = { 0x0 };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x0 };
+    int32_t dst[ARRAY_SIZE(expected)];
     for (size_t i = 0; i < strlen(src); i += 2) {
       memset(dst, 0xFF, sizeof(dst));
       bool is_valid = Utf8::DecodeCStringToUTF32(&src[i], dst, ARRAY_SIZE(dst));
@@ -478,8 +478,8 @@
   //         followed by a space character:
   {
     const char* src = "\xFC\x20\xFD\x20";
-    uint32_t expected[] = { 0x0 };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x0 };
+    int32_t dst[ARRAY_SIZE(expected)];
     for (size_t i = 0; i < strlen(src); i += 2) {
       memset(dst, 0xFF, sizeof(dst));
       bool is_valid = Utf8::DecodeCStringToUTF32(&src[i], dst, ARRAY_SIZE(dst));
@@ -493,8 +493,8 @@
   // 3.3.1 - 2-byte sequence with last byte missing (U+0000): "\xC0"
   {
     const char* src = "\xC0";
-    uint32_t expected[] = { 0x0 };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x0 };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0xFF, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
@@ -504,8 +504,8 @@
   // 3.3.2 - 3-byte sequence with last byte missing (U+0000): "\xE0\x80"
   {
     const char* src = "\xE0\x80";
-    uint32_t expected[] = { 0x0 };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x0 };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0xFF, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
@@ -515,8 +515,8 @@
   // 3.3.3 - 4-byte sequence with last byte missing (U+0000): "\xF0\x80\x80"
   {
     const char* src = "\xF0\x80\x80";
-    uint32_t expected[] = { 0x0 };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x0 };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0xFF, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
@@ -526,8 +526,8 @@
   // 3.3.4 - 5-byte sequence with last byte missing (U+0000): "\xF8\x80\x80\x80"
   {
     const char* src = "\xF8\x80\x80\x80";
-    uint32_t expected[] = { 0x0 };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x0 };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0xFF, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
@@ -538,8 +538,8 @@
   // "\xFC\x80\x80\x80\x80"
   {
     const char* src = "\xFC\x80\x80\x80\x80";
-    uint32_t expected[] = { 0x0 };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x0 };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0xFF, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
@@ -549,8 +549,8 @@
   // 3.3.6 - 2-byte sequence with last byte missing (U-000007FF): "\xDF"
   {
     const char* src = "\xDF";
-    uint32_t expected[] = { 0x0 };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x0 };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0xFF, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
@@ -560,8 +560,8 @@
   // 3.3.7 - 3-byte sequence with last byte missing (U-0000FFFF): "\xEF\xBF"
   {
     const char* src = "\xEF\xBF";
-    uint32_t expected[] = { 0x0 };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x0 };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0xFF, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
@@ -571,8 +571,8 @@
   // 3.3.8 - 4-byte sequence with last byte missing (U-001FFFFF): "\xF7\xBF\xBF"
   {
     const char* src = "\xF7\xBF\xBF";
-    uint32_t expected[] = { 0x0 };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x0 };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0xFF, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
@@ -583,8 +583,8 @@
   // "\xFB\xBF\xBF\xBF"
   {
     const char* src = "\xFB\xBF\xBF\xBF";
-    uint32_t expected[] = { 0x0 };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x0 };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0xFF, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
@@ -595,8 +595,8 @@
   // "\xFD\xBF\xBF\xBF\xBF"
   {
     const char* src = "\xFD\xBF\xBF\xBF\xBF";
-    uint32_t expected[] = { 0x0 };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x0 };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0xFF, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
@@ -610,8 +610,8 @@
                       "\x80\x80\x80\xDF\xEF\xBF"
                       "\xF7\xBF\xBF\xFB\xBF\xBF"
                       "\xBF\xFD\xBF\xBF\xBF\xBF";
-    uint32_t expected[] = { 0x0 };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x0 };
+    int32_t dst[ARRAY_SIZE(expected)];
     for (size_t i = 0; i < strlen(src); ++i) {
       for (size_t j = 1; j < (strlen(src) - i); ++j) {
         memset(dst, 0xFF, sizeof(dst));
@@ -628,8 +628,8 @@
   // 3.5.1 - fe = "\xFE"
   {
     const char* src = "\xFE";
-    uint32_t expected[] = { 0xFE };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0xFE };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
@@ -639,8 +639,8 @@
   // 3.5.2 - ff = "\xFF"
   {
     const char* src = "\xFF";
-    uint32_t expected[] = { 0xFF };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0xFF };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
@@ -650,8 +650,8 @@
   // 3.5.3 - fe fe ff ff = "\xFE\xFE\xFF\xFF"
   {
     const char* src = "\xFE\xFE\xFF\xFF";
-    uint32_t expected[] = { 0xFF };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0xFF };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
@@ -665,8 +665,8 @@
   // 4.1.1 - U+002F = c0 af             = "\xC0\xAF"
   {
     const char* src = "\xC0\xAF";
-    uint32_t expected[] = { 0x2F };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x2F };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
@@ -676,8 +676,8 @@
   // 4.1.2 - U+002F = e0 80 af          = "\xE0\x80\xAF"
   {
     const char* src = "\xE0\x80\xAF";
-    uint32_t expected[] = { 0x2F };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x2F };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
@@ -687,8 +687,8 @@
   // 4.1.3 - U+002F = f0 80 80 af       = "\xF0\x80\x80\xAF"
   {
     const char* src = "\xF0\x80\x80\xAF";
-    uint32_t expected[] = { 0x2F };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x2F };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
@@ -698,8 +698,8 @@
   // 4.1.4 - U+002F = f8 80 80 80 af    = "\xF8\x80\x80\x80\xAF"
   {
     const char* src = "\xF8\x80\x80\x80\xAF";
-    uint32_t expected[] = { 0x2F };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x2F };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
@@ -709,8 +709,8 @@
   // 4.1.5 - U+002F = fc 80 80 80 80 af = "\xFC\x80\x80\x80\x80\xAF"
   {
     const char* src = "\xFC\x80\x80\x80\x80\xAF";
-    uint32_t expected[] = { 0x2F };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x2F };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
@@ -722,8 +722,8 @@
   // 4.2.1 - U-0000007F = c1 bf             = "\xC1\xBF"
   {
     const char* src = "\xC1\xBF";
-    uint32_t expected[] = { 0x7F };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x7F };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
@@ -733,8 +733,8 @@
   // 4.2.2 U+000007FF = e0 9f bf          = "\xE0\x9F\xBF"
   {
     const char* src = "\xE0\x9F\xBF";
-    uint32_t expected[] = { 0x7FF };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x7FF };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
@@ -744,8 +744,8 @@
   // 4.2.3 - U+0000FFFF = f0 8f bf bf       = "\xF0\x8F\xBF\xBF"
   {
     const char* src = "\xF0\x8F\xBF\xBF";
-    uint32_t expected[] = { 0xFFFF };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0xFFFF };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
@@ -755,8 +755,8 @@
   // 4.2.4  U-001FFFFF = f8 87 bf bf bf    = "\xF8\x87\xBF\xBF\xBF"
   {
     const char* src = "\xF8\x87\xBF\xBF\xBF";
-    uint32_t expected[] = { 0x1FFFFF };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x1FFFFF };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
@@ -766,8 +766,8 @@
   // 4.2.5  U-03FFFFFF = fc 83 bf bf bf bf = "\xFC\x83\xBF\xBF\xBF\xBF"
   {
     const char* src = "\xFC\x83\xBF\xBF\xBF\xBF";
-    uint32_t expected[] = { 0x3FFFFFF };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x3FFFFFF };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
@@ -779,8 +779,8 @@
   // 4.3.1 - U+0000 = "\xC0\x80"
   {
     const char* src = "\xC0\x80";
-    uint32_t expected[] = { 0x0 };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x0 };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0xFF, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
@@ -790,8 +790,8 @@
   // 4.3.2  U+0000 = e0 80 80 = "\xE0\x80\x80"
   {
     const char* src = "\xE0\x80\x80";
-    uint32_t expected[] = { 0x0 };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x0 };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0xFF, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
@@ -801,8 +801,8 @@
   // 4.3.3  U+0000 = f0 80 80 80 = "\xF0\x80\x80\x80"
   {
     const char* src = "\xF0\x80\x80\x80";
-    uint32_t expected[] = { 0x0 };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x0 };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0xFF, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
@@ -812,8 +812,8 @@
   // 4.3.4  U+0000 = f8 80 80 80 80 = "\xF8\x80\x80\x80\x80"
   {
     const char* src = "\xF8\x80\x80\x80\x80";
-    uint32_t expected[] = { 0x0 };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x0 };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0xFF, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
@@ -823,8 +823,8 @@
   // 4.3.5  U+0000 = fc 80 80 80 80 80 = "\xFC\x80\x80\x80\x80\x80"
   {
     const char* src = "\xFC\x80\x80\x80\x80\x80";
-    uint32_t expected[] = { 0x0 };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0x0 };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0xFF, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
@@ -836,8 +836,8 @@
   // 5.1.1 - U+D800 = ed a0 80 = "\xED\xA0\x80"
   {
     const char* src = "\xED\xA0\x80";
-    uint32_t expected[] = { 0xD800 };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0xD800 };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
@@ -847,8 +847,8 @@
   // 5.1.2 - U+DB7F = ed ad bf = "\xED\xAD\xBF"
   {
     const char* src = "\xED\xAD\xBF";
-    uint32_t expected[] = { 0xDB7F };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0xDB7F };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
@@ -858,8 +858,8 @@
   // 5.1.3 - U+DB80 = ed ae 80 = "\xED\xAE\x80"
   {
     const char* src = "\xED\xAE\x80";
-    uint32_t expected[] = { 0xDB80 };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0xDB80 };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
@@ -869,8 +869,8 @@
   // 5.1.4 - U+DBFF = ed af bf = "\xED\xAF\xBF"
   {
     const char* src = "\xED\xAF\xBF";
-    uint32_t expected[] = { 0xDBFF };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0xDBFF };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
@@ -880,8 +880,8 @@
   // 5.1.5 - U+DC00 = ed b0 80 = "\xED\xB0\x80"
   {
     const char* src = "\xED\xB0\x80";
-    uint32_t expected[] = { 0xDC00 };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0xDC00 };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
@@ -891,8 +891,8 @@
   // 5.1.6 - U+DF80 = ed be 80 = "\xED\xBE\x80"
   {
     const char* src = "\xED\xBE\x80";
-    uint32_t expected[] = { 0xDF80 };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0xDF80 };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
@@ -902,8 +902,8 @@
   // 5.1.7 - U+DFFF = ed bf bf = "\xED\xBF\xBF"
   {
     const char* src = "\xED\xBF\xBF";
-    uint32_t expected[] = { 0xDFFF };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0xDFFF };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
@@ -915,8 +915,8 @@
   // 5.2.1 - U+D800 U+DC00 = ed a0 80 ed b0 80 = "\xED\xA0\x80\xED\xB0\x80"
   {
     const char* src = "\xED\xA0\x80\xED\xB0\x80";
-    uint32_t expected[] = { 0xD800, 0xDC00 };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0xD800, 0xDC00 };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
@@ -926,8 +926,8 @@
   // 5.2.2 - U+D800 U+DFFF = ed a0 80 ed bf bf = "\xED\xA0\x80\xED\xBF\xBF"
   {
     const char* src = "\xED\xA0\x80\xED\xBF\xBF";
-    uint32_t expected[] = { 0xD800, 0xDFFF };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0xD800, 0xDFFF };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
@@ -937,8 +937,8 @@
   // 5.2.3 - U+DB7F U+DC00 = ed a0 80 ed bf bf = "\xED\xAD\xBF\xED\xB0\x80"
   {
     const char* src = "\xED\xAD\xBF\xED\xB0\x80";
-    uint32_t expected[] = { 0xDB7F, 0xDC00 };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0xDB7F, 0xDC00 };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
@@ -948,8 +948,8 @@
   // 5.2.4 - U+DB7F U+DFFF = ed ad bf ed bf bf = "\xED\xAD\xBF\xED\xBF\xBF"
   {
     const char* src = "\xED\xAD\xBF\xED\xBF\xBF";
-    uint32_t expected[] = { 0xDB7F, 0xDFFF };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0xDB7F, 0xDFFF };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
@@ -959,8 +959,8 @@
   // 5.2.5 - U+DB80 U+DC00 = ed ae 80 ed b0 80 = "\xED\xAE\x80\xED\xB0\x80"
   {
     const char* src = "\xED\xAE\x80\xED\xB0\x80";
-    uint32_t expected[] = { 0xDB80, 0xDC00 };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0xDB80, 0xDC00 };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
@@ -970,8 +970,8 @@
   // 5.2.6 - U+DB80 U+DFFF = ed ae 80 ed bf bf = "\xED\xAE\x80\xED\xBF\xBF"
   {
     const char* src = "\xED\xAE\x80\xED\xBF\xBF";
-    uint32_t expected[] = { 0xDB80, 0xDFFF };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0xDB80, 0xDFFF };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
@@ -981,8 +981,8 @@
   // 5.2.7 - U+DBFF U+DC00 = ed af bf ed b0 80 = "\xED\xAF\xBF\xED\xB0\x80"
   {
     const char* src = "\xED\xAF\xBF\xED\xB0\x80";
-    uint32_t expected[] = { 0xDBFF, 0xDC00 };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0xDBFF, 0xDC00 };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
@@ -992,8 +992,8 @@
   // 5.2.8 - U+DBFF U+DFFF = ed af bf ed bf bf = "\xED\xAF\xBF\xED\xBF\xBF"
   {
     const char* src = "\xED\xAF\xBF\xED\xBF\xBF";
-    uint32_t expected[] = { 0xDBFF, 0xDFFF };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0xDBFF, 0xDFFF };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(!is_valid);
@@ -1005,8 +1005,8 @@
   // 5.3.1 - U+FFFE = ef bf be = "\xEF\xBF\xBE"
   {
     const char* src = "\xEF\xBF\xBE";
-    uint32_t expected[] = { 0xFFFE };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0xFFFE };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(is_valid);
@@ -1016,8 +1016,8 @@
   // 5.3.2 - U+FFFF = ef bf bf = "\xEF\xBF\xBF"
   {
     const char* src = "\xEF\xBF\xBF";
-    uint32_t expected[] = { 0xFFFF };
-    uint32_t dst[ARRAY_SIZE(expected)];
+    int32_t expected[] = { 0xFFFF };
+    int32_t dst[ARRAY_SIZE(expected)];
     memset(dst, 0, sizeof(dst));
     bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst));
     EXPECT(is_valid);
diff --git a/runtime/vm/vm.gypi b/runtime/vm/vm.gypi
index 0fb1bd9..7104aa5 100644
--- a/runtime/vm/vm.gypi
+++ b/runtime/vm/vm.gypi
@@ -78,6 +78,7 @@
       'includes': [
         '../lib/lib_sources.gypi',
         '../lib/isolate_sources.gypi',
+        '../lib/math_sources.gypi',
         '../lib/mirrors_sources.gypi',
         '../lib/scalarlist_sources.gypi',
       ],
@@ -106,6 +107,7 @@
       'includes': [
         '../lib/lib_sources.gypi',
         '../lib/isolate_sources.gypi',
+        '../lib/math_sources.gypi',
         '../lib/mirrors_sources.gypi',
         '../lib/scalarlist_sources.gypi',
       ],
diff --git a/runtime/vm/vm_sources.gypi b/runtime/vm/vm_sources.gypi
index d45c8fa..2b2f9d4 100644
--- a/runtime/vm/vm_sources.gypi
+++ b/runtime/vm/vm_sources.gypi
@@ -236,9 +236,6 @@
     'port.cc',
     'port.h',
     'port_test.cc',
-    'random.cc',
-    'random.h',
-    'random_test.cc',
     'raw_object.cc',
     'raw_object.h',
     'raw_object_snapshot.cc',
diff --git a/sdk/lib/_internal/compiler/compiler.dart b/sdk/lib/_internal/compiler/compiler.dart
index af37116..9ef6aa8 100644
--- a/sdk/lib/_internal/compiler/compiler.dart
+++ b/sdk/lib/_internal/compiler/compiler.dart
@@ -8,8 +8,7 @@
 import 'implementation/apiimpl.dart';
 
 // Unless explicitly allowed, passing [:null:] for any argument to the
-// methods of library will result in a NullPointerException being
-// thrown.
+// methods of library will result in an Error being thrown.
 
 /**
  * Returns a future that completes to the source corresponding to
diff --git a/sdk/lib/_internal/compiler/implementation/closure.dart b/sdk/lib/_internal/compiler/implementation/closure.dart
index 4d6be1c..3d5feef 100644
--- a/sdk/lib/_internal/compiler/implementation/closure.dart
+++ b/sdk/lib/_internal/compiler/implementation/closure.dart
@@ -371,7 +371,7 @@
         return true;
       } else if (type is InterfaceType) {
         InterfaceType ifcType = type;
-        for (DartType argument in ifcType.arguments) {
+        for (DartType argument in ifcType.typeArguments) {
           if (hasTypeVariable(argument)) {
             return true;
           }
@@ -385,7 +385,7 @@
         useLocal(type.element);
       } else if (type is InterfaceType) {
         InterfaceType ifcType = type;
-        for (DartType argument in ifcType.arguments) {
+        for (DartType argument in ifcType.typeArguments) {
           analyzeTypeVariables(argument);
         }
       }
diff --git a/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart b/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart
index 1f16080..975d4e5 100644
--- a/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart
+++ b/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart
@@ -28,7 +28,6 @@
   /** Caches the statics where the initial value cannot be eagerly compiled. */
   final Set<VariableElement> lazyStatics;
 
-
   ConstantHandler(Compiler compiler, this.constantSystem)
       : initialVariableValues = new Map<VariableElement, dynamic>(),
         compiledConstants = new Set<Constant>(),
@@ -134,7 +133,7 @@
             && element.isField()) {
           DartType elementType = element.computeType(compiler);
           DartType constantType = value.computeType(compiler);
-          if (!compiler.types.isSubtype(constantType, elementType)) {
+          if (!constantSystem.isSubtype(compiler, constantType, elementType)) {
             if (isConst) {
               MessageKind kind = MessageKind.NOT_ASSIGNABLE;
               compiler.reportError(node, new CompileTimeConstantError(
@@ -248,6 +247,7 @@
   final ConstantSystem constantSystem;
   final TreeElements elements;
   final Compiler compiler;
+  bool enabledRuntimeTypeSupport = false;
 
   CompileTimeConstantEvaluator(this.constantSystem,
                                this.elements,
@@ -400,6 +400,25 @@
     return constantSystem.createString(accumulator, node);
   }
 
+  Constant makeTypeConstant(Element element) {
+    // If we use a type literal in a constant, the compile time constant
+    // emitter will generate a call to the runtime type cache helper, so we
+    // resolve it and put it into the codegen work list.
+    if (!enabledRuntimeTypeSupport) {
+      SourceString helperName = const SourceString('createRuntimeType');
+      Element helper = compiler.findHelper(helperName);
+      compiler.enqueuer.resolution.addToWorkList(helper);
+      compiler.enqueuer.codegen.addToWorkList(helper);
+      enabledRuntimeTypeSupport = true;
+    }
+
+    DartType elementType = element.computeType(compiler).asRaw();
+    DartType constantType = compiler.typeClass.computeType(compiler);
+    Constant constant = new TypeConstant(elementType, constantType);
+    compiler.constantHandler.registerCompileTimeConstant(constant);
+    return constant;
+  }
+
   // TODO(floitsch): provide better error-messages.
   Constant visitSend(Send send) {
     Element element = elements[send];
@@ -418,6 +437,8 @@
           result = compiler.compileVariable(element);
         }
         if (result != null) return result;
+      } else if (Elements.isClass(element) || Elements.isTypedef(element)) {
+        return makeTypeConstant(element);
       }
       return signalNotCompileTimeConstant(send);
     } else if (send.isCall) {
@@ -427,6 +448,8 @@
         Constant right = evaluate(send.argumentsNode.nodes.tail.head);
         Constant result = constantSystem.identity.fold(left, right);
         if (result != null) return result;
+      } else if (Elements.isClass(element) || Elements.isTypedef(element)) {
+        return makeTypeConstant(element);
       }
       return signalNotCompileTimeConstant(send);
     } else if (send.isPrefix) {
diff --git a/sdk/lib/_internal/compiler/implementation/compiler.dart b/sdk/lib/_internal/compiler/implementation/compiler.dart
index e416804..e770cff 100644
--- a/sdk/lib/_internal/compiler/implementation/compiler.dart
+++ b/sdk/lib/_internal/compiler/implementation/compiler.dart
@@ -96,8 +96,6 @@
 
   SourceString getCheckedModeHelper(DartType type) => null;
   void registerInstantiatedClass(ClassElement cls, Enqueuer enqueuer) {}
-
-  Element getInterceptor(Selector selector);
 }
 
 abstract class Compiler implements DiagnosticListener {
diff --git a/sdk/lib/_internal/compiler/implementation/constants.dart b/sdk/lib/_internal/compiler/implementation/constants.dart
index 6e20124..ad5dc74 100644
--- a/sdk/lib/_internal/compiler/implementation/constants.dart
+++ b/sdk/lib/_internal/compiler/implementation/constants.dart
@@ -16,6 +16,7 @@
   R visitList(ListConstant constant);
   R visitMap(MapConstant constant);
   R visitConstructed(ConstructedConstant constant);
+  R visitType(TypeConstant constant);
 }
 
 abstract class Constant {
@@ -37,6 +38,7 @@
   bool isPrimitive() => false;
   /** Returns true if the constant is a list, a map or a constructed object. */
   bool isObject() => false;
+  bool isType() => false;
   bool isSentinel() => false;
 
   bool isNaN() => false;
@@ -46,7 +48,7 @@
 
   List<Constant> getDependencies();
 
-  accept(ConstantVisitor);
+  accept(ConstantVisitor visitor);
 }
 
 class SentinelConstant extends Constant {
@@ -100,7 +102,7 @@
   bool operator ==(var other) {
     if (other is !PrimitiveConstant) return false;
     PrimitiveConstant otherPrimitive = other;
-    // We use == instead of === so that DartStrings compare correctly.
+    // We use == instead of 'identical' so that DartStrings compare correctly.
     return value == otherPrimitive.value;
   }
 
@@ -315,10 +317,25 @@
   bool isObject() => true;
 
   DartType computeType(Compiler compiler) => type;
+}
 
-  // TODO(1603): The class should be marked as abstract, but the VM doesn't
-  // currently allow this.
-  int get hashCode;
+class TypeConstant extends ObjectConstant {
+  /// The user type that this constant represents.
+  final DartType representedType;
+
+  TypeConstant(this.representedType, type) : super(type);
+
+  bool isType() => true;
+
+  bool operator ==(other) {
+    return other is TypeConstant && representedType == other.representedType;
+  }
+
+  int get hashCode => representedType.hashCode * 13;
+
+  List<Constant> getDependencies() => const <Constant>[];
+
+  accept(ConstantVisitor visitor) => visitor.visitType(this);
 }
 
 class ListConstant extends ObjectConstant {
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
index 101918b..c012488 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
@@ -196,8 +196,6 @@
         stripAsserts = strips.indexOf('asserts') != -1,
         super(compiler);
 
-  Element getInterceptor(Selector selector) => null;
-
   void enqueueHelpers(Enqueuer world) {
     // Right now resolver doesn't always resolve interfaces needed
     // for literals, so force them. TODO(antonm): fix in the resolver.
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 b31e471..63e14f9 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/placeholder_collector.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/placeholder_collector.dart
@@ -30,6 +30,7 @@
   final bool isRedirectingCall;
   ConstructorPlaceholder(this.node, this.type)
       : this.isRedirectingCall = false;
+  // Note: factory redirection is not redirecting call!
   ConstructorPlaceholder.redirectingCall(this.node)
       : this.type = null, this.isRedirectingCall = true;
 }
@@ -141,7 +142,7 @@
   final Set<String> fixedMemberNames; // member names which cannot be renamed.
   final Map<Element, ElementAst> elementAsts;
   final Set<Node> nullNodes;  // Nodes that should not be in output.
-  final Set<Identifier> unresolvedNodes;
+  final Set<Node> unresolvedNodes;
   final Map<Element, Set<Node>> elementNodes;
   final Map<FunctionElement, FunctionScope> functionScopes;
   final Map<LibraryElement, Set<Identifier>> privateNodes;
@@ -161,7 +162,7 @@
 
   PlaceholderCollector(this.compiler, this.fixedMemberNames, this.elementAsts) :
       nullNodes = new Set<Node>(),
-      unresolvedNodes = new Set<Identifier>(),
+      unresolvedNodes = new Set<Node>(),
       elementNodes = new Map<Element, Set<Node>>(),
       functionScopes = new Map<FunctionElement, FunctionScope>(),
       privateNodes = new Map<LibraryElement, Set<Identifier>>(),
@@ -175,6 +176,15 @@
     if (element.isGenerativeConstructor() || element.isFactoryConstructor()) {
       DartType type = element.getEnclosingClass().type.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();
+        makeConstructorPlaceholder(
+            bodyAsReturn.expression, redirectTarget, type);
+      }
     } else if (Elements.isStaticOrTopLevel(element)) {
       // Note: this code should only rename private identifiers for class'
       // fields/getters/setters/methods.  Top-level identifiers are renamed
@@ -355,7 +365,8 @@
     Element constructor = treeElements[send];
     assert(constructor != null);
     assert(send.receiver == null);
-    if (constructor is !ErroneousElement) {
+    if (!Elements.isErroneousElement(constructor) &&
+        !Elements.isMalformedElement(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 d41d5b2..f132df6 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/renamer.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/renamer.dart
@@ -88,9 +88,9 @@
     // js-helpers.
     StringBuffer result = new StringBuffer(renameElement(type.element));
     if (type is InterfaceType) {
-      if (!type.arguments.isEmpty) {
+      if (!type.typeArguments.isEmpty) {
         result.add('<');
-        Link<DartType> argumentsLink = type.arguments;
+        Link<DartType> argumentsLink = type.typeArguments;
         result.add(renameType(argumentsLink.head, renameElement));
         for (Link<DartType> link = argumentsLink.tail; !link.isEmpty;
              link = link.tail) {
diff --git a/sdk/lib/_internal/compiler/implementation/elements/elements.dart b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
index fbdc8ca..df07e95 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/elements.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
@@ -120,6 +120,8 @@
       const ElementKind('ambiguous', ElementCategory.NONE);
   static const ElementKind ERROR =
       const ElementKind('error', ElementCategory.NONE);
+  static const ElementKind MALFORMED_TYPE =
+    const ElementKind('malformed', ElementCategory.NONE);
 
   toString() => id;
 }
@@ -200,6 +202,8 @@
   /** See [AmbiguousElement] for documentation. */
   bool isAmbiguous() => false;
 
+  bool isMalformed() => false;
+
   /**
    * Is [:true:] if this element has a corresponding patch.
    *
@@ -1136,7 +1140,7 @@
    * changed by the resolver to point to the redirection target.  If
    * this is an interface constructor, [defaultImplementation] will be
    * changed by the resolver to point to the default implementation.
-   * Otherwise, [:defaultImplementation === this:].
+   * Otherwise, [:identical(defaultImplementation, this):].
    */
   // TODO(ahe): Rename this field to redirectionTarget and remove
   // mention of interface constructors above.
@@ -1178,7 +1182,7 @@
 
   FunctionElement get redirectionTarget {
     if (this == defaultImplementation) return this;
-    Element target = defaultImplementation;
+    var target = defaultImplementation;
     Set<Element> seen = new Set<Element>();
     seen.add(target);
     while (!target.isErroneous() && target != target.defaultImplementation) {
@@ -1319,6 +1323,23 @@
   bool impliesType() => true;
 }
 
+class MalformedTypeElement extends Element {
+  final TypeAnnotation typeNode;
+
+  MalformedTypeElement(this.typeNode, Element enclosing)
+      : super(const SourceString('malformed'),
+              ElementKind.MALFORMED_TYPE,
+              enclosing);
+
+  DartType computeType(compiler) => compiler.types.malformedType;
+
+  Node parseNode(_) => typeNode;
+
+  bool impliesType() => true;
+
+  bool isMalformed() => true;
+}
+
 /**
  * [TypeDeclarationElement] defines the common interface for class/interface
  * declarations and typedefs.
@@ -1414,7 +1435,7 @@
   bool isObject(Compiler compiler) =>
       identical(declaration, compiler.objectClass);
 
-  Link<DartType> get typeVariables => type.arguments;
+  Link<DartType> get typeVariables => type.typeArguments;
 
   ClassElement ensureResolved(Compiler compiler) {
     if (resolutionState == STATE_NOT_STARTED) {
@@ -1724,8 +1745,16 @@
 }
 
 class Elements {
-  static bool isUnresolved(Element e) => e == null || e.isErroneous();
+  static bool isUnresolved(Element e) {
+    return e == null || e.isErroneous() || e.isMalformed();
+  }
   static bool isErroneousElement(Element e) => e != null && e.isErroneous();
+  static bool isMalformedElement(Element e) => e != null && e.isMalformed();
+
+  static bool isClass(Element e) => e != null && e.kind == ElementKind.CLASS;
+  static bool isTypedef(Element e) {
+    return e != null && e.kind == ElementKind.TYPEDEF;
+  }
 
   static bool isLocal(Element element) {
     return !Elements.isUnresolved(element)
@@ -1863,27 +1892,27 @@
 
   static SourceString constructOperatorName(SourceString op, bool isUnary) {
     String value = op.stringValue;
-    if ((value === '==') ||
-        (value === '~') ||
-        (value === '[]') ||
-        (value === '[]=') ||
-        (value === '*') ||
-        (value === '/') ||
-        (value === '%') ||
-        (value === '~/') ||
-        (value === '+') ||
-        (value === '<<') ||
-        (value === '>>>') ||
-        (value === '>>') ||
-        (value === '>=') ||
-        (value === '>') ||
-        (value === '<=') ||
-        (value === '<') ||
-        (value === '&') ||
-        (value === '^') ||
-        (value === '|')) {
+    if ((identical(value, '==')) ||
+        (identical(value, '~')) ||
+        (identical(value, '[]')) ||
+        (identical(value, '[]=')) ||
+        (identical(value, '*')) ||
+        (identical(value, '/')) ||
+        (identical(value, '%')) ||
+        (identical(value, '~/')) ||
+        (identical(value, '+')) ||
+        (identical(value, '<<')) ||
+        (identical(value, '>>>')) ||
+        (identical(value, '>>')) ||
+        (identical(value, '>=')) ||
+        (identical(value, '>')) ||
+        (identical(value, '<=')) ||
+        (identical(value, '<')) ||
+        (identical(value, '&')) ||
+        (identical(value, '^')) ||
+        (identical(value, '|'))) {
       return op;
-    } else if (value === '-') {
+    } else if (identical(value, '-')) {
       return isUnary ? const SourceString('unary-') : op;
     } else {
       throw 'Unhandled operator: ${op.slowToString()}';
@@ -1933,10 +1962,17 @@
   final TargetElement target;
   bool isBreakTarget = false;
   bool isContinueTarget = false;
-  LabelElement(Label label, this.labelName, this.target,
+  LabelElement(Label label, String labelName, this.target,
                Element enclosingElement)
       : this.label = label,
-        super(label.identifier.source, ElementKind.LABEL, enclosingElement);
+        this.labelName = labelName,
+        // In case of a synthetic label, just use [labelName] for
+        // identifying the element.
+        super(label == null
+                  ? new SourceString(labelName)
+                  : label.identifier.source,
+              ElementKind.LABEL,
+              enclosingElement);
 
   void setBreakTarget() {
     isBreakTarget = true;
diff --git a/sdk/lib/_internal/compiler/implementation/enqueue.dart b/sdk/lib/_internal/compiler/implementation/enqueue.dart
index 8ed7bdb..f12d760 100644
--- a/sdk/lib/_internal/compiler/implementation/enqueue.dart
+++ b/sdk/lib/_internal/compiler/implementation/enqueue.dart
@@ -138,6 +138,7 @@
   }
 
   void registerInstantiatedClass(ClassElement cls) {
+    if (universe.instantiatedClasses.contains(cls)) return;
     universe.instantiatedClasses.add(cls);
     onRegisterInstantiatedClass(cls);
     compiler.backend.registerInstantiatedClass(cls, this);
@@ -403,11 +404,4 @@
         : 'Compiled ${universe.generatedCode.length} methods.');
     nativeEnqueuer.logSummary(log);
   }
-
-  registerUsedSelector(Selector selector) {
-    Element interceptor = compiler.backend.getInterceptor(selector);
-    if (interceptor != null) {
-      registerStaticUse(interceptor);
-    }
-  }
 }
diff --git a/sdk/lib/_internal/compiler/implementation/js/nodes.dart b/sdk/lib/_internal/compiler/implementation/js/nodes.dart
index 18139b2..cfc88a5 100644
--- a/sdk/lib/_internal/compiler/implementation/js/nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/js/nodes.dart
@@ -713,6 +713,8 @@
   PropertyAccess(this.receiver, this.selector);
   PropertyAccess.field(this.receiver, String fieldName)
       : selector = new LiteralString("'$fieldName'");
+  PropertyAccess.indexed(this.receiver, int index)
+      : selector = new LiteralNumber('$index');
 
   accept(NodeVisitor visitor) => visitor.visitAccess(this);
 
@@ -769,6 +771,9 @@
 
   ArrayInitializer(this.length, this.elements);
 
+  factory ArrayInitializer.from(List<Expression> expressions) =>
+      new ArrayInitializer(expressions.length, _convert(expressions));
+
   accept(NodeVisitor visitor) => visitor.visitArrayInitializer(this);
 
   void visitChildren(NodeVisitor visitor) {
@@ -776,6 +781,12 @@
   }
 
   int get precedenceLevel => PRIMARY;
+
+  static List<ArrayElement> _convert(List<Expression> expressions) {
+    int index = 0;
+    return expressions.map(
+        (expression) => new ArrayElement(index++, expression));
+  }
 }
 
 /**
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
index 5cc96d6..9aa445d 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
@@ -648,8 +648,17 @@
 
   ClassElement jsStringClass;
   ClassElement jsArrayClass;
+  ClassElement jsNumberClass;
+  ClassElement jsIntClass;
+  ClassElement jsDoubleClass;
+  ClassElement jsFunctionClass;
+  ClassElement jsNullClass;
+  ClassElement jsBoolClass;
   ClassElement objectInterceptorClass;
+  Element jsArrayLength;
+  Element jsStringLength;
   Element getInterceptorMethod;
+  bool _interceptorsAreInitialized = false;
 
   final Namer namer;
 
@@ -685,19 +694,22 @@
    * 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, List<Element>> interceptedElements;  
+  final Map<SourceString, Set<Element>> interceptedElements;  
 
   List<CompilerTask> get tasks {
     return <CompilerTask>[builder, optimizer, generator, emitter];
   }
 
+  final RuntimeTypeInformation rti;
+
   JavaScriptBackend(Compiler compiler, bool generateSourceMap, bool disableEval)
       : namer = determineNamer(compiler),
         returnInfo = new Map<Element, ReturnInfo>(),
         invalidateAfterCodegen = new List<Element>(),
         interceptors = new Interceptors(compiler),
         usedInterceptors = new Set<Selector>(),
-        interceptedElements = new Map<SourceString, List<Element>>(),
+        interceptedElements = new Map<SourceString, Set<Element>>(),
+        rti = new RuntimeTypeInformation(compiler),
         super(compiler, JAVA_SCRIPT_CONSTANT_SYSTEM) {
     emitter = disableEval
         ? new CodeEmitterNoEvalTask(compiler, namer, generateSourceMap)
@@ -717,20 +729,36 @@
 
   bool isInterceptorClass(Element element) {
     if (element == null) return false;
-    return element == jsStringClass || element == jsArrayClass;
+    return element == jsStringClass
+        || element == jsArrayClass
+        || element == jsIntClass
+        || element == jsDoubleClass
+        || element == jsNullClass
+        || element == jsFunctionClass
+        || element == jsBoolClass
+        || element == jsNumberClass;
   }
 
   void addInterceptedSelector(Selector selector) {
     usedInterceptors.add(selector);
   }
 
-  bool shouldInterceptSelector(Selector selector) {
-    List<Element> intercepted = interceptedElements[selector.name];
-    if (intercepted == null) return false;
+  /**
+   * Returns a set of interceptor classes that contain a member whose
+   * signature matches the given [selector]. Returns [:null:] if there
+   * is no class.
+   */
+  Set<ClassElement> getInterceptedClassesOn(Selector selector) {
+    Set<Element> intercepted = interceptedElements[selector.name];
+    if (intercepted == null) return null;
+    Set<ClassElement> result = new Set<ClassElement>();
     for (Element element in intercepted) {
-      if (selector.applies(element, compiler)) return true;
+      if (selector.applies(element, compiler)) {
+        result.add(element.getEnclosingClass());
+      }
     }
-    return false;
+    if (result.isEmpty) return null;
+    return result;
   }
 
   void initializeInterceptorElements() {
@@ -738,35 +766,75 @@
         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'));
+    jsArrayClass.ensureResolved(compiler);
+    jsArrayLength =
+        jsArrayClass.lookupLocalMember(const SourceString('length'));
+    jsStringClass.ensureResolved(compiler);
+    jsStringLength =
+        jsStringClass.lookupLocalMember(const SourceString('length'));
   }
 
+  void addInterceptors(ClassElement cls) {
+    cls.ensureResolved(compiler);
+    cls.forEachMember((ClassElement classElement, Element member) {
+        Set<Element> set = interceptedElements.putIfAbsent(
+            member.name, () => new Set<Element>());
+        set.add(member);
+      },
+      includeSuperMembers: true);
+  }
 
   void registerInstantiatedClass(ClassElement cls, Enqueuer enqueuer) {
     ClassElement result = null;
-    if (cls == compiler.stringClass) {
-      if (jsStringClass == null) {
-        jsStringClass =
-            compiler.findInterceptor(const SourceString('JSString'));
-        initializeInterceptorElements();
+    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;
     } else if (cls == compiler.listClass) {
-      if (jsArrayClass == null) {
-        jsArrayClass =
-            compiler.findInterceptor(const SourceString('JSArray'));
-        initializeInterceptorElements();
-      }
       result = jsArrayClass;
+    } else if (cls == compiler.intClass) {
+      result = jsIntClass;
+    } else if (cls == compiler.doubleClass) {
+      result = jsDoubleClass;
+    } else if (cls == compiler.functionClass) {
+      result = jsFunctionClass;
+    } else if (cls == compiler.boolClass) {
+      result = jsBoolClass;
     }
 
     if (result == null) return;
-
-    result.forEachMember((_, Element member) {
-      List<Element> list = interceptedElements.putIfAbsent(
-          member.name, () => new List<Element>());
-      list.add(member);
-    });
-
+    if (enqueuer.isResolutionQueue) addInterceptors(result);
     enqueuer.registerInstantiatedClass(result);
   }
 
@@ -778,10 +846,6 @@
     return new JavaScriptItemCompilationContext();
   }
 
-  Element getInterceptor(Selector selector) {
-    return interceptors.getStaticInterceptor(selector);
-  }
-
   void enqueueHelpers(Enqueuer world) {
     enqueueAllTopLevelFunctions(compiler.jsHelperLibrary, world);
 
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 a9e49c0..7635c6a 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/constant_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/constant_emitter.dart
@@ -87,23 +87,12 @@
   /**
    * Write the contents of the quoted string to a [CodeBuffer] in
    * a form that is valid as JavaScript string literal content.
-   * The string is assumed quoted by single quote characters.
+   * The string is assumed quoted by double quote characters.
    */
-  void writeEscapedString(DartString string,
-                          CodeBuffer buffer,
-                          Node diagnosticNode) {
-    void onError(code) {
-      compiler.reportError(
-          diagnosticNode,
-          'Unhandled non-BMP character: U+${code.toRadixString(16)}');
-    }
-    writeJsonEscapedCharsOn(string.iterator(), buffer, onError);
-  }
-
   void visitString(StringConstant constant) {
-    buffer.add("'");
-    writeEscapedString(constant.value, buffer, constant.node);
-    buffer.add("'");
+    buffer.add('"');
+    writeJsonEscapedCharsOn(constant.value.slowToString(), buffer);
+    buffer.add('"');
   }
 
   void emitCanonicalVersion(Constant constant) {
@@ -196,6 +185,29 @@
     }
   }
 
+  void visitType(TypeConstant constant) {
+    if (shouldEmitCanonicalVersion) {
+      emitCanonicalVersion(constant);
+    } 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')");
+    }
+  }
+
   void visitConstructed(ConstructedConstant constant) {
     if (shouldEmitCanonicalVersion) {
       emitCanonicalVersion(constant);
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart b/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
index e8ad203..12a8d4f 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
@@ -192,6 +192,7 @@
     constructor = new Function(str)();
   }
   constructor.prototype = prototype;
+  constructor.builtin\$cls = cls;
   return constructor;
 }""";
   }
@@ -236,7 +237,9 @@
   for (var cls in collectedClasses) {
     if (hasOwnProperty.call(collectedClasses, cls)) {
       var desc = collectedClasses[cls];
-      $isolatePropertiesName[cls] = $defineClassName(cls, desc[''], desc);
+'''/* 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'];
     }
   }
@@ -322,14 +325,21 @@
 
   String get lazyInitializerFunction {
     String isolate = namer.CURRENT_ISOLATE;
+    return """
+function(prototype, staticName, fieldName, getterName, lazyValue) {
+  var getter = new Function("{ return $isolate." + fieldName + ";}");
+$lazyInitializerLogic
+}""";
+  }
+
+  String get lazyInitializerLogic {
+    String isolate = namer.CURRENT_ISOLATE;
     JavaScriptBackend backend = compiler.backend;
     String cyclicThrow = namer.isolateAccess(backend.cyclicThrowHelper);
     return """
-function(prototype, staticName, fieldName, getterName, lazyValue) {
   var sentinelUndefined = {};
   var sentinelInProgress = {};
   prototype[fieldName] = sentinelUndefined;
-  var getter = new Function("{ return $isolate." + fieldName + ";}");
   prototype[getterName] = function() {
     var result = $isolate[fieldName];
     try {
@@ -350,8 +360,7 @@
     } finally {
       $isolate[getterName] = getter;
     }
-  };
-}""";
+  };""";
   }
 
   void addDefineClassAndFinishClassFunctionsIfNecessary(CodeBuffer buffer) {
@@ -671,12 +680,11 @@
    */
   void emitInstanceMembers(ClassElement classElement,
                            CodeBuffer buffer,
-                           bool needsLeadingComma) {
+                           bool emitLeadingComma) {
     assert(invariant(classElement, classElement.isDeclaration));
-    bool needsComma = needsLeadingComma;
     void defineInstanceMember(String name, StringBuffer memberBuffer) {
-      if (needsComma) buffer.add(',');
-      needsComma = true;
+      if (emitLeadingComma) buffer.add(',');
+      emitLeadingComma = true;
       buffer.add('\n');
       buffer.add(' $name: ');
       buffer.add(memberBuffer);
@@ -846,8 +854,9 @@
     /* Do nothing. */
   }
 
-  void emitClassFields(ClassElement classElement, CodeBuffer buffer) {
-    buffer.add('"": [');
+  void emitClassFields(ClassElement classElement,
+                       CodeBuffer buffer,
+                       bool emitEndingComma) {
     bool isFirstField = true;
     visitClassFields(classElement, (Element member,
                                     String name,
@@ -856,6 +865,7 @@
                                     bool needsSetter,
                                     bool needsCheckedSetter) {
       if (isFirstField) {
+        buffer.add('"": [');
         isFirstField = false;
       } else {
         buffer.add(", ");
@@ -876,12 +886,19 @@
       }
       buffer.add('"');
     });
-    buffer.add(']');
+    if (!isFirstField) {
+      // There was at least one field.
+      buffer.add(']');
+      if (emitEndingComma) {
+        buffer.add(',');
+      }
+    }
   }
 
   /** Each getter/setter must be prefixed with a ",\n ". */
-  void emitClassGettersSetters(ClassElement classElement, CodeBuffer buffer,
-                               {bool omitLeadingComma: false}) {
+  void emitClassGettersSetters(ClassElement classElement,
+                               CodeBuffer buffer,
+                               bool emitLeadingComma) {
     visitClassFields(classElement, (Element member,
                                     String name,
                                     String accessorName,
@@ -890,10 +907,10 @@
                                     bool needsCheckedSetter) {
       if (needsCheckedSetter) {
         assert(!needsSetter);
-        if (!omitLeadingComma) {
+        if (emitLeadingComma) {
           buffer.add(",\n ");
         } else {
-          omitLeadingComma = false;
+          emitLeadingComma = true;
         }
         generateCheckedSetter(member, name, accessorName, buffer);
       }
@@ -927,12 +944,12 @@
 
     buffer.add('$classesCollector.$className = {');
     emitClassConstructor(classElement, buffer);
-    emitClassFields(classElement, buffer);
+    emitClassFields(classElement, buffer, true);
     // 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);
+    buffer.add('\n "super": "$superName"');
+    emitClassGettersSetters(classElement, buffer, true);
     emitInstanceMembers(classElement, buffer, true);
     buffer.add('\n};\n\n');
   }
@@ -951,7 +968,7 @@
       } else if (selector.isSetter()) {
         name = backend.namer.setterName(selector.library, selector.name);
       } else {
-        assert(selector.isCall());
+        assert(selector.isCall() || selector.isOperator());
         name = backend.namer.instanceMethodInvocationName(
             selector.library, selector.name, selector);
         if (selector.argumentCount > 0) {
@@ -1182,21 +1199,20 @@
 
     Map<int, String> cache;
     String extraArg;
-    String extraArgWithThis;
     String extraArgWithoutComma;
+    bool hasExtraArgument = false;
     // Methods on foreign classes take an extra parameter, which is
     // the actual receiver of the call.
     JavaScriptBackend backend = compiler.backend;
     if (backend.isInterceptorClass(member.getEnclosingClass())) {
+      hasExtraArgument = true;
       cache = interceptorClosureCache;
       extraArg = 'receiver, ';
-      extraArgWithThis = 'this.receiver, ';
       extraArgWithoutComma = 'receiver';
     } else {
       cache = boundClosureCache;
       extraArg = '';
       extraArgWithoutComma = '';
-      extraArgWithThis = '';
     }
 
     String closureClass =
@@ -1230,8 +1246,12 @@
       String joinedArgs = Strings.join(arguments, ", ");
       boundClosureBuffer.add(
           "$invocationName: function($joinedArgs) {");
-      boundClosureBuffer.add(
-          " return this.self[this.target]($extraArgWithThis$joinedArgs);");
+      String callArgs = hasExtraArgument
+          ? joinedArgs.isEmpty
+              ? 'this.$extraArgWithoutComma'
+              : 'this.$extraArg$joinedArgs'
+          : joinedArgs;
+      boundClosureBuffer.add(" return this.self[this.target]($callArgs);");
       boundClosureBuffer.add(" }");
       addParameterStubs(callElement, (String stubName, CodeBuffer memberValue) {
         boundClosureBuffer.add(',\n $stubName: $memberValue');
@@ -1333,11 +1353,16 @@
         buffer.add(namer.getLazyInitializerName(element));
         buffer.add("', ");
         buffer.add(code);
+        emitLazyInitializedGetter(element, buffer);
         buffer.add(");\n");
       }
     }
   }
 
+  void emitLazyInitializedGetter(VariableElement element, CodeBuffer buffer) {
+    // Nothing to do, the 'lazy' function will create the getter.
+  }
+
   void emitCompileTimeConstants(CodeBuffer buffer) {
     ConstantHandler handler = compiler.constantHandler;
     List<Constant> constants = handler.getConstantsForEmission();
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 00563f0..0b3864e 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
@@ -59,6 +59,18 @@
 }""";
   }
 
+  String get lazyInitializerFunction {
+    return """
+function(prototype, staticName, fieldName, getterName, lazyValue, getter) {
+$lazyInitializerLogic
+}""";
+  }
+
+  void emitLazyInitializedGetter(VariableElement element, CodeBuffer buffer) {
+    String isolate = namer.CURRENT_ISOLATE;
+    buffer.add(', function() { return $isolate.${namer.getName(element)}; }');
+  }
+
   void emitBoundClosureClassHeader(String mangledName,
                                    String superName,
                                    String extraArgument,
@@ -121,17 +133,20 @@
     buffer.add(' }');
   }
 
-  void emitClassFields(ClassElement classElement, CodeBuffer buffer) {
-    /* Do nothing. */
+  void emitClassFields(ClassElement classElement,
+                       CodeBuffer buffer,
+                       bool emitEndingComma) {
+    if (emitEndingComma) buffer.add(', ');
   }
 
-  void emitClassGettersSetters(ClassElement classElement, CodeBuffer buffer,
-                               {bool omitLeadingComma: false}) {
+  void emitClassGettersSetters(ClassElement classElement,
+                               CodeBuffer buffer,
+                               bool emitLeadingComma) {
     emitComma() {
-      if (!omitLeadingComma) {
+      if (emitLeadingComma) {
         buffer.add(",\n ");
       } else {
-        omitLeadingComma = false;
+        emitLeadingComma = true;
       }
     }
 
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 2a9d4da..f24e5ba 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart
@@ -8,6 +8,7 @@
 import '../../compiler.dart' as api;
 import '../elements/elements.dart';
 import '../dart2jslib.dart' hide Selector;
+import '../js/js.dart' as js;
 import '../native_handler.dart' as native;
 import '../source_file.dart';
 import '../source_map_builder.dart';
@@ -23,5 +24,6 @@
 part 'emitter.dart';
 part 'emitter_no_eval.dart';
 part 'namer.dart';
-part 'minify_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
index f252b54..8e292b4 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/minify_namer.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/minify_namer.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+part of js_backend;
+
 /**
  * Assigns JavaScript identifiers to Dart variables, class-names and members.
  */
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart b/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart
index 3d134c2..691d73b 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart
@@ -313,7 +313,6 @@
     } else {
       name = element.name.slowToString();
     }
-    // Prefix the name with '$' if it is reserved.
     return name;
   }
 
@@ -363,7 +362,6 @@
     } else {
       // Use declaration element to ensure invariant on [globals].
       element = element.declaration;
-
       // Dealing with a top-level or static element.
       String cached = globals[element];
       if (cached != null) return cached;
@@ -382,7 +380,8 @@
           kind == ElementKind.GETTER ||
           kind == ElementKind.SETTER ||
           kind == ElementKind.TYPEDEF ||
-          kind == ElementKind.LIBRARY) {
+          kind == ElementKind.LIBRARY ||
+          kind == ElementKind.MALFORMED_TYPE) {
         bool isNative = false;
         if (identical(kind, ElementKind.CLASS)) {
           ClassElement class_elt = 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 7b92fcd..6e87ec4 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart
@@ -166,12 +166,10 @@
 
     CodeBuffer fieldBuffer = new CodeBuffer();
     CodeBuffer getterSetterBuffer = new CodeBuffer();
-
-    emitter.emitClassFields(classElement, fieldBuffer);
-    emitter.emitClassGettersSetters(classElement, getterSetterBuffer,
-                                    omitLeadingComma: true);
-
     CodeBuffer methodBuffer = new CodeBuffer();
+
+    emitter.emitClassFields(classElement, fieldBuffer, false);
+    emitter.emitClassGettersSetters(classElement, getterSetterBuffer, false);
     emitter.emitInstanceMembers(classElement, methodBuffer, false);
 
     if (methodBuffer.isEmpty
@@ -321,19 +319,20 @@
     // Temporary variables for common substrings.
     List<String> varNames = <String>[];
     // var -> expression
-    Map<String, String> varDefns = <String, String>{};
+    Map<dynamic, js.Expression> varDefns = new Map<dynamic, js.Expression>();
     // tag -> expression (a string or a variable)
-    Map<ClassElement, String> tagDefns = new Map<ClassElement, String>();
+    Map<ClassElement, js.Expression> tagDefns =
+        new Map<ClassElement, js.Expression>();
 
-    String makeExpression(ClassElement classElement) {
+    js.Expression makeExpression(ClassElement classElement) {
       // Expression fragments for this set of cls keys.
-      List<String> expressions = <String>[];
+      List<js.Expression> expressions = <js.Expression>[];
       // TODO: Remove if cls is abstract.
       List<String> subtags = [toNativeName(classElement)];
       void walk(ClassElement cls) {
         for (final ClassElement subclass in getDirectSubclasses(cls)) {
           ClassElement tag = subclass;
-          String existing = tagDefns[tag];
+          var existing = tagDefns[tag];
           if (existing == null) {
             subtags.add(toNativeName(tag));
             walk(subclass);
@@ -341,23 +340,28 @@
             if (varDefns.containsKey(existing)) {
               expressions.add(existing);
             } else {
-              String varName = 'v${varNames.length}/*${tag}*/';
+              String varName = 'v${varNames.length}_${tag.name.slowToString()}';
               varNames.add(varName);
               varDefns[varName] = existing;
-              tagDefns[tag] = varName;
-              expressions.add(varName);
+              tagDefns[tag] = new js.VariableUse(varName);
+              expressions.add(new js.VariableUse(varName));
             }
           }
         }
       }
       walk(classElement);
-      String constantPart = "'${Strings.join(subtags, '|')}'";
-      if (constantPart != "''") expressions.add(constantPart);
-      String expression;
+      if (!subtags.isEmpty) {
+        expressions.add(
+            new js.LiteralString("'${Strings.join(subtags, '|')}'"));
+      }
+      js.Expression expression;
       if (expressions.length == 1) {
         expression = expressions[0];
       } else {
-        expression = "[${Strings.join(expressions, ',')}].join('|')";
+        js.Expression array = new js.ArrayInitializer.from(expressions);
+        expression = new js.Call(
+            new js.PropertyAccess.field(array, 'join'),
+            [new js.LiteralString("'|'")]);
       }
       return expression;
     }
@@ -368,27 +372,46 @@
 
     // Write out a thunk that builds the metadata.
     if (!tagDefns.isEmpty) {
-      nativeBuffer.add('(function(){\n');
+      List<js.Statement> statements = <js.Statement>[];
 
+      List<js.VariableInitialization> initializations =
+          <js.VariableInitialization>[];
       for (final String varName in varNames) {
-        nativeBuffer.add('  var ${varName} = ${varDefns[varName]};\n');
+        initializations.add(
+            new js.VariableInitialization(
+                new js.VariableDeclaration(varName),
+                varDefns[varName]));
+      }
+      if (!initializations.isEmpty) {
+        statements.add(
+            new js.ExpressionStatement(
+                new js.VariableDeclarationList(initializations)));
       }
 
-      nativeBuffer.add('  var table = [\n');
+      // [table] is a list of lists, each inner list of the form:
+      //   [dynamic-dispatch-tag, tags-of-classes-implementing-dispatch-tag]
+      // E.g.
+      //   [['Node', 'Text|HTMLElement|HTMLDivElement|...'], ...]
+      js.Expression table =
+          new js.ArrayInitializer.from(
+              dispatchClasses.map((cls) =>
+                  new js.ArrayInitializer.from([
+                      new js.LiteralString("'${toNativeName(cls)}'"),
+                      tagDefns[cls]])));
+
+      //  $.dynamicSetMetadata(table);
+      statements.add(
+          new js.ExpressionStatement(
+              new js.Call(
+                  new js.VariableUse(dynamicSetMetadataName),
+                  [table])));
+
+      //  (function(){statements})();
       nativeBuffer.add(
-          '    // [dynamic-dispatch-tag, '
-          'tags of classes implementing dynamic-dispatch-tag]');
-      bool needsComma = false;
-      List<String> entries = <String>[];
-      for (final ClassElement cls in dispatchClasses) {
-        String clsName = toNativeName(cls);
-        entries.add("\n    ['$clsName', ${tagDefns[cls]}]");
-      }
-      nativeBuffer.add(Strings.join(entries, ','));
-      nativeBuffer.add('];\n');
-      nativeBuffer.add('$dynamicSetMetadataName(table);\n');
-
-      nativeBuffer.add('})();\n');
+          js.prettyPrint(
+              new js.ExpressionStatement(
+                  new js.Call(new js.Fun([], new js.Block(statements)), [])),
+              compiler));
     }
   }
 
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/runtime_types.dart b/sdk/lib/_internal/compiler/implementation/js_backend/runtime_types.dart
new file mode 100644
index 0000000..2064f09
--- /dev/null
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/runtime_types.dart
@@ -0,0 +1,65 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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;
+
+class RuntimeTypeInformation {
+  final Compiler compiler;
+
+  RuntimeTypeInformation(this.compiler);
+
+  // TODO(karlklose): remove when using type representations.
+  String getStringRepresentation(DartType type, {bool expandRawType: false}) {
+    StringBuffer builder = new StringBuffer();
+    void build(DartType t) {
+      if (t is TypeVariableType) {
+        builder.add(t.name.slowToString());
+        return;
+      }
+      JavaScriptBackend backend = compiler.backend;
+      builder.add(backend.namer.getName(t.element));
+      if (t is InterfaceType) {
+        InterfaceType interface = t;
+        ClassElement element = t.element;
+        if (element.typeVariables.isEmpty) return;
+        bool isRaw = interface.typeArguments.isEmpty;
+        if (isRaw && !expandRawType) return;
+        builder.add('<');
+        Iterable items =
+            isRaw ? element.typeVariables : interface.typeArguments;
+        var stringify = isRaw ? (_) => 'dynamic' : (type) => type.toString();
+        bool first = true;
+        for (var item in items) {
+          if (first) {
+            first = false;
+          } else {
+            builder.add(', ');
+          }
+          builder.add(stringify(item));
+        }
+        builder.add('>');
+      }
+    }
+
+    build(type);
+    return builder.toString();
+  }
+
+  static bool hasTypeArguments(DartType type) {
+    if (type is InterfaceType) {
+      InterfaceType interfaceType = type;
+      return !interfaceType.typeArguments.isEmpty;
+    }
+    return false;
+  }
+
+  static int getTypeVariableIndex(TypeVariableType variable) {
+    ClassElement classElement = variable.element.getEnclosingClass();
+    Link<DartType> variables = classElement.typeVariables;
+    for (int index = 0; !variables.isEmpty;
+         index++, variables = variables.tail) {
+      if (variables.head == variable) return index;
+    }
+  }
+}
diff --git a/sdk/lib/_internal/compiler/implementation/lib/core_patch.dart b/sdk/lib/_internal/compiler/implementation/lib/core_patch.dart
index 253c1fa..21cf6e1 100644
--- a/sdk/lib/_internal/compiler/implementation/lib/core_patch.dart
+++ b/sdk/lib/_internal/compiler/implementation/lib/core_patch.dart
@@ -82,7 +82,7 @@
   patch static double parse(String source) => Primitives.parseDouble(source);
 }
 
-patch class NoSuchMethodError {
+patch class Error {
   patch static String _objectToString(Object object) {
     return Primitives.objectToString(object);
   }
@@ -154,22 +154,13 @@
 
 
 // Patch for List implementation.
-patch class _ListImpl<E> {
+patch class List<E> {
   patch factory List([int length]) => Primitives.newList(length);
-
-  patch factory List.from(Iterable<E> other) {
-    var result = new List();
-    for (var element in other) {
-      result.add(element);
-    }
-    return result;
-  }
 }
 
 
 patch class String {
   patch factory String.fromCharCodes(List<int> charCodes) {
-    checkNull(charCodes);
     if (!isJsArray(charCodes)) {
       if (charCodes is !List) throw new ArgumentError(charCodes);
       charCodes = new List.from(charCodes);
@@ -182,7 +173,6 @@
 patch class Strings {
   patch static String join(List<String> strings, String separator) {
     checkNull(strings);
-    checkNull(separator);
     if (separator is !String) throw new ArgumentError(separator);
     return stringJoinUnchecked(_toJsStringArray(strings), separator);
   }
@@ -199,14 +189,12 @@
       array = strings;
       for (int i = 0; i < length; i++) {
         final string = strings[i];
-        checkNull(string);
         if (string is !String) throw new ArgumentError(string);
       }
     } else {
       array = new List(length);
       for (int i = 0; i < length; i++) {
         final string = strings[i];
-        checkNull(string);
         if (string is !String) throw new ArgumentError(string);
         array[i] = string;
       }
diff --git a/sdk/lib/_internal/compiler/implementation/lib/interceptors.dart b/sdk/lib/_internal/compiler/implementation/lib/interceptors.dart
index ca685dc..c87e763 100644
--- a/sdk/lib/_internal/compiler/implementation/lib/interceptors.dart
+++ b/sdk/lib/_internal/compiler/implementation/lib/interceptors.dart
@@ -7,6 +7,7 @@
 import 'dart:collection';
 
 part 'js_array.dart';
+part 'js_number.dart';
 part 'js_string.dart';
 
 /**
@@ -25,465 +26,45 @@
 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();
 }
 
-get$length(var receiver) {
-  if (receiver is String || isJsArray(receiver)) {
-    return JS('num', r'#.length', receiver);  // TODO(sra): Use 'int'?
-  } else {
-    return UNINTERCEPTED(receiver.length);
-  }
-}
-
-set$length(receiver, newLength) {
-  if (isJsArray(receiver)) {
-    checkNull(newLength); // TODO(ahe): This is not specified but co19 tests it.
-    if (newLength is !int) throw new ArgumentError(newLength);
-    if (newLength < 0) throw new RangeError.value(newLength);
-    checkGrowable(receiver, 'set length');
-    JS('void', r'#.length = #', receiver, newLength);
-  } else {
-    UNINTERCEPTED(receiver.length = newLength);
-  }
-  return newLength;
-}
-
-toString(var value) {
-  if (JS('bool', r'typeof # == "object" && # != null', value, value)) {
-    if (isJsArray(value)) {
-      return Collections.collectionToString(value);
-    } else {
-      return UNINTERCEPTED(value.toString());
-    }
-  }
-  if (JS('bool', r'# === 0 && (1 / #) < 0', value, value)) {
-    return '-0.0';
-  }
-  if (value == null) return 'null';
-  if (JS('bool', r'typeof # == "function"', value)) {
-    return 'Closure';
-  }
-  return JS('String', r'String(#)', value);
-}
-
-get$isEmpty(receiver) {
-  if (receiver is String || isJsArray(receiver)) {
-    return JS('bool', r'#.length === 0', receiver);
-  }
-  return UNINTERCEPTED(receiver.isEmpty);
-}
-
-compareTo(a, b) {
-  if (checkNumbers(a, b)) {
-    if (a < b) {
-      return -1;
-    } else if (a > b) {
-      return 1;
-    } else if (a == b) {
-      if (a == 0) {
-        bool aIsNegative = a.isNegative;
-        bool bIsNegative = b.isNegative;
-        if (aIsNegative == bIsNegative) return 0;
-        if (aIsNegative) return -1;
-        return 1;
-      }
-      return 0;
-    } else if (a.isNaN) {
-      if (b.isNaN) {
-        return 0;
-      }
-      return 1;
-    } else {
-      return -1;
-    }
-  } else if (a is String) {
-    if (b is !String) throw new ArgumentError(b);
-    return JS('bool', r'# == #', a, b) ? 0
-      : JS('bool', r'# < #', a, b) ? -1 : 1;
-  } else {
-    return UNINTERCEPTED(a.compareTo(b));
-  }
-}
-
-iterator(receiver) {
-  if (isJsArray(receiver)) {
-    return new ListIterator(receiver);
-  }
-  return UNINTERCEPTED(receiver.iterator());
-}
-
-indexOf$1(receiver, element) {
-  if (isJsArray(receiver)) {
-    var length = JS('num', r'#.length', receiver);
-    return Arrays.indexOf(receiver, element, 0, length);
-  } else if (receiver is String) {
-    checkNull(element);
-    if (element is !String) throw new ArgumentError(element);
-    return JS('int', r'#.indexOf(#)', receiver, element);
-  }
-  return UNINTERCEPTED(receiver.indexOf(element));
-}
-
-indexOf$2(receiver, element, start) {
-  if (isJsArray(receiver)) {
-    if (start is !int) throw new ArgumentError(start);
-    var length = JS('num', r'#.length', receiver);
-    return Arrays.indexOf(receiver, element, start, length);
-  } else if (receiver is String) {
-    checkNull(element);
-    if (start is !int) throw new ArgumentError(start);
-    if (element is !String) throw new ArgumentError(element);
-    if (start < 0) return -1; // TODO(ahe): Is this correct?
-    return JS('int', r'#.indexOf(#, #)', receiver, element, start);
-  }
-  return UNINTERCEPTED(receiver.indexOf(element, start));
-}
-
-insertRange$2(receiver, start, length) {
-  if (isJsArray(receiver)) {
-    return insertRange$3(receiver, start, length, null);
-  }
-  return UNINTERCEPTED(receiver.insertRange(start, length));
-}
-
-insertRange$3(receiver, start, length, initialValue) {
-  if (!isJsArray(receiver)) {
-    return UNINTERCEPTED(receiver.insertRange(start, length, initialValue));
-  }
-  return listInsertRange(receiver, start, length, initialValue);
-}
-
-get$last(receiver) {
-  if (!isJsArray(receiver)) {
-    return UNINTERCEPTED(receiver.last);
-  }
-  return receiver[receiver.length - 1];
-}
-
-lastIndexOf$1(receiver, element) {
-  if (isJsArray(receiver)) {
-    var start = JS('num', r'#.length', receiver);
-    return Arrays.lastIndexOf(receiver, element, start);
-  } else if (receiver is String) {
-    checkNull(element);
-    if (element is !String) throw new ArgumentError(element);
-    return JS('int', r'#.lastIndexOf(#)', receiver, element);
-  }
-  return UNINTERCEPTED(receiver.lastIndexOf(element));
-}
-
-lastIndexOf$2(receiver, element, start) {
-  if (isJsArray(receiver)) {
-    return Arrays.lastIndexOf(receiver, element, start);
-  } else if (receiver is String) {
-    checkNull(element);
-    if (element is !String) throw new ArgumentError(element);
-    if (start != null) {
-      if (start is !num) throw new ArgumentError(start);
-      if (start < 0) return -1;
-      if (start >= receiver.length) {
-        if (element == "") return receiver.length;
-        start = receiver.length - 1;
-      }
-    }
-    return stringLastIndexOfUnchecked(receiver, element, start);
-  }
-  return UNINTERCEPTED(receiver.lastIndexOf(element, start));
-}
-
-removeRange(receiver, start, length) {
-  if (!isJsArray(receiver)) {
-    return UNINTERCEPTED(receiver.removeRange(start, length));
-  }
-  checkGrowable(receiver, 'removeRange');
-  if (length == 0) {
-    return;
-  }
-  checkNull(start); // TODO(ahe): This is not specified but co19 tests it.
-  checkNull(length); // TODO(ahe): This is not specified but co19 tests it.
-  if (start is !int) throw new ArgumentError(start);
-  if (length is !int) throw new ArgumentError(length);
-  if (length < 0) throw new ArgumentError(length);
-  var receiverLength = JS('num', r'#.length', receiver);
-  if (start < 0 || start >= receiverLength) {
-    throw new RangeError.value(start);
-  }
-  if (start + length > receiverLength) {
-    throw new RangeError.value(start + length);
-  }
-  Arrays.copy(receiver,
-              start + length,
-              receiver,
-              start,
-              receiverLength - length - start);
-  receiver.length = receiverLength - length;
-}
-
-setRange$3(receiver, start, length, from) {
-  if (isJsArray(receiver)) {
-    return setRange$4(receiver, start, length, from, 0);
-  }
-  return UNINTERCEPTED(receiver.setRange(start, length, from));
-}
-
-setRange$4(receiver, start, length, from, startFrom) {
-  if (!isJsArray(receiver)) {
-    return UNINTERCEPTED(receiver.setRange(start, length, from, startFrom));
-  }
-
-  checkMutable(receiver, 'indexed set');
-  if (length == 0) return;
-  checkNull(start); // TODO(ahe): This is not specified but co19 tests it.
-  checkNull(length); // TODO(ahe): This is not specified but co19 tests it.
-  checkNull(from); // TODO(ahe): This is not specified but co19 tests it.
-  checkNull(startFrom); // TODO(ahe): This is not specified but co19 tests it.
-  if (start is !int) throw new ArgumentError(start);
-  if (length is !int) throw new ArgumentError(length);
-  if (startFrom is !int) throw new ArgumentError(startFrom);
-  if (length < 0) throw new ArgumentError(length);
-  if (start < 0) throw new RangeError.value(start);
-  if (start + length > receiver.length) {
-    throw new RangeError.value(start + length);
-  }
-
-  Arrays.copy(from, startFrom, receiver, start, length);
-}
-
-some(receiver, f) {
-  if (!isJsArray(receiver)) {
-    return UNINTERCEPTED(receiver.some(f));
-  } else {
-    return Collections.some(receiver, f);
-  }
-}
-
-every(receiver, f) {
-  if (!isJsArray(receiver)) {
-    return UNINTERCEPTED(receiver.every(f));
-  } else {
-    return Collections.every(receiver, f);
-  }
-}
-
-// TODO(ngeoffray): Make it possible to have just one "sort" function ends
-// an optional parameter.
-
-sort$0(receiver) {
-  if (!isJsArray(receiver)) return UNINTERCEPTED(receiver.sort());
-  checkMutable(receiver, 'sort');
-  coreSort(receiver, Comparable.compare);
-}
-
-sort$1(receiver, compare) {
-  if (!isJsArray(receiver)) return UNINTERCEPTED(receiver.sort(compare));
-  checkMutable(receiver, 'sort');
-  coreSort(receiver, compare);
-}
-
-get$isNegative(receiver) {
-  if (receiver is num) {
-    return (receiver == 0) ? (1 / receiver) < 0 : receiver < 0;
-  } else {
-    return UNINTERCEPTED(receiver.isNegative);
-  }
-}
-
-get$isNaN(receiver) {
-  if (receiver is num) {
-    return JS('bool', r'isNaN(#)', receiver);
-  } else {
-    return UNINTERCEPTED(receiver.isNaN);
-  }
-}
-
-remainder(a, b) {
-  if (checkNumbers(a, b)) {
-    return JS('num', r'# % #', a, b);
-  } else {
-    return UNINTERCEPTED(a.remainder(b));
-  }
-}
-
-abs(receiver) {
-  if (receiver is !num) return UNINTERCEPTED(receiver.abs());
-
-  return JS('num', r'Math.abs(#)', receiver);
-}
-
-toInt(receiver) {
-  if (receiver is !num) return UNINTERCEPTED(receiver.toInt());
-
-  if (receiver.isNaN) throw new FormatException('NaN');
-
-  if (receiver.isInfinite) throw new FormatException('Infinity');
-
-  var truncated = receiver.truncate();
-  return JS('bool', r'# == -0.0', truncated) ? 0 : truncated;
-}
-
-ceil(receiver) {
-  if (receiver is !num) return UNINTERCEPTED(receiver.ceil());
-
-  return JS('num', r'Math.ceil(#)', receiver);
-}
-
-floor(receiver) {
-  if (receiver is !num) return UNINTERCEPTED(receiver.floor());
-
-  return JS('num', r'Math.floor(#)', receiver);
-}
-
-get$isInfinite(receiver) {
-  if (receiver is !num) return UNINTERCEPTED(receiver.isInfinite);
-
-  return JS('bool', r'# == Infinity', receiver)
-    || JS('bool', r'# == -Infinity', receiver);
-}
-
-round(receiver) {
-  if (receiver is !num) return UNINTERCEPTED(receiver.round());
-
-  if (JS('bool', r'# < 0', receiver)) {
-    return JS('num', r'-Math.round(-#)', receiver);
-  } else {
-    return JS('num', r'Math.round(#)', receiver);
-  }
-}
-
-toDouble(receiver) {
-  if (receiver is !num) return UNINTERCEPTED(receiver.toDouble());
-
-  return receiver;
-}
-
-truncate(receiver) {
-  if (receiver is !num) return UNINTERCEPTED(receiver.truncate());
-
-  return receiver < 0 ? receiver.ceil() : receiver.floor();
-}
-
-toStringAsFixed(receiver, fractionDigits) {
-  if (receiver is !num) {
-    return UNINTERCEPTED(receiver.toStringAsFixed(fractionDigits));
-  }
-  checkNum(fractionDigits);
-
-  String result = JS('String', r'#.toFixed(#)', receiver, fractionDigits);
-  if (receiver == 0 && receiver.isNegative) return "-$result";
-  return result;
-}
-
-toStringAsExponential(receiver, fractionDigits) {
-  if (receiver is !num) {
-    return UNINTERCEPTED(receiver.toStringAsExponential(fractionDigits));
-  }
-  String result;
-  if (fractionDigits != null) {
-    checkNum(fractionDigits);
-    result = JS('String', r'#.toExponential(#)', receiver, fractionDigits);
-  } else {
-    result = JS('String', r'#.toExponential()', receiver);
-  }
-  if (receiver == 0 && receiver.isNegative) return "-$result";
-  return result;
-}
-
-toStringAsPrecision(receiver, fractionDigits) {
-  if (receiver is !num) {
-    return UNINTERCEPTED(receiver.toStringAsPrecision(fractionDigits));
-  }
-  checkNum(fractionDigits);
-
-  String result = JS('String', r'#.toPrecision(#)',
-                     receiver, fractionDigits);
-  if (receiver == 0 && receiver.isNegative) return "-$result";
-  return result;
-}
-
-toRadixString(receiver, radix) {
-  if (receiver is !num) {
-    return UNINTERCEPTED(receiver.toRadixString(radix));
-  }
-  checkNum(radix);
-  if (radix < 2 || radix > 36) throw new ArgumentError(radix);
-  return JS('String', r'#.toString(#)', receiver, radix);
-}
-
-contains$1(receiver, other) {
-  if (receiver is String) {
-    return contains$2(receiver, other, 0);
-  } else if (isJsArray(receiver)) {
-    for (int i = 0; i < receiver.length; i++) {
-      if (other == receiver[i]) return true;
-    }
-    return false;
-  }
-  return UNINTERCEPTED(receiver.contains(other));
-}
-
-contains$2(receiver, other, startIndex) {
-  if (receiver is !String) {
-    return UNINTERCEPTED(receiver.contains(other, startIndex));
-  }
-  checkNull(other);
-  return stringContainsUnchecked(receiver, other, startIndex);
+/**
+ * The interceptor class for tear-off static methods. Unlike
+ * tear-off instance methods, tear-off static methods are just the JS
+ * function, and methods inherited from Object must therefore be
+ * intercepted.
+ */
+class JSFunction implements Function {
+  const JSFunction();
+  String toString() => 'Closure';
 }
 
 /**
- * This is the [Jenkins hash function][1] but using masking to keep
- * values in SMI range.
- *
- * [1]: http://en.wikipedia.org/wiki/Jenkins_hash_function
+ * The interceptor class for [bool].
  */
-get$hashCode(receiver) {
-  // TODO(ahe): This method shouldn't have to use JS. Update when our
-  // optimizations are smarter.
-  if (receiver == null) return 0;
-  if (receiver is num) return receiver & 0x1FFFFFFF;
-  if (receiver is bool) return receiver ? 0x40377024 : 0xc18c0076;
-  if (isJsArray(receiver)) return Primitives.objectHashCode(receiver);
-  if (receiver is !String) return UNINTERCEPTED(receiver.hashCode);
-  int hash = 0;
-  int length = receiver.length;
-  for (int i = 0; i < length; i++) {
-    hash = 0x1fffffff & (hash + JS('int', r'#.charCodeAt(#)', receiver, i));
-    hash = 0x1fffffff & (hash + (0x0007ffff & hash) << 10);
-    hash = JS('int', '# ^ (# >> 6)', hash, hash);
-  }
-  hash = 0x1fffffff & (hash + (0x03ffffff & hash) <<  3);
-  hash = JS('int', '# ^ (# >> 11)', hash, hash);
-  return 0x1fffffff & (hash + (0x00003fff & hash) << 15);
+class JSBool implements bool {
+  const JSBool();
+  String toString() => JS('String', r'String(#)', this);
+
+  // The values here are SMIs, co-prime and differ about half of the bit
+  // positions, including the low bit, so they are different mod 2^k.
+  int get hashCode => this ? (2 * 3 * 23 * 3761) : (269 * 811);
+
+  Type get runtimeType => bool;
 }
 
-get$isEven(receiver) {
-  if (receiver is !int) return UNINTERCEPTED(receiver.isEven);
-  return (receiver & 1) == 0;
+/**
+ * The interceptor class for [Null].
+ */
+class JSNull implements Null {
+  const JSNull();
+  String toString() => 'null';
+  int get hashCode => 0;
+  Type get runtimeType => createRuntimeType('Null');
 }
-
-get$isOdd(receiver) {
-  if (receiver is !int) return UNINTERCEPTED(receiver.isOdd);
-  return (receiver & 1) == 1;
-}
-
-get$runtimeType(receiver) {
-  if (receiver is int) {
-    return createRuntimeType('int');
-  } else if (receiver is String) {
-    return createRuntimeType('String');
-  } else if (receiver is double) {
-    return createRuntimeType('double');
-  } else if (receiver is bool) {
-    return createRuntimeType('bool');
-  } else if (receiver == null) {
-    return createRuntimeType('Null');
-  } else if (isJsArray(receiver)) {
-    return createRuntimeType('List');
-  } else {
-    return UNINTERCEPTED(receiver.runtimeType);
-  }
-}
-
-// TODO(lrn): These getters should be generated automatically for all
-// intercepted methods.
-get$toString(receiver) => () => toString(receiver);
diff --git a/sdk/lib/_internal/compiler/implementation/lib/io_patch.dart b/sdk/lib/_internal/compiler/implementation/lib/io_patch.dart
index e06bd18..a253935 100644
--- a/sdk/lib/_internal/compiler/implementation/lib/io_patch.dart
+++ b/sdk/lib/_internal/compiler/implementation/lib/io_patch.dart
@@ -167,15 +167,16 @@
   patch factory Socket(String host, int port) => new _Socket(host, port);
 }
 
-patch class TlsSocket {
-  patch static void setCertificateDatabase(String pkcertDirectory) {
-    throw new UnsupportedError("TlsSocket.setCertificateDatabase");
+patch class SecureSocket {
+  patch static void setCertificateDatabase(String certificateDatabase,
+                                           [String password]) {
+    throw new UnsupportedError("SecureSocket.setCertificateDatabase");
   }
 }
 
-patch class _TlsFilter {
-  patch factory _TlsFilter() {
-    throw new UnsupportedError("_TlsFilter._TlsFilter");
+patch class _SecureFilter {
+  patch factory _SecureFilter() {
+    throw new UnsupportedError("_SecureFilter._SecureFilter");
   }
 }
 
diff --git a/sdk/lib/_internal/compiler/implementation/lib/js_array.dart b/sdk/lib/_internal/compiler/implementation/lib/js_array.dart
index 9f5db9b..a4f069d 100644
--- a/sdk/lib/_internal/compiler/implementation/lib/js_array.dart
+++ b/sdk/lib/_internal/compiler/implementation/lib/js_array.dart
@@ -38,7 +38,7 @@
   }
 
   void addAll(Collection<E> collection) {
-    for (Element e in collection) {
+    for (E e in collection) {
       this.add(e);
     }
   }
@@ -78,6 +78,106 @@
       throw new RangeError.value(length);
     }
     if (length < 0) throw new ArgumentError(length);
-    return JS('List', r'#.slice(#, #)', this, start, end);
+    return JS('=List', r'#.slice(#, #)', this, start, end);
+  }
+
+  void insertRange(int start, int length, [E initialValue]) {
+    return listInsertRange(this, start, length, initialValue);
+  }
+
+  E get last => this[length - 1];
+
+  E get first => this[0];
+
+  void removeRange(int start, int length) {
+    checkGrowable(this, 'removeRange');
+    if (length == 0) {
+      return;
+    }
+    checkNull(start); // TODO(ahe): This is not specified but co19 tests it.
+    checkNull(length); // TODO(ahe): This is not specified but co19 tests it.
+    if (start is !int) throw new ArgumentError(start);
+    if (length is !int) throw new ArgumentError(length);
+    if (length < 0) throw new ArgumentError(length);
+    var receiverLength = this.length;
+    if (start < 0 || start >= receiverLength) {
+      throw new RangeError.value(start);
+    }
+    if (start + length > receiverLength) {
+      throw new RangeError.value(start + length);
+    }
+    Arrays.copy(this,
+                start + length,
+                this,
+                start,
+                receiverLength - length - start);
+    this.length = receiverLength - length;
+  }
+
+  void setRange(int start, int length, List<E> from, [int startFrom = 0]) {
+    checkMutable(this, 'indexed set');
+    if (length == 0) return;
+    checkNull(start); // TODO(ahe): This is not specified but co19 tests it.
+    checkNull(length); // TODO(ahe): This is not specified but co19 tests it.
+    checkNull(from); // TODO(ahe): This is not specified but co19 tests it.
+    checkNull(startFrom); // TODO(ahe): This is not specified but co19 tests it.
+    if (start is !int) throw new ArgumentError(start);
+    if (length is !int) throw new ArgumentError(length);
+    if (startFrom is !int) throw new ArgumentError(startFrom);
+    if (length < 0) throw new ArgumentError(length);
+    if (start < 0) throw new RangeError.value(start);
+    if (start + length > this.length) {
+      throw new RangeError.value(start + length);
+    }
+
+    Arrays.copy(from, startFrom, this, start, length);
+  }
+
+  bool some(bool f(E element)) => Collections.some(this, f);
+
+  bool every(bool f(E element)) => Collections.every(this, f);
+
+  void sort([Comparator<E> compare = Comparable.compare]) {
+    checkMutable(this, 'sort');
+    coreSort(this, compare);
+  }
+
+  int indexOf(E element, [int start = 0]) {
+    if (start is !int) throw new ArgumentError(start);
+    return Arrays.indexOf(this, element, start, length);
+  }
+
+  int lastIndexOf(E element, [int start]) {
+    if (start == null) start = this.length - 1;
+    return Arrays.lastIndexOf(this, element, start);
+  }
+
+  bool contains(E other) {
+    for (int i = 0; i < length; i++) {
+      if (other == this[i]) return true;
+    }
+    return false;
+  }
+
+  bool get isEmpty => length == 0;
+
+  String toString() => Collections.collectionToString(this);
+
+  ListIterator iterator() => new ListIterator(this);
+
+  int get hashCode => Primitives.objectHashCode(this);
+
+  Type get runtimeType {
+    // Call getRuntimeTypeString to get the name including type arguments.
+    return new TypeImpl(getRuntimeTypeString(this));
+  }
+
+  int get length => JS('int', r'#.length', this);
+  
+  void set length(int newLength) {
+    if (newLength is !int) throw new ArgumentError(newLength);
+    if (newLength < 0) throw new RangeError.value(newLength);
+    checkGrowable(this, 'set length');
+    JS('void', r'#.length = #', this, newLength);
   }
 }
diff --git a/sdk/lib/_internal/compiler/implementation/lib/js_helper.dart b/sdk/lib/_internal/compiler/implementation/lib/js_helper.dart
index 8e9dbb1..ea31fe2 100644
--- a/sdk/lib/_internal/compiler/implementation/lib/js_helper.dart
+++ b/sdk/lib/_internal/compiler/implementation/lib/js_helper.dart
@@ -62,7 +62,7 @@
     : identical(le$slow(a, b), true);
 
 index(var a, var index) {
-  // The type test may cause a NullPointerException to be thrown but
+  // The type test may cause a NoSuchMethodError to be thrown but
   // that matches the specification of what the indexing operator is
   // supposed to do.
   bool isJsArrayOrString = JS('bool',
@@ -78,7 +78,7 @@
 }
 
 indexSet(var a, var index, var value) {
-  // The type test may cause a NullPointerException to be thrown but
+  // The type test may cause a NoSuchMethodError to be thrown but
   // that matches the specification of what the indexing operator is
   // supposed to do.
   bool isMutableJsArray = JS('bool',
@@ -105,7 +105,6 @@
     if (b is num) {
       return true;
     } else {
-      checkNull(b);
       throw new ArgumentError(b);
     }
   }
@@ -536,9 +535,27 @@
 
   static num dateNow() => JS('num', r'Date.now()');
 
+  static stringFromCodePoints(codePoints) {
+    List<int> a = <int>[];
+    for (var i in codePoints) {
+      if (i is !int) throw new ArgumentError(i);
+      if (i <= 0xffff) {
+        a.add(i);
+      } else if (i <= 0x10ffff) {
+        a.add(0xd800 + ((((i - 0x10000) >> 10) & 0x3ff)));
+        a.add(0xdc00 + (i & 0x3ff));
+      } else {
+        throw new ArgumentError(i);
+      }
+    }
+    return JS('String', r'String.fromCharCode.apply(#, #)', null, a);
+  }
+
   static String stringFromCharCodes(charCodes) {
     for (var i in charCodes) {
       if (i is !int) throw new ArgumentError(i);
+      if (i < 0) throw new ArgumentError(i);
+      if (i > 0xffff) return stringFromCodePoints(charCodes);
     }
     return JS('String', r'String.fromCharCode.apply(#, #)', null, charCodes);
   }
@@ -659,7 +676,6 @@
   }
 
   static valueFromDateString(str) {
-    checkNull(str);
     if (str is !String) throw new ArgumentError(str);
     var value = JS('num', r'Date.parse(#)', str);
     if (value.isNaN) throw new ArgumentError(str);
@@ -667,16 +683,14 @@
   }
 
   static getProperty(object, key) {
-    checkNull(object);
-    if (object is bool || object is num || object is String) {
+    if (object == null || object is bool || object is num || object is String) {
       throw new ArgumentError(object);
     }
     return JS('var', '#[#]', object, key);
   }
 
   static void setProperty(object, key, value) {
-    checkNull(object);
-    if (object is bool || object is num || object is String) {
+    if (object == null || object is bool || object is num || object is String) {
       throw new ArgumentError(object);
     }
     JS('void', '#[#] = #', object, key, value);
@@ -750,8 +764,6 @@
   if (length == 0) {
     return;
   }
-  checkNull(start); // TODO(ahe): This is not specified but co19 tests it.
-  checkNull(length); // TODO(ahe): This is not specified but co19 tests it.
   if (length is !int) throw new ArgumentError(length);
   if (length < 0) throw new ArgumentError(length);
   if (start is !int) throw new ArgumentError(start);
@@ -779,13 +791,12 @@
 
 
 checkNull(object) {
-  if (object == null) throw new NullPointerException();
+  if (object == null) throw new ArgumentError(null);
   return object;
 }
 
 checkNum(value) {
   if (value is !num) {
-    checkNull(value);
     throw new ArgumentError(value);
   }
   return value;
@@ -793,7 +804,6 @@
 
 checkInt(value) {
   if (value is !int) {
-    checkNull(value);
     throw new ArgumentError(value);
   }
   return value;
@@ -801,7 +811,6 @@
 
 checkBool(value) {
   if (value is !bool) {
-    checkNull(value);
     throw new ArgumentError(value);
   }
   return value;
@@ -809,7 +818,6 @@
 
 checkString(value) {
   if (value is !String) {
-    checkNull(value);
     throw new ArgumentError(value);
   }
   return value;
@@ -894,7 +902,7 @@
  * object out of the wrapper again.
  */
 $throw(ex) {
-  if (ex == null) ex = const NullPointerException();
+  if (ex == null) ex = const NullThrownError();
   var jsError = JS('var', r'new Error()');
   JS('void', r'#.name = #', jsError, ex);
   JS('void', r'#.description = #', jsError, ex);
@@ -954,11 +962,12 @@
     // exception occurred.
     var type = JS('var', r'#.type', ex);
     var name = JS('var', r'#.arguments ? #.arguments[0] : ""', ex, ex);
-    if (type == 'property_not_function' ||
+    if (contains(message, 'JSNull') ||
+        type == 'property_not_function' ||
         type == 'called_non_callable' ||
         type == 'non_object_property_call' ||
         type == 'non_object_property_load') {
-      return new NullPointerException();
+      return new NoSuchMethodError(null, name, [], {});
     } else if (type == 'undefined_method') {
       return new NoSuchMethodError('', name, [], {});
     }
@@ -972,8 +981,8 @@
       if (message.endsWith('is null') ||
           message.endsWith('is undefined') ||
           message.endsWith('is null or undefined')) {
-        return new NullPointerException();
-      } else if (message.contains(' is not a function') ||
+        return new NoSuchMethodError(null, '<unknown>', [], {});
+      } else if (contains(message, ' is not a function') ||
                  (ieErrorCode == 438 && ieFacilityNumber == 10)) {
         // Examples:
         //  x.foo is not a function
@@ -992,7 +1001,7 @@
   }
 
   if (JS('bool', r'# instanceof RangeError', ex)) {
-    if (message is String && message.contains('call stack')) {
+    if (message is String && contains(message, 'call stack')) {
       return new StackOverflowError();
     }
 
@@ -1114,6 +1123,42 @@
 
 /**
  * A metadata annotation describing the types instantiated by a native element.
+ *
+ * The annotation is valid on a native method and a field of a native class.
+ *
+ * By default, a field of a native class is seen as an instantiation point for
+ * all native classes that are a subtype of the field's type, and a native
+ * method is seen as an instantiation point fo all native classes that are a
+ * subtype of the method's return type, or the argument types of the declared
+ * type of the method's callback parameter.
+ *
+ * An @[Creates] annotation overrides the default set of instantiated types.  If
+ * one or more @[Creates] annotations are present, the type of the native
+ * element is ignored, and the union of @[Creates] annotations is used instead.
+ * The names in the strings are resolved and the program will fail to compile
+ * with dart2js if they do not name types.
+ *
+ * The argument to [Creates] is a string.  The string is parsed as the names of
+ * one or more types, separated by vertical bars `|`.  There are some special
+ * names:
+ *
+ * * `=List`. This means 'exactly List', which is the JavaScript Array
+ *   implementation of [List] and no other implementation.
+ *
+ * * `=Object`. This means 'exactly Object', which is a plain JavaScript object
+ *   with properties and none of the subtypes of Object.
+ *
+ * Example: we may know that a method always returns a specific implementation:
+ *
+ *     @Creates('_NodeList')
+ *     List<Node> getElementsByTagName(String tag) native;
+ *
+ * Useful trick: A method can be marked as not instantiating any native classes
+ * with the annotation `@Creates('Null')`.  This is useful for fields on native
+ * classes that are used only in Dart code.
+ *
+ *     @Creates('Null')
+ *     var _cachedFoo;
  */
 class Creates {
   final String types;
@@ -1123,6 +1168,23 @@
 /**
  * A metadata annotation describing the types returned or yielded by a native
  * element.
+ *
+ * The annotation is valid on a native method and a field of a native class.
+ *
+ * By default, a native method or field is seen as returning or yielding all
+ * subtypes if the method return type or field type.  This annotation allows a
+ * more precise set of types to be specified.
+ *
+ * See [Creates] for the syntax of the argument.
+ *
+ * Example: IndexedDB keys are numbers, strings and JavaScript Arrays of keys.
+ *
+ *     @Returns('String|num|=List')
+ *     dynamic key;
+ *
+ *     // Equivalent:
+ *     @Returns('String') @Returns('num') @Returns('=List')
+ *     dynamic key;
  */
 class Returns {
   final String types;
@@ -1142,6 +1204,7 @@
 }
 
 setRuntimeTypeInfo(target, typeInfo) {
+  assert(typeInfo == null || isJsArray(typeInfo));
   // We have to check for null because factories may return null.
   if (target != null) JS('var', r'#.builtin$typeInfo = #', target, typeInfo);
 }
@@ -1486,15 +1549,33 @@
   final String typeName;
   TypeImpl(this.typeName);
   toString() => typeName;
+  int get hashCode => typeName.hashCode;
   bool operator ==(other) {
     if (other is !TypeImpl) return false;
     return typeName == other.typeName;
   }
 }
 
+String getClassName(var object) {
+  return JS('String', r'#.constructor.builtin$cls', object);
+}
+
 String getRuntimeTypeString(var object) {
+  String className = isJsArray(object) ? 'List' : getClassName(object);
   var typeInfo = JS('var', r'#.builtin$typeInfo', object);
-  return JS('String', r'#.runtimeType', typeInfo);
+  if (typeInfo == null) return className;
+  StringBuffer arguments = new StringBuffer();
+  for (var i = 0; i < typeInfo.length; i++) {
+    if (i > 0) {
+      arguments.add(', ');
+    }
+    var argument = typeInfo[i];
+    if (argument == null) {
+      argument = 'dynamic';
+    }
+    arguments.add(argument);
+  }
+  return '$className<$arguments>';
 }
 
 createRuntimeType(String name) => new TypeImpl(name);
diff --git a/sdk/lib/_internal/compiler/implementation/lib/js_number.dart b/sdk/lib/_internal/compiler/implementation/lib/js_number.dart
new file mode 100644
index 0000000..e8e5750
--- /dev/null
+++ b/sdk/lib/_internal/compiler/implementation/lib/js_number.dart
@@ -0,0 +1,137 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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 _interceptors;
+
+/**
+ * The super interceptor class for [JSInt] and [JSDouble]. The compiler
+ * recognizes this class as an interceptor, and changes references to
+ * [:this:] to actually use the receiver of the method, which is
+ * generated as an extra argument added to each member.
+ */
+class JSNumber {
+  const JSNumber();
+
+  int compareTo(num b) {
+    if (b is! num) throw new ArgumentError(b);
+    if (this < b) {
+      return -1;
+    } else if (this > b) {
+      return 1;
+    } else if (this == b) {
+      if (this == 0) {
+        bool bIsNegative = b.isNegative;
+        if (isNegative == bIsNegative) return 0;
+        if (isNegative) return -1;
+        return 1;
+      }
+      return 0;
+    } else if (isNaN) {
+      if (b.isNaN) {
+        return 0;
+      }
+      return 1;
+    } else {
+      return -1;
+    }
+  }
+
+  bool get isNegative => (this == 0) ? (1 / this) < 0 : this < 0;
+
+  bool get isNaN => JS('bool', r'isNaN(#)', this);
+
+  num remainder(num b) {
+    checkNull(b); // TODO(ngeoffray): This is not specified but co19 tests it.
+    if (b is! num) throw new ArgumentError(b);
+    return JS('num', r'# % #', this, b);
+  }
+
+  num abs() => JS('num', r'Math.abs(#)', this);
+
+  int toInt() {
+    if (isNaN) throw new FormatException('NaN');
+    if (isInfinite) throw new FormatException('Infinity');
+    num truncated = truncate();
+    return JS('bool', r'# == -0.0', truncated) ? 0 : truncated;
+  }
+
+  num ceil() => JS('num', r'Math.ceil(#)', this);
+
+  num floor() => JS('num', r'Math.floor(#)', this);
+
+  bool get isInfinite {
+    return JS('bool', r'# == Infinity', this)
+      || JS('bool', r'# == -Infinity', this);
+  }
+
+  num round() {
+    if (this < 0) {
+      return JS('num', r'-Math.round(-#)', this);
+    } else {
+      return JS('num', r'Math.round(#)', this);
+    }
+  }
+
+  double toDouble() => this;
+
+  num truncate() => this < 0 ? ceil() : floor();
+
+  String toStringAsFixed(int fractionDigits) {
+    checkNum(fractionDigits);
+    String result = JS('String', r'#.toFixed(#)', this, fractionDigits);
+    if (this == 0 && isNegative) return "-$result";
+    return result;
+  }
+
+  String toStringAsExponential(int fractionDigits) {
+    String result;
+    if (fractionDigits != null) {
+      checkNum(fractionDigits);
+      result = JS('String', r'#.toExponential(#)', this, fractionDigits);
+    } else {
+      result = JS('String', r'#.toExponential()', this);
+    }
+    if (this == 0 && isNegative) return "-$result";
+    return result;
+  }
+
+  String toStringAsPrecision(int fractionDigits) {
+    checkNum(fractionDigits);
+    String result = JS('String', r'#.toPrecision(#)',
+                       this, fractionDigits);
+    if (this == 0 && isNegative) return "-$result";
+    return result;
+  }
+
+  String toRadixString(int radix) {
+    checkNum(radix);
+    if (radix < 2 || radix > 36) throw new ArgumentError(radix);
+    return JS('String', r'#.toString(#)', this, radix);
+  }
+
+  String toString() {
+    if (this == 0 && JS('bool', '(1 / #) < 0', this)) {
+      return '-0.0';
+    } else {
+      return JS('String', r'String(#)', this);
+    }
+  }
+
+  int get hashCode => this & 0x1FFFFFFF;
+}
+
+class JSInt extends JSNumber {
+  const JSInt();
+
+  bool get isEven => (this & 1) == 0;
+
+  bool get isOdd => (this & 1) == 1;
+
+  Type get runtimeType => int;
+}
+
+class JSDouble extends JSNumber {
+  const JSDouble();
+  Type get runtimeType => double;
+}
diff --git a/sdk/lib/_internal/compiler/implementation/lib/js_string.dart b/sdk/lib/_internal/compiler/implementation/lib/js_string.dart
index d796ef2..c8bb16c 100644
--- a/sdk/lib/_internal/compiler/implementation/lib/js_string.dart
+++ b/sdk/lib/_internal/compiler/implementation/lib/js_string.dart
@@ -89,8 +89,71 @@
   List<int> get charCodes  {
     List<int> result = new List<int>(length);
     for (int i = 0; i < length; i++) {
-      result[i] = charCodeAt(i);
+      result[i] = JS('int', '#.charCodeAt(#)', this, i);
     }
     return result;
   }
+
+  int indexOf(String other, [int start = 0]) {
+    checkNull(other);
+    if (start is !int) throw new ArgumentError(start);
+    if (other is !String) throw new ArgumentError(other);
+    if (start < 0) return -1;
+    return JS('int', r'#.indexOf(#, #)', this, other, start);
+  }
+
+  int lastIndexOf(String other, [int start]) {
+    checkNull(other);
+    if (other is !String) throw new ArgumentError(other);
+    if (start != null) {
+      if (start is !num) throw new ArgumentError(start);
+      if (start < 0) return -1;
+      if (start >= length) {
+        if (other == "") return length;
+        start = length - 1;
+      }
+    } else {
+      start = length - 1;
+    }
+    return stringLastIndexOfUnchecked(this, other, start);
+  }
+
+  bool contains(String other, [int startIndex = 0]) {
+    checkNull(other);
+    return stringContainsUnchecked(this, other, startIndex);
+  }
+
+  bool get isEmpty => length == 0;
+
+  int compareTo(String other) {
+    if (other is !String) throw new ArgumentError(other);
+    return this == other ? 0
+      : JS('bool', r'# < #', this, other) ? -1 : 1;
+  }
+
+  String toString() => this;
+
+  /**
+   * This is the [Jenkins hash function][1] but using masking to keep
+   * values in SMI range.
+   *
+   * [1]: http://en.wikipedia.org/wiki/Jenkins_hash_function
+   */
+  int get hashCode {
+    // TODO(ahe): This method shouldn't have to use JS. Update when our
+    // optimizations are smarter.
+    int hash = 0;
+    for (int i = 0; i < length; i++) {
+      hash = 0x1fffffff & (hash + JS('int', r'#.charCodeAt(#)', this, i));
+      hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10));
+      hash = JS('int', '# ^ (# >> 6)', hash, hash);
+    }
+    hash = 0x1fffffff & (hash + ((0x03ffffff & hash) <<  3));
+    hash = JS('int', '# ^ (# >> 11)', hash, hash);
+    return 0x1fffffff & (hash + ((0x00003fff & hash) << 15));
+  }
+
+  Type get runtimeType => String;
+
+  int get length => JS('int', r'#.length', this);
 }
diff --git a/sdk/lib/_internal/compiler/implementation/lib/native_helper.dart b/sdk/lib/_internal/compiler/implementation/lib/native_helper.dart
index f6ee855..98eea02 100644
--- a/sdk/lib/_internal/compiler/implementation/lib/native_helper.dart
+++ b/sdk/lib/_internal/compiler/implementation/lib/native_helper.dart
@@ -42,12 +42,14 @@
 String typeNameInFirefox(obj) {
   String name = JS('String', '#', constructorNameFallback(obj));
   if (name == 'Window') return 'DOMWindow';
-  if (name == 'XMLDocument') return 'Document';
-  if (name == 'WorkerMessageEvent') return 'MessageEvent';
-  if (name == 'DragEvent') return 'MouseEvent';
+  if (name == 'CSS2Properties') return 'CSSStyleDeclaration';
   if (name == 'DataTransfer') return 'Clipboard';
+  if (name == 'DragEvent') return 'MouseEvent';
+  if (name == 'GeoGeolocation') return 'Geolocation';
   if (name == 'MouseScrollEvent') return 'WheelEvent';
   if (name == 'OfflineResourceList') return 'DOMApplicationCache';
+  if (name == 'WorkerMessageEvent') return 'MessageEvent';
+  if (name == 'XMLDocument') return 'Document';
   return name;
 }
 
@@ -71,6 +73,7 @@
   if (name == 'HTMLPhraseElement') return 'HTMLElement';
   if (name == 'MSStyleCSSProperties') return 'CSSStyleDeclaration';
   if (name == 'MouseWheelEvent') return 'WheelEvent';
+  if (name == 'Position') return 'Geoposition';
   return name;
 }
 
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirror.dart b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirror.dart
index 825498e..5d4f253 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirror.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirror.dart
@@ -195,6 +195,11 @@
     // TODO(johnniwinther): implement this.
     throw 'unimplemented';
   }
+
+  void onDeprecatedFeature(Spannable span, String feature) {
+    // TODO(johnniwinther): implement this?
+    throw 'unimplemented';
+  }
 }
 
 //------------------------------------------------------------------------------
@@ -380,7 +385,8 @@
       librariesUri.add(cwd.resolve(library.toString()));
       // TODO(johnniwinther): Detect file not found
     }
-    _compiler.runList(librariesUri);
+    LibraryCompiler libraryCompiler = _compiler;
+    libraryCompiler.runList(librariesUri);
   }
 
   MirrorSystem get mirrors => new Dart2JsMirrorSystem(_compiler);
@@ -1163,7 +1169,7 @@
   List<TypeMirror> get typeArguments {
     if (_typeArguments == null) {
       _typeArguments = <TypeMirror>[];
-      Link<DartType> type = _interfaceType.arguments;
+      Link<DartType> type = _interfaceType.typeArguments;
       while (type != null && type.head != null) {
         _typeArguments.add(_convertTypeToTypeMirror(mirrors, type.head,
             mirrors.compiler.types.dynamicType));
diff --git a/sdk/lib/_internal/compiler/implementation/native_handler.dart b/sdk/lib/_internal/compiler/implementation/native_handler.dart
index 038fbdd..0c1579b 100644
--- a/sdk/lib/_internal/compiler/implementation/native_handler.dart
+++ b/sdk/lib/_internal/compiler/implementation/native_handler.dart
@@ -63,7 +63,7 @@
 }
 
 
-class NativeEnqueuerBase implements NativeEnqueuer {
+abstract class NativeEnqueuerBase implements NativeEnqueuer {
 
   /**
    * The set of all native classes.  Each native class is in [nativeClasses] and
@@ -303,8 +303,8 @@
     super.processNativeClasses(libraries);
 
     // HACK HACK - add all the resolved classes.
-    for (final classElement
-         in compiler.enqueuer.resolution.nativeEnqueuer.registeredClasses) {
+    NativeEnqueuerBase enqueuer = compiler.enqueuer.resolution.nativeEnqueuer;
+    for (final classElement in enqueuer.registeredClasses) {
       if (unusedClasses.contains(classElement)) {
         enqueueClass(classElement, 'was resolved');
       }
@@ -382,10 +382,10 @@
 class NativeBehavior {
 
   /// [DartType]s or [SpecialType]s returned or yielded by the native element.
-  final Collection typesReturned = [];
+  final List typesReturned = [];
 
   /// [DartType]s or [SpecialType]s instantiated by the native element.
-  final Collection typesInstantiated = [];
+  final List typesInstantiated = [];
 
   static final NativeBehavior NONE = new NativeBehavior();
 
@@ -432,8 +432,8 @@
     compiler.cancel("Unexpected JS first argument", node: firstArg);
   }
 
-  static NativeBehavior ofMethod(Element method, Compiler compiler) {
-    DartType type = method.computeType(compiler);
+  static NativeBehavior ofMethod(FunctionElement method, Compiler compiler) {
+    FunctionType type = method.computeType(compiler);
     var behavior = new NativeBehavior();
     behavior.typesReturned.add(type.returnType);
     behavior._capture(type, compiler);
@@ -479,14 +479,11 @@
       return e.computeType(compiler);
     }
 
-    var creates =
-        _collect(element, compiler,
-            compiler.enqueuer.resolution.nativeEnqueuer.annotationCreatesClass,
-            lookup);
-    var returns =
-        _collect(element, compiler,
-            compiler.enqueuer.resolution.nativeEnqueuer.annotationReturnsClass,
-            lookup);
+    NativeEnqueuerBase enqueuer = compiler.enqueuer.resolution.nativeEnqueuer;
+    var creates = _collect(element, compiler, enqueuer.annotationCreatesClass,
+                           lookup);
+    var returns = _collect(element, compiler, enqueuer.annotationReturnsClass,
+                           lookup);
 
     if (creates != null) {
       typesInstantiated..clear()..addAll(creates);
@@ -516,8 +513,9 @@
       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: ${annotation.parseNode(compiler)}');
+            'Annotations needs one string: ${partial.parseNode(compiler)}');
       }
       String specString = fields[0].toDartString().slowToString();
       for (final typeString in specString.split('|')) {
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/members.dart b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
index d2c8c11..713a03c 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/members.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
@@ -1038,6 +1038,18 @@
 
   TypeResolver(this.compiler);
 
+  bool anyMalformedTypesInThere(Link<DartType> list) {
+    for (Link<DartType> link = list;
+        !link.isEmpty;
+        link = link.tail) {
+      DartType dtype = link.head;
+      if (dtype is MalformedType) {
+        return true;
+      }
+    }
+    return false;
+  }
+
   Element resolveTypeName(Scope scope, TypeAnnotation node) {
     Identifier typeName = node.typeName.asIdentifier();
     Send send = node.typeName.asSend();
@@ -1081,6 +1093,7 @@
   DartType resolveTypeAnnotation(
       TypeAnnotation node,
       Scope scope,
+      bool inStaticContext,
       {onFailure(Node node, MessageKind kind, [List arguments]),
        whenResolved(Node node, DartType type)}) {
     if (onFailure == null) {
@@ -1092,11 +1105,12 @@
     if (scope == null) {
       compiler.internalError('resolveTypeAnnotation: no scope specified');
     }
-    return resolveTypeAnnotationInContext(scope, node, onFailure,
-                                          whenResolved);
+    return resolveTypeAnnotationInContext(scope, node, inStaticContext,
+        onFailure, whenResolved);
   }
 
   DartType resolveTypeAnnotationInContext(Scope scope, TypeAnnotation node,
+                                          bool inStaticContext,
                                           onFailure, whenResolved) {
     Element element = resolveTypeName(scope, node);
     DartType type;
@@ -1115,13 +1129,21 @@
         ClassElement cls = element;
         cls.ensureResolved(compiler);
         Link<DartType> arguments =
-            resolveTypeArguments(node, cls.typeVariables, scope,
+            resolveTypeArguments(node, cls.typeVariables,
+                                 inStaticContext, scope,
                                  onFailure, whenResolved);
         if (cls.typeVariables.isEmpty && arguments.isEmpty) {
           // Use the canonical type if it has no type parameters.
           type = cls.computeType(compiler);
         } else {
-          type = new InterfaceType(cls, arguments);
+          // In checked mode malformed-ness of the type argument bubbles up.
+          if (anyMalformedTypesInThere(arguments) &&
+              compiler.enableTypeAssertions) {
+            type = new MalformedType(
+                new MalformedTypeElement(node, element));
+          } else {
+            type = new InterfaceType(cls.declaration, arguments);
+          }
         }
       } else if (element.isTypedef()) {
         TypedefElement typdef = element;
@@ -1129,7 +1151,7 @@
         compiler.resolveTypedef(typdef);
         typdef.computeType(compiler);
         Link<DartType> arguments = resolveTypeArguments(
-            node, typdef.typeVariables,
+            node, typdef.typeVariables, inStaticContext,
             scope, onFailure, whenResolved);
         if (typdef.typeVariables.isEmpty && arguments.isEmpty) {
           // Return the canonical type if it has no type parameters.
@@ -1138,7 +1160,14 @@
           type = new TypedefType(typdef, arguments);
         }
       } else if (element.isTypeVariable()) {
-        type = element.computeType(compiler);
+        if (inStaticContext) {
+          compiler.reportWarning(node,
+              MessageKind.TYPE_VARIABLE_WITHIN_STATIC_MEMBER.message(
+                  [element]));
+          type = new MalformedType(new MalformedTypeElement(node, element));
+        } else {
+          type = element.computeType(compiler);
+        }
       } else {
         compiler.cancel("unexpected element kind ${element.kind}",
                         node: node);
@@ -1150,6 +1179,7 @@
 
   Link<DartType> resolveTypeArguments(TypeAnnotation node,
                                       Link<DartType> typeVariables,
+                                      bool inStaticContext,
                                       Scope scope, onFailure, whenResolved) {
     if (node.typeArguments == null) {
       return const Link<DartType>();
@@ -1163,6 +1193,7 @@
       }
       DartType argType = resolveTypeAnnotationInContext(scope,
                                                     typeArguments.head,
+                                                    inStaticContext,
                                                     onFailure,
                                                     whenResolved);
       arguments.addLast(argType);
@@ -1507,6 +1538,8 @@
 
     scope = oldScope;
     enclosingElement = previousEnclosingElement;
+
+    world.registerInstantiatedClass(compiler.functionClass);
   }
 
   visitIf(If node) {
@@ -1882,18 +1915,14 @@
         world.registerStaticUse(target.declaration);
       }
     }
-    if (target == null) {
-      // If we haven't found an element for this send, it might be a
-      // dynamic send on a primitive value. Register the selector with
-      // the world to add an interceptor, if necessary.
-      world.registerUsedSelector(selector);
-    }
   }
 
   visitLiteralInt(LiteralInt node) {
+    world.registerInstantiatedClass(compiler.intClass);
   }
 
   visitLiteralDouble(LiteralDouble node) {
+    world.registerInstantiatedClass(compiler.doubleClass);
   }
 
   visitLiteralBool(LiteralBool node) {
@@ -1932,7 +1961,7 @@
   void handleRedirectingFactoryBody(Return node) {
     Element redirectionTarget = resolveRedirectingFactory(node);
     var type = mapping.getType(node.expression);
-    if (type is InterfaceType && !type.arguments.isEmpty) {
+    if (type is InterfaceType && !type.typeArguments.isEmpty) {
       unimplemented(node.expression, 'type arguments on redirecting factory');
     }
     useElement(node.expression, redirectionTarget);
@@ -2052,28 +2081,17 @@
           argument.element.enclosingElement);
     } else if (argument is InterfaceType) {
       InterfaceType type = argument;
-      type.arguments.forEach((DartType argument) {
+      type.typeArguments.forEach((DartType argument) {
         analyzeTypeArgument(type, argument);
       });
     }
   }
 
   DartType resolveTypeAnnotation(TypeAnnotation node) {
-    // TODO(johnniwinther): Remove this together with the named arguments
-    // on [TypeResolver.resolveTypeAnnotation].
-    void checkAndUseType(TypeAnnotation annotation, DartType type) {
-      useType(annotation, type);
-      if (type != null &&
-          identical(type.kind, TypeKind.TYPE_VARIABLE) &&
-          enclosingElement.isInStaticMember()) {
-        warning(annotation, MessageKind.TYPE_VARIABLE_WITHIN_STATIC_MEMBER,
-                [type]);
-      }
-    }
-
     Function report = typeRequired ? error : warning;
     DartType type = typeResolver.resolveTypeAnnotation(
-        node, scope, onFailure: report, whenResolved: checkAndUseType);
+        node, scope, enclosingElement.isInStaticMember(),
+        onFailure: report, whenResolved: useType);
     if (type == null) return null;
     if (inCheckContext) {
       compiler.enqueuer.resolution.registerIsCheck(type);
@@ -2081,7 +2099,7 @@
     if (typeRequired || inCheckContext) {
       if (type is InterfaceType) {
         InterfaceType itf = type;
-        itf.arguments.forEach((DartType argument) {
+        itf.typeArguments.forEach((DartType argument) {
           analyzeTypeArgument(type, argument);
         });
       }
@@ -2440,7 +2458,8 @@
       TypeVariableElement variableElement = typeVariable.element;
       if (typeNode.bound != null) {
         DartType boundType = typeResolver.resolveTypeAnnotation(
-            typeNode.bound, scope, onFailure: warning);
+            typeNode.bound, scope, element.isInStaticMember(),
+            onFailure: warning);
         if (boundType != null && boundType.element == variableElement) {
           // TODO(johnniwinther): Check for more general cycles, like
           // [: <A extends B, B extends C, C extends B> :].
diff --git a/sdk/lib/_internal/compiler/implementation/resolved_visitor.dart b/sdk/lib/_internal/compiler/implementation/resolved_visitor.dart
index e53a3ff..1de6a79 100644
--- a/sdk/lib/_internal/compiler/implementation/resolved_visitor.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolved_visitor.dart
@@ -60,7 +60,7 @@
   R visitDynamicSend(Send node);
   R visitForeignSend(Send node);
   R visitStaticSend(Send node);
-  abstract R visitTypeReferenceSend(Send node);
+  R visitTypeReferenceSend(Send node);
 
   void internalError(String reason, {Node node});
 
diff --git a/sdk/lib/_internal/compiler/implementation/runtime_types.dart b/sdk/lib/_internal/compiler/implementation/runtime_types.dart
deleted file mode 100644
index 3f7967a..0000000
--- a/sdk/lib/_internal/compiler/implementation/runtime_types.dart
+++ /dev/null
@@ -1,94 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library runtime_types;
-
-import 'dart2jslib.dart';
-import 'elements/elements.dart';
-import 'tree/tree.dart';
-import 'universe/universe.dart';
-import 'util/util.dart';
-
-class RuntimeTypeInformation {
-  /**
-   * Names used for elements in runtime type information. This map is kept to
-   * detect elements with the same name and use a different name instead.
-   */
-  final Map<String, Element> usedNames = new Map<String, Element>();
-
-  /** Get a unique name for the element. */
-  String getName(Element element) {
-    String guess = element.name.slowToString();
-    String name = guess;
-    int id = 0;
-    while (usedNames.containsKey(name) && usedNames[name] != element) {
-      name = '$guess@$id';
-      id++;
-    }
-    usedNames[name] = element;
-    return name;
-  }
-
-  bool hasTypeArguments(DartType type) {
-    if (type is InterfaceType) {
-      InterfaceType interfaceType = type;
-      return !interfaceType.arguments.isEmpty;
-    }
-    return false;
-  }
-
-  /**
-   * Map type variables to strings calling [:stringify:] and joins the results
-   * to a single string separated by commas.
-   * The argument [:hasValue:] is used to treat variables that will not receive
-   * a value at the use site of the code that is generated with this function.
-   */
-  static String stringifyTypeVariables(Link collection,
-                                       int numberOfInputs,
-                                       stringify(TypeVariableType variable,
-                                                 bool hasValue)) {
-    int currentVariable = 0;
-    bool isFirst = true;
-    StringBuffer buffer = new StringBuffer();
-    collection.forEach((TypeVariableType variable) {
-      if (!isFirst) buffer.add(", ");
-      bool hasValue = currentVariable < numberOfInputs;
-      buffer.add(stringify(variable, hasValue));
-      isFirst = false;
-      currentVariable++;
-    });
-    return buffer.toString();
-  }
-
-  /**
-   * Generate a string representation template for this element, using '#' to
-   * denote the place for the type argument input. If there are more type
-   * variables than [numberOfInputs], 'dynamic' is used as the value for these
-   * arguments.
-   */
-  String generateRuntimeTypeString(ClassElement element, int numberOfInputs) {
-    String elementName = getName(element);
-    if (element.typeVariables.isEmpty) return "$elementName";
-    String stringify(_, bool hasValue) => hasValue ? "' + # + '" : "dynamic";
-    String arguments = stringifyTypeVariables(element.typeVariables,
-                                              numberOfInputs,
-                                              stringify);
-    return "$elementName<$arguments>";
-  }
-
-  /**
-   * Generate a string template for the runtime type fields that contain the
-   * type descriptions of the reified type arguments, using '#' to denote the
-   * place for the type argument value, or [:null:] if there are more than
-   * [numberOfInputs] type variables.
-   */
-  static String generateTypeVariableString(ClassElement element,
-                                           int numberOfInputs) {
-    String stringify(TypeVariableType variable, bool hasValue) {
-      return "'${variable.name.slowToString()}': #";
-    }
-    return stringifyTypeVariables(element.typeVariables, numberOfInputs,
-                                  stringify);
-  }
-}
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/listener.dart b/sdk/lib/_internal/compiler/implementation/scanner/listener.dart
index 783be1c..e8a15aa 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/listener.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/listener.dart
@@ -641,7 +641,7 @@
     return result;
   }
 
-  LiteralString popLiteralString() {
+  StringNode popLiteralString() {
     StringNode node = popNode();
     // TODO(lrn): Handle interpolations in script tags.
     if (node.isInterpolation) {
@@ -671,7 +671,7 @@
     if (asKeyword != null) {
       prefix = popNode();
     }
-    LiteralString uri = popLiteralString();
+    StringNode uri = popLiteralString();
     addLibraryTag(new Import(importKeyword, uri, prefix, combinators));
   }
 
@@ -703,7 +703,7 @@
   }
 
   void endPart(Token partKeyword, Token semicolon) {
-    LiteralString uri = popLiteralString();
+    StringNode uri = popLiteralString();
     addLibraryTag(new Part(partKeyword, uri));
   }
 
diff --git a/sdk/lib/_internal/compiler/implementation/source_map_builder.dart b/sdk/lib/_internal/compiler/implementation/source_map_builder.dart
index 06a6ca0..498c9fb 100644
--- a/sdk/lib/_internal/compiler/implementation/source_map_builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/source_map_builder.dart
@@ -57,9 +57,9 @@
     buffer.add('[');
     for (String string in strings) {
       if (!first) buffer.add(',');
-      buffer.add("'");
-      writeJsonEscapedCharsOn(string.charCodes.iterator(), buffer, null);
-      buffer.add("'");
+      buffer.add('"');
+      writeJsonEscapedCharsOn(string, buffer);
+      buffer.add('"');
       first = false;
     }
     buffer.add(']');
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/bailout.dart b/sdk/lib/_internal/compiler/implementation/ssa/bailout.dart
index e6423cd..a001ad5 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/bailout.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/bailout.dart
@@ -16,12 +16,12 @@
  */
 class Environment {
   final Set<HInstruction> lives;
-  final Set<HBasicBlock> loopMarkers;
+  final List<HBasicBlock> loopMarkers;
   Environment() : lives = new Set<HInstruction>(),
-                  loopMarkers = new Set<HBasicBlock>();
+                  loopMarkers = new List<HBasicBlock>();
   Environment.from(Environment other)
     : lives = new Set<HInstruction>.from(other.lives),
-      loopMarkers = new Set<HBasicBlock>.from(other.loopMarkers);
+      loopMarkers = new List<HBasicBlock>.from(other.loopMarkers);
 
   void remove(HInstruction instruction) {
     lives.remove(instruction);
@@ -48,17 +48,8 @@
     }
   }
 
-  void addLoopMarker(HBasicBlock block) {
-    loopMarkers.add(block);
-  }
-
-  void removeLoopMarker(HBasicBlock block) {
-    loopMarkers.remove(block);
-  }
-
   void addAll(Environment other) {
     lives.addAll(other.lives);
-    loopMarkers.addAll(other.loopMarkers);
   }
 
   bool get isEmpty => lives.isEmpty && loopMarkers.isEmpty;
@@ -257,10 +248,15 @@
   final Map<HBailoutTarget, Environment> capturedEnvironments;
   final Map<HBasicBlock, Environment> liveInstructions;
   Environment environment;
+  /**
+   * The set of current loop headers that dominate the current block.
+   */
+  Set<HBasicBlock> loopMarkers;
 
   SsaEnvironmentBuilder(Compiler this.compiler)
     : capturedEnvironments = new Map<HBailoutTarget, Environment>(),
-      liveInstructions = new Map<HBasicBlock, Environment>();
+      liveInstructions = new Map<HBasicBlock, Environment>(),
+      loopMarkers = new Set<HBasicBlock>();
 
 
   void visitGraph(HGraph graph) {
@@ -290,9 +286,9 @@
     // in this case {x}.
     capturedEnvironments.forEach((ignoredInstruction, env) {
       env.loopMarkers.forEach((HBasicBlock header) {
-        env.removeLoopMarker(header);
         env.addAll(liveInstructions[header]);
       });
+      env.loopMarkers.clear();
     });
   }
 
@@ -310,7 +306,8 @@
         // If we haven't computed the liveInstructions of that successor, we
         // know it must be a loop header.
         assert(successor.isLoopHeader());
-        environment.addLoopMarker(successor);
+        assert(!block.isLoopHeader());
+        loopMarkers.add(successor);
       }
 
       int index = successor.predecessors.indexOf(block);
@@ -319,6 +316,15 @@
       }
     }
 
+    if (block.isLoopHeader()) {
+      loopMarkers.remove(block);
+    }
+
+    // If the block is a loop header, we're adding all [loopMarkers]
+    // after removing it from the list of [loopMarkers], because
+    // it will just recompute the loop phis.
+    environment.loopMarkers.addAll(loopMarkers);
+
     // Iterate over all instructions to remove an instruction from the
     // environment and add its inputs.
     HInstruction instruction = block.last;
@@ -333,12 +339,6 @@
       environment.remove(phi);
     }
 
-    // If the block is a loop header, we can remove the loop marker,
-    // because it will just recompute the loop phis.
-    if (block.isLoopHeader()) {
-      environment.removeLoopMarker(block);
-    }
-
     // Finally save the liveInstructions of that block.
     liveInstructions[block] = environment;
   }
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
index b6137f2..cefee59 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
@@ -4,6 +4,21 @@
 
 part of ssa;
 
+/**
+ * A special element for the extra parameter taken by intercepted
+ * methods. We need to override [Element.computeType] because our
+ * optimizers may look at its declared type.
+ */
+class InterceptedElement extends Element {
+  final HType ssaType;
+  InterceptedElement(this.ssaType, Element enclosing)
+      : super(const SourceString('receiver'),
+              ElementKind.PARAMETER,
+              enclosing);
+
+  DartType computeType(Compiler compiler) => ssaType.computeType(compiler);
+}
+
 class Interceptors {
   Compiler compiler;
   Interceptors(Compiler this.compiler);
@@ -45,38 +60,13 @@
     compiler.unimplemented('Unknown operator', node: op);
   }
 
-  Element getStaticInterceptor(Selector selector) {
-    // Check if we have an interceptor method implemented with
-    // interceptor classes.
+  /**
+   * Returns a set of interceptor classes that contain a member whose
+   * signature matches the given [selector].
+   */
+  Set<ClassElement> getInterceptedClassesOn(Selector selector) {
     JavaScriptBackend backend = compiler.backend;
-    if (backend.shouldInterceptSelector(selector)) {
-      return backend.getInterceptorMethod;
-    }
-
-    // Fall back to the old interceptor mechanism.
-    String name = selector.name.slowToString();
-    if (selector.isGetter()) {
-      // TODO(lrn): If there is no get-interceptor, but there is a
-      // method-interceptor, we should generate a get-interceptor automatically.
-      String mangledName = "get\$$name";
-      return compiler.findInterceptor(new SourceString(mangledName));
-    } else if (selector.isSetter()) {
-      String mangledName = "set\$$name";
-      return compiler.findInterceptor(new SourceString(mangledName));
-    } else {
-      Element element = compiler.findInterceptor(new SourceString(name));
-      if (element != null && element.isFunction()) {
-        // Only pick the function element with the short name if the
-        // number of parameters it expects matches the number we're
-        // passing modulo the receiver.
-        FunctionElement function = element;
-        if (function.parameterCount(compiler) == selector.argumentCount + 1) {
-          return element;
-        }
-      }
-      String longMangledName = "$name\$${selector.argumentCount}";
-      return compiler.findInterceptor(new SourceString(longMangledName));
-    }
+    return backend.getInterceptedClassesOn(selector);
   }
 
   Element getOperatorInterceptor(Operator op) {
@@ -339,13 +329,16 @@
       scopeData.capturedVariableMapping.forEach((Element from, Element to) {
         // The [from] can only be a parameter for function-scopes and not
         // loop scopes.
-        if (from.isParameter()) {
-          // Store the captured parameter in the box. Get the current value
-          // before we put the redirection in place.
-          HInstruction instruction = readLocal(from);
-          redirectElement(from, to);
+        if (from.isParameter() && !element.isGenerativeConstructorBody()) {
           // Now that the redirection is set up, the update to the local will
           // write the parameter value into the box.
+          // Store the captured parameter in the box. Get the current value
+          // before we put the redirection in place.
+          // We don't need to update the local for a generative
+          // constructor body, because it receives a box that already
+          // contains the updates as the last parameter.
+          HInstruction instruction = readLocal(from);
+          redirectElement(from, to);
           updateLocal(from, instruction);
         } else {
           redirectElement(from, to);
@@ -389,6 +382,16 @@
       FunctionElement functionElement = element;
       FunctionSignature params = functionElement.computeSignature(compiler);
       params.orderedForEachParameter((Element parameterElement) {
+        if (element.isGenerativeConstructorBody()) {
+          ClosureScope scopeData = closureData.capturingScopes[node];
+          if (scopeData != null
+              && scopeData.capturedVariableMapping.containsKey(
+                  parameterElement)) {
+            // The parameter will be a field in the box passed as the
+            // last parameter. So no need to have it.
+            return;
+          }
+        }
         HInstruction parameter = builder.addParameter(parameterElement);
         builder.parameters[parameterElement] = parameter;
         directLocals[parameterElement] = parameter;
@@ -424,13 +427,32 @@
       directLocals[closureData.thisElement] = builder.thisInstruction;
     }
 
-    if (builder.backend.isInterceptorClass(element.getEnclosingClass())) {
-      Element parameter = new Element(
-          const SourceString('receiver'), ElementKind.VARIABLE, element);
+    // If this method is an intercepted method, add the extra
+    // parameter to it, that is the actual receiver.
+    ClassElement cls = element.getEnclosingClass();
+    if (builder.backend.isInterceptorClass(cls)) {
+      HType type = HType.UNKNOWN;
+      if (cls == builder.backend.jsArrayClass) {
+        type = HType.READABLE_ARRAY;
+      } else if (cls == builder.backend.jsStringClass) {
+        type = HType.STRING;
+      } else if (cls == builder.backend.jsNumberClass) {
+        type = HType.NUMBER;
+      } else if (cls == builder.backend.jsIntClass) {
+        type = HType.INTEGER;
+      } else if (cls == builder.backend.jsDoubleClass) {
+        type = HType.DOUBLE;
+      } else if (cls == builder.backend.jsNullClass) {
+        type = HType.NULL;
+      } else if (cls == builder.backend.jsBoolClass) {
+        type = HType.BOOLEAN;
+      }
+      Element parameter = new InterceptedElement(type, element);
       HParameterValue value = new HParameterValue(parameter);
       builder.graph.entry.addAfter(
           directLocals[closureData.thisElement], value);
       directLocals[closureData.thisElement] = value;
+      value.guaranteedType = type;
     }
   }
 
@@ -943,7 +965,7 @@
       parameters = new Map<Element, HInstruction>(),
       sourceElementStack = <Element>[work.element],
       inliningStack = <InliningState>[],
-      rti = builder.compiler.codegenWorld.rti,
+      rti = builder.backend.rti,
       super(work.resolutionTree) {
     localsHandler = new LocalsHandler(this);
   }
@@ -1431,12 +1453,11 @@
       FunctionSignature functionSignature = body.computeSignature(compiler);
       int arity = functionSignature.parameterCount;
       functionSignature.orderedForEachParameter((parameter) {
-        // TODO(ngeoffray): No need to pass the parameters that are
-        // captured and stored in a box. Because this information is
-        // not trivial to get in codegen.dart, we just pass the
-        // parameters anyway. We need to update both codegen.dart and
-        // builder.dart on how parameters are being passed.
-        bodyCallInputs.add(localsHandler.readLocal(parameter));
+        if (!localsHandler.isBoxed(parameter)) {
+          // The parameter will be a field in the box passed as the
+          // last parameter. So no need to pass it.
+          bodyCallInputs.add(localsHandler.readLocal(parameter));
+        }
       });
 
       // If parameters are checked, we pass the already computed
@@ -1561,11 +1582,22 @@
       // because that is where the type guards will also be inserted.
       // This way we ensure that a type guard will dominate the type
       // check.
-      signature.orderedForEachParameter((Element element) {
+      signature.orderedForEachParameter((Element parameterElement) {
+        if (element.isGenerativeConstructorBody()) {
+          ClosureScope scopeData =
+              localsHandler.closureData.capturingScopes[node];
+          if (scopeData != null
+              && scopeData.capturedVariableMapping.containsKey(
+                  parameterElement)) {
+            // The parameter will be a field in the box passed as the
+            // last parameter. So no need to have it.
+            return;
+          }
+        }
         HInstruction newParameter = potentiallyCheckType(
-            localsHandler.directLocals[element],
-            element.computeType(compiler));
-        localsHandler.directLocals[element] = newParameter;
+            localsHandler.directLocals[parameterElement],
+            parameterElement.computeType(compiler));
+        localsHandler.directLocals[parameterElement] = newParameter;
       });
 
       returnType = signature.returnType;
@@ -1800,11 +1832,11 @@
   // For while loops, initializer and update are null.
   // The condition function must return a boolean result.
   // None of the functions must leave anything on the stack.
-  handleLoop(Node loop,
-             void initialize(),
-             HInstruction condition(),
-             void update(),
-             void body()) {
+  void handleLoop(Node loop,
+                  void initialize(),
+                  HInstruction condition(),
+                  void update(),
+                  void body()) {
     // Generate:
     //  <initializer>
     //  loop-entry:
@@ -1909,23 +1941,83 @@
       updateGraph = new SubExpression(updateBlock, updateEndBlock);
     }
 
-    conditionBlock.postProcessLoopHeader();
+    if (jumpHandler.hasAnyContinue() || bodyBlock != null) {
+      endLoop(conditionBlock, conditionExitBlock, jumpHandler, savedLocals);
+      conditionBlock.postProcessLoopHeader();
+      HLoopBlockInformation info =
+          new HLoopBlockInformation(
+              HLoopBlockInformation.loopType(loop),
+              wrapExpressionGraph(initializerGraph),
+              wrapExpressionGraph(conditionExpression),
+              wrapStatementGraph(bodyGraph),
+              wrapExpressionGraph(updateGraph),
+              conditionBlock.loopInformation.target,
+              conditionBlock.loopInformation.labels,
+              sourceFileLocationForBeginToken(loop),
+              sourceFileLocationForEndToken(loop));
 
-    endLoop(conditionBlock, conditionExitBlock, jumpHandler, savedLocals);
-    HLoopBlockInformation info =
-        new HLoopBlockInformation(
-            HLoopBlockInformation.loopType(loop),
-            wrapExpressionGraph(initializerGraph),
+      startBlock.setBlockFlow(info, current);
+      loopInfo.loopBlockInformation = info;
+    } else {
+      // There is no back edge for the loop, so we turn the code into:
+      // if (condition) {
+      //   body;
+      // } else {
+      //   // We always create an empty else block to avoid critical edges.
+      // }
+      //
+      // If there is any break in the body, we attach a synthetic
+      // label to the if.
+      HBasicBlock elseBlock = addNewBlock();
+      open(elseBlock);
+      close(new HGoto());
+      endLoop(conditionBlock, null, jumpHandler, savedLocals);
+
+      // [endLoop] will not create an exit block if there are no
+      // breaks.
+      if (current == null) open(addNewBlock());
+      elseBlock.addSuccessor(current);
+      SubGraph elseGraph = new SubGraph(elseBlock, elseBlock);
+      // Remove the loop information attached to the header.
+      conditionBlock.loopInformation = null;
+
+      // Remove the [HLoopBranch] instruction and replace it with
+      // [HIf].
+      HInstruction condition = conditionExitBlock.last.inputs[0];
+      conditionExitBlock.addAtExit(new HIf(condition));
+      conditionExitBlock.addSuccessor(elseBlock);
+      conditionExitBlock.remove(conditionExitBlock.last);
+      HIfBlockInformation info =
+          new HIfBlockInformation(
             wrapExpressionGraph(conditionExpression),
             wrapStatementGraph(bodyGraph),
-            wrapExpressionGraph(updateGraph),
-            conditionBlock.loopInformation.target,
-            conditionBlock.loopInformation.labels,
-            sourceFileLocationForBeginToken(loop),
-            sourceFileLocationForEndToken(loop));
+            wrapStatementGraph(elseGraph));
 
-    startBlock.setBlockFlow(info, current);
-    loopInfo.loopBlockInformation = info;
+      conditionBlock.setBlockFlow(info, current);
+      HIf ifBlock = conditionBlock.last;
+      ifBlock.blockInformation = conditionBlock.blockFlow;
+
+      // If the body has any break, attach a synthesized label to the
+      // if block.
+      if (jumpHandler.hasAnyBreak()) {
+        TargetElement target = elements[loop];
+        LabelElement label = target.addLabel(null, 'loop');
+        label.isBreakTarget = true;
+        SubGraph labelGraph = new SubGraph(conditionBlock, current);
+        HLabeledBlockInformation labelInfo = new HLabeledBlockInformation(
+                new HSubGraphBlockInformation(labelGraph),
+                <LabelElement>[label]);
+
+        conditionBlock.setBlockFlow(labelInfo, current);
+
+        jumpHandler.forEachBreak((HBreak breakInstruction, _) {
+          HBasicBlock block = breakInstruction.block;
+          block.addAtExit(new HBreak.toLabel(label));
+          block.remove(breakInstruction);
+        });
+      }
+    }
+    jumpHandler.close();
   }
 
   visitFor(For node) {
@@ -2049,31 +2141,56 @@
       conditionEndBlock = close(
           new HLoopBranch(conditionInstruction, HLoopBranch.DO_WHILE_LOOP));
 
-      conditionEndBlock.addSuccessor(loopEntryBlock);  // The back-edge.
+      HBasicBlock avoidCriticalEdge = addNewBlock();
+      conditionEndBlock.addSuccessor(avoidCriticalEdge);
+      open(avoidCriticalEdge);
+      close(new HGoto());
+      avoidCriticalEdge.addSuccessor(loopEntryBlock); // The back-edge.
+
       conditionExpression =
           new SubExpression(conditionBlock, conditionEndBlock);
     }
 
-    loopEntryBlock.postProcessLoopHeader();
-
     endLoop(loopEntryBlock, conditionEndBlock, jumpHandler, localsHandler);
+    if (!isAbortingBody || hasContinues) {
+      loopEntryBlock.postProcessLoopHeader();
+      SubGraph bodyGraph = new SubGraph(bodyEntryBlock, bodyExitBlock);
+      HLoopBlockInformation loopBlockInfo =
+          new HLoopBlockInformation(
+              HLoopBlockInformation.DO_WHILE_LOOP,
+              null,
+              wrapExpressionGraph(conditionExpression),
+              wrapStatementGraph(bodyGraph),
+              null,
+              loopEntryBlock.loopInformation.target,
+              loopEntryBlock.loopInformation.labels,
+              sourceFileLocationForBeginToken(node),
+              sourceFileLocationForEndToken(node));
+      loopEntryBlock.setBlockFlow(loopBlockInfo, current);
+      loopInfo.loopBlockInformation = loopBlockInfo;
+    } else {
+      // If the loop has no back edge, we remove the loop information
+      // on the header.
+      loopEntryBlock.loopInformation = null;
+
+      // If the body of the loop has any break, we attach a
+      // synthesized label to the body.
+      if (jumpHandler.hasAnyBreak()) {
+        SubGraph bodyGraph = new SubGraph(bodyEntryBlock, bodyExitBlock);
+        TargetElement target = elements[node];
+        LabelElement label = target.addLabel(null, 'loop');
+        label.isBreakTarget = true;
+        HLabeledBlockInformation info = new HLabeledBlockInformation(
+            new HSubGraphBlockInformation(bodyGraph), <LabelElement>[label]);
+        loopEntryBlock.setBlockFlow(info, current);
+        jumpHandler.forEachBreak((HBreak breakInstruction, _) {
+          HBasicBlock block = breakInstruction.block;
+          block.addAtExit(new HBreak.toLabel(label));
+          block.remove(breakInstruction);
+        });
+      }
+    }
     jumpHandler.close();
-
-    SubGraph bodyGraph = new SubGraph(bodyEntryBlock, bodyExitBlock);
-
-    HLoopBlockInformation loopBlockInfo =
-        new HLoopBlockInformation(
-            HLoopBlockInformation.DO_WHILE_LOOP,
-            null,
-            wrapExpressionGraph(conditionExpression),
-            wrapStatementGraph(bodyGraph),
-            null,
-            loopEntryBlock.loopInformation.target,
-            loopEntryBlock.loopInformation.labels,
-            sourceFileLocationForBeginToken(node),
-            sourceFileLocationForEndToken(node));
-    loopEntryBlock.setBlockFlow(loopBlockInfo, current);
-    loopInfo.loopBlockInformation = loopBlockInfo;
   }
 
   visitFunctionExpression(FunctionExpression node) {
@@ -2291,7 +2408,7 @@
     return result;
   }
 
-  Element getInterceptor(Send send, Selector selector) {
+  Set<ClassElement> getInterceptedClassesOn(Send send, Selector selector) {
     if (!methodInterceptionEnabled) return null;
     if (!backend.isInterceptorClass(currentElement.getEnclosingClass())
         && send.receiver == null) {
@@ -2299,7 +2416,7 @@
       // object.
       return null;
     }
-    return interceptors.getStaticInterceptor(selector);
+    return interceptors.getInterceptedClassesOn(selector);
   }
 
   void generateInstanceGetterWithCompiledReceiver(Send send,
@@ -2313,36 +2430,22 @@
         : elements.getSelector(send.selector);
     assert(selector.isGetter());
     SourceString getterName = selector.name;
-    Element interceptor = getInterceptor(send, selector);
+    Set<ClassElement> interceptedClasses =
+        getInterceptedClassesOn(send, selector);
 
     bool hasGetter = compiler.world.hasAnyUserDefinedGetter(selector);
-    if (interceptor == backend.getInterceptorMethod && interceptor != null) {
+    if (interceptedClasses != null) {
       // If we're using an interceptor class, emit a call to the
       // interceptor method and then the actual dynamic call on the
       // interceptor object.
-      HInstruction instruction;
-      if (backend.isInterceptorClass(currentElement.getEnclosingClass())
-          && send.receiver == null) {
-        instruction = thisInstruction;
-      } else {
-        HStatic target = new HStatic(interceptor);
-        add(target);
-        instruction = new HInvokeStatic(<HInstruction>[target, receiver]);
-        add(instruction);
-      }
+      HInstruction instruction =
+          invokeInterceptor(interceptedClasses, receiver, send);
       instruction = new HInvokeDynamicGetter(
           selector, null, instruction, !hasGetter);
       // Add the receiver as an argument to the getter call on the
       // interceptor.
       instruction.inputs.add(receiver);
       pushWithPosition(instruction, send);
-    } else if (elements[send] == null && interceptor != null) {
-      // Use the old, deprecated interceptor mechanism.
-      HStatic target = new HStatic(interceptor);
-      add(target);
-      List<HInstruction> inputs = <HInstruction>[target, receiver];
-      pushWithPosition(new HInvokeInterceptor(selector, inputs, !hasGetter),
-                       send);
     } else {
       pushWithPosition(
           new HInvokeDynamicGetter(selector, null, receiver, !hasGetter), send);
@@ -2395,16 +2498,21 @@
     Selector selector = elements.getSelector(send);
     assert(selector.isSetter());
     SourceString setterName = selector.name;
-    Element interceptor = getInterceptor(send, selector);
     bool hasSetter = compiler.world.hasAnyUserDefinedSetter(selector);
-    if (interceptor != null && interceptor == backend.getInterceptorMethod) {
-      compiler.internalError(
-          'Unimplemented intercepted setter call with interceptor classes');
-    } else if (interceptor != null && elements[send] == null) {
-      HStatic target = new HStatic(interceptor);
-      add(target);
-      List<HInstruction> inputs = <HInstruction>[target, receiver, value];
-      addWithPosition(new HInvokeInterceptor(selector, inputs), send);
+    Set<ClassElement> interceptedClasses =
+        getInterceptedClassesOn(send, selector);
+    if (interceptedClasses != null) {
+      // If we're using an interceptor class, emit a call to the
+      // getInterceptor method and then the actual dynamic call on the
+      // interceptor object.
+      HInstruction instruction =
+          invokeInterceptor(interceptedClasses, receiver, send);
+      instruction = new HInvokeDynamicSetter(
+          selector, null, instruction, receiver, !hasSetter);
+      // Add the value as an argument to the setter call on the
+      // interceptor.
+      instruction.inputs.add(value);
+      addWithPosition(instruction, send);
     } else {
       addWithPosition(
           new HInvokeDynamicSetter(selector, null, receiver, value, !hasSetter),
@@ -2448,6 +2556,19 @@
     }
   }
 
+  HInstruction invokeInterceptor(Set<ClassElement> intercepted,
+                                 HInstruction receiver,
+                                 Send send) {
+    if (send != null
+        && backend.isInterceptorClass(currentElement.getEnclosingClass())
+        && send.receiver == null) {
+      return thisInstruction;
+    }
+    HInterceptor interceptor = new HInterceptor(intercepted, receiver);
+    add(interceptor);
+    return interceptor;
+  }
+
   void pushInvokeHelper0(Element helper) {
     HInstruction reference = new HStatic(helper);
     add(reference);
@@ -2528,7 +2649,7 @@
 
       DartType type = elements.getType(typeAnnotation);
       HInstruction typeInfo = null;
-      if (compiler.codegenWorld.rti.hasTypeArguments(type)) {
+      if (RuntimeTypeInformation.hasTypeArguments(type)) {
         pushInvokeHelper1(interceptors.getGetRuntimeTypeInfo(), expression);
         typeInfo = pop();
       }
@@ -2649,7 +2770,6 @@
 
   visitDynamicSend(Send node) {
     Selector selector = elements.getSelector(node);
-    var inputs = <HInstruction>[];
 
     SourceString dartMethodName;
     bool isNotEquals = false;
@@ -2665,43 +2785,6 @@
       dartMethodName = node.selector.asIdentifier().source;
     }
 
-    Element interceptor = getInterceptor(node, selector);
-
-    if (interceptor != null) {
-      if (interceptor == backend.getInterceptorMethod) {
-        if (backend.isInterceptorClass(currentElement.getEnclosingClass())
-            && node.receiver == null) {
-          inputs.add(thisInstruction);
-          inputs.add(localsHandler.readThis());
-        } else {
-          HStatic target = new HStatic(interceptor);
-          add(target);
-          visit(node.receiver);
-          HInstruction receiver = pop();
-          HInstruction instruction =
-              new HInvokeStatic(<HInstruction>[target, receiver]);
-          add(instruction);
-          inputs.add(instruction);
-          inputs.add(receiver);
-        }
-        addDynamicSendArgumentsToList(node, inputs);
-        // The first entry in the inputs list is the interceptor. The
-        // second is the receiver, and the others are the arguments.
-        HInstruction instruction = new HInvokeDynamicMethod(selector, inputs);
-        pushWithPosition(instruction, node);
-        return;
-      } else if (elements[node] == null) {
-        HStatic target = new HStatic(interceptor);
-        add(target);
-        inputs.add(target);
-        visit(node.receiver);
-        inputs.add(pop());
-        addGenericSendArgumentsToList(node.arguments, inputs);
-        pushWithPosition(new HInvokeInterceptor(selector, inputs), node);
-        return;
-      }
-    }
-
     Element element = elements[node];
     if (element != null && compiler.world.hasNoOverridingMember(element)) {
       if (tryInlineMethod(element, selector, node.arguments)) {
@@ -2709,16 +2792,24 @@
       }
     }
 
+    HInstruction receiver;
     if (node.receiver == null) {
-      inputs.add(localsHandler.readThis());
+      receiver = localsHandler.readThis();
     } else {
       visit(node.receiver);
-      inputs.add(pop());
+      receiver = pop();
     }
 
+    List<HInstruction> inputs = <HInstruction>[];
+    Set<ClassElement> interceptedClasses =
+        interceptors.getInterceptedClassesOn(selector);
+    if (interceptedClasses != null) {
+      inputs.add(invokeInterceptor(interceptedClasses, receiver, node));
+    }
+    inputs.add(receiver);
+
     addDynamicSendArgumentsToList(node, inputs);
 
-    // The first entry in the inputs list is the receiver.
     pushWithPosition(new HInvokeDynamicMethod(selector, inputs), node);
 
     if (isNotEquals) {
@@ -2995,8 +3086,9 @@
                             localsHandler.readThis());
           typeInfo = pop();
         }
+        int index = RuntimeTypeInformation.getTypeVariableIndex(type);
         HInstruction foreign = new HForeign(
-            new LiteralDartString('#.${type.name.slowToString()}'),
+            new LiteralDartString('#[$index]'),
             new LiteralDartString('String'),
             <HInstruction>[typeInfo]);
         add(foreign);
@@ -3027,12 +3119,12 @@
       } else if (type is InterfaceType) {
         bool isFirstVariable = true;
         InterfaceType interfaceType = type;
-        bool hasTypeArguments = !interfaceType.arguments.isEmpty;
+        bool hasTypeArguments = !interfaceType.typeArguments.isEmpty;
         if (!isInQuotes) template.add("'");
-        template.add(rti.getName(type.element));
+        template.add(backend.namer.getName(type.element));
         if (hasTypeArguments) {
           template.add("<");
-          for (DartType argument in interfaceType.arguments) {
+          for (DartType argument in interfaceType.typeArguments) {
             if (!isFirstVariable) {
               template.add(", ");
             } else {
@@ -3046,7 +3138,7 @@
       } else {
         assert(type is TypedefType);
         if (!isInQuotes) template.add("'");
-        template.add(rti.getName(argument.element));
+        template.add(backend.namer.getName(argument.element));
         if (!isInQuotes) template.add("'");
       }
     }
@@ -3065,7 +3157,7 @@
                              HInstruction newObject) {
     if (!compiler.world.needsRti(type.element)) return;
     List<HInstruction> inputs = <HInstruction>[];
-    type.arguments.forEach((DartType argument) {
+    type.typeArguments.forEach((DartType argument) {
       inputs.add(analyzeTypeArgument(argument, currentNode));
     });
     callSetRuntimeTypeInfo(type.element, inputs, newObject);
@@ -3074,49 +3166,19 @@
   void callSetRuntimeTypeInfo(ClassElement element,
                               List<HInstruction> rtiInputs,
                               HInstruction newObject) {
-    bool needsRti = compiler.world.needsRti(element) && !rtiInputs.isEmpty;
-    bool runtimeTypeIsUsed = compiler.enabledRuntimeType;
-    if (!needsRti && !runtimeTypeIsUsed) return;
-
-    HInstruction createForeign(String template,
-                               List<HInstruction> arguments,
-                               [String type = 'String']) {
-      return new HForeign(new LiteralDartString(template),
-                          new LiteralDartString(type),
-                          arguments);
+    if (!compiler.world.needsRti(element) || element.typeVariables.isEmpty) {
+      return;
     }
 
-    // Construct the runtime type information.
-    StringBuffer runtimeCode = new StringBuffer();
-    List<HInstruction> runtimeCodeInputs = <HInstruction>[];
-    if (runtimeTypeIsUsed) {
-      String runtimeTypeString =
-          rti.generateRuntimeTypeString(element, rtiInputs.length);
-      HInstruction runtimeType = createForeign(runtimeTypeString, rtiInputs);
-      add(runtimeType);
-      runtimeCodeInputs.add(runtimeType);
-      runtimeCode.add("runtimeType: '#'");
-    }
-    if (needsRti) {
-      if (runtimeTypeIsUsed) runtimeCode.add(', ');
-      String typeVariablesString =
-          RuntimeTypeInformation.generateTypeVariableString(element,
-                                                            rtiInputs.length);
-      HInstruction typeInfo = createForeign(typeVariablesString, rtiInputs);
-      add(typeInfo);
-      runtimeCodeInputs.add(typeInfo);
-      runtimeCode.add('#');
-    }
-    HInstruction runtimeInfo =
-        createForeign("{$runtimeCode}", runtimeCodeInputs, 'Object');
-    add(runtimeInfo);
+    HInstruction typeInfo = new HLiteralList(rtiInputs);
+    add(typeInfo);
 
     // Set the runtime type information on the object.
     Element typeInfoSetterElement = interceptors.getSetRuntimeTypeInfo();
     HInstruction typeInfoSetter = new HStatic(typeInfoSetterElement);
     add(typeInfoSetter);
     add(new HInvokeStatic(
-        <HInstruction>[typeInfoSetter, newObject, runtimeInfo]));
+        <HInstruction>[typeInfoSetter, newObject, typeInfo]));
   }
 
   visitNewSend(Send node, InterfaceType type) {
@@ -3167,22 +3229,10 @@
       return;
     }
     if (compiler.world.needsRti(constructor.enclosingElement)) {
-      if (!type.arguments.isEmpty) {
-        type.arguments.forEach((DartType argument) {
+      if (!type.typeArguments.isEmpty) {
+        type.typeArguments.forEach((DartType argument) {
           inputs.add(analyzeTypeArgument(argument, node));
         });
-      } else if (compiler.enabledRuntimeType) {
-        Link<DartType> variables =
-            constructor.getEnclosingClass().typeVariables;
-        if (!variables.isEmpty) {
-          // If the class has type variables but no type arguments have been
-          // provided, add [:dynamic:] as argument for all type variables.
-          DartString stringDynamic = new DartString.literal('dynamic');
-          HInstruction input = graph.addConstantString(stringDynamic,
-                                                       node,
-                                                       constantSystem);
-          variables.forEach((_) => inputs.add(input));
-        }
       }
     }
 
@@ -3263,22 +3313,17 @@
 
   visitTypeReferenceSend(Send node) {
     Element element = elements[node];
-    HInstruction name;
-    Element helper =
-        compiler.findHelper(const SourceString('createRuntimeType'));
-    if (element.isClass()) {
-      String string = rti.generateRuntimeTypeString(element, 0);
-      name = addConstantString(node.selector, string);
-    } else if (element.isTypedef()) {
-      // TODO(karlklose): implement support for type variables in typedefs.
-      name = addConstantString(node.selector, rti.getName(element));
+    if (element.isClass() || element.isTypedef()) {
+      // TODO(karlklose): add type representation
+      ConstantHandler handler = compiler.constantHandler;
+      Constant constant = handler.compileNodeWithDefinitions(node, elements);
+      stack.add(graph.addConstant(constant));
     } else if (element.isTypeVariable()) {
       // TODO(6248): implement support for type variables.
       compiler.unimplemented('first class type for type variable', node: node);
     } else {
-      internalError('unexpected element $element', node: node);
+      internalError('unexpected element kind $element', node: node);
     }
-    pushInvokeHelper1(helper, name);
     if (node.isCall) {
       // This send is of the form 'e(...)', where e is resolved to a type
       // reference. We create a regular closure call on the result of the type
@@ -3378,8 +3423,10 @@
 
   visitNewExpression(NewExpression node) {
     Element element = elements[node.send];
-    if (!Elements.isErroneousElement(element)) {
-      element = element.redirectionTarget;
+    if (!Elements.isErroneousElement(element) &&
+        !Elements.isMalformedElement(element)) {
+      FunctionElement function = element;
+      element = function.redirectionTarget;
     }
     if (Elements.isErroneousElement(element)) {
       ErroneousElement error = element;
@@ -3399,6 +3446,10 @@
       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));
     }
@@ -3604,11 +3655,7 @@
     } else {
       visit(node.expression);
       value = pop();
-      if (value is HForeign) {
-        // TODO(6530, 6534): remove this check.
-      } else {
-        value = potentiallyCheckType(value, returnType);
-      }
+      value = potentiallyCheckType(value, returnType);
     }
 
     handleInTryStatement();
@@ -3759,19 +3806,23 @@
       SourceString iteratorName = const SourceString("iterator");
       Selector selector =
           new Selector.call(iteratorName, work.element.getLibrary(), 0);
-      Element interceptor = interceptors.getStaticInterceptor(selector);
-      assert(interceptor != null);
+      Set<ClassElement> interceptedClasses =
+          interceptors.getInterceptedClassesOn(selector);
       visit(node.expression);
-      pushInvokeHelper1(interceptor, pop());
-      iterator = pop();
+      HInstruction receiver = pop();
+      if (interceptedClasses == null) {
+        iterator = new HInvokeDynamicMethod(selector, <HInstruction>[receiver]);
+      } else {
+        HInterceptor interceptor =
+            invokeInterceptor(interceptedClasses, receiver, null);
+        iterator = new HInvokeDynamicMethod(
+            selector, <HInstruction>[interceptor, receiver]);
+      }
+      add(iterator);
     }
     HInstruction buildCondition() {
       SourceString name = const SourceString('hasNext');
       Selector selector = new Selector.getter(name, work.element.getLibrary());
-      if (interceptors.getStaticInterceptor(selector) != null) {
-        compiler.internalError("hasNext getter must not be intercepted",
-                               node: node);
-      }
       bool hasGetter = compiler.world.hasAnyUserDefinedGetter(selector);
       push(new HInvokeDynamicGetter(selector, null, iterator, !hasGetter));
       return popBoolified();
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart b/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
index 1cc242f..d51850f 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
@@ -65,16 +65,6 @@
 
   CodeBuffer generateMethod(WorkItem work, HGraph graph) {
     return measure(() {
-      JavaScriptItemCompilationContext context = work.compilationContext;
-      HTypeMap types = context.types;
-      graph.exit.predecessors.forEach((block) {
-        assert(block.last is HGoto || block.last is HReturn);
-        if (block.last is HReturn) {
-          backend.registerReturnType(work.element, types[block.last.inputs[0]]);
-        } else {
-          backend.registerReturnType(work.element, HType.NULL);
-        }
-      });
       compiler.tracer.traceGraph("codegen", graph);
       SsaOptimizedCodeGenerator codegen =
           new SsaOptimizedCodeGenerator(backend, work);
@@ -382,6 +372,20 @@
     allocator.visitGraph(graph);
     variableNames = allocator.names;
     shouldGroupVarDeclarations = allocator.names.numberOfVariables > 1;
+
+    // Don't register a return type for lazily initialized variables.
+    if (work.element is! FunctionElement) return;
+
+    // Register return types to the backend.
+    graph.exit.predecessors.forEach((HBasicBlock block) {
+      HInstruction last = block.last;
+      assert(last is HGoto || last is HReturn);
+      if (last is HReturn) {
+        backend.registerReturnType(work.element, types[last.inputs[0]]);
+      } else {
+        backend.registerReturnType(work.element, HType.NULL);
+      }
+    });
   }
 
   void handleDelayedVariableDeclarations() {
@@ -831,7 +835,7 @@
 
   bool visitLoopInfo(HLoopBlockInformation info) {
     HExpressionInformation condition = info.condition;
-    bool isConditionExpression = condition == null || isJSCondition(condition);
+    bool isConditionExpression = isJSCondition(condition);
 
     js.Loop loop;
 
@@ -943,18 +947,29 @@
         }
         break;
       case HLoopBlockInformation.DO_WHILE_LOOP:
-        // If there are phi copies after the condition, we cannot emit
-        // a pretty do/while loop, se we fallback to the generic
-        // emission of a loop.
-        CopyHandler handler = variableNames.getCopyHandler(info.end);
-        if (handler != null && !handler.isEmpty) return false;
         if (info.initializer != null) {
           generateStatements(info.initializer);
         }
         js.Block oldContainer = currentContainer;
-        js.Statement body = new js.Block.empty();
+        js.Block body = new js.Block.empty();
+        // If there are phi copies in the block that jumps to the
+        // loop entry, we must emit the condition like this:
+        // do {
+        //   body;
+        //   if (condition) {
+        //     phi updates;
+        //     continue;
+        //   } else {
+        //     break;
+        //   }
+        // } while (true);
+        HBasicBlock avoidEdge = info.end.successors[0];
+        js.Block updateBody = new js.Block.empty();
+        currentContainer = updateBody;
+        assignPhisOfSuccessors(avoidEdge);
+        bool hasPhiUpdates = !updateBody.statements.isEmpty;
         currentContainer = body;
-        if (!isConditionExpression || info.updates != null) {
+        if (hasPhiUpdates || !isConditionExpression || info.updates != null) {
           wrapLoopBodyForContinue(info);
         } else {
           visitBodyIgnoreLabels(info);
@@ -962,18 +977,21 @@
         if (info.updates != null) {
           generateStatements(info.updates);
         }
-        if (condition == null) {
-          push(newLiteralBool(false));
-        } else if (isConditionExpression) {
+        if (isConditionExpression) {
           push(generateExpression(condition));
         } else {
           generateStatements(condition);
           use(condition.conditionExpression);
         }
         js.Expression jsCondition = pop();
+        if (hasPhiUpdates) {
+          updateBody.statements.add(new js.Continue(null));
+          body.statements.add(
+              new js.If(jsCondition, updateBody, new js.Break(null)));
+          jsCondition = newLiteralBool(true);
+        }
+        loop = new js.Do(unwrapStatement(body), jsCondition);
         currentContainer = oldContainer;
-        body = unwrapStatement(body);
-        loop = new js.Do(body, jsCondition);
         break;
       default:
         compiler.internalError(
@@ -1244,16 +1262,7 @@
       }
       instruction = instruction.next;
     }
-    if (instruction is HLoopBranch) {
-      HLoopBranch branch = instruction;
-      // If the loop is a do/while loop, the phi updates must happen
-      // after the evaluation of the condition.
-      if (!branch.isDoWhile()) {
-        assignPhisOfSuccessors(node);
-      }
-    } else {
-      assignPhisOfSuccessors(node);
-    }
+    assignPhisOfSuccessors(node);
     visit(instruction);
   }
 
@@ -1520,14 +1529,15 @@
                        arguments);
   }
 
-  // TODO(ngeoffray): Once we remove the old interceptors, we can
-  // start using HInvokeInterceptor to represent interceptor calls on
-  // an Interceptor class. Currently we recognize if a call is a call
-  // on an interceptor by checking if the arguments in the inputs list
-  // is one more than the arguments in the selector. The extra
-  // argument in an interceptor call is the actual receiver.
-  bool isInterceptorCall(HInvokeDynamic node) {
-    return node.inputs.length - 1 != node.selector.argumentCount;
+  void visitInterceptor(HInterceptor node) {
+    Element element = backend.getInterceptorMethod;
+    assert(element != null);
+    world.registerStaticUse(element);
+    js.VariableUse interceptor =
+        new js.VariableUse(backend.namer.isolateAccess(element));
+    use(node.receiver);
+    List<js.Expression> arguments = <js.Expression>[pop()];
+    push(new js.Call(interceptor, arguments), node);
   }
 
   visitInvokeDynamicMethod(HInvokeDynamicMethod node) {
@@ -1556,7 +1566,7 @@
       // receiver (the first is the interceptor), the backend gets
       // confused. We should pass a list of types instead of a node to
       // [registerDynamicInvocation].
-      if (!isInterceptorCall(node)) {
+      if (!node.isInterceptorCall) {
         backend.registerDynamicInvocation(node, selector, types);
       } else {
         backend.addInterceptedSelector(selector);
@@ -1591,7 +1601,7 @@
     // TODO(4434): For private members we need to use the untyped selector.
     if (defaultSelector.name.isPrivate()) return defaultSelector;
     // TODO(ngeoffray): Type intercepted calls.
-    if (isInterceptorCall(node)) return defaultSelector;
+    if (node.isInterceptorCall) return defaultSelector;
     // If [JSInvocationMirror.invokeOn] has been called, we must not create a
     // typed selector based on the receiver type.
     if (node.element == null && // Invocation is not exact.
@@ -1614,7 +1624,14 @@
     push(jsPropertyCall(pop(), name, visitArguments(node.inputs)), node);
     Selector selector = getOptimizedSelectorFor(node, setter);
     world.registerDynamicSetter(setter.name, selector);
-    backend.addedDynamicSetter(selector, types[node.inputs[1]]);
+    HType valueType;
+    if (node.isInterceptorCall) {
+      valueType = types[node.inputs[2]];
+      backend.addInterceptedSelector(setter);
+    } else {
+      valueType = types[node.inputs[1]];
+    }
+    backend.addedDynamicSetter(selector, valueType);
   }
 
   visitInvokeDynamicGetter(HInvokeDynamicGetter node) {
@@ -1624,7 +1641,7 @@
     push(jsPropertyCall(pop(), name, visitArguments(node.inputs)), node);
     world.registerDynamicGetter(
         getter.name, getOptimizedSelectorFor(node, getter));
-    if (isInterceptorCall(node)) {
+    if (node.isInterceptorCall) {
       backend.addInterceptedSelector(getter);
     }
   }
@@ -1645,9 +1662,7 @@
   }
 
   visitInvokeStatic(HInvokeStatic node) {
-    if (true &&
-        (node.typeCode() == HInstruction.INVOKE_STATIC_TYPECODE ||
-         node.typeCode() == HInstruction.INVOKE_INTERCEPTOR_TYPECODE)) {
+    if (node.typeCode() == HInstruction.INVOKE_STATIC_TYPECODE) {
       // Register this invocation to collect the types used at all call sites.
       backend.registerStaticInvocation(node, types);
     }
@@ -1706,32 +1721,25 @@
   }
 
   visitFieldGet(HFieldGet node) {
-    String name = backend.namer.getName(node.element);
     use(node.receiver);
-    push(new js.PropertyAccess.field(pop(), name), node);
-    HType receiverHType = types[node.receiver];
-    DartType type = receiverHType.computeType(compiler);
-    if (type != null) {
-      world.registerFieldGetter(
-          node.element.name, node.element.getLibrary(), type);
+    if (node.element == backend.jsArrayLength
+        || node.element == backend.jsStringLength) {
+      // We're accessing a native JavaScript property called 'length'
+      // on a JS String or a JS array. Therefore, the name of that
+      // property should not be mangled.
+      push(new js.PropertyAccess.field(pop(), 'length'), node);
+    } else {
+      String name = backend.namer.getName(node.element);
+      push(new js.PropertyAccess.field(pop(), name), node);
+      HType receiverHType = types[node.receiver];
+      DartType type = receiverHType.computeType(compiler);
+      if (type != null) {
+        world.registerFieldGetter(
+            node.element.name, node.element.getLibrary(), type);
+      }
     }
   }
 
-  // Determine if an instruction is a simple number computation
-  // involving only things with guaranteed number types and a given
-  // field.
-  bool isSimpleFieldNumberComputation(HInstruction value, HFieldSet node) {
-    if (value.guaranteedType.union(HType.NUMBER, compiler) == HType.NUMBER) {
-      return true;
-    }
-    if (value is HBinaryArithmetic) {
-      return (isSimpleFieldNumberComputation(value.left, node) &&
-              isSimpleFieldNumberComputation(value.right, node));
-    }
-    if (value is HFieldGet) return value.element == node.element;
-    return false;
-  }
-
   visitFieldSet(HFieldSet node) {
     String name = backend.namer.getName(node.element);
     DartType type = types[node.receiver].computeType(compiler);
@@ -1870,11 +1878,7 @@
     HBasicBlock branchBlock = currentBlock;
     handleLoopCondition(node);
     List<HBasicBlock> dominated = currentBlock.dominatedBlocks;
-    if (node.isDoWhile()) {
-      // Now that the condition has been evaluated, we can update the
-      // phis of a do/while loop.
-      assignPhisOfSuccessors(node.block);
-    } else {
+    if (!node.isDoWhile()) {
       // For a do while loop, the body has already been visited.
       visitBasicBlock(dominated[0]);
     }
@@ -2193,64 +2197,6 @@
     }
   }
 
-  String builtinJsName(HInvokeInterceptor interceptor) {
-    // Don't count the target method or the receiver in the arity.
-    int arity = interceptor.inputs.length - 2;
-    HInstruction receiver = interceptor.inputs[1];
-    bool isCall = interceptor.selector.isCall();
-    SourceString name = interceptor.selector.name;
-
-    if (interceptor.isLengthGetterOnStringOrArray(types)) {
-      return 'length';
-    } else if (interceptor.isPopCall(types)) {
-      return 'pop';
-    } else if (receiver.isExtendableArray(types) && isCall) {
-      if (name == const SourceString('add') && arity == 1) {
-        return 'push';
-      }
-    } else if (receiver.isString(types) && isCall) {
-      if (name == const SourceString('concat') &&
-          arity == 1 &&
-          interceptor.inputs[2].isString(types)) {
-        return '+';
-      }
-      if (name == const SourceString('split') &&
-          arity == 1 &&
-          interceptor.inputs[2].isString(types)) {
-        return 'split';
-      }
-    }
-
-    return null;
-  }
-
-  void visitInvokeInterceptor(HInvokeInterceptor node) {
-    String builtin = builtinJsName(node);
-    if (builtin != null) {
-      if (builtin == '+') {
-        use(node.inputs[1]);
-        js.Expression left = pop();
-        use(node.inputs[2]);
-        push(new js.Binary("+", left, pop()), node);
-      } else {
-        use(node.inputs[1]);
-        js.PropertyAccess access = new js.PropertyAccess.field(pop(), builtin);
-        if (node.selector.isGetter()) {
-          push(access, node);
-          return;
-        }
-        List<js.Expression> arguments = <js.Expression>[];
-        for (int i = 2; i < node.inputs.length; i++) {
-          use(node.inputs[i]);
-          arguments.add(pop());
-        }
-        push(new js.Call(access, arguments), node);
-      }
-    } else {
-      return visitInvokeStatic(node);
-    }
-  }
-
   void checkInt(HInstruction input, String cmp) {
     use(input);
     js.Expression left = pop();
@@ -2471,22 +2417,22 @@
     if (node.hasTypeInfo()) {
       InterfaceType interfaceType = type;
       ClassElement cls = type.element;
-      Link<DartType> arguments = interfaceType.arguments;
+      Link<DartType> arguments = interfaceType.typeArguments;
       js.Expression result = pop();
       for (TypeVariableType typeVariable in cls.typeVariables) {
         use(node.typeInfoCall);
-        // TODO(johnniwinther): Retrieve the type name properly and not through
-        // [toString]. Note: Two cases below [typeVariable] and
-        // [arguments.head].
-        js.PropertyAccess field =
-            new js.PropertyAccess.field(pop(), typeVariable.toString());
-        js.Expression genericName = new js.LiteralString("'${arguments.head}'");
+        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));
+        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 346d80b..2878379 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
@@ -32,11 +32,11 @@
   R visitIndex(HIndex node);
   R visitIndexAssign(HIndexAssign node);
   R visitIntegerCheck(HIntegerCheck node);
+  R visitInterceptor(HInterceptor node);
   R visitInvokeClosure(HInvokeClosure node);
   R visitInvokeDynamicGetter(HInvokeDynamicGetter node);
   R visitInvokeDynamicMethod(HInvokeDynamicMethod node);
   R visitInvokeDynamicSetter(HInvokeDynamicSetter node);
-  R visitInvokeInterceptor(HInvokeInterceptor node);
   R visitInvokeStatic(HInvokeStatic node);
   R visitInvokeSuper(HInvokeSuper node);
   R visitIs(HIs node);
@@ -292,6 +292,7 @@
   visitIndex(HIndex node) => visitInvokeStatic(node);
   visitIndexAssign(HIndexAssign node) => visitInvokeStatic(node);
   visitIntegerCheck(HIntegerCheck node) => visitCheck(node);
+  visitInterceptor(HInterceptor node) => visitInstruction(node);
   visitInvokeClosure(HInvokeClosure node)
       => visitInvokeDynamic(node);
   visitInvokeDynamicMethod(HInvokeDynamicMethod node)
@@ -300,8 +301,6 @@
       => visitInvokeDynamicField(node);
   visitInvokeDynamicSetter(HInvokeDynamicSetter node)
       => visitInvokeDynamicField(node);
-  visitInvokeInterceptor(HInvokeInterceptor node)
-      => visitInvokeStatic(node);
   visitInvokeStatic(HInvokeStatic node) => visitInvoke(node);
   visitInvokeSuper(HInvokeSuper node) => visitInvoke(node);
   visitJump(HJump node) => visitControlFlow(node);
@@ -504,18 +503,6 @@
     status = STATUS_CLOSED;
   }
 
-  // TODO(kasperl): I really don't want to pass the compiler into this
-  // method. Maybe we need a better logging framework.
-  void printToCompiler(Compiler compiler) {
-    HInstruction instruction = first;
-    while (instruction != null) {
-      int instructionId = instruction.id;
-      String inputsAsString = instruction.inputsToString();
-      compiler.log('$instructionId: $instruction $inputsAsString');
-      instruction = instruction.next;
-    }
-  }
-
   void addAtEntry(HInstruction instruction) {
     assert(instruction is !HPhi);
     super.addBefore(first, instruction);
@@ -784,7 +771,7 @@
   static const int TYPE_GUARD_TYPECODE = 1;
   static const int BOUNDS_CHECK_TYPECODE = 2;
   static const int INTEGER_CHECK_TYPECODE = 3;
-  static const int INVOKE_INTERCEPTOR_TYPECODE = 4;
+  static const int INTERCEPTOR_TYPECODE = 4;
   static const int ADD_TYPECODE = 5;
   static const int DIVIDE_TYPECODE = 6;
   static const int MODULO_TYPECODE = 7;
@@ -1118,11 +1105,13 @@
   bool isJsStatement(HTypeMap types) => false;
 
   bool dominates(HInstruction other) {
+    // An instruction does not dominates itself.
+    if (this == other) return false;
     if (block != other.block) return block.dominates(other.block);
 
-    HInstruction current = this;
+    HInstruction current = this.next;
     while (current != null) {
-      if (identical(current, other)) return true;
+      if (current == other) return true;
       current = current.next;
     }
     return false;
@@ -1284,12 +1273,10 @@
   HInstruction get condition => inputs[0];
   HBasicBlock get trueBranch => block.successors[0];
   HBasicBlock get falseBranch => block.successors[1];
-  toString();
 }
 
 abstract class HControlFlow extends HInstruction {
   HControlFlow(inputs) : super(inputs);
-  toString();
   void prepareGvn(HTypeMap types) {
     // Control flow does not have side-effects.
   }
@@ -1305,9 +1292,6 @@
     */
   HInvoke(List<HInstruction> inputs) : super(inputs);
   static const int ARGUMENTS_OFFSET = 1;
-
-  // TODO(floitsch): make class abstract instead of adding an abstract method.
-  accept(HVisitor visitor);
 }
 
 abstract class HInvokeDynamic extends HInvoke {
@@ -1319,8 +1303,12 @@
   toString() => 'invoke dynamic: $selector';
   HInstruction get receiver => inputs[0];
 
-  // TODO(floitsch): make class abstract instead of adding an abstract method.
-  accept(HVisitor visitor);
+  bool get isInterceptorCall {
+    // We know it's a selector call if it follows the interceptor
+    // calling convention, which adds the actual receiver as a
+    // parameter to the call.
+    return inputs.length - 2 == selector.argumentCount;
+  }
 }
 
 class HInvokeClosure extends HInvokeDynamic {
@@ -1343,9 +1331,6 @@
       this.isSideEffectFree)
       : super(selector, element, inputs);
   toString() => 'invoke dynamic field: $selector';
-
-  // TODO(floitsch): make class abstract instead of adding an abstract method.
-  accept(HVisitor visitor);
 }
 
 class HInvokeDynamicGetter extends HInvokeDynamicField {
@@ -1426,83 +1411,6 @@
   }
 }
 
-class HInvokeInterceptor extends HInvokeStatic {
-  final Selector selector;
-  final bool isSideEffectFree;
-
-  HInvokeInterceptor(this.selector,
-                     List<HInstruction> inputs,
-                     [bool this.isSideEffectFree = false])
-      : super(inputs);
-
-  toString() => 'invoke interceptor: ${element.name}';
-  accept(HVisitor visitor) => visitor.visitInvokeInterceptor(this);
-
-  bool isLengthGetter() {
-    return selector.isGetter() &&
-        selector.name == const SourceString('length');
-  }
-
-  bool isPopCall(HTypeMap types) {
-    return selector.isCall()
-        && inputs[1].isExtendableArray(types)
-        && selector.name == const SourceString('removeLast')
-        && selector.argumentCount == 0;
-  }
-
-  bool isLengthGetterOnStringOrArray(HTypeMap types) {
-    return isLengthGetter() && inputs[1].isIndexablePrimitive(types);
-  }
-
-  HType computeLikelyType(HTypeMap types, Compiler compiler) {
-    // In general a length getter or method returns an int.
-    if (isLengthGetter()) return HType.INTEGER;
-    return HType.UNKNOWN;
-  }
-
-  HType computeTypeFromInputTypes(HTypeMap types, Compiler compiler) {
-    if (isLengthGetterOnStringOrArray(types)) return HType.INTEGER;
-    return HType.UNKNOWN;
-  }
-
-  HType computeDesiredTypeForNonTargetInput(HInstruction input,
-                                            HTypeMap types,
-                                            Compiler compiler) {
-    // If the first argument is a string or an array and we invoke methods
-    // on it that mutate it, then we want to restrict the incoming type to be
-    // a mutable array.
-    if (input == inputs[1] && input.isIndexablePrimitive(types)) {
-      // TODO(kasperl): Should we check that the selector is a call selector?
-      if (selector.name == const SourceString('add')
-          || selector.name == const SourceString('removeLast')) {
-        return HType.MUTABLE_ARRAY;
-      }
-    }
-    return HType.UNKNOWN;
-  }
-
-  void prepareGvn(HTypeMap types) {
-    clearAllSideEffects();
-    if (isLengthGetterOnStringOrArray(types)) {
-      setUseGvn();
-      // If the input is a string or a fixed length array, we know
-      // the length cannot change.
-      if (!inputs[1].isString(types) && !inputs[1].isFixedArray(types)) {
-        setDependsOnInstancePropertyStore();
-      }
-    } else if (isSideEffectFree) {
-      setUseGvn();
-      setDependsOnSomething();
-    } else {
-      setAllSideEffects();
-    }
-  }
-
-  int typeCode() => HInstruction.INVOKE_INTERCEPTOR_TYPECODE;
-  bool typeEquals(other) => other is HInvokeInterceptor;
-  bool dataEquals(HInvokeInterceptor other) => selector == other.selector;
-}
-
 abstract class HFieldAccess extends HInstruction {
   final Element element;
 
@@ -1827,9 +1735,6 @@
     if (left.isTypeUnknown(types)) return HType.INTEGER;
     return HType.UNKNOWN;
   }
-
-  // TODO(floitsch): make class abstract instead of adding an abstract method.
-  accept(HVisitor visitor);
 }
 
 class HShiftLeft extends HBinaryBitOp {
@@ -2301,8 +2206,6 @@
 
   bool isBuiltin(HTypeMap types)
       => left.isNumber(types) && right.isNumber(types);
-  // TODO(1603): the class should be marked as abstract.
-  BinaryOperation operation(ConstantSystem constantSystem);
 }
 
 class HEquals extends HRelational {
@@ -2311,7 +2214,7 @@
   accept(HVisitor visitor) => visitor.visitEquals(this);
 
   bool isBuiltin(HTypeMap types) {
-    // All primitive types have === semantics.
+    // All primitive types have 'identical' semantics.
     // Note that this includes all constants except the user-constructed
     // objects.
     return types[left].isPrimitiveOrNull() || right.isConstantNull();
@@ -2327,7 +2230,7 @@
                                             Compiler compiler) {
     HType propagatedType = types[this];
     if (input == left && types[right].isUseful()) {
-      // All our useful types have === semantics. But we don't want to
+      // All our useful types have 'identical' semantics. But we don't want to
       // speculatively test for all possible types. Therefore we try to match
       // the two types. That is, if we see x == 3, then we speculatively test
       // if x is a number and bailout if it isn't.
@@ -2466,6 +2369,21 @@
   bool isCodeMotionInvariant() => !element.isAssignable();
 }
 
+class HInterceptor extends HInstruction {
+  final Set<ClassElement> interceptedClasses;
+  HInterceptor(this.interceptedClasses, HInstruction receiver)
+      : super(<HInstruction>[receiver]);
+  String toString() => 'interceptor on $interceptedClasses';
+  accept(HVisitor visitor) => visitor.visitInterceptor(this);
+  HInstruction get receiver => inputs[0];
+
+  void prepareGvn(HTypeMap types) {
+    clearAllSideEffects();
+  }
+
+  int typeCode() => HInstruction.INTERCEPTOR_TYPECODE;
+}
+
 /** An [HLazyStatic] is a static that is initialized lazily at first read. */
 class HLazyStatic extends HStatic {
   HLazyStatic(Element element) : super(element);
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart b/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
index 6333b0e..e0b8c41 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
@@ -44,6 +44,7 @@
           new SsaRedundantPhiEliminator(),
           new SsaDeadPhiEliminator(),
           new SsaConstantFolder(constantSystem, backend, work, types),
+          new SsaTypePropagator(compiler, types),
           new SsaGlobalValueNumberer(compiler, types),
           new SsaCodeMotion(),
           new SsaValueRangeAnalyzer(constantSystem, types, work),
@@ -204,61 +205,18 @@
     return node;
   }
 
-  HInstruction visitInvokeInterceptor(HInvokeInterceptor node) {
-    // Try to recognize the length interceptor with input [:new List(int):].
-    if (node.isLengthGetter() && node.inputs[1] is HInvokeStatic) {
-      HInvokeStatic call = node.inputs[1];
-      if (isFixedSizeListConstructor(call)) {
-        return call.inputs[1];
-      }
-    }
+  HInstruction handleInterceptorCall(HInvokeDynamic node) {
     HInstruction input = node.inputs[1];
-    if (node.isLengthGetter()) {
-      if (input.isConstantString()) {
-        HConstant constantInput = input;
-        StringConstant constant = constantInput.constant;
-        return graph.addConstantInt(constant.length, constantSystem);
-      } else if (input.isConstantList()) {
-        HConstant constantInput = input;
-        ListConstant constant = constantInput.constant;
-        return graph.addConstantInt(constant.length, constantSystem);
-      } else if (input.isConstantMap()) {
-        HConstant constantInput = input;
-        MapConstant constant = constantInput.constant;
-        return graph.addConstantInt(constant.length, constantSystem);
-      }
-    }
-
     if (input.isString(types)
         && node.selector.name == const SourceString('toString')) {
       return node.inputs[1];
     }
-
-    if (!input.canBePrimitive(types) && node.selector.isCall()) {
-      bool transformToDynamicInvocation = true;
-      if (input.canBeNull(types)) {
-        // Check if the method exists on Null. If yes we must not transform
-        // the static interceptor call to a dynamic invocation.
-        // TODO(floitsch): get a list of methods that exist on 'null' and only
-        // bail out on them.
-        transformToDynamicInvocation = false;
-      }
-      if (transformToDynamicInvocation) {
-        return fromInterceptorToDynamicInvocation(node, node.selector);
-      }
-    }
-
     return node;
   }
 
   bool isFixedSizeListConstructor(HInvokeStatic node) {
     Element element = node.target.element;
-    DartType defaultClass = compiler.listClass.defaultClass;
-    // TODO(ngeoffray): make sure that the only reason the List class is
-    // not resolved is because it's not being used.
-    return element.isConstructor()
-        && defaultClass != null
-        && element.enclosingElement.declaration == defaultClass.element
+    return element.getEnclosingClass() == compiler.listClass
         && node.inputs.length == 2
         && node.inputs[1].isInteger(types);
   }
@@ -271,6 +229,7 @@
   }
 
   HInstruction visitInvokeDynamic(HInvokeDynamic node) {
+    if (node.isInterceptorCall) return handleInterceptorCall(node);
     HType receiverType = types[node.receiver];
     if (receiverType.isExact()) {
       HBoundedType type = receiverType;
@@ -555,7 +514,7 @@
     // TODO(karlklose): remove the hasTypeArguments check.
     } else if (expressionType.isUseful()
                && !expressionType.canBeNull()
-               && !compiler.codegenWorld.rti.hasTypeArguments(type)) {
+               && !RuntimeTypeInformation.hasTypeArguments(type)) {
       DartType receiverType = expressionType.computeType(compiler);
       if (receiverType != null) {
         if (compiler.types.isSubtype(receiverType, type)) {
@@ -592,7 +551,59 @@
     return compiler.world.locateSingleField(type, selector);
   }
 
+  HInstruction visitFieldGet(HFieldGet node) {
+    if (node.element == backend.jsArrayLength) {
+      if (node.receiver is HInvokeStatic) {
+        // Try to recognize the length getter with input [:new List(int):].
+        HInvokeStatic call = node.receiver;
+        if (isFixedSizeListConstructor(call)) {
+          return call.inputs[1];
+        }
+      }
+    }
+    return node;
+  }
+
+  HInstruction optimizeLengthInterceptedCall(HInvokeDynamicGetter node) {
+    HInstruction actualReceiver = node.inputs[1];
+    if (actualReceiver.isIndexablePrimitive(types)) {
+      if (actualReceiver.isConstantString()) {
+        HConstant constantInput = actualReceiver;
+        StringConstant constant = constantInput.constant;
+        return graph.addConstantInt(constant.length, constantSystem);
+      } else if (actualReceiver.isConstantList()) {
+        HConstant constantInput = actualReceiver;
+        ListConstant constant = constantInput.constant;
+        return graph.addConstantInt(constant.length, constantSystem);
+      }
+      Element element;
+      bool isAssignable;
+      if (actualReceiver.isString(types)) {
+        element = backend.jsStringLength;
+        isAssignable = false;
+      } else {
+        element = backend.jsArrayLength;
+        isAssignable = !actualReceiver.isFixedArray(types);
+      }
+      HFieldGet result = new HFieldGet(
+          element, actualReceiver, isAssignable: isAssignable);
+      result.guaranteedType = HType.INTEGER;
+      types[result] = HType.INTEGER;
+      return result;
+    } else if (actualReceiver.isConstantMap()) {
+      HConstant constantInput = actualReceiver;
+      MapConstant constant = constantInput.constant;
+      return graph.addConstantInt(constant.length, constantSystem);
+    }
+    return node;
+  }
+
   HInstruction visitInvokeDynamicGetter(HInvokeDynamicGetter node) {
+    if (node.selector.name == const SourceString('length')
+        && node.isInterceptorCall) {
+      return optimizeLengthInterceptedCall(node);
+    }
+
     Element field =
         findConcreteFieldForDynamicAccess(node.receiver, node.selector);
     if (field == null) return node;
@@ -655,18 +666,13 @@
   final String name = "SsaCheckInserter";
   HGraph graph;
   Element lengthInterceptor;
-  Selector lengthSelector;
 
   SsaCheckInserter(JavaScriptBackend backend,
                    this.work,
                    this.types,
                    this.boundsChecked)
       : constantSystem = backend.constantSystem {
-    SourceString lengthString = const SourceString('length');
-    lengthSelector =
-        new Selector.getter(lengthString, work.element.getLibrary());
-    lengthInterceptor =
-        backend.builder.interceptors.getStaticInterceptor(lengthSelector);
+    lengthInterceptor = backend.jsArrayLength;
   }
 
   void visitGraph(HGraph graph) {
@@ -686,10 +692,10 @@
   HBoundsCheck insertBoundsCheck(HInstruction node,
                                  HInstruction receiver,
                                  HInstruction index) {
-    HStatic interceptor = new HStatic(lengthInterceptor);
-    node.block.addBefore(node, interceptor);
-    HInvokeInterceptor length = new HInvokeInterceptor(
-        lengthSelector, <HInstruction>[interceptor, receiver], true);
+    bool isAssignable = !receiver.isFixedArray(types);
+    HFieldGet length =
+        new HFieldGet(lengthInterceptor, receiver, isAssignable: isAssignable);
+    length.guaranteedType = HType.INTEGER;
     types[length] = HType.INTEGER;
     node.block.addBefore(node, length);
 
@@ -732,13 +738,6 @@
     node.changeUse(node.index, index);
     assert(node.isBuiltin(types));
   }
-
-  void visitInvokeInterceptor(HInvokeInterceptor node) {
-    if (!node.isPopCall(types)) return;
-    if (boundsChecked.contains(node)) return;
-    HInstruction receiver = node.inputs[1];
-    insertBoundsCheck(node, receiver, graph.addConstantInt(0, constantSystem));
-  }
 }
 
 class SsaDeadCodeEliminator extends HGraphVisitor implements OptimizationPhase {
@@ -751,7 +750,7 @@
     return !instruction.hasSideEffects(types)
            && instruction.usedBy.isEmpty
            // A dynamic getter that has no side effect can still throw
-           // a NoSuchMethodError or a NullPointerException.
+           // a NoSuchMethodError.
            && instruction is !HInvokeDynamicGetter
            && instruction is !HCheck
            && instruction is !HTypeGuard
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/ssa.dart b/sdk/lib/_internal/compiler/implementation/ssa/ssa.dart
index 0e83a74..9675766 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/ssa.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/ssa.dart
@@ -12,7 +12,6 @@
 import '../elements/elements.dart';
 import '../js_backend/js_backend.dart';
 import '../native_handler.dart' as native;
-import '../runtime_types.dart';
 import '../tree/tree.dart';
 import '../types/types.dart';
 import '../universe/universe.dart';
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/tracer.dart b/sdk/lib/_internal/compiler/implementation/ssa/tracer.dart
index e38fe7c..e724bbb 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/tracer.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/tracer.dart
@@ -314,6 +314,11 @@
     return "Integer check: $value";
   }
 
+  String visitInterceptor(HInterceptor node) {
+    String value = temporaryId(node.inputs[0]);
+    return "Intercept: $value";
+  }
+
   String visitInvokeClosure(HInvokeClosure node)
       => visitInvokeDynamic(node, "closure");
 
@@ -334,9 +339,6 @@
   String visitInvokeDynamicSetter(HInvokeDynamicSetter node)
       => visitInvokeDynamic(node, "set");
 
-  String visitInvokeInterceptor(HInvokeInterceptor invoke)
-      => visitInvokeStatic(invoke);
-
   String visitInvokeStatic(HInvokeStatic invoke) {
     String target = temporaryId(invoke.target);
     int offset = HInvoke.ARGUMENTS_OFFSET;
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/types_propagation.dart b/sdk/lib/_internal/compiler/implementation/ssa/types_propagation.dart
index b64d2f1..31d511a 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/types_propagation.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/types_propagation.dart
@@ -68,17 +68,14 @@
   visitBasicBlock(HBasicBlock block) {
     if (block.isLoopHeader()) {
       block.forEachPhi((HPhi phi) {
-        HType propagatedType = types[phi];
-        // Once the propagation has run once, the propagated type can already
-        // be set. In this case we use that one for the first iteration of the
-        // loop.
-        if (propagatedType.isUnknown()) {
-          // Set the initial type for the phi. In theory we would need to mark
-          // the type of all other incoming edges as "unitialized" and take this
-          // into account when doing the propagation inside the phis. Just
-          // setting the propagated type is however easier.
-          types[phi] = types[phi.inputs[0]];
-        }
+        // Set the initial type for the phi. We're not using the type
+        // the phi thinks it has because new optimizations may imply
+        // changing it.
+        // In theory we would need to mark
+        // the type of all other incoming edges as "unitialized" and take this
+        // into account when doing the propagation inside the phis. Just
+        // setting the propagated type is however easier.
+        types[phi] = types[phi.inputs[0]];
         addToWorkList(phi);
       });
     } else {
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/value_range_analyzer.dart b/sdk/lib/_internal/compiler/implementation/ssa/value_range_analyzer.dart
index 6439c96..b6d892b 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/value_range_analyzer.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/value_range_analyzer.dart
@@ -628,12 +628,12 @@
     return info.newRange(value, value);
   }
 
-  Range visitInvokeInterceptor(HInvokeInterceptor interceptor) {
-    if (!interceptor.isInteger(types)) return info.newUnboundRange();
-    if (!interceptor.isLengthGetterOnStringOrArray(types)) {
-      return visitInstruction(interceptor);
+  Range visitFieldGet(HFieldGet fieldGet) {
+    if (!fieldGet.isInteger(types)) return info.newUnboundRange();
+    if (!fieldGet.receiver.isIndexablePrimitive(types)) {
+      return visitInstruction(fieldGet);
     }
-    LengthValue value = info.newLengthValue(interceptor);
+    LengthValue value = info.newLengthValue(fieldGet);
     // We know this range is above zero. To simplify the analysis, we
     // put the zero value as the lower bound of this range. This
     // allows to easily remove the second bound check in the following
diff --git a/sdk/lib/_internal/compiler/implementation/string_validator.dart b/sdk/lib/_internal/compiler/implementation/string_validator.dart
index a5f15e2..b3bcb61 100644
--- a/sdk/lib/_internal/compiler/implementation/string_validator.dart
+++ b/sdk/lib/_internal/compiler/implementation/string_validator.dart
@@ -49,7 +49,7 @@
     bool raw = false;
     int quoteLength = 1;
     int quoteChar = source.next();
-    if (quoteChar === $r) {
+    if (identical(quoteChar, $r)) {
       raw = true;
       quoteChar = source.next();
     }
@@ -90,12 +90,15 @@
                             int startOffset,
                             SourceString string,
                             StringQuoting quoting) {
-    // We only need to check for invalid x and u escapes, for line
+    // We need to check for invalid x and u escapes, for line
     // terminators in non-multiline strings, and for invalid Unicode
-    // scalar values (either directly or as u-escape values).
+    // scalar values (either directly or as u-escape values).  We also check
+    // for unpaired UTF-16 surrogates.
     int length = 0;
     int index = startOffset;
     bool containsEscape = false;
+    bool previousWasLeadSurrogate = false;
+    bool invalidUtf16 = false;
     for(Iterator<int> iter = string.iterator(); iter.hasNext; length++) {
       index++;
       int code = iter.next();
@@ -168,15 +171,26 @@
           code = value;
         }
       }
+      if (code >= 0x10000) length++;
       // This handles both unescaped characters and the value of unicode
       // escapes.
-      if (!isUnicodeScalarValue(code)) {
-        stringParseError(
-            "Invalid Unicode scalar value U+${code.toRadixString(16)}",
-            token, index);
-        return null;
+      if (previousWasLeadSurrogate) {
+        if (!isUtf16TrailSurrogate(code)) {
+          invalidUtf16 = true;
+          break;
+        }
+        previousWasLeadSurrogate = false;
+      } else if (isUtf16LeadSurrogate(code)) {
+        previousWasLeadSurrogate = true;
+      } else if (!isUnicodeScalarValue(code)) {
+        invalidUtf16 = true;
+        break;
       }
     }
+    if (previousWasLeadSurrogate || invalidUtf16) {
+      stringParseError("Invalid Utf16 surrogate", token, index);
+      return null;
+    }
     // String literal successfully validated.
     if (quoting.raw || !containsEscape) {
       // A string without escapes could just as well have been raw.
diff --git a/sdk/lib/_internal/compiler/implementation/tree/nodes.dart b/sdk/lib/_internal/compiler/implementation/tree/nodes.dart
index d8e5473..6515a32 100644
--- a/sdk/lib/_internal/compiler/implementation/tree/nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/tree/nodes.dart
@@ -1684,7 +1684,7 @@
  * Combinators filter away some identifiers from the other library.
  */
 abstract class LibraryDependency extends LibraryTag {
-  final LiteralString uri;
+  final StringNode uri;
   final NodeList combinators;
 
   LibraryDependency(this.uri, this.combinators);
@@ -1701,7 +1701,7 @@
   final Identifier prefix;
   final Token importKeyword;
 
-  Import(this.importKeyword, LiteralString uri,
+  Import(this.importKeyword, StringNode uri,
          this.prefix, NodeList combinators)
       : super(uri, combinators);
 
@@ -1761,7 +1761,7 @@
 }
 
 class Part extends LibraryTag {
-  final LiteralString uri;
+  final StringNode uri;
 
   final Token partKeyword;
 
diff --git a/sdk/lib/_internal/compiler/implementation/typechecker.dart b/sdk/lib/_internal/compiler/implementation/typechecker.dart
index d4889b6..b192c23 100644
--- a/sdk/lib/_internal/compiler/implementation/typechecker.dart
+++ b/sdk/lib/_internal/compiler/implementation/typechecker.dart
@@ -36,6 +36,7 @@
   static const TypeKind STATEMENT = const TypeKind('statement');
   static const TypeKind TYPEDEF = const TypeKind('typedef');
   static const TypeKind TYPE_VARIABLE = const TypeKind('type variable');
+  static const TypeKind MALFORMED_TYPE = const TypeKind('malformed');
   static const TypeKind VOID = const TypeKind('void');
 
   String toString() => id;
@@ -60,6 +61,19 @@
   Element get element;
 
   /**
+   * Performs the substitution [: [arguments[i]/parameters[i]]this :].
+   *
+   * The notation is known from this lambda calculus rule:
+   *
+   *     (lambda x.e0)e1 -> [e1/x]e0.
+   *
+   * See [TypeVariableType] for a motivation for this method.
+   *
+   * Invariant: There must be the same number of [arguments] and [parameters].
+   */
+  DartType subst(Link<DartType> arguments, Link<DartType> parameters);
+
+  /**
    * Returns the unaliased type of this type.
    *
    * The unaliased type of a typedef'd type is the unaliased type to which its
@@ -76,6 +90,28 @@
   DartType asRaw() => this;
 }
 
+/**
+ * Represents a type variable, that is the type parameters of a class type.
+ *
+ * For example, in [: class Array<E> { ... } :], E is a type variable.
+ *
+ * Each class should have its own unique type variables, one for each type
+ * parameter. A class with type parameters is said to be parameterized or
+ * generic.
+ *
+ * Non-static members, constructors, and factories of generic
+ * class/interface can refer to type variables of the current class
+ * (not of supertypes).
+ *
+ * When using a generic type, also known as an application or
+ * instantiation of the type, the actual type arguments should be
+ * substituted for the type variables in the class declaration.
+ *
+ * For example, given a box, [: class Box<T> { T value; } :], the
+ * type of the expression [: new Box<String>().value :] is
+ * [: String :] because we must substitute [: String :] for the
+ * the type variable [: T :].
+ */
 class TypeVariableType extends DartType {
   final TypeVariableElement element;
 
@@ -85,6 +121,29 @@
 
   SourceString get name => element.name;
 
+  DartType subst(Link<DartType> arguments, Link<DartType> parameters) {
+    if (parameters.isEmpty) {
+      assert(arguments.isEmpty);
+      // Return fast on empty substitutions.
+      return this;
+    }
+    Link<DartType> parameterLink = parameters;
+    Link<DartType> argumentLink = arguments;
+    while (!argumentLink.isEmpty && !parameterLink.isEmpty) {
+      TypeVariableType parameter = parameterLink.head;
+      DartType argument = argumentLink.head;
+      if (parameter == this) {
+        assert(argumentLink.tail.isEmpty == parameterLink.tail.isEmpty);
+        return argument;
+      }
+      parameterLink = parameterLink.tail;
+      argumentLink = argumentLink.tail;
+    }
+    assert(argumentLink.isEmpty && parameterLink.isEmpty);
+    // The type variable was not substituted.
+    return this;
+  }
+
   DartType unalias(Compiler compiler) => this;
 
   int get hashCode => 17 * element.hashCode;
@@ -120,6 +179,11 @@
     return (identical(this, other)) ? this : MAYBE_RETURNING;
   }
 
+  DartType subst(Link<DartType> arguments, Link<DartType> parameters) {
+    // Statement types are not substitutable.
+    return this;
+  }
+
   DartType unalias(Compiler compiler) => this;
 
   int get hashCode => 17 * stringName.hashCode;
@@ -141,6 +205,11 @@
 
   final VoidElement element;
 
+  DartType subst(Link<DartType> arguments, Link<DartType> parameters) {
+    // Void cannot be substituted.
+    return this;
+  }
+
   DartType unalias(Compiler compiler) => this;
 
   int get hashCode => 1729;
@@ -150,25 +219,90 @@
   String toString() => name.slowToString();
 }
 
+/**
+ * Helper method for performing substitution of a linked list of types.
+ *
+ * If no types are changed by the substitution, the [types] is returned instead
+ * of a newly created linked list.
+ */
+Link<DartType> substTypes(Link<DartType> types,
+                          Link<DartType> arguments, Link<DartType> parameters) {
+  bool changed = false;
+  var builder = new LinkBuilder<DartType>();
+  Link<DartType> typeLink = types;
+  while (!typeLink.isEmpty) {
+    var argument = typeLink.head.subst(arguments, parameters);
+    if (!changed && !identical(argument, typeLink.head)) {
+      changed = true;
+    }
+    builder.addLast(argument);
+    typeLink = typeLink.tail;
+  }
+  if (changed) {
+    // Create a new link only if necessary.
+    return builder.toLink();
+  }
+  return types;
+}
+
+class MalformedType extends DartType {
+  const MalformedType(this.element);
+
+  TypeKind get kind => TypeKind.MALFORMED_TYPE;
+
+  SourceString get name => element.name;
+
+  final MalformedTypeElement element;
+
+  DartType unalias(Compiler compiler) => this;
+
+  int get hashCode => 1733;
+
+  bool operator ==(other) => other is MalformedType;
+
+  String toString() => name.slowToString();
+}
+
 class InterfaceType extends DartType {
   final Element element;
-  final Link<DartType> arguments;
+  final Link<DartType> typeArguments;
 
-  const InterfaceType(this.element,
-                      [this.arguments = const Link<DartType>()]);
+  InterfaceType(this.element,
+                [this.typeArguments = const Link<DartType>()]) {
+    assert(invariant(element, element.isDeclaration));
+  }
 
   TypeKind get kind => TypeKind.INTERFACE;
 
   SourceString get name => element.name;
 
+  DartType subst(Link<DartType> arguments, Link<DartType> parameters) {
+    if (typeArguments.isEmpty) {
+      // Return fast on non-generic types.
+      return this;
+    }
+    if (parameters.isEmpty) {
+      assert(arguments.isEmpty);
+      // Return fast on empty substitutions.
+      return this;
+    }
+    Link<DartType> newTypeArguments =
+        substTypes(typeArguments, arguments, parameters);
+    if (!identical(typeArguments, newTypeArguments)) {
+      // Create a new type only if necessary.
+      return new InterfaceType(element, newTypeArguments);
+    }
+    return this;
+  }
+
   DartType unalias(Compiler compiler) => this;
 
   String toString() {
     StringBuffer sb = new StringBuffer();
     sb.add(name.slowToString());
-    if (!arguments.isEmpty) {
+    if (!typeArguments.isEmpty) {
       sb.add('<');
-      arguments.printOn(sb, ', ');
+      typeArguments.printOn(sb, ', ');
       sb.add('>');
     }
     return sb.toString();
@@ -176,7 +310,7 @@
 
   int get hashCode {
     int hash = element.hashCode;
-    for (Link<DartType> arguments = this.arguments;
+    for (Link<DartType> arguments = this.typeArguments;
          !arguments.isEmpty;
          arguments = arguments.tail) {
       int argumentHash = arguments.head != null ? arguments.head.hashCode : 0;
@@ -188,11 +322,11 @@
   bool operator ==(other) {
     if (other is !InterfaceType) return false;
     if (!identical(element, other.element)) return false;
-    return arguments == other.arguments;
+    return typeArguments == other.typeArguments;
   }
 
   InterfaceType asRaw() {
-    if (arguments.isEmpty) return this;
+    if (typeArguments.isEmpty) return this;
     return new InterfaceType(element);
   }
 }
@@ -209,6 +343,25 @@
 
   TypeKind get kind => TypeKind.FUNCTION;
 
+  DartType subst(Link<DartType> arguments, Link<DartType> parameters) {
+    if (parameters.isEmpty) {
+      assert(arguments.isEmpty);
+      // Return fast on empty substitutions.
+      return this;
+    }
+    var newReturnType = returnType.subst(arguments, parameters);
+    bool changed = !identical(newReturnType, returnType);
+    var newParameterTypes = substTypes(parameterTypes, arguments, parameters);
+    if (!changed && !identical(parameterTypes, newParameterTypes)) {
+      changed = true;
+    }
+    if (changed) {
+      // Create a new type only if necessary.
+      return new FunctionType(newReturnType, newParameterTypes, element);
+    }
+    return this;
+  }
+
   DartType unalias(Compiler compiler) => this;
 
   String toString() {
@@ -257,15 +410,35 @@
   final Link<DartType> typeArguments;
 
   const TypedefType(this.element,
-      [this.typeArguments = const Link<DartType>()]);
+                    [this.typeArguments = const Link<DartType>()]);
 
   TypeKind get kind => TypeKind.TYPEDEF;
 
   SourceString get name => element.name;
 
+  DartType subst(Link<DartType> arguments, Link<DartType> parameters) {
+    if (typeArguments.isEmpty) {
+      // Return fast on non-generic typedefs.
+      return this;
+    }
+    if (parameters.isEmpty) {
+      assert(arguments.isEmpty);
+      // Return fast on empty substitutions.
+      return this;
+    }
+    Link<DartType> newTypeArguments =
+        substTypes(typeArguments, arguments, parameters);
+    if (!identical(typeArguments, newTypeArguments)) {
+      // Create a new type only if necessary.
+      return new TypedefType(element, newTypeArguments);
+    }
+    return this;
+  }
+
   DartType unalias(Compiler compiler) {
     // TODO(ahe): This should be [ensureResolved].
     compiler.resolveTypedef(element);
+    // TODO(johnniwinther): Perform substitution on the unaliased type.
     return element.alias.unalias(compiler);
   }
 
@@ -289,21 +462,34 @@
   }
 }
 
+/**
+ * Special type to hold the [dynamic] type. Used for correctly returning
+ * 'dynamic' on [toString].
+ */
+class DynamicType extends InterfaceType {
+  DynamicType(ClassElement element) : super(element);
+
+  String toString() => 'dynamic';
+}
+
+
 class Types {
   final Compiler compiler;
   // TODO(karlklose): should we have a class Void?
   final VoidType voidType;
   final InterfaceType dynamicType;
 
-  Types(Compiler compiler, Element dynamicElement)
+  Types(Compiler compiler, ClassElement dynamicElement)
     : this.with(compiler, dynamicElement,
                 new LibraryElement(new Script(null, null)));
 
   Types.with(Compiler this.compiler,
-             Element dynamicElement,
+             ClassElement dynamicElement,
              LibraryElement library)
     : voidType = new VoidType(new VoidElement(library)),
-      dynamicType = new InterfaceType(dynamicElement);
+      dynamicType = new DynamicType(dynamicElement) {
+    dynamicElement.type = dynamicType;
+  }
 
   /** Returns true if t is a subtype of s */
   bool isSubtype(DartType t, DartType s) {
@@ -319,6 +505,8 @@
 
     if (t is VoidType) {
       return false;
+    } else if (t is MalformedType) {
+      return false;
     } else if (t is InterfaceType) {
       if (s is !InterfaceType) return false;
       ClassElement tc = t.element;
diff --git a/sdk/lib/_internal/compiler/implementation/universe/universe.dart b/sdk/lib/_internal/compiler/implementation/universe/universe.dart
index ced6600..57f445d 100644
--- a/sdk/lib/_internal/compiler/implementation/universe/universe.dart
+++ b/sdk/lib/_internal/compiler/implementation/universe/universe.dart
@@ -7,7 +7,6 @@
 import '../closure.dart';
 import '../elements/elements.dart';
 import '../dart2jslib.dart';
-import '../runtime_types.dart';
 import '../tree/tree.dart';
 import '../util/util.dart';
 
@@ -49,7 +48,6 @@
   final Map<SourceString, Set<Selector>> fieldGetters;
   final Map<SourceString, Set<Selector>> fieldSetters;
   final Set<DartType> isChecks;
-  final RuntimeTypeInformation rti;
 
   Universe() : generatedCode = new Map<Element, CodeBuffer>(),
                generatedBailoutCode = new Map<Element, CodeBuffer>(),
@@ -60,8 +58,7 @@
                invokedSetters = new Map<SourceString, Set<Selector>>(),
                fieldGetters = new Map<SourceString, Set<Selector>>(),
                fieldSetters = new Map<SourceString, Set<Selector>>(),
-               isChecks = new Set<DartType>(),
-               rti = new RuntimeTypeInformation();
+               isChecks = new Set<DartType>();
 
   void addGeneratedCode(WorkItem work, CodeBuffer codeBuffer) {
     assert(invariant(work.element, work.element.isDeclaration));
@@ -438,7 +435,8 @@
 
     // If [self] is a subclass of [other], it inherits the
     // implementation of [element].
-    if (self.isSubclassOf(other)) {
+    ClassElement cls = self;
+    if (cls.isSubclassOf(other)) {
       // Resolve an invocation of [element.name] on [self]. If it
       // is found, this selector is a candidate.
       return hasElementIn(self, element) && appliesUntyped(element, compiler);
diff --git a/sdk/lib/_internal/compiler/implementation/util/characters.dart b/sdk/lib/_internal/compiler/implementation/util/characters.dart
index 064efe7..5961d07 100644
--- a/sdk/lib/_internal/compiler/implementation/util/characters.dart
+++ b/sdk/lib/_internal/compiler/implementation/util/characters.dart
@@ -133,3 +133,11 @@
   return value < $FIRST_SURROGATE ||
       (value > $LAST_SURROGATE && value <= $LAST_CODE_POINT);
 }
+
+bool isUtf16LeadSurrogate(int value) {
+  return value >= 0xd800 && value <= 0xdbff;
+}
+
+bool isUtf16TrailSurrogate(int value) {
+  return value >= 0xdc00 && value <= 0xdfff;
+}
diff --git a/sdk/lib/_internal/compiler/implementation/util/link.dart b/sdk/lib/_internal/compiler/implementation/util/link.dart
index b4ad7da..fe8ac30 100644
--- a/sdk/lib/_internal/compiler/implementation/util/link.dart
+++ b/sdk/lib/_internal/compiler/implementation/util/link.dart
@@ -59,8 +59,8 @@
   String toString() => "[]";
 }
 
-interface LinkBuilder<T> default LinkBuilderImplementation<T> {
-  LinkBuilder();
+abstract class LinkBuilder<T> {
+  factory LinkBuilder() = LinkBuilderImplementation;
 
   Link<T> toLink();
   void addLast(T t);
diff --git a/sdk/lib/_internal/compiler/implementation/util/util.dart b/sdk/lib/_internal/compiler/implementation/util/util.dart
index 64194ea..70c1eaf 100644
--- a/sdk/lib/_internal/compiler/implementation/util/util.dart
+++ b/sdk/lib/_internal/compiler/implementation/util/util.dart
@@ -24,52 +24,75 @@
   String toString() => 'Compiler crashed: $message.';
 }
 
-/// Writes the characters of [iterator] on [buffer].  The characters
+/// Writes the characters of [string] on [buffer].  The characters
 /// are escaped as suitable for JavaScript and JSON.  [buffer] is
 /// anything which supports [:add:] and [:addCharCode:], for example,
-/// [StringBuffer].
-void writeJsonEscapedCharsOn(Iterator<int> iterator, buffer, onError(code)) {
-  while (iterator.hasNext) {
-    int code = iterator.next();
-    if (identical(code, $SQ)) {
-      buffer.add(r"\'");
-    } else if (identical(code, $LF)) {
-      buffer.add(r'\n');
-    } else if (identical(code, $CR)) {
-      buffer.add(r'\r');
-    } else if (identical(code, $LS)) {
-      // This Unicode line terminator and $PS are invalid in JS string
-      // literals.
-      buffer.add(r'\u2028');
-    } else if (identical(code, $PS)) {
-      buffer.add(r'\u2029');
-    } else if (identical(code, $BACKSLASH)) {
-      buffer.add(r'\\');
-    } else {
-      if (code > 0xffff) {
-        if (onError != null) onError(code);
-        throw 'Unhandled non-BMP character: ${code.toRadixString(16)}';
-      }
-      // TODO(lrn): Consider whether all codes above 0x7f really need to
-      // be escaped. We build a Dart string here, so it should be a literal
-      // stage that converts it to, e.g., UTF-8 for a JS interpreter.
-      if (code < 0x20) {
-        buffer.add(r'\x');
-        if (code < 0x10) buffer.add('0');
-        buffer.add(code.toRadixString(16));
-      } else if (code >= 0x80) {
-        if (code < 0x100) {
-          buffer.add(r'\x');
-        } else {
-          buffer.add(r'\u');
-          if (code < 0x1000) {
-            buffer.add('0');
-          }
+/// [StringBuffer].  Note that JS supports \xnn and \unnnn whereas JSON only
+/// supports the \unnnn notation.  Therefore we use the \unnnn notation.
+void writeJsonEscapedCharsOn(String string, buffer) {
+  void addCodeUnitEscaped(var buffer, int code) {
+    assert(code < 0x10000);
+    buffer.add(r'\u');
+    if (code < 0x1000) {
+      buffer.add('0');
+      if (code < 0x100) {
+        buffer.add('0');
+        if (code < 0x10) {
+          buffer.add('0');
         }
-        buffer.add(code.toRadixString(16));
+      }
+    }
+    buffer.add(code.toRadixString(16));
+  }
+
+  void writeEscapedOn(String string, var buffer) {
+    for (int i = 0; i < string.length; i++) {
+      int code = string.charCodeAt(i);
+      if (code == $DQ) {
+        buffer.add(r'\"');
+      } else if (code == $TAB) {
+        buffer.add(r'\t');
+      } else if (code == $LF) {
+        buffer.add(r'\n');
+      } else if (code == $CR) {
+        buffer.add(r'\r');
+      } else if (code == $DEL) {
+        addCodeUnitEscaped(buffer, $DEL);
+      } else if (code == $LS) {
+        // This Unicode line terminator and $PS are invalid in JS string
+        // literals.
+        addCodeUnitEscaped(buffer, $LS);  // 0x2028.
+      } else if (code == $PS) {
+        addCodeUnitEscaped(buffer, $PS);  // 0x2029.
+      } else if (code == $BACKSLASH) {
+        buffer.add(r'\\');
       } else {
-        buffer.addCharCode(code);
+        if (code < 0x20) {
+          addCodeUnitEscaped(buffer, code);
+          // We emit DEL (ASCII 0x7f) as an escape because it would be confusing
+          // to have it unescaped in a string literal.  We also escape
+          // everything above 0x7f because that means we don't have to worry
+          // about whether the web server serves it up as Latin1 or UTF-8.
+        } else if (code < 0x7f) {
+          buffer.addCharCode(code);
+        } else {
+          // This will output surrogate pairs in the form \udxxx\udyyy, rather
+          // than the more logical \u{zzzzzz}.  This should work in JavaScript
+          // (especially old UCS-2 based implementations) and is the only
+          // format that is allowed in JSON.
+          addCodeUnitEscaped(buffer, code);
+        }
       }
     }
   }
+
+  for (int i = 0; i < string.length; i++) {
+    int code = string.charCodeAt(i);
+    if (code < 0x20 || code == $DEL || code == $DQ || code == $LS ||
+        code == $PS || code == $BACKSLASH || code >= 0x80) {
+      writeEscapedOn(string, buffer);
+      return;
+    }
+  }
+  buffer.add(string);
 }
diff --git a/sdk/lib/_internal/compiler/implementation/world.dart b/sdk/lib/_internal/compiler/implementation/world.dart
index bea9547..9116478 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.arguments.isEmpty) {
+        if (!itf.typeArguments.isEmpty) {
           potentiallyAddForRti(itf.element, null);
         }
       }
@@ -126,10 +126,9 @@
 
   // Returns whether a subclass of [superclass] implements [type].
   bool hasAnySubclassThatImplements(ClassElement superclass, DartType type) {
-    Set<ClassElement> typesImplementedBySubclasses =
-          typesImplementedBySubclasses[superclass];
-    if (typesImplementedBySubclasses == null) return false;
-    return typesImplementedBySubclasses.contains(type.element);
+    Set<ClassElement> subclasses= typesImplementedBySubclasses[superclass];
+    if (subclasses == null) return false;
+    return subclasses.contains(type.element);
   }
 
   bool hasNoOverridingMember(Element element) {
diff --git a/sdk/lib/_internal/dartdoc/lib/src/dartdoc/comment_map.dart b/sdk/lib/_internal/dartdoc/lib/src/dartdoc/comment_map.dart
index 77b7e07..14f17bd 100644
--- a/sdk/lib/_internal/dartdoc/lib/src/dartdoc/comment_map.dart
+++ b/sdk/lib/_internal/dartdoc/lib/src/dartdoc/comment_map.dart
@@ -78,7 +78,7 @@
           if (lastComment == null) {
             lastComment = line;
           } else {
-            lastComment = '$lastComment$line';
+            lastComment = '$lastComment\n$line';
           }
         }
       } else if (token.kind == dart2js.HASH_TOKEN) {
diff --git a/sdk/lib/_internal/dartdoc/test/comment_map_test.dart b/sdk/lib/_internal/dartdoc/test/comment_map_test.dart
new file mode 100644
index 0000000..3d6c4c9
--- /dev/null
+++ b/sdk/lib/_internal/dartdoc/test/comment_map_test.dart
@@ -0,0 +1,38 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Unit tests for comment map.
+library commentMapTests;
+
+import 'dart:uri';
+import 'dart:mirrors';
+
+import '../../compiler/implementation/scanner/scannerlib.dart' as dart2js;
+
+// TODO(rnystrom): Better path to unittest.
+import '../../../../../pkg/unittest/lib/unittest.dart';
+
+// TODO(rnystrom): Use "package:" URL (#4968).
+part '../lib/src/dartdoc/comment_map.dart';
+
+class FakeSourceLocation implements SourceLocation {
+  Uri get sourceUri => new Uri('file:///tmp/test.dart');
+  int get offset => 69;
+  String get sourceText => """
+    /// Testing
+    ///     var testing = 'this is source code';
+    get foo => 'bar';
+  """;
+}
+
+main() {
+  test('triple slashed comments retain newlines', () {
+    Commentmap cm = new CommentMap();
+    var comment = cm.find(new FakeSourceLocation());
+    expect(
+      comment,
+      equals("Testing\n    var testing = 'this is source code';")
+    );
+  });
+}
diff --git a/sdk/lib/core/comparable.dart b/sdk/lib/core/comparable.dart
index 3b38f25..92df742 100644
--- a/sdk/lib/core/comparable.dart
+++ b/sdk/lib/core/comparable.dart
@@ -31,7 +31,7 @@
    * May throw an [ArgumentError] if [other] is of a type that
    * is not comparable to [:this:].
    */
-  abstract int compareTo(Comparable other);
+  int compareTo(Comparable other);
 
   /**
    * Compare one comparable to another.
diff --git a/sdk/lib/core/double.dart b/sdk/lib/core/double.dart
index d2eb73e..2f8b529 100644
--- a/sdk/lib/core/double.dart
+++ b/sdk/lib/core/double.dart
@@ -22,22 +22,22 @@
   static const double MAX_FINITE = 1.7976931348623157e+308;
 
   /** Return the remainder from dividing this [double] by [other]. */
-  abstract double remainder(num other);
+  double remainder(num other);
 
   /** Addition operator. */
-  abstract double operator +(num other);
+  double operator +(num other);
 
   /** Subtraction operator. */
-  abstract double operator -(num other);
+  double operator -(num other);
 
   /** Multiplication operator. */
-  abstract double operator *(num other);
+  double operator *(num other);
 
   /** Euclidean modulo operator. */
-  abstract double operator %(num other);
+  double operator %(num other);
 
   /** Division operator. */
-  abstract double operator /(num other);
+  double operator /(num other);
 
   /**
    * Truncating division operator.
@@ -45,13 +45,13 @@
    * The result of the truncating division [:a ~/ b:] is equivalent to
    * [:(a / b).truncate():].
    */
-  abstract double operator ~/(num other);
+  double operator ~/(num other);
 
   /** Negate operator. */
-  abstract double operator -();
+  double operator -();
 
   /** Returns the absolute value of this [double]. */
-  abstract double abs();
+  double abs();
 
   /**
    * Returns the integer value closest to this [double].
@@ -59,19 +59,19 @@
    * Rounds away from zero when there is no closest integer:
    *  [:(3.5).round() == 4:] and [:(-3.5).round() == -4:].
    */
-  abstract double round();
+  double round();
 
   /** Returns the greatest integer value no greater than this [double]. */
-  abstract double floor();
+  double floor();
 
   /** Returns the least integer value that is no smaller than this [double]. */
-  abstract double ceil();
+  double ceil();
 
   /**
    * Returns the integer value obtained by discarding any fractional
    * digits from this [double].
    */
-  abstract double truncate();
+  double truncate();
 
   /**
    * Provide a representation of this [double] value.
@@ -86,7 +86,7 @@
    * It should always be the case that if [:d:] is a [double], then
    * [:d == double.parse(d.toString()):].
    */
-  abstract String toString();
+  String toString();
 
   /**
    * Parse [source] as an double literal and return its value.
diff --git a/sdk/lib/core/errors.dart b/sdk/lib/core/errors.dart
index 7ce8628..eeb0c04 100644
--- a/sdk/lib/core/errors.dart
+++ b/sdk/lib/core/errors.dart
@@ -4,6 +4,31 @@
 
 class Error {
   const Error();
+
+  /**
+   * Safely convert a value to a [String] description.
+   *
+   * The conversion is guaranteed to not throw, so it won't use the object's
+   * toString method.
+   */
+  static String safeToString(Object object) {
+    if (object is int || object is double || object is bool || null == object) {
+      return object.toString();
+    }
+    if (object is String) {
+      // TODO(ahe): Remove backslash when http://dartbug.com/4995 is fixed.
+      const backslash = '\\';
+      String escaped = object
+        .replaceAll('$backslash', '$backslash$backslash')
+        .replaceAll('\n', '${backslash}n')
+        .replaceAll('\r', '${backslash}r')
+        .replaceAll('"',  '$backslash"');
+      return '"$escaped"';
+    }
+    return _objectToString(object);
+  }
+
+  external static String _objectToString(Object object);
 }
 
 /**
@@ -25,13 +50,21 @@
 }
 
 /**
+ * Error thrown when attempting to throw [:null:].
+ */
+class NullThrownError implements Error {
+  const NullThrownError();
+  String toString() => "Throw of null.";
+}
+
+/**
  * Error thrown when a function is passed an unacceptable argument.
  */
 class ArgumentError implements Error {
   final message;
 
   /** The [message] describes the erroneous argument. */
-  const ArgumentError([this.message]);
+  ArgumentError([this.message]);
 
   String toString() {
     if (message != null) {
@@ -120,7 +153,7 @@
         if (i > 0) {
           sb.add(", ");
         }
-        sb.add(safeToString(_arguments[i]));
+        sb.add(Error.safeToString(_arguments[i]));
       }
     }
     if (_namedArguments != null) {
@@ -130,13 +163,13 @@
         }
         sb.add(key);
         sb.add(": ");
-        sb.add(safeToString(value));
+        sb.add(Error.safeToString(value));
         i++;
       });
     }
     if (_existingArgumentNames == null) {
       return "NoSuchMethodError : method not found: '$_memberName'\n"
-          "Receiver: ${safeToString(_receiver)}\n"
+          "Receiver: ${Error.safeToString(_receiver)}\n"
           "Arguments: [$sb]";
     } else {
       String actualParameters = sb.toString();
@@ -150,30 +183,11 @@
       String formalParameters = sb.toString();
       return "NoSuchMethodError: incorrect number of arguments passed to "
           "method named '$_memberName'\n"
-          "Receiver: ${safeToString(_receiver)}\n"
+          "Receiver: ${Error.safeToString(_receiver)}\n"
           "Tried calling: $_memberName($actualParameters)\n"
           "Found: $_memberName($formalParameters)";
     }
   }
-
-  static String safeToString(Object object) {
-    if (object is int || object is double || object is bool || null == object) {
-      return object.toString();
-    }
-    if (object is String) {
-      // TODO(ahe): Remove backslash when http://dartbug.com/4995 is fixed.
-      const backslash = '\\';
-      String escaped = object
-        .replaceAll('$backslash', '$backslash$backslash')
-        .replaceAll('\n', '${backslash}n')
-        .replaceAll('\r', '${backslash}r')
-        .replaceAll('"',  '$backslash"');
-      return '"$escaped"';
-    }
-    return _objectToString(object);
-  }
-
-  external static String _objectToString(Object object);
 }
 
 
diff --git a/sdk/lib/core/exceptions.dart b/sdk/lib/core/exceptions.dart
index 61f3f89..afe3285 100644
--- a/sdk/lib/core/exceptions.dart
+++ b/sdk/lib/core/exceptions.dart
@@ -5,19 +5,31 @@
 // Exceptions are thrown either by the VM or from Dart code.
 
 /**
- * Interface implemented by all core library exceptions.
- * Defaults to an implementation that only carries a simple message.
+ * A marker interface implemented by all core library exceptions.
+ *
+ * An [Exception] is intended to convey information to the user about a failure,
+ * so that the error can be addressed programmatically. It is intended to be
+ * caught, and it should contain useful data fields.
+ *
+ * Creating instances of [Exception] directly with [:new Exception("message"):]
+ * is discouraged, and only included as a temporary measure during development,
+ * until the actual exceptions used by a library are done.
  */
 abstract class Exception {
-  const factory Exception([var message]) = _ExceptionImplementation;
+  factory Exception([var message]) => new _ExceptionImplementation(message);
 }
 
 
 /** Default implementation of [Exception] which carries a message. */
 class _ExceptionImplementation implements Exception {
   final message;
-  const _ExceptionImplementation([this.message]);
-  String toString() => (message == null) ? "Exception" : "Exception: $message";
+
+  _ExceptionImplementation([this.message]);
+
+  String toString() {
+    if (message == null) return "Exception";
+    return "Exception: $message";
+  }
 }
 
 
@@ -40,25 +52,6 @@
 }
 
 
-class NullPointerException implements Exception {
-  const NullPointerException([this.functionName, this.arguments = const []]);
-  String toString() {
-    if (functionName == null) {
-      return exceptionName;
-    } else {
-      return "$exceptionName : method: '$functionName'\n"
-          "Receiver: null\n"
-          "Arguments: $arguments";
-    }
-  }
-
-  String get exceptionName => "NullPointerException";
-
-  final String functionName;
-  final List arguments;
-}
-
-
 class IllegalJSRegExpException implements Exception {
   const IllegalJSRegExpException(String this._pattern, String this._errmsg);
   String toString() => "IllegalJSRegExpException: '$_pattern' '$_errmsg'";
diff --git a/sdk/lib/core/future_impl.dart b/sdk/lib/core/future_impl.dart
index bbae82d..2c22e46 100644
--- a/sdk/lib/core/future_impl.dart
+++ b/sdk/lib/core/future_impl.dart
@@ -27,6 +27,11 @@
   bool _exceptionHandled = false;
 
   /**
+   * true if an exception in this future should be thrown to the top level.
+   */
+  bool _throwOnException = false;
+
+  /**
    * Listeners waiting to receive the value of this future.
    */
   final List<Function> _successListeners;
@@ -88,12 +93,21 @@
     if (hasValue) {
       onSuccess(value);
     } else if (!isComplete) {
+      _throwOnException = true;
       _successListeners.add(onSuccess);
     } else if (!_exceptionHandled) {
       throw new FutureUnhandledException(_exception, stackTrace);
     }
   }
 
+  void _handleSuccess(void onSuccess(T value)) {
+    if (hasValue) {
+      onSuccess(value);
+    } else if (!isComplete) {
+      _successListeners.add(onSuccess);
+    }
+  }
+
   void handleException(bool onException(Object exception)) {
     if (_exceptionHandled) return;
     if (_isComplete) {
@@ -135,7 +149,7 @@
           listener(value);
         }
       } else {
-        if (!_exceptionHandled && _successListeners.length > 0) {
+        if (!_exceptionHandled && _throwOnException) {
           throw new FutureUnhandledException(_exception, stackTrace);
         }
       }
@@ -174,7 +188,7 @@
 
     _forwardException(this, completer);
 
-    then((v) {
+    _handleSuccess((v) {
       var transformed = null;
       try {
         transformed = transformation(v);
@@ -192,7 +206,7 @@
     final completer = new Completer();
 
     _forwardException(this, completer);
-    then((v) {
+    _handleSuccess((v) {
       var future = null;
       try {
         future = transformation(v);
@@ -223,10 +237,10 @@
       } catch (innerException, stackTrace) {
         completer.completeException(innerException, stackTrace);
       }
-      return true;
+      return false;
     });
 
-    then(completer.complete);
+    _handleSuccess(completer.complete);
 
     return completer.future;
   }
@@ -236,7 +250,7 @@
    */
   _forward(Future future, Completer completer) {
     _forwardException(future, completer);
-    future.then(completer.complete);
+    future._handleSuccess(completer.complete);
   }
 
   /**
@@ -245,7 +259,7 @@
   _forwardException(Future future, Completer completer) {
     future.handleException((e) {
       completer.completeException(e, future.stackTrace);
-      return true;
+      return false;
     });
   }
 }
diff --git a/sdk/lib/core/hashable.dart b/sdk/lib/core/hashable.dart
index aaf345b..b0361d0 100644
--- a/sdk/lib/core/hashable.dart
+++ b/sdk/lib/core/hashable.dart
@@ -13,5 +13,5 @@
  */
 abstract class Hashable {
   // TODO(lrn): http://darbug.com/5522
-  abstract int get hashCode;
+  int get hashCode;
 }
diff --git a/sdk/lib/core/list.dart b/sdk/lib/core/list.dart
index b4948a3..43a9887 100644
--- a/sdk/lib/core/list.dart
+++ b/sdk/lib/core/list.dart
@@ -6,8 +6,7 @@
  * A [List] is an indexable collection with a length. It can be of
  * fixed size or extendable.
  */
-interface List<E> extends Collection<E>, Sequence<E>
-                  default _ListImpl<E> {
+abstract class List<E> implements Collection<E>, Sequence<E> {
   /**
    * Creates a list of the given [length].
    *
@@ -17,13 +16,19 @@
    * If a [length] argument is supplied, a fixed size list of that
    * length is created.
    */
-  List([int length]);
+  external factory List([int length]);
 
   /**
    * Creates a list with the elements of [other]. The order in
    * the list will be the order provided by the iterator of [other].
    */
-  List.from(Iterable<E> other);
+  factory List.from(Iterable<E> other) {
+    var list = new List<E>();
+    for (var e in other) {
+      list.add(e);
+    }
+    return list;
+  }
 
   /**
    * Returns the element at the given [index] in the list or throws
@@ -123,6 +128,12 @@
   E removeLast();
 
   /**
+   * Returns the first element of the list, or throws an out of bounds
+   * exception if the list is empty.
+   */
+  E get first;
+
+  /**
    * Returns the last element of the list, or throws an out of bounds
    * exception if the list is empty.
    */
@@ -174,20 +185,3 @@
    */
   void insertRange(int start, int length, [E initialValue]);
 }
-
-class _ListImpl<E> {
-  /**
-   * Factory implementation of List().
-   *
-   * Creates a list of the given [length].
-   */
-  external factory List([int length]);
-
-  /**
-   * Factory implementation of List.from().
-   *
-   * Creates a list with the elements of [other]. The order in
-   * the list will be the order provided by the iterator of [other].
-   */
-  external factory List.from(Iterable<E> other);
-}
diff --git a/sdk/lib/core/map.dart b/sdk/lib/core/map.dart
index 58c9bf2..e9b52b6 100644
--- a/sdk/lib/core/map.dart
+++ b/sdk/lib/core/map.dart
@@ -189,7 +189,7 @@
   }
 
   int _probeForAdding(K key) {
-    if (key == null) throw const NullPointerException();
+    if (key == null) throw new ArgumentError(null);
     int hash = _firstProbe(key.hashCode, _keys.length);
     int numberOfProbes = 1;
     int initialHash = hash;
@@ -224,7 +224,7 @@
   }
 
   int _probeForLookup(K key) {
-    if (key == null) throw const NullPointerException();
+    if (key == null) throw new ArgumentError(null);
     int hash = _firstProbe(key.hashCode, _keys.length);
     int numberOfProbes = 1;
     int initialHash = hash;
diff --git a/sdk/lib/core/sequences.dart b/sdk/lib/core/sequences.dart
index fcf8225a..d671cb5 100644
--- a/sdk/lib/core/sequences.dart
+++ b/sdk/lib/core/sequences.dart
@@ -117,6 +117,7 @@
     return -1;
   }
 
+  E get first => sequence[0];
   E get last => sequence[sequence.length - 1];
 
   List<E> getRange(int start, int length) {
diff --git a/sdk/lib/core/string.dart b/sdk/lib/core/string.dart
index f2d0e61..19b472e 100644
--- a/sdk/lib/core/string.dart
+++ b/sdk/lib/core/string.dart
@@ -76,10 +76,13 @@
   String substring(int startIndex, [int endIndex]);
 
   /**
-   * Removes leading and trailing whitespace from a string. If the
-   * string contains leading or trailing whitespace a new string with
-   * no leading and no trailing whitespace is returned. Otherwise, the
-   * string itself is returned.
+   * Removes leading and trailing whitespace from a string. If the string
+   * contains leading or trailing whitespace a new string with no leading and
+   * no trailing whitespace is returned. Otherwise, the string itself is
+   * returned.  Whitespace is defined as every Unicode character in the Zs, Zl
+   * and Zp categories (this includes no-break space), the spacing control
+   * characters from 9 to 13 (tab, lf, vtab, ff and cr), and 0xfeff the BOM
+   * character.
    */
   String trim();
 
diff --git a/sdk/lib/crypto/crypto.dart b/sdk/lib/crypto/crypto.dart
index 1064ca0..078b21d 100644
--- a/sdk/lib/crypto/crypto.dart
+++ b/sdk/lib/crypto/crypto.dart
@@ -44,7 +44,10 @@
   Hash newInstance();
 
   /**
-   * Block size of the hash in bytes.
+   * Internal block size of the hash in bytes.
+   *
+   * This is exposed for use by the HMAC class which needs to know the
+   * block size for the [Hash] it is using.
    */
   int get blockSize;
 }
@@ -95,6 +98,18 @@
    * as a list of bytes.
    */
   List<int> digest();
+
+  /**
+   * Verify that the HMAC computed for the data so far matches the
+   * given message digest.
+   *
+   * This method should be used instead of memcmp-style comparisons
+   * to avoid leaking information via timing.
+   *
+   * Throws an exception if the given digest does not have the same
+   * size as the digest computed by this HMAC instance.
+   */
+  bool verify(List<int> digest);
 }
 
 /**
diff --git a/sdk/lib/crypto/hmac.dart b/sdk/lib/crypto/hmac.dart
index c73bd8f..d7e3d98 100644
--- a/sdk/lib/crypto/hmac.dart
+++ b/sdk/lib/crypto/hmac.dart
@@ -49,6 +49,20 @@
     return _hash.update(padding).update(innerHash).digest();
   }
 
+  bool verify(List<int> digest) {
+    var computedDigest = this.digest();
+    if (digest.length != computedDigest.length) {
+      throw new ArgumentError(
+          'Invalid digest size: ${digest.length} in HMAC.verify. '
+          'Expected: ${_hash.blockSize}.');
+    }
+    int result = 0;
+    for (var i = 0; i < digest.length; i++) {
+      result |= digest[i] ^ computedDigest[i];
+    }
+    return result == 0;
+  }
+
   // HMAC internal state.
   Hash _hash;
   List<int> _key;
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index 1fa9db2..f9891b3 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -48,22 +48,20 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName AbstractWorker
+/// @domName AbstractWorker; @docsEditable true
 class AbstractWorker extends EventTarget native "*AbstractWorker" {
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   AbstractWorkerEvents get on =>
     new AbstractWorkerEvents(this);
 
-  /** @domName AbstractWorker.addEventListener */
+  /// @domName AbstractWorker.addEventListener; @docsEditable true
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
 
-  /** @domName AbstractWorker.dispatchEvent */
+  /// @domName AbstractWorker.dispatchEvent; @docsEditable true
   bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
 
-  /** @domName AbstractWorker.removeEventListener */
+  /// @domName AbstractWorker.removeEventListener; @docsEditable true
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
 }
 
@@ -77,31 +75,31 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName AnalyserNode
+/// @domName AnalyserNode; @docsEditable true
 class AnalyserNode extends AudioNode native "*AnalyserNode" {
 
-  /** @domName AnalyserNode.fftSize */
+  /// @domName AnalyserNode.fftSize; @docsEditable true
   int fftSize;
 
-  /** @domName AnalyserNode.frequencyBinCount */
+  /// @domName AnalyserNode.frequencyBinCount; @docsEditable true
   final int frequencyBinCount;
 
-  /** @domName AnalyserNode.maxDecibels */
+  /// @domName AnalyserNode.maxDecibels; @docsEditable true
   num maxDecibels;
 
-  /** @domName AnalyserNode.minDecibels */
+  /// @domName AnalyserNode.minDecibels; @docsEditable true
   num minDecibels;
 
-  /** @domName AnalyserNode.smoothingTimeConstant */
+  /// @domName AnalyserNode.smoothingTimeConstant; @docsEditable true
   num smoothingTimeConstant;
 
-  /** @domName AnalyserNode.getByteFrequencyData */
+  /// @domName AnalyserNode.getByteFrequencyData; @docsEditable true
   void getByteFrequencyData(Uint8Array array) native;
 
-  /** @domName AnalyserNode.getByteTimeDomainData */
+  /// @domName AnalyserNode.getByteTimeDomainData; @docsEditable true
   void getByteTimeDomainData(Uint8Array array) native;
 
-  /** @domName AnalyserNode.getFloatFrequencyData */
+  /// @domName AnalyserNode.getFloatFrequencyData; @docsEditable true
   void getFloatFrequencyData(Float32Array array) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -109,77 +107,76 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLAnchorElement
+/// @domName HTMLAnchorElement; @docsEditable true
 class AnchorElement extends Element implements Element native "*HTMLAnchorElement" {
 
   factory AnchorElement({String href}) {
-    if (!?href) {
-      return _Elements.createAnchorElement();
-    }
-    return _Elements.createAnchorElement(href);
+    var e = document.$dom_createElement("a");
+    if (href != null) e.href = href;
+    return e;
   }
 
-  /** @domName HTMLAnchorElement.charset */
+  /// @domName HTMLAnchorElement.charset; @docsEditable true
   String charset;
 
-  /** @domName HTMLAnchorElement.coords */
+  /// @domName HTMLAnchorElement.coords; @docsEditable true
   String coords;
 
-  /** @domName HTMLAnchorElement.download */
+  /// @domName HTMLAnchorElement.download; @docsEditable true
   String download;
 
-  /** @domName HTMLAnchorElement.hash */
+  /// @domName HTMLAnchorElement.hash; @docsEditable true
   String hash;
 
-  /** @domName HTMLAnchorElement.host */
+  /// @domName HTMLAnchorElement.host; @docsEditable true
   String host;
 
-  /** @domName HTMLAnchorElement.hostname */
+  /// @domName HTMLAnchorElement.hostname; @docsEditable true
   String hostname;
 
-  /** @domName HTMLAnchorElement.href */
+  /// @domName HTMLAnchorElement.href; @docsEditable true
   String href;
 
-  /** @domName HTMLAnchorElement.hreflang */
+  /// @domName HTMLAnchorElement.hreflang; @docsEditable true
   String hreflang;
 
-  /** @domName HTMLAnchorElement.name */
+  /// @domName HTMLAnchorElement.name; @docsEditable true
   String name;
 
-  /** @domName HTMLAnchorElement.origin */
+  /// @domName HTMLAnchorElement.origin; @docsEditable true
   final String origin;
 
-  /** @domName HTMLAnchorElement.pathname */
+  /// @domName HTMLAnchorElement.pathname; @docsEditable true
   String pathname;
 
-  /** @domName HTMLAnchorElement.ping */
+  /// @domName HTMLAnchorElement.ping; @docsEditable true
   String ping;
 
-  /** @domName HTMLAnchorElement.port */
+  /// @domName HTMLAnchorElement.port; @docsEditable true
   String port;
 
-  /** @domName HTMLAnchorElement.protocol */
+  /// @domName HTMLAnchorElement.protocol; @docsEditable true
   String protocol;
 
-  /** @domName HTMLAnchorElement.rel */
+  /// @domName HTMLAnchorElement.rel; @docsEditable true
   String rel;
 
-  /** @domName HTMLAnchorElement.rev */
+  /// @domName HTMLAnchorElement.rev; @docsEditable true
   String rev;
 
-  /** @domName HTMLAnchorElement.search */
+  /// @domName HTMLAnchorElement.search; @docsEditable true
   String search;
 
-  /** @domName HTMLAnchorElement.shape */
+  /// @domName HTMLAnchorElement.shape; @docsEditable true
   String shape;
 
-  /** @domName HTMLAnchorElement.target */
+  /// @domName HTMLAnchorElement.target; @docsEditable true
   String target;
 
-  /** @domName HTMLAnchorElement.type */
+  /// @domName HTMLAnchorElement.type; @docsEditable true
   String type;
 
-  /** @domName HTMLAnchorElement.toString */
+  /// @domName HTMLAnchorElement.toString; @docsEditable true
   String toString() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -187,7 +184,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WebKitAnimation
+/// @domName WebKitAnimation; @docsEditable true
 class Animation native "*WebKitAnimation" {
 
   static const int DIRECTION_ALTERNATE = 1;
@@ -202,37 +199,37 @@
 
   static const int FILL_NONE = 0;
 
-  /** @domName WebKitAnimation.delay */
+  /// @domName WebKitAnimation.delay; @docsEditable true
   final num delay;
 
-  /** @domName WebKitAnimation.direction */
+  /// @domName WebKitAnimation.direction; @docsEditable true
   final int direction;
 
-  /** @domName WebKitAnimation.duration */
+  /// @domName WebKitAnimation.duration; @docsEditable true
   final num duration;
 
-  /** @domName WebKitAnimation.elapsedTime */
+  /// @domName WebKitAnimation.elapsedTime; @docsEditable true
   num elapsedTime;
 
-  /** @domName WebKitAnimation.ended */
+  /// @domName WebKitAnimation.ended; @docsEditable true
   final bool ended;
 
-  /** @domName WebKitAnimation.fillMode */
+  /// @domName WebKitAnimation.fillMode; @docsEditable true
   final int fillMode;
 
-  /** @domName WebKitAnimation.iterationCount */
+  /// @domName WebKitAnimation.iterationCount; @docsEditable true
   final int iterationCount;
 
-  /** @domName WebKitAnimation.name */
+  /// @domName WebKitAnimation.name; @docsEditable true
   final String name;
 
-  /** @domName WebKitAnimation.paused */
+  /// @domName WebKitAnimation.paused; @docsEditable true
   final bool paused;
 
-  /** @domName WebKitAnimation.pause */
+  /// @domName WebKitAnimation.pause; @docsEditable true
   void pause() native;
 
-  /** @domName WebKitAnimation.play */
+  /// @domName WebKitAnimation.play; @docsEditable true
   void play() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -240,13 +237,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WebKitAnimationEvent
+/// @domName WebKitAnimationEvent; @docsEditable true
 class AnimationEvent extends Event native "*WebKitAnimationEvent" {
 
-  /** @domName WebKitAnimationEvent.animationName */
+  /// @domName WebKitAnimationEvent.animationName; @docsEditable true
   final String animationName;
 
-  /** @domName WebKitAnimationEvent.elapsedTime */
+  /// @domName WebKitAnimationEvent.elapsedTime; @docsEditable true
   final num elapsedTime;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -254,40 +251,40 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLAppletElement
+/// @domName HTMLAppletElement; @docsEditable true
 class AppletElement extends Element implements Element native "*HTMLAppletElement" {
 
-  /** @domName HTMLAppletElement.align */
+  /// @domName HTMLAppletElement.align; @docsEditable true
   String align;
 
-  /** @domName HTMLAppletElement.alt */
+  /// @domName HTMLAppletElement.alt; @docsEditable true
   String alt;
 
-  /** @domName HTMLAppletElement.archive */
+  /// @domName HTMLAppletElement.archive; @docsEditable true
   String archive;
 
-  /** @domName HTMLAppletElement.code */
+  /// @domName HTMLAppletElement.code; @docsEditable true
   String code;
 
-  /** @domName HTMLAppletElement.codeBase */
+  /// @domName HTMLAppletElement.codeBase; @docsEditable true
   String codeBase;
 
-  /** @domName HTMLAppletElement.height */
+  /// @domName HTMLAppletElement.height; @docsEditable true
   String height;
 
-  /** @domName HTMLAppletElement.hspace */
+  /// @domName HTMLAppletElement.hspace; @docsEditable true
   String hspace;
 
-  /** @domName HTMLAppletElement.name */
+  /// @domName HTMLAppletElement.name; @docsEditable true
   String name;
 
-  /** @domName HTMLAppletElement.object */
+  /// @domName HTMLAppletElement.object; @docsEditable true
   String object;
 
-  /** @domName HTMLAppletElement.vspace */
+  /// @domName HTMLAppletElement.vspace; @docsEditable true
   String vspace;
 
-  /** @domName HTMLAppletElement.width */
+  /// @domName HTMLAppletElement.width; @docsEditable true
   String width;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -295,51 +292,51 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLAreaElement
+/// @domName HTMLAreaElement; @docsEditable true
 class AreaElement extends Element implements Element native "*HTMLAreaElement" {
 
-  factory AreaElement() => _Elements.createAreaElement();
+  factory AreaElement() => document.$dom_createElement("area");
 
-  /** @domName HTMLAreaElement.alt */
+  /// @domName HTMLAreaElement.alt; @docsEditable true
   String alt;
 
-  /** @domName HTMLAreaElement.coords */
+  /// @domName HTMLAreaElement.coords; @docsEditable true
   String coords;
 
-  /** @domName HTMLAreaElement.hash */
+  /// @domName HTMLAreaElement.hash; @docsEditable true
   final String hash;
 
-  /** @domName HTMLAreaElement.host */
+  /// @domName HTMLAreaElement.host; @docsEditable true
   final String host;
 
-  /** @domName HTMLAreaElement.hostname */
+  /// @domName HTMLAreaElement.hostname; @docsEditable true
   final String hostname;
 
-  /** @domName HTMLAreaElement.href */
+  /// @domName HTMLAreaElement.href; @docsEditable true
   String href;
 
-  /** @domName HTMLAreaElement.noHref */
+  /// @domName HTMLAreaElement.noHref; @docsEditable true
   bool noHref;
 
-  /** @domName HTMLAreaElement.pathname */
+  /// @domName HTMLAreaElement.pathname; @docsEditable true
   final String pathname;
 
-  /** @domName HTMLAreaElement.ping */
+  /// @domName HTMLAreaElement.ping; @docsEditable true
   String ping;
 
-  /** @domName HTMLAreaElement.port */
+  /// @domName HTMLAreaElement.port; @docsEditable true
   final String port;
 
-  /** @domName HTMLAreaElement.protocol */
+  /// @domName HTMLAreaElement.protocol; @docsEditable true
   final String protocol;
 
-  /** @domName HTMLAreaElement.search */
+  /// @domName HTMLAreaElement.search; @docsEditable true
   final String search;
 
-  /** @domName HTMLAreaElement.shape */
+  /// @domName HTMLAreaElement.shape; @docsEditable true
   String shape;
 
-  /** @domName HTMLAreaElement.target */
+  /// @domName HTMLAreaElement.target; @docsEditable true
   String target;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -347,15 +344,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName ArrayBuffer
+/// @domName ArrayBuffer; @docsEditable true
 class ArrayBuffer native "*ArrayBuffer" {
 
   factory ArrayBuffer(int length) => _ArrayBufferFactoryProvider.createArrayBuffer(length);
 
-  /** @domName ArrayBuffer.byteLength */
+  /// @domName ArrayBuffer.byteLength; @docsEditable true
   final int byteLength;
 
-  /** @domName ArrayBuffer.slice */
+  /// @domName ArrayBuffer.slice; @docsEditable true
   ArrayBuffer slice(int begin, [int end]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -363,16 +360,16 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName ArrayBufferView
+/// @domName ArrayBufferView; @docsEditable true
 class ArrayBufferView native "*ArrayBufferView" {
 
-  /** @domName ArrayBufferView.buffer */
+  /// @domName ArrayBufferView.buffer; @docsEditable true
   final ArrayBuffer buffer;
 
-  /** @domName ArrayBufferView.byteLength */
+  /// @domName ArrayBufferView.byteLength; @docsEditable true
   final int byteLength;
 
-  /** @domName ArrayBufferView.byteOffset */
+  /// @domName ArrayBufferView.byteOffset; @docsEditable true
   final int byteOffset;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -380,22 +377,22 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Attr
+/// @domName Attr; @docsEditable true
 class Attr extends Node native "*Attr" {
 
-  /** @domName Attr.isId */
+  /// @domName Attr.isId; @docsEditable true
   final bool isId;
 
-  /** @domName Attr.name */
+  /// @domName Attr.name; @docsEditable true
   final String name;
 
-  /** @domName Attr.ownerElement */
+  /// @domName Attr.ownerElement; @docsEditable true
   final Element ownerElement;
 
-  /** @domName Attr.specified */
+  /// @domName Attr.specified; @docsEditable true
   final bool specified;
 
-  /** @domName Attr.value */
+  /// @domName Attr.value; @docsEditable true
   String value;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -403,25 +400,25 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName AudioBuffer
+/// @domName AudioBuffer; @docsEditable true
 class AudioBuffer native "*AudioBuffer" {
 
-  /** @domName AudioBuffer.duration */
+  /// @domName AudioBuffer.duration; @docsEditable true
   final num duration;
 
-  /** @domName AudioBuffer.gain */
+  /// @domName AudioBuffer.gain; @docsEditable true
   num gain;
 
-  /** @domName AudioBuffer.length */
+  /// @domName AudioBuffer.length; @docsEditable true
   final int length;
 
-  /** @domName AudioBuffer.numberOfChannels */
+  /// @domName AudioBuffer.numberOfChannels; @docsEditable true
   final int numberOfChannels;
 
-  /** @domName AudioBuffer.sampleRate */
+  /// @domName AudioBuffer.sampleRate; @docsEditable true
   final num sampleRate;
 
-  /** @domName AudioBuffer.getChannelData */
+  /// @domName AudioBuffer.getChannelData; @docsEditable true
   Float32Array getChannelData(int channelIndex) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -477,25 +474,25 @@
 
   static const int UNSCHEDULED_STATE = 0;
 
-  /** @domName AudioBufferSourceNode.buffer */
+  /// @domName AudioBufferSourceNode.buffer; @docsEditable true
   AudioBuffer buffer;
 
-  /** @domName AudioBufferSourceNode.gain */
+  /// @domName AudioBufferSourceNode.gain; @docsEditable true
   final AudioGain gain;
 
-  /** @domName AudioBufferSourceNode.loop */
+  /// @domName AudioBufferSourceNode.loop; @docsEditable true
   bool loop;
 
-  /** @domName AudioBufferSourceNode.loopEnd */
+  /// @domName AudioBufferSourceNode.loopEnd; @docsEditable true
   num loopEnd;
 
-  /** @domName AudioBufferSourceNode.loopStart */
+  /// @domName AudioBufferSourceNode.loopStart; @docsEditable true
   num loopStart;
 
-  /** @domName AudioBufferSourceNode.playbackRate */
+  /// @domName AudioBufferSourceNode.playbackRate; @docsEditable true
   final AudioParam playbackRate;
 
-  /** @domName AudioBufferSourceNode.playbackState */
+  /// @domName AudioBufferSourceNode.playbackState; @docsEditable true
   final int playbackState;
 
 }
@@ -507,76 +504,74 @@
 class AudioContext extends EventTarget native "*AudioContext" {
   factory AudioContext() => _AudioContextFactoryProvider.createAudioContext();
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   AudioContextEvents get on =>
     new AudioContextEvents(this);
 
-  /** @domName AudioContext.activeSourceCount */
+  /// @domName AudioContext.activeSourceCount; @docsEditable true
   final int activeSourceCount;
 
-  /** @domName AudioContext.currentTime */
+  /// @domName AudioContext.currentTime; @docsEditable true
   final num currentTime;
 
-  /** @domName AudioContext.destination */
+  /// @domName AudioContext.destination; @docsEditable true
   final AudioDestinationNode destination;
 
-  /** @domName AudioContext.listener */
+  /// @domName AudioContext.listener; @docsEditable true
   final AudioListener listener;
 
-  /** @domName AudioContext.sampleRate */
+  /// @domName AudioContext.sampleRate; @docsEditable true
   final num sampleRate;
 
-  /** @domName AudioContext.createAnalyser */
+  /// @domName AudioContext.createAnalyser; @docsEditable true
   AnalyserNode createAnalyser() native;
 
-  /** @domName AudioContext.createBiquadFilter */
+  /// @domName AudioContext.createBiquadFilter; @docsEditable true
   BiquadFilterNode createBiquadFilter() native;
 
-  /** @domName AudioContext.createBuffer */
+  /// @domName AudioContext.createBuffer; @docsEditable true
   AudioBuffer createBuffer(buffer_OR_numberOfChannels, mixToMono_OR_numberOfFrames, [num sampleRate]) native;
 
-  /** @domName AudioContext.createBufferSource */
+  /// @domName AudioContext.createBufferSource; @docsEditable true
   AudioBufferSourceNode createBufferSource() native;
 
-  /** @domName AudioContext.createChannelMerger */
+  /// @domName AudioContext.createChannelMerger; @docsEditable true
   ChannelMergerNode createChannelMerger([int numberOfInputs]) native;
 
-  /** @domName AudioContext.createChannelSplitter */
+  /// @domName AudioContext.createChannelSplitter; @docsEditable true
   ChannelSplitterNode createChannelSplitter([int numberOfOutputs]) native;
 
-  /** @domName AudioContext.createConvolver */
+  /// @domName AudioContext.createConvolver; @docsEditable true
   ConvolverNode createConvolver() native;
 
-  /** @domName AudioContext.createDelay */
+  /// @domName AudioContext.createDelay; @docsEditable true
   DelayNode createDelay([num maxDelayTime]) native;
 
-  /** @domName AudioContext.createDynamicsCompressor */
+  /// @domName AudioContext.createDynamicsCompressor; @docsEditable true
   DynamicsCompressorNode createDynamicsCompressor() native;
 
-  /** @domName AudioContext.createMediaElementSource */
+  /// @domName AudioContext.createMediaElementSource; @docsEditable true
   MediaElementAudioSourceNode createMediaElementSource(MediaElement mediaElement) native;
 
-  /** @domName AudioContext.createMediaStreamSource */
+  /// @domName AudioContext.createMediaStreamSource; @docsEditable true
   MediaStreamAudioSourceNode createMediaStreamSource(MediaStream mediaStream) native;
 
-  /** @domName AudioContext.createOscillator */
+  /// @domName AudioContext.createOscillator; @docsEditable true
   OscillatorNode createOscillator() native;
 
-  /** @domName AudioContext.createPanner */
+  /// @domName AudioContext.createPanner; @docsEditable true
   PannerNode createPanner() native;
 
-  /** @domName AudioContext.createWaveShaper */
+  /// @domName AudioContext.createWaveShaper; @docsEditable true
   WaveShaperNode createWaveShaper() native;
 
-  /** @domName AudioContext.createWaveTable */
+  /// @domName AudioContext.createWaveTable; @docsEditable true
   WaveTable createWaveTable(Float32Array real, Float32Array imag) native;
 
-  /** @domName AudioContext.decodeAudioData */
+  /// @domName AudioContext.decodeAudioData; @docsEditable true
   void decodeAudioData(ArrayBuffer audioData, AudioBufferCallback successCallback, [AudioBufferCallback errorCallback]) native;
 
-  /** @domName AudioContext.startRendering */
+  /// @domName AudioContext.startRendering; @docsEditable true
   void startRendering() native;
 
   GainNode createGain() {
@@ -614,10 +609,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName AudioDestinationNode
+/// @domName AudioDestinationNode; @docsEditable true
 class AudioDestinationNode extends AudioNode native "*AudioDestinationNode" {
 
-  /** @domName AudioDestinationNode.numberOfChannels */
+  /// @domName AudioDestinationNode.numberOfChannels; @docsEditable true
   final int numberOfChannels;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -625,7 +620,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLAudioElement
+/// @domName HTMLAudioElement; @docsEditable true
 class AudioElement extends MediaElement native "*HTMLAudioElement" {
 
   factory AudioElement([String src]) {
@@ -640,7 +635,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName AudioGain
+/// @domName AudioGain; @docsEditable true
 class AudioGain extends AudioParam native "*AudioGain" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -648,22 +643,22 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName AudioListener
+/// @domName AudioListener; @docsEditable true
 class AudioListener native "*AudioListener" {
 
-  /** @domName AudioListener.dopplerFactor */
+  /// @domName AudioListener.dopplerFactor; @docsEditable true
   num dopplerFactor;
 
-  /** @domName AudioListener.speedOfSound */
+  /// @domName AudioListener.speedOfSound; @docsEditable true
   num speedOfSound;
 
-  /** @domName AudioListener.setOrientation */
+  /// @domName AudioListener.setOrientation; @docsEditable true
   void setOrientation(num x, num y, num z, num xUp, num yUp, num zUp) native;
 
-  /** @domName AudioListener.setPosition */
+  /// @domName AudioListener.setPosition; @docsEditable true
   void setPosition(num x, num y, num z) native;
 
-  /** @domName AudioListener.setVelocity */
+  /// @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
@@ -671,22 +666,22 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName AudioNode
+/// @domName AudioNode; @docsEditable true
 class AudioNode native "*AudioNode" {
 
-  /** @domName AudioNode.context */
+  /// @domName AudioNode.context; @docsEditable true
   final AudioContext context;
 
-  /** @domName AudioNode.numberOfInputs */
+  /// @domName AudioNode.numberOfInputs; @docsEditable true
   final int numberOfInputs;
 
-  /** @domName AudioNode.numberOfOutputs */
+  /// @domName AudioNode.numberOfOutputs; @docsEditable true
   final int numberOfOutputs;
 
-  /** @domName AudioNode.connect */
+  /// @domName AudioNode.connect; @docsEditable true
   void connect(destination, int output, [int input]) native;
 
-  /** @domName AudioNode.disconnect */
+  /// @domName AudioNode.disconnect; @docsEditable true
   void disconnect(int output) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -694,43 +689,43 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName AudioParam
+/// @domName AudioParam; @docsEditable true
 class AudioParam native "*AudioParam" {
 
-  /** @domName AudioParam.defaultValue */
+  /// @domName AudioParam.defaultValue; @docsEditable true
   final num defaultValue;
 
-  /** @domName AudioParam.maxValue */
+  /// @domName AudioParam.maxValue; @docsEditable true
   final num maxValue;
 
-  /** @domName AudioParam.minValue */
+  /// @domName AudioParam.minValue; @docsEditable true
   final num minValue;
 
-  /** @domName AudioParam.name */
+  /// @domName AudioParam.name; @docsEditable true
   final String name;
 
-  /** @domName AudioParam.units */
+  /// @domName AudioParam.units; @docsEditable true
   final int units;
 
-  /** @domName AudioParam.value */
+  /// @domName AudioParam.value; @docsEditable true
   num value;
 
-  /** @domName AudioParam.cancelScheduledValues */
+  /// @domName AudioParam.cancelScheduledValues; @docsEditable true
   void cancelScheduledValues(num startTime) native;
 
-  /** @domName AudioParam.exponentialRampToValueAtTime */
+  /// @domName AudioParam.exponentialRampToValueAtTime; @docsEditable true
   void exponentialRampToValueAtTime(num value, num time) native;
 
-  /** @domName AudioParam.linearRampToValueAtTime */
+  /// @domName AudioParam.linearRampToValueAtTime; @docsEditable true
   void linearRampToValueAtTime(num value, num time) native;
 
-  /** @domName AudioParam.setTargetAtTime */
+  /// @domName AudioParam.setTargetAtTime; @docsEditable true
   void setTargetAtTime(num target, num time, num timeConstant) native;
 
-  /** @domName AudioParam.setValueAtTime */
+  /// @domName AudioParam.setValueAtTime; @docsEditable true
   void setValueAtTime(num value, num time) native;
 
-  /** @domName AudioParam.setValueCurveAtTime */
+  /// @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
@@ -738,13 +733,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName AudioProcessingEvent
+/// @domName AudioProcessingEvent; @docsEditable true
 class AudioProcessingEvent extends Event native "*AudioProcessingEvent" {
 
-  /** @domName AudioProcessingEvent.inputBuffer */
+  /// @domName AudioProcessingEvent.inputBuffer; @docsEditable true
   final AudioBuffer inputBuffer;
 
-  /** @domName AudioProcessingEvent.outputBuffer */
+  /// @domName AudioProcessingEvent.outputBuffer; @docsEditable true
   final AudioBuffer outputBuffer;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -752,7 +747,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName AudioSourceNode
+/// @domName AudioSourceNode; @docsEditable true
 class AudioSourceNode extends AudioNode native "*AudioSourceNode" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -760,12 +755,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLBRElement
+/// @domName HTMLBRElement; @docsEditable true
 class BRElement extends Element implements Element native "*HTMLBRElement" {
 
-  factory BRElement() => _Elements.createBRElement();
+  factory BRElement() => document.$dom_createElement("br");
 
-  /** @domName HTMLBRElement.clear */
+  /// @domName HTMLBRElement.clear; @docsEditable true
   String clear;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -773,10 +768,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName BarInfo
+/// @domName BarInfo; @docsEditable true
 class BarInfo native "*BarInfo" {
 
-  /** @domName BarInfo.visible */
+  /// @domName BarInfo.visible; @docsEditable true
   final bool visible;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -784,15 +779,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLBaseElement
+/// @domName HTMLBaseElement; @docsEditable true
 class BaseElement extends Element implements Element native "*HTMLBaseElement" {
 
-  factory BaseElement() => _Elements.createBaseElement();
+  factory BaseElement() => document.$dom_createElement("base");
 
-  /** @domName HTMLBaseElement.href */
+  /// @domName HTMLBaseElement.href; @docsEditable true
   String href;
 
-  /** @domName HTMLBaseElement.target */
+  /// @domName HTMLBaseElement.target; @docsEditable true
   String target;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -800,16 +795,16 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLBaseFontElement
+/// @domName HTMLBaseFontElement; @docsEditable true
 class BaseFontElement extends Element implements Element native "*HTMLBaseFontElement" {
 
-  /** @domName HTMLBaseFontElement.color */
+  /// @domName HTMLBaseFontElement.color; @docsEditable true
   String color;
 
-  /** @domName HTMLBaseFontElement.face */
+  /// @domName HTMLBaseFontElement.face; @docsEditable true
   String face;
 
-  /** @domName HTMLBaseFontElement.size */
+  /// @domName HTMLBaseFontElement.size; @docsEditable true
   int size;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -817,34 +812,32 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName BatteryManager
+/// @domName BatteryManager; @docsEditable true
 class BatteryManager extends EventTarget native "*BatteryManager" {
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   BatteryManagerEvents get on =>
     new BatteryManagerEvents(this);
 
-  /** @domName BatteryManager.charging */
+  /// @domName BatteryManager.charging; @docsEditable true
   final bool charging;
 
-  /** @domName BatteryManager.chargingTime */
+  /// @domName BatteryManager.chargingTime; @docsEditable true
   final num chargingTime;
 
-  /** @domName BatteryManager.dischargingTime */
+  /// @domName BatteryManager.dischargingTime; @docsEditable true
   final num dischargingTime;
 
-  /** @domName BatteryManager.level */
+  /// @domName BatteryManager.level; @docsEditable true
   final num level;
 
-  /** @domName BatteryManager.addEventListener */
+  /// @domName BatteryManager.addEventListener; @docsEditable true
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
 
-  /** @domName BatteryManager.dispatchEvent */
+  /// @domName BatteryManager.dispatchEvent; @docsEditable true
   bool $dom_dispatchEvent(Event event) native "dispatchEvent";
 
-  /** @domName BatteryManager.removeEventListener */
+  /// @domName BatteryManager.removeEventListener; @docsEditable true
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
 }
 
@@ -864,10 +857,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName BeforeLoadEvent
+/// @domName BeforeLoadEvent; @docsEditable true
 class BeforeLoadEvent extends Event native "*BeforeLoadEvent" {
 
-  /** @domName BeforeLoadEvent.url */
+  /// @domName BeforeLoadEvent.url; @docsEditable true
   final String url;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -875,7 +868,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName BiquadFilterNode
+/// @domName BiquadFilterNode; @docsEditable true
 class BiquadFilterNode extends AudioNode native "*BiquadFilterNode" {
 
   static const int ALLPASS = 7;
@@ -894,19 +887,19 @@
 
   static const int PEAKING = 5;
 
-  /** @domName BiquadFilterNode.Q */
+  /// @domName BiquadFilterNode.Q; @docsEditable true
   final AudioParam Q;
 
-  /** @domName BiquadFilterNode.frequency */
+  /// @domName BiquadFilterNode.frequency; @docsEditable true
   final AudioParam frequency;
 
-  /** @domName BiquadFilterNode.gain */
+  /// @domName BiquadFilterNode.gain; @docsEditable true
   final AudioParam gain;
 
-  /** @domName BiquadFilterNode.type */
+  /// @domName BiquadFilterNode.type; @docsEditable true
   int type;
 
-  /** @domName BiquadFilterNode.getFrequencyResponse */
+  /// @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
@@ -914,7 +907,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Blob
+/// @domName Blob; @docsEditable true
 class Blob native "*Blob" {
 
   factory Blob(List blobParts, [String type, String endings]) {
@@ -927,13 +920,13 @@
     return _BlobFactoryProvider.createBlob(blobParts, type, endings);
   }
 
-  /** @domName Blob.size */
+  /// @domName Blob.size; @docsEditable true
   final int size;
 
-  /** @domName Blob.type */
+  /// @domName Blob.type; @docsEditable true
   final String type;
 
-  /** @domName Blob.slice */
+  /// @domName Blob.slice; @docsEditable true
   Blob slice([int start, int end, String contentType]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -941,30 +934,28 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLBodyElement
+/// @domName HTMLBodyElement; @docsEditable true
 class BodyElement extends Element implements Element native "*HTMLBodyElement" {
 
-  factory BodyElement() => _Elements.createBodyElement();
+  factory BodyElement() => document.$dom_createElement("body");
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   BodyElementEvents get on =>
     new BodyElementEvents(this);
 
-  /** @domName HTMLBodyElement.aLink */
+  /// @domName HTMLBodyElement.aLink; @docsEditable true
   String aLink;
 
-  /** @domName HTMLBodyElement.background */
+  /// @domName HTMLBodyElement.background; @docsEditable true
   String background;
 
-  /** @domName HTMLBodyElement.bgColor */
+  /// @domName HTMLBodyElement.bgColor; @docsEditable true
   String bgColor;
 
-  /** @domName HTMLBodyElement.link */
+  /// @domName HTMLBodyElement.link; @docsEditable true
   String link;
 
-  /** @domName HTMLBodyElement.vLink */
+  /// @domName HTMLBodyElement.vLink; @docsEditable true
   String vLink;
 }
 
@@ -1002,60 +993,61 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLButtonElement
+/// @domName HTMLButtonElement; @docsEditable true
 class ButtonElement extends Element implements Element native "*HTMLButtonElement" {
 
-  factory ButtonElement() => _Elements.createButtonElement();
+  factory ButtonElement() => document.$dom_createElement("button");
 
-  /** @domName HTMLButtonElement.autofocus */
+  /// @domName HTMLButtonElement.autofocus; @docsEditable true
   bool autofocus;
 
-  /** @domName HTMLButtonElement.disabled */
+  /// @domName HTMLButtonElement.disabled; @docsEditable true
   bool disabled;
 
-  /** @domName HTMLButtonElement.form */
+  /// @domName HTMLButtonElement.form; @docsEditable true
   final FormElement form;
 
-  /** @domName HTMLButtonElement.formAction */
+  /// @domName HTMLButtonElement.formAction; @docsEditable true
   String formAction;
 
-  /** @domName HTMLButtonElement.formEnctype */
+  /// @domName HTMLButtonElement.formEnctype; @docsEditable true
   String formEnctype;
 
-  /** @domName HTMLButtonElement.formMethod */
+  /// @domName HTMLButtonElement.formMethod; @docsEditable true
   String formMethod;
 
-  /** @domName HTMLButtonElement.formNoValidate */
+  /// @domName HTMLButtonElement.formNoValidate; @docsEditable true
   bool formNoValidate;
 
-  /** @domName HTMLButtonElement.formTarget */
+  /// @domName HTMLButtonElement.formTarget; @docsEditable true
   String formTarget;
 
-  /** @domName HTMLButtonElement.labels */
+  /// @domName HTMLButtonElement.labels; @docsEditable true
+  @Returns('_NodeList') @Creates('_NodeList')
   final List<Node> labels;
 
-  /** @domName HTMLButtonElement.name */
+  /// @domName HTMLButtonElement.name; @docsEditable true
   String name;
 
-  /** @domName HTMLButtonElement.type */
+  /// @domName HTMLButtonElement.type; @docsEditable true
   String type;
 
-  /** @domName HTMLButtonElement.validationMessage */
+  /// @domName HTMLButtonElement.validationMessage; @docsEditable true
   final String validationMessage;
 
-  /** @domName HTMLButtonElement.validity */
+  /// @domName HTMLButtonElement.validity; @docsEditable true
   final ValidityState validity;
 
-  /** @domName HTMLButtonElement.value */
+  /// @domName HTMLButtonElement.value; @docsEditable true
   String value;
 
-  /** @domName HTMLButtonElement.willValidate */
+  /// @domName HTMLButtonElement.willValidate; @docsEditable true
   final bool willValidate;
 
-  /** @domName HTMLButtonElement.checkValidity */
+  /// @domName HTMLButtonElement.checkValidity; @docsEditable true
   bool checkValidity() native;
 
-  /** @domName HTMLButtonElement.setCustomValidity */
+  /// @domName HTMLButtonElement.setCustomValidity; @docsEditable true
   void setCustomValidity(String error) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1063,7 +1055,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName CDATASection
+/// @domName CDATASection; @docsEditable true
 class CDATASection extends Text native "*CDATASection" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1071,10 +1063,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName CSSCharsetRule
+/// @domName CSSCharsetRule; @docsEditable true
 class CSSCharsetRule extends CSSRule native "*CSSCharsetRule" {
 
-  /** @domName CSSCharsetRule.encoding */
+  /// @domName CSSCharsetRule.encoding; @docsEditable true
   String encoding;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1082,10 +1074,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName CSSFontFaceRule
+/// @domName CSSFontFaceRule; @docsEditable true
 class CSSFontFaceRule extends CSSRule native "*CSSFontFaceRule" {
 
-  /** @domName CSSFontFaceRule.style */
+  /// @domName CSSFontFaceRule.style; @docsEditable true
   final CSSStyleDeclaration style;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1093,16 +1085,16 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName CSSImportRule
+/// @domName CSSImportRule; @docsEditable true
 class CSSImportRule extends CSSRule native "*CSSImportRule" {
 
-  /** @domName CSSImportRule.href */
+  /// @domName CSSImportRule.href; @docsEditable true
   final String href;
 
-  /** @domName CSSImportRule.media */
+  /// @domName CSSImportRule.media; @docsEditable true
   final MediaList media;
 
-  /** @domName CSSImportRule.styleSheet */
+  /// @domName CSSImportRule.styleSheet; @docsEditable true
   final CSSStyleSheet styleSheet;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1110,13 +1102,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WebKitCSSKeyframeRule
+/// @domName WebKitCSSKeyframeRule; @docsEditable true
 class CSSKeyframeRule extends CSSRule native "*WebKitCSSKeyframeRule" {
 
-  /** @domName WebKitCSSKeyframeRule.keyText */
+  /// @domName WebKitCSSKeyframeRule.keyText; @docsEditable true
   String keyText;
 
-  /** @domName WebKitCSSKeyframeRule.style */
+  /// @domName WebKitCSSKeyframeRule.style; @docsEditable true
   final CSSStyleDeclaration style;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1124,22 +1116,23 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WebKitCSSKeyframesRule
+/// @domName WebKitCSSKeyframesRule; @docsEditable true
 class CSSKeyframesRule extends CSSRule native "*WebKitCSSKeyframesRule" {
 
-  /** @domName WebKitCSSKeyframesRule.cssRules */
+  /// @domName WebKitCSSKeyframesRule.cssRules; @docsEditable true
+  @Returns('_CSSRuleList') @Creates('_CSSRuleList')
   final List<CSSRule> cssRules;
 
-  /** @domName WebKitCSSKeyframesRule.name */
+  /// @domName WebKitCSSKeyframesRule.name; @docsEditable true
   String name;
 
-  /** @domName WebKitCSSKeyframesRule.deleteRule */
+  /// @domName WebKitCSSKeyframesRule.deleteRule; @docsEditable true
   void deleteRule(String key) native;
 
-  /** @domName WebKitCSSKeyframesRule.findRule */
+  /// @domName WebKitCSSKeyframesRule.findRule; @docsEditable true
   CSSKeyframeRule findRule(String key) native;
 
-  /** @domName WebKitCSSKeyframesRule.insertRule */
+  /// @domName WebKitCSSKeyframesRule.insertRule; @docsEditable true
   void insertRule(String rule) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1147,7 +1140,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WebKitCSSMatrix
+/// @domName WebKitCSSMatrix; @docsEditable true
 class CSSMatrix native "*WebKitCSSMatrix" {
 
   factory CSSMatrix([String cssValue]) {
@@ -1157,100 +1150,100 @@
     return _CSSMatrixFactoryProvider.createCSSMatrix(cssValue);
   }
 
-  /** @domName WebKitCSSMatrix.a */
+  /// @domName WebKitCSSMatrix.a; @docsEditable true
   num a;
 
-  /** @domName WebKitCSSMatrix.b */
+  /// @domName WebKitCSSMatrix.b; @docsEditable true
   num b;
 
-  /** @domName WebKitCSSMatrix.c */
+  /// @domName WebKitCSSMatrix.c; @docsEditable true
   num c;
 
-  /** @domName WebKitCSSMatrix.d */
+  /// @domName WebKitCSSMatrix.d; @docsEditable true
   num d;
 
-  /** @domName WebKitCSSMatrix.e */
+  /// @domName WebKitCSSMatrix.e; @docsEditable true
   num e;
 
-  /** @domName WebKitCSSMatrix.f */
+  /// @domName WebKitCSSMatrix.f; @docsEditable true
   num f;
 
-  /** @domName WebKitCSSMatrix.m11 */
+  /// @domName WebKitCSSMatrix.m11; @docsEditable true
   num m11;
 
-  /** @domName WebKitCSSMatrix.m12 */
+  /// @domName WebKitCSSMatrix.m12; @docsEditable true
   num m12;
 
-  /** @domName WebKitCSSMatrix.m13 */
+  /// @domName WebKitCSSMatrix.m13; @docsEditable true
   num m13;
 
-  /** @domName WebKitCSSMatrix.m14 */
+  /// @domName WebKitCSSMatrix.m14; @docsEditable true
   num m14;
 
-  /** @domName WebKitCSSMatrix.m21 */
+  /// @domName WebKitCSSMatrix.m21; @docsEditable true
   num m21;
 
-  /** @domName WebKitCSSMatrix.m22 */
+  /// @domName WebKitCSSMatrix.m22; @docsEditable true
   num m22;
 
-  /** @domName WebKitCSSMatrix.m23 */
+  /// @domName WebKitCSSMatrix.m23; @docsEditable true
   num m23;
 
-  /** @domName WebKitCSSMatrix.m24 */
+  /// @domName WebKitCSSMatrix.m24; @docsEditable true
   num m24;
 
-  /** @domName WebKitCSSMatrix.m31 */
+  /// @domName WebKitCSSMatrix.m31; @docsEditable true
   num m31;
 
-  /** @domName WebKitCSSMatrix.m32 */
+  /// @domName WebKitCSSMatrix.m32; @docsEditable true
   num m32;
 
-  /** @domName WebKitCSSMatrix.m33 */
+  /// @domName WebKitCSSMatrix.m33; @docsEditable true
   num m33;
 
-  /** @domName WebKitCSSMatrix.m34 */
+  /// @domName WebKitCSSMatrix.m34; @docsEditable true
   num m34;
 
-  /** @domName WebKitCSSMatrix.m41 */
+  /// @domName WebKitCSSMatrix.m41; @docsEditable true
   num m41;
 
-  /** @domName WebKitCSSMatrix.m42 */
+  /// @domName WebKitCSSMatrix.m42; @docsEditable true
   num m42;
 
-  /** @domName WebKitCSSMatrix.m43 */
+  /// @domName WebKitCSSMatrix.m43; @docsEditable true
   num m43;
 
-  /** @domName WebKitCSSMatrix.m44 */
+  /// @domName WebKitCSSMatrix.m44; @docsEditable true
   num m44;
 
-  /** @domName WebKitCSSMatrix.inverse */
+  /// @domName WebKitCSSMatrix.inverse; @docsEditable true
   CSSMatrix inverse() native;
 
-  /** @domName WebKitCSSMatrix.multiply */
+  /// @domName WebKitCSSMatrix.multiply; @docsEditable true
   CSSMatrix multiply(CSSMatrix secondMatrix) native;
 
-  /** @domName WebKitCSSMatrix.rotate */
+  /// @domName WebKitCSSMatrix.rotate; @docsEditable true
   CSSMatrix rotate(num rotX, num rotY, num rotZ) native;
 
-  /** @domName WebKitCSSMatrix.rotateAxisAngle */
+  /// @domName WebKitCSSMatrix.rotateAxisAngle; @docsEditable true
   CSSMatrix rotateAxisAngle(num x, num y, num z, num angle) native;
 
-  /** @domName WebKitCSSMatrix.scale */
+  /// @domName WebKitCSSMatrix.scale; @docsEditable true
   CSSMatrix scale(num scaleX, num scaleY, num scaleZ) native;
 
-  /** @domName WebKitCSSMatrix.setMatrixValue */
+  /// @domName WebKitCSSMatrix.setMatrixValue; @docsEditable true
   void setMatrixValue(String string) native;
 
-  /** @domName WebKitCSSMatrix.skewX */
+  /// @domName WebKitCSSMatrix.skewX; @docsEditable true
   CSSMatrix skewX(num angle) native;
 
-  /** @domName WebKitCSSMatrix.skewY */
+  /// @domName WebKitCSSMatrix.skewY; @docsEditable true
   CSSMatrix skewY(num angle) native;
 
-  /** @domName WebKitCSSMatrix.toString */
+  /// @domName WebKitCSSMatrix.toString; @docsEditable true
   String toString() native;
 
-  /** @domName WebKitCSSMatrix.translate */
+  /// @domName WebKitCSSMatrix.translate; @docsEditable true
   CSSMatrix translate(num x, num y, num z) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1258,19 +1251,20 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName CSSMediaRule
+/// @domName CSSMediaRule; @docsEditable true
 class CSSMediaRule extends CSSRule native "*CSSMediaRule" {
 
-  /** @domName CSSMediaRule.cssRules */
+  /// @domName CSSMediaRule.cssRules; @docsEditable true
+  @Returns('_CSSRuleList') @Creates('_CSSRuleList')
   final List<CSSRule> cssRules;
 
-  /** @domName CSSMediaRule.media */
+  /// @domName CSSMediaRule.media; @docsEditable true
   final MediaList media;
 
-  /** @domName CSSMediaRule.deleteRule */
+  /// @domName CSSMediaRule.deleteRule; @docsEditable true
   void deleteRule(int index) native;
 
-  /** @domName CSSMediaRule.insertRule */
+  /// @domName CSSMediaRule.insertRule; @docsEditable true
   int insertRule(String rule, int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1278,13 +1272,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName CSSPageRule
+/// @domName CSSPageRule; @docsEditable true
 class CSSPageRule extends CSSRule native "*CSSPageRule" {
 
-  /** @domName CSSPageRule.selectorText */
+  /// @domName CSSPageRule.selectorText; @docsEditable true
   String selectorText;
 
-  /** @domName CSSPageRule.style */
+  /// @domName CSSPageRule.style; @docsEditable true
   final CSSStyleDeclaration style;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1292,7 +1286,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName CSSPrimitiveValue
+/// @domName CSSPrimitiveValue; @docsEditable true
 class CSSPrimitiveValue extends CSSValue native "*CSSPrimitiveValue" {
 
   static const int CSS_ATTR = 22;
@@ -1353,28 +1347,28 @@
 
   static const int CSS_VW = 26;
 
-  /** @domName CSSPrimitiveValue.primitiveType */
+  /// @domName CSSPrimitiveValue.primitiveType; @docsEditable true
   final int primitiveType;
 
-  /** @domName CSSPrimitiveValue.getCounterValue */
+  /// @domName CSSPrimitiveValue.getCounterValue; @docsEditable true
   Counter getCounterValue() native;
 
-  /** @domName CSSPrimitiveValue.getFloatValue */
+  /// @domName CSSPrimitiveValue.getFloatValue; @docsEditable true
   num getFloatValue(int unitType) native;
 
-  /** @domName CSSPrimitiveValue.getRGBColorValue */
+  /// @domName CSSPrimitiveValue.getRGBColorValue; @docsEditable true
   RGBColor getRGBColorValue() native;
 
-  /** @domName CSSPrimitiveValue.getRectValue */
+  /// @domName CSSPrimitiveValue.getRectValue; @docsEditable true
   Rect getRectValue() native;
 
-  /** @domName CSSPrimitiveValue.getStringValue */
+  /// @domName CSSPrimitiveValue.getStringValue; @docsEditable true
   String getStringValue() native;
 
-  /** @domName CSSPrimitiveValue.setFloatValue */
+  /// @domName CSSPrimitiveValue.setFloatValue; @docsEditable true
   void setFloatValue(int unitType, num floatValue) native;
 
-  /** @domName CSSPrimitiveValue.setStringValue */
+  /// @domName CSSPrimitiveValue.setStringValue; @docsEditable true
   void setStringValue(int stringType, String stringValue) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1382,7 +1376,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName CSSRule
+/// @domName CSSRule; @docsEditable true
 class CSSRule native "*CSSRule" {
 
   static const int CHARSET_RULE = 2;
@@ -1403,16 +1397,16 @@
 
   static const int WEBKIT_KEYFRAME_RULE = 8;
 
-  /** @domName CSSRule.cssText */
+  /// @domName CSSRule.cssText; @docsEditable true
   String cssText;
 
-  /** @domName CSSRule.parentRule */
+  /// @domName CSSRule.parentRule; @docsEditable true
   final CSSRule parentRule;
 
-  /** @domName CSSRule.parentStyleSheet */
+  /// @domName CSSRule.parentStyleSheet; @docsEditable true
   final CSSStyleSheet parentStyleSheet;
 
-  /** @domName CSSRule.type */
+  /// @domName CSSRule.type; @docsEditable true
   final int type;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1443,34 +1437,34 @@
       _CSSStyleDeclarationFactoryProvider.createCSSStyleDeclaration_css(css);
 
 
-  /** @domName CSSStyleDeclaration.cssText */
+  /// @domName CSSStyleDeclaration.cssText; @docsEditable true
   String cssText;
 
-  /** @domName CSSStyleDeclaration.length */
+  /// @domName CSSStyleDeclaration.length; @docsEditable true
   final int length;
 
-  /** @domName CSSStyleDeclaration.parentRule */
+  /// @domName CSSStyleDeclaration.parentRule; @docsEditable true
   final CSSRule parentRule;
 
-  /** @domName CSSStyleDeclaration.getPropertyCSSValue */
+  /// @domName CSSStyleDeclaration.getPropertyCSSValue; @docsEditable true
   CSSValue getPropertyCSSValue(String propertyName) native;
 
-  /** @domName CSSStyleDeclaration.getPropertyPriority */
+  /// @domName CSSStyleDeclaration.getPropertyPriority; @docsEditable true
   String getPropertyPriority(String propertyName) native;
 
-  /** @domName CSSStyleDeclaration.getPropertyShorthand */
+  /// @domName CSSStyleDeclaration.getPropertyShorthand; @docsEditable true
   String getPropertyShorthand(String propertyName) native;
 
-  /** @domName CSSStyleDeclaration._getPropertyValue */
+  /// @domName CSSStyleDeclaration._getPropertyValue; @docsEditable true
   String _getPropertyValue(String propertyName) native "getPropertyValue";
 
-  /** @domName CSSStyleDeclaration.isPropertyImplicit */
+  /// @domName CSSStyleDeclaration.isPropertyImplicit; @docsEditable true
   bool isPropertyImplicit(String propertyName) native;
 
-  /** @domName CSSStyleDeclaration.item */
+  /// @domName CSSStyleDeclaration.item; @docsEditable true
   String item(int index) native;
 
-  /** @domName CSSStyleDeclaration.removeProperty */
+  /// @domName CSSStyleDeclaration.removeProperty; @docsEditable true
   String removeProperty(String propertyName) native;
 
 
@@ -1488,12 +1482,39 @@
   }
 
   // TODO(jacobr): generate this list of properties using the existing script.
-    /** Gets the value of "animation" */
+  /** Gets the value of "align-content" */
+  String get alignContent =>
+    getPropertyValue('${_browserPrefix}align-content');
+
+  /** Sets the value of "align-content" */
+  void set alignContent(String value) {
+    setProperty('${_browserPrefix}align-content', value, '');
+  }
+
+  /** Gets the value of "align-items" */
+  String get alignItems =>
+    getPropertyValue('${_browserPrefix}align-items');
+
+  /** Sets the value of "align-items" */
+  void set alignItems(String value) {
+    setProperty('${_browserPrefix}align-items', value, '');
+  }
+
+  /** Gets the value of "align-self" */
+  String get alignSelf =>
+    getPropertyValue('${_browserPrefix}align-self');
+
+  /** Sets the value of "align-self" */
+  void set alignSelf(String value) {
+    setProperty('${_browserPrefix}align-self', value, '');
+  }
+
+  /** Gets the value of "animation" */
   String get animation =>
     getPropertyValue('${_browserPrefix}animation');
 
   /** Sets the value of "animation" */
-  void set animation(var value) {
+  void set animation(String value) {
     setProperty('${_browserPrefix}animation', value, '');
   }
 
@@ -1502,7 +1523,7 @@
     getPropertyValue('${_browserPrefix}animation-delay');
 
   /** Sets the value of "animation-delay" */
-  void set animationDelay(var value) {
+  void set animationDelay(String value) {
     setProperty('${_browserPrefix}animation-delay', value, '');
   }
 
@@ -1511,7 +1532,7 @@
     getPropertyValue('${_browserPrefix}animation-direction');
 
   /** Sets the value of "animation-direction" */
-  void set animationDirection(var value) {
+  void set animationDirection(String value) {
     setProperty('${_browserPrefix}animation-direction', value, '');
   }
 
@@ -1520,7 +1541,7 @@
     getPropertyValue('${_browserPrefix}animation-duration');
 
   /** Sets the value of "animation-duration" */
-  void set animationDuration(var value) {
+  void set animationDuration(String value) {
     setProperty('${_browserPrefix}animation-duration', value, '');
   }
 
@@ -1529,7 +1550,7 @@
     getPropertyValue('${_browserPrefix}animation-fill-mode');
 
   /** Sets the value of "animation-fill-mode" */
-  void set animationFillMode(var value) {
+  void set animationFillMode(String value) {
     setProperty('${_browserPrefix}animation-fill-mode', value, '');
   }
 
@@ -1538,7 +1559,7 @@
     getPropertyValue('${_browserPrefix}animation-iteration-count');
 
   /** Sets the value of "animation-iteration-count" */
-  void set animationIterationCount(var value) {
+  void set animationIterationCount(String value) {
     setProperty('${_browserPrefix}animation-iteration-count', value, '');
   }
 
@@ -1547,7 +1568,7 @@
     getPropertyValue('${_browserPrefix}animation-name');
 
   /** Sets the value of "animation-name" */
-  void set animationName(var value) {
+  void set animationName(String value) {
     setProperty('${_browserPrefix}animation-name', value, '');
   }
 
@@ -1556,7 +1577,7 @@
     getPropertyValue('${_browserPrefix}animation-play-state');
 
   /** Sets the value of "animation-play-state" */
-  void set animationPlayState(var value) {
+  void set animationPlayState(String value) {
     setProperty('${_browserPrefix}animation-play-state', value, '');
   }
 
@@ -1565,25 +1586,43 @@
     getPropertyValue('${_browserPrefix}animation-timing-function');
 
   /** Sets the value of "animation-timing-function" */
-  void set animationTimingFunction(var value) {
+  void set animationTimingFunction(String value) {
     setProperty('${_browserPrefix}animation-timing-function', value, '');
   }
 
+  /** Gets the value of "app-region" */
+  String get appRegion =>
+    getPropertyValue('${_browserPrefix}app-region');
+
+  /** Sets the value of "app-region" */
+  void set appRegion(String value) {
+    setProperty('${_browserPrefix}app-region', value, '');
+  }
+
   /** Gets the value of "appearance" */
   String get appearance =>
     getPropertyValue('${_browserPrefix}appearance');
 
   /** Sets the value of "appearance" */
-  void set appearance(var value) {
+  void set appearance(String value) {
     setProperty('${_browserPrefix}appearance', value, '');
   }
 
+  /** Gets the value of "aspect-ratio" */
+  String get aspectRatio =>
+    getPropertyValue('${_browserPrefix}aspect-ratio');
+
+  /** Sets the value of "aspect-ratio" */
+  void set aspectRatio(String value) {
+    setProperty('${_browserPrefix}aspect-ratio', value, '');
+  }
+
   /** Gets the value of "backface-visibility" */
   String get backfaceVisibility =>
     getPropertyValue('${_browserPrefix}backface-visibility');
 
   /** Sets the value of "backface-visibility" */
-  void set backfaceVisibility(var value) {
+  void set backfaceVisibility(String value) {
     setProperty('${_browserPrefix}backface-visibility', value, '');
   }
 
@@ -1592,7 +1631,7 @@
     getPropertyValue('background');
 
   /** Sets the value of "background" */
-  void set background(var value) {
+  void set background(String value) {
     setProperty('background', value, '');
   }
 
@@ -1601,7 +1640,7 @@
     getPropertyValue('background-attachment');
 
   /** Sets the value of "background-attachment" */
-  void set backgroundAttachment(var value) {
+  void set backgroundAttachment(String value) {
     setProperty('background-attachment', value, '');
   }
 
@@ -1610,7 +1649,7 @@
     getPropertyValue('background-clip');
 
   /** Sets the value of "background-clip" */
-  void set backgroundClip(var value) {
+  void set backgroundClip(String value) {
     setProperty('background-clip', value, '');
   }
 
@@ -1619,7 +1658,7 @@
     getPropertyValue('background-color');
 
   /** Sets the value of "background-color" */
-  void set backgroundColor(var value) {
+  void set backgroundColor(String value) {
     setProperty('background-color', value, '');
   }
 
@@ -1628,7 +1667,7 @@
     getPropertyValue('${_browserPrefix}background-composite');
 
   /** Sets the value of "background-composite" */
-  void set backgroundComposite(var value) {
+  void set backgroundComposite(String value) {
     setProperty('${_browserPrefix}background-composite', value, '');
   }
 
@@ -1637,7 +1676,7 @@
     getPropertyValue('background-image');
 
   /** Sets the value of "background-image" */
-  void set backgroundImage(var value) {
+  void set backgroundImage(String value) {
     setProperty('background-image', value, '');
   }
 
@@ -1646,7 +1685,7 @@
     getPropertyValue('background-origin');
 
   /** Sets the value of "background-origin" */
-  void set backgroundOrigin(var value) {
+  void set backgroundOrigin(String value) {
     setProperty('background-origin', value, '');
   }
 
@@ -1655,7 +1694,7 @@
     getPropertyValue('background-position');
 
   /** Sets the value of "background-position" */
-  void set backgroundPosition(var value) {
+  void set backgroundPosition(String value) {
     setProperty('background-position', value, '');
   }
 
@@ -1664,7 +1703,7 @@
     getPropertyValue('background-position-x');
 
   /** Sets the value of "background-position-x" */
-  void set backgroundPositionX(var value) {
+  void set backgroundPositionX(String value) {
     setProperty('background-position-x', value, '');
   }
 
@@ -1673,7 +1712,7 @@
     getPropertyValue('background-position-y');
 
   /** Sets the value of "background-position-y" */
-  void set backgroundPositionY(var value) {
+  void set backgroundPositionY(String value) {
     setProperty('background-position-y', value, '');
   }
 
@@ -1682,7 +1721,7 @@
     getPropertyValue('background-repeat');
 
   /** Sets the value of "background-repeat" */
-  void set backgroundRepeat(var value) {
+  void set backgroundRepeat(String value) {
     setProperty('background-repeat', value, '');
   }
 
@@ -1691,7 +1730,7 @@
     getPropertyValue('background-repeat-x');
 
   /** Sets the value of "background-repeat-x" */
-  void set backgroundRepeatX(var value) {
+  void set backgroundRepeatX(String value) {
     setProperty('background-repeat-x', value, '');
   }
 
@@ -1700,7 +1739,7 @@
     getPropertyValue('background-repeat-y');
 
   /** Sets the value of "background-repeat-y" */
-  void set backgroundRepeatY(var value) {
+  void set backgroundRepeatY(String value) {
     setProperty('background-repeat-y', value, '');
   }
 
@@ -1709,16 +1748,25 @@
     getPropertyValue('background-size');
 
   /** Sets the value of "background-size" */
-  void set backgroundSize(var value) {
+  void set backgroundSize(String value) {
     setProperty('background-size', value, '');
   }
 
+  /** Gets the value of "blend-mode" */
+  String get blendMode =>
+    getPropertyValue('${_browserPrefix}blend-mode');
+
+  /** Sets the value of "blend-mode" */
+  void set blendMode(String value) {
+    setProperty('${_browserPrefix}blend-mode', value, '');
+  }
+
   /** Gets the value of "border" */
   String get border =>
     getPropertyValue('border');
 
   /** Sets the value of "border" */
-  void set border(var value) {
+  void set border(String value) {
     setProperty('border', value, '');
   }
 
@@ -1727,7 +1775,7 @@
     getPropertyValue('${_browserPrefix}border-after');
 
   /** Sets the value of "border-after" */
-  void set borderAfter(var value) {
+  void set borderAfter(String value) {
     setProperty('${_browserPrefix}border-after', value, '');
   }
 
@@ -1736,7 +1784,7 @@
     getPropertyValue('${_browserPrefix}border-after-color');
 
   /** Sets the value of "border-after-color" */
-  void set borderAfterColor(var value) {
+  void set borderAfterColor(String value) {
     setProperty('${_browserPrefix}border-after-color', value, '');
   }
 
@@ -1745,7 +1793,7 @@
     getPropertyValue('${_browserPrefix}border-after-style');
 
   /** Sets the value of "border-after-style" */
-  void set borderAfterStyle(var value) {
+  void set borderAfterStyle(String value) {
     setProperty('${_browserPrefix}border-after-style', value, '');
   }
 
@@ -1754,7 +1802,7 @@
     getPropertyValue('${_browserPrefix}border-after-width');
 
   /** Sets the value of "border-after-width" */
-  void set borderAfterWidth(var value) {
+  void set borderAfterWidth(String value) {
     setProperty('${_browserPrefix}border-after-width', value, '');
   }
 
@@ -1763,7 +1811,7 @@
     getPropertyValue('${_browserPrefix}border-before');
 
   /** Sets the value of "border-before" */
-  void set borderBefore(var value) {
+  void set borderBefore(String value) {
     setProperty('${_browserPrefix}border-before', value, '');
   }
 
@@ -1772,7 +1820,7 @@
     getPropertyValue('${_browserPrefix}border-before-color');
 
   /** Sets the value of "border-before-color" */
-  void set borderBeforeColor(var value) {
+  void set borderBeforeColor(String value) {
     setProperty('${_browserPrefix}border-before-color', value, '');
   }
 
@@ -1781,7 +1829,7 @@
     getPropertyValue('${_browserPrefix}border-before-style');
 
   /** Sets the value of "border-before-style" */
-  void set borderBeforeStyle(var value) {
+  void set borderBeforeStyle(String value) {
     setProperty('${_browserPrefix}border-before-style', value, '');
   }
 
@@ -1790,7 +1838,7 @@
     getPropertyValue('${_browserPrefix}border-before-width');
 
   /** Sets the value of "border-before-width" */
-  void set borderBeforeWidth(var value) {
+  void set borderBeforeWidth(String value) {
     setProperty('${_browserPrefix}border-before-width', value, '');
   }
 
@@ -1799,7 +1847,7 @@
     getPropertyValue('border-bottom');
 
   /** Sets the value of "border-bottom" */
-  void set borderBottom(var value) {
+  void set borderBottom(String value) {
     setProperty('border-bottom', value, '');
   }
 
@@ -1808,7 +1856,7 @@
     getPropertyValue('border-bottom-color');
 
   /** Sets the value of "border-bottom-color" */
-  void set borderBottomColor(var value) {
+  void set borderBottomColor(String value) {
     setProperty('border-bottom-color', value, '');
   }
 
@@ -1817,7 +1865,7 @@
     getPropertyValue('border-bottom-left-radius');
 
   /** Sets the value of "border-bottom-left-radius" */
-  void set borderBottomLeftRadius(var value) {
+  void set borderBottomLeftRadius(String value) {
     setProperty('border-bottom-left-radius', value, '');
   }
 
@@ -1826,7 +1874,7 @@
     getPropertyValue('border-bottom-right-radius');
 
   /** Sets the value of "border-bottom-right-radius" */
-  void set borderBottomRightRadius(var value) {
+  void set borderBottomRightRadius(String value) {
     setProperty('border-bottom-right-radius', value, '');
   }
 
@@ -1835,7 +1883,7 @@
     getPropertyValue('border-bottom-style');
 
   /** Sets the value of "border-bottom-style" */
-  void set borderBottomStyle(var value) {
+  void set borderBottomStyle(String value) {
     setProperty('border-bottom-style', value, '');
   }
 
@@ -1844,7 +1892,7 @@
     getPropertyValue('border-bottom-width');
 
   /** Sets the value of "border-bottom-width" */
-  void set borderBottomWidth(var value) {
+  void set borderBottomWidth(String value) {
     setProperty('border-bottom-width', value, '');
   }
 
@@ -1853,7 +1901,7 @@
     getPropertyValue('border-collapse');
 
   /** Sets the value of "border-collapse" */
-  void set borderCollapse(var value) {
+  void set borderCollapse(String value) {
     setProperty('border-collapse', value, '');
   }
 
@@ -1862,7 +1910,7 @@
     getPropertyValue('border-color');
 
   /** Sets the value of "border-color" */
-  void set borderColor(var value) {
+  void set borderColor(String value) {
     setProperty('border-color', value, '');
   }
 
@@ -1871,7 +1919,7 @@
     getPropertyValue('${_browserPrefix}border-end');
 
   /** Sets the value of "border-end" */
-  void set borderEnd(var value) {
+  void set borderEnd(String value) {
     setProperty('${_browserPrefix}border-end', value, '');
   }
 
@@ -1880,7 +1928,7 @@
     getPropertyValue('${_browserPrefix}border-end-color');
 
   /** Sets the value of "border-end-color" */
-  void set borderEndColor(var value) {
+  void set borderEndColor(String value) {
     setProperty('${_browserPrefix}border-end-color', value, '');
   }
 
@@ -1889,7 +1937,7 @@
     getPropertyValue('${_browserPrefix}border-end-style');
 
   /** Sets the value of "border-end-style" */
-  void set borderEndStyle(var value) {
+  void set borderEndStyle(String value) {
     setProperty('${_browserPrefix}border-end-style', value, '');
   }
 
@@ -1898,7 +1946,7 @@
     getPropertyValue('${_browserPrefix}border-end-width');
 
   /** Sets the value of "border-end-width" */
-  void set borderEndWidth(var value) {
+  void set borderEndWidth(String value) {
     setProperty('${_browserPrefix}border-end-width', value, '');
   }
 
@@ -1907,7 +1955,7 @@
     getPropertyValue('${_browserPrefix}border-fit');
 
   /** Sets the value of "border-fit" */
-  void set borderFit(var value) {
+  void set borderFit(String value) {
     setProperty('${_browserPrefix}border-fit', value, '');
   }
 
@@ -1916,7 +1964,7 @@
     getPropertyValue('${_browserPrefix}border-horizontal-spacing');
 
   /** Sets the value of "border-horizontal-spacing" */
-  void set borderHorizontalSpacing(var value) {
+  void set borderHorizontalSpacing(String value) {
     setProperty('${_browserPrefix}border-horizontal-spacing', value, '');
   }
 
@@ -1925,7 +1973,7 @@
     getPropertyValue('border-image');
 
   /** Sets the value of "border-image" */
-  void set borderImage(var value) {
+  void set borderImage(String value) {
     setProperty('border-image', value, '');
   }
 
@@ -1934,7 +1982,7 @@
     getPropertyValue('border-image-outset');
 
   /** Sets the value of "border-image-outset" */
-  void set borderImageOutset(var value) {
+  void set borderImageOutset(String value) {
     setProperty('border-image-outset', value, '');
   }
 
@@ -1943,7 +1991,7 @@
     getPropertyValue('border-image-repeat');
 
   /** Sets the value of "border-image-repeat" */
-  void set borderImageRepeat(var value) {
+  void set borderImageRepeat(String value) {
     setProperty('border-image-repeat', value, '');
   }
 
@@ -1952,7 +2000,7 @@
     getPropertyValue('border-image-slice');
 
   /** Sets the value of "border-image-slice" */
-  void set borderImageSlice(var value) {
+  void set borderImageSlice(String value) {
     setProperty('border-image-slice', value, '');
   }
 
@@ -1961,7 +2009,7 @@
     getPropertyValue('border-image-source');
 
   /** Sets the value of "border-image-source" */
-  void set borderImageSource(var value) {
+  void set borderImageSource(String value) {
     setProperty('border-image-source', value, '');
   }
 
@@ -1970,7 +2018,7 @@
     getPropertyValue('border-image-width');
 
   /** Sets the value of "border-image-width" */
-  void set borderImageWidth(var value) {
+  void set borderImageWidth(String value) {
     setProperty('border-image-width', value, '');
   }
 
@@ -1979,7 +2027,7 @@
     getPropertyValue('border-left');
 
   /** Sets the value of "border-left" */
-  void set borderLeft(var value) {
+  void set borderLeft(String value) {
     setProperty('border-left', value, '');
   }
 
@@ -1988,7 +2036,7 @@
     getPropertyValue('border-left-color');
 
   /** Sets the value of "border-left-color" */
-  void set borderLeftColor(var value) {
+  void set borderLeftColor(String value) {
     setProperty('border-left-color', value, '');
   }
 
@@ -1997,7 +2045,7 @@
     getPropertyValue('border-left-style');
 
   /** Sets the value of "border-left-style" */
-  void set borderLeftStyle(var value) {
+  void set borderLeftStyle(String value) {
     setProperty('border-left-style', value, '');
   }
 
@@ -2006,7 +2054,7 @@
     getPropertyValue('border-left-width');
 
   /** Sets the value of "border-left-width" */
-  void set borderLeftWidth(var value) {
+  void set borderLeftWidth(String value) {
     setProperty('border-left-width', value, '');
   }
 
@@ -2015,7 +2063,7 @@
     getPropertyValue('border-radius');
 
   /** Sets the value of "border-radius" */
-  void set borderRadius(var value) {
+  void set borderRadius(String value) {
     setProperty('border-radius', value, '');
   }
 
@@ -2024,7 +2072,7 @@
     getPropertyValue('border-right');
 
   /** Sets the value of "border-right" */
-  void set borderRight(var value) {
+  void set borderRight(String value) {
     setProperty('border-right', value, '');
   }
 
@@ -2033,7 +2081,7 @@
     getPropertyValue('border-right-color');
 
   /** Sets the value of "border-right-color" */
-  void set borderRightColor(var value) {
+  void set borderRightColor(String value) {
     setProperty('border-right-color', value, '');
   }
 
@@ -2042,7 +2090,7 @@
     getPropertyValue('border-right-style');
 
   /** Sets the value of "border-right-style" */
-  void set borderRightStyle(var value) {
+  void set borderRightStyle(String value) {
     setProperty('border-right-style', value, '');
   }
 
@@ -2051,7 +2099,7 @@
     getPropertyValue('border-right-width');
 
   /** Sets the value of "border-right-width" */
-  void set borderRightWidth(var value) {
+  void set borderRightWidth(String value) {
     setProperty('border-right-width', value, '');
   }
 
@@ -2060,7 +2108,7 @@
     getPropertyValue('border-spacing');
 
   /** Sets the value of "border-spacing" */
-  void set borderSpacing(var value) {
+  void set borderSpacing(String value) {
     setProperty('border-spacing', value, '');
   }
 
@@ -2069,7 +2117,7 @@
     getPropertyValue('${_browserPrefix}border-start');
 
   /** Sets the value of "border-start" */
-  void set borderStart(var value) {
+  void set borderStart(String value) {
     setProperty('${_browserPrefix}border-start', value, '');
   }
 
@@ -2078,7 +2126,7 @@
     getPropertyValue('${_browserPrefix}border-start-color');
 
   /** Sets the value of "border-start-color" */
-  void set borderStartColor(var value) {
+  void set borderStartColor(String value) {
     setProperty('${_browserPrefix}border-start-color', value, '');
   }
 
@@ -2087,7 +2135,7 @@
     getPropertyValue('${_browserPrefix}border-start-style');
 
   /** Sets the value of "border-start-style" */
-  void set borderStartStyle(var value) {
+  void set borderStartStyle(String value) {
     setProperty('${_browserPrefix}border-start-style', value, '');
   }
 
@@ -2096,7 +2144,7 @@
     getPropertyValue('${_browserPrefix}border-start-width');
 
   /** Sets the value of "border-start-width" */
-  void set borderStartWidth(var value) {
+  void set borderStartWidth(String value) {
     setProperty('${_browserPrefix}border-start-width', value, '');
   }
 
@@ -2105,7 +2153,7 @@
     getPropertyValue('border-style');
 
   /** Sets the value of "border-style" */
-  void set borderStyle(var value) {
+  void set borderStyle(String value) {
     setProperty('border-style', value, '');
   }
 
@@ -2114,7 +2162,7 @@
     getPropertyValue('border-top');
 
   /** Sets the value of "border-top" */
-  void set borderTop(var value) {
+  void set borderTop(String value) {
     setProperty('border-top', value, '');
   }
 
@@ -2123,7 +2171,7 @@
     getPropertyValue('border-top-color');
 
   /** Sets the value of "border-top-color" */
-  void set borderTopColor(var value) {
+  void set borderTopColor(String value) {
     setProperty('border-top-color', value, '');
   }
 
@@ -2132,7 +2180,7 @@
     getPropertyValue('border-top-left-radius');
 
   /** Sets the value of "border-top-left-radius" */
-  void set borderTopLeftRadius(var value) {
+  void set borderTopLeftRadius(String value) {
     setProperty('border-top-left-radius', value, '');
   }
 
@@ -2141,7 +2189,7 @@
     getPropertyValue('border-top-right-radius');
 
   /** Sets the value of "border-top-right-radius" */
-  void set borderTopRightRadius(var value) {
+  void set borderTopRightRadius(String value) {
     setProperty('border-top-right-radius', value, '');
   }
 
@@ -2150,7 +2198,7 @@
     getPropertyValue('border-top-style');
 
   /** Sets the value of "border-top-style" */
-  void set borderTopStyle(var value) {
+  void set borderTopStyle(String value) {
     setProperty('border-top-style', value, '');
   }
 
@@ -2159,7 +2207,7 @@
     getPropertyValue('border-top-width');
 
   /** Sets the value of "border-top-width" */
-  void set borderTopWidth(var value) {
+  void set borderTopWidth(String value) {
     setProperty('border-top-width', value, '');
   }
 
@@ -2168,7 +2216,7 @@
     getPropertyValue('${_browserPrefix}border-vertical-spacing');
 
   /** Sets the value of "border-vertical-spacing" */
-  void set borderVerticalSpacing(var value) {
+  void set borderVerticalSpacing(String value) {
     setProperty('${_browserPrefix}border-vertical-spacing', value, '');
   }
 
@@ -2177,7 +2225,7 @@
     getPropertyValue('border-width');
 
   /** Sets the value of "border-width" */
-  void set borderWidth(var value) {
+  void set borderWidth(String value) {
     setProperty('border-width', value, '');
   }
 
@@ -2186,7 +2234,7 @@
     getPropertyValue('bottom');
 
   /** Sets the value of "bottom" */
-  void set bottom(var value) {
+  void set bottom(String value) {
     setProperty('bottom', value, '');
   }
 
@@ -2195,16 +2243,25 @@
     getPropertyValue('${_browserPrefix}box-align');
 
   /** Sets the value of "box-align" */
-  void set boxAlign(var value) {
+  void set boxAlign(String value) {
     setProperty('${_browserPrefix}box-align', value, '');
   }
 
+  /** Gets the value of "box-decoration-break" */
+  String get boxDecorationBreak =>
+    getPropertyValue('${_browserPrefix}box-decoration-break');
+
+  /** Sets the value of "box-decoration-break" */
+  void set boxDecorationBreak(String value) {
+    setProperty('${_browserPrefix}box-decoration-break', value, '');
+  }
+
   /** Gets the value of "box-direction" */
   String get boxDirection =>
     getPropertyValue('${_browserPrefix}box-direction');
 
   /** Sets the value of "box-direction" */
-  void set boxDirection(var value) {
+  void set boxDirection(String value) {
     setProperty('${_browserPrefix}box-direction', value, '');
   }
 
@@ -2213,7 +2270,7 @@
     getPropertyValue('${_browserPrefix}box-flex');
 
   /** Sets the value of "box-flex" */
-  void set boxFlex(var value) {
+  void set boxFlex(String value) {
     setProperty('${_browserPrefix}box-flex', value, '');
   }
 
@@ -2222,7 +2279,7 @@
     getPropertyValue('${_browserPrefix}box-flex-group');
 
   /** Sets the value of "box-flex-group" */
-  void set boxFlexGroup(var value) {
+  void set boxFlexGroup(String value) {
     setProperty('${_browserPrefix}box-flex-group', value, '');
   }
 
@@ -2231,7 +2288,7 @@
     getPropertyValue('${_browserPrefix}box-lines');
 
   /** Sets the value of "box-lines" */
-  void set boxLines(var value) {
+  void set boxLines(String value) {
     setProperty('${_browserPrefix}box-lines', value, '');
   }
 
@@ -2240,7 +2297,7 @@
     getPropertyValue('${_browserPrefix}box-ordinal-group');
 
   /** Sets the value of "box-ordinal-group" */
-  void set boxOrdinalGroup(var value) {
+  void set boxOrdinalGroup(String value) {
     setProperty('${_browserPrefix}box-ordinal-group', value, '');
   }
 
@@ -2249,7 +2306,7 @@
     getPropertyValue('${_browserPrefix}box-orient');
 
   /** Sets the value of "box-orient" */
-  void set boxOrient(var value) {
+  void set boxOrient(String value) {
     setProperty('${_browserPrefix}box-orient', value, '');
   }
 
@@ -2258,7 +2315,7 @@
     getPropertyValue('${_browserPrefix}box-pack');
 
   /** Sets the value of "box-pack" */
-  void set boxPack(var value) {
+  void set boxPack(String value) {
     setProperty('${_browserPrefix}box-pack', value, '');
   }
 
@@ -2267,7 +2324,7 @@
     getPropertyValue('${_browserPrefix}box-reflect');
 
   /** Sets the value of "box-reflect" */
-  void set boxReflect(var value) {
+  void set boxReflect(String value) {
     setProperty('${_browserPrefix}box-reflect', value, '');
   }
 
@@ -2276,7 +2333,7 @@
     getPropertyValue('box-shadow');
 
   /** Sets the value of "box-shadow" */
-  void set boxShadow(var value) {
+  void set boxShadow(String value) {
     setProperty('box-shadow', value, '');
   }
 
@@ -2285,7 +2342,7 @@
     getPropertyValue('box-sizing');
 
   /** Sets the value of "box-sizing" */
-  void set boxSizing(var value) {
+  void set boxSizing(String value) {
     setProperty('box-sizing', value, '');
   }
 
@@ -2294,7 +2351,7 @@
     getPropertyValue('caption-side');
 
   /** Sets the value of "caption-side" */
-  void set captionSide(var value) {
+  void set captionSide(String value) {
     setProperty('caption-side', value, '');
   }
 
@@ -2303,7 +2360,7 @@
     getPropertyValue('clear');
 
   /** Sets the value of "clear" */
-  void set clear(var value) {
+  void set clear(String value) {
     setProperty('clear', value, '');
   }
 
@@ -2312,16 +2369,25 @@
     getPropertyValue('clip');
 
   /** Sets the value of "clip" */
-  void set clip(var value) {
+  void set clip(String value) {
     setProperty('clip', value, '');
   }
 
+  /** Gets the value of "clip-path" */
+  String get clipPath =>
+    getPropertyValue('${_browserPrefix}clip-path');
+
+  /** Sets the value of "clip-path" */
+  void set clipPath(String value) {
+    setProperty('${_browserPrefix}clip-path', value, '');
+  }
+
   /** Gets the value of "color" */
   String get color =>
     getPropertyValue('color');
 
   /** Sets the value of "color" */
-  void set color(var value) {
+  void set color(String value) {
     setProperty('color', value, '');
   }
 
@@ -2330,16 +2396,25 @@
     getPropertyValue('${_browserPrefix}color-correction');
 
   /** Sets the value of "color-correction" */
-  void set colorCorrection(var value) {
+  void set colorCorrection(String value) {
     setProperty('${_browserPrefix}color-correction', value, '');
   }
 
+  /** Gets the value of "column-axis" */
+  String get columnAxis =>
+    getPropertyValue('${_browserPrefix}column-axis');
+
+  /** Sets the value of "column-axis" */
+  void set columnAxis(String value) {
+    setProperty('${_browserPrefix}column-axis', value, '');
+  }
+
   /** Gets the value of "column-break-after" */
   String get columnBreakAfter =>
     getPropertyValue('${_browserPrefix}column-break-after');
 
   /** Sets the value of "column-break-after" */
-  void set columnBreakAfter(var value) {
+  void set columnBreakAfter(String value) {
     setProperty('${_browserPrefix}column-break-after', value, '');
   }
 
@@ -2348,7 +2423,7 @@
     getPropertyValue('${_browserPrefix}column-break-before');
 
   /** Sets the value of "column-break-before" */
-  void set columnBreakBefore(var value) {
+  void set columnBreakBefore(String value) {
     setProperty('${_browserPrefix}column-break-before', value, '');
   }
 
@@ -2357,7 +2432,7 @@
     getPropertyValue('${_browserPrefix}column-break-inside');
 
   /** Sets the value of "column-break-inside" */
-  void set columnBreakInside(var value) {
+  void set columnBreakInside(String value) {
     setProperty('${_browserPrefix}column-break-inside', value, '');
   }
 
@@ -2366,7 +2441,7 @@
     getPropertyValue('${_browserPrefix}column-count');
 
   /** Sets the value of "column-count" */
-  void set columnCount(var value) {
+  void set columnCount(String value) {
     setProperty('${_browserPrefix}column-count', value, '');
   }
 
@@ -2375,16 +2450,25 @@
     getPropertyValue('${_browserPrefix}column-gap');
 
   /** Sets the value of "column-gap" */
-  void set columnGap(var value) {
+  void set columnGap(String value) {
     setProperty('${_browserPrefix}column-gap', value, '');
   }
 
+  /** Gets the value of "column-progression" */
+  String get columnProgression =>
+    getPropertyValue('${_browserPrefix}column-progression');
+
+  /** Sets the value of "column-progression" */
+  void set columnProgression(String value) {
+    setProperty('${_browserPrefix}column-progression', value, '');
+  }
+
   /** Gets the value of "column-rule" */
   String get columnRule =>
     getPropertyValue('${_browserPrefix}column-rule');
 
   /** Sets the value of "column-rule" */
-  void set columnRule(var value) {
+  void set columnRule(String value) {
     setProperty('${_browserPrefix}column-rule', value, '');
   }
 
@@ -2393,7 +2477,7 @@
     getPropertyValue('${_browserPrefix}column-rule-color');
 
   /** Sets the value of "column-rule-color" */
-  void set columnRuleColor(var value) {
+  void set columnRuleColor(String value) {
     setProperty('${_browserPrefix}column-rule-color', value, '');
   }
 
@@ -2402,7 +2486,7 @@
     getPropertyValue('${_browserPrefix}column-rule-style');
 
   /** Sets the value of "column-rule-style" */
-  void set columnRuleStyle(var value) {
+  void set columnRuleStyle(String value) {
     setProperty('${_browserPrefix}column-rule-style', value, '');
   }
 
@@ -2411,7 +2495,7 @@
     getPropertyValue('${_browserPrefix}column-rule-width');
 
   /** Sets the value of "column-rule-width" */
-  void set columnRuleWidth(var value) {
+  void set columnRuleWidth(String value) {
     setProperty('${_browserPrefix}column-rule-width', value, '');
   }
 
@@ -2420,7 +2504,7 @@
     getPropertyValue('${_browserPrefix}column-span');
 
   /** Sets the value of "column-span" */
-  void set columnSpan(var value) {
+  void set columnSpan(String value) {
     setProperty('${_browserPrefix}column-span', value, '');
   }
 
@@ -2429,7 +2513,7 @@
     getPropertyValue('${_browserPrefix}column-width');
 
   /** Sets the value of "column-width" */
-  void set columnWidth(var value) {
+  void set columnWidth(String value) {
     setProperty('${_browserPrefix}column-width', value, '');
   }
 
@@ -2438,7 +2522,7 @@
     getPropertyValue('${_browserPrefix}columns');
 
   /** Sets the value of "columns" */
-  void set columns(var value) {
+  void set columns(String value) {
     setProperty('${_browserPrefix}columns', value, '');
   }
 
@@ -2447,7 +2531,7 @@
     getPropertyValue('content');
 
   /** Sets the value of "content" */
-  void set content(var value) {
+  void set content(String value) {
     setProperty('content', value, '');
   }
 
@@ -2456,7 +2540,7 @@
     getPropertyValue('counter-increment');
 
   /** Sets the value of "counter-increment" */
-  void set counterIncrement(var value) {
+  void set counterIncrement(String value) {
     setProperty('counter-increment', value, '');
   }
 
@@ -2465,7 +2549,7 @@
     getPropertyValue('counter-reset');
 
   /** Sets the value of "counter-reset" */
-  void set counterReset(var value) {
+  void set counterReset(String value) {
     setProperty('counter-reset', value, '');
   }
 
@@ -2474,16 +2558,25 @@
     getPropertyValue('cursor');
 
   /** Sets the value of "cursor" */
-  void set cursor(var value) {
+  void set cursor(String value) {
     setProperty('cursor', value, '');
   }
 
+  /** Gets the value of "dashboard-region" */
+  String get dashboardRegion =>
+    getPropertyValue('${_browserPrefix}dashboard-region');
+
+  /** Sets the value of "dashboard-region" */
+  void set dashboardRegion(String value) {
+    setProperty('${_browserPrefix}dashboard-region', value, '');
+  }
+
   /** Gets the value of "direction" */
   String get direction =>
     getPropertyValue('direction');
 
   /** Sets the value of "direction" */
-  void set direction(var value) {
+  void set direction(String value) {
     setProperty('direction', value, '');
   }
 
@@ -2492,7 +2585,7 @@
     getPropertyValue('display');
 
   /** Sets the value of "display" */
-  void set display(var value) {
+  void set display(String value) {
     setProperty('display', value, '');
   }
 
@@ -2501,7 +2594,7 @@
     getPropertyValue('empty-cells');
 
   /** Sets the value of "empty-cells" */
-  void set emptyCells(var value) {
+  void set emptyCells(String value) {
     setProperty('empty-cells', value, '');
   }
 
@@ -2510,17 +2603,35 @@
     getPropertyValue('${_browserPrefix}filter');
 
   /** Sets the value of "filter" */
-  void set filter(var value) {
+  void set filter(String value) {
     setProperty('${_browserPrefix}filter', value, '');
   }
 
-  /** Gets the value of "flex-align" */
-  String get flexAlign =>
-    getPropertyValue('${_browserPrefix}flex-align');
+  /** Gets the value of "flex" */
+  String get flex =>
+    getPropertyValue('${_browserPrefix}flex');
 
-  /** Sets the value of "flex-align" */
-  void set flexAlign(var value) {
-    setProperty('${_browserPrefix}flex-align', value, '');
+  /** Sets the value of "flex" */
+  void set flex(String value) {
+    setProperty('${_browserPrefix}flex', value, '');
+  }
+
+  /** Gets the value of "flex-basis" */
+  String get flexBasis =>
+    getPropertyValue('${_browserPrefix}flex-basis');
+
+  /** Sets the value of "flex-basis" */
+  void set flexBasis(String value) {
+    setProperty('${_browserPrefix}flex-basis', value, '');
+  }
+
+  /** Gets the value of "flex-direction" */
+  String get flexDirection =>
+    getPropertyValue('${_browserPrefix}flex-direction');
+
+  /** Sets the value of "flex-direction" */
+  void set flexDirection(String value) {
+    setProperty('${_browserPrefix}flex-direction', value, '');
   }
 
   /** Gets the value of "flex-flow" */
@@ -2528,26 +2639,35 @@
     getPropertyValue('${_browserPrefix}flex-flow');
 
   /** Sets the value of "flex-flow" */
-  void set flexFlow(var value) {
+  void set flexFlow(String value) {
     setProperty('${_browserPrefix}flex-flow', value, '');
   }
 
-  /** Gets the value of "flex-order" */
-  String get flexOrder =>
-    getPropertyValue('${_browserPrefix}flex-order');
+  /** Gets the value of "flex-grow" */
+  String get flexGrow =>
+    getPropertyValue('${_browserPrefix}flex-grow');
 
-  /** Sets the value of "flex-order" */
-  void set flexOrder(var value) {
-    setProperty('${_browserPrefix}flex-order', value, '');
+  /** Sets the value of "flex-grow" */
+  void set flexGrow(String value) {
+    setProperty('${_browserPrefix}flex-grow', value, '');
   }
 
-  /** Gets the value of "flex-pack" */
-  String get flexPack =>
-    getPropertyValue('${_browserPrefix}flex-pack');
+  /** Gets the value of "flex-shrink" */
+  String get flexShrink =>
+    getPropertyValue('${_browserPrefix}flex-shrink');
 
-  /** Sets the value of "flex-pack" */
-  void set flexPack(var value) {
-    setProperty('${_browserPrefix}flex-pack', value, '');
+  /** Sets the value of "flex-shrink" */
+  void set flexShrink(String value) {
+    setProperty('${_browserPrefix}flex-shrink', value, '');
+  }
+
+  /** Gets the value of "flex-wrap" */
+  String get flexWrap =>
+    getPropertyValue('${_browserPrefix}flex-wrap');
+
+  /** Sets the value of "flex-wrap" */
+  void set flexWrap(String value) {
+    setProperty('${_browserPrefix}flex-wrap', value, '');
   }
 
   /** Gets the value of "float" */
@@ -2555,7 +2675,7 @@
     getPropertyValue('float');
 
   /** Sets the value of "float" */
-  void set float(var value) {
+  void set float(String value) {
     setProperty('float', value, '');
   }
 
@@ -2564,7 +2684,7 @@
     getPropertyValue('${_browserPrefix}flow-from');
 
   /** Sets the value of "flow-from" */
-  void set flowFrom(var value) {
+  void set flowFrom(String value) {
     setProperty('${_browserPrefix}flow-from', value, '');
   }
 
@@ -2573,7 +2693,7 @@
     getPropertyValue('${_browserPrefix}flow-into');
 
   /** Sets the value of "flow-into" */
-  void set flowInto(var value) {
+  void set flowInto(String value) {
     setProperty('${_browserPrefix}flow-into', value, '');
   }
 
@@ -2582,7 +2702,7 @@
     getPropertyValue('font');
 
   /** Sets the value of "font" */
-  void set font(var value) {
+  void set font(String value) {
     setProperty('font', value, '');
   }
 
@@ -2591,7 +2711,7 @@
     getPropertyValue('font-family');
 
   /** Sets the value of "font-family" */
-  void set fontFamily(var value) {
+  void set fontFamily(String value) {
     setProperty('font-family', value, '');
   }
 
@@ -2600,16 +2720,25 @@
     getPropertyValue('${_browserPrefix}font-feature-settings');
 
   /** Sets the value of "font-feature-settings" */
-  void set fontFeatureSettings(var value) {
+  void set fontFeatureSettings(String value) {
     setProperty('${_browserPrefix}font-feature-settings', value, '');
   }
 
+  /** Gets the value of "font-kerning" */
+  String get fontKerning =>
+    getPropertyValue('${_browserPrefix}font-kerning');
+
+  /** Sets the value of "font-kerning" */
+  void set fontKerning(String value) {
+    setProperty('${_browserPrefix}font-kerning', value, '');
+  }
+
   /** Gets the value of "font-size" */
   String get fontSize =>
     getPropertyValue('font-size');
 
   /** Sets the value of "font-size" */
-  void set fontSize(var value) {
+  void set fontSize(String value) {
     setProperty('font-size', value, '');
   }
 
@@ -2618,7 +2747,7 @@
     getPropertyValue('${_browserPrefix}font-size-delta');
 
   /** Sets the value of "font-size-delta" */
-  void set fontSizeDelta(var value) {
+  void set fontSizeDelta(String value) {
     setProperty('${_browserPrefix}font-size-delta', value, '');
   }
 
@@ -2627,7 +2756,7 @@
     getPropertyValue('${_browserPrefix}font-smoothing');
 
   /** Sets the value of "font-smoothing" */
-  void set fontSmoothing(var value) {
+  void set fontSmoothing(String value) {
     setProperty('${_browserPrefix}font-smoothing', value, '');
   }
 
@@ -2636,7 +2765,7 @@
     getPropertyValue('font-stretch');
 
   /** Sets the value of "font-stretch" */
-  void set fontStretch(var value) {
+  void set fontStretch(String value) {
     setProperty('font-stretch', value, '');
   }
 
@@ -2645,7 +2774,7 @@
     getPropertyValue('font-style');
 
   /** Sets the value of "font-style" */
-  void set fontStyle(var value) {
+  void set fontStyle(String value) {
     setProperty('font-style', value, '');
   }
 
@@ -2654,25 +2783,70 @@
     getPropertyValue('font-variant');
 
   /** Sets the value of "font-variant" */
-  void set fontVariant(var value) {
+  void set fontVariant(String value) {
     setProperty('font-variant', value, '');
   }
 
+  /** Gets the value of "font-variant-ligatures" */
+  String get fontVariantLigatures =>
+    getPropertyValue('${_browserPrefix}font-variant-ligatures');
+
+  /** Sets the value of "font-variant-ligatures" */
+  void set fontVariantLigatures(String value) {
+    setProperty('${_browserPrefix}font-variant-ligatures', value, '');
+  }
+
   /** Gets the value of "font-weight" */
   String get fontWeight =>
     getPropertyValue('font-weight');
 
   /** Sets the value of "font-weight" */
-  void set fontWeight(var value) {
+  void set fontWeight(String value) {
     setProperty('font-weight', value, '');
   }
 
+  /** Gets the value of "grid-column" */
+  String get gridColumn =>
+    getPropertyValue('${_browserPrefix}grid-column');
+
+  /** Sets the value of "grid-column" */
+  void set gridColumn(String value) {
+    setProperty('${_browserPrefix}grid-column', value, '');
+  }
+
+  /** Gets the value of "grid-columns" */
+  String get gridColumns =>
+    getPropertyValue('${_browserPrefix}grid-columns');
+
+  /** Sets the value of "grid-columns" */
+  void set gridColumns(String value) {
+    setProperty('${_browserPrefix}grid-columns', value, '');
+  }
+
+  /** Gets the value of "grid-row" */
+  String get gridRow =>
+    getPropertyValue('${_browserPrefix}grid-row');
+
+  /** Sets the value of "grid-row" */
+  void set gridRow(String value) {
+    setProperty('${_browserPrefix}grid-row', value, '');
+  }
+
+  /** Gets the value of "grid-rows" */
+  String get gridRows =>
+    getPropertyValue('${_browserPrefix}grid-rows');
+
+  /** Sets the value of "grid-rows" */
+  void set gridRows(String value) {
+    setProperty('${_browserPrefix}grid-rows', value, '');
+  }
+
   /** Gets the value of "height" */
   String get height =>
     getPropertyValue('height');
 
   /** Sets the value of "height" */
-  void set height(var value) {
+  void set height(String value) {
     setProperty('height', value, '');
   }
 
@@ -2681,7 +2855,7 @@
     getPropertyValue('${_browserPrefix}highlight');
 
   /** Sets the value of "highlight" */
-  void set highlight(var value) {
+  void set highlight(String value) {
     setProperty('${_browserPrefix}highlight', value, '');
   }
 
@@ -2690,7 +2864,7 @@
     getPropertyValue('${_browserPrefix}hyphenate-character');
 
   /** Sets the value of "hyphenate-character" */
-  void set hyphenateCharacter(var value) {
+  void set hyphenateCharacter(String value) {
     setProperty('${_browserPrefix}hyphenate-character', value, '');
   }
 
@@ -2699,7 +2873,7 @@
     getPropertyValue('${_browserPrefix}hyphenate-limit-after');
 
   /** Sets the value of "hyphenate-limit-after" */
-  void set hyphenateLimitAfter(var value) {
+  void set hyphenateLimitAfter(String value) {
     setProperty('${_browserPrefix}hyphenate-limit-after', value, '');
   }
 
@@ -2708,7 +2882,7 @@
     getPropertyValue('${_browserPrefix}hyphenate-limit-before');
 
   /** Sets the value of "hyphenate-limit-before" */
-  void set hyphenateLimitBefore(var value) {
+  void set hyphenateLimitBefore(String value) {
     setProperty('${_browserPrefix}hyphenate-limit-before', value, '');
   }
 
@@ -2717,7 +2891,7 @@
     getPropertyValue('${_browserPrefix}hyphenate-limit-lines');
 
   /** Sets the value of "hyphenate-limit-lines" */
-  void set hyphenateLimitLines(var value) {
+  void set hyphenateLimitLines(String value) {
     setProperty('${_browserPrefix}hyphenate-limit-lines', value, '');
   }
 
@@ -2726,25 +2900,52 @@
     getPropertyValue('${_browserPrefix}hyphens');
 
   /** Sets the value of "hyphens" */
-  void set hyphens(var value) {
+  void set hyphens(String value) {
     setProperty('${_browserPrefix}hyphens', value, '');
   }
 
+  /** Gets the value of "image-orientation" */
+  String get imageOrientation =>
+    getPropertyValue('image-orientation');
+
+  /** Sets the value of "image-orientation" */
+  void set imageOrientation(String value) {
+    setProperty('image-orientation', value, '');
+  }
+
   /** Gets the value of "image-rendering" */
   String get imageRendering =>
     getPropertyValue('image-rendering');
 
   /** Sets the value of "image-rendering" */
-  void set imageRendering(var value) {
+  void set imageRendering(String value) {
     setProperty('image-rendering', value, '');
   }
 
+  /** Gets the value of "image-resolution" */
+  String get imageResolution =>
+    getPropertyValue('image-resolution');
+
+  /** Sets the value of "image-resolution" */
+  void set imageResolution(String value) {
+    setProperty('image-resolution', value, '');
+  }
+
+  /** Gets the value of "justify-content" */
+  String get justifyContent =>
+    getPropertyValue('${_browserPrefix}justify-content');
+
+  /** Sets the value of "justify-content" */
+  void set justifyContent(String value) {
+    setProperty('${_browserPrefix}justify-content', value, '');
+  }
+
   /** Gets the value of "left" */
   String get left =>
     getPropertyValue('left');
 
   /** Sets the value of "left" */
-  void set left(var value) {
+  void set left(String value) {
     setProperty('left', value, '');
   }
 
@@ -2753,16 +2954,25 @@
     getPropertyValue('letter-spacing');
 
   /** Sets the value of "letter-spacing" */
-  void set letterSpacing(var value) {
+  void set letterSpacing(String value) {
     setProperty('letter-spacing', value, '');
   }
 
+  /** Gets the value of "line-align" */
+  String get lineAlign =>
+    getPropertyValue('${_browserPrefix}line-align');
+
+  /** Sets the value of "line-align" */
+  void set lineAlign(String value) {
+    setProperty('${_browserPrefix}line-align', value, '');
+  }
+
   /** Gets the value of "line-box-contain" */
   String get lineBoxContain =>
     getPropertyValue('${_browserPrefix}line-box-contain');
 
   /** Sets the value of "line-box-contain" */
-  void set lineBoxContain(var value) {
+  void set lineBoxContain(String value) {
     setProperty('${_browserPrefix}line-box-contain', value, '');
   }
 
@@ -2771,7 +2981,7 @@
     getPropertyValue('${_browserPrefix}line-break');
 
   /** Sets the value of "line-break" */
-  void set lineBreak(var value) {
+  void set lineBreak(String value) {
     setProperty('${_browserPrefix}line-break', value, '');
   }
 
@@ -2780,25 +2990,43 @@
     getPropertyValue('${_browserPrefix}line-clamp');
 
   /** Sets the value of "line-clamp" */
-  void set lineClamp(var value) {
+  void set lineClamp(String value) {
     setProperty('${_browserPrefix}line-clamp', value, '');
   }
 
+  /** Gets the value of "line-grid" */
+  String get lineGrid =>
+    getPropertyValue('${_browserPrefix}line-grid');
+
+  /** Sets the value of "line-grid" */
+  void set lineGrid(String value) {
+    setProperty('${_browserPrefix}line-grid', value, '');
+  }
+
   /** Gets the value of "line-height" */
   String get lineHeight =>
     getPropertyValue('line-height');
 
   /** Sets the value of "line-height" */
-  void set lineHeight(var value) {
+  void set lineHeight(String value) {
     setProperty('line-height', value, '');
   }
 
+  /** Gets the value of "line-snap" */
+  String get lineSnap =>
+    getPropertyValue('${_browserPrefix}line-snap');
+
+  /** Sets the value of "line-snap" */
+  void set lineSnap(String value) {
+    setProperty('${_browserPrefix}line-snap', value, '');
+  }
+
   /** Gets the value of "list-style" */
   String get listStyle =>
     getPropertyValue('list-style');
 
   /** Sets the value of "list-style" */
-  void set listStyle(var value) {
+  void set listStyle(String value) {
     setProperty('list-style', value, '');
   }
 
@@ -2807,7 +3035,7 @@
     getPropertyValue('list-style-image');
 
   /** Sets the value of "list-style-image" */
-  void set listStyleImage(var value) {
+  void set listStyleImage(String value) {
     setProperty('list-style-image', value, '');
   }
 
@@ -2816,7 +3044,7 @@
     getPropertyValue('list-style-position');
 
   /** Sets the value of "list-style-position" */
-  void set listStylePosition(var value) {
+  void set listStylePosition(String value) {
     setProperty('list-style-position', value, '');
   }
 
@@ -2825,7 +3053,7 @@
     getPropertyValue('list-style-type');
 
   /** Sets the value of "list-style-type" */
-  void set listStyleType(var value) {
+  void set listStyleType(String value) {
     setProperty('list-style-type', value, '');
   }
 
@@ -2834,7 +3062,7 @@
     getPropertyValue('${_browserPrefix}locale');
 
   /** Sets the value of "locale" */
-  void set locale(var value) {
+  void set locale(String value) {
     setProperty('${_browserPrefix}locale', value, '');
   }
 
@@ -2843,7 +3071,7 @@
     getPropertyValue('${_browserPrefix}logical-height');
 
   /** Sets the value of "logical-height" */
-  void set logicalHeight(var value) {
+  void set logicalHeight(String value) {
     setProperty('${_browserPrefix}logical-height', value, '');
   }
 
@@ -2852,7 +3080,7 @@
     getPropertyValue('${_browserPrefix}logical-width');
 
   /** Sets the value of "logical-width" */
-  void set logicalWidth(var value) {
+  void set logicalWidth(String value) {
     setProperty('${_browserPrefix}logical-width', value, '');
   }
 
@@ -2861,7 +3089,7 @@
     getPropertyValue('margin');
 
   /** Sets the value of "margin" */
-  void set margin(var value) {
+  void set margin(String value) {
     setProperty('margin', value, '');
   }
 
@@ -2870,7 +3098,7 @@
     getPropertyValue('${_browserPrefix}margin-after');
 
   /** Sets the value of "margin-after" */
-  void set marginAfter(var value) {
+  void set marginAfter(String value) {
     setProperty('${_browserPrefix}margin-after', value, '');
   }
 
@@ -2879,7 +3107,7 @@
     getPropertyValue('${_browserPrefix}margin-after-collapse');
 
   /** Sets the value of "margin-after-collapse" */
-  void set marginAfterCollapse(var value) {
+  void set marginAfterCollapse(String value) {
     setProperty('${_browserPrefix}margin-after-collapse', value, '');
   }
 
@@ -2888,7 +3116,7 @@
     getPropertyValue('${_browserPrefix}margin-before');
 
   /** Sets the value of "margin-before" */
-  void set marginBefore(var value) {
+  void set marginBefore(String value) {
     setProperty('${_browserPrefix}margin-before', value, '');
   }
 
@@ -2897,7 +3125,7 @@
     getPropertyValue('${_browserPrefix}margin-before-collapse');
 
   /** Sets the value of "margin-before-collapse" */
-  void set marginBeforeCollapse(var value) {
+  void set marginBeforeCollapse(String value) {
     setProperty('${_browserPrefix}margin-before-collapse', value, '');
   }
 
@@ -2906,7 +3134,7 @@
     getPropertyValue('margin-bottom');
 
   /** Sets the value of "margin-bottom" */
-  void set marginBottom(var value) {
+  void set marginBottom(String value) {
     setProperty('margin-bottom', value, '');
   }
 
@@ -2915,7 +3143,7 @@
     getPropertyValue('${_browserPrefix}margin-bottom-collapse');
 
   /** Sets the value of "margin-bottom-collapse" */
-  void set marginBottomCollapse(var value) {
+  void set marginBottomCollapse(String value) {
     setProperty('${_browserPrefix}margin-bottom-collapse', value, '');
   }
 
@@ -2924,7 +3152,7 @@
     getPropertyValue('${_browserPrefix}margin-collapse');
 
   /** Sets the value of "margin-collapse" */
-  void set marginCollapse(var value) {
+  void set marginCollapse(String value) {
     setProperty('${_browserPrefix}margin-collapse', value, '');
   }
 
@@ -2933,7 +3161,7 @@
     getPropertyValue('${_browserPrefix}margin-end');
 
   /** Sets the value of "margin-end" */
-  void set marginEnd(var value) {
+  void set marginEnd(String value) {
     setProperty('${_browserPrefix}margin-end', value, '');
   }
 
@@ -2942,7 +3170,7 @@
     getPropertyValue('margin-left');
 
   /** Sets the value of "margin-left" */
-  void set marginLeft(var value) {
+  void set marginLeft(String value) {
     setProperty('margin-left', value, '');
   }
 
@@ -2951,7 +3179,7 @@
     getPropertyValue('margin-right');
 
   /** Sets the value of "margin-right" */
-  void set marginRight(var value) {
+  void set marginRight(String value) {
     setProperty('margin-right', value, '');
   }
 
@@ -2960,7 +3188,7 @@
     getPropertyValue('${_browserPrefix}margin-start');
 
   /** Sets the value of "margin-start" */
-  void set marginStart(var value) {
+  void set marginStart(String value) {
     setProperty('${_browserPrefix}margin-start', value, '');
   }
 
@@ -2969,7 +3197,7 @@
     getPropertyValue('margin-top');
 
   /** Sets the value of "margin-top" */
-  void set marginTop(var value) {
+  void set marginTop(String value) {
     setProperty('margin-top', value, '');
   }
 
@@ -2978,7 +3206,7 @@
     getPropertyValue('${_browserPrefix}margin-top-collapse');
 
   /** Sets the value of "margin-top-collapse" */
-  void set marginTopCollapse(var value) {
+  void set marginTopCollapse(String value) {
     setProperty('${_browserPrefix}margin-top-collapse', value, '');
   }
 
@@ -2987,7 +3215,7 @@
     getPropertyValue('${_browserPrefix}marquee');
 
   /** Sets the value of "marquee" */
-  void set marquee(var value) {
+  void set marquee(String value) {
     setProperty('${_browserPrefix}marquee', value, '');
   }
 
@@ -2996,7 +3224,7 @@
     getPropertyValue('${_browserPrefix}marquee-direction');
 
   /** Sets the value of "marquee-direction" */
-  void set marqueeDirection(var value) {
+  void set marqueeDirection(String value) {
     setProperty('${_browserPrefix}marquee-direction', value, '');
   }
 
@@ -3005,7 +3233,7 @@
     getPropertyValue('${_browserPrefix}marquee-increment');
 
   /** Sets the value of "marquee-increment" */
-  void set marqueeIncrement(var value) {
+  void set marqueeIncrement(String value) {
     setProperty('${_browserPrefix}marquee-increment', value, '');
   }
 
@@ -3014,7 +3242,7 @@
     getPropertyValue('${_browserPrefix}marquee-repetition');
 
   /** Sets the value of "marquee-repetition" */
-  void set marqueeRepetition(var value) {
+  void set marqueeRepetition(String value) {
     setProperty('${_browserPrefix}marquee-repetition', value, '');
   }
 
@@ -3023,7 +3251,7 @@
     getPropertyValue('${_browserPrefix}marquee-speed');
 
   /** Sets the value of "marquee-speed" */
-  void set marqueeSpeed(var value) {
+  void set marqueeSpeed(String value) {
     setProperty('${_browserPrefix}marquee-speed', value, '');
   }
 
@@ -3032,7 +3260,7 @@
     getPropertyValue('${_browserPrefix}marquee-style');
 
   /** Sets the value of "marquee-style" */
-  void set marqueeStyle(var value) {
+  void set marqueeStyle(String value) {
     setProperty('${_browserPrefix}marquee-style', value, '');
   }
 
@@ -3041,7 +3269,7 @@
     getPropertyValue('${_browserPrefix}mask');
 
   /** Sets the value of "mask" */
-  void set mask(var value) {
+  void set mask(String value) {
     setProperty('${_browserPrefix}mask', value, '');
   }
 
@@ -3050,7 +3278,7 @@
     getPropertyValue('${_browserPrefix}mask-attachment');
 
   /** Sets the value of "mask-attachment" */
-  void set maskAttachment(var value) {
+  void set maskAttachment(String value) {
     setProperty('${_browserPrefix}mask-attachment', value, '');
   }
 
@@ -3059,7 +3287,7 @@
     getPropertyValue('${_browserPrefix}mask-box-image');
 
   /** Sets the value of "mask-box-image" */
-  void set maskBoxImage(var value) {
+  void set maskBoxImage(String value) {
     setProperty('${_browserPrefix}mask-box-image', value, '');
   }
 
@@ -3068,7 +3296,7 @@
     getPropertyValue('${_browserPrefix}mask-box-image-outset');
 
   /** Sets the value of "mask-box-image-outset" */
-  void set maskBoxImageOutset(var value) {
+  void set maskBoxImageOutset(String value) {
     setProperty('${_browserPrefix}mask-box-image-outset', value, '');
   }
 
@@ -3077,7 +3305,7 @@
     getPropertyValue('${_browserPrefix}mask-box-image-repeat');
 
   /** Sets the value of "mask-box-image-repeat" */
-  void set maskBoxImageRepeat(var value) {
+  void set maskBoxImageRepeat(String value) {
     setProperty('${_browserPrefix}mask-box-image-repeat', value, '');
   }
 
@@ -3086,7 +3314,7 @@
     getPropertyValue('${_browserPrefix}mask-box-image-slice');
 
   /** Sets the value of "mask-box-image-slice" */
-  void set maskBoxImageSlice(var value) {
+  void set maskBoxImageSlice(String value) {
     setProperty('${_browserPrefix}mask-box-image-slice', value, '');
   }
 
@@ -3095,7 +3323,7 @@
     getPropertyValue('${_browserPrefix}mask-box-image-source');
 
   /** Sets the value of "mask-box-image-source" */
-  void set maskBoxImageSource(var value) {
+  void set maskBoxImageSource(String value) {
     setProperty('${_browserPrefix}mask-box-image-source', value, '');
   }
 
@@ -3104,7 +3332,7 @@
     getPropertyValue('${_browserPrefix}mask-box-image-width');
 
   /** Sets the value of "mask-box-image-width" */
-  void set maskBoxImageWidth(var value) {
+  void set maskBoxImageWidth(String value) {
     setProperty('${_browserPrefix}mask-box-image-width', value, '');
   }
 
@@ -3113,7 +3341,7 @@
     getPropertyValue('${_browserPrefix}mask-clip');
 
   /** Sets the value of "mask-clip" */
-  void set maskClip(var value) {
+  void set maskClip(String value) {
     setProperty('${_browserPrefix}mask-clip', value, '');
   }
 
@@ -3122,7 +3350,7 @@
     getPropertyValue('${_browserPrefix}mask-composite');
 
   /** Sets the value of "mask-composite" */
-  void set maskComposite(var value) {
+  void set maskComposite(String value) {
     setProperty('${_browserPrefix}mask-composite', value, '');
   }
 
@@ -3131,7 +3359,7 @@
     getPropertyValue('${_browserPrefix}mask-image');
 
   /** Sets the value of "mask-image" */
-  void set maskImage(var value) {
+  void set maskImage(String value) {
     setProperty('${_browserPrefix}mask-image', value, '');
   }
 
@@ -3140,7 +3368,7 @@
     getPropertyValue('${_browserPrefix}mask-origin');
 
   /** Sets the value of "mask-origin" */
-  void set maskOrigin(var value) {
+  void set maskOrigin(String value) {
     setProperty('${_browserPrefix}mask-origin', value, '');
   }
 
@@ -3149,7 +3377,7 @@
     getPropertyValue('${_browserPrefix}mask-position');
 
   /** Sets the value of "mask-position" */
-  void set maskPosition(var value) {
+  void set maskPosition(String value) {
     setProperty('${_browserPrefix}mask-position', value, '');
   }
 
@@ -3158,7 +3386,7 @@
     getPropertyValue('${_browserPrefix}mask-position-x');
 
   /** Sets the value of "mask-position-x" */
-  void set maskPositionX(var value) {
+  void set maskPositionX(String value) {
     setProperty('${_browserPrefix}mask-position-x', value, '');
   }
 
@@ -3167,7 +3395,7 @@
     getPropertyValue('${_browserPrefix}mask-position-y');
 
   /** Sets the value of "mask-position-y" */
-  void set maskPositionY(var value) {
+  void set maskPositionY(String value) {
     setProperty('${_browserPrefix}mask-position-y', value, '');
   }
 
@@ -3176,7 +3404,7 @@
     getPropertyValue('${_browserPrefix}mask-repeat');
 
   /** Sets the value of "mask-repeat" */
-  void set maskRepeat(var value) {
+  void set maskRepeat(String value) {
     setProperty('${_browserPrefix}mask-repeat', value, '');
   }
 
@@ -3185,7 +3413,7 @@
     getPropertyValue('${_browserPrefix}mask-repeat-x');
 
   /** Sets the value of "mask-repeat-x" */
-  void set maskRepeatX(var value) {
+  void set maskRepeatX(String value) {
     setProperty('${_browserPrefix}mask-repeat-x', value, '');
   }
 
@@ -3194,7 +3422,7 @@
     getPropertyValue('${_browserPrefix}mask-repeat-y');
 
   /** Sets the value of "mask-repeat-y" */
-  void set maskRepeatY(var value) {
+  void set maskRepeatY(String value) {
     setProperty('${_browserPrefix}mask-repeat-y', value, '');
   }
 
@@ -3203,25 +3431,16 @@
     getPropertyValue('${_browserPrefix}mask-size');
 
   /** Sets the value of "mask-size" */
-  void set maskSize(var value) {
+  void set maskSize(String value) {
     setProperty('${_browserPrefix}mask-size', value, '');
   }
 
-  /** Gets the value of "match-nearest-mail-blockquote-color" */
-  String get matchNearestMailBlockquoteColor =>
-    getPropertyValue('${_browserPrefix}match-nearest-mail-blockquote-color');
-
-  /** Sets the value of "match-nearest-mail-blockquote-color" */
-  void set matchNearestMailBlockquoteColor(var value) {
-    setProperty('${_browserPrefix}match-nearest-mail-blockquote-color', value, '');
-  }
-
   /** Gets the value of "max-height" */
   String get maxHeight =>
     getPropertyValue('max-height');
 
   /** Sets the value of "max-height" */
-  void set maxHeight(var value) {
+  void set maxHeight(String value) {
     setProperty('max-height', value, '');
   }
 
@@ -3230,7 +3449,7 @@
     getPropertyValue('${_browserPrefix}max-logical-height');
 
   /** Sets the value of "max-logical-height" */
-  void set maxLogicalHeight(var value) {
+  void set maxLogicalHeight(String value) {
     setProperty('${_browserPrefix}max-logical-height', value, '');
   }
 
@@ -3239,7 +3458,7 @@
     getPropertyValue('${_browserPrefix}max-logical-width');
 
   /** Sets the value of "max-logical-width" */
-  void set maxLogicalWidth(var value) {
+  void set maxLogicalWidth(String value) {
     setProperty('${_browserPrefix}max-logical-width', value, '');
   }
 
@@ -3248,16 +3467,25 @@
     getPropertyValue('max-width');
 
   /** Sets the value of "max-width" */
-  void set maxWidth(var value) {
+  void set maxWidth(String value) {
     setProperty('max-width', value, '');
   }
 
+  /** Gets the value of "max-zoom" */
+  String get maxZoom =>
+    getPropertyValue('max-zoom');
+
+  /** Sets the value of "max-zoom" */
+  void set maxZoom(String value) {
+    setProperty('max-zoom', value, '');
+  }
+
   /** Gets the value of "min-height" */
   String get minHeight =>
     getPropertyValue('min-height');
 
   /** Sets the value of "min-height" */
-  void set minHeight(var value) {
+  void set minHeight(String value) {
     setProperty('min-height', value, '');
   }
 
@@ -3266,7 +3494,7 @@
     getPropertyValue('${_browserPrefix}min-logical-height');
 
   /** Sets the value of "min-logical-height" */
-  void set minLogicalHeight(var value) {
+  void set minLogicalHeight(String value) {
     setProperty('${_browserPrefix}min-logical-height', value, '');
   }
 
@@ -3275,7 +3503,7 @@
     getPropertyValue('${_browserPrefix}min-logical-width');
 
   /** Sets the value of "min-logical-width" */
-  void set minLogicalWidth(var value) {
+  void set minLogicalWidth(String value) {
     setProperty('${_browserPrefix}min-logical-width', value, '');
   }
 
@@ -3284,16 +3512,25 @@
     getPropertyValue('min-width');
 
   /** Sets the value of "min-width" */
-  void set minWidth(var value) {
+  void set minWidth(String value) {
     setProperty('min-width', value, '');
   }
 
+  /** Gets the value of "min-zoom" */
+  String get minZoom =>
+    getPropertyValue('min-zoom');
+
+  /** Sets the value of "min-zoom" */
+  void set minZoom(String value) {
+    setProperty('min-zoom', value, '');
+  }
+
   /** Gets the value of "nbsp-mode" */
   String get nbspMode =>
     getPropertyValue('${_browserPrefix}nbsp-mode');
 
   /** Sets the value of "nbsp-mode" */
-  void set nbspMode(var value) {
+  void set nbspMode(String value) {
     setProperty('${_browserPrefix}nbsp-mode', value, '');
   }
 
@@ -3302,16 +3539,34 @@
     getPropertyValue('opacity');
 
   /** Sets the value of "opacity" */
-  void set opacity(var value) {
+  void set opacity(String value) {
     setProperty('opacity', value, '');
   }
 
+  /** Gets the value of "order" */
+  String get order =>
+    getPropertyValue('${_browserPrefix}order');
+
+  /** Sets the value of "order" */
+  void set order(String value) {
+    setProperty('${_browserPrefix}order', value, '');
+  }
+
+  /** Gets the value of "orientation" */
+  String get orientation =>
+    getPropertyValue('orientation');
+
+  /** Sets the value of "orientation" */
+  void set orientation(String value) {
+    setProperty('orientation', value, '');
+  }
+
   /** Gets the value of "orphans" */
   String get orphans =>
     getPropertyValue('orphans');
 
   /** Sets the value of "orphans" */
-  void set orphans(var value) {
+  void set orphans(String value) {
     setProperty('orphans', value, '');
   }
 
@@ -3320,7 +3575,7 @@
     getPropertyValue('outline');
 
   /** Sets the value of "outline" */
-  void set outline(var value) {
+  void set outline(String value) {
     setProperty('outline', value, '');
   }
 
@@ -3329,7 +3584,7 @@
     getPropertyValue('outline-color');
 
   /** Sets the value of "outline-color" */
-  void set outlineColor(var value) {
+  void set outlineColor(String value) {
     setProperty('outline-color', value, '');
   }
 
@@ -3338,7 +3593,7 @@
     getPropertyValue('outline-offset');
 
   /** Sets the value of "outline-offset" */
-  void set outlineOffset(var value) {
+  void set outlineOffset(String value) {
     setProperty('outline-offset', value, '');
   }
 
@@ -3347,7 +3602,7 @@
     getPropertyValue('outline-style');
 
   /** Sets the value of "outline-style" */
-  void set outlineStyle(var value) {
+  void set outlineStyle(String value) {
     setProperty('outline-style', value, '');
   }
 
@@ -3356,7 +3611,7 @@
     getPropertyValue('outline-width');
 
   /** Sets the value of "outline-width" */
-  void set outlineWidth(var value) {
+  void set outlineWidth(String value) {
     setProperty('outline-width', value, '');
   }
 
@@ -3365,16 +3620,34 @@
     getPropertyValue('overflow');
 
   /** Sets the value of "overflow" */
-  void set overflow(var value) {
+  void set overflow(String value) {
     setProperty('overflow', value, '');
   }
 
+  /** Gets the value of "overflow-scrolling" */
+  String get overflowScrolling =>
+    getPropertyValue('${_browserPrefix}overflow-scrolling');
+
+  /** Sets the value of "overflow-scrolling" */
+  void set overflowScrolling(String value) {
+    setProperty('${_browserPrefix}overflow-scrolling', value, '');
+  }
+
+  /** Gets the value of "overflow-wrap" */
+  String get overflowWrap =>
+    getPropertyValue('overflow-wrap');
+
+  /** Sets the value of "overflow-wrap" */
+  void set overflowWrap(String value) {
+    setProperty('overflow-wrap', value, '');
+  }
+
   /** Gets the value of "overflow-x" */
   String get overflowX =>
     getPropertyValue('overflow-x');
 
   /** Sets the value of "overflow-x" */
-  void set overflowX(var value) {
+  void set overflowX(String value) {
     setProperty('overflow-x', value, '');
   }
 
@@ -3383,7 +3656,7 @@
     getPropertyValue('overflow-y');
 
   /** Sets the value of "overflow-y" */
-  void set overflowY(var value) {
+  void set overflowY(String value) {
     setProperty('overflow-y', value, '');
   }
 
@@ -3392,7 +3665,7 @@
     getPropertyValue('padding');
 
   /** Sets the value of "padding" */
-  void set padding(var value) {
+  void set padding(String value) {
     setProperty('padding', value, '');
   }
 
@@ -3401,7 +3674,7 @@
     getPropertyValue('${_browserPrefix}padding-after');
 
   /** Sets the value of "padding-after" */
-  void set paddingAfter(var value) {
+  void set paddingAfter(String value) {
     setProperty('${_browserPrefix}padding-after', value, '');
   }
 
@@ -3410,7 +3683,7 @@
     getPropertyValue('${_browserPrefix}padding-before');
 
   /** Sets the value of "padding-before" */
-  void set paddingBefore(var value) {
+  void set paddingBefore(String value) {
     setProperty('${_browserPrefix}padding-before', value, '');
   }
 
@@ -3419,7 +3692,7 @@
     getPropertyValue('padding-bottom');
 
   /** Sets the value of "padding-bottom" */
-  void set paddingBottom(var value) {
+  void set paddingBottom(String value) {
     setProperty('padding-bottom', value, '');
   }
 
@@ -3428,7 +3701,7 @@
     getPropertyValue('${_browserPrefix}padding-end');
 
   /** Sets the value of "padding-end" */
-  void set paddingEnd(var value) {
+  void set paddingEnd(String value) {
     setProperty('${_browserPrefix}padding-end', value, '');
   }
 
@@ -3437,7 +3710,7 @@
     getPropertyValue('padding-left');
 
   /** Sets the value of "padding-left" */
-  void set paddingLeft(var value) {
+  void set paddingLeft(String value) {
     setProperty('padding-left', value, '');
   }
 
@@ -3446,7 +3719,7 @@
     getPropertyValue('padding-right');
 
   /** Sets the value of "padding-right" */
-  void set paddingRight(var value) {
+  void set paddingRight(String value) {
     setProperty('padding-right', value, '');
   }
 
@@ -3455,7 +3728,7 @@
     getPropertyValue('${_browserPrefix}padding-start');
 
   /** Sets the value of "padding-start" */
-  void set paddingStart(var value) {
+  void set paddingStart(String value) {
     setProperty('${_browserPrefix}padding-start', value, '');
   }
 
@@ -3464,7 +3737,7 @@
     getPropertyValue('padding-top');
 
   /** Sets the value of "padding-top" */
-  void set paddingTop(var value) {
+  void set paddingTop(String value) {
     setProperty('padding-top', value, '');
   }
 
@@ -3473,7 +3746,7 @@
     getPropertyValue('page');
 
   /** Sets the value of "page" */
-  void set page(var value) {
+  void set page(String value) {
     setProperty('page', value, '');
   }
 
@@ -3482,7 +3755,7 @@
     getPropertyValue('page-break-after');
 
   /** Sets the value of "page-break-after" */
-  void set pageBreakAfter(var value) {
+  void set pageBreakAfter(String value) {
     setProperty('page-break-after', value, '');
   }
 
@@ -3491,7 +3764,7 @@
     getPropertyValue('page-break-before');
 
   /** Sets the value of "page-break-before" */
-  void set pageBreakBefore(var value) {
+  void set pageBreakBefore(String value) {
     setProperty('page-break-before', value, '');
   }
 
@@ -3500,7 +3773,7 @@
     getPropertyValue('page-break-inside');
 
   /** Sets the value of "page-break-inside" */
-  void set pageBreakInside(var value) {
+  void set pageBreakInside(String value) {
     setProperty('page-break-inside', value, '');
   }
 
@@ -3509,7 +3782,7 @@
     getPropertyValue('${_browserPrefix}perspective');
 
   /** Sets the value of "perspective" */
-  void set perspective(var value) {
+  void set perspective(String value) {
     setProperty('${_browserPrefix}perspective', value, '');
   }
 
@@ -3518,7 +3791,7 @@
     getPropertyValue('${_browserPrefix}perspective-origin');
 
   /** Sets the value of "perspective-origin" */
-  void set perspectiveOrigin(var value) {
+  void set perspectiveOrigin(String value) {
     setProperty('${_browserPrefix}perspective-origin', value, '');
   }
 
@@ -3527,7 +3800,7 @@
     getPropertyValue('${_browserPrefix}perspective-origin-x');
 
   /** Sets the value of "perspective-origin-x" */
-  void set perspectiveOriginX(var value) {
+  void set perspectiveOriginX(String value) {
     setProperty('${_browserPrefix}perspective-origin-x', value, '');
   }
 
@@ -3536,7 +3809,7 @@
     getPropertyValue('${_browserPrefix}perspective-origin-y');
 
   /** Sets the value of "perspective-origin-y" */
-  void set perspectiveOriginY(var value) {
+  void set perspectiveOriginY(String value) {
     setProperty('${_browserPrefix}perspective-origin-y', value, '');
   }
 
@@ -3545,7 +3818,7 @@
     getPropertyValue('pointer-events');
 
   /** Sets the value of "pointer-events" */
-  void set pointerEvents(var value) {
+  void set pointerEvents(String value) {
     setProperty('pointer-events', value, '');
   }
 
@@ -3554,16 +3827,25 @@
     getPropertyValue('position');
 
   /** Sets the value of "position" */
-  void set position(var value) {
+  void set position(String value) {
     setProperty('position', value, '');
   }
 
+  /** Gets the value of "print-color-adjust" */
+  String get printColorAdjust =>
+    getPropertyValue('${_browserPrefix}print-color-adjust');
+
+  /** Sets the value of "print-color-adjust" */
+  void set printColorAdjust(String value) {
+    setProperty('${_browserPrefix}print-color-adjust', value, '');
+  }
+
   /** Gets the value of "quotes" */
   String get quotes =>
     getPropertyValue('quotes');
 
   /** Sets the value of "quotes" */
-  void set quotes(var value) {
+  void set quotes(String value) {
     setProperty('quotes', value, '');
   }
 
@@ -3572,7 +3854,7 @@
     getPropertyValue('${_browserPrefix}region-break-after');
 
   /** Sets the value of "region-break-after" */
-  void set regionBreakAfter(var value) {
+  void set regionBreakAfter(String value) {
     setProperty('${_browserPrefix}region-break-after', value, '');
   }
 
@@ -3581,7 +3863,7 @@
     getPropertyValue('${_browserPrefix}region-break-before');
 
   /** Sets the value of "region-break-before" */
-  void set regionBreakBefore(var value) {
+  void set regionBreakBefore(String value) {
     setProperty('${_browserPrefix}region-break-before', value, '');
   }
 
@@ -3590,7 +3872,7 @@
     getPropertyValue('${_browserPrefix}region-break-inside');
 
   /** Sets the value of "region-break-inside" */
-  void set regionBreakInside(var value) {
+  void set regionBreakInside(String value) {
     setProperty('${_browserPrefix}region-break-inside', value, '');
   }
 
@@ -3599,7 +3881,7 @@
     getPropertyValue('${_browserPrefix}region-overflow');
 
   /** Sets the value of "region-overflow" */
-  void set regionOverflow(var value) {
+  void set regionOverflow(String value) {
     setProperty('${_browserPrefix}region-overflow', value, '');
   }
 
@@ -3608,7 +3890,7 @@
     getPropertyValue('resize');
 
   /** Sets the value of "resize" */
-  void set resize(var value) {
+  void set resize(String value) {
     setProperty('resize', value, '');
   }
 
@@ -3617,7 +3899,7 @@
     getPropertyValue('right');
 
   /** Sets the value of "right" */
-  void set right(var value) {
+  void set right(String value) {
     setProperty('right', value, '');
   }
 
@@ -3626,16 +3908,52 @@
     getPropertyValue('${_browserPrefix}rtl-ordering');
 
   /** Sets the value of "rtl-ordering" */
-  void set rtlOrdering(var value) {
+  void set rtlOrdering(String value) {
     setProperty('${_browserPrefix}rtl-ordering', value, '');
   }
 
+  /** Gets the value of "shape-inside" */
+  String get shapeInside =>
+    getPropertyValue('${_browserPrefix}shape-inside');
+
+  /** Sets the value of "shape-inside" */
+  void set shapeInside(String value) {
+    setProperty('${_browserPrefix}shape-inside', value, '');
+  }
+
+  /** Gets the value of "shape-margin" */
+  String get shapeMargin =>
+    getPropertyValue('${_browserPrefix}shape-margin');
+
+  /** Sets the value of "shape-margin" */
+  void set shapeMargin(String value) {
+    setProperty('${_browserPrefix}shape-margin', value, '');
+  }
+
+  /** Gets the value of "shape-outside" */
+  String get shapeOutside =>
+    getPropertyValue('${_browserPrefix}shape-outside');
+
+  /** Sets the value of "shape-outside" */
+  void set shapeOutside(String value) {
+    setProperty('${_browserPrefix}shape-outside', value, '');
+  }
+
+  /** Gets the value of "shape-padding" */
+  String get shapePadding =>
+    getPropertyValue('${_browserPrefix}shape-padding');
+
+  /** Sets the value of "shape-padding" */
+  void set shapePadding(String value) {
+    setProperty('${_browserPrefix}shape-padding', value, '');
+  }
+
   /** Gets the value of "size" */
   String get size =>
     getPropertyValue('size');
 
   /** Sets the value of "size" */
-  void set size(var value) {
+  void set size(String value) {
     setProperty('size', value, '');
   }
 
@@ -3644,7 +3962,7 @@
     getPropertyValue('speak');
 
   /** Sets the value of "speak" */
-  void set speak(var value) {
+  void set speak(String value) {
     setProperty('speak', value, '');
   }
 
@@ -3653,16 +3971,25 @@
     getPropertyValue('src');
 
   /** Sets the value of "src" */
-  void set src(var value) {
+  void set src(String value) {
     setProperty('src', value, '');
   }
 
+  /** Gets the value of "tab-size" */
+  String get tabSize =>
+    getPropertyValue('tab-size');
+
+  /** Sets the value of "tab-size" */
+  void set tabSize(String value) {
+    setProperty('tab-size', value, '');
+  }
+
   /** Gets the value of "table-layout" */
   String get tableLayout =>
     getPropertyValue('table-layout');
 
   /** Sets the value of "table-layout" */
-  void set tableLayout(var value) {
+  void set tableLayout(String value) {
     setProperty('table-layout', value, '');
   }
 
@@ -3671,7 +3998,7 @@
     getPropertyValue('${_browserPrefix}tap-highlight-color');
 
   /** Sets the value of "tap-highlight-color" */
-  void set tapHighlightColor(var value) {
+  void set tapHighlightColor(String value) {
     setProperty('${_browserPrefix}tap-highlight-color', value, '');
   }
 
@@ -3680,16 +4007,25 @@
     getPropertyValue('text-align');
 
   /** Sets the value of "text-align" */
-  void set textAlign(var value) {
+  void set textAlign(String value) {
     setProperty('text-align', value, '');
   }
 
+  /** Gets the value of "text-align-last" */
+  String get textAlignLast =>
+    getPropertyValue('${_browserPrefix}text-align-last');
+
+  /** Sets the value of "text-align-last" */
+  void set textAlignLast(String value) {
+    setProperty('${_browserPrefix}text-align-last', value, '');
+  }
+
   /** Gets the value of "text-combine" */
   String get textCombine =>
     getPropertyValue('${_browserPrefix}text-combine');
 
   /** Sets the value of "text-combine" */
-  void set textCombine(var value) {
+  void set textCombine(String value) {
     setProperty('${_browserPrefix}text-combine', value, '');
   }
 
@@ -3698,16 +4034,34 @@
     getPropertyValue('text-decoration');
 
   /** Sets the value of "text-decoration" */
-  void set textDecoration(var value) {
+  void set textDecoration(String value) {
     setProperty('text-decoration', value, '');
   }
 
+  /** Gets the value of "text-decoration-line" */
+  String get textDecorationLine =>
+    getPropertyValue('${_browserPrefix}text-decoration-line');
+
+  /** Sets the value of "text-decoration-line" */
+  void set textDecorationLine(String value) {
+    setProperty('${_browserPrefix}text-decoration-line', value, '');
+  }
+
+  /** Gets the value of "text-decoration-style" */
+  String get textDecorationStyle =>
+    getPropertyValue('${_browserPrefix}text-decoration-style');
+
+  /** Sets the value of "text-decoration-style" */
+  void set textDecorationStyle(String value) {
+    setProperty('${_browserPrefix}text-decoration-style', value, '');
+  }
+
   /** Gets the value of "text-decorations-in-effect" */
   String get textDecorationsInEffect =>
     getPropertyValue('${_browserPrefix}text-decorations-in-effect');
 
   /** Sets the value of "text-decorations-in-effect" */
-  void set textDecorationsInEffect(var value) {
+  void set textDecorationsInEffect(String value) {
     setProperty('${_browserPrefix}text-decorations-in-effect', value, '');
   }
 
@@ -3716,7 +4070,7 @@
     getPropertyValue('${_browserPrefix}text-emphasis');
 
   /** Sets the value of "text-emphasis" */
-  void set textEmphasis(var value) {
+  void set textEmphasis(String value) {
     setProperty('${_browserPrefix}text-emphasis', value, '');
   }
 
@@ -3725,7 +4079,7 @@
     getPropertyValue('${_browserPrefix}text-emphasis-color');
 
   /** Sets the value of "text-emphasis-color" */
-  void set textEmphasisColor(var value) {
+  void set textEmphasisColor(String value) {
     setProperty('${_browserPrefix}text-emphasis-color', value, '');
   }
 
@@ -3734,7 +4088,7 @@
     getPropertyValue('${_browserPrefix}text-emphasis-position');
 
   /** Sets the value of "text-emphasis-position" */
-  void set textEmphasisPosition(var value) {
+  void set textEmphasisPosition(String value) {
     setProperty('${_browserPrefix}text-emphasis-position', value, '');
   }
 
@@ -3743,7 +4097,7 @@
     getPropertyValue('${_browserPrefix}text-emphasis-style');
 
   /** Sets the value of "text-emphasis-style" */
-  void set textEmphasisStyle(var value) {
+  void set textEmphasisStyle(String value) {
     setProperty('${_browserPrefix}text-emphasis-style', value, '');
   }
 
@@ -3752,7 +4106,7 @@
     getPropertyValue('${_browserPrefix}text-fill-color');
 
   /** Sets the value of "text-fill-color" */
-  void set textFillColor(var value) {
+  void set textFillColor(String value) {
     setProperty('${_browserPrefix}text-fill-color', value, '');
   }
 
@@ -3761,7 +4115,7 @@
     getPropertyValue('text-indent');
 
   /** Sets the value of "text-indent" */
-  void set textIndent(var value) {
+  void set textIndent(String value) {
     setProperty('text-indent', value, '');
   }
 
@@ -3770,7 +4124,7 @@
     getPropertyValue('text-line-through');
 
   /** Sets the value of "text-line-through" */
-  void set textLineThrough(var value) {
+  void set textLineThrough(String value) {
     setProperty('text-line-through', value, '');
   }
 
@@ -3779,7 +4133,7 @@
     getPropertyValue('text-line-through-color');
 
   /** Sets the value of "text-line-through-color" */
-  void set textLineThroughColor(var value) {
+  void set textLineThroughColor(String value) {
     setProperty('text-line-through-color', value, '');
   }
 
@@ -3788,7 +4142,7 @@
     getPropertyValue('text-line-through-mode');
 
   /** Sets the value of "text-line-through-mode" */
-  void set textLineThroughMode(var value) {
+  void set textLineThroughMode(String value) {
     setProperty('text-line-through-mode', value, '');
   }
 
@@ -3797,7 +4151,7 @@
     getPropertyValue('text-line-through-style');
 
   /** Sets the value of "text-line-through-style" */
-  void set textLineThroughStyle(var value) {
+  void set textLineThroughStyle(String value) {
     setProperty('text-line-through-style', value, '');
   }
 
@@ -3806,7 +4160,7 @@
     getPropertyValue('text-line-through-width');
 
   /** Sets the value of "text-line-through-width" */
-  void set textLineThroughWidth(var value) {
+  void set textLineThroughWidth(String value) {
     setProperty('text-line-through-width', value, '');
   }
 
@@ -3815,7 +4169,7 @@
     getPropertyValue('${_browserPrefix}text-orientation');
 
   /** Sets the value of "text-orientation" */
-  void set textOrientation(var value) {
+  void set textOrientation(String value) {
     setProperty('${_browserPrefix}text-orientation', value, '');
   }
 
@@ -3824,7 +4178,7 @@
     getPropertyValue('text-overflow');
 
   /** Sets the value of "text-overflow" */
-  void set textOverflow(var value) {
+  void set textOverflow(String value) {
     setProperty('text-overflow', value, '');
   }
 
@@ -3833,7 +4187,7 @@
     getPropertyValue('text-overline');
 
   /** Sets the value of "text-overline" */
-  void set textOverline(var value) {
+  void set textOverline(String value) {
     setProperty('text-overline', value, '');
   }
 
@@ -3842,7 +4196,7 @@
     getPropertyValue('text-overline-color');
 
   /** Sets the value of "text-overline-color" */
-  void set textOverlineColor(var value) {
+  void set textOverlineColor(String value) {
     setProperty('text-overline-color', value, '');
   }
 
@@ -3851,7 +4205,7 @@
     getPropertyValue('text-overline-mode');
 
   /** Sets the value of "text-overline-mode" */
-  void set textOverlineMode(var value) {
+  void set textOverlineMode(String value) {
     setProperty('text-overline-mode', value, '');
   }
 
@@ -3860,7 +4214,7 @@
     getPropertyValue('text-overline-style');
 
   /** Sets the value of "text-overline-style" */
-  void set textOverlineStyle(var value) {
+  void set textOverlineStyle(String value) {
     setProperty('text-overline-style', value, '');
   }
 
@@ -3869,7 +4223,7 @@
     getPropertyValue('text-overline-width');
 
   /** Sets the value of "text-overline-width" */
-  void set textOverlineWidth(var value) {
+  void set textOverlineWidth(String value) {
     setProperty('text-overline-width', value, '');
   }
 
@@ -3878,7 +4232,7 @@
     getPropertyValue('text-rendering');
 
   /** Sets the value of "text-rendering" */
-  void set textRendering(var value) {
+  void set textRendering(String value) {
     setProperty('text-rendering', value, '');
   }
 
@@ -3887,7 +4241,7 @@
     getPropertyValue('${_browserPrefix}text-security');
 
   /** Sets the value of "text-security" */
-  void set textSecurity(var value) {
+  void set textSecurity(String value) {
     setProperty('${_browserPrefix}text-security', value, '');
   }
 
@@ -3896,7 +4250,7 @@
     getPropertyValue('text-shadow');
 
   /** Sets the value of "text-shadow" */
-  void set textShadow(var value) {
+  void set textShadow(String value) {
     setProperty('text-shadow', value, '');
   }
 
@@ -3905,7 +4259,7 @@
     getPropertyValue('${_browserPrefix}text-size-adjust');
 
   /** Sets the value of "text-size-adjust" */
-  void set textSizeAdjust(var value) {
+  void set textSizeAdjust(String value) {
     setProperty('${_browserPrefix}text-size-adjust', value, '');
   }
 
@@ -3914,7 +4268,7 @@
     getPropertyValue('${_browserPrefix}text-stroke');
 
   /** Sets the value of "text-stroke" */
-  void set textStroke(var value) {
+  void set textStroke(String value) {
     setProperty('${_browserPrefix}text-stroke', value, '');
   }
 
@@ -3923,7 +4277,7 @@
     getPropertyValue('${_browserPrefix}text-stroke-color');
 
   /** Sets the value of "text-stroke-color" */
-  void set textStrokeColor(var value) {
+  void set textStrokeColor(String value) {
     setProperty('${_browserPrefix}text-stroke-color', value, '');
   }
 
@@ -3932,7 +4286,7 @@
     getPropertyValue('${_browserPrefix}text-stroke-width');
 
   /** Sets the value of "text-stroke-width" */
-  void set textStrokeWidth(var value) {
+  void set textStrokeWidth(String value) {
     setProperty('${_browserPrefix}text-stroke-width', value, '');
   }
 
@@ -3941,7 +4295,7 @@
     getPropertyValue('text-transform');
 
   /** Sets the value of "text-transform" */
-  void set textTransform(var value) {
+  void set textTransform(String value) {
     setProperty('text-transform', value, '');
   }
 
@@ -3950,7 +4304,7 @@
     getPropertyValue('text-underline');
 
   /** Sets the value of "text-underline" */
-  void set textUnderline(var value) {
+  void set textUnderline(String value) {
     setProperty('text-underline', value, '');
   }
 
@@ -3959,7 +4313,7 @@
     getPropertyValue('text-underline-color');
 
   /** Sets the value of "text-underline-color" */
-  void set textUnderlineColor(var value) {
+  void set textUnderlineColor(String value) {
     setProperty('text-underline-color', value, '');
   }
 
@@ -3968,7 +4322,7 @@
     getPropertyValue('text-underline-mode');
 
   /** Sets the value of "text-underline-mode" */
-  void set textUnderlineMode(var value) {
+  void set textUnderlineMode(String value) {
     setProperty('text-underline-mode', value, '');
   }
 
@@ -3977,7 +4331,7 @@
     getPropertyValue('text-underline-style');
 
   /** Sets the value of "text-underline-style" */
-  void set textUnderlineStyle(var value) {
+  void set textUnderlineStyle(String value) {
     setProperty('text-underline-style', value, '');
   }
 
@@ -3986,7 +4340,7 @@
     getPropertyValue('text-underline-width');
 
   /** Sets the value of "text-underline-width" */
-  void set textUnderlineWidth(var value) {
+  void set textUnderlineWidth(String value) {
     setProperty('text-underline-width', value, '');
   }
 
@@ -3995,7 +4349,7 @@
     getPropertyValue('top');
 
   /** Sets the value of "top" */
-  void set top(var value) {
+  void set top(String value) {
     setProperty('top', value, '');
   }
 
@@ -4004,7 +4358,7 @@
     getPropertyValue('${_browserPrefix}transform');
 
   /** Sets the value of "transform" */
-  void set transform(var value) {
+  void set transform(String value) {
     setProperty('${_browserPrefix}transform', value, '');
   }
 
@@ -4013,7 +4367,7 @@
     getPropertyValue('${_browserPrefix}transform-origin');
 
   /** Sets the value of "transform-origin" */
-  void set transformOrigin(var value) {
+  void set transformOrigin(String value) {
     setProperty('${_browserPrefix}transform-origin', value, '');
   }
 
@@ -4022,7 +4376,7 @@
     getPropertyValue('${_browserPrefix}transform-origin-x');
 
   /** Sets the value of "transform-origin-x" */
-  void set transformOriginX(var value) {
+  void set transformOriginX(String value) {
     setProperty('${_browserPrefix}transform-origin-x', value, '');
   }
 
@@ -4031,7 +4385,7 @@
     getPropertyValue('${_browserPrefix}transform-origin-y');
 
   /** Sets the value of "transform-origin-y" */
-  void set transformOriginY(var value) {
+  void set transformOriginY(String value) {
     setProperty('${_browserPrefix}transform-origin-y', value, '');
   }
 
@@ -4040,7 +4394,7 @@
     getPropertyValue('${_browserPrefix}transform-origin-z');
 
   /** Sets the value of "transform-origin-z" */
-  void set transformOriginZ(var value) {
+  void set transformOriginZ(String value) {
     setProperty('${_browserPrefix}transform-origin-z', value, '');
   }
 
@@ -4049,7 +4403,7 @@
     getPropertyValue('${_browserPrefix}transform-style');
 
   /** Sets the value of "transform-style" */
-  void set transformStyle(var value) {
+  void set transformStyle(String value) {
     setProperty('${_browserPrefix}transform-style', value, '');
   }
 
@@ -4058,7 +4412,7 @@
     getPropertyValue('${_browserPrefix}transition');
 
   /** Sets the value of "transition" */
-  void set transition(var value) {
+  void set transition(String value) {
     setProperty('${_browserPrefix}transition', value, '');
   }
 
@@ -4067,7 +4421,7 @@
     getPropertyValue('${_browserPrefix}transition-delay');
 
   /** Sets the value of "transition-delay" */
-  void set transitionDelay(var value) {
+  void set transitionDelay(String value) {
     setProperty('${_browserPrefix}transition-delay', value, '');
   }
 
@@ -4076,7 +4430,7 @@
     getPropertyValue('${_browserPrefix}transition-duration');
 
   /** Sets the value of "transition-duration" */
-  void set transitionDuration(var value) {
+  void set transitionDuration(String value) {
     setProperty('${_browserPrefix}transition-duration', value, '');
   }
 
@@ -4085,7 +4439,7 @@
     getPropertyValue('${_browserPrefix}transition-property');
 
   /** Sets the value of "transition-property" */
-  void set transitionProperty(var value) {
+  void set transitionProperty(String value) {
     setProperty('${_browserPrefix}transition-property', value, '');
   }
 
@@ -4094,7 +4448,7 @@
     getPropertyValue('${_browserPrefix}transition-timing-function');
 
   /** Sets the value of "transition-timing-function" */
-  void set transitionTimingFunction(var value) {
+  void set transitionTimingFunction(String value) {
     setProperty('${_browserPrefix}transition-timing-function', value, '');
   }
 
@@ -4103,7 +4457,7 @@
     getPropertyValue('unicode-bidi');
 
   /** Sets the value of "unicode-bidi" */
-  void set unicodeBidi(var value) {
+  void set unicodeBidi(String value) {
     setProperty('unicode-bidi', value, '');
   }
 
@@ -4112,7 +4466,7 @@
     getPropertyValue('unicode-range');
 
   /** Sets the value of "unicode-range" */
-  void set unicodeRange(var value) {
+  void set unicodeRange(String value) {
     setProperty('unicode-range', value, '');
   }
 
@@ -4121,7 +4475,7 @@
     getPropertyValue('${_browserPrefix}user-drag');
 
   /** Sets the value of "user-drag" */
-  void set userDrag(var value) {
+  void set userDrag(String value) {
     setProperty('${_browserPrefix}user-drag', value, '');
   }
 
@@ -4130,7 +4484,7 @@
     getPropertyValue('${_browserPrefix}user-modify');
 
   /** Sets the value of "user-modify" */
-  void set userModify(var value) {
+  void set userModify(String value) {
     setProperty('${_browserPrefix}user-modify', value, '');
   }
 
@@ -4139,16 +4493,25 @@
     getPropertyValue('${_browserPrefix}user-select');
 
   /** Sets the value of "user-select" */
-  void set userSelect(var value) {
+  void set userSelect(String value) {
     setProperty('${_browserPrefix}user-select', value, '');
   }
 
+  /** Gets the value of "user-zoom" */
+  String get userZoom =>
+    getPropertyValue('user-zoom');
+
+  /** Sets the value of "user-zoom" */
+  void set userZoom(String value) {
+    setProperty('user-zoom', value, '');
+  }
+
   /** Gets the value of "vertical-align" */
   String get verticalAlign =>
     getPropertyValue('vertical-align');
 
   /** Sets the value of "vertical-align" */
-  void set verticalAlign(var value) {
+  void set verticalAlign(String value) {
     setProperty('vertical-align', value, '');
   }
 
@@ -4157,7 +4520,7 @@
     getPropertyValue('visibility');
 
   /** Sets the value of "visibility" */
-  void set visibility(var value) {
+  void set visibility(String value) {
     setProperty('visibility', value, '');
   }
 
@@ -4166,7 +4529,7 @@
     getPropertyValue('white-space');
 
   /** Sets the value of "white-space" */
-  void set whiteSpace(var value) {
+  void set whiteSpace(String value) {
     setProperty('white-space', value, '');
   }
 
@@ -4175,7 +4538,7 @@
     getPropertyValue('widows');
 
   /** Sets the value of "widows" */
-  void set widows(var value) {
+  void set widows(String value) {
     setProperty('widows', value, '');
   }
 
@@ -4184,7 +4547,7 @@
     getPropertyValue('width');
 
   /** Sets the value of "width" */
-  void set width(var value) {
+  void set width(String value) {
     setProperty('width', value, '');
   }
 
@@ -4193,7 +4556,7 @@
     getPropertyValue('word-break');
 
   /** Sets the value of "word-break" */
-  void set wordBreak(var value) {
+  void set wordBreak(String value) {
     setProperty('word-break', value, '');
   }
 
@@ -4202,7 +4565,7 @@
     getPropertyValue('word-spacing');
 
   /** Sets the value of "word-spacing" */
-  void set wordSpacing(var value) {
+  void set wordSpacing(String value) {
     setProperty('word-spacing', value, '');
   }
 
@@ -4211,17 +4574,35 @@
     getPropertyValue('word-wrap');
 
   /** Sets the value of "word-wrap" */
-  void set wordWrap(var value) {
+  void set wordWrap(String value) {
     setProperty('word-wrap', value, '');
   }
 
-  /** Gets the value of "wrap-shape" */
-  String get wrapShape =>
-    getPropertyValue('${_browserPrefix}wrap-shape');
+  /** Gets the value of "wrap" */
+  String get wrap =>
+    getPropertyValue('${_browserPrefix}wrap');
 
-  /** Sets the value of "wrap-shape" */
-  void set wrapShape(var value) {
-    setProperty('${_browserPrefix}wrap-shape', value, '');
+  /** Sets the value of "wrap" */
+  void set wrap(String value) {
+    setProperty('${_browserPrefix}wrap', value, '');
+  }
+
+  /** Gets the value of "wrap-flow" */
+  String get wrapFlow =>
+    getPropertyValue('${_browserPrefix}wrap-flow');
+
+  /** Sets the value of "wrap-flow" */
+  void set wrapFlow(String value) {
+    setProperty('${_browserPrefix}wrap-flow', value, '');
+  }
+
+  /** Gets the value of "wrap-through" */
+  String get wrapThrough =>
+    getPropertyValue('${_browserPrefix}wrap-through');
+
+  /** Sets the value of "wrap-through" */
+  void set wrapThrough(String value) {
+    setProperty('${_browserPrefix}wrap-through', value, '');
   }
 
   /** Gets the value of "writing-mode" */
@@ -4229,7 +4610,7 @@
     getPropertyValue('${_browserPrefix}writing-mode');
 
   /** Sets the value of "writing-mode" */
-  void set writingMode(var value) {
+  void set writingMode(String value) {
     setProperty('${_browserPrefix}writing-mode', value, '');
   }
 
@@ -4238,7 +4619,7 @@
     getPropertyValue('z-index');
 
   /** Sets the value of "z-index" */
-  void set zIndex(var value) {
+  void set zIndex(String value) {
     setProperty('z-index', value, '');
   }
 
@@ -4247,7 +4628,7 @@
     getPropertyValue('zoom');
 
   /** Sets the value of "zoom" */
-  void set zoom(var value) {
+  void set zoom(String value) {
     setProperty('zoom', value, '');
   }
 }
@@ -4256,13 +4637,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName CSSStyleRule
+/// @domName CSSStyleRule; @docsEditable true
 class CSSStyleRule extends CSSRule native "*CSSStyleRule" {
 
-  /** @domName CSSStyleRule.selectorText */
+  /// @domName CSSStyleRule.selectorText; @docsEditable true
   String selectorText;
 
-  /** @domName CSSStyleRule.style */
+  /// @domName CSSStyleRule.style; @docsEditable true
   final CSSStyleDeclaration style;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4270,28 +4651,30 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName CSSStyleSheet
+/// @domName CSSStyleSheet; @docsEditable true
 class CSSStyleSheet extends StyleSheet native "*CSSStyleSheet" {
 
-  /** @domName CSSStyleSheet.cssRules */
+  /// @domName CSSStyleSheet.cssRules; @docsEditable true
+  @Returns('_CSSRuleList') @Creates('_CSSRuleList')
   final List<CSSRule> cssRules;
 
-  /** @domName CSSStyleSheet.ownerRule */
+  /// @domName CSSStyleSheet.ownerRule; @docsEditable true
   final CSSRule ownerRule;
 
-  /** @domName CSSStyleSheet.rules */
+  /// @domName CSSStyleSheet.rules; @docsEditable true
+  @Returns('_CSSRuleList') @Creates('_CSSRuleList')
   final List<CSSRule> rules;
 
-  /** @domName CSSStyleSheet.addRule */
+  /// @domName CSSStyleSheet.addRule; @docsEditable true
   int addRule(String selector, String style, [int index]) native;
 
-  /** @domName CSSStyleSheet.deleteRule */
+  /// @domName CSSStyleSheet.deleteRule; @docsEditable true
   void deleteRule(int index) native;
 
-  /** @domName CSSStyleSheet.insertRule */
+  /// @domName CSSStyleSheet.insertRule; @docsEditable true
   int insertRule(String rule, int index) native;
 
-  /** @domName CSSStyleSheet.removeRule */
+  /// @domName CSSStyleSheet.removeRule; @docsEditable true
   void removeRule(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4299,7 +4682,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WebKitCSSTransformValue
+/// @domName WebKitCSSTransformValue; @docsEditable true
 class CSSTransformValue extends _CSSValueList native "*WebKitCSSTransformValue" {
 
   static const int CSS_MATRIX = 11;
@@ -4344,7 +4727,7 @@
 
   static const int CSS_TRANSLATEZ = 12;
 
-  /** @domName WebKitCSSTransformValue.operationType */
+  /// @domName WebKitCSSTransformValue.operationType; @docsEditable true
   final int operationType;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4352,7 +4735,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName CSSUnknownRule
+/// @domName CSSUnknownRule; @docsEditable true
 class CSSUnknownRule extends CSSRule native "*CSSUnknownRule" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4360,7 +4743,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName CSSValue
+/// @domName CSSValue; @docsEditable true
 class CSSValue native "*CSSValue" {
 
   static const int CSS_CUSTOM = 3;
@@ -4371,10 +4754,10 @@
 
   static const int CSS_VALUE_LIST = 2;
 
-  /** @domName CSSValue.cssText */
+  /// @domName CSSValue.cssText; @docsEditable true
   String cssText;
 
-  /** @domName CSSValue.cssValueType */
+  /// @domName CSSValue.cssValueType; @docsEditable true
   final int cssValueType;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4385,22 +4768,19 @@
 class CanvasElement extends Element implements Element native "*HTMLCanvasElement" {
 
   factory CanvasElement({int width, int height}) {
-    if (!?width) {
-      return _Elements.createCanvasElement();
-    }
-    if (!?height) {
-      return _Elements.createCanvasElement(width);
-    }
-    return _Elements.createCanvasElement(width, height);
+    var e = document.$dom_createElement("canvas");
+    if (width != null) e.width = width;
+    if (height != null) e.height = height;
+    return e;
   }
 
-  /** @domName HTMLCanvasElement.height */
+  /// @domName HTMLCanvasElement.height; @docsEditable true
   int height;
 
-  /** @domName HTMLCanvasElement.width */
+  /// @domName HTMLCanvasElement.width; @docsEditable true
   int width;
 
-  /** @domName HTMLCanvasElement.toDataURL */
+  /// @domName HTMLCanvasElement.toDataURL; @docsEditable true
   String toDataURL(String type, [num quality]) native;
 
 
@@ -4412,10 +4792,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName CanvasGradient
+/// @domName CanvasGradient; @docsEditable true
 class CanvasGradient native "*CanvasGradient" {
 
-  /** @domName CanvasGradient.addColorStop */
+  /// @domName CanvasGradient.addColorStop; @docsEditable true
   void addColorStop(num offset, String color) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4423,7 +4803,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName CanvasPattern
+/// @domName CanvasPattern; @docsEditable true
 class CanvasPattern native "*CanvasPattern" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4431,10 +4811,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName CanvasRenderingContext
+/// @domName CanvasRenderingContext; @docsEditable true
 class CanvasRenderingContext native "*CanvasRenderingContext" {
 
-  /** @domName CanvasRenderingContext.canvas */
+  /// @domName CanvasRenderingContext.canvas; @docsEditable true
   final CanvasElement canvas;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4444,91 +4824,91 @@
 
 class CanvasRenderingContext2D extends CanvasRenderingContext native "*CanvasRenderingContext2D" {
 
-  /** @domName CanvasRenderingContext2D.fillStyle */
+  /// @domName CanvasRenderingContext2D.fillStyle; @docsEditable true
   dynamic fillStyle;
 
-  /** @domName CanvasRenderingContext2D.font */
+  /// @domName CanvasRenderingContext2D.font; @docsEditable true
   String font;
 
-  /** @domName CanvasRenderingContext2D.globalAlpha */
+  /// @domName CanvasRenderingContext2D.globalAlpha; @docsEditable true
   num globalAlpha;
 
-  /** @domName CanvasRenderingContext2D.globalCompositeOperation */
+  /// @domName CanvasRenderingContext2D.globalCompositeOperation; @docsEditable true
   String globalCompositeOperation;
 
-  /** @domName CanvasRenderingContext2D.lineCap */
+  /// @domName CanvasRenderingContext2D.lineCap; @docsEditable true
   String lineCap;
 
-  /** @domName CanvasRenderingContext2D.lineDashOffset */
+  /// @domName CanvasRenderingContext2D.lineDashOffset; @docsEditable true
   num lineDashOffset;
 
-  /** @domName CanvasRenderingContext2D.lineJoin */
+  /// @domName CanvasRenderingContext2D.lineJoin; @docsEditable true
   String lineJoin;
 
-  /** @domName CanvasRenderingContext2D.lineWidth */
+  /// @domName CanvasRenderingContext2D.lineWidth; @docsEditable true
   num lineWidth;
 
-  /** @domName CanvasRenderingContext2D.miterLimit */
+  /// @domName CanvasRenderingContext2D.miterLimit; @docsEditable true
   num miterLimit;
 
-  /** @domName CanvasRenderingContext2D.shadowBlur */
+  /// @domName CanvasRenderingContext2D.shadowBlur; @docsEditable true
   num shadowBlur;
 
-  /** @domName CanvasRenderingContext2D.shadowColor */
+  /// @domName CanvasRenderingContext2D.shadowColor; @docsEditable true
   String shadowColor;
 
-  /** @domName CanvasRenderingContext2D.shadowOffsetX */
+  /// @domName CanvasRenderingContext2D.shadowOffsetX; @docsEditable true
   num shadowOffsetX;
 
-  /** @domName CanvasRenderingContext2D.shadowOffsetY */
+  /// @domName CanvasRenderingContext2D.shadowOffsetY; @docsEditable true
   num shadowOffsetY;
 
-  /** @domName CanvasRenderingContext2D.strokeStyle */
+  /// @domName CanvasRenderingContext2D.strokeStyle; @docsEditable true
   dynamic strokeStyle;
 
-  /** @domName CanvasRenderingContext2D.textAlign */
+  /// @domName CanvasRenderingContext2D.textAlign; @docsEditable true
   String textAlign;
 
-  /** @domName CanvasRenderingContext2D.textBaseline */
+  /// @domName CanvasRenderingContext2D.textBaseline; @docsEditable true
   String textBaseline;
 
-  /** @domName CanvasRenderingContext2D.webkitBackingStorePixelRatio */
+  /// @domName CanvasRenderingContext2D.webkitBackingStorePixelRatio; @docsEditable true
   final num webkitBackingStorePixelRatio;
 
-  /** @domName CanvasRenderingContext2D.webkitImageSmoothingEnabled */
+  /// @domName CanvasRenderingContext2D.webkitImageSmoothingEnabled; @docsEditable true
   bool webkitImageSmoothingEnabled;
 
-  /** @domName CanvasRenderingContext2D.webkitLineDash */
+  /// @domName CanvasRenderingContext2D.webkitLineDash; @docsEditable true
   List webkitLineDash;
 
-  /** @domName CanvasRenderingContext2D.webkitLineDashOffset */
+  /// @domName CanvasRenderingContext2D.webkitLineDashOffset; @docsEditable true
   num webkitLineDashOffset;
 
-  /** @domName CanvasRenderingContext2D.arc */
+  /// @domName CanvasRenderingContext2D.arc; @docsEditable true
   void arc(num x, num y, num radius, num startAngle, num endAngle, bool anticlockwise) native;
 
-  /** @domName CanvasRenderingContext2D.arcTo */
+  /// @domName CanvasRenderingContext2D.arcTo; @docsEditable true
   void arcTo(num x1, num y1, num x2, num y2, num radius) native;
 
-  /** @domName CanvasRenderingContext2D.beginPath */
+  /// @domName CanvasRenderingContext2D.beginPath; @docsEditable true
   void beginPath() native;
 
-  /** @domName CanvasRenderingContext2D.bezierCurveTo */
+  /// @domName CanvasRenderingContext2D.bezierCurveTo; @docsEditable true
   void bezierCurveTo(num cp1x, num cp1y, num cp2x, num cp2y, num x, num y) native;
 
-  /** @domName CanvasRenderingContext2D.clearRect */
+  /// @domName CanvasRenderingContext2D.clearRect; @docsEditable true
   void clearRect(num x, num y, num width, num height) native;
 
-  /** @domName CanvasRenderingContext2D.clearShadow */
+  /// @domName CanvasRenderingContext2D.clearShadow; @docsEditable true
   void clearShadow() native;
 
-  /** @domName CanvasRenderingContext2D.clip */
+  /// @domName CanvasRenderingContext2D.clip; @docsEditable true
   void clip() native;
 
-  /** @domName CanvasRenderingContext2D.closePath */
+  /// @domName CanvasRenderingContext2D.closePath; @docsEditable true
   void closePath() native;
 
-  /** @domName CanvasRenderingContext2D.createImageData */
+  /// @domName CanvasRenderingContext2D.createImageData; @docsEditable true
   ImageData createImageData(imagedata_OR_sw, [num sh]) {
     if ((?imagedata_OR_sw && (imagedata_OR_sw is ImageData || imagedata_OR_sw == null)) &&
         !?sh) {
@@ -4538,57 +4918,60 @@
     if ((?imagedata_OR_sw && (imagedata_OR_sw is num || imagedata_OR_sw == null))) {
       return _convertNativeToDart_ImageData(_createImageData_2(imagedata_OR_sw, sh));
     }
-    throw const Exception("Incorrect number or type of arguments");
+    throw new ArgumentError("Incorrect number or type of arguments");
   }
+  @Creates('ImageData|=Object')
   _createImageData_1(imagedata) native "createImageData";
+  @Creates('ImageData|=Object')
   _createImageData_2(num sw, sh) native "createImageData";
 
-  /** @domName CanvasRenderingContext2D.createLinearGradient */
+  /// @domName CanvasRenderingContext2D.createLinearGradient; @docsEditable true
   CanvasGradient createLinearGradient(num x0, num y0, num x1, num y1) native;
 
-  /** @domName CanvasRenderingContext2D.createPattern */
+  /// @domName CanvasRenderingContext2D.createPattern; @docsEditable true
   CanvasPattern createPattern(canvas_OR_image, String repetitionType) native;
 
-  /** @domName CanvasRenderingContext2D.createRadialGradient */
+  /// @domName CanvasRenderingContext2D.createRadialGradient; @docsEditable true
   CanvasGradient createRadialGradient(num x0, num y0, num r0, num x1, num y1, num r1) native;
 
-  /** @domName CanvasRenderingContext2D.drawImage */
+  /// @domName CanvasRenderingContext2D.drawImage; @docsEditable true
   void drawImage(canvas_OR_image_OR_video, num sx_OR_x, num sy_OR_y, [num sw_OR_width, num height_OR_sh, num dx, num dy, num dw, num dh]) native;
 
-  /** @domName CanvasRenderingContext2D.drawImageFromRect */
+  /// @domName CanvasRenderingContext2D.drawImageFromRect; @docsEditable true
   void drawImageFromRect(ImageElement image, [num sx, num sy, num sw, num sh, num dx, num dy, num dw, num dh, String compositeOperation]) native;
 
-  /** @domName CanvasRenderingContext2D.fill */
+  /// @domName CanvasRenderingContext2D.fill; @docsEditable true
   void fill() native;
 
-  /** @domName CanvasRenderingContext2D.fillRect */
+  /// @domName CanvasRenderingContext2D.fillRect; @docsEditable true
   void fillRect(num x, num y, num width, num height) native;
 
-  /** @domName CanvasRenderingContext2D.fillText */
+  /// @domName CanvasRenderingContext2D.fillText; @docsEditable true
   void fillText(String text, num x, num y, [num maxWidth]) native;
 
-  /** @domName CanvasRenderingContext2D.getImageData */
+  /// @domName CanvasRenderingContext2D.getImageData; @docsEditable true
   ImageData getImageData(num sx, num sy, num sw, num sh) {
     return _convertNativeToDart_ImageData(_getImageData_1(sx, sy, sw, sh));
   }
+  @Creates('ImageData|=Object')
   _getImageData_1(sx, sy, sw, sh) native "getImageData";
 
-  /** @domName CanvasRenderingContext2D.getLineDash */
+  /// @domName CanvasRenderingContext2D.getLineDash; @docsEditable true
   List<num> getLineDash() native;
 
-  /** @domName CanvasRenderingContext2D.isPointInPath */
+  /// @domName CanvasRenderingContext2D.isPointInPath; @docsEditable true
   bool isPointInPath(num x, num y) native;
 
-  /** @domName CanvasRenderingContext2D.lineTo */
+  /// @domName CanvasRenderingContext2D.lineTo; @docsEditable true
   void lineTo(num x, num y) native;
 
-  /** @domName CanvasRenderingContext2D.measureText */
+  /// @domName CanvasRenderingContext2D.measureText; @docsEditable true
   TextMetrics measureText(String text) native;
 
-  /** @domName CanvasRenderingContext2D.moveTo */
+  /// @domName CanvasRenderingContext2D.moveTo; @docsEditable true
   void moveTo(num x, num y) native;
 
-  /** @domName CanvasRenderingContext2D.putImageData */
+  /// @domName CanvasRenderingContext2D.putImageData; @docsEditable true
   void putImageData(ImageData imagedata, num dx, num dy, [num dirtyX, num dirtyY, num dirtyWidth, num dirtyHeight]) {
     if (!?dirtyX &&
         !?dirtyY &&
@@ -4601,78 +4984,79 @@
     var imagedata_2 = _convertDartToNative_ImageData(imagedata);
     _putImageData_2(imagedata_2, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
     return;
-    throw const Exception("Incorrect number or type of arguments");
+    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";
 
-  /** @domName CanvasRenderingContext2D.quadraticCurveTo */
+  /// @domName CanvasRenderingContext2D.quadraticCurveTo; @docsEditable true
   void quadraticCurveTo(num cpx, num cpy, num x, num y) native;
 
-  /** @domName CanvasRenderingContext2D.rect */
+  /// @domName CanvasRenderingContext2D.rect; @docsEditable true
   void rect(num x, num y, num width, num height) native;
 
-  /** @domName CanvasRenderingContext2D.restore */
+  /// @domName CanvasRenderingContext2D.restore; @docsEditable true
   void restore() native;
 
-  /** @domName CanvasRenderingContext2D.rotate */
+  /// @domName CanvasRenderingContext2D.rotate; @docsEditable true
   void rotate(num angle) native;
 
-  /** @domName CanvasRenderingContext2D.save */
+  /// @domName CanvasRenderingContext2D.save; @docsEditable true
   void save() native;
 
-  /** @domName CanvasRenderingContext2D.scale */
+  /// @domName CanvasRenderingContext2D.scale; @docsEditable true
   void scale(num sx, num sy) native;
 
-  /** @domName CanvasRenderingContext2D.setAlpha */
+  /// @domName CanvasRenderingContext2D.setAlpha; @docsEditable true
   void setAlpha(num alpha) native;
 
-  /** @domName CanvasRenderingContext2D.setCompositeOperation */
+  /// @domName CanvasRenderingContext2D.setCompositeOperation; @docsEditable true
   void setCompositeOperation(String compositeOperation) native;
 
-  /** @domName CanvasRenderingContext2D.setLineCap */
+  /// @domName CanvasRenderingContext2D.setLineCap; @docsEditable true
   void setLineCap(String cap) native;
 
-  /** @domName CanvasRenderingContext2D.setLineDash */
+  /// @domName CanvasRenderingContext2D.setLineDash; @docsEditable true
   void setLineDash(List<num> dash) native;
 
-  /** @domName CanvasRenderingContext2D.setLineJoin */
+  /// @domName CanvasRenderingContext2D.setLineJoin; @docsEditable true
   void setLineJoin(String join) native;
 
-  /** @domName CanvasRenderingContext2D.setLineWidth */
+  /// @domName CanvasRenderingContext2D.setLineWidth; @docsEditable true
   void setLineWidth(num width) native;
 
-  /** @domName CanvasRenderingContext2D.setMiterLimit */
+  /// @domName CanvasRenderingContext2D.setMiterLimit; @docsEditable true
   void setMiterLimit(num limit) native;
 
-  /** @domName CanvasRenderingContext2D.setShadow */
+  /// @domName CanvasRenderingContext2D.setShadow; @docsEditable true
   void setShadow(num width, num height, num blur, [c_OR_color_OR_grayLevel_OR_r, num alpha_OR_g_OR_m, num b_OR_y, num a_OR_k, num a]) native;
 
-  /** @domName CanvasRenderingContext2D.setTransform */
+  /// @domName CanvasRenderingContext2D.setTransform; @docsEditable true
   void setTransform(num m11, num m12, num m21, num m22, num dx, num dy) native;
 
-  /** @domName CanvasRenderingContext2D.stroke */
+  /// @domName CanvasRenderingContext2D.stroke; @docsEditable true
   void stroke() native;
 
-  /** @domName CanvasRenderingContext2D.strokeRect */
+  /// @domName CanvasRenderingContext2D.strokeRect; @docsEditable true
   void strokeRect(num x, num y, num width, num height, [num lineWidth]) native;
 
-  /** @domName CanvasRenderingContext2D.strokeText */
+  /// @domName CanvasRenderingContext2D.strokeText; @docsEditable true
   void strokeText(String text, num x, num y, [num maxWidth]) native;
 
-  /** @domName CanvasRenderingContext2D.transform */
+  /// @domName CanvasRenderingContext2D.transform; @docsEditable true
   void transform(num m11, num m12, num m21, num m22, num dx, num dy) native;
 
-  /** @domName CanvasRenderingContext2D.translate */
+  /// @domName CanvasRenderingContext2D.translate; @docsEditable true
   void translate(num tx, num ty) native;
 
-  /** @domName CanvasRenderingContext2D.webkitGetImageDataHD */
+  /// @domName CanvasRenderingContext2D.webkitGetImageDataHD; @docsEditable true
   ImageData webkitGetImageDataHD(num sx, num sy, num sw, num sh) {
     return _convertNativeToDart_ImageData(_webkitGetImageDataHD_1(sx, sy, sw, sh));
   }
+  @Creates('ImageData|=Object')
   _webkitGetImageDataHD_1(sx, sy, sw, sh) native "webkitGetImageDataHD";
 
-  /** @domName CanvasRenderingContext2D.webkitPutImageDataHD */
+  /// @domName CanvasRenderingContext2D.webkitPutImageDataHD; @docsEditable true
   void webkitPutImageDataHD(ImageData imagedata, num dx, num dy, [num dirtyX, num dirtyY, num dirtyWidth, num dirtyHeight]) {
     if (!?dirtyX &&
         !?dirtyY &&
@@ -4685,7 +5069,7 @@
     var imagedata_2 = _convertDartToNative_ImageData(imagedata);
     _webkitPutImageDataHD_2(imagedata_2, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
     return;
-    throw const Exception("Incorrect number or type of arguments");
+    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";
@@ -4732,7 +5116,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName ChannelMergerNode
+/// @domName ChannelMergerNode; @docsEditable true
 class ChannelMergerNode extends AudioNode native "*ChannelMergerNode" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4740,7 +5124,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName ChannelSplitterNode
+/// @domName ChannelSplitterNode; @docsEditable true
 class ChannelSplitterNode extends AudioNode native "*ChannelSplitterNode" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4748,31 +5132,31 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName CharacterData
+/// @domName CharacterData; @docsEditable true
 class CharacterData extends Node native "*CharacterData" {
 
-  /** @domName CharacterData.data */
+  /// @domName CharacterData.data; @docsEditable true
   String data;
 
-  /** @domName CharacterData.length */
+  /// @domName CharacterData.length; @docsEditable true
   final int length;
 
-  /** @domName CharacterData.appendData */
+  /// @domName CharacterData.appendData; @docsEditable true
   void appendData(String data) native;
 
-  /** @domName CharacterData.deleteData */
+  /// @domName CharacterData.deleteData; @docsEditable true
   void deleteData(int offset, int length) native;
 
-  /** @domName CharacterData.insertData */
+  /// @domName CharacterData.insertData; @docsEditable true
   void insertData(int offset, String data) native;
 
-  /** @domName CharacterData.remove */
+  /// @domName CharacterData.remove; @docsEditable true
   void remove() native;
 
-  /** @domName CharacterData.replaceData */
+  /// @domName CharacterData.replaceData; @docsEditable true
   void replaceData(int offset, int length, String data) native;
 
-  /** @domName CharacterData.substringData */
+  /// @domName CharacterData.substringData; @docsEditable true
   String substringData(int offset, int length) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4780,25 +5164,25 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName ClientRect
+/// @domName ClientRect; @docsEditable true
 class ClientRect native "*ClientRect" {
 
-  /** @domName ClientRect.bottom */
+  /// @domName ClientRect.bottom; @docsEditable true
   final num bottom;
 
-  /** @domName ClientRect.height */
+  /// @domName ClientRect.height; @docsEditable true
   final num height;
 
-  /** @domName ClientRect.left */
+  /// @domName ClientRect.left; @docsEditable true
   final num left;
 
-  /** @domName ClientRect.right */
+  /// @domName ClientRect.right; @docsEditable true
   final num right;
 
-  /** @domName ClientRect.top */
+  /// @domName ClientRect.top; @docsEditable true
   final num top;
 
-  /** @domName ClientRect.width */
+  /// @domName ClientRect.width; @docsEditable true
   final num width;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4806,34 +5190,35 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Clipboard
+/// @domName Clipboard; @docsEditable true
 class Clipboard native "*Clipboard" {
 
-  /** @domName Clipboard.dropEffect */
+  /// @domName Clipboard.dropEffect; @docsEditable true
   String dropEffect;
 
-  /** @domName Clipboard.effectAllowed */
+  /// @domName Clipboard.effectAllowed; @docsEditable true
   String effectAllowed;
 
-  /** @domName Clipboard.files */
+  /// @domName Clipboard.files; @docsEditable true
+  @Returns('_FileList') @Creates('_FileList')
   final List<File> files;
 
-  /** @domName Clipboard.items */
+  /// @domName Clipboard.items; @docsEditable true
   final DataTransferItemList items;
 
-  /** @domName Clipboard.types */
+  /// @domName Clipboard.types; @docsEditable true
   final List types;
 
-  /** @domName Clipboard.clearData */
+  /// @domName Clipboard.clearData; @docsEditable true
   void clearData([String type]) native;
 
-  /** @domName Clipboard.getData */
+  /// @domName Clipboard.getData; @docsEditable true
   String getData(String type) native;
 
-  /** @domName Clipboard.setData */
+  /// @domName Clipboard.setData; @docsEditable true
   bool setData(String type, String data) native;
 
-  /** @domName Clipboard.setDragImage */
+  /// @domName Clipboard.setDragImage; @docsEditable true
   void setDragImage(ImageElement image, int x, int y) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4841,16 +5226,16 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName CloseEvent
+/// @domName CloseEvent; @docsEditable true
 class CloseEvent extends Event native "*CloseEvent" {
 
-  /** @domName CloseEvent.code */
+  /// @domName CloseEvent.code; @docsEditable true
   final int code;
 
-  /** @domName CloseEvent.reason */
+  /// @domName CloseEvent.reason; @docsEditable true
   final String reason;
 
-  /** @domName CloseEvent.wasClean */
+  /// @domName CloseEvent.wasClean; @docsEditable true
   final bool wasClean;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4858,7 +5243,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Comment
+/// @domName Comment; @docsEditable true
 class Comment extends CharacterData native "*Comment" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4866,13 +5251,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName CompositionEvent
+/// @domName CompositionEvent; @docsEditable true
 class CompositionEvent extends UIEvent native "*CompositionEvent" {
 
-  /** @domName CompositionEvent.data */
+  /// @domName CompositionEvent.data; @docsEditable true
   final String data;
 
-  /** @domName CompositionEvent.initCompositionEvent */
+  /// @domName CompositionEvent.initCompositionEvent; @docsEditable true
   void initCompositionEvent(String typeArg, bool canBubbleArg, bool cancelableArg, LocalWindow viewArg, String dataArg) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4884,67 +5269,67 @@
     // Console is sometimes a singleton bag-of-properties without a prototype.
     native "=(typeof console == 'undefined' ? {} : console)" {
 
-  /** @domName Console.memory */
+  /// @domName Console.memory; @docsEditable true
   final MemoryInfo memory;
 
-  /** @domName Console.profiles */
+  /// @domName Console.profiles; @docsEditable true
   final List<ScriptProfile> profiles;
 
-  /** @domName Console.assertCondition */
+  /// @domName Console.assertCondition; @docsEditable true
   void assertCondition(bool condition, Object arg) native;
 
-  /** @domName Console.count */
+  /// @domName Console.count; @docsEditable true
   void count(Object arg) native;
 
-  /** @domName Console.debug */
+  /// @domName Console.debug; @docsEditable true
   void debug(Object arg) native;
 
-  /** @domName Console.dir */
+  /// @domName Console.dir; @docsEditable true
   void dir(Object arg) native;
 
-  /** @domName Console.dirxml */
+  /// @domName Console.dirxml; @docsEditable true
   void dirxml(Object arg) native;
 
-  /** @domName Console.error */
+  /// @domName Console.error; @docsEditable true
   void error(Object arg) native;
 
-  /** @domName Console.group */
+  /// @domName Console.group; @docsEditable true
   void group(Object arg) native;
 
-  /** @domName Console.groupCollapsed */
+  /// @domName Console.groupCollapsed; @docsEditable true
   void groupCollapsed(Object arg) native;
 
-  /** @domName Console.groupEnd */
+  /// @domName Console.groupEnd; @docsEditable true
   void groupEnd() native;
 
-  /** @domName Console.info */
+  /// @domName Console.info; @docsEditable true
   void info(Object arg) native;
 
-  /** @domName Console.log */
+  /// @domName Console.log; @docsEditable true
   void log(Object arg) native;
 
-  /** @domName Console.markTimeline */
+  /// @domName Console.markTimeline; @docsEditable true
   void markTimeline(Object arg) native;
 
-  /** @domName Console.profile */
+  /// @domName Console.profile; @docsEditable true
   void profile(String title) native;
 
-  /** @domName Console.profileEnd */
+  /// @domName Console.profileEnd; @docsEditable true
   void profileEnd(String title) native;
 
-  /** @domName Console.time */
+  /// @domName Console.time; @docsEditable true
   void time(String title) native;
 
-  /** @domName Console.timeEnd */
+  /// @domName Console.timeEnd; @docsEditable true
   void timeEnd(String title, Object arg) native;
 
-  /** @domName Console.timeStamp */
+  /// @domName Console.timeStamp; @docsEditable true
   void timeStamp(Object arg) native;
 
-  /** @domName Console.trace */
+  /// @domName Console.trace; @docsEditable true
   void trace(Object arg) native;
 
-  /** @domName Console.warn */
+  /// @domName Console.warn; @docsEditable true
   void warn(Object arg) native;
 
 }
@@ -4953,18 +5338,19 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLContentElement
+/// @domName HTMLContentElement; @docsEditable true
 class ContentElement extends Element implements Element native "*HTMLContentElement" {
 
-  factory ContentElement() => _Elements.createContentElement();
+  factory ContentElement() => document.$dom_createElement("content");
 
-  /** @domName HTMLContentElement.resetStyleInheritance */
+  /// @domName HTMLContentElement.resetStyleInheritance; @docsEditable true
   bool resetStyleInheritance;
 
-  /** @domName HTMLContentElement.select */
+  /// @domName HTMLContentElement.select; @docsEditable true
   String select;
 
-  /** @domName HTMLContentElement.getDistributedNodes */
+  /// @domName HTMLContentElement.getDistributedNodes; @docsEditable true
+  @Returns('_NodeList') @Creates('_NodeList')
   List<Node> getDistributedNodes() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4972,13 +5358,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName ConvolverNode
+/// @domName ConvolverNode; @docsEditable true
 class ConvolverNode extends AudioNode native "*ConvolverNode" {
 
-  /** @domName ConvolverNode.buffer */
+  /// @domName ConvolverNode.buffer; @docsEditable true
   AudioBuffer buffer;
 
-  /** @domName ConvolverNode.normalize */
+  /// @domName ConvolverNode.normalize; @docsEditable true
   bool normalize;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4986,28 +5372,28 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Coordinates
+/// @domName Coordinates; @docsEditable true
 class Coordinates native "*Coordinates" {
 
-  /** @domName Coordinates.accuracy */
+  /// @domName Coordinates.accuracy; @docsEditable true
   final num accuracy;
 
-  /** @domName Coordinates.altitude */
+  /// @domName Coordinates.altitude; @docsEditable true
   final num altitude;
 
-  /** @domName Coordinates.altitudeAccuracy */
+  /// @domName Coordinates.altitudeAccuracy; @docsEditable true
   final num altitudeAccuracy;
 
-  /** @domName Coordinates.heading */
+  /// @domName Coordinates.heading; @docsEditable true
   final num heading;
 
-  /** @domName Coordinates.latitude */
+  /// @domName Coordinates.latitude; @docsEditable true
   final num latitude;
 
-  /** @domName Coordinates.longitude */
+  /// @domName Coordinates.longitude; @docsEditable true
   final num longitude;
 
-  /** @domName Coordinates.speed */
+  /// @domName Coordinates.speed; @docsEditable true
   final num speed;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5015,16 +5401,16 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Counter
+/// @domName Counter; @docsEditable true
 class Counter native "*Counter" {
 
-  /** @domName Counter.identifier */
+  /// @domName Counter.identifier; @docsEditable true
   final String identifier;
 
-  /** @domName Counter.listStyle */
+  /// @domName Counter.listStyle; @docsEditable true
   final String listStyle;
 
-  /** @domName Counter.separator */
+  /// @domName Counter.separator; @docsEditable true
   final String separator;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5032,10 +5418,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Crypto
+/// @domName Crypto; @docsEditable true
 class Crypto native "*Crypto" {
 
-  /** @domName Crypto.getRandomValues */
+  /// @domName Crypto.getRandomValues; @docsEditable true
   void getRandomValues(ArrayBufferView array) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5050,10 +5436,10 @@
       Object detail]) => _CustomEventFactoryProvider.createCustomEvent(
       type, canBubble, cancelable, detail);
 
-  /** @domName CustomEvent.detail */
+  /// @domName CustomEvent.detail; @docsEditable true
   final Object detail;
 
-  /** @domName CustomEvent.initCustomEvent */
+  /// @domName CustomEvent.initCustomEvent; @docsEditable true
   void $dom_initCustomEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object detailArg) native "initCustomEvent";
 
 }
@@ -5062,12 +5448,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLDListElement
+/// @domName HTMLDListElement; @docsEditable true
 class DListElement extends Element implements Element native "*HTMLDListElement" {
 
-  factory DListElement() => _Elements.createDListElement();
+  factory DListElement() => document.$dom_createElement("dl");
 
-  /** @domName HTMLDListElement.compact */
+  /// @domName HTMLDListElement.compact; @docsEditable true
   bool compact;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5075,12 +5461,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName DOMApplicationCache
+/// @domName DOMApplicationCache; @docsEditable true
 class DOMApplicationCache extends EventTarget native "*DOMApplicationCache" {
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   DOMApplicationCacheEvents get on =>
     new DOMApplicationCacheEvents(this);
 
@@ -5096,25 +5480,25 @@
 
   static const int UPDATEREADY = 4;
 
-  /** @domName DOMApplicationCache.status */
+  /// @domName DOMApplicationCache.status; @docsEditable true
   final int status;
 
-  /** @domName DOMApplicationCache.abort */
+  /// @domName DOMApplicationCache.abort; @docsEditable true
   void abort() native;
 
-  /** @domName DOMApplicationCache.addEventListener */
+  /// @domName DOMApplicationCache.addEventListener; @docsEditable true
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
 
-  /** @domName DOMApplicationCache.dispatchEvent */
+  /// @domName DOMApplicationCache.dispatchEvent; @docsEditable true
   bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
 
-  /** @domName DOMApplicationCache.removeEventListener */
+  /// @domName DOMApplicationCache.removeEventListener; @docsEditable true
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
 
-  /** @domName DOMApplicationCache.swapCache */
+  /// @domName DOMApplicationCache.swapCache; @docsEditable true
   void swapCache() native;
 
-  /** @domName DOMApplicationCache.update */
+  /// @domName DOMApplicationCache.update; @docsEditable true
   void update() native;
 }
 
@@ -5142,10 +5526,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName DOMError
+/// @domName DOMError; @docsEditable true
 class DOMError native "*DOMError" {
 
-  /** @domName DOMError.name */
+  /// @domName DOMError.name; @docsEditable true
   final String name;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5153,7 +5537,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName DOMException
+/// @domName DOMException; @docsEditable true
 class DOMException native "*DOMException" {
 
   static const int ABORT_ERR = 20;
@@ -5206,16 +5590,16 @@
 
   static const int WRONG_DOCUMENT_ERR = 4;
 
-  /** @domName DOMException.code */
+  /// @domName DOMException.code; @docsEditable true
   final int code;
 
-  /** @domName DOMException.message */
+  /// @domName DOMException.message; @docsEditable true
   final String message;
 
-  /** @domName DOMException.name */
+  /// @domName DOMException.name; @docsEditable true
   final String name;
 
-  /** @domName DOMException.toString */
+  /// @domName DOMException.toString; @docsEditable true
   String toString() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5223,13 +5607,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName DOMFileSystem
+/// @domName DOMFileSystem; @docsEditable true
 class DOMFileSystem native "*DOMFileSystem" {
 
-  /** @domName DOMFileSystem.name */
+  /// @domName DOMFileSystem.name; @docsEditable true
   final String name;
 
-  /** @domName DOMFileSystem.root */
+  /// @domName DOMFileSystem.root; @docsEditable true
   final DirectoryEntry root;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5237,13 +5621,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName DOMFileSystemSync
+/// @domName DOMFileSystemSync; @docsEditable true
 class DOMFileSystemSync native "*DOMFileSystemSync" {
 
-  /** @domName DOMFileSystemSync.name */
+  /// @domName DOMFileSystemSync.name; @docsEditable true
   final String name;
 
-  /** @domName DOMFileSystemSync.root */
+  /// @domName DOMFileSystemSync.root; @docsEditable true
   final DirectoryEntrySync root;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5251,22 +5635,22 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName DOMImplementation
+/// @domName DOMImplementation; @docsEditable true
 class DOMImplementation native "*DOMImplementation" {
 
-  /** @domName DOMImplementation.createCSSStyleSheet */
+  /// @domName DOMImplementation.createCSSStyleSheet; @docsEditable true
   CSSStyleSheet createCSSStyleSheet(String title, String media) native;
 
-  /** @domName DOMImplementation.createDocument */
+  /// @domName DOMImplementation.createDocument; @docsEditable true
   Document createDocument(String namespaceURI, String qualifiedName, DocumentType doctype) native;
 
-  /** @domName DOMImplementation.createDocumentType */
+  /// @domName DOMImplementation.createDocumentType; @docsEditable true
   DocumentType createDocumentType(String qualifiedName, String publicId, String systemId) native;
 
-  /** @domName DOMImplementation.createHTMLDocument */
+  /// @domName DOMImplementation.createHTMLDocument; @docsEditable true
   HtmlDocument createHTMLDocument(String title) native;
 
-  /** @domName DOMImplementation.hasFeature */
+  /// @domName DOMImplementation.hasFeature; @docsEditable true
   bool hasFeature(String feature, String version) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5274,19 +5658,19 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName MimeType
+/// @domName MimeType; @docsEditable true
 class DOMMimeType native "*MimeType" {
 
-  /** @domName MimeType.description */
+  /// @domName MimeType.description; @docsEditable true
   final String description;
 
-  /** @domName MimeType.enabledPlugin */
+  /// @domName MimeType.enabledPlugin; @docsEditable true
   final DOMPlugin enabledPlugin;
 
-  /** @domName MimeType.suffixes */
+  /// @domName MimeType.suffixes; @docsEditable true
   final String suffixes;
 
-  /** @domName MimeType.type */
+  /// @domName MimeType.type; @docsEditable true
   final String type;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5294,10 +5678,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName MimeTypeArray
+/// @domName MimeTypeArray; @docsEditable true
 class DOMMimeTypeArray implements JavaScriptIndexingBehavior, List<DOMMimeType> native "*MimeTypeArray" {
 
-  /** @domName MimeTypeArray.length */
+  /// @domName MimeTypeArray.length; @docsEditable true
   final int length;
 
   DOMMimeType operator[](int index) => JS("DOMMimeType", "#[#]", this, index);
@@ -5360,6 +5744,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  DOMMimeType get first => this[0];
+
   DOMMimeType get last => this[length - 1];
 
   DOMMimeType removeLast() {
@@ -5383,10 +5769,10 @@
 
   // -- end List<DOMMimeType> mixins.
 
-  /** @domName MimeTypeArray.item */
+  /// @domName MimeTypeArray.item; @docsEditable true
   DOMMimeType item(int index) native;
 
-  /** @domName MimeTypeArray.namedItem */
+  /// @domName MimeTypeArray.namedItem; @docsEditable true
   DOMMimeType namedItem(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5394,12 +5780,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName DOMParser
+/// @domName DOMParser; @docsEditable true
 class DOMParser native "*DOMParser" {
 
   factory DOMParser() => _DOMParserFactoryProvider.createDOMParser();
 
-  /** @domName DOMParser.parseFromString */
+  /// @domName DOMParser.parseFromString; @docsEditable true
   Document parseFromString(String str, String contentType) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5407,25 +5793,25 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Plugin
+/// @domName Plugin; @docsEditable true
 class DOMPlugin native "*Plugin" {
 
-  /** @domName Plugin.description */
+  /// @domName Plugin.description; @docsEditable true
   final String description;
 
-  /** @domName Plugin.filename */
+  /// @domName Plugin.filename; @docsEditable true
   final String filename;
 
-  /** @domName Plugin.length */
+  /// @domName Plugin.length; @docsEditable true
   final int length;
 
-  /** @domName Plugin.name */
+  /// @domName Plugin.name; @docsEditable true
   final String name;
 
-  /** @domName Plugin.item */
+  /// @domName Plugin.item; @docsEditable true
   DOMMimeType item(int index) native;
 
-  /** @domName Plugin.namedItem */
+  /// @domName Plugin.namedItem; @docsEditable true
   DOMMimeType namedItem(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5433,10 +5819,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName PluginArray
+/// @domName PluginArray; @docsEditable true
 class DOMPluginArray implements JavaScriptIndexingBehavior, List<DOMPlugin> native "*PluginArray" {
 
-  /** @domName PluginArray.length */
+  /// @domName PluginArray.length; @docsEditable true
   final int length;
 
   DOMPlugin operator[](int index) => JS("DOMPlugin", "#[#]", this, index);
@@ -5499,6 +5885,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  DOMPlugin get first => this[0];
+
   DOMPlugin get last => this[length - 1];
 
   DOMPlugin removeLast() {
@@ -5522,13 +5910,13 @@
 
   // -- end List<DOMPlugin> mixins.
 
-  /** @domName PluginArray.item */
+  /// @domName PluginArray.item; @docsEditable true
   DOMPlugin item(int index) native;
 
-  /** @domName PluginArray.namedItem */
+  /// @domName PluginArray.namedItem; @docsEditable true
   DOMPlugin namedItem(String name) native;
 
-  /** @domName PluginArray.refresh */
+  /// @domName PluginArray.refresh; @docsEditable true
   void refresh(bool reload) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5536,85 +5924,85 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Selection
+/// @domName Selection; @docsEditable true
 class DOMSelection native "*Selection" {
 
-  /** @domName Selection.anchorNode */
+  /// @domName Selection.anchorNode; @docsEditable true
   final Node anchorNode;
 
-  /** @domName Selection.anchorOffset */
+  /// @domName Selection.anchorOffset; @docsEditable true
   final int anchorOffset;
 
-  /** @domName Selection.baseNode */
+  /// @domName Selection.baseNode; @docsEditable true
   final Node baseNode;
 
-  /** @domName Selection.baseOffset */
+  /// @domName Selection.baseOffset; @docsEditable true
   final int baseOffset;
 
-  /** @domName Selection.extentNode */
+  /// @domName Selection.extentNode; @docsEditable true
   final Node extentNode;
 
-  /** @domName Selection.extentOffset */
+  /// @domName Selection.extentOffset; @docsEditable true
   final int extentOffset;
 
-  /** @domName Selection.focusNode */
+  /// @domName Selection.focusNode; @docsEditable true
   final Node focusNode;
 
-  /** @domName Selection.focusOffset */
+  /// @domName Selection.focusOffset; @docsEditable true
   final int focusOffset;
 
-  /** @domName Selection.isCollapsed */
+  /// @domName Selection.isCollapsed; @docsEditable true
   final bool isCollapsed;
 
-  /** @domName Selection.rangeCount */
+  /// @domName Selection.rangeCount; @docsEditable true
   final int rangeCount;
 
-  /** @domName Selection.type */
+  /// @domName Selection.type; @docsEditable true
   final String type;
 
-  /** @domName Selection.addRange */
+  /// @domName Selection.addRange; @docsEditable true
   void addRange(Range range) native;
 
-  /** @domName Selection.collapse */
+  /// @domName Selection.collapse; @docsEditable true
   void collapse(Node node, int index) native;
 
-  /** @domName Selection.collapseToEnd */
+  /// @domName Selection.collapseToEnd; @docsEditable true
   void collapseToEnd() native;
 
-  /** @domName Selection.collapseToStart */
+  /// @domName Selection.collapseToStart; @docsEditable true
   void collapseToStart() native;
 
-  /** @domName Selection.containsNode */
+  /// @domName Selection.containsNode; @docsEditable true
   bool containsNode(Node node, bool allowPartial) native;
 
-  /** @domName Selection.deleteFromDocument */
+  /// @domName Selection.deleteFromDocument; @docsEditable true
   void deleteFromDocument() native;
 
-  /** @domName Selection.empty */
+  /// @domName Selection.empty; @docsEditable true
   void empty() native;
 
-  /** @domName Selection.extend */
+  /// @domName Selection.extend; @docsEditable true
   void extend(Node node, int offset) native;
 
-  /** @domName Selection.getRangeAt */
+  /// @domName Selection.getRangeAt; @docsEditable true
   Range getRangeAt(int index) native;
 
-  /** @domName Selection.modify */
+  /// @domName Selection.modify; @docsEditable true
   void modify(String alter, String direction, String granularity) native;
 
-  /** @domName Selection.removeAllRanges */
+  /// @domName Selection.removeAllRanges; @docsEditable true
   void removeAllRanges() native;
 
-  /** @domName Selection.selectAllChildren */
+  /// @domName Selection.selectAllChildren; @docsEditable true
   void selectAllChildren(Node node) native;
 
-  /** @domName Selection.setBaseAndExtent */
+  /// @domName Selection.setBaseAndExtent; @docsEditable true
   void setBaseAndExtent(Node baseNode, int baseOffset, Node extentNode, int extentOffset) native;
 
-  /** @domName Selection.setPosition */
+  /// @domName Selection.setPosition; @docsEditable true
   void setPosition(Node node, int offset) native;
 
-  /** @domName Selection.toString */
+  /// @domName Selection.toString; @docsEditable true
   String toString() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5622,10 +6010,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName DOMSettableTokenList
+/// @domName DOMSettableTokenList; @docsEditable true
 class DOMSettableTokenList extends DOMTokenList native "*DOMSettableTokenList" {
 
-  /** @domName DOMSettableTokenList.value */
+  /// @domName DOMSettableTokenList.value; @docsEditable true
   String value;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5641,22 +6029,22 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName DOMTokenList
+/// @domName DOMTokenList; @docsEditable true
 class DOMTokenList native "*DOMTokenList" {
 
-  /** @domName DOMTokenList.length */
+  /// @domName DOMTokenList.length; @docsEditable true
   final int length;
 
-  /** @domName DOMTokenList.contains */
+  /// @domName DOMTokenList.contains; @docsEditable true
   bool contains(String token) native;
 
-  /** @domName DOMTokenList.item */
+  /// @domName DOMTokenList.item; @docsEditable true
   String item(int index) native;
 
-  /** @domName DOMTokenList.toString */
+  /// @domName DOMTokenList.toString; @docsEditable true
   String toString() native;
 
-  /** @domName DOMTokenList.toggle */
+  /// @domName DOMTokenList.toggle; @docsEditable true
   bool toggle(String token, [bool force]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5664,12 +6052,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLDataListElement
+/// @domName HTMLDataListElement; @docsEditable true
 class DataListElement extends Element implements Element native "*HTMLDataListElement" {
 
-  factory DataListElement() => _Elements.createDataListElement();
+  factory DataListElement() => document.$dom_createElement("datalist");
 
-  /** @domName HTMLDataListElement.options */
+  /// @domName HTMLDataListElement.options; @docsEditable true
   final HTMLCollection options;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5677,22 +6065,22 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName DataTransferItem
+/// @domName DataTransferItem; @docsEditable true
 class DataTransferItem native "*DataTransferItem" {
 
-  /** @domName DataTransferItem.kind */
+  /// @domName DataTransferItem.kind; @docsEditable true
   final String kind;
 
-  /** @domName DataTransferItem.type */
+  /// @domName DataTransferItem.type; @docsEditable true
   final String type;
 
-  /** @domName DataTransferItem.getAsFile */
+  /// @domName DataTransferItem.getAsFile; @docsEditable true
   Blob getAsFile() native;
 
-  /** @domName DataTransferItem.getAsString */
+  /// @domName DataTransferItem.getAsString; @docsEditable true
   void getAsString([StringCallback callback]) native;
 
-  /** @domName DataTransferItem.webkitGetAsEntry */
+  /// @domName DataTransferItem.webkitGetAsEntry; @docsEditable true
   Entry webkitGetAsEntry() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5700,19 +6088,19 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName DataTransferItemList
+/// @domName DataTransferItemList; @docsEditable true
 class DataTransferItemList native "*DataTransferItemList" {
 
-  /** @domName DataTransferItemList.length */
+  /// @domName DataTransferItemList.length; @docsEditable true
   final int length;
 
-  /** @domName DataTransferItemList.add */
+  /// @domName DataTransferItemList.add; @docsEditable true
   void add(data_OR_file, [String type]) native;
 
-  /** @domName DataTransferItemList.clear */
+  /// @domName DataTransferItemList.clear; @docsEditable true
   void clear() native;
 
-  /** @domName DataTransferItemList.item */
+  /// @domName DataTransferItemList.item; @docsEditable true
   DataTransferItem item(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5720,7 +6108,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName DataView
+/// @domName DataView; @docsEditable true
 class DataView extends ArrayBufferView native "*DataView" {
 
   factory DataView(ArrayBuffer buffer, [int byteOffset, int byteLength]) {
@@ -5733,52 +6121,52 @@
     return _DataViewFactoryProvider.createDataView(buffer, byteOffset, byteLength);
   }
 
-  /** @domName DataView.getFloat32 */
+  /// @domName DataView.getFloat32; @docsEditable true
   num getFloat32(int byteOffset, {bool littleEndian}) native;
 
-  /** @domName DataView.getFloat64 */
+  /// @domName DataView.getFloat64; @docsEditable true
   num getFloat64(int byteOffset, {bool littleEndian}) native;
 
-  /** @domName DataView.getInt16 */
+  /// @domName DataView.getInt16; @docsEditable true
   int getInt16(int byteOffset, {bool littleEndian}) native;
 
-  /** @domName DataView.getInt32 */
+  /// @domName DataView.getInt32; @docsEditable true
   int getInt32(int byteOffset, {bool littleEndian}) native;
 
-  /** @domName DataView.getInt8 */
+  /// @domName DataView.getInt8; @docsEditable true
   int getInt8(int byteOffset) native;
 
-  /** @domName DataView.getUint16 */
+  /// @domName DataView.getUint16; @docsEditable true
   int getUint16(int byteOffset, {bool littleEndian}) native;
 
-  /** @domName DataView.getUint32 */
+  /// @domName DataView.getUint32; @docsEditable true
   int getUint32(int byteOffset, {bool littleEndian}) native;
 
-  /** @domName DataView.getUint8 */
+  /// @domName DataView.getUint8; @docsEditable true
   int getUint8(int byteOffset) native;
 
-  /** @domName DataView.setFloat32 */
+  /// @domName DataView.setFloat32; @docsEditable true
   void setFloat32(int byteOffset, num value, {bool littleEndian}) native;
 
-  /** @domName DataView.setFloat64 */
+  /// @domName DataView.setFloat64; @docsEditable true
   void setFloat64(int byteOffset, num value, {bool littleEndian}) native;
 
-  /** @domName DataView.setInt16 */
+  /// @domName DataView.setInt16; @docsEditable true
   void setInt16(int byteOffset, int value, {bool littleEndian}) native;
 
-  /** @domName DataView.setInt32 */
+  /// @domName DataView.setInt32; @docsEditable true
   void setInt32(int byteOffset, int value, {bool littleEndian}) native;
 
-  /** @domName DataView.setInt8 */
+  /// @domName DataView.setInt8; @docsEditable true
   void setInt8(int byteOffset, int value) native;
 
-  /** @domName DataView.setUint16 */
+  /// @domName DataView.setUint16; @docsEditable true
   void setUint16(int byteOffset, int value, {bool littleEndian}) native;
 
-  /** @domName DataView.setUint32 */
+  /// @domName DataView.setUint32; @docsEditable true
   void setUint32(int byteOffset, int value, {bool littleEndian}) native;
 
-  /** @domName DataView.setUint8 */
+  /// @domName DataView.setUint8; @docsEditable true
   void setUint8(int byteOffset, int value) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5786,19 +6174,19 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Database
+/// @domName Database; @docsEditable true
 class Database native "*Database" {
 
-  /** @domName Database.version */
+  /// @domName Database.version; @docsEditable true
   final String version;
 
-  /** @domName Database.changeVersion */
+  /// @domName Database.changeVersion; @docsEditable true
   void changeVersion(String oldVersion, String newVersion, [SQLTransactionCallback callback, SQLTransactionErrorCallback errorCallback, VoidCallback successCallback]) native;
 
-  /** @domName Database.readTransaction */
+  /// @domName Database.readTransaction; @docsEditable true
   void readTransaction(SQLTransactionCallback callback, [SQLTransactionErrorCallback errorCallback, VoidCallback successCallback]) native;
 
-  /** @domName Database.transaction */
+  /// @domName Database.transaction; @docsEditable true
   void transaction(SQLTransactionCallback callback, [SQLTransactionErrorCallback errorCallback, VoidCallback successCallback]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5814,22 +6202,22 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName DatabaseSync
+/// @domName DatabaseSync; @docsEditable true
 class DatabaseSync native "*DatabaseSync" {
 
-  /** @domName DatabaseSync.lastErrorMessage */
+  /// @domName DatabaseSync.lastErrorMessage; @docsEditable true
   final String lastErrorMessage;
 
-  /** @domName DatabaseSync.version */
+  /// @domName DatabaseSync.version; @docsEditable true
   final String version;
 
-  /** @domName DatabaseSync.changeVersion */
+  /// @domName DatabaseSync.changeVersion; @docsEditable true
   void changeVersion(String oldVersion, String newVersion, [SQLTransactionSyncCallback callback]) native;
 
-  /** @domName DatabaseSync.readTransaction */
+  /// @domName DatabaseSync.readTransaction; @docsEditable true
   void readTransaction(SQLTransactionSyncCallback callback) native;
 
-  /** @domName DatabaseSync.transaction */
+  /// @domName DatabaseSync.transaction; @docsEditable true
   void transaction(SQLTransactionSyncCallback callback) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5837,16 +6225,14 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName DedicatedWorkerContext
+/// @domName DedicatedWorkerContext; @docsEditable true
 class DedicatedWorkerContext extends WorkerContext native "*DedicatedWorkerContext" {
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   DedicatedWorkerContextEvents get on =>
     new DedicatedWorkerContextEvents(this);
 
-  /** @domName DedicatedWorkerContext.postMessage */
+  /// @domName DedicatedWorkerContext.postMessage; @docsEditable true
   void postMessage(/*any*/ message, [List messagePorts]) {
     if (?messagePorts) {
       var message_1 = _convertDartToNative_SerializedScriptValue(message);
@@ -5871,10 +6257,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName DelayNode
+/// @domName DelayNode; @docsEditable true
 class DelayNode extends AudioNode native "*DelayNode" {
 
-  /** @domName DelayNode.delayTime */
+  /// @domName DelayNode.delayTime; @docsEditable true
   final AudioParam delayTime;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5882,12 +6268,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLDetailsElement
+/// @domName HTMLDetailsElement; @docsEditable true
 class DetailsElement extends Element implements Element native "*HTMLDetailsElement" {
 
-  factory DetailsElement() => _Elements.createDetailsElement();
+  factory DetailsElement() => document.$dom_createElement("details");
 
-  /** @domName HTMLDetailsElement.open */
+  /// @domName HTMLDetailsElement.open; @docsEditable true
   bool open;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5895,10 +6281,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName DeviceMotionEvent
+/// @domName DeviceMotionEvent; @docsEditable true
 class DeviceMotionEvent extends Event native "*DeviceMotionEvent" {
 
-  /** @domName DeviceMotionEvent.interval */
+  /// @domName DeviceMotionEvent.interval; @docsEditable true
   final num interval;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5906,22 +6292,22 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName DeviceOrientationEvent
+/// @domName DeviceOrientationEvent; @docsEditable true
 class DeviceOrientationEvent extends Event native "*DeviceOrientationEvent" {
 
-  /** @domName DeviceOrientationEvent.absolute */
+  /// @domName DeviceOrientationEvent.absolute; @docsEditable true
   final bool absolute;
 
-  /** @domName DeviceOrientationEvent.alpha */
+  /// @domName DeviceOrientationEvent.alpha; @docsEditable true
   final num alpha;
 
-  /** @domName DeviceOrientationEvent.beta */
+  /// @domName DeviceOrientationEvent.beta; @docsEditable true
   final num beta;
 
-  /** @domName DeviceOrientationEvent.gamma */
+  /// @domName DeviceOrientationEvent.gamma; @docsEditable true
   final num gamma;
 
-  /** @domName DeviceOrientationEvent.initDeviceOrientationEvent */
+  /// @domName DeviceOrientationEvent.initDeviceOrientationEvent; @docsEditable true
   void initDeviceOrientationEvent(String type, bool bubbles, bool cancelable, num alpha, num beta, num gamma, bool absolute) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5929,10 +6315,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLDirectoryElement
+/// @domName HTMLDirectoryElement; @docsEditable true
 class DirectoryElement extends Element implements Element native "*HTMLDirectoryElement" {
 
-  /** @domName HTMLDirectoryElement.compact */
+  /// @domName HTMLDirectoryElement.compact; @docsEditable true
   bool compact;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5940,13 +6326,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName DirectoryEntry
+/// @domName DirectoryEntry; @docsEditable true
 class DirectoryEntry extends Entry native "*DirectoryEntry" {
 
-  /** @domName DirectoryEntry.createReader */
+  /// @domName DirectoryEntry.createReader; @docsEditable true
   DirectoryReader createReader() native;
 
-  /** @domName DirectoryEntry.getDirectory */
+  /// @domName DirectoryEntry.getDirectory; @docsEditable true
   void getDirectory(String path, {Map options, EntryCallback successCallback, ErrorCallback errorCallback}) {
     if (?errorCallback) {
       var options_1 = _convertDartToNative_Dictionary(options);
@@ -5971,7 +6357,7 @@
   void _getDirectory_3(path, options) native "getDirectory";
   void _getDirectory_4(path) native "getDirectory";
 
-  /** @domName DirectoryEntry.getFile */
+  /// @domName DirectoryEntry.getFile; @docsEditable true
   void getFile(String path, {Map options, EntryCallback successCallback, ErrorCallback errorCallback}) {
     if (?errorCallback) {
       var options_1 = _convertDartToNative_Dictionary(options);
@@ -5996,7 +6382,7 @@
   void _getFile_3(path, options) native "getFile";
   void _getFile_4(path) native "getFile";
 
-  /** @domName DirectoryEntry.removeRecursively */
+  /// @domName DirectoryEntry.removeRecursively; @docsEditable true
   void removeRecursively(VoidCallback successCallback, [ErrorCallback errorCallback]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6004,27 +6390,27 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName DirectoryEntrySync
+/// @domName DirectoryEntrySync; @docsEditable true
 class DirectoryEntrySync extends EntrySync native "*DirectoryEntrySync" {
 
-  /** @domName DirectoryEntrySync.createReader */
+  /// @domName DirectoryEntrySync.createReader; @docsEditable true
   DirectoryReaderSync createReader() native;
 
-  /** @domName DirectoryEntrySync.getDirectory */
+  /// @domName DirectoryEntrySync.getDirectory; @docsEditable true
   DirectoryEntrySync getDirectory(String path, Map flags) {
     var flags_1 = _convertDartToNative_Dictionary(flags);
     return _getDirectory_1(path, flags_1);
   }
   DirectoryEntrySync _getDirectory_1(path, flags) native "getDirectory";
 
-  /** @domName DirectoryEntrySync.getFile */
+  /// @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";
 
-  /** @domName DirectoryEntrySync.removeRecursively */
+  /// @domName DirectoryEntrySync.removeRecursively; @docsEditable true
   void removeRecursively() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6032,10 +6418,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName DirectoryReader
+/// @domName DirectoryReader; @docsEditable true
 class DirectoryReader native "*DirectoryReader" {
 
-  /** @domName DirectoryReader.readEntries */
+  /// @domName DirectoryReader.readEntries; @docsEditable true
   void readEntries(EntriesCallback successCallback, [ErrorCallback errorCallback]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6043,10 +6429,11 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName DirectoryReaderSync
+/// @domName DirectoryReaderSync; @docsEditable true
 class DirectoryReaderSync native "*DirectoryReaderSync" {
 
-  /** @domName DirectoryReaderSync.readEntries */
+  /// @domName DirectoryReaderSync.readEntries; @docsEditable true
+  @Returns('_EntryArraySync') @Creates('_EntryArraySync')
   List<EntrySync> readEntries() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6054,10 +6441,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLDivElement
+/// @domName HTMLDivElement; @docsEditable true
 class DivElement extends Element implements Element native "*HTMLDivElement" {
 
-  factory DivElement() => _Elements.createDivElement();
+  factory DivElement() => document.$dom_createElement("div");
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -6068,169 +6455,171 @@
 {
 
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   DocumentEvents get on =>
     new DocumentEvents(this);
 
-  /** @domName Document.body */
+  /// @domName Document.body; @docsEditable true
   Element get $dom_body => JS("Element", "#.body", this);
 
-  /** @domName Document.body */
+  /// @domName Document.body; @docsEditable true
   void set $dom_body(Element value) {
     JS("void", "#.body = #", this, value);
   }
 
-  /** @domName Document.charset */
+  /// @domName Document.charset; @docsEditable true
   String charset;
 
-  /** @domName Document.cookie */
+  /// @domName Document.cookie; @docsEditable true
   String cookie;
 
-  /** @domName Document.defaultView */
+  /// @domName Document.defaultView; @docsEditable true
   Window get window => _convertNativeToDart_Window(this._window);
   dynamic get _window => JS("dynamic", "#.defaultView", this);
 
-  /** @domName Document.documentElement */
+  /// @domName Document.documentElement; @docsEditable true
   final Element documentElement;
 
-  /** @domName Document.domain */
+  /// @domName Document.domain; @docsEditable true
   final String domain;
 
-  /** @domName Document.head */
+  /// @domName Document.head; @docsEditable true
   HeadElement get $dom_head => JS("HeadElement", "#.head", this);
 
-  /** @domName Document.implementation */
+  /// @domName Document.implementation; @docsEditable true
   final DOMImplementation implementation;
 
-  /** @domName Document.lastModified */
+  /// @domName Document.lastModified; @docsEditable true
   String get $dom_lastModified => JS("String", "#.lastModified", this);
 
-  /** @domName Document.preferredStylesheetSet */
+  /// @domName Document.preferredStylesheetSet; @docsEditable true
   final String preferredStylesheetSet;
 
-  /** @domName Document.readyState */
+  /// @domName Document.readyState; @docsEditable true
   final String readyState;
 
-  /** @domName Document.referrer */
+  /// @domName Document.referrer; @docsEditable true
   String get $dom_referrer => JS("String", "#.referrer", this);
 
-  /** @domName Document.selectedStylesheetSet */
+  /// @domName Document.selectedStylesheetSet; @docsEditable true
   String selectedStylesheetSet;
 
-  /** @domName Document.styleSheets */
-  List<StyleSheet> get $dom_styleSheets => JS("List<StyleSheet>", "#.styleSheets", this);
+  /// @domName Document.styleSheets; @docsEditable true
+  List<StyleSheet> get $dom_styleSheets => JS("_StyleSheetList", "#.styleSheets", this);
 
-  /** @domName Document.title */
+  /// @domName Document.title; @docsEditable true
   String get $dom_title => JS("String", "#.title", this);
 
-  /** @domName Document.title */
+  /// @domName Document.title; @docsEditable true
   void set $dom_title(String value) {
     JS("void", "#.title = #", this, value);
   }
 
-  /** @domName Document.webkitFullscreenElement */
+  /// @domName Document.webkitFullscreenElement; @docsEditable true
   Element get $dom_webkitFullscreenElement => JS("Element", "#.webkitFullscreenElement", this);
 
-  /** @domName Document.webkitFullscreenEnabled */
+  /// @domName Document.webkitFullscreenEnabled; @docsEditable true
   bool get $dom_webkitFullscreenEnabled => JS("bool", "#.webkitFullscreenEnabled", this);
 
-  /** @domName Document.webkitHidden */
+  /// @domName Document.webkitHidden; @docsEditable true
   bool get $dom_webkitHidden => JS("bool", "#.webkitHidden", this);
 
-  /** @domName Document.webkitIsFullScreen */
+  /// @domName Document.webkitIsFullScreen; @docsEditable true
   bool get $dom_webkitIsFullScreen => JS("bool", "#.webkitIsFullScreen", this);
 
-  /** @domName Document.webkitPointerLockElement */
+  /// @domName Document.webkitPointerLockElement; @docsEditable true
   Element get $dom_webkitPointerLockElement => JS("Element", "#.webkitPointerLockElement", this);
 
-  /** @domName Document.webkitVisibilityState */
+  /// @domName Document.webkitVisibilityState; @docsEditable true
   String get $dom_webkitVisibilityState => JS("String", "#.webkitVisibilityState", this);
 
-  /** @domName Document.caretRangeFromPoint */
+  /// @domName Document.caretRangeFromPoint; @docsEditable true
   Range $dom_caretRangeFromPoint(int x, int y) native "caretRangeFromPoint";
 
-  /** @domName Document.createCDATASection */
+  /// @domName Document.createCDATASection; @docsEditable true
   CDATASection createCDATASection(String data) native;
 
-  /** @domName Document.createDocumentFragment */
+  /// @domName Document.createDocumentFragment; @docsEditable true
   DocumentFragment createDocumentFragment() native;
 
-  /** @domName Document.createElement */
+  /// @domName Document.createElement; @docsEditable true
   Element $dom_createElement(String tagName) native "createElement";
 
-  /** @domName Document.createElementNS */
+  /// @domName Document.createElementNS; @docsEditable true
   Element $dom_createElementNS(String namespaceURI, String qualifiedName) native "createElementNS";
 
-  /** @domName Document.createEvent */
+  /// @domName Document.createEvent; @docsEditable true
   Event $dom_createEvent(String eventType) native "createEvent";
 
-  /** @domName Document.createRange */
+  /// @domName Document.createRange; @docsEditable true
   Range createRange() native;
 
-  /** @domName Document.createTextNode */
+  /// @domName Document.createTextNode; @docsEditable true
   Text $dom_createTextNode(String data) native "createTextNode";
 
-  /** @domName Document.createTouch */
+  /// @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";
 
-  /** @domName Document.createTouchList */
+  /// @domName Document.createTouchList; @docsEditable true
   TouchList $dom_createTouchList() native "createTouchList";
 
-  /** @domName Document.elementFromPoint */
+  /// @domName Document.elementFromPoint; @docsEditable true
   Element $dom_elementFromPoint(int x, int y) native "elementFromPoint";
 
-  /** @domName Document.execCommand */
+  /// @domName Document.execCommand; @docsEditable true
   bool execCommand(String command, bool userInterface, String value) native;
 
-  /** @domName Document.getCSSCanvasContext */
+  /// @domName Document.getCSSCanvasContext; @docsEditable true
   CanvasRenderingContext getCSSCanvasContext(String contextId, String name, int width, int height) native;
 
-  /** @domName Document.getElementById */
+  /// @domName Document.getElementById; @docsEditable true
   Element $dom_getElementById(String elementId) native "getElementById";
 
-  /** @domName Document.getElementsByClassName */
+  /// @domName Document.getElementsByClassName; @docsEditable true
+  @Returns('_NodeList') @Creates('_NodeList')
   List<Node> $dom_getElementsByClassName(String tagname) native "getElementsByClassName";
 
-  /** @domName Document.getElementsByName */
+  /// @domName Document.getElementsByName; @docsEditable true
+  @Returns('_NodeList') @Creates('_NodeList')
   List<Node> $dom_getElementsByName(String elementName) native "getElementsByName";
 
-  /** @domName Document.getElementsByTagName */
+  /// @domName Document.getElementsByTagName; @docsEditable true
+  @Returns('_NodeList') @Creates('_NodeList')
   List<Node> $dom_getElementsByTagName(String tagname) native "getElementsByTagName";
 
-  /** @domName Document.queryCommandEnabled */
+  /// @domName Document.queryCommandEnabled; @docsEditable true
   bool queryCommandEnabled(String command) native;
 
-  /** @domName Document.queryCommandIndeterm */
+  /// @domName Document.queryCommandIndeterm; @docsEditable true
   bool queryCommandIndeterm(String command) native;
 
-  /** @domName Document.queryCommandState */
+  /// @domName Document.queryCommandState; @docsEditable true
   bool queryCommandState(String command) native;
 
-  /** @domName Document.queryCommandSupported */
+  /// @domName Document.queryCommandSupported; @docsEditable true
   bool queryCommandSupported(String command) native;
 
-  /** @domName Document.queryCommandValue */
+  /// @domName Document.queryCommandValue; @docsEditable true
   String queryCommandValue(String command) native;
 
-  /** @domName Document.querySelector */
+  /// @domName Document.querySelector; @docsEditable true
   Element $dom_querySelector(String selectors) native "querySelector";
 
-  /** @domName Document.querySelectorAll */
+  /// @domName Document.querySelectorAll; @docsEditable true
+  @Returns('_NodeList') @Creates('_NodeList')
   List<Node> $dom_querySelectorAll(String selectors) native "querySelectorAll";
 
-  /** @domName Document.webkitCancelFullScreen */
+  /// @domName Document.webkitCancelFullScreen; @docsEditable true
   void $dom_webkitCancelFullScreen() native "webkitCancelFullScreen";
 
-  /** @domName Document.webkitExitFullscreen */
+  /// @domName Document.webkitExitFullscreen; @docsEditable true
   void $dom_webkitExitFullscreen() native "webkitExitFullscreen";
 
-  /** @domName Document.webkitExitPointerLock */
+  /// @domName Document.webkitExitPointerLock; @docsEditable true
   void $dom_webkitExitPointerLock() native "webkitExitPointerLock";
 
   // TODO(jacobr): implement all Element methods not on Document.
@@ -6396,24 +6785,33 @@
       _DocumentFragmentFactoryProvider.createDocumentFragment_html(html);
 
   factory DocumentFragment.svg(String svgContent) =>
-      new _DocumentFragmentFactoryProvider.createDocumentFragment_svg(svgContent);
+      _DocumentFragmentFactoryProvider.createDocumentFragment_svg(svgContent);
 
-  List<Element> _elements;
-
-  List<Element> get elements {
-    if (_elements == null) {
-      _elements = new FilteredElementList(this);
-    }
-    return _elements;
-  }
+  List<Element> get elements => this.children;
 
   // TODO: The type of value should be Collection<Element>. See http://b/5392897
   void set elements(value) {
+    this.children = value;
+  }
+
+  // Native field is used only by Dart code so does not lead to instantiation
+  // of native classes
+  @Creates('Null')
+  List<Element> _children;
+
+  List<Element> get children {
+    if (_children == null) {
+      _children = new FilteredElementList(this);
+    }
+    return _children;
+  }
+
+  void set children(Collection<Element> value) {
     // Copy list first since we don't want liveness during iteration.
     List copy = new List.from(value);
-    final elements = this.elements;
-    elements.clear();
-    elements.addAll(copy);
+    var children = this.children;
+    children.clear();
+    children.addAll(copy);
   }
 
   Element query(String selectors) => $dom_querySelector(selectors);
@@ -6622,16 +7020,15 @@
   }
 
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   ElementEvents get on =>
     new ElementEvents(this);
 
-  /** @domName DocumentFragment.querySelector */
+  /// @domName DocumentFragment.querySelector; @docsEditable true
   Element $dom_querySelector(String selectors) native "querySelector";
 
-  /** @domName DocumentFragment.querySelectorAll */
+  /// @domName DocumentFragment.querySelectorAll; @docsEditable true
+  @Returns('_NodeList') @Creates('_NodeList')
   List<Node> $dom_querySelectorAll(String selectors) native "querySelectorAll";
 
 }
@@ -6640,28 +7037,28 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName DocumentType
+/// @domName DocumentType; @docsEditable true
 class DocumentType extends Node native "*DocumentType" {
 
-  /** @domName DocumentType.entities */
+  /// @domName DocumentType.entities; @docsEditable true
   final NamedNodeMap entities;
 
-  /** @domName DocumentType.internalSubset */
+  /// @domName DocumentType.internalSubset; @docsEditable true
   final String internalSubset;
 
-  /** @domName DocumentType.name */
+  /// @domName DocumentType.name; @docsEditable true
   final String name;
 
-  /** @domName DocumentType.notations */
+  /// @domName DocumentType.notations; @docsEditable true
   final NamedNodeMap notations;
 
-  /** @domName DocumentType.publicId */
+  /// @domName DocumentType.publicId; @docsEditable true
   final String publicId;
 
-  /** @domName DocumentType.systemId */
+  /// @domName DocumentType.systemId; @docsEditable true
   final String systemId;
 
-  /** @domName DocumentType.remove */
+  /// @domName DocumentType.remove; @docsEditable true
   void remove() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6669,25 +7066,25 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName DynamicsCompressorNode
+/// @domName DynamicsCompressorNode; @docsEditable true
 class DynamicsCompressorNode extends AudioNode native "*DynamicsCompressorNode" {
 
-  /** @domName DynamicsCompressorNode.attack */
+  /// @domName DynamicsCompressorNode.attack; @docsEditable true
   final AudioParam attack;
 
-  /** @domName DynamicsCompressorNode.knee */
+  /// @domName DynamicsCompressorNode.knee; @docsEditable true
   final AudioParam knee;
 
-  /** @domName DynamicsCompressorNode.ratio */
+  /// @domName DynamicsCompressorNode.ratio; @docsEditable true
   final AudioParam ratio;
 
-  /** @domName DynamicsCompressorNode.reduction */
+  /// @domName DynamicsCompressorNode.reduction; @docsEditable true
   final AudioParam reduction;
 
-  /** @domName DynamicsCompressorNode.release */
+  /// @domName DynamicsCompressorNode.release; @docsEditable true
   final AudioParam release;
 
-  /** @domName DynamicsCompressorNode.threshold */
+  /// @domName DynamicsCompressorNode.threshold; @docsEditable true
   final AudioParam threshold;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6695,7 +7092,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName EXTTextureFilterAnisotropic
+/// @domName EXTTextureFilterAnisotropic; @docsEditable true
 class EXTTextureFilterAnisotropic native "*EXTTextureFilterAnisotropic" {
 
   static const int MAX_TEXTURE_MAX_ANISOTROPY_EXT = 0x84FF;
@@ -6848,6 +7245,11 @@
     return result;
   }
 
+  Element get first {
+    return _element.$dom_firstElementChild;
+  }
+
+
   Element get last {
     return _element.$dom_lastElementChild;
   }
@@ -6862,10 +7264,6 @@
 
   _FrozenElementList._wrap(this._nodeList);
 
-  Element get first {
-    return _nodeList[0];
-  }
-
   bool contains(Element element) {
     for (Element el in this) {
       if (el == element) return true;
@@ -6974,6 +7372,8 @@
     throw new UnsupportedError('');
   }
 
+  Element get first => _nodeList.first;
+
   Element get last => _nodeList.last;
 }
 
@@ -7001,16 +7401,7 @@
   bool get hasNext => _index < _list.length;
 }
 
-/**
- * All your attribute manipulation needs in one place.
- * Extends the regular Map interface by automatically coercing non-string
- * values to strings.
- */
-abstract class AttributeMap implements Map<String, String> {
-  void operator []=(String key, value);
-}
-
-class _ElementAttributeMap extends AttributeMap {
+class _ElementAttributeMap implements Map<String, String> {
 
   final Element _element;
 
@@ -7105,7 +7496,7 @@
  * Provides a Map abstraction on top of data-* attributes, similar to the
  * dataSet in the old DOM.
  */
-class _DataAttributeMap extends AttributeMap {
+class _DataAttributeMap implements Map<String, String> {
 
   final Map<String, String> $dom_attributes;
 
@@ -7218,7 +7609,7 @@
   String toString() => "($left, $top, $width, $height)";
 }
 
-class Element extends Node implements ElementTraversal native "*Element" {
+abstract class Element extends Node implements ElementTraversal native "*Element" {
 
   factory Element.html(String html) =>
       _ElementFactoryProvider.createElement_html(html);
@@ -7229,7 +7620,7 @@
    * @domName Element.hasAttribute, Element.getAttribute, Element.setAttribute,
    *   Element.removeAttribute
    */
-  _ElementAttributeMap get attributes => new _ElementAttributeMap(this);
+  Map<String, String> get attributes => new _ElementAttributeMap(this);
 
   void set attributes(Map<String, String> value) {
     Map<String, String> attributes = this.attributes;
@@ -7240,16 +7631,27 @@
   }
 
   void set elements(Collection<Element> value) {
-    final elements = this.elements;
-    elements.clear();
-    elements.addAll(value);
+    this.children = value;
   }
 
   /**
+   * Deprecated, use [children] instead.
+   */
+  List<Element> get elements => this.children;
+
+  /**
    * @domName childElementCount, firstElementChild, lastElementChild,
    *   children, Node.nodes.add
    */
-  List<Element> get elements => new _ChildrenElementList._wrap(this);
+  List<Element> get children => new _ChildrenElementList._wrap(this);
+
+  void set children(Collection<Element> value) {
+    // Copy list first since we don't want liveness during iteration.
+    List copy = new List.from(value);
+    var children = this.children;
+    children.clear();
+    children.addAll(copy);
+  }
 
   Element query(String selectors) => $dom_querySelector(selectors);
 
@@ -7315,6 +7717,7 @@
    * [wc]: http://dvcs.w3.org/hg/webcomponents/raw-file/tip/explainer/index.html
    * [x-tags]: http://x-tags.org/
    */
+  @Creates('Null')  // Set from Dart code; does not instantiate a native type.
   var xtag;
 
   // TODO(vsm): Implement noSuchMethod or similar for dart2js.
@@ -7377,188 +7780,190 @@
   }
 
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   ElementEvents get on =>
     new ElementEvents(this);
 
-  /** @domName HTMLElement.children */
+  /// @domName HTMLElement.children; @docsEditable true
   HTMLCollection get $dom_children => JS("HTMLCollection", "#.children", this);
 
-  /** @domName HTMLElement.contentEditable */
+  /// @domName HTMLElement.contentEditable; @docsEditable true
   String contentEditable;
 
-  /** @domName HTMLElement.dir */
+  /// @domName HTMLElement.dir; @docsEditable true
   String dir;
 
-  /** @domName HTMLElement.draggable */
+  /// @domName HTMLElement.draggable; @docsEditable true
   bool draggable;
 
-  /** @domName HTMLElement.hidden */
+  /// @domName HTMLElement.hidden; @docsEditable true
   bool hidden;
 
-  /** @domName HTMLElement.id */
+  /// @domName HTMLElement.id; @docsEditable true
   String id;
 
-  /** @domName HTMLElement.innerHTML */
+  /// @domName HTMLElement.innerHTML; @docsEditable true
   String innerHTML;
 
-  /** @domName HTMLElement.isContentEditable */
+  /// @domName HTMLElement.isContentEditable; @docsEditable true
   final bool isContentEditable;
 
-  /** @domName HTMLElement.lang */
+  /// @domName HTMLElement.lang; @docsEditable true
   String lang;
 
-  /** @domName HTMLElement.outerHTML */
+  /// @domName HTMLElement.outerHTML; @docsEditable true
   final String outerHTML;
 
-  /** @domName HTMLElement.spellcheck */
+  /// @domName HTMLElement.spellcheck; @docsEditable true
   bool spellcheck;
 
-  /** @domName HTMLElement.tabIndex */
+  /// @domName HTMLElement.tabIndex; @docsEditable true
   int tabIndex;
 
-  /** @domName HTMLElement.title */
+  /// @domName HTMLElement.title; @docsEditable true
   String title;
 
-  /** @domName HTMLElement.translate */
+  /// @domName HTMLElement.translate; @docsEditable true
   bool translate;
 
-  /** @domName HTMLElement.webkitdropzone */
+  /// @domName HTMLElement.webkitdropzone; @docsEditable true
   String webkitdropzone;
 
-  /** @domName HTMLElement.click */
+  /// @domName HTMLElement.click; @docsEditable true
   void click() native;
 
   static const int ALLOW_KEYBOARD_INPUT = 1;
 
-  /** @domName Element.childElementCount */
+  /// @domName Element.childElementCount; @docsEditable true
   int get $dom_childElementCount => JS("int", "#.childElementCount", this);
 
-  /** @domName Element.className */
+  /// @domName Element.className; @docsEditable true
   String get $dom_className => JS("String", "#.className", this);
 
-  /** @domName Element.className */
+  /// @domName Element.className; @docsEditable true
   void set $dom_className(String value) {
     JS("void", "#.className = #", this, value);
   }
 
-  /** @domName Element.clientHeight */
+  /// @domName Element.clientHeight; @docsEditable true
   final int clientHeight;
 
-  /** @domName Element.clientLeft */
+  /// @domName Element.clientLeft; @docsEditable true
   final int clientLeft;
 
-  /** @domName Element.clientTop */
+  /// @domName Element.clientTop; @docsEditable true
   final int clientTop;
 
-  /** @domName Element.clientWidth */
+  /// @domName Element.clientWidth; @docsEditable true
   final int clientWidth;
 
-  /** @domName Element.dataset */
+  /// @domName Element.dataset; @docsEditable true
   final Map<String, String> dataset;
 
-  /** @domName Element.firstElementChild */
+  /// @domName Element.firstElementChild; @docsEditable true
   Element get $dom_firstElementChild => JS("Element", "#.firstElementChild", this);
 
-  /** @domName Element.lastElementChild */
+  /// @domName Element.lastElementChild; @docsEditable true
   Element get $dom_lastElementChild => JS("Element", "#.lastElementChild", this);
 
-  /** @domName Element.nextElementSibling */
+  /// @domName Element.nextElementSibling; @docsEditable true
   final Element nextElementSibling;
 
-  /** @domName Element.offsetHeight */
+  /// @domName Element.offsetHeight; @docsEditable true
   final int offsetHeight;
 
-  /** @domName Element.offsetLeft */
+  /// @domName Element.offsetLeft; @docsEditable true
   final int offsetLeft;
 
-  /** @domName Element.offsetParent */
+  /// @domName Element.offsetParent; @docsEditable true
   final Element offsetParent;
 
-  /** @domName Element.offsetTop */
+  /// @domName Element.offsetTop; @docsEditable true
   final int offsetTop;
 
-  /** @domName Element.offsetWidth */
+  /// @domName Element.offsetWidth; @docsEditable true
   final int offsetWidth;
 
-  /** @domName Element.previousElementSibling */
+  /// @domName Element.previousElementSibling; @docsEditable true
   final Element previousElementSibling;
 
-  /** @domName Element.scrollHeight */
+  /// @domName Element.scrollHeight; @docsEditable true
   final int scrollHeight;
 
-  /** @domName Element.scrollLeft */
+  /// @domName Element.scrollLeft; @docsEditable true
   int scrollLeft;
 
-  /** @domName Element.scrollTop */
+  /// @domName Element.scrollTop; @docsEditable true
   int scrollTop;
 
-  /** @domName Element.scrollWidth */
+  /// @domName Element.scrollWidth; @docsEditable true
   final int scrollWidth;
 
-  /** @domName Element.style */
+  /// @domName Element.style; @docsEditable true
   final CSSStyleDeclaration style;
 
-  /** @domName Element.tagName */
+  /// @domName Element.tagName; @docsEditable true
   final String tagName;
 
-  /** @domName Element.blur */
+  /// @domName Element.blur; @docsEditable true
   void blur() native;
 
-  /** @domName Element.focus */
+  /// @domName Element.focus; @docsEditable true
   void focus() native;
 
-  /** @domName Element.getAttribute */
+  /// @domName Element.getAttribute; @docsEditable true
   String $dom_getAttribute(String name) native "getAttribute";
 
-  /** @domName Element.getBoundingClientRect */
+  /// @domName Element.getBoundingClientRect; @docsEditable true
   ClientRect getBoundingClientRect() native;
 
-  /** @domName Element.getClientRects */
+  /// @domName Element.getClientRects; @docsEditable true
+  @Returns('_ClientRectList') @Creates('_ClientRectList')
   List<ClientRect> getClientRects() native;
 
-  /** @domName Element.getElementsByClassName */
+  /// @domName Element.getElementsByClassName; @docsEditable true
+  @Returns('_NodeList') @Creates('_NodeList')
   List<Node> $dom_getElementsByClassName(String name) native "getElementsByClassName";
 
-  /** @domName Element.getElementsByTagName */
+  /// @domName Element.getElementsByTagName; @docsEditable true
+  @Returns('_NodeList') @Creates('_NodeList')
   List<Node> $dom_getElementsByTagName(String name) native "getElementsByTagName";
 
-  /** @domName Element.hasAttribute */
+  /// @domName Element.hasAttribute; @docsEditable true
   bool $dom_hasAttribute(String name) native "hasAttribute";
 
-  /** @domName Element.querySelector */
+  /// @domName Element.querySelector; @docsEditable true
   Element $dom_querySelector(String selectors) native "querySelector";
 
-  /** @domName Element.querySelectorAll */
+  /// @domName Element.querySelectorAll; @docsEditable true
+  @Returns('_NodeList') @Creates('_NodeList')
   List<Node> $dom_querySelectorAll(String selectors) native "querySelectorAll";
 
-  /** @domName Element.removeAttribute */
+  /// @domName Element.removeAttribute; @docsEditable true
   void $dom_removeAttribute(String name) native "removeAttribute";
 
-  /** @domName Element.scrollByLines */
+  /// @domName Element.scrollByLines; @docsEditable true
   void scrollByLines(int lines) native;
 
-  /** @domName Element.scrollByPages */
+  /// @domName Element.scrollByPages; @docsEditable true
   void scrollByPages(int pages) native;
 
-  /** @domName Element.scrollIntoViewIfNeeded */
+  /// @domName Element.scrollIntoViewIfNeeded; @docsEditable true
   void scrollIntoView([bool centerIfNeeded]) native "scrollIntoViewIfNeeded";
 
-  /** @domName Element.setAttribute */
+  /// @domName Element.setAttribute; @docsEditable true
   void $dom_setAttribute(String name, String value) native "setAttribute";
 
-  /** @domName Element.webkitMatchesSelector */
+  /// @domName Element.webkitMatchesSelector; @docsEditable true
   bool matchesSelector(String selectors) native "webkitMatchesSelector";
 
-  /** @domName Element.webkitRequestFullScreen */
+  /// @domName Element.webkitRequestFullScreen; @docsEditable true
   void webkitRequestFullScreen(int flags) native;
 
-  /** @domName Element.webkitRequestFullscreen */
+  /// @domName Element.webkitRequestFullscreen; @docsEditable true
   void webkitRequestFullscreen() native;
 
-  /** @domName Element.webkitRequestPointerLock */
+  /// @domName Element.webkitRequestPointerLock; @docsEditable true
   void webkitRequestPointerLock() native;
 
 }
@@ -7603,15 +8008,15 @@
     temp.innerHTML = html;
 
     Element element;
-    if (temp.elements.length == 1) {
-      element = temp.elements[0];
-    } else if (parentTag == 'html' && temp.elements.length == 2) {
+    if (temp.children.length == 1) {
+      element = temp.children[0];
+    } else if (parentTag == 'html' && temp.children.length == 2) {
       // Work around for edge case in WebKit and possibly other browsers where
       // both body and head elements are created even though the inner html
       // only contains a head or body element.
-      element = temp.elements[tag == 'head' ? 0 : 1];
+      element = temp.children[tag == 'head' ? 0 : 1];
     } else {
-      throw new ArgumentError('HTML had ${temp.elements.length} '
+      throw new ArgumentError('HTML had ${temp.children.length} '
           'top level elements but 1 expected');
     }
     element.remove();
@@ -7747,16 +8152,16 @@
 /// @domName ElementTimeControl
 abstract class ElementTimeControl {
 
-  /** @domName ElementTimeControl.beginElement */
+  /// @domName ElementTimeControl.beginElement; @docsEditable true
   void beginElement();
 
-  /** @domName ElementTimeControl.beginElementAt */
+  /// @domName ElementTimeControl.beginElementAt; @docsEditable true
   void beginElementAt(num offset);
 
-  /** @domName ElementTimeControl.endElement */
+  /// @domName ElementTimeControl.endElement; @docsEditable true
   void endElement();
 
-  /** @domName ElementTimeControl.endElementAt */
+  /// @domName ElementTimeControl.endElementAt; @docsEditable true
   void endElementAt(num offset);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7782,27 +8187,27 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLEmbedElement
+/// @domName HTMLEmbedElement; @docsEditable true
 class EmbedElement extends Element implements Element native "*HTMLEmbedElement" {
 
-  factory EmbedElement() => _Elements.createEmbedElement();
+  factory EmbedElement() => document.$dom_createElement("embed");
 
-  /** @domName HTMLEmbedElement.align */
+  /// @domName HTMLEmbedElement.align; @docsEditable true
   String align;
 
-  /** @domName HTMLEmbedElement.height */
+  /// @domName HTMLEmbedElement.height; @docsEditable true
   String height;
 
-  /** @domName HTMLEmbedElement.name */
+  /// @domName HTMLEmbedElement.name; @docsEditable true
   String name;
 
-  /** @domName HTMLEmbedElement.src */
+  /// @domName HTMLEmbedElement.src; @docsEditable true
   String src;
 
-  /** @domName HTMLEmbedElement.type */
+  /// @domName HTMLEmbedElement.type; @docsEditable true
   String type;
 
-  /** @domName HTMLEmbedElement.width */
+  /// @domName HTMLEmbedElement.width; @docsEditable true
   String width;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7810,7 +8215,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName EntityReference
+/// @domName EntityReference; @docsEditable true
 class EntityReference extends Node native "*EntityReference" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7826,40 +8231,40 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Entry
+/// @domName Entry; @docsEditable true
 class Entry native "*Entry" {
 
-  /** @domName Entry.filesystem */
+  /// @domName Entry.filesystem; @docsEditable true
   final DOMFileSystem filesystem;
 
-  /** @domName Entry.fullPath */
+  /// @domName Entry.fullPath; @docsEditable true
   final String fullPath;
 
-  /** @domName Entry.isDirectory */
+  /// @domName Entry.isDirectory; @docsEditable true
   final bool isDirectory;
 
-  /** @domName Entry.isFile */
+  /// @domName Entry.isFile; @docsEditable true
   final bool isFile;
 
-  /** @domName Entry.name */
+  /// @domName Entry.name; @docsEditable true
   final String name;
 
-  /** @domName Entry.copyTo */
+  /// @domName Entry.copyTo; @docsEditable true
   void copyTo(DirectoryEntry parent, [String name, EntryCallback successCallback, ErrorCallback errorCallback]) native;
 
-  /** @domName Entry.getMetadata */
+  /// @domName Entry.getMetadata; @docsEditable true
   void getMetadata(MetadataCallback successCallback, [ErrorCallback errorCallback]) native;
 
-  /** @domName Entry.getParent */
+  /// @domName Entry.getParent; @docsEditable true
   void getParent([EntryCallback successCallback, ErrorCallback errorCallback]) native;
 
-  /** @domName Entry.moveTo */
+  /// @domName Entry.moveTo; @docsEditable true
   void moveTo(DirectoryEntry parent, [String name, EntryCallback successCallback, ErrorCallback errorCallback]) native;
 
-  /** @domName Entry.remove */
+  /// @domName Entry.remove; @docsEditable true
   void remove(VoidCallback successCallback, [ErrorCallback errorCallback]) native;
 
-  /** @domName Entry.toURL */
+  /// @domName Entry.toURL; @docsEditable true
   String toURL() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7875,40 +8280,40 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName EntrySync
+/// @domName EntrySync; @docsEditable true
 class EntrySync native "*EntrySync" {
 
-  /** @domName EntrySync.filesystem */
+  /// @domName EntrySync.filesystem; @docsEditable true
   final DOMFileSystemSync filesystem;
 
-  /** @domName EntrySync.fullPath */
+  /// @domName EntrySync.fullPath; @docsEditable true
   final String fullPath;
 
-  /** @domName EntrySync.isDirectory */
+  /// @domName EntrySync.isDirectory; @docsEditable true
   final bool isDirectory;
 
-  /** @domName EntrySync.isFile */
+  /// @domName EntrySync.isFile; @docsEditable true
   final bool isFile;
 
-  /** @domName EntrySync.name */
+  /// @domName EntrySync.name; @docsEditable true
   final String name;
 
-  /** @domName EntrySync.copyTo */
+  /// @domName EntrySync.copyTo; @docsEditable true
   EntrySync copyTo(DirectoryEntrySync parent, String name) native;
 
-  /** @domName EntrySync.getMetadata */
+  /// @domName EntrySync.getMetadata; @docsEditable true
   Metadata getMetadata() native;
 
-  /** @domName EntrySync.getParent */
+  /// @domName EntrySync.getParent; @docsEditable true
   EntrySync getParent() native;
 
-  /** @domName EntrySync.moveTo */
+  /// @domName EntrySync.moveTo; @docsEditable true
   EntrySync moveTo(DirectoryEntrySync parent, String name) native;
 
-  /** @domName EntrySync.remove */
+  /// @domName EntrySync.remove; @docsEditable true
   void remove() native;
 
-  /** @domName EntrySync.toURL */
+  /// @domName EntrySync.toURL; @docsEditable true
   String toURL() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7924,16 +8329,16 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName ErrorEvent
+/// @domName ErrorEvent; @docsEditable true
 class ErrorEvent extends Event native "*ErrorEvent" {
 
-  /** @domName ErrorEvent.filename */
+  /// @domName ErrorEvent.filename; @docsEditable true
   final String filename;
 
-  /** @domName ErrorEvent.lineno */
+  /// @domName ErrorEvent.lineno; @docsEditable true
   final int lineno;
 
-  /** @domName ErrorEvent.message */
+  /// @domName ErrorEvent.message; @docsEditable true
   final String message;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7993,51 +8398,51 @@
 
   static const int SELECT = 16384;
 
-  /** @domName Event.bubbles */
+  /// @domName Event.bubbles; @docsEditable true
   final bool bubbles;
 
-  /** @domName Event.cancelBubble */
+  /// @domName Event.cancelBubble; @docsEditable true
   bool cancelBubble;
 
-  /** @domName Event.cancelable */
+  /// @domName Event.cancelable; @docsEditable true
   final bool cancelable;
 
-  /** @domName Event.clipboardData */
+  /// @domName Event.clipboardData; @docsEditable true
   final Clipboard clipboardData;
 
-  /** @domName Event.currentTarget */
+  /// @domName Event.currentTarget; @docsEditable true
   EventTarget get currentTarget => _convertNativeToDart_EventTarget(this._currentTarget);
   dynamic get _currentTarget => JS("dynamic", "#.currentTarget", this);
 
-  /** @domName Event.defaultPrevented */
+  /// @domName Event.defaultPrevented; @docsEditable true
   final bool defaultPrevented;
 
-  /** @domName Event.eventPhase */
+  /// @domName Event.eventPhase; @docsEditable true
   final int eventPhase;
 
-  /** @domName Event.returnValue */
+  /// @domName Event.returnValue; @docsEditable true
   bool returnValue;
 
-  /** @domName Event.target */
+  /// @domName Event.target; @docsEditable true
   EventTarget get target => _convertNativeToDart_EventTarget(this._target);
   dynamic get _target => JS("dynamic", "#.target", this);
 
-  /** @domName Event.timeStamp */
+  /// @domName Event.timeStamp; @docsEditable true
   final int timeStamp;
 
-  /** @domName Event.type */
+  /// @domName Event.type; @docsEditable true
   final String type;
 
-  /** @domName Event.initEvent */
+  /// @domName Event.initEvent; @docsEditable true
   void $dom_initEvent(String eventTypeArg, bool canBubbleArg, bool cancelableArg) native "initEvent";
 
-  /** @domName Event.preventDefault */
+  /// @domName Event.preventDefault; @docsEditable true
   void preventDefault() native;
 
-  /** @domName Event.stopImmediatePropagation */
+  /// @domName Event.stopImmediatePropagation; @docsEditable true
   void stopImmediatePropagation() native;
 
-  /** @domName Event.stopPropagation */
+  /// @domName Event.stopPropagation; @docsEditable true
   void stopPropagation() native;
 
 }
@@ -8046,23 +8451,23 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName EventException
+/// @domName EventException; @docsEditable true
 class EventException native "*EventException" {
 
   static const int DISPATCH_REQUEST_ERR = 1;
 
   static const int UNSPECIFIED_EVENT_TYPE_ERR = 0;
 
-  /** @domName EventException.code */
+  /// @domName EventException.code; @docsEditable true
   final int code;
 
-  /** @domName EventException.message */
+  /// @domName EventException.message; @docsEditable true
   final String message;
 
-  /** @domName EventException.name */
+  /// @domName EventException.name; @docsEditable true
   final String name;
 
-  /** @domName EventException.toString */
+  /// @domName EventException.toString; @docsEditable true
   String toString() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8070,14 +8475,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName EventSource
+/// @domName EventSource; @docsEditable true
 class EventSource extends EventTarget native "*EventSource" {
 
   factory EventSource(String scriptUrl) => _EventSourceFactoryProvider.createEventSource(scriptUrl);
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   EventSourceEvents get on =>
     new EventSourceEvents(this);
 
@@ -8087,25 +8490,25 @@
 
   static const int OPEN = 1;
 
-  /** @domName EventSource.URL */
+  /// @domName EventSource.URL; @docsEditable true
   final String URL;
 
-  /** @domName EventSource.readyState */
+  /// @domName EventSource.readyState; @docsEditable true
   final int readyState;
 
-  /** @domName EventSource.url */
+  /// @domName EventSource.url; @docsEditable true
   final String url;
 
-  /** @domName EventSource.addEventListener */
+  /// @domName EventSource.addEventListener; @docsEditable true
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
 
-  /** @domName EventSource.close */
+  /// @domName EventSource.close; @docsEditable true
   void close() native;
 
-  /** @domName EventSource.dispatchEvent */
+  /// @domName EventSource.dispatchEvent; @docsEditable true
   bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
 
-  /** @domName EventSource.removeEventListener */
+  /// @domName EventSource.removeEventListener; @docsEditable true
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
 }
 
@@ -8174,13 +8577,13 @@
   /** @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent */
   Events get on => new Events(this);
 
-  /** @domName EventTarget.addEventListener */
+  /// @domName EventTarget.addEventListener; @docsEditable true
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
 
-  /** @domName EventTarget.dispatchEvent */
+  /// @domName EventTarget.dispatchEvent; @docsEditable true
   bool $dom_dispatchEvent(Event event) native "dispatchEvent";
 
-  /** @domName EventTarget.removeEventListener */
+  /// @domName EventTarget.removeEventListener; @docsEditable true
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
 
 }
@@ -8189,39 +8592,39 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLFieldSetElement
+/// @domName HTMLFieldSetElement; @docsEditable true
 class FieldSetElement extends Element implements Element native "*HTMLFieldSetElement" {
 
-  factory FieldSetElement() => _Elements.createFieldSetElement();
+  factory FieldSetElement() => document.$dom_createElement("fieldset");
 
-  /** @domName HTMLFieldSetElement.disabled */
+  /// @domName HTMLFieldSetElement.disabled; @docsEditable true
   bool disabled;
 
-  /** @domName HTMLFieldSetElement.elements */
+  /// @domName HTMLFieldSetElement.elements; @docsEditable true
   final HTMLCollection elements;
 
-  /** @domName HTMLFieldSetElement.form */
+  /// @domName HTMLFieldSetElement.form; @docsEditable true
   final FormElement form;
 
-  /** @domName HTMLFieldSetElement.name */
+  /// @domName HTMLFieldSetElement.name; @docsEditable true
   String name;
 
-  /** @domName HTMLFieldSetElement.type */
+  /// @domName HTMLFieldSetElement.type; @docsEditable true
   final String type;
 
-  /** @domName HTMLFieldSetElement.validationMessage */
+  /// @domName HTMLFieldSetElement.validationMessage; @docsEditable true
   final String validationMessage;
 
-  /** @domName HTMLFieldSetElement.validity */
+  /// @domName HTMLFieldSetElement.validity; @docsEditable true
   final ValidityState validity;
 
-  /** @domName HTMLFieldSetElement.willValidate */
+  /// @domName HTMLFieldSetElement.willValidate; @docsEditable true
   final bool willValidate;
 
-  /** @domName HTMLFieldSetElement.checkValidity */
+  /// @domName HTMLFieldSetElement.checkValidity; @docsEditable true
   bool checkValidity() native;
 
-  /** @domName HTMLFieldSetElement.setCustomValidity */
+  /// @domName HTMLFieldSetElement.setCustomValidity; @docsEditable true
   void setCustomValidity(String error) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8229,16 +8632,16 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName File
+/// @domName File; @docsEditable true
 class File extends Blob native "*File" {
 
-  /** @domName File.lastModifiedDate */
+  /// @domName File.lastModifiedDate; @docsEditable true
   final Date lastModifiedDate;
 
-  /** @domName File.name */
+  /// @domName File.name; @docsEditable true
   final String name;
 
-  /** @domName File.webkitRelativePath */
+  /// @domName File.webkitRelativePath; @docsEditable true
   final String webkitRelativePath;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8254,13 +8657,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName FileEntry
+/// @domName FileEntry; @docsEditable true
 class FileEntry extends Entry native "*FileEntry" {
 
-  /** @domName FileEntry.createWriter */
+  /// @domName FileEntry.createWriter; @docsEditable true
   void createWriter(FileWriterCallback successCallback, [ErrorCallback errorCallback]) native;
 
-  /** @domName FileEntry.file */
+  /// @domName FileEntry.file; @docsEditable true
   void file(FileCallback successCallback, [ErrorCallback errorCallback]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8268,13 +8671,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName FileEntrySync
+/// @domName FileEntrySync; @docsEditable true
 class FileEntrySync extends EntrySync native "*FileEntrySync" {
 
-  /** @domName FileEntrySync.createWriter */
+  /// @domName FileEntrySync.createWriter; @docsEditable true
   FileWriterSync createWriter() native;
 
-  /** @domName FileEntrySync.file */
+  /// @domName FileEntrySync.file; @docsEditable true
   File file() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8282,7 +8685,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName FileError
+/// @domName FileError; @docsEditable true
 class FileError native "*FileError" {
 
   static const int ABORT_ERR = 3;
@@ -8309,7 +8712,7 @@
 
   static const int TYPE_MISMATCH_ERR = 11;
 
-  /** @domName FileError.code */
+  /// @domName FileError.code; @docsEditable true
   final int code;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8317,7 +8720,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName FileException
+/// @domName FileException; @docsEditable true
 class FileException native "*FileException" {
 
   static const int ABORT_ERR = 3;
@@ -8344,16 +8747,16 @@
 
   static const int TYPE_MISMATCH_ERR = 11;
 
-  /** @domName FileException.code */
+  /// @domName FileException.code; @docsEditable true
   final int code;
 
-  /** @domName FileException.message */
+  /// @domName FileException.message; @docsEditable true
   final String message;
 
-  /** @domName FileException.name */
+  /// @domName FileException.name; @docsEditable true
   final String name;
 
-  /** @domName FileException.toString */
+  /// @domName FileException.toString; @docsEditable true
   String toString() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8361,14 +8764,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName FileReader
+/// @domName FileReader; @docsEditable true
 class FileReader extends EventTarget native "*FileReader" {
 
   factory FileReader() => _FileReaderFactoryProvider.createFileReader();
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   FileReaderEvents get on =>
     new FileReaderEvents(this);
 
@@ -8378,37 +8779,38 @@
 
   static const int LOADING = 1;
 
-  /** @domName FileReader.error */
+  /// @domName FileReader.error; @docsEditable true
   final FileError error;
 
-  /** @domName FileReader.readyState */
+  /// @domName FileReader.readyState; @docsEditable true
   final int readyState;
 
-  /** @domName FileReader.result */
+  /// @domName FileReader.result; @docsEditable true
+  @Creates('String|ArrayBuffer|Null')
   final Object result;
 
-  /** @domName FileReader.abort */
+  /// @domName FileReader.abort; @docsEditable true
   void abort() native;
 
-  /** @domName FileReader.addEventListener */
+  /// @domName FileReader.addEventListener; @docsEditable true
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
 
-  /** @domName FileReader.dispatchEvent */
+  /// @domName FileReader.dispatchEvent; @docsEditable true
   bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
 
-  /** @domName FileReader.readAsArrayBuffer */
+  /// @domName FileReader.readAsArrayBuffer; @docsEditable true
   void readAsArrayBuffer(Blob blob) native;
 
-  /** @domName FileReader.readAsBinaryString */
+  /// @domName FileReader.readAsBinaryString; @docsEditable true
   void readAsBinaryString(Blob blob) native;
 
-  /** @domName FileReader.readAsDataURL */
+  /// @domName FileReader.readAsDataURL; @docsEditable true
   void readAsDataURL(Blob blob) native;
 
-  /** @domName FileReader.readAsText */
+  /// @domName FileReader.readAsText; @docsEditable true
   void readAsText(Blob blob, [String encoding]) native;
 
-  /** @domName FileReader.removeEventListener */
+  /// @domName FileReader.removeEventListener; @docsEditable true
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
 }
 
@@ -8432,21 +8834,21 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName FileReaderSync
+/// @domName FileReaderSync; @docsEditable true
 class FileReaderSync native "*FileReaderSync" {
 
   factory FileReaderSync() => _FileReaderSyncFactoryProvider.createFileReaderSync();
 
-  /** @domName FileReaderSync.readAsArrayBuffer */
+  /// @domName FileReaderSync.readAsArrayBuffer; @docsEditable true
   ArrayBuffer readAsArrayBuffer(Blob blob) native;
 
-  /** @domName FileReaderSync.readAsBinaryString */
+  /// @domName FileReaderSync.readAsBinaryString; @docsEditable true
   String readAsBinaryString(Blob blob) native;
 
-  /** @domName FileReaderSync.readAsDataURL */
+  /// @domName FileReaderSync.readAsDataURL; @docsEditable true
   String readAsDataURL(Blob blob) native;
 
-  /** @domName FileReaderSync.readAsText */
+  /// @domName FileReaderSync.readAsText; @docsEditable true
   String readAsText(Blob blob, [String encoding]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8462,12 +8864,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName FileWriter
+/// @domName FileWriter; @docsEditable true
 class FileWriter extends EventTarget native "*FileWriter" {
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   FileWriterEvents get on =>
     new FileWriterEvents(this);
 
@@ -8477,37 +8877,37 @@
 
   static const int WRITING = 1;
 
-  /** @domName FileWriter.error */
+  /// @domName FileWriter.error; @docsEditable true
   final FileError error;
 
-  /** @domName FileWriter.length */
+  /// @domName FileWriter.length; @docsEditable true
   final int length;
 
-  /** @domName FileWriter.position */
+  /// @domName FileWriter.position; @docsEditable true
   final int position;
 
-  /** @domName FileWriter.readyState */
+  /// @domName FileWriter.readyState; @docsEditable true
   final int readyState;
 
-  /** @domName FileWriter.abort */
+  /// @domName FileWriter.abort; @docsEditable true
   void abort() native;
 
-  /** @domName FileWriter.addEventListener */
+  /// @domName FileWriter.addEventListener; @docsEditable true
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
 
-  /** @domName FileWriter.dispatchEvent */
+  /// @domName FileWriter.dispatchEvent; @docsEditable true
   bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
 
-  /** @domName FileWriter.removeEventListener */
+  /// @domName FileWriter.removeEventListener; @docsEditable true
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
 
-  /** @domName FileWriter.seek */
+  /// @domName FileWriter.seek; @docsEditable true
   void seek(int position) native;
 
-  /** @domName FileWriter.truncate */
+  /// @domName FileWriter.truncate; @docsEditable true
   void truncate(int size) native;
 
-  /** @domName FileWriter.write */
+  /// @domName FileWriter.write; @docsEditable true
   void write(Blob data) native;
 }
 
@@ -8539,22 +8939,22 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName FileWriterSync
+/// @domName FileWriterSync; @docsEditable true
 class FileWriterSync native "*FileWriterSync" {
 
-  /** @domName FileWriterSync.length */
+  /// @domName FileWriterSync.length; @docsEditable true
   final int length;
 
-  /** @domName FileWriterSync.position */
+  /// @domName FileWriterSync.position; @docsEditable true
   final int position;
 
-  /** @domName FileWriterSync.seek */
+  /// @domName FileWriterSync.seek; @docsEditable true
   void seek(int position) native;
 
-  /** @domName FileWriterSync.truncate */
+  /// @domName FileWriterSync.truncate; @docsEditable true
   void truncate(int size) native;
 
-  /** @domName FileWriterSync.write */
+  /// @domName FileWriterSync.write; @docsEditable true
   void write(Blob data) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8562,7 +8962,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Float32Array
+/// @domName Float32Array; @docsEditable true
 class Float32Array extends ArrayBufferView implements JavaScriptIndexingBehavior, List<num> native "*Float32Array" {
 
   factory Float32Array(int length) =>
@@ -8576,13 +8976,12 @@
 
   static const int BYTES_PER_ELEMENT = 4;
 
-  /** @domName Float32Array.length */
+  /// @domName Float32Array.length; @docsEditable true
   final int length;
 
   num operator[](int index) => JS("num", "#[#]", this, index);
 
-  void operator[]=(int index, num value) => JS("void", "#[#] = #", this, index, value);
-  // -- start List<num> mixins.
+  void operator[]=(int index, num value) { JS("void", "#[#] = #", this, index, value); }  // -- start List<num> mixins.
   // num is the element type.
 
   // From Iterable<num>:
@@ -8637,6 +9036,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  num get first => this[0];
+
   num get last => this[length - 1];
 
   num removeLast() {
@@ -8660,10 +9061,10 @@
 
   // -- end List<num> mixins.
 
-  /** @domName Float32Array.setElements */
+  /// @domName Float32Array.setElements; @docsEditable true
   void setElements(Object array, [int offset]) native "set";
 
-  /** @domName Float32Array.subarray */
+  /// @domName Float32Array.subarray; @docsEditable true
   Float32Array subarray(int start, [int end]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8671,7 +9072,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Float64Array
+/// @domName Float64Array; @docsEditable true
 class Float64Array extends ArrayBufferView implements JavaScriptIndexingBehavior, List<num> native "*Float64Array" {
 
   factory Float64Array(int length) =>
@@ -8685,13 +9086,12 @@
 
   static const int BYTES_PER_ELEMENT = 8;
 
-  /** @domName Float64Array.length */
+  /// @domName Float64Array.length; @docsEditable true
   final int length;
 
   num operator[](int index) => JS("num", "#[#]", this, index);
 
-  void operator[]=(int index, num value) => JS("void", "#[#] = #", this, index, value);
-  // -- start List<num> mixins.
+  void operator[]=(int index, num value) { JS("void", "#[#] = #", this, index, value); }  // -- start List<num> mixins.
   // num is the element type.
 
   // From Iterable<num>:
@@ -8746,6 +9146,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  num get first => this[0];
+
   num get last => this[length - 1];
 
   num removeLast() {
@@ -8769,10 +9171,10 @@
 
   // -- end List<num> mixins.
 
-  /** @domName Float64Array.setElements */
+  /// @domName Float64Array.setElements; @docsEditable true
   void setElements(Object array, [int offset]) native "set";
 
-  /** @domName Float64Array.subarray */
+  /// @domName Float64Array.subarray; @docsEditable true
   Float64Array subarray(int start, [int end]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8780,16 +9182,16 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLFontElement
+/// @domName HTMLFontElement; @docsEditable true
 class FontElement extends Element implements Element native "*HTMLFontElement" {
 
-  /** @domName HTMLFontElement.color */
+  /// @domName HTMLFontElement.color; @docsEditable true
   String color;
 
-  /** @domName HTMLFontElement.face */
+  /// @domName HTMLFontElement.face; @docsEditable true
   String face;
 
-  /** @domName HTMLFontElement.size */
+  /// @domName HTMLFontElement.size; @docsEditable true
   String size;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8797,7 +9199,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName FormData
+/// @domName FormData; @docsEditable true
 class FormData native "*FormData" {
 
   factory FormData([FormElement form]) {
@@ -8807,7 +9209,7 @@
     return _FormDataFactoryProvider.createFormData(form);
   }
 
-  /** @domName FormData.append */
+  /// @domName FormData.append; @docsEditable true
   void append(String name, String value, String filename) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8815,48 +9217,48 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLFormElement
+/// @domName HTMLFormElement; @docsEditable true
 class FormElement extends Element implements Element native "*HTMLFormElement" {
 
-  factory FormElement() => _Elements.createFormElement();
+  factory FormElement() => document.$dom_createElement("form");
 
-  /** @domName HTMLFormElement.acceptCharset */
+  /// @domName HTMLFormElement.acceptCharset; @docsEditable true
   String acceptCharset;
 
-  /** @domName HTMLFormElement.action */
+  /// @domName HTMLFormElement.action; @docsEditable true
   String action;
 
-  /** @domName HTMLFormElement.autocomplete */
+  /// @domName HTMLFormElement.autocomplete; @docsEditable true
   String autocomplete;
 
-  /** @domName HTMLFormElement.encoding */
+  /// @domName HTMLFormElement.encoding; @docsEditable true
   String encoding;
 
-  /** @domName HTMLFormElement.enctype */
+  /// @domName HTMLFormElement.enctype; @docsEditable true
   String enctype;
 
-  /** @domName HTMLFormElement.length */
+  /// @domName HTMLFormElement.length; @docsEditable true
   final int length;
 
-  /** @domName HTMLFormElement.method */
+  /// @domName HTMLFormElement.method; @docsEditable true
   String method;
 
-  /** @domName HTMLFormElement.name */
+  /// @domName HTMLFormElement.name; @docsEditable true
   String name;
 
-  /** @domName HTMLFormElement.noValidate */
+  /// @domName HTMLFormElement.noValidate; @docsEditable true
   bool noValidate;
 
-  /** @domName HTMLFormElement.target */
+  /// @domName HTMLFormElement.target; @docsEditable true
   String target;
 
-  /** @domName HTMLFormElement.checkValidity */
+  /// @domName HTMLFormElement.checkValidity; @docsEditable true
   bool checkValidity() native;
 
-  /** @domName HTMLFormElement.reset */
+  /// @domName HTMLFormElement.reset; @docsEditable true
   void reset() native;
 
-  /** @domName HTMLFormElement.submit */
+  /// @domName HTMLFormElement.submit; @docsEditable true
   void submit() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8864,44 +9266,44 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLFrameElement
+/// @domName HTMLFrameElement; @docsEditable true
 class FrameElement extends Element implements Element native "*HTMLFrameElement" {
 
-  /** @domName HTMLFrameElement.contentWindow */
+  /// @domName HTMLFrameElement.contentWindow; @docsEditable true
   Window get contentWindow => _convertNativeToDart_Window(this._contentWindow);
   dynamic get _contentWindow => JS("dynamic", "#.contentWindow", this);
 
-  /** @domName HTMLFrameElement.frameBorder */
+  /// @domName HTMLFrameElement.frameBorder; @docsEditable true
   String frameBorder;
 
-  /** @domName HTMLFrameElement.height */
+  /// @domName HTMLFrameElement.height; @docsEditable true
   final int height;
 
-  /** @domName HTMLFrameElement.location */
+  /// @domName HTMLFrameElement.location; @docsEditable true
   String location;
 
-  /** @domName HTMLFrameElement.longDesc */
+  /// @domName HTMLFrameElement.longDesc; @docsEditable true
   String longDesc;
 
-  /** @domName HTMLFrameElement.marginHeight */
+  /// @domName HTMLFrameElement.marginHeight; @docsEditable true
   String marginHeight;
 
-  /** @domName HTMLFrameElement.marginWidth */
+  /// @domName HTMLFrameElement.marginWidth; @docsEditable true
   String marginWidth;
 
-  /** @domName HTMLFrameElement.name */
+  /// @domName HTMLFrameElement.name; @docsEditable true
   String name;
 
-  /** @domName HTMLFrameElement.noResize */
+  /// @domName HTMLFrameElement.noResize; @docsEditable true
   bool noResize;
 
-  /** @domName HTMLFrameElement.scrolling */
+  /// @domName HTMLFrameElement.scrolling; @docsEditable true
   String scrolling;
 
-  /** @domName HTMLFrameElement.src */
+  /// @domName HTMLFrameElement.src; @docsEditable true
   String src;
 
-  /** @domName HTMLFrameElement.width */
+  /// @domName HTMLFrameElement.width; @docsEditable true
   final int width;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8909,19 +9311,17 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLFrameSetElement
+/// @domName HTMLFrameSetElement; @docsEditable true
 class FrameSetElement extends Element implements Element native "*HTMLFrameSetElement" {
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   FrameSetElementEvents get on =>
     new FrameSetElementEvents(this);
 
-  /** @domName HTMLFrameSetElement.cols */
+  /// @domName HTMLFrameSetElement.cols; @docsEditable true
   String cols;
 
-  /** @domName HTMLFrameSetElement.rows */
+  /// @domName HTMLFrameSetElement.rows; @docsEditable true
   String rows;
 }
 
@@ -8959,10 +9359,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName GainNode
+/// @domName GainNode; @docsEditable true
 class GainNode extends AudioNode native "*GainNode" {
 
-  /** @domName GainNode.gain */
+  /// @domName GainNode.gain; @docsEditable true
   final AudioGain gain;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8970,22 +9370,22 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Gamepad
+/// @domName Gamepad; @docsEditable true
 class Gamepad native "*Gamepad" {
 
-  /** @domName Gamepad.axes */
+  /// @domName Gamepad.axes; @docsEditable true
   final List<num> axes;
 
-  /** @domName Gamepad.buttons */
+  /// @domName Gamepad.buttons; @docsEditable true
   final List<num> buttons;
 
-  /** @domName Gamepad.id */
+  /// @domName Gamepad.id; @docsEditable true
   final String id;
 
-  /** @domName Gamepad.index */
+  /// @domName Gamepad.index; @docsEditable true
   final int index;
 
-  /** @domName Gamepad.timestamp */
+  /// @domName Gamepad.timestamp; @docsEditable true
   final int timestamp;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8993,16 +9393,16 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Geolocation
+/// @domName Geolocation; @docsEditable true
 class Geolocation native "*Geolocation" {
 
-  /** @domName Geolocation.clearWatch */
+  /// @domName Geolocation.clearWatch; @docsEditable true
   void clearWatch(int watchId) native;
 
-  /** @domName Geolocation.getCurrentPosition */
+  /// @domName Geolocation.getCurrentPosition; @docsEditable true
   void getCurrentPosition(PositionCallback successCallback, [PositionErrorCallback errorCallback, Object options]) native;
 
-  /** @domName Geolocation.watchPosition */
+  /// @domName Geolocation.watchPosition; @docsEditable true
   int watchPosition(PositionCallback successCallback, [PositionErrorCallback errorCallback, Object options]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -9010,13 +9410,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Geoposition
+/// @domName Geoposition; @docsEditable true
 class Geoposition native "*Geoposition" {
 
-  /** @domName Geoposition.coords */
+  /// @domName Geoposition.coords; @docsEditable true
   final Coordinates coords;
 
-  /** @domName Geoposition.timestamp */
+  /// @domName Geoposition.timestamp; @docsEditable true
   final int timestamp;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -9024,21 +9424,21 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLHRElement
+/// @domName HTMLHRElement; @docsEditable true
 class HRElement extends Element implements Element native "*HTMLHRElement" {
 
-  factory HRElement() => _Elements.createHRElement();
+  factory HRElement() => document.$dom_createElement("hr");
 
-  /** @domName HTMLHRElement.align */
+  /// @domName HTMLHRElement.align; @docsEditable true
   String align;
 
-  /** @domName HTMLHRElement.noShade */
+  /// @domName HTMLHRElement.noShade; @docsEditable true
   bool noShade;
 
-  /** @domName HTMLHRElement.size */
+  /// @domName HTMLHRElement.size; @docsEditable true
   String size;
 
-  /** @domName HTMLHRElement.width */
+  /// @domName HTMLHRElement.width; @docsEditable true
   String width;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -9046,10 +9446,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLAllCollection
+/// @domName HTMLAllCollection; @docsEditable true
 class HTMLAllCollection implements JavaScriptIndexingBehavior, List<Node> native "*HTMLAllCollection" {
 
-  /** @domName HTMLAllCollection.length */
+  /// @domName HTMLAllCollection.length; @docsEditable true
   final int length;
 
   Node operator[](int index) => JS("Node", "#[#]", this, index);
@@ -9112,6 +9512,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  Node get first => this[0];
+
   Node get last => this[length - 1];
 
   Node removeLast() {
@@ -9135,13 +9537,14 @@
 
   // -- end List<Node> mixins.
 
-  /** @domName HTMLAllCollection.item */
+  /// @domName HTMLAllCollection.item; @docsEditable true
   Node item(int index) native;
 
-  /** @domName HTMLAllCollection.namedItem */
+  /// @domName HTMLAllCollection.namedItem; @docsEditable true
   Node namedItem(String name) native;
 
-  /** @domName HTMLAllCollection.tags */
+  /// @domName HTMLAllCollection.tags; @docsEditable true
+  @Returns('_NodeList') @Creates('_NodeList')
   List<Node> tags(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -9149,10 +9552,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLCollection
+/// @domName HTMLCollection; @docsEditable true
 class HTMLCollection implements JavaScriptIndexingBehavior, List<Node> native "*HTMLCollection" {
 
-  /** @domName HTMLCollection.length */
+  /// @domName HTMLCollection.length; @docsEditable true
   final int length;
 
   Node operator[](int index) => JS("Node", "#[#]", this, index);
@@ -9215,6 +9618,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  Node get first => this[0];
+
   Node get last => this[length - 1];
 
   Node removeLast() {
@@ -9238,10 +9643,10 @@
 
   // -- end List<Node> mixins.
 
-  /** @domName HTMLCollection.item */
+  /// @domName HTMLCollection.item; @docsEditable true
   Node item(int index) native;
 
-  /** @domName HTMLCollection.namedItem */
+  /// @domName HTMLCollection.namedItem; @docsEditable true
   Node namedItem(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -9249,22 +9654,22 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLOptionsCollection
+/// @domName HTMLOptionsCollection; @docsEditable true
 class HTMLOptionsCollection extends HTMLCollection native "*HTMLOptionsCollection" {
 
   // Shadowing definition.
-  /** @domName HTMLOptionsCollection.length */
+  /// @domName HTMLOptionsCollection.length; @docsEditable true
   int get length => JS("int", "#.length", this);
 
-  /** @domName HTMLOptionsCollection.length */
+  /// @domName HTMLOptionsCollection.length; @docsEditable true
   void set length(int value) {
     JS("void", "#.length = #", this, value);
   }
 
-  /** @domName HTMLOptionsCollection.selectedIndex */
+  /// @domName HTMLOptionsCollection.selectedIndex; @docsEditable true
   int selectedIndex;
 
-  /** @domName HTMLOptionsCollection.remove */
+  /// @domName HTMLOptionsCollection.remove; @docsEditable true
   void remove(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -9272,16 +9677,16 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HashChangeEvent
+/// @domName HashChangeEvent; @docsEditable true
 class HashChangeEvent extends Event native "*HashChangeEvent" {
 
-  /** @domName HashChangeEvent.newURL */
+  /// @domName HashChangeEvent.newURL; @docsEditable true
   final String newURL;
 
-  /** @domName HashChangeEvent.oldURL */
+  /// @domName HashChangeEvent.oldURL; @docsEditable true
   final String oldURL;
 
-  /** @domName HashChangeEvent.initHashChangeEvent */
+  /// @domName HashChangeEvent.initHashChangeEvent; @docsEditable true
   void initHashChangeEvent(String type, bool canBubble, bool cancelable, String oldURL, String newURL) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -9289,12 +9694,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLHeadElement
+/// @domName HTMLHeadElement; @docsEditable true
 class HeadElement extends Element implements Element native "*HTMLHeadElement" {
 
-  factory HeadElement() => _Elements.createHeadElement();
+  factory HeadElement() => document.$dom_createElement("head");
 
-  /** @domName HTMLHeadElement.profile */
+  /// @domName HTMLHeadElement.profile; @docsEditable true
   String profile;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -9302,22 +9707,22 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLHeadingElement
+/// @domName HTMLHeadingElement; @docsEditable true
 class HeadingElement extends Element implements Element native "*HTMLHeadingElement" {
 
-  factory HeadingElement.h1() => _Elements.createHeadingElement_h1();
+  factory HeadingElement.h1() => document.$dom_createElement("h1");
 
-  factory HeadingElement.h2() => _Elements.createHeadingElement_h2();
+  factory HeadingElement.h2() => document.$dom_createElement("h2");
 
-  factory HeadingElement.h3() => _Elements.createHeadingElement_h3();
+  factory HeadingElement.h3() => document.$dom_createElement("h3");
 
-  factory HeadingElement.h4() => _Elements.createHeadingElement_h4();
+  factory HeadingElement.h4() => document.$dom_createElement("h4");
 
-  factory HeadingElement.h5() => _Elements.createHeadingElement_h5();
+  factory HeadingElement.h5() => document.$dom_createElement("h5");
 
-  factory HeadingElement.h6() => _Elements.createHeadingElement_h6();
+  factory HeadingElement.h6() => document.$dom_createElement("h6");
 
-  /** @domName HTMLHeadingElement.align */
+  /// @domName HTMLHeadingElement.align; @docsEditable true
   String align;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -9329,7 +9734,7 @@
 
 class HtmlDocument extends Document native "*HTMLDocument" {
 
-  /** @domName HTMLDocument.activeElement */
+  /// @domName HTMLDocument.activeElement; @docsEditable true
   final Element activeElement;
 
   /** @domName Document.body */
@@ -9409,10 +9814,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLHtmlElement
+/// @domName HTMLHtmlElement; @docsEditable true
 class HtmlElement extends Element implements Element native "*HTMLHtmlElement" {
 
-  factory HtmlElement() => _Elements.createHtmlElement();
+  factory HtmlElement() => document.$dom_createElement("html");
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -9420,18 +9825,18 @@
 
 
 class HttpRequest extends EventTarget native "*XMLHttpRequest" {
-  factory HttpRequest.get(String url, onSuccess(HttpRequest request)) =>
-      _HttpRequestFactoryProvider.createHttpRequest_get(url, onSuccess);
+  factory HttpRequest.get(String url, onComplete(HttpRequest request)) =>
+      _HttpRequestFactoryProvider.createHttpRequest_get(url, onComplete);
 
-  factory HttpRequest.getWithCredentials(String url, onSuccess(HttpRequest request)) =>
-      _HttpRequestFactoryProvider.createHttpRequestgetWithCredentials(url, onSuccess);
+  factory HttpRequest.getWithCredentials(String url,
+      onComplete(HttpRequest request)) =>
+      _HttpRequestFactoryProvider.createHttpRequest_getWithCredentials(url,
+      onComplete);
 
 
   factory HttpRequest() => _HttpRequestFactoryProvider.createHttpRequest();
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   HttpRequestEvents get on =>
     new HttpRequestEvents(this);
 
@@ -9445,61 +9850,62 @@
 
   static const int UNSENT = 0;
 
-  /** @domName XMLHttpRequest.readyState */
+  /// @domName XMLHttpRequest.readyState; @docsEditable true
   final int readyState;
 
-  /** @domName XMLHttpRequest.response */
+  /// @domName XMLHttpRequest.response; @docsEditable true
+  @Creates('ArrayBuffer|Blob|Document|=Object|=List|String|num')
   final Object response;
 
-  /** @domName XMLHttpRequest.responseText */
+  /// @domName XMLHttpRequest.responseText; @docsEditable true
   final String responseText;
 
-  /** @domName XMLHttpRequest.responseType */
+  /// @domName XMLHttpRequest.responseType; @docsEditable true
   String responseType;
 
-  /** @domName XMLHttpRequest.responseXML */
+  /// @domName XMLHttpRequest.responseXML; @docsEditable true
   final Document responseXML;
 
-  /** @domName XMLHttpRequest.status */
+  /// @domName XMLHttpRequest.status; @docsEditable true
   final int status;
 
-  /** @domName XMLHttpRequest.statusText */
+  /// @domName XMLHttpRequest.statusText; @docsEditable true
   final String statusText;
 
-  /** @domName XMLHttpRequest.upload */
+  /// @domName XMLHttpRequest.upload; @docsEditable true
   final HttpRequestUpload upload;
 
-  /** @domName XMLHttpRequest.withCredentials */
+  /// @domName XMLHttpRequest.withCredentials; @docsEditable true
   bool withCredentials;
 
-  /** @domName XMLHttpRequest.abort */
+  /// @domName XMLHttpRequest.abort; @docsEditable true
   void abort() native;
 
-  /** @domName XMLHttpRequest.addEventListener */
+  /// @domName XMLHttpRequest.addEventListener; @docsEditable true
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
 
-  /** @domName XMLHttpRequest.dispatchEvent */
+  /// @domName XMLHttpRequest.dispatchEvent; @docsEditable true
   bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
 
-  /** @domName XMLHttpRequest.getAllResponseHeaders */
+  /// @domName XMLHttpRequest.getAllResponseHeaders; @docsEditable true
   String getAllResponseHeaders() native;
 
-  /** @domName XMLHttpRequest.getResponseHeader */
+  /// @domName XMLHttpRequest.getResponseHeader; @docsEditable true
   String getResponseHeader(String header) native;
 
-  /** @domName XMLHttpRequest.open */
+  /// @domName XMLHttpRequest.open; @docsEditable true
   void open(String method, String url, [bool async, String user, String password]) native;
 
-  /** @domName XMLHttpRequest.overrideMimeType */
+  /// @domName XMLHttpRequest.overrideMimeType; @docsEditable true
   void overrideMimeType(String override) native;
 
-  /** @domName XMLHttpRequest.removeEventListener */
+  /// @domName XMLHttpRequest.removeEventListener; @docsEditable true
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
 
-  /** @domName XMLHttpRequest.send */
+  /// @domName XMLHttpRequest.send; @docsEditable true
   void send([data]) native;
 
-  /** @domName XMLHttpRequest.setRequestHeader */
+  /// @domName XMLHttpRequest.setRequestHeader; @docsEditable true
   void setRequestHeader(String header, String value) native;
 
 }
@@ -9526,23 +9932,23 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName XMLHttpRequestException
+/// @domName XMLHttpRequestException; @docsEditable true
 class HttpRequestException native "*XMLHttpRequestException" {
 
   static const int ABORT_ERR = 102;
 
   static const int NETWORK_ERR = 101;
 
-  /** @domName XMLHttpRequestException.code */
+  /// @domName XMLHttpRequestException.code; @docsEditable true
   final int code;
 
-  /** @domName XMLHttpRequestException.message */
+  /// @domName XMLHttpRequestException.message; @docsEditable true
   final String message;
 
-  /** @domName XMLHttpRequestException.name */
+  /// @domName XMLHttpRequestException.name; @docsEditable true
   final String name;
 
-  /** @domName XMLHttpRequestException.toString */
+  /// @domName XMLHttpRequestException.toString; @docsEditable true
   String toString() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -9550,13 +9956,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName XMLHttpRequestProgressEvent
+/// @domName XMLHttpRequestProgressEvent; @docsEditable true
 class HttpRequestProgressEvent extends ProgressEvent native "*XMLHttpRequestProgressEvent" {
 
-  /** @domName XMLHttpRequestProgressEvent.position */
+  /// @domName XMLHttpRequestProgressEvent.position; @docsEditable true
   final int position;
 
-  /** @domName XMLHttpRequestProgressEvent.totalSize */
+  /// @domName XMLHttpRequestProgressEvent.totalSize; @docsEditable true
   final int totalSize;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -9564,22 +9970,20 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName XMLHttpRequestUpload
+/// @domName XMLHttpRequestUpload; @docsEditable true
 class HttpRequestUpload extends EventTarget native "*XMLHttpRequestUpload" {
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   HttpRequestUploadEvents get on =>
     new HttpRequestUploadEvents(this);
 
-  /** @domName XMLHttpRequestUpload.addEventListener */
+  /// @domName XMLHttpRequestUpload.addEventListener; @docsEditable true
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
 
-  /** @domName XMLHttpRequestUpload.dispatchEvent */
+  /// @domName XMLHttpRequestUpload.dispatchEvent; @docsEditable true
   bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
 
-  /** @domName XMLHttpRequestUpload.removeEventListener */
+  /// @domName XMLHttpRequestUpload.removeEventListener; @docsEditable true
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
 }
 
@@ -9603,7 +10007,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName IDBAny
+/// @domName IDBAny; @docsEditable true
 class IDBAny native "*IDBAny" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -9611,7 +10015,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName IDBCursor
+/// @domName IDBCursor; @docsEditable true
 class IDBCursor native "*IDBCursor" {
 
   static const int NEXT = 0;
@@ -9622,22 +10026,23 @@
 
   static const int PREV_NO_DUPLICATE = 3;
 
-  /** @domName IDBCursor.direction */
+  /// @domName IDBCursor.direction; @docsEditable true
   final String direction;
 
-  /** @domName IDBCursor.key */
+  /// @domName IDBCursor.key; @docsEditable true
+  @_annotation_Creates_IDBKey @_annotation_Returns_IDBKey
   final Object key;
 
-  /** @domName IDBCursor.primaryKey */
+  /// @domName IDBCursor.primaryKey; @docsEditable true
   final Object primaryKey;
 
-  /** @domName IDBCursor.source */
+  /// @domName IDBCursor.source; @docsEditable true
   final dynamic source;
 
-  /** @domName IDBCursor.advance */
+  /// @domName IDBCursor.advance; @docsEditable true
   void advance(int count) native;
 
-  /** @domName IDBCursor.continueFunction */
+  /// @domName IDBCursor.continueFunction; @docsEditable true
   void continueFunction([/*IDBKey*/ key]) {
     if (?key) {
       var key_1 = _convertDartToNative_IDBKey(key);
@@ -9650,10 +10055,10 @@
   void _continueFunction_1(key) native "continue";
   void _continueFunction_2() native "continue";
 
-  /** @domName IDBCursor.delete */
+  /// @domName IDBCursor.delete; @docsEditable true
   IDBRequest delete() native;
 
-  /** @domName IDBCursor.update */
+  /// @domName IDBCursor.update; @docsEditable true
   IDBRequest update(/*any*/ value) {
     var value_1 = _convertDartToNative_SerializedScriptValue(value);
     return _update_1(value_1);
@@ -9665,10 +10070,11 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName IDBCursorWithValue
+/// @domName IDBCursorWithValue; @docsEditable true
 class IDBCursorWithValue extends IDBCursor native "*IDBCursorWithValue" {
 
-  /** @domName IDBCursorWithValue.value */
+  /// @domName IDBCursorWithValue.value; @docsEditable true
+  @_annotation_Creates_SerializedScriptValue @_annotation_Returns_SerializedScriptValue
   final Object value;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -9720,28 +10126,27 @@
       JS('bool', 'typeof(#.mode) === "number"', txn);
 
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   IDBDatabaseEvents get on =>
     new IDBDatabaseEvents(this);
 
-  /** @domName IDBDatabase.name */
+  /// @domName IDBDatabase.name; @docsEditable true
   final String name;
 
-  /** @domName IDBDatabase.objectStoreNames */
+  /// @domName IDBDatabase.objectStoreNames; @docsEditable true
+  @Returns('_DOMStringList') @Creates('_DOMStringList')
   final List<String> objectStoreNames;
 
-  /** @domName IDBDatabase.version */
+  /// @domName IDBDatabase.version; @docsEditable true
   final dynamic version;
 
-  /** @domName IDBDatabase.addEventListener */
+  /// @domName IDBDatabase.addEventListener; @docsEditable true
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
 
-  /** @domName IDBDatabase.close */
+  /// @domName IDBDatabase.close; @docsEditable true
   void close() native;
 
-  /** @domName IDBDatabase.createObjectStore */
+  /// @domName IDBDatabase.createObjectStore; @docsEditable true
   IDBObjectStore createObjectStore(String name, [Map options]) {
     if (?options) {
       var options_1 = _convertDartToNative_Dictionary(options);
@@ -9752,16 +10157,16 @@
   IDBObjectStore _createObjectStore_1(name, options) native "createObjectStore";
   IDBObjectStore _createObjectStore_2(name) native "createObjectStore";
 
-  /** @domName IDBDatabase.deleteObjectStore */
+  /// @domName IDBDatabase.deleteObjectStore; @docsEditable true
   void deleteObjectStore(String name) native;
 
-  /** @domName IDBDatabase.dispatchEvent */
+  /// @domName IDBDatabase.dispatchEvent; @docsEditable true
   bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
 
-  /** @domName IDBDatabase.removeEventListener */
+  /// @domName IDBDatabase.removeEventListener; @docsEditable true
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
 
-  /** @domName IDBDatabase.setVersion */
+  /// @domName IDBDatabase.setVersion; @docsEditable true
   IDBVersionChangeRequest setVersion(String version) native;
 }
 
@@ -9783,7 +10188,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName IDBDatabaseException
+/// @domName IDBDatabaseException; @docsEditable true
 class IDBDatabaseException native "*IDBDatabaseException" {
 
   static const int ABORT_ERR = 20;
@@ -9812,16 +10217,16 @@
 
   static const int VER_ERR = 12;
 
-  /** @domName IDBDatabaseException.code */
+  /// @domName IDBDatabaseException.code; @docsEditable true
   final int code;
 
-  /** @domName IDBDatabaseException.message */
+  /// @domName IDBDatabaseException.message; @docsEditable true
   final String message;
 
-  /** @domName IDBDatabaseException.name */
+  /// @domName IDBDatabaseException.name; @docsEditable true
   final String name;
 
-  /** @domName IDBDatabaseException.toString */
+  /// @domName IDBDatabaseException.toString; @docsEditable true
   String toString() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -9829,10 +10234,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName IDBFactory
+/// @domName IDBFactory; @docsEditable true
 class IDBFactory native "*IDBFactory" {
 
-  /** @domName IDBFactory.cmp */
+  /// @domName IDBFactory.cmp; @docsEditable true
   int cmp(/*IDBKey*/ first, /*IDBKey*/ second) {
     var first_1 = _convertDartToNative_IDBKey(first);
     var second_2 = _convertDartToNative_IDBKey(second);
@@ -9840,13 +10245,14 @@
   }
   int _cmp_1(first, second) native "cmp";
 
-  /** @domName IDBFactory.deleteDatabase */
+  /// @domName IDBFactory.deleteDatabase; @docsEditable true
   IDBVersionChangeRequest deleteDatabase(String name) native;
 
-  /** @domName IDBFactory.open */
+  /// @domName IDBFactory.open; @docsEditable true
+  @Returns('IDBRequest') @Creates('IDBRequest') @Creates('IDBDatabase')
   IDBOpenDBRequest open(String name, [int version]) native;
 
-  /** @domName IDBFactory.webkitGetDatabaseNames */
+  /// @domName IDBFactory.webkitGetDatabaseNames; @docsEditable true
   IDBRequest webkitGetDatabaseNames() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -9854,25 +10260,25 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName IDBIndex
+/// @domName IDBIndex; @docsEditable true
 class IDBIndex native "*IDBIndex" {
 
-  /** @domName IDBIndex.keyPath */
+  /// @domName IDBIndex.keyPath; @docsEditable true
   final dynamic keyPath;
 
-  /** @domName IDBIndex.multiEntry */
+  /// @domName IDBIndex.multiEntry; @docsEditable true
   final bool multiEntry;
 
-  /** @domName IDBIndex.name */
+  /// @domName IDBIndex.name; @docsEditable true
   final String name;
 
-  /** @domName IDBIndex.objectStore */
+  /// @domName IDBIndex.objectStore; @docsEditable true
   final IDBObjectStore objectStore;
 
-  /** @domName IDBIndex.unique */
+  /// @domName IDBIndex.unique; @docsEditable true
   final bool unique;
 
-  /** @domName IDBIndex.count */
+  /// @domName IDBIndex.count; @docsEditable true
   IDBRequest count([key_OR_range]) {
     if (!?key_OR_range) {
       return _count_1();
@@ -9884,13 +10290,13 @@
       var key_1 = _convertDartToNative_IDBKey(key_OR_range);
       return _count_3(key_1);
     }
-    throw const Exception("Incorrect number or type of arguments");
+    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";
 
-  /** @domName IDBIndex.get */
+  /// @domName IDBIndex.get; @docsEditable true
   IDBRequest get(key) {
     if ((?key && (key is IDBKeyRange || key == null))) {
       return _get_1(key);
@@ -9899,12 +10305,14 @@
       var key_1 = _convertDartToNative_IDBKey(key);
       return _get_2(key_1);
     }
-    throw const Exception("Incorrect number or type of arguments");
+    throw new ArgumentError("Incorrect number or type of arguments");
   }
+  @Returns('IDBRequest') @Creates('IDBRequest') @_annotation_Creates_SerializedScriptValue
   IDBRequest _get_1(IDBKeyRange key) native "get";
+  @Returns('IDBRequest') @Creates('IDBRequest') @_annotation_Creates_SerializedScriptValue
   IDBRequest _get_2(key) native "get";
 
-  /** @domName IDBIndex.getKey */
+  /// @domName IDBIndex.getKey; @docsEditable true
   IDBRequest getKey(key) {
     if ((?key && (key is IDBKeyRange || key == null))) {
       return _getKey_1(key);
@@ -9913,12 +10321,14 @@
       var key_1 = _convertDartToNative_IDBKey(key);
       return _getKey_2(key_1);
     }
-    throw const Exception("Incorrect number or type of arguments");
+    throw new ArgumentError("Incorrect number or type of arguments");
   }
+  @Returns('IDBRequest') @Creates('IDBRequest') @_annotation_Creates_SerializedScriptValue @Creates('IDBObjectStore')
   IDBRequest _getKey_1(IDBKeyRange key) native "getKey";
+  @Returns('IDBRequest') @Creates('IDBRequest') @_annotation_Creates_SerializedScriptValue @Creates('IDBObjectStore')
   IDBRequest _getKey_2(key) native "getKey";
 
-  /** @domName IDBIndex.openCursor */
+  /// @domName IDBIndex.openCursor; @docsEditable true
   IDBRequest openCursor([key_OR_range, String direction]) {
     if (!?key_OR_range &&
         !?direction) {
@@ -9940,15 +10350,20 @@
       var key_2 = _convertDartToNative_IDBKey(key_OR_range);
       return _openCursor_5(key_2, direction);
     }
-    throw const Exception("Incorrect number or type of arguments");
+    throw new ArgumentError("Incorrect number or type of arguments");
   }
+  @Returns('IDBRequest') @Creates('IDBRequest') @Creates('IDBCursor')
   IDBRequest _openCursor_1() native "openCursor";
+  @Returns('IDBRequest') @Creates('IDBRequest') @Creates('IDBCursor')
   IDBRequest _openCursor_2(IDBKeyRange range) native "openCursor";
+  @Returns('IDBRequest') @Creates('IDBRequest') @Creates('IDBCursor')
   IDBRequest _openCursor_3(IDBKeyRange range, direction) native "openCursor";
+  @Returns('IDBRequest') @Creates('IDBRequest') @Creates('IDBCursor')
   IDBRequest _openCursor_4(key) native "openCursor";
+  @Returns('IDBRequest') @Creates('IDBRequest') @Creates('IDBCursor')
   IDBRequest _openCursor_5(key, direction) native "openCursor";
 
-  /** @domName IDBIndex.openKeyCursor */
+  /// @domName IDBIndex.openKeyCursor; @docsEditable true
   IDBRequest openKeyCursor([key_OR_range, String direction]) {
     if (!?key_OR_range &&
         !?direction) {
@@ -9970,12 +10385,17 @@
       var key_2 = _convertDartToNative_IDBKey(key_OR_range);
       return _openKeyCursor_5(key_2, direction);
     }
-    throw const Exception("Incorrect number or type of arguments");
+    throw new ArgumentError("Incorrect number or type of arguments");
   }
+  @Returns('IDBRequest') @Creates('IDBRequest') @Creates('IDBCursor')
   IDBRequest _openKeyCursor_1() native "openKeyCursor";
+  @Returns('IDBRequest') @Creates('IDBRequest') @Creates('IDBCursor')
   IDBRequest _openKeyCursor_2(IDBKeyRange range) native "openKeyCursor";
+  @Returns('IDBRequest') @Creates('IDBRequest') @Creates('IDBCursor')
   IDBRequest _openKeyCursor_3(IDBKeyRange range, direction) native "openKeyCursor";
+  @Returns('IDBRequest') @Creates('IDBRequest') @Creates('IDBCursor')
   IDBRequest _openKeyCursor_4(key) native "openKeyCursor";
+  @Returns('IDBRequest') @Creates('IDBRequest') @Creates('IDBCursor')
   IDBRequest _openKeyCursor_5(key, direction) native "openKeyCursor";
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -9983,7 +10403,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName IDBKey
+/// @domName IDBKey; @docsEditable true
 class IDBKey native "*IDBKey" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -10019,21 +10439,21 @@
           lower, upper, lowerOpen, upperOpen);
 
 
-  /** @domName IDBKeyRange.lower */
+  /// @domName IDBKeyRange.lower; @docsEditable true
   dynamic get lower => _convertNativeToDart_IDBKey(this._lower);
   dynamic get _lower => JS("dynamic", "#.lower", this);
 
-  /** @domName IDBKeyRange.lowerOpen */
+  /// @domName IDBKeyRange.lowerOpen; @docsEditable true
   final bool lowerOpen;
 
-  /** @domName IDBKeyRange.upper */
+  /// @domName IDBKeyRange.upper; @docsEditable true
   dynamic get upper => _convertNativeToDart_IDBKey(this._upper);
   dynamic get _upper => JS("dynamic", "#.upper", this);
 
-  /** @domName IDBKeyRange.upperOpen */
+  /// @domName IDBKeyRange.upperOpen; @docsEditable true
   final bool upperOpen;
 
-  /** @domName IDBKeyRange.bound_ */
+  /// @domName IDBKeyRange.bound_; @docsEditable true
   static IDBKeyRange bound_(/*IDBKey*/ lower, /*IDBKey*/ upper, [bool lowerOpen, bool upperOpen]) {
     if (?upperOpen) {
       var lower_1 = _convertDartToNative_IDBKey(lower);
@@ -10049,11 +10469,11 @@
     var upper_6 = _convertDartToNative_IDBKey(upper);
     return _bound__3(lower_5, upper_6);
   }
-  IDBKeyRange _bound__1(lower, upper, lowerOpen, upperOpen) native "bound";
-  IDBKeyRange _bound__2(lower, upper, lowerOpen) native "bound";
-  IDBKeyRange _bound__3(lower, upper) native "bound";
+  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";
 
-  /** @domName IDBKeyRange.lowerBound_ */
+  /// @domName IDBKeyRange.lowerBound_; @docsEditable true
   static IDBKeyRange lowerBound_(/*IDBKey*/ bound, [bool open]) {
     if (?open) {
       var bound_1 = _convertDartToNative_IDBKey(bound);
@@ -10062,17 +10482,17 @@
     var bound_2 = _convertDartToNative_IDBKey(bound);
     return _lowerBound__2(bound_2);
   }
-  IDBKeyRange _lowerBound__1(bound, open) native "lowerBound";
-  IDBKeyRange _lowerBound__2(bound) native "lowerBound";
+  static IDBKeyRange _lowerBound__1(bound, open) native "lowerBound";
+  static IDBKeyRange _lowerBound__2(bound) native "lowerBound";
 
-  /** @domName IDBKeyRange.only_ */
+  /// @domName IDBKeyRange.only_; @docsEditable true
   static IDBKeyRange only_(/*IDBKey*/ value) {
     var value_1 = _convertDartToNative_IDBKey(value);
     return _only__1(value_1);
   }
-  IDBKeyRange _only__1(value) native "only";
+  static IDBKeyRange _only__1(value) native "only";
 
-  /** @domName IDBKeyRange.upperBound_ */
+  /// @domName IDBKeyRange.upperBound_; @docsEditable true
   static IDBKeyRange upperBound_(/*IDBKey*/ bound, [bool open]) {
     if (?open) {
       var bound_1 = _convertDartToNative_IDBKey(bound);
@@ -10081,8 +10501,8 @@
     var bound_2 = _convertDartToNative_IDBKey(bound);
     return _upperBound__2(bound_2);
   }
-  IDBKeyRange _upperBound__1(bound, open) native "upperBound";
-  IDBKeyRange _upperBound__2(bound) native "upperBound";
+  static IDBKeyRange _upperBound__1(bound, open) native "upperBound";
+  static IDBKeyRange _upperBound__2(bound) native "upperBound";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -10090,25 +10510,26 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName IDBObjectStore
+/// @domName IDBObjectStore; @docsEditable true
 class IDBObjectStore native "*IDBObjectStore" {
 
-  /** @domName IDBObjectStore.autoIncrement */
+  /// @domName IDBObjectStore.autoIncrement; @docsEditable true
   final bool autoIncrement;
 
-  /** @domName IDBObjectStore.indexNames */
+  /// @domName IDBObjectStore.indexNames; @docsEditable true
+  @Returns('_DOMStringList') @Creates('_DOMStringList')
   final List<String> indexNames;
 
-  /** @domName IDBObjectStore.keyPath */
+  /// @domName IDBObjectStore.keyPath; @docsEditable true
   final dynamic keyPath;
 
-  /** @domName IDBObjectStore.name */
+  /// @domName IDBObjectStore.name; @docsEditable true
   final String name;
 
-  /** @domName IDBObjectStore.transaction */
+  /// @domName IDBObjectStore.transaction; @docsEditable true
   final IDBTransaction transaction;
 
-  /** @domName IDBObjectStore.add */
+  /// @domName IDBObjectStore.add; @docsEditable true
   IDBRequest add(/*any*/ value, [/*IDBKey*/ key]) {
     if (?key) {
       var value_1 = _convertDartToNative_SerializedScriptValue(value);
@@ -10118,13 +10539,15 @@
     var value_3 = _convertDartToNative_SerializedScriptValue(value);
     return _add_2(value_3);
   }
+  @Returns('IDBRequest') @Creates('IDBRequest') @_annotation_Creates_IDBKey
   IDBRequest _add_1(value, key) native "add";
+  @Returns('IDBRequest') @Creates('IDBRequest') @_annotation_Creates_IDBKey
   IDBRequest _add_2(value) native "add";
 
-  /** @domName IDBObjectStore.clear */
+  /// @domName IDBObjectStore.clear; @docsEditable true
   IDBRequest clear() native;
 
-  /** @domName IDBObjectStore.count */
+  /// @domName IDBObjectStore.count; @docsEditable true
   IDBRequest count([key_OR_range]) {
     if (!?key_OR_range) {
       return _count_1();
@@ -10136,13 +10559,13 @@
       var key_1 = _convertDartToNative_IDBKey(key_OR_range);
       return _count_3(key_1);
     }
-    throw const Exception("Incorrect number or type of arguments");
+    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";
 
-  /** @domName IDBObjectStore.createIndex */
+  /// @domName IDBObjectStore.createIndex; @docsEditable true
   IDBIndex createIndex(String name, keyPath, [Map options]) {
     if ((?keyPath && (keyPath is List<String> || keyPath == null)) &&
         !?options) {
@@ -10162,14 +10585,14 @@
       var options_4 = _convertDartToNative_Dictionary(options);
       return _createIndex_4(name, keyPath, options_4);
     }
-    throw const Exception("Incorrect number or type of arguments");
+    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";
 
-  /** @domName IDBObjectStore.delete */
+  /// @domName IDBObjectStore.delete; @docsEditable true
   IDBRequest delete(key_OR_keyRange) {
     if ((?key_OR_keyRange && (key_OR_keyRange is IDBKeyRange || key_OR_keyRange == null))) {
       return _delete_1(key_OR_keyRange);
@@ -10178,15 +10601,15 @@
       var key_1 = _convertDartToNative_IDBKey(key_OR_keyRange);
       return _delete_2(key_1);
     }
-    throw const Exception("Incorrect number or type of arguments");
+    throw new ArgumentError("Incorrect number or type of arguments");
   }
   IDBRequest _delete_1(IDBKeyRange keyRange) native "delete";
   IDBRequest _delete_2(key) native "delete";
 
-  /** @domName IDBObjectStore.deleteIndex */
+  /// @domName IDBObjectStore.deleteIndex; @docsEditable true
   void deleteIndex(String name) native;
 
-  /** @domName IDBObjectStore.getObject */
+  /// @domName IDBObjectStore.getObject; @docsEditable true
   IDBRequest getObject(key) {
     if ((?key && (key is IDBKeyRange || key == null))) {
       return _getObject_1(key);
@@ -10195,15 +10618,17 @@
       var key_1 = _convertDartToNative_IDBKey(key);
       return _getObject_2(key_1);
     }
-    throw const Exception("Incorrect number or type of arguments");
+    throw new ArgumentError("Incorrect number or type of arguments");
   }
+  @Returns('IDBRequest') @Creates('IDBRequest') @_annotation_Creates_SerializedScriptValue
   IDBRequest _getObject_1(IDBKeyRange key) native "get";
+  @Returns('IDBRequest') @Creates('IDBRequest') @_annotation_Creates_SerializedScriptValue
   IDBRequest _getObject_2(key) native "get";
 
-  /** @domName IDBObjectStore.index */
+  /// @domName IDBObjectStore.index; @docsEditable true
   IDBIndex index(String name) native;
 
-  /** @domName IDBObjectStore.openCursor */
+  /// @domName IDBObjectStore.openCursor; @docsEditable true
   IDBRequest openCursor([key_OR_range, String direction]) {
     if (!?key_OR_range &&
         !?direction) {
@@ -10225,15 +10650,20 @@
       var key_2 = _convertDartToNative_IDBKey(key_OR_range);
       return _openCursor_5(key_2, direction);
     }
-    throw const Exception("Incorrect number or type of arguments");
+    throw new ArgumentError("Incorrect number or type of arguments");
   }
+  @Returns('IDBRequest') @Creates('IDBRequest') @Creates('IDBCursor')
   IDBRequest _openCursor_1() native "openCursor";
+  @Returns('IDBRequest') @Creates('IDBRequest') @Creates('IDBCursor')
   IDBRequest _openCursor_2(IDBKeyRange range) native "openCursor";
+  @Returns('IDBRequest') @Creates('IDBRequest') @Creates('IDBCursor')
   IDBRequest _openCursor_3(IDBKeyRange range, direction) native "openCursor";
+  @Returns('IDBRequest') @Creates('IDBRequest') @Creates('IDBCursor')
   IDBRequest _openCursor_4(key) native "openCursor";
+  @Returns('IDBRequest') @Creates('IDBRequest') @Creates('IDBCursor')
   IDBRequest _openCursor_5(key, direction) native "openCursor";
 
-  /** @domName IDBObjectStore.put */
+  /// @domName IDBObjectStore.put; @docsEditable true
   IDBRequest put(/*any*/ value, [/*IDBKey*/ key]) {
     if (?key) {
       var value_1 = _convertDartToNative_SerializedScriptValue(value);
@@ -10243,7 +10673,9 @@
     var value_3 = _convertDartToNative_SerializedScriptValue(value);
     return _put_2(value_3);
   }
+  @Returns('IDBRequest') @Creates('IDBRequest') @_annotation_Creates_IDBKey
   IDBRequest _put_1(value, key) native "put";
+  @Returns('IDBRequest') @Creates('IDBRequest') @_annotation_Creates_IDBKey
   IDBRequest _put_2(value) native "put";
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -10251,12 +10683,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName IDBOpenDBRequest
+/// @domName IDBOpenDBRequest; @docsEditable true
 class IDBOpenDBRequest extends IDBRequest implements EventTarget native "*IDBOpenDBRequest" {
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   IDBOpenDBRequestEvents get on =>
     new IDBOpenDBRequestEvents(this);
 }
@@ -10273,44 +10703,43 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName IDBRequest
+/// @domName IDBRequest; @docsEditable true
 class IDBRequest extends EventTarget native "*IDBRequest" {
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   IDBRequestEvents get on =>
     new IDBRequestEvents(this);
 
-  /** @domName IDBRequest.error */
+  /// @domName IDBRequest.error; @docsEditable true
   final DOMError error;
 
-  /** @domName IDBRequest.errorCode */
+  /// @domName IDBRequest.errorCode; @docsEditable true
   final int errorCode;
 
-  /** @domName IDBRequest.readyState */
+  /// @domName IDBRequest.readyState; @docsEditable true
   final String readyState;
 
-  /** @domName IDBRequest.result */
+  /// @domName IDBRequest.result; @docsEditable true
   dynamic get result => _convertNativeToDart_IDBAny(this._result);
   dynamic get _result => JS("dynamic", "#.result", this);
 
-  /** @domName IDBRequest.source */
+  /// @domName IDBRequest.source; @docsEditable true
+  @Creates('Null')
   final dynamic source;
 
-  /** @domName IDBRequest.transaction */
+  /// @domName IDBRequest.transaction; @docsEditable true
   final IDBTransaction transaction;
 
-  /** @domName IDBRequest.webkitErrorMessage */
+  /// @domName IDBRequest.webkitErrorMessage; @docsEditable true
   final String webkitErrorMessage;
 
-  /** @domName IDBRequest.addEventListener */
+  /// @domName IDBRequest.addEventListener; @docsEditable true
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
 
-  /** @domName IDBRequest.dispatchEvent */
+  /// @domName IDBRequest.dispatchEvent; @docsEditable true
   bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
 
-  /** @domName IDBRequest.removeEventListener */
+  /// @domName IDBRequest.removeEventListener; @docsEditable true
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
 }
 
@@ -10326,12 +10755,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName IDBTransaction
+/// @domName IDBTransaction; @docsEditable true
 class IDBTransaction extends EventTarget native "*IDBTransaction" {
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   IDBTransactionEvents get on =>
     new IDBTransactionEvents(this);
 
@@ -10341,28 +10768,28 @@
 
   static const int VERSION_CHANGE = 2;
 
-  /** @domName IDBTransaction.db */
+  /// @domName IDBTransaction.db; @docsEditable true
   final IDBDatabase db;
 
-  /** @domName IDBTransaction.error */
+  /// @domName IDBTransaction.error; @docsEditable true
   final DOMError error;
 
-  /** @domName IDBTransaction.mode */
+  /// @domName IDBTransaction.mode; @docsEditable true
   final String mode;
 
-  /** @domName IDBTransaction.abort */
+  /// @domName IDBTransaction.abort; @docsEditable true
   void abort() native;
 
-  /** @domName IDBTransaction.addEventListener */
+  /// @domName IDBTransaction.addEventListener; @docsEditable true
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
 
-  /** @domName IDBTransaction.dispatchEvent */
+  /// @domName IDBTransaction.dispatchEvent; @docsEditable true
   bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
 
-  /** @domName IDBTransaction.objectStore */
+  /// @domName IDBTransaction.objectStore; @docsEditable true
   IDBObjectStore objectStore(String name) native;
 
-  /** @domName IDBTransaction.removeEventListener */
+  /// @domName IDBTransaction.removeEventListener; @docsEditable true
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
 }
 
@@ -10380,13 +10807,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName IDBVersionChangeEvent
+/// @domName IDBVersionChangeEvent; @docsEditable true
 class IDBUpgradeNeededEvent extends Event native "*IDBVersionChangeEvent" {
 
-  /** @domName IDBVersionChangeEvent.newVersion */
+  /// @domName IDBVersionChangeEvent.newVersion; @docsEditable true
   final int newVersion;
 
-  /** @domName IDBVersionChangeEvent.oldVersion */
+  /// @domName IDBVersionChangeEvent.oldVersion; @docsEditable true
   final int oldVersion;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -10394,10 +10821,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName IDBVersionChangeEvent
+/// @domName IDBVersionChangeEvent; @docsEditable true
 class IDBVersionChangeEvent extends Event native "*IDBVersionChangeEvent" {
 
-  /** @domName IDBVersionChangeEvent.version */
+  /// @domName IDBVersionChangeEvent.version; @docsEditable true
   final String version;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -10405,12 +10832,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName IDBVersionChangeRequest
+/// @domName IDBVersionChangeRequest; @docsEditable true
 class IDBVersionChangeRequest extends IDBRequest implements EventTarget native "*IDBVersionChangeRequest" {
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   IDBVersionChangeRequestEvents get on =>
     new IDBVersionChangeRequestEvents(this);
 }
@@ -10425,49 +10850,49 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLIFrameElement
+/// @domName HTMLIFrameElement; @docsEditable true
 class IFrameElement extends Element implements Element native "*HTMLIFrameElement" {
 
-  factory IFrameElement() => _Elements.createIFrameElement();
+  factory IFrameElement() => document.$dom_createElement("iframe");
 
-  /** @domName HTMLIFrameElement.align */
+  /// @domName HTMLIFrameElement.align; @docsEditable true
   String align;
 
-  /** @domName HTMLIFrameElement.contentWindow */
+  /// @domName HTMLIFrameElement.contentWindow; @docsEditable true
   Window get contentWindow => _convertNativeToDart_Window(this._contentWindow);
   dynamic get _contentWindow => JS("dynamic", "#.contentWindow", this);
 
-  /** @domName HTMLIFrameElement.frameBorder */
+  /// @domName HTMLIFrameElement.frameBorder; @docsEditable true
   String frameBorder;
 
-  /** @domName HTMLIFrameElement.height */
+  /// @domName HTMLIFrameElement.height; @docsEditable true
   String height;
 
-  /** @domName HTMLIFrameElement.longDesc */
+  /// @domName HTMLIFrameElement.longDesc; @docsEditable true
   String longDesc;
 
-  /** @domName HTMLIFrameElement.marginHeight */
+  /// @domName HTMLIFrameElement.marginHeight; @docsEditable true
   String marginHeight;
 
-  /** @domName HTMLIFrameElement.marginWidth */
+  /// @domName HTMLIFrameElement.marginWidth; @docsEditable true
   String marginWidth;
 
-  /** @domName HTMLIFrameElement.name */
+  /// @domName HTMLIFrameElement.name; @docsEditable true
   String name;
 
-  /** @domName HTMLIFrameElement.sandbox */
+  /// @domName HTMLIFrameElement.sandbox; @docsEditable true
   String sandbox;
 
-  /** @domName HTMLIFrameElement.scrolling */
+  /// @domName HTMLIFrameElement.scrolling; @docsEditable true
   String scrolling;
 
-  /** @domName HTMLIFrameElement.src */
+  /// @domName HTMLIFrameElement.src; @docsEditable true
   String src;
 
-  /** @domName HTMLIFrameElement.srcdoc */
+  /// @domName HTMLIFrameElement.srcdoc; @docsEditable true
   String srcdoc;
 
-  /** @domName HTMLIFrameElement.width */
+  /// @domName HTMLIFrameElement.width; @docsEditable true
   String width;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -10483,15 +10908,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName IceCandidate
+/// @domName IceCandidate; @docsEditable true
 class IceCandidate native "*IceCandidate" {
 
   factory IceCandidate(String label, String candidateLine) => _IceCandidateFactoryProvider.createIceCandidate(label, candidateLine);
 
-  /** @domName IceCandidate.label */
+  /// @domName IceCandidate.label; @docsEditable true
   final String label;
 
-  /** @domName IceCandidate.toSdp */
+  /// @domName IceCandidate.toSdp; @docsEditable true
   String toSdp() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -10499,16 +10924,16 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName ImageData
+/// @domName ImageData; @docsEditable true
 class ImageData native "*ImageData" {
 
-  /** @domName ImageData.data */
+  /// @domName ImageData.data; @docsEditable true
   final Uint8ClampedArray data;
 
-  /** @domName ImageData.height */
+  /// @domName ImageData.height; @docsEditable true
   final int height;
 
-  /** @domName ImageData.width */
+  /// @domName ImageData.width; @docsEditable true
   final int width;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -10516,77 +10941,72 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLImageElement
+/// @domName HTMLImageElement; @docsEditable true
 class ImageElement extends Element implements Element native "*HTMLImageElement" {
 
   factory ImageElement({String src, int width, int height}) {
-    if (!?src) {
-      return _Elements.createImageElement();
-    }
-    if (!?width) {
-      return _Elements.createImageElement(src);
-    }
-    if (!?height) {
-      return _Elements.createImageElement(src, width);
-    }
-    return _Elements.createImageElement(src, width, height);
+    var e = document.$dom_createElement("img");
+    if (src != null) e.src = src;
+    if (width != null) e.width = width;
+    if (height != null) e.height = height;
+    return e;
   }
 
-  /** @domName HTMLImageElement.align */
+  /// @domName HTMLImageElement.align; @docsEditable true
   String align;
 
-  /** @domName HTMLImageElement.alt */
+  /// @domName HTMLImageElement.alt; @docsEditable true
   String alt;
 
-  /** @domName HTMLImageElement.border */
+  /// @domName HTMLImageElement.border; @docsEditable true
   String border;
 
-  /** @domName HTMLImageElement.complete */
+  /// @domName HTMLImageElement.complete; @docsEditable true
   final bool complete;
 
-  /** @domName HTMLImageElement.crossOrigin */
+  /// @domName HTMLImageElement.crossOrigin; @docsEditable true
   String crossOrigin;
 
-  /** @domName HTMLImageElement.height */
+  /// @domName HTMLImageElement.height; @docsEditable true
   int height;
 
-  /** @domName HTMLImageElement.hspace */
+  /// @domName HTMLImageElement.hspace; @docsEditable true
   int hspace;
 
-  /** @domName HTMLImageElement.isMap */
+  /// @domName HTMLImageElement.isMap; @docsEditable true
   bool isMap;
 
-  /** @domName HTMLImageElement.longDesc */
+  /// @domName HTMLImageElement.longDesc; @docsEditable true
   String longDesc;
 
-  /** @domName HTMLImageElement.lowsrc */
+  /// @domName HTMLImageElement.lowsrc; @docsEditable true
   String lowsrc;
 
-  /** @domName HTMLImageElement.name */
+  /// @domName HTMLImageElement.name; @docsEditable true
   String name;
 
-  /** @domName HTMLImageElement.naturalHeight */
+  /// @domName HTMLImageElement.naturalHeight; @docsEditable true
   final int naturalHeight;
 
-  /** @domName HTMLImageElement.naturalWidth */
+  /// @domName HTMLImageElement.naturalWidth; @docsEditable true
   final int naturalWidth;
 
-  /** @domName HTMLImageElement.src */
+  /// @domName HTMLImageElement.src; @docsEditable true
   String src;
 
-  /** @domName HTMLImageElement.useMap */
+  /// @domName HTMLImageElement.useMap; @docsEditable true
   String useMap;
 
-  /** @domName HTMLImageElement.vspace */
+  /// @domName HTMLImageElement.vspace; @docsEditable true
   int vspace;
 
-  /** @domName HTMLImageElement.width */
+  /// @domName HTMLImageElement.width; @docsEditable true
   int width;
 
-  /** @domName HTMLImageElement.x */
+  /// @domName HTMLImageElement.x; @docsEditable true
   final int x;
 
-  /** @domName HTMLImageElement.y */
+  /// @domName HTMLImageElement.y; @docsEditable true
   final int y;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -10594,191 +11014,191 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLInputElement
+/// @domName HTMLInputElement; @docsEditable true
 class InputElement extends Element implements Element native "*HTMLInputElement" {
 
   factory InputElement({String type}) {
-    if (!?type) {
-      return _Elements.createInputElement();
-    }
-    return _Elements.createInputElement(type);
+    var e = document.$dom_createElement("input");
+    if (type != null) e.type = type;
+    return e;
   }
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   InputElementEvents get on =>
     new InputElementEvents(this);
 
-  /** @domName HTMLInputElement.accept */
+  /// @domName HTMLInputElement.accept; @docsEditable true
   String accept;
 
-  /** @domName HTMLInputElement.align */
+  /// @domName HTMLInputElement.align; @docsEditable true
   String align;
 
-  /** @domName HTMLInputElement.alt */
+  /// @domName HTMLInputElement.alt; @docsEditable true
   String alt;
 
-  /** @domName HTMLInputElement.autocomplete */
+  /// @domName HTMLInputElement.autocomplete; @docsEditable true
   String autocomplete;
 
-  /** @domName HTMLInputElement.autofocus */
+  /// @domName HTMLInputElement.autofocus; @docsEditable true
   bool autofocus;
 
-  /** @domName HTMLInputElement.checked */
+  /// @domName HTMLInputElement.checked; @docsEditable true
   bool checked;
 
-  /** @domName HTMLInputElement.defaultChecked */
+  /// @domName HTMLInputElement.defaultChecked; @docsEditable true
   bool defaultChecked;
 
-  /** @domName HTMLInputElement.defaultValue */
+  /// @domName HTMLInputElement.defaultValue; @docsEditable true
   String defaultValue;
 
-  /** @domName HTMLInputElement.dirName */
+  /// @domName HTMLInputElement.dirName; @docsEditable true
   String dirName;
 
-  /** @domName HTMLInputElement.disabled */
+  /// @domName HTMLInputElement.disabled; @docsEditable true
   bool disabled;
 
-  /** @domName HTMLInputElement.files */
+  /// @domName HTMLInputElement.files; @docsEditable true
+  @Returns('_FileList') @Creates('_FileList')
   List<File> files;
 
-  /** @domName HTMLInputElement.form */
+  /// @domName HTMLInputElement.form; @docsEditable true
   final FormElement form;
 
-  /** @domName HTMLInputElement.formAction */
+  /// @domName HTMLInputElement.formAction; @docsEditable true
   String formAction;
 
-  /** @domName HTMLInputElement.formEnctype */
+  /// @domName HTMLInputElement.formEnctype; @docsEditable true
   String formEnctype;
 
-  /** @domName HTMLInputElement.formMethod */
+  /// @domName HTMLInputElement.formMethod; @docsEditable true
   String formMethod;
 
-  /** @domName HTMLInputElement.formNoValidate */
+  /// @domName HTMLInputElement.formNoValidate; @docsEditable true
   bool formNoValidate;
 
-  /** @domName HTMLInputElement.formTarget */
+  /// @domName HTMLInputElement.formTarget; @docsEditable true
   String formTarget;
 
-  /** @domName HTMLInputElement.height */
+  /// @domName HTMLInputElement.height; @docsEditable true
   int height;
 
-  /** @domName HTMLInputElement.incremental */
+  /// @domName HTMLInputElement.incremental; @docsEditable true
   bool incremental;
 
-  /** @domName HTMLInputElement.indeterminate */
+  /// @domName HTMLInputElement.indeterminate; @docsEditable true
   bool indeterminate;
 
-  /** @domName HTMLInputElement.labels */
+  /// @domName HTMLInputElement.labels; @docsEditable true
+  @Returns('_NodeList') @Creates('_NodeList')
   final List<Node> labels;
 
-  /** @domName HTMLInputElement.list */
+  /// @domName HTMLInputElement.list; @docsEditable true
   final Element list;
 
-  /** @domName HTMLInputElement.max */
+  /// @domName HTMLInputElement.max; @docsEditable true
   String max;
 
-  /** @domName HTMLInputElement.maxLength */
+  /// @domName HTMLInputElement.maxLength; @docsEditable true
   int maxLength;
 
-  /** @domName HTMLInputElement.min */
+  /// @domName HTMLInputElement.min; @docsEditable true
   String min;
 
-  /** @domName HTMLInputElement.multiple */
+  /// @domName HTMLInputElement.multiple; @docsEditable true
   bool multiple;
 
-  /** @domName HTMLInputElement.name */
+  /// @domName HTMLInputElement.name; @docsEditable true
   String name;
 
-  /** @domName HTMLInputElement.pattern */
+  /// @domName HTMLInputElement.pattern; @docsEditable true
   String pattern;
 
-  /** @domName HTMLInputElement.placeholder */
+  /// @domName HTMLInputElement.placeholder; @docsEditable true
   String placeholder;
 
-  /** @domName HTMLInputElement.readOnly */
+  /// @domName HTMLInputElement.readOnly; @docsEditable true
   bool readOnly;
 
-  /** @domName HTMLInputElement.required */
+  /// @domName HTMLInputElement.required; @docsEditable true
   bool required;
 
-  /** @domName HTMLInputElement.selectionDirection */
+  /// @domName HTMLInputElement.selectionDirection; @docsEditable true
   String selectionDirection;
 
-  /** @domName HTMLInputElement.selectionEnd */
+  /// @domName HTMLInputElement.selectionEnd; @docsEditable true
   int selectionEnd;
 
-  /** @domName HTMLInputElement.selectionStart */
+  /// @domName HTMLInputElement.selectionStart; @docsEditable true
   int selectionStart;
 
-  /** @domName HTMLInputElement.size */
+  /// @domName HTMLInputElement.size; @docsEditable true
   int size;
 
-  /** @domName HTMLInputElement.src */
+  /// @domName HTMLInputElement.src; @docsEditable true
   String src;
 
-  /** @domName HTMLInputElement.step */
+  /// @domName HTMLInputElement.step; @docsEditable true
   String step;
 
-  /** @domName HTMLInputElement.type */
+  /// @domName HTMLInputElement.type; @docsEditable true
   String type;
 
-  /** @domName HTMLInputElement.useMap */
+  /// @domName HTMLInputElement.useMap; @docsEditable true
   String useMap;
 
-  /** @domName HTMLInputElement.validationMessage */
+  /// @domName HTMLInputElement.validationMessage; @docsEditable true
   final String validationMessage;
 
-  /** @domName HTMLInputElement.validity */
+  /// @domName HTMLInputElement.validity; @docsEditable true
   final ValidityState validity;
 
-  /** @domName HTMLInputElement.value */
+  /// @domName HTMLInputElement.value; @docsEditable true
   String value;
 
-  /** @domName HTMLInputElement.valueAsDate */
+  /// @domName HTMLInputElement.valueAsDate; @docsEditable true
   Date valueAsDate;
 
-  /** @domName HTMLInputElement.valueAsNumber */
+  /// @domName HTMLInputElement.valueAsNumber; @docsEditable true
   num valueAsNumber;
 
-  /** @domName HTMLInputElement.webkitEntries */
+  /// @domName HTMLInputElement.webkitEntries; @docsEditable true
+  @Returns('_EntryArray') @Creates('_EntryArray')
   final List<Entry> webkitEntries;
 
-  /** @domName HTMLInputElement.webkitGrammar */
+  /// @domName HTMLInputElement.webkitGrammar; @docsEditable true
   bool webkitGrammar;
 
-  /** @domName HTMLInputElement.webkitSpeech */
+  /// @domName HTMLInputElement.webkitSpeech; @docsEditable true
   bool webkitSpeech;
 
-  /** @domName HTMLInputElement.webkitdirectory */
+  /// @domName HTMLInputElement.webkitdirectory; @docsEditable true
   bool webkitdirectory;
 
-  /** @domName HTMLInputElement.width */
+  /// @domName HTMLInputElement.width; @docsEditable true
   int width;
 
-  /** @domName HTMLInputElement.willValidate */
+  /// @domName HTMLInputElement.willValidate; @docsEditable true
   final bool willValidate;
 
-  /** @domName HTMLInputElement.checkValidity */
+  /// @domName HTMLInputElement.checkValidity; @docsEditable true
   bool checkValidity() native;
 
-  /** @domName HTMLInputElement.select */
+  /// @domName HTMLInputElement.select; @docsEditable true
   void select() native;
 
-  /** @domName HTMLInputElement.setCustomValidity */
+  /// @domName HTMLInputElement.setCustomValidity; @docsEditable true
   void setCustomValidity(String error) native;
 
-  /** @domName HTMLInputElement.setRangeText */
+  /// @domName HTMLInputElement.setRangeText; @docsEditable true
   void setRangeText(String replacement, [int start, int end, String selectionMode]) native;
 
-  /** @domName HTMLInputElement.setSelectionRange */
+  /// @domName HTMLInputElement.setSelectionRange; @docsEditable true
   void setSelectionRange(int start, int end, [String direction]) native;
 
-  /** @domName HTMLInputElement.stepDown */
+  /// @domName HTMLInputElement.stepDown; @docsEditable true
   void stepDown([int n]) native;
 
-  /** @domName HTMLInputElement.stepUp */
+  /// @domName HTMLInputElement.stepUp; @docsEditable true
   void stepUp([int n]) native;
 }
 
@@ -10792,7 +11212,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Int16Array
+/// @domName Int16Array; @docsEditable true
 class Int16Array extends ArrayBufferView implements JavaScriptIndexingBehavior, List<int> native "*Int16Array" {
 
   factory Int16Array(int length) =>
@@ -10806,13 +11226,12 @@
 
   static const int BYTES_PER_ELEMENT = 2;
 
-  /** @domName Int16Array.length */
+  /// @domName Int16Array.length; @docsEditable true
   final int length;
 
   int operator[](int index) => JS("int", "#[#]", this, index);
 
-  void operator[]=(int index, int value) => JS("void", "#[#] = #", this, index, value);
-  // -- start List<int> mixins.
+  void operator[]=(int index, int value) { JS("void", "#[#] = #", this, index, value); }  // -- start List<int> mixins.
   // int is the element type.
 
   // From Iterable<int>:
@@ -10867,6 +11286,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  int get first => this[0];
+
   int get last => this[length - 1];
 
   int removeLast() {
@@ -10890,10 +11311,10 @@
 
   // -- end List<int> mixins.
 
-  /** @domName Int16Array.setElements */
+  /// @domName Int16Array.setElements; @docsEditable true
   void setElements(Object array, [int offset]) native "set";
 
-  /** @domName Int16Array.subarray */
+  /// @domName Int16Array.subarray; @docsEditable true
   Int16Array subarray(int start, [int end]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -10901,7 +11322,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Int32Array
+/// @domName Int32Array; @docsEditable true
 class Int32Array extends ArrayBufferView implements JavaScriptIndexingBehavior, List<int> native "*Int32Array" {
 
   factory Int32Array(int length) =>
@@ -10915,13 +11336,12 @@
 
   static const int BYTES_PER_ELEMENT = 4;
 
-  /** @domName Int32Array.length */
+  /// @domName Int32Array.length; @docsEditable true
   final int length;
 
   int operator[](int index) => JS("int", "#[#]", this, index);
 
-  void operator[]=(int index, int value) => JS("void", "#[#] = #", this, index, value);
-  // -- start List<int> mixins.
+  void operator[]=(int index, int value) { JS("void", "#[#] = #", this, index, value); }  // -- start List<int> mixins.
   // int is the element type.
 
   // From Iterable<int>:
@@ -10976,6 +11396,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  int get first => this[0];
+
   int get last => this[length - 1];
 
   int removeLast() {
@@ -10999,10 +11421,10 @@
 
   // -- end List<int> mixins.
 
-  /** @domName Int32Array.setElements */
+  /// @domName Int32Array.setElements; @docsEditable true
   void setElements(Object array, [int offset]) native "set";
 
-  /** @domName Int32Array.subarray */
+  /// @domName Int32Array.subarray; @docsEditable true
   Int32Array subarray(int start, [int end]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -11010,7 +11432,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Int8Array
+/// @domName Int8Array; @docsEditable true
 class Int8Array extends ArrayBufferView implements JavaScriptIndexingBehavior, List<int> native "*Int8Array" {
 
   factory Int8Array(int length) =>
@@ -11024,13 +11446,12 @@
 
   static const int BYTES_PER_ELEMENT = 1;
 
-  /** @domName Int8Array.length */
+  /// @domName Int8Array.length; @docsEditable true
   final int length;
 
   int operator[](int index) => JS("int", "#[#]", this, index);
 
-  void operator[]=(int index, int value) => JS("void", "#[#] = #", this, index, value);
-  // -- start List<int> mixins.
+  void operator[]=(int index, int value) { JS("void", "#[#] = #", this, index, value); }  // -- start List<int> mixins.
   // int is the element type.
 
   // From Iterable<int>:
@@ -11085,6 +11506,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  int get first => this[0];
+
   int get last => this[length - 1];
 
   int removeLast() {
@@ -11108,10 +11531,10 @@
 
   // -- end List<int> mixins.
 
-  /** @domName Int8Array.setElements */
+  /// @domName Int8Array.setElements; @docsEditable true
   void setElements(Object array, [int offset]) native "set";
 
-  /** @domName Int8Array.subarray */
+  /// @domName Int8Array.subarray; @docsEditable true
   Int8Array subarray(int start, [int end]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -11119,7 +11542,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName JavaScriptCallFrame
+/// @domName JavaScriptCallFrame; @docsEditable true
 class JavaScriptCallFrame native "*JavaScriptCallFrame" {
 
   static const int CATCH_SCOPE = 4;
@@ -11132,37 +11555,37 @@
 
   static const int WITH_SCOPE = 2;
 
-  /** @domName JavaScriptCallFrame.caller */
+  /// @domName JavaScriptCallFrame.caller; @docsEditable true
   final JavaScriptCallFrame caller;
 
-  /** @domName JavaScriptCallFrame.column */
+  /// @domName JavaScriptCallFrame.column; @docsEditable true
   final int column;
 
-  /** @domName JavaScriptCallFrame.functionName */
+  /// @domName JavaScriptCallFrame.functionName; @docsEditable true
   final String functionName;
 
-  /** @domName JavaScriptCallFrame.line */
+  /// @domName JavaScriptCallFrame.line; @docsEditable true
   final int line;
 
-  /** @domName JavaScriptCallFrame.scopeChain */
+  /// @domName JavaScriptCallFrame.scopeChain; @docsEditable true
   final List scopeChain;
 
-  /** @domName JavaScriptCallFrame.sourceID */
+  /// @domName JavaScriptCallFrame.sourceID; @docsEditable true
   final int sourceID;
 
-  /** @domName JavaScriptCallFrame.thisObject */
+  /// @domName JavaScriptCallFrame.thisObject; @docsEditable true
   final Object thisObject;
 
-  /** @domName JavaScriptCallFrame.type */
+  /// @domName JavaScriptCallFrame.type; @docsEditable true
   final String type;
 
-  /** @domName JavaScriptCallFrame.evaluate */
+  /// @domName JavaScriptCallFrame.evaluate; @docsEditable true
   void evaluate(String script) native;
 
-  /** @domName JavaScriptCallFrame.restart */
+  /// @domName JavaScriptCallFrame.restart; @docsEditable true
   Object restart() native;
 
-  /** @domName JavaScriptCallFrame.scopeType */
+  /// @domName JavaScriptCallFrame.scopeType; @docsEditable true
   int scopeType(int scopeIndex) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -11170,31 +11593,31 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName KeyboardEvent
+/// @domName KeyboardEvent; @docsEditable true
 class KeyboardEvent extends UIEvent native "*KeyboardEvent" {
 
-  /** @domName KeyboardEvent.altGraphKey */
+  /// @domName KeyboardEvent.altGraphKey; @docsEditable true
   final bool altGraphKey;
 
-  /** @domName KeyboardEvent.altKey */
+  /// @domName KeyboardEvent.altKey; @docsEditable true
   final bool altKey;
 
-  /** @domName KeyboardEvent.ctrlKey */
+  /// @domName KeyboardEvent.ctrlKey; @docsEditable true
   final bool ctrlKey;
 
-  /** @domName KeyboardEvent.keyIdentifier */
+  /// @domName KeyboardEvent.keyIdentifier; @docsEditable true
   final String keyIdentifier;
 
-  /** @domName KeyboardEvent.keyLocation */
+  /// @domName KeyboardEvent.keyLocation; @docsEditable true
   final int keyLocation;
 
-  /** @domName KeyboardEvent.metaKey */
+  /// @domName KeyboardEvent.metaKey; @docsEditable true
   final bool metaKey;
 
-  /** @domName KeyboardEvent.shiftKey */
+  /// @domName KeyboardEvent.shiftKey; @docsEditable true
   final bool shiftKey;
 
-  /** @domName KeyboardEvent.initKeyboardEvent */
+  /// @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
@@ -11202,48 +11625,49 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLKeygenElement
+/// @domName HTMLKeygenElement; @docsEditable true
 class KeygenElement extends Element implements Element native "*HTMLKeygenElement" {
 
-  factory KeygenElement() => _Elements.createKeygenElement();
+  factory KeygenElement() => document.$dom_createElement("keygen");
 
-  /** @domName HTMLKeygenElement.autofocus */
+  /// @domName HTMLKeygenElement.autofocus; @docsEditable true
   bool autofocus;
 
-  /** @domName HTMLKeygenElement.challenge */
+  /// @domName HTMLKeygenElement.challenge; @docsEditable true
   String challenge;
 
-  /** @domName HTMLKeygenElement.disabled */
+  /// @domName HTMLKeygenElement.disabled; @docsEditable true
   bool disabled;
 
-  /** @domName HTMLKeygenElement.form */
+  /// @domName HTMLKeygenElement.form; @docsEditable true
   final FormElement form;
 
-  /** @domName HTMLKeygenElement.keytype */
+  /// @domName HTMLKeygenElement.keytype; @docsEditable true
   String keytype;
 
-  /** @domName HTMLKeygenElement.labels */
+  /// @domName HTMLKeygenElement.labels; @docsEditable true
+  @Returns('_NodeList') @Creates('_NodeList')
   final List<Node> labels;
 
-  /** @domName HTMLKeygenElement.name */
+  /// @domName HTMLKeygenElement.name; @docsEditable true
   String name;
 
-  /** @domName HTMLKeygenElement.type */
+  /// @domName HTMLKeygenElement.type; @docsEditable true
   final String type;
 
-  /** @domName HTMLKeygenElement.validationMessage */
+  /// @domName HTMLKeygenElement.validationMessage; @docsEditable true
   final String validationMessage;
 
-  /** @domName HTMLKeygenElement.validity */
+  /// @domName HTMLKeygenElement.validity; @docsEditable true
   final ValidityState validity;
 
-  /** @domName HTMLKeygenElement.willValidate */
+  /// @domName HTMLKeygenElement.willValidate; @docsEditable true
   final bool willValidate;
 
-  /** @domName HTMLKeygenElement.checkValidity */
+  /// @domName HTMLKeygenElement.checkValidity; @docsEditable true
   bool checkValidity() native;
 
-  /** @domName HTMLKeygenElement.setCustomValidity */
+  /// @domName HTMLKeygenElement.setCustomValidity; @docsEditable true
   void setCustomValidity(String error) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -11251,15 +11675,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLLIElement
+/// @domName HTMLLIElement; @docsEditable true
 class LIElement extends Element implements Element native "*HTMLLIElement" {
 
-  factory LIElement() => _Elements.createLIElement();
+  factory LIElement() => document.$dom_createElement("li");
 
-  /** @domName HTMLLIElement.type */
+  /// @domName HTMLLIElement.type; @docsEditable true
   String type;
 
-  /** @domName HTMLLIElement.value */
+  /// @domName HTMLLIElement.value; @docsEditable true
   int value;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -11267,18 +11691,18 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLLabelElement
+/// @domName HTMLLabelElement; @docsEditable true
 class LabelElement extends Element implements Element native "*HTMLLabelElement" {
 
-  factory LabelElement() => _Elements.createLabelElement();
+  factory LabelElement() => document.$dom_createElement("label");
 
-  /** @domName HTMLLabelElement.control */
+  /// @domName HTMLLabelElement.control; @docsEditable true
   final Element control;
 
-  /** @domName HTMLLabelElement.form */
+  /// @domName HTMLLabelElement.form; @docsEditable true
   final FormElement form;
 
-  /** @domName HTMLLabelElement.htmlFor */
+  /// @domName HTMLLabelElement.htmlFor; @docsEditable true
   String htmlFor;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -11286,15 +11710,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLLegendElement
+/// @domName HTMLLegendElement; @docsEditable true
 class LegendElement extends Element implements Element native "*HTMLLegendElement" {
 
-  factory LegendElement() => _Elements.createLegendElement();
+  factory LegendElement() => document.$dom_createElement("legend");
 
-  /** @domName HTMLLegendElement.align */
+  /// @domName HTMLLegendElement.align; @docsEditable true
   String align;
 
-  /** @domName HTMLLegendElement.form */
+  /// @domName HTMLLegendElement.form; @docsEditable true
   final FormElement form;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -11302,42 +11726,42 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLLinkElement
+/// @domName HTMLLinkElement; @docsEditable true
 class LinkElement extends Element implements Element native "*HTMLLinkElement" {
 
-  factory LinkElement() => _Elements.createLinkElement();
+  factory LinkElement() => document.$dom_createElement("link");
 
-  /** @domName HTMLLinkElement.charset */
+  /// @domName HTMLLinkElement.charset; @docsEditable true
   String charset;
 
-  /** @domName HTMLLinkElement.disabled */
+  /// @domName HTMLLinkElement.disabled; @docsEditable true
   bool disabled;
 
-  /** @domName HTMLLinkElement.href */
+  /// @domName HTMLLinkElement.href; @docsEditable true
   String href;
 
-  /** @domName HTMLLinkElement.hreflang */
+  /// @domName HTMLLinkElement.hreflang; @docsEditable true
   String hreflang;
 
-  /** @domName HTMLLinkElement.media */
+  /// @domName HTMLLinkElement.media; @docsEditable true
   String media;
 
-  /** @domName HTMLLinkElement.rel */
+  /// @domName HTMLLinkElement.rel; @docsEditable true
   String rel;
 
-  /** @domName HTMLLinkElement.rev */
+  /// @domName HTMLLinkElement.rev; @docsEditable true
   String rev;
 
-  /** @domName HTMLLinkElement.sheet */
+  /// @domName HTMLLinkElement.sheet; @docsEditable true
   final StyleSheet sheet;
 
-  /** @domName HTMLLinkElement.sizes */
+  /// @domName HTMLLinkElement.sizes; @docsEditable true
   DOMSettableTokenList sizes;
 
-  /** @domName HTMLLinkElement.target */
+  /// @domName HTMLLinkElement.target; @docsEditable true
   String target;
 
-  /** @domName HTMLLinkElement.type */
+  /// @domName HTMLLinkElement.type; @docsEditable true
   String type;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -11345,28 +11769,28 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName History
+/// @domName History; @docsEditable true
 class LocalHistory implements History native "*History" {
 
-  /** @domName History.length */
+  /// @domName History.length; @docsEditable true
   final int length;
 
-  /** @domName History.state */
+  /// @domName History.state; @docsEditable true
   final dynamic state;
 
-  /** @domName History.back */
+  /// @domName History.back; @docsEditable true
   void back() native;
 
-  /** @domName History.forward */
+  /// @domName History.forward; @docsEditable true
   void forward() native;
 
-  /** @domName History.go */
+  /// @domName History.go; @docsEditable true
   void go(int distance) native;
 
-  /** @domName History.pushState */
+  /// @domName History.pushState; @docsEditable true
   void pushState(Object data, String title, [String url]) native;
 
-  /** @domName History.replaceState */
+  /// @domName History.replaceState; @docsEditable true
   void replaceState(Object data, String title, [String url]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -11374,49 +11798,50 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Location
+/// @domName Location; @docsEditable true
 class LocalLocation implements Location native "*Location" {
 
-  /** @domName Location.ancestorOrigins */
+  /// @domName Location.ancestorOrigins; @docsEditable true
+  @Returns('_DOMStringList') @Creates('_DOMStringList')
   final List<String> ancestorOrigins;
 
-  /** @domName Location.hash */
+  /// @domName Location.hash; @docsEditable true
   String hash;
 
-  /** @domName Location.host */
+  /// @domName Location.host; @docsEditable true
   String host;
 
-  /** @domName Location.hostname */
+  /// @domName Location.hostname; @docsEditable true
   String hostname;
 
-  /** @domName Location.href */
+  /// @domName Location.href; @docsEditable true
   String href;
 
-  /** @domName Location.origin */
+  /// @domName Location.origin; @docsEditable true
   final String origin;
 
-  /** @domName Location.pathname */
+  /// @domName Location.pathname; @docsEditable true
   String pathname;
 
-  /** @domName Location.port */
+  /// @domName Location.port; @docsEditable true
   String port;
 
-  /** @domName Location.protocol */
+  /// @domName Location.protocol; @docsEditable true
   String protocol;
 
-  /** @domName Location.search */
+  /// @domName Location.search; @docsEditable true
   String search;
 
-  /** @domName Location.assign */
+  /// @domName Location.assign; @docsEditable true
   void assign(String url) native;
 
-  /** @domName Location.reload */
+  /// @domName Location.reload; @docsEditable true
   void reload() native;
 
-  /** @domName Location.replace */
+  /// @domName Location.replace; @docsEditable true
   void replace(String url) native;
 
-  /** @domName Location.toString */
+  /// @domName Location.toString; @docsEditable true
   String toString() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -11424,10 +11849,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName LocalMediaStream
+/// @domName LocalMediaStream; @docsEditable true
 class LocalMediaStream extends MediaStream implements EventTarget native "*LocalMediaStream" {
 
-  /** @domName LocalMediaStream.stop */
+  /// @domName LocalMediaStream.stop; @docsEditable true
   void stop() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -11562,7 +11987,7 @@
    * registered under [name].
    */
   SendPortSync lookupPort(String name) {
-    var port = JSON.parse(localStorage['dart-port:$name']);
+    var port = JSON.parse(document.documentElement.attributes['dart-port:$name']);
     return _deserialize(port);
   }
 
@@ -11573,13 +11998,11 @@
    */
   void registerPort(String name, var port) {
     var serialized = _serialize(port);
-    localStorage['dart-port:$name'] = JSON.stringify(serialized);
+    document.documentElement.attributes['dart-port:$name'] = JSON.stringify(serialized);
   }
 
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   LocalWindowEvents get on =>
     new LocalWindowEvents(this);
 
@@ -11587,207 +12010,203 @@
 
   static const int TEMPORARY = 0;
 
-  /** @domName Window.applicationCache */
+  /// @domName Window.applicationCache; @docsEditable true
   final DOMApplicationCache applicationCache;
 
-  /** @domName Window.closed */
+  /// @domName Window.closed; @docsEditable true
   final bool closed;
 
-  /** @domName Window.console */
+  /// @domName Window.console; @docsEditable true
   final Console console;
 
-  /** @domName Window.crypto */
+  /// @domName Window.crypto; @docsEditable true
   final Crypto crypto;
 
-  /** @domName Window.defaultStatus */
+  /// @domName Window.defaultStatus; @docsEditable true
   String defaultStatus;
 
-  /** @domName Window.defaultstatus */
+  /// @domName Window.defaultstatus; @docsEditable true
   String defaultstatus;
 
-  /** @domName Window.devicePixelRatio */
+  /// @domName Window.devicePixelRatio; @docsEditable true
   final num devicePixelRatio;
 
-  /** @domName Window.event */
+  /// @domName Window.event; @docsEditable true
   final Event event;
 
-  /** @domName Window.history */
+  /// @domName Window.history; @docsEditable true
   final LocalHistory history;
 
-  /** @domName Window.innerHeight */
+  /// @domName Window.innerHeight; @docsEditable true
   final int innerHeight;
 
-  /** @domName Window.innerWidth */
+  /// @domName Window.innerWidth; @docsEditable true
   final int innerWidth;
 
-  /** @domName Window.localStorage */
+  /// @domName Window.localStorage; @docsEditable true
   final Storage localStorage;
 
-  /** @domName Window.locationbar */
+  /// @domName Window.locationbar; @docsEditable true
   final BarInfo locationbar;
 
-  /** @domName Window.menubar */
+  /// @domName Window.menubar; @docsEditable true
   final BarInfo menubar;
 
-  /** @domName Window.name */
+  /// @domName Window.name; @docsEditable true
   String name;
 
-  /** @domName Window.navigator */
+  /// @domName Window.navigator; @docsEditable true
   final Navigator navigator;
 
-  /** @domName Window.offscreenBuffering */
+  /// @domName Window.offscreenBuffering; @docsEditable true
   final bool offscreenBuffering;
 
-  /** @domName Window.opener */
+  /// @domName Window.opener; @docsEditable true
   Window get opener => _convertNativeToDart_Window(this._opener);
   dynamic get _opener => JS("dynamic", "#.opener", this);
 
-  /** @domName Window.outerHeight */
+  /// @domName Window.outerHeight; @docsEditable true
   final int outerHeight;
 
-  /** @domName Window.outerWidth */
+  /// @domName Window.outerWidth; @docsEditable true
   final int outerWidth;
 
-  /** @domName DOMWindow.pagePopupController */
+  /// @domName DOMWindow.pagePopupController; @docsEditable true
   final PagePopupController pagePopupController;
 
-  /** @domName Window.pageXOffset */
+  /// @domName Window.pageXOffset; @docsEditable true
   final int pageXOffset;
 
-  /** @domName Window.pageYOffset */
+  /// @domName Window.pageYOffset; @docsEditable true
   final int pageYOffset;
 
-  /** @domName Window.parent */
+  /// @domName Window.parent; @docsEditable true
   Window get parent => _convertNativeToDart_Window(this._parent);
   dynamic get _parent => JS("dynamic", "#.parent", this);
 
-  /** @domName Window.performance */
+  /// @domName Window.performance; @docsEditable true
   final Performance performance;
 
-  /** @domName Window.personalbar */
+  /// @domName Window.personalbar; @docsEditable true
   final BarInfo personalbar;
 
-  /** @domName Window.screen */
+  /// @domName Window.screen; @docsEditable true
   final Screen screen;
 
-  /** @domName Window.screenLeft */
+  /// @domName Window.screenLeft; @docsEditable true
   final int screenLeft;
 
-  /** @domName Window.screenTop */
+  /// @domName Window.screenTop; @docsEditable true
   final int screenTop;
 
-  /** @domName Window.screenX */
+  /// @domName Window.screenX; @docsEditable true
   final int screenX;
 
-  /** @domName Window.screenY */
+  /// @domName Window.screenY; @docsEditable true
   final int screenY;
 
-  /** @domName Window.scrollX */
+  /// @domName Window.scrollX; @docsEditable true
   final int scrollX;
 
-  /** @domName Window.scrollY */
+  /// @domName Window.scrollY; @docsEditable true
   final int scrollY;
 
-  /** @domName Window.scrollbars */
+  /// @domName Window.scrollbars; @docsEditable true
   final BarInfo scrollbars;
 
-  /** @domName Window.self */
+  /// @domName Window.self; @docsEditable true
   Window get self => _convertNativeToDart_Window(this._self);
   dynamic get _self => JS("dynamic", "#.self", this);
 
-  /** @domName Window.sessionStorage */
+  /// @domName Window.sessionStorage; @docsEditable true
   final Storage sessionStorage;
 
-  /** @domName Window.status */
+  /// @domName Window.status; @docsEditable true
   String status;
 
-  /** @domName Window.statusbar */
+  /// @domName Window.statusbar; @docsEditable true
   final BarInfo statusbar;
 
-  /** @domName Window.styleMedia */
+  /// @domName Window.styleMedia; @docsEditable true
   final StyleMedia styleMedia;
 
-  /** @domName Window.toolbar */
+  /// @domName Window.toolbar; @docsEditable true
   final BarInfo toolbar;
 
-  /** @domName Window.top */
+  /// @domName Window.top; @docsEditable true
   Window get top => _convertNativeToDart_Window(this._top);
   dynamic get _top => JS("dynamic", "#.top", this);
 
-  /** @domName DOMWindow.webkitIndexedDB */
+  /// @domName DOMWindow.webkitIndexedDB; @docsEditable true
   final IDBFactory webkitIndexedDB;
 
-  /** @domName DOMWindow.webkitNotifications */
+  /// @domName DOMWindow.webkitNotifications; @docsEditable true
   final NotificationCenter webkitNotifications;
 
-  /** @domName DOMWindow.webkitStorageInfo */
+  /// @domName DOMWindow.webkitStorageInfo; @docsEditable true
   final StorageInfo webkitStorageInfo;
 
-  /** @domName Window.window */
+  /// @domName Window.window; @docsEditable true
   Window get window => _convertNativeToDart_Window(this._window);
   dynamic get _window => JS("dynamic", "#.window", this);
 
-  /** @domName Window.addEventListener */
+  /// @domName Window.addEventListener; @docsEditable true
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
 
-  /** @domName Window.alert */
+  /// @domName Window.alert; @docsEditable true
   void alert(String message) native;
 
-  /** @domName Window.atob */
+  /// @domName Window.atob; @docsEditable true
   String atob(String string) native;
 
-  /** @domName Window.blur */
-  void blur() native;
-
-  /** @domName Window.btoa */
+  /// @domName Window.btoa; @docsEditable true
   String btoa(String string) native;
 
-  /** @domName Window.captureEvents */
+  /// @domName Window.captureEvents; @docsEditable true
   void captureEvents() native;
 
-  /** @domName Window.clearInterval */
+  /// @domName Window.clearInterval; @docsEditable true
   void clearInterval(int handle) native;
 
-  /** @domName Window.clearTimeout */
+  /// @domName Window.clearTimeout; @docsEditable true
   void clearTimeout(int handle) native;
 
-  /** @domName Window.close */
+  /// @domName Window.close; @docsEditable true
   void close() native;
 
-  /** @domName Window.confirm */
+  /// @domName Window.confirm; @docsEditable true
   bool confirm(String message) native;
 
-  /** @domName Window.dispatchEvent */
+  /// @domName Window.dispatchEvent; @docsEditable true
   bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
 
-  /** @domName Window.find */
+  /// @domName Window.find; @docsEditable true
   bool find(String string, bool caseSensitive, bool backwards, bool wrap, bool wholeWord, bool searchInFrames, bool showDialog) native;
 
-  /** @domName Window.focus */
-  void focus() native;
-
-  /** @domName Window.getComputedStyle */
+  /// @domName Window.getComputedStyle; @docsEditable true
   CSSStyleDeclaration $dom_getComputedStyle(Element element, String pseudoElement) native "getComputedStyle";
 
-  /** @domName Window.getMatchedCSSRules */
+  /// @domName Window.getMatchedCSSRules; @docsEditable true
+  @Returns('_CSSRuleList') @Creates('_CSSRuleList')
   List<CSSRule> getMatchedCSSRules(Element element, String pseudoElement) native;
 
-  /** @domName Window.getSelection */
+  /// @domName Window.getSelection; @docsEditable true
   DOMSelection getSelection() native;
 
-  /** @domName Window.matchMedia */
+  /// @domName Window.matchMedia; @docsEditable true
   MediaQueryList matchMedia(String query) native;
 
-  /** @domName Window.moveBy */
+  /// @domName Window.moveBy; @docsEditable true
   void moveBy(num x, num y) native;
 
-  /** @domName Window.moveTo */
+  /// @domName Window.moveTo; @docsEditable true
   void moveTo(num x, num y) native;
 
-  /** @domName DOMWindow.openDatabase */
+  /// @domName DOMWindow.openDatabase; @docsEditable true
+  @Creates('Database') @Creates('DatabaseSync')
   Database openDatabase(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) native;
 
-  /** @domName Window.postMessage */
+  /// @domName Window.postMessage; @docsEditable true
   void postMessage(/*SerializedScriptValue*/ message, String targetOrigin, [List messagePorts]) {
     if (?message &&
         !?messagePorts) {
@@ -11800,57 +12219,57 @@
       _postMessage_2(message_2, targetOrigin, messagePorts);
       return;
     }
-    throw const Exception("Incorrect number or type of arguments");
+    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";
 
-  /** @domName Window.print */
+  /// @domName Window.print; @docsEditable true
   void print() native;
 
-  /** @domName Window.releaseEvents */
+  /// @domName Window.releaseEvents; @docsEditable true
   void releaseEvents() native;
 
-  /** @domName Window.removeEventListener */
+  /// @domName Window.removeEventListener; @docsEditable true
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
 
-  /** @domName Window.resizeBy */
+  /// @domName Window.resizeBy; @docsEditable true
   void resizeBy(num x, num y) native;
 
-  /** @domName Window.resizeTo */
+  /// @domName Window.resizeTo; @docsEditable true
   void resizeTo(num width, num height) native;
 
-  /** @domName Window.scroll */
+  /// @domName Window.scroll; @docsEditable true
   void scroll(int x, int y) native;
 
-  /** @domName Window.scrollBy */
+  /// @domName Window.scrollBy; @docsEditable true
   void scrollBy(int x, int y) native;
 
-  /** @domName Window.scrollTo */
+  /// @domName Window.scrollTo; @docsEditable true
   void scrollTo(int x, int y) native;
 
-  /** @domName Window.setInterval */
+  /// @domName Window.setInterval; @docsEditable true
   int setInterval(TimeoutHandler handler, int timeout) native;
 
-  /** @domName Window.setTimeout */
+  /// @domName Window.setTimeout; @docsEditable true
   int setTimeout(TimeoutHandler handler, int timeout) native;
 
-  /** @domName Window.showModalDialog */
+  /// @domName Window.showModalDialog; @docsEditable true
   Object showModalDialog(String url, [Object dialogArgs, String featureArgs]) native;
 
-  /** @domName Window.stop */
+  /// @domName Window.stop; @docsEditable true
   void stop() native;
 
-  /** @domName Window.webkitConvertPointFromNodeToPage */
+  /// @domName Window.webkitConvertPointFromNodeToPage; @docsEditable true
   Point webkitConvertPointFromNodeToPage(Node node, Point p) native;
 
-  /** @domName Window.webkitConvertPointFromPageToNode */
+  /// @domName Window.webkitConvertPointFromPageToNode; @docsEditable true
   Point webkitConvertPointFromPageToNode(Node node, Point p) native;
 
-  /** @domName DOMWindow.webkitRequestFileSystem */
+  /// @domName DOMWindow.webkitRequestFileSystem; @docsEditable true
   void webkitRequestFileSystem(int type, int size, FileSystemCallback successCallback, [ErrorCallback errorCallback]) native;
 
-  /** @domName DOMWindow.webkitResolveLocalFileSystemURL */
+  /// @domName DOMWindow.webkitResolveLocalFileSystemURL; @docsEditable true
   void webkitResolveLocalFileSystemURL(String url, EntryCallback successCallback, [ErrorCallback errorCallback]) native;
 
 }
@@ -12009,15 +12428,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLMapElement
+/// @domName HTMLMapElement; @docsEditable true
 class MapElement extends Element implements Element native "*HTMLMapElement" {
 
-  factory MapElement() => _Elements.createMapElement();
+  factory MapElement() => document.$dom_createElement("map");
 
-  /** @domName HTMLMapElement.areas */
+  /// @domName HTMLMapElement.areas; @docsEditable true
   final HTMLCollection areas;
 
-  /** @domName HTMLMapElement.name */
+  /// @domName HTMLMapElement.name; @docsEditable true
   String name;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -12025,46 +12444,46 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLMarqueeElement
+/// @domName HTMLMarqueeElement; @docsEditable true
 class MarqueeElement extends Element implements Element native "*HTMLMarqueeElement" {
 
-  /** @domName HTMLMarqueeElement.behavior */
+  /// @domName HTMLMarqueeElement.behavior; @docsEditable true
   String behavior;
 
-  /** @domName HTMLMarqueeElement.bgColor */
+  /// @domName HTMLMarqueeElement.bgColor; @docsEditable true
   String bgColor;
 
-  /** @domName HTMLMarqueeElement.direction */
+  /// @domName HTMLMarqueeElement.direction; @docsEditable true
   String direction;
 
-  /** @domName HTMLMarqueeElement.height */
+  /// @domName HTMLMarqueeElement.height; @docsEditable true
   String height;
 
-  /** @domName HTMLMarqueeElement.hspace */
+  /// @domName HTMLMarqueeElement.hspace; @docsEditable true
   int hspace;
 
-  /** @domName HTMLMarqueeElement.loop */
+  /// @domName HTMLMarqueeElement.loop; @docsEditable true
   int loop;
 
-  /** @domName HTMLMarqueeElement.scrollAmount */
+  /// @domName HTMLMarqueeElement.scrollAmount; @docsEditable true
   int scrollAmount;
 
-  /** @domName HTMLMarqueeElement.scrollDelay */
+  /// @domName HTMLMarqueeElement.scrollDelay; @docsEditable true
   int scrollDelay;
 
-  /** @domName HTMLMarqueeElement.trueSpeed */
+  /// @domName HTMLMarqueeElement.trueSpeed; @docsEditable true
   bool trueSpeed;
 
-  /** @domName HTMLMarqueeElement.vspace */
+  /// @domName HTMLMarqueeElement.vspace; @docsEditable true
   int vspace;
 
-  /** @domName HTMLMarqueeElement.width */
+  /// @domName HTMLMarqueeElement.width; @docsEditable true
   String width;
 
-  /** @domName HTMLMarqueeElement.start */
+  /// @domName HTMLMarqueeElement.start; @docsEditable true
   void start() native;
 
-  /** @domName HTMLMarqueeElement.stop */
+  /// @domName HTMLMarqueeElement.stop; @docsEditable true
   void stop() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -12072,54 +12491,54 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName MediaController
+/// @domName MediaController; @docsEditable true
 class MediaController extends EventTarget native "*MediaController" {
 
   factory MediaController() => _MediaControllerFactoryProvider.createMediaController();
 
-  /** @domName MediaController.buffered */
+  /// @domName MediaController.buffered; @docsEditable true
   final TimeRanges buffered;
 
-  /** @domName MediaController.currentTime */
+  /// @domName MediaController.currentTime; @docsEditable true
   num currentTime;
 
-  /** @domName MediaController.defaultPlaybackRate */
+  /// @domName MediaController.defaultPlaybackRate; @docsEditable true
   num defaultPlaybackRate;
 
-  /** @domName MediaController.duration */
+  /// @domName MediaController.duration; @docsEditable true
   final num duration;
 
-  /** @domName MediaController.muted */
+  /// @domName MediaController.muted; @docsEditable true
   bool muted;
 
-  /** @domName MediaController.paused */
+  /// @domName MediaController.paused; @docsEditable true
   final bool paused;
 
-  /** @domName MediaController.playbackRate */
+  /// @domName MediaController.playbackRate; @docsEditable true
   num playbackRate;
 
-  /** @domName MediaController.played */
+  /// @domName MediaController.played; @docsEditable true
   final TimeRanges played;
 
-  /** @domName MediaController.seekable */
+  /// @domName MediaController.seekable; @docsEditable true
   final TimeRanges seekable;
 
-  /** @domName MediaController.volume */
+  /// @domName MediaController.volume; @docsEditable true
   num volume;
 
-  /** @domName MediaController.addEventListener */
+  /// @domName MediaController.addEventListener; @docsEditable true
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
 
-  /** @domName MediaController.dispatchEvent */
+  /// @domName MediaController.dispatchEvent; @docsEditable true
   bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
 
-  /** @domName MediaController.pause */
+  /// @domName MediaController.pause; @docsEditable true
   void pause() native;
 
-  /** @domName MediaController.play */
+  /// @domName MediaController.play; @docsEditable true
   void play() native;
 
-  /** @domName MediaController.removeEventListener */
+  /// @domName MediaController.removeEventListener; @docsEditable true
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -12127,12 +12546,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLMediaElement
+/// @domName HTMLMediaElement; @docsEditable true
 class MediaElement extends Element implements Element native "*HTMLMediaElement" {
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   MediaElementEvents get on =>
     new MediaElementEvents(this);
 
@@ -12154,124 +12571,124 @@
 
   static const int NETWORK_NO_SOURCE = 3;
 
-  /** @domName HTMLMediaElement.autoplay */
+  /// @domName HTMLMediaElement.autoplay; @docsEditable true
   bool autoplay;
 
-  /** @domName HTMLMediaElement.buffered */
+  /// @domName HTMLMediaElement.buffered; @docsEditable true
   final TimeRanges buffered;
 
-  /** @domName HTMLMediaElement.controller */
+  /// @domName HTMLMediaElement.controller; @docsEditable true
   MediaController controller;
 
-  /** @domName HTMLMediaElement.controls */
+  /// @domName HTMLMediaElement.controls; @docsEditable true
   bool controls;
 
-  /** @domName HTMLMediaElement.currentSrc */
+  /// @domName HTMLMediaElement.currentSrc; @docsEditable true
   final String currentSrc;
 
-  /** @domName HTMLMediaElement.currentTime */
+  /// @domName HTMLMediaElement.currentTime; @docsEditable true
   num currentTime;
 
-  /** @domName HTMLMediaElement.defaultMuted */
+  /// @domName HTMLMediaElement.defaultMuted; @docsEditable true
   bool defaultMuted;
 
-  /** @domName HTMLMediaElement.defaultPlaybackRate */
+  /// @domName HTMLMediaElement.defaultPlaybackRate; @docsEditable true
   num defaultPlaybackRate;
 
-  /** @domName HTMLMediaElement.duration */
+  /// @domName HTMLMediaElement.duration; @docsEditable true
   final num duration;
 
-  /** @domName HTMLMediaElement.ended */
+  /// @domName HTMLMediaElement.ended; @docsEditable true
   final bool ended;
 
-  /** @domName HTMLMediaElement.error */
+  /// @domName HTMLMediaElement.error; @docsEditable true
   final MediaError error;
 
-  /** @domName HTMLMediaElement.initialTime */
+  /// @domName HTMLMediaElement.initialTime; @docsEditable true
   final num initialTime;
 
-  /** @domName HTMLMediaElement.loop */
+  /// @domName HTMLMediaElement.loop; @docsEditable true
   bool loop;
 
-  /** @domName HTMLMediaElement.mediaGroup */
+  /// @domName HTMLMediaElement.mediaGroup; @docsEditable true
   String mediaGroup;
 
-  /** @domName HTMLMediaElement.muted */
+  /// @domName HTMLMediaElement.muted; @docsEditable true
   bool muted;
 
-  /** @domName HTMLMediaElement.networkState */
+  /// @domName HTMLMediaElement.networkState; @docsEditable true
   final int networkState;
 
-  /** @domName HTMLMediaElement.paused */
+  /// @domName HTMLMediaElement.paused; @docsEditable true
   final bool paused;
 
-  /** @domName HTMLMediaElement.playbackRate */
+  /// @domName HTMLMediaElement.playbackRate; @docsEditable true
   num playbackRate;
 
-  /** @domName HTMLMediaElement.played */
+  /// @domName HTMLMediaElement.played; @docsEditable true
   final TimeRanges played;
 
-  /** @domName HTMLMediaElement.preload */
+  /// @domName HTMLMediaElement.preload; @docsEditable true
   String preload;
 
-  /** @domName HTMLMediaElement.readyState */
+  /// @domName HTMLMediaElement.readyState; @docsEditable true
   final int readyState;
 
-  /** @domName HTMLMediaElement.seekable */
+  /// @domName HTMLMediaElement.seekable; @docsEditable true
   final TimeRanges seekable;
 
-  /** @domName HTMLMediaElement.seeking */
+  /// @domName HTMLMediaElement.seeking; @docsEditable true
   final bool seeking;
 
-  /** @domName HTMLMediaElement.src */
+  /// @domName HTMLMediaElement.src; @docsEditable true
   String src;
 
-  /** @domName HTMLMediaElement.startTime */
+  /// @domName HTMLMediaElement.startTime; @docsEditable true
   final num startTime;
 
-  /** @domName HTMLMediaElement.textTracks */
+  /// @domName HTMLMediaElement.textTracks; @docsEditable true
   final TextTrackList textTracks;
 
-  /** @domName HTMLMediaElement.volume */
+  /// @domName HTMLMediaElement.volume; @docsEditable true
   num volume;
 
-  /** @domName HTMLMediaElement.webkitAudioDecodedByteCount */
+  /// @domName HTMLMediaElement.webkitAudioDecodedByteCount; @docsEditable true
   final int webkitAudioDecodedByteCount;
 
-  /** @domName HTMLMediaElement.webkitClosedCaptionsVisible */
+  /// @domName HTMLMediaElement.webkitClosedCaptionsVisible; @docsEditable true
   bool webkitClosedCaptionsVisible;
 
-  /** @domName HTMLMediaElement.webkitHasClosedCaptions */
+  /// @domName HTMLMediaElement.webkitHasClosedCaptions; @docsEditable true
   final bool webkitHasClosedCaptions;
 
-  /** @domName HTMLMediaElement.webkitPreservesPitch */
+  /// @domName HTMLMediaElement.webkitPreservesPitch; @docsEditable true
   bool webkitPreservesPitch;
 
-  /** @domName HTMLMediaElement.webkitVideoDecodedByteCount */
+  /// @domName HTMLMediaElement.webkitVideoDecodedByteCount; @docsEditable true
   final int webkitVideoDecodedByteCount;
 
-  /** @domName HTMLMediaElement.addTextTrack */
+  /// @domName HTMLMediaElement.addTextTrack; @docsEditable true
   TextTrack addTextTrack(String kind, [String label, String language]) native;
 
-  /** @domName HTMLMediaElement.canPlayType */
+  /// @domName HTMLMediaElement.canPlayType; @docsEditable true
   String canPlayType(String type, String keySystem) native;
 
-  /** @domName HTMLMediaElement.load */
+  /// @domName HTMLMediaElement.load; @docsEditable true
   void load() native;
 
-  /** @domName HTMLMediaElement.pause */
+  /// @domName HTMLMediaElement.pause; @docsEditable true
   void pause() native;
 
-  /** @domName HTMLMediaElement.play */
+  /// @domName HTMLMediaElement.play; @docsEditable true
   void play() native;
 
-  /** @domName HTMLMediaElement.webkitAddKey */
+  /// @domName HTMLMediaElement.webkitAddKey; @docsEditable true
   void webkitAddKey(String keySystem, Uint8Array key, [Uint8Array initData, String sessionId]) native;
 
-  /** @domName HTMLMediaElement.webkitCancelKeyRequest */
+  /// @domName HTMLMediaElement.webkitCancelKeyRequest; @docsEditable true
   void webkitCancelKeyRequest(String keySystem, String sessionId) native;
 
-  /** @domName HTMLMediaElement.webkitGenerateKeyRequest */
+  /// @domName HTMLMediaElement.webkitGenerateKeyRequest; @docsEditable true
   void webkitGenerateKeyRequest(String keySystem, [Uint8Array initData]) native;
 }
 
@@ -12333,10 +12750,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName MediaElementAudioSourceNode
+/// @domName MediaElementAudioSourceNode; @docsEditable true
 class MediaElementAudioSourceNode extends AudioSourceNode native "*MediaElementAudioSourceNode" {
 
-  /** @domName MediaElementAudioSourceNode.mediaElement */
+  /// @domName MediaElementAudioSourceNode.mediaElement; @docsEditable true
   final MediaElement mediaElement;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -12344,7 +12761,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName MediaError
+/// @domName MediaError; @docsEditable true
 class MediaError native "*MediaError" {
 
   static const int MEDIA_ERR_ABORTED = 1;
@@ -12357,7 +12774,7 @@
 
   static const int MEDIA_ERR_SRC_NOT_SUPPORTED = 4;
 
-  /** @domName MediaError.code */
+  /// @domName MediaError.code; @docsEditable true
   final int code;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -12365,7 +12782,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName MediaKeyError
+/// @domName MediaKeyError; @docsEditable true
 class MediaKeyError native "*MediaKeyError" {
 
   static const int MEDIA_KEYERR_CLIENT = 2;
@@ -12380,7 +12797,7 @@
 
   static const int MEDIA_KEYERR_UNKNOWN = 1;
 
-  /** @domName MediaKeyError.code */
+  /// @domName MediaKeyError.code; @docsEditable true
   final int code;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -12388,28 +12805,28 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName MediaKeyEvent
+/// @domName MediaKeyEvent; @docsEditable true
 class MediaKeyEvent extends Event native "*MediaKeyEvent" {
 
-  /** @domName MediaKeyEvent.defaultURL */
+  /// @domName MediaKeyEvent.defaultURL; @docsEditable true
   final String defaultURL;
 
-  /** @domName MediaKeyEvent.errorCode */
+  /// @domName MediaKeyEvent.errorCode; @docsEditable true
   final MediaKeyError errorCode;
 
-  /** @domName MediaKeyEvent.initData */
+  /// @domName MediaKeyEvent.initData; @docsEditable true
   final Uint8Array initData;
 
-  /** @domName MediaKeyEvent.keySystem */
+  /// @domName MediaKeyEvent.keySystem; @docsEditable true
   final String keySystem;
 
-  /** @domName MediaKeyEvent.message */
+  /// @domName MediaKeyEvent.message; @docsEditable true
   final Uint8Array message;
 
-  /** @domName MediaKeyEvent.sessionId */
+  /// @domName MediaKeyEvent.sessionId; @docsEditable true
   final String sessionId;
 
-  /** @domName MediaKeyEvent.systemCode */
+  /// @domName MediaKeyEvent.systemCode; @docsEditable true
   final int systemCode;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -12417,22 +12834,22 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName MediaList
+/// @domName MediaList; @docsEditable true
 class MediaList native "*MediaList" {
 
-  /** @domName MediaList.length */
+  /// @domName MediaList.length; @docsEditable true
   final int length;
 
-  /** @domName MediaList.mediaText */
+  /// @domName MediaList.mediaText; @docsEditable true
   String mediaText;
 
-  /** @domName MediaList.appendMedium */
+  /// @domName MediaList.appendMedium; @docsEditable true
   void appendMedium(String newMedium) native;
 
-  /** @domName MediaList.deleteMedium */
+  /// @domName MediaList.deleteMedium; @docsEditable true
   void deleteMedium(String oldMedium) native;
 
-  /** @domName MediaList.item */
+  /// @domName MediaList.item; @docsEditable true
   String item(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -12440,19 +12857,19 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName MediaQueryList
+/// @domName MediaQueryList; @docsEditable true
 class MediaQueryList native "*MediaQueryList" {
 
-  /** @domName MediaQueryList.matches */
+  /// @domName MediaQueryList.matches; @docsEditable true
   final bool matches;
 
-  /** @domName MediaQueryList.media */
+  /// @domName MediaQueryList.media; @docsEditable true
   final String media;
 
-  /** @domName MediaQueryList.addListener */
+  /// @domName MediaQueryList.addListener; @docsEditable true
   void addListener(MediaQueryListListener listener) native;
 
-  /** @domName MediaQueryList.removeListener */
+  /// @domName MediaQueryList.removeListener; @docsEditable true
   void removeListener(MediaQueryListListener listener) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -12463,7 +12880,7 @@
 /// @domName MediaQueryListListener
 abstract class MediaQueryListListener {
 
-  /** @domName MediaQueryListListener.queryChanged */
+  /// @domName MediaQueryListListener.queryChanged; @docsEditable true
   void queryChanged(MediaQueryList list);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -12471,39 +12888,39 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName MediaSource
+/// @domName MediaSource; @docsEditable true
 class MediaSource extends EventTarget native "*MediaSource" {
 
   factory MediaSource() => _MediaSourceFactoryProvider.createMediaSource();
 
-  /** @domName MediaSource.activeSourceBuffers */
+  /// @domName MediaSource.activeSourceBuffers; @docsEditable true
   final SourceBufferList activeSourceBuffers;
 
-  /** @domName MediaSource.duration */
+  /// @domName MediaSource.duration; @docsEditable true
   num duration;
 
-  /** @domName MediaSource.readyState */
+  /// @domName MediaSource.readyState; @docsEditable true
   final String readyState;
 
-  /** @domName MediaSource.sourceBuffers */
+  /// @domName MediaSource.sourceBuffers; @docsEditable true
   final SourceBufferList sourceBuffers;
 
-  /** @domName MediaSource.addEventListener */
+  /// @domName MediaSource.addEventListener; @docsEditable true
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
 
-  /** @domName MediaSource.addSourceBuffer */
+  /// @domName MediaSource.addSourceBuffer; @docsEditable true
   SourceBuffer addSourceBuffer(String type) native;
 
-  /** @domName MediaSource.dispatchEvent */
+  /// @domName MediaSource.dispatchEvent; @docsEditable true
   bool $dom_dispatchEvent(Event event) native "dispatchEvent";
 
-  /** @domName MediaSource.endOfStream */
+  /// @domName MediaSource.endOfStream; @docsEditable true
   void endOfStream(String error) native;
 
-  /** @domName MediaSource.removeEventListener */
+  /// @domName MediaSource.removeEventListener; @docsEditable true
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
 
-  /** @domName MediaSource.removeSourceBuffer */
+  /// @domName MediaSource.removeSourceBuffer; @docsEditable true
   void removeSourceBuffer(SourceBuffer buffer) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -12511,14 +12928,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName MediaStream
+/// @domName MediaStream; @docsEditable true
 class MediaStream extends EventTarget native "*MediaStream" {
 
   factory MediaStream(MediaStreamTrackList audioTracks, MediaStreamTrackList videoTracks) => _MediaStreamFactoryProvider.createMediaStream(audioTracks, videoTracks);
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   MediaStreamEvents get on =>
     new MediaStreamEvents(this);
 
@@ -12526,25 +12941,25 @@
 
   static const int LIVE = 1;
 
-  /** @domName MediaStream.audioTracks */
+  /// @domName MediaStream.audioTracks; @docsEditable true
   final MediaStreamTrackList audioTracks;
 
-  /** @domName MediaStream.label */
+  /// @domName MediaStream.label; @docsEditable true
   final String label;
 
-  /** @domName MediaStream.readyState */
+  /// @domName MediaStream.readyState; @docsEditable true
   final int readyState;
 
-  /** @domName MediaStream.videoTracks */
+  /// @domName MediaStream.videoTracks; @docsEditable true
   final MediaStreamTrackList videoTracks;
 
-  /** @domName MediaStream.addEventListener */
+  /// @domName MediaStream.addEventListener; @docsEditable true
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
 
-  /** @domName MediaStream.dispatchEvent */
+  /// @domName MediaStream.dispatchEvent; @docsEditable true
   bool $dom_dispatchEvent(Event event) native "dispatchEvent";
 
-  /** @domName MediaStream.removeEventListener */
+  /// @domName MediaStream.removeEventListener; @docsEditable true
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
 }
 
@@ -12558,10 +12973,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName MediaStreamAudioSourceNode
+/// @domName MediaStreamAudioSourceNode; @docsEditable true
 class MediaStreamAudioSourceNode extends AudioSourceNode native "*MediaStreamAudioSourceNode" {
 
-  /** @domName MediaStreamAudioSourceNode.mediaStream */
+  /// @domName MediaStreamAudioSourceNode.mediaStream; @docsEditable true
   final MediaStream mediaStream;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -12569,10 +12984,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName MediaStreamEvent
+/// @domName MediaStreamEvent; @docsEditable true
 class MediaStreamEvent extends Event native "*MediaStreamEvent" {
 
-  /** @domName MediaStreamEvent.stream */
+  /// @domName MediaStreamEvent.stream; @docsEditable true
   final MediaStream stream;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -12580,12 +12995,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName MediaStreamTrack
+/// @domName MediaStreamTrack; @docsEditable true
 class MediaStreamTrack extends EventTarget native "*MediaStreamTrack" {
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   MediaStreamTrackEvents get on =>
     new MediaStreamTrackEvents(this);
 
@@ -12595,25 +13008,25 @@
 
   static const int MUTED = 1;
 
-  /** @domName MediaStreamTrack.enabled */
+  /// @domName MediaStreamTrack.enabled; @docsEditable true
   bool enabled;
 
-  /** @domName MediaStreamTrack.kind */
+  /// @domName MediaStreamTrack.kind; @docsEditable true
   final String kind;
 
-  /** @domName MediaStreamTrack.label */
+  /// @domName MediaStreamTrack.label; @docsEditable true
   final String label;
 
-  /** @domName MediaStreamTrack.readyState */
+  /// @domName MediaStreamTrack.readyState; @docsEditable true
   final int readyState;
 
-  /** @domName MediaStreamTrack.addEventListener */
+  /// @domName MediaStreamTrack.addEventListener; @docsEditable true
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
 
-  /** @domName MediaStreamTrack.dispatchEvent */
+  /// @domName MediaStreamTrack.dispatchEvent; @docsEditable true
   bool $dom_dispatchEvent(Event event) native "dispatchEvent";
 
-  /** @domName MediaStreamTrack.removeEventListener */
+  /// @domName MediaStreamTrack.removeEventListener; @docsEditable true
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
 }
 
@@ -12631,10 +13044,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName MediaStreamTrackEvent
+/// @domName MediaStreamTrackEvent; @docsEditable true
 class MediaStreamTrackEvent extends Event native "*MediaStreamTrackEvent" {
 
-  /** @domName MediaStreamTrackEvent.track */
+  /// @domName MediaStreamTrackEvent.track; @docsEditable true
   final MediaStreamTrack track;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -12642,34 +13055,32 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName MediaStreamTrackList
+/// @domName MediaStreamTrackList; @docsEditable true
 class MediaStreamTrackList extends EventTarget native "*MediaStreamTrackList" {
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   MediaStreamTrackListEvents get on =>
     new MediaStreamTrackListEvents(this);
 
-  /** @domName MediaStreamTrackList.length */
+  /// @domName MediaStreamTrackList.length; @docsEditable true
   final int length;
 
-  /** @domName MediaStreamTrackList.add */
+  /// @domName MediaStreamTrackList.add; @docsEditable true
   void add(MediaStreamTrack track) native;
 
-  /** @domName MediaStreamTrackList.addEventListener */
+  /// @domName MediaStreamTrackList.addEventListener; @docsEditable true
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
 
-  /** @domName MediaStreamTrackList.dispatchEvent */
+  /// @domName MediaStreamTrackList.dispatchEvent; @docsEditable true
   bool $dom_dispatchEvent(Event event) native "dispatchEvent";
 
-  /** @domName MediaStreamTrackList.item */
+  /// @domName MediaStreamTrackList.item; @docsEditable true
   MediaStreamTrack item(int index) native;
 
-  /** @domName MediaStreamTrackList.remove */
+  /// @domName MediaStreamTrackList.remove; @docsEditable true
   void remove(MediaStreamTrack track) native;
 
-  /** @domName MediaStreamTrackList.removeEventListener */
+  /// @domName MediaStreamTrackList.removeEventListener; @docsEditable true
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
 }
 
@@ -12685,16 +13096,16 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName MemoryInfo
+/// @domName MemoryInfo; @docsEditable true
 class MemoryInfo native "*MemoryInfo" {
 
-  /** @domName MemoryInfo.jsHeapSizeLimit */
+  /// @domName MemoryInfo.jsHeapSizeLimit; @docsEditable true
   final int jsHeapSizeLimit;
 
-  /** @domName MemoryInfo.totalJSHeapSize */
+  /// @domName MemoryInfo.totalJSHeapSize; @docsEditable true
   final int totalJSHeapSize;
 
-  /** @domName MemoryInfo.usedJSHeapSize */
+  /// @domName MemoryInfo.usedJSHeapSize; @docsEditable true
   final int usedJSHeapSize;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -12702,12 +13113,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLMenuElement
+/// @domName HTMLMenuElement; @docsEditable true
 class MenuElement extends Element implements Element native "*HTMLMenuElement" {
 
-  factory MenuElement() => _Elements.createMenuElement();
+  factory MenuElement() => document.$dom_createElement("menu");
 
-  /** @domName HTMLMenuElement.compact */
+  /// @domName HTMLMenuElement.compact; @docsEditable true
   bool compact;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -12715,15 +13126,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName MessageChannel
+/// @domName MessageChannel; @docsEditable true
 class MessageChannel native "*MessageChannel" {
 
   factory MessageChannel() => _MessageChannelFactoryProvider.createMessageChannel();
 
-  /** @domName MessageChannel.port1 */
+  /// @domName MessageChannel.port1; @docsEditable true
   final MessagePort port1;
 
-  /** @domName MessageChannel.port2 */
+  /// @domName MessageChannel.port2; @docsEditable true
   final MessagePort port2;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -12731,30 +13142,31 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName MessageEvent
+/// @domName MessageEvent; @docsEditable true
 class MessageEvent extends Event native "*MessageEvent" {
 
-  /** @domName MessageEvent.data */
+  /// @domName MessageEvent.data; @docsEditable true
   dynamic get data => _convertNativeToDart_SerializedScriptValue(this._data);
   dynamic get _data => JS("dynamic", "#.data", this);
 
-  /** @domName MessageEvent.lastEventId */
+  /// @domName MessageEvent.lastEventId; @docsEditable true
   final String lastEventId;
 
-  /** @domName MessageEvent.origin */
+  /// @domName MessageEvent.origin; @docsEditable true
   final String origin;
 
-  /** @domName MessageEvent.ports */
+  /// @domName MessageEvent.ports; @docsEditable true
+  @Creates('=List')
   final List ports;
 
-  /** @domName MessageEvent.source */
+  /// @domName MessageEvent.source; @docsEditable true
   Window get source => _convertNativeToDart_Window(this._source);
   dynamic get _source => JS("dynamic", "#.source", this);
 
-  /** @domName MessageEvent.initMessageEvent */
+  /// @domName MessageEvent.initMessageEvent; @docsEditable true
   void initMessageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object dataArg, String originArg, String lastEventIdArg, LocalWindow sourceArg, List messagePorts) native;
 
-  /** @domName MessageEvent.webkitInitMessageEvent */
+  /// @domName MessageEvent.webkitInitMessageEvent; @docsEditable true
   void webkitInitMessageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object dataArg, String originArg, String lastEventIdArg, LocalWindow sourceArg, List transferables) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -12762,25 +13174,23 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName MessagePort
+/// @domName MessagePort; @docsEditable true
 class MessagePort extends EventTarget native "*MessagePort" {
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   MessagePortEvents get on =>
     new MessagePortEvents(this);
 
-  /** @domName MessagePort.addEventListener */
+  /// @domName MessagePort.addEventListener; @docsEditable true
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
 
-  /** @domName MessagePort.close */
+  /// @domName MessagePort.close; @docsEditable true
   void close() native;
 
-  /** @domName MessagePort.dispatchEvent */
+  /// @domName MessagePort.dispatchEvent; @docsEditable true
   bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
 
-  /** @domName MessagePort.postMessage */
+  /// @domName MessagePort.postMessage; @docsEditable true
   void postMessage(/*any*/ message, [List messagePorts]) {
     if (?messagePorts) {
       var message_1 = _convertDartToNative_SerializedScriptValue(message);
@@ -12794,10 +13204,10 @@
   void _postMessage_1(message, List messagePorts) native "postMessage";
   void _postMessage_2(message) native "postMessage";
 
-  /** @domName MessagePort.removeEventListener */
+  /// @domName MessagePort.removeEventListener; @docsEditable true
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
 
-  /** @domName MessagePort.start */
+  /// @domName MessagePort.start; @docsEditable true
   void start() native;
 }
 
@@ -12811,19 +13221,19 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLMetaElement
+/// @domName HTMLMetaElement; @docsEditable true
 class MetaElement extends Element implements Element native "*HTMLMetaElement" {
 
-  /** @domName HTMLMetaElement.content */
+  /// @domName HTMLMetaElement.content; @docsEditable true
   String content;
 
-  /** @domName HTMLMetaElement.httpEquiv */
+  /// @domName HTMLMetaElement.httpEquiv; @docsEditable true
   String httpEquiv;
 
-  /** @domName HTMLMetaElement.name */
+  /// @domName HTMLMetaElement.name; @docsEditable true
   String name;
 
-  /** @domName HTMLMetaElement.scheme */
+  /// @domName HTMLMetaElement.scheme; @docsEditable true
   String scheme;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -12831,13 +13241,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Metadata
+/// @domName Metadata; @docsEditable true
 class Metadata native "*Metadata" {
 
-  /** @domName Metadata.modificationTime */
+  /// @domName Metadata.modificationTime; @docsEditable true
   final Date modificationTime;
 
-  /** @domName Metadata.size */
+  /// @domName Metadata.size; @docsEditable true
   final int size;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -12853,30 +13263,31 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLMeterElement
+/// @domName HTMLMeterElement; @docsEditable true
 class MeterElement extends Element implements Element native "*HTMLMeterElement" {
 
-  factory MeterElement() => _Elements.createMeterElement();
+  factory MeterElement() => document.$dom_createElement("meter");
 
-  /** @domName HTMLMeterElement.high */
+  /// @domName HTMLMeterElement.high; @docsEditable true
   num high;
 
-  /** @domName HTMLMeterElement.labels */
+  /// @domName HTMLMeterElement.labels; @docsEditable true
+  @Returns('_NodeList') @Creates('_NodeList')
   final List<Node> labels;
 
-  /** @domName HTMLMeterElement.low */
+  /// @domName HTMLMeterElement.low; @docsEditable true
   num low;
 
-  /** @domName HTMLMeterElement.max */
+  /// @domName HTMLMeterElement.max; @docsEditable true
   num max;
 
-  /** @domName HTMLMeterElement.min */
+  /// @domName HTMLMeterElement.min; @docsEditable true
   num min;
 
-  /** @domName HTMLMeterElement.optimum */
+  /// @domName HTMLMeterElement.optimum; @docsEditable true
   num optimum;
 
-  /** @domName HTMLMeterElement.value */
+  /// @domName HTMLMeterElement.value; @docsEditable true
   num value;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -12884,13 +13295,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLModElement
+/// @domName HTMLModElement; @docsEditable true
 class ModElement extends Element implements Element native "*HTMLModElement" {
 
-  /** @domName HTMLModElement.cite */
+  /// @domName HTMLModElement.cite; @docsEditable true
   String cite;
 
-  /** @domName HTMLModElement.dateTime */
+  /// @domName HTMLModElement.dateTime; @docsEditable true
   String dateTime;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -12910,59 +13321,59 @@
           ctrlKey, altKey, shiftKey, metaKey,
           relatedTarget);
 
-  /** @domName MouseEvent.altKey */
+  /// @domName MouseEvent.altKey; @docsEditable true
   final bool altKey;
 
-  /** @domName MouseEvent.button */
+  /// @domName MouseEvent.button; @docsEditable true
   final int button;
 
-  /** @domName MouseEvent.clientX */
+  /// @domName MouseEvent.clientX; @docsEditable true
   final int clientX;
 
-  /** @domName MouseEvent.clientY */
+  /// @domName MouseEvent.clientY; @docsEditable true
   final int clientY;
 
-  /** @domName MouseEvent.ctrlKey */
+  /// @domName MouseEvent.ctrlKey; @docsEditable true
   final bool ctrlKey;
 
-  /** @domName MouseEvent.dataTransfer */
+  /// @domName MouseEvent.dataTransfer; @docsEditable true
   final Clipboard dataTransfer;
 
-  /** @domName MouseEvent.fromElement */
+  /// @domName MouseEvent.fromElement; @docsEditable true
   final Node fromElement;
 
-  /** @domName MouseEvent.metaKey */
+  /// @domName MouseEvent.metaKey; @docsEditable true
   final bool metaKey;
 
-  /** @domName MouseEvent.relatedTarget */
+  /// @domName MouseEvent.relatedTarget; @docsEditable true
   EventTarget get relatedTarget => _convertNativeToDart_EventTarget(this._relatedTarget);
   dynamic get _relatedTarget => JS("dynamic", "#.relatedTarget", this);
 
-  /** @domName MouseEvent.screenX */
+  /// @domName MouseEvent.screenX; @docsEditable true
   final int screenX;
 
-  /** @domName MouseEvent.screenY */
+  /// @domName MouseEvent.screenY; @docsEditable true
   final int screenY;
 
-  /** @domName MouseEvent.shiftKey */
+  /// @domName MouseEvent.shiftKey; @docsEditable true
   final bool shiftKey;
 
-  /** @domName MouseEvent.toElement */
+  /// @domName MouseEvent.toElement; @docsEditable true
   final Node toElement;
 
-  /** @domName MouseEvent.webkitMovementX */
+  /// @domName MouseEvent.webkitMovementX; @docsEditable true
   final int webkitMovementX;
 
-  /** @domName MouseEvent.webkitMovementY */
+  /// @domName MouseEvent.webkitMovementY; @docsEditable true
   final int webkitMovementY;
 
-  /** @domName MouseEvent.x */
+  /// @domName MouseEvent.x; @docsEditable true
   final int x;
 
-  /** @domName MouseEvent.y */
+  /// @domName MouseEvent.y; @docsEditable true
   final int y;
 
-  /** @domName MouseEvent.initMouseEvent */
+  /// @domName MouseEvent.initMouseEvent; @docsEditable true
   void $dom_initMouseEvent(String type, bool canBubble, bool cancelable, LocalWindow view, int detail, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, int button, EventTarget relatedTarget) {
     var relatedTarget_1 = _convertDartToNative_EventTarget(relatedTarget);
     _$dom_initMouseEvent_1(type, canBubble, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget_1);
@@ -13012,7 +13423,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName MutationEvent
+/// @domName MutationEvent; @docsEditable true
 class MutationEvent extends Event native "*MutationEvent" {
 
   static const int ADDITION = 2;
@@ -13021,22 +13432,22 @@
 
   static const int REMOVAL = 3;
 
-  /** @domName MutationEvent.attrChange */
+  /// @domName MutationEvent.attrChange; @docsEditable true
   final int attrChange;
 
-  /** @domName MutationEvent.attrName */
+  /// @domName MutationEvent.attrName; @docsEditable true
   final String attrName;
 
-  /** @domName MutationEvent.newValue */
+  /// @domName MutationEvent.newValue; @docsEditable true
   final String newValue;
 
-  /** @domName MutationEvent.prevValue */
+  /// @domName MutationEvent.prevValue; @docsEditable true
   final String prevValue;
 
-  /** @domName MutationEvent.relatedNode */
+  /// @domName MutationEvent.relatedNode; @docsEditable true
   final Node relatedNode;
 
-  /** @domName MutationEvent.initMutationEvent */
+  /// @domName MutationEvent.initMutationEvent; @docsEditable true
   void initMutationEvent(String type, bool canBubble, bool cancelable, Node relatedNode, String prevValue, String newValue, String attrName, int attrChange) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -13048,10 +13459,10 @@
 
   factory MutationObserver(MutationCallback callback) => _MutationObserverFactoryProvider.createMutationObserver(callback);
 
-  /** @domName MutationObserver.disconnect */
+  /// @domName MutationObserver.disconnect; @docsEditable true
   void disconnect() native;
 
-  /** @domName MutationObserver._observe */
+  /// @domName MutationObserver._observe; @docsEditable true
   void _observe(Node target, Map options) {
     var options_1 = _convertDartToNative_Dictionary(options);
     __observe_1(target, options_1);
@@ -13059,7 +13470,7 @@
   }
   void __observe_1(Node target, options) native "observe";
 
-  /** @domName MutationObserver.takeRecords */
+  /// @domName MutationObserver.takeRecords; @docsEditable true
   List<MutationRecord> takeRecords() native;
 
   void observe(Node target,
@@ -13128,34 +13539,36 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName MutationRecord
+/// @domName MutationRecord; @docsEditable true
 class MutationRecord native "*MutationRecord" {
 
-  /** @domName MutationRecord.addedNodes */
+  /// @domName MutationRecord.addedNodes; @docsEditable true
+  @Returns('_NodeList') @Creates('_NodeList')
   final List<Node> addedNodes;
 
-  /** @domName MutationRecord.attributeName */
+  /// @domName MutationRecord.attributeName; @docsEditable true
   final String attributeName;
 
-  /** @domName MutationRecord.attributeNamespace */
+  /// @domName MutationRecord.attributeNamespace; @docsEditable true
   final String attributeNamespace;
 
-  /** @domName MutationRecord.nextSibling */
+  /// @domName MutationRecord.nextSibling; @docsEditable true
   final Node nextSibling;
 
-  /** @domName MutationRecord.oldValue */
+  /// @domName MutationRecord.oldValue; @docsEditable true
   final String oldValue;
 
-  /** @domName MutationRecord.previousSibling */
+  /// @domName MutationRecord.previousSibling; @docsEditable true
   final Node previousSibling;
 
-  /** @domName MutationRecord.removedNodes */
+  /// @domName MutationRecord.removedNodes; @docsEditable true
+  @Returns('_NodeList') @Creates('_NodeList')
   final List<Node> removedNodes;
 
-  /** @domName MutationRecord.target */
+  /// @domName MutationRecord.target; @docsEditable true
   final Node target;
 
-  /** @domName MutationRecord.type */
+  /// @domName MutationRecord.type; @docsEditable true
   final String type;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -13163,10 +13576,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName NamedNodeMap
+/// @domName NamedNodeMap; @docsEditable true
 class NamedNodeMap implements JavaScriptIndexingBehavior, List<Node> native "*NamedNodeMap" {
 
-  /** @domName NamedNodeMap.length */
+  /// @domName NamedNodeMap.length; @docsEditable true
   final int length;
 
   Node operator[](int index) => JS("Node", "#[#]", this, index);
@@ -13229,6 +13642,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  Node get first => this[0];
+
   Node get last => this[length - 1];
 
   Node removeLast() {
@@ -13252,25 +13667,25 @@
 
   // -- end List<Node> mixins.
 
-  /** @domName NamedNodeMap.getNamedItem */
+  /// @domName NamedNodeMap.getNamedItem; @docsEditable true
   Node getNamedItem(String name) native;
 
-  /** @domName NamedNodeMap.getNamedItemNS */
+  /// @domName NamedNodeMap.getNamedItemNS; @docsEditable true
   Node getNamedItemNS(String namespaceURI, String localName) native;
 
-  /** @domName NamedNodeMap.item */
+  /// @domName NamedNodeMap.item; @docsEditable true
   Node item(int index) native;
 
-  /** @domName NamedNodeMap.removeNamedItem */
+  /// @domName NamedNodeMap.removeNamedItem; @docsEditable true
   Node removeNamedItem(String name) native;
 
-  /** @domName NamedNodeMap.removeNamedItemNS */
+  /// @domName NamedNodeMap.removeNamedItemNS; @docsEditable true
   Node removeNamedItemNS(String namespaceURI, String localName) native;
 
-  /** @domName NamedNodeMap.setNamedItem */
+  /// @domName NamedNodeMap.setNamedItem; @docsEditable true
   Node setNamedItem(Node node) native;
 
-  /** @domName NamedNodeMap.setNamedItemNS */
+  /// @domName NamedNodeMap.setNamedItemNS; @docsEditable true
   Node setNamedItemNS(Node node) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -13278,67 +13693,68 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Navigator
+/// @domName Navigator; @docsEditable true
 class Navigator native "*Navigator" {
 
-  /** @domName Navigator.appCodeName */
+  /// @domName Navigator.appCodeName; @docsEditable true
   final String appCodeName;
 
-  /** @domName Navigator.appName */
+  /// @domName Navigator.appName; @docsEditable true
   final String appName;
 
-  /** @domName Navigator.appVersion */
+  /// @domName Navigator.appVersion; @docsEditable true
   final String appVersion;
 
-  /** @domName Navigator.cookieEnabled */
+  /// @domName Navigator.cookieEnabled; @docsEditable true
   final bool cookieEnabled;
 
-  /** @domName Navigator.geolocation */
+  /// @domName Navigator.geolocation; @docsEditable true
   final Geolocation geolocation;
 
-  /** @domName Navigator.language */
+  /// @domName Navigator.language; @docsEditable true
   final String language;
 
-  /** @domName Navigator.mimeTypes */
+  /// @domName Navigator.mimeTypes; @docsEditable true
   final DOMMimeTypeArray mimeTypes;
 
-  /** @domName Navigator.onLine */
+  /// @domName Navigator.onLine; @docsEditable true
   final bool onLine;
 
-  /** @domName Navigator.platform */
+  /// @domName Navigator.platform; @docsEditable true
   final String platform;
 
-  /** @domName Navigator.plugins */
+  /// @domName Navigator.plugins; @docsEditable true
   final DOMPluginArray plugins;
 
-  /** @domName Navigator.product */
+  /// @domName Navigator.product; @docsEditable true
   final String product;
 
-  /** @domName Navigator.productSub */
+  /// @domName Navigator.productSub; @docsEditable true
   final String productSub;
 
-  /** @domName Navigator.userAgent */
+  /// @domName Navigator.userAgent; @docsEditable true
   final String userAgent;
 
-  /** @domName Navigator.vendor */
+  /// @domName Navigator.vendor; @docsEditable true
   final String vendor;
 
-  /** @domName Navigator.vendorSub */
+  /// @domName Navigator.vendorSub; @docsEditable true
   final String vendorSub;
 
-  /** @domName Navigator.webkitBattery */
+  /// @domName Navigator.webkitBattery; @docsEditable true
   final BatteryManager webkitBattery;
 
-  /** @domName Navigator.getStorageUpdates */
+  /// @domName Navigator.getStorageUpdates; @docsEditable true
   void getStorageUpdates() native;
 
-  /** @domName Navigator.javaEnabled */
+  /// @domName Navigator.javaEnabled; @docsEditable true
   bool javaEnabled() native;
 
-  /** @domName Navigator.webkitGetGamepads */
+  /// @domName Navigator.webkitGetGamepads; @docsEditable true
+  @Returns('_GamepadList') @Creates('_GamepadList')
   List<Gamepad> webkitGetGamepads() native;
 
-  /** @domName Navigator.webkitGetUserMedia */
+  /// @domName Navigator.webkitGetUserMedia; @docsEditable true
   void webkitGetUserMedia(Map options, NavigatorUserMediaSuccessCallback successCallback, [NavigatorUserMediaErrorCallback errorCallback]) {
     if (?errorCallback) {
       var options_1 = _convertDartToNative_Dictionary(options);
@@ -13357,12 +13773,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName NavigatorUserMediaError
+/// @domName NavigatorUserMediaError; @docsEditable true
 class NavigatorUserMediaError native "*NavigatorUserMediaError" {
 
   static const int PERMISSION_DENIED = 1;
 
-  /** @domName NavigatorUserMediaError.code */
+  /// @domName NavigatorUserMediaError.code; @docsEditable true
   final int code;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -13442,7 +13858,7 @@
   Collection map(f(Node element)) => _Collections.map(this, [], f);
 
   Collection<Node> filter(bool f(Node element)) =>
-     new _NodeListWrapper(_Collections.filter(this, <Node>[], f));
+     _Collections.filter(this, <Node>[], f);
 
   bool every(bool f(Node element)) => _Collections.every(this, f);
 
@@ -13478,7 +13894,7 @@
         "Cannot insertRange on immutable List.");
   }
   List<Node> getRange(int start, int rangeLength) =>
-    new _NodeListWrapper(_Lists.getRange(this, start, rangeLength, <Node>[]));
+      _Lists.getRange(this, start, rangeLength, <Node>[]);
 
   // -- end List<Node> mixins.
 
@@ -13568,69 +13984,69 @@
 
   static const int TEXT_NODE = 3;
 
-  /** @domName Node.attributes */
+  /// @domName Node.attributes; @docsEditable true
   NamedNodeMap get $dom_attributes => JS("NamedNodeMap", "#.attributes", this);
 
-  /** @domName Node.childNodes */
-  List<Node> get $dom_childNodes => JS("List<Node>", "#.childNodes", this);
+  /// @domName Node.childNodes; @docsEditable true
+  List<Node> get $dom_childNodes => JS("_NodeList", "#.childNodes", this);
 
-  /** @domName Node.firstChild */
+  /// @domName Node.firstChild; @docsEditable true
   Node get $dom_firstChild => JS("Node", "#.firstChild", this);
 
-  /** @domName Node.lastChild */
+  /// @domName Node.lastChild; @docsEditable true
   Node get $dom_lastChild => JS("Node", "#.lastChild", this);
 
-  /** @domName Node.nextSibling */
+  /// @domName Node.nextSibling; @docsEditable true
   Node get nextNode => JS("Node", "#.nextSibling", this);
 
-  /** @domName Node.nodeType */
+  /// @domName Node.nodeType; @docsEditable true
   final int nodeType;
 
-  /** @domName Node.ownerDocument */
+  /// @domName Node.ownerDocument; @docsEditable true
   Document get document => JS("Document", "#.ownerDocument", this);
 
-  /** @domName Node.parentNode */
+  /// @domName Node.parentNode; @docsEditable true
   Node get parent => JS("Node", "#.parentNode", this);
 
-  /** @domName Node.previousSibling */
+  /// @domName Node.previousSibling; @docsEditable true
   Node get previousNode => JS("Node", "#.previousSibling", this);
 
-  /** @domName Node.textContent */
+  /// @domName Node.textContent; @docsEditable true
   String get text => JS("String", "#.textContent", this);
 
-  /** @domName Node.textContent */
+  /// @domName Node.textContent; @docsEditable true
   void set text(String value) {
     JS("void", "#.textContent = #", this, value);
   }
 
-  /** @domName Node.addEventListener */
+  /// @domName Node.addEventListener; @docsEditable true
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
 
-  /** @domName Node.appendChild */
+  /// @domName Node.appendChild; @docsEditable true
   Node $dom_appendChild(Node newChild) native "appendChild";
 
-  /** @domName Node.cloneNode */
+  /// @domName Node.cloneNode; @docsEditable true
   Node clone(bool deep) native "cloneNode";
 
-  /** @domName Node.contains */
+  /// @domName Node.contains; @docsEditable true
   bool contains(Node other) native;
 
-  /** @domName Node.dispatchEvent */
+  /// @domName Node.dispatchEvent; @docsEditable true
   bool $dom_dispatchEvent(Event event) native "dispatchEvent";
 
-  /** @domName Node.hasChildNodes */
+  /// @domName Node.hasChildNodes; @docsEditable true
   bool hasChildNodes() native;
 
-  /** @domName Node.insertBefore */
+  /// @domName Node.insertBefore; @docsEditable true
   Node insertBefore(Node newChild, Node refChild) native;
 
-  /** @domName Node.removeChild */
+  /// @domName Node.removeChild; @docsEditable true
   Node $dom_removeChild(Node oldChild) native "removeChild";
 
-  /** @domName Node.removeEventListener */
+  /// @domName Node.removeEventListener; @docsEditable true
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
 
-  /** @domName Node.replaceChild */
+  /// @domName Node.replaceChild; @docsEditable true
   Node $dom_replaceChild(Node newChild, Node oldChild) native "replaceChild";
 
 }
@@ -13639,7 +14055,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName NodeFilter
+/// @domName NodeFilter; @docsEditable true
 class NodeFilter native "*NodeFilter" {
 
   static const int FILTER_ACCEPT = 1;
@@ -13674,7 +14090,7 @@
 
   static const int SHOW_TEXT = 0x00000004;
 
-  /** @domName NodeFilter.acceptNode */
+  /// @domName NodeFilter.acceptNode; @docsEditable true
   int acceptNode(Node n) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -13682,34 +14098,34 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName NodeIterator
+/// @domName NodeIterator; @docsEditable true
 class NodeIterator native "*NodeIterator" {
 
-  /** @domName NodeIterator.expandEntityReferences */
+  /// @domName NodeIterator.expandEntityReferences; @docsEditable true
   final bool expandEntityReferences;
 
-  /** @domName NodeIterator.filter */
+  /// @domName NodeIterator.filter; @docsEditable true
   final NodeFilter filter;
 
-  /** @domName NodeIterator.pointerBeforeReferenceNode */
+  /// @domName NodeIterator.pointerBeforeReferenceNode; @docsEditable true
   final bool pointerBeforeReferenceNode;
 
-  /** @domName NodeIterator.referenceNode */
+  /// @domName NodeIterator.referenceNode; @docsEditable true
   final Node referenceNode;
 
-  /** @domName NodeIterator.root */
+  /// @domName NodeIterator.root; @docsEditable true
   final Node root;
 
-  /** @domName NodeIterator.whatToShow */
+  /// @domName NodeIterator.whatToShow; @docsEditable true
   final int whatToShow;
 
-  /** @domName NodeIterator.detach */
+  /// @domName NodeIterator.detach; @docsEditable true
   void detach() native;
 
-  /** @domName NodeIterator.nextNode */
+  /// @domName NodeIterator.nextNode; @docsEditable true
   Node nextNode() native;
 
-  /** @domName NodeIterator.previousNode */
+  /// @domName NodeIterator.previousNode; @docsEditable true
   Node previousNode() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -13717,199 +14133,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-// TODO(nweiz): when all implementations we target have the same name for the
-// implementation of List<E>, extend that rather than wrapping.
-class _ListWrapper<E> implements List<E> {
-  List _list;
-
-  _ListWrapper(List this._list);
-
-  Iterator<E> iterator() => _list.iterator();
-
-  bool contains(E element) => _list.contains(element);
-
-  void forEach(void f(E element)) => _list.forEach(f);
-
-  Collection map(f(E element)) => _list.map(f);
-
-  List<E> filter(bool f(E element)) => _list.filter(f);
-
-  bool every(bool f(E element)) => _list.every(f);
-
-  bool some(bool f(E element)) => _list.some(f);
-
-  bool get isEmpty => _list.isEmpty;
-
-  int get length => _list.length;
-
-  E operator [](int index) => _list[index];
-
-  void operator []=(int index, E value) { _list[index] = value; }
-
-  void set length(int newLength) { _list.length = newLength; }
-
-  void add(E value) => _list.add(value);
-
-  void addLast(E value) => _list.addLast(value);
-
-  void addAll(Collection<E> collection) => _list.addAll(collection);
-
-  void sort([Comparator<E> compare = Comparable.compare]) => _list.sort(compare);
-
-  int indexOf(E element, [int start = 0]) => _list.indexOf(element, start);
-
-  int lastIndexOf(E element, [int start = 0]) =>
-    _list.lastIndexOf(element, start);
-
-  void clear() => _list.clear();
-
-  E removeLast() => _list.removeLast();
-
-  E get last => _list.last;
-
-  List<E> getRange(int start, int rangeLength) =>
-    _list.getRange(start, rangeLength);
-
-  void setRange(int start, int rangeLength, List<E> from, [int startFrom = 0])
-      => _list.setRange(start, rangeLength, from, startFrom);
-
-  void removeRange(int start, int rangeLength) =>
-    _list.removeRange(start, rangeLength);
-
-  void insertRange(int start, int rangeLength, [E initialValue = null]) =>
-    _list.insertRange(start, rangeLength, initialValue);
-
-  E get first => _list[0];
-}
-
-/**
- * This class is used to insure the results of list operations are NodeLists
- * instead of lists.
- */
-class _NodeListWrapper extends _ListWrapper<Node> implements List {
-  _NodeListWrapper(List list) : super(list);
-
-  List<Node> filter(bool f(Node element)) =>
-    new _NodeListWrapper(_list.filter(f));
-
-  List<Node> getRange(int start, int rangeLength) =>
-    new _NodeListWrapper(_list.getRange(start, rangeLength));
-}
-
-class NodeList implements JavaScriptIndexingBehavior, List<Node> native "*NodeList" {
-  Node _parent;
-
-  // -- 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) {
-    _parent.$dom_appendChild(value);
-  }
-
-  void addLast(Node value) {
-    _parent.$dom_appendChild(value);
-  }
-
-  void addAll(Collection<Node> collection) {
-    for (Node node in collection) {
-      _parent.$dom_appendChild(node);
-    }
-  }
-
-  Node removeLast() {
-    final result = this.last;
-    if (result != null) {
-      _parent.$dom_removeChild(result);
-    }
-    return result;
-  }
-
-  void clear() {
-    _parent.text = '';
-  }
-
-  void operator []=(int index, Node value) {
-    _parent.$dom_replaceChild(value, this[index]);
-  }
-
-  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)) =>
-     new _NodeListWrapper(_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 = 0]) =>
-      _Lists.lastIndexOf(this, element, start);
-
-  Node get last => this[length - 1];
-  Node get first => this[0];
-
-  // FIXME: implement thesee.
-  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) =>
-    new _NodeListWrapper(_Lists.getRange(this, start, rangeLength, <Node>[]));
-
-  // -- end List<Node> mixins.
-
-
-  /** @domName NodeList.length */
-  final int length;
-
-  Node operator[](int index) => JS("Node", "#[#]", this, index);
-
-  /** @domName NodeList.item */
-  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.
-
-
-/// @domName Notation
+/// @domName Notation; @docsEditable true
 class Notation extends Node native "*Notation" {
 
-  /** @domName Notation.publicId */
+  /// @domName Notation.publicId; @docsEditable true
   final String publicId;
 
-  /** @domName Notation.systemId */
+  /// @domName Notation.systemId; @docsEditable true
   final String systemId;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -13917,7 +14147,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Notification
+/// @domName Notification; @docsEditable true
 class Notification extends EventTarget native "*Notification" {
 
   factory Notification(String title, [Map options]) {
@@ -13927,43 +14157,41 @@
     return _NotificationFactoryProvider.createNotification(title, options);
   }
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   NotificationEvents get on =>
     new NotificationEvents(this);
 
-  /** @domName Notification.dir */
+  /// @domName Notification.dir; @docsEditable true
   String dir;
 
-  /** @domName Notification.permission */
+  /// @domName Notification.permission; @docsEditable true
   final String permission;
 
-  /** @domName Notification.replaceId */
+  /// @domName Notification.replaceId; @docsEditable true
   String replaceId;
 
-  /** @domName Notification.tag */
+  /// @domName Notification.tag; @docsEditable true
   String tag;
 
-  /** @domName Notification.addEventListener */
+  /// @domName Notification.addEventListener; @docsEditable true
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
 
-  /** @domName Notification.cancel */
+  /// @domName Notification.cancel; @docsEditable true
   void cancel() native;
 
-  /** @domName Notification.close */
+  /// @domName Notification.close; @docsEditable true
   void close() native;
 
-  /** @domName Notification.dispatchEvent */
+  /// @domName Notification.dispatchEvent; @docsEditable true
   bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
 
-  /** @domName Notification.removeEventListener */
+  /// @domName Notification.removeEventListener; @docsEditable true
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
 
-  /** @domName Notification.requestPermission */
+  /// @domName Notification.requestPermission; @docsEditable true
   static void requestPermission(NotificationPermissionCallback callback) native;
 
-  /** @domName Notification.show */
+  /// @domName Notification.show; @docsEditable true
   void show() native;
 }
 
@@ -13985,19 +14213,19 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName NotificationCenter
+/// @domName NotificationCenter; @docsEditable true
 class NotificationCenter native "*NotificationCenter" {
 
-  /** @domName NotificationCenter.checkPermission */
+  /// @domName NotificationCenter.checkPermission; @docsEditable true
   int checkPermission() native;
 
-  /** @domName NotificationCenter.createHTMLNotification */
+  /// @domName NotificationCenter.createHTMLNotification; @docsEditable true
   Notification createHTMLNotification(String url) native;
 
-  /** @domName NotificationCenter.createNotification */
+  /// @domName NotificationCenter.createNotification; @docsEditable true
   Notification createNotification(String iconUrl, String title, String body) native;
 
-  /** @domName NotificationCenter.requestPermission */
+  /// @domName NotificationCenter.requestPermission; @docsEditable true
   void requestPermission(VoidCallback callback) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14013,7 +14241,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName OESElementIndexUint
+/// @domName OESElementIndexUint; @docsEditable true
 class OESElementIndexUint native "*OESElementIndexUint" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14021,7 +14249,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName OESStandardDerivatives
+/// @domName OESStandardDerivatives; @docsEditable true
 class OESStandardDerivatives native "*OESStandardDerivatives" {
 
   static const int FRAGMENT_SHADER_DERIVATIVE_HINT_OES = 0x8B8B;
@@ -14031,7 +14259,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName OESTextureFloat
+/// @domName OESTextureFloat; @docsEditable true
 class OESTextureFloat native "*OESTextureFloat" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14039,21 +14267,21 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName OESVertexArrayObject
+/// @domName OESVertexArrayObject; @docsEditable true
 class OESVertexArrayObject native "*OESVertexArrayObject" {
 
   static const int VERTEX_ARRAY_BINDING_OES = 0x85B5;
 
-  /** @domName OESVertexArrayObject.bindVertexArrayOES */
+  /// @domName OESVertexArrayObject.bindVertexArrayOES; @docsEditable true
   void bindVertexArrayOES(WebGLVertexArrayObjectOES arrayObject) native;
 
-  /** @domName OESVertexArrayObject.createVertexArrayOES */
+  /// @domName OESVertexArrayObject.createVertexArrayOES; @docsEditable true
   WebGLVertexArrayObjectOES createVertexArrayOES() native;
 
-  /** @domName OESVertexArrayObject.deleteVertexArrayOES */
+  /// @domName OESVertexArrayObject.deleteVertexArrayOES; @docsEditable true
   void deleteVertexArrayOES(WebGLVertexArrayObjectOES arrayObject) native;
 
-  /** @domName OESVertexArrayObject.isVertexArrayOES */
+  /// @domName OESVertexArrayObject.isVertexArrayOES; @docsEditable true
   bool isVertexArrayOES(WebGLVertexArrayObjectOES arrayObject) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14061,21 +14289,21 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLOListElement
+/// @domName HTMLOListElement; @docsEditable true
 class OListElement extends Element implements Element native "*HTMLOListElement" {
 
-  factory OListElement() => _Elements.createOListElement();
+  factory OListElement() => document.$dom_createElement("ol");
 
-  /** @domName HTMLOListElement.compact */
+  /// @domName HTMLOListElement.compact; @docsEditable true
   bool compact;
 
-  /** @domName HTMLOListElement.reversed */
+  /// @domName HTMLOListElement.reversed; @docsEditable true
   bool reversed;
 
-  /** @domName HTMLOListElement.start */
+  /// @domName HTMLOListElement.start; @docsEditable true
   int start;
 
-  /** @domName HTMLOListElement.type */
+  /// @domName HTMLOListElement.type; @docsEditable true
   String type;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14083,75 +14311,75 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLObjectElement
+/// @domName HTMLObjectElement; @docsEditable true
 class ObjectElement extends Element implements Element native "*HTMLObjectElement" {
 
-  factory ObjectElement() => _Elements.createObjectElement();
+  factory ObjectElement() => document.$dom_createElement("object");
 
-  /** @domName HTMLObjectElement.align */
+  /// @domName HTMLObjectElement.align; @docsEditable true
   String align;
 
-  /** @domName HTMLObjectElement.archive */
+  /// @domName HTMLObjectElement.archive; @docsEditable true
   String archive;
 
-  /** @domName HTMLObjectElement.border */
+  /// @domName HTMLObjectElement.border; @docsEditable true
   String border;
 
-  /** @domName HTMLObjectElement.code */
+  /// @domName HTMLObjectElement.code; @docsEditable true
   String code;
 
-  /** @domName HTMLObjectElement.codeBase */
+  /// @domName HTMLObjectElement.codeBase; @docsEditable true
   String codeBase;
 
-  /** @domName HTMLObjectElement.codeType */
+  /// @domName HTMLObjectElement.codeType; @docsEditable true
   String codeType;
 
-  /** @domName HTMLObjectElement.data */
+  /// @domName HTMLObjectElement.data; @docsEditable true
   String data;
 
-  /** @domName HTMLObjectElement.declare */
+  /// @domName HTMLObjectElement.declare; @docsEditable true
   bool declare;
 
-  /** @domName HTMLObjectElement.form */
+  /// @domName HTMLObjectElement.form; @docsEditable true
   final FormElement form;
 
-  /** @domName HTMLObjectElement.height */
+  /// @domName HTMLObjectElement.height; @docsEditable true
   String height;
 
-  /** @domName HTMLObjectElement.hspace */
+  /// @domName HTMLObjectElement.hspace; @docsEditable true
   int hspace;
 
-  /** @domName HTMLObjectElement.name */
+  /// @domName HTMLObjectElement.name; @docsEditable true
   String name;
 
-  /** @domName HTMLObjectElement.standby */
+  /// @domName HTMLObjectElement.standby; @docsEditable true
   String standby;
 
-  /** @domName HTMLObjectElement.type */
+  /// @domName HTMLObjectElement.type; @docsEditable true
   String type;
 
-  /** @domName HTMLObjectElement.useMap */
+  /// @domName HTMLObjectElement.useMap; @docsEditable true
   String useMap;
 
-  /** @domName HTMLObjectElement.validationMessage */
+  /// @domName HTMLObjectElement.validationMessage; @docsEditable true
   final String validationMessage;
 
-  /** @domName HTMLObjectElement.validity */
+  /// @domName HTMLObjectElement.validity; @docsEditable true
   final ValidityState validity;
 
-  /** @domName HTMLObjectElement.vspace */
+  /// @domName HTMLObjectElement.vspace; @docsEditable true
   int vspace;
 
-  /** @domName HTMLObjectElement.width */
+  /// @domName HTMLObjectElement.width; @docsEditable true
   String width;
 
-  /** @domName HTMLObjectElement.willValidate */
+  /// @domName HTMLObjectElement.willValidate; @docsEditable true
   final bool willValidate;
 
-  /** @domName HTMLObjectElement.checkValidity */
+  /// @domName HTMLObjectElement.checkValidity; @docsEditable true
   bool checkValidity() native;
 
-  /** @domName HTMLObjectElement.setCustomValidity */
+  /// @domName HTMLObjectElement.setCustomValidity; @docsEditable true
   void setCustomValidity(String error) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14159,10 +14387,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName OfflineAudioCompletionEvent
+/// @domName OfflineAudioCompletionEvent; @docsEditable true
 class OfflineAudioCompletionEvent extends Event native "*OfflineAudioCompletionEvent" {
 
-  /** @domName OfflineAudioCompletionEvent.renderedBuffer */
+  /// @domName OfflineAudioCompletionEvent.renderedBuffer; @docsEditable true
   final AudioBuffer renderedBuffer;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14170,15 +14398,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLOptGroupElement
+/// @domName HTMLOptGroupElement; @docsEditable true
 class OptGroupElement extends Element implements Element native "*HTMLOptGroupElement" {
 
-  factory OptGroupElement() => _Elements.createOptGroupElement();
+  factory OptGroupElement() => document.$dom_createElement("optgroup");
 
-  /** @domName HTMLOptGroupElement.disabled */
+  /// @domName HTMLOptGroupElement.disabled; @docsEditable true
   bool disabled;
 
-  /** @domName HTMLOptGroupElement.label */
+  /// @domName HTMLOptGroupElement.label; @docsEditable true
   String label;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14186,7 +14414,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLOptionElement
+/// @domName HTMLOptionElement; @docsEditable true
 class OptionElement extends Element implements Element native "*HTMLOptionElement" {
 
   factory OptionElement([String data, String value, bool defaultSelected, bool selected]) {
@@ -14205,25 +14433,25 @@
     return _OptionElementFactoryProvider.createOptionElement(data, value, defaultSelected, selected);
   }
 
-  /** @domName HTMLOptionElement.defaultSelected */
+  /// @domName HTMLOptionElement.defaultSelected; @docsEditable true
   bool defaultSelected;
 
-  /** @domName HTMLOptionElement.disabled */
+  /// @domName HTMLOptionElement.disabled; @docsEditable true
   bool disabled;
 
-  /** @domName HTMLOptionElement.form */
+  /// @domName HTMLOptionElement.form; @docsEditable true
   final FormElement form;
 
-  /** @domName HTMLOptionElement.index */
+  /// @domName HTMLOptionElement.index; @docsEditable true
   final int index;
 
-  /** @domName HTMLOptionElement.label */
+  /// @domName HTMLOptionElement.label; @docsEditable true
   String label;
 
-  /** @domName HTMLOptionElement.selected */
+  /// @domName HTMLOptionElement.selected; @docsEditable true
   bool selected;
 
-  /** @domName HTMLOptionElement.value */
+  /// @domName HTMLOptionElement.value; @docsEditable true
   String value;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14231,7 +14459,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName OscillatorNode
+/// @domName OscillatorNode; @docsEditable true
 class OscillatorNode extends AudioSourceNode native "*OscillatorNode" {
 
   static const int CUSTOM = 4;
@@ -14252,25 +14480,25 @@
 
   static const int UNSCHEDULED_STATE = 0;
 
-  /** @domName OscillatorNode.detune */
+  /// @domName OscillatorNode.detune; @docsEditable true
   final AudioParam detune;
 
-  /** @domName OscillatorNode.frequency */
+  /// @domName OscillatorNode.frequency; @docsEditable true
   final AudioParam frequency;
 
-  /** @domName OscillatorNode.playbackState */
+  /// @domName OscillatorNode.playbackState; @docsEditable true
   final int playbackState;
 
-  /** @domName OscillatorNode.type */
+  /// @domName OscillatorNode.type; @docsEditable true
   int type;
 
-  /** @domName OscillatorNode.setWaveTable */
+  /// @domName OscillatorNode.setWaveTable; @docsEditable true
   void setWaveTable(WaveTable waveTable) native;
 
-  /** @domName OscillatorNode.start */
+  /// @domName OscillatorNode.start; @docsEditable true
   void start(num when) native;
 
-  /** @domName OscillatorNode.stop */
+  /// @domName OscillatorNode.stop; @docsEditable true
   void stop(num when) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14278,45 +14506,46 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLOutputElement
+/// @domName HTMLOutputElement; @docsEditable true
 class OutputElement extends Element implements Element native "*HTMLOutputElement" {
 
-  factory OutputElement() => _Elements.createOutputElement();
+  factory OutputElement() => document.$dom_createElement("output");
 
-  /** @domName HTMLOutputElement.defaultValue */
+  /// @domName HTMLOutputElement.defaultValue; @docsEditable true
   String defaultValue;
 
-  /** @domName HTMLOutputElement.form */
+  /// @domName HTMLOutputElement.form; @docsEditable true
   final FormElement form;
 
-  /** @domName HTMLOutputElement.htmlFor */
+  /// @domName HTMLOutputElement.htmlFor; @docsEditable true
   DOMSettableTokenList htmlFor;
 
-  /** @domName HTMLOutputElement.labels */
+  /// @domName HTMLOutputElement.labels; @docsEditable true
+  @Returns('_NodeList') @Creates('_NodeList')
   final List<Node> labels;
 
-  /** @domName HTMLOutputElement.name */
+  /// @domName HTMLOutputElement.name; @docsEditable true
   String name;
 
-  /** @domName HTMLOutputElement.type */
+  /// @domName HTMLOutputElement.type; @docsEditable true
   final String type;
 
-  /** @domName HTMLOutputElement.validationMessage */
+  /// @domName HTMLOutputElement.validationMessage; @docsEditable true
   final String validationMessage;
 
-  /** @domName HTMLOutputElement.validity */
+  /// @domName HTMLOutputElement.validity; @docsEditable true
   final ValidityState validity;
 
-  /** @domName HTMLOutputElement.value */
+  /// @domName HTMLOutputElement.value; @docsEditable true
   String value;
 
-  /** @domName HTMLOutputElement.willValidate */
+  /// @domName HTMLOutputElement.willValidate; @docsEditable true
   final bool willValidate;
 
-  /** @domName HTMLOutputElement.checkValidity */
+  /// @domName HTMLOutputElement.checkValidity; @docsEditable true
   bool checkValidity() native;
 
-  /** @domName HTMLOutputElement.setCustomValidity */
+  /// @domName HTMLOutputElement.setCustomValidity; @docsEditable true
   void setCustomValidity(String error) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14324,7 +14553,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName OverflowEvent
+/// @domName OverflowEvent; @docsEditable true
 class OverflowEvent extends Event native "*OverflowEvent" {
 
   static const int BOTH = 2;
@@ -14333,13 +14562,13 @@
 
   static const int VERTICAL = 1;
 
-  /** @domName OverflowEvent.horizontalOverflow */
+  /// @domName OverflowEvent.horizontalOverflow; @docsEditable true
   final bool horizontalOverflow;
 
-  /** @domName OverflowEvent.orient */
+  /// @domName OverflowEvent.orient; @docsEditable true
   final int orient;
 
-  /** @domName OverflowEvent.verticalOverflow */
+  /// @domName OverflowEvent.verticalOverflow; @docsEditable true
   final bool verticalOverflow;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14347,13 +14576,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName PagePopupController
+/// @domName PagePopupController; @docsEditable true
 class PagePopupController native "*PagePopupController" {
 
-  /** @domName PagePopupController.localizeNumberString */
+  /// @domName PagePopupController.localizeNumberString; @docsEditable true
   String localizeNumberString(String numberString) native;
 
-  /** @domName PagePopupController.setValueAndClosePopup */
+  /// @domName PagePopupController.setValueAndClosePopup; @docsEditable true
   void setValueAndClosePopup(int numberValue, String stringValue) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14361,10 +14590,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName PageTransitionEvent
+/// @domName PageTransitionEvent; @docsEditable true
 class PageTransitionEvent extends Event native "*PageTransitionEvent" {
 
-  /** @domName PageTransitionEvent.persisted */
+  /// @domName PageTransitionEvent.persisted; @docsEditable true
   final bool persisted;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14372,7 +14601,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName PannerNode
+/// @domName PannerNode; @docsEditable true
 class PannerNode extends AudioNode native "*PannerNode" {
 
   static const int EQUALPOWER = 0;
@@ -14387,43 +14616,43 @@
 
   static const int SOUNDFIELD = 2;
 
-  /** @domName PannerNode.coneGain */
+  /// @domName PannerNode.coneGain; @docsEditable true
   final AudioGain coneGain;
 
-  /** @domName PannerNode.coneInnerAngle */
+  /// @domName PannerNode.coneInnerAngle; @docsEditable true
   num coneInnerAngle;
 
-  /** @domName PannerNode.coneOuterAngle */
+  /// @domName PannerNode.coneOuterAngle; @docsEditable true
   num coneOuterAngle;
 
-  /** @domName PannerNode.coneOuterGain */
+  /// @domName PannerNode.coneOuterGain; @docsEditable true
   num coneOuterGain;
 
-  /** @domName PannerNode.distanceGain */
+  /// @domName PannerNode.distanceGain; @docsEditable true
   final AudioGain distanceGain;
 
-  /** @domName PannerNode.distanceModel */
+  /// @domName PannerNode.distanceModel; @docsEditable true
   int distanceModel;
 
-  /** @domName PannerNode.maxDistance */
+  /// @domName PannerNode.maxDistance; @docsEditable true
   num maxDistance;
 
-  /** @domName PannerNode.panningModel */
+  /// @domName PannerNode.panningModel; @docsEditable true
   int panningModel;
 
-  /** @domName PannerNode.refDistance */
+  /// @domName PannerNode.refDistance; @docsEditable true
   num refDistance;
 
-  /** @domName PannerNode.rolloffFactor */
+  /// @domName PannerNode.rolloffFactor; @docsEditable true
   num rolloffFactor;
 
-  /** @domName PannerNode.setOrientation */
+  /// @domName PannerNode.setOrientation; @docsEditable true
   void setOrientation(num x, num y, num z) native;
 
-  /** @domName PannerNode.setPosition */
+  /// @domName PannerNode.setPosition; @docsEditable true
   void setPosition(num x, num y, num z) native;
 
-  /** @domName PannerNode.setVelocity */
+  /// @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
@@ -14431,12 +14660,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLParagraphElement
+/// @domName HTMLParagraphElement; @docsEditable true
 class ParagraphElement extends Element implements Element native "*HTMLParagraphElement" {
 
-  factory ParagraphElement() => _Elements.createParagraphElement();
+  factory ParagraphElement() => document.$dom_createElement("p");
 
-  /** @domName HTMLParagraphElement.align */
+  /// @domName HTMLParagraphElement.align; @docsEditable true
   String align;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14444,21 +14673,21 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLParamElement
+/// @domName HTMLParamElement; @docsEditable true
 class ParamElement extends Element implements Element native "*HTMLParamElement" {
 
-  factory ParamElement() => _Elements.createParamElement();
+  factory ParamElement() => document.$dom_createElement("param");
 
-  /** @domName HTMLParamElement.name */
+  /// @domName HTMLParamElement.name; @docsEditable true
   String name;
 
-  /** @domName HTMLParamElement.type */
+  /// @domName HTMLParamElement.type; @docsEditable true
   String type;
 
-  /** @domName HTMLParamElement.value */
+  /// @domName HTMLParamElement.value; @docsEditable true
   String value;
 
-  /** @domName HTMLParamElement.valueType */
+  /// @domName HTMLParamElement.valueType; @docsEditable true
   String valueType;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14466,14 +14695,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName PeerConnection00
+/// @domName PeerConnection00; @docsEditable true
 class PeerConnection00 extends EventTarget native "*PeerConnection00" {
 
   factory PeerConnection00(String serverConfiguration, IceCallback iceCallback) => _PeerConnection00FactoryProvider.createPeerConnection00(serverConfiguration, iceCallback);
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   PeerConnection00Events get on =>
     new PeerConnection00Events(this);
 
@@ -14505,28 +14732,30 @@
 
   static const int SDP_PRANSWER = 0x200;
 
-  /** @domName PeerConnection00.iceState */
+  /// @domName PeerConnection00.iceState; @docsEditable true
   final int iceState;
 
-  /** @domName PeerConnection00.localDescription */
+  /// @domName PeerConnection00.localDescription; @docsEditable true
   final SessionDescription localDescription;
 
-  /** @domName PeerConnection00.localStreams */
+  /// @domName PeerConnection00.localStreams; @docsEditable true
+  @Returns('_MediaStreamList') @Creates('_MediaStreamList')
   final List<MediaStream> localStreams;
 
-  /** @domName PeerConnection00.readyState */
+  /// @domName PeerConnection00.readyState; @docsEditable true
   final int readyState;
 
-  /** @domName PeerConnection00.remoteDescription */
+  /// @domName PeerConnection00.remoteDescription; @docsEditable true
   final SessionDescription remoteDescription;
 
-  /** @domName PeerConnection00.remoteStreams */
+  /// @domName PeerConnection00.remoteStreams; @docsEditable true
+  @Returns('_MediaStreamList') @Creates('_MediaStreamList')
   final List<MediaStream> remoteStreams;
 
-  /** @domName PeerConnection00.addEventListener */
+  /// @domName PeerConnection00.addEventListener; @docsEditable true
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
 
-  /** @domName PeerConnection00.addStream */
+  /// @domName PeerConnection00.addStream; @docsEditable true
   void addStream(MediaStream stream, [Map mediaStreamHints]) {
     if (?mediaStreamHints) {
       var mediaStreamHints_1 = _convertDartToNative_Dictionary(mediaStreamHints);
@@ -14539,10 +14768,10 @@
   void _addStream_1(MediaStream stream, mediaStreamHints) native "addStream";
   void _addStream_2(MediaStream stream) native "addStream";
 
-  /** @domName PeerConnection00.close */
+  /// @domName PeerConnection00.close; @docsEditable true
   void close() native;
 
-  /** @domName PeerConnection00.createAnswer */
+  /// @domName PeerConnection00.createAnswer; @docsEditable true
   SessionDescription createAnswer(String offer, [Map mediaHints]) {
     if (?mediaHints) {
       var mediaHints_1 = _convertDartToNative_Dictionary(mediaHints);
@@ -14553,7 +14782,7 @@
   SessionDescription _createAnswer_1(offer, mediaHints) native "createAnswer";
   SessionDescription _createAnswer_2(offer) native "createAnswer";
 
-  /** @domName PeerConnection00.createOffer */
+  /// @domName PeerConnection00.createOffer; @docsEditable true
   SessionDescription createOffer([Map mediaHints]) {
     if (?mediaHints) {
       var mediaHints_1 = _convertDartToNative_Dictionary(mediaHints);
@@ -14564,25 +14793,25 @@
   SessionDescription _createOffer_1(mediaHints) native "createOffer";
   SessionDescription _createOffer_2() native "createOffer";
 
-  /** @domName PeerConnection00.dispatchEvent */
+  /// @domName PeerConnection00.dispatchEvent; @docsEditable true
   bool $dom_dispatchEvent(Event event) native "dispatchEvent";
 
-  /** @domName PeerConnection00.processIceMessage */
+  /// @domName PeerConnection00.processIceMessage; @docsEditable true
   void processIceMessage(IceCandidate candidate) native;
 
-  /** @domName PeerConnection00.removeEventListener */
+  /// @domName PeerConnection00.removeEventListener; @docsEditable true
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
 
-  /** @domName PeerConnection00.removeStream */
+  /// @domName PeerConnection00.removeStream; @docsEditable true
   void removeStream(MediaStream stream) native;
 
-  /** @domName PeerConnection00.setLocalDescription */
+  /// @domName PeerConnection00.setLocalDescription; @docsEditable true
   void setLocalDescription(int action, SessionDescription desc) native;
 
-  /** @domName PeerConnection00.setRemoteDescription */
+  /// @domName PeerConnection00.setRemoteDescription; @docsEditable true
   void setRemoteDescription(int action, SessionDescription desc) native;
 
-  /** @domName PeerConnection00.startIce */
+  /// @domName PeerConnection00.startIce; @docsEditable true
   void startIce([Map iceOptions]) {
     if (?iceOptions) {
       var iceOptions_1 = _convertDartToNative_Dictionary(iceOptions);
@@ -14614,19 +14843,19 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Performance
+/// @domName Performance; @docsEditable true
 class Performance extends EventTarget native "*Performance" {
 
-  /** @domName Performance.memory */
+  /// @domName Performance.memory; @docsEditable true
   final MemoryInfo memory;
 
-  /** @domName Performance.navigation */
+  /// @domName Performance.navigation; @docsEditable true
   final PerformanceNavigation navigation;
 
-  /** @domName Performance.timing */
+  /// @domName Performance.timing; @docsEditable true
   final PerformanceTiming timing;
 
-  /** @domName Performance.now */
+  /// @domName Performance.now; @docsEditable true
   num now() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14634,7 +14863,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName PerformanceNavigation
+/// @domName PerformanceNavigation; @docsEditable true
 class PerformanceNavigation native "*PerformanceNavigation" {
 
   static const int TYPE_BACK_FORWARD = 2;
@@ -14645,10 +14874,10 @@
 
   static const int TYPE_RESERVED = 255;
 
-  /** @domName PerformanceNavigation.redirectCount */
+  /// @domName PerformanceNavigation.redirectCount; @docsEditable true
   final int redirectCount;
 
-  /** @domName PerformanceNavigation.type */
+  /// @domName PerformanceNavigation.type; @docsEditable true
   final int type;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14656,70 +14885,70 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName PerformanceTiming
+/// @domName PerformanceTiming; @docsEditable true
 class PerformanceTiming native "*PerformanceTiming" {
 
-  /** @domName PerformanceTiming.connectEnd */
+  /// @domName PerformanceTiming.connectEnd; @docsEditable true
   final int connectEnd;
 
-  /** @domName PerformanceTiming.connectStart */
+  /// @domName PerformanceTiming.connectStart; @docsEditable true
   final int connectStart;
 
-  /** @domName PerformanceTiming.domComplete */
+  /// @domName PerformanceTiming.domComplete; @docsEditable true
   final int domComplete;
 
-  /** @domName PerformanceTiming.domContentLoadedEventEnd */
+  /// @domName PerformanceTiming.domContentLoadedEventEnd; @docsEditable true
   final int domContentLoadedEventEnd;
 
-  /** @domName PerformanceTiming.domContentLoadedEventStart */
+  /// @domName PerformanceTiming.domContentLoadedEventStart; @docsEditable true
   final int domContentLoadedEventStart;
 
-  /** @domName PerformanceTiming.domInteractive */
+  /// @domName PerformanceTiming.domInteractive; @docsEditable true
   final int domInteractive;
 
-  /** @domName PerformanceTiming.domLoading */
+  /// @domName PerformanceTiming.domLoading; @docsEditable true
   final int domLoading;
 
-  /** @domName PerformanceTiming.domainLookupEnd */
+  /// @domName PerformanceTiming.domainLookupEnd; @docsEditable true
   final int domainLookupEnd;
 
-  /** @domName PerformanceTiming.domainLookupStart */
+  /// @domName PerformanceTiming.domainLookupStart; @docsEditable true
   final int domainLookupStart;
 
-  /** @domName PerformanceTiming.fetchStart */
+  /// @domName PerformanceTiming.fetchStart; @docsEditable true
   final int fetchStart;
 
-  /** @domName PerformanceTiming.loadEventEnd */
+  /// @domName PerformanceTiming.loadEventEnd; @docsEditable true
   final int loadEventEnd;
 
-  /** @domName PerformanceTiming.loadEventStart */
+  /// @domName PerformanceTiming.loadEventStart; @docsEditable true
   final int loadEventStart;
 
-  /** @domName PerformanceTiming.navigationStart */
+  /// @domName PerformanceTiming.navigationStart; @docsEditable true
   final int navigationStart;
 
-  /** @domName PerformanceTiming.redirectEnd */
+  /// @domName PerformanceTiming.redirectEnd; @docsEditable true
   final int redirectEnd;
 
-  /** @domName PerformanceTiming.redirectStart */
+  /// @domName PerformanceTiming.redirectStart; @docsEditable true
   final int redirectStart;
 
-  /** @domName PerformanceTiming.requestStart */
+  /// @domName PerformanceTiming.requestStart; @docsEditable true
   final int requestStart;
 
-  /** @domName PerformanceTiming.responseEnd */
+  /// @domName PerformanceTiming.responseEnd; @docsEditable true
   final int responseEnd;
 
-  /** @domName PerformanceTiming.responseStart */
+  /// @domName PerformanceTiming.responseStart; @docsEditable true
   final int responseStart;
 
-  /** @domName PerformanceTiming.secureConnectionStart */
+  /// @domName PerformanceTiming.secureConnectionStart; @docsEditable true
   final int secureConnectionStart;
 
-  /** @domName PerformanceTiming.unloadEventEnd */
+  /// @domName PerformanceTiming.unloadEventEnd; @docsEditable true
   final int unloadEventEnd;
 
-  /** @domName PerformanceTiming.unloadEventStart */
+  /// @domName PerformanceTiming.unloadEventStart; @docsEditable true
   final int unloadEventStart;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14732,10 +14961,10 @@
 class Point native "*WebKitPoint" {
   factory Point(num x, num y) => _PointFactoryProvider.createPoint(x, y);
 
-  /** @domName WebKitPoint.x */
+  /// @domName WebKitPoint.x; @docsEditable true
   num x;
 
-  /** @domName WebKitPoint.y */
+  /// @domName WebKitPoint.y; @docsEditable true
   num y;
 
 }
@@ -14744,10 +14973,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName PopStateEvent
+/// @domName PopStateEvent; @docsEditable true
 class PopStateEvent extends Event native "*PopStateEvent" {
 
-  /** @domName PopStateEvent.state */
+  /// @domName PopStateEvent.state; @docsEditable true
   dynamic get state => _convertNativeToDart_SerializedScriptValue(this._state);
   dynamic get _state => JS("dynamic", "#.state", this);
 }
@@ -14764,7 +14993,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName PositionError
+/// @domName PositionError; @docsEditable true
 class PositionError native "*PositionError" {
 
   static const int PERMISSION_DENIED = 1;
@@ -14773,10 +15002,10 @@
 
   static const int TIMEOUT = 3;
 
-  /** @domName PositionError.code */
+  /// @domName PositionError.code; @docsEditable true
   final int code;
 
-  /** @domName PositionError.message */
+  /// @domName PositionError.message; @docsEditable true
   final String message;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14792,15 +15021,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLPreElement
+/// @domName HTMLPreElement; @docsEditable true
 class PreElement extends Element implements Element native "*HTMLPreElement" {
 
-  factory PreElement() => _Elements.createPreElement();
+  factory PreElement() => document.$dom_createElement("pre");
 
-  /** @domName HTMLPreElement.width */
+  /// @domName HTMLPreElement.width; @docsEditable true
   int width;
 
-  /** @domName HTMLPreElement.wrap */
+  /// @domName HTMLPreElement.wrap; @docsEditable true
   bool wrap;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14808,16 +15037,16 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName ProcessingInstruction
+/// @domName ProcessingInstruction; @docsEditable true
 class ProcessingInstruction extends Node native "*ProcessingInstruction" {
 
-  /** @domName ProcessingInstruction.data */
+  /// @domName ProcessingInstruction.data; @docsEditable true
   String data;
 
-  /** @domName ProcessingInstruction.sheet */
+  /// @domName ProcessingInstruction.sheet; @docsEditable true
   final StyleSheet sheet;
 
-  /** @domName ProcessingInstruction.target */
+  /// @domName ProcessingInstruction.target; @docsEditable true
   final String target;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14825,21 +15054,22 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLProgressElement
+/// @domName HTMLProgressElement; @docsEditable true
 class ProgressElement extends Element implements Element native "*HTMLProgressElement" {
 
-  factory ProgressElement() => _Elements.createProgressElement();
+  factory ProgressElement() => document.$dom_createElement("progress");
 
-  /** @domName HTMLProgressElement.labels */
+  /// @domName HTMLProgressElement.labels; @docsEditable true
+  @Returns('_NodeList') @Creates('_NodeList')
   final List<Node> labels;
 
-  /** @domName HTMLProgressElement.max */
+  /// @domName HTMLProgressElement.max; @docsEditable true
   num max;
 
-  /** @domName HTMLProgressElement.position */
+  /// @domName HTMLProgressElement.position; @docsEditable true
   final num position;
 
-  /** @domName HTMLProgressElement.value */
+  /// @domName HTMLProgressElement.value; @docsEditable true
   num value;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14847,16 +15077,16 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName ProgressEvent
+/// @domName ProgressEvent; @docsEditable true
 class ProgressEvent extends Event native "*ProgressEvent" {
 
-  /** @domName ProgressEvent.lengthComputable */
+  /// @domName ProgressEvent.lengthComputable; @docsEditable true
   final bool lengthComputable;
 
-  /** @domName ProgressEvent.loaded */
+  /// @domName ProgressEvent.loaded; @docsEditable true
   final int loaded;
 
-  /** @domName ProgressEvent.total */
+  /// @domName ProgressEvent.total; @docsEditable true
   final int total;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14864,10 +15094,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLQuoteElement
+/// @domName HTMLQuoteElement; @docsEditable true
 class QuoteElement extends Element implements Element native "*HTMLQuoteElement" {
 
-  /** @domName HTMLQuoteElement.cite */
+  /// @domName HTMLQuoteElement.cite; @docsEditable true
   String cite;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14875,16 +15105,16 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName RGBColor
+/// @domName RGBColor; @docsEditable true
 class RGBColor native "*RGBColor" {
 
-  /** @domName RGBColor.blue */
+  /// @domName RGBColor.blue; @docsEditable true
   final CSSPrimitiveValue blue;
 
-  /** @domName RGBColor.green */
+  /// @domName RGBColor.green; @docsEditable true
   final CSSPrimitiveValue green;
 
-  /** @domName RGBColor.red */
+  /// @domName RGBColor.red; @docsEditable true
   final CSSPrimitiveValue red;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14892,43 +15122,41 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName RTCDataChannel
+/// @domName RTCDataChannel; @docsEditable true
 class RTCDataChannel extends EventTarget native "*RTCDataChannel" {
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   RTCDataChannelEvents get on =>
     new RTCDataChannelEvents(this);
 
-  /** @domName RTCDataChannel.binaryType */
+  /// @domName RTCDataChannel.binaryType; @docsEditable true
   String binaryType;
 
-  /** @domName RTCDataChannel.bufferedAmount */
+  /// @domName RTCDataChannel.bufferedAmount; @docsEditable true
   final int bufferedAmount;
 
-  /** @domName RTCDataChannel.label */
+  /// @domName RTCDataChannel.label; @docsEditable true
   final String label;
 
-  /** @domName RTCDataChannel.readyState */
+  /// @domName RTCDataChannel.readyState; @docsEditable true
   final String readyState;
 
-  /** @domName RTCDataChannel.reliable */
+  /// @domName RTCDataChannel.reliable; @docsEditable true
   final bool reliable;
 
-  /** @domName RTCDataChannel.addEventListener */
+  /// @domName RTCDataChannel.addEventListener; @docsEditable true
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
 
-  /** @domName RTCDataChannel.close */
+  /// @domName RTCDataChannel.close; @docsEditable true
   void close() native;
 
-  /** @domName RTCDataChannel.dispatchEvent */
+  /// @domName RTCDataChannel.dispatchEvent; @docsEditable true
   bool $dom_dispatchEvent(Event event) native "dispatchEvent";
 
-  /** @domName RTCDataChannel.removeEventListener */
+  /// @domName RTCDataChannel.removeEventListener; @docsEditable true
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
 
-  /** @domName RTCDataChannel.send */
+  /// @domName RTCDataChannel.send; @docsEditable true
   void send(data) native;
 }
 
@@ -14948,10 +15176,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName RTCDataChannelEvent
+/// @domName RTCDataChannelEvent; @docsEditable true
 class RTCDataChannelEvent extends Event native "*RTCDataChannelEvent" {
 
-  /** @domName RTCDataChannelEvent.channel */
+  /// @domName RTCDataChannelEvent.channel; @docsEditable true
   final RTCDataChannel channel;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14967,18 +15195,18 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName RTCIceCandidate
+/// @domName RTCIceCandidate; @docsEditable true
 class RTCIceCandidate native "*RTCIceCandidate" {
 
   factory RTCIceCandidate(Map dictionary) => _RTCIceCandidateFactoryProvider.createRTCIceCandidate(dictionary);
 
-  /** @domName RTCIceCandidate.candidate */
+  /// @domName RTCIceCandidate.candidate; @docsEditable true
   final String candidate;
 
-  /** @domName RTCIceCandidate.sdpMLineIndex */
+  /// @domName RTCIceCandidate.sdpMLineIndex; @docsEditable true
   final int sdpMLineIndex;
 
-  /** @domName RTCIceCandidate.sdpMid */
+  /// @domName RTCIceCandidate.sdpMid; @docsEditable true
   final String sdpMid;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14986,10 +15214,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName RTCIceCandidateEvent
+/// @domName RTCIceCandidateEvent; @docsEditable true
 class RTCIceCandidateEvent extends Event native "*RTCIceCandidateEvent" {
 
-  /** @domName RTCIceCandidateEvent.candidate */
+  /// @domName RTCIceCandidateEvent.candidate; @docsEditable true
   final RTCIceCandidate candidate;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14997,7 +15225,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName RTCPeerConnection
+/// @domName RTCPeerConnection; @docsEditable true
 class RTCPeerConnection extends EventTarget native "*RTCPeerConnection" {
 
   factory RTCPeerConnection(Map rtcIceServers, [Map mediaConstraints]) {
@@ -15007,37 +15235,37 @@
     return _RTCPeerConnectionFactoryProvider.createRTCPeerConnection(rtcIceServers, mediaConstraints);
   }
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   RTCPeerConnectionEvents get on =>
     new RTCPeerConnectionEvents(this);
 
-  /** @domName RTCPeerConnection.iceState */
+  /// @domName RTCPeerConnection.iceState; @docsEditable true
   final String iceState;
 
-  /** @domName RTCPeerConnection.localDescription */
+  /// @domName RTCPeerConnection.localDescription; @docsEditable true
   final RTCSessionDescription localDescription;
 
-  /** @domName RTCPeerConnection.localStreams */
+  /// @domName RTCPeerConnection.localStreams; @docsEditable true
+  @Returns('_MediaStreamList') @Creates('_MediaStreamList')
   final List<MediaStream> localStreams;
 
-  /** @domName RTCPeerConnection.readyState */
+  /// @domName RTCPeerConnection.readyState; @docsEditable true
   final String readyState;
 
-  /** @domName RTCPeerConnection.remoteDescription */
+  /// @domName RTCPeerConnection.remoteDescription; @docsEditable true
   final RTCSessionDescription remoteDescription;
 
-  /** @domName RTCPeerConnection.remoteStreams */
+  /// @domName RTCPeerConnection.remoteStreams; @docsEditable true
+  @Returns('_MediaStreamList') @Creates('_MediaStreamList')
   final List<MediaStream> remoteStreams;
 
-  /** @domName RTCPeerConnection.addEventListener */
+  /// @domName RTCPeerConnection.addEventListener; @docsEditable true
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
 
-  /** @domName RTCPeerConnection.addIceCandidate */
+  /// @domName RTCPeerConnection.addIceCandidate; @docsEditable true
   void addIceCandidate(RTCIceCandidate candidate) native;
 
-  /** @domName RTCPeerConnection.addStream */
+  /// @domName RTCPeerConnection.addStream; @docsEditable true
   void addStream(MediaStream stream, [Map mediaConstraints]) {
     if (?mediaConstraints) {
       var mediaConstraints_1 = _convertDartToNative_Dictionary(mediaConstraints);
@@ -15050,10 +15278,10 @@
   void _addStream_1(MediaStream stream, mediaConstraints) native "addStream";
   void _addStream_2(MediaStream stream) native "addStream";
 
-  /** @domName RTCPeerConnection.close */
+  /// @domName RTCPeerConnection.close; @docsEditable true
   void close() native;
 
-  /** @domName RTCPeerConnection.createAnswer */
+  /// @domName RTCPeerConnection.createAnswer; @docsEditable true
   void createAnswer(RTCSessionDescriptionCallback successCallback, [RTCErrorCallback failureCallback, Map mediaConstraints]) {
     if (?mediaConstraints) {
       var mediaConstraints_1 = _convertDartToNative_Dictionary(mediaConstraints);
@@ -15066,7 +15294,7 @@
   void _createAnswer_1(RTCSessionDescriptionCallback successCallback, RTCErrorCallback failureCallback, mediaConstraints) native "createAnswer";
   void _createAnswer_2(RTCSessionDescriptionCallback successCallback, RTCErrorCallback failureCallback) native "createAnswer";
 
-  /** @domName RTCPeerConnection.createDataChannel */
+  /// @domName RTCPeerConnection.createDataChannel; @docsEditable true
   RTCDataChannel createDataChannel(String label, [Map options]) {
     if (?options) {
       var options_1 = _convertDartToNative_Dictionary(options);
@@ -15077,7 +15305,7 @@
   RTCDataChannel _createDataChannel_1(label, options) native "createDataChannel";
   RTCDataChannel _createDataChannel_2(label) native "createDataChannel";
 
-  /** @domName RTCPeerConnection.createOffer */
+  /// @domName RTCPeerConnection.createOffer; @docsEditable true
   void createOffer(RTCSessionDescriptionCallback successCallback, [RTCErrorCallback failureCallback, Map mediaConstraints]) {
     if (?mediaConstraints) {
       var mediaConstraints_1 = _convertDartToNative_Dictionary(mediaConstraints);
@@ -15090,25 +15318,25 @@
   void _createOffer_1(RTCSessionDescriptionCallback successCallback, RTCErrorCallback failureCallback, mediaConstraints) native "createOffer";
   void _createOffer_2(RTCSessionDescriptionCallback successCallback, RTCErrorCallback failureCallback) native "createOffer";
 
-  /** @domName RTCPeerConnection.dispatchEvent */
+  /// @domName RTCPeerConnection.dispatchEvent; @docsEditable true
   bool $dom_dispatchEvent(Event event) native "dispatchEvent";
 
-  /** @domName RTCPeerConnection.getStats */
+  /// @domName RTCPeerConnection.getStats; @docsEditable true
   void getStats(RTCStatsCallback successCallback, MediaStreamTrack selector) native;
 
-  /** @domName RTCPeerConnection.removeEventListener */
+  /// @domName RTCPeerConnection.removeEventListener; @docsEditable true
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
 
-  /** @domName RTCPeerConnection.removeStream */
+  /// @domName RTCPeerConnection.removeStream; @docsEditable true
   void removeStream(MediaStream stream) native;
 
-  /** @domName RTCPeerConnection.setLocalDescription */
+  /// @domName RTCPeerConnection.setLocalDescription; @docsEditable true
   void setLocalDescription(RTCSessionDescription description, [VoidCallback successCallback, RTCErrorCallback failureCallback]) native;
 
-  /** @domName RTCPeerConnection.setRemoteDescription */
+  /// @domName RTCPeerConnection.setRemoteDescription; @docsEditable true
   void setRemoteDescription(RTCSessionDescription description, [VoidCallback successCallback, RTCErrorCallback failureCallback]) native;
 
-  /** @domName RTCPeerConnection.updateIce */
+  /// @domName RTCPeerConnection.updateIce; @docsEditable true
   void updateIce([Map configuration, Map mediaConstraints]) {
     if (?mediaConstraints) {
       var configuration_1 = _convertDartToNative_Dictionary(configuration);
@@ -15151,15 +15379,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName RTCSessionDescription
+/// @domName RTCSessionDescription; @docsEditable true
 class RTCSessionDescription native "*RTCSessionDescription" {
 
   factory RTCSessionDescription(Map dictionary) => _RTCSessionDescriptionFactoryProvider.createRTCSessionDescription(dictionary);
 
-  /** @domName RTCSessionDescription.sdp */
+  /// @domName RTCSessionDescription.sdp; @docsEditable true
   String sdp;
 
-  /** @domName RTCSessionDescription.type */
+  /// @domName RTCSessionDescription.type; @docsEditable true
   String type;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -15183,13 +15411,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName RTCStatsElement
+/// @domName RTCStatsElement; @docsEditable true
 class RTCStatsElement native "*RTCStatsElement" {
 
-  /** @domName RTCStatsElement.timestamp */
+  /// @domName RTCStatsElement.timestamp; @docsEditable true
   final Date timestamp;
 
-  /** @domName RTCStatsElement.stat */
+  /// @domName RTCStatsElement.stat; @docsEditable true
   String stat(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -15197,13 +15425,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName RTCStatsReport
+/// @domName RTCStatsReport; @docsEditable true
 class RTCStatsReport native "*RTCStatsReport" {
 
-  /** @domName RTCStatsReport.local */
+  /// @domName RTCStatsReport.local; @docsEditable true
   final RTCStatsElement local;
 
-  /** @domName RTCStatsReport.remote */
+  /// @domName RTCStatsReport.remote; @docsEditable true
   final RTCStatsElement remote;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -15211,10 +15439,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName RTCStatsResponse
+/// @domName RTCStatsResponse; @docsEditable true
 class RTCStatsResponse native "*RTCStatsResponse" {
 
-  /** @domName RTCStatsResponse.result */
+  /// @domName RTCStatsResponse.result; @docsEditable true
   List<RTCStatsReport> result() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -15222,10 +15450,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName RadioNodeList
-class RadioNodeList extends NodeList native "*RadioNodeList" {
+/// @domName RadioNodeList; @docsEditable true
+class RadioNodeList extends _NodeList native "*RadioNodeList" {
 
-  /** @domName RadioNodeList.value */
+  /// @domName RadioNodeList.value; @docsEditable true
   String value;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -15233,7 +15461,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Range
+/// @domName Range; @docsEditable true
 class Range native "*Range" {
 
   static const int END_TO_END = 2;
@@ -15252,97 +15480,98 @@
 
   static const int START_TO_START = 0;
 
-  /** @domName Range.collapsed */
+  /// @domName Range.collapsed; @docsEditable true
   final bool collapsed;
 
-  /** @domName Range.commonAncestorContainer */
+  /// @domName Range.commonAncestorContainer; @docsEditable true
   final Node commonAncestorContainer;
 
-  /** @domName Range.endContainer */
+  /// @domName Range.endContainer; @docsEditable true
   final Node endContainer;
 
-  /** @domName Range.endOffset */
+  /// @domName Range.endOffset; @docsEditable true
   final int endOffset;
 
-  /** @domName Range.startContainer */
+  /// @domName Range.startContainer; @docsEditable true
   final Node startContainer;
 
-  /** @domName Range.startOffset */
+  /// @domName Range.startOffset; @docsEditable true
   final int startOffset;
 
-  /** @domName Range.cloneContents */
+  /// @domName Range.cloneContents; @docsEditable true
   DocumentFragment cloneContents() native;
 
-  /** @domName Range.cloneRange */
+  /// @domName Range.cloneRange; @docsEditable true
   Range cloneRange() native;
 
-  /** @domName Range.collapse */
+  /// @domName Range.collapse; @docsEditable true
   void collapse(bool toStart) native;
 
-  /** @domName Range.compareNode */
+  /// @domName Range.compareNode; @docsEditable true
   int compareNode(Node refNode) native;
 
-  /** @domName Range.comparePoint */
+  /// @domName Range.comparePoint; @docsEditable true
   int comparePoint(Node refNode, int offset) native;
 
-  /** @domName Range.createContextualFragment */
+  /// @domName Range.createContextualFragment; @docsEditable true
   DocumentFragment createContextualFragment(String html) native;
 
-  /** @domName Range.deleteContents */
+  /// @domName Range.deleteContents; @docsEditable true
   void deleteContents() native;
 
-  /** @domName Range.detach */
+  /// @domName Range.detach; @docsEditable true
   void detach() native;
 
-  /** @domName Range.expand */
+  /// @domName Range.expand; @docsEditable true
   void expand(String unit) native;
 
-  /** @domName Range.extractContents */
+  /// @domName Range.extractContents; @docsEditable true
   DocumentFragment extractContents() native;
 
-  /** @domName Range.getBoundingClientRect */
+  /// @domName Range.getBoundingClientRect; @docsEditable true
   ClientRect getBoundingClientRect() native;
 
-  /** @domName Range.getClientRects */
+  /// @domName Range.getClientRects; @docsEditable true
+  @Returns('_ClientRectList') @Creates('_ClientRectList')
   List<ClientRect> getClientRects() native;
 
-  /** @domName Range.insertNode */
+  /// @domName Range.insertNode; @docsEditable true
   void insertNode(Node newNode) native;
 
-  /** @domName Range.intersectsNode */
+  /// @domName Range.intersectsNode; @docsEditable true
   bool intersectsNode(Node refNode) native;
 
-  /** @domName Range.isPointInRange */
+  /// @domName Range.isPointInRange; @docsEditable true
   bool isPointInRange(Node refNode, int offset) native;
 
-  /** @domName Range.selectNode */
+  /// @domName Range.selectNode; @docsEditable true
   void selectNode(Node refNode) native;
 
-  /** @domName Range.selectNodeContents */
+  /// @domName Range.selectNodeContents; @docsEditable true
   void selectNodeContents(Node refNode) native;
 
-  /** @domName Range.setEnd */
+  /// @domName Range.setEnd; @docsEditable true
   void setEnd(Node refNode, int offset) native;
 
-  /** @domName Range.setEndAfter */
+  /// @domName Range.setEndAfter; @docsEditable true
   void setEndAfter(Node refNode) native;
 
-  /** @domName Range.setEndBefore */
+  /// @domName Range.setEndBefore; @docsEditable true
   void setEndBefore(Node refNode) native;
 
-  /** @domName Range.setStart */
+  /// @domName Range.setStart; @docsEditable true
   void setStart(Node refNode, int offset) native;
 
-  /** @domName Range.setStartAfter */
+  /// @domName Range.setStartAfter; @docsEditable true
   void setStartAfter(Node refNode) native;
 
-  /** @domName Range.setStartBefore */
+  /// @domName Range.setStartBefore; @docsEditable true
   void setStartBefore(Node refNode) native;
 
-  /** @domName Range.surroundContents */
+  /// @domName Range.surroundContents; @docsEditable true
   void surroundContents(Node newParent) native;
 
-  /** @domName Range.toString */
+  /// @domName Range.toString; @docsEditable true
   String toString() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -15350,23 +15579,23 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName RangeException
+/// @domName RangeException; @docsEditable true
 class RangeException native "*RangeException" {
 
   static const int BAD_BOUNDARYPOINTS_ERR = 1;
 
   static const int INVALID_NODE_TYPE_ERR = 2;
 
-  /** @domName RangeException.code */
+  /// @domName RangeException.code; @docsEditable true
   final int code;
 
-  /** @domName RangeException.message */
+  /// @domName RangeException.message; @docsEditable true
   final String message;
 
-  /** @domName RangeException.name */
+  /// @domName RangeException.name; @docsEditable true
   final String name;
 
-  /** @domName RangeException.toString */
+  /// @domName RangeException.toString; @docsEditable true
   String toString() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -15374,19 +15603,19 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Rect
+/// @domName Rect; @docsEditable true
 class Rect native "*Rect" {
 
-  /** @domName Rect.bottom */
+  /// @domName Rect.bottom; @docsEditable true
   final CSSPrimitiveValue bottom;
 
-  /** @domName Rect.left */
+  /// @domName Rect.left; @docsEditable true
   final CSSPrimitiveValue left;
 
-  /** @domName Rect.right */
+  /// @domName Rect.right; @docsEditable true
   final CSSPrimitiveValue right;
 
-  /** @domName Rect.top */
+  /// @domName Rect.top; @docsEditable true
   final CSSPrimitiveValue top;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -15402,7 +15631,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SQLError
+/// @domName SQLError; @docsEditable true
 class SQLError native "*SQLError" {
 
   static const int CONSTRAINT_ERR = 6;
@@ -15421,10 +15650,10 @@
 
   static const int VERSION_ERR = 2;
 
-  /** @domName SQLError.code */
+  /// @domName SQLError.code; @docsEditable true
   final int code;
 
-  /** @domName SQLError.message */
+  /// @domName SQLError.message; @docsEditable true
   final String message;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -15432,7 +15661,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SQLException
+/// @domName SQLException; @docsEditable true
 class SQLException native "*SQLException" {
 
   static const int CONSTRAINT_ERR = 6;
@@ -15451,10 +15680,10 @@
 
   static const int VERSION_ERR = 2;
 
-  /** @domName SQLException.code */
+  /// @domName SQLException.code; @docsEditable true
   final int code;
 
-  /** @domName SQLException.message */
+  /// @domName SQLException.message; @docsEditable true
   final String message;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -15462,16 +15691,16 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SQLResultSet
+/// @domName SQLResultSet; @docsEditable true
 class SQLResultSet native "*SQLResultSet" {
 
-  /** @domName SQLResultSet.insertId */
+  /// @domName SQLResultSet.insertId; @docsEditable true
   final int insertId;
 
-  /** @domName SQLResultSet.rows */
+  /// @domName SQLResultSet.rows; @docsEditable true
   final SQLResultSetRowList rows;
 
-  /** @domName SQLResultSet.rowsAffected */
+  /// @domName SQLResultSet.rowsAffected; @docsEditable true
   final int rowsAffected;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -15479,10 +15708,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SQLResultSetRowList
+/// @domName SQLResultSetRowList; @docsEditable true
 class SQLResultSetRowList implements JavaScriptIndexingBehavior, List<Map> native "*SQLResultSetRowList" {
 
-  /** @domName SQLResultSetRowList.length */
+  /// @domName SQLResultSetRowList.length; @docsEditable true
   final int length;
 
   Map operator[](int index) => JS("Map", "#[#]", this, index);
@@ -15545,6 +15774,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  Map get first => this[0];
+
   Map get last => this[length - 1];
 
   Map removeLast() {
@@ -15568,10 +15799,11 @@
 
   // -- end List<Map> mixins.
 
-  /** @domName SQLResultSetRowList.item */
+  /// @domName SQLResultSetRowList.item; @docsEditable true
   Map item(int index) {
     return _convertNativeToDart_Dictionary(_item_1(index));
   }
+  @Creates('=Object')
   _item_1(index) native "item";
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -15595,10 +15827,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SQLTransaction
+/// @domName SQLTransaction; @docsEditable true
 class SQLTransaction native "*SQLTransaction" {
 
-  /** @domName SQLTransaction.executeSql */
+  /// @domName SQLTransaction.executeSql; @docsEditable true
   void executeSql(String sqlStatement, List arguments, [SQLStatementCallback callback, SQLStatementErrorCallback errorCallback]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -15622,10 +15854,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SQLTransactionSync
+/// @domName SQLTransactionSync; @docsEditable true
 class SQLTransactionSync native "*SQLTransactionSync" {
 
-  /** @domName SQLTransactionSync.executeSql */
+  /// @domName SQLTransactionSync.executeSql; @docsEditable true
   SQLResultSet executeSql(String sqlStatement, List arguments) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -15641,31 +15873,31 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Screen
+/// @domName Screen; @docsEditable true
 class Screen native "*Screen" {
 
-  /** @domName Screen.availHeight */
+  /// @domName Screen.availHeight; @docsEditable true
   final int availHeight;
 
-  /** @domName Screen.availLeft */
+  /// @domName Screen.availLeft; @docsEditable true
   final int availLeft;
 
-  /** @domName Screen.availTop */
+  /// @domName Screen.availTop; @docsEditable true
   final int availTop;
 
-  /** @domName Screen.availWidth */
+  /// @domName Screen.availWidth; @docsEditable true
   final int availWidth;
 
-  /** @domName Screen.colorDepth */
+  /// @domName Screen.colorDepth; @docsEditable true
   final int colorDepth;
 
-  /** @domName Screen.height */
+  /// @domName Screen.height; @docsEditable true
   final int height;
 
-  /** @domName Screen.pixelDepth */
+  /// @domName Screen.pixelDepth; @docsEditable true
   final int pixelDepth;
 
-  /** @domName Screen.width */
+  /// @domName Screen.width; @docsEditable true
   final int width;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -15673,33 +15905,33 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLScriptElement
+/// @domName HTMLScriptElement; @docsEditable true
 class ScriptElement extends Element implements Element native "*HTMLScriptElement" {
 
-  factory ScriptElement() => _Elements.createScriptElement();
+  factory ScriptElement() => document.$dom_createElement("script");
 
-  /** @domName HTMLScriptElement.async */
+  /// @domName HTMLScriptElement.async; @docsEditable true
   bool async;
 
-  /** @domName HTMLScriptElement.charset */
+  /// @domName HTMLScriptElement.charset; @docsEditable true
   String charset;
 
-  /** @domName HTMLScriptElement.crossOrigin */
+  /// @domName HTMLScriptElement.crossOrigin; @docsEditable true
   String crossOrigin;
 
-  /** @domName HTMLScriptElement.defer */
+  /// @domName HTMLScriptElement.defer; @docsEditable true
   bool defer;
 
-  /** @domName HTMLScriptElement.event */
+  /// @domName HTMLScriptElement.event; @docsEditable true
   String event;
 
-  /** @domName HTMLScriptElement.htmlFor */
+  /// @domName HTMLScriptElement.htmlFor; @docsEditable true
   String htmlFor;
 
-  /** @domName HTMLScriptElement.src */
+  /// @domName HTMLScriptElement.src; @docsEditable true
   String src;
 
-  /** @domName HTMLScriptElement.type */
+  /// @domName HTMLScriptElement.type; @docsEditable true
   String type;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -15707,16 +15939,14 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName ScriptProcessorNode
+/// @domName ScriptProcessorNode; @docsEditable true
 class ScriptProcessorNode extends AudioNode implements EventTarget native "*ScriptProcessorNode" {
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   ScriptProcessorNodeEvents get on =>
     new ScriptProcessorNodeEvents(this);
 
-  /** @domName ScriptProcessorNode.bufferSize */
+  /// @domName ScriptProcessorNode.bufferSize; @docsEditable true
   final int bufferSize;
 }
 
@@ -15730,16 +15960,16 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName ScriptProfile
+/// @domName ScriptProfile; @docsEditable true
 class ScriptProfile native "*ScriptProfile" {
 
-  /** @domName ScriptProfile.head */
+  /// @domName ScriptProfile.head; @docsEditable true
   final ScriptProfileNode head;
 
-  /** @domName ScriptProfile.title */
+  /// @domName ScriptProfile.title; @docsEditable true
   final String title;
 
-  /** @domName ScriptProfile.uid */
+  /// @domName ScriptProfile.uid; @docsEditable true
   final int uid;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -15747,34 +15977,34 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName ScriptProfileNode
+/// @domName ScriptProfileNode; @docsEditable true
 class ScriptProfileNode native "*ScriptProfileNode" {
 
-  /** @domName ScriptProfileNode.callUID */
+  /// @domName ScriptProfileNode.callUID; @docsEditable true
   final int callUID;
 
-  /** @domName ScriptProfileNode.functionName */
+  /// @domName ScriptProfileNode.functionName; @docsEditable true
   final String functionName;
 
-  /** @domName ScriptProfileNode.lineNumber */
+  /// @domName ScriptProfileNode.lineNumber; @docsEditable true
   final int lineNumber;
 
-  /** @domName ScriptProfileNode.numberOfCalls */
+  /// @domName ScriptProfileNode.numberOfCalls; @docsEditable true
   final int numberOfCalls;
 
-  /** @domName ScriptProfileNode.selfTime */
+  /// @domName ScriptProfileNode.selfTime; @docsEditable true
   final num selfTime;
 
-  /** @domName ScriptProfileNode.totalTime */
+  /// @domName ScriptProfileNode.totalTime; @docsEditable true
   final num totalTime;
 
-  /** @domName ScriptProfileNode.url */
+  /// @domName ScriptProfileNode.url; @docsEditable true
   final String url;
 
-  /** @domName ScriptProfileNode.visible */
+  /// @domName ScriptProfileNode.visible; @docsEditable true
   final bool visible;
 
-  /** @domName ScriptProfileNode.children */
+  /// @domName ScriptProfileNode.children; @docsEditable true
   List<ScriptProfileNode> children() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -15784,63 +16014,64 @@
 
 class SelectElement extends Element implements Element native "*HTMLSelectElement" {
 
-  factory SelectElement() => _Elements.createSelectElement();
+  factory SelectElement() => document.$dom_createElement("select");
 
-  /** @domName HTMLSelectElement.autofocus */
+  /// @domName HTMLSelectElement.autofocus; @docsEditable true
   bool autofocus;
 
-  /** @domName HTMLSelectElement.disabled */
+  /// @domName HTMLSelectElement.disabled; @docsEditable true
   bool disabled;
 
-  /** @domName HTMLSelectElement.form */
+  /// @domName HTMLSelectElement.form; @docsEditable true
   final FormElement form;
 
-  /** @domName HTMLSelectElement.labels */
+  /// @domName HTMLSelectElement.labels; @docsEditable true
+  @Returns('_NodeList') @Creates('_NodeList')
   final List<Node> labels;
 
-  /** @domName HTMLSelectElement.length */
+  /// @domName HTMLSelectElement.length; @docsEditable true
   int length;
 
-  /** @domName HTMLSelectElement.multiple */
+  /// @domName HTMLSelectElement.multiple; @docsEditable true
   bool multiple;
 
-  /** @domName HTMLSelectElement.name */
+  /// @domName HTMLSelectElement.name; @docsEditable true
   String name;
 
-  /** @domName HTMLSelectElement.required */
+  /// @domName HTMLSelectElement.required; @docsEditable true
   bool required;
 
-  /** @domName HTMLSelectElement.selectedIndex */
+  /// @domName HTMLSelectElement.selectedIndex; @docsEditable true
   int selectedIndex;
 
-  /** @domName HTMLSelectElement.size */
+  /// @domName HTMLSelectElement.size; @docsEditable true
   int size;
 
-  /** @domName HTMLSelectElement.type */
+  /// @domName HTMLSelectElement.type; @docsEditable true
   final String type;
 
-  /** @domName HTMLSelectElement.validationMessage */
+  /// @domName HTMLSelectElement.validationMessage; @docsEditable true
   final String validationMessage;
 
-  /** @domName HTMLSelectElement.validity */
+  /// @domName HTMLSelectElement.validity; @docsEditable true
   final ValidityState validity;
 
-  /** @domName HTMLSelectElement.value */
+  /// @domName HTMLSelectElement.value; @docsEditable true
   String value;
 
-  /** @domName HTMLSelectElement.willValidate */
+  /// @domName HTMLSelectElement.willValidate; @docsEditable true
   final bool willValidate;
 
-  /** @domName HTMLSelectElement.checkValidity */
+  /// @domName HTMLSelectElement.checkValidity; @docsEditable true
   bool checkValidity() native;
 
-  /** @domName HTMLSelectElement.item */
+  /// @domName HTMLSelectElement.item; @docsEditable true
   Node item(int index) native;
 
-  /** @domName HTMLSelectElement.namedItem */
+  /// @domName HTMLSelectElement.namedItem; @docsEditable true
   Node namedItem(String name) native;
 
-  /** @domName HTMLSelectElement.setCustomValidity */
+  /// @domName HTMLSelectElement.setCustomValidity; @docsEditable true
   void setCustomValidity(String error) native;
 
 
@@ -15864,15 +16095,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SessionDescription
+/// @domName SessionDescription; @docsEditable true
 class SessionDescription native "*SessionDescription" {
 
   factory SessionDescription(String sdp) => _SessionDescriptionFactoryProvider.createSessionDescription(sdp);
 
-  /** @domName SessionDescription.addCandidate */
+  /// @domName SessionDescription.addCandidate; @docsEditable true
   void addCandidate(IceCandidate candidate) native;
 
-  /** @domName SessionDescription.toSdp */
+  /// @domName SessionDescription.toSdp; @docsEditable true
   String toSdp() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -15880,10 +16111,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLShadowElement
+/// @domName HTMLShadowElement; @docsEditable true
 class ShadowElement extends Element implements Element native "*HTMLShadowElement" {
 
-  /** @domName HTMLShadowElement.resetStyleInheritance */
+  /// @domName HTMLShadowElement.resetStyleInheritance; @docsEditable true
   bool resetStyleInheritance;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -15897,31 +16128,33 @@
 
   factory ShadowRoot(Element host) => _ShadowRootFactoryProvider.createShadowRoot(host);
 
-  /** @domName ShadowRoot.activeElement */
+  /// @domName ShadowRoot.activeElement; @docsEditable true
   final Element activeElement;
 
-  /** @domName ShadowRoot.applyAuthorStyles */
+  /// @domName ShadowRoot.applyAuthorStyles; @docsEditable true
   bool applyAuthorStyles;
 
-  /** @domName ShadowRoot.innerHTML */
+  /// @domName ShadowRoot.innerHTML; @docsEditable true
   String innerHTML;
 
-  /** @domName ShadowRoot.resetStyleInheritance */
+  /// @domName ShadowRoot.resetStyleInheritance; @docsEditable true
   bool resetStyleInheritance;
 
-  /** @domName ShadowRoot.cloneNode */
+  /// @domName ShadowRoot.cloneNode; @docsEditable true
   Node clone(bool deep) native "cloneNode";
 
-  /** @domName ShadowRoot.getElementById */
+  /// @domName ShadowRoot.getElementById; @docsEditable true
   Element $dom_getElementById(String elementId) native "getElementById";
 
-  /** @domName ShadowRoot.getElementsByClassName */
+  /// @domName ShadowRoot.getElementsByClassName; @docsEditable true
+  @Returns('_NodeList') @Creates('_NodeList')
   List<Node> $dom_getElementsByClassName(String className) native "getElementsByClassName";
 
-  /** @domName ShadowRoot.getElementsByTagName */
+  /// @domName ShadowRoot.getElementsByTagName; @docsEditable true
+  @Returns('_NodeList') @Creates('_NodeList')
   List<Node> $dom_getElementsByTagName(String tagName) native "getElementsByTagName";
 
-  /** @domName ShadowRoot.getSelection */
+  /// @domName ShadowRoot.getSelection; @docsEditable true
   DOMSelection getSelection() native;
 
   static bool get supported =>
@@ -15932,7 +16165,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SharedWorker
+/// @domName SharedWorker; @docsEditable true
 class SharedWorker extends AbstractWorker native "*SharedWorker" {
 
   factory SharedWorker(String scriptURL, [String name]) {
@@ -15942,7 +16175,7 @@
     return _SharedWorkerFactoryProvider.createSharedWorker(scriptURL, name);
   }
 
-  /** @domName SharedWorker.port */
+  /// @domName SharedWorker.port; @docsEditable true
   final MessagePort port;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -15950,16 +16183,14 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SharedWorkerContext
+/// @domName SharedWorkerContext; @docsEditable true
 class SharedWorkerContext extends WorkerContext native "*SharedWorkerContext" {
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   SharedWorkerContextEvents get on =>
     new SharedWorkerContextEvents(this);
 
-  /** @domName SharedWorkerContext.name */
+  /// @domName SharedWorkerContext.name; @docsEditable true
   final String name;
 }
 
@@ -15973,19 +16204,19 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SourceBuffer
+/// @domName SourceBuffer; @docsEditable true
 class SourceBuffer native "*SourceBuffer" {
 
-  /** @domName SourceBuffer.buffered */
+  /// @domName SourceBuffer.buffered; @docsEditable true
   final TimeRanges buffered;
 
-  /** @domName SourceBuffer.timestampOffset */
+  /// @domName SourceBuffer.timestampOffset; @docsEditable true
   num timestampOffset;
 
-  /** @domName SourceBuffer.abort */
+  /// @domName SourceBuffer.abort; @docsEditable true
   void abort() native;
 
-  /** @domName SourceBuffer.append */
+  /// @domName SourceBuffer.append; @docsEditable true
   void append(Uint8Array data) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -15993,10 +16224,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SourceBufferList
+/// @domName SourceBufferList; @docsEditable true
 class SourceBufferList extends EventTarget implements JavaScriptIndexingBehavior, List<SourceBuffer> native "*SourceBufferList" {
 
-  /** @domName SourceBufferList.length */
+  /// @domName SourceBufferList.length; @docsEditable true
   final int length;
 
   SourceBuffer operator[](int index) => JS("SourceBuffer", "#[#]", this, index);
@@ -16059,6 +16290,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  SourceBuffer get first => this[0];
+
   SourceBuffer get last => this[length - 1];
 
   SourceBuffer removeLast() {
@@ -16082,16 +16315,16 @@
 
   // -- end List<SourceBuffer> mixins.
 
-  /** @domName SourceBufferList.addEventListener */
+  /// @domName SourceBufferList.addEventListener; @docsEditable true
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
 
-  /** @domName SourceBufferList.dispatchEvent */
+  /// @domName SourceBufferList.dispatchEvent; @docsEditable true
   bool $dom_dispatchEvent(Event event) native "dispatchEvent";
 
-  /** @domName SourceBufferList.item */
+  /// @domName SourceBufferList.item; @docsEditable true
   SourceBuffer item(int index) native;
 
-  /** @domName SourceBufferList.removeEventListener */
+  /// @domName SourceBufferList.removeEventListener; @docsEditable true
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16099,18 +16332,18 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLSourceElement
+/// @domName HTMLSourceElement; @docsEditable true
 class SourceElement extends Element implements Element native "*HTMLSourceElement" {
 
-  factory SourceElement() => _Elements.createSourceElement();
+  factory SourceElement() => document.$dom_createElement("source");
 
-  /** @domName HTMLSourceElement.media */
+  /// @domName HTMLSourceElement.media; @docsEditable true
   String media;
 
-  /** @domName HTMLSourceElement.src */
+  /// @domName HTMLSourceElement.src; @docsEditable true
   String src;
 
-  /** @domName HTMLSourceElement.type */
+  /// @domName HTMLSourceElement.type; @docsEditable true
   String type;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16118,25 +16351,25 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLSpanElement
+/// @domName HTMLSpanElement; @docsEditable true
 class SpanElement extends Element implements Element native "*HTMLSpanElement" {
 
-  factory SpanElement() => _Elements.createSpanElement();
+  factory SpanElement() => document.$dom_createElement("span");
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for 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 SpeechGrammar
+/// @domName SpeechGrammar; @docsEditable true
 class SpeechGrammar native "*SpeechGrammar" {
 
   factory SpeechGrammar() => _SpeechGrammarFactoryProvider.createSpeechGrammar();
 
-  /** @domName SpeechGrammar.src */
+  /// @domName SpeechGrammar.src; @docsEditable true
   String src;
 
-  /** @domName SpeechGrammar.weight */
+  /// @domName SpeechGrammar.weight; @docsEditable true
   num weight;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16144,12 +16377,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SpeechGrammarList
+/// @domName SpeechGrammarList; @docsEditable true
 class SpeechGrammarList implements JavaScriptIndexingBehavior, List<SpeechGrammar> native "*SpeechGrammarList" {
 
   factory SpeechGrammarList() => _SpeechGrammarListFactoryProvider.createSpeechGrammarList();
 
-  /** @domName SpeechGrammarList.length */
+  /// @domName SpeechGrammarList.length; @docsEditable true
   final int length;
 
   SpeechGrammar operator[](int index) => JS("SpeechGrammar", "#[#]", this, index);
@@ -16212,6 +16445,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  SpeechGrammar get first => this[0];
+
   SpeechGrammar get last => this[length - 1];
 
   SpeechGrammar removeLast() {
@@ -16235,13 +16470,13 @@
 
   // -- end List<SpeechGrammar> mixins.
 
-  /** @domName SpeechGrammarList.addFromString */
+  /// @domName SpeechGrammarList.addFromString; @docsEditable true
   void addFromString(String string, [num weight]) native;
 
-  /** @domName SpeechGrammarList.addFromUri */
+  /// @domName SpeechGrammarList.addFromUri; @docsEditable true
   void addFromUri(String src, [num weight]) native;
 
-  /** @domName SpeechGrammarList.item */
+  /// @domName SpeechGrammarList.item; @docsEditable true
   SpeechGrammar item(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16249,10 +16484,11 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SpeechInputEvent
+/// @domName SpeechInputEvent; @docsEditable true
 class SpeechInputEvent extends Event native "*SpeechInputEvent" {
 
-  /** @domName SpeechInputEvent.results */
+  /// @domName SpeechInputEvent.results; @docsEditable true
+  @Returns('_SpeechInputResultList') @Creates('_SpeechInputResultList')
   final List<SpeechInputResult> results;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16260,13 +16496,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SpeechInputResult
+/// @domName SpeechInputResult; @docsEditable true
 class SpeechInputResult native "*SpeechInputResult" {
 
-  /** @domName SpeechInputResult.confidence */
+  /// @domName SpeechInputResult.confidence; @docsEditable true
   final num confidence;
 
-  /** @domName SpeechInputResult.utterance */
+  /// @domName SpeechInputResult.utterance; @docsEditable true
   final String utterance;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16274,48 +16510,46 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SpeechRecognition
+/// @domName SpeechRecognition; @docsEditable true
 class SpeechRecognition extends EventTarget native "*SpeechRecognition" {
 
   factory SpeechRecognition() => _SpeechRecognitionFactoryProvider.createSpeechRecognition();
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   SpeechRecognitionEvents get on =>
     new SpeechRecognitionEvents(this);
 
-  /** @domName SpeechRecognition.continuous */
+  /// @domName SpeechRecognition.continuous; @docsEditable true
   bool continuous;
 
-  /** @domName SpeechRecognition.grammars */
+  /// @domName SpeechRecognition.grammars; @docsEditable true
   SpeechGrammarList grammars;
 
-  /** @domName SpeechRecognition.interimResults */
+  /// @domName SpeechRecognition.interimResults; @docsEditable true
   bool interimResults;
 
-  /** @domName SpeechRecognition.lang */
+  /// @domName SpeechRecognition.lang; @docsEditable true
   String lang;
 
-  /** @domName SpeechRecognition.maxAlternatives */
+  /// @domName SpeechRecognition.maxAlternatives; @docsEditable true
   int maxAlternatives;
 
-  /** @domName SpeechRecognition.abort */
+  /// @domName SpeechRecognition.abort; @docsEditable true
   void abort() native;
 
-  /** @domName SpeechRecognition.addEventListener */
+  /// @domName SpeechRecognition.addEventListener; @docsEditable true
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
 
-  /** @domName SpeechRecognition.dispatchEvent */
+  /// @domName SpeechRecognition.dispatchEvent; @docsEditable true
   bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
 
-  /** @domName SpeechRecognition.removeEventListener */
+  /// @domName SpeechRecognition.removeEventListener; @docsEditable true
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
 
-  /** @domName SpeechRecognition.start */
+  /// @domName SpeechRecognition.start; @docsEditable true
   void start() native;
 
-  /** @domName SpeechRecognition.stop */
+  /// @domName SpeechRecognition.stop; @docsEditable true
   void stop() native;
 }
 
@@ -16349,13 +16583,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SpeechRecognitionAlternative
+/// @domName SpeechRecognitionAlternative; @docsEditable true
 class SpeechRecognitionAlternative native "*SpeechRecognitionAlternative" {
 
-  /** @domName SpeechRecognitionAlternative.confidence */
+  /// @domName SpeechRecognitionAlternative.confidence; @docsEditable true
   final num confidence;
 
-  /** @domName SpeechRecognitionAlternative.transcript */
+  /// @domName SpeechRecognitionAlternative.transcript; @docsEditable true
   final String transcript;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16363,7 +16597,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SpeechRecognitionError
+/// @domName SpeechRecognitionError; @docsEditable true
 class SpeechRecognitionError extends Event native "*SpeechRecognitionError" {
 
   static const int ABORTED = 2;
@@ -16384,10 +16618,10 @@
 
   static const int SERVICE_NOT_ALLOWED = 6;
 
-  /** @domName SpeechRecognitionError.code */
+  /// @domName SpeechRecognitionError.code; @docsEditable true
   final int code;
 
-  /** @domName SpeechRecognitionError.message */
+  /// @domName SpeechRecognitionError.message; @docsEditable true
   final String message;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16395,16 +16629,17 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SpeechRecognitionEvent
+/// @domName SpeechRecognitionEvent; @docsEditable true
 class SpeechRecognitionEvent extends Event native "*SpeechRecognitionEvent" {
 
-  /** @domName SpeechRecognitionEvent.result */
+  /// @domName SpeechRecognitionEvent.result; @docsEditable true
   final SpeechRecognitionResult result;
 
-  /** @domName SpeechRecognitionEvent.resultHistory */
+  /// @domName SpeechRecognitionEvent.resultHistory; @docsEditable true
+  @Returns('_SpeechRecognitionResultList') @Creates('_SpeechRecognitionResultList')
   final List<SpeechRecognitionResult> resultHistory;
 
-  /** @domName SpeechRecognitionEvent.resultIndex */
+  /// @domName SpeechRecognitionEvent.resultIndex; @docsEditable true
   final int resultIndex;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16412,19 +16647,19 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SpeechRecognitionResult
+/// @domName SpeechRecognitionResult; @docsEditable true
 class SpeechRecognitionResult native "*SpeechRecognitionResult" {
 
-  /** @domName SpeechRecognitionResult.emma */
+  /// @domName SpeechRecognitionResult.emma; @docsEditable true
   final Document emma;
 
-  /** @domName SpeechRecognitionResult.finalValue */
+  /// @domName SpeechRecognitionResult.finalValue; @docsEditable true
   bool get finalValue => JS("bool", "#.final", this);
 
-  /** @domName SpeechRecognitionResult.length */
+  /// @domName SpeechRecognitionResult.length; @docsEditable true
   final int length;
 
-  /** @domName SpeechRecognitionResult.item */
+  /// @domName SpeechRecognitionResult.item; @docsEditable true
   SpeechRecognitionAlternative item(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16441,7 +16676,7 @@
 
   String operator [](String key) => $dom_getItem(key);
 
-  void operator []=(String key, String value) => $dom_setItem(key, value);
+  void operator []=(String key, String value) { $dom_setItem(key, value); }
 
   String putIfAbsent(String key, String ifAbsent()) {
     if (!containsKey(key)) this[key] = ifAbsent();
@@ -16481,22 +16716,22 @@
 
   bool get isEmpty => $dom_key(0) == null;
 
-  /** @domName Storage.length */
+  /// @domName Storage.length; @docsEditable true
   int get $dom_length => JS("int", "#.length", this);
 
-  /** @domName Storage.clear */
+  /// @domName Storage.clear; @docsEditable true
   void $dom_clear() native "clear";
 
-  /** @domName Storage.getItem */
+  /// @domName Storage.getItem; @docsEditable true
   String $dom_getItem(String key) native "getItem";
 
-  /** @domName Storage.key */
+  /// @domName Storage.key; @docsEditable true
   String $dom_key(int index) native "key";
 
-  /** @domName Storage.removeItem */
+  /// @domName Storage.removeItem; @docsEditable true
   void $dom_removeItem(String key) native "removeItem";
 
-  /** @domName Storage.setItem */
+  /// @domName Storage.setItem; @docsEditable true
   void $dom_setItem(String key, String data) native "setItem";
 
 }
@@ -16505,25 +16740,25 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName StorageEvent
+/// @domName StorageEvent; @docsEditable true
 class StorageEvent extends Event native "*StorageEvent" {
 
-  /** @domName StorageEvent.key */
+  /// @domName StorageEvent.key; @docsEditable true
   final String key;
 
-  /** @domName StorageEvent.newValue */
+  /// @domName StorageEvent.newValue; @docsEditable true
   final String newValue;
 
-  /** @domName StorageEvent.oldValue */
+  /// @domName StorageEvent.oldValue; @docsEditable true
   final String oldValue;
 
-  /** @domName StorageEvent.storageArea */
+  /// @domName StorageEvent.storageArea; @docsEditable true
   final Storage storageArea;
 
-  /** @domName StorageEvent.url */
+  /// @domName StorageEvent.url; @docsEditable true
   final String url;
 
-  /** @domName StorageEvent.initStorageEvent */
+  /// @domName StorageEvent.initStorageEvent; @docsEditable true
   void initStorageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, String keyArg, String oldValueArg, String newValueArg, String urlArg, Storage storageAreaArg) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16531,17 +16766,17 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName StorageInfo
+/// @domName StorageInfo; @docsEditable true
 class StorageInfo native "*StorageInfo" {
 
   static const int PERSISTENT = 1;
 
   static const int TEMPORARY = 0;
 
-  /** @domName StorageInfo.queryUsageAndQuota */
+  /// @domName StorageInfo.queryUsageAndQuota; @docsEditable true
   void queryUsageAndQuota(int storageType, [StorageInfoUsageCallback usageCallback, StorageInfoErrorCallback errorCallback]) native;
 
-  /** @domName StorageInfo.requestQuota */
+  /// @domName StorageInfo.requestQuota; @docsEditable true
   void requestQuota(int storageType, int newQuotaInBytes, [StorageInfoQuotaCallback quotaCallback, StorageInfoErrorCallback errorCallback]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16581,24 +16816,24 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLStyleElement
+/// @domName HTMLStyleElement; @docsEditable true
 class StyleElement extends Element implements Element native "*HTMLStyleElement" {
 
-  factory StyleElement() => _Elements.createStyleElement();
+  factory StyleElement() => document.$dom_createElement("style");
 
-  /** @domName HTMLStyleElement.disabled */
+  /// @domName HTMLStyleElement.disabled; @docsEditable true
   bool disabled;
 
-  /** @domName HTMLStyleElement.media */
+  /// @domName HTMLStyleElement.media; @docsEditable true
   String media;
 
-  /** @domName HTMLStyleElement.scoped */
+  /// @domName HTMLStyleElement.scoped; @docsEditable true
   bool scoped;
 
-  /** @domName HTMLStyleElement.sheet */
+  /// @domName HTMLStyleElement.sheet; @docsEditable true
   final StyleSheet sheet;
 
-  /** @domName HTMLStyleElement.type */
+  /// @domName HTMLStyleElement.type; @docsEditable true
   String type;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16606,13 +16841,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName StyleMedia
+/// @domName StyleMedia; @docsEditable true
 class StyleMedia native "*StyleMedia" {
 
-  /** @domName StyleMedia.type */
+  /// @domName StyleMedia.type; @docsEditable true
   final String type;
 
-  /** @domName StyleMedia.matchMedium */
+  /// @domName StyleMedia.matchMedium; @docsEditable true
   bool matchMedium(String mediaquery) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16620,28 +16855,28 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName StyleSheet
+/// @domName StyleSheet; @docsEditable true
 class StyleSheet native "*StyleSheet" {
 
-  /** @domName StyleSheet.disabled */
+  /// @domName StyleSheet.disabled; @docsEditable true
   bool disabled;
 
-  /** @domName StyleSheet.href */
+  /// @domName StyleSheet.href; @docsEditable true
   final String href;
 
-  /** @domName StyleSheet.media */
+  /// @domName StyleSheet.media; @docsEditable true
   final MediaList media;
 
-  /** @domName StyleSheet.ownerNode */
+  /// @domName StyleSheet.ownerNode; @docsEditable true
   final Node ownerNode;
 
-  /** @domName StyleSheet.parentStyleSheet */
+  /// @domName StyleSheet.parentStyleSheet; @docsEditable true
   final StyleSheet parentStyleSheet;
 
-  /** @domName StyleSheet.title */
+  /// @domName StyleSheet.title; @docsEditable true
   final String title;
 
-  /** @domName StyleSheet.type */
+  /// @domName StyleSheet.type; @docsEditable true
   final String type;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16649,12 +16884,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLTableCaptionElement
+/// @domName HTMLTableCaptionElement; @docsEditable true
 class TableCaptionElement extends Element implements Element native "*HTMLTableCaptionElement" {
 
-  factory TableCaptionElement() => _Elements.createTableCaptionElement();
+  factory TableCaptionElement() => document.$dom_createElement("caption");
 
-  /** @domName HTMLTableCaptionElement.align */
+  /// @domName HTMLTableCaptionElement.align; @docsEditable true
   String align;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16662,54 +16897,54 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLTableCellElement
+/// @domName HTMLTableCellElement; @docsEditable true
 class TableCellElement extends Element implements Element native "*HTMLTableCellElement" {
 
-  factory TableCellElement() => _Elements.createTableCellElement();
+  factory TableCellElement() => document.$dom_createElement("td");
 
-  /** @domName HTMLTableCellElement.abbr */
+  /// @domName HTMLTableCellElement.abbr; @docsEditable true
   String abbr;
 
-  /** @domName HTMLTableCellElement.align */
+  /// @domName HTMLTableCellElement.align; @docsEditable true
   String align;
 
-  /** @domName HTMLTableCellElement.axis */
+  /// @domName HTMLTableCellElement.axis; @docsEditable true
   String axis;
 
-  /** @domName HTMLTableCellElement.bgColor */
+  /// @domName HTMLTableCellElement.bgColor; @docsEditable true
   String bgColor;
 
-  /** @domName HTMLTableCellElement.cellIndex */
+  /// @domName HTMLTableCellElement.cellIndex; @docsEditable true
   final int cellIndex;
 
-  /** @domName HTMLTableCellElement.ch */
+  /// @domName HTMLTableCellElement.ch; @docsEditable true
   String ch;
 
-  /** @domName HTMLTableCellElement.chOff */
+  /// @domName HTMLTableCellElement.chOff; @docsEditable true
   String chOff;
 
-  /** @domName HTMLTableCellElement.colSpan */
+  /// @domName HTMLTableCellElement.colSpan; @docsEditable true
   int colSpan;
 
-  /** @domName HTMLTableCellElement.headers */
+  /// @domName HTMLTableCellElement.headers; @docsEditable true
   String headers;
 
-  /** @domName HTMLTableCellElement.height */
+  /// @domName HTMLTableCellElement.height; @docsEditable true
   String height;
 
-  /** @domName HTMLTableCellElement.noWrap */
+  /// @domName HTMLTableCellElement.noWrap; @docsEditable true
   bool noWrap;
 
-  /** @domName HTMLTableCellElement.rowSpan */
+  /// @domName HTMLTableCellElement.rowSpan; @docsEditable true
   int rowSpan;
 
-  /** @domName HTMLTableCellElement.scope */
+  /// @domName HTMLTableCellElement.scope; @docsEditable true
   String scope;
 
-  /** @domName HTMLTableCellElement.vAlign */
+  /// @domName HTMLTableCellElement.vAlign; @docsEditable true
   String vAlign;
 
-  /** @domName HTMLTableCellElement.width */
+  /// @domName HTMLTableCellElement.width; @docsEditable true
   String width;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16717,27 +16952,27 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLTableColElement
+/// @domName HTMLTableColElement; @docsEditable true
 class TableColElement extends Element implements Element native "*HTMLTableColElement" {
 
-  factory TableColElement() => _Elements.createTableColElement();
+  factory TableColElement() => document.$dom_createElement("col");
 
-  /** @domName HTMLTableColElement.align */
+  /// @domName HTMLTableColElement.align; @docsEditable true
   String align;
 
-  /** @domName HTMLTableColElement.ch */
+  /// @domName HTMLTableColElement.ch; @docsEditable true
   String ch;
 
-  /** @domName HTMLTableColElement.chOff */
+  /// @domName HTMLTableColElement.chOff; @docsEditable true
   String chOff;
 
-  /** @domName HTMLTableColElement.span */
+  /// @domName HTMLTableColElement.span; @docsEditable true
   int span;
 
-  /** @domName HTMLTableColElement.vAlign */
+  /// @domName HTMLTableColElement.vAlign; @docsEditable true
   String vAlign;
 
-  /** @domName HTMLTableColElement.width */
+  /// @domName HTMLTableColElement.width; @docsEditable true
   String width;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16747,72 +16982,72 @@
 
 class TableElement extends Element implements Element native "*HTMLTableElement" {
 
-  factory TableElement() => _Elements.createTableElement();
+  factory TableElement() => document.$dom_createElement("table");
 
-  /** @domName HTMLTableElement.align */
+  /// @domName HTMLTableElement.align; @docsEditable true
   String align;
 
-  /** @domName HTMLTableElement.bgColor */
+  /// @domName HTMLTableElement.bgColor; @docsEditable true
   String bgColor;
 
-  /** @domName HTMLTableElement.border */
+  /// @domName HTMLTableElement.border; @docsEditable true
   String border;
 
-  /** @domName HTMLTableElement.caption */
+  /// @domName HTMLTableElement.caption; @docsEditable true
   TableCaptionElement caption;
 
-  /** @domName HTMLTableElement.cellPadding */
+  /// @domName HTMLTableElement.cellPadding; @docsEditable true
   String cellPadding;
 
-  /** @domName HTMLTableElement.cellSpacing */
+  /// @domName HTMLTableElement.cellSpacing; @docsEditable true
   String cellSpacing;
 
-  /** @domName HTMLTableElement.frame */
+  /// @domName HTMLTableElement.frame; @docsEditable true
   String frame;
 
-  /** @domName HTMLTableElement.rows */
+  /// @domName HTMLTableElement.rows; @docsEditable true
   final HTMLCollection rows;
 
-  /** @domName HTMLTableElement.rules */
+  /// @domName HTMLTableElement.rules; @docsEditable true
   String rules;
 
-  /** @domName HTMLTableElement.summary */
+  /// @domName HTMLTableElement.summary; @docsEditable true
   String summary;
 
-  /** @domName HTMLTableElement.tBodies */
+  /// @domName HTMLTableElement.tBodies; @docsEditable true
   final HTMLCollection tBodies;
 
-  /** @domName HTMLTableElement.tFoot */
+  /// @domName HTMLTableElement.tFoot; @docsEditable true
   TableSectionElement tFoot;
 
-  /** @domName HTMLTableElement.tHead */
+  /// @domName HTMLTableElement.tHead; @docsEditable true
   TableSectionElement tHead;
 
-  /** @domName HTMLTableElement.width */
+  /// @domName HTMLTableElement.width; @docsEditable true
   String width;
 
-  /** @domName HTMLTableElement.createCaption */
+  /// @domName HTMLTableElement.createCaption; @docsEditable true
   Element createCaption() native;
 
-  /** @domName HTMLTableElement.createTFoot */
+  /// @domName HTMLTableElement.createTFoot; @docsEditable true
   Element createTFoot() native;
 
-  /** @domName HTMLTableElement.createTHead */
+  /// @domName HTMLTableElement.createTHead; @docsEditable true
   Element createTHead() native;
 
-  /** @domName HTMLTableElement.deleteCaption */
+  /// @domName HTMLTableElement.deleteCaption; @docsEditable true
   void deleteCaption() native;
 
-  /** @domName HTMLTableElement.deleteRow */
+  /// @domName HTMLTableElement.deleteRow; @docsEditable true
   void deleteRow(int index) native;
 
-  /** @domName HTMLTableElement.deleteTFoot */
+  /// @domName HTMLTableElement.deleteTFoot; @docsEditable true
   void deleteTFoot() native;
 
-  /** @domName HTMLTableElement.deleteTHead */
+  /// @domName HTMLTableElement.deleteTHead; @docsEditable true
   void deleteTHead() native;
 
-  /** @domName HTMLTableElement.insertRow */
+  /// @domName HTMLTableElement.insertRow; @docsEditable true
   Element insertRow(int index) native;
 
 
@@ -16832,39 +17067,39 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLTableRowElement
+/// @domName HTMLTableRowElement; @docsEditable true
 class TableRowElement extends Element implements Element native "*HTMLTableRowElement" {
 
-  factory TableRowElement() => _Elements.createTableRowElement();
+  factory TableRowElement() => document.$dom_createElement("tr");
 
-  /** @domName HTMLTableRowElement.align */
+  /// @domName HTMLTableRowElement.align; @docsEditable true
   String align;
 
-  /** @domName HTMLTableRowElement.bgColor */
+  /// @domName HTMLTableRowElement.bgColor; @docsEditable true
   String bgColor;
 
-  /** @domName HTMLTableRowElement.cells */
+  /// @domName HTMLTableRowElement.cells; @docsEditable true
   final HTMLCollection cells;
 
-  /** @domName HTMLTableRowElement.ch */
+  /// @domName HTMLTableRowElement.ch; @docsEditable true
   String ch;
 
-  /** @domName HTMLTableRowElement.chOff */
+  /// @domName HTMLTableRowElement.chOff; @docsEditable true
   String chOff;
 
-  /** @domName HTMLTableRowElement.rowIndex */
+  /// @domName HTMLTableRowElement.rowIndex; @docsEditable true
   final int rowIndex;
 
-  /** @domName HTMLTableRowElement.sectionRowIndex */
+  /// @domName HTMLTableRowElement.sectionRowIndex; @docsEditable true
   final int sectionRowIndex;
 
-  /** @domName HTMLTableRowElement.vAlign */
+  /// @domName HTMLTableRowElement.vAlign; @docsEditable true
   String vAlign;
 
-  /** @domName HTMLTableRowElement.deleteCell */
+  /// @domName HTMLTableRowElement.deleteCell; @docsEditable true
   void deleteCell(int index) native;
 
-  /** @domName HTMLTableRowElement.insertCell */
+  /// @domName HTMLTableRowElement.insertCell; @docsEditable true
   Element insertCell(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16872,28 +17107,28 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLTableSectionElement
+/// @domName HTMLTableSectionElement; @docsEditable true
 class TableSectionElement extends Element implements Element native "*HTMLTableSectionElement" {
 
-  /** @domName HTMLTableSectionElement.align */
+  /// @domName HTMLTableSectionElement.align; @docsEditable true
   String align;
 
-  /** @domName HTMLTableSectionElement.ch */
+  /// @domName HTMLTableSectionElement.ch; @docsEditable true
   String ch;
 
-  /** @domName HTMLTableSectionElement.chOff */
+  /// @domName HTMLTableSectionElement.chOff; @docsEditable true
   String chOff;
 
-  /** @domName HTMLTableSectionElement.rows */
+  /// @domName HTMLTableSectionElement.rows; @docsEditable true
   final HTMLCollection rows;
 
-  /** @domName HTMLTableSectionElement.vAlign */
+  /// @domName HTMLTableSectionElement.vAlign; @docsEditable true
   String vAlign;
 
-  /** @domName HTMLTableSectionElement.deleteRow */
+  /// @domName HTMLTableSectionElement.deleteRow; @docsEditable true
   void deleteRow(int index) native;
 
-  /** @domName HTMLTableSectionElement.insertRow */
+  /// @domName HTMLTableSectionElement.insertRow; @docsEditable true
   Element insertRow(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16906,13 +17141,13 @@
 class Text extends CharacterData native "*Text" {
   factory Text(String data) => _TextFactoryProvider.createText(data);
 
-  /** @domName Text.wholeText */
+  /// @domName Text.wholeText; @docsEditable true
   final String wholeText;
 
-  /** @domName Text.replaceWholeText */
+  /// @domName Text.replaceWholeText; @docsEditable true
   Text replaceWholeText(String content) native;
 
-  /** @domName Text.splitText */
+  /// @domName Text.splitText; @docsEditable true
   Text splitText(int offset) native;
 
 }
@@ -16921,93 +17156,94 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLTextAreaElement
+/// @domName HTMLTextAreaElement; @docsEditable true
 class TextAreaElement extends Element implements Element native "*HTMLTextAreaElement" {
 
-  factory TextAreaElement() => _Elements.createTextAreaElement();
+  factory TextAreaElement() => document.$dom_createElement("textarea");
 
-  /** @domName HTMLTextAreaElement.autofocus */
+  /// @domName HTMLTextAreaElement.autofocus; @docsEditable true
   bool autofocus;
 
-  /** @domName HTMLTextAreaElement.cols */
+  /// @domName HTMLTextAreaElement.cols; @docsEditable true
   int cols;
 
-  /** @domName HTMLTextAreaElement.defaultValue */
+  /// @domName HTMLTextAreaElement.defaultValue; @docsEditable true
   String defaultValue;
 
-  /** @domName HTMLTextAreaElement.dirName */
+  /// @domName HTMLTextAreaElement.dirName; @docsEditable true
   String dirName;
 
-  /** @domName HTMLTextAreaElement.disabled */
+  /// @domName HTMLTextAreaElement.disabled; @docsEditable true
   bool disabled;
 
-  /** @domName HTMLTextAreaElement.form */
+  /// @domName HTMLTextAreaElement.form; @docsEditable true
   final FormElement form;
 
-  /** @domName HTMLTextAreaElement.labels */
+  /// @domName HTMLTextAreaElement.labels; @docsEditable true
+  @Returns('_NodeList') @Creates('_NodeList')
   final List<Node> labels;
 
-  /** @domName HTMLTextAreaElement.maxLength */
+  /// @domName HTMLTextAreaElement.maxLength; @docsEditable true
   int maxLength;
 
-  /** @domName HTMLTextAreaElement.name */
+  /// @domName HTMLTextAreaElement.name; @docsEditable true
   String name;
 
-  /** @domName HTMLTextAreaElement.placeholder */
+  /// @domName HTMLTextAreaElement.placeholder; @docsEditable true
   String placeholder;
 
-  /** @domName HTMLTextAreaElement.readOnly */
+  /// @domName HTMLTextAreaElement.readOnly; @docsEditable true
   bool readOnly;
 
-  /** @domName HTMLTextAreaElement.required */
+  /// @domName HTMLTextAreaElement.required; @docsEditable true
   bool required;
 
-  /** @domName HTMLTextAreaElement.rows */
+  /// @domName HTMLTextAreaElement.rows; @docsEditable true
   int rows;
 
-  /** @domName HTMLTextAreaElement.selectionDirection */
+  /// @domName HTMLTextAreaElement.selectionDirection; @docsEditable true
   String selectionDirection;
 
-  /** @domName HTMLTextAreaElement.selectionEnd */
+  /// @domName HTMLTextAreaElement.selectionEnd; @docsEditable true
   int selectionEnd;
 
-  /** @domName HTMLTextAreaElement.selectionStart */
+  /// @domName HTMLTextAreaElement.selectionStart; @docsEditable true
   int selectionStart;
 
-  /** @domName HTMLTextAreaElement.textLength */
+  /// @domName HTMLTextAreaElement.textLength; @docsEditable true
   final int textLength;
 
-  /** @domName HTMLTextAreaElement.type */
+  /// @domName HTMLTextAreaElement.type; @docsEditable true
   final String type;
 
-  /** @domName HTMLTextAreaElement.validationMessage */
+  /// @domName HTMLTextAreaElement.validationMessage; @docsEditable true
   final String validationMessage;
 
-  /** @domName HTMLTextAreaElement.validity */
+  /// @domName HTMLTextAreaElement.validity; @docsEditable true
   final ValidityState validity;
 
-  /** @domName HTMLTextAreaElement.value */
+  /// @domName HTMLTextAreaElement.value; @docsEditable true
   String value;
 
-  /** @domName HTMLTextAreaElement.willValidate */
+  /// @domName HTMLTextAreaElement.willValidate; @docsEditable true
   final bool willValidate;
 
-  /** @domName HTMLTextAreaElement.wrap */
+  /// @domName HTMLTextAreaElement.wrap; @docsEditable true
   String wrap;
 
-  /** @domName HTMLTextAreaElement.checkValidity */
+  /// @domName HTMLTextAreaElement.checkValidity; @docsEditable true
   bool checkValidity() native;
 
-  /** @domName HTMLTextAreaElement.select */
+  /// @domName HTMLTextAreaElement.select; @docsEditable true
   void select() native;
 
-  /** @domName HTMLTextAreaElement.setCustomValidity */
+  /// @domName HTMLTextAreaElement.setCustomValidity; @docsEditable true
   void setCustomValidity(String error) native;
 
-  /** @domName HTMLTextAreaElement.setRangeText */
+  /// @domName HTMLTextAreaElement.setRangeText; @docsEditable true
   void setRangeText(String replacement, [int start, int end, String selectionMode]) native;
 
-  /** @domName HTMLTextAreaElement.setSelectionRange */
+  /// @domName HTMLTextAreaElement.setSelectionRange; @docsEditable true
   void setSelectionRange(int start, int end, [String direction]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17015,13 +17251,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName TextEvent
+/// @domName TextEvent; @docsEditable true
 class TextEvent extends UIEvent native "*TextEvent" {
 
-  /** @domName TextEvent.data */
+  /// @domName TextEvent.data; @docsEditable true
   final String data;
 
-  /** @domName TextEvent.initTextEvent */
+  /// @domName TextEvent.initTextEvent; @docsEditable true
   void initTextEvent(String typeArg, bool canBubbleArg, bool cancelableArg, LocalWindow viewArg, String dataArg) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17029,10 +17265,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName TextMetrics
+/// @domName TextMetrics; @docsEditable true
 class TextMetrics native "*TextMetrics" {
 
-  /** @domName TextMetrics.width */
+  /// @domName TextMetrics.width; @docsEditable true
   final num width;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17040,46 +17276,44 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName TextTrack
+/// @domName TextTrack; @docsEditable true
 class TextTrack extends EventTarget native "*TextTrack" {
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   TextTrackEvents get on =>
     new TextTrackEvents(this);
 
-  /** @domName TextTrack.activeCues */
+  /// @domName TextTrack.activeCues; @docsEditable true
   final TextTrackCueList activeCues;
 
-  /** @domName TextTrack.cues */
+  /// @domName TextTrack.cues; @docsEditable true
   final TextTrackCueList cues;
 
-  /** @domName TextTrack.kind */
+  /// @domName TextTrack.kind; @docsEditable true
   final String kind;
 
-  /** @domName TextTrack.label */
+  /// @domName TextTrack.label; @docsEditable true
   final String label;
 
-  /** @domName TextTrack.language */
+  /// @domName TextTrack.language; @docsEditable true
   final String language;
 
-  /** @domName TextTrack.mode */
+  /// @domName TextTrack.mode; @docsEditable true
   String mode;
 
-  /** @domName TextTrack.addCue */
+  /// @domName TextTrack.addCue; @docsEditable true
   void addCue(TextTrackCue cue) native;
 
-  /** @domName TextTrack.addEventListener */
+  /// @domName TextTrack.addEventListener; @docsEditable true
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
 
-  /** @domName TextTrack.dispatchEvent */
+  /// @domName TextTrack.dispatchEvent; @docsEditable true
   bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
 
-  /** @domName TextTrack.removeCue */
+  /// @domName TextTrack.removeCue; @docsEditable true
   void removeCue(TextTrackCue cue) native;
 
-  /** @domName TextTrack.removeEventListener */
+  /// @domName TextTrack.removeEventListener; @docsEditable true
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
 }
 
@@ -17093,63 +17327,61 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName TextTrackCue
+/// @domName TextTrackCue; @docsEditable true
 class TextTrackCue extends EventTarget native "*TextTrackCue" {
 
   factory TextTrackCue(num startTime, num endTime, String text) => _TextTrackCueFactoryProvider.createTextTrackCue(startTime, endTime, text);
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   TextTrackCueEvents get on =>
     new TextTrackCueEvents(this);
 
-  /** @domName TextTrackCue.align */
+  /// @domName TextTrackCue.align; @docsEditable true
   String align;
 
-  /** @domName TextTrackCue.endTime */
+  /// @domName TextTrackCue.endTime; @docsEditable true
   num endTime;
 
-  /** @domName TextTrackCue.id */
+  /// @domName TextTrackCue.id; @docsEditable true
   String id;
 
-  /** @domName TextTrackCue.line */
+  /// @domName TextTrackCue.line; @docsEditable true
   int line;
 
-  /** @domName TextTrackCue.pauseOnExit */
+  /// @domName TextTrackCue.pauseOnExit; @docsEditable true
   bool pauseOnExit;
 
-  /** @domName TextTrackCue.position */
+  /// @domName TextTrackCue.position; @docsEditable true
   int position;
 
-  /** @domName TextTrackCue.size */
+  /// @domName TextTrackCue.size; @docsEditable true
   int size;
 
-  /** @domName TextTrackCue.snapToLines */
+  /// @domName TextTrackCue.snapToLines; @docsEditable true
   bool snapToLines;
 
-  /** @domName TextTrackCue.startTime */
+  /// @domName TextTrackCue.startTime; @docsEditable true
   num startTime;
 
-  /** @domName TextTrackCue.text */
+  /// @domName TextTrackCue.text; @docsEditable true
   String text;
 
-  /** @domName TextTrackCue.track */
+  /// @domName TextTrackCue.track; @docsEditable true
   final TextTrack track;
 
-  /** @domName TextTrackCue.vertical */
+  /// @domName TextTrackCue.vertical; @docsEditable true
   String vertical;
 
-  /** @domName TextTrackCue.addEventListener */
+  /// @domName TextTrackCue.addEventListener; @docsEditable true
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
 
-  /** @domName TextTrackCue.dispatchEvent */
+  /// @domName TextTrackCue.dispatchEvent; @docsEditable true
   bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
 
-  /** @domName TextTrackCue.getCueAsHTML */
+  /// @domName TextTrackCue.getCueAsHTML; @docsEditable true
   DocumentFragment getCueAsHTML() native;
 
-  /** @domName TextTrackCue.removeEventListener */
+  /// @domName TextTrackCue.removeEventListener; @docsEditable true
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
 }
 
@@ -17165,10 +17397,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName TextTrackCueList
+/// @domName TextTrackCueList; @docsEditable true
 class TextTrackCueList implements List<TextTrackCue>, JavaScriptIndexingBehavior native "*TextTrackCueList" {
 
-  /** @domName TextTrackCueList.length */
+  /// @domName TextTrackCueList.length; @docsEditable true
   final int length;
 
   TextTrackCue operator[](int index) => JS("TextTrackCue", "#[#]", this, index);
@@ -17231,6 +17463,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  TextTrackCue get first => this[0];
+
   TextTrackCue get last => this[length - 1];
 
   TextTrackCue removeLast() {
@@ -17254,10 +17488,10 @@
 
   // -- end List<TextTrackCue> mixins.
 
-  /** @domName TextTrackCueList.getCueById */
+  /// @domName TextTrackCueList.getCueById; @docsEditable true
   TextTrackCue getCueById(String id) native;
 
-  /** @domName TextTrackCueList.item */
+  /// @domName TextTrackCueList.item; @docsEditable true
   TextTrackCue item(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17265,16 +17499,14 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName TextTrackList
+/// @domName TextTrackList; @docsEditable true
 class TextTrackList extends EventTarget implements JavaScriptIndexingBehavior, List<TextTrack> native "*TextTrackList" {
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   TextTrackListEvents get on =>
     new TextTrackListEvents(this);
 
-  /** @domName TextTrackList.length */
+  /// @domName TextTrackList.length; @docsEditable true
   final int length;
 
   TextTrack operator[](int index) => JS("TextTrack", "#[#]", this, index);
@@ -17337,6 +17569,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  TextTrack get first => this[0];
+
   TextTrack get last => this[length - 1];
 
   TextTrack removeLast() {
@@ -17360,16 +17594,16 @@
 
   // -- end List<TextTrack> mixins.
 
-  /** @domName TextTrackList.addEventListener */
+  /// @domName TextTrackList.addEventListener; @docsEditable true
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
 
-  /** @domName TextTrackList.dispatchEvent */
+  /// @domName TextTrackList.dispatchEvent; @docsEditable true
   bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
 
-  /** @domName TextTrackList.item */
+  /// @domName TextTrackList.item; @docsEditable true
   TextTrack item(int index) native;
 
-  /** @domName TextTrackList.removeEventListener */
+  /// @domName TextTrackList.removeEventListener; @docsEditable true
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
 }
 
@@ -17383,16 +17617,16 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName TimeRanges
+/// @domName TimeRanges; @docsEditable true
 class TimeRanges native "*TimeRanges" {
 
-  /** @domName TimeRanges.length */
+  /// @domName TimeRanges.length; @docsEditable true
   final int length;
 
-  /** @domName TimeRanges.end */
+  /// @domName TimeRanges.end; @docsEditable true
   num end(int index) native;
 
-  /** @domName TimeRanges.start */
+  /// @domName TimeRanges.start; @docsEditable true
   num start(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17408,54 +17642,54 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLTitleElement
+/// @domName HTMLTitleElement; @docsEditable true
 class TitleElement extends Element implements Element native "*HTMLTitleElement" {
 
-  factory TitleElement() => _Elements.createTitleElement();
+  factory TitleElement() => document.$dom_createElement("title");
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for 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 Touch
+/// @domName Touch; @docsEditable true
 class Touch native "*Touch" {
 
-  /** @domName Touch.clientX */
+  /// @domName Touch.clientX; @docsEditable true
   final int clientX;
 
-  /** @domName Touch.clientY */
+  /// @domName Touch.clientY; @docsEditable true
   final int clientY;
 
-  /** @domName Touch.identifier */
+  /// @domName Touch.identifier; @docsEditable true
   final int identifier;
 
-  /** @domName Touch.pageX */
+  /// @domName Touch.pageX; @docsEditable true
   final int pageX;
 
-  /** @domName Touch.pageY */
+  /// @domName Touch.pageY; @docsEditable true
   final int pageY;
 
-  /** @domName Touch.screenX */
+  /// @domName Touch.screenX; @docsEditable true
   final int screenX;
 
-  /** @domName Touch.screenY */
+  /// @domName Touch.screenY; @docsEditable true
   final int screenY;
 
-  /** @domName Touch.target */
+  /// @domName Touch.target; @docsEditable true
   EventTarget get target => _convertNativeToDart_EventTarget(this._target);
   dynamic get _target => JS("dynamic", "#.target", this);
 
-  /** @domName Touch.webkitForce */
+  /// @domName Touch.webkitForce; @docsEditable true
   final num webkitForce;
 
-  /** @domName Touch.webkitRadiusX */
+  /// @domName Touch.webkitRadiusX; @docsEditable true
   final int webkitRadiusX;
 
-  /** @domName Touch.webkitRadiusY */
+  /// @domName Touch.webkitRadiusY; @docsEditable true
   final int webkitRadiusY;
 
-  /** @domName Touch.webkitRotationAngle */
+  /// @domName Touch.webkitRotationAngle; @docsEditable true
   final num webkitRotationAngle;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17463,31 +17697,31 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName TouchEvent
+/// @domName TouchEvent; @docsEditable true
 class TouchEvent extends UIEvent native "*TouchEvent" {
 
-  /** @domName TouchEvent.altKey */
+  /// @domName TouchEvent.altKey; @docsEditable true
   final bool altKey;
 
-  /** @domName TouchEvent.changedTouches */
+  /// @domName TouchEvent.changedTouches; @docsEditable true
   final TouchList changedTouches;
 
-  /** @domName TouchEvent.ctrlKey */
+  /// @domName TouchEvent.ctrlKey; @docsEditable true
   final bool ctrlKey;
 
-  /** @domName TouchEvent.metaKey */
+  /// @domName TouchEvent.metaKey; @docsEditable true
   final bool metaKey;
 
-  /** @domName TouchEvent.shiftKey */
+  /// @domName TouchEvent.shiftKey; @docsEditable true
   final bool shiftKey;
 
-  /** @domName TouchEvent.targetTouches */
+  /// @domName TouchEvent.targetTouches; @docsEditable true
   final TouchList targetTouches;
 
-  /** @domName TouchEvent.touches */
+  /// @domName TouchEvent.touches; @docsEditable true
   final TouchList touches;
 
-  /** @domName TouchEvent.initTouchEvent */
+  /// @domName TouchEvent.initTouchEvent; @docsEditable true
   void initTouchEvent(TouchList touches, TouchList targetTouches, TouchList changedTouches, String type, LocalWindow view, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17495,10 +17729,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName TouchList
+/// @domName TouchList; @docsEditable true
 class TouchList implements JavaScriptIndexingBehavior, List<Touch> native "*TouchList" {
 
-  /** @domName TouchList.length */
+  /// @domName TouchList.length; @docsEditable true
   final int length;
 
   Touch operator[](int index) => JS("Touch", "#[#]", this, index);
@@ -17561,6 +17795,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  Touch get first => this[0];
+
   Touch get last => this[length - 1];
 
   Touch removeLast() {
@@ -17584,7 +17820,7 @@
 
   // -- end List<Touch> mixins.
 
-  /** @domName TouchList.item */
+  /// @domName TouchList.item; @docsEditable true
   Touch item(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17592,10 +17828,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLTrackElement
+/// @domName HTMLTrackElement; @docsEditable true
 class TrackElement extends Element implements Element native "*HTMLTrackElement" {
 
-  factory TrackElement() => _Elements.createTrackElement();
+  factory TrackElement() => document.$dom_createElement("track");
 
   static const int ERROR = 3;
 
@@ -17605,30 +17841,30 @@
 
   static const int NONE = 0;
 
-  /** @domName HTMLTrackElement.defaultValue */
+  /// @domName HTMLTrackElement.defaultValue; @docsEditable true
   bool get defaultValue => JS("bool", "#.default", this);
 
-  /** @domName HTMLTrackElement.defaultValue */
+  /// @domName HTMLTrackElement.defaultValue; @docsEditable true
   void set defaultValue(bool value) {
     JS("void", "#.default = #", this, value);
   }
 
-  /** @domName HTMLTrackElement.kind */
+  /// @domName HTMLTrackElement.kind; @docsEditable true
   String kind;
 
-  /** @domName HTMLTrackElement.label */
+  /// @domName HTMLTrackElement.label; @docsEditable true
   String label;
 
-  /** @domName HTMLTrackElement.readyState */
+  /// @domName HTMLTrackElement.readyState; @docsEditable true
   final int readyState;
 
-  /** @domName HTMLTrackElement.src */
+  /// @domName HTMLTrackElement.src; @docsEditable true
   String src;
 
-  /** @domName HTMLTrackElement.srclang */
+  /// @domName HTMLTrackElement.srclang; @docsEditable true
   String srclang;
 
-  /** @domName HTMLTrackElement.track */
+  /// @domName HTMLTrackElement.track; @docsEditable true
   final TextTrack track;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17636,10 +17872,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName TrackEvent
+/// @domName TrackEvent; @docsEditable true
 class TrackEvent extends Event native "*TrackEvent" {
 
-  /** @domName TrackEvent.track */
+  /// @domName TrackEvent.track; @docsEditable true
   final Object track;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17647,13 +17883,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WebKitTransitionEvent
+/// @domName WebKitTransitionEvent; @docsEditable true
 class TransitionEvent extends Event native "*WebKitTransitionEvent" {
 
-  /** @domName WebKitTransitionEvent.elapsedTime */
+  /// @domName WebKitTransitionEvent.elapsedTime; @docsEditable true
   final num elapsedTime;
 
-  /** @domName WebKitTransitionEvent.propertyName */
+  /// @domName WebKitTransitionEvent.propertyName; @docsEditable true
   final String propertyName;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17661,43 +17897,43 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName TreeWalker
+/// @domName TreeWalker; @docsEditable true
 class TreeWalker native "*TreeWalker" {
 
-  /** @domName TreeWalker.currentNode */
+  /// @domName TreeWalker.currentNode; @docsEditable true
   Node currentNode;
 
-  /** @domName TreeWalker.expandEntityReferences */
+  /// @domName TreeWalker.expandEntityReferences; @docsEditable true
   final bool expandEntityReferences;
 
-  /** @domName TreeWalker.filter */
+  /// @domName TreeWalker.filter; @docsEditable true
   final NodeFilter filter;
 
-  /** @domName TreeWalker.root */
+  /// @domName TreeWalker.root; @docsEditable true
   final Node root;
 
-  /** @domName TreeWalker.whatToShow */
+  /// @domName TreeWalker.whatToShow; @docsEditable true
   final int whatToShow;
 
-  /** @domName TreeWalker.firstChild */
+  /// @domName TreeWalker.firstChild; @docsEditable true
   Node firstChild() native;
 
-  /** @domName TreeWalker.lastChild */
+  /// @domName TreeWalker.lastChild; @docsEditable true
   Node lastChild() native;
 
-  /** @domName TreeWalker.nextNode */
+  /// @domName TreeWalker.nextNode; @docsEditable true
   Node nextNode() native;
 
-  /** @domName TreeWalker.nextSibling */
+  /// @domName TreeWalker.nextSibling; @docsEditable true
   Node nextSibling() native;
 
-  /** @domName TreeWalker.parentNode */
+  /// @domName TreeWalker.parentNode; @docsEditable true
   Node parentNode() native;
 
-  /** @domName TreeWalker.previousNode */
+  /// @domName TreeWalker.previousNode; @docsEditable true
   Node previousNode() native;
 
-  /** @domName TreeWalker.previousSibling */
+  /// @domName TreeWalker.previousSibling; @docsEditable true
   Node previousSibling() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17705,38 +17941,38 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName UIEvent
+/// @domName UIEvent; @docsEditable true
 class UIEvent extends Event native "*UIEvent" {
 
-  /** @domName UIEvent.charCode */
+  /// @domName UIEvent.charCode; @docsEditable true
   final int charCode;
 
-  /** @domName UIEvent.detail */
+  /// @domName UIEvent.detail; @docsEditable true
   final int detail;
 
-  /** @domName UIEvent.keyCode */
+  /// @domName UIEvent.keyCode; @docsEditable true
   final int keyCode;
 
-  /** @domName UIEvent.layerX */
+  /// @domName UIEvent.layerX; @docsEditable true
   final int layerX;
 
-  /** @domName UIEvent.layerY */
+  /// @domName UIEvent.layerY; @docsEditable true
   final int layerY;
 
-  /** @domName UIEvent.pageX */
+  /// @domName UIEvent.pageX; @docsEditable true
   final int pageX;
 
-  /** @domName UIEvent.pageY */
+  /// @domName UIEvent.pageY; @docsEditable true
   final int pageY;
 
-  /** @domName UIEvent.view */
+  /// @domName UIEvent.view; @docsEditable true
   Window get view => _convertNativeToDart_Window(this._view);
   dynamic get _view => JS("dynamic", "#.view", this);
 
-  /** @domName UIEvent.which */
+  /// @domName UIEvent.which; @docsEditable true
   final int which;
 
-  /** @domName UIEvent.initUIEvent */
+  /// @domName UIEvent.initUIEvent; @docsEditable true
   void initUIEvent(String type, bool canBubble, bool cancelable, LocalWindow view, int detail) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17744,15 +17980,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLUListElement
+/// @domName HTMLUListElement; @docsEditable true
 class UListElement extends Element implements Element native "*HTMLUListElement" {
 
-  factory UListElement() => _Elements.createUListElement();
+  factory UListElement() => document.$dom_createElement("ul");
 
-  /** @domName HTMLUListElement.compact */
+  /// @domName HTMLUListElement.compact; @docsEditable true
   bool compact;
 
-  /** @domName HTMLUListElement.type */
+  /// @domName HTMLUListElement.type; @docsEditable true
   String type;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17760,7 +17996,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Uint16Array
+/// @domName Uint16Array; @docsEditable true
 class Uint16Array extends ArrayBufferView implements JavaScriptIndexingBehavior, List<int> native "*Uint16Array" {
 
   factory Uint16Array(int length) =>
@@ -17774,13 +18010,12 @@
 
   static const int BYTES_PER_ELEMENT = 2;
 
-  /** @domName Uint16Array.length */
+  /// @domName Uint16Array.length; @docsEditable true
   final int length;
 
   int operator[](int index) => JS("int", "#[#]", this, index);
 
-  void operator[]=(int index, int value) => JS("void", "#[#] = #", this, index, value);
-  // -- start List<int> mixins.
+  void operator[]=(int index, int value) { JS("void", "#[#] = #", this, index, value); }  // -- start List<int> mixins.
   // int is the element type.
 
   // From Iterable<int>:
@@ -17835,6 +18070,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  int get first => this[0];
+
   int get last => this[length - 1];
 
   int removeLast() {
@@ -17858,10 +18095,10 @@
 
   // -- end List<int> mixins.
 
-  /** @domName Uint16Array.setElements */
+  /// @domName Uint16Array.setElements; @docsEditable true
   void setElements(Object array, [int offset]) native "set";
 
-  /** @domName Uint16Array.subarray */
+  /// @domName Uint16Array.subarray; @docsEditable true
   Uint16Array subarray(int start, [int end]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17869,7 +18106,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Uint32Array
+/// @domName Uint32Array; @docsEditable true
 class Uint32Array extends ArrayBufferView implements JavaScriptIndexingBehavior, List<int> native "*Uint32Array" {
 
   factory Uint32Array(int length) =>
@@ -17883,13 +18120,12 @@
 
   static const int BYTES_PER_ELEMENT = 4;
 
-  /** @domName Uint32Array.length */
+  /// @domName Uint32Array.length; @docsEditable true
   final int length;
 
   int operator[](int index) => JS("int", "#[#]", this, index);
 
-  void operator[]=(int index, int value) => JS("void", "#[#] = #", this, index, value);
-  // -- start List<int> mixins.
+  void operator[]=(int index, int value) { JS("void", "#[#] = #", this, index, value); }  // -- start List<int> mixins.
   // int is the element type.
 
   // From Iterable<int>:
@@ -17944,6 +18180,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  int get first => this[0];
+
   int get last => this[length - 1];
 
   int removeLast() {
@@ -17967,10 +18205,10 @@
 
   // -- end List<int> mixins.
 
-  /** @domName Uint32Array.setElements */
+  /// @domName Uint32Array.setElements; @docsEditable true
   void setElements(Object array, [int offset]) native "set";
 
-  /** @domName Uint32Array.subarray */
+  /// @domName Uint32Array.subarray; @docsEditable true
   Uint32Array subarray(int start, [int end]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17978,7 +18216,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Uint8Array
+/// @domName Uint8Array; @docsEditable true
 class Uint8Array extends ArrayBufferView implements JavaScriptIndexingBehavior, List<int> native "*Uint8Array" {
 
   factory Uint8Array(int length) =>
@@ -17992,13 +18230,12 @@
 
   static const int BYTES_PER_ELEMENT = 1;
 
-  /** @domName Uint8Array.length */
+  /// @domName Uint8Array.length; @docsEditable true
   final int length;
 
   int operator[](int index) => JS("int", "#[#]", this, index);
 
-  void operator[]=(int index, int value) => JS("void", "#[#] = #", this, index, value);
-  // -- start List<int> mixins.
+  void operator[]=(int index, int value) { JS("void", "#[#] = #", this, index, value); }  // -- start List<int> mixins.
   // int is the element type.
 
   // From Iterable<int>:
@@ -18053,6 +18290,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  int get first => this[0];
+
   int get last => this[length - 1];
 
   int removeLast() {
@@ -18076,10 +18315,10 @@
 
   // -- end List<int> mixins.
 
-  /** @domName Uint8Array.setElements */
+  /// @domName Uint8Array.setElements; @docsEditable true
   void setElements(Object array, [int offset]) native "set";
 
-  /** @domName Uint8Array.subarray */
+  /// @domName Uint8Array.subarray; @docsEditable true
   Uint8Array subarray(int start, [int end]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18087,7 +18326,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Uint8ClampedArray
+/// @domName Uint8ClampedArray; @docsEditable true
 class Uint8ClampedArray extends Uint8Array native "*Uint8ClampedArray" {
 
   factory Uint8ClampedArray(int length) =>
@@ -18102,10 +18341,10 @@
   // Use implementation from Uint8Array.
   // final int length;
 
-  /** @domName Uint8ClampedArray.setElements */
+  /// @domName Uint8ClampedArray.setElements; @docsEditable true
   void setElements(Object array, [int offset]) native "set";
 
-  /** @domName Uint8ClampedArray.subarray */
+  /// @domName Uint8ClampedArray.subarray; @docsEditable true
   Uint8ClampedArray subarray(int start, [int end]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18113,7 +18352,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLUnknownElement
+/// @domName HTMLUnknownElement; @docsEditable true
 class UnknownElement extends Element implements Element native "*HTMLUnknownElement" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18138,34 +18377,34 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName ValidityState
+/// @domName ValidityState; @docsEditable true
 class ValidityState native "*ValidityState" {
 
-  /** @domName ValidityState.customError */
+  /// @domName ValidityState.customError; @docsEditable true
   final bool customError;
 
-  /** @domName ValidityState.patternMismatch */
+  /// @domName ValidityState.patternMismatch; @docsEditable true
   final bool patternMismatch;
 
-  /** @domName ValidityState.rangeOverflow */
+  /// @domName ValidityState.rangeOverflow; @docsEditable true
   final bool rangeOverflow;
 
-  /** @domName ValidityState.rangeUnderflow */
+  /// @domName ValidityState.rangeUnderflow; @docsEditable true
   final bool rangeUnderflow;
 
-  /** @domName ValidityState.stepMismatch */
+  /// @domName ValidityState.stepMismatch; @docsEditable true
   final bool stepMismatch;
 
-  /** @domName ValidityState.tooLong */
+  /// @domName ValidityState.tooLong; @docsEditable true
   final bool tooLong;
 
-  /** @domName ValidityState.typeMismatch */
+  /// @domName ValidityState.typeMismatch; @docsEditable true
   final bool typeMismatch;
 
-  /** @domName ValidityState.valid */
+  /// @domName ValidityState.valid; @docsEditable true
   final bool valid;
 
-  /** @domName ValidityState.valueMissing */
+  /// @domName ValidityState.valueMissing; @docsEditable true
   final bool valueMissing;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18173,48 +18412,48 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName HTMLVideoElement
+/// @domName HTMLVideoElement; @docsEditable true
 class VideoElement extends MediaElement native "*HTMLVideoElement" {
 
-  factory VideoElement() => _Elements.createVideoElement();
+  factory VideoElement() => document.$dom_createElement("video");
 
-  /** @domName HTMLVideoElement.height */
+  /// @domName HTMLVideoElement.height; @docsEditable true
   int height;
 
-  /** @domName HTMLVideoElement.poster */
+  /// @domName HTMLVideoElement.poster; @docsEditable true
   String poster;
 
-  /** @domName HTMLVideoElement.videoHeight */
+  /// @domName HTMLVideoElement.videoHeight; @docsEditable true
   final int videoHeight;
 
-  /** @domName HTMLVideoElement.videoWidth */
+  /// @domName HTMLVideoElement.videoWidth; @docsEditable true
   final int videoWidth;
 
-  /** @domName HTMLVideoElement.webkitDecodedFrameCount */
+  /// @domName HTMLVideoElement.webkitDecodedFrameCount; @docsEditable true
   final int webkitDecodedFrameCount;
 
-  /** @domName HTMLVideoElement.webkitDisplayingFullscreen */
+  /// @domName HTMLVideoElement.webkitDisplayingFullscreen; @docsEditable true
   final bool webkitDisplayingFullscreen;
 
-  /** @domName HTMLVideoElement.webkitDroppedFrameCount */
+  /// @domName HTMLVideoElement.webkitDroppedFrameCount; @docsEditable true
   final int webkitDroppedFrameCount;
 
-  /** @domName HTMLVideoElement.webkitSupportsFullscreen */
+  /// @domName HTMLVideoElement.webkitSupportsFullscreen; @docsEditable true
   final bool webkitSupportsFullscreen;
 
-  /** @domName HTMLVideoElement.width */
+  /// @domName HTMLVideoElement.width; @docsEditable true
   int width;
 
-  /** @domName HTMLVideoElement.webkitEnterFullScreen */
+  /// @domName HTMLVideoElement.webkitEnterFullScreen; @docsEditable true
   void webkitEnterFullScreen() native;
 
-  /** @domName HTMLVideoElement.webkitEnterFullscreen */
+  /// @domName HTMLVideoElement.webkitEnterFullscreen; @docsEditable true
   void webkitEnterFullscreen() native;
 
-  /** @domName HTMLVideoElement.webkitExitFullScreen */
+  /// @domName HTMLVideoElement.webkitExitFullScreen; @docsEditable true
   void webkitExitFullScreen() native;
 
-  /** @domName HTMLVideoElement.webkitExitFullscreen */
+  /// @domName HTMLVideoElement.webkitExitFullscreen; @docsEditable true
   void webkitExitFullscreen() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18230,10 +18469,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WaveShaperNode
+/// @domName WaveShaperNode; @docsEditable true
 class WaveShaperNode extends AudioNode native "*WaveShaperNode" {
 
-  /** @domName WaveShaperNode.curve */
+  /// @domName WaveShaperNode.curve; @docsEditable true
   Float32Array curve;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18241,7 +18480,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WaveTable
+/// @domName WaveTable; @docsEditable true
 class WaveTable native "*WaveTable" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18249,16 +18488,16 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WebGLActiveInfo
+/// @domName WebGLActiveInfo; @docsEditable true
 class WebGLActiveInfo native "*WebGLActiveInfo" {
 
-  /** @domName WebGLActiveInfo.name */
+  /// @domName WebGLActiveInfo.name; @docsEditable true
   final String name;
 
-  /** @domName WebGLActiveInfo.size */
+  /// @domName WebGLActiveInfo.size; @docsEditable true
   final int size;
 
-  /** @domName WebGLActiveInfo.type */
+  /// @domName WebGLActiveInfo.type; @docsEditable true
   final int type;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18266,7 +18505,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WebGLBuffer
+/// @domName WebGLBuffer; @docsEditable true
 class WebGLBuffer native "*WebGLBuffer" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18274,7 +18513,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WebGLCompressedTextureS3TC
+/// @domName WebGLCompressedTextureS3TC; @docsEditable true
 class WebGLCompressedTextureS3TC native "*WebGLCompressedTextureS3TC" {
 
   static const int COMPRESSED_RGBA_S3TC_DXT1_EXT = 0x83F1;
@@ -18290,25 +18529,25 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WebGLContextAttributes
+/// @domName WebGLContextAttributes; @docsEditable true
 class WebGLContextAttributes native "*WebGLContextAttributes" {
 
-  /** @domName WebGLContextAttributes.alpha */
+  /// @domName WebGLContextAttributes.alpha; @docsEditable true
   bool alpha;
 
-  /** @domName WebGLContextAttributes.antialias */
+  /// @domName WebGLContextAttributes.antialias; @docsEditable true
   bool antialias;
 
-  /** @domName WebGLContextAttributes.depth */
+  /// @domName WebGLContextAttributes.depth; @docsEditable true
   bool depth;
 
-  /** @domName WebGLContextAttributes.premultipliedAlpha */
+  /// @domName WebGLContextAttributes.premultipliedAlpha; @docsEditable true
   bool premultipliedAlpha;
 
-  /** @domName WebGLContextAttributes.preserveDrawingBuffer */
+  /// @domName WebGLContextAttributes.preserveDrawingBuffer; @docsEditable true
   bool preserveDrawingBuffer;
 
-  /** @domName WebGLContextAttributes.stencil */
+  /// @domName WebGLContextAttributes.stencil; @docsEditable true
   bool stencil;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18316,10 +18555,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WebGLContextEvent
+/// @domName WebGLContextEvent; @docsEditable true
 class WebGLContextEvent extends Event native "*WebGLContextEvent" {
 
-  /** @domName WebGLContextEvent.statusMessage */
+  /// @domName WebGLContextEvent.statusMessage; @docsEditable true
   final String statusMessage;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18327,7 +18566,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WebGLDebugRendererInfo
+/// @domName WebGLDebugRendererInfo; @docsEditable true
 class WebGLDebugRendererInfo native "*WebGLDebugRendererInfo" {
 
   static const int UNMASKED_RENDERER_WEBGL = 0x9246;
@@ -18339,10 +18578,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WebGLDebugShaders
+/// @domName WebGLDebugShaders; @docsEditable true
 class WebGLDebugShaders native "*WebGLDebugShaders" {
 
-  /** @domName WebGLDebugShaders.getTranslatedShaderSource */
+  /// @domName WebGLDebugShaders.getTranslatedShaderSource; @docsEditable true
   String getTranslatedShaderSource(WebGLShader shader) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18350,7 +18589,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WebGLDepthTexture
+/// @domName WebGLDepthTexture; @docsEditable true
 class WebGLDepthTexture native "*WebGLDepthTexture" {
 
   static const int UNSIGNED_INT_24_8_WEBGL = 0x84FA;
@@ -18360,7 +18599,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WebGLFramebuffer
+/// @domName WebGLFramebuffer; @docsEditable true
 class WebGLFramebuffer native "*WebGLFramebuffer" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18368,13 +18607,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WebGLLoseContext
+/// @domName WebGLLoseContext; @docsEditable true
 class WebGLLoseContext native "*WebGLLoseContext" {
 
-  /** @domName WebGLLoseContext.loseContext */
+  /// @domName WebGLLoseContext.loseContext; @docsEditable true
   void loseContext() native;
 
-  /** @domName WebGLLoseContext.restoreContext */
+  /// @domName WebGLLoseContext.restoreContext; @docsEditable true
   void restoreContext() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18382,7 +18621,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WebGLProgram
+/// @domName WebGLProgram; @docsEditable true
 class WebGLProgram native "*WebGLProgram" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18390,7 +18629,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WebGLRenderbuffer
+/// @domName WebGLRenderbuffer; @docsEditable true
 class WebGLRenderbuffer native "*WebGLRenderbuffer" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18398,7 +18637,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WebGLRenderingContext
+/// @domName WebGLRenderingContext; @docsEditable true
 class WebGLRenderingContext extends CanvasRenderingContext native "*WebGLRenderingContext" {
 
   static const int ACTIVE_ATTRIBUTES = 0x8B89;
@@ -18991,319 +19230,319 @@
 
   static const int ZERO = 0;
 
-  /** @domName WebGLRenderingContext.drawingBufferHeight */
+  /// @domName WebGLRenderingContext.drawingBufferHeight; @docsEditable true
   final int drawingBufferHeight;
 
-  /** @domName WebGLRenderingContext.drawingBufferWidth */
+  /// @domName WebGLRenderingContext.drawingBufferWidth; @docsEditable true
   final int drawingBufferWidth;
 
-  /** @domName WebGLRenderingContext.activeTexture */
+  /// @domName WebGLRenderingContext.activeTexture; @docsEditable true
   void activeTexture(int texture) native;
 
-  /** @domName WebGLRenderingContext.attachShader */
+  /// @domName WebGLRenderingContext.attachShader; @docsEditable true
   void attachShader(WebGLProgram program, WebGLShader shader) native;
 
-  /** @domName WebGLRenderingContext.bindAttribLocation */
+  /// @domName WebGLRenderingContext.bindAttribLocation; @docsEditable true
   void bindAttribLocation(WebGLProgram program, int index, String name) native;
 
-  /** @domName WebGLRenderingContext.bindBuffer */
+  /// @domName WebGLRenderingContext.bindBuffer; @docsEditable true
   void bindBuffer(int target, WebGLBuffer buffer) native;
 
-  /** @domName WebGLRenderingContext.bindFramebuffer */
+  /// @domName WebGLRenderingContext.bindFramebuffer; @docsEditable true
   void bindFramebuffer(int target, WebGLFramebuffer framebuffer) native;
 
-  /** @domName WebGLRenderingContext.bindRenderbuffer */
+  /// @domName WebGLRenderingContext.bindRenderbuffer; @docsEditable true
   void bindRenderbuffer(int target, WebGLRenderbuffer renderbuffer) native;
 
-  /** @domName WebGLRenderingContext.bindTexture */
+  /// @domName WebGLRenderingContext.bindTexture; @docsEditable true
   void bindTexture(int target, WebGLTexture texture) native;
 
-  /** @domName WebGLRenderingContext.blendColor */
+  /// @domName WebGLRenderingContext.blendColor; @docsEditable true
   void blendColor(num red, num green, num blue, num alpha) native;
 
-  /** @domName WebGLRenderingContext.blendEquation */
+  /// @domName WebGLRenderingContext.blendEquation; @docsEditable true
   void blendEquation(int mode) native;
 
-  /** @domName WebGLRenderingContext.blendEquationSeparate */
+  /// @domName WebGLRenderingContext.blendEquationSeparate; @docsEditable true
   void blendEquationSeparate(int modeRGB, int modeAlpha) native;
 
-  /** @domName WebGLRenderingContext.blendFunc */
+  /// @domName WebGLRenderingContext.blendFunc; @docsEditable true
   void blendFunc(int sfactor, int dfactor) native;
 
-  /** @domName WebGLRenderingContext.blendFuncSeparate */
+  /// @domName WebGLRenderingContext.blendFuncSeparate; @docsEditable true
   void blendFuncSeparate(int srcRGB, int dstRGB, int srcAlpha, int dstAlpha) native;
 
-  /** @domName WebGLRenderingContext.bufferData */
+  /// @domName WebGLRenderingContext.bufferData; @docsEditable true
   void bufferData(int target, data_OR_size, int usage) native;
 
-  /** @domName WebGLRenderingContext.bufferSubData */
+  /// @domName WebGLRenderingContext.bufferSubData; @docsEditable true
   void bufferSubData(int target, int offset, data) native;
 
-  /** @domName WebGLRenderingContext.checkFramebufferStatus */
+  /// @domName WebGLRenderingContext.checkFramebufferStatus; @docsEditable true
   int checkFramebufferStatus(int target) native;
 
-  /** @domName WebGLRenderingContext.clear */
+  /// @domName WebGLRenderingContext.clear; @docsEditable true
   void clear(int mask) native;
 
-  /** @domName WebGLRenderingContext.clearColor */
+  /// @domName WebGLRenderingContext.clearColor; @docsEditable true
   void clearColor(num red, num green, num blue, num alpha) native;
 
-  /** @domName WebGLRenderingContext.clearDepth */
+  /// @domName WebGLRenderingContext.clearDepth; @docsEditable true
   void clearDepth(num depth) native;
 
-  /** @domName WebGLRenderingContext.clearStencil */
+  /// @domName WebGLRenderingContext.clearStencil; @docsEditable true
   void clearStencil(int s) native;
 
-  /** @domName WebGLRenderingContext.colorMask */
+  /// @domName WebGLRenderingContext.colorMask; @docsEditable true
   void colorMask(bool red, bool green, bool blue, bool alpha) native;
 
-  /** @domName WebGLRenderingContext.compileShader */
+  /// @domName WebGLRenderingContext.compileShader; @docsEditable true
   void compileShader(WebGLShader shader) native;
 
-  /** @domName WebGLRenderingContext.compressedTexImage2D */
+  /// @domName WebGLRenderingContext.compressedTexImage2D; @docsEditable true
   void compressedTexImage2D(int target, int level, int internalformat, int width, int height, int border, ArrayBufferView data) native;
 
-  /** @domName WebGLRenderingContext.compressedTexSubImage2D */
+  /// @domName WebGLRenderingContext.compressedTexSubImage2D; @docsEditable true
   void compressedTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, ArrayBufferView data) native;
 
-  /** @domName WebGLRenderingContext.copyTexImage2D */
+  /// @domName WebGLRenderingContext.copyTexImage2D; @docsEditable true
   void copyTexImage2D(int target, int level, int internalformat, int x, int y, int width, int height, int border) native;
 
-  /** @domName WebGLRenderingContext.copyTexSubImage2D */
+  /// @domName WebGLRenderingContext.copyTexSubImage2D; @docsEditable true
   void copyTexSubImage2D(int target, int level, int xoffset, int yoffset, int x, int y, int width, int height) native;
 
-  /** @domName WebGLRenderingContext.createBuffer */
+  /// @domName WebGLRenderingContext.createBuffer; @docsEditable true
   WebGLBuffer createBuffer() native;
 
-  /** @domName WebGLRenderingContext.createFramebuffer */
+  /// @domName WebGLRenderingContext.createFramebuffer; @docsEditable true
   WebGLFramebuffer createFramebuffer() native;
 
-  /** @domName WebGLRenderingContext.createProgram */
+  /// @domName WebGLRenderingContext.createProgram; @docsEditable true
   WebGLProgram createProgram() native;
 
-  /** @domName WebGLRenderingContext.createRenderbuffer */
+  /// @domName WebGLRenderingContext.createRenderbuffer; @docsEditable true
   WebGLRenderbuffer createRenderbuffer() native;
 
-  /** @domName WebGLRenderingContext.createShader */
+  /// @domName WebGLRenderingContext.createShader; @docsEditable true
   WebGLShader createShader(int type) native;
 
-  /** @domName WebGLRenderingContext.createTexture */
+  /// @domName WebGLRenderingContext.createTexture; @docsEditable true
   WebGLTexture createTexture() native;
 
-  /** @domName WebGLRenderingContext.cullFace */
+  /// @domName WebGLRenderingContext.cullFace; @docsEditable true
   void cullFace(int mode) native;
 
-  /** @domName WebGLRenderingContext.deleteBuffer */
+  /// @domName WebGLRenderingContext.deleteBuffer; @docsEditable true
   void deleteBuffer(WebGLBuffer buffer) native;
 
-  /** @domName WebGLRenderingContext.deleteFramebuffer */
+  /// @domName WebGLRenderingContext.deleteFramebuffer; @docsEditable true
   void deleteFramebuffer(WebGLFramebuffer framebuffer) native;
 
-  /** @domName WebGLRenderingContext.deleteProgram */
+  /// @domName WebGLRenderingContext.deleteProgram; @docsEditable true
   void deleteProgram(WebGLProgram program) native;
 
-  /** @domName WebGLRenderingContext.deleteRenderbuffer */
+  /// @domName WebGLRenderingContext.deleteRenderbuffer; @docsEditable true
   void deleteRenderbuffer(WebGLRenderbuffer renderbuffer) native;
 
-  /** @domName WebGLRenderingContext.deleteShader */
+  /// @domName WebGLRenderingContext.deleteShader; @docsEditable true
   void deleteShader(WebGLShader shader) native;
 
-  /** @domName WebGLRenderingContext.deleteTexture */
+  /// @domName WebGLRenderingContext.deleteTexture; @docsEditable true
   void deleteTexture(WebGLTexture texture) native;
 
-  /** @domName WebGLRenderingContext.depthFunc */
+  /// @domName WebGLRenderingContext.depthFunc; @docsEditable true
   void depthFunc(int func) native;
 
-  /** @domName WebGLRenderingContext.depthMask */
+  /// @domName WebGLRenderingContext.depthMask; @docsEditable true
   void depthMask(bool flag) native;
 
-  /** @domName WebGLRenderingContext.depthRange */
+  /// @domName WebGLRenderingContext.depthRange; @docsEditable true
   void depthRange(num zNear, num zFar) native;
 
-  /** @domName WebGLRenderingContext.detachShader */
+  /// @domName WebGLRenderingContext.detachShader; @docsEditable true
   void detachShader(WebGLProgram program, WebGLShader shader) native;
 
-  /** @domName WebGLRenderingContext.disable */
+  /// @domName WebGLRenderingContext.disable; @docsEditable true
   void disable(int cap) native;
 
-  /** @domName WebGLRenderingContext.disableVertexAttribArray */
+  /// @domName WebGLRenderingContext.disableVertexAttribArray; @docsEditable true
   void disableVertexAttribArray(int index) native;
 
-  /** @domName WebGLRenderingContext.drawArrays */
+  /// @domName WebGLRenderingContext.drawArrays; @docsEditable true
   void drawArrays(int mode, int first, int count) native;
 
-  /** @domName WebGLRenderingContext.drawElements */
+  /// @domName WebGLRenderingContext.drawElements; @docsEditable true
   void drawElements(int mode, int count, int type, int offset) native;
 
-  /** @domName WebGLRenderingContext.enable */
+  /// @domName WebGLRenderingContext.enable; @docsEditable true
   void enable(int cap) native;
 
-  /** @domName WebGLRenderingContext.enableVertexAttribArray */
+  /// @domName WebGLRenderingContext.enableVertexAttribArray; @docsEditable true
   void enableVertexAttribArray(int index) native;
 
-  /** @domName WebGLRenderingContext.finish */
+  /// @domName WebGLRenderingContext.finish; @docsEditable true
   void finish() native;
 
-  /** @domName WebGLRenderingContext.flush */
+  /// @domName WebGLRenderingContext.flush; @docsEditable true
   void flush() native;
 
-  /** @domName WebGLRenderingContext.framebufferRenderbuffer */
+  /// @domName WebGLRenderingContext.framebufferRenderbuffer; @docsEditable true
   void framebufferRenderbuffer(int target, int attachment, int renderbuffertarget, WebGLRenderbuffer renderbuffer) native;
 
-  /** @domName WebGLRenderingContext.framebufferTexture2D */
+  /// @domName WebGLRenderingContext.framebufferTexture2D; @docsEditable true
   void framebufferTexture2D(int target, int attachment, int textarget, WebGLTexture texture, int level) native;
 
-  /** @domName WebGLRenderingContext.frontFace */
+  /// @domName WebGLRenderingContext.frontFace; @docsEditable true
   void frontFace(int mode) native;
 
-  /** @domName WebGLRenderingContext.generateMipmap */
+  /// @domName WebGLRenderingContext.generateMipmap; @docsEditable true
   void generateMipmap(int target) native;
 
-  /** @domName WebGLRenderingContext.getActiveAttrib */
+  /// @domName WebGLRenderingContext.getActiveAttrib; @docsEditable true
   WebGLActiveInfo getActiveAttrib(WebGLProgram program, int index) native;
 
-  /** @domName WebGLRenderingContext.getActiveUniform */
+  /// @domName WebGLRenderingContext.getActiveUniform; @docsEditable true
   WebGLActiveInfo getActiveUniform(WebGLProgram program, int index) native;
 
-  /** @domName WebGLRenderingContext.getAttachedShaders */
+  /// @domName WebGLRenderingContext.getAttachedShaders; @docsEditable true
   void getAttachedShaders(WebGLProgram program) native;
 
-  /** @domName WebGLRenderingContext.getAttribLocation */
+  /// @domName WebGLRenderingContext.getAttribLocation; @docsEditable true
   int getAttribLocation(WebGLProgram program, String name) native;
 
-  /** @domName WebGLRenderingContext.getBufferParameter */
+  /// @domName WebGLRenderingContext.getBufferParameter; @docsEditable true
   Object getBufferParameter(int target, int pname) native;
 
-  /** @domName WebGLRenderingContext.getContextAttributes */
+  /// @domName WebGLRenderingContext.getContextAttributes; @docsEditable true
   WebGLContextAttributes getContextAttributes() native;
 
-  /** @domName WebGLRenderingContext.getError */
+  /// @domName WebGLRenderingContext.getError; @docsEditable true
   int getError() native;
 
-  /** @domName WebGLRenderingContext.getExtension */
+  /// @domName WebGLRenderingContext.getExtension; @docsEditable true
   Object getExtension(String name) native;
 
-  /** @domName WebGLRenderingContext.getFramebufferAttachmentParameter */
+  /// @domName WebGLRenderingContext.getFramebufferAttachmentParameter; @docsEditable true
   Object getFramebufferAttachmentParameter(int target, int attachment, int pname) native;
 
-  /** @domName WebGLRenderingContext.getParameter */
+  /// @domName WebGLRenderingContext.getParameter; @docsEditable true
   Object getParameter(int pname) native;
 
-  /** @domName WebGLRenderingContext.getProgramInfoLog */
+  /// @domName WebGLRenderingContext.getProgramInfoLog; @docsEditable true
   String getProgramInfoLog(WebGLProgram program) native;
 
-  /** @domName WebGLRenderingContext.getProgramParameter */
+  /// @domName WebGLRenderingContext.getProgramParameter; @docsEditable true
   Object getProgramParameter(WebGLProgram program, int pname) native;
 
-  /** @domName WebGLRenderingContext.getRenderbufferParameter */
+  /// @domName WebGLRenderingContext.getRenderbufferParameter; @docsEditable true
   Object getRenderbufferParameter(int target, int pname) native;
 
-  /** @domName WebGLRenderingContext.getShaderInfoLog */
+  /// @domName WebGLRenderingContext.getShaderInfoLog; @docsEditable true
   String getShaderInfoLog(WebGLShader shader) native;
 
-  /** @domName WebGLRenderingContext.getShaderParameter */
+  /// @domName WebGLRenderingContext.getShaderParameter; @docsEditable true
   Object getShaderParameter(WebGLShader shader, int pname) native;
 
-  /** @domName WebGLRenderingContext.getShaderPrecisionFormat */
+  /// @domName WebGLRenderingContext.getShaderPrecisionFormat; @docsEditable true
   WebGLShaderPrecisionFormat getShaderPrecisionFormat(int shadertype, int precisiontype) native;
 
-  /** @domName WebGLRenderingContext.getShaderSource */
+  /// @domName WebGLRenderingContext.getShaderSource; @docsEditable true
   String getShaderSource(WebGLShader shader) native;
 
-  /** @domName WebGLRenderingContext.getSupportedExtensions */
+  /// @domName WebGLRenderingContext.getSupportedExtensions; @docsEditable true
   List<String> getSupportedExtensions() native;
 
-  /** @domName WebGLRenderingContext.getTexParameter */
+  /// @domName WebGLRenderingContext.getTexParameter; @docsEditable true
   Object getTexParameter(int target, int pname) native;
 
-  /** @domName WebGLRenderingContext.getUniform */
+  /// @domName WebGLRenderingContext.getUniform; @docsEditable true
   Object getUniform(WebGLProgram program, WebGLUniformLocation location) native;
 
-  /** @domName WebGLRenderingContext.getUniformLocation */
+  /// @domName WebGLRenderingContext.getUniformLocation; @docsEditable true
   WebGLUniformLocation getUniformLocation(WebGLProgram program, String name) native;
 
-  /** @domName WebGLRenderingContext.getVertexAttrib */
+  /// @domName WebGLRenderingContext.getVertexAttrib; @docsEditable true
   Object getVertexAttrib(int index, int pname) native;
 
-  /** @domName WebGLRenderingContext.getVertexAttribOffset */
+  /// @domName WebGLRenderingContext.getVertexAttribOffset; @docsEditable true
   int getVertexAttribOffset(int index, int pname) native;
 
-  /** @domName WebGLRenderingContext.hint */
+  /// @domName WebGLRenderingContext.hint; @docsEditable true
   void hint(int target, int mode) native;
 
-  /** @domName WebGLRenderingContext.isBuffer */
+  /// @domName WebGLRenderingContext.isBuffer; @docsEditable true
   bool isBuffer(WebGLBuffer buffer) native;
 
-  /** @domName WebGLRenderingContext.isContextLost */
+  /// @domName WebGLRenderingContext.isContextLost; @docsEditable true
   bool isContextLost() native;
 
-  /** @domName WebGLRenderingContext.isEnabled */
+  /// @domName WebGLRenderingContext.isEnabled; @docsEditable true
   bool isEnabled(int cap) native;
 
-  /** @domName WebGLRenderingContext.isFramebuffer */
+  /// @domName WebGLRenderingContext.isFramebuffer; @docsEditable true
   bool isFramebuffer(WebGLFramebuffer framebuffer) native;
 
-  /** @domName WebGLRenderingContext.isProgram */
+  /// @domName WebGLRenderingContext.isProgram; @docsEditable true
   bool isProgram(WebGLProgram program) native;
 
-  /** @domName WebGLRenderingContext.isRenderbuffer */
+  /// @domName WebGLRenderingContext.isRenderbuffer; @docsEditable true
   bool isRenderbuffer(WebGLRenderbuffer renderbuffer) native;
 
-  /** @domName WebGLRenderingContext.isShader */
+  /// @domName WebGLRenderingContext.isShader; @docsEditable true
   bool isShader(WebGLShader shader) native;
 
-  /** @domName WebGLRenderingContext.isTexture */
+  /// @domName WebGLRenderingContext.isTexture; @docsEditable true
   bool isTexture(WebGLTexture texture) native;
 
-  /** @domName WebGLRenderingContext.lineWidth */
+  /// @domName WebGLRenderingContext.lineWidth; @docsEditable true
   void lineWidth(num width) native;
 
-  /** @domName WebGLRenderingContext.linkProgram */
+  /// @domName WebGLRenderingContext.linkProgram; @docsEditable true
   void linkProgram(WebGLProgram program) native;
 
-  /** @domName WebGLRenderingContext.pixelStorei */
+  /// @domName WebGLRenderingContext.pixelStorei; @docsEditable true
   void pixelStorei(int pname, int param) native;
 
-  /** @domName WebGLRenderingContext.polygonOffset */
+  /// @domName WebGLRenderingContext.polygonOffset; @docsEditable true
   void polygonOffset(num factor, num units) native;
 
-  /** @domName WebGLRenderingContext.readPixels */
+  /// @domName WebGLRenderingContext.readPixels; @docsEditable true
   void readPixels(int x, int y, int width, int height, int format, int type, ArrayBufferView pixels) native;
 
-  /** @domName WebGLRenderingContext.releaseShaderCompiler */
+  /// @domName WebGLRenderingContext.releaseShaderCompiler; @docsEditable true
   void releaseShaderCompiler() native;
 
-  /** @domName WebGLRenderingContext.renderbufferStorage */
+  /// @domName WebGLRenderingContext.renderbufferStorage; @docsEditable true
   void renderbufferStorage(int target, int internalformat, int width, int height) native;
 
-  /** @domName WebGLRenderingContext.sampleCoverage */
+  /// @domName WebGLRenderingContext.sampleCoverage; @docsEditable true
   void sampleCoverage(num value, bool invert) native;
 
-  /** @domName WebGLRenderingContext.scissor */
+  /// @domName WebGLRenderingContext.scissor; @docsEditable true
   void scissor(int x, int y, int width, int height) native;
 
-  /** @domName WebGLRenderingContext.shaderSource */
+  /// @domName WebGLRenderingContext.shaderSource; @docsEditable true
   void shaderSource(WebGLShader shader, String string) native;
 
-  /** @domName WebGLRenderingContext.stencilFunc */
+  /// @domName WebGLRenderingContext.stencilFunc; @docsEditable true
   void stencilFunc(int func, int ref, int mask) native;
 
-  /** @domName WebGLRenderingContext.stencilFuncSeparate */
+  /// @domName WebGLRenderingContext.stencilFuncSeparate; @docsEditable true
   void stencilFuncSeparate(int face, int func, int ref, int mask) native;
 
-  /** @domName WebGLRenderingContext.stencilMask */
+  /// @domName WebGLRenderingContext.stencilMask; @docsEditable true
   void stencilMask(int mask) native;
 
-  /** @domName WebGLRenderingContext.stencilMaskSeparate */
+  /// @domName WebGLRenderingContext.stencilMaskSeparate; @docsEditable true
   void stencilMaskSeparate(int face, int mask) native;
 
-  /** @domName WebGLRenderingContext.stencilOp */
+  /// @domName WebGLRenderingContext.stencilOp; @docsEditable true
   void stencilOp(int fail, int zfail, int zpass) native;
 
-  /** @domName WebGLRenderingContext.stencilOpSeparate */
+  /// @domName WebGLRenderingContext.stencilOpSeparate; @docsEditable true
   void stencilOpSeparate(int face, int fail, int zfail, int zpass) native;
 
-  /** @domName WebGLRenderingContext.texImage2D */
+  /// @domName WebGLRenderingContext.texImage2D; @docsEditable true
   void texImage2D(int target, int level, int internalformat, int format_OR_width, int height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, [int format, int type, ArrayBufferView pixels]) {
     if ((?border_OR_canvas_OR_image_OR_pixels_OR_video && (border_OR_canvas_OR_image_OR_pixels_OR_video is int || border_OR_canvas_OR_image_OR_pixels_OR_video == null))) {
       _texImage2D_1(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels);
@@ -19338,7 +19577,7 @@
       _texImage2D_5(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
       return;
     }
-    throw const Exception("Incorrect number or type of arguments");
+    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";
@@ -19346,13 +19585,13 @@
   void _texImage2D_4(target, level, internalformat, format, type, CanvasElement canvas) native "texImage2D";
   void _texImage2D_5(target, level, internalformat, format, type, VideoElement video) native "texImage2D";
 
-  /** @domName WebGLRenderingContext.texParameterf */
+  /// @domName WebGLRenderingContext.texParameterf; @docsEditable true
   void texParameterf(int target, int pname, num param) native;
 
-  /** @domName WebGLRenderingContext.texParameteri */
+  /// @domName WebGLRenderingContext.texParameteri; @docsEditable true
   void texParameteri(int target, int pname, int param) native;
 
-  /** @domName WebGLRenderingContext.texSubImage2D */
+  /// @domName WebGLRenderingContext.texSubImage2D; @docsEditable true
   void texSubImage2D(int target, int level, int xoffset, int yoffset, int format_OR_width, int height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, [int type, ArrayBufferView pixels]) {
     if ((?canvas_OR_format_OR_image_OR_pixels_OR_video && (canvas_OR_format_OR_image_OR_pixels_OR_video is int || canvas_OR_format_OR_image_OR_pixels_OR_video == null))) {
       _texSubImage2D_1(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels);
@@ -19383,7 +19622,7 @@
       _texSubImage2D_5(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
       return;
     }
-    throw const Exception("Incorrect number or type of arguments");
+    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";
@@ -19391,97 +19630,97 @@
   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";
 
-  /** @domName WebGLRenderingContext.uniform1f */
+  /// @domName WebGLRenderingContext.uniform1f; @docsEditable true
   void uniform1f(WebGLUniformLocation location, num x) native;
 
-  /** @domName WebGLRenderingContext.uniform1fv */
+  /// @domName WebGLRenderingContext.uniform1fv; @docsEditable true
   void uniform1fv(WebGLUniformLocation location, Float32Array v) native;
 
-  /** @domName WebGLRenderingContext.uniform1i */
+  /// @domName WebGLRenderingContext.uniform1i; @docsEditable true
   void uniform1i(WebGLUniformLocation location, int x) native;
 
-  /** @domName WebGLRenderingContext.uniform1iv */
+  /// @domName WebGLRenderingContext.uniform1iv; @docsEditable true
   void uniform1iv(WebGLUniformLocation location, Int32Array v) native;
 
-  /** @domName WebGLRenderingContext.uniform2f */
+  /// @domName WebGLRenderingContext.uniform2f; @docsEditable true
   void uniform2f(WebGLUniformLocation location, num x, num y) native;
 
-  /** @domName WebGLRenderingContext.uniform2fv */
+  /// @domName WebGLRenderingContext.uniform2fv; @docsEditable true
   void uniform2fv(WebGLUniformLocation location, Float32Array v) native;
 
-  /** @domName WebGLRenderingContext.uniform2i */
+  /// @domName WebGLRenderingContext.uniform2i; @docsEditable true
   void uniform2i(WebGLUniformLocation location, int x, int y) native;
 
-  /** @domName WebGLRenderingContext.uniform2iv */
+  /// @domName WebGLRenderingContext.uniform2iv; @docsEditable true
   void uniform2iv(WebGLUniformLocation location, Int32Array v) native;
 
-  /** @domName WebGLRenderingContext.uniform3f */
+  /// @domName WebGLRenderingContext.uniform3f; @docsEditable true
   void uniform3f(WebGLUniformLocation location, num x, num y, num z) native;
 
-  /** @domName WebGLRenderingContext.uniform3fv */
+  /// @domName WebGLRenderingContext.uniform3fv; @docsEditable true
   void uniform3fv(WebGLUniformLocation location, Float32Array v) native;
 
-  /** @domName WebGLRenderingContext.uniform3i */
+  /// @domName WebGLRenderingContext.uniform3i; @docsEditable true
   void uniform3i(WebGLUniformLocation location, int x, int y, int z) native;
 
-  /** @domName WebGLRenderingContext.uniform3iv */
+  /// @domName WebGLRenderingContext.uniform3iv; @docsEditable true
   void uniform3iv(WebGLUniformLocation location, Int32Array v) native;
 
-  /** @domName WebGLRenderingContext.uniform4f */
+  /// @domName WebGLRenderingContext.uniform4f; @docsEditable true
   void uniform4f(WebGLUniformLocation location, num x, num y, num z, num w) native;
 
-  /** @domName WebGLRenderingContext.uniform4fv */
+  /// @domName WebGLRenderingContext.uniform4fv; @docsEditable true
   void uniform4fv(WebGLUniformLocation location, Float32Array v) native;
 
-  /** @domName WebGLRenderingContext.uniform4i */
+  /// @domName WebGLRenderingContext.uniform4i; @docsEditable true
   void uniform4i(WebGLUniformLocation location, int x, int y, int z, int w) native;
 
-  /** @domName WebGLRenderingContext.uniform4iv */
+  /// @domName WebGLRenderingContext.uniform4iv; @docsEditable true
   void uniform4iv(WebGLUniformLocation location, Int32Array v) native;
 
-  /** @domName WebGLRenderingContext.uniformMatrix2fv */
+  /// @domName WebGLRenderingContext.uniformMatrix2fv; @docsEditable true
   void uniformMatrix2fv(WebGLUniformLocation location, bool transpose, Float32Array array) native;
 
-  /** @domName WebGLRenderingContext.uniformMatrix3fv */
+  /// @domName WebGLRenderingContext.uniformMatrix3fv; @docsEditable true
   void uniformMatrix3fv(WebGLUniformLocation location, bool transpose, Float32Array array) native;
 
-  /** @domName WebGLRenderingContext.uniformMatrix4fv */
+  /// @domName WebGLRenderingContext.uniformMatrix4fv; @docsEditable true
   void uniformMatrix4fv(WebGLUniformLocation location, bool transpose, Float32Array array) native;
 
-  /** @domName WebGLRenderingContext.useProgram */
+  /// @domName WebGLRenderingContext.useProgram; @docsEditable true
   void useProgram(WebGLProgram program) native;
 
-  /** @domName WebGLRenderingContext.validateProgram */
+  /// @domName WebGLRenderingContext.validateProgram; @docsEditable true
   void validateProgram(WebGLProgram program) native;
 
-  /** @domName WebGLRenderingContext.vertexAttrib1f */
+  /// @domName WebGLRenderingContext.vertexAttrib1f; @docsEditable true
   void vertexAttrib1f(int indx, num x) native;
 
-  /** @domName WebGLRenderingContext.vertexAttrib1fv */
+  /// @domName WebGLRenderingContext.vertexAttrib1fv; @docsEditable true
   void vertexAttrib1fv(int indx, Float32Array values) native;
 
-  /** @domName WebGLRenderingContext.vertexAttrib2f */
+  /// @domName WebGLRenderingContext.vertexAttrib2f; @docsEditable true
   void vertexAttrib2f(int indx, num x, num y) native;
 
-  /** @domName WebGLRenderingContext.vertexAttrib2fv */
+  /// @domName WebGLRenderingContext.vertexAttrib2fv; @docsEditable true
   void vertexAttrib2fv(int indx, Float32Array values) native;
 
-  /** @domName WebGLRenderingContext.vertexAttrib3f */
+  /// @domName WebGLRenderingContext.vertexAttrib3f; @docsEditable true
   void vertexAttrib3f(int indx, num x, num y, num z) native;
 
-  /** @domName WebGLRenderingContext.vertexAttrib3fv */
+  /// @domName WebGLRenderingContext.vertexAttrib3fv; @docsEditable true
   void vertexAttrib3fv(int indx, Float32Array values) native;
 
-  /** @domName WebGLRenderingContext.vertexAttrib4f */
+  /// @domName WebGLRenderingContext.vertexAttrib4f; @docsEditable true
   void vertexAttrib4f(int indx, num x, num y, num z, num w) native;
 
-  /** @domName WebGLRenderingContext.vertexAttrib4fv */
+  /// @domName WebGLRenderingContext.vertexAttrib4fv; @docsEditable true
   void vertexAttrib4fv(int indx, Float32Array values) native;
 
-  /** @domName WebGLRenderingContext.vertexAttribPointer */
+  /// @domName WebGLRenderingContext.vertexAttribPointer; @docsEditable true
   void vertexAttribPointer(int indx, int size, int type, bool normalized, int stride, int offset) native;
 
-  /** @domName WebGLRenderingContext.viewport */
+  /// @domName WebGLRenderingContext.viewport; @docsEditable true
   void viewport(int x, int y, int width, int height) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19489,7 +19728,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WebGLShader
+/// @domName WebGLShader; @docsEditable true
 class WebGLShader native "*WebGLShader" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19497,16 +19736,16 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WebGLShaderPrecisionFormat
+/// @domName WebGLShaderPrecisionFormat; @docsEditable true
 class WebGLShaderPrecisionFormat native "*WebGLShaderPrecisionFormat" {
 
-  /** @domName WebGLShaderPrecisionFormat.precision */
+  /// @domName WebGLShaderPrecisionFormat.precision; @docsEditable true
   final int precision;
 
-  /** @domName WebGLShaderPrecisionFormat.rangeMax */
+  /// @domName WebGLShaderPrecisionFormat.rangeMax; @docsEditable true
   final int rangeMax;
 
-  /** @domName WebGLShaderPrecisionFormat.rangeMin */
+  /// @domName WebGLShaderPrecisionFormat.rangeMin; @docsEditable true
   final int rangeMin;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19514,7 +19753,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WebGLTexture
+/// @domName WebGLTexture; @docsEditable true
 class WebGLTexture native "*WebGLTexture" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19522,7 +19761,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WebGLUniformLocation
+/// @domName WebGLUniformLocation; @docsEditable true
 class WebGLUniformLocation native "*WebGLUniformLocation" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19530,7 +19769,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WebGLVertexArrayObjectOES
+/// @domName WebGLVertexArrayObjectOES; @docsEditable true
 class WebGLVertexArrayObjectOES native "*WebGLVertexArrayObjectOES" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19538,7 +19777,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WebKitCSSFilterValue
+/// @domName WebKitCSSFilterValue; @docsEditable true
 class WebKitCSSFilterValue extends _CSSValueList native "*WebKitCSSFilterValue" {
 
   static const int CSS_FILTER_BLUR = 10;
@@ -19565,7 +19804,7 @@
 
   static const int CSS_FILTER_SEPIA = 3;
 
-  /** @domName WebKitCSSFilterValue.operationType */
+  /// @domName WebKitCSSFilterValue.operationType; @docsEditable true
   final int operationType;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19573,34 +19812,37 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WebKitNamedFlow
+/// @domName WebKitNamedFlow; @docsEditable true
 class WebKitNamedFlow extends EventTarget native "*WebKitNamedFlow" {
 
-  /** @domName WebKitNamedFlow.firstEmptyRegionIndex */
+  /// @domName WebKitNamedFlow.firstEmptyRegionIndex; @docsEditable true
   final int firstEmptyRegionIndex;
 
-  /** @domName WebKitNamedFlow.name */
+  /// @domName WebKitNamedFlow.name; @docsEditable true
   final String name;
 
-  /** @domName WebKitNamedFlow.overset */
+  /// @domName WebKitNamedFlow.overset; @docsEditable true
   final bool overset;
 
-  /** @domName WebKitNamedFlow.addEventListener */
+  /// @domName WebKitNamedFlow.addEventListener; @docsEditable true
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
 
-  /** @domName WebKitNamedFlow.dispatchEvent */
+  /// @domName WebKitNamedFlow.dispatchEvent; @docsEditable true
   bool $dom_dispatchEvent(Event event) native "dispatchEvent";
 
-  /** @domName WebKitNamedFlow.getContent */
+  /// @domName WebKitNamedFlow.getContent; @docsEditable true
+  @Returns('_NodeList') @Creates('_NodeList')
   List<Node> getContent() native;
 
-  /** @domName WebKitNamedFlow.getRegions */
+  /// @domName WebKitNamedFlow.getRegions; @docsEditable true
+  @Returns('_NodeList') @Creates('_NodeList')
   List<Node> getRegions() native;
 
-  /** @domName WebKitNamedFlow.getRegionsByContent */
+  /// @domName WebKitNamedFlow.getRegionsByContent; @docsEditable true
+  @Returns('_NodeList') @Creates('_NodeList')
   List<Node> getRegionsByContent(Node contentNode) native;
 
-  /** @domName WebKitNamedFlow.removeEventListener */
+  /// @domName WebKitNamedFlow.removeEventListener; @docsEditable true
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19613,9 +19855,7 @@
 class WebSocket extends EventTarget native "*WebSocket" {
   factory WebSocket(String url) => _WebSocketFactoryProvider.createWebSocket(url);
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   WebSocketEvents get on =>
     new WebSocketEvents(this);
 
@@ -19627,40 +19867,40 @@
 
   static const int OPEN = 1;
 
-  /** @domName WebSocket.URL */
+  /// @domName WebSocket.URL; @docsEditable true
   final String URL;
 
-  /** @domName WebSocket.binaryType */
+  /// @domName WebSocket.binaryType; @docsEditable true
   String binaryType;
 
-  /** @domName WebSocket.bufferedAmount */
+  /// @domName WebSocket.bufferedAmount; @docsEditable true
   final int bufferedAmount;
 
-  /** @domName WebSocket.extensions */
+  /// @domName WebSocket.extensions; @docsEditable true
   final String extensions;
 
-  /** @domName WebSocket.protocol */
+  /// @domName WebSocket.protocol; @docsEditable true
   final String protocol;
 
-  /** @domName WebSocket.readyState */
+  /// @domName WebSocket.readyState; @docsEditable true
   final int readyState;
 
-  /** @domName WebSocket.url */
+  /// @domName WebSocket.url; @docsEditable true
   final String url;
 
-  /** @domName WebSocket.addEventListener */
+  /// @domName WebSocket.addEventListener; @docsEditable true
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
 
-  /** @domName WebSocket.close */
+  /// @domName WebSocket.close; @docsEditable true
   void close([int code, String reason]) native;
 
-  /** @domName WebSocket.dispatchEvent */
+  /// @domName WebSocket.dispatchEvent; @docsEditable true
   bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
 
-  /** @domName WebSocket.removeEventListener */
+  /// @domName WebSocket.removeEventListener; @docsEditable true
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
 
-  /** @domName WebSocket.send */
+  /// @domName WebSocket.send; @docsEditable true
   void send(data) native;
 
 }
@@ -19683,10 +19923,10 @@
 
 class WheelEvent extends MouseEvent native "*WheelEvent" {
 
-  /** @domName WheelEvent.webkitDirectionInvertedFromDevice */
+  /// @domName WheelEvent.webkitDirectionInvertedFromDevice; @docsEditable true
   final bool webkitDirectionInvertedFromDevice;
 
-  /** @domName WheelEvent.initWebKitWheelEvent */
+  /// @domName WheelEvent.initWebKitWheelEvent; @docsEditable true
   void initWebKitWheelEvent(int wheelDeltaX, int wheelDeltaY, LocalWindow view, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey) native;
 
 
@@ -19768,18 +20008,16 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName Worker
+/// @domName Worker; @docsEditable true
 class Worker extends AbstractWorker native "*Worker" {
 
   factory Worker(String scriptUrl) => _WorkerFactoryProvider.createWorker(scriptUrl);
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   WorkerEvents get on =>
     new WorkerEvents(this);
 
-  /** @domName Worker.postMessage */
+  /// @domName Worker.postMessage; @docsEditable true
   void postMessage(/*SerializedScriptValue*/ message, [List messagePorts]) {
     if (?messagePorts) {
       var message_1 = _convertDartToNative_SerializedScriptValue(message);
@@ -19793,7 +20031,7 @@
   void _postMessage_1(message, List messagePorts) native "postMessage";
   void _postMessage_2(message) native "postMessage";
 
-  /** @domName Worker.terminate */
+  /// @domName Worker.terminate; @docsEditable true
   void terminate() native;
 }
 
@@ -19807,12 +20045,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WorkerContext
+/// @domName WorkerContext; @docsEditable true
 class WorkerContext extends EventTarget native "*WorkerContext" {
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   WorkerContextEvents get on =>
     new WorkerContextEvents(this);
 
@@ -19820,67 +20056,67 @@
 
   static const int TEMPORARY = 0;
 
-  /** @domName WorkerContext.indexedDB */
+  /// @domName WorkerContext.indexedDB; @docsEditable true
   final IDBFactory indexedDB;
 
-  /** @domName WorkerContext.location */
+  /// @domName WorkerContext.location; @docsEditable true
   final WorkerLocation location;
 
-  /** @domName WorkerContext.navigator */
+  /// @domName WorkerContext.navigator; @docsEditable true
   final WorkerNavigator navigator;
 
-  /** @domName WorkerContext.self */
+  /// @domName WorkerContext.self; @docsEditable true
   final WorkerContext self;
 
-  /** @domName WorkerContext.webkitIndexedDB */
+  /// @domName WorkerContext.webkitIndexedDB; @docsEditable true
   final IDBFactory webkitIndexedDB;
 
-  /** @domName WorkerContext.webkitNotifications */
+  /// @domName WorkerContext.webkitNotifications; @docsEditable true
   final NotificationCenter webkitNotifications;
 
-  /** @domName WorkerContext.addEventListener */
+  /// @domName WorkerContext.addEventListener; @docsEditable true
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
 
-  /** @domName WorkerContext.clearInterval */
+  /// @domName WorkerContext.clearInterval; @docsEditable true
   void clearInterval(int handle) native;
 
-  /** @domName WorkerContext.clearTimeout */
+  /// @domName WorkerContext.clearTimeout; @docsEditable true
   void clearTimeout(int handle) native;
 
-  /** @domName WorkerContext.close */
+  /// @domName WorkerContext.close; @docsEditable true
   void close() native;
 
-  /** @domName WorkerContext.dispatchEvent */
+  /// @domName WorkerContext.dispatchEvent; @docsEditable true
   bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
 
-  /** @domName WorkerContext.importScripts */
+  /// @domName WorkerContext.importScripts; @docsEditable true
   void importScripts() native;
 
-  /** @domName WorkerContext.openDatabase */
+  /// @domName WorkerContext.openDatabase; @docsEditable true
   Database openDatabase(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) native;
 
-  /** @domName WorkerContext.openDatabaseSync */
+  /// @domName WorkerContext.openDatabaseSync; @docsEditable true
   DatabaseSync openDatabaseSync(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) native;
 
-  /** @domName WorkerContext.removeEventListener */
+  /// @domName WorkerContext.removeEventListener; @docsEditable true
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
 
-  /** @domName WorkerContext.setInterval */
+  /// @domName WorkerContext.setInterval; @docsEditable true
   int setInterval(TimeoutHandler handler, int timeout) native;
 
-  /** @domName WorkerContext.setTimeout */
+  /// @domName WorkerContext.setTimeout; @docsEditable true
   int setTimeout(TimeoutHandler handler, int timeout) native;
 
-  /** @domName WorkerContext.webkitRequestFileSystem */
+  /// @domName WorkerContext.webkitRequestFileSystem; @docsEditable true
   void webkitRequestFileSystem(int type, int size, [FileSystemCallback successCallback, ErrorCallback errorCallback]) native;
 
-  /** @domName WorkerContext.webkitRequestFileSystemSync */
+  /// @domName WorkerContext.webkitRequestFileSystemSync; @docsEditable true
   DOMFileSystemSync webkitRequestFileSystemSync(int type, int size) native;
 
-  /** @domName WorkerContext.webkitResolveLocalFileSystemSyncURL */
+  /// @domName WorkerContext.webkitResolveLocalFileSystemSyncURL; @docsEditable true
   EntrySync webkitResolveLocalFileSystemSyncURL(String url) native;
 
-  /** @domName WorkerContext.webkitResolveLocalFileSystemURL */
+  /// @domName WorkerContext.webkitResolveLocalFileSystemURL; @docsEditable true
   void webkitResolveLocalFileSystemURL(String url, EntryCallback successCallback, [ErrorCallback errorCallback]) native;
 }
 
@@ -19894,34 +20130,34 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WorkerLocation
+/// @domName WorkerLocation; @docsEditable true
 class WorkerLocation native "*WorkerLocation" {
 
-  /** @domName WorkerLocation.hash */
+  /// @domName WorkerLocation.hash; @docsEditable true
   final String hash;
 
-  /** @domName WorkerLocation.host */
+  /// @domName WorkerLocation.host; @docsEditable true
   final String host;
 
-  /** @domName WorkerLocation.hostname */
+  /// @domName WorkerLocation.hostname; @docsEditable true
   final String hostname;
 
-  /** @domName WorkerLocation.href */
+  /// @domName WorkerLocation.href; @docsEditable true
   final String href;
 
-  /** @domName WorkerLocation.pathname */
+  /// @domName WorkerLocation.pathname; @docsEditable true
   final String pathname;
 
-  /** @domName WorkerLocation.port */
+  /// @domName WorkerLocation.port; @docsEditable true
   final String port;
 
-  /** @domName WorkerLocation.protocol */
+  /// @domName WorkerLocation.protocol; @docsEditable true
   final String protocol;
 
-  /** @domName WorkerLocation.search */
+  /// @domName WorkerLocation.search; @docsEditable true
   final String search;
 
-  /** @domName WorkerLocation.toString */
+  /// @domName WorkerLocation.toString; @docsEditable true
   String toString() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19929,22 +20165,22 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WorkerNavigator
+/// @domName WorkerNavigator; @docsEditable true
 class WorkerNavigator native "*WorkerNavigator" {
 
-  /** @domName WorkerNavigator.appName */
+  /// @domName WorkerNavigator.appName; @docsEditable true
   final String appName;
 
-  /** @domName WorkerNavigator.appVersion */
+  /// @domName WorkerNavigator.appVersion; @docsEditable true
   final String appVersion;
 
-  /** @domName WorkerNavigator.onLine */
+  /// @domName WorkerNavigator.onLine; @docsEditable true
   final bool onLine;
 
-  /** @domName WorkerNavigator.platform */
+  /// @domName WorkerNavigator.platform; @docsEditable true
   final String platform;
 
-  /** @domName WorkerNavigator.userAgent */
+  /// @domName WorkerNavigator.userAgent; @docsEditable true
   final String userAgent;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19952,12 +20188,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName XMLSerializer
+/// @domName XMLSerializer; @docsEditable true
 class XMLSerializer native "*XMLSerializer" {
 
   factory XMLSerializer() => _XMLSerializerFactoryProvider.createXMLSerializer();
 
-  /** @domName XMLSerializer.serializeToString */
+  /// @domName XMLSerializer.serializeToString; @docsEditable true
   String serializeToString(Node node) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19965,18 +20201,18 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName XPathEvaluator
+/// @domName XPathEvaluator; @docsEditable true
 class XPathEvaluator native "*XPathEvaluator" {
 
   factory XPathEvaluator() => _XPathEvaluatorFactoryProvider.createXPathEvaluator();
 
-  /** @domName XPathEvaluator.createExpression */
+  /// @domName XPathEvaluator.createExpression; @docsEditable true
   XPathExpression createExpression(String expression, XPathNSResolver resolver) native;
 
-  /** @domName XPathEvaluator.createNSResolver */
+  /// @domName XPathEvaluator.createNSResolver; @docsEditable true
   XPathNSResolver createNSResolver(Node nodeResolver) native;
 
-  /** @domName XPathEvaluator.evaluate */
+  /// @domName XPathEvaluator.evaluate; @docsEditable true
   XPathResult evaluate(String expression, Node contextNode, XPathNSResolver resolver, int type, XPathResult inResult) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19984,23 +20220,23 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName XPathException
+/// @domName XPathException; @docsEditable true
 class XPathException native "*XPathException" {
 
   static const int INVALID_EXPRESSION_ERR = 51;
 
   static const int TYPE_ERR = 52;
 
-  /** @domName XPathException.code */
+  /// @domName XPathException.code; @docsEditable true
   final int code;
 
-  /** @domName XPathException.message */
+  /// @domName XPathException.message; @docsEditable true
   final String message;
 
-  /** @domName XPathException.name */
+  /// @domName XPathException.name; @docsEditable true
   final String name;
 
-  /** @domName XPathException.toString */
+  /// @domName XPathException.toString; @docsEditable true
   String toString() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20008,10 +20244,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName XPathExpression
+/// @domName XPathExpression; @docsEditable true
 class XPathExpression native "*XPathExpression" {
 
-  /** @domName XPathExpression.evaluate */
+  /// @domName XPathExpression.evaluate; @docsEditable true
   XPathResult evaluate(Node contextNode, int type, XPathResult inResult) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20019,10 +20255,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName XPathNSResolver
+/// @domName XPathNSResolver; @docsEditable true
 class XPathNSResolver native "*XPathNSResolver" {
 
-  /** @domName XPathNSResolver.lookupNamespaceURI */
+  /// @domName XPathNSResolver.lookupNamespaceURI; @docsEditable true
   String lookupNamespaceURI(String prefix) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20030,7 +20266,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName XPathResult
+/// @domName XPathResult; @docsEditable true
 class XPathResult native "*XPathResult" {
 
   static const int ANY_TYPE = 0;
@@ -20053,31 +20289,31 @@
 
   static const int UNORDERED_NODE_SNAPSHOT_TYPE = 6;
 
-  /** @domName XPathResult.booleanValue */
+  /// @domName XPathResult.booleanValue; @docsEditable true
   final bool booleanValue;
 
-  /** @domName XPathResult.invalidIteratorState */
+  /// @domName XPathResult.invalidIteratorState; @docsEditable true
   final bool invalidIteratorState;
 
-  /** @domName XPathResult.numberValue */
+  /// @domName XPathResult.numberValue; @docsEditable true
   final num numberValue;
 
-  /** @domName XPathResult.resultType */
+  /// @domName XPathResult.resultType; @docsEditable true
   final int resultType;
 
-  /** @domName XPathResult.singleNodeValue */
+  /// @domName XPathResult.singleNodeValue; @docsEditable true
   final Node singleNodeValue;
 
-  /** @domName XPathResult.snapshotLength */
+  /// @domName XPathResult.snapshotLength; @docsEditable true
   final int snapshotLength;
 
-  /** @domName XPathResult.stringValue */
+  /// @domName XPathResult.stringValue; @docsEditable true
   final String stringValue;
 
-  /** @domName XPathResult.iterateNext */
+  /// @domName XPathResult.iterateNext; @docsEditable true
   Node iterateNext() native;
 
-  /** @domName XPathResult.snapshotItem */
+  /// @domName XPathResult.snapshotItem; @docsEditable true
   Node snapshotItem(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20085,33 +20321,33 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName XSLTProcessor
+/// @domName XSLTProcessor; @docsEditable true
 class XSLTProcessor native "*XSLTProcessor" {
 
   factory XSLTProcessor() => _XSLTProcessorFactoryProvider.createXSLTProcessor();
 
-  /** @domName XSLTProcessor.clearParameters */
+  /// @domName XSLTProcessor.clearParameters; @docsEditable true
   void clearParameters() native;
 
-  /** @domName XSLTProcessor.getParameter */
+  /// @domName XSLTProcessor.getParameter; @docsEditable true
   String getParameter(String namespaceURI, String localName) native;
 
-  /** @domName XSLTProcessor.importStylesheet */
+  /// @domName XSLTProcessor.importStylesheet; @docsEditable true
   void importStylesheet(Node stylesheet) native;
 
-  /** @domName XSLTProcessor.removeParameter */
+  /// @domName XSLTProcessor.removeParameter; @docsEditable true
   void removeParameter(String namespaceURI, String localName) native;
 
-  /** @domName XSLTProcessor.reset */
+  /// @domName XSLTProcessor.reset; @docsEditable true
   void reset() native;
 
-  /** @domName XSLTProcessor.setParameter */
+  /// @domName XSLTProcessor.setParameter; @docsEditable true
   void setParameter(String namespaceURI, String localName, String value) native;
 
-  /** @domName XSLTProcessor.transformToDocument */
+  /// @domName XSLTProcessor.transformToDocument; @docsEditable true
   Document transformToDocument(Node source) native;
 
-  /** @domName XSLTProcessor.transformToFragment */
+  /// @domName XSLTProcessor.transformToFragment; @docsEditable true
   DocumentFragment transformToFragment(Node source, Document docVal) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20173,10 +20409,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName CSSRuleList
+/// @domName CSSRuleList; @docsEditable true
 class _CSSRuleList implements JavaScriptIndexingBehavior, List<CSSRule> native "*CSSRuleList" {
 
-  /** @domName CSSRuleList.length */
+  /// @domName CSSRuleList.length; @docsEditable true
   final int length;
 
   CSSRule operator[](int index) => JS("CSSRule", "#[#]", this, index);
@@ -20239,6 +20475,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  CSSRule get first => this[0];
+
   CSSRule get last => this[length - 1];
 
   CSSRule removeLast() {
@@ -20262,7 +20500,7 @@
 
   // -- end List<CSSRule> mixins.
 
-  /** @domName CSSRuleList.item */
+  /// @domName CSSRuleList.item; @docsEditable true
   CSSRule item(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20270,10 +20508,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName CSSValueList
+/// @domName CSSValueList; @docsEditable true
 class _CSSValueList extends CSSValue implements List<CSSValue>, JavaScriptIndexingBehavior native "*CSSValueList" {
 
-  /** @domName CSSValueList.length */
+  /// @domName CSSValueList.length; @docsEditable true
   final int length;
 
   CSSValue operator[](int index) => JS("CSSValue", "#[#]", this, index);
@@ -20336,6 +20574,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  CSSValue get first => this[0];
+
   CSSValue get last => this[length - 1];
 
   CSSValue removeLast() {
@@ -20359,7 +20599,7 @@
 
   // -- end List<CSSValue> mixins.
 
-  /** @domName CSSValueList.item */
+  /// @domName CSSValueList.item; @docsEditable true
   CSSValue item(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20367,10 +20607,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName ClientRectList
+/// @domName ClientRectList; @docsEditable true
 class _ClientRectList implements JavaScriptIndexingBehavior, List<ClientRect> native "*ClientRectList" {
 
-  /** @domName ClientRectList.length */
+  /// @domName ClientRectList.length; @docsEditable true
   final int length;
 
   ClientRect operator[](int index) => JS("ClientRect", "#[#]", this, index);
@@ -20433,6 +20673,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  ClientRect get first => this[0];
+
   ClientRect get last => this[length - 1];
 
   ClientRect removeLast() {
@@ -20456,7 +20698,7 @@
 
   // -- end List<ClientRect> mixins.
 
-  /** @domName ClientRectList.item */
+  /// @domName ClientRectList.item; @docsEditable true
   ClientRect item(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20473,10 +20715,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName DOMStringList
+/// @domName DOMStringList; @docsEditable true
 class _DOMStringList implements JavaScriptIndexingBehavior, List<String> native "*DOMStringList" {
 
-  /** @domName DOMStringList.length */
+  /// @domName DOMStringList.length; @docsEditable true
   final int length;
 
   String operator[](int index) => JS("String", "#[#]", this, index);
@@ -20539,6 +20781,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  String get first => this[0];
+
   String get last => this[length - 1];
 
   String removeLast() {
@@ -20562,10 +20806,10 @@
 
   // -- end List<String> mixins.
 
-  /** @domName DOMStringList.contains */
+  /// @domName DOMStringList.contains; @docsEditable true
   bool contains(String string) native;
 
-  /** @domName DOMStringList.item */
+  /// @domName DOMStringList.item; @docsEditable true
   String item(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20590,315 +20834,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-class _Elements {
-
-
-  static AnchorElement createAnchorElement([String href]) {
-    AnchorElement _e = document.$dom_createElement("a");
-    if (href != null) _e.href = href;
-    return _e;
-  }
-
-  static AreaElement createAreaElement() {
-    AreaElement _e = document.$dom_createElement("area");
-    return _e;
-  }
-
-  static BRElement createBRElement() {
-    BRElement _e = document.$dom_createElement("br");
-    return _e;
-  }
-
-  static BaseElement createBaseElement() {
-    BaseElement _e = document.$dom_createElement("base");
-    return _e;
-  }
-
-  static BodyElement createBodyElement() {
-    BodyElement _e = document.$dom_createElement("body");
-    return _e;
-  }
-
-  static ButtonElement createButtonElement() {
-    ButtonElement _e = document.$dom_createElement("button");
-    return _e;
-  }
-
-  static CanvasElement createCanvasElement([int width, int height]) {
-    CanvasElement _e = document.$dom_createElement("canvas");
-    if (width != null) _e.width = width;
-    if (height != null) _e.height = height;
-    return _e;
-  }
-
-  static ContentElement createContentElement() {
-    ContentElement _e = document.$dom_createElement("content");
-    return _e;
-  }
-
-  static DListElement createDListElement() {
-    DListElement _e = document.$dom_createElement("dl");
-    return _e;
-  }
-
-  static DataListElement createDataListElement() {
-    DataListElement _e = document.$dom_createElement("datalist");
-    return _e;
-  }
-
-  static DetailsElement createDetailsElement() {
-    DetailsElement _e = document.$dom_createElement("details");
-    return _e;
-  }
-
-  static DivElement createDivElement() {
-    DivElement _e = document.$dom_createElement("div");
-    return _e;
-  }
-
-  static EmbedElement createEmbedElement() {
-    EmbedElement _e = document.$dom_createElement("embed");
-    return _e;
-  }
-
-  static FieldSetElement createFieldSetElement() {
-    FieldSetElement _e = document.$dom_createElement("fieldset");
-    return _e;
-  }
-
-  static FormElement createFormElement() {
-    FormElement _e = document.$dom_createElement("form");
-    return _e;
-  }
-
-  static HRElement createHRElement() {
-    HRElement _e = document.$dom_createElement("hr");
-    return _e;
-  }
-
-  static HeadElement createHeadElement() {
-    HeadElement _e = document.$dom_createElement("head");
-    return _e;
-  }
-
-  static HeadingElement createHeadingElement_h1() {
-    HeadingElement _e = document.$dom_createElement("h1");
-    return _e;
-  }
-
-  static HeadingElement createHeadingElement_h2() {
-    HeadingElement _e = document.$dom_createElement("h2");
-    return _e;
-  }
-
-  static HeadingElement createHeadingElement_h3() {
-    HeadingElement _e = document.$dom_createElement("h3");
-    return _e;
-  }
-
-  static HeadingElement createHeadingElement_h4() {
-    HeadingElement _e = document.$dom_createElement("h4");
-    return _e;
-  }
-
-  static HeadingElement createHeadingElement_h5() {
-    HeadingElement _e = document.$dom_createElement("h5");
-    return _e;
-  }
-
-  static HeadingElement createHeadingElement_h6() {
-    HeadingElement _e = document.$dom_createElement("h6");
-    return _e;
-  }
-
-  static HtmlElement createHtmlElement() {
-    HtmlElement _e = document.$dom_createElement("html");
-    return _e;
-  }
-
-  static IFrameElement createIFrameElement() {
-    IFrameElement _e = document.$dom_createElement("iframe");
-    return _e;
-  }
-
-  static ImageElement createImageElement([String src, int width, int height]) {
-    ImageElement _e = document.$dom_createElement("img");
-    if (src != null) _e.src = src;
-    if (width != null) _e.width = width;
-    if (height != null) _e.height = height;
-    return _e;
-  }
-
-  static InputElement createInputElement([String type]) {
-    InputElement _e = document.$dom_createElement("input");
-    if (type != null) _e.type = type;
-    return _e;
-  }
-
-  static KeygenElement createKeygenElement() {
-    KeygenElement _e = document.$dom_createElement("keygen");
-    return _e;
-  }
-
-  static LIElement createLIElement() {
-    LIElement _e = document.$dom_createElement("li");
-    return _e;
-  }
-
-  static LabelElement createLabelElement() {
-    LabelElement _e = document.$dom_createElement("label");
-    return _e;
-  }
-
-  static LegendElement createLegendElement() {
-    LegendElement _e = document.$dom_createElement("legend");
-    return _e;
-  }
-
-  static LinkElement createLinkElement() {
-    LinkElement _e = document.$dom_createElement("link");
-    return _e;
-  }
-
-  static MapElement createMapElement() {
-    MapElement _e = document.$dom_createElement("map");
-    return _e;
-  }
-
-  static MenuElement createMenuElement() {
-    MenuElement _e = document.$dom_createElement("menu");
-    return _e;
-  }
-
-  static MeterElement createMeterElement() {
-    MeterElement _e = document.$dom_createElement("meter");
-    return _e;
-  }
-
-  static OListElement createOListElement() {
-    OListElement _e = document.$dom_createElement("ol");
-    return _e;
-  }
-
-  static ObjectElement createObjectElement() {
-    ObjectElement _e = document.$dom_createElement("object");
-    return _e;
-  }
-
-  static OptGroupElement createOptGroupElement() {
-    OptGroupElement _e = document.$dom_createElement("optgroup");
-    return _e;
-  }
-
-  static OutputElement createOutputElement() {
-    OutputElement _e = document.$dom_createElement("output");
-    return _e;
-  }
-
-  static ParagraphElement createParagraphElement() {
-    ParagraphElement _e = document.$dom_createElement("p");
-    return _e;
-  }
-
-  static ParamElement createParamElement() {
-    ParamElement _e = document.$dom_createElement("param");
-    return _e;
-  }
-
-  static PreElement createPreElement() {
-    PreElement _e = document.$dom_createElement("pre");
-    return _e;
-  }
-
-  static ProgressElement createProgressElement() {
-    ProgressElement _e = document.$dom_createElement("progress");
-    return _e;
-  }
-
-  static ScriptElement createScriptElement() {
-    ScriptElement _e = document.$dom_createElement("script");
-    return _e;
-  }
-
-  static SelectElement createSelectElement() {
-    SelectElement _e = document.$dom_createElement("select");
-    return _e;
-  }
-
-  static SourceElement createSourceElement() {
-    SourceElement _e = document.$dom_createElement("source");
-    return _e;
-  }
-
-  static SpanElement createSpanElement() {
-    SpanElement _e = document.$dom_createElement("span");
-    return _e;
-  }
-
-  static StyleElement createStyleElement() {
-    StyleElement _e = document.$dom_createElement("style");
-    return _e;
-  }
-
-  static TableCaptionElement createTableCaptionElement() {
-    TableCaptionElement _e = document.$dom_createElement("caption");
-    return _e;
-  }
-
-  static TableCellElement createTableCellElement() {
-    TableCellElement _e = document.$dom_createElement("td");
-    return _e;
-  }
-
-  static TableColElement createTableColElement() {
-    TableColElement _e = document.$dom_createElement("col");
-    return _e;
-  }
-
-  static TableElement createTableElement() {
-    TableElement _e = document.$dom_createElement("table");
-    return _e;
-  }
-
-  static TableRowElement createTableRowElement() {
-    TableRowElement _e = document.$dom_createElement("tr");
-    return _e;
-  }
-
-  static TextAreaElement createTextAreaElement() {
-    TextAreaElement _e = document.$dom_createElement("textarea");
-    return _e;
-  }
-
-  static TitleElement createTitleElement() {
-    TitleElement _e = document.$dom_createElement("title");
-    return _e;
-  }
-
-  static TrackElement createTrackElement() {
-    TrackElement _e = document.$dom_createElement("track");
-    return _e;
-  }
-
-  static UListElement createUListElement() {
-    UListElement _e = document.$dom_createElement("ul");
-    return _e;
-  }
-
-  static VideoElement createVideoElement() {
-    VideoElement _e = document.$dom_createElement("video");
-    return _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.
-
-
-/// @domName EntryArray
+/// @domName EntryArray; @docsEditable true
 class _EntryArray implements JavaScriptIndexingBehavior, List<Entry> native "*EntryArray" {
 
-  /** @domName EntryArray.length */
+  /// @domName EntryArray.length; @docsEditable true
   final int length;
 
   Entry operator[](int index) => JS("Entry", "#[#]", this, index);
@@ -20961,6 +20900,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  Entry get first => this[0];
+
   Entry get last => this[length - 1];
 
   Entry removeLast() {
@@ -20984,7 +20925,7 @@
 
   // -- end List<Entry> mixins.
 
-  /** @domName EntryArray.item */
+  /// @domName EntryArray.item; @docsEditable true
   Entry item(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20992,10 +20933,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName EntryArraySync
+/// @domName EntryArraySync; @docsEditable true
 class _EntryArraySync implements JavaScriptIndexingBehavior, List<EntrySync> native "*EntryArraySync" {
 
-  /** @domName EntryArraySync.length */
+  /// @domName EntryArraySync.length; @docsEditable true
   final int length;
 
   EntrySync operator[](int index) => JS("EntrySync", "#[#]", this, index);
@@ -21058,6 +20999,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  EntrySync get first => this[0];
+
   EntrySync get last => this[length - 1];
 
   EntrySync removeLast() {
@@ -21081,7 +21024,7 @@
 
   // -- end List<EntrySync> mixins.
 
-  /** @domName EntryArraySync.item */
+  /// @domName EntryArraySync.item; @docsEditable true
   EntrySync item(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -21098,10 +21041,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName FileList
+/// @domName FileList; @docsEditable true
 class _FileList implements JavaScriptIndexingBehavior, List<File> native "*FileList" {
 
-  /** @domName FileList.length */
+  /// @domName FileList.length; @docsEditable true
   final int length;
 
   File operator[](int index) => JS("File", "#[#]", this, index);
@@ -21164,6 +21107,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  File get first => this[0];
+
   File get last => this[length - 1];
 
   File removeLast() {
@@ -21187,7 +21132,7 @@
 
   // -- end List<File> mixins.
 
-  /** @domName FileList.item */
+  /// @domName FileList.item; @docsEditable true
   File item(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -21224,10 +21169,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName GamepadList
+/// @domName GamepadList; @docsEditable true
 class _GamepadList implements JavaScriptIndexingBehavior, List<Gamepad> native "*GamepadList" {
 
-  /** @domName GamepadList.length */
+  /// @domName GamepadList.length; @docsEditable true
   final int length;
 
   Gamepad operator[](int index) => JS("Gamepad", "#[#]", this, index);
@@ -21290,6 +21235,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  Gamepad get first => this[0];
+
   Gamepad get last => this[length - 1];
 
   Gamepad removeLast() {
@@ -21313,7 +21260,7 @@
 
   // -- end List<Gamepad> mixins.
 
-  /** @domName GamepadList.item */
+  /// @domName GamepadList.item; @docsEditable true
   Gamepad item(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -21326,12 +21273,12 @@
       JS('HttpRequest', 'new XMLHttpRequest()');
 
   static HttpRequest createHttpRequest_get(String url,
-      onSuccess(HttpRequest request)) =>
-      _HttpRequestUtils.get(url, onSuccess, false);
+      onComplete(HttpRequest request)) =>
+      _HttpRequestUtils.get(url, onComplete, false);
 
   static HttpRequest createHttpRequest_getWithCredentials(String url,
-      onSuccess(HttpRequest request)) =>
-      _HttpRequestUtils.get(url, onSuccess, true);
+      onComplete(HttpRequest request)) =>
+      _HttpRequestUtils.get(url, onComplete, true);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -21374,10 +21321,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName MediaStreamList
+/// @domName MediaStreamList; @docsEditable true
 class _MediaStreamList implements JavaScriptIndexingBehavior, List<MediaStream> native "*MediaStreamList" {
 
-  /** @domName MediaStreamList.length */
+  /// @domName MediaStreamList.length; @docsEditable true
   final int length;
 
   MediaStream operator[](int index) => JS("MediaStream", "#[#]", this, index);
@@ -21440,6 +21387,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  MediaStream get first => this[0];
+
   MediaStream get last => this[length - 1];
 
   MediaStream removeLast() {
@@ -21463,7 +21412,7 @@
 
   // -- end List<MediaStream> mixins.
 
-  /** @domName MediaStreamList.item */
+  /// @domName MediaStreamList.item; @docsEditable true
   MediaStream item(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -21481,20 +21430,10 @@
 
 
 class _MutationObserverFactoryProvider {
-  static MutationObserver createMutationObserver(MutationCallback callback) {
 
-    // This is a hack to cause MutationRecord to appear to be instantiated.
-    //
-    // MutationCallback has a parameter type List<MutationRecord>.  From this we
-    // infer a list is created in the browser, but not the element type, because
-    // other native fields and methods return plain List which is too general
-    // and would imply creating anything.  This statement is a work-around.
-    JS('MutationRecord','0');
-
-    return _createMutationObserver(callback);
-  }
-
-  static MutationObserver _createMutationObserver(MutationCallback callback) native '''
+  @Creates('MutationObserver')
+  @Creates('MutationRecord')
+  static MutationObserver createMutationObserver(MutationCallback callback) native '''
     var constructor =
         window.MutationObserver || window.WebKitMutationObserver ||
         window.MozMutationObserver;
@@ -21516,6 +21455,105 @@
 // 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);
@@ -21634,10 +21672,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SpeechInputResultList
+/// @domName SpeechInputResultList; @docsEditable true
 class _SpeechInputResultList implements JavaScriptIndexingBehavior, List<SpeechInputResult> native "*SpeechInputResultList" {
 
-  /** @domName SpeechInputResultList.length */
+  /// @domName SpeechInputResultList.length; @docsEditable true
   final int length;
 
   SpeechInputResult operator[](int index) => JS("SpeechInputResult", "#[#]", this, index);
@@ -21700,6 +21738,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  SpeechInputResult get first => this[0];
+
   SpeechInputResult get last => this[length - 1];
 
   SpeechInputResult removeLast() {
@@ -21723,7 +21763,7 @@
 
   // -- end List<SpeechInputResult> mixins.
 
-  /** @domName SpeechInputResultList.item */
+  /// @domName SpeechInputResultList.item; @docsEditable true
   SpeechInputResult item(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -21740,10 +21780,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SpeechRecognitionResultList
+/// @domName SpeechRecognitionResultList; @docsEditable true
 class _SpeechRecognitionResultList implements JavaScriptIndexingBehavior, List<SpeechRecognitionResult> native "*SpeechRecognitionResultList" {
 
-  /** @domName SpeechRecognitionResultList.length */
+  /// @domName SpeechRecognitionResultList.length; @docsEditable true
   final int length;
 
   SpeechRecognitionResult operator[](int index) => JS("SpeechRecognitionResult", "#[#]", this, index);
@@ -21806,6 +21846,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  SpeechRecognitionResult get first => this[0];
+
   SpeechRecognitionResult get last => this[length - 1];
 
   SpeechRecognitionResult removeLast() {
@@ -21829,7 +21871,7 @@
 
   // -- end List<SpeechRecognitionResult> mixins.
 
-  /** @domName SpeechRecognitionResultList.item */
+  /// @domName SpeechRecognitionResultList.item; @docsEditable true
   SpeechRecognitionResult item(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -21837,10 +21879,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName StyleSheetList
+/// @domName StyleSheetList; @docsEditable true
 class _StyleSheetList implements JavaScriptIndexingBehavior, List<StyleSheet> native "*StyleSheetList" {
 
-  /** @domName StyleSheetList.length */
+  /// @domName StyleSheetList.length; @docsEditable true
   final int length;
 
   StyleSheet operator[](int index) => JS("StyleSheet", "#[#]", this, index);
@@ -21903,6 +21945,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  StyleSheet get first => this[0];
+
   StyleSheet get last => this[length - 1];
 
   StyleSheet removeLast() {
@@ -21926,7 +21970,7 @@
 
   // -- end List<StyleSheet> mixins.
 
-  /** @domName StyleSheetList.item */
+  /// @domName StyleSheetList.item; @docsEditable true
   StyleSheet item(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -21936,21 +21980,21 @@
 
 class _TextTrackCueFactoryProvider {
   static TextTrackCue createTextTrackCue(
-      String id, num startTime, num endTime, String text,
+      num startTime, num endTime, String text,
       [String settings, bool pauseOnExit]) {
         if (settings == null) {
           return JS('TextTrackCue',
-                    'new TextTrackCue(#,#,#,#)',
-                    id, startTime, endTime, text);
+                    'new TextTrackCue(#,#,#)',
+                    startTime, endTime, text);
         }
         if (pauseOnExit == null) {
           return JS('TextTrackCue',
-                    'new TextTrackCue(#,#,#,#,#)',
-                    id, startTime, endTime, text, settings);
+                    'new TextTrackCue(#,#,#,#)',
+                    startTime, endTime, text, settings);
         }
         return JS('TextTrackCue',
-                  'new TextTrackCue(#,#,#,#,#,#)',
-                  id, startTime, endTime, text, settings, pauseOnExit);
+                  'new TextTrackCue(#,#,#,#,#)',
+                  startTime, endTime, text, settings, pauseOnExit);
   }
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -21958,10 +22002,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName WebKitAnimationList
+/// @domName WebKitAnimationList; @docsEditable true
 class _WebKitAnimationList implements JavaScriptIndexingBehavior, List<Animation> native "*WebKitAnimationList" {
 
-  /** @domName WebKitAnimationList.length */
+  /// @domName WebKitAnimationList.length; @docsEditable true
   final int length;
 
   Animation operator[](int index) => JS("Animation", "#[#]", this, index);
@@ -22024,6 +22068,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  Animation get first => this[0];
+
   Animation get last => this[length - 1];
 
   Animation removeLast() {
@@ -22047,7 +22093,7 @@
 
   // -- end List<Animation> mixins.
 
-  /** @domName WebKitAnimationList.item */
+  /// @domName WebKitAnimationList.item; @docsEditable true
   Animation item(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22091,19 +22137,88 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
+/**
+ * An object representing the top-level context object for web scripting.
+ *
+ * In a web browser, a [Window] object represents the actual browser window.
+ * In a multi-tabbed browser, each tab has its own [Window] object. A [Window]
+ * is the container that displays a [Document]'s content. All web scripting
+ * happens within the context of a [Window] object.
+ *
+ * **Note:** This class represents any window, whereas [LocalWindow] is
+ * used to access the properties and content of the current window.
+ *
+ * See also:
+ *
+ * * [DOM Window](https://developer.mozilla.org/en-US/docs/DOM/window) from MDN.
+ * * [Window](http://www.w3.org/TR/Window/) from the W3C.
+ */
 abstract class Window {
   // Fields.
+
+  /**
+   * The current location of this window.
+   *
+   *     Location currentLocation = window.location;
+   *     print(currentLocation.href); // 'http://www.example.com:80/'
+   */
   Location get location;
   History get history;
 
+  /**
+   * Indicates whether this window is closed.
+   *
+   *     print(window.closed); // 'false'
+   *     window.close();
+   *     print(window.closed); // 'true'
+   */
   bool get closed;
+
+  /**
+   * A reference to the window that opened this one.
+   *
+   *     Window thisWindow = window;
+   *     Window otherWindow = thisWindow.open('http://www.example.com/', 'foo');
+   *     print(otherWindow.opener == thisWindow); // 'true'
+   */
   Window get opener;
+
+  /**
+   * A reference to the parent of this window.
+   *
+   * If this [Window] has no parent, [parent] will return a reference to
+   * the [Window] itself.
+   *
+   *     IFrameElement myIFrame = new IFrameElement();
+   *     window.document.body.elements.add(myIFrame);
+   *     print(myIframe.contentWindow.parent == window) // 'true'
+   *
+   *     print(window.parent == window) // 'true'
+   */
   Window get parent;
+
+  /**
+   * A reference to the topmost window in the window hierarchy.
+   *
+   * If this [Window] is the topmost [Window], [top] will return a reference to
+   * the [Window] itself.
+   *
+   *     // Add an IFrame to the current window.
+   *     IFrameElement myIFrame = new IFrameElement();
+   *     window.document.body.elements.add(myIFrame);
+   *
+   *     // Add an IFrame inside of the other IFrame.
+   *     IFrameElement innerIFrame = new IFrameElement();
+   *     myIFrame.elements.add(innerIFrame);
+   *
+   *     print(myIframe.contentWindow.top == window) // 'true'
+   *     print(innerIFrame.contentWindow.top == window) // 'true'
+   *
+   *     print(window.top == window) // 'true'
+   */
   Window get top;
 
   // Methods.
-  void focus();
-  void blur();
   void close();
   void postMessage(var message, String targetOrigin, [List messagePorts = null]);
 }
@@ -22384,6 +22499,8 @@
     return _filtered.lastIndexOf(element, start);
   }
 
+  Element get first => _filtered.first;
+
   Element get last => _filtered.last;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -24064,7 +24181,7 @@
 Map _convertNativeToDart_Dictionary(object) {
   if (object == null) return null;
   var dict = {};
-  for (final key in JS('List', 'Object.getOwnPropertyNames(#)', object)) {
+  for (final key in JS('=List', 'Object.getOwnPropertyNames(#)', object)) {
     dict[key] = JS('var', '#[#]', object, key);
   }
   return dict;
@@ -24241,7 +24358,7 @@
       var copy = readSlot(slot);
       if (copy != null) {
         if (true == copy) {  // Cycle, so commit to making a copy.
-          copy = JS('List', 'new Array(#)', length);
+          copy = JS('=List', 'new Array(#)', length);
           writeSlot(slot, copy);
         }
         return copy;
@@ -24261,7 +24378,7 @@
           if (!identical(elementCopy, element)) {
             copy = readSlot(slot);   // Cyclic reference may have created it.
             if (true == copy) {
-              copy = JS('List', 'new Array(#)', length);
+              copy = JS('=List', 'new Array(#)', length);
               writeSlot(slot, copy);
             }
             for (int j = 0; j < i; j++) {
@@ -24278,7 +24395,7 @@
         }
       } else {
         // Not a JavaScript Array.  We are forced to make a copy.
-        copy = JS('List', 'new Array(#)', length);
+        copy = JS('=List', 'new Array(#)', length);
         writeSlot(slot, copy);
       }
 
@@ -24358,7 +24475,7 @@
       copy = {};
 
       writeSlot(slot, copy);
-      for (final key in JS('List', 'Object.keys(#)', e)) {
+      for (final key in JS('=List', 'Object.keys(#)', e)) {
         copy[key] = walk(JS('var', '#[#]', e, key));
       }
       return copy;
@@ -24372,7 +24489,7 @@
       int length = e.length;
       // Since a JavaScript Array is an instance of Dart List, we can modify it
       // in-place unless we must copy.
-      copy = mustCopy ? JS('List', 'new Array(#)', length) : e;
+      copy = mustCopy ? JS('=List', 'new Array(#)', length) : e;
       writeSlot(slot, copy);
 
       for (int i = 0; i < length; i++) {
@@ -24398,6 +24515,23 @@
     JS('bool', 'Object.getPrototypeOf(#) === Object.prototype', value);
 bool _isImmutableJavaScriptArray(value) =>
     JS('bool', r'!!(#.immutable$list)', value);
+
+
+
+const String _serializedScriptValue =
+    'num|String|bool|'
+    '=List|=Object|'
+    'Blob|File|ArrayBuffer|ArrayBufferView'
+    // TODO(sra): Add Date, RegExp.
+    ;
+const _annotation_Creates_SerializedScriptValue =
+    const Creates(_serializedScriptValue);
+const _annotation_Returns_SerializedScriptValue =
+    const Returns(_serializedScriptValue);
+
+const String _idbKey = '=List|=Object|num|String';  // TODO(sra): Add Date.
+const _annotation_Creates_IDBKey = const Creates(_idbKey);
+const _annotation_Returns_IDBKey = const Returns(_idbKey);
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
@@ -24427,10 +24561,6 @@
   Window get top => _createSafe(JS('Window', '#.top', _window));
 
   // Methods.
-  void focus() => JS('void', '#.focus()', _window);
-
-  void blur() => JS('void', '#.blur()', _window);
-
   void close() => JS('void', '#.close()', _window);
 
   void postMessage(var message, String targetOrigin, [List messagePorts = null]) {
diff --git a/sdk/lib/html/dartium/html_dartium.dart b/sdk/lib/html/dartium/html_dartium.dart
index c025901..e430f59 100644
--- a/sdk/lib/html/dartium/html_dartium.dart
+++ b/sdk/lib/html/dartium/html_dartium.dart
@@ -70,9 +70,7 @@
 class AbstractWorker extends EventTarget {
   AbstractWorker.internal(): super.internal();
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   AbstractWorkerEvents get on =>
     new AbstractWorkerEvents(this);
 
@@ -166,10 +164,9 @@
 class AnchorElement extends _Element_Merged {
 
   factory AnchorElement({String href}) {
-    if (!?href) {
-      return _Elements.createAnchorElement();
-    }
-    return _Elements.createAnchorElement(href);
+    var e = document.$dom_createElement("a");
+    if (href != null) e.href = href;
+    return e;
   }
   AnchorElement.internal(): super.internal();
 
@@ -536,7 +533,7 @@
 /// @domName HTMLAreaElement
 class AreaElement extends _Element_Merged {
 
-  factory AreaElement() => _Elements.createAreaElement();
+  factory AreaElement() => document.$dom_createElement("area");
   AreaElement.internal(): super.internal();
 
 
@@ -862,9 +859,7 @@
   factory AudioContext() => _AudioContextFactoryProvider.createAudioContext();
   AudioContext.internal(): super.internal();
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   AudioContextEvents get on =>
     new AudioContextEvents(this);
 
@@ -1277,7 +1272,7 @@
 /// @domName HTMLBRElement
 class BRElement extends _Element_Merged {
 
-  factory BRElement() => _Elements.createBRElement();
+  factory BRElement() => document.$dom_createElement("br");
   BRElement.internal(): super.internal();
 
 
@@ -1315,7 +1310,7 @@
 /// @domName HTMLBaseElement
 class BaseElement extends _Element_Merged {
 
-  factory BaseElement() => _Elements.createBaseElement();
+  factory BaseElement() => document.$dom_createElement("base");
   BaseElement.internal(): super.internal();
 
 
@@ -1382,9 +1377,7 @@
 class BatteryManager extends EventTarget {
   BatteryManager.internal(): super.internal();
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   BatteryManagerEvents get on =>
     new BatteryManagerEvents(this);
 
@@ -1566,12 +1559,10 @@
 /// @domName HTMLBodyElement
 class BodyElement extends _Element_Merged {
 
-  factory BodyElement() => _Elements.createBodyElement();
+  factory BodyElement() => document.$dom_createElement("body");
   BodyElement.internal(): super.internal();
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   BodyElementEvents get on =>
     new BodyElementEvents(this);
 
@@ -1656,7 +1647,7 @@
 /// @domName HTMLButtonElement
 class ButtonElement extends _Element_Merged {
 
-  factory ButtonElement() => _Elements.createButtonElement();
+  factory ButtonElement() => document.$dom_createElement("button");
   ButtonElement.internal(): super.internal();
 
 
@@ -2424,12 +2415,39 @@
 
 
   // TODO(jacobr): generate this list of properties using the existing script.
-    /** Gets the value of "animation" */
+  /** Gets the value of "align-content" */
+  String get alignContent =>
+    getPropertyValue('${_browserPrefix}align-content');
+
+  /** Sets the value of "align-content" */
+  void set alignContent(String value) {
+    setProperty('${_browserPrefix}align-content', value, '');
+  }
+
+  /** Gets the value of "align-items" */
+  String get alignItems =>
+    getPropertyValue('${_browserPrefix}align-items');
+
+  /** Sets the value of "align-items" */
+  void set alignItems(String value) {
+    setProperty('${_browserPrefix}align-items', value, '');
+  }
+
+  /** Gets the value of "align-self" */
+  String get alignSelf =>
+    getPropertyValue('${_browserPrefix}align-self');
+
+  /** Sets the value of "align-self" */
+  void set alignSelf(String value) {
+    setProperty('${_browserPrefix}align-self', value, '');
+  }
+
+  /** Gets the value of "animation" */
   String get animation =>
     getPropertyValue('${_browserPrefix}animation');
 
   /** Sets the value of "animation" */
-  void set animation(var value) {
+  void set animation(String value) {
     setProperty('${_browserPrefix}animation', value, '');
   }
 
@@ -2438,7 +2456,7 @@
     getPropertyValue('${_browserPrefix}animation-delay');
 
   /** Sets the value of "animation-delay" */
-  void set animationDelay(var value) {
+  void set animationDelay(String value) {
     setProperty('${_browserPrefix}animation-delay', value, '');
   }
 
@@ -2447,7 +2465,7 @@
     getPropertyValue('${_browserPrefix}animation-direction');
 
   /** Sets the value of "animation-direction" */
-  void set animationDirection(var value) {
+  void set animationDirection(String value) {
     setProperty('${_browserPrefix}animation-direction', value, '');
   }
 
@@ -2456,7 +2474,7 @@
     getPropertyValue('${_browserPrefix}animation-duration');
 
   /** Sets the value of "animation-duration" */
-  void set animationDuration(var value) {
+  void set animationDuration(String value) {
     setProperty('${_browserPrefix}animation-duration', value, '');
   }
 
@@ -2465,7 +2483,7 @@
     getPropertyValue('${_browserPrefix}animation-fill-mode');
 
   /** Sets the value of "animation-fill-mode" */
-  void set animationFillMode(var value) {
+  void set animationFillMode(String value) {
     setProperty('${_browserPrefix}animation-fill-mode', value, '');
   }
 
@@ -2474,7 +2492,7 @@
     getPropertyValue('${_browserPrefix}animation-iteration-count');
 
   /** Sets the value of "animation-iteration-count" */
-  void set animationIterationCount(var value) {
+  void set animationIterationCount(String value) {
     setProperty('${_browserPrefix}animation-iteration-count', value, '');
   }
 
@@ -2483,7 +2501,7 @@
     getPropertyValue('${_browserPrefix}animation-name');
 
   /** Sets the value of "animation-name" */
-  void set animationName(var value) {
+  void set animationName(String value) {
     setProperty('${_browserPrefix}animation-name', value, '');
   }
 
@@ -2492,7 +2510,7 @@
     getPropertyValue('${_browserPrefix}animation-play-state');
 
   /** Sets the value of "animation-play-state" */
-  void set animationPlayState(var value) {
+  void set animationPlayState(String value) {
     setProperty('${_browserPrefix}animation-play-state', value, '');
   }
 
@@ -2501,25 +2519,43 @@
     getPropertyValue('${_browserPrefix}animation-timing-function');
 
   /** Sets the value of "animation-timing-function" */
-  void set animationTimingFunction(var value) {
+  void set animationTimingFunction(String value) {
     setProperty('${_browserPrefix}animation-timing-function', value, '');
   }
 
+  /** Gets the value of "app-region" */
+  String get appRegion =>
+    getPropertyValue('${_browserPrefix}app-region');
+
+  /** Sets the value of "app-region" */
+  void set appRegion(String value) {
+    setProperty('${_browserPrefix}app-region', value, '');
+  }
+
   /** Gets the value of "appearance" */
   String get appearance =>
     getPropertyValue('${_browserPrefix}appearance');
 
   /** Sets the value of "appearance" */
-  void set appearance(var value) {
+  void set appearance(String value) {
     setProperty('${_browserPrefix}appearance', value, '');
   }
 
+  /** Gets the value of "aspect-ratio" */
+  String get aspectRatio =>
+    getPropertyValue('${_browserPrefix}aspect-ratio');
+
+  /** Sets the value of "aspect-ratio" */
+  void set aspectRatio(String value) {
+    setProperty('${_browserPrefix}aspect-ratio', value, '');
+  }
+
   /** Gets the value of "backface-visibility" */
   String get backfaceVisibility =>
     getPropertyValue('${_browserPrefix}backface-visibility');
 
   /** Sets the value of "backface-visibility" */
-  void set backfaceVisibility(var value) {
+  void set backfaceVisibility(String value) {
     setProperty('${_browserPrefix}backface-visibility', value, '');
   }
 
@@ -2528,7 +2564,7 @@
     getPropertyValue('background');
 
   /** Sets the value of "background" */
-  void set background(var value) {
+  void set background(String value) {
     setProperty('background', value, '');
   }
 
@@ -2537,7 +2573,7 @@
     getPropertyValue('background-attachment');
 
   /** Sets the value of "background-attachment" */
-  void set backgroundAttachment(var value) {
+  void set backgroundAttachment(String value) {
     setProperty('background-attachment', value, '');
   }
 
@@ -2546,7 +2582,7 @@
     getPropertyValue('background-clip');
 
   /** Sets the value of "background-clip" */
-  void set backgroundClip(var value) {
+  void set backgroundClip(String value) {
     setProperty('background-clip', value, '');
   }
 
@@ -2555,7 +2591,7 @@
     getPropertyValue('background-color');
 
   /** Sets the value of "background-color" */
-  void set backgroundColor(var value) {
+  void set backgroundColor(String value) {
     setProperty('background-color', value, '');
   }
 
@@ -2564,7 +2600,7 @@
     getPropertyValue('${_browserPrefix}background-composite');
 
   /** Sets the value of "background-composite" */
-  void set backgroundComposite(var value) {
+  void set backgroundComposite(String value) {
     setProperty('${_browserPrefix}background-composite', value, '');
   }
 
@@ -2573,7 +2609,7 @@
     getPropertyValue('background-image');
 
   /** Sets the value of "background-image" */
-  void set backgroundImage(var value) {
+  void set backgroundImage(String value) {
     setProperty('background-image', value, '');
   }
 
@@ -2582,7 +2618,7 @@
     getPropertyValue('background-origin');
 
   /** Sets the value of "background-origin" */
-  void set backgroundOrigin(var value) {
+  void set backgroundOrigin(String value) {
     setProperty('background-origin', value, '');
   }
 
@@ -2591,7 +2627,7 @@
     getPropertyValue('background-position');
 
   /** Sets the value of "background-position" */
-  void set backgroundPosition(var value) {
+  void set backgroundPosition(String value) {
     setProperty('background-position', value, '');
   }
 
@@ -2600,7 +2636,7 @@
     getPropertyValue('background-position-x');
 
   /** Sets the value of "background-position-x" */
-  void set backgroundPositionX(var value) {
+  void set backgroundPositionX(String value) {
     setProperty('background-position-x', value, '');
   }
 
@@ -2609,7 +2645,7 @@
     getPropertyValue('background-position-y');
 
   /** Sets the value of "background-position-y" */
-  void set backgroundPositionY(var value) {
+  void set backgroundPositionY(String value) {
     setProperty('background-position-y', value, '');
   }
 
@@ -2618,7 +2654,7 @@
     getPropertyValue('background-repeat');
 
   /** Sets the value of "background-repeat" */
-  void set backgroundRepeat(var value) {
+  void set backgroundRepeat(String value) {
     setProperty('background-repeat', value, '');
   }
 
@@ -2627,7 +2663,7 @@
     getPropertyValue('background-repeat-x');
 
   /** Sets the value of "background-repeat-x" */
-  void set backgroundRepeatX(var value) {
+  void set backgroundRepeatX(String value) {
     setProperty('background-repeat-x', value, '');
   }
 
@@ -2636,7 +2672,7 @@
     getPropertyValue('background-repeat-y');
 
   /** Sets the value of "background-repeat-y" */
-  void set backgroundRepeatY(var value) {
+  void set backgroundRepeatY(String value) {
     setProperty('background-repeat-y', value, '');
   }
 
@@ -2645,16 +2681,25 @@
     getPropertyValue('background-size');
 
   /** Sets the value of "background-size" */
-  void set backgroundSize(var value) {
+  void set backgroundSize(String value) {
     setProperty('background-size', value, '');
   }
 
+  /** Gets the value of "blend-mode" */
+  String get blendMode =>
+    getPropertyValue('${_browserPrefix}blend-mode');
+
+  /** Sets the value of "blend-mode" */
+  void set blendMode(String value) {
+    setProperty('${_browserPrefix}blend-mode', value, '');
+  }
+
   /** Gets the value of "border" */
   String get border =>
     getPropertyValue('border');
 
   /** Sets the value of "border" */
-  void set border(var value) {
+  void set border(String value) {
     setProperty('border', value, '');
   }
 
@@ -2663,7 +2708,7 @@
     getPropertyValue('${_browserPrefix}border-after');
 
   /** Sets the value of "border-after" */
-  void set borderAfter(var value) {
+  void set borderAfter(String value) {
     setProperty('${_browserPrefix}border-after', value, '');
   }
 
@@ -2672,7 +2717,7 @@
     getPropertyValue('${_browserPrefix}border-after-color');
 
   /** Sets the value of "border-after-color" */
-  void set borderAfterColor(var value) {
+  void set borderAfterColor(String value) {
     setProperty('${_browserPrefix}border-after-color', value, '');
   }
 
@@ -2681,7 +2726,7 @@
     getPropertyValue('${_browserPrefix}border-after-style');
 
   /** Sets the value of "border-after-style" */
-  void set borderAfterStyle(var value) {
+  void set borderAfterStyle(String value) {
     setProperty('${_browserPrefix}border-after-style', value, '');
   }
 
@@ -2690,7 +2735,7 @@
     getPropertyValue('${_browserPrefix}border-after-width');
 
   /** Sets the value of "border-after-width" */
-  void set borderAfterWidth(var value) {
+  void set borderAfterWidth(String value) {
     setProperty('${_browserPrefix}border-after-width', value, '');
   }
 
@@ -2699,7 +2744,7 @@
     getPropertyValue('${_browserPrefix}border-before');
 
   /** Sets the value of "border-before" */
-  void set borderBefore(var value) {
+  void set borderBefore(String value) {
     setProperty('${_browserPrefix}border-before', value, '');
   }
 
@@ -2708,7 +2753,7 @@
     getPropertyValue('${_browserPrefix}border-before-color');
 
   /** Sets the value of "border-before-color" */
-  void set borderBeforeColor(var value) {
+  void set borderBeforeColor(String value) {
     setProperty('${_browserPrefix}border-before-color', value, '');
   }
 
@@ -2717,7 +2762,7 @@
     getPropertyValue('${_browserPrefix}border-before-style');
 
   /** Sets the value of "border-before-style" */
-  void set borderBeforeStyle(var value) {
+  void set borderBeforeStyle(String value) {
     setProperty('${_browserPrefix}border-before-style', value, '');
   }
 
@@ -2726,7 +2771,7 @@
     getPropertyValue('${_browserPrefix}border-before-width');
 
   /** Sets the value of "border-before-width" */
-  void set borderBeforeWidth(var value) {
+  void set borderBeforeWidth(String value) {
     setProperty('${_browserPrefix}border-before-width', value, '');
   }
 
@@ -2735,7 +2780,7 @@
     getPropertyValue('border-bottom');
 
   /** Sets the value of "border-bottom" */
-  void set borderBottom(var value) {
+  void set borderBottom(String value) {
     setProperty('border-bottom', value, '');
   }
 
@@ -2744,7 +2789,7 @@
     getPropertyValue('border-bottom-color');
 
   /** Sets the value of "border-bottom-color" */
-  void set borderBottomColor(var value) {
+  void set borderBottomColor(String value) {
     setProperty('border-bottom-color', value, '');
   }
 
@@ -2753,7 +2798,7 @@
     getPropertyValue('border-bottom-left-radius');
 
   /** Sets the value of "border-bottom-left-radius" */
-  void set borderBottomLeftRadius(var value) {
+  void set borderBottomLeftRadius(String value) {
     setProperty('border-bottom-left-radius', value, '');
   }
 
@@ -2762,7 +2807,7 @@
     getPropertyValue('border-bottom-right-radius');
 
   /** Sets the value of "border-bottom-right-radius" */
-  void set borderBottomRightRadius(var value) {
+  void set borderBottomRightRadius(String value) {
     setProperty('border-bottom-right-radius', value, '');
   }
 
@@ -2771,7 +2816,7 @@
     getPropertyValue('border-bottom-style');
 
   /** Sets the value of "border-bottom-style" */
-  void set borderBottomStyle(var value) {
+  void set borderBottomStyle(String value) {
     setProperty('border-bottom-style', value, '');
   }
 
@@ -2780,7 +2825,7 @@
     getPropertyValue('border-bottom-width');
 
   /** Sets the value of "border-bottom-width" */
-  void set borderBottomWidth(var value) {
+  void set borderBottomWidth(String value) {
     setProperty('border-bottom-width', value, '');
   }
 
@@ -2789,7 +2834,7 @@
     getPropertyValue('border-collapse');
 
   /** Sets the value of "border-collapse" */
-  void set borderCollapse(var value) {
+  void set borderCollapse(String value) {
     setProperty('border-collapse', value, '');
   }
 
@@ -2798,7 +2843,7 @@
     getPropertyValue('border-color');
 
   /** Sets the value of "border-color" */
-  void set borderColor(var value) {
+  void set borderColor(String value) {
     setProperty('border-color', value, '');
   }
 
@@ -2807,7 +2852,7 @@
     getPropertyValue('${_browserPrefix}border-end');
 
   /** Sets the value of "border-end" */
-  void set borderEnd(var value) {
+  void set borderEnd(String value) {
     setProperty('${_browserPrefix}border-end', value, '');
   }
 
@@ -2816,7 +2861,7 @@
     getPropertyValue('${_browserPrefix}border-end-color');
 
   /** Sets the value of "border-end-color" */
-  void set borderEndColor(var value) {
+  void set borderEndColor(String value) {
     setProperty('${_browserPrefix}border-end-color', value, '');
   }
 
@@ -2825,7 +2870,7 @@
     getPropertyValue('${_browserPrefix}border-end-style');
 
   /** Sets the value of "border-end-style" */
-  void set borderEndStyle(var value) {
+  void set borderEndStyle(String value) {
     setProperty('${_browserPrefix}border-end-style', value, '');
   }
 
@@ -2834,7 +2879,7 @@
     getPropertyValue('${_browserPrefix}border-end-width');
 
   /** Sets the value of "border-end-width" */
-  void set borderEndWidth(var value) {
+  void set borderEndWidth(String value) {
     setProperty('${_browserPrefix}border-end-width', value, '');
   }
 
@@ -2843,7 +2888,7 @@
     getPropertyValue('${_browserPrefix}border-fit');
 
   /** Sets the value of "border-fit" */
-  void set borderFit(var value) {
+  void set borderFit(String value) {
     setProperty('${_browserPrefix}border-fit', value, '');
   }
 
@@ -2852,7 +2897,7 @@
     getPropertyValue('${_browserPrefix}border-horizontal-spacing');
 
   /** Sets the value of "border-horizontal-spacing" */
-  void set borderHorizontalSpacing(var value) {
+  void set borderHorizontalSpacing(String value) {
     setProperty('${_browserPrefix}border-horizontal-spacing', value, '');
   }
 
@@ -2861,7 +2906,7 @@
     getPropertyValue('border-image');
 
   /** Sets the value of "border-image" */
-  void set borderImage(var value) {
+  void set borderImage(String value) {
     setProperty('border-image', value, '');
   }
 
@@ -2870,7 +2915,7 @@
     getPropertyValue('border-image-outset');
 
   /** Sets the value of "border-image-outset" */
-  void set borderImageOutset(var value) {
+  void set borderImageOutset(String value) {
     setProperty('border-image-outset', value, '');
   }
 
@@ -2879,7 +2924,7 @@
     getPropertyValue('border-image-repeat');
 
   /** Sets the value of "border-image-repeat" */
-  void set borderImageRepeat(var value) {
+  void set borderImageRepeat(String value) {
     setProperty('border-image-repeat', value, '');
   }
 
@@ -2888,7 +2933,7 @@
     getPropertyValue('border-image-slice');
 
   /** Sets the value of "border-image-slice" */
-  void set borderImageSlice(var value) {
+  void set borderImageSlice(String value) {
     setProperty('border-image-slice', value, '');
   }
 
@@ -2897,7 +2942,7 @@
     getPropertyValue('border-image-source');
 
   /** Sets the value of "border-image-source" */
-  void set borderImageSource(var value) {
+  void set borderImageSource(String value) {
     setProperty('border-image-source', value, '');
   }
 
@@ -2906,7 +2951,7 @@
     getPropertyValue('border-image-width');
 
   /** Sets the value of "border-image-width" */
-  void set borderImageWidth(var value) {
+  void set borderImageWidth(String value) {
     setProperty('border-image-width', value, '');
   }
 
@@ -2915,7 +2960,7 @@
     getPropertyValue('border-left');
 
   /** Sets the value of "border-left" */
-  void set borderLeft(var value) {
+  void set borderLeft(String value) {
     setProperty('border-left', value, '');
   }
 
@@ -2924,7 +2969,7 @@
     getPropertyValue('border-left-color');
 
   /** Sets the value of "border-left-color" */
-  void set borderLeftColor(var value) {
+  void set borderLeftColor(String value) {
     setProperty('border-left-color', value, '');
   }
 
@@ -2933,7 +2978,7 @@
     getPropertyValue('border-left-style');
 
   /** Sets the value of "border-left-style" */
-  void set borderLeftStyle(var value) {
+  void set borderLeftStyle(String value) {
     setProperty('border-left-style', value, '');
   }
 
@@ -2942,7 +2987,7 @@
     getPropertyValue('border-left-width');
 
   /** Sets the value of "border-left-width" */
-  void set borderLeftWidth(var value) {
+  void set borderLeftWidth(String value) {
     setProperty('border-left-width', value, '');
   }
 
@@ -2951,7 +2996,7 @@
     getPropertyValue('border-radius');
 
   /** Sets the value of "border-radius" */
-  void set borderRadius(var value) {
+  void set borderRadius(String value) {
     setProperty('border-radius', value, '');
   }
 
@@ -2960,7 +3005,7 @@
     getPropertyValue('border-right');
 
   /** Sets the value of "border-right" */
-  void set borderRight(var value) {
+  void set borderRight(String value) {
     setProperty('border-right', value, '');
   }
 
@@ -2969,7 +3014,7 @@
     getPropertyValue('border-right-color');
 
   /** Sets the value of "border-right-color" */
-  void set borderRightColor(var value) {
+  void set borderRightColor(String value) {
     setProperty('border-right-color', value, '');
   }
 
@@ -2978,7 +3023,7 @@
     getPropertyValue('border-right-style');
 
   /** Sets the value of "border-right-style" */
-  void set borderRightStyle(var value) {
+  void set borderRightStyle(String value) {
     setProperty('border-right-style', value, '');
   }
 
@@ -2987,7 +3032,7 @@
     getPropertyValue('border-right-width');
 
   /** Sets the value of "border-right-width" */
-  void set borderRightWidth(var value) {
+  void set borderRightWidth(String value) {
     setProperty('border-right-width', value, '');
   }
 
@@ -2996,7 +3041,7 @@
     getPropertyValue('border-spacing');
 
   /** Sets the value of "border-spacing" */
-  void set borderSpacing(var value) {
+  void set borderSpacing(String value) {
     setProperty('border-spacing', value, '');
   }
 
@@ -3005,7 +3050,7 @@
     getPropertyValue('${_browserPrefix}border-start');
 
   /** Sets the value of "border-start" */
-  void set borderStart(var value) {
+  void set borderStart(String value) {
     setProperty('${_browserPrefix}border-start', value, '');
   }
 
@@ -3014,7 +3059,7 @@
     getPropertyValue('${_browserPrefix}border-start-color');
 
   /** Sets the value of "border-start-color" */
-  void set borderStartColor(var value) {
+  void set borderStartColor(String value) {
     setProperty('${_browserPrefix}border-start-color', value, '');
   }
 
@@ -3023,7 +3068,7 @@
     getPropertyValue('${_browserPrefix}border-start-style');
 
   /** Sets the value of "border-start-style" */
-  void set borderStartStyle(var value) {
+  void set borderStartStyle(String value) {
     setProperty('${_browserPrefix}border-start-style', value, '');
   }
 
@@ -3032,7 +3077,7 @@
     getPropertyValue('${_browserPrefix}border-start-width');
 
   /** Sets the value of "border-start-width" */
-  void set borderStartWidth(var value) {
+  void set borderStartWidth(String value) {
     setProperty('${_browserPrefix}border-start-width', value, '');
   }
 
@@ -3041,7 +3086,7 @@
     getPropertyValue('border-style');
 
   /** Sets the value of "border-style" */
-  void set borderStyle(var value) {
+  void set borderStyle(String value) {
     setProperty('border-style', value, '');
   }
 
@@ -3050,7 +3095,7 @@
     getPropertyValue('border-top');
 
   /** Sets the value of "border-top" */
-  void set borderTop(var value) {
+  void set borderTop(String value) {
     setProperty('border-top', value, '');
   }
 
@@ -3059,7 +3104,7 @@
     getPropertyValue('border-top-color');
 
   /** Sets the value of "border-top-color" */
-  void set borderTopColor(var value) {
+  void set borderTopColor(String value) {
     setProperty('border-top-color', value, '');
   }
 
@@ -3068,7 +3113,7 @@
     getPropertyValue('border-top-left-radius');
 
   /** Sets the value of "border-top-left-radius" */
-  void set borderTopLeftRadius(var value) {
+  void set borderTopLeftRadius(String value) {
     setProperty('border-top-left-radius', value, '');
   }
 
@@ -3077,7 +3122,7 @@
     getPropertyValue('border-top-right-radius');
 
   /** Sets the value of "border-top-right-radius" */
-  void set borderTopRightRadius(var value) {
+  void set borderTopRightRadius(String value) {
     setProperty('border-top-right-radius', value, '');
   }
 
@@ -3086,7 +3131,7 @@
     getPropertyValue('border-top-style');
 
   /** Sets the value of "border-top-style" */
-  void set borderTopStyle(var value) {
+  void set borderTopStyle(String value) {
     setProperty('border-top-style', value, '');
   }
 
@@ -3095,7 +3140,7 @@
     getPropertyValue('border-top-width');
 
   /** Sets the value of "border-top-width" */
-  void set borderTopWidth(var value) {
+  void set borderTopWidth(String value) {
     setProperty('border-top-width', value, '');
   }
 
@@ -3104,7 +3149,7 @@
     getPropertyValue('${_browserPrefix}border-vertical-spacing');
 
   /** Sets the value of "border-vertical-spacing" */
-  void set borderVerticalSpacing(var value) {
+  void set borderVerticalSpacing(String value) {
     setProperty('${_browserPrefix}border-vertical-spacing', value, '');
   }
 
@@ -3113,7 +3158,7 @@
     getPropertyValue('border-width');
 
   /** Sets the value of "border-width" */
-  void set borderWidth(var value) {
+  void set borderWidth(String value) {
     setProperty('border-width', value, '');
   }
 
@@ -3122,7 +3167,7 @@
     getPropertyValue('bottom');
 
   /** Sets the value of "bottom" */
-  void set bottom(var value) {
+  void set bottom(String value) {
     setProperty('bottom', value, '');
   }
 
@@ -3131,16 +3176,25 @@
     getPropertyValue('${_browserPrefix}box-align');
 
   /** Sets the value of "box-align" */
-  void set boxAlign(var value) {
+  void set boxAlign(String value) {
     setProperty('${_browserPrefix}box-align', value, '');
   }
 
+  /** Gets the value of "box-decoration-break" */
+  String get boxDecorationBreak =>
+    getPropertyValue('${_browserPrefix}box-decoration-break');
+
+  /** Sets the value of "box-decoration-break" */
+  void set boxDecorationBreak(String value) {
+    setProperty('${_browserPrefix}box-decoration-break', value, '');
+  }
+
   /** Gets the value of "box-direction" */
   String get boxDirection =>
     getPropertyValue('${_browserPrefix}box-direction');
 
   /** Sets the value of "box-direction" */
-  void set boxDirection(var value) {
+  void set boxDirection(String value) {
     setProperty('${_browserPrefix}box-direction', value, '');
   }
 
@@ -3149,7 +3203,7 @@
     getPropertyValue('${_browserPrefix}box-flex');
 
   /** Sets the value of "box-flex" */
-  void set boxFlex(var value) {
+  void set boxFlex(String value) {
     setProperty('${_browserPrefix}box-flex', value, '');
   }
 
@@ -3158,7 +3212,7 @@
     getPropertyValue('${_browserPrefix}box-flex-group');
 
   /** Sets the value of "box-flex-group" */
-  void set boxFlexGroup(var value) {
+  void set boxFlexGroup(String value) {
     setProperty('${_browserPrefix}box-flex-group', value, '');
   }
 
@@ -3167,7 +3221,7 @@
     getPropertyValue('${_browserPrefix}box-lines');
 
   /** Sets the value of "box-lines" */
-  void set boxLines(var value) {
+  void set boxLines(String value) {
     setProperty('${_browserPrefix}box-lines', value, '');
   }
 
@@ -3176,7 +3230,7 @@
     getPropertyValue('${_browserPrefix}box-ordinal-group');
 
   /** Sets the value of "box-ordinal-group" */
-  void set boxOrdinalGroup(var value) {
+  void set boxOrdinalGroup(String value) {
     setProperty('${_browserPrefix}box-ordinal-group', value, '');
   }
 
@@ -3185,7 +3239,7 @@
     getPropertyValue('${_browserPrefix}box-orient');
 
   /** Sets the value of "box-orient" */
-  void set boxOrient(var value) {
+  void set boxOrient(String value) {
     setProperty('${_browserPrefix}box-orient', value, '');
   }
 
@@ -3194,7 +3248,7 @@
     getPropertyValue('${_browserPrefix}box-pack');
 
   /** Sets the value of "box-pack" */
-  void set boxPack(var value) {
+  void set boxPack(String value) {
     setProperty('${_browserPrefix}box-pack', value, '');
   }
 
@@ -3203,7 +3257,7 @@
     getPropertyValue('${_browserPrefix}box-reflect');
 
   /** Sets the value of "box-reflect" */
-  void set boxReflect(var value) {
+  void set boxReflect(String value) {
     setProperty('${_browserPrefix}box-reflect', value, '');
   }
 
@@ -3212,7 +3266,7 @@
     getPropertyValue('box-shadow');
 
   /** Sets the value of "box-shadow" */
-  void set boxShadow(var value) {
+  void set boxShadow(String value) {
     setProperty('box-shadow', value, '');
   }
 
@@ -3221,7 +3275,7 @@
     getPropertyValue('box-sizing');
 
   /** Sets the value of "box-sizing" */
-  void set boxSizing(var value) {
+  void set boxSizing(String value) {
     setProperty('box-sizing', value, '');
   }
 
@@ -3230,7 +3284,7 @@
     getPropertyValue('caption-side');
 
   /** Sets the value of "caption-side" */
-  void set captionSide(var value) {
+  void set captionSide(String value) {
     setProperty('caption-side', value, '');
   }
 
@@ -3239,7 +3293,7 @@
     getPropertyValue('clear');
 
   /** Sets the value of "clear" */
-  void set clear(var value) {
+  void set clear(String value) {
     setProperty('clear', value, '');
   }
 
@@ -3248,16 +3302,25 @@
     getPropertyValue('clip');
 
   /** Sets the value of "clip" */
-  void set clip(var value) {
+  void set clip(String value) {
     setProperty('clip', value, '');
   }
 
+  /** Gets the value of "clip-path" */
+  String get clipPath =>
+    getPropertyValue('${_browserPrefix}clip-path');
+
+  /** Sets the value of "clip-path" */
+  void set clipPath(String value) {
+    setProperty('${_browserPrefix}clip-path', value, '');
+  }
+
   /** Gets the value of "color" */
   String get color =>
     getPropertyValue('color');
 
   /** Sets the value of "color" */
-  void set color(var value) {
+  void set color(String value) {
     setProperty('color', value, '');
   }
 
@@ -3266,16 +3329,25 @@
     getPropertyValue('${_browserPrefix}color-correction');
 
   /** Sets the value of "color-correction" */
-  void set colorCorrection(var value) {
+  void set colorCorrection(String value) {
     setProperty('${_browserPrefix}color-correction', value, '');
   }
 
+  /** Gets the value of "column-axis" */
+  String get columnAxis =>
+    getPropertyValue('${_browserPrefix}column-axis');
+
+  /** Sets the value of "column-axis" */
+  void set columnAxis(String value) {
+    setProperty('${_browserPrefix}column-axis', value, '');
+  }
+
   /** Gets the value of "column-break-after" */
   String get columnBreakAfter =>
     getPropertyValue('${_browserPrefix}column-break-after');
 
   /** Sets the value of "column-break-after" */
-  void set columnBreakAfter(var value) {
+  void set columnBreakAfter(String value) {
     setProperty('${_browserPrefix}column-break-after', value, '');
   }
 
@@ -3284,7 +3356,7 @@
     getPropertyValue('${_browserPrefix}column-break-before');
 
   /** Sets the value of "column-break-before" */
-  void set columnBreakBefore(var value) {
+  void set columnBreakBefore(String value) {
     setProperty('${_browserPrefix}column-break-before', value, '');
   }
 
@@ -3293,7 +3365,7 @@
     getPropertyValue('${_browserPrefix}column-break-inside');
 
   /** Sets the value of "column-break-inside" */
-  void set columnBreakInside(var value) {
+  void set columnBreakInside(String value) {
     setProperty('${_browserPrefix}column-break-inside', value, '');
   }
 
@@ -3302,7 +3374,7 @@
     getPropertyValue('${_browserPrefix}column-count');
 
   /** Sets the value of "column-count" */
-  void set columnCount(var value) {
+  void set columnCount(String value) {
     setProperty('${_browserPrefix}column-count', value, '');
   }
 
@@ -3311,16 +3383,25 @@
     getPropertyValue('${_browserPrefix}column-gap');
 
   /** Sets the value of "column-gap" */
-  void set columnGap(var value) {
+  void set columnGap(String value) {
     setProperty('${_browserPrefix}column-gap', value, '');
   }
 
+  /** Gets the value of "column-progression" */
+  String get columnProgression =>
+    getPropertyValue('${_browserPrefix}column-progression');
+
+  /** Sets the value of "column-progression" */
+  void set columnProgression(String value) {
+    setProperty('${_browserPrefix}column-progression', value, '');
+  }
+
   /** Gets the value of "column-rule" */
   String get columnRule =>
     getPropertyValue('${_browserPrefix}column-rule');
 
   /** Sets the value of "column-rule" */
-  void set columnRule(var value) {
+  void set columnRule(String value) {
     setProperty('${_browserPrefix}column-rule', value, '');
   }
 
@@ -3329,7 +3410,7 @@
     getPropertyValue('${_browserPrefix}column-rule-color');
 
   /** Sets the value of "column-rule-color" */
-  void set columnRuleColor(var value) {
+  void set columnRuleColor(String value) {
     setProperty('${_browserPrefix}column-rule-color', value, '');
   }
 
@@ -3338,7 +3419,7 @@
     getPropertyValue('${_browserPrefix}column-rule-style');
 
   /** Sets the value of "column-rule-style" */
-  void set columnRuleStyle(var value) {
+  void set columnRuleStyle(String value) {
     setProperty('${_browserPrefix}column-rule-style', value, '');
   }
 
@@ -3347,7 +3428,7 @@
     getPropertyValue('${_browserPrefix}column-rule-width');
 
   /** Sets the value of "column-rule-width" */
-  void set columnRuleWidth(var value) {
+  void set columnRuleWidth(String value) {
     setProperty('${_browserPrefix}column-rule-width', value, '');
   }
 
@@ -3356,7 +3437,7 @@
     getPropertyValue('${_browserPrefix}column-span');
 
   /** Sets the value of "column-span" */
-  void set columnSpan(var value) {
+  void set columnSpan(String value) {
     setProperty('${_browserPrefix}column-span', value, '');
   }
 
@@ -3365,7 +3446,7 @@
     getPropertyValue('${_browserPrefix}column-width');
 
   /** Sets the value of "column-width" */
-  void set columnWidth(var value) {
+  void set columnWidth(String value) {
     setProperty('${_browserPrefix}column-width', value, '');
   }
 
@@ -3374,7 +3455,7 @@
     getPropertyValue('${_browserPrefix}columns');
 
   /** Sets the value of "columns" */
-  void set columns(var value) {
+  void set columns(String value) {
     setProperty('${_browserPrefix}columns', value, '');
   }
 
@@ -3383,7 +3464,7 @@
     getPropertyValue('content');
 
   /** Sets the value of "content" */
-  void set content(var value) {
+  void set content(String value) {
     setProperty('content', value, '');
   }
 
@@ -3392,7 +3473,7 @@
     getPropertyValue('counter-increment');
 
   /** Sets the value of "counter-increment" */
-  void set counterIncrement(var value) {
+  void set counterIncrement(String value) {
     setProperty('counter-increment', value, '');
   }
 
@@ -3401,7 +3482,7 @@
     getPropertyValue('counter-reset');
 
   /** Sets the value of "counter-reset" */
-  void set counterReset(var value) {
+  void set counterReset(String value) {
     setProperty('counter-reset', value, '');
   }
 
@@ -3410,16 +3491,25 @@
     getPropertyValue('cursor');
 
   /** Sets the value of "cursor" */
-  void set cursor(var value) {
+  void set cursor(String value) {
     setProperty('cursor', value, '');
   }
 
+  /** Gets the value of "dashboard-region" */
+  String get dashboardRegion =>
+    getPropertyValue('${_browserPrefix}dashboard-region');
+
+  /** Sets the value of "dashboard-region" */
+  void set dashboardRegion(String value) {
+    setProperty('${_browserPrefix}dashboard-region', value, '');
+  }
+
   /** Gets the value of "direction" */
   String get direction =>
     getPropertyValue('direction');
 
   /** Sets the value of "direction" */
-  void set direction(var value) {
+  void set direction(String value) {
     setProperty('direction', value, '');
   }
 
@@ -3428,7 +3518,7 @@
     getPropertyValue('display');
 
   /** Sets the value of "display" */
-  void set display(var value) {
+  void set display(String value) {
     setProperty('display', value, '');
   }
 
@@ -3437,7 +3527,7 @@
     getPropertyValue('empty-cells');
 
   /** Sets the value of "empty-cells" */
-  void set emptyCells(var value) {
+  void set emptyCells(String value) {
     setProperty('empty-cells', value, '');
   }
 
@@ -3446,17 +3536,35 @@
     getPropertyValue('${_browserPrefix}filter');
 
   /** Sets the value of "filter" */
-  void set filter(var value) {
+  void set filter(String value) {
     setProperty('${_browserPrefix}filter', value, '');
   }
 
-  /** Gets the value of "flex-align" */
-  String get flexAlign =>
-    getPropertyValue('${_browserPrefix}flex-align');
+  /** Gets the value of "flex" */
+  String get flex =>
+    getPropertyValue('${_browserPrefix}flex');
 
-  /** Sets the value of "flex-align" */
-  void set flexAlign(var value) {
-    setProperty('${_browserPrefix}flex-align', value, '');
+  /** Sets the value of "flex" */
+  void set flex(String value) {
+    setProperty('${_browserPrefix}flex', value, '');
+  }
+
+  /** Gets the value of "flex-basis" */
+  String get flexBasis =>
+    getPropertyValue('${_browserPrefix}flex-basis');
+
+  /** Sets the value of "flex-basis" */
+  void set flexBasis(String value) {
+    setProperty('${_browserPrefix}flex-basis', value, '');
+  }
+
+  /** Gets the value of "flex-direction" */
+  String get flexDirection =>
+    getPropertyValue('${_browserPrefix}flex-direction');
+
+  /** Sets the value of "flex-direction" */
+  void set flexDirection(String value) {
+    setProperty('${_browserPrefix}flex-direction', value, '');
   }
 
   /** Gets the value of "flex-flow" */
@@ -3464,26 +3572,35 @@
     getPropertyValue('${_browserPrefix}flex-flow');
 
   /** Sets the value of "flex-flow" */
-  void set flexFlow(var value) {
+  void set flexFlow(String value) {
     setProperty('${_browserPrefix}flex-flow', value, '');
   }
 
-  /** Gets the value of "flex-order" */
-  String get flexOrder =>
-    getPropertyValue('${_browserPrefix}flex-order');
+  /** Gets the value of "flex-grow" */
+  String get flexGrow =>
+    getPropertyValue('${_browserPrefix}flex-grow');
 
-  /** Sets the value of "flex-order" */
-  void set flexOrder(var value) {
-    setProperty('${_browserPrefix}flex-order', value, '');
+  /** Sets the value of "flex-grow" */
+  void set flexGrow(String value) {
+    setProperty('${_browserPrefix}flex-grow', value, '');
   }
 
-  /** Gets the value of "flex-pack" */
-  String get flexPack =>
-    getPropertyValue('${_browserPrefix}flex-pack');
+  /** Gets the value of "flex-shrink" */
+  String get flexShrink =>
+    getPropertyValue('${_browserPrefix}flex-shrink');
 
-  /** Sets the value of "flex-pack" */
-  void set flexPack(var value) {
-    setProperty('${_browserPrefix}flex-pack', value, '');
+  /** Sets the value of "flex-shrink" */
+  void set flexShrink(String value) {
+    setProperty('${_browserPrefix}flex-shrink', value, '');
+  }
+
+  /** Gets the value of "flex-wrap" */
+  String get flexWrap =>
+    getPropertyValue('${_browserPrefix}flex-wrap');
+
+  /** Sets the value of "flex-wrap" */
+  void set flexWrap(String value) {
+    setProperty('${_browserPrefix}flex-wrap', value, '');
   }
 
   /** Gets the value of "float" */
@@ -3491,7 +3608,7 @@
     getPropertyValue('float');
 
   /** Sets the value of "float" */
-  void set float(var value) {
+  void set float(String value) {
     setProperty('float', value, '');
   }
 
@@ -3500,7 +3617,7 @@
     getPropertyValue('${_browserPrefix}flow-from');
 
   /** Sets the value of "flow-from" */
-  void set flowFrom(var value) {
+  void set flowFrom(String value) {
     setProperty('${_browserPrefix}flow-from', value, '');
   }
 
@@ -3509,7 +3626,7 @@
     getPropertyValue('${_browserPrefix}flow-into');
 
   /** Sets the value of "flow-into" */
-  void set flowInto(var value) {
+  void set flowInto(String value) {
     setProperty('${_browserPrefix}flow-into', value, '');
   }
 
@@ -3518,7 +3635,7 @@
     getPropertyValue('font');
 
   /** Sets the value of "font" */
-  void set font(var value) {
+  void set font(String value) {
     setProperty('font', value, '');
   }
 
@@ -3527,7 +3644,7 @@
     getPropertyValue('font-family');
 
   /** Sets the value of "font-family" */
-  void set fontFamily(var value) {
+  void set fontFamily(String value) {
     setProperty('font-family', value, '');
   }
 
@@ -3536,16 +3653,25 @@
     getPropertyValue('${_browserPrefix}font-feature-settings');
 
   /** Sets the value of "font-feature-settings" */
-  void set fontFeatureSettings(var value) {
+  void set fontFeatureSettings(String value) {
     setProperty('${_browserPrefix}font-feature-settings', value, '');
   }
 
+  /** Gets the value of "font-kerning" */
+  String get fontKerning =>
+    getPropertyValue('${_browserPrefix}font-kerning');
+
+  /** Sets the value of "font-kerning" */
+  void set fontKerning(String value) {
+    setProperty('${_browserPrefix}font-kerning', value, '');
+  }
+
   /** Gets the value of "font-size" */
   String get fontSize =>
     getPropertyValue('font-size');
 
   /** Sets the value of "font-size" */
-  void set fontSize(var value) {
+  void set fontSize(String value) {
     setProperty('font-size', value, '');
   }
 
@@ -3554,7 +3680,7 @@
     getPropertyValue('${_browserPrefix}font-size-delta');
 
   /** Sets the value of "font-size-delta" */
-  void set fontSizeDelta(var value) {
+  void set fontSizeDelta(String value) {
     setProperty('${_browserPrefix}font-size-delta', value, '');
   }
 
@@ -3563,7 +3689,7 @@
     getPropertyValue('${_browserPrefix}font-smoothing');
 
   /** Sets the value of "font-smoothing" */
-  void set fontSmoothing(var value) {
+  void set fontSmoothing(String value) {
     setProperty('${_browserPrefix}font-smoothing', value, '');
   }
 
@@ -3572,7 +3698,7 @@
     getPropertyValue('font-stretch');
 
   /** Sets the value of "font-stretch" */
-  void set fontStretch(var value) {
+  void set fontStretch(String value) {
     setProperty('font-stretch', value, '');
   }
 
@@ -3581,7 +3707,7 @@
     getPropertyValue('font-style');
 
   /** Sets the value of "font-style" */
-  void set fontStyle(var value) {
+  void set fontStyle(String value) {
     setProperty('font-style', value, '');
   }
 
@@ -3590,25 +3716,70 @@
     getPropertyValue('font-variant');
 
   /** Sets the value of "font-variant" */
-  void set fontVariant(var value) {
+  void set fontVariant(String value) {
     setProperty('font-variant', value, '');
   }
 
+  /** Gets the value of "font-variant-ligatures" */
+  String get fontVariantLigatures =>
+    getPropertyValue('${_browserPrefix}font-variant-ligatures');
+
+  /** Sets the value of "font-variant-ligatures" */
+  void set fontVariantLigatures(String value) {
+    setProperty('${_browserPrefix}font-variant-ligatures', value, '');
+  }
+
   /** Gets the value of "font-weight" */
   String get fontWeight =>
     getPropertyValue('font-weight');
 
   /** Sets the value of "font-weight" */
-  void set fontWeight(var value) {
+  void set fontWeight(String value) {
     setProperty('font-weight', value, '');
   }
 
+  /** Gets the value of "grid-column" */
+  String get gridColumn =>
+    getPropertyValue('${_browserPrefix}grid-column');
+
+  /** Sets the value of "grid-column" */
+  void set gridColumn(String value) {
+    setProperty('${_browserPrefix}grid-column', value, '');
+  }
+
+  /** Gets the value of "grid-columns" */
+  String get gridColumns =>
+    getPropertyValue('${_browserPrefix}grid-columns');
+
+  /** Sets the value of "grid-columns" */
+  void set gridColumns(String value) {
+    setProperty('${_browserPrefix}grid-columns', value, '');
+  }
+
+  /** Gets the value of "grid-row" */
+  String get gridRow =>
+    getPropertyValue('${_browserPrefix}grid-row');
+
+  /** Sets the value of "grid-row" */
+  void set gridRow(String value) {
+    setProperty('${_browserPrefix}grid-row', value, '');
+  }
+
+  /** Gets the value of "grid-rows" */
+  String get gridRows =>
+    getPropertyValue('${_browserPrefix}grid-rows');
+
+  /** Sets the value of "grid-rows" */
+  void set gridRows(String value) {
+    setProperty('${_browserPrefix}grid-rows', value, '');
+  }
+
   /** Gets the value of "height" */
   String get height =>
     getPropertyValue('height');
 
   /** Sets the value of "height" */
-  void set height(var value) {
+  void set height(String value) {
     setProperty('height', value, '');
   }
 
@@ -3617,7 +3788,7 @@
     getPropertyValue('${_browserPrefix}highlight');
 
   /** Sets the value of "highlight" */
-  void set highlight(var value) {
+  void set highlight(String value) {
     setProperty('${_browserPrefix}highlight', value, '');
   }
 
@@ -3626,7 +3797,7 @@
     getPropertyValue('${_browserPrefix}hyphenate-character');
 
   /** Sets the value of "hyphenate-character" */
-  void set hyphenateCharacter(var value) {
+  void set hyphenateCharacter(String value) {
     setProperty('${_browserPrefix}hyphenate-character', value, '');
   }
 
@@ -3635,7 +3806,7 @@
     getPropertyValue('${_browserPrefix}hyphenate-limit-after');
 
   /** Sets the value of "hyphenate-limit-after" */
-  void set hyphenateLimitAfter(var value) {
+  void set hyphenateLimitAfter(String value) {
     setProperty('${_browserPrefix}hyphenate-limit-after', value, '');
   }
 
@@ -3644,7 +3815,7 @@
     getPropertyValue('${_browserPrefix}hyphenate-limit-before');
 
   /** Sets the value of "hyphenate-limit-before" */
-  void set hyphenateLimitBefore(var value) {
+  void set hyphenateLimitBefore(String value) {
     setProperty('${_browserPrefix}hyphenate-limit-before', value, '');
   }
 
@@ -3653,7 +3824,7 @@
     getPropertyValue('${_browserPrefix}hyphenate-limit-lines');
 
   /** Sets the value of "hyphenate-limit-lines" */
-  void set hyphenateLimitLines(var value) {
+  void set hyphenateLimitLines(String value) {
     setProperty('${_browserPrefix}hyphenate-limit-lines', value, '');
   }
 
@@ -3662,25 +3833,52 @@
     getPropertyValue('${_browserPrefix}hyphens');
 
   /** Sets the value of "hyphens" */
-  void set hyphens(var value) {
+  void set hyphens(String value) {
     setProperty('${_browserPrefix}hyphens', value, '');
   }
 
+  /** Gets the value of "image-orientation" */
+  String get imageOrientation =>
+    getPropertyValue('image-orientation');
+
+  /** Sets the value of "image-orientation" */
+  void set imageOrientation(String value) {
+    setProperty('image-orientation', value, '');
+  }
+
   /** Gets the value of "image-rendering" */
   String get imageRendering =>
     getPropertyValue('image-rendering');
 
   /** Sets the value of "image-rendering" */
-  void set imageRendering(var value) {
+  void set imageRendering(String value) {
     setProperty('image-rendering', value, '');
   }
 
+  /** Gets the value of "image-resolution" */
+  String get imageResolution =>
+    getPropertyValue('image-resolution');
+
+  /** Sets the value of "image-resolution" */
+  void set imageResolution(String value) {
+    setProperty('image-resolution', value, '');
+  }
+
+  /** Gets the value of "justify-content" */
+  String get justifyContent =>
+    getPropertyValue('${_browserPrefix}justify-content');
+
+  /** Sets the value of "justify-content" */
+  void set justifyContent(String value) {
+    setProperty('${_browserPrefix}justify-content', value, '');
+  }
+
   /** Gets the value of "left" */
   String get left =>
     getPropertyValue('left');
 
   /** Sets the value of "left" */
-  void set left(var value) {
+  void set left(String value) {
     setProperty('left', value, '');
   }
 
@@ -3689,16 +3887,25 @@
     getPropertyValue('letter-spacing');
 
   /** Sets the value of "letter-spacing" */
-  void set letterSpacing(var value) {
+  void set letterSpacing(String value) {
     setProperty('letter-spacing', value, '');
   }
 
+  /** Gets the value of "line-align" */
+  String get lineAlign =>
+    getPropertyValue('${_browserPrefix}line-align');
+
+  /** Sets the value of "line-align" */
+  void set lineAlign(String value) {
+    setProperty('${_browserPrefix}line-align', value, '');
+  }
+
   /** Gets the value of "line-box-contain" */
   String get lineBoxContain =>
     getPropertyValue('${_browserPrefix}line-box-contain');
 
   /** Sets the value of "line-box-contain" */
-  void set lineBoxContain(var value) {
+  void set lineBoxContain(String value) {
     setProperty('${_browserPrefix}line-box-contain', value, '');
   }
 
@@ -3707,7 +3914,7 @@
     getPropertyValue('${_browserPrefix}line-break');
 
   /** Sets the value of "line-break" */
-  void set lineBreak(var value) {
+  void set lineBreak(String value) {
     setProperty('${_browserPrefix}line-break', value, '');
   }
 
@@ -3716,25 +3923,43 @@
     getPropertyValue('${_browserPrefix}line-clamp');
 
   /** Sets the value of "line-clamp" */
-  void set lineClamp(var value) {
+  void set lineClamp(String value) {
     setProperty('${_browserPrefix}line-clamp', value, '');
   }
 
+  /** Gets the value of "line-grid" */
+  String get lineGrid =>
+    getPropertyValue('${_browserPrefix}line-grid');
+
+  /** Sets the value of "line-grid" */
+  void set lineGrid(String value) {
+    setProperty('${_browserPrefix}line-grid', value, '');
+  }
+
   /** Gets the value of "line-height" */
   String get lineHeight =>
     getPropertyValue('line-height');
 
   /** Sets the value of "line-height" */
-  void set lineHeight(var value) {
+  void set lineHeight(String value) {
     setProperty('line-height', value, '');
   }
 
+  /** Gets the value of "line-snap" */
+  String get lineSnap =>
+    getPropertyValue('${_browserPrefix}line-snap');
+
+  /** Sets the value of "line-snap" */
+  void set lineSnap(String value) {
+    setProperty('${_browserPrefix}line-snap', value, '');
+  }
+
   /** Gets the value of "list-style" */
   String get listStyle =>
     getPropertyValue('list-style');
 
   /** Sets the value of "list-style" */
-  void set listStyle(var value) {
+  void set listStyle(String value) {
     setProperty('list-style', value, '');
   }
 
@@ -3743,7 +3968,7 @@
     getPropertyValue('list-style-image');
 
   /** Sets the value of "list-style-image" */
-  void set listStyleImage(var value) {
+  void set listStyleImage(String value) {
     setProperty('list-style-image', value, '');
   }
 
@@ -3752,7 +3977,7 @@
     getPropertyValue('list-style-position');
 
   /** Sets the value of "list-style-position" */
-  void set listStylePosition(var value) {
+  void set listStylePosition(String value) {
     setProperty('list-style-position', value, '');
   }
 
@@ -3761,7 +3986,7 @@
     getPropertyValue('list-style-type');
 
   /** Sets the value of "list-style-type" */
-  void set listStyleType(var value) {
+  void set listStyleType(String value) {
     setProperty('list-style-type', value, '');
   }
 
@@ -3770,7 +3995,7 @@
     getPropertyValue('${_browserPrefix}locale');
 
   /** Sets the value of "locale" */
-  void set locale(var value) {
+  void set locale(String value) {
     setProperty('${_browserPrefix}locale', value, '');
   }
 
@@ -3779,7 +4004,7 @@
     getPropertyValue('${_browserPrefix}logical-height');
 
   /** Sets the value of "logical-height" */
-  void set logicalHeight(var value) {
+  void set logicalHeight(String value) {
     setProperty('${_browserPrefix}logical-height', value, '');
   }
 
@@ -3788,7 +4013,7 @@
     getPropertyValue('${_browserPrefix}logical-width');
 
   /** Sets the value of "logical-width" */
-  void set logicalWidth(var value) {
+  void set logicalWidth(String value) {
     setProperty('${_browserPrefix}logical-width', value, '');
   }
 
@@ -3797,7 +4022,7 @@
     getPropertyValue('margin');
 
   /** Sets the value of "margin" */
-  void set margin(var value) {
+  void set margin(String value) {
     setProperty('margin', value, '');
   }
 
@@ -3806,7 +4031,7 @@
     getPropertyValue('${_browserPrefix}margin-after');
 
   /** Sets the value of "margin-after" */
-  void set marginAfter(var value) {
+  void set marginAfter(String value) {
     setProperty('${_browserPrefix}margin-after', value, '');
   }
 
@@ -3815,7 +4040,7 @@
     getPropertyValue('${_browserPrefix}margin-after-collapse');
 
   /** Sets the value of "margin-after-collapse" */
-  void set marginAfterCollapse(var value) {
+  void set marginAfterCollapse(String value) {
     setProperty('${_browserPrefix}margin-after-collapse', value, '');
   }
 
@@ -3824,7 +4049,7 @@
     getPropertyValue('${_browserPrefix}margin-before');
 
   /** Sets the value of "margin-before" */
-  void set marginBefore(var value) {
+  void set marginBefore(String value) {
     setProperty('${_browserPrefix}margin-before', value, '');
   }
 
@@ -3833,7 +4058,7 @@
     getPropertyValue('${_browserPrefix}margin-before-collapse');
 
   /** Sets the value of "margin-before-collapse" */
-  void set marginBeforeCollapse(var value) {
+  void set marginBeforeCollapse(String value) {
     setProperty('${_browserPrefix}margin-before-collapse', value, '');
   }
 
@@ -3842,7 +4067,7 @@
     getPropertyValue('margin-bottom');
 
   /** Sets the value of "margin-bottom" */
-  void set marginBottom(var value) {
+  void set marginBottom(String value) {
     setProperty('margin-bottom', value, '');
   }
 
@@ -3851,7 +4076,7 @@
     getPropertyValue('${_browserPrefix}margin-bottom-collapse');
 
   /** Sets the value of "margin-bottom-collapse" */
-  void set marginBottomCollapse(var value) {
+  void set marginBottomCollapse(String value) {
     setProperty('${_browserPrefix}margin-bottom-collapse', value, '');
   }
 
@@ -3860,7 +4085,7 @@
     getPropertyValue('${_browserPrefix}margin-collapse');
 
   /** Sets the value of "margin-collapse" */
-  void set marginCollapse(var value) {
+  void set marginCollapse(String value) {
     setProperty('${_browserPrefix}margin-collapse', value, '');
   }
 
@@ -3869,7 +4094,7 @@
     getPropertyValue('${_browserPrefix}margin-end');
 
   /** Sets the value of "margin-end" */
-  void set marginEnd(var value) {
+  void set marginEnd(String value) {
     setProperty('${_browserPrefix}margin-end', value, '');
   }
 
@@ -3878,7 +4103,7 @@
     getPropertyValue('margin-left');
 
   /** Sets the value of "margin-left" */
-  void set marginLeft(var value) {
+  void set marginLeft(String value) {
     setProperty('margin-left', value, '');
   }
 
@@ -3887,7 +4112,7 @@
     getPropertyValue('margin-right');
 
   /** Sets the value of "margin-right" */
-  void set marginRight(var value) {
+  void set marginRight(String value) {
     setProperty('margin-right', value, '');
   }
 
@@ -3896,7 +4121,7 @@
     getPropertyValue('${_browserPrefix}margin-start');
 
   /** Sets the value of "margin-start" */
-  void set marginStart(var value) {
+  void set marginStart(String value) {
     setProperty('${_browserPrefix}margin-start', value, '');
   }
 
@@ -3905,7 +4130,7 @@
     getPropertyValue('margin-top');
 
   /** Sets the value of "margin-top" */
-  void set marginTop(var value) {
+  void set marginTop(String value) {
     setProperty('margin-top', value, '');
   }
 
@@ -3914,7 +4139,7 @@
     getPropertyValue('${_browserPrefix}margin-top-collapse');
 
   /** Sets the value of "margin-top-collapse" */
-  void set marginTopCollapse(var value) {
+  void set marginTopCollapse(String value) {
     setProperty('${_browserPrefix}margin-top-collapse', value, '');
   }
 
@@ -3923,7 +4148,7 @@
     getPropertyValue('${_browserPrefix}marquee');
 
   /** Sets the value of "marquee" */
-  void set marquee(var value) {
+  void set marquee(String value) {
     setProperty('${_browserPrefix}marquee', value, '');
   }
 
@@ -3932,7 +4157,7 @@
     getPropertyValue('${_browserPrefix}marquee-direction');
 
   /** Sets the value of "marquee-direction" */
-  void set marqueeDirection(var value) {
+  void set marqueeDirection(String value) {
     setProperty('${_browserPrefix}marquee-direction', value, '');
   }
 
@@ -3941,7 +4166,7 @@
     getPropertyValue('${_browserPrefix}marquee-increment');
 
   /** Sets the value of "marquee-increment" */
-  void set marqueeIncrement(var value) {
+  void set marqueeIncrement(String value) {
     setProperty('${_browserPrefix}marquee-increment', value, '');
   }
 
@@ -3950,7 +4175,7 @@
     getPropertyValue('${_browserPrefix}marquee-repetition');
 
   /** Sets the value of "marquee-repetition" */
-  void set marqueeRepetition(var value) {
+  void set marqueeRepetition(String value) {
     setProperty('${_browserPrefix}marquee-repetition', value, '');
   }
 
@@ -3959,7 +4184,7 @@
     getPropertyValue('${_browserPrefix}marquee-speed');
 
   /** Sets the value of "marquee-speed" */
-  void set marqueeSpeed(var value) {
+  void set marqueeSpeed(String value) {
     setProperty('${_browserPrefix}marquee-speed', value, '');
   }
 
@@ -3968,7 +4193,7 @@
     getPropertyValue('${_browserPrefix}marquee-style');
 
   /** Sets the value of "marquee-style" */
-  void set marqueeStyle(var value) {
+  void set marqueeStyle(String value) {
     setProperty('${_browserPrefix}marquee-style', value, '');
   }
 
@@ -3977,7 +4202,7 @@
     getPropertyValue('${_browserPrefix}mask');
 
   /** Sets the value of "mask" */
-  void set mask(var value) {
+  void set mask(String value) {
     setProperty('${_browserPrefix}mask', value, '');
   }
 
@@ -3986,7 +4211,7 @@
     getPropertyValue('${_browserPrefix}mask-attachment');
 
   /** Sets the value of "mask-attachment" */
-  void set maskAttachment(var value) {
+  void set maskAttachment(String value) {
     setProperty('${_browserPrefix}mask-attachment', value, '');
   }
 
@@ -3995,7 +4220,7 @@
     getPropertyValue('${_browserPrefix}mask-box-image');
 
   /** Sets the value of "mask-box-image" */
-  void set maskBoxImage(var value) {
+  void set maskBoxImage(String value) {
     setProperty('${_browserPrefix}mask-box-image', value, '');
   }
 
@@ -4004,7 +4229,7 @@
     getPropertyValue('${_browserPrefix}mask-box-image-outset');
 
   /** Sets the value of "mask-box-image-outset" */
-  void set maskBoxImageOutset(var value) {
+  void set maskBoxImageOutset(String value) {
     setProperty('${_browserPrefix}mask-box-image-outset', value, '');
   }
 
@@ -4013,7 +4238,7 @@
     getPropertyValue('${_browserPrefix}mask-box-image-repeat');
 
   /** Sets the value of "mask-box-image-repeat" */
-  void set maskBoxImageRepeat(var value) {
+  void set maskBoxImageRepeat(String value) {
     setProperty('${_browserPrefix}mask-box-image-repeat', value, '');
   }
 
@@ -4022,7 +4247,7 @@
     getPropertyValue('${_browserPrefix}mask-box-image-slice');
 
   /** Sets the value of "mask-box-image-slice" */
-  void set maskBoxImageSlice(var value) {
+  void set maskBoxImageSlice(String value) {
     setProperty('${_browserPrefix}mask-box-image-slice', value, '');
   }
 
@@ -4031,7 +4256,7 @@
     getPropertyValue('${_browserPrefix}mask-box-image-source');
 
   /** Sets the value of "mask-box-image-source" */
-  void set maskBoxImageSource(var value) {
+  void set maskBoxImageSource(String value) {
     setProperty('${_browserPrefix}mask-box-image-source', value, '');
   }
 
@@ -4040,7 +4265,7 @@
     getPropertyValue('${_browserPrefix}mask-box-image-width');
 
   /** Sets the value of "mask-box-image-width" */
-  void set maskBoxImageWidth(var value) {
+  void set maskBoxImageWidth(String value) {
     setProperty('${_browserPrefix}mask-box-image-width', value, '');
   }
 
@@ -4049,7 +4274,7 @@
     getPropertyValue('${_browserPrefix}mask-clip');
 
   /** Sets the value of "mask-clip" */
-  void set maskClip(var value) {
+  void set maskClip(String value) {
     setProperty('${_browserPrefix}mask-clip', value, '');
   }
 
@@ -4058,7 +4283,7 @@
     getPropertyValue('${_browserPrefix}mask-composite');
 
   /** Sets the value of "mask-composite" */
-  void set maskComposite(var value) {
+  void set maskComposite(String value) {
     setProperty('${_browserPrefix}mask-composite', value, '');
   }
 
@@ -4067,7 +4292,7 @@
     getPropertyValue('${_browserPrefix}mask-image');
 
   /** Sets the value of "mask-image" */
-  void set maskImage(var value) {
+  void set maskImage(String value) {
     setProperty('${_browserPrefix}mask-image', value, '');
   }
 
@@ -4076,7 +4301,7 @@
     getPropertyValue('${_browserPrefix}mask-origin');
 
   /** Sets the value of "mask-origin" */
-  void set maskOrigin(var value) {
+  void set maskOrigin(String value) {
     setProperty('${_browserPrefix}mask-origin', value, '');
   }
 
@@ -4085,7 +4310,7 @@
     getPropertyValue('${_browserPrefix}mask-position');
 
   /** Sets the value of "mask-position" */
-  void set maskPosition(var value) {
+  void set maskPosition(String value) {
     setProperty('${_browserPrefix}mask-position', value, '');
   }
 
@@ -4094,7 +4319,7 @@
     getPropertyValue('${_browserPrefix}mask-position-x');
 
   /** Sets the value of "mask-position-x" */
-  void set maskPositionX(var value) {
+  void set maskPositionX(String value) {
     setProperty('${_browserPrefix}mask-position-x', value, '');
   }
 
@@ -4103,7 +4328,7 @@
     getPropertyValue('${_browserPrefix}mask-position-y');
 
   /** Sets the value of "mask-position-y" */
-  void set maskPositionY(var value) {
+  void set maskPositionY(String value) {
     setProperty('${_browserPrefix}mask-position-y', value, '');
   }
 
@@ -4112,7 +4337,7 @@
     getPropertyValue('${_browserPrefix}mask-repeat');
 
   /** Sets the value of "mask-repeat" */
-  void set maskRepeat(var value) {
+  void set maskRepeat(String value) {
     setProperty('${_browserPrefix}mask-repeat', value, '');
   }
 
@@ -4121,7 +4346,7 @@
     getPropertyValue('${_browserPrefix}mask-repeat-x');
 
   /** Sets the value of "mask-repeat-x" */
-  void set maskRepeatX(var value) {
+  void set maskRepeatX(String value) {
     setProperty('${_browserPrefix}mask-repeat-x', value, '');
   }
 
@@ -4130,7 +4355,7 @@
     getPropertyValue('${_browserPrefix}mask-repeat-y');
 
   /** Sets the value of "mask-repeat-y" */
-  void set maskRepeatY(var value) {
+  void set maskRepeatY(String value) {
     setProperty('${_browserPrefix}mask-repeat-y', value, '');
   }
 
@@ -4139,25 +4364,16 @@
     getPropertyValue('${_browserPrefix}mask-size');
 
   /** Sets the value of "mask-size" */
-  void set maskSize(var value) {
+  void set maskSize(String value) {
     setProperty('${_browserPrefix}mask-size', value, '');
   }
 
-  /** Gets the value of "match-nearest-mail-blockquote-color" */
-  String get matchNearestMailBlockquoteColor =>
-    getPropertyValue('${_browserPrefix}match-nearest-mail-blockquote-color');
-
-  /** Sets the value of "match-nearest-mail-blockquote-color" */
-  void set matchNearestMailBlockquoteColor(var value) {
-    setProperty('${_browserPrefix}match-nearest-mail-blockquote-color', value, '');
-  }
-
   /** Gets the value of "max-height" */
   String get maxHeight =>
     getPropertyValue('max-height');
 
   /** Sets the value of "max-height" */
-  void set maxHeight(var value) {
+  void set maxHeight(String value) {
     setProperty('max-height', value, '');
   }
 
@@ -4166,7 +4382,7 @@
     getPropertyValue('${_browserPrefix}max-logical-height');
 
   /** Sets the value of "max-logical-height" */
-  void set maxLogicalHeight(var value) {
+  void set maxLogicalHeight(String value) {
     setProperty('${_browserPrefix}max-logical-height', value, '');
   }
 
@@ -4175,7 +4391,7 @@
     getPropertyValue('${_browserPrefix}max-logical-width');
 
   /** Sets the value of "max-logical-width" */
-  void set maxLogicalWidth(var value) {
+  void set maxLogicalWidth(String value) {
     setProperty('${_browserPrefix}max-logical-width', value, '');
   }
 
@@ -4184,16 +4400,25 @@
     getPropertyValue('max-width');
 
   /** Sets the value of "max-width" */
-  void set maxWidth(var value) {
+  void set maxWidth(String value) {
     setProperty('max-width', value, '');
   }
 
+  /** Gets the value of "max-zoom" */
+  String get maxZoom =>
+    getPropertyValue('max-zoom');
+
+  /** Sets the value of "max-zoom" */
+  void set maxZoom(String value) {
+    setProperty('max-zoom', value, '');
+  }
+
   /** Gets the value of "min-height" */
   String get minHeight =>
     getPropertyValue('min-height');
 
   /** Sets the value of "min-height" */
-  void set minHeight(var value) {
+  void set minHeight(String value) {
     setProperty('min-height', value, '');
   }
 
@@ -4202,7 +4427,7 @@
     getPropertyValue('${_browserPrefix}min-logical-height');
 
   /** Sets the value of "min-logical-height" */
-  void set minLogicalHeight(var value) {
+  void set minLogicalHeight(String value) {
     setProperty('${_browserPrefix}min-logical-height', value, '');
   }
 
@@ -4211,7 +4436,7 @@
     getPropertyValue('${_browserPrefix}min-logical-width');
 
   /** Sets the value of "min-logical-width" */
-  void set minLogicalWidth(var value) {
+  void set minLogicalWidth(String value) {
     setProperty('${_browserPrefix}min-logical-width', value, '');
   }
 
@@ -4220,16 +4445,25 @@
     getPropertyValue('min-width');
 
   /** Sets the value of "min-width" */
-  void set minWidth(var value) {
+  void set minWidth(String value) {
     setProperty('min-width', value, '');
   }
 
+  /** Gets the value of "min-zoom" */
+  String get minZoom =>
+    getPropertyValue('min-zoom');
+
+  /** Sets the value of "min-zoom" */
+  void set minZoom(String value) {
+    setProperty('min-zoom', value, '');
+  }
+
   /** Gets the value of "nbsp-mode" */
   String get nbspMode =>
     getPropertyValue('${_browserPrefix}nbsp-mode');
 
   /** Sets the value of "nbsp-mode" */
-  void set nbspMode(var value) {
+  void set nbspMode(String value) {
     setProperty('${_browserPrefix}nbsp-mode', value, '');
   }
 
@@ -4238,16 +4472,34 @@
     getPropertyValue('opacity');
 
   /** Sets the value of "opacity" */
-  void set opacity(var value) {
+  void set opacity(String value) {
     setProperty('opacity', value, '');
   }
 
+  /** Gets the value of "order" */
+  String get order =>
+    getPropertyValue('${_browserPrefix}order');
+
+  /** Sets the value of "order" */
+  void set order(String value) {
+    setProperty('${_browserPrefix}order', value, '');
+  }
+
+  /** Gets the value of "orientation" */
+  String get orientation =>
+    getPropertyValue('orientation');
+
+  /** Sets the value of "orientation" */
+  void set orientation(String value) {
+    setProperty('orientation', value, '');
+  }
+
   /** Gets the value of "orphans" */
   String get orphans =>
     getPropertyValue('orphans');
 
   /** Sets the value of "orphans" */
-  void set orphans(var value) {
+  void set orphans(String value) {
     setProperty('orphans', value, '');
   }
 
@@ -4256,7 +4508,7 @@
     getPropertyValue('outline');
 
   /** Sets the value of "outline" */
-  void set outline(var value) {
+  void set outline(String value) {
     setProperty('outline', value, '');
   }
 
@@ -4265,7 +4517,7 @@
     getPropertyValue('outline-color');
 
   /** Sets the value of "outline-color" */
-  void set outlineColor(var value) {
+  void set outlineColor(String value) {
     setProperty('outline-color', value, '');
   }
 
@@ -4274,7 +4526,7 @@
     getPropertyValue('outline-offset');
 
   /** Sets the value of "outline-offset" */
-  void set outlineOffset(var value) {
+  void set outlineOffset(String value) {
     setProperty('outline-offset', value, '');
   }
 
@@ -4283,7 +4535,7 @@
     getPropertyValue('outline-style');
 
   /** Sets the value of "outline-style" */
-  void set outlineStyle(var value) {
+  void set outlineStyle(String value) {
     setProperty('outline-style', value, '');
   }
 
@@ -4292,7 +4544,7 @@
     getPropertyValue('outline-width');
 
   /** Sets the value of "outline-width" */
-  void set outlineWidth(var value) {
+  void set outlineWidth(String value) {
     setProperty('outline-width', value, '');
   }
 
@@ -4301,16 +4553,34 @@
     getPropertyValue('overflow');
 
   /** Sets the value of "overflow" */
-  void set overflow(var value) {
+  void set overflow(String value) {
     setProperty('overflow', value, '');
   }
 
+  /** Gets the value of "overflow-scrolling" */
+  String get overflowScrolling =>
+    getPropertyValue('${_browserPrefix}overflow-scrolling');
+
+  /** Sets the value of "overflow-scrolling" */
+  void set overflowScrolling(String value) {
+    setProperty('${_browserPrefix}overflow-scrolling', value, '');
+  }
+
+  /** Gets the value of "overflow-wrap" */
+  String get overflowWrap =>
+    getPropertyValue('overflow-wrap');
+
+  /** Sets the value of "overflow-wrap" */
+  void set overflowWrap(String value) {
+    setProperty('overflow-wrap', value, '');
+  }
+
   /** Gets the value of "overflow-x" */
   String get overflowX =>
     getPropertyValue('overflow-x');
 
   /** Sets the value of "overflow-x" */
-  void set overflowX(var value) {
+  void set overflowX(String value) {
     setProperty('overflow-x', value, '');
   }
 
@@ -4319,7 +4589,7 @@
     getPropertyValue('overflow-y');
 
   /** Sets the value of "overflow-y" */
-  void set overflowY(var value) {
+  void set overflowY(String value) {
     setProperty('overflow-y', value, '');
   }
 
@@ -4328,7 +4598,7 @@
     getPropertyValue('padding');
 
   /** Sets the value of "padding" */
-  void set padding(var value) {
+  void set padding(String value) {
     setProperty('padding', value, '');
   }
 
@@ -4337,7 +4607,7 @@
     getPropertyValue('${_browserPrefix}padding-after');
 
   /** Sets the value of "padding-after" */
-  void set paddingAfter(var value) {
+  void set paddingAfter(String value) {
     setProperty('${_browserPrefix}padding-after', value, '');
   }
 
@@ -4346,7 +4616,7 @@
     getPropertyValue('${_browserPrefix}padding-before');
 
   /** Sets the value of "padding-before" */
-  void set paddingBefore(var value) {
+  void set paddingBefore(String value) {
     setProperty('${_browserPrefix}padding-before', value, '');
   }
 
@@ -4355,7 +4625,7 @@
     getPropertyValue('padding-bottom');
 
   /** Sets the value of "padding-bottom" */
-  void set paddingBottom(var value) {
+  void set paddingBottom(String value) {
     setProperty('padding-bottom', value, '');
   }
 
@@ -4364,7 +4634,7 @@
     getPropertyValue('${_browserPrefix}padding-end');
 
   /** Sets the value of "padding-end" */
-  void set paddingEnd(var value) {
+  void set paddingEnd(String value) {
     setProperty('${_browserPrefix}padding-end', value, '');
   }
 
@@ -4373,7 +4643,7 @@
     getPropertyValue('padding-left');
 
   /** Sets the value of "padding-left" */
-  void set paddingLeft(var value) {
+  void set paddingLeft(String value) {
     setProperty('padding-left', value, '');
   }
 
@@ -4382,7 +4652,7 @@
     getPropertyValue('padding-right');
 
   /** Sets the value of "padding-right" */
-  void set paddingRight(var value) {
+  void set paddingRight(String value) {
     setProperty('padding-right', value, '');
   }
 
@@ -4391,7 +4661,7 @@
     getPropertyValue('${_browserPrefix}padding-start');
 
   /** Sets the value of "padding-start" */
-  void set paddingStart(var value) {
+  void set paddingStart(String value) {
     setProperty('${_browserPrefix}padding-start', value, '');
   }
 
@@ -4400,7 +4670,7 @@
     getPropertyValue('padding-top');
 
   /** Sets the value of "padding-top" */
-  void set paddingTop(var value) {
+  void set paddingTop(String value) {
     setProperty('padding-top', value, '');
   }
 
@@ -4409,7 +4679,7 @@
     getPropertyValue('page');
 
   /** Sets the value of "page" */
-  void set page(var value) {
+  void set page(String value) {
     setProperty('page', value, '');
   }
 
@@ -4418,7 +4688,7 @@
     getPropertyValue('page-break-after');
 
   /** Sets the value of "page-break-after" */
-  void set pageBreakAfter(var value) {
+  void set pageBreakAfter(String value) {
     setProperty('page-break-after', value, '');
   }
 
@@ -4427,7 +4697,7 @@
     getPropertyValue('page-break-before');
 
   /** Sets the value of "page-break-before" */
-  void set pageBreakBefore(var value) {
+  void set pageBreakBefore(String value) {
     setProperty('page-break-before', value, '');
   }
 
@@ -4436,7 +4706,7 @@
     getPropertyValue('page-break-inside');
 
   /** Sets the value of "page-break-inside" */
-  void set pageBreakInside(var value) {
+  void set pageBreakInside(String value) {
     setProperty('page-break-inside', value, '');
   }
 
@@ -4445,7 +4715,7 @@
     getPropertyValue('${_browserPrefix}perspective');
 
   /** Sets the value of "perspective" */
-  void set perspective(var value) {
+  void set perspective(String value) {
     setProperty('${_browserPrefix}perspective', value, '');
   }
 
@@ -4454,7 +4724,7 @@
     getPropertyValue('${_browserPrefix}perspective-origin');
 
   /** Sets the value of "perspective-origin" */
-  void set perspectiveOrigin(var value) {
+  void set perspectiveOrigin(String value) {
     setProperty('${_browserPrefix}perspective-origin', value, '');
   }
 
@@ -4463,7 +4733,7 @@
     getPropertyValue('${_browserPrefix}perspective-origin-x');
 
   /** Sets the value of "perspective-origin-x" */
-  void set perspectiveOriginX(var value) {
+  void set perspectiveOriginX(String value) {
     setProperty('${_browserPrefix}perspective-origin-x', value, '');
   }
 
@@ -4472,7 +4742,7 @@
     getPropertyValue('${_browserPrefix}perspective-origin-y');
 
   /** Sets the value of "perspective-origin-y" */
-  void set perspectiveOriginY(var value) {
+  void set perspectiveOriginY(String value) {
     setProperty('${_browserPrefix}perspective-origin-y', value, '');
   }
 
@@ -4481,7 +4751,7 @@
     getPropertyValue('pointer-events');
 
   /** Sets the value of "pointer-events" */
-  void set pointerEvents(var value) {
+  void set pointerEvents(String value) {
     setProperty('pointer-events', value, '');
   }
 
@@ -4490,16 +4760,25 @@
     getPropertyValue('position');
 
   /** Sets the value of "position" */
-  void set position(var value) {
+  void set position(String value) {
     setProperty('position', value, '');
   }
 
+  /** Gets the value of "print-color-adjust" */
+  String get printColorAdjust =>
+    getPropertyValue('${_browserPrefix}print-color-adjust');
+
+  /** Sets the value of "print-color-adjust" */
+  void set printColorAdjust(String value) {
+    setProperty('${_browserPrefix}print-color-adjust', value, '');
+  }
+
   /** Gets the value of "quotes" */
   String get quotes =>
     getPropertyValue('quotes');
 
   /** Sets the value of "quotes" */
-  void set quotes(var value) {
+  void set quotes(String value) {
     setProperty('quotes', value, '');
   }
 
@@ -4508,7 +4787,7 @@
     getPropertyValue('${_browserPrefix}region-break-after');
 
   /** Sets the value of "region-break-after" */
-  void set regionBreakAfter(var value) {
+  void set regionBreakAfter(String value) {
     setProperty('${_browserPrefix}region-break-after', value, '');
   }
 
@@ -4517,7 +4796,7 @@
     getPropertyValue('${_browserPrefix}region-break-before');
 
   /** Sets the value of "region-break-before" */
-  void set regionBreakBefore(var value) {
+  void set regionBreakBefore(String value) {
     setProperty('${_browserPrefix}region-break-before', value, '');
   }
 
@@ -4526,7 +4805,7 @@
     getPropertyValue('${_browserPrefix}region-break-inside');
 
   /** Sets the value of "region-break-inside" */
-  void set regionBreakInside(var value) {
+  void set regionBreakInside(String value) {
     setProperty('${_browserPrefix}region-break-inside', value, '');
   }
 
@@ -4535,7 +4814,7 @@
     getPropertyValue('${_browserPrefix}region-overflow');
 
   /** Sets the value of "region-overflow" */
-  void set regionOverflow(var value) {
+  void set regionOverflow(String value) {
     setProperty('${_browserPrefix}region-overflow', value, '');
   }
 
@@ -4544,7 +4823,7 @@
     getPropertyValue('resize');
 
   /** Sets the value of "resize" */
-  void set resize(var value) {
+  void set resize(String value) {
     setProperty('resize', value, '');
   }
 
@@ -4553,7 +4832,7 @@
     getPropertyValue('right');
 
   /** Sets the value of "right" */
-  void set right(var value) {
+  void set right(String value) {
     setProperty('right', value, '');
   }
 
@@ -4562,16 +4841,52 @@
     getPropertyValue('${_browserPrefix}rtl-ordering');
 
   /** Sets the value of "rtl-ordering" */
-  void set rtlOrdering(var value) {
+  void set rtlOrdering(String value) {
     setProperty('${_browserPrefix}rtl-ordering', value, '');
   }
 
+  /** Gets the value of "shape-inside" */
+  String get shapeInside =>
+    getPropertyValue('${_browserPrefix}shape-inside');
+
+  /** Sets the value of "shape-inside" */
+  void set shapeInside(String value) {
+    setProperty('${_browserPrefix}shape-inside', value, '');
+  }
+
+  /** Gets the value of "shape-margin" */
+  String get shapeMargin =>
+    getPropertyValue('${_browserPrefix}shape-margin');
+
+  /** Sets the value of "shape-margin" */
+  void set shapeMargin(String value) {
+    setProperty('${_browserPrefix}shape-margin', value, '');
+  }
+
+  /** Gets the value of "shape-outside" */
+  String get shapeOutside =>
+    getPropertyValue('${_browserPrefix}shape-outside');
+
+  /** Sets the value of "shape-outside" */
+  void set shapeOutside(String value) {
+    setProperty('${_browserPrefix}shape-outside', value, '');
+  }
+
+  /** Gets the value of "shape-padding" */
+  String get shapePadding =>
+    getPropertyValue('${_browserPrefix}shape-padding');
+
+  /** Sets the value of "shape-padding" */
+  void set shapePadding(String value) {
+    setProperty('${_browserPrefix}shape-padding', value, '');
+  }
+
   /** Gets the value of "size" */
   String get size =>
     getPropertyValue('size');
 
   /** Sets the value of "size" */
-  void set size(var value) {
+  void set size(String value) {
     setProperty('size', value, '');
   }
 
@@ -4580,7 +4895,7 @@
     getPropertyValue('speak');
 
   /** Sets the value of "speak" */
-  void set speak(var value) {
+  void set speak(String value) {
     setProperty('speak', value, '');
   }
 
@@ -4589,16 +4904,25 @@
     getPropertyValue('src');
 
   /** Sets the value of "src" */
-  void set src(var value) {
+  void set src(String value) {
     setProperty('src', value, '');
   }
 
+  /** Gets the value of "tab-size" */
+  String get tabSize =>
+    getPropertyValue('tab-size');
+
+  /** Sets the value of "tab-size" */
+  void set tabSize(String value) {
+    setProperty('tab-size', value, '');
+  }
+
   /** Gets the value of "table-layout" */
   String get tableLayout =>
     getPropertyValue('table-layout');
 
   /** Sets the value of "table-layout" */
-  void set tableLayout(var value) {
+  void set tableLayout(String value) {
     setProperty('table-layout', value, '');
   }
 
@@ -4607,7 +4931,7 @@
     getPropertyValue('${_browserPrefix}tap-highlight-color');
 
   /** Sets the value of "tap-highlight-color" */
-  void set tapHighlightColor(var value) {
+  void set tapHighlightColor(String value) {
     setProperty('${_browserPrefix}tap-highlight-color', value, '');
   }
 
@@ -4616,16 +4940,25 @@
     getPropertyValue('text-align');
 
   /** Sets the value of "text-align" */
-  void set textAlign(var value) {
+  void set textAlign(String value) {
     setProperty('text-align', value, '');
   }
 
+  /** Gets the value of "text-align-last" */
+  String get textAlignLast =>
+    getPropertyValue('${_browserPrefix}text-align-last');
+
+  /** Sets the value of "text-align-last" */
+  void set textAlignLast(String value) {
+    setProperty('${_browserPrefix}text-align-last', value, '');
+  }
+
   /** Gets the value of "text-combine" */
   String get textCombine =>
     getPropertyValue('${_browserPrefix}text-combine');
 
   /** Sets the value of "text-combine" */
-  void set textCombine(var value) {
+  void set textCombine(String value) {
     setProperty('${_browserPrefix}text-combine', value, '');
   }
 
@@ -4634,16 +4967,34 @@
     getPropertyValue('text-decoration');
 
   /** Sets the value of "text-decoration" */
-  void set textDecoration(var value) {
+  void set textDecoration(String value) {
     setProperty('text-decoration', value, '');
   }
 
+  /** Gets the value of "text-decoration-line" */
+  String get textDecorationLine =>
+    getPropertyValue('${_browserPrefix}text-decoration-line');
+
+  /** Sets the value of "text-decoration-line" */
+  void set textDecorationLine(String value) {
+    setProperty('${_browserPrefix}text-decoration-line', value, '');
+  }
+
+  /** Gets the value of "text-decoration-style" */
+  String get textDecorationStyle =>
+    getPropertyValue('${_browserPrefix}text-decoration-style');
+
+  /** Sets the value of "text-decoration-style" */
+  void set textDecorationStyle(String value) {
+    setProperty('${_browserPrefix}text-decoration-style', value, '');
+  }
+
   /** Gets the value of "text-decorations-in-effect" */
   String get textDecorationsInEffect =>
     getPropertyValue('${_browserPrefix}text-decorations-in-effect');
 
   /** Sets the value of "text-decorations-in-effect" */
-  void set textDecorationsInEffect(var value) {
+  void set textDecorationsInEffect(String value) {
     setProperty('${_browserPrefix}text-decorations-in-effect', value, '');
   }
 
@@ -4652,7 +5003,7 @@
     getPropertyValue('${_browserPrefix}text-emphasis');
 
   /** Sets the value of "text-emphasis" */
-  void set textEmphasis(var value) {
+  void set textEmphasis(String value) {
     setProperty('${_browserPrefix}text-emphasis', value, '');
   }
 
@@ -4661,7 +5012,7 @@
     getPropertyValue('${_browserPrefix}text-emphasis-color');
 
   /** Sets the value of "text-emphasis-color" */
-  void set textEmphasisColor(var value) {
+  void set textEmphasisColor(String value) {
     setProperty('${_browserPrefix}text-emphasis-color', value, '');
   }
 
@@ -4670,7 +5021,7 @@
     getPropertyValue('${_browserPrefix}text-emphasis-position');
 
   /** Sets the value of "text-emphasis-position" */
-  void set textEmphasisPosition(var value) {
+  void set textEmphasisPosition(String value) {
     setProperty('${_browserPrefix}text-emphasis-position', value, '');
   }
 
@@ -4679,7 +5030,7 @@
     getPropertyValue('${_browserPrefix}text-emphasis-style');
 
   /** Sets the value of "text-emphasis-style" */
-  void set textEmphasisStyle(var value) {
+  void set textEmphasisStyle(String value) {
     setProperty('${_browserPrefix}text-emphasis-style', value, '');
   }
 
@@ -4688,7 +5039,7 @@
     getPropertyValue('${_browserPrefix}text-fill-color');
 
   /** Sets the value of "text-fill-color" */
-  void set textFillColor(var value) {
+  void set textFillColor(String value) {
     setProperty('${_browserPrefix}text-fill-color', value, '');
   }
 
@@ -4697,7 +5048,7 @@
     getPropertyValue('text-indent');
 
   /** Sets the value of "text-indent" */
-  void set textIndent(var value) {
+  void set textIndent(String value) {
     setProperty('text-indent', value, '');
   }
 
@@ -4706,7 +5057,7 @@
     getPropertyValue('text-line-through');
 
   /** Sets the value of "text-line-through" */
-  void set textLineThrough(var value) {
+  void set textLineThrough(String value) {
     setProperty('text-line-through', value, '');
   }
 
@@ -4715,7 +5066,7 @@
     getPropertyValue('text-line-through-color');
 
   /** Sets the value of "text-line-through-color" */
-  void set textLineThroughColor(var value) {
+  void set textLineThroughColor(String value) {
     setProperty('text-line-through-color', value, '');
   }
 
@@ -4724,7 +5075,7 @@
     getPropertyValue('text-line-through-mode');
 
   /** Sets the value of "text-line-through-mode" */
-  void set textLineThroughMode(var value) {
+  void set textLineThroughMode(String value) {
     setProperty('text-line-through-mode', value, '');
   }
 
@@ -4733,7 +5084,7 @@
     getPropertyValue('text-line-through-style');
 
   /** Sets the value of "text-line-through-style" */
-  void set textLineThroughStyle(var value) {
+  void set textLineThroughStyle(String value) {
     setProperty('text-line-through-style', value, '');
   }
 
@@ -4742,7 +5093,7 @@
     getPropertyValue('text-line-through-width');
 
   /** Sets the value of "text-line-through-width" */
-  void set textLineThroughWidth(var value) {
+  void set textLineThroughWidth(String value) {
     setProperty('text-line-through-width', value, '');
   }
 
@@ -4751,7 +5102,7 @@
     getPropertyValue('${_browserPrefix}text-orientation');
 
   /** Sets the value of "text-orientation" */
-  void set textOrientation(var value) {
+  void set textOrientation(String value) {
     setProperty('${_browserPrefix}text-orientation', value, '');
   }
 
@@ -4760,7 +5111,7 @@
     getPropertyValue('text-overflow');
 
   /** Sets the value of "text-overflow" */
-  void set textOverflow(var value) {
+  void set textOverflow(String value) {
     setProperty('text-overflow', value, '');
   }
 
@@ -4769,7 +5120,7 @@
     getPropertyValue('text-overline');
 
   /** Sets the value of "text-overline" */
-  void set textOverline(var value) {
+  void set textOverline(String value) {
     setProperty('text-overline', value, '');
   }
 
@@ -4778,7 +5129,7 @@
     getPropertyValue('text-overline-color');
 
   /** Sets the value of "text-overline-color" */
-  void set textOverlineColor(var value) {
+  void set textOverlineColor(String value) {
     setProperty('text-overline-color', value, '');
   }
 
@@ -4787,7 +5138,7 @@
     getPropertyValue('text-overline-mode');
 
   /** Sets the value of "text-overline-mode" */
-  void set textOverlineMode(var value) {
+  void set textOverlineMode(String value) {
     setProperty('text-overline-mode', value, '');
   }
 
@@ -4796,7 +5147,7 @@
     getPropertyValue('text-overline-style');
 
   /** Sets the value of "text-overline-style" */
-  void set textOverlineStyle(var value) {
+  void set textOverlineStyle(String value) {
     setProperty('text-overline-style', value, '');
   }
 
@@ -4805,7 +5156,7 @@
     getPropertyValue('text-overline-width');
 
   /** Sets the value of "text-overline-width" */
-  void set textOverlineWidth(var value) {
+  void set textOverlineWidth(String value) {
     setProperty('text-overline-width', value, '');
   }
 
@@ -4814,7 +5165,7 @@
     getPropertyValue('text-rendering');
 
   /** Sets the value of "text-rendering" */
-  void set textRendering(var value) {
+  void set textRendering(String value) {
     setProperty('text-rendering', value, '');
   }
 
@@ -4823,7 +5174,7 @@
     getPropertyValue('${_browserPrefix}text-security');
 
   /** Sets the value of "text-security" */
-  void set textSecurity(var value) {
+  void set textSecurity(String value) {
     setProperty('${_browserPrefix}text-security', value, '');
   }
 
@@ -4832,7 +5183,7 @@
     getPropertyValue('text-shadow');
 
   /** Sets the value of "text-shadow" */
-  void set textShadow(var value) {
+  void set textShadow(String value) {
     setProperty('text-shadow', value, '');
   }
 
@@ -4841,7 +5192,7 @@
     getPropertyValue('${_browserPrefix}text-size-adjust');
 
   /** Sets the value of "text-size-adjust" */
-  void set textSizeAdjust(var value) {
+  void set textSizeAdjust(String value) {
     setProperty('${_browserPrefix}text-size-adjust', value, '');
   }
 
@@ -4850,7 +5201,7 @@
     getPropertyValue('${_browserPrefix}text-stroke');
 
   /** Sets the value of "text-stroke" */
-  void set textStroke(var value) {
+  void set textStroke(String value) {
     setProperty('${_browserPrefix}text-stroke', value, '');
   }
 
@@ -4859,7 +5210,7 @@
     getPropertyValue('${_browserPrefix}text-stroke-color');
 
   /** Sets the value of "text-stroke-color" */
-  void set textStrokeColor(var value) {
+  void set textStrokeColor(String value) {
     setProperty('${_browserPrefix}text-stroke-color', value, '');
   }
 
@@ -4868,7 +5219,7 @@
     getPropertyValue('${_browserPrefix}text-stroke-width');
 
   /** Sets the value of "text-stroke-width" */
-  void set textStrokeWidth(var value) {
+  void set textStrokeWidth(String value) {
     setProperty('${_browserPrefix}text-stroke-width', value, '');
   }
 
@@ -4877,7 +5228,7 @@
     getPropertyValue('text-transform');
 
   /** Sets the value of "text-transform" */
-  void set textTransform(var value) {
+  void set textTransform(String value) {
     setProperty('text-transform', value, '');
   }
 
@@ -4886,7 +5237,7 @@
     getPropertyValue('text-underline');
 
   /** Sets the value of "text-underline" */
-  void set textUnderline(var value) {
+  void set textUnderline(String value) {
     setProperty('text-underline', value, '');
   }
 
@@ -4895,7 +5246,7 @@
     getPropertyValue('text-underline-color');
 
   /** Sets the value of "text-underline-color" */
-  void set textUnderlineColor(var value) {
+  void set textUnderlineColor(String value) {
     setProperty('text-underline-color', value, '');
   }
 
@@ -4904,7 +5255,7 @@
     getPropertyValue('text-underline-mode');
 
   /** Sets the value of "text-underline-mode" */
-  void set textUnderlineMode(var value) {
+  void set textUnderlineMode(String value) {
     setProperty('text-underline-mode', value, '');
   }
 
@@ -4913,7 +5264,7 @@
     getPropertyValue('text-underline-style');
 
   /** Sets the value of "text-underline-style" */
-  void set textUnderlineStyle(var value) {
+  void set textUnderlineStyle(String value) {
     setProperty('text-underline-style', value, '');
   }
 
@@ -4922,7 +5273,7 @@
     getPropertyValue('text-underline-width');
 
   /** Sets the value of "text-underline-width" */
-  void set textUnderlineWidth(var value) {
+  void set textUnderlineWidth(String value) {
     setProperty('text-underline-width', value, '');
   }
 
@@ -4931,7 +5282,7 @@
     getPropertyValue('top');
 
   /** Sets the value of "top" */
-  void set top(var value) {
+  void set top(String value) {
     setProperty('top', value, '');
   }
 
@@ -4940,7 +5291,7 @@
     getPropertyValue('${_browserPrefix}transform');
 
   /** Sets the value of "transform" */
-  void set transform(var value) {
+  void set transform(String value) {
     setProperty('${_browserPrefix}transform', value, '');
   }
 
@@ -4949,7 +5300,7 @@
     getPropertyValue('${_browserPrefix}transform-origin');
 
   /** Sets the value of "transform-origin" */
-  void set transformOrigin(var value) {
+  void set transformOrigin(String value) {
     setProperty('${_browserPrefix}transform-origin', value, '');
   }
 
@@ -4958,7 +5309,7 @@
     getPropertyValue('${_browserPrefix}transform-origin-x');
 
   /** Sets the value of "transform-origin-x" */
-  void set transformOriginX(var value) {
+  void set transformOriginX(String value) {
     setProperty('${_browserPrefix}transform-origin-x', value, '');
   }
 
@@ -4967,7 +5318,7 @@
     getPropertyValue('${_browserPrefix}transform-origin-y');
 
   /** Sets the value of "transform-origin-y" */
-  void set transformOriginY(var value) {
+  void set transformOriginY(String value) {
     setProperty('${_browserPrefix}transform-origin-y', value, '');
   }
 
@@ -4976,7 +5327,7 @@
     getPropertyValue('${_browserPrefix}transform-origin-z');
 
   /** Sets the value of "transform-origin-z" */
-  void set transformOriginZ(var value) {
+  void set transformOriginZ(String value) {
     setProperty('${_browserPrefix}transform-origin-z', value, '');
   }
 
@@ -4985,7 +5336,7 @@
     getPropertyValue('${_browserPrefix}transform-style');
 
   /** Sets the value of "transform-style" */
-  void set transformStyle(var value) {
+  void set transformStyle(String value) {
     setProperty('${_browserPrefix}transform-style', value, '');
   }
 
@@ -4994,7 +5345,7 @@
     getPropertyValue('${_browserPrefix}transition');
 
   /** Sets the value of "transition" */
-  void set transition(var value) {
+  void set transition(String value) {
     setProperty('${_browserPrefix}transition', value, '');
   }
 
@@ -5003,7 +5354,7 @@
     getPropertyValue('${_browserPrefix}transition-delay');
 
   /** Sets the value of "transition-delay" */
-  void set transitionDelay(var value) {
+  void set transitionDelay(String value) {
     setProperty('${_browserPrefix}transition-delay', value, '');
   }
 
@@ -5012,7 +5363,7 @@
     getPropertyValue('${_browserPrefix}transition-duration');
 
   /** Sets the value of "transition-duration" */
-  void set transitionDuration(var value) {
+  void set transitionDuration(String value) {
     setProperty('${_browserPrefix}transition-duration', value, '');
   }
 
@@ -5021,7 +5372,7 @@
     getPropertyValue('${_browserPrefix}transition-property');
 
   /** Sets the value of "transition-property" */
-  void set transitionProperty(var value) {
+  void set transitionProperty(String value) {
     setProperty('${_browserPrefix}transition-property', value, '');
   }
 
@@ -5030,7 +5381,7 @@
     getPropertyValue('${_browserPrefix}transition-timing-function');
 
   /** Sets the value of "transition-timing-function" */
-  void set transitionTimingFunction(var value) {
+  void set transitionTimingFunction(String value) {
     setProperty('${_browserPrefix}transition-timing-function', value, '');
   }
 
@@ -5039,7 +5390,7 @@
     getPropertyValue('unicode-bidi');
 
   /** Sets the value of "unicode-bidi" */
-  void set unicodeBidi(var value) {
+  void set unicodeBidi(String value) {
     setProperty('unicode-bidi', value, '');
   }
 
@@ -5048,7 +5399,7 @@
     getPropertyValue('unicode-range');
 
   /** Sets the value of "unicode-range" */
-  void set unicodeRange(var value) {
+  void set unicodeRange(String value) {
     setProperty('unicode-range', value, '');
   }
 
@@ -5057,7 +5408,7 @@
     getPropertyValue('${_browserPrefix}user-drag');
 
   /** Sets the value of "user-drag" */
-  void set userDrag(var value) {
+  void set userDrag(String value) {
     setProperty('${_browserPrefix}user-drag', value, '');
   }
 
@@ -5066,7 +5417,7 @@
     getPropertyValue('${_browserPrefix}user-modify');
 
   /** Sets the value of "user-modify" */
-  void set userModify(var value) {
+  void set userModify(String value) {
     setProperty('${_browserPrefix}user-modify', value, '');
   }
 
@@ -5075,16 +5426,25 @@
     getPropertyValue('${_browserPrefix}user-select');
 
   /** Sets the value of "user-select" */
-  void set userSelect(var value) {
+  void set userSelect(String value) {
     setProperty('${_browserPrefix}user-select', value, '');
   }
 
+  /** Gets the value of "user-zoom" */
+  String get userZoom =>
+    getPropertyValue('user-zoom');
+
+  /** Sets the value of "user-zoom" */
+  void set userZoom(String value) {
+    setProperty('user-zoom', value, '');
+  }
+
   /** Gets the value of "vertical-align" */
   String get verticalAlign =>
     getPropertyValue('vertical-align');
 
   /** Sets the value of "vertical-align" */
-  void set verticalAlign(var value) {
+  void set verticalAlign(String value) {
     setProperty('vertical-align', value, '');
   }
 
@@ -5093,7 +5453,7 @@
     getPropertyValue('visibility');
 
   /** Sets the value of "visibility" */
-  void set visibility(var value) {
+  void set visibility(String value) {
     setProperty('visibility', value, '');
   }
 
@@ -5102,7 +5462,7 @@
     getPropertyValue('white-space');
 
   /** Sets the value of "white-space" */
-  void set whiteSpace(var value) {
+  void set whiteSpace(String value) {
     setProperty('white-space', value, '');
   }
 
@@ -5111,7 +5471,7 @@
     getPropertyValue('widows');
 
   /** Sets the value of "widows" */
-  void set widows(var value) {
+  void set widows(String value) {
     setProperty('widows', value, '');
   }
 
@@ -5120,7 +5480,7 @@
     getPropertyValue('width');
 
   /** Sets the value of "width" */
-  void set width(var value) {
+  void set width(String value) {
     setProperty('width', value, '');
   }
 
@@ -5129,7 +5489,7 @@
     getPropertyValue('word-break');
 
   /** Sets the value of "word-break" */
-  void set wordBreak(var value) {
+  void set wordBreak(String value) {
     setProperty('word-break', value, '');
   }
 
@@ -5138,7 +5498,7 @@
     getPropertyValue('word-spacing');
 
   /** Sets the value of "word-spacing" */
-  void set wordSpacing(var value) {
+  void set wordSpacing(String value) {
     setProperty('word-spacing', value, '');
   }
 
@@ -5147,17 +5507,35 @@
     getPropertyValue('word-wrap');
 
   /** Sets the value of "word-wrap" */
-  void set wordWrap(var value) {
+  void set wordWrap(String value) {
     setProperty('word-wrap', value, '');
   }
 
-  /** Gets the value of "wrap-shape" */
-  String get wrapShape =>
-    getPropertyValue('${_browserPrefix}wrap-shape');
+  /** Gets the value of "wrap" */
+  String get wrap =>
+    getPropertyValue('${_browserPrefix}wrap');
 
-  /** Sets the value of "wrap-shape" */
-  void set wrapShape(var value) {
-    setProperty('${_browserPrefix}wrap-shape', value, '');
+  /** Sets the value of "wrap" */
+  void set wrap(String value) {
+    setProperty('${_browserPrefix}wrap', value, '');
+  }
+
+  /** Gets the value of "wrap-flow" */
+  String get wrapFlow =>
+    getPropertyValue('${_browserPrefix}wrap-flow');
+
+  /** Sets the value of "wrap-flow" */
+  void set wrapFlow(String value) {
+    setProperty('${_browserPrefix}wrap-flow', value, '');
+  }
+
+  /** Gets the value of "wrap-through" */
+  String get wrapThrough =>
+    getPropertyValue('${_browserPrefix}wrap-through');
+
+  /** Sets the value of "wrap-through" */
+  void set wrapThrough(String value) {
+    setProperty('${_browserPrefix}wrap-through', value, '');
   }
 
   /** Gets the value of "writing-mode" */
@@ -5165,7 +5543,7 @@
     getPropertyValue('${_browserPrefix}writing-mode');
 
   /** Sets the value of "writing-mode" */
-  void set writingMode(var value) {
+  void set writingMode(String value) {
     setProperty('${_browserPrefix}writing-mode', value, '');
   }
 
@@ -5174,7 +5552,7 @@
     getPropertyValue('z-index');
 
   /** Sets the value of "z-index" */
-  void set zIndex(var value) {
+  void set zIndex(String value) {
     setProperty('z-index', value, '');
   }
 
@@ -5183,7 +5561,7 @@
     getPropertyValue('zoom');
 
   /** Sets the value of "zoom" */
-  void set zoom(var value) {
+  void set zoom(String value) {
     setProperty('zoom', value, '');
   }
 }
@@ -5372,13 +5750,10 @@
 class CanvasElement extends _Element_Merged {
 
   factory CanvasElement({int width, int height}) {
-    if (!?width) {
-      return _Elements.createCanvasElement();
-    }
-    if (!?height) {
-      return _Elements.createCanvasElement(width);
-    }
-    return _Elements.createCanvasElement(width, height);
+    var e = document.$dom_createElement("canvas");
+    if (width != null) e.width = width;
+    if (height != null) e.height = height;
+    return e;
   }
   CanvasElement.internal(): super.internal();
 
@@ -6464,7 +6839,7 @@
 /// @domName HTMLContentElement
 class ContentElement extends _Element_Merged {
 
-  factory ContentElement() => _Elements.createContentElement();
+  factory ContentElement() => document.$dom_createElement("content");
   ContentElement.internal(): super.internal();
 
 
@@ -6628,7 +7003,7 @@
 /// @domName HTMLDListElement
 class DListElement extends _Element_Merged {
 
-  factory DListElement() => _Elements.createDListElement();
+  factory DListElement() => document.$dom_createElement("dl");
   DListElement.internal(): super.internal();
 
 
@@ -6651,9 +7026,7 @@
 class DOMApplicationCache extends EventTarget {
   DOMApplicationCache.internal(): super.internal();
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   DOMApplicationCacheEvents get on =>
     new DOMApplicationCacheEvents(this);
 
@@ -6987,6 +7360,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  DOMMimeType get first => this[0];
+
   DOMMimeType get last => this[length - 1];
 
   DOMMimeType removeLast() {
@@ -7148,6 +7523,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  DOMPlugin get first => this[0];
+
   DOMPlugin get last => this[length - 1];
 
   DOMPlugin removeLast() {
@@ -7385,7 +7762,7 @@
 /// @domName HTMLDataListElement
 class DataListElement extends _Element_Merged {
 
-  factory DataListElement() => _Elements.createDataListElement();
+  factory DataListElement() => document.$dom_createElement("datalist");
   DataListElement.internal(): super.internal();
 
 
@@ -7772,9 +8149,7 @@
 class DedicatedWorkerContext extends WorkerContext {
   DedicatedWorkerContext.internal(): super.internal();
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   DedicatedWorkerContextEvents get on =>
     new DedicatedWorkerContextEvents(this);
 
@@ -7815,7 +8190,7 @@
 /// @domName HTMLDetailsElement
 class DetailsElement extends _Element_Merged {
 
-  factory DetailsElement() => _Elements.createDetailsElement();
+  factory DetailsElement() => document.$dom_createElement("details");
   DetailsElement.internal(): super.internal();
 
 
@@ -7993,7 +8368,7 @@
 /// @domName HTMLDivElement
 class DivElement extends _Element_Merged {
 
-  factory DivElement() => _Elements.createDivElement();
+  factory DivElement() => document.$dom_createElement("div");
   DivElement.internal(): super.internal();
 
 }
@@ -8007,9 +8382,7 @@
 
   Document.internal(): super.internal();
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   DocumentEvents get on =>
     new DocumentEvents(this);
 
@@ -8388,24 +8761,30 @@
       _DocumentFragmentFactoryProvider.createDocumentFragment_html(html);
 
   factory DocumentFragment.svg(String svgContent) =>
-      new _DocumentFragmentFactoryProvider.createDocumentFragment_svg(svgContent);
+      _DocumentFragmentFactoryProvider.createDocumentFragment_svg(svgContent);
 
-  List<Element> _elements;
-
-  List<Element> get elements {
-    if (_elements == null) {
-      _elements = new FilteredElementList(this);
-    }
-    return _elements;
-  }
+  List<Element> get elements => this.children;
 
   // TODO: The type of value should be Collection<Element>. See http://b/5392897
   void set elements(value) {
+    this.children = value;
+  }
+
+  List<Element> _children;
+
+  List<Element> get children {
+    if (_children == null) {
+      _children = new FilteredElementList(this);
+    }
+    return _children;
+  }
+
+  void set children(Collection<Element> value) {
     // Copy list first since we don't want liveness during iteration.
     List copy = new List.from(value);
-    final elements = this.elements;
-    elements.clear();
-    elements.addAll(copy);
+    var children = this.children;
+    children.clear();
+    children.addAll(copy);
   }
 
   Element query(String selectors) => $dom_querySelector(selectors);
@@ -8615,9 +8994,7 @@
 
   DocumentFragment.internal(): super.internal();
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   ElementEvents get on =>
     new ElementEvents(this);
 
@@ -8868,6 +9245,11 @@
     return result;
   }
 
+  Element get first {
+    return _element.$dom_firstElementChild;
+  }
+
+
   Element get last {
     return _element.$dom_lastElementChild;
   }
@@ -8882,10 +9264,6 @@
 
   _FrozenElementList._wrap(this._nodeList);
 
-  Element get first {
-    return _nodeList[0];
-  }
-
   bool contains(Element element) {
     for (Element el in this) {
       if (el == element) return true;
@@ -8994,6 +9372,8 @@
     throw new UnsupportedError('');
   }
 
+  Element get first => _nodeList.first;
+
   Element get last => _nodeList.last;
 }
 
@@ -9021,16 +9401,7 @@
   bool get hasNext => _index < _list.length;
 }
 
-/**
- * All your attribute manipulation needs in one place.
- * Extends the regular Map interface by automatically coercing non-string
- * values to strings.
- */
-abstract class AttributeMap implements Map<String, String> {
-  void operator []=(String key, value);
-}
-
-class _ElementAttributeMap extends AttributeMap {
+class _ElementAttributeMap implements Map<String, String> {
 
   final Element _element;
 
@@ -9125,7 +9496,7 @@
  * Provides a Map abstraction on top of data-* attributes, similar to the
  * dataSet in the old DOM.
  */
-class _DataAttributeMap extends AttributeMap {
+class _DataAttributeMap implements Map<String, String> {
 
   final Map<String, String> $dom_attributes;
 
@@ -9238,7 +9609,7 @@
   String toString() => "($left, $top, $width, $height)";
 }
 
-class Element extends Node implements ElementTraversal {
+abstract class Element extends Node implements ElementTraversal {
 
   factory Element.html(String html) =>
       _ElementFactoryProvider.createElement_html(html);
@@ -9249,7 +9620,7 @@
    * @domName Element.hasAttribute, Element.getAttribute, Element.setAttribute,
    *   Element.removeAttribute
    */
-  _ElementAttributeMap get attributes => new _ElementAttributeMap(this);
+  Map<String, String> get attributes => new _ElementAttributeMap(this);
 
   void set attributes(Map<String, String> value) {
     Map<String, String> attributes = this.attributes;
@@ -9260,16 +9631,27 @@
   }
 
   void set elements(Collection<Element> value) {
-    final elements = this.elements;
-    elements.clear();
-    elements.addAll(value);
+    this.children = value;
   }
 
   /**
+   * Deprecated, use [children] instead.
+   */
+  List<Element> get elements => this.children;
+
+  /**
    * @domName childElementCount, firstElementChild, lastElementChild,
    *   children, Node.nodes.add
    */
-  List<Element> get elements => new _ChildrenElementList._wrap(this);
+  List<Element> get children => new _ChildrenElementList._wrap(this);
+
+  void set children(Collection<Element> value) {
+    // Copy list first since we don't want liveness during iteration.
+    List copy = new List.from(value);
+    var children = this.children;
+    children.clear();
+    children.addAll(copy);
+  }
 
   Element query(String selectors) => $dom_querySelector(selectors);
 
@@ -9355,67 +9737,65 @@
 
   Element.internal(): super.internal();
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   ElementEvents get on =>
     new ElementEvents(this);
 
-  /** @domName HTMLElement.children */
+  /// @domName HTMLElement.children; @docsEditable true
   HTMLCollection get $dom_children;
 
-  /** @domName HTMLElement.contentEditable */
+  /// @domName HTMLElement.contentEditable; @docsEditable true
   String contentEditable;
 
-  /** @domName HTMLElement.dir */
+  /// @domName HTMLElement.dir; @docsEditable true
   String dir;
 
-  /** @domName HTMLElement.draggable */
+  /// @domName HTMLElement.draggable; @docsEditable true
   bool draggable;
 
-  /** @domName HTMLElement.hidden */
+  /// @domName HTMLElement.hidden; @docsEditable true
   bool hidden;
 
-  /** @domName HTMLElement.id */
+  /// @domName HTMLElement.id; @docsEditable true
   String id;
 
-  /** @domName HTMLElement.innerHTML */
+  /// @domName HTMLElement.innerHTML; @docsEditable true
   String innerHTML;
 
-  /** @domName HTMLElement.isContentEditable */
+  /// @domName HTMLElement.isContentEditable; @docsEditable true
   bool get isContentEditable;
 
-  /** @domName HTMLElement.lang */
+  /// @domName HTMLElement.lang; @docsEditable true
   String lang;
 
-  /** @domName HTMLElement.outerHTML */
+  /// @domName HTMLElement.outerHTML; @docsEditable true
   String get outerHTML;
 
-  /** @domName HTMLElement.spellcheck */
+  /// @domName HTMLElement.spellcheck; @docsEditable true
   bool spellcheck;
 
-  /** @domName HTMLElement.tabIndex */
+  /// @domName HTMLElement.tabIndex; @docsEditable true
   int tabIndex;
 
-  /** @domName HTMLElement.title */
+  /// @domName HTMLElement.title; @docsEditable true
   String title;
 
-  /** @domName HTMLElement.translate */
+  /// @domName HTMLElement.translate; @docsEditable true
   bool translate;
 
-  /** @domName HTMLElement.webkitdropzone */
+  /// @domName HTMLElement.webkitdropzone; @docsEditable true
   String webkitdropzone;
 
-  /** @domName HTMLElement.click */
+  /// @domName HTMLElement.click; @docsEditable true
   void click();
 
-  /** @domName HTMLElement.insertAdjacentElement */
+  /// @domName HTMLElement.insertAdjacentElement; @docsEditable true
   Element insertAdjacentElement(String where, Element element);
 
-  /** @domName HTMLElement.insertAdjacentHTML */
+  /// @domName HTMLElement.insertAdjacentHTML; @docsEditable true
   void insertAdjacentHTML(String where, String html);
 
-  /** @domName HTMLElement.insertAdjacentText */
+  /// @domName HTMLElement.insertAdjacentText; @docsEditable true
   void insertAdjacentText(String where, String text);
 
   static const int ALLOW_KEYBOARD_INPUT = 1;
@@ -9654,15 +10034,15 @@
     temp.innerHTML = html;
 
     Element element;
-    if (temp.elements.length == 1) {
-      element = temp.elements[0];
-    } else if (parentTag == 'html' && temp.elements.length == 2) {
+    if (temp.children.length == 1) {
+      element = temp.children[0];
+    } else if (parentTag == 'html' && temp.children.length == 2) {
       // Work around for edge case in WebKit and possibly other browsers where
       // both body and head elements are created even though the inner html
       // only contains a head or body element.
-      element = temp.elements[tag == 'head' ? 0 : 1];
+      element = temp.children[tag == 'head' ? 0 : 1];
     } else {
-      throw new ArgumentError('HTML had ${temp.elements.length} '
+      throw new ArgumentError('HTML had ${temp.children.length} '
           'top level elements but 1 expected');
     }
     element.remove();
@@ -9843,7 +10223,7 @@
 /// @domName HTMLEmbedElement
 class EmbedElement extends _Element_Merged {
 
-  factory EmbedElement() => _Elements.createEmbedElement();
+  factory EmbedElement() => document.$dom_createElement("embed");
   EmbedElement.internal(): super.internal();
 
 
@@ -10263,9 +10643,7 @@
   factory EventSource(String scriptUrl) => _EventSourceFactoryProvider.createEventSource(scriptUrl);
   EventSource.internal(): super.internal();
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   EventSourceEvents get on =>
     new EventSourceEvents(this);
 
@@ -10394,7 +10772,7 @@
 /// @domName HTMLFieldSetElement
 class FieldSetElement extends _Element_Merged {
 
-  factory FieldSetElement() => _Elements.createFieldSetElement();
+  factory FieldSetElement() => document.$dom_createElement("fieldset");
   FieldSetElement.internal(): super.internal();
 
 
@@ -10623,9 +11001,7 @@
   factory FileReader() => _FileReaderFactoryProvider.createFileReader();
   FileReader.internal(): super.internal();
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   FileReaderEvents get on =>
     new FileReaderEvents(this);
 
@@ -10768,9 +11144,7 @@
 class FileWriter extends EventTarget {
   FileWriter.internal(): super.internal();
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   FileWriterEvents get on =>
     new FileWriterEvents(this);
 
@@ -10969,6 +11343,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  num get first => this[0];
+
   num get last => this[length - 1];
 
   num removeLast() {
@@ -11100,6 +11476,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  num get first => this[0];
+
   num get last => this[length - 1];
 
   num removeLast() {
@@ -11212,7 +11590,7 @@
 /// @domName HTMLFormElement
 class FormElement extends _Element_Merged {
 
-  factory FormElement() => _Elements.createFormElement();
+  factory FormElement() => document.$dom_createElement("form");
   FormElement.internal(): super.internal();
 
 
@@ -11411,9 +11789,7 @@
 class FrameSetElement extends _Element_Merged {
   FrameSetElement.internal(): super.internal();
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   FrameSetElementEvents get on =>
     new FrameSetElementEvents(this);
 
@@ -11566,7 +11942,7 @@
 /// @domName HTMLHRElement
 class HRElement extends _Element_Merged {
 
-  factory HRElement() => _Elements.createHRElement();
+  factory HRElement() => document.$dom_createElement("hr");
   HRElement.internal(): super.internal();
 
 
@@ -11677,6 +12053,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  Node get first => this[0];
+
   Node get last => this[length - 1];
 
   Node removeLast() {
@@ -11788,6 +12166,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  Node get first => this[0];
+
   Node get last => this[length - 1];
 
   Node removeLast() {
@@ -11890,7 +12270,7 @@
 /// @domName HTMLHeadElement
 class HeadElement extends _Element_Merged {
 
-  factory HeadElement() => _Elements.createHeadElement();
+  factory HeadElement() => document.$dom_createElement("head");
   HeadElement.internal(): super.internal();
 
 
@@ -11912,17 +12292,17 @@
 /// @domName HTMLHeadingElement
 class HeadingElement extends _Element_Merged {
 
-  factory HeadingElement.h1() => _Elements.createHeadingElement_h1();
+  factory HeadingElement.h1() => document.$dom_createElement("h1");
 
-  factory HeadingElement.h2() => _Elements.createHeadingElement_h2();
+  factory HeadingElement.h2() => document.$dom_createElement("h2");
 
-  factory HeadingElement.h3() => _Elements.createHeadingElement_h3();
+  factory HeadingElement.h3() => document.$dom_createElement("h3");
 
-  factory HeadingElement.h4() => _Elements.createHeadingElement_h4();
+  factory HeadingElement.h4() => document.$dom_createElement("h4");
 
-  factory HeadingElement.h5() => _Elements.createHeadingElement_h5();
+  factory HeadingElement.h5() => document.$dom_createElement("h5");
 
-  factory HeadingElement.h6() => _Elements.createHeadingElement_h6();
+  factory HeadingElement.h6() => document.$dom_createElement("h6");
   HeadingElement.internal(): super.internal();
 
 
@@ -12030,7 +12410,7 @@
 /// @domName HTMLHtmlElement
 class HtmlElement extends _Element_Merged {
 
-  factory HtmlElement() => _Elements.createHtmlElement();
+  factory HtmlElement() => document.$dom_createElement("html");
   HtmlElement.internal(): super.internal();
 
 }
@@ -12040,19 +12420,19 @@
 
 
 class HttpRequest extends EventTarget {
-  factory HttpRequest.get(String url, onSuccess(HttpRequest request)) =>
-      _HttpRequestFactoryProvider.createHttpRequest_get(url, onSuccess);
+  factory HttpRequest.get(String url, onComplete(HttpRequest request)) =>
+      _HttpRequestFactoryProvider.createHttpRequest_get(url, onComplete);
 
-  factory HttpRequest.getWithCredentials(String url, onSuccess(HttpRequest request)) =>
-      _HttpRequestFactoryProvider.createHttpRequestgetWithCredentials(url, onSuccess);
+  factory HttpRequest.getWithCredentials(String url,
+      onComplete(HttpRequest request)) =>
+      _HttpRequestFactoryProvider.createHttpRequest_getWithCredentials(url,
+      onComplete);
 
 
   factory HttpRequest() => _HttpRequestFactoryProvider.createHttpRequest();
   HttpRequest.internal(): super.internal();
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   HttpRequestEvents get on =>
     new HttpRequestEvents(this);
 
@@ -12232,9 +12612,7 @@
 class HttpRequestUpload extends EventTarget {
   HttpRequestUpload.internal(): super.internal();
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   HttpRequestUploadEvents get on =>
     new HttpRequestUploadEvents(this);
 
@@ -12370,9 +12748,7 @@
 class IDBDatabase extends EventTarget {
   IDBDatabase.internal(): super.internal();
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   IDBDatabaseEvents get on =>
     new IDBDatabaseEvents(this);
 
@@ -13026,9 +13402,7 @@
 class IDBOpenDBRequest extends IDBRequest implements EventTarget {
   IDBOpenDBRequest.internal(): super.internal();
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   IDBOpenDBRequestEvents get on =>
     new IDBOpenDBRequestEvents(this);
 
@@ -13052,9 +13426,7 @@
 class IDBRequest extends EventTarget {
   IDBRequest.internal(): super.internal();
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   IDBRequestEvents get on =>
     new IDBRequestEvents(this);
 
@@ -13118,9 +13490,7 @@
 class IDBTransaction extends EventTarget {
   IDBTransaction.internal(): super.internal();
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   IDBTransactionEvents get on =>
     new IDBTransactionEvents(this);
 
@@ -13220,9 +13590,7 @@
 class IDBVersionChangeRequest extends IDBRequest implements EventTarget {
   IDBVersionChangeRequest.internal(): super.internal();
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   IDBVersionChangeRequestEvents get on =>
     new IDBVersionChangeRequestEvents(this);
 
@@ -13243,7 +13611,7 @@
 /// @domName HTMLIFrameElement
 class IFrameElement extends _Element_Merged {
 
-  factory IFrameElement() => _Elements.createIFrameElement();
+  factory IFrameElement() => document.$dom_createElement("iframe");
   IFrameElement.internal(): super.internal();
 
 
@@ -13412,16 +13780,11 @@
 class ImageElement extends _Element_Merged {
 
   factory ImageElement({String src, int width, int height}) {
-    if (!?src) {
-      return _Elements.createImageElement();
-    }
-    if (!?width) {
-      return _Elements.createImageElement(src);
-    }
-    if (!?height) {
-      return _Elements.createImageElement(src, width);
-    }
-    return _Elements.createImageElement(src, width, height);
+    var e = document.$dom_createElement("img");
+    if (src != null) e.src = src;
+    if (width != null) e.width = width;
+    if (height != null) e.height = height;
+    return e;
   }
   ImageElement.internal(): super.internal();
 
@@ -13569,16 +13932,13 @@
 class InputElement extends _Element_Merged {
 
   factory InputElement({String type}) {
-    if (!?type) {
-      return _Elements.createInputElement();
-    }
-    return _Elements.createInputElement(type);
+    var e = document.$dom_createElement("input");
+    if (type != null) e.type = type;
+    return e;
   }
   InputElement.internal(): super.internal();
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   InputElementEvents get on =>
     new InputElementEvents(this);
 
@@ -14117,6 +14477,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  int get first => this[0];
+
   int get last => this[length - 1];
 
   int removeLast() {
@@ -14248,6 +14610,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  int get first => this[0];
+
   int get last => this[length - 1];
 
   int removeLast() {
@@ -14379,6 +14743,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  int get first => this[0];
+
   int get last => this[length - 1];
 
   int removeLast() {
@@ -14542,7 +14908,7 @@
 /// @domName HTMLKeygenElement
 class KeygenElement extends _Element_Merged {
 
-  factory KeygenElement() => _Elements.createKeygenElement();
+  factory KeygenElement() => document.$dom_createElement("keygen");
   KeygenElement.internal(): super.internal();
 
 
@@ -14628,7 +14994,7 @@
 /// @domName HTMLLIElement
 class LIElement extends _Element_Merged {
 
-  factory LIElement() => _Elements.createLIElement();
+  factory LIElement() => document.$dom_createElement("li");
   LIElement.internal(): super.internal();
 
 
@@ -14658,7 +15024,7 @@
 /// @domName HTMLLabelElement
 class LabelElement extends _Element_Merged {
 
-  factory LabelElement() => _Elements.createLabelElement();
+  factory LabelElement() => document.$dom_createElement("label");
   LabelElement.internal(): super.internal();
 
 
@@ -14688,7 +15054,7 @@
 /// @domName HTMLLegendElement
 class LegendElement extends _Element_Merged {
 
-  factory LegendElement() => _Elements.createLegendElement();
+  factory LegendElement() => document.$dom_createElement("legend");
   LegendElement.internal(): super.internal();
 
 
@@ -14714,7 +15080,7 @@
 /// @domName HTMLLinkElement
 class LinkElement extends _Element_Merged {
 
-  factory LinkElement() => _Elements.createLinkElement();
+  factory LinkElement() => document.$dom_createElement("link");
   LinkElement.internal(): super.internal();
 
 
@@ -14979,7 +15345,7 @@
    * registered under [name].
    */
   lookupPort(String name) {
-    var port = JSON.parse(localStorage['dart-port:$name']);
+    var port = JSON.parse(document.documentElement.attributes['dart-port:$name']);
     return _deserialize(port);
   }
 
@@ -14990,14 +15356,12 @@
    */
   registerPort(String name, var port) {
     var serialized = _serialize(port);
-    localStorage['dart-port:$name'] = JSON.stringify(serialized);
+    document.documentElement.attributes['dart-port:$name'] = JSON.stringify(serialized);
   }
 
   LocalWindow.internal(): super.internal();
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   LocalWindowEvents get on =>
     new LocalWindowEvents(this);
 
@@ -15230,10 +15594,6 @@
   String atob(String string) native "DOMWindow_atob_Callback";
 
 
-  /** @domName DOMWindow.blur */
-  void blur() native "DOMWindow_blur_Callback";
-
-
   /** @domName DOMWindow.btoa */
   String btoa(String string) native "DOMWindow_btoa_Callback";
 
@@ -15270,10 +15630,6 @@
   bool find(String string, bool caseSensitive, bool backwards, bool wrap, bool wholeWord, bool searchInFrames, bool showDialog) native "DOMWindow_find_Callback";
 
 
-  /** @domName DOMWindow.focus */
-  void focus() native "DOMWindow_focus_Callback";
-
-
   /** @domName DOMWindow.getComputedStyle */
   CSSStyleDeclaration $dom_getComputedStyle(Element element, String pseudoElement) native "DOMWindow_getComputedStyle_Callback";
 
@@ -15546,7 +15902,7 @@
 /// @domName HTMLMapElement
 class MapElement extends _Element_Merged {
 
-  factory MapElement() => _Elements.createMapElement();
+  factory MapElement() => document.$dom_createElement("map");
   MapElement.internal(): super.internal();
 
 
@@ -15775,9 +16131,7 @@
 class MediaElement extends _Element_Merged {
   MediaElement.internal(): super.internal();
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   MediaElementEvents get on =>
     new MediaElementEvents(this);
 
@@ -16377,9 +16731,7 @@
   factory MediaStream(MediaStreamTrackList audioTracks, MediaStreamTrackList videoTracks) => _MediaStreamFactoryProvider.createMediaStream(audioTracks, videoTracks);
   MediaStream.internal(): super.internal();
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   MediaStreamEvents get on =>
     new MediaStreamEvents(this);
 
@@ -16465,9 +16817,7 @@
 class MediaStreamTrack extends EventTarget {
   MediaStreamTrack.internal(): super.internal();
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   MediaStreamTrackEvents get on =>
     new MediaStreamTrackEvents(this);
 
@@ -16547,9 +16897,7 @@
 class MediaStreamTrackList extends EventTarget {
   MediaStreamTrackList.internal(): super.internal();
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   MediaStreamTrackListEvents get on =>
     new MediaStreamTrackListEvents(this);
 
@@ -16624,7 +16972,7 @@
 /// @domName HTMLMenuElement
 class MenuElement extends _Element_Merged {
 
-  factory MenuElement() => _Elements.createMenuElement();
+  factory MenuElement() => document.$dom_createElement("menu");
   MenuElement.internal(): super.internal();
 
 
@@ -16709,9 +17057,7 @@
 class MessagePort extends EventTarget {
   MessagePort.internal(): super.internal();
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   MessagePortEvents get on =>
     new MessagePortEvents(this);
 
@@ -16828,7 +17174,7 @@
 /// @domName HTMLMeterElement
 class MeterElement extends _Element_Merged {
 
-  factory MeterElement() => _Elements.createMeterElement();
+  factory MeterElement() => document.$dom_createElement("meter");
   MeterElement.internal(): super.internal();
 
 
@@ -17270,6 +17616,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  Node get first => this[0];
+
   Node get last => this[length - 1];
 
   Node removeLast() {
@@ -17509,7 +17857,7 @@
   Collection map(f(Node element)) => _Collections.map(this, [], f);
 
   Collection<Node> filter(bool f(Node element)) =>
-     new _NodeListWrapper(_Collections.filter(this, <Node>[], f));
+     _Collections.filter(this, <Node>[], f);
 
   bool every(bool f(Node element)) => _Collections.every(this, f);
 
@@ -17545,7 +17893,7 @@
         "Cannot insertRange on immutable List.");
   }
   List<Node> getRange(int start, int rangeLength) =>
-    new _NodeListWrapper(_Lists.getRange(this, start, rangeLength, <Node>[]));
+      _Lists.getRange(this, start, rangeLength, <Node>[]);
 
   // -- end List<Node> mixins.
 
@@ -17821,195 +18169,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.
 
-
-// TODO(nweiz): when all implementations we target have the same name for the
-// implementation of List<E>, extend that rather than wrapping.
-class _ListWrapper<E> implements List<E> {
-  List _list;
-
-  _ListWrapper(List this._list);
-
-  Iterator<E> iterator() => _list.iterator();
-
-  bool contains(E element) => _list.contains(element);
-
-  void forEach(void f(E element)) => _list.forEach(f);
-
-  Collection map(f(E element)) => _list.map(f);
-
-  List<E> filter(bool f(E element)) => _list.filter(f);
-
-  bool every(bool f(E element)) => _list.every(f);
-
-  bool some(bool f(E element)) => _list.some(f);
-
-  bool get isEmpty => _list.isEmpty;
-
-  int get length => _list.length;
-
-  E operator [](int index) => _list[index];
-
-  void operator []=(int index, E value) { _list[index] = value; }
-
-  void set length(int newLength) { _list.length = newLength; }
-
-  void add(E value) => _list.add(value);
-
-  void addLast(E value) => _list.addLast(value);
-
-  void addAll(Collection<E> collection) => _list.addAll(collection);
-
-  void sort([Comparator<E> compare = Comparable.compare]) => _list.sort(compare);
-
-  int indexOf(E element, [int start = 0]) => _list.indexOf(element, start);
-
-  int lastIndexOf(E element, [int start = 0]) =>
-    _list.lastIndexOf(element, start);
-
-  void clear() => _list.clear();
-
-  E removeLast() => _list.removeLast();
-
-  E get last => _list.last;
-
-  List<E> getRange(int start, int rangeLength) =>
-    _list.getRange(start, rangeLength);
-
-  void setRange(int start, int rangeLength, List<E> from, [int startFrom = 0])
-      => _list.setRange(start, rangeLength, from, startFrom);
-
-  void removeRange(int start, int rangeLength) =>
-    _list.removeRange(start, rangeLength);
-
-  void insertRange(int start, int rangeLength, [E initialValue = null]) =>
-    _list.insertRange(start, rangeLength, initialValue);
-
-  E get first => _list[0];
-}
-
-/**
- * This class is used to insure the results of list operations are NodeLists
- * instead of lists.
- */
-class _NodeListWrapper extends _ListWrapper<Node> implements List {
-  _NodeListWrapper(List list) : super(list);
-
-  List<Node> filter(bool f(Node element)) =>
-    new _NodeListWrapper(_list.filter(f));
-
-  List<Node> getRange(int start, int rangeLength) =>
-    new _NodeListWrapper(_list.getRange(start, rangeLength));
-}
-
-class NodeList extends NativeFieldWrapperClass1 implements List<Node> {
-  Node _parent;
-
-  // -- 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) {
-    _parent.$dom_appendChild(value);
-  }
-
-  void addLast(Node value) {
-    _parent.$dom_appendChild(value);
-  }
-
-  void addAll(Collection<Node> collection) {
-    for (Node node in collection) {
-      _parent.$dom_appendChild(node);
-    }
-  }
-
-  Node removeLast() {
-    final result = this.last;
-    if (result != null) {
-      _parent.$dom_removeChild(result);
-    }
-    return result;
-  }
-
-  void clear() {
-    _parent.text = '';
-  }
-
-  void operator []=(int index, Node value) {
-    _parent.$dom_replaceChild(value, this[index]);
-  }
-
-  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)) =>
-     new _NodeListWrapper(_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 = 0]) =>
-      _Lists.lastIndexOf(this, element, start);
-
-  Node get last => this[length - 1];
-  Node get first => this[0];
-
-  // FIXME: implement thesee.
-  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) =>
-    new _NodeListWrapper(_Lists.getRange(this, start, rangeLength, <Node>[]));
-
-  // -- end List<Node> mixins.
-
-  NodeList.internal();
-
-
-  /** @domName NodeList.length */
-  int get length native "NodeList_length_Getter";
-
-  Node operator[](int index) native "NodeList_item_Callback";
-
-
-  /** @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.
 
 
@@ -18044,9 +18203,7 @@
   }
   Notification.internal(): super.internal();
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   NotificationEvents get on =>
     new NotificationEvents(this);
 
@@ -18235,7 +18392,7 @@
 /// @domName HTMLOListElement
 class OListElement extends _Element_Merged {
 
-  factory OListElement() => _Elements.createOListElement();
+  factory OListElement() => document.$dom_createElement("ol");
   OListElement.internal(): super.internal();
 
 
@@ -18281,7 +18438,7 @@
 /// @domName HTMLObjectElement
 class ObjectElement extends _Element_Merged {
 
-  factory ObjectElement() => _Elements.createObjectElement();
+  factory ObjectElement() => document.$dom_createElement("object");
   ObjectElement.internal(): super.internal();
 
 
@@ -18463,7 +18620,7 @@
 /// @domName HTMLOptGroupElement
 class OptGroupElement extends _Element_Merged {
 
-  factory OptGroupElement() => _Elements.createOptGroupElement();
+  factory OptGroupElement() => document.$dom_createElement("optgroup");
   OptGroupElement.internal(): super.internal();
 
 
@@ -18631,7 +18788,7 @@
 /// @domName HTMLOutputElement
 class OutputElement extends _Element_Merged {
 
-  factory OutputElement() => _Elements.createOutputElement();
+  factory OutputElement() => document.$dom_createElement("output");
   OutputElement.internal(): super.internal();
 
 
@@ -18883,7 +19040,7 @@
 /// @domName HTMLParagraphElement
 class ParagraphElement extends _Element_Merged {
 
-  factory ParagraphElement() => _Elements.createParagraphElement();
+  factory ParagraphElement() => document.$dom_createElement("p");
   ParagraphElement.internal(): super.internal();
 
 
@@ -18905,7 +19062,7 @@
 /// @domName HTMLParamElement
 class ParamElement extends _Element_Merged {
 
-  factory ParamElement() => _Elements.createParamElement();
+  factory ParamElement() => document.$dom_createElement("param");
   ParamElement.internal(): super.internal();
 
 
@@ -18954,9 +19111,7 @@
   factory PeerConnection00(String serverConfiguration, IceCallback iceCallback) => _PeerConnection00FactoryProvider.createPeerConnection00(serverConfiguration, iceCallback);
   PeerConnection00.internal(): super.internal();
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   PeerConnection00Events get on =>
     new PeerConnection00Events(this);
 
@@ -19323,7 +19478,7 @@
 /// @domName HTMLPreElement
 class PreElement extends _Element_Merged {
 
-  factory PreElement() => _Elements.createPreElement();
+  factory PreElement() => document.$dom_createElement("pre");
   PreElement.internal(): super.internal();
 
 
@@ -19381,7 +19536,7 @@
 /// @domName HTMLProgressElement
 class ProgressElement extends _Element_Merged {
 
-  factory ProgressElement() => _Elements.createProgressElement();
+  factory ProgressElement() => document.$dom_createElement("progress");
   ProgressElement.internal(): super.internal();
 
 
@@ -19488,9 +19643,7 @@
 class RTCDataChannel extends EventTarget {
   RTCDataChannel.internal(): super.internal();
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   RTCDataChannelEvents get on =>
     new RTCDataChannelEvents(this);
 
@@ -19667,9 +19820,7 @@
   }
   RTCPeerConnection.internal(): super.internal();
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   RTCPeerConnectionEvents get on =>
     new RTCPeerConnectionEvents(this);
 
@@ -19882,7 +20033,7 @@
 
 
 /// @domName RadioNodeList
-class RadioNodeList extends NodeList {
+class RadioNodeList extends _NodeList {
   RadioNodeList.internal(): super.internal();
 
 
@@ -20285,6 +20436,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  Map get first => this[0];
+
   Map get last => this[length - 1];
 
   Map removeLast() {
@@ -20439,7 +20592,7 @@
 /// @domName HTMLScriptElement
 class ScriptElement extends _Element_Merged {
 
-  factory ScriptElement() => _Elements.createScriptElement();
+  factory ScriptElement() => document.$dom_createElement("script");
   ScriptElement.internal(): super.internal();
 
 
@@ -20518,9 +20671,7 @@
 class ScriptProcessorNode extends AudioNode implements EventTarget {
   ScriptProcessorNode.internal(): super.internal();
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   ScriptProcessorNodeEvents get on =>
     new ScriptProcessorNodeEvents(this);
 
@@ -20617,7 +20768,7 @@
 /// @domName HTMLSelectElement
 class SelectElement extends _Element_Merged {
 
-  factory SelectElement() => _Elements.createSelectElement();
+  factory SelectElement() => document.$dom_createElement("select");
   SelectElement.internal(): super.internal();
 
 
@@ -20879,9 +21030,7 @@
 class SharedWorkerContext extends WorkerContext {
   SharedWorkerContext.internal(): super.internal();
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   SharedWorkerContextEvents get on =>
     new SharedWorkerContextEvents(this);
 
@@ -21003,6 +21152,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  SourceBuffer get first => this[0];
+
   SourceBuffer get last => this[length - 1];
 
   SourceBuffer removeLast() {
@@ -21053,7 +21204,7 @@
 /// @domName HTMLSourceElement
 class SourceElement extends _Element_Merged {
 
-  factory SourceElement() => _Elements.createSourceElement();
+  factory SourceElement() => document.$dom_createElement("source");
   SourceElement.internal(): super.internal();
 
 
@@ -21091,7 +21242,7 @@
 /// @domName HTMLSpanElement
 class SpanElement extends _Element_Merged {
 
-  factory SpanElement() => _Elements.createSpanElement();
+  factory SpanElement() => document.$dom_createElement("span");
   SpanElement.internal(): super.internal();
 
 }
@@ -21202,6 +21353,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  SpeechGrammar get first => this[0];
+
   SpeechGrammar get last => this[length - 1];
 
   SpeechGrammar removeLast() {
@@ -21311,9 +21464,7 @@
   factory SpeechRecognition() => _SpeechRecognitionFactoryProvider.createSpeechRecognition();
   SpeechRecognition.internal(): super.internal();
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   SpeechRecognitionEvents get on =>
     new SpeechRecognitionEvents(this);
 
@@ -21532,7 +21683,7 @@
 
   String operator [](String key) => $dom_getItem(key);
 
-  void operator []=(String key, String value) => $dom_setItem(key, value);
+  void operator []=(String key, String value) { $dom_setItem(key, value); }
 
   String putIfAbsent(String key, String ifAbsent()) {
     if (!containsKey(key)) this[key] = ifAbsent();
@@ -21700,7 +21851,7 @@
 /// @domName HTMLStyleElement
 class StyleElement extends _Element_Merged {
 
-  factory StyleElement() => _Elements.createStyleElement();
+  factory StyleElement() => document.$dom_createElement("style");
   StyleElement.internal(): super.internal();
 
 
@@ -21814,7 +21965,7 @@
 /// @domName HTMLTableCaptionElement
 class TableCaptionElement extends _Element_Merged {
 
-  factory TableCaptionElement() => _Elements.createTableCaptionElement();
+  factory TableCaptionElement() => document.$dom_createElement("caption");
   TableCaptionElement.internal(): super.internal();
 
 
@@ -21836,7 +21987,7 @@
 /// @domName HTMLTableCellElement
 class TableCellElement extends _Element_Merged {
 
-  factory TableCellElement() => _Elements.createTableCellElement();
+  factory TableCellElement() => document.$dom_createElement("td");
   TableCellElement.internal(): super.internal();
 
 
@@ -21966,7 +22117,7 @@
 /// @domName HTMLTableColElement
 class TableColElement extends _Element_Merged {
 
-  factory TableColElement() => _Elements.createTableColElement();
+  factory TableColElement() => document.$dom_createElement("col");
   TableColElement.internal(): super.internal();
 
 
@@ -22028,7 +22179,7 @@
 /// @domName HTMLTableElement
 class TableElement extends _Element_Merged {
 
-  factory TableElement() => _Elements.createTableElement();
+  factory TableElement() => document.$dom_createElement("table");
   TableElement.internal(): super.internal();
 
 
@@ -22182,7 +22333,7 @@
 /// @domName HTMLTableRowElement
 class TableRowElement extends _Element_Merged {
 
-  factory TableRowElement() => _Elements.createTableRowElement();
+  factory TableRowElement() => document.$dom_createElement("tr");
   TableRowElement.internal(): super.internal();
 
 
@@ -22336,7 +22487,7 @@
 /// @domName HTMLTextAreaElement
 class TextAreaElement extends _Element_Merged {
 
-  factory TextAreaElement() => _Elements.createTextAreaElement();
+  factory TextAreaElement() => document.$dom_createElement("textarea");
   TextAreaElement.internal(): super.internal();
 
 
@@ -22591,9 +22742,7 @@
 class TextTrack extends EventTarget {
   TextTrack.internal(): super.internal();
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   TextTrackEvents get on =>
     new TextTrackEvents(this);
 
@@ -22665,9 +22814,7 @@
   factory TextTrackCue(num startTime, num endTime, String text) => _TextTrackCueFactoryProvider.createTextTrackCue(startTime, endTime, text);
   TextTrackCue.internal(): super.internal();
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   TextTrackCueEvents get on =>
     new TextTrackCueEvents(this);
 
@@ -22863,6 +23010,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  TextTrackCue get first => this[0];
+
   TextTrackCue get last => this[length - 1];
 
   TextTrackCue removeLast() {
@@ -22906,9 +23055,7 @@
 class TextTrackList extends EventTarget implements List<TextTrack> {
   TextTrackList.internal(): super.internal();
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   TextTrackListEvents get on =>
     new TextTrackListEvents(this);
 
@@ -22976,6 +23123,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  TextTrack get first => this[0];
+
   TextTrack get last => this[length - 1];
 
   TextTrack removeLast() {
@@ -23064,7 +23213,7 @@
 /// @domName HTMLTitleElement
 class TitleElement extends _Element_Merged {
 
-  factory TitleElement() => _Elements.createTitleElement();
+  factory TitleElement() => document.$dom_createElement("title");
   TitleElement.internal(): super.internal();
 
 }
@@ -23247,6 +23396,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  Touch get first => this[0];
+
   Touch get last => this[length - 1];
 
   Touch removeLast() {
@@ -23285,7 +23436,7 @@
 /// @domName HTMLTrackElement
 class TrackElement extends _Element_Merged {
 
-  factory TrackElement() => _Elements.createTrackElement();
+  factory TrackElement() => document.$dom_createElement("track");
   TrackElement.internal(): super.internal();
 
   static const int ERROR = 3;
@@ -23507,7 +23658,7 @@
 /// @domName HTMLUListElement
 class UListElement extends _Element_Merged {
 
-  factory UListElement() => _Elements.createUListElement();
+  factory UListElement() => document.$dom_createElement("ul");
   UListElement.internal(): super.internal();
 
 
@@ -23615,6 +23766,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  int get first => this[0];
+
   int get last => this[length - 1];
 
   int removeLast() {
@@ -23746,6 +23899,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  int get first => this[0];
+
   int get last => this[length - 1];
 
   int removeLast() {
@@ -23877,6 +24032,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  int get first => this[0];
+
   int get last => this[length - 1];
 
   int removeLast() {
@@ -24083,7 +24240,7 @@
 /// @domName HTMLVideoElement
 class VideoElement extends MediaElement {
 
-  factory VideoElement() => _Elements.createVideoElement();
+  factory VideoElement() => document.$dom_createElement("video");
   VideoElement.internal(): super.internal();
 
 
@@ -25874,9 +26031,7 @@
   factory WebSocket(String url) => _WebSocketFactoryProvider.createWebSocket(url);
   WebSocket.internal(): super.internal();
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   WebSocketEvents get on =>
     new WebSocketEvents(this);
 
@@ -26019,9 +26174,7 @@
   factory Worker(String scriptUrl) => _WorkerFactoryProvider.createWorker(scriptUrl);
   Worker.internal(): super.internal();
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   WorkerEvents get on =>
     new WorkerEvents(this);
 
@@ -26051,9 +26204,7 @@
 class WorkerContext extends EventTarget {
   WorkerContext.internal(): super.internal();
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
   WorkerContextEvents get on =>
     new WorkerContextEvents(this);
 
@@ -26561,6 +26712,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  CSSRule get first => this[0];
+
   CSSRule get last => this[length - 1];
 
   CSSRule removeLast() {
@@ -26664,6 +26817,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  CSSValue get first => this[0];
+
   CSSValue get last => this[length - 1];
 
   CSSValue removeLast() {
@@ -26767,6 +26922,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  ClientRect get first => this[0];
+
   ClientRect get last => this[length - 1];
 
   ClientRect removeLast() {
@@ -26878,6 +27035,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  String get first => this[0];
+
   String get last => this[length - 1];
 
   String removeLast() {
@@ -27058,311 +27217,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.
 
-
-class _Elements {
-
-
-  static AnchorElement createAnchorElement([String href]) {
-    AnchorElement _e = document.$dom_createElement("a");
-    if (href != null) _e.href = href;
-    return _e;
-  }
-
-  static AreaElement createAreaElement() {
-    AreaElement _e = document.$dom_createElement("area");
-    return _e;
-  }
-
-  static BRElement createBRElement() {
-    BRElement _e = document.$dom_createElement("br");
-    return _e;
-  }
-
-  static BaseElement createBaseElement() {
-    BaseElement _e = document.$dom_createElement("base");
-    return _e;
-  }
-
-  static BodyElement createBodyElement() {
-    BodyElement _e = document.$dom_createElement("body");
-    return _e;
-  }
-
-  static ButtonElement createButtonElement() {
-    ButtonElement _e = document.$dom_createElement("button");
-    return _e;
-  }
-
-  static CanvasElement createCanvasElement([int width, int height]) {
-    CanvasElement _e = document.$dom_createElement("canvas");
-    if (width != null) _e.width = width;
-    if (height != null) _e.height = height;
-    return _e;
-  }
-
-  static ContentElement createContentElement() {
-    ContentElement _e = document.$dom_createElement("content");
-    return _e;
-  }
-
-  static DListElement createDListElement() {
-    DListElement _e = document.$dom_createElement("dl");
-    return _e;
-  }
-
-  static DataListElement createDataListElement() {
-    DataListElement _e = document.$dom_createElement("datalist");
-    return _e;
-  }
-
-  static DetailsElement createDetailsElement() {
-    DetailsElement _e = document.$dom_createElement("details");
-    return _e;
-  }
-
-  static DivElement createDivElement() {
-    DivElement _e = document.$dom_createElement("div");
-    return _e;
-  }
-
-  static EmbedElement createEmbedElement() {
-    EmbedElement _e = document.$dom_createElement("embed");
-    return _e;
-  }
-
-  static FieldSetElement createFieldSetElement() {
-    FieldSetElement _e = document.$dom_createElement("fieldset");
-    return _e;
-  }
-
-  static FormElement createFormElement() {
-    FormElement _e = document.$dom_createElement("form");
-    return _e;
-  }
-
-  static HRElement createHRElement() {
-    HRElement _e = document.$dom_createElement("hr");
-    return _e;
-  }
-
-  static HeadElement createHeadElement() {
-    HeadElement _e = document.$dom_createElement("head");
-    return _e;
-  }
-
-  static HeadingElement createHeadingElement_h1() {
-    HeadingElement _e = document.$dom_createElement("h1");
-    return _e;
-  }
-
-  static HeadingElement createHeadingElement_h2() {
-    HeadingElement _e = document.$dom_createElement("h2");
-    return _e;
-  }
-
-  static HeadingElement createHeadingElement_h3() {
-    HeadingElement _e = document.$dom_createElement("h3");
-    return _e;
-  }
-
-  static HeadingElement createHeadingElement_h4() {
-    HeadingElement _e = document.$dom_createElement("h4");
-    return _e;
-  }
-
-  static HeadingElement createHeadingElement_h5() {
-    HeadingElement _e = document.$dom_createElement("h5");
-    return _e;
-  }
-
-  static HeadingElement createHeadingElement_h6() {
-    HeadingElement _e = document.$dom_createElement("h6");
-    return _e;
-  }
-
-  static HtmlElement createHtmlElement() {
-    HtmlElement _e = document.$dom_createElement("html");
-    return _e;
-  }
-
-  static IFrameElement createIFrameElement() {
-    IFrameElement _e = document.$dom_createElement("iframe");
-    return _e;
-  }
-
-  static ImageElement createImageElement([String src, int width, int height]) {
-    ImageElement _e = document.$dom_createElement("img");
-    if (src != null) _e.src = src;
-    if (width != null) _e.width = width;
-    if (height != null) _e.height = height;
-    return _e;
-  }
-
-  static InputElement createInputElement([String type]) {
-    InputElement _e = document.$dom_createElement("input");
-    if (type != null) _e.type = type;
-    return _e;
-  }
-
-  static KeygenElement createKeygenElement() {
-    KeygenElement _e = document.$dom_createElement("keygen");
-    return _e;
-  }
-
-  static LIElement createLIElement() {
-    LIElement _e = document.$dom_createElement("li");
-    return _e;
-  }
-
-  static LabelElement createLabelElement() {
-    LabelElement _e = document.$dom_createElement("label");
-    return _e;
-  }
-
-  static LegendElement createLegendElement() {
-    LegendElement _e = document.$dom_createElement("legend");
-    return _e;
-  }
-
-  static LinkElement createLinkElement() {
-    LinkElement _e = document.$dom_createElement("link");
-    return _e;
-  }
-
-  static MapElement createMapElement() {
-    MapElement _e = document.$dom_createElement("map");
-    return _e;
-  }
-
-  static MenuElement createMenuElement() {
-    MenuElement _e = document.$dom_createElement("menu");
-    return _e;
-  }
-
-  static MeterElement createMeterElement() {
-    MeterElement _e = document.$dom_createElement("meter");
-    return _e;
-  }
-
-  static OListElement createOListElement() {
-    OListElement _e = document.$dom_createElement("ol");
-    return _e;
-  }
-
-  static ObjectElement createObjectElement() {
-    ObjectElement _e = document.$dom_createElement("object");
-    return _e;
-  }
-
-  static OptGroupElement createOptGroupElement() {
-    OptGroupElement _e = document.$dom_createElement("optgroup");
-    return _e;
-  }
-
-  static OutputElement createOutputElement() {
-    OutputElement _e = document.$dom_createElement("output");
-    return _e;
-  }
-
-  static ParagraphElement createParagraphElement() {
-    ParagraphElement _e = document.$dom_createElement("p");
-    return _e;
-  }
-
-  static ParamElement createParamElement() {
-    ParamElement _e = document.$dom_createElement("param");
-    return _e;
-  }
-
-  static PreElement createPreElement() {
-    PreElement _e = document.$dom_createElement("pre");
-    return _e;
-  }
-
-  static ProgressElement createProgressElement() {
-    ProgressElement _e = document.$dom_createElement("progress");
-    return _e;
-  }
-
-  static ScriptElement createScriptElement() {
-    ScriptElement _e = document.$dom_createElement("script");
-    return _e;
-  }
-
-  static SelectElement createSelectElement() {
-    SelectElement _e = document.$dom_createElement("select");
-    return _e;
-  }
-
-  static SourceElement createSourceElement() {
-    SourceElement _e = document.$dom_createElement("source");
-    return _e;
-  }
-
-  static SpanElement createSpanElement() {
-    SpanElement _e = document.$dom_createElement("span");
-    return _e;
-  }
-
-  static StyleElement createStyleElement() {
-    StyleElement _e = document.$dom_createElement("style");
-    return _e;
-  }
-
-  static TableCaptionElement createTableCaptionElement() {
-    TableCaptionElement _e = document.$dom_createElement("caption");
-    return _e;
-  }
-
-  static TableCellElement createTableCellElement() {
-    TableCellElement _e = document.$dom_createElement("td");
-    return _e;
-  }
-
-  static TableColElement createTableColElement() {
-    TableColElement _e = document.$dom_createElement("col");
-    return _e;
-  }
-
-  static TableElement createTableElement() {
-    TableElement _e = document.$dom_createElement("table");
-    return _e;
-  }
-
-  static TableRowElement createTableRowElement() {
-    TableRowElement _e = document.$dom_createElement("tr");
-    return _e;
-  }
-
-  static TextAreaElement createTextAreaElement() {
-    TextAreaElement _e = document.$dom_createElement("textarea");
-    return _e;
-  }
-
-  static TitleElement createTitleElement() {
-    TitleElement _e = document.$dom_createElement("title");
-    return _e;
-  }
-
-  static TrackElement createTrackElement() {
-    TrackElement _e = document.$dom_createElement("track");
-    return _e;
-  }
-
-  static UListElement createUListElement() {
-    UListElement _e = document.$dom_createElement("ul");
-    return _e;
-  }
-
-  static VideoElement createVideoElement() {
-    VideoElement _e = document.$dom_createElement("video");
-    return _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.
-
 // WARNING: Do not edit - generated code.
 
 
@@ -27434,6 +27288,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  Entry get first => this[0];
+
   Entry get last => this[length - 1];
 
   Entry removeLast() {
@@ -27537,6 +27393,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  EntrySync get first => this[0];
+
   EntrySync get last => this[length - 1];
 
   EntrySync removeLast() {
@@ -27648,6 +27506,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  File get first => this[0];
+
   File get last => this[length - 1];
 
   File removeLast() {
@@ -27775,6 +27635,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  Gamepad get first => this[0];
+
   Gamepad get last => this[length - 1];
 
   Gamepad removeLast() {
@@ -27927,6 +27789,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  MediaStream get first => this[0];
+
   MediaStream get last => this[length - 1];
 
   MediaStream removeLast() {
@@ -27975,6 +27839,111 @@
 // for 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";
@@ -28134,6 +28103,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  SpeechInputResult get first => this[0];
+
   SpeechInputResult get last => this[length - 1];
 
   SpeechInputResult removeLast() {
@@ -28245,6 +28216,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  SpeechRecognitionResult get first => this[0];
+
   SpeechRecognitionResult get last => this[length - 1];
 
   SpeechRecognitionResult removeLast() {
@@ -28348,6 +28321,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  StyleSheet get first => this[0];
+
   StyleSheet get last => this[length - 1];
 
   StyleSheet removeLast() {
@@ -28459,6 +28434,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  Animation get first => this[0];
+
   Animation get last => this[length - 1];
 
   Animation removeLast() {
@@ -28524,19 +28501,88 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
+/**
+ * An object representing the top-level context object for web scripting.
+ *
+ * In a web browser, a [Window] object represents the actual browser window.
+ * In a multi-tabbed browser, each tab has its own [Window] object. A [Window]
+ * is the container that displays a [Document]'s content. All web scripting
+ * happens within the context of a [Window] object.
+ *
+ * **Note:** This class represents any window, whereas [LocalWindow] is
+ * used to access the properties and content of the current window.
+ *
+ * See also:
+ *
+ * * [DOM Window](https://developer.mozilla.org/en-US/docs/DOM/window) from MDN.
+ * * [Window](http://www.w3.org/TR/Window/) from the W3C.
+ */
 abstract class Window {
   // Fields.
+
+  /**
+   * The current location of this window.
+   *
+   *     Location currentLocation = window.location;
+   *     print(currentLocation.href); // 'http://www.example.com:80/'
+   */
   Location get location;
   History get history;
 
+  /**
+   * Indicates whether this window is closed.
+   *
+   *     print(window.closed); // 'false'
+   *     window.close();
+   *     print(window.closed); // 'true'
+   */
   bool get closed;
+
+  /**
+   * A reference to the window that opened this one.
+   *
+   *     Window thisWindow = window;
+   *     Window otherWindow = thisWindow.open('http://www.example.com/', 'foo');
+   *     print(otherWindow.opener == thisWindow); // 'true'
+   */
   Window get opener;
+
+  /**
+   * A reference to the parent of this window.
+   *
+   * If this [Window] has no parent, [parent] will return a reference to
+   * the [Window] itself.
+   *
+   *     IFrameElement myIFrame = new IFrameElement();
+   *     window.document.body.elements.add(myIFrame);
+   *     print(myIframe.contentWindow.parent == window) // 'true'
+   *
+   *     print(window.parent == window) // 'true'
+   */
   Window get parent;
+
+  /**
+   * A reference to the topmost window in the window hierarchy.
+   *
+   * If this [Window] is the topmost [Window], [top] will return a reference to
+   * the [Window] itself.
+   *
+   *     // Add an IFrame to the current window.
+   *     IFrameElement myIFrame = new IFrameElement();
+   *     window.document.body.elements.add(myIFrame);
+   *
+   *     // Add an IFrame inside of the other IFrame.
+   *     IFrameElement innerIFrame = new IFrameElement();
+   *     myIFrame.elements.add(innerIFrame);
+   *
+   *     print(myIframe.contentWindow.top == window) // 'true'
+   *     print(innerIFrame.contentWindow.top == window) // 'true'
+   *
+   *     print(window.top == window) // 'true'
+   */
   Window get top;
 
   // Methods.
-  void focus();
-  void blur();
   void close();
   void postMessage(var message, String targetOrigin, [List messagePorts = null]);
 }
@@ -28781,6 +28827,8 @@
     return _filtered.lastIndexOf(element, start);
   }
 
+  Element get first => _filtered.first;
+
   Element get last => _filtered.last;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -30735,8 +30783,6 @@
   Window get top() native "DOMWindow_top_Getter";
 
   // Methods.
-  void focus() native "DOMWindow_focus_Callback";
-  void blur() native "DOMWindow_blur_Callback";
   void close() native "DOMWindow_close_Callback";
   void postMessage(/*SerializedScriptValue*/ message, String targetOrigin, [List messagePorts]) native "DOMWindow_postMessage_Callback";
 
diff --git a/sdk/lib/html/scripts/generator.py b/sdk/lib/html/scripts/generator.py
index 89913d2..76b5ecf 100644
--- a/sdk/lib/html/scripts/generator.py
+++ b/sdk/lib/html/scripts/generator.py
@@ -305,7 +305,12 @@
        is named, e.g. 'fromList' in  Int8Array.fromList(list).
     type_name: A string, the name of the return type of the operation.
     param_infos: A list of ParamInfo.
+    factory_parameters: A list of parameters used for custom designed Factory
+        calls.
   """
+  
+  def __init__(self):
+    self.factory_parameters = None
 
   def ParametersDeclaration(self, rename_type, force_optional=False):
     def FormatParam(param):
@@ -356,11 +361,18 @@
   def ConstructorFactoryName(self, rename_type):
     return 'create' + self._ConstructorFullName(rename_type).replace('.', '_')
 
-  def GenerateFactoryInvocation(self, rename_type, emitter, factory_provider):
+  def GenerateFactoryInvocation(self, rename_type, emitter, factory_name,
+      factory_constructor_name=None, factory_parameters=None):
     has_optional = any(param_info.is_optional
         for param_info in self.param_infos)
 
-    factory_name = self.ConstructorFactoryName(rename_type)
+    if not factory_constructor_name:
+      factory_constructor_name = self.ConstructorFactoryName(rename_type)
+      factory_parameters = self.ParametersAsArgumentList()
+      has_factory_provider = True
+    else:
+      factory_parameters = ', '.join(factory_parameters)
+      has_factory_provider = False
     if not has_optional:
       emitter.Emit(
           '\n'
@@ -368,11 +380,19 @@
           '$FACTORY.$CTOR_FACTORY_NAME($FACTORY_PARAMS);\n',
           CTOR=self._ConstructorFullName(rename_type),
           PARAMS=self.ParametersDeclaration(rename_type),
-          FACTORY=factory_provider,
-          CTOR_FACTORY_NAME=factory_name,
-          FACTORY_PARAMS=self.ParametersAsArgumentList())
+          FACTORY=factory_name,
+          CTOR_FACTORY_NAME=factory_constructor_name,
+          FACTORY_PARAMS=factory_parameters)
       return
+    if has_factory_provider:
+      self._GenerateFactoryOptParams(rename_type, emitter, factory_name)
+    else:
+      self._GenerateFactoryOptParamsWithoutFactoryProvider(rename_type, emitter,
+          factory_name, factory_constructor_name, factory_parameters)
 
+  def _GenerateFactoryOptParams(self, rename_type, emitter, factory_provider):
+    """Helper method for creating generic factory constructors with optional
+    parameters that use factory providers."""
     dispatcher_emitter = emitter.Emit(
         '\n'
         '  factory $CTOR($PARAMS) {\n'
@@ -382,7 +402,7 @@
         CTOR=self._ConstructorFullName(rename_type),
         PARAMS=self.ParametersDeclaration(rename_type),
         FACTORY=factory_provider,
-        CTOR_FACTORY_NAME=factory_name,
+        CTOR_FACTORY_NAME=self.ConstructorFactoryName(rename_type),
         FACTORY_PARAMS=self.ParametersAsArgumentList())
 
     # If we have optional parameters, check to see if they are set
@@ -394,12 +414,34 @@
         '    }\n',
         OPT_PARAM_NAME=self.param_infos[index].name,
         FACTORY=factory_provider,
-        CTOR_FACTORY_NAME=factory_name,
+        CTOR_FACTORY_NAME=self.ConstructorFactoryName(rename_type),
         FACTORY_PARAMS=self.ParametersAsArgumentList(index))
 
     for index, param_info in enumerate(self.param_infos):
       if param_info.is_optional:
         EmitOptionalParameterInvocation(index)
+  
+  def _GenerateFactoryOptParamsWithoutFactoryProvider(self, rename_type,
+      emitter, factory_name, factory_constructor_name, factory_parameters): 
+    """Helper method for creating a factory constructor with optional
+    parameters that does not call a factory provider, it simply creates the
+    object itself. This is currently used for SVGElements and HTMLElements."""
+    inits = emitter.Emit(
+        '\n'
+        '  factory $CONSTRUCTOR($PARAMS) {\n'	
+        '    var e = $FACTORY.$CTOR_FACTORY_NAME($FACTORY_PARAMS);\n'
+        '$!INITS'
+        '    return e;\n'
+        '  }\n',
+        CONSTRUCTOR=self._ConstructorFullName(rename_type),
+        FACTORY=factory_name,
+        CTOR_FACTORY_NAME=factory_constructor_name,
+        PARAMS=self.ParametersDeclaration(rename_type),
+        FACTORY_PARAMS=factory_parameters)
+    for index, param_info in enumerate(self.param_infos):
+      if param_info.is_optional:
+        inits.Emit('    if ($E != null) e.$E = $E;\n',
+            E=self.param_infos[index].name)
 
 def ConstantOutputOrder(a, b):
   """Canonical output ordering for constants."""
@@ -541,6 +583,90 @@
 
 # ------------------------------------------------------------------------------
 
+# Annotations to be placed on 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:
+#
+#   INTERFACE.MEMBER: annotations for member.
+#   +TYPE:            add annotations only if there are member annotations.
+#   TYPE:             add regardless of member annotations.
+
+dart2js_annotations = {
+
+    'CanvasRenderingContext2D.createImageData':
+      "@Creates('ImageData|=Object')",
+
+    'CanvasRenderingContext2D.getImageData':
+      "@Creates('ImageData|=Object')",
+
+    'CanvasRenderingContext2D.webkitGetImageDataHD':
+      "@Creates('ImageData|=Object')",
+
+    'DOMWindow.openDatabase': "@Creates('Database') @Creates('DatabaseSync')",
+
+    'FileReader.result': "@Creates('String|ArrayBuffer|Null')",
+
+    # Rather than have the result of an IDBRequest as a union over all possible
+    # results, we mark the result as instantiating any classes, and mark
+    # each operation with the classes that it could cause to be asynchronously
+    # instantiated.
+    'IDBRequest.result':  "@Creates('Null')",
+
+    # The source is usually a participant in the operation that generated the
+    # IDBRequest.
+    'IDBRequest.source':  "@Creates('Null')",
+
+    'IDBFactory.open': "@Creates('IDBDatabase')",
+
+    'IDBObjectStore.put': "@_annotation_Creates_IDBKey",
+    'IDBObjectStore.add': "@_annotation_Creates_IDBKey",
+    'IDBObjectStore.get': "@_annotation_Creates_SerializedScriptValue",
+    'IDBObjectStore.openCursor': "@Creates('IDBCursor')",
+
+    'IDBIndex.get': "@_annotation_Creates_SerializedScriptValue",
+    'IDBIndex.getKey':
+      "@_annotation_Creates_SerializedScriptValue "
+      # The source is the object store behind the index.
+      "@Creates('IDBObjectStore')",
+    'IDBIndex.openCursor': "@Creates('IDBCursor')",
+    'IDBIndex.openKeyCursor': "@Creates('IDBCursor')",
+
+    'IDBCursorWithValue.value':
+      '@_annotation_Creates_SerializedScriptValue '
+      '@_annotation_Returns_SerializedScriptValue',
+
+    'IDBCursor.key': "@_annotation_Creates_IDBKey @_annotation_Returns_IDBKey",
+
+    '+IDBRequest': "@Returns('IDBRequest') @Creates('IDBRequest')",
+
+    '+IDBOpenDBRequest': "@Returns('IDBRequest') @Creates('IDBRequest')",
+    '+IDBVersionChangeRequest': "@Returns('IDBRequest') @Creates('IDBRequest')",
+
+
+    'MessageEvent.ports': "@Creates('=List')",
+
+    'SQLResultSetRowList.item': "@Creates('=Object')",
+
+    'XMLHttpRequest.response':
+      "@Creates('ArrayBuffer|Blob|Document|=Object|=List|String|num')",
+}
+
+def FindAnnotations(idl_type, interface_name, member_name):
+  ann1 = dart2js_annotations.get("%s.%s" % (interface_name, member_name))
+  if ann1:
+    ann2 = dart2js_annotations.get('+' + idl_type)
+    if ann2:
+      return ann2 + ' ' + ann1
+    ann2 = dart2js_annotations.get(idl_type)
+    if ann2:
+      return ann2 + ' ' + ann1
+    return ann1
+
+  ann2 = dart2js_annotations.get(idl_type)
+  return ann2
+
+# ------------------------------------------------------------------------------
+
 class IDLTypeInfo(object):
   def __init__(self, idl_type, data):
     self._idl_type = idl_type
@@ -663,19 +789,13 @@
     self._type_registry = type_registry
 
   def dart_type(self):
-    # TODO(podivilov): why NodeList is special?
-    if self.idl_type() == 'NodeList':
-      return 'List<Node>'
     if self.list_item_type() and not self.has_generated_interface():
       return 'List<%s>' % self._type_registry.TypeInfo(self._data.item_type).dart_type()
     return self._data.dart_type or self._dart_interface_name
 
   def narrow_dart_type(self):
-    # TODO(podivilov): why NodeList is special?
-    if self.idl_type() == 'NodeList':
-      return 'List<Node>'
     if self.list_item_type():
-      return self.idl_type()
+      return self.implementation_name()
     # TODO(podivilov): only primitive and collection types should override
     # dart_type.
     if self._data.dart_type != None:
@@ -685,15 +805,10 @@
     return self.interface_name()
 
   def interface_name(self):
-    if self.list_item_type() and not self.has_generated_interface():
-      return self.dart_type()
     return self._dart_interface_name
 
   def implementation_name(self):
-    if self.list_item_type():
-      implementation_name = self.idl_type()
-    else:
-      implementation_name = self.interface_name()
+    implementation_name = self._dart_interface_name
     if self.merged_into():
       implementation_name = '_%s_Merged' % implementation_name
 
@@ -822,9 +937,9 @@
 
 
 class SVGTearOffIDLTypeInfo(InterfaceIDLTypeInfo):
-  def __init__(self, idl_type, data, type_registry):
+  def __init__(self, idl_type, data, interface_name, type_registry):
     super(SVGTearOffIDLTypeInfo, self).__init__(
-        idl_type, data, idl_type, type_registry)
+        idl_type, data, interface_name, type_registry)
 
   def native_type(self):
     if self._data.native_type:
@@ -980,7 +1095,8 @@
     'MediaStreamList': TypeData(clazz='Interface',
         item_type='MediaStream', suppress_interface=True),
     'NamedNodeMap': TypeData(clazz='Interface', item_type='Node'),
-    'NodeList': TypeData(clazz='Interface', item_type='Node'),
+    'NodeList': TypeData(clazz='Interface', item_type='Node',
+                         suppress_interface=True),
     'SVGAnimatedLengthList': TypeData(clazz='Interface',
         item_type='SVGAnimatedLength'),
     'SVGAnimatedNumberList': TypeData(clazz='Interface',
@@ -1080,12 +1196,15 @@
         dart_interface_name = self._renamer.RenameInterface(
             self._database.GetInterface(type_name))
       else:
-        dart_interface_name = type_name
+        dart_interface_name = self._renamer.DartifyTypeName(type_name)
       return InterfaceIDLTypeInfo(type_name, type_data, dart_interface_name,
                                   self)
 
     if type_data.clazz == 'SVGTearOff':
-      return SVGTearOffIDLTypeInfo(type_name, type_data, self)
+      dart_interface_name = self._renamer.RenameInterface(
+          self._database.GetInterface(type_name))
+      return SVGTearOffIDLTypeInfo(
+          type_name, type_data, dart_interface_name, self)
 
     class_name = '%sIDLTypeInfo' % type_data.clazz
     return globals()[class_name](type_name, type_data)
diff --git a/sdk/lib/html/scripts/htmldartgenerator.py b/sdk/lib/html/scripts/htmldartgenerator.py
index 0dd7ab7..8f445a1 100644
--- a/sdk/lib/html/scripts/htmldartgenerator.py
+++ b/sdk/lib/html/scripts/htmldartgenerator.py
@@ -32,23 +32,24 @@
     """ Emits the MDN dartdoc comment for an attribute.
     """
     dom_name = DartDomNameOfAttribute(attribute)
-    self._members_emitter.Emit('\n  /** @domName $DOMINTERFACE.$DOMNAME */',
+    self._members_emitter.Emit('\n  /// @domName $DOMINTERFACE.$DOMNAME;'
+                               ' @docsEditable true',
         DOMINTERFACE=attribute.doc_js_interface_name,
         DOMNAME=dom_name)
 
   def EmitOperationDocumentation(self, operation):
     """ Emits the MDN dartdoc comment for an operation.
     """
-    self._members_emitter.Emit('\n  /** @domName $DOMINTERFACE.$DOMNAME */',
+    self._members_emitter.Emit('\n  /// @domName $DOMINTERFACE.$DOMNAME;'
+                               ' @docsEditable true',
         DOMINTERFACE=operation.overloads[0].doc_js_interface_name,
         DOMNAME=operation.name)
 
   def EmitEventGetter(self, events_class_name):
     self._members_emitter.Emit(
-        '\n  /**'
-        '\n   * @domName EventTarget.addEventListener, '
-        'EventTarget.removeEventListener, EventTarget.dispatchEvent'
-        '\n   */'
+        '\n  /// @domName EventTarget.addEventListener, '
+        'EventTarget.removeEventListener, EventTarget.dispatchEvent;'
+        ' @docsEditable true'
         '\n  $TYPE get on =>\n    new $TYPE(this);\n',
         TYPE=events_class_name)
 
@@ -182,17 +183,21 @@
       implements.append('List<%s>' % item_type_info.dart_type())
     return implements
 
-  def AddConstructors(self, constructors, factory_provider, class_name,
-      base_class):
+  def AddConstructors(self, constructors, factory_name, class_name,
+      base_class, factory_constructor_name=None):
     """ Adds all of the constructors.
     Arguments:
       constructors - List of the constructors to be added.
-      factory_provider - Name of the factory provider for this class.
+      factory_name - Name of the factory for this class.
       class_name - The name of this class.
       base_class - The name of the base class which this extends.
+      factory_constructor_name - The name of the constructor on the
+          factory_name to call (calls an autogenerated FactoryProvider 
+          if unspecified)
     """
     for constructor_info in constructors:
-      self._AddConstructor(constructor_info, factory_provider)
+      self._AddConstructor(constructor_info, factory_name,
+          factory_constructor_name, constructor_info.factory_parameters)
 
     typed_array_type = None
     for interface in self._database.Hierarchy(self._interface):
@@ -214,11 +219,14 @@
           '    $FACTORY.create$(CTOR)_fromBuffer(buffer, byteOffset, length);\n',
         CTOR=self._interface.id,
         TYPE=self._DartType(typed_array_type),
-        FACTORY=factory_provider)
+        FACTORY=factory_name)
 
-  def _AddConstructor(self, constructor_info, factory_provider):
-      constructor_info.GenerateFactoryInvocation(
-          self._DartType, self._members_emitter, factory_provider)
+  def _AddConstructor(self, constructor_info, factory_name,
+      factory_constructor_name, factory_constructor_params):
+    constructor_info.GenerateFactoryInvocation(
+        self._DartType, self._members_emitter, factory_name,
+        factory_constructor_name=factory_constructor_name,
+        factory_parameters=factory_constructor_params)
 
   def DeclareAttribute(self, attribute, type_name, attr_name, read_only):
     """ Declares an attribute but does not include the code to invoke it.
diff --git a/sdk/lib/html/scripts/htmlrenamer.py b/sdk/lib/html/scripts/htmlrenamer.py
index c513e49..2f26d06 100644
--- a/sdk/lib/html/scripts/htmlrenamer.py
+++ b/sdk/lib/html/scripts/htmlrenamer.py
@@ -2,6 +2,7 @@
 # Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
+import re
 
 html_interface_renames = {
     'DOMCoreException': 'DOMException',
@@ -11,6 +12,9 @@
     'History': 'LocalHistory',
     'HTMLDocument' : 'HtmlDocument',
     'Location': 'LocalLocation',
+    'SVGDocument': 'SvgDocument', # Manual to avoid name conflicts.
+    'SVGElement': 'SvgElement', # Manual to avoid name conflicts.
+    'SVGSVGElement': 'SvgSvgElement', # Manual to avoid name conflicts.
     'WebKitAnimation': 'Animation',
     'WebKitAnimationEvent': 'AnimationEvent',
     'WebKitBlobBuilder': 'BlobBuilder',
@@ -117,9 +121,9 @@
     'Node.parentNode': 'parent',
     'Node.previousSibling': 'previousNode',
     'Node.textContent': 'text',
-    'SVGElement.className': '$dom_svgClassName',
-    'SVGAnimatedString.className': '$dom_svgClassName',
-    'SVGStylable.className': '$dom_svgClassName',
+    'SvgElement.className': '$dom_svgClassName',
+    'AnimatedString.className': '$dom_svgClassName',
+    'Stylable.className': '$dom_svgClassName',
     'Url.createObjectURL': 'createObjectUrl',
     'Url.revokeObjectURL': 'revokeObjectUrl',
 }
@@ -286,9 +290,11 @@
     "Node.lookupPrefix",
     "Node.get:PROCESSING_INSTRUCTION_NODE",
     'ShadowRoot.getElementsByTagNameNS',
+    "LocalWindow.blur",
     "LocalWindow.clientInformation",
     "LocalWindow.get:frames",
     "LocalWindow.get:length",
+    "LocalWindow.focus",
     "LocalWindow.prompt",
     "LocalWindow.webkitCancelRequestAnimationFrame",
     "WheelEvent.wheelDelta",
@@ -305,7 +311,7 @@
       if any(interface.id in ['Element', 'Document']
              for interface in self._database.Hierarchy(interface)):
         return interface.id[len('HTML'):]
-    return interface.id
+    return self.DartifyTypeName(interface.id)
 
   def RenameMember(self, interface_name, member_node, member, member_prefix=''):
     """
@@ -339,6 +345,37 @@
         return member_name
 
   def GetLibraryName(self, interface):
-    if interface.id.startswith('SVG'):
+    return self._GetLibraryName(interface.id)
+
+  def _GetLibraryName(self, idl_type_name):
+    """
+    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'
     return 'html'
+
+  def DartifyTypeName(self, type_name):
+    """Converts a DOM name to a Dart-friendly class name. """
+    library_name = self._GetLibraryName(type_name)
+    # Only renaming SVG for now.
+    if library_name != 'svg':
+      return type_name
+
+    # Strip off the SVG prefix.
+    name = re.sub(r'^SVG', '', type_name)
+
+    def toLower(match):
+      return match.group(1) + match.group(2).lower() + match.group(3)
+
+    # We're looking for a sequence of letters which start with capital letter
+    # then a series of caps and finishes with either the end of the string or
+    # a capital letter.
+    # The [0-9] check is for names such as 2D or 3D
+    # The following test cases should match as:
+    #   WebKitCSSFilterValue: WebKit(C)(SS)(F)ilterValue
+    #   XPathNSResolver: (X)()(P)ath(N)(S)(R)esolver (no change)
+    #   IFrameElement: (I)()(F)rameElement (no change)
+    return re.sub(r'([A-Z])([A-Z]{2,})([A-Z]|$)', toLower, name)
diff --git a/sdk/lib/html/scripts/systemhtml.py b/sdk/lib/html/scripts/systemhtml.py
index dbdb4cc..38ad58c 100644
--- a/sdk/lib/html/scripts/systemhtml.py
+++ b/sdk/lib/html/scripts/systemhtml.py
@@ -58,9 +58,9 @@
 class ElementConstructorInfo(object):
   def __init__(self, name=None, tag=None,
                params=[], opt_params=[],
-               factory_provider_name='_Elements'):
+               factory_provider_name='document'):
     self.name = name          # The constructor name 'h1' in 'HeadingElement.h1'
-    self.tag = tag or name    # The HTML tag
+    self.tag = tag or name    # The HTML or SVG tag
     self.params = params
     self.opt_params = opt_params
     self.factory_provider_name = factory_provider_name
@@ -76,6 +76,7 @@
     info.param_infos = map(lambda tXn: ParamInfo(tXn[1], tXn[0], True),
                            self.opt_params)
     info.requires_named_arguments = True
+    info.factory_parameters = ['"%s"' % self.tag]
     return info
 
 _html_element_constructors = {
@@ -148,40 +149,88 @@
   'VideoElement': 'video'
 }
 
-def HtmlElementConstructorInfos(typename):
+_svg_element_constructors = {
+  'AElement': 'a',
+  'AnimateColorElement': 'animateColor',
+  'AnimateElement': 'animate',
+  'AnimateMotionElement': 'animateMotion',
+  'AnimateTransformElement': 'animateTransform',
+  'AnimationElement': 'animation',
+  'CircleElement': 'circle',
+  'ClipPathElement': 'clipPath',
+  'CursorElement': 'cursor',
+  'DefsElement': 'defs',
+  'DescElement': 'desc',
+  'EllipseElement': 'ellipse',
+  'FilterElement': 'filter',
+  'FontElement': 'font',
+  'FontFaceElement': 'font-face',
+  'FontFaceFormatElement': 'font-face-format',
+  'FontFaceNameElement': 'font-face-name',
+  'FontFaceSrcElement': 'font-face-src',
+  'FontFaceUriElement': 'font-face-uri',
+  'ForeignObjectElement': 'foreignObject',
+  'GlyphElement': 'glyph',
+  'GElement': 'g',
+  'HKernElement': 'hkern',
+  'ImageElement': 'image',
+  'LinearGradientElement': 'linearGradient',
+  'LineElement': 'line',
+  'MarkerElement': 'marker',
+  'MaskElement': 'mask',
+  'MPathElement': 'mpath',
+  'PathElement': 'path',
+  'PatternElement': 'pattern',
+  'PolygonElement': 'polygon',
+  'PolylineElement': 'polyline',
+  'RadialGradientElement': 'radialGradient',
+  'RectElement': 'rect',
+  'ScriptElement': 'script',
+  'SetElement': 'set',
+  'StopElement': 'stop',
+  'StyleElement': 'style',
+  'SwitchElement': 'switch',
+  'SymbolElement': 'symbol',
+  'TextElement': 'text',
+  'TitleElement': 'title',
+  'TRefElement': 'tref',
+  'TSpanElement': 'tspan',
+  'UseElement': 'use',
+  'ViewElement': 'view',
+  'VKernElement': 'vkern',
+}
+
+_element_constructors = {
+  'html': _html_element_constructors,
+  'svg': _svg_element_constructors
+}
+
+_factory_ctr_strings = {
+  'html': {
+      'provider_name': 'document',
+      'constructor_name': '$dom_createElement'
+  },
+  'svg': {
+    'provider_name': '_SvgElementFactoryProvider',
+    'constructor_name': 'createSvgElement_tag',
+  },
+}
+
+def ElementConstructorInfos(typename, element_constructors,
+                            factory_provider_name='_Elements'):
   """Returns list of ElementConstructorInfos about the convenience constructors
-  for an Element."""
+  for an Element or SvgElement."""
   # TODO(sra): Handle multiple and named constructors.
-  if typename not in _html_element_constructors:
+  if typename not in element_constructors:
     return []
-  infos = _html_element_constructors[typename]
+  infos = element_constructors[typename]
   if isinstance(infos, str):
-    infos = ElementConstructorInfo(tag=infos)
+    infos = ElementConstructorInfo(tag=infos,
+        factory_provider_name=factory_provider_name)
   if not isinstance(infos, list):
     infos = [infos]
   return infos
 
-def EmitHtmlElementFactoryConstructors(emitter, infos, typename, class_name,
-                                       rename_type):
-  for info in infos:
-    constructor_info = info.ConstructorInfo(typename)
-
-    inits = emitter.Emit(
-        '\n'
-        '  static $RETURN_TYPE $CONSTRUCTOR($PARAMS) {\n'
-        '    $CLASS _e = document.$dom_createElement("$TAG");\n'
-        '$!INITS'
-        '    return _e;\n'
-        '  }\n',
-        RETURN_TYPE=rename_type(constructor_info.type_name),
-        CONSTRUCTOR=constructor_info.ConstructorFactoryName(rename_type),
-        CLASS=class_name,
-        TAG=info.tag,
-        PARAMS=constructor_info.ParametersDeclaration(
-            rename_type, force_optional=True))
-    for param in constructor_info.param_infos:
-      inits.Emit('    if ($E != null) _e.$E = $E;\n', E=param.name)
-
 # ------------------------------------------------------------------------------
 
 class HtmlDartInterfaceGenerator(object):
@@ -226,6 +275,7 @@
     factory_provider = None
     if interface_name in interface_factories:
       factory_provider = interface_factories[interface_name]
+    factory_constructor_name = None
 
     constructors = []
     if interface_name in _static_classes:
@@ -240,17 +290,14 @@
       self._backend.EmitFactoryProvider(
           constructor_info, factory_provider, factory_provider_emitter)
 
-    infos = HtmlElementConstructorInfos(interface_name)
+    # HTML Elements and SVG Elements have convenience constructors.
+    infos = ElementConstructorInfos(interface_name,
+        _element_constructors[self._library_name], factory_provider_name=
+        _factory_ctr_strings[self._library_name]['provider_name'])
+
     if infos:
-      template = self._template_loader.Load(
-          'factoryprovider_Elements.darttemplate')
-      EmitHtmlElementFactoryConstructors(
-          self._library_emitter.FileEmitter('_Elements', self._library_name,
-              template),
-          infos,
-          self._interface.id,
-          self._interface_type_info.implementation_name(),
-          self._DartType)
+      factory_constructor_name = _factory_ctr_strings[
+          self._library_name]['constructor_name']
 
     for info in infos:
       constructors.append(info.ConstructorInfo(self._interface.id))
@@ -302,7 +349,7 @@
 
     self._backend.AddConstructors(constructors, factory_provider,
         self._interface_type_info.implementation_name(),
-        base_class)
+        base_class, factory_constructor_name=factory_constructor_name)
 
     events_class_name = self._event_generator.ProcessInterface(
         self._interface, interface_name,
@@ -435,30 +482,25 @@
     if 'CustomIndexedSetter' in self._interface.ext_attrs:
       self._members_emitter.Emit(
           '\n'
-          '  void operator[]=(int index, $TYPE value) =>'
-          ' JS("void", "#[#] = #", this, index, value);\n',
+          '  void operator[]=(int index, $TYPE value) {'
+          ' JS("void", "#[#] = #", this, index, value); }',
           TYPE=self._NarrowInputType(element_type))
     else:
-      # The HTML library implementation of NodeList has a custom indexed setter
-      # implementation that uses the parent node the NodeList is associated
-      # with if one is available.
-      if self._interface.id != 'NodeList':
-        self._members_emitter.Emit(
-            '\n'
-            '  void operator[]=(int index, $TYPE value) {\n'
-            '    throw new UnsupportedError("Cannot assign element of immutable List.");\n'
-            '  }\n',
-            TYPE=self._NarrowInputType(element_type))
+      self._members_emitter.Emit(
+          '\n'
+          '  void operator[]=(int index, $TYPE value) {\n'
+          '    throw new UnsupportedError("Cannot assign element of immutable List.");\n'
+          '  }\n',
+          TYPE=self._NarrowInputType(element_type))
 
     # TODO(sra): Use separate mixins for mutable implementations of List<T>.
     # TODO(sra): Use separate mixins for typed array implementations of List<T>.
-    if self._interface.id != 'NodeList':
-      template_file = 'immutable_list_mixin.darttemplate'
-      has_contains = any(op.id == 'contains' for op in self._interface.operations)
-      template = self._template_loader.Load(
-          template_file,
-          {'DEFINE_CONTAINS': not has_contains})
-      self._members_emitter.Emit(template, E=self._DartType(element_type))
+    template_file = 'immutable_list_mixin.darttemplate'
+    has_contains = any(op.id == 'contains' for op in self._interface.operations)
+    template = self._template_loader.Load(
+        template_file,
+        {'DEFINE_CONTAINS': not has_contains})
+    self._members_emitter.Emit(template, E=self._DartType(element_type))
 
   def EmitAttribute(self, attribute, html_name, read_only):
     if self._HasCustomImplementation(attribute.id):
@@ -506,17 +548,20 @@
 
     output_type = self.SecureOutputType(attribute.type.id)
     input_type = self._NarrowInputType(attribute.type.id)
+    annotations = self._Annotations(attribute.type.id, attribute.id)
     self.EmitAttributeDocumentation(attribute)
     if not read_only:
       self._members_emitter.Emit(
-          '\n  $TYPE $NAME;'
+          '\n  $ANNOTATIONS$TYPE $NAME;'
           '\n',
+          ANNOTATIONS=annotations,
           NAME=DartDomNameOfAttribute(attribute),
           TYPE=output_type)
     else:
       self._members_emitter.Emit(
-          '\n  final $TYPE $NAME;'
+          '\n  $(ANNOTATIONS)final $TYPE $NAME;'
           '\n',
+          ANNOTATIONS=annotations,
           NAME=DartDomNameOfAttribute(attribute),
           TYPE=output_type)
 
@@ -539,13 +584,15 @@
     if conversion:
       return self._AddConvertingGetter(attr, html_name, conversion)
     return_type = self.SecureOutputType(attr.type.id)
+    native_type = self._NarrowToImplementationType(attr.type.id)
     self._members_emitter.Emit(
         # TODO(sra): Use metadata to provide native name.
-        '\n  $TYPE get $HTML_NAME => JS("$TYPE", "#.$NAME", this);'
+        '\n  $TYPE get $HTML_NAME => JS("$NATIVE_TYPE", "#.$NAME", this);'
         '\n',
         HTML_NAME=html_name,
         NAME=attr.id,
-        TYPE=return_type)
+        TYPE=return_type,
+        NATIVE_TYPE=native_type)
 
   def _AddRenamingSetter(self, attr, html_name):
     self.EmitAttributeDocumentation(attr)
@@ -618,8 +665,10 @@
     if html_name != info.declared_name:
       return_type = self.SecureOutputType(info.type_name)
 
-      operation_emitter = self._members_emitter.Emit('$!SCOPE',
+      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,
@@ -627,13 +676,14 @@
 
       operation_emitter.Emit(
           '\n'
-          #'  // @native("$NAME")\n;'
-          '  $MODIFIERS$TYPE $(HTML_NAME)($PARAMS) native "$NAME";\n')
+          '  $ANNOTATIONS'
+          '$MODIFIERS$TYPE $(HTML_NAME)($PARAMS) native "$NAME";\n')
     else:
       self._members_emitter.Emit(
           '\n'
-          '  $MODIFIERS$TYPE $NAME($PARAMS) native;\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))
@@ -735,7 +785,9 @@
         call_emitter.Emit('$(INDENT)return $CALL;\n', CALL=call)
 
       self._members_emitter.Emit(
-          '  $TYPE$TARGET($PARAMS) native "$NATIVE";\n',
+          '  $MODIFIERS$ANNOTATIONS$TYPE$TARGET($PARAMS) native "$NATIVE";\n',
+          MODIFIERS='static ' if info.IsStatic() else '',
+          ANNOTATIONS=self._Annotations(info.type_name, info.declared_name),
           TYPE=TypeOrNothing(native_return_type),
           TARGET=target,
           PARAMS=', '.join(target_parameters),
@@ -766,7 +818,7 @@
             GenerateChecksAndCall(operation, position)
         GenerateChecksAndCall(operation, len(operation.arguments))
       body.Emit(
-          '    throw const Exception("Incorrect number or type of arguments");'
+          '    throw new ArgumentError("Incorrect number or type of arguments");'
           '\n');
     else:
       operation = operations[0]
@@ -819,6 +871,17 @@
                              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)
+    if annotations:
+      return '%s\n  ' % annotations
+    return_type = self.SecureOutputType(idl_type)
+    native_type = self._NarrowToImplementationType(idl_type)
+    if native_type != return_type:
+      return "@Returns('%s') @Creates('%s')\n  " % (native_type, native_type)
+    else:
+      return ''
+
   def CustomJSMembers(self):
     return _js_custom_members
 
@@ -877,7 +940,8 @@
     self._dart_libraries = dart_libraries
 
   def FileEmitter(self, basename, library_name, template=None):
-    path = os.path.join(self._dart_sources_dir, '%s.dart' % basename)
+    aux_dir = os.path.join(self._dart_sources_dir, library_name)
+    path = os.path.join(aux_dir, '%s.dart' % basename)
     if not path in self._path_to_emitter:
       emitter = self._multiemitter.FileEmitter(path)
       if not template is None:
diff --git a/sdk/lib/html/scripts/systemnative.py b/sdk/lib/html/scripts/systemnative.py
index 09e0208..7961d94 100644
--- a/sdk/lib/html/scripts/systemnative.py
+++ b/sdk/lib/html/scripts/systemnative.py
@@ -80,7 +80,10 @@
           ARGUMENTS_DECLARATION=arguments_declaration,
           ARGUMENT_COUNT=len(arguments))
 
-    cpp_header_emitter = self._cpp_library_emitter.CreateHeaderEmitter(self._interface.id, True)
+    cpp_header_emitter = self._cpp_library_emitter.CreateHeaderEmitter(
+        self._interface.id,
+        self._renamer.GetLibraryName(self._interface),
+        True)
     cpp_header_emitter.Emit(
         self._template_loader.Load('cpp_callback_header.template'),
         INTERFACE=self._interface.id,
@@ -112,7 +115,9 @@
   def StartInterface(self, memebers_emitter):
     # Create emitters for c++ implementation.
     if not IsPureInterface(self._interface.id):
-      self._cpp_header_emitter = self._cpp_library_emitter.CreateHeaderEmitter(self._interface.id)
+      self._cpp_header_emitter = self._cpp_library_emitter.CreateHeaderEmitter(
+          self._interface.id,
+          self._renamer.GetLibraryName(self._interface))
       self._cpp_impl_emitter = self._cpp_library_emitter.CreateSourceEmitter(self._interface.id)
     else:
       self._cpp_header_emitter = emitter.Emitter()
@@ -208,10 +213,10 @@
         ARGUMENTS=constructor_info.ParametersAsArgumentList(),
         NATIVE_NAME=native_binding)
 
-  def AddConstructors(self, constructors, factory_provider, class_name,
-      base_class):
-    super(DartiumBackend, self).AddConstructors(constructors, factory_provider,
-        class_name, base_class)
+  def AddConstructors(self, constructors, factory_name, class_name,
+      base_class, factory_constructor_name=None):
+    super(DartiumBackend, self).AddConstructors(constructors, factory_name,
+        class_name, base_class, factory_constructor_name)
 
     super_constructor = ''
     if base_class and base_class != 'NativeFieldWrapperClass1':
@@ -392,20 +397,12 @@
     if self._HasNativeIndexSetter():
       self._EmitNativeIndexSetter(dart_element_type)
     else:
-      # The HTML library implementation of NodeList has a custom indexed setter
-      # implementation that uses the parent node the NodeList is associated
-      # with if one is available.
-      if self._interface.id != 'NodeList':
-        self._members_emitter.Emit(
-            '\n'
-            '  void operator[]=(int index, $TYPE value) {\n'
-            '    throw new UnsupportedError("Cannot assign element of immutable List.");\n'
-            '  }\n',
-            TYPE=dart_element_type)
-
-    # The list interface for this class is manually generated.
-    if self._interface.id == 'NodeList':
-      return
+      self._members_emitter.Emit(
+          '\n'
+          '  void operator[]=(int index, $TYPE value) {\n'
+          '    throw new UnsupportedError("Cannot assign element of immutable List.");\n'
+          '  }\n',
+          TYPE=dart_element_type)
 
     # TODO(sra): Use separate mixins for mutable implementations of List<T>.
     # TODO(sra): Use separate mixins for typed array implementations of List<T>.
@@ -862,13 +859,15 @@
   def __init__(self, emitters, cpp_sources_dir):
     self._emitters = emitters
     self._cpp_sources_dir = cpp_sources_dir
-    self._headers_list = []
+    self._library_headers = {}
     self._sources_list = []
 
-  def CreateHeaderEmitter(self, interface_name, is_callback=False):
+  def CreateHeaderEmitter(self, interface_name, library_name, is_callback=False):
     path = os.path.join(self._cpp_sources_dir, 'Dart%s.h' % interface_name)
     if not is_callback:
-      self._headers_list.append(path)
+      if not library_name in self._library_headers:
+        self._library_headers[library_name] = []
+      self._library_headers[library_name].append(path)
     return self._emitters.FileEmitter(path)
 
   def CreateSourceEmitter(self, interface_name):
@@ -887,12 +886,17 @@
         includes_emitter.Emit('#include "$PATH"\n', PATH=path)
 
   def EmitResolver(self, template, output_dir):
-    file_path = os.path.join(output_dir, 'DartResolver.cpp')
-    includes_emitter, body_emitter = self._emitters.FileEmitter(file_path).Emit(template)
-    for header_file in self._headers_list:
-      path = os.path.relpath(header_file, output_dir)
-      includes_emitter.Emit('#include "$PATH"\n', PATH=path)
-      body_emitter.Emit(
-          '    if (Dart_NativeFunction func = $CLASS_NAME::resolver(name, argumentCount))\n'
-          '        return func;\n',
-          CLASS_NAME=os.path.splitext(os.path.basename(path))[0])
+    for library_name in self._library_headers.keys():
+      file_path = os.path.join(output_dir, '%s_DartResolver.cpp' % library_name)
+      includes_emitter, body_emitter = self._emitters.FileEmitter(file_path).Emit(
+        template,
+        LIBRARY_NAME=library_name)
+
+      headers = self._library_headers[library_name]
+      for header_file in headers:
+        path = os.path.relpath(header_file, output_dir)
+        includes_emitter.Emit('#include "$PATH"\n', PATH=path)
+        body_emitter.Emit(
+            '    if (Dart_NativeFunction func = $CLASS_NAME::resolver(name, argumentCount))\n'
+            '        return func;\n',
+            CLASS_NAME=os.path.splitext(os.path.basename(path))[0])
diff --git a/sdk/lib/html/src/CrossFrameTypes.dart b/sdk/lib/html/src/CrossFrameTypes.dart
index 68597f0..b77284c 100644
--- a/sdk/lib/html/src/CrossFrameTypes.dart
+++ b/sdk/lib/html/src/CrossFrameTypes.dart
@@ -4,19 +4,88 @@
 
 part of html;
 
+/**
+ * An object representing the top-level context object for web scripting.
+ *
+ * In a web browser, a [Window] object represents the actual browser window.
+ * In a multi-tabbed browser, each tab has its own [Window] object. A [Window]
+ * is the container that displays a [Document]'s content. All web scripting
+ * happens within the context of a [Window] object.
+ *
+ * **Note:** This class represents any window, whereas [LocalWindow] is
+ * used to access the properties and content of the current window.
+ *
+ * See also:
+ *
+ * * [DOM Window](https://developer.mozilla.org/en-US/docs/DOM/window) from MDN.
+ * * [Window](http://www.w3.org/TR/Window/) from the W3C.
+ */
 abstract class Window {
   // Fields.
+
+  /**
+   * The current location of this window.
+   *
+   *     Location currentLocation = window.location;
+   *     print(currentLocation.href); // 'http://www.example.com:80/'
+   */
   Location get location;
   History get history;
 
+  /**
+   * Indicates whether this window is closed.
+   *
+   *     print(window.closed); // 'false'
+   *     window.close();
+   *     print(window.closed); // 'true'
+   */
   bool get closed;
+
+  /**
+   * A reference to the window that opened this one.
+   *
+   *     Window thisWindow = window;
+   *     Window otherWindow = thisWindow.open('http://www.example.com/', 'foo');
+   *     print(otherWindow.opener == thisWindow); // 'true'
+   */
   Window get opener;
+
+  /**
+   * A reference to the parent of this window.
+   *
+   * If this [Window] has no parent, [parent] will return a reference to
+   * the [Window] itself.
+   *
+   *     IFrameElement myIFrame = new IFrameElement();
+   *     window.document.body.elements.add(myIFrame);
+   *     print(myIframe.contentWindow.parent == window) // 'true'
+   *
+   *     print(window.parent == window) // 'true'
+   */
   Window get parent;
+
+  /**
+   * A reference to the topmost window in the window hierarchy.
+   *
+   * If this [Window] is the topmost [Window], [top] will return a reference to
+   * the [Window] itself.
+   *
+   *     // Add an IFrame to the current window.
+   *     IFrameElement myIFrame = new IFrameElement();
+   *     window.document.body.elements.add(myIFrame);
+   *
+   *     // Add an IFrame inside of the other IFrame.
+   *     IFrameElement innerIFrame = new IFrameElement();
+   *     myIFrame.elements.add(innerIFrame);
+   *
+   *     print(myIframe.contentWindow.top == window) // 'true'
+   *     print(innerIFrame.contentWindow.top == window) // 'true'
+   *
+   *     print(window.top == window) // 'true'
+   */
   Window get top;
 
   // Methods.
-  void focus();
-  void blur();
   void close();
   void postMessage(var message, String targetOrigin, [List messagePorts = null]);
 }
diff --git a/sdk/lib/html/src/FilteredElementList.dart b/sdk/lib/html/src/FilteredElementList.dart
index 86a5787..33d1ab3 100644
--- a/sdk/lib/html/src/FilteredElementList.dart
+++ b/sdk/lib/html/src/FilteredElementList.dart
@@ -100,5 +100,7 @@
     return _filtered.lastIndexOf(element, start);
   }
 
+  Element get first => _filtered.first;
+
   Element get last => _filtered.last;
 }
diff --git a/sdk/lib/html/src/dart2js_Conversions.dart b/sdk/lib/html/src/dart2js_Conversions.dart
index ab0b851..cc44699 100644
--- a/sdk/lib/html/src/dart2js_Conversions.dart
+++ b/sdk/lib/html/src/dart2js_Conversions.dart
@@ -99,7 +99,7 @@
 Map _convertNativeToDart_Dictionary(object) {
   if (object == null) return null;
   var dict = {};
-  for (final key in JS('List', 'Object.getOwnPropertyNames(#)', object)) {
+  for (final key in JS('=List', 'Object.getOwnPropertyNames(#)', object)) {
     dict[key] = JS('var', '#[#]', object, key);
   }
   return dict;
@@ -276,7 +276,7 @@
       var copy = readSlot(slot);
       if (copy != null) {
         if (true == copy) {  // Cycle, so commit to making a copy.
-          copy = JS('List', 'new Array(#)', length);
+          copy = JS('=List', 'new Array(#)', length);
           writeSlot(slot, copy);
         }
         return copy;
@@ -296,7 +296,7 @@
           if (!identical(elementCopy, element)) {
             copy = readSlot(slot);   // Cyclic reference may have created it.
             if (true == copy) {
-              copy = JS('List', 'new Array(#)', length);
+              copy = JS('=List', 'new Array(#)', length);
               writeSlot(slot, copy);
             }
             for (int j = 0; j < i; j++) {
@@ -313,7 +313,7 @@
         }
       } else {
         // Not a JavaScript Array.  We are forced to make a copy.
-        copy = JS('List', 'new Array(#)', length);
+        copy = JS('=List', 'new Array(#)', length);
         writeSlot(slot, copy);
       }
 
@@ -393,7 +393,7 @@
       copy = {};
 
       writeSlot(slot, copy);
-      for (final key in JS('List', 'Object.keys(#)', e)) {
+      for (final key in JS('=List', 'Object.keys(#)', e)) {
         copy[key] = walk(JS('var', '#[#]', e, key));
       }
       return copy;
@@ -407,7 +407,7 @@
       int length = e.length;
       // Since a JavaScript Array is an instance of Dart List, we can modify it
       // in-place unless we must copy.
-      copy = mustCopy ? JS('List', 'new Array(#)', length) : e;
+      copy = mustCopy ? JS('=List', 'new Array(#)', length) : e;
       writeSlot(slot, copy);
 
       for (int i = 0; i < length; i++) {
@@ -433,3 +433,20 @@
     JS('bool', 'Object.getPrototypeOf(#) === Object.prototype', value);
 bool _isImmutableJavaScriptArray(value) =>
     JS('bool', r'!!(#.immutable$list)', value);
+
+
+
+const String _serializedScriptValue =
+    'num|String|bool|'
+    '=List|=Object|'
+    'Blob|File|ArrayBuffer|ArrayBufferView'
+    // TODO(sra): Add Date, RegExp.
+    ;
+const _annotation_Creates_SerializedScriptValue =
+    const Creates(_serializedScriptValue);
+const _annotation_Returns_SerializedScriptValue =
+    const Returns(_serializedScriptValue);
+
+const String _idbKey = '=List|=Object|num|String';  // TODO(sra): Add Date.
+const _annotation_Creates_IDBKey = const Creates(_idbKey);
+const _annotation_Returns_IDBKey = const Returns(_idbKey);
diff --git a/sdk/lib/html/src/dart2js_DOMImplementation.dart b/sdk/lib/html/src/dart2js_DOMImplementation.dart
index 43be003..9056a14 100644
--- a/sdk/lib/html/src/dart2js_DOMImplementation.dart
+++ b/sdk/lib/html/src/dart2js_DOMImplementation.dart
@@ -28,10 +28,6 @@
   Window get top => _createSafe(JS('Window', '#.top', _window));
 
   // Methods.
-  void focus() => JS('void', '#.focus()', _window);
-
-  void blur() => JS('void', '#.blur()', _window);
-
   void close() => JS('void', '#.close()', _window);
 
   void postMessage(var message, String targetOrigin, [List messagePorts = null]) {
diff --git a/sdk/lib/html/src/native_DOMImplementation.dart b/sdk/lib/html/src/native_DOMImplementation.dart
index 3d3689c..1d1eceb 100644
--- a/sdk/lib/html/src/native_DOMImplementation.dart
+++ b/sdk/lib/html/src/native_DOMImplementation.dart
@@ -60,8 +60,6 @@
   Window get top() native "DOMWindow_top_Getter";
 
   // Methods.
-  void focus() native "DOMWindow_focus_Callback";
-  void blur() native "DOMWindow_blur_Callback";
   void close() native "DOMWindow_close_Callback";
   void postMessage(/*SerializedScriptValue*/ message, String targetOrigin, [List messagePorts]) native "DOMWindow_postMessage_Callback";
 
diff --git a/sdk/lib/html/src/shared_SVGFactoryProviders.dart b/sdk/lib/html/src/shared_SVGFactoryProviders.dart
index 833f7e8..7a5759a 100644
--- a/sdk/lib/html/src/shared_SVGFactoryProviders.dart
+++ b/sdk/lib/html/src/shared_SVGFactoryProviders.dart
@@ -6,20 +6,20 @@
 
 final _START_TAG_REGEXP = new RegExp('<(\\w+)');
 
-class _SVGElementFactoryProvider {
-  static SVGElement createSVGElement_tag(String tag) {
+class _SvgElementFactoryProvider {
+  static SvgElement createSvgElement_tag(String tag) {
     final Element temp =
       document.$dom_createElementNS("http://www.w3.org/2000/svg", tag);
     return temp;
   }
 
-  static SVGElement createSVGElement_svg(String svg) {
+  static SvgElement createSvgElement_svg(String svg) {
     Element parentTag;
     final match = _START_TAG_REGEXP.firstMatch(svg);
     if (match != null && match.group(1).toLowerCase() == 'svg') {
       parentTag = new Element.tag('div');
     } else {
-      parentTag = new SVGSVGElement();
+      parentTag = new SvgSvgElement();
     }
 
     parentTag.innerHTML = svg;
@@ -31,9 +31,9 @@
   }
 }
 
-class _SVGSVGElementFactoryProvider {
-  static SVGSVGElement createSVGSVGElement() {
-    final el = new SVGElement.tag("svg");
+class _SvgSvgElementFactoryProvider {
+  static SvgSvgElement createSvgSvgElement() {
+    final el = new SvgElement.tag("svg");
     // The SVG spec requires the version attribute to match the spec version
     el.attributes['version'] = "1.1";
     return el;
diff --git a/sdk/lib/html/templates/dart2js_impl.darttemplate b/sdk/lib/html/templates/dart2js_impl.darttemplate
index aa72fd2..5c62c0e 100644
--- a/sdk/lib/html/templates/dart2js_impl.darttemplate
+++ b/sdk/lib/html/templates/dart2js_impl.darttemplate
@@ -4,6 +4,6 @@
 
 part of $LIBRARYNAME;
 
-/// @domName $DOMNAME
+/// @domName $DOMNAME; @docsEditable true
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
 $!MEMBERS}
diff --git a/sdk/lib/html/templates/html/dart2js/factoryprovider_HttpRequest.darttemplate b/sdk/lib/html/templates/html/dart2js/factoryprovider_HttpRequest.darttemplate
index c1acc88..a739f36 100644
--- a/sdk/lib/html/templates/html/dart2js/factoryprovider_HttpRequest.darttemplate
+++ b/sdk/lib/html/templates/html/dart2js/factoryprovider_HttpRequest.darttemplate
@@ -9,10 +9,10 @@
       JS('HttpRequest', 'new XMLHttpRequest()');
 
   static HttpRequest createHttpRequest_get(String url,
-      onSuccess(HttpRequest request)) =>
-      _HttpRequestUtils.get(url, onSuccess, false);
+      onComplete(HttpRequest request)) =>
+      _HttpRequestUtils.get(url, onComplete, false);
 
   static HttpRequest createHttpRequest_getWithCredentials(String url,
-      onSuccess(HttpRequest request)) =>
-      _HttpRequestUtils.get(url, onSuccess, true);
+      onComplete(HttpRequest request)) =>
+      _HttpRequestUtils.get(url, onComplete, true);
 }
diff --git a/sdk/lib/html/templates/html/dart2js/factoryprovider_MutationObserver.darttemplate b/sdk/lib/html/templates/html/dart2js/factoryprovider_MutationObserver.darttemplate
index d92979b..affcb7c 100644
--- a/sdk/lib/html/templates/html/dart2js/factoryprovider_MutationObserver.darttemplate
+++ b/sdk/lib/html/templates/html/dart2js/factoryprovider_MutationObserver.darttemplate
@@ -5,20 +5,10 @@
 part of html;
 
 class $FACTORYPROVIDER {
-  static $CONSTRUCTOR create$(CONSTRUCTOR)(MutationCallback callback) {
 
-    // This is a hack to cause MutationRecord to appear to be instantiated.
-    //
-    // MutationCallback has a parameter type List<MutationRecord>.  From this we
-    // infer a list is created in the browser, but not the element type, because
-    // other native fields and methods return plain List which is too general
-    // and would imply creating anything.  This statement is a work-around.
-    JS('MutationRecord','0');
-
-    return _create$(CONSTRUCTOR)(callback);
-  }
-
-  static $CONSTRUCTOR _create$(CONSTRUCTOR)(MutationCallback callback) native '''
+  @Creates('MutationObserver')
+  @Creates('MutationRecord')
+  static $CONSTRUCTOR create$(CONSTRUCTOR)(MutationCallback callback) native '''
     var constructor =
         window.MutationObserver || window.WebKitMutationObserver ||
         window.MozMutationObserver;
diff --git a/sdk/lib/html/templates/html/dart2js/factoryprovider_TextTrackCue.darttemplate b/sdk/lib/html/templates/html/dart2js/factoryprovider_TextTrackCue.darttemplate
index f1e5a8d..63cad24 100644
--- a/sdk/lib/html/templates/html/dart2js/factoryprovider_TextTrackCue.darttemplate
+++ b/sdk/lib/html/templates/html/dart2js/factoryprovider_TextTrackCue.darttemplate
@@ -6,20 +6,20 @@
 
 class $FACTORYPROVIDER {
   static TextTrackCue createTextTrackCue(
-      String id, num startTime, num endTime, String text,
+      num startTime, num endTime, String text,
       [String settings, bool pauseOnExit]) {
         if (settings == null) {
           return JS('TextTrackCue',
-                    'new TextTrackCue(#,#,#,#)',
-                    id, startTime, endTime, text);
+                    'new TextTrackCue(#,#,#)',
+                    startTime, endTime, text);
         }
         if (pauseOnExit == null) {
           return JS('TextTrackCue',
-                    'new TextTrackCue(#,#,#,#,#)',
-                    id, startTime, endTime, text, settings);
+                    'new TextTrackCue(#,#,#,#)',
+                    startTime, endTime, text, settings);
         }
         return JS('TextTrackCue',
-                  'new TextTrackCue(#,#,#,#,#,#)',
-                  id, startTime, endTime, text, settings, pauseOnExit);
+                  'new TextTrackCue(#,#,#,#,#)',
+                  startTime, endTime, text, settings, pauseOnExit);
   }
 }
diff --git a/sdk/lib/html/templates/html/dart2js/impl_LocalWindow.darttemplate b/sdk/lib/html/templates/html/dart2js/impl_LocalWindow.darttemplate
index 8f095cb..5542bf8 100644
--- a/sdk/lib/html/templates/html/dart2js/impl_LocalWindow.darttemplate
+++ b/sdk/lib/html/templates/html/dart2js/impl_LocalWindow.darttemplate
@@ -131,7 +131,7 @@
    * registered under [name].
    */
   SendPortSync lookupPort(String name) {
-    var port = JSON.parse(localStorage['dart-port:$name']);
+    var port = JSON.parse(document.documentElement.attributes['dart-port:$name']);
     return _deserialize(port);
   }
 
@@ -142,7 +142,7 @@
    */
   void registerPort(String name, var port) {
     var serialized = _serialize(port);
-    localStorage['dart-port:$name'] = JSON.stringify(serialized);
+    document.documentElement.attributes['dart-port:$name'] = JSON.stringify(serialized);
   }
 
 $!MEMBERS
diff --git a/sdk/lib/html/templates/html/dartium/cpp_resolver.template b/sdk/lib/html/templates/html/dartium/cpp_resolver.template
index 3c8ac57..e104ebe 100644
--- a/sdk/lib/html/templates/html/dartium/cpp_resolver.template
+++ b/sdk/lib/html/templates/html/dartium/cpp_resolver.template
@@ -9,7 +9,7 @@
 
 namespace WebCore {
 
-Dart_NativeFunction snapshotResolver(Dart_Handle name, int argumentCount)
+Dart_NativeFunction $(LIBRARY_NAME)SnapshotResolver(Dart_Handle name, int argumentCount)
 {
 $!RESOLVER_BODY
     return 0;
diff --git a/sdk/lib/html/templates/html/dartium/impl_LocalWindow.darttemplate b/sdk/lib/html/templates/html/dartium/impl_LocalWindow.darttemplate
index 6cedf2d..476d8dd 100644
--- a/sdk/lib/html/templates/html/dartium/impl_LocalWindow.darttemplate
+++ b/sdk/lib/html/templates/html/dartium/impl_LocalWindow.darttemplate
@@ -20,7 +20,7 @@
    * registered under [name].
    */
   lookupPort(String name) {
-    var port = JSON.parse(localStorage['dart-port:$name']);
+    var port = JSON.parse(document.documentElement.attributes['dart-port:$name']);
     return _deserialize(port);
   }
 
@@ -31,7 +31,7 @@
    */
   registerPort(String name, var port) {
     var serialized = _serialize(port);
-    localStorage['dart-port:$name'] = JSON.stringify(serialized);
+    document.documentElement.attributes['dart-port:$name'] = JSON.stringify(serialized);
   }
 
 $!MEMBERS
diff --git a/sdk/lib/html/templates/html/impl/factoryprovider_Elements.darttemplate b/sdk/lib/html/templates/html/impl/factoryprovider_Elements.darttemplate
index 561ece0d..e69de29 100644
--- a/sdk/lib/html/templates/html/impl/factoryprovider_Elements.darttemplate
+++ b/sdk/lib/html/templates/html/impl/factoryprovider_Elements.darttemplate
@@ -1,9 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of html;
-
-class _Elements {
-
-$!FACTORY_METHODS}
diff --git a/sdk/lib/html/templates/html/impl/impl_CSSStyleDeclaration.darttemplate b/sdk/lib/html/templates/html/impl/impl_CSSStyleDeclaration.darttemplate
index de9e208..347acfc 100644
--- a/sdk/lib/html/templates/html/impl/impl_CSSStyleDeclaration.darttemplate
+++ b/sdk/lib/html/templates/html/impl/impl_CSSStyleDeclaration.darttemplate
@@ -44,12 +44,39 @@
 $endif
 
   // TODO(jacobr): generate this list of properties using the existing script.
-    /** Gets the value of "animation" */
+  /** Gets the value of "align-content" */
+  String get alignContent =>
+    getPropertyValue('${_browserPrefix}align-content');
+
+  /** Sets the value of "align-content" */
+  void set alignContent(String value) {
+    setProperty('${_browserPrefix}align-content', value, '');
+  }
+
+  /** Gets the value of "align-items" */
+  String get alignItems =>
+    getPropertyValue('${_browserPrefix}align-items');
+
+  /** Sets the value of "align-items" */
+  void set alignItems(String value) {
+    setProperty('${_browserPrefix}align-items', value, '');
+  }
+
+  /** Gets the value of "align-self" */
+  String get alignSelf =>
+    getPropertyValue('${_browserPrefix}align-self');
+
+  /** Sets the value of "align-self" */
+  void set alignSelf(String value) {
+    setProperty('${_browserPrefix}align-self', value, '');
+  }
+
+  /** Gets the value of "animation" */
   String get animation =>
     getPropertyValue('${_browserPrefix}animation');
 
   /** Sets the value of "animation" */
-  void set animation(var value) {
+  void set animation(String value) {
     setProperty('${_browserPrefix}animation', value, '');
   }
 
@@ -58,7 +85,7 @@
     getPropertyValue('${_browserPrefix}animation-delay');
 
   /** Sets the value of "animation-delay" */
-  void set animationDelay(var value) {
+  void set animationDelay(String value) {
     setProperty('${_browserPrefix}animation-delay', value, '');
   }
 
@@ -67,7 +94,7 @@
     getPropertyValue('${_browserPrefix}animation-direction');
 
   /** Sets the value of "animation-direction" */
-  void set animationDirection(var value) {
+  void set animationDirection(String value) {
     setProperty('${_browserPrefix}animation-direction', value, '');
   }
 
@@ -76,7 +103,7 @@
     getPropertyValue('${_browserPrefix}animation-duration');
 
   /** Sets the value of "animation-duration" */
-  void set animationDuration(var value) {
+  void set animationDuration(String value) {
     setProperty('${_browserPrefix}animation-duration', value, '');
   }
 
@@ -85,7 +112,7 @@
     getPropertyValue('${_browserPrefix}animation-fill-mode');
 
   /** Sets the value of "animation-fill-mode" */
-  void set animationFillMode(var value) {
+  void set animationFillMode(String value) {
     setProperty('${_browserPrefix}animation-fill-mode', value, '');
   }
 
@@ -94,7 +121,7 @@
     getPropertyValue('${_browserPrefix}animation-iteration-count');
 
   /** Sets the value of "animation-iteration-count" */
-  void set animationIterationCount(var value) {
+  void set animationIterationCount(String value) {
     setProperty('${_browserPrefix}animation-iteration-count', value, '');
   }
 
@@ -103,7 +130,7 @@
     getPropertyValue('${_browserPrefix}animation-name');
 
   /** Sets the value of "animation-name" */
-  void set animationName(var value) {
+  void set animationName(String value) {
     setProperty('${_browserPrefix}animation-name', value, '');
   }
 
@@ -112,7 +139,7 @@
     getPropertyValue('${_browserPrefix}animation-play-state');
 
   /** Sets the value of "animation-play-state" */
-  void set animationPlayState(var value) {
+  void set animationPlayState(String value) {
     setProperty('${_browserPrefix}animation-play-state', value, '');
   }
 
@@ -121,25 +148,43 @@
     getPropertyValue('${_browserPrefix}animation-timing-function');
 
   /** Sets the value of "animation-timing-function" */
-  void set animationTimingFunction(var value) {
+  void set animationTimingFunction(String value) {
     setProperty('${_browserPrefix}animation-timing-function', value, '');
   }
 
+  /** Gets the value of "app-region" */
+  String get appRegion =>
+    getPropertyValue('${_browserPrefix}app-region');
+
+  /** Sets the value of "app-region" */
+  void set appRegion(String value) {
+    setProperty('${_browserPrefix}app-region', value, '');
+  }
+
   /** Gets the value of "appearance" */
   String get appearance =>
     getPropertyValue('${_browserPrefix}appearance');
 
   /** Sets the value of "appearance" */
-  void set appearance(var value) {
+  void set appearance(String value) {
     setProperty('${_browserPrefix}appearance', value, '');
   }
 
+  /** Gets the value of "aspect-ratio" */
+  String get aspectRatio =>
+    getPropertyValue('${_browserPrefix}aspect-ratio');
+
+  /** Sets the value of "aspect-ratio" */
+  void set aspectRatio(String value) {
+    setProperty('${_browserPrefix}aspect-ratio', value, '');
+  }
+
   /** Gets the value of "backface-visibility" */
   String get backfaceVisibility =>
     getPropertyValue('${_browserPrefix}backface-visibility');
 
   /** Sets the value of "backface-visibility" */
-  void set backfaceVisibility(var value) {
+  void set backfaceVisibility(String value) {
     setProperty('${_browserPrefix}backface-visibility', value, '');
   }
 
@@ -148,7 +193,7 @@
     getPropertyValue('background');
 
   /** Sets the value of "background" */
-  void set background(var value) {
+  void set background(String value) {
     setProperty('background', value, '');
   }
 
@@ -157,7 +202,7 @@
     getPropertyValue('background-attachment');
 
   /** Sets the value of "background-attachment" */
-  void set backgroundAttachment(var value) {
+  void set backgroundAttachment(String value) {
     setProperty('background-attachment', value, '');
   }
 
@@ -166,7 +211,7 @@
     getPropertyValue('background-clip');
 
   /** Sets the value of "background-clip" */
-  void set backgroundClip(var value) {
+  void set backgroundClip(String value) {
     setProperty('background-clip', value, '');
   }
 
@@ -175,7 +220,7 @@
     getPropertyValue('background-color');
 
   /** Sets the value of "background-color" */
-  void set backgroundColor(var value) {
+  void set backgroundColor(String value) {
     setProperty('background-color', value, '');
   }
 
@@ -184,7 +229,7 @@
     getPropertyValue('${_browserPrefix}background-composite');
 
   /** Sets the value of "background-composite" */
-  void set backgroundComposite(var value) {
+  void set backgroundComposite(String value) {
     setProperty('${_browserPrefix}background-composite', value, '');
   }
 
@@ -193,7 +238,7 @@
     getPropertyValue('background-image');
 
   /** Sets the value of "background-image" */
-  void set backgroundImage(var value) {
+  void set backgroundImage(String value) {
     setProperty('background-image', value, '');
   }
 
@@ -202,7 +247,7 @@
     getPropertyValue('background-origin');
 
   /** Sets the value of "background-origin" */
-  void set backgroundOrigin(var value) {
+  void set backgroundOrigin(String value) {
     setProperty('background-origin', value, '');
   }
 
@@ -211,7 +256,7 @@
     getPropertyValue('background-position');
 
   /** Sets the value of "background-position" */
-  void set backgroundPosition(var value) {
+  void set backgroundPosition(String value) {
     setProperty('background-position', value, '');
   }
 
@@ -220,7 +265,7 @@
     getPropertyValue('background-position-x');
 
   /** Sets the value of "background-position-x" */
-  void set backgroundPositionX(var value) {
+  void set backgroundPositionX(String value) {
     setProperty('background-position-x', value, '');
   }
 
@@ -229,7 +274,7 @@
     getPropertyValue('background-position-y');
 
   /** Sets the value of "background-position-y" */
-  void set backgroundPositionY(var value) {
+  void set backgroundPositionY(String value) {
     setProperty('background-position-y', value, '');
   }
 
@@ -238,7 +283,7 @@
     getPropertyValue('background-repeat');
 
   /** Sets the value of "background-repeat" */
-  void set backgroundRepeat(var value) {
+  void set backgroundRepeat(String value) {
     setProperty('background-repeat', value, '');
   }
 
@@ -247,7 +292,7 @@
     getPropertyValue('background-repeat-x');
 
   /** Sets the value of "background-repeat-x" */
-  void set backgroundRepeatX(var value) {
+  void set backgroundRepeatX(String value) {
     setProperty('background-repeat-x', value, '');
   }
 
@@ -256,7 +301,7 @@
     getPropertyValue('background-repeat-y');
 
   /** Sets the value of "background-repeat-y" */
-  void set backgroundRepeatY(var value) {
+  void set backgroundRepeatY(String value) {
     setProperty('background-repeat-y', value, '');
   }
 
@@ -265,16 +310,25 @@
     getPropertyValue('background-size');
 
   /** Sets the value of "background-size" */
-  void set backgroundSize(var value) {
+  void set backgroundSize(String value) {
     setProperty('background-size', value, '');
   }
 
+  /** Gets the value of "blend-mode" */
+  String get blendMode =>
+    getPropertyValue('${_browserPrefix}blend-mode');
+
+  /** Sets the value of "blend-mode" */
+  void set blendMode(String value) {
+    setProperty('${_browserPrefix}blend-mode', value, '');
+  }
+
   /** Gets the value of "border" */
   String get border =>
     getPropertyValue('border');
 
   /** Sets the value of "border" */
-  void set border(var value) {
+  void set border(String value) {
     setProperty('border', value, '');
   }
 
@@ -283,7 +337,7 @@
     getPropertyValue('${_browserPrefix}border-after');
 
   /** Sets the value of "border-after" */
-  void set borderAfter(var value) {
+  void set borderAfter(String value) {
     setProperty('${_browserPrefix}border-after', value, '');
   }
 
@@ -292,7 +346,7 @@
     getPropertyValue('${_browserPrefix}border-after-color');
 
   /** Sets the value of "border-after-color" */
-  void set borderAfterColor(var value) {
+  void set borderAfterColor(String value) {
     setProperty('${_browserPrefix}border-after-color', value, '');
   }
 
@@ -301,7 +355,7 @@
     getPropertyValue('${_browserPrefix}border-after-style');
 
   /** Sets the value of "border-after-style" */
-  void set borderAfterStyle(var value) {
+  void set borderAfterStyle(String value) {
     setProperty('${_browserPrefix}border-after-style', value, '');
   }
 
@@ -310,7 +364,7 @@
     getPropertyValue('${_browserPrefix}border-after-width');
 
   /** Sets the value of "border-after-width" */
-  void set borderAfterWidth(var value) {
+  void set borderAfterWidth(String value) {
     setProperty('${_browserPrefix}border-after-width', value, '');
   }
 
@@ -319,7 +373,7 @@
     getPropertyValue('${_browserPrefix}border-before');
 
   /** Sets the value of "border-before" */
-  void set borderBefore(var value) {
+  void set borderBefore(String value) {
     setProperty('${_browserPrefix}border-before', value, '');
   }
 
@@ -328,7 +382,7 @@
     getPropertyValue('${_browserPrefix}border-before-color');
 
   /** Sets the value of "border-before-color" */
-  void set borderBeforeColor(var value) {
+  void set borderBeforeColor(String value) {
     setProperty('${_browserPrefix}border-before-color', value, '');
   }
 
@@ -337,7 +391,7 @@
     getPropertyValue('${_browserPrefix}border-before-style');
 
   /** Sets the value of "border-before-style" */
-  void set borderBeforeStyle(var value) {
+  void set borderBeforeStyle(String value) {
     setProperty('${_browserPrefix}border-before-style', value, '');
   }
 
@@ -346,7 +400,7 @@
     getPropertyValue('${_browserPrefix}border-before-width');
 
   /** Sets the value of "border-before-width" */
-  void set borderBeforeWidth(var value) {
+  void set borderBeforeWidth(String value) {
     setProperty('${_browserPrefix}border-before-width', value, '');
   }
 
@@ -355,7 +409,7 @@
     getPropertyValue('border-bottom');
 
   /** Sets the value of "border-bottom" */
-  void set borderBottom(var value) {
+  void set borderBottom(String value) {
     setProperty('border-bottom', value, '');
   }
 
@@ -364,7 +418,7 @@
     getPropertyValue('border-bottom-color');
 
   /** Sets the value of "border-bottom-color" */
-  void set borderBottomColor(var value) {
+  void set borderBottomColor(String value) {
     setProperty('border-bottom-color', value, '');
   }
 
@@ -373,7 +427,7 @@
     getPropertyValue('border-bottom-left-radius');
 
   /** Sets the value of "border-bottom-left-radius" */
-  void set borderBottomLeftRadius(var value) {
+  void set borderBottomLeftRadius(String value) {
     setProperty('border-bottom-left-radius', value, '');
   }
 
@@ -382,7 +436,7 @@
     getPropertyValue('border-bottom-right-radius');
 
   /** Sets the value of "border-bottom-right-radius" */
-  void set borderBottomRightRadius(var value) {
+  void set borderBottomRightRadius(String value) {
     setProperty('border-bottom-right-radius', value, '');
   }
 
@@ -391,7 +445,7 @@
     getPropertyValue('border-bottom-style');
 
   /** Sets the value of "border-bottom-style" */
-  void set borderBottomStyle(var value) {
+  void set borderBottomStyle(String value) {
     setProperty('border-bottom-style', value, '');
   }
 
@@ -400,7 +454,7 @@
     getPropertyValue('border-bottom-width');
 
   /** Sets the value of "border-bottom-width" */
-  void set borderBottomWidth(var value) {
+  void set borderBottomWidth(String value) {
     setProperty('border-bottom-width', value, '');
   }
 
@@ -409,7 +463,7 @@
     getPropertyValue('border-collapse');
 
   /** Sets the value of "border-collapse" */
-  void set borderCollapse(var value) {
+  void set borderCollapse(String value) {
     setProperty('border-collapse', value, '');
   }
 
@@ -418,7 +472,7 @@
     getPropertyValue('border-color');
 
   /** Sets the value of "border-color" */
-  void set borderColor(var value) {
+  void set borderColor(String value) {
     setProperty('border-color', value, '');
   }
 
@@ -427,7 +481,7 @@
     getPropertyValue('${_browserPrefix}border-end');
 
   /** Sets the value of "border-end" */
-  void set borderEnd(var value) {
+  void set borderEnd(String value) {
     setProperty('${_browserPrefix}border-end', value, '');
   }
 
@@ -436,7 +490,7 @@
     getPropertyValue('${_browserPrefix}border-end-color');
 
   /** Sets the value of "border-end-color" */
-  void set borderEndColor(var value) {
+  void set borderEndColor(String value) {
     setProperty('${_browserPrefix}border-end-color', value, '');
   }
 
@@ -445,7 +499,7 @@
     getPropertyValue('${_browserPrefix}border-end-style');
 
   /** Sets the value of "border-end-style" */
-  void set borderEndStyle(var value) {
+  void set borderEndStyle(String value) {
     setProperty('${_browserPrefix}border-end-style', value, '');
   }
 
@@ -454,7 +508,7 @@
     getPropertyValue('${_browserPrefix}border-end-width');
 
   /** Sets the value of "border-end-width" */
-  void set borderEndWidth(var value) {
+  void set borderEndWidth(String value) {
     setProperty('${_browserPrefix}border-end-width', value, '');
   }
 
@@ -463,7 +517,7 @@
     getPropertyValue('${_browserPrefix}border-fit');
 
   /** Sets the value of "border-fit" */
-  void set borderFit(var value) {
+  void set borderFit(String value) {
     setProperty('${_browserPrefix}border-fit', value, '');
   }
 
@@ -472,7 +526,7 @@
     getPropertyValue('${_browserPrefix}border-horizontal-spacing');
 
   /** Sets the value of "border-horizontal-spacing" */
-  void set borderHorizontalSpacing(var value) {
+  void set borderHorizontalSpacing(String value) {
     setProperty('${_browserPrefix}border-horizontal-spacing', value, '');
   }
 
@@ -481,7 +535,7 @@
     getPropertyValue('border-image');
 
   /** Sets the value of "border-image" */
-  void set borderImage(var value) {
+  void set borderImage(String value) {
     setProperty('border-image', value, '');
   }
 
@@ -490,7 +544,7 @@
     getPropertyValue('border-image-outset');
 
   /** Sets the value of "border-image-outset" */
-  void set borderImageOutset(var value) {
+  void set borderImageOutset(String value) {
     setProperty('border-image-outset', value, '');
   }
 
@@ -499,7 +553,7 @@
     getPropertyValue('border-image-repeat');
 
   /** Sets the value of "border-image-repeat" */
-  void set borderImageRepeat(var value) {
+  void set borderImageRepeat(String value) {
     setProperty('border-image-repeat', value, '');
   }
 
@@ -508,7 +562,7 @@
     getPropertyValue('border-image-slice');
 
   /** Sets the value of "border-image-slice" */
-  void set borderImageSlice(var value) {
+  void set borderImageSlice(String value) {
     setProperty('border-image-slice', value, '');
   }
 
@@ -517,7 +571,7 @@
     getPropertyValue('border-image-source');
 
   /** Sets the value of "border-image-source" */
-  void set borderImageSource(var value) {
+  void set borderImageSource(String value) {
     setProperty('border-image-source', value, '');
   }
 
@@ -526,7 +580,7 @@
     getPropertyValue('border-image-width');
 
   /** Sets the value of "border-image-width" */
-  void set borderImageWidth(var value) {
+  void set borderImageWidth(String value) {
     setProperty('border-image-width', value, '');
   }
 
@@ -535,7 +589,7 @@
     getPropertyValue('border-left');
 
   /** Sets the value of "border-left" */
-  void set borderLeft(var value) {
+  void set borderLeft(String value) {
     setProperty('border-left', value, '');
   }
 
@@ -544,7 +598,7 @@
     getPropertyValue('border-left-color');
 
   /** Sets the value of "border-left-color" */
-  void set borderLeftColor(var value) {
+  void set borderLeftColor(String value) {
     setProperty('border-left-color', value, '');
   }
 
@@ -553,7 +607,7 @@
     getPropertyValue('border-left-style');
 
   /** Sets the value of "border-left-style" */
-  void set borderLeftStyle(var value) {
+  void set borderLeftStyle(String value) {
     setProperty('border-left-style', value, '');
   }
 
@@ -562,7 +616,7 @@
     getPropertyValue('border-left-width');
 
   /** Sets the value of "border-left-width" */
-  void set borderLeftWidth(var value) {
+  void set borderLeftWidth(String value) {
     setProperty('border-left-width', value, '');
   }
 
@@ -571,7 +625,7 @@
     getPropertyValue('border-radius');
 
   /** Sets the value of "border-radius" */
-  void set borderRadius(var value) {
+  void set borderRadius(String value) {
     setProperty('border-radius', value, '');
   }
 
@@ -580,7 +634,7 @@
     getPropertyValue('border-right');
 
   /** Sets the value of "border-right" */
-  void set borderRight(var value) {
+  void set borderRight(String value) {
     setProperty('border-right', value, '');
   }
 
@@ -589,7 +643,7 @@
     getPropertyValue('border-right-color');
 
   /** Sets the value of "border-right-color" */
-  void set borderRightColor(var value) {
+  void set borderRightColor(String value) {
     setProperty('border-right-color', value, '');
   }
 
@@ -598,7 +652,7 @@
     getPropertyValue('border-right-style');
 
   /** Sets the value of "border-right-style" */
-  void set borderRightStyle(var value) {
+  void set borderRightStyle(String value) {
     setProperty('border-right-style', value, '');
   }
 
@@ -607,7 +661,7 @@
     getPropertyValue('border-right-width');
 
   /** Sets the value of "border-right-width" */
-  void set borderRightWidth(var value) {
+  void set borderRightWidth(String value) {
     setProperty('border-right-width', value, '');
   }
 
@@ -616,7 +670,7 @@
     getPropertyValue('border-spacing');
 
   /** Sets the value of "border-spacing" */
-  void set borderSpacing(var value) {
+  void set borderSpacing(String value) {
     setProperty('border-spacing', value, '');
   }
 
@@ -625,7 +679,7 @@
     getPropertyValue('${_browserPrefix}border-start');
 
   /** Sets the value of "border-start" */
-  void set borderStart(var value) {
+  void set borderStart(String value) {
     setProperty('${_browserPrefix}border-start', value, '');
   }
 
@@ -634,7 +688,7 @@
     getPropertyValue('${_browserPrefix}border-start-color');
 
   /** Sets the value of "border-start-color" */
-  void set borderStartColor(var value) {
+  void set borderStartColor(String value) {
     setProperty('${_browserPrefix}border-start-color', value, '');
   }
 
@@ -643,7 +697,7 @@
     getPropertyValue('${_browserPrefix}border-start-style');
 
   /** Sets the value of "border-start-style" */
-  void set borderStartStyle(var value) {
+  void set borderStartStyle(String value) {
     setProperty('${_browserPrefix}border-start-style', value, '');
   }
 
@@ -652,7 +706,7 @@
     getPropertyValue('${_browserPrefix}border-start-width');
 
   /** Sets the value of "border-start-width" */
-  void set borderStartWidth(var value) {
+  void set borderStartWidth(String value) {
     setProperty('${_browserPrefix}border-start-width', value, '');
   }
 
@@ -661,7 +715,7 @@
     getPropertyValue('border-style');
 
   /** Sets the value of "border-style" */
-  void set borderStyle(var value) {
+  void set borderStyle(String value) {
     setProperty('border-style', value, '');
   }
 
@@ -670,7 +724,7 @@
     getPropertyValue('border-top');
 
   /** Sets the value of "border-top" */
-  void set borderTop(var value) {
+  void set borderTop(String value) {
     setProperty('border-top', value, '');
   }
 
@@ -679,7 +733,7 @@
     getPropertyValue('border-top-color');
 
   /** Sets the value of "border-top-color" */
-  void set borderTopColor(var value) {
+  void set borderTopColor(String value) {
     setProperty('border-top-color', value, '');
   }
 
@@ -688,7 +742,7 @@
     getPropertyValue('border-top-left-radius');
 
   /** Sets the value of "border-top-left-radius" */
-  void set borderTopLeftRadius(var value) {
+  void set borderTopLeftRadius(String value) {
     setProperty('border-top-left-radius', value, '');
   }
 
@@ -697,7 +751,7 @@
     getPropertyValue('border-top-right-radius');
 
   /** Sets the value of "border-top-right-radius" */
-  void set borderTopRightRadius(var value) {
+  void set borderTopRightRadius(String value) {
     setProperty('border-top-right-radius', value, '');
   }
 
@@ -706,7 +760,7 @@
     getPropertyValue('border-top-style');
 
   /** Sets the value of "border-top-style" */
-  void set borderTopStyle(var value) {
+  void set borderTopStyle(String value) {
     setProperty('border-top-style', value, '');
   }
 
@@ -715,7 +769,7 @@
     getPropertyValue('border-top-width');
 
   /** Sets the value of "border-top-width" */
-  void set borderTopWidth(var value) {
+  void set borderTopWidth(String value) {
     setProperty('border-top-width', value, '');
   }
 
@@ -724,7 +778,7 @@
     getPropertyValue('${_browserPrefix}border-vertical-spacing');
 
   /** Sets the value of "border-vertical-spacing" */
-  void set borderVerticalSpacing(var value) {
+  void set borderVerticalSpacing(String value) {
     setProperty('${_browserPrefix}border-vertical-spacing', value, '');
   }
 
@@ -733,7 +787,7 @@
     getPropertyValue('border-width');
 
   /** Sets the value of "border-width" */
-  void set borderWidth(var value) {
+  void set borderWidth(String value) {
     setProperty('border-width', value, '');
   }
 
@@ -742,7 +796,7 @@
     getPropertyValue('bottom');
 
   /** Sets the value of "bottom" */
-  void set bottom(var value) {
+  void set bottom(String value) {
     setProperty('bottom', value, '');
   }
 
@@ -751,16 +805,25 @@
     getPropertyValue('${_browserPrefix}box-align');
 
   /** Sets the value of "box-align" */
-  void set boxAlign(var value) {
+  void set boxAlign(String value) {
     setProperty('${_browserPrefix}box-align', value, '');
   }
 
+  /** Gets the value of "box-decoration-break" */
+  String get boxDecorationBreak =>
+    getPropertyValue('${_browserPrefix}box-decoration-break');
+
+  /** Sets the value of "box-decoration-break" */
+  void set boxDecorationBreak(String value) {
+    setProperty('${_browserPrefix}box-decoration-break', value, '');
+  }
+
   /** Gets the value of "box-direction" */
   String get boxDirection =>
     getPropertyValue('${_browserPrefix}box-direction');
 
   /** Sets the value of "box-direction" */
-  void set boxDirection(var value) {
+  void set boxDirection(String value) {
     setProperty('${_browserPrefix}box-direction', value, '');
   }
 
@@ -769,7 +832,7 @@
     getPropertyValue('${_browserPrefix}box-flex');
 
   /** Sets the value of "box-flex" */
-  void set boxFlex(var value) {
+  void set boxFlex(String value) {
     setProperty('${_browserPrefix}box-flex', value, '');
   }
 
@@ -778,7 +841,7 @@
     getPropertyValue('${_browserPrefix}box-flex-group');
 
   /** Sets the value of "box-flex-group" */
-  void set boxFlexGroup(var value) {
+  void set boxFlexGroup(String value) {
     setProperty('${_browserPrefix}box-flex-group', value, '');
   }
 
@@ -787,7 +850,7 @@
     getPropertyValue('${_browserPrefix}box-lines');
 
   /** Sets the value of "box-lines" */
-  void set boxLines(var value) {
+  void set boxLines(String value) {
     setProperty('${_browserPrefix}box-lines', value, '');
   }
 
@@ -796,7 +859,7 @@
     getPropertyValue('${_browserPrefix}box-ordinal-group');
 
   /** Sets the value of "box-ordinal-group" */
-  void set boxOrdinalGroup(var value) {
+  void set boxOrdinalGroup(String value) {
     setProperty('${_browserPrefix}box-ordinal-group', value, '');
   }
 
@@ -805,7 +868,7 @@
     getPropertyValue('${_browserPrefix}box-orient');
 
   /** Sets the value of "box-orient" */
-  void set boxOrient(var value) {
+  void set boxOrient(String value) {
     setProperty('${_browserPrefix}box-orient', value, '');
   }
 
@@ -814,7 +877,7 @@
     getPropertyValue('${_browserPrefix}box-pack');
 
   /** Sets the value of "box-pack" */
-  void set boxPack(var value) {
+  void set boxPack(String value) {
     setProperty('${_browserPrefix}box-pack', value, '');
   }
 
@@ -823,7 +886,7 @@
     getPropertyValue('${_browserPrefix}box-reflect');
 
   /** Sets the value of "box-reflect" */
-  void set boxReflect(var value) {
+  void set boxReflect(String value) {
     setProperty('${_browserPrefix}box-reflect', value, '');
   }
 
@@ -832,7 +895,7 @@
     getPropertyValue('box-shadow');
 
   /** Sets the value of "box-shadow" */
-  void set boxShadow(var value) {
+  void set boxShadow(String value) {
     setProperty('box-shadow', value, '');
   }
 
@@ -841,7 +904,7 @@
     getPropertyValue('box-sizing');
 
   /** Sets the value of "box-sizing" */
-  void set boxSizing(var value) {
+  void set boxSizing(String value) {
     setProperty('box-sizing', value, '');
   }
 
@@ -850,7 +913,7 @@
     getPropertyValue('caption-side');
 
   /** Sets the value of "caption-side" */
-  void set captionSide(var value) {
+  void set captionSide(String value) {
     setProperty('caption-side', value, '');
   }
 
@@ -859,7 +922,7 @@
     getPropertyValue('clear');
 
   /** Sets the value of "clear" */
-  void set clear(var value) {
+  void set clear(String value) {
     setProperty('clear', value, '');
   }
 
@@ -868,16 +931,25 @@
     getPropertyValue('clip');
 
   /** Sets the value of "clip" */
-  void set clip(var value) {
+  void set clip(String value) {
     setProperty('clip', value, '');
   }
 
+  /** Gets the value of "clip-path" */
+  String get clipPath =>
+    getPropertyValue('${_browserPrefix}clip-path');
+
+  /** Sets the value of "clip-path" */
+  void set clipPath(String value) {
+    setProperty('${_browserPrefix}clip-path', value, '');
+  }
+
   /** Gets the value of "color" */
   String get color =>
     getPropertyValue('color');
 
   /** Sets the value of "color" */
-  void set color(var value) {
+  void set color(String value) {
     setProperty('color', value, '');
   }
 
@@ -886,16 +958,25 @@
     getPropertyValue('${_browserPrefix}color-correction');
 
   /** Sets the value of "color-correction" */
-  void set colorCorrection(var value) {
+  void set colorCorrection(String value) {
     setProperty('${_browserPrefix}color-correction', value, '');
   }
 
+  /** Gets the value of "column-axis" */
+  String get columnAxis =>
+    getPropertyValue('${_browserPrefix}column-axis');
+
+  /** Sets the value of "column-axis" */
+  void set columnAxis(String value) {
+    setProperty('${_browserPrefix}column-axis', value, '');
+  }
+
   /** Gets the value of "column-break-after" */
   String get columnBreakAfter =>
     getPropertyValue('${_browserPrefix}column-break-after');
 
   /** Sets the value of "column-break-after" */
-  void set columnBreakAfter(var value) {
+  void set columnBreakAfter(String value) {
     setProperty('${_browserPrefix}column-break-after', value, '');
   }
 
@@ -904,7 +985,7 @@
     getPropertyValue('${_browserPrefix}column-break-before');
 
   /** Sets the value of "column-break-before" */
-  void set columnBreakBefore(var value) {
+  void set columnBreakBefore(String value) {
     setProperty('${_browserPrefix}column-break-before', value, '');
   }
 
@@ -913,7 +994,7 @@
     getPropertyValue('${_browserPrefix}column-break-inside');
 
   /** Sets the value of "column-break-inside" */
-  void set columnBreakInside(var value) {
+  void set columnBreakInside(String value) {
     setProperty('${_browserPrefix}column-break-inside', value, '');
   }
 
@@ -922,7 +1003,7 @@
     getPropertyValue('${_browserPrefix}column-count');
 
   /** Sets the value of "column-count" */
-  void set columnCount(var value) {
+  void set columnCount(String value) {
     setProperty('${_browserPrefix}column-count', value, '');
   }
 
@@ -931,16 +1012,25 @@
     getPropertyValue('${_browserPrefix}column-gap');
 
   /** Sets the value of "column-gap" */
-  void set columnGap(var value) {
+  void set columnGap(String value) {
     setProperty('${_browserPrefix}column-gap', value, '');
   }
 
+  /** Gets the value of "column-progression" */
+  String get columnProgression =>
+    getPropertyValue('${_browserPrefix}column-progression');
+
+  /** Sets the value of "column-progression" */
+  void set columnProgression(String value) {
+    setProperty('${_browserPrefix}column-progression', value, '');
+  }
+
   /** Gets the value of "column-rule" */
   String get columnRule =>
     getPropertyValue('${_browserPrefix}column-rule');
 
   /** Sets the value of "column-rule" */
-  void set columnRule(var value) {
+  void set columnRule(String value) {
     setProperty('${_browserPrefix}column-rule', value, '');
   }
 
@@ -949,7 +1039,7 @@
     getPropertyValue('${_browserPrefix}column-rule-color');
 
   /** Sets the value of "column-rule-color" */
-  void set columnRuleColor(var value) {
+  void set columnRuleColor(String value) {
     setProperty('${_browserPrefix}column-rule-color', value, '');
   }
 
@@ -958,7 +1048,7 @@
     getPropertyValue('${_browserPrefix}column-rule-style');
 
   /** Sets the value of "column-rule-style" */
-  void set columnRuleStyle(var value) {
+  void set columnRuleStyle(String value) {
     setProperty('${_browserPrefix}column-rule-style', value, '');
   }
 
@@ -967,7 +1057,7 @@
     getPropertyValue('${_browserPrefix}column-rule-width');
 
   /** Sets the value of "column-rule-width" */
-  void set columnRuleWidth(var value) {
+  void set columnRuleWidth(String value) {
     setProperty('${_browserPrefix}column-rule-width', value, '');
   }
 
@@ -976,7 +1066,7 @@
     getPropertyValue('${_browserPrefix}column-span');
 
   /** Sets the value of "column-span" */
-  void set columnSpan(var value) {
+  void set columnSpan(String value) {
     setProperty('${_browserPrefix}column-span', value, '');
   }
 
@@ -985,7 +1075,7 @@
     getPropertyValue('${_browserPrefix}column-width');
 
   /** Sets the value of "column-width" */
-  void set columnWidth(var value) {
+  void set columnWidth(String value) {
     setProperty('${_browserPrefix}column-width', value, '');
   }
 
@@ -994,7 +1084,7 @@
     getPropertyValue('${_browserPrefix}columns');
 
   /** Sets the value of "columns" */
-  void set columns(var value) {
+  void set columns(String value) {
     setProperty('${_browserPrefix}columns', value, '');
   }
 
@@ -1003,7 +1093,7 @@
     getPropertyValue('content');
 
   /** Sets the value of "content" */
-  void set content(var value) {
+  void set content(String value) {
     setProperty('content', value, '');
   }
 
@@ -1012,7 +1102,7 @@
     getPropertyValue('counter-increment');
 
   /** Sets the value of "counter-increment" */
-  void set counterIncrement(var value) {
+  void set counterIncrement(String value) {
     setProperty('counter-increment', value, '');
   }
 
@@ -1021,7 +1111,7 @@
     getPropertyValue('counter-reset');
 
   /** Sets the value of "counter-reset" */
-  void set counterReset(var value) {
+  void set counterReset(String value) {
     setProperty('counter-reset', value, '');
   }
 
@@ -1030,16 +1120,25 @@
     getPropertyValue('cursor');
 
   /** Sets the value of "cursor" */
-  void set cursor(var value) {
+  void set cursor(String value) {
     setProperty('cursor', value, '');
   }
 
+  /** Gets the value of "dashboard-region" */
+  String get dashboardRegion =>
+    getPropertyValue('${_browserPrefix}dashboard-region');
+
+  /** Sets the value of "dashboard-region" */
+  void set dashboardRegion(String value) {
+    setProperty('${_browserPrefix}dashboard-region', value, '');
+  }
+
   /** Gets the value of "direction" */
   String get direction =>
     getPropertyValue('direction');
 
   /** Sets the value of "direction" */
-  void set direction(var value) {
+  void set direction(String value) {
     setProperty('direction', value, '');
   }
 
@@ -1048,7 +1147,7 @@
     getPropertyValue('display');
 
   /** Sets the value of "display" */
-  void set display(var value) {
+  void set display(String value) {
     setProperty('display', value, '');
   }
 
@@ -1057,7 +1156,7 @@
     getPropertyValue('empty-cells');
 
   /** Sets the value of "empty-cells" */
-  void set emptyCells(var value) {
+  void set emptyCells(String value) {
     setProperty('empty-cells', value, '');
   }
 
@@ -1066,17 +1165,35 @@
     getPropertyValue('${_browserPrefix}filter');
 
   /** Sets the value of "filter" */
-  void set filter(var value) {
+  void set filter(String value) {
     setProperty('${_browserPrefix}filter', value, '');
   }
 
-  /** Gets the value of "flex-align" */
-  String get flexAlign =>
-    getPropertyValue('${_browserPrefix}flex-align');
+  /** Gets the value of "flex" */
+  String get flex =>
+    getPropertyValue('${_browserPrefix}flex');
 
-  /** Sets the value of "flex-align" */
-  void set flexAlign(var value) {
-    setProperty('${_browserPrefix}flex-align', value, '');
+  /** Sets the value of "flex" */
+  void set flex(String value) {
+    setProperty('${_browserPrefix}flex', value, '');
+  }
+
+  /** Gets the value of "flex-basis" */
+  String get flexBasis =>
+    getPropertyValue('${_browserPrefix}flex-basis');
+
+  /** Sets the value of "flex-basis" */
+  void set flexBasis(String value) {
+    setProperty('${_browserPrefix}flex-basis', value, '');
+  }
+
+  /** Gets the value of "flex-direction" */
+  String get flexDirection =>
+    getPropertyValue('${_browserPrefix}flex-direction');
+
+  /** Sets the value of "flex-direction" */
+  void set flexDirection(String value) {
+    setProperty('${_browserPrefix}flex-direction', value, '');
   }
 
   /** Gets the value of "flex-flow" */
@@ -1084,26 +1201,35 @@
     getPropertyValue('${_browserPrefix}flex-flow');
 
   /** Sets the value of "flex-flow" */
-  void set flexFlow(var value) {
+  void set flexFlow(String value) {
     setProperty('${_browserPrefix}flex-flow', value, '');
   }
 
-  /** Gets the value of "flex-order" */
-  String get flexOrder =>
-    getPropertyValue('${_browserPrefix}flex-order');
+  /** Gets the value of "flex-grow" */
+  String get flexGrow =>
+    getPropertyValue('${_browserPrefix}flex-grow');
 
-  /** Sets the value of "flex-order" */
-  void set flexOrder(var value) {
-    setProperty('${_browserPrefix}flex-order', value, '');
+  /** Sets the value of "flex-grow" */
+  void set flexGrow(String value) {
+    setProperty('${_browserPrefix}flex-grow', value, '');
   }
 
-  /** Gets the value of "flex-pack" */
-  String get flexPack =>
-    getPropertyValue('${_browserPrefix}flex-pack');
+  /** Gets the value of "flex-shrink" */
+  String get flexShrink =>
+    getPropertyValue('${_browserPrefix}flex-shrink');
 
-  /** Sets the value of "flex-pack" */
-  void set flexPack(var value) {
-    setProperty('${_browserPrefix}flex-pack', value, '');
+  /** Sets the value of "flex-shrink" */
+  void set flexShrink(String value) {
+    setProperty('${_browserPrefix}flex-shrink', value, '');
+  }
+
+  /** Gets the value of "flex-wrap" */
+  String get flexWrap =>
+    getPropertyValue('${_browserPrefix}flex-wrap');
+
+  /** Sets the value of "flex-wrap" */
+  void set flexWrap(String value) {
+    setProperty('${_browserPrefix}flex-wrap', value, '');
   }
 
   /** Gets the value of "float" */
@@ -1111,7 +1237,7 @@
     getPropertyValue('float');
 
   /** Sets the value of "float" */
-  void set float(var value) {
+  void set float(String value) {
     setProperty('float', value, '');
   }
 
@@ -1120,7 +1246,7 @@
     getPropertyValue('${_browserPrefix}flow-from');
 
   /** Sets the value of "flow-from" */
-  void set flowFrom(var value) {
+  void set flowFrom(String value) {
     setProperty('${_browserPrefix}flow-from', value, '');
   }
 
@@ -1129,7 +1255,7 @@
     getPropertyValue('${_browserPrefix}flow-into');
 
   /** Sets the value of "flow-into" */
-  void set flowInto(var value) {
+  void set flowInto(String value) {
     setProperty('${_browserPrefix}flow-into', value, '');
   }
 
@@ -1138,7 +1264,7 @@
     getPropertyValue('font');
 
   /** Sets the value of "font" */
-  void set font(var value) {
+  void set font(String value) {
     setProperty('font', value, '');
   }
 
@@ -1147,7 +1273,7 @@
     getPropertyValue('font-family');
 
   /** Sets the value of "font-family" */
-  void set fontFamily(var value) {
+  void set fontFamily(String value) {
     setProperty('font-family', value, '');
   }
 
@@ -1156,16 +1282,25 @@
     getPropertyValue('${_browserPrefix}font-feature-settings');
 
   /** Sets the value of "font-feature-settings" */
-  void set fontFeatureSettings(var value) {
+  void set fontFeatureSettings(String value) {
     setProperty('${_browserPrefix}font-feature-settings', value, '');
   }
 
+  /** Gets the value of "font-kerning" */
+  String get fontKerning =>
+    getPropertyValue('${_browserPrefix}font-kerning');
+
+  /** Sets the value of "font-kerning" */
+  void set fontKerning(String value) {
+    setProperty('${_browserPrefix}font-kerning', value, '');
+  }
+
   /** Gets the value of "font-size" */
   String get fontSize =>
     getPropertyValue('font-size');
 
   /** Sets the value of "font-size" */
-  void set fontSize(var value) {
+  void set fontSize(String value) {
     setProperty('font-size', value, '');
   }
 
@@ -1174,7 +1309,7 @@
     getPropertyValue('${_browserPrefix}font-size-delta');
 
   /** Sets the value of "font-size-delta" */
-  void set fontSizeDelta(var value) {
+  void set fontSizeDelta(String value) {
     setProperty('${_browserPrefix}font-size-delta', value, '');
   }
 
@@ -1183,7 +1318,7 @@
     getPropertyValue('${_browserPrefix}font-smoothing');
 
   /** Sets the value of "font-smoothing" */
-  void set fontSmoothing(var value) {
+  void set fontSmoothing(String value) {
     setProperty('${_browserPrefix}font-smoothing', value, '');
   }
 
@@ -1192,7 +1327,7 @@
     getPropertyValue('font-stretch');
 
   /** Sets the value of "font-stretch" */
-  void set fontStretch(var value) {
+  void set fontStretch(String value) {
     setProperty('font-stretch', value, '');
   }
 
@@ -1201,7 +1336,7 @@
     getPropertyValue('font-style');
 
   /** Sets the value of "font-style" */
-  void set fontStyle(var value) {
+  void set fontStyle(String value) {
     setProperty('font-style', value, '');
   }
 
@@ -1210,25 +1345,70 @@
     getPropertyValue('font-variant');
 
   /** Sets the value of "font-variant" */
-  void set fontVariant(var value) {
+  void set fontVariant(String value) {
     setProperty('font-variant', value, '');
   }
 
+  /** Gets the value of "font-variant-ligatures" */
+  String get fontVariantLigatures =>
+    getPropertyValue('${_browserPrefix}font-variant-ligatures');
+
+  /** Sets the value of "font-variant-ligatures" */
+  void set fontVariantLigatures(String value) {
+    setProperty('${_browserPrefix}font-variant-ligatures', value, '');
+  }
+
   /** Gets the value of "font-weight" */
   String get fontWeight =>
     getPropertyValue('font-weight');
 
   /** Sets the value of "font-weight" */
-  void set fontWeight(var value) {
+  void set fontWeight(String value) {
     setProperty('font-weight', value, '');
   }
 
+  /** Gets the value of "grid-column" */
+  String get gridColumn =>
+    getPropertyValue('${_browserPrefix}grid-column');
+
+  /** Sets the value of "grid-column" */
+  void set gridColumn(String value) {
+    setProperty('${_browserPrefix}grid-column', value, '');
+  }
+
+  /** Gets the value of "grid-columns" */
+  String get gridColumns =>
+    getPropertyValue('${_browserPrefix}grid-columns');
+
+  /** Sets the value of "grid-columns" */
+  void set gridColumns(String value) {
+    setProperty('${_browserPrefix}grid-columns', value, '');
+  }
+
+  /** Gets the value of "grid-row" */
+  String get gridRow =>
+    getPropertyValue('${_browserPrefix}grid-row');
+
+  /** Sets the value of "grid-row" */
+  void set gridRow(String value) {
+    setProperty('${_browserPrefix}grid-row', value, '');
+  }
+
+  /** Gets the value of "grid-rows" */
+  String get gridRows =>
+    getPropertyValue('${_browserPrefix}grid-rows');
+
+  /** Sets the value of "grid-rows" */
+  void set gridRows(String value) {
+    setProperty('${_browserPrefix}grid-rows', value, '');
+  }
+
   /** Gets the value of "height" */
   String get height =>
     getPropertyValue('height');
 
   /** Sets the value of "height" */
-  void set height(var value) {
+  void set height(String value) {
     setProperty('height', value, '');
   }
 
@@ -1237,7 +1417,7 @@
     getPropertyValue('${_browserPrefix}highlight');
 
   /** Sets the value of "highlight" */
-  void set highlight(var value) {
+  void set highlight(String value) {
     setProperty('${_browserPrefix}highlight', value, '');
   }
 
@@ -1246,7 +1426,7 @@
     getPropertyValue('${_browserPrefix}hyphenate-character');
 
   /** Sets the value of "hyphenate-character" */
-  void set hyphenateCharacter(var value) {
+  void set hyphenateCharacter(String value) {
     setProperty('${_browserPrefix}hyphenate-character', value, '');
   }
 
@@ -1255,7 +1435,7 @@
     getPropertyValue('${_browserPrefix}hyphenate-limit-after');
 
   /** Sets the value of "hyphenate-limit-after" */
-  void set hyphenateLimitAfter(var value) {
+  void set hyphenateLimitAfter(String value) {
     setProperty('${_browserPrefix}hyphenate-limit-after', value, '');
   }
 
@@ -1264,7 +1444,7 @@
     getPropertyValue('${_browserPrefix}hyphenate-limit-before');
 
   /** Sets the value of "hyphenate-limit-before" */
-  void set hyphenateLimitBefore(var value) {
+  void set hyphenateLimitBefore(String value) {
     setProperty('${_browserPrefix}hyphenate-limit-before', value, '');
   }
 
@@ -1273,7 +1453,7 @@
     getPropertyValue('${_browserPrefix}hyphenate-limit-lines');
 
   /** Sets the value of "hyphenate-limit-lines" */
-  void set hyphenateLimitLines(var value) {
+  void set hyphenateLimitLines(String value) {
     setProperty('${_browserPrefix}hyphenate-limit-lines', value, '');
   }
 
@@ -1282,25 +1462,52 @@
     getPropertyValue('${_browserPrefix}hyphens');
 
   /** Sets the value of "hyphens" */
-  void set hyphens(var value) {
+  void set hyphens(String value) {
     setProperty('${_browserPrefix}hyphens', value, '');
   }
 
+  /** Gets the value of "image-orientation" */
+  String get imageOrientation =>
+    getPropertyValue('image-orientation');
+
+  /** Sets the value of "image-orientation" */
+  void set imageOrientation(String value) {
+    setProperty('image-orientation', value, '');
+  }
+
   /** Gets the value of "image-rendering" */
   String get imageRendering =>
     getPropertyValue('image-rendering');
 
   /** Sets the value of "image-rendering" */
-  void set imageRendering(var value) {
+  void set imageRendering(String value) {
     setProperty('image-rendering', value, '');
   }
 
+  /** Gets the value of "image-resolution" */
+  String get imageResolution =>
+    getPropertyValue('image-resolution');
+
+  /** Sets the value of "image-resolution" */
+  void set imageResolution(String value) {
+    setProperty('image-resolution', value, '');
+  }
+
+  /** Gets the value of "justify-content" */
+  String get justifyContent =>
+    getPropertyValue('${_browserPrefix}justify-content');
+
+  /** Sets the value of "justify-content" */
+  void set justifyContent(String value) {
+    setProperty('${_browserPrefix}justify-content', value, '');
+  }
+
   /** Gets the value of "left" */
   String get left =>
     getPropertyValue('left');
 
   /** Sets the value of "left" */
-  void set left(var value) {
+  void set left(String value) {
     setProperty('left', value, '');
   }
 
@@ -1309,16 +1516,25 @@
     getPropertyValue('letter-spacing');
 
   /** Sets the value of "letter-spacing" */
-  void set letterSpacing(var value) {
+  void set letterSpacing(String value) {
     setProperty('letter-spacing', value, '');
   }
 
+  /** Gets the value of "line-align" */
+  String get lineAlign =>
+    getPropertyValue('${_browserPrefix}line-align');
+
+  /** Sets the value of "line-align" */
+  void set lineAlign(String value) {
+    setProperty('${_browserPrefix}line-align', value, '');
+  }
+
   /** Gets the value of "line-box-contain" */
   String get lineBoxContain =>
     getPropertyValue('${_browserPrefix}line-box-contain');
 
   /** Sets the value of "line-box-contain" */
-  void set lineBoxContain(var value) {
+  void set lineBoxContain(String value) {
     setProperty('${_browserPrefix}line-box-contain', value, '');
   }
 
@@ -1327,7 +1543,7 @@
     getPropertyValue('${_browserPrefix}line-break');
 
   /** Sets the value of "line-break" */
-  void set lineBreak(var value) {
+  void set lineBreak(String value) {
     setProperty('${_browserPrefix}line-break', value, '');
   }
 
@@ -1336,25 +1552,43 @@
     getPropertyValue('${_browserPrefix}line-clamp');
 
   /** Sets the value of "line-clamp" */
-  void set lineClamp(var value) {
+  void set lineClamp(String value) {
     setProperty('${_browserPrefix}line-clamp', value, '');
   }
 
+  /** Gets the value of "line-grid" */
+  String get lineGrid =>
+    getPropertyValue('${_browserPrefix}line-grid');
+
+  /** Sets the value of "line-grid" */
+  void set lineGrid(String value) {
+    setProperty('${_browserPrefix}line-grid', value, '');
+  }
+
   /** Gets the value of "line-height" */
   String get lineHeight =>
     getPropertyValue('line-height');
 
   /** Sets the value of "line-height" */
-  void set lineHeight(var value) {
+  void set lineHeight(String value) {
     setProperty('line-height', value, '');
   }
 
+  /** Gets the value of "line-snap" */
+  String get lineSnap =>
+    getPropertyValue('${_browserPrefix}line-snap');
+
+  /** Sets the value of "line-snap" */
+  void set lineSnap(String value) {
+    setProperty('${_browserPrefix}line-snap', value, '');
+  }
+
   /** Gets the value of "list-style" */
   String get listStyle =>
     getPropertyValue('list-style');
 
   /** Sets the value of "list-style" */
-  void set listStyle(var value) {
+  void set listStyle(String value) {
     setProperty('list-style', value, '');
   }
 
@@ -1363,7 +1597,7 @@
     getPropertyValue('list-style-image');
 
   /** Sets the value of "list-style-image" */
-  void set listStyleImage(var value) {
+  void set listStyleImage(String value) {
     setProperty('list-style-image', value, '');
   }
 
@@ -1372,7 +1606,7 @@
     getPropertyValue('list-style-position');
 
   /** Sets the value of "list-style-position" */
-  void set listStylePosition(var value) {
+  void set listStylePosition(String value) {
     setProperty('list-style-position', value, '');
   }
 
@@ -1381,7 +1615,7 @@
     getPropertyValue('list-style-type');
 
   /** Sets the value of "list-style-type" */
-  void set listStyleType(var value) {
+  void set listStyleType(String value) {
     setProperty('list-style-type', value, '');
   }
 
@@ -1390,7 +1624,7 @@
     getPropertyValue('${_browserPrefix}locale');
 
   /** Sets the value of "locale" */
-  void set locale(var value) {
+  void set locale(String value) {
     setProperty('${_browserPrefix}locale', value, '');
   }
 
@@ -1399,7 +1633,7 @@
     getPropertyValue('${_browserPrefix}logical-height');
 
   /** Sets the value of "logical-height" */
-  void set logicalHeight(var value) {
+  void set logicalHeight(String value) {
     setProperty('${_browserPrefix}logical-height', value, '');
   }
 
@@ -1408,7 +1642,7 @@
     getPropertyValue('${_browserPrefix}logical-width');
 
   /** Sets the value of "logical-width" */
-  void set logicalWidth(var value) {
+  void set logicalWidth(String value) {
     setProperty('${_browserPrefix}logical-width', value, '');
   }
 
@@ -1417,7 +1651,7 @@
     getPropertyValue('margin');
 
   /** Sets the value of "margin" */
-  void set margin(var value) {
+  void set margin(String value) {
     setProperty('margin', value, '');
   }
 
@@ -1426,7 +1660,7 @@
     getPropertyValue('${_browserPrefix}margin-after');
 
   /** Sets the value of "margin-after" */
-  void set marginAfter(var value) {
+  void set marginAfter(String value) {
     setProperty('${_browserPrefix}margin-after', value, '');
   }
 
@@ -1435,7 +1669,7 @@
     getPropertyValue('${_browserPrefix}margin-after-collapse');
 
   /** Sets the value of "margin-after-collapse" */
-  void set marginAfterCollapse(var value) {
+  void set marginAfterCollapse(String value) {
     setProperty('${_browserPrefix}margin-after-collapse', value, '');
   }
 
@@ -1444,7 +1678,7 @@
     getPropertyValue('${_browserPrefix}margin-before');
 
   /** Sets the value of "margin-before" */
-  void set marginBefore(var value) {
+  void set marginBefore(String value) {
     setProperty('${_browserPrefix}margin-before', value, '');
   }
 
@@ -1453,7 +1687,7 @@
     getPropertyValue('${_browserPrefix}margin-before-collapse');
 
   /** Sets the value of "margin-before-collapse" */
-  void set marginBeforeCollapse(var value) {
+  void set marginBeforeCollapse(String value) {
     setProperty('${_browserPrefix}margin-before-collapse', value, '');
   }
 
@@ -1462,7 +1696,7 @@
     getPropertyValue('margin-bottom');
 
   /** Sets the value of "margin-bottom" */
-  void set marginBottom(var value) {
+  void set marginBottom(String value) {
     setProperty('margin-bottom', value, '');
   }
 
@@ -1471,7 +1705,7 @@
     getPropertyValue('${_browserPrefix}margin-bottom-collapse');
 
   /** Sets the value of "margin-bottom-collapse" */
-  void set marginBottomCollapse(var value) {
+  void set marginBottomCollapse(String value) {
     setProperty('${_browserPrefix}margin-bottom-collapse', value, '');
   }
 
@@ -1480,7 +1714,7 @@
     getPropertyValue('${_browserPrefix}margin-collapse');
 
   /** Sets the value of "margin-collapse" */
-  void set marginCollapse(var value) {
+  void set marginCollapse(String value) {
     setProperty('${_browserPrefix}margin-collapse', value, '');
   }
 
@@ -1489,7 +1723,7 @@
     getPropertyValue('${_browserPrefix}margin-end');
 
   /** Sets the value of "margin-end" */
-  void set marginEnd(var value) {
+  void set marginEnd(String value) {
     setProperty('${_browserPrefix}margin-end', value, '');
   }
 
@@ -1498,7 +1732,7 @@
     getPropertyValue('margin-left');
 
   /** Sets the value of "margin-left" */
-  void set marginLeft(var value) {
+  void set marginLeft(String value) {
     setProperty('margin-left', value, '');
   }
 
@@ -1507,7 +1741,7 @@
     getPropertyValue('margin-right');
 
   /** Sets the value of "margin-right" */
-  void set marginRight(var value) {
+  void set marginRight(String value) {
     setProperty('margin-right', value, '');
   }
 
@@ -1516,7 +1750,7 @@
     getPropertyValue('${_browserPrefix}margin-start');
 
   /** Sets the value of "margin-start" */
-  void set marginStart(var value) {
+  void set marginStart(String value) {
     setProperty('${_browserPrefix}margin-start', value, '');
   }
 
@@ -1525,7 +1759,7 @@
     getPropertyValue('margin-top');
 
   /** Sets the value of "margin-top" */
-  void set marginTop(var value) {
+  void set marginTop(String value) {
     setProperty('margin-top', value, '');
   }
 
@@ -1534,7 +1768,7 @@
     getPropertyValue('${_browserPrefix}margin-top-collapse');
 
   /** Sets the value of "margin-top-collapse" */
-  void set marginTopCollapse(var value) {
+  void set marginTopCollapse(String value) {
     setProperty('${_browserPrefix}margin-top-collapse', value, '');
   }
 
@@ -1543,7 +1777,7 @@
     getPropertyValue('${_browserPrefix}marquee');
 
   /** Sets the value of "marquee" */
-  void set marquee(var value) {
+  void set marquee(String value) {
     setProperty('${_browserPrefix}marquee', value, '');
   }
 
@@ -1552,7 +1786,7 @@
     getPropertyValue('${_browserPrefix}marquee-direction');
 
   /** Sets the value of "marquee-direction" */
-  void set marqueeDirection(var value) {
+  void set marqueeDirection(String value) {
     setProperty('${_browserPrefix}marquee-direction', value, '');
   }
 
@@ -1561,7 +1795,7 @@
     getPropertyValue('${_browserPrefix}marquee-increment');
 
   /** Sets the value of "marquee-increment" */
-  void set marqueeIncrement(var value) {
+  void set marqueeIncrement(String value) {
     setProperty('${_browserPrefix}marquee-increment', value, '');
   }
 
@@ -1570,7 +1804,7 @@
     getPropertyValue('${_browserPrefix}marquee-repetition');
 
   /** Sets the value of "marquee-repetition" */
-  void set marqueeRepetition(var value) {
+  void set marqueeRepetition(String value) {
     setProperty('${_browserPrefix}marquee-repetition', value, '');
   }
 
@@ -1579,7 +1813,7 @@
     getPropertyValue('${_browserPrefix}marquee-speed');
 
   /** Sets the value of "marquee-speed" */
-  void set marqueeSpeed(var value) {
+  void set marqueeSpeed(String value) {
     setProperty('${_browserPrefix}marquee-speed', value, '');
   }
 
@@ -1588,7 +1822,7 @@
     getPropertyValue('${_browserPrefix}marquee-style');
 
   /** Sets the value of "marquee-style" */
-  void set marqueeStyle(var value) {
+  void set marqueeStyle(String value) {
     setProperty('${_browserPrefix}marquee-style', value, '');
   }
 
@@ -1597,7 +1831,7 @@
     getPropertyValue('${_browserPrefix}mask');
 
   /** Sets the value of "mask" */
-  void set mask(var value) {
+  void set mask(String value) {
     setProperty('${_browserPrefix}mask', value, '');
   }
 
@@ -1606,7 +1840,7 @@
     getPropertyValue('${_browserPrefix}mask-attachment');
 
   /** Sets the value of "mask-attachment" */
-  void set maskAttachment(var value) {
+  void set maskAttachment(String value) {
     setProperty('${_browserPrefix}mask-attachment', value, '');
   }
 
@@ -1615,7 +1849,7 @@
     getPropertyValue('${_browserPrefix}mask-box-image');
 
   /** Sets the value of "mask-box-image" */
-  void set maskBoxImage(var value) {
+  void set maskBoxImage(String value) {
     setProperty('${_browserPrefix}mask-box-image', value, '');
   }
 
@@ -1624,7 +1858,7 @@
     getPropertyValue('${_browserPrefix}mask-box-image-outset');
 
   /** Sets the value of "mask-box-image-outset" */
-  void set maskBoxImageOutset(var value) {
+  void set maskBoxImageOutset(String value) {
     setProperty('${_browserPrefix}mask-box-image-outset', value, '');
   }
 
@@ -1633,7 +1867,7 @@
     getPropertyValue('${_browserPrefix}mask-box-image-repeat');
 
   /** Sets the value of "mask-box-image-repeat" */
-  void set maskBoxImageRepeat(var value) {
+  void set maskBoxImageRepeat(String value) {
     setProperty('${_browserPrefix}mask-box-image-repeat', value, '');
   }
 
@@ -1642,7 +1876,7 @@
     getPropertyValue('${_browserPrefix}mask-box-image-slice');
 
   /** Sets the value of "mask-box-image-slice" */
-  void set maskBoxImageSlice(var value) {
+  void set maskBoxImageSlice(String value) {
     setProperty('${_browserPrefix}mask-box-image-slice', value, '');
   }
 
@@ -1651,7 +1885,7 @@
     getPropertyValue('${_browserPrefix}mask-box-image-source');
 
   /** Sets the value of "mask-box-image-source" */
-  void set maskBoxImageSource(var value) {
+  void set maskBoxImageSource(String value) {
     setProperty('${_browserPrefix}mask-box-image-source', value, '');
   }
 
@@ -1660,7 +1894,7 @@
     getPropertyValue('${_browserPrefix}mask-box-image-width');
 
   /** Sets the value of "mask-box-image-width" */
-  void set maskBoxImageWidth(var value) {
+  void set maskBoxImageWidth(String value) {
     setProperty('${_browserPrefix}mask-box-image-width', value, '');
   }
 
@@ -1669,7 +1903,7 @@
     getPropertyValue('${_browserPrefix}mask-clip');
 
   /** Sets the value of "mask-clip" */
-  void set maskClip(var value) {
+  void set maskClip(String value) {
     setProperty('${_browserPrefix}mask-clip', value, '');
   }
 
@@ -1678,7 +1912,7 @@
     getPropertyValue('${_browserPrefix}mask-composite');
 
   /** Sets the value of "mask-composite" */
-  void set maskComposite(var value) {
+  void set maskComposite(String value) {
     setProperty('${_browserPrefix}mask-composite', value, '');
   }
 
@@ -1687,7 +1921,7 @@
     getPropertyValue('${_browserPrefix}mask-image');
 
   /** Sets the value of "mask-image" */
-  void set maskImage(var value) {
+  void set maskImage(String value) {
     setProperty('${_browserPrefix}mask-image', value, '');
   }
 
@@ -1696,7 +1930,7 @@
     getPropertyValue('${_browserPrefix}mask-origin');
 
   /** Sets the value of "mask-origin" */
-  void set maskOrigin(var value) {
+  void set maskOrigin(String value) {
     setProperty('${_browserPrefix}mask-origin', value, '');
   }
 
@@ -1705,7 +1939,7 @@
     getPropertyValue('${_browserPrefix}mask-position');
 
   /** Sets the value of "mask-position" */
-  void set maskPosition(var value) {
+  void set maskPosition(String value) {
     setProperty('${_browserPrefix}mask-position', value, '');
   }
 
@@ -1714,7 +1948,7 @@
     getPropertyValue('${_browserPrefix}mask-position-x');
 
   /** Sets the value of "mask-position-x" */
-  void set maskPositionX(var value) {
+  void set maskPositionX(String value) {
     setProperty('${_browserPrefix}mask-position-x', value, '');
   }
 
@@ -1723,7 +1957,7 @@
     getPropertyValue('${_browserPrefix}mask-position-y');
 
   /** Sets the value of "mask-position-y" */
-  void set maskPositionY(var value) {
+  void set maskPositionY(String value) {
     setProperty('${_browserPrefix}mask-position-y', value, '');
   }
 
@@ -1732,7 +1966,7 @@
     getPropertyValue('${_browserPrefix}mask-repeat');
 
   /** Sets the value of "mask-repeat" */
-  void set maskRepeat(var value) {
+  void set maskRepeat(String value) {
     setProperty('${_browserPrefix}mask-repeat', value, '');
   }
 
@@ -1741,7 +1975,7 @@
     getPropertyValue('${_browserPrefix}mask-repeat-x');
 
   /** Sets the value of "mask-repeat-x" */
-  void set maskRepeatX(var value) {
+  void set maskRepeatX(String value) {
     setProperty('${_browserPrefix}mask-repeat-x', value, '');
   }
 
@@ -1750,7 +1984,7 @@
     getPropertyValue('${_browserPrefix}mask-repeat-y');
 
   /** Sets the value of "mask-repeat-y" */
-  void set maskRepeatY(var value) {
+  void set maskRepeatY(String value) {
     setProperty('${_browserPrefix}mask-repeat-y', value, '');
   }
 
@@ -1759,25 +1993,16 @@
     getPropertyValue('${_browserPrefix}mask-size');
 
   /** Sets the value of "mask-size" */
-  void set maskSize(var value) {
+  void set maskSize(String value) {
     setProperty('${_browserPrefix}mask-size', value, '');
   }
 
-  /** Gets the value of "match-nearest-mail-blockquote-color" */
-  String get matchNearestMailBlockquoteColor =>
-    getPropertyValue('${_browserPrefix}match-nearest-mail-blockquote-color');
-
-  /** Sets the value of "match-nearest-mail-blockquote-color" */
-  void set matchNearestMailBlockquoteColor(var value) {
-    setProperty('${_browserPrefix}match-nearest-mail-blockquote-color', value, '');
-  }
-
   /** Gets the value of "max-height" */
   String get maxHeight =>
     getPropertyValue('max-height');
 
   /** Sets the value of "max-height" */
-  void set maxHeight(var value) {
+  void set maxHeight(String value) {
     setProperty('max-height', value, '');
   }
 
@@ -1786,7 +2011,7 @@
     getPropertyValue('${_browserPrefix}max-logical-height');
 
   /** Sets the value of "max-logical-height" */
-  void set maxLogicalHeight(var value) {
+  void set maxLogicalHeight(String value) {
     setProperty('${_browserPrefix}max-logical-height', value, '');
   }
 
@@ -1795,7 +2020,7 @@
     getPropertyValue('${_browserPrefix}max-logical-width');
 
   /** Sets the value of "max-logical-width" */
-  void set maxLogicalWidth(var value) {
+  void set maxLogicalWidth(String value) {
     setProperty('${_browserPrefix}max-logical-width', value, '');
   }
 
@@ -1804,16 +2029,25 @@
     getPropertyValue('max-width');
 
   /** Sets the value of "max-width" */
-  void set maxWidth(var value) {
+  void set maxWidth(String value) {
     setProperty('max-width', value, '');
   }
 
+  /** Gets the value of "max-zoom" */
+  String get maxZoom =>
+    getPropertyValue('max-zoom');
+
+  /** Sets the value of "max-zoom" */
+  void set maxZoom(String value) {
+    setProperty('max-zoom', value, '');
+  }
+
   /** Gets the value of "min-height" */
   String get minHeight =>
     getPropertyValue('min-height');
 
   /** Sets the value of "min-height" */
-  void set minHeight(var value) {
+  void set minHeight(String value) {
     setProperty('min-height', value, '');
   }
 
@@ -1822,7 +2056,7 @@
     getPropertyValue('${_browserPrefix}min-logical-height');
 
   /** Sets the value of "min-logical-height" */
-  void set minLogicalHeight(var value) {
+  void set minLogicalHeight(String value) {
     setProperty('${_browserPrefix}min-logical-height', value, '');
   }
 
@@ -1831,7 +2065,7 @@
     getPropertyValue('${_browserPrefix}min-logical-width');
 
   /** Sets the value of "min-logical-width" */
-  void set minLogicalWidth(var value) {
+  void set minLogicalWidth(String value) {
     setProperty('${_browserPrefix}min-logical-width', value, '');
   }
 
@@ -1840,16 +2074,25 @@
     getPropertyValue('min-width');
 
   /** Sets the value of "min-width" */
-  void set minWidth(var value) {
+  void set minWidth(String value) {
     setProperty('min-width', value, '');
   }
 
+  /** Gets the value of "min-zoom" */
+  String get minZoom =>
+    getPropertyValue('min-zoom');
+
+  /** Sets the value of "min-zoom" */
+  void set minZoom(String value) {
+    setProperty('min-zoom', value, '');
+  }
+
   /** Gets the value of "nbsp-mode" */
   String get nbspMode =>
     getPropertyValue('${_browserPrefix}nbsp-mode');
 
   /** Sets the value of "nbsp-mode" */
-  void set nbspMode(var value) {
+  void set nbspMode(String value) {
     setProperty('${_browserPrefix}nbsp-mode', value, '');
   }
 
@@ -1858,16 +2101,34 @@
     getPropertyValue('opacity');
 
   /** Sets the value of "opacity" */
-  void set opacity(var value) {
+  void set opacity(String value) {
     setProperty('opacity', value, '');
   }
 
+  /** Gets the value of "order" */
+  String get order =>
+    getPropertyValue('${_browserPrefix}order');
+
+  /** Sets the value of "order" */
+  void set order(String value) {
+    setProperty('${_browserPrefix}order', value, '');
+  }
+
+  /** Gets the value of "orientation" */
+  String get orientation =>
+    getPropertyValue('orientation');
+
+  /** Sets the value of "orientation" */
+  void set orientation(String value) {
+    setProperty('orientation', value, '');
+  }
+
   /** Gets the value of "orphans" */
   String get orphans =>
     getPropertyValue('orphans');
 
   /** Sets the value of "orphans" */
-  void set orphans(var value) {
+  void set orphans(String value) {
     setProperty('orphans', value, '');
   }
 
@@ -1876,7 +2137,7 @@
     getPropertyValue('outline');
 
   /** Sets the value of "outline" */
-  void set outline(var value) {
+  void set outline(String value) {
     setProperty('outline', value, '');
   }
 
@@ -1885,7 +2146,7 @@
     getPropertyValue('outline-color');
 
   /** Sets the value of "outline-color" */
-  void set outlineColor(var value) {
+  void set outlineColor(String value) {
     setProperty('outline-color', value, '');
   }
 
@@ -1894,7 +2155,7 @@
     getPropertyValue('outline-offset');
 
   /** Sets the value of "outline-offset" */
-  void set outlineOffset(var value) {
+  void set outlineOffset(String value) {
     setProperty('outline-offset', value, '');
   }
 
@@ -1903,7 +2164,7 @@
     getPropertyValue('outline-style');
 
   /** Sets the value of "outline-style" */
-  void set outlineStyle(var value) {
+  void set outlineStyle(String value) {
     setProperty('outline-style', value, '');
   }
 
@@ -1912,7 +2173,7 @@
     getPropertyValue('outline-width');
 
   /** Sets the value of "outline-width" */
-  void set outlineWidth(var value) {
+  void set outlineWidth(String value) {
     setProperty('outline-width', value, '');
   }
 
@@ -1921,16 +2182,34 @@
     getPropertyValue('overflow');
 
   /** Sets the value of "overflow" */
-  void set overflow(var value) {
+  void set overflow(String value) {
     setProperty('overflow', value, '');
   }
 
+  /** Gets the value of "overflow-scrolling" */
+  String get overflowScrolling =>
+    getPropertyValue('${_browserPrefix}overflow-scrolling');
+
+  /** Sets the value of "overflow-scrolling" */
+  void set overflowScrolling(String value) {
+    setProperty('${_browserPrefix}overflow-scrolling', value, '');
+  }
+
+  /** Gets the value of "overflow-wrap" */
+  String get overflowWrap =>
+    getPropertyValue('overflow-wrap');
+
+  /** Sets the value of "overflow-wrap" */
+  void set overflowWrap(String value) {
+    setProperty('overflow-wrap', value, '');
+  }
+
   /** Gets the value of "overflow-x" */
   String get overflowX =>
     getPropertyValue('overflow-x');
 
   /** Sets the value of "overflow-x" */
-  void set overflowX(var value) {
+  void set overflowX(String value) {
     setProperty('overflow-x', value, '');
   }
 
@@ -1939,7 +2218,7 @@
     getPropertyValue('overflow-y');
 
   /** Sets the value of "overflow-y" */
-  void set overflowY(var value) {
+  void set overflowY(String value) {
     setProperty('overflow-y', value, '');
   }
 
@@ -1948,7 +2227,7 @@
     getPropertyValue('padding');
 
   /** Sets the value of "padding" */
-  void set padding(var value) {
+  void set padding(String value) {
     setProperty('padding', value, '');
   }
 
@@ -1957,7 +2236,7 @@
     getPropertyValue('${_browserPrefix}padding-after');
 
   /** Sets the value of "padding-after" */
-  void set paddingAfter(var value) {
+  void set paddingAfter(String value) {
     setProperty('${_browserPrefix}padding-after', value, '');
   }
 
@@ -1966,7 +2245,7 @@
     getPropertyValue('${_browserPrefix}padding-before');
 
   /** Sets the value of "padding-before" */
-  void set paddingBefore(var value) {
+  void set paddingBefore(String value) {
     setProperty('${_browserPrefix}padding-before', value, '');
   }
 
@@ -1975,7 +2254,7 @@
     getPropertyValue('padding-bottom');
 
   /** Sets the value of "padding-bottom" */
-  void set paddingBottom(var value) {
+  void set paddingBottom(String value) {
     setProperty('padding-bottom', value, '');
   }
 
@@ -1984,7 +2263,7 @@
     getPropertyValue('${_browserPrefix}padding-end');
 
   /** Sets the value of "padding-end" */
-  void set paddingEnd(var value) {
+  void set paddingEnd(String value) {
     setProperty('${_browserPrefix}padding-end', value, '');
   }
 
@@ -1993,7 +2272,7 @@
     getPropertyValue('padding-left');
 
   /** Sets the value of "padding-left" */
-  void set paddingLeft(var value) {
+  void set paddingLeft(String value) {
     setProperty('padding-left', value, '');
   }
 
@@ -2002,7 +2281,7 @@
     getPropertyValue('padding-right');
 
   /** Sets the value of "padding-right" */
-  void set paddingRight(var value) {
+  void set paddingRight(String value) {
     setProperty('padding-right', value, '');
   }
 
@@ -2011,7 +2290,7 @@
     getPropertyValue('${_browserPrefix}padding-start');
 
   /** Sets the value of "padding-start" */
-  void set paddingStart(var value) {
+  void set paddingStart(String value) {
     setProperty('${_browserPrefix}padding-start', value, '');
   }
 
@@ -2020,7 +2299,7 @@
     getPropertyValue('padding-top');
 
   /** Sets the value of "padding-top" */
-  void set paddingTop(var value) {
+  void set paddingTop(String value) {
     setProperty('padding-top', value, '');
   }
 
@@ -2029,7 +2308,7 @@
     getPropertyValue('page');
 
   /** Sets the value of "page" */
-  void set page(var value) {
+  void set page(String value) {
     setProperty('page', value, '');
   }
 
@@ -2038,7 +2317,7 @@
     getPropertyValue('page-break-after');
 
   /** Sets the value of "page-break-after" */
-  void set pageBreakAfter(var value) {
+  void set pageBreakAfter(String value) {
     setProperty('page-break-after', value, '');
   }
 
@@ -2047,7 +2326,7 @@
     getPropertyValue('page-break-before');
 
   /** Sets the value of "page-break-before" */
-  void set pageBreakBefore(var value) {
+  void set pageBreakBefore(String value) {
     setProperty('page-break-before', value, '');
   }
 
@@ -2056,7 +2335,7 @@
     getPropertyValue('page-break-inside');
 
   /** Sets the value of "page-break-inside" */
-  void set pageBreakInside(var value) {
+  void set pageBreakInside(String value) {
     setProperty('page-break-inside', value, '');
   }
 
@@ -2065,7 +2344,7 @@
     getPropertyValue('${_browserPrefix}perspective');
 
   /** Sets the value of "perspective" */
-  void set perspective(var value) {
+  void set perspective(String value) {
     setProperty('${_browserPrefix}perspective', value, '');
   }
 
@@ -2074,7 +2353,7 @@
     getPropertyValue('${_browserPrefix}perspective-origin');
 
   /** Sets the value of "perspective-origin" */
-  void set perspectiveOrigin(var value) {
+  void set perspectiveOrigin(String value) {
     setProperty('${_browserPrefix}perspective-origin', value, '');
   }
 
@@ -2083,7 +2362,7 @@
     getPropertyValue('${_browserPrefix}perspective-origin-x');
 
   /** Sets the value of "perspective-origin-x" */
-  void set perspectiveOriginX(var value) {
+  void set perspectiveOriginX(String value) {
     setProperty('${_browserPrefix}perspective-origin-x', value, '');
   }
 
@@ -2092,7 +2371,7 @@
     getPropertyValue('${_browserPrefix}perspective-origin-y');
 
   /** Sets the value of "perspective-origin-y" */
-  void set perspectiveOriginY(var value) {
+  void set perspectiveOriginY(String value) {
     setProperty('${_browserPrefix}perspective-origin-y', value, '');
   }
 
@@ -2101,7 +2380,7 @@
     getPropertyValue('pointer-events');
 
   /** Sets the value of "pointer-events" */
-  void set pointerEvents(var value) {
+  void set pointerEvents(String value) {
     setProperty('pointer-events', value, '');
   }
 
@@ -2110,16 +2389,25 @@
     getPropertyValue('position');
 
   /** Sets the value of "position" */
-  void set position(var value) {
+  void set position(String value) {
     setProperty('position', value, '');
   }
 
+  /** Gets the value of "print-color-adjust" */
+  String get printColorAdjust =>
+    getPropertyValue('${_browserPrefix}print-color-adjust');
+
+  /** Sets the value of "print-color-adjust" */
+  void set printColorAdjust(String value) {
+    setProperty('${_browserPrefix}print-color-adjust', value, '');
+  }
+
   /** Gets the value of "quotes" */
   String get quotes =>
     getPropertyValue('quotes');
 
   /** Sets the value of "quotes" */
-  void set quotes(var value) {
+  void set quotes(String value) {
     setProperty('quotes', value, '');
   }
 
@@ -2128,7 +2416,7 @@
     getPropertyValue('${_browserPrefix}region-break-after');
 
   /** Sets the value of "region-break-after" */
-  void set regionBreakAfter(var value) {
+  void set regionBreakAfter(String value) {
     setProperty('${_browserPrefix}region-break-after', value, '');
   }
 
@@ -2137,7 +2425,7 @@
     getPropertyValue('${_browserPrefix}region-break-before');
 
   /** Sets the value of "region-break-before" */
-  void set regionBreakBefore(var value) {
+  void set regionBreakBefore(String value) {
     setProperty('${_browserPrefix}region-break-before', value, '');
   }
 
@@ -2146,7 +2434,7 @@
     getPropertyValue('${_browserPrefix}region-break-inside');
 
   /** Sets the value of "region-break-inside" */
-  void set regionBreakInside(var value) {
+  void set regionBreakInside(String value) {
     setProperty('${_browserPrefix}region-break-inside', value, '');
   }
 
@@ -2155,7 +2443,7 @@
     getPropertyValue('${_browserPrefix}region-overflow');
 
   /** Sets the value of "region-overflow" */
-  void set regionOverflow(var value) {
+  void set regionOverflow(String value) {
     setProperty('${_browserPrefix}region-overflow', value, '');
   }
 
@@ -2164,7 +2452,7 @@
     getPropertyValue('resize');
 
   /** Sets the value of "resize" */
-  void set resize(var value) {
+  void set resize(String value) {
     setProperty('resize', value, '');
   }
 
@@ -2173,7 +2461,7 @@
     getPropertyValue('right');
 
   /** Sets the value of "right" */
-  void set right(var value) {
+  void set right(String value) {
     setProperty('right', value, '');
   }
 
@@ -2182,16 +2470,52 @@
     getPropertyValue('${_browserPrefix}rtl-ordering');
 
   /** Sets the value of "rtl-ordering" */
-  void set rtlOrdering(var value) {
+  void set rtlOrdering(String value) {
     setProperty('${_browserPrefix}rtl-ordering', value, '');
   }
 
+  /** Gets the value of "shape-inside" */
+  String get shapeInside =>
+    getPropertyValue('${_browserPrefix}shape-inside');
+
+  /** Sets the value of "shape-inside" */
+  void set shapeInside(String value) {
+    setProperty('${_browserPrefix}shape-inside', value, '');
+  }
+
+  /** Gets the value of "shape-margin" */
+  String get shapeMargin =>
+    getPropertyValue('${_browserPrefix}shape-margin');
+
+  /** Sets the value of "shape-margin" */
+  void set shapeMargin(String value) {
+    setProperty('${_browserPrefix}shape-margin', value, '');
+  }
+
+  /** Gets the value of "shape-outside" */
+  String get shapeOutside =>
+    getPropertyValue('${_browserPrefix}shape-outside');
+
+  /** Sets the value of "shape-outside" */
+  void set shapeOutside(String value) {
+    setProperty('${_browserPrefix}shape-outside', value, '');
+  }
+
+  /** Gets the value of "shape-padding" */
+  String get shapePadding =>
+    getPropertyValue('${_browserPrefix}shape-padding');
+
+  /** Sets the value of "shape-padding" */
+  void set shapePadding(String value) {
+    setProperty('${_browserPrefix}shape-padding', value, '');
+  }
+
   /** Gets the value of "size" */
   String get size =>
     getPropertyValue('size');
 
   /** Sets the value of "size" */
-  void set size(var value) {
+  void set size(String value) {
     setProperty('size', value, '');
   }
 
@@ -2200,7 +2524,7 @@
     getPropertyValue('speak');
 
   /** Sets the value of "speak" */
-  void set speak(var value) {
+  void set speak(String value) {
     setProperty('speak', value, '');
   }
 
@@ -2209,16 +2533,25 @@
     getPropertyValue('src');
 
   /** Sets the value of "src" */
-  void set src(var value) {
+  void set src(String value) {
     setProperty('src', value, '');
   }
 
+  /** Gets the value of "tab-size" */
+  String get tabSize =>
+    getPropertyValue('tab-size');
+
+  /** Sets the value of "tab-size" */
+  void set tabSize(String value) {
+    setProperty('tab-size', value, '');
+  }
+
   /** Gets the value of "table-layout" */
   String get tableLayout =>
     getPropertyValue('table-layout');
 
   /** Sets the value of "table-layout" */
-  void set tableLayout(var value) {
+  void set tableLayout(String value) {
     setProperty('table-layout', value, '');
   }
 
@@ -2227,7 +2560,7 @@
     getPropertyValue('${_browserPrefix}tap-highlight-color');
 
   /** Sets the value of "tap-highlight-color" */
-  void set tapHighlightColor(var value) {
+  void set tapHighlightColor(String value) {
     setProperty('${_browserPrefix}tap-highlight-color', value, '');
   }
 
@@ -2236,16 +2569,25 @@
     getPropertyValue('text-align');
 
   /** Sets the value of "text-align" */
-  void set textAlign(var value) {
+  void set textAlign(String value) {
     setProperty('text-align', value, '');
   }
 
+  /** Gets the value of "text-align-last" */
+  String get textAlignLast =>
+    getPropertyValue('${_browserPrefix}text-align-last');
+
+  /** Sets the value of "text-align-last" */
+  void set textAlignLast(String value) {
+    setProperty('${_browserPrefix}text-align-last', value, '');
+  }
+
   /** Gets the value of "text-combine" */
   String get textCombine =>
     getPropertyValue('${_browserPrefix}text-combine');
 
   /** Sets the value of "text-combine" */
-  void set textCombine(var value) {
+  void set textCombine(String value) {
     setProperty('${_browserPrefix}text-combine', value, '');
   }
 
@@ -2254,16 +2596,34 @@
     getPropertyValue('text-decoration');
 
   /** Sets the value of "text-decoration" */
-  void set textDecoration(var value) {
+  void set textDecoration(String value) {
     setProperty('text-decoration', value, '');
   }
 
+  /** Gets the value of "text-decoration-line" */
+  String get textDecorationLine =>
+    getPropertyValue('${_browserPrefix}text-decoration-line');
+
+  /** Sets the value of "text-decoration-line" */
+  void set textDecorationLine(String value) {
+    setProperty('${_browserPrefix}text-decoration-line', value, '');
+  }
+
+  /** Gets the value of "text-decoration-style" */
+  String get textDecorationStyle =>
+    getPropertyValue('${_browserPrefix}text-decoration-style');
+
+  /** Sets the value of "text-decoration-style" */
+  void set textDecorationStyle(String value) {
+    setProperty('${_browserPrefix}text-decoration-style', value, '');
+  }
+
   /** Gets the value of "text-decorations-in-effect" */
   String get textDecorationsInEffect =>
     getPropertyValue('${_browserPrefix}text-decorations-in-effect');
 
   /** Sets the value of "text-decorations-in-effect" */
-  void set textDecorationsInEffect(var value) {
+  void set textDecorationsInEffect(String value) {
     setProperty('${_browserPrefix}text-decorations-in-effect', value, '');
   }
 
@@ -2272,7 +2632,7 @@
     getPropertyValue('${_browserPrefix}text-emphasis');
 
   /** Sets the value of "text-emphasis" */
-  void set textEmphasis(var value) {
+  void set textEmphasis(String value) {
     setProperty('${_browserPrefix}text-emphasis', value, '');
   }
 
@@ -2281,7 +2641,7 @@
     getPropertyValue('${_browserPrefix}text-emphasis-color');
 
   /** Sets the value of "text-emphasis-color" */
-  void set textEmphasisColor(var value) {
+  void set textEmphasisColor(String value) {
     setProperty('${_browserPrefix}text-emphasis-color', value, '');
   }
 
@@ -2290,7 +2650,7 @@
     getPropertyValue('${_browserPrefix}text-emphasis-position');
 
   /** Sets the value of "text-emphasis-position" */
-  void set textEmphasisPosition(var value) {
+  void set textEmphasisPosition(String value) {
     setProperty('${_browserPrefix}text-emphasis-position', value, '');
   }
 
@@ -2299,7 +2659,7 @@
     getPropertyValue('${_browserPrefix}text-emphasis-style');
 
   /** Sets the value of "text-emphasis-style" */
-  void set textEmphasisStyle(var value) {
+  void set textEmphasisStyle(String value) {
     setProperty('${_browserPrefix}text-emphasis-style', value, '');
   }
 
@@ -2308,7 +2668,7 @@
     getPropertyValue('${_browserPrefix}text-fill-color');
 
   /** Sets the value of "text-fill-color" */
-  void set textFillColor(var value) {
+  void set textFillColor(String value) {
     setProperty('${_browserPrefix}text-fill-color', value, '');
   }
 
@@ -2317,7 +2677,7 @@
     getPropertyValue('text-indent');
 
   /** Sets the value of "text-indent" */
-  void set textIndent(var value) {
+  void set textIndent(String value) {
     setProperty('text-indent', value, '');
   }
 
@@ -2326,7 +2686,7 @@
     getPropertyValue('text-line-through');
 
   /** Sets the value of "text-line-through" */
-  void set textLineThrough(var value) {
+  void set textLineThrough(String value) {
     setProperty('text-line-through', value, '');
   }
 
@@ -2335,7 +2695,7 @@
     getPropertyValue('text-line-through-color');
 
   /** Sets the value of "text-line-through-color" */
-  void set textLineThroughColor(var value) {
+  void set textLineThroughColor(String value) {
     setProperty('text-line-through-color', value, '');
   }
 
@@ -2344,7 +2704,7 @@
     getPropertyValue('text-line-through-mode');
 
   /** Sets the value of "text-line-through-mode" */
-  void set textLineThroughMode(var value) {
+  void set textLineThroughMode(String value) {
     setProperty('text-line-through-mode', value, '');
   }
 
@@ -2353,7 +2713,7 @@
     getPropertyValue('text-line-through-style');
 
   /** Sets the value of "text-line-through-style" */
-  void set textLineThroughStyle(var value) {
+  void set textLineThroughStyle(String value) {
     setProperty('text-line-through-style', value, '');
   }
 
@@ -2362,7 +2722,7 @@
     getPropertyValue('text-line-through-width');
 
   /** Sets the value of "text-line-through-width" */
-  void set textLineThroughWidth(var value) {
+  void set textLineThroughWidth(String value) {
     setProperty('text-line-through-width', value, '');
   }
 
@@ -2371,7 +2731,7 @@
     getPropertyValue('${_browserPrefix}text-orientation');
 
   /** Sets the value of "text-orientation" */
-  void set textOrientation(var value) {
+  void set textOrientation(String value) {
     setProperty('${_browserPrefix}text-orientation', value, '');
   }
 
@@ -2380,7 +2740,7 @@
     getPropertyValue('text-overflow');
 
   /** Sets the value of "text-overflow" */
-  void set textOverflow(var value) {
+  void set textOverflow(String value) {
     setProperty('text-overflow', value, '');
   }
 
@@ -2389,7 +2749,7 @@
     getPropertyValue('text-overline');
 
   /** Sets the value of "text-overline" */
-  void set textOverline(var value) {
+  void set textOverline(String value) {
     setProperty('text-overline', value, '');
   }
 
@@ -2398,7 +2758,7 @@
     getPropertyValue('text-overline-color');
 
   /** Sets the value of "text-overline-color" */
-  void set textOverlineColor(var value) {
+  void set textOverlineColor(String value) {
     setProperty('text-overline-color', value, '');
   }
 
@@ -2407,7 +2767,7 @@
     getPropertyValue('text-overline-mode');
 
   /** Sets the value of "text-overline-mode" */
-  void set textOverlineMode(var value) {
+  void set textOverlineMode(String value) {
     setProperty('text-overline-mode', value, '');
   }
 
@@ -2416,7 +2776,7 @@
     getPropertyValue('text-overline-style');
 
   /** Sets the value of "text-overline-style" */
-  void set textOverlineStyle(var value) {
+  void set textOverlineStyle(String value) {
     setProperty('text-overline-style', value, '');
   }
 
@@ -2425,7 +2785,7 @@
     getPropertyValue('text-overline-width');
 
   /** Sets the value of "text-overline-width" */
-  void set textOverlineWidth(var value) {
+  void set textOverlineWidth(String value) {
     setProperty('text-overline-width', value, '');
   }
 
@@ -2434,7 +2794,7 @@
     getPropertyValue('text-rendering');
 
   /** Sets the value of "text-rendering" */
-  void set textRendering(var value) {
+  void set textRendering(String value) {
     setProperty('text-rendering', value, '');
   }
 
@@ -2443,7 +2803,7 @@
     getPropertyValue('${_browserPrefix}text-security');
 
   /** Sets the value of "text-security" */
-  void set textSecurity(var value) {
+  void set textSecurity(String value) {
     setProperty('${_browserPrefix}text-security', value, '');
   }
 
@@ -2452,7 +2812,7 @@
     getPropertyValue('text-shadow');
 
   /** Sets the value of "text-shadow" */
-  void set textShadow(var value) {
+  void set textShadow(String value) {
     setProperty('text-shadow', value, '');
   }
 
@@ -2461,7 +2821,7 @@
     getPropertyValue('${_browserPrefix}text-size-adjust');
 
   /** Sets the value of "text-size-adjust" */
-  void set textSizeAdjust(var value) {
+  void set textSizeAdjust(String value) {
     setProperty('${_browserPrefix}text-size-adjust', value, '');
   }
 
@@ -2470,7 +2830,7 @@
     getPropertyValue('${_browserPrefix}text-stroke');
 
   /** Sets the value of "text-stroke" */
-  void set textStroke(var value) {
+  void set textStroke(String value) {
     setProperty('${_browserPrefix}text-stroke', value, '');
   }
 
@@ -2479,7 +2839,7 @@
     getPropertyValue('${_browserPrefix}text-stroke-color');
 
   /** Sets the value of "text-stroke-color" */
-  void set textStrokeColor(var value) {
+  void set textStrokeColor(String value) {
     setProperty('${_browserPrefix}text-stroke-color', value, '');
   }
 
@@ -2488,7 +2848,7 @@
     getPropertyValue('${_browserPrefix}text-stroke-width');
 
   /** Sets the value of "text-stroke-width" */
-  void set textStrokeWidth(var value) {
+  void set textStrokeWidth(String value) {
     setProperty('${_browserPrefix}text-stroke-width', value, '');
   }
 
@@ -2497,7 +2857,7 @@
     getPropertyValue('text-transform');
 
   /** Sets the value of "text-transform" */
-  void set textTransform(var value) {
+  void set textTransform(String value) {
     setProperty('text-transform', value, '');
   }
 
@@ -2506,7 +2866,7 @@
     getPropertyValue('text-underline');
 
   /** Sets the value of "text-underline" */
-  void set textUnderline(var value) {
+  void set textUnderline(String value) {
     setProperty('text-underline', value, '');
   }
 
@@ -2515,7 +2875,7 @@
     getPropertyValue('text-underline-color');
 
   /** Sets the value of "text-underline-color" */
-  void set textUnderlineColor(var value) {
+  void set textUnderlineColor(String value) {
     setProperty('text-underline-color', value, '');
   }
 
@@ -2524,7 +2884,7 @@
     getPropertyValue('text-underline-mode');
 
   /** Sets the value of "text-underline-mode" */
-  void set textUnderlineMode(var value) {
+  void set textUnderlineMode(String value) {
     setProperty('text-underline-mode', value, '');
   }
 
@@ -2533,7 +2893,7 @@
     getPropertyValue('text-underline-style');
 
   /** Sets the value of "text-underline-style" */
-  void set textUnderlineStyle(var value) {
+  void set textUnderlineStyle(String value) {
     setProperty('text-underline-style', value, '');
   }
 
@@ -2542,7 +2902,7 @@
     getPropertyValue('text-underline-width');
 
   /** Sets the value of "text-underline-width" */
-  void set textUnderlineWidth(var value) {
+  void set textUnderlineWidth(String value) {
     setProperty('text-underline-width', value, '');
   }
 
@@ -2551,7 +2911,7 @@
     getPropertyValue('top');
 
   /** Sets the value of "top" */
-  void set top(var value) {
+  void set top(String value) {
     setProperty('top', value, '');
   }
 
@@ -2560,7 +2920,7 @@
     getPropertyValue('${_browserPrefix}transform');
 
   /** Sets the value of "transform" */
-  void set transform(var value) {
+  void set transform(String value) {
     setProperty('${_browserPrefix}transform', value, '');
   }
 
@@ -2569,7 +2929,7 @@
     getPropertyValue('${_browserPrefix}transform-origin');
 
   /** Sets the value of "transform-origin" */
-  void set transformOrigin(var value) {
+  void set transformOrigin(String value) {
     setProperty('${_browserPrefix}transform-origin', value, '');
   }
 
@@ -2578,7 +2938,7 @@
     getPropertyValue('${_browserPrefix}transform-origin-x');
 
   /** Sets the value of "transform-origin-x" */
-  void set transformOriginX(var value) {
+  void set transformOriginX(String value) {
     setProperty('${_browserPrefix}transform-origin-x', value, '');
   }
 
@@ -2587,7 +2947,7 @@
     getPropertyValue('${_browserPrefix}transform-origin-y');
 
   /** Sets the value of "transform-origin-y" */
-  void set transformOriginY(var value) {
+  void set transformOriginY(String value) {
     setProperty('${_browserPrefix}transform-origin-y', value, '');
   }
 
@@ -2596,7 +2956,7 @@
     getPropertyValue('${_browserPrefix}transform-origin-z');
 
   /** Sets the value of "transform-origin-z" */
-  void set transformOriginZ(var value) {
+  void set transformOriginZ(String value) {
     setProperty('${_browserPrefix}transform-origin-z', value, '');
   }
 
@@ -2605,7 +2965,7 @@
     getPropertyValue('${_browserPrefix}transform-style');
 
   /** Sets the value of "transform-style" */
-  void set transformStyle(var value) {
+  void set transformStyle(String value) {
     setProperty('${_browserPrefix}transform-style', value, '');
   }
 
@@ -2614,7 +2974,7 @@
     getPropertyValue('${_browserPrefix}transition');
 
   /** Sets the value of "transition" */
-  void set transition(var value) {
+  void set transition(String value) {
     setProperty('${_browserPrefix}transition', value, '');
   }
 
@@ -2623,7 +2983,7 @@
     getPropertyValue('${_browserPrefix}transition-delay');
 
   /** Sets the value of "transition-delay" */
-  void set transitionDelay(var value) {
+  void set transitionDelay(String value) {
     setProperty('${_browserPrefix}transition-delay', value, '');
   }
 
@@ -2632,7 +2992,7 @@
     getPropertyValue('${_browserPrefix}transition-duration');
 
   /** Sets the value of "transition-duration" */
-  void set transitionDuration(var value) {
+  void set transitionDuration(String value) {
     setProperty('${_browserPrefix}transition-duration', value, '');
   }
 
@@ -2641,7 +3001,7 @@
     getPropertyValue('${_browserPrefix}transition-property');
 
   /** Sets the value of "transition-property" */
-  void set transitionProperty(var value) {
+  void set transitionProperty(String value) {
     setProperty('${_browserPrefix}transition-property', value, '');
   }
 
@@ -2650,7 +3010,7 @@
     getPropertyValue('${_browserPrefix}transition-timing-function');
 
   /** Sets the value of "transition-timing-function" */
-  void set transitionTimingFunction(var value) {
+  void set transitionTimingFunction(String value) {
     setProperty('${_browserPrefix}transition-timing-function', value, '');
   }
 
@@ -2659,7 +3019,7 @@
     getPropertyValue('unicode-bidi');
 
   /** Sets the value of "unicode-bidi" */
-  void set unicodeBidi(var value) {
+  void set unicodeBidi(String value) {
     setProperty('unicode-bidi', value, '');
   }
 
@@ -2668,7 +3028,7 @@
     getPropertyValue('unicode-range');
 
   /** Sets the value of "unicode-range" */
-  void set unicodeRange(var value) {
+  void set unicodeRange(String value) {
     setProperty('unicode-range', value, '');
   }
 
@@ -2677,7 +3037,7 @@
     getPropertyValue('${_browserPrefix}user-drag');
 
   /** Sets the value of "user-drag" */
-  void set userDrag(var value) {
+  void set userDrag(String value) {
     setProperty('${_browserPrefix}user-drag', value, '');
   }
 
@@ -2686,7 +3046,7 @@
     getPropertyValue('${_browserPrefix}user-modify');
 
   /** Sets the value of "user-modify" */
-  void set userModify(var value) {
+  void set userModify(String value) {
     setProperty('${_browserPrefix}user-modify', value, '');
   }
 
@@ -2695,16 +3055,25 @@
     getPropertyValue('${_browserPrefix}user-select');
 
   /** Sets the value of "user-select" */
-  void set userSelect(var value) {
+  void set userSelect(String value) {
     setProperty('${_browserPrefix}user-select', value, '');
   }
 
+  /** Gets the value of "user-zoom" */
+  String get userZoom =>
+    getPropertyValue('user-zoom');
+
+  /** Sets the value of "user-zoom" */
+  void set userZoom(String value) {
+    setProperty('user-zoom', value, '');
+  }
+
   /** Gets the value of "vertical-align" */
   String get verticalAlign =>
     getPropertyValue('vertical-align');
 
   /** Sets the value of "vertical-align" */
-  void set verticalAlign(var value) {
+  void set verticalAlign(String value) {
     setProperty('vertical-align', value, '');
   }
 
@@ -2713,7 +3082,7 @@
     getPropertyValue('visibility');
 
   /** Sets the value of "visibility" */
-  void set visibility(var value) {
+  void set visibility(String value) {
     setProperty('visibility', value, '');
   }
 
@@ -2722,7 +3091,7 @@
     getPropertyValue('white-space');
 
   /** Sets the value of "white-space" */
-  void set whiteSpace(var value) {
+  void set whiteSpace(String value) {
     setProperty('white-space', value, '');
   }
 
@@ -2731,7 +3100,7 @@
     getPropertyValue('widows');
 
   /** Sets the value of "widows" */
-  void set widows(var value) {
+  void set widows(String value) {
     setProperty('widows', value, '');
   }
 
@@ -2740,7 +3109,7 @@
     getPropertyValue('width');
 
   /** Sets the value of "width" */
-  void set width(var value) {
+  void set width(String value) {
     setProperty('width', value, '');
   }
 
@@ -2749,7 +3118,7 @@
     getPropertyValue('word-break');
 
   /** Sets the value of "word-break" */
-  void set wordBreak(var value) {
+  void set wordBreak(String value) {
     setProperty('word-break', value, '');
   }
 
@@ -2758,7 +3127,7 @@
     getPropertyValue('word-spacing');
 
   /** Sets the value of "word-spacing" */
-  void set wordSpacing(var value) {
+  void set wordSpacing(String value) {
     setProperty('word-spacing', value, '');
   }
 
@@ -2767,17 +3136,35 @@
     getPropertyValue('word-wrap');
 
   /** Sets the value of "word-wrap" */
-  void set wordWrap(var value) {
+  void set wordWrap(String value) {
     setProperty('word-wrap', value, '');
   }
 
-  /** Gets the value of "wrap-shape" */
-  String get wrapShape =>
-    getPropertyValue('${_browserPrefix}wrap-shape');
+  /** Gets the value of "wrap" */
+  String get wrap =>
+    getPropertyValue('${_browserPrefix}wrap');
 
-  /** Sets the value of "wrap-shape" */
-  void set wrapShape(var value) {
-    setProperty('${_browserPrefix}wrap-shape', value, '');
+  /** Sets the value of "wrap" */
+  void set wrap(String value) {
+    setProperty('${_browserPrefix}wrap', value, '');
+  }
+
+  /** Gets the value of "wrap-flow" */
+  String get wrapFlow =>
+    getPropertyValue('${_browserPrefix}wrap-flow');
+
+  /** Sets the value of "wrap-flow" */
+  void set wrapFlow(String value) {
+    setProperty('${_browserPrefix}wrap-flow', value, '');
+  }
+
+  /** Gets the value of "wrap-through" */
+  String get wrapThrough =>
+    getPropertyValue('${_browserPrefix}wrap-through');
+
+  /** Sets the value of "wrap-through" */
+  void set wrapThrough(String value) {
+    setProperty('${_browserPrefix}wrap-through', value, '');
   }
 
   /** Gets the value of "writing-mode" */
@@ -2785,7 +3172,7 @@
     getPropertyValue('${_browserPrefix}writing-mode');
 
   /** Sets the value of "writing-mode" */
-  void set writingMode(var value) {
+  void set writingMode(String value) {
     setProperty('${_browserPrefix}writing-mode', value, '');
   }
 
@@ -2794,7 +3181,7 @@
     getPropertyValue('z-index');
 
   /** Sets the value of "z-index" */
-  void set zIndex(var value) {
+  void set zIndex(String value) {
     setProperty('z-index', value, '');
   }
 
@@ -2803,7 +3190,7 @@
     getPropertyValue('zoom');
 
   /** Sets the value of "zoom" */
-  void set zoom(var value) {
+  void set zoom(String value) {
     setProperty('zoom', value, '');
   }
 }
diff --git a/sdk/lib/html/templates/html/impl/impl_DocumentFragment.darttemplate b/sdk/lib/html/templates/html/impl/impl_DocumentFragment.darttemplate
index c32a8fb..2106a73 100644
--- a/sdk/lib/html/templates/html/impl/impl_DocumentFragment.darttemplate
+++ b/sdk/lib/html/templates/html/impl/impl_DocumentFragment.darttemplate
@@ -26,24 +26,35 @@
       _$(CLASSNAME)FactoryProvider.createDocumentFragment_html(html);
 
   factory $CLASSNAME.svg(String svgContent) =>
-      new _$(CLASSNAME)FactoryProvider.createDocumentFragment_svg(svgContent);
+      _$(CLASSNAME)FactoryProvider.createDocumentFragment_svg(svgContent);
 
-  List<Element> _elements;
-
-  List<Element> get elements {
-    if (_elements == null) {
-      _elements = new FilteredElementList(this);
-    }
-    return _elements;
-  }
+  List<Element> get elements => this.children;
 
   // TODO: The type of value should be Collection<Element>. See http://b/5392897
   void set elements(value) {
+    this.children = value;
+  }
+
+$if DART2JS
+  // Native field is used only by Dart code so does not lead to instantiation
+  // of native classes
+  @Creates('Null')
+$endif
+  List<Element> _children;
+
+  List<Element> get children {
+    if (_children == null) {
+      _children = new FilteredElementList(this);
+    }
+    return _children;
+  }
+
+  void set children(Collection<Element> value) {
     // Copy list first since we don't want liveness during iteration.
     List copy = new List.from(value);
-    final elements = this.elements;
-    elements.clear();
-    elements.addAll(copy);
+    var children = this.children;
+    children.clear();
+    children.addAll(copy);
   }
 
   Element query(String selectors) => $dom_querySelector(selectors);
diff --git a/sdk/lib/html/templates/html/impl/impl_Element.darttemplate b/sdk/lib/html/templates/html/impl/impl_Element.darttemplate
index 34d2d95..bf6e19a 100644
--- a/sdk/lib/html/templates/html/impl/impl_Element.darttemplate
+++ b/sdk/lib/html/templates/html/impl/impl_Element.darttemplate
@@ -145,6 +145,11 @@
     return result;
   }
 
+  Element get first {
+    return _element.$dom_firstElementChild;
+  }
+
+
   Element get last {
     return _element.$dom_lastElementChild;
   }
@@ -159,10 +164,6 @@
 
   _FrozenElementList._wrap(this._nodeList);
 
-  Element get first {
-    return _nodeList[0];
-  }
-
   bool contains(Element element) {
     for (Element el in this) {
       if (el == element) return true;
@@ -271,6 +272,8 @@
     throw new UnsupportedError('');
   }
 
+  Element get first => _nodeList.first;
+
   Element get last => _nodeList.last;
 }
 
@@ -298,16 +301,7 @@
   bool get hasNext => _index < _list.length;
 }
 
-/**
- * All your attribute manipulation needs in one place.
- * Extends the regular Map interface by automatically coercing non-string
- * values to strings.
- */
-abstract class AttributeMap implements Map<String, String> {
-  void operator []=(String key, value);
-}
-
-class _ElementAttributeMap extends AttributeMap {
+class _ElementAttributeMap implements Map<String, String> {
 
   final Element _element;
 
@@ -402,7 +396,7 @@
  * Provides a Map abstraction on top of data-* attributes, similar to the
  * dataSet in the old DOM.
  */
-class _DataAttributeMap extends AttributeMap {
+class _DataAttributeMap implements Map<String, String> {
 
   final Map<String, String> $dom_attributes;
 
@@ -515,7 +509,7 @@
   String toString() => "($left, $top, $width, $height)";
 }
 
-class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
+abstract class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
 
   factory $CLASSNAME.html(String html) =>
       _$(CLASSNAME)FactoryProvider.createElement_html(html);
@@ -526,7 +520,7 @@
    * @domName Element.hasAttribute, Element.getAttribute, Element.setAttribute,
    *   Element.removeAttribute
    */
-  _ElementAttributeMap get attributes => new _ElementAttributeMap(this);
+  Map<String, String> get attributes => new _ElementAttributeMap(this);
 
   void set attributes(Map<String, String> value) {
     Map<String, String> attributes = this.attributes;
@@ -537,16 +531,27 @@
   }
 
   void set elements(Collection<Element> value) {
-    final elements = this.elements;
-    elements.clear();
-    elements.addAll(value);
+    this.children = value;
   }
 
   /**
+   * Deprecated, use [children] instead.
+   */
+  List<Element> get elements => this.children;
+
+  /**
    * @domName childElementCount, firstElementChild, lastElementChild,
    *   children, Node.nodes.add
    */
-  List<Element> get elements => new _ChildrenElementList._wrap(this);
+  List<Element> get children => new _ChildrenElementList._wrap(this);
+
+  void set children(Collection<Element> value) {
+    // Copy list first since we don't want liveness during iteration.
+    List copy = new List.from(value);
+    var children = this.children;
+    children.clear();
+    children.addAll(copy);
+  }
 
   Element query(String selectors) => $dom_querySelector(selectors);
 
@@ -612,6 +617,9 @@
    * [wc]: http://dvcs.w3.org/hg/webcomponents/raw-file/tip/explainer/index.html
    * [x-tags]: http://x-tags.org/
    */
+$if DART2JS
+  @Creates('Null')  // Set from Dart code; does not instantiate a native type.
+$endif
   var xtag;
 
 $if DARTIUM
@@ -736,15 +744,15 @@
     temp.innerHTML = html;
 
     Element element;
-    if (temp.elements.length == 1) {
-      element = temp.elements[0];
-    } else if (parentTag == 'html' && temp.elements.length == 2) {
+    if (temp.children.length == 1) {
+      element = temp.children[0];
+    } else if (parentTag == 'html' && temp.children.length == 2) {
       // Work around for edge case in WebKit and possibly other browsers where
       // both body and head elements are created even though the inner html
       // only contains a head or body element.
-      element = temp.elements[tag == 'head' ? 0 : 1];
+      element = temp.children[tag == 'head' ? 0 : 1];
     } else {
-      throw new ArgumentError('HTML had ${temp.elements.length} '
+      throw new ArgumentError('HTML had ${temp.children.length} '
           'top level elements but 1 expected');
     }
     element.remove();
diff --git a/sdk/lib/html/templates/html/impl/impl_HttpRequest.darttemplate b/sdk/lib/html/templates/html/impl/impl_HttpRequest.darttemplate
index 6ec0f16..213f434 100644
--- a/sdk/lib/html/templates/html/impl/impl_HttpRequest.darttemplate
+++ b/sdk/lib/html/templates/html/impl/impl_HttpRequest.darttemplate
@@ -5,11 +5,13 @@
 part of html;
 
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
-  factory $CLASSNAME.get(String url, onSuccess($CLASSNAME request)) =>
-      _$(CLASSNAME)FactoryProvider.create$(CLASSNAME)_get(url, onSuccess);
+  factory $CLASSNAME.get(String url, onComplete($CLASSNAME request)) =>
+      _$(CLASSNAME)FactoryProvider.create$(CLASSNAME)_get(url, onComplete);
 
-  factory $CLASSNAME.getWithCredentials(String url, onSuccess($CLASSNAME request)) =>
-      _$(CLASSNAME)FactoryProvider.create$(CLASSNAME)getWithCredentials(url, onSuccess);
+  factory $CLASSNAME.getWithCredentials(String url,
+      onComplete($CLASSNAME request)) =>
+      _$(CLASSNAME)FactoryProvider.create$(CLASSNAME)_getWithCredentials(url,
+      onComplete);
 
 $!MEMBERS
 }
diff --git a/sdk/lib/html/templates/html/impl/impl_Node.darttemplate b/sdk/lib/html/templates/html/impl/impl_Node.darttemplate
index e15cb46..cf46de2 100644
--- a/sdk/lib/html/templates/html/impl/impl_Node.darttemplate
+++ b/sdk/lib/html/templates/html/impl/impl_Node.darttemplate
@@ -65,7 +65,7 @@
   Collection map(f(Node element)) => _Collections.map(this, [], f);
 
   Collection<Node> filter(bool f(Node element)) =>
-     new _NodeListWrapper(_Collections.filter(this, <Node>[], f));
+     _Collections.filter(this, <Node>[], f);
 
   bool every(bool f(Node element)) => _Collections.every(this, f);
 
@@ -101,7 +101,7 @@
         "Cannot insertRange on immutable List.");
   }
   List<Node> getRange(int start, int rangeLength) =>
-    new _NodeListWrapper(_Lists.getRange(this, start, rangeLength, <Node>[]));
+      _Lists.getRange(this, start, rangeLength, <Node>[]);
 
   // -- end List<Node> mixins.
 
diff --git a/sdk/lib/html/templates/html/impl/impl_NodeList.darttemplate b/sdk/lib/html/templates/html/impl/impl_NodeList.darttemplate
deleted file mode 100644
index 95bbddc..0000000
--- a/sdk/lib/html/templates/html/impl/impl_NodeList.darttemplate
+++ /dev/null
@@ -1,179 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of html;
-
-// TODO(nweiz): when all implementations we target have the same name for the
-// implementation of List<E>, extend that rather than wrapping.
-class _ListWrapper<E> implements List<E> {
-  List _list;
-
-  _ListWrapper(List this._list);
-
-  Iterator<E> iterator() => _list.iterator();
-
-  bool contains(E element) => _list.contains(element);
-
-  void forEach(void f(E element)) => _list.forEach(f);
-
-  Collection map(f(E element)) => _list.map(f);
-
-  List<E> filter(bool f(E element)) => _list.filter(f);
-
-  bool every(bool f(E element)) => _list.every(f);
-
-  bool some(bool f(E element)) => _list.some(f);
-
-  bool get isEmpty => _list.isEmpty;
-
-  int get length => _list.length;
-
-  E operator [](int index) => _list[index];
-
-  void operator []=(int index, E value) { _list[index] = value; }
-
-  void set length(int newLength) { _list.length = newLength; }
-
-  void add(E value) => _list.add(value);
-
-  void addLast(E value) => _list.addLast(value);
-
-  void addAll(Collection<E> collection) => _list.addAll(collection);
-
-  void sort([Comparator<E> compare = Comparable.compare]) => _list.sort(compare);
-
-  int indexOf(E element, [int start = 0]) => _list.indexOf(element, start);
-
-  int lastIndexOf(E element, [int start = 0]) =>
-    _list.lastIndexOf(element, start);
-
-  void clear() => _list.clear();
-
-  E removeLast() => _list.removeLast();
-
-  E get last => _list.last;
-
-  List<E> getRange(int start, int rangeLength) =>
-    _list.getRange(start, rangeLength);
-
-  void setRange(int start, int rangeLength, List<E> from, [int startFrom = 0])
-      => _list.setRange(start, rangeLength, from, startFrom);
-
-  void removeRange(int start, int rangeLength) =>
-    _list.removeRange(start, rangeLength);
-
-  void insertRange(int start, int rangeLength, [E initialValue = null]) =>
-    _list.insertRange(start, rangeLength, initialValue);
-
-  E get first => _list[0];
-}
-
-/**
- * This class is used to insure the results of list operations are NodeLists
- * instead of lists.
- */
-class _NodeListWrapper extends _ListWrapper<Node> implements List {
-  _NodeListWrapper(List list) : super(list);
-
-  List<Node> filter(bool f(Node element)) =>
-    new _NodeListWrapper(_list.filter(f));
-
-  List<Node> getRange(int start, int rangeLength) =>
-    new _NodeListWrapper(_list.getRange(start, rangeLength));
-}
-
-class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
-  Node _parent;
-
-  // -- 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) {
-    _parent.$dom_appendChild(value);
-  }
-
-  void addLast(Node value) {
-    _parent.$dom_appendChild(value);
-  }
-
-  void addAll(Collection<Node> collection) {
-    for (Node node in collection) {
-      _parent.$dom_appendChild(node);
-    }
-  }
-
-  Node removeLast() {
-    final result = this.last;
-    if (result != null) {
-      _parent.$dom_removeChild(result);
-    }
-    return result;
-  }
-
-  void clear() {
-    _parent.text = '';
-  }
-
-  void operator []=(int index, Node value) {
-    _parent.$dom_replaceChild(value, this[index]);
-  }
-
-  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)) =>
-     new _NodeListWrapper(_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 = 0]) =>
-      _Lists.lastIndexOf(this, element, start);
-
-  Node get last => this[length - 1];
-  Node get first => this[0];
-
-  // FIXME: implement thesee.
-  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) =>
-    new _NodeListWrapper(_Lists.getRange(this, start, rangeLength, <Node>[]));
-
-  // -- end List<Node> mixins.
-
-$!MEMBERS
-}
diff --git a/sdk/lib/html/templates/html/impl/impl_Storage.darttemplate b/sdk/lib/html/templates/html/impl/impl_Storage.darttemplate
index 73dea1e..47d10d6 100644
--- a/sdk/lib/html/templates/html/impl/impl_Storage.darttemplate
+++ b/sdk/lib/html/templates/html/impl/impl_Storage.darttemplate
@@ -13,7 +13,7 @@
 
   String operator [](String key) => $dom_getItem(key);
 
-  void operator []=(String key, String value) => $dom_setItem(key, value);
+  void operator []=(String key, String value) { $dom_setItem(key, value); }
 
   String putIfAbsent(String key, String ifAbsent()) {
     if (!containsKey(key)) this[key] = ifAbsent();
diff --git a/sdk/lib/html/templates/html/impl/impl_SVGElement.darttemplate b/sdk/lib/html/templates/html/impl/impl_SvgElement.darttemplate
similarity index 78%
rename from sdk/lib/html/templates/html/impl/impl_SVGElement.darttemplate
rename to sdk/lib/html/templates/html/impl/impl_SvgElement.darttemplate
index 077a8077..1c15a0f 100644
--- a/sdk/lib/html/templates/html/impl/impl_SVGElement.darttemplate
+++ b/sdk/lib/html/templates/html/impl/impl_SvgElement.darttemplate
@@ -53,26 +53,34 @@
     elements.addAll(value);
   }
 
+  List<Element> get children => new FilteredElementList(this);
+
+  void set children(Collection<Element> value) {
+    final children = this.children;
+    children.clear();
+    children.addAll(value);
+  }
+
   String get outerHTML {
     final container = new Element.tag("div");
-    final SVGElement cloned = this.clone(true);
-    container.elements.add(cloned);
+    final SvgElement cloned = this.clone(true);
+    container.children.add(cloned);
     return container.innerHTML;
   }
 
   String get innerHTML {
     final container = new Element.tag("div");
-    final SVGElement cloned = this.clone(true);
-    container.elements.addAll(cloned.elements);
+    final SvgElement cloned = this.clone(true);
+    container.children.addAll(cloned.children);
     return container.innerHTML;
   }
 
   void set innerHTML(String svg) {
     final container = new Element.tag("div");
-    // Wrap the SVG string in <svg> so that SVGElements are created, rather than
+    // Wrap the SVG string in <svg> so that SvgElements are created, rather than
     // HTMLElements.
     container.innerHTML = '<svg version="1.1">$svg</svg>';
-    this.elements = container.elements[0].elements;
+    this.children = container.children[0].children;
   }
 
 $!MEMBERS
diff --git a/sdk/lib/html/templates/html/impl/impl_SVGSVGElement.darttemplate b/sdk/lib/html/templates/html/impl/impl_SvgSvgElement.darttemplate
similarity index 79%
rename from sdk/lib/html/templates/html/impl/impl_SVGSVGElement.darttemplate
rename to sdk/lib/html/templates/html/impl/impl_SvgSvgElement.darttemplate
index c1a8204..2e00aea 100644
--- a/sdk/lib/html/templates/html/impl/impl_SVGSVGElement.darttemplate
+++ b/sdk/lib/html/templates/html/impl/impl_SvgSvgElement.darttemplate
@@ -5,7 +5,7 @@
 part of svg;
 
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
-  factory $CLASSNAME() => _$(CLASSNAME)FactoryProvider.createSVGSVGElement();
+  factory $CLASSNAME() => _$(CLASSNAME)FactoryProvider.createSvgSvgElement();
 
 $!MEMBERS
 }
diff --git a/sdk/lib/html/templates/immutable_list_mixin.darttemplate b/sdk/lib/html/templates/immutable_list_mixin.darttemplate
index b6a4b8b..43479e4 100644
--- a/sdk/lib/html/templates/immutable_list_mixin.darttemplate
+++ b/sdk/lib/html/templates/immutable_list_mixin.darttemplate
@@ -57,6 +57,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  $E get first => this[0];
+
   $E get last => this[length - 1];
 
   $E removeLast() {
diff --git a/sdk/lib/io/file.dart b/sdk/lib/io/file.dart
index 97fc18c..7937aa0 100644
--- a/sdk/lib/io/file.dart
+++ b/sdk/lib/io/file.dart
@@ -214,6 +214,60 @@
   List<String> readAsLinesSync([Encoding encoding = Encoding.UTF_8]);
 
   /**
+   * Write a list of bytes to a file.
+   *
+   * Opens the file, writes the list of bytes to it, and closes the file.
+   * Returns a [:Future<File>:] that completes with this [File] object once
+   * the entire operation has completed.
+   *
+   * By default [writeAsBytes] creates the file for writing and truncates the
+   * file if it already exists. In order to append the bytes to an existing
+   * file pass [:FileMode.APPEND:] as the optional mode parameter.
+   */
+  Future<File> writeAsBytes(List<int> bytes, [FileMode mode = FileMode.WRITE]);
+
+  /**
+   * Synchronously write a list of bytes to a file.
+   *
+   * Opens the file, writes the list of bytes to it and closses the file.
+   *
+   * By default [writeAsBytesSync] creates the file for writing and truncates
+   * the file if it already exists. In order to append the bytes to an existing
+   * file pass [:FileMode.APPEND:] as the optional mode parameter.
+   */
+  void writeAsBytesSync(List<int> bytes, [FileMode mode = FileMode.WRITE]);
+
+  /**
+   * Write a string to a file.
+   *
+   * Opens the file, writes the string in the given encoding, and closes the
+   * file. Returns a [:Future<File>:] that completes with this [File] object
+   * once the entire operation has completed.
+   *
+   * By default [writeAsString] creates the file for writing and truncates the
+   * file if it already exists. In order to append the bytes to an existing
+   * file pass [:FileMode.APPEND:] as the optional mode parameter.
+   */
+  Future<File> writeAsString(String contents,
+                             [Encoding encoding = Encoding.UTF_8,
+                              FileMode mode = FileMode.WRITE]);
+
+  /**
+   * Synchronously write a string to a file.
+   *
+   * Opens the file, writes the string in the given encoding, and closes the
+   * file.
+   *
+   * By default [writeAsStringSync] creates the file for writing and
+   * truncates the file if it already exists. In order to append the bytes
+   * to an existing file pass [:FileMode.APPEND:] as the optional mode
+   * parameter.
+   */
+  void writeAsStringSync(String contents,
+                         [Encoding encoding = Encoding.UTF_8,
+                          FileMode mode = FileMode.WRITE]);
+
+  /**
    * Get the name of the file.
    */
   String get name;
diff --git a/sdk/lib/io/file_impl.dart b/sdk/lib/io/file_impl.dart
index 27bace9..17dc2ab 100644
--- a/sdk/lib/io/file_impl.dart
+++ b/sdk/lib/io/file_impl.dart
@@ -357,7 +357,7 @@
   // Constructor for file.
   _File(String this._name) {
     if (_name is! String) {
-      throw new ArgumentError('${NoSuchMethodError.safeToString(_name)} '
+      throw new ArgumentError('${Error.safeToString(_name)} '
                               'is not a String');
     }
   }
@@ -660,6 +660,52 @@
     return _getDecodedLines(decoder);
   }
 
+  Future<File> writeAsBytes(List<int> bytes,
+                            [FileMode mode = FileMode.WRITE]) {
+    Completer<File> completer = new Completer<File>();
+    try {
+      var stream = openOutputStream(mode);
+      stream.write(bytes);
+      stream.close();
+      stream.onClosed = () {
+        completer.complete(this);
+      };
+      stream.onError = (e) {
+        completer.completeException(e);
+      };
+    } catch (e) {
+      new Timer(0, (t) => completer.completeException(e));
+      return completer.future;
+    }
+    return completer.future;
+  }
+
+  void writeAsBytesSync(List<int> bytes, [FileMode mode = FileMode.WRITE]) {
+    RandomAccessFile opened = openSync(mode);
+    opened.writeListSync(bytes, 0, bytes.length);
+    opened.closeSync();
+  }
+
+  Future<File> writeAsString(String contents,
+                             [FileMode mode = FileMode.WRITE,
+                              Encoding encoding = Encoding.UTF_8]) {
+    try {
+      var data = _StringEncoders.encoder(encoding).encodeString(contents);
+      return writeAsBytes(data, mode);
+    } catch (e) {
+      var completer = new Completer();
+      new Timer(0, (t) => completer.completeException(e));
+      return completer.future;
+    }
+  }
+
+  void writeAsStringSync(String contents,
+                         [FileMode mode = FileMode.WRITE,
+                          Encoding encoding = Encoding.UTF_8]) {
+    var data = _StringEncoders.encoder(encoding).encodeString(contents);
+    writeAsBytesSync(data, mode);
+  }
+
   String get name => _name;
 
   void _ensureFileService() {
diff --git a/sdk/lib/io/http.dart b/sdk/lib/io/http.dart
index 79d16af..2274673 100644
--- a/sdk/lib/io/http.dart
+++ b/sdk/lib/io/http.dart
@@ -117,6 +117,41 @@
    * is 20 minutes.
    */
   set sessionTimeout(int timeout);
+
+  /**
+   * Returns a [:HttpConnectionsInfo:] object with an overview of the
+   * current connection handled by the server.
+   */
+  HttpConnectionsInfo connectionsInfo();
+}
+
+
+/**
+ * Overview information of the [:HttpServer:] socket connections.
+ */
+class HttpConnectionsInfo {
+  /**
+   * Total number of socket connections.
+   */
+  int total = 0;
+
+  /**
+   * Number of active connections where actual request/response
+   * processing is active.
+   */
+  int active = 0;
+
+  /**
+   * Number of idle connections held by clients as persistent connections.
+   */
+  int idle = 0;
+
+  /**
+   * Number of connections which are preparing to close. Note: These
+   * connections are also part of the [:active:] count as they might
+   * still be sending data to the client before finally closing.
+   */
+  int closing = 0;
 }
 
 
@@ -795,9 +830,16 @@
   set findProxy(String f(Uri url));
 
   /**
-   * Shutdown the HTTP client releasing all resources.
+   * Shutdown the HTTP client. If [force] is [:false:] (the default)
+   * the [:HttpClient:] will be kept alive until all active
+   * connections are done. If [force] is [:true:] any active
+   * connections will be closed to immediately release all
+   * resources. These closed connections will receive an [:onError:]
+   * callback to indicate that the client was shutdown. In both cases
+   * trying to establish a new connection after calling [shutdown]
+   * will throw an exception.
    */
-  void shutdown();
+  void shutdown({bool force: false});
 }
 
 
diff --git a/sdk/lib/io/http_impl.dart b/sdk/lib/io/http_impl.dart
index fc69108..c783481 100644
--- a/sdk/lib/io/http_impl.dart
+++ b/sdk/lib/io/http_impl.dart
@@ -11,22 +11,25 @@
 
   void add(_HttpConnectionBase connection) {
     void closeIfDone() {
-      // We only check for write closed here. This means that we are
-      // not waiting for the client to half-close the socket before
-      // fully closing the socket.
-      if (!connection._isWriteClosed) return;
-      _q.remove(connection);
-      connection._socket.close();
-      if (connection.onClosed != null) connection.onClosed();
+      // When either the client has closed or all data has been
+      // written to the client we close the underlying socket
+      // completely.
+      if (connection._isWriteClosed || connection._isReadClosed) {
+        _q.remove(connection);
+        connection._socket.close();
+        if (connection.onClosed != null) connection.onClosed();
+      }
     }
 
-    // If the connection is already fully closed don't insert it into the queue.
+    // If the connection is already fully closed don't insert it into
+    // the queue.
     if (connection._isFullyClosed) {
       connection._socket.close();
       if (connection.onClosed != null) connection.onClosed();
       return;
     }
 
+    connection._state |= _HttpConnectionBase.CLOSING;
     _q.add(connection);
 
     // If output stream is not closed for writing close it now and
@@ -45,10 +48,7 @@
     if (!connection._isReadClosed) {
       connection._socket.onClosed = () {
         connection._state |= _HttpConnectionBase.READ_CLOSED;
-        // This is a nop, as we are not using the read closed
-        // information for anything. For both server and client
-        // connections the inbound message have been read to
-        // completion when the socket enters the close queue.
+        closeIfDone();
       };
     } else {
       connection._socket.onClosed = () { assert(false); };
@@ -59,6 +59,7 @@
 
     // If an error occurs immediately close the socket.
     connection._socket.onError = (e) {
+      connection._state |= _HttpConnectionBase.READ_CLOSED;
       connection._state |= _HttpConnectionBase.WRITE_CLOSED;
       closeIfDone();
     };
@@ -718,17 +719,21 @@
 abstract class _HttpConnectionBase {
   static const int IDLE = 0;
   static const int ACTIVE = 1;
-  static const int REQUEST_DONE = 2;
-  static const int RESPONSE_DONE = 4;
+  static const int CLOSING = 2;
+  static const int REQUEST_DONE = 4;
+  static const int RESPONSE_DONE = 8;
   static const int ALL_DONE = REQUEST_DONE | RESPONSE_DONE;
-  static const int READ_CLOSED = 8;
-  static const int WRITE_CLOSED = 16;
+  static const int READ_CLOSED = 16;
+  static const int WRITE_CLOSED = 32;
   static const int FULLY_CLOSED = READ_CLOSED | WRITE_CLOSED;
 
   _HttpConnectionBase() : hashCode = _nextHashCode {
     _nextHashCode = (_nextHashCode + 1) & 0xFFFFFFF;
   }
 
+  bool get _isIdle => (_state & ACTIVE) == 0;
+  bool get _isActive => (_state & ACTIVE) == ACTIVE;
+  bool get _isClosing => (_state & CLOSING) == CLOSING;
   bool get _isRequestDone => (_state & REQUEST_DONE) == REQUEST_DONE;
   bool get _isResponseDone => (_state & RESPONSE_DONE) == RESPONSE_DONE;
   bool get _isAllDone => (_state & ALL_DONE) == ALL_DONE;
@@ -832,6 +837,7 @@
 
   void _onClosed() {
     _state |= _HttpConnectionBase.READ_CLOSED;
+    _checkDone();
   }
 
   void _onError(e) {
@@ -869,17 +875,20 @@
   }
 
   void _checkDone() {
-    if (_isAllDone) {
-      // If we are done writing the response, and either the client
-      // has closed or the connection is not persistent, we must
-      // close. Also if using HTTP 1.0 and the content length was not
-      // known we must close to indicate end of body.
+    if (_isReadClosed) {
+      // If the client closes the conversation is ended.
+      _server._closeQueue.add(this);
+    } else if (_isAllDone) {
+      // If we are done writing the response, and the connection is
+      // not persistent, we must close. Also if using HTTP 1.0 and the
+      // content length was not known we must close to indicate end of
+      // body.
       bool close =
           !_response.persistentConnection ||
           (_response._protocolVersion == "1.0" && _response._contentLength < 0);
       _request = null;
       _response = null;
-      if (_isReadClosed || close) {
+      if (close) {
         _server._closeQueue.add(this);
       } else {
         _state = _HttpConnectionBase.IDLE;
@@ -1024,6 +1033,21 @@
     return _sessionManagerInstance;
   }
 
+  HttpConnectionsInfo connectionsInfo() {
+    HttpConnectionsInfo result = new HttpConnectionsInfo();
+    result.total = _connections.length;
+    _connections.forEach((_HttpConnection conn) {
+      if (conn._isActive) {
+        result.active++;
+      } else if (conn._isIdle) {
+        result.idle++;
+      } else {
+        assert(result._isClosing);
+        result.closing++;
+      }
+    });
+    return result;
+  }
 
   ServerSocket _server;  // The server listen socket.
   bool _closeServer = false;
@@ -1435,10 +1459,13 @@
 
   void _onClosed() {
     _state |= _HttpConnectionBase.READ_CLOSED;
+    _checkSocketDone();
   }
 
   void _onError(e) {
-    // Socket is closed either due to an error or due to normal socket close.
+    if (_socketConn != null) {
+      _client._closeSocketConnection(_socketConn);
+    }
     if (_onErrorCallback != null) {
       _onErrorCallback(e);
     } else {
@@ -1448,9 +1475,6 @@
     if (_response != null && _response._streamErrorHandler != null) {
        _response._streamErrorHandler(e);
     }
-    if (_socketConn != null) {
-      _client._closeSocketConnection(_socketConn);
-    }
   }
 
   void _onResponseReceived(int statusCode,
@@ -1465,11 +1489,17 @@
   }
 
   void _onDataEnd(bool close) {
-    _response._onDataEnd();
     _state |= _HttpConnectionBase.RESPONSE_DONE;
+    _response._onDataEnd();
     _checkSocketDone();
   }
 
+  void _onClientShutdown() {
+    if (!_isResponseDone) {
+      _onError(new HttpException("Client shutdown"));
+    }
+  }
+
   void set onRequest(void handler(HttpClientRequest request)) {
     _onRequest = handler;
   }
@@ -1523,13 +1553,8 @@
     var redirect = new _RedirectInfo(_response.statusCode, method, url);
     // The actual redirect is postponed until both response and
     // request are done.
-    if (_isAllDone) {
-      _doRedirect(redirect);
-    } else {
-      // Prepare for redirect.
-      assert(_pendingRetry == null);
-      _pendingRedirect = redirect;
-    }
+    assert(_pendingRetry == null);
+    _pendingRedirect = redirect;
   }
 
   List<RedirectInfo> get redirects => _redirects;
@@ -1569,12 +1594,14 @@
     _socket.onClosed = null;
     _socket.onError = null;
     _returnTime = new Date.now();
+    _httpClientConnection = null;
   }
 
   void _close() {
     _socket.onData = null;
     _socket.onClosed = null;
     _socket.onError = null;
+    _httpClientConnection = null;
     _socket.close();
   }
 
@@ -1586,6 +1613,7 @@
   int _port;
   Socket _socket;
   Date _returnTime;
+  HttpClientConnection _httpClientConnection;
 }
 
 class _ProxyConfiguration {
@@ -1705,19 +1733,22 @@
 
   set findProxy(String f(Uri uri)) => _findProxy = f;
 
-  void shutdown() {
-    _closeQueue.shutdown();
+  void shutdown({bool force: false}) {
+    if (force) _closeQueue.shutdown();
     _openSockets.forEach((String key, Queue<_SocketConnection> connections) {
       while (!connections.isEmpty) {
         _SocketConnection socketConn = connections.removeFirst();
         socketConn._socket.close();
       }
     });
-    _activeSockets.forEach((_SocketConnection socketConn) {
-      socketConn._socket.close();
-    });
+    if (force) {
+      _activeSockets.forEach((_SocketConnection socketConn) {
+        socketConn._socket.close();
+        socketConn._httpClientConnection._onClientShutdown();
+      });
+    }
     if (_evictionTimer != null) _cancelEvictionTimer();
-     _shutdown = true;
+    _shutdown = true;
   }
 
   void _cancelEvictionTimer() {
@@ -1743,6 +1774,7 @@
       void _connectionOpened(_SocketConnection socketConn,
                              _HttpClientConnection connection,
                              bool usingProxy) {
+        socketConn._httpClientConnection = connection;
         connection._usingProxy = usingProxy;
         connection._connectionEstablished(socketConn);
         HttpClientRequest request = connection.open(method, url);
@@ -1857,15 +1889,15 @@
   }
 
   void _returnSocketConnection(_SocketConnection socketConn) {
-    // Mark socket as returned to unregister from the old connection.
-    socketConn._markReturned();
-
-    // If the HTTP client is beeing shutdown don't return the connection.
+    // If the HTTP client is being shutdown don't return the connection.
     if (_shutdown) {
-      socketConn._socket.close();
+      socketConn._close();
       return;
     };
 
+    // Mark socket as returned to unregister from the old connection.
+    socketConn._markReturned();
+
     String key = _connectionKey(socketConn._host, socketConn._port);
 
     // Get or create the connection list for this key.
diff --git a/sdk/lib/io/http_parser.dart b/sdk/lib/io/http_parser.dart
index c4e966e..1acd7eb 100644
--- a/sdk/lib/io/http_parser.dart
+++ b/sdk/lib/io/http_parser.dart
@@ -582,6 +582,8 @@
   }
 
   void streamDone() {
+    String type() => _requestParser ? "request" : "response";
+
     // If the connection is idle the HTTP stream is closed.
     if (_state == _State.START) {
       if (_requestParser) {
@@ -589,7 +591,7 @@
       } else {
         error(
             new HttpParserException(
-                "Connection closed before full header was received"));
+                "Connection closed before full ${type()} header was received"));
       }
       return;
     }
@@ -600,7 +602,7 @@
       // throw the error.
       error(
           new HttpParserException(
-              "Connection closed before full header was received"));
+                "Connection closed before full ${type()} header was received"));
       return;
     }
 
@@ -614,7 +616,7 @@
       // throw the error.
       error(
           new HttpParserException(
-              "Connection closed before full body was received"));
+                "Connection closed before full ${type()} body was received"));
     }
   }
 
diff --git a/sdk/lib/io/io.dart b/sdk/lib/io/io.dart
index 82e84b4..7b0fbae 100644
--- a/sdk/lib/io/io.dart
+++ b/sdk/lib/io/io.dart
@@ -49,6 +49,7 @@
 #source('stream_util.dart');
 #source('string_stream.dart');
 #source('timer_impl.dart');
-#source('tls_socket.dart');
+#source('secure_socket.dart');
+#source('secure_server_socket.dart');
 #source('websocket.dart');
 #source('websocket_impl.dart');
diff --git a/sdk/lib/io/iolib_sources.gypi b/sdk/lib/io/iolib_sources.gypi
index 2f5fa01..b4ac1bb 100644
--- a/sdk/lib/io/iolib_sources.gypi
+++ b/sdk/lib/io/iolib_sources.gypi
@@ -35,7 +35,8 @@
     'stream_util.dart',
     'string_stream.dart',
     'timer_impl.dart',
-    'tls_socket.dart',
+    'secure_socket.dart',
+    'secure_server_socket.dart',
     'websocket.dart',
     'websocket_impl.dart',
   ],
diff --git a/sdk/lib/io/secure_server_socket.dart b/sdk/lib/io/secure_server_socket.dart
new file mode 100644
index 0000000..2ab290a
--- /dev/null
+++ b/sdk/lib/io/secure_server_socket.dart
@@ -0,0 +1,77 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+abstract class SecureServerSocket implements ServerSocket {
+  /**
+   * Constructs a new secure server socket, binds it to a given address
+   * and port, and listens on it.  Incoming client connections are
+   * promoted to secure connections, using the server certificate given by
+   * certificate_name.  The bindAddress must be given as a numeric address,
+   * not a host name.  The certificate name is the distinguished name (DN) of
+   * the certificate, such as "CN=localhost" or "CN=myserver.mydomain.com".
+   * The certificate is looked up in the NSS certificate database set by
+   * SecureSocket.setCertificateDatabase.
+   */
+  factory SecureServerSocket(String bindAddress,
+                          int port,
+                          int backlog,
+                          String certificate_name) =>
+      new _SecureServerSocket(bindAddress, port, backlog, certificate_name);
+}
+
+
+class _SecureServerSocket implements SecureServerSocket {
+
+  _SecureServerSocket(String bindAddress,
+                   int port,
+                   int backlog,
+                   String certificate_name) {
+    _socket = new ServerSocket(bindAddress, port, backlog);
+    _socket.onConnection = this._onConnectionHandler;
+    _certificate_name = certificate_name;
+  }
+
+  void set onConnection(void callback(Socket connection)) {
+    _onConnectionCallback = callback;
+  }
+
+  void set onError(void callback(e)) {
+    _socket.onError = callback;
+  }
+
+  /**
+   * Returns the port used by this socket.
+   */
+  int get port => _socket.port;
+
+  /**
+   * Closes the socket.
+   */
+  void close() {
+    _socket.close();
+  }
+
+  void _onConnectionHandler(Socket connection) {
+    if (_onConnectionCallback == null) {
+      connection.close();
+      throw new SocketIOException(
+          "SecureServerSocket with no onConnection callback connected to");
+    }
+    if (_certificate_name == null) {
+      connection.close();
+      throw new SocketIOException(
+          "SecureServerSocket with server certificate not set connected to");
+    }
+    var secure_connection = new _SecureSocket.server(connection.remoteHost,
+                                                  connection.remotePort,
+                                                  connection,
+                                                  _certificate_name);
+    _onConnectionCallback(secure_connection);
+  }
+
+  ServerSocket _socket;
+  var _onConnectionCallback;
+  String _certificate_name;
+}
diff --git a/sdk/lib/io/secure_socket.dart b/sdk/lib/io/secure_socket.dart
new file mode 100644
index 0000000..9efbacb
--- /dev/null
+++ b/sdk/lib/io/secure_socket.dart
@@ -0,0 +1,539 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/**
+ * SecureSocket provides a secure (SSL or TLS) client connection to a server.
+ * The certificate provided by the server is checked
+ * using the certificate database provided in setCertificateDatabase.
+ */
+abstract class SecureSocket implements Socket {
+  /**
+   * Constructs a new secure client socket and connect it to the given
+   * host on the given port. The returned socket is not yet connected
+   * but ready for registration of callbacks.
+   */
+  factory SecureSocket(String host, int port) => new _SecureSocket(host, port);
+
+   /**
+   * Initializes the NSS library with the path to a certificate database
+   * containing root certificates for verifying certificate paths on
+   * client connections, and server certificates to provide on server
+   * connections.  The password argument should be used when creating
+   * secure server sockets, to allow the private key of the server
+   * certificate to be fetched.
+   *
+   * The database should be an NSS certificate database directory
+   * containing a cert9.db file, not a cert8.db file.  This version of
+   * the database can be created using the NSS certutil tool with "sql:" in
+   * front of the absolute path of the database directory, or setting the
+   * environment variable NSS_DEFAULT_DB_TYPE to "sql".
+   */
+  external static void setCertificateDatabase(String certificateDatabase,
+                                              [String password]);
+}
+
+
+class _SecureSocket implements SecureSocket {
+  // Status states
+  static final int NOT_CONNECTED = 200;
+  static final int HANDSHAKE = 201;
+  static final int CONNECTED = 202;
+  static final int CLOSED = 203;
+
+  // Buffer identifiers.
+  // These must agree with those in the native C++ implementation.
+  static final int READ_PLAINTEXT = 0;
+  static final int WRITE_PLAINTEXT = 1;
+  static final int READ_ENCRYPTED = 2;
+  static final int WRITE_ENCRYPTED = 3;
+  static final int NUM_BUFFERS = 4;
+
+  int _count = 0;
+  // Constructs a new secure client socket.
+  factory _SecureSocket(String host, int port) =>
+      new _SecureSocket.internal(host, port, false);
+
+  // Constructs a new secure server socket, with the named server certificate.
+  factory _SecureSocket.server(String host,
+                            int port,
+                            Socket socket,
+                            String certificateName) =>
+      new _SecureSocket.internal(host, port, true, socket, certificateName);
+
+  _SecureSocket.internal(String host,
+                      int port,
+                      bool is_server,
+                      [Socket socket,
+                       String certificateName])
+      : _host = host,
+        _port = port,
+        _socket = socket,
+        _certificateName = certificateName,
+        _is_server = is_server,
+        _secureFilter = new _SecureFilter() {
+    if (_socket == null) {
+      _socket = new Socket(host, port);
+    }
+    _socket.onConnect = _secureConnectHandler;
+    _socket.onData = _secureDataHandler;
+    _socket.onClosed = _secureCloseHandler;
+    _secureFilter.init();
+    _secureFilter.registerHandshakeCompleteCallback(_secureHandshakeCompleteHandler);
+  }
+
+  int get port => _socket.port;
+
+  String get remoteHost => _socket.remoteHost;
+
+  int get remotePort => _socket.remotePort;
+
+  void set onClosed(void callback()) {
+    if (_inputStream != null) {
+      throw new StreamException(
+           "Cannot set close handler when input stream is used");
+    }
+    _onClosed = callback;
+  }
+
+  void set _onClosed(void callback()) {
+    _socketCloseHandler = callback;
+  }
+
+  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");
+    }
+    _onConnect = callback;
+  }
+
+  void set _onConnect(void callback()) {
+    _socketConnectHandler = callback;
+  }
+
+  void set onData(void callback()) {
+    if (_outputStream != null) {
+      throw new StreamException(
+          "Cannot set data handler when input stream is used");
+    }
+    _onData = callback;
+  }
+
+  void set _onData(void callback()) {
+    _socketDataHandler = callback;
+  }
+
+  void set onWrite(void callback()) {
+    if (_outputStream != null) {
+      throw new StreamException(
+          "Cannot set write handler when output stream is used");
+    }
+    _onWrite = callback;
+  }
+
+  void set _onWrite(void callback()) {
+    _socketWriteHandler = callback;
+    // Reset the one-shot onWrite handler.
+    _socket.onWrite = _secureWriteHandler;
+  }
+
+  InputStream get inputStream {
+    if (_inputStream == null) {
+      if (_socketDataHandler != null || _socketCloseHandler != null) {
+        throw new StreamException(
+            "Cannot get input stream when socket handlers are used");
+      }
+      _inputStream = new _SocketInputStream(this);
+    }
+    return _inputStream;
+  }
+
+  OutputStream get outputStream {
+    if (_outputStream == null) {
+      if (_socketConnectHandler != null || _socketWriteHandler != null) {
+        throw new StreamException(
+            "Cannot get output stream when socket handlers are used");
+      }
+      _outputStream = new _SocketOutputStream(this);
+    }
+    return _outputStream;
+  }
+
+  int available() {
+    throw new UnimplementedError("SecureSocket.available not implemented yet");
+  }
+
+  void close([bool halfClose]) {
+    if (halfClose) {
+      _closedWrite = true;
+      _writeEncryptedData();
+      if (_filterWriteEmpty) {
+        _socket.close(true);
+        _socketClosedWrite = true;
+      }
+    } else {
+      _closedWrite = true;
+      _closedRead = true;
+      _socket.close(false);
+      _socketClosedWrite = true;
+      _socketClosedRead = true;
+      _secureFilter.destroy();
+      _secureFilter = null;
+      if (scheduledDataEvent != null) {
+        scheduledDataEvent.cancel();
+      }
+      _status = CLOSED;
+    }
+  }
+
+  void _closeWrite() => close(true);
+
+  List<int> read([int len]) {
+    if (_closedRead) {
+      throw new SocketException("Reading from a closed socket");
+    }
+    if (_status != CONNECTED) {
+      return new List<int>(0);
+    }
+    var buffer = _secureFilter.buffers[READ_PLAINTEXT];
+    _readEncryptedData();
+    int toRead = buffer.length;
+    if (len != null) {
+      if (len is! int || len < 0) {
+        throw new ArgumentError(
+            "Invalid len parameter in SecureSocket.read (len: $len)");
+      }
+      if (len < toRead) {
+        toRead = len;
+      }
+    }
+    List<int> result = buffer.data.getRange(buffer.start, toRead);
+    buffer.advanceStart(toRead);
+    _setHandlersAfterRead();
+    return result;
+  }
+
+  int readList(List<int> data, int offset, int bytes) {
+    if (_closedRead) {
+      throw new SocketException("Reading from a closed socket");
+    }
+    if (offset < 0 || bytes < 0 || offset + bytes > data.length) {
+      throw new ArgumentError(
+          "Invalid offset or bytes in SecureSocket.readList");
+    }
+    if (_status != CONNECTED && _status != CLOSED) {
+      return 0;
+    }
+
+    int bytesRead = 0;
+    var buffer = _secureFilter.buffers[READ_PLAINTEXT];
+    // TODO(whesse): Currently this fails if the if is turned into a while loop.
+    // Fix it so that it can loop and read more than one buffer's worth of data.
+    if (bytes > bytesRead) {
+      _readEncryptedData();
+      if (buffer.length > 0) {
+        int toRead = min(bytes - bytesRead, buffer.length);
+        data.setRange(offset, toRead, buffer.data, buffer.start);
+        buffer.advanceStart(toRead);
+        bytesRead += toRead;
+        offset += toRead;
+      }
+    }
+
+    _setHandlersAfterRead();
+    return bytesRead;
+  }
+
+  // Write the data to the socket, and flush it as much as possible
+  // until it would block.  If the write would block, _writeEncryptedData sets
+  // up handlers to flush the pipeline when possible.
+  int writeList(List<int> data, int offset, int bytes) {
+    if (_closedWrite) {
+      throw new SocketException("Writing to a closed socket");
+    }
+    if (_status != CONNECTED) return 0;
+    var buffer = _secureFilter.buffers[WRITE_PLAINTEXT];
+    if (bytes > buffer.free) {
+      bytes = buffer.free;
+    }
+    if (bytes > 0) {
+      buffer.data.setRange(buffer.start + buffer.length, bytes, data, offset);
+      buffer.length += bytes;
+    }
+    _writeEncryptedData();  // Tries to flush all pipeline stages.
+    return bytes;
+  }
+
+  void _secureConnectHandler() {
+    _connectPending = true;
+    _secureFilter.connect(_host, _port, _is_server, _certificateName);
+    _status = HANDSHAKE;
+    _secureHandshake();
+  }
+
+  void _secureWriteHandler() {
+    _writeEncryptedData();
+    if (_filterWriteEmpty && _closedWrite && !_socketClosedWrite) {
+      _socket.close(true);
+      _sockedClosedWrite = true;
+    }
+    if (_status == HANDSHAKE) {
+      _secureHandshake();
+    } else if (_status == CONNECTED &&
+               _socketWriteHandler != null &&
+               _secureFilter.buffers[WRITE_PLAINTEXT].free > 0) {
+      // We must be able to set onWrite from the onWrite callback.
+      var handler = _socketWriteHandler;
+      // Reset the one-shot handler.
+      _socketWriteHandler = null;
+      handler();
+    }
+  }
+
+  void _secureDataHandler() {
+    if (_status == HANDSHAKE) {
+      _secureHandshake();
+    } else {
+      _writeEncryptedData();  // TODO(whesse): Removing this causes a failure.
+      _readEncryptedData();
+      if (!_filterReadEmpty) {
+        // Call the onData event.
+        if (scheduledDataEvent != null) {
+          scheduledDataEvent.cancel();
+          scheduledDataEvent = null;
+        }
+        if (_socketDataHandler != null) {
+          _socketDataHandler();
+        }
+      }
+    }
+  }
+
+  void _secureCloseHandler() {
+    _socketClosedRead = true;
+    if (_filterReadEmpty) {
+      _closedRead = true;
+      _fireCloseEvent();
+      if (_socketClosedWrite) {
+        _secureFilter.destroy();
+        _secureFilter = null;
+        _status = CLOSED;
+      }
+    }
+  }
+
+  void _secureHandshake() {
+    _readEncryptedData();
+    _secureFilter.handshake();
+    _writeEncryptedData();
+    if (_secureFilter.buffers[WRITE_ENCRYPTED].length > 0) {
+      _socket.onWrite = _secureWriteHandler;
+    }
+  }
+
+  void _secureHandshakeCompleteHandler() {
+    _status = CONNECTED;
+    if (_connectPending && _socketConnectHandler != null) {
+      _connectPending = false;
+      _socketConnectHandler();
+    }
+    if (_socketWriteHandler != null) {
+      _socket.onWrite = _secureWriteHandler;
+    }
+  }
+
+  // True if the underlying socket is closed, the filter has been emptied of
+  // all data, and the close event has been fired.
+  get _closed => _socketClosed && !_fireCloseEventPending;
+
+  void _fireCloseEvent() {
+    if (scheduledDataEvent != null) {
+      scheduledDataEvent.cancel();
+    }
+    if (_socketCloseHandler != null) {
+      _socketCloseHandler();
+    }
+  }
+
+  void _readEncryptedData() {
+    // Read from the socket, and push it through the filter as far as
+    // possible.
+    var encrypted = _secureFilter.buffers[READ_ENCRYPTED];
+    var plaintext = _secureFilter.buffers[READ_PLAINTEXT];
+    bool progress = true;
+    while (progress) {
+      progress = false;
+      // Do not try to read plaintext from the filter while handshaking.
+      if ((_status == CONNECTED) && plaintext.free > 0) {
+        int bytes = _secureFilter.processBuffer(READ_PLAINTEXT);
+        if (bytes > 0) {
+          plaintext.length += bytes;
+          progress = true;
+        }
+      }
+      if (encrypted.length > 0) {
+        int bytes = _secureFilter.processBuffer(READ_ENCRYPTED);
+        if (bytes > 0) {
+          encrypted.advanceStart(bytes);
+          progress = true;
+        }
+      }
+      if (!_socketClosedRead) {
+        int bytes = _socket.readList(encrypted.data,
+                                     encrypted.start + encrypted.length,
+                                     encrypted.free);
+        if (bytes > 0) {
+          encrypted.length += bytes;
+          progress = true;
+        }
+      }
+    }
+    // If there is any data in any stages of the filter, there should
+    // be data in the plaintext buffer after this process.
+    // TODO(whesse): Verify that this is true, and there can be no
+    // partial encrypted block stuck in the secureFilter.
+    _filterReadEmpty = (plaintext.length == 0);
+  }
+
+  void _writeEncryptedData() {
+    if (_socketClosedWrite) return;
+    var encrypted = _secureFilter.buffers[WRITE_ENCRYPTED];
+    var plaintext = _secureFilter.buffers[WRITE_PLAINTEXT];
+    while (true) {
+      if (encrypted.length > 0) {
+        // Write from the filter to the socket.
+        int bytes = _socket.writeList(encrypted.data,
+                                      encrypted.start,
+                                      encrypted.length);
+        if (bytes == 0) {
+          // The socket has blocked while we have data to write.
+          // We must be notified when it becomes unblocked.
+          _socket.onWrite = _secureWriteHandler;
+          _filterWriteEmpty = false;
+          break;
+        }
+        encrypted.advanceStart(bytes);
+      } else {
+        var plaintext = _secureFilter.buffers[WRITE_PLAINTEXT];
+        if (plaintext.length > 0) {
+           int plaintext_bytes = _secureFilter.processBuffer(WRITE_PLAINTEXT);
+           plaintext.advanceStart(plaintext_bytes);
+        }
+        int bytes = _secureFilter.processBuffer(WRITE_ENCRYPTED);
+        if (bytes <= 0) {
+          // We know the WRITE_ENCRYPTED buffer is empty, and the
+          // filter wrote zero bytes to it, so the filter must be empty.
+          // Also, the WRITE_PLAINTEXT buffer must have been empty, or
+          // it would have written to the filter.
+          // TODO(whesse): Verify that the filter works this way.
+          _filterWriteEmpty = true;
+          break;
+        }
+        encrypted.length += bytes;
+      }
+    }
+  }
+
+  /* After a read, the onData handler is enabled to fire again.
+   * We may also have a close event waiting for the SecureFilter to empty.
+   */
+  void _setHandlersAfterRead() {
+    // If the filter is empty, then we are guaranteed an event when it
+    // becomes unblocked.  Cancel any _secureDataHandler call.
+    // Otherwise, schedule a _secureDataHandler call since there may data
+    // available, and this read call enables the data event.
+    if (_filterReadEmpty) {
+      if (scheduledDataEvent != null) {
+        scheduledDataEvent.cancel();
+        scheduledDataEvent = null;
+      }
+    } else if (scheduledDataEvent == null) {
+      scheduledDataEvent = new Timer(0, (_) => _secureDataHandler());
+    }
+
+    if (_socketClosedRead) {  // An onClose event is pending.
+      // _closedRead is false, since we are in a read or readList call.
+      if (!_filterReadEmpty) {
+        // _filterReadEmpty may be out of date since read and readList empty
+        // the plaintext buffer after calling _readEncryptedData.
+        // TODO(whesse): Fix this as part of fixing read and readList.
+        _readEncryptedData();
+      }
+      if (_filterReadEmpty) {
+        // This can't be an else clause: the value of _filterReadEmpty changes.
+        // This must be asynchronous, because we are in a read or readList call.
+        new Timer(0, (_) => _fireCloseEvent());
+      }
+    }
+  }
+
+  bool get _socketClosed => _closedRead;
+
+  // _SecureSocket cannot extend _Socket and use _Socket's factory constructor.
+  Socket _socket;
+  String _host;
+  int _port;
+  bool _is_server;
+  String _certificateName;
+
+  var _status = NOT_CONNECTED;
+  bool _socketClosedRead = false;  // The network socket is closed for reading.
+  bool _socketClosedWrite = false;  // The network socket is closed for writing.
+  bool _closedRead = false;  // The secure socket has fired an onClosed event.
+  bool _closedWrite = false;  // The secure socket has been closed for writing.
+  bool _filterReadEmpty = true;  // There is no buffered data to read.
+  bool _filterWriteEmpty = true;  // There is no buffered data to be written.
+  _SocketInputStream _inputStream;
+  _SocketOutputStream _outputStream;
+  bool _connectPending = false;
+  Function _socketConnectHandler;
+  Function _socketWriteHandler;
+  Function _socketDataHandler;
+  Function _socketCloseHandler;
+  Timer scheduledDataEvent;
+
+  _SecureFilter _secureFilter;
+}
+
+
+class _ExternalBuffer {
+  static final int SIZE = 8 * 1024;
+  _ExternalBuffer() : start = 0, length = 0;
+
+  // TODO(whesse): Consider making this a circular buffer.  Only if it helps.
+  void advanceStart(int numBytes) {
+    start += numBytes;
+    length -= numBytes;
+    if (length == 0) {
+      start = 0;
+    }
+  }
+
+  int get free => SIZE - (start + length);
+
+  List data;  // This will be a ExternalByteArray, backed by C allocated data.
+  int start;
+  int length;
+}
+
+
+abstract class _SecureFilter {
+  external factory _SecureFilter();
+
+  void connect(String hostName,
+               int port,
+               bool is_server,
+               String certificateName);
+  void destroy();
+  void handshake();
+  void init();
+  int processBuffer(int bufferIndex);
+  void registerHandshakeCompleteCallback(Function handshakeCompleteHandler);
+
+  List<_ExternalBuffer> get buffers;
+}
diff --git a/sdk/lib/io/string_stream.dart b/sdk/lib/io/string_stream.dart
index c168153..49302c1 100644
--- a/sdk/lib/io/string_stream.dart
+++ b/sdk/lib/io/string_stream.dart
@@ -268,38 +268,13 @@
   static int _encodingSize(String string) => _encodeString(string, null);
 
   static int _encodeString(String string, List<int> buffer) {
-    int pos = 0;
-    int length = string.length;
-    for (int i = 0; i < length; i++) {
-      int additionalBytes;
-      int charCode = string.charCodeAt(i);
-      if (charCode <= 0x007F) {
-        additionalBytes = 0;
-        if (buffer != null) buffer[pos] = charCode;
-      } else if (charCode <= 0x07FF) {
-        // 110xxxxx (xxxxx is top 5 bits).
-        if (buffer != null) buffer[pos] = ((charCode >> 6) & 0x1F) | 0xC0;
-        additionalBytes = 1;
-      } else if (charCode <= 0xFFFF) {
-        // 1110xxxx (xxxx is top 4 bits)
-        if (buffer != null) buffer[pos] = ((charCode >> 12) & 0x0F)| 0xE0;
-        additionalBytes = 2;
-      } else {
-        // 11110xxx (xxx is top 3 bits)
-        if (buffer != null) buffer[pos] = ((charCode >> 18) & 0x07) | 0xF0;
-        additionalBytes = 3;
-      }
-      pos++;
-      if (buffer != null) {
-        for (int i = additionalBytes; i > 0; i--) {
-          // 10xxxxxx (xxxxxx is next 6 bits from the top).
-          buffer[pos++] = ((charCode >> (6 * (i - 1))) & 0x3F) | 0x80;
-        }
-      } else {
-        pos += additionalBytes;
+    List<int> utf8CodeUnits = encodeUtf8(string);
+    if (buffer != null) {
+      for (int i = 0; i < utf8CodeUnits.length; i++) {
+        buffer[i] = utf8CodeUnits[i];
       }
     }
-    return pos;
+    return utf8CodeUnits.length;
   }
 }
 
diff --git a/sdk/lib/io/tls_socket.dart b/sdk/lib/io/tls_socket.dart
deleted file mode 100644
index 44551b5..0000000
--- a/sdk/lib/io/tls_socket.dart
+++ /dev/null
@@ -1,373 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/**
- * TlsSocket provides a secure (SSL or TLS) client connection to a server.
- * The certificate provided by the server is checked
- * using the certificate database provided in setCertificateDatabase.
- */
-abstract class TlsSocket implements Socket {
-  /**
-   * Constructs a new secure socket and connect it to the given
-   * host on the given port. The returned socket is not yet connected
-   * but ready for registration of callbacks.
-   */
-  factory TlsSocket(String host, int port) => new _TlsSocket(host, port);
-
-  /**
-   * Initializes the TLS library with the path to a certificate database
-   * containing root certificates for verifying certificate paths on
-   * client connections, and server certificates to provide on server
-   * connections.
-   */
-  external static void setCertificateDatabase(String pkcertDirectory);
-}
-
-
-class _TlsSocket implements TlsSocket {
-  // Status states
-  static final int NOT_CONNECTED = 200;
-  static final int HANDSHAKE = 201;
-  static final int CONNECTED = 202;
-  static final int CLOSED = 203;
-
-  // Buffer identifiers.
-  // These must agree with those in the native C++ implementation.
-  static final int READ_PLAINTEXT = 0;
-  static final int WRITE_PLAINTEXT = 1;
-  static final int READ_ENCRYPTED = 2;
-  static final int WRITE_ENCRYPTED = 3;
-  static final int NUM_BUFFERS = 4;
-
-  int _count = 0;
-  // Constructs a new secure client socket.
-  _TlsSocket(String host, int port)
-      : _host = host,
-        _port = port,
-        _socket = new Socket(host, port),
-        _tlsFilter = new _TlsFilter() {
-    _socket.onConnect = _tlsConnectHandler;
-    _socket.onData = _tlsDataHandler;
-    _socket.onClosed = _tlsCloseHandler;
-    _tlsFilter.init();
-    _tlsFilter.registerHandshakeCompleteCallback(_tlsHandshakeCompleteHandler);
-  }
-
-  InputStream get inputStream {
-    // TODO(6701): Implement stream interfaces on TlsSocket.
-    throw new UnimplementedError("TlsSocket.inputStream not implemented yet");
-  }
-
-  int get port => _socket.port;
-
-  String get remoteHost => _socket.remoteHost;
-
-  int get remotePort => _socket.remotePort;
-
-  void set onClosed(void callback()) {
-    _socketCloseHandler = callback;
-  }
-
-  void set onConnect(void callback()) {
-    _socketConnectHandler = callback;
-  }
-
-  void set onData(void callback()) {
-    _socketDataHandler = callback;
-  }
-
-  void set onWrite(void callback()) {
-    _socketWriteHandler = callback;
-    // Reset the one-shot onWrite handler.
-    _socket.onWrite = _tlsWriteHandler;
-  }
-
-  OutputStream get outputStream {
-    // TODO(6701): Implement stream interfaces on TlsSocket.
-    throw new UnimplementedError("TlsSocket.inputStream not implemented yet");
-  }
-
-  int available() {
-    throw new UnimplementedError("TlsSocket.available not implemented yet");
-  }
-
-  void close([bool halfClose]) {
-    _socket.close(halfClose);
-  }
-
-  List<int> read([int len]) {
-    var buffer = _tlsFilter.buffers[READ_PLAINTEXT];
-    _readEncryptedData();
-    int toRead = buffer.length;
-    if (len != null) {
-      if (len is! int || len < 0) {
-        throw new ArgumentError(
-            "Invalid len parameter in TlsSocket.read (len: $len)");
-      }
-      if (len < toRead) {
-        toRead = len;
-      }
-    }
-    List<int> result = buffer.data.getRange(buffer.start, toRead);
-    buffer.advanceStart(toRead);
-    _setHandlersAfterRead();
-    return result;
-  }
-
-  int readList(List<int> data, int offset, int bytes) {
-    if (offset < 0 || bytes < 0 || offset + bytes > data.length) {
-      throw new ArgumentError(
-          "Invalid offset or bytes in TlsSocket.readList");
-    }
-
-    int bytesRead = 0;
-    var buffer = _tlsFilter.buffers[READ_PLAINTEXT];
-    // TODO(whesse): Currently this fails if the if is turned into a while loop.
-    // Fix it so that it can loop and read more than one buffer's worth of data.
-    if (bytes > bytesRead) {
-      _readEncryptedData();
-      if (buffer.length > 0) {
-        int toRead = min(bytes - bytesRead, buffer.length);
-        data.setRange(offset, toRead, buffer.data, buffer.start);
-        buffer.advanceStart(toRead);
-        bytesRead += toRead;
-        offset += toRead;
-      }
-    }
-
-    _setHandlersAfterRead();
-    return bytesRead;
-  }
-
-  // Write the data to the socket, and flush it as much as possible
-  // until it would block.  If the write would block, _writeEncryptedData sets
-  // up handlers to flush the pipeline when possible.
-  int writeList(List<int> data, int offset, int bytes) {
-    var buffer = _tlsFilter.buffers[WRITE_PLAINTEXT];
-    if (bytes > buffer.free) {
-      bytes = buffer.free;
-    }
-    if (bytes > 0) {
-      buffer.data.setRange(buffer.start + buffer.length, bytes, data, offset);
-      buffer.length += bytes;
-    }
-    _writeEncryptedData();  // Tries to flush all pipeline stages.
-    return bytes;
-  }
-
-  void _tlsConnectHandler() {
-    _connectPending = true;
-    _tlsFilter.connect(_host, _port);
-    _status = HANDSHAKE;
-    _tlsHandshake();
-  }
-
-  void _tlsWriteHandler() {
-    if (_status == HANDSHAKE) {
-      _tlsHandshake();
-    } else if (_status == CONNECTED) {
-      if (_socketWriteHandler != null) {
-        _socketWriteHandler();
-      }
-    }
-  }
-
-  void _tlsDataHandler() {
-    if (_status == HANDSHAKE) {
-      _tlsHandshake();
-    } else {
-      _writeEncryptedData();  // TODO(whesse): Removing this causes a failure.
-      _readEncryptedData();
-      var buffer = _tlsFilter.buffers[READ_PLAINTEXT];
-      if (_filterEmpty) {
-        if (_fireCloseEventPending) {
-          _fireCloseEvent();
-        }
-      } else {  // Filter is not empty.
-        if (scheduledDataEvent != null) {
-          scheduledDataEvent.cancel();
-          scheduledDataEvent = null;
-        }
-        if (_socketDataHandler != null) {
-          _socketDataHandler();
-        }
-      }
-    }
-  }
-
-  void _tlsCloseHandler() {
-    _socketClosed = true;
-    _status = CLOSED;
-    _socket.close();
-    if (_filterEmpty) {
-      _fireCloseEvent();
-    } else {
-      _fireCloseEventPending = true;
-    }
-  }
-
-  void _tlsHandshake() {
-      _readEncryptedData();
-      _tlsFilter.handshake();
-      _writeEncryptedData();
-      if (_tlsFilter.buffers[WRITE_ENCRYPTED].length > 0) {
-        _socket.onWrite = _tlsWriteHandler;
-      }
-  }
-
-  void _tlsHandshakeCompleteHandler() {
-    _status = CONNECTED;
-    if (_connectPending && _socketConnectHandler != null) {
-      _connectPending = false;
-      _socketConnectHandler();
-    }
-  }
-
-  void _fireCloseEvent() {
-    _fireCloseEventPending = false;
-    _tlsFilter.destroy();
-    _tlsFilter = null;
-    if (scheduledDataEvent != null) {
-      scheduledDataEvent.cancel();
-    }
-    if (_socketCloseHandler != null) {
-      _socketCloseHandler();
-    }
-  }
-
-  void _readEncryptedData() {
-    // Read from the socket, and push it through the filter as far as
-    // possible.
-    var encrypted = _tlsFilter.buffers[READ_ENCRYPTED];
-    var plaintext = _tlsFilter.buffers[READ_PLAINTEXT];
-    bool progress = true;
-    while (progress) {
-      progress = false;
-      // Do not try to read plaintext from the filter while handshaking.
-      if ((_status == CONNECTED || _status == CLOSED) && plaintext.free > 0) {
-        int bytes = _tlsFilter.processBuffer(READ_PLAINTEXT);
-        if (bytes > 0) {
-          plaintext.length += bytes;
-          progress = true;
-        }
-      }
-      if (encrypted.length > 0) {
-        int bytes = _tlsFilter.processBuffer(READ_ENCRYPTED);
-        if (bytes > 0) {
-          encrypted.advanceStart(bytes);
-          progress = true;
-        }
-      }
-      if (!_socketClosed) {
-        int bytes = _socket.readList(encrypted.data,
-                                     encrypted.start + encrypted.length,
-                                     encrypted.free);
-        if (bytes > 0) {
-          encrypted.length += bytes;
-          progress = true;
-        }
-      }
-    }
-    // TODO(whesse): This can be incorrect if there is a partial
-    // encrypted block stuck in the tlsFilter, and no other data.
-    // Fix this - we do need to know when the filter is empty.
-    _filterEmpty = (plaintext.length == 0);
-  }
-
-  void _writeEncryptedData() {
-    // Write from the filter to the socket.
-    var buffer = _tlsFilter.buffers[WRITE_ENCRYPTED];
-    while (true) {
-      if (buffer.length > 0) {
-        int bytes = _socket.writeList(buffer.data, buffer.start, buffer.length);
-        if (bytes == 0) {
-          // The socket has blocked while we have data to write.
-          // We must be notified when it becomes unblocked.
-          _socket.onWrite = _tlsWriteHandler;
-          break;
-        }
-        buffer.advanceStart(bytes);
-      } else {
-        var plaintext = _tlsFilter.buffers[WRITE_PLAINTEXT];
-        if (plaintext.length > 0) {
-           int plaintext_bytes = _tlsFilter.processBuffer(WRITE_PLAINTEXT);
-           plaintext.advanceStart(plaintext_bytes);
-        }
-        int bytes = _tlsFilter.processBuffer(WRITE_ENCRYPTED);
-        if (bytes <= 0) break;
-        buffer.length += bytes;
-      }
-    }
-  }
-
-  /* After a read, the onData handler is enabled to fire again.
-   * We may also have a close event waiting for the TlsFilter to empty.
-   */
-  void _setHandlersAfterRead() {
-    // If the filter is empty, then we are guaranteed an event when it
-    // becomes unblocked.
-    // Otherwise, schedule a _tlsDataHandler call since there may data
-    // available, and this read call enables the data event.
-    if (!_filterEmpty && scheduledDataEvent == null) {
-      scheduledDataEvent = new Timer(0, (_) => _tlsDataHandler());
-    } else if (_filterEmpty && scheduledDataEvent != null) {
-        scheduledDataEvent.cancel();
-        scheduledDataEvent = null;
-    }
-    if (_filterEmpty && _fireCloseEventPending) {
-        _fireCloseEvent();
-    }
-  }
-
-  // _TlsSocket cannot extend _Socket and use _Socket's factory constructor.
-  Socket _socket;
-  String _host;
-  int _port;
-
-  var _status = NOT_CONNECTED;
-  bool _socketClosed = false;
-  bool _filterEmpty = false;
-  bool _connectPending = false;
-  bool _fireCloseEventPending = false;
-  Function _socketConnectHandler;
-  Function _socketWriteHandler;
-  Function _socketDataHandler;
-  Function _socketCloseHandler;
-  Timer scheduledDataEvent;
-
-  _TlsFilter _tlsFilter;
-}
-
-
-class _TlsExternalBuffer {
-  static final int SIZE = 8 * 1024;
-  _TlsExternalBuffer() : start = 0, length = 0;
-
-  // TODO(whesse): Consider making this a circular buffer.  Only if it helps.
-  void advanceStart(int numBytes) {
-    start += numBytes;
-    length -= numBytes;
-    if (length == 0) {
-      start = 0;
-    }
-  }
-
-  int get free => SIZE - (start + length);
-
-  List data;  // This will be a ExternalByteArray, backed by C allocated data.
-  int start;
-  int length;
-}
-
-
-abstract class _TlsFilter {
-  external factory _TlsFilter();
-
-  void connect(String hostName, int port);
-  void destroy();
-  void handshake();
-  void init();
-  int processBuffer(int bufferIndex);
-  void registerHandshakeCompleteCallback(Function handshakeCompleteHandler);
-}
diff --git a/sdk/lib/math/random.dart b/sdk/lib/math/random.dart
index efc5678..bba1867 100644
--- a/sdk/lib/math/random.dart
+++ b/sdk/lib/math/random.dart
@@ -25,16 +25,16 @@
    * Implementation note: The default implementation supports [max] values
    * between 1 and ((1<<32) - 1) inclusive.
    */
-  abstract int nextInt(int max);
+  int nextInt(int max);
 
   /**
    * Generates a positive random floating point value uniformly distributed on
    * the range from 0.0, inclusive, to 1.0, exclusive.
    */
-  abstract double nextDouble();
+  double nextDouble();
 
   /**
    * Generates a random boolean value.
    */
-  abstract bool nextBool();
+  bool nextBool();
 }
diff --git a/sdk/lib/svg/dart2js/svg_dart2js.dart b/sdk/lib/svg/dart2js/svg_dart2js.dart
index ef6935a..d018a6d 100644
--- a/sdk/lib/svg/dart2js/svg_dart2js.dart
+++ b/sdk/lib/svg/dart2js/svg_dart2js.dart
@@ -15,20 +15,20 @@
 
 final _START_TAG_REGEXP = new RegExp('<(\\w+)');
 
-class _SVGElementFactoryProvider {
-  static SVGElement createSVGElement_tag(String tag) {
+class _SvgElementFactoryProvider {
+  static SvgElement createSvgElement_tag(String tag) {
     final Element temp =
       document.$dom_createElementNS("http://www.w3.org/2000/svg", tag);
     return temp;
   }
 
-  static SVGElement createSVGElement_svg(String svg) {
+  static SvgElement createSvgElement_svg(String svg) {
     Element parentTag;
     final match = _START_TAG_REGEXP.firstMatch(svg);
     if (match != null && match.group(1).toLowerCase() == 'svg') {
       parentTag = new Element.tag('div');
     } else {
-      parentTag = new SVGSVGElement();
+      parentTag = new SvgSvgElement();
     }
 
     parentTag.innerHTML = svg;
@@ -40,9 +40,9 @@
   }
 }
 
-class _SVGSVGElementFactoryProvider {
-  static SVGSVGElement createSVGSVGElement() {
-    final el = new SVGElement.tag("svg");
+class _SvgSvgElementFactoryProvider {
+  static SvgSvgElement createSvgSvgElement() {
+    final el = new SvgElement.tag("svg");
     // The SVG spec requires the version attribute to match the spec version
     el.attributes['version'] = "1.1";
     return el;
@@ -53,122 +53,124 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGAElement
-class SVGAElement extends SVGElement implements SVGLangSpace, SVGTests, SVGStylable, SVGURIReference, SVGExternalResourcesRequired, SVGTransformable native "*SVGAElement" {
+/// @domName SVGAElement; @docsEditable true
+class AElement extends SvgElement implements Transformable, Tests, UriReference, Stylable, ExternalResourcesRequired, LangSpace native "*SVGAElement" {
 
-  /** @domName SVGAElement.target */
-  final SVGAnimatedString target;
+  factory AElement() => _SvgElementFactoryProvider.createSvgElement_tag("a");
+
+  /// @domName SVGAElement.target; @docsEditable true
+  final AnimatedString target;
 
   // From SVGExternalResourcesRequired
 
-  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
-  final SVGAnimatedBoolean externalResourcesRequired;
+  /// @domName SVGExternalResourcesRequired.externalResourcesRequired; @docsEditable true
+  final AnimatedBoolean externalResourcesRequired;
 
   // From SVGLangSpace
 
-  /** @domName SVGLangSpace.xmllang */
+  /// @domName SVGLangSpace.xmllang; @docsEditable true
   String xmllang;
 
-  /** @domName SVGLangSpace.xmlspace */
+  /// @domName SVGLangSpace.xmlspace; @docsEditable true
   String xmlspace;
 
   // From SVGLocatable
 
-  /** @domName SVGLocatable.farthestViewportElement */
-  final SVGElement farthestViewportElement;
+  /// @domName SVGLocatable.farthestViewportElement; @docsEditable true
+  final SvgElement farthestViewportElement;
 
-  /** @domName SVGLocatable.nearestViewportElement */
-  final SVGElement nearestViewportElement;
+  /// @domName SVGLocatable.nearestViewportElement; @docsEditable true
+  final SvgElement nearestViewportElement;
 
-  /** @domName SVGLocatable.getBBox */
-  SVGRect getBBox() native;
+  /// @domName SVGLocatable.getBBox; @docsEditable true
+  Rect getBBox() native;
 
-  /** @domName SVGLocatable.getCTM */
-  SVGMatrix getCTM() native;
+  /// @domName SVGLocatable.getCTM; @docsEditable true
+  Matrix getCTM() native;
 
-  /** @domName SVGLocatable.getScreenCTM */
-  SVGMatrix getScreenCTM() native;
+  /// @domName SVGLocatable.getScreenCTM; @docsEditable true
+  Matrix getScreenCTM() native;
 
-  /** @domName SVGLocatable.getTransformToElement */
-  SVGMatrix getTransformToElement(SVGElement element) native;
+  /// @domName SVGLocatable.getTransformToElement; @docsEditable true
+  Matrix getTransformToElement(SvgElement element) native;
 
   // From SVGStylable
 
-  /** @domName SVGStylable.className */
-  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+  /// @domName SVGStylable.className; @docsEditable true
+  AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CSSStyleDeclaration style;
 
-  /** @domName SVGStylable.getPresentationAttribute */
+  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
   CSSValue getPresentationAttribute(String name) native;
 
   // From SVGTests
 
-  /** @domName SVGTests.requiredExtensions */
-  final SVGStringList requiredExtensions;
+  /// @domName SVGTests.requiredExtensions; @docsEditable true
+  final StringList requiredExtensions;
 
-  /** @domName SVGTests.requiredFeatures */
-  final SVGStringList requiredFeatures;
+  /// @domName SVGTests.requiredFeatures; @docsEditable true
+  final StringList requiredFeatures;
 
-  /** @domName SVGTests.systemLanguage */
-  final SVGStringList systemLanguage;
+  /// @domName SVGTests.systemLanguage; @docsEditable true
+  final StringList systemLanguage;
 
-  /** @domName SVGTests.hasExtension */
+  /// @domName SVGTests.hasExtension; @docsEditable true
   bool hasExtension(String extension) native;
 
   // From SVGTransformable
 
-  /** @domName SVGTransformable.transform */
-  final SVGAnimatedTransformList transform;
+  /// @domName SVGTransformable.transform; @docsEditable true
+  final AnimatedTransformList transform;
 
   // From SVGURIReference
 
-  /** @domName SVGURIReference.href */
-  final SVGAnimatedString href;
+  /// @domName SVGURIReference.href; @docsEditable true
+  final AnimatedString href;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGAltGlyphDefElement
-class SVGAltGlyphDefElement extends SVGElement native "*SVGAltGlyphDefElement" {
+/// @domName SVGAltGlyphDefElement; @docsEditable true
+class AltGlyphDefElement extends SvgElement native "*SVGAltGlyphDefElement" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for 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 SVGAltGlyphElement
-class SVGAltGlyphElement extends SVGTextPositioningElement implements SVGURIReference native "*SVGAltGlyphElement" {
+/// @domName SVGAltGlyphElement; @docsEditable true
+class AltGlyphElement extends TextPositioningElement implements UriReference native "*SVGAltGlyphElement" {
 
-  /** @domName SVGAltGlyphElement.format */
+  /// @domName SVGAltGlyphElement.format; @docsEditable true
   String format;
 
-  /** @domName SVGAltGlyphElement.glyphRef */
+  /// @domName SVGAltGlyphElement.glyphRef; @docsEditable true
   String glyphRef;
 
   // From SVGURIReference
 
-  /** @domName SVGURIReference.href */
-  final SVGAnimatedString href;
+  /// @domName SVGURIReference.href; @docsEditable true
+  final AnimatedString href;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGAltGlyphItemElement
-class SVGAltGlyphItemElement extends SVGElement native "*SVGAltGlyphItemElement" {
+/// @domName SVGAltGlyphItemElement; @docsEditable true
+class AltGlyphItemElement extends SvgElement native "*SVGAltGlyphItemElement" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for 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 SVGAngle
-class SVGAngle native "*SVGAngle" {
+/// @domName SVGAngle; @docsEditable true
+class Angle native "*SVGAngle" {
 
   static const int SVG_ANGLETYPE_DEG = 2;
 
@@ -180,22 +182,22 @@
 
   static const int SVG_ANGLETYPE_UNSPECIFIED = 1;
 
-  /** @domName SVGAngle.unitType */
+  /// @domName SVGAngle.unitType; @docsEditable true
   final int unitType;
 
-  /** @domName SVGAngle.value */
+  /// @domName SVGAngle.value; @docsEditable true
   num value;
 
-  /** @domName SVGAngle.valueAsString */
+  /// @domName SVGAngle.valueAsString; @docsEditable true
   String valueAsString;
 
-  /** @domName SVGAngle.valueInSpecifiedUnits */
+  /// @domName SVGAngle.valueInSpecifiedUnits; @docsEditable true
   num valueInSpecifiedUnits;
 
-  /** @domName SVGAngle.convertToSpecifiedUnits */
+  /// @domName SVGAngle.convertToSpecifiedUnits; @docsEditable true
   void convertToSpecifiedUnits(int unitType) native;
 
-  /** @domName SVGAngle.newValueSpecifiedUnits */
+  /// @domName SVGAngle.newValueSpecifiedUnits; @docsEditable true
   void newValueSpecifiedUnits(int unitType, num valueInSpecifiedUnits) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -203,59 +205,67 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGAnimateColorElement
-class SVGAnimateColorElement extends SVGAnimationElement native "*SVGAnimateColorElement" {
+/// @domName SVGAnimateColorElement; @docsEditable true
+class AnimateColorElement extends AnimationElement native "*SVGAnimateColorElement" {
+
+  factory AnimateColorElement() => _SvgElementFactoryProvider.createSvgElement_tag("animateColor");
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for 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 SVGAnimateElement
-class SVGAnimateElement extends SVGAnimationElement native "*SVGAnimateElement" {
+/// @domName SVGAnimateElement; @docsEditable true
+class AnimateElement extends AnimationElement native "*SVGAnimateElement" {
+
+  factory AnimateElement() => _SvgElementFactoryProvider.createSvgElement_tag("animate");
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for 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 SVGAnimateMotionElement
-class SVGAnimateMotionElement extends SVGAnimationElement native "*SVGAnimateMotionElement" {
+/// @domName SVGAnimateMotionElement; @docsEditable true
+class AnimateMotionElement extends AnimationElement native "*SVGAnimateMotionElement" {
+
+  factory AnimateMotionElement() => _SvgElementFactoryProvider.createSvgElement_tag("animateMotion");
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for 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 SVGAnimateTransformElement
-class SVGAnimateTransformElement extends SVGAnimationElement native "*SVGAnimateTransformElement" {
+/// @domName SVGAnimateTransformElement; @docsEditable true
+class AnimateTransformElement extends AnimationElement native "*SVGAnimateTransformElement" {
+
+  factory AnimateTransformElement() => _SvgElementFactoryProvider.createSvgElement_tag("animateTransform");
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for 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 SVGAnimatedAngle
-class SVGAnimatedAngle native "*SVGAnimatedAngle" {
+/// @domName SVGAnimatedAngle; @docsEditable true
+class AnimatedAngle native "*SVGAnimatedAngle" {
 
-  /** @domName SVGAnimatedAngle.animVal */
-  final SVGAngle animVal;
+  /// @domName SVGAnimatedAngle.animVal; @docsEditable true
+  final Angle animVal;
 
-  /** @domName SVGAnimatedAngle.baseVal */
-  final SVGAngle baseVal;
+  /// @domName SVGAnimatedAngle.baseVal; @docsEditable true
+  final Angle baseVal;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for 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 SVGAnimatedBoolean
-class SVGAnimatedBoolean native "*SVGAnimatedBoolean" {
+/// @domName SVGAnimatedBoolean; @docsEditable true
+class AnimatedBoolean native "*SVGAnimatedBoolean" {
 
-  /** @domName SVGAnimatedBoolean.animVal */
+  /// @domName SVGAnimatedBoolean.animVal; @docsEditable true
   final bool animVal;
 
-  /** @domName SVGAnimatedBoolean.baseVal */
+  /// @domName SVGAnimatedBoolean.baseVal; @docsEditable true
   bool baseVal;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -263,13 +273,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGAnimatedEnumeration
-class SVGAnimatedEnumeration native "*SVGAnimatedEnumeration" {
+/// @domName SVGAnimatedEnumeration; @docsEditable true
+class AnimatedEnumeration native "*SVGAnimatedEnumeration" {
 
-  /** @domName SVGAnimatedEnumeration.animVal */
+  /// @domName SVGAnimatedEnumeration.animVal; @docsEditable true
   final int animVal;
 
-  /** @domName SVGAnimatedEnumeration.baseVal */
+  /// @domName SVGAnimatedEnumeration.baseVal; @docsEditable true
   int baseVal;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -277,13 +287,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGAnimatedInteger
-class SVGAnimatedInteger native "*SVGAnimatedInteger" {
+/// @domName SVGAnimatedInteger; @docsEditable true
+class AnimatedInteger native "*SVGAnimatedInteger" {
 
-  /** @domName SVGAnimatedInteger.animVal */
+  /// @domName SVGAnimatedInteger.animVal; @docsEditable true
   final int animVal;
 
-  /** @domName SVGAnimatedInteger.baseVal */
+  /// @domName SVGAnimatedInteger.baseVal; @docsEditable true
   int baseVal;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -291,96 +301,98 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGAnimatedLength
-class SVGAnimatedLength native "*SVGAnimatedLength" {
+/// @domName SVGAnimatedLength; @docsEditable true
+class AnimatedLength native "*SVGAnimatedLength" {
 
-  /** @domName SVGAnimatedLength.animVal */
-  final SVGLength animVal;
+  /// @domName SVGAnimatedLength.animVal; @docsEditable true
+  final Length animVal;
 
-  /** @domName SVGAnimatedLength.baseVal */
-  final SVGLength baseVal;
+  /// @domName SVGAnimatedLength.baseVal; @docsEditable true
+  final Length baseVal;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for 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 SVGAnimatedLengthList
-class SVGAnimatedLengthList implements JavaScriptIndexingBehavior, List<SVGAnimatedLength> native "*SVGAnimatedLengthList" {
+/// @domName SVGAnimatedLengthList; @docsEditable true
+class AnimatedLengthList implements JavaScriptIndexingBehavior, List<AnimatedLength> native "*SVGAnimatedLengthList" {
 
-  /** @domName SVGAnimatedLengthList.animVal */
-  final SVGLengthList animVal;
+  /// @domName SVGAnimatedLengthList.animVal; @docsEditable true
+  final LengthList animVal;
 
-  /** @domName SVGAnimatedLengthList.baseVal */
-  final SVGLengthList baseVal;
+  /// @domName SVGAnimatedLengthList.baseVal; @docsEditable true
+  final LengthList baseVal;
 
-  SVGAnimatedLength operator[](int index) => JS("SVGAnimatedLength", "#[#]", this, index);
+  AnimatedLength operator[](int index) => JS("AnimatedLength", "#[#]", this, index);
 
-  void operator[]=(int index, SVGAnimatedLength value) {
+  void operator[]=(int index, AnimatedLength value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
-  // -- start List<SVGAnimatedLength> mixins.
-  // SVGAnimatedLength is the element type.
+  // -- start List<AnimatedLength> mixins.
+  // AnimatedLength is the element type.
 
-  // From Iterable<SVGAnimatedLength>:
+  // From Iterable<AnimatedLength>:
 
-  Iterator<SVGAnimatedLength> iterator() {
+  Iterator<AnimatedLength> 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<SVGAnimatedLength>(this);
+    return new FixedSizeListIterator<AnimatedLength>(this);
   }
 
-  // From Collection<SVGAnimatedLength>:
+  // From Collection<AnimatedLength>:
 
-  void add(SVGAnimatedLength value) {
+  void add(AnimatedLength value) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  void addLast(SVGAnimatedLength value) {
+  void addLast(AnimatedLength value) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  void addAll(Collection<SVGAnimatedLength> collection) {
+  void addAll(Collection<AnimatedLength> collection) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  bool contains(SVGAnimatedLength element) => _Collections.contains(this, element);
+  bool contains(AnimatedLength element) => _Collections.contains(this, element);
 
-  void forEach(void f(SVGAnimatedLength element)) => _Collections.forEach(this, f);
+  void forEach(void f(AnimatedLength element)) => _Collections.forEach(this, f);
 
-  Collection map(f(SVGAnimatedLength element)) => _Collections.map(this, [], f);
+  Collection map(f(AnimatedLength element)) => _Collections.map(this, [], f);
 
-  Collection<SVGAnimatedLength> filter(bool f(SVGAnimatedLength element)) =>
-     _Collections.filter(this, <SVGAnimatedLength>[], f);
+  Collection<AnimatedLength> filter(bool f(AnimatedLength element)) =>
+     _Collections.filter(this, <AnimatedLength>[], f);
 
-  bool every(bool f(SVGAnimatedLength element)) => _Collections.every(this, f);
+  bool every(bool f(AnimatedLength element)) => _Collections.every(this, f);
 
-  bool some(bool f(SVGAnimatedLength element)) => _Collections.some(this, f);
+  bool some(bool f(AnimatedLength element)) => _Collections.some(this, f);
 
   bool get isEmpty => this.length == 0;
 
-  // From List<SVGAnimatedLength>:
+  // From List<AnimatedLength>:
 
-  void sort([Comparator<SVGAnimatedLength> compare = Comparable.compare]) {
+  void sort([Comparator<AnimatedLength> compare = Comparable.compare]) {
     throw new UnsupportedError("Cannot sort immutable List.");
   }
 
-  int indexOf(SVGAnimatedLength element, [int start = 0]) =>
+  int indexOf(AnimatedLength element, [int start = 0]) =>
       _Lists.indexOf(this, element, start, this.length);
 
-  int lastIndexOf(SVGAnimatedLength element, [int start]) {
+  int lastIndexOf(AnimatedLength element, [int start]) {
     if (start == null) start = length - 1;
     return _Lists.lastIndexOf(this, element, start);
   }
 
-  SVGAnimatedLength get last => this[length - 1];
+  AnimatedLength get first => this[0];
 
-  SVGAnimatedLength removeLast() {
+  AnimatedLength get last => this[length - 1];
+
+  AnimatedLength removeLast() {
     throw new UnsupportedError("Cannot removeLast on immutable List.");
   }
 
-  void setRange(int start, int rangeLength, List<SVGAnimatedLength> from, [int startFrom]) {
+  void setRange(int start, int rangeLength, List<AnimatedLength> from, [int startFrom]) {
     throw new UnsupportedError("Cannot setRange on immutable List.");
   }
 
@@ -388,27 +400,27 @@
     throw new UnsupportedError("Cannot removeRange on immutable List.");
   }
 
-  void insertRange(int start, int rangeLength, [SVGAnimatedLength initialValue]) {
+  void insertRange(int start, int rangeLength, [AnimatedLength initialValue]) {
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
-  List<SVGAnimatedLength> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <SVGAnimatedLength>[]);
+  List<AnimatedLength> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <AnimatedLength>[]);
 
-  // -- end List<SVGAnimatedLength> mixins.
+  // -- end List<AnimatedLength> mixins.
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for 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 SVGAnimatedNumber
-class SVGAnimatedNumber native "*SVGAnimatedNumber" {
+/// @domName SVGAnimatedNumber; @docsEditable true
+class AnimatedNumber native "*SVGAnimatedNumber" {
 
-  /** @domName SVGAnimatedNumber.animVal */
+  /// @domName SVGAnimatedNumber.animVal; @docsEditable true
   final num animVal;
 
-  /** @domName SVGAnimatedNumber.baseVal */
+  /// @domName SVGAnimatedNumber.baseVal; @docsEditable true
   num baseVal;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -416,82 +428,84 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGAnimatedNumberList
-class SVGAnimatedNumberList implements JavaScriptIndexingBehavior, List<SVGAnimatedNumber> native "*SVGAnimatedNumberList" {
+/// @domName SVGAnimatedNumberList; @docsEditable true
+class AnimatedNumberList implements JavaScriptIndexingBehavior, List<AnimatedNumber> native "*SVGAnimatedNumberList" {
 
-  /** @domName SVGAnimatedNumberList.animVal */
-  final SVGNumberList animVal;
+  /// @domName SVGAnimatedNumberList.animVal; @docsEditable true
+  final NumberList animVal;
 
-  /** @domName SVGAnimatedNumberList.baseVal */
-  final SVGNumberList baseVal;
+  /// @domName SVGAnimatedNumberList.baseVal; @docsEditable true
+  final NumberList baseVal;
 
-  SVGAnimatedNumber operator[](int index) => JS("SVGAnimatedNumber", "#[#]", this, index);
+  AnimatedNumber operator[](int index) => JS("AnimatedNumber", "#[#]", this, index);
 
-  void operator[]=(int index, SVGAnimatedNumber value) {
+  void operator[]=(int index, AnimatedNumber value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
-  // -- start List<SVGAnimatedNumber> mixins.
-  // SVGAnimatedNumber is the element type.
+  // -- start List<AnimatedNumber> mixins.
+  // AnimatedNumber is the element type.
 
-  // From Iterable<SVGAnimatedNumber>:
+  // From Iterable<AnimatedNumber>:
 
-  Iterator<SVGAnimatedNumber> iterator() {
+  Iterator<AnimatedNumber> 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<SVGAnimatedNumber>(this);
+    return new FixedSizeListIterator<AnimatedNumber>(this);
   }
 
-  // From Collection<SVGAnimatedNumber>:
+  // From Collection<AnimatedNumber>:
 
-  void add(SVGAnimatedNumber value) {
+  void add(AnimatedNumber value) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  void addLast(SVGAnimatedNumber value) {
+  void addLast(AnimatedNumber value) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  void addAll(Collection<SVGAnimatedNumber> collection) {
+  void addAll(Collection<AnimatedNumber> collection) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  bool contains(SVGAnimatedNumber element) => _Collections.contains(this, element);
+  bool contains(AnimatedNumber element) => _Collections.contains(this, element);
 
-  void forEach(void f(SVGAnimatedNumber element)) => _Collections.forEach(this, f);
+  void forEach(void f(AnimatedNumber element)) => _Collections.forEach(this, f);
 
-  Collection map(f(SVGAnimatedNumber element)) => _Collections.map(this, [], f);
+  Collection map(f(AnimatedNumber element)) => _Collections.map(this, [], f);
 
-  Collection<SVGAnimatedNumber> filter(bool f(SVGAnimatedNumber element)) =>
-     _Collections.filter(this, <SVGAnimatedNumber>[], f);
+  Collection<AnimatedNumber> filter(bool f(AnimatedNumber element)) =>
+     _Collections.filter(this, <AnimatedNumber>[], f);
 
-  bool every(bool f(SVGAnimatedNumber element)) => _Collections.every(this, f);
+  bool every(bool f(AnimatedNumber element)) => _Collections.every(this, f);
 
-  bool some(bool f(SVGAnimatedNumber element)) => _Collections.some(this, f);
+  bool some(bool f(AnimatedNumber element)) => _Collections.some(this, f);
 
   bool get isEmpty => this.length == 0;
 
-  // From List<SVGAnimatedNumber>:
+  // From List<AnimatedNumber>:
 
-  void sort([Comparator<SVGAnimatedNumber> compare = Comparable.compare]) {
+  void sort([Comparator<AnimatedNumber> compare = Comparable.compare]) {
     throw new UnsupportedError("Cannot sort immutable List.");
   }
 
-  int indexOf(SVGAnimatedNumber element, [int start = 0]) =>
+  int indexOf(AnimatedNumber element, [int start = 0]) =>
       _Lists.indexOf(this, element, start, this.length);
 
-  int lastIndexOf(SVGAnimatedNumber element, [int start]) {
+  int lastIndexOf(AnimatedNumber element, [int start]) {
     if (start == null) start = length - 1;
     return _Lists.lastIndexOf(this, element, start);
   }
 
-  SVGAnimatedNumber get last => this[length - 1];
+  AnimatedNumber get first => this[0];
 
-  SVGAnimatedNumber removeLast() {
+  AnimatedNumber get last => this[length - 1];
+
+  AnimatedNumber removeLast() {
     throw new UnsupportedError("Cannot removeLast on immutable List.");
   }
 
-  void setRange(int start, int rangeLength, List<SVGAnimatedNumber> from, [int startFrom]) {
+  void setRange(int start, int rangeLength, List<AnimatedNumber> from, [int startFrom]) {
     throw new UnsupportedError("Cannot setRange on immutable List.");
   }
 
@@ -499,55 +513,55 @@
     throw new UnsupportedError("Cannot removeRange on immutable List.");
   }
 
-  void insertRange(int start, int rangeLength, [SVGAnimatedNumber initialValue]) {
+  void insertRange(int start, int rangeLength, [AnimatedNumber initialValue]) {
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
-  List<SVGAnimatedNumber> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <SVGAnimatedNumber>[]);
+  List<AnimatedNumber> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <AnimatedNumber>[]);
 
-  // -- end List<SVGAnimatedNumber> mixins.
+  // -- end List<AnimatedNumber> mixins.
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for 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 SVGAnimatedPreserveAspectRatio
-class SVGAnimatedPreserveAspectRatio native "*SVGAnimatedPreserveAspectRatio" {
+/// @domName SVGAnimatedPreserveAspectRatio; @docsEditable true
+class AnimatedPreserveAspectRatio native "*SVGAnimatedPreserveAspectRatio" {
 
-  /** @domName SVGAnimatedPreserveAspectRatio.animVal */
-  final SVGPreserveAspectRatio animVal;
+  /// @domName SVGAnimatedPreserveAspectRatio.animVal; @docsEditable true
+  final PreserveAspectRatio animVal;
 
-  /** @domName SVGAnimatedPreserveAspectRatio.baseVal */
-  final SVGPreserveAspectRatio baseVal;
+  /// @domName SVGAnimatedPreserveAspectRatio.baseVal; @docsEditable true
+  final PreserveAspectRatio baseVal;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for 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 SVGAnimatedRect
-class SVGAnimatedRect native "*SVGAnimatedRect" {
+/// @domName SVGAnimatedRect; @docsEditable true
+class AnimatedRect native "*SVGAnimatedRect" {
 
-  /** @domName SVGAnimatedRect.animVal */
-  final SVGRect animVal;
+  /// @domName SVGAnimatedRect.animVal; @docsEditable true
+  final Rect animVal;
 
-  /** @domName SVGAnimatedRect.baseVal */
-  final SVGRect baseVal;
+  /// @domName SVGAnimatedRect.baseVal; @docsEditable true
+  final Rect baseVal;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for 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 SVGAnimatedString
-class SVGAnimatedString native "*SVGAnimatedString" {
+/// @domName SVGAnimatedString; @docsEditable true
+class AnimatedString native "*SVGAnimatedString" {
 
-  /** @domName SVGAnimatedString.animVal */
+  /// @domName SVGAnimatedString.animVal; @docsEditable true
   final String animVal;
 
-  /** @domName SVGAnimatedString.baseVal */
+  /// @domName SVGAnimatedString.baseVal; @docsEditable true
   String baseVal;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -555,82 +569,84 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGAnimatedTransformList
-class SVGAnimatedTransformList implements JavaScriptIndexingBehavior, List<SVGAnimateTransformElement> native "*SVGAnimatedTransformList" {
+/// @domName SVGAnimatedTransformList; @docsEditable true
+class AnimatedTransformList implements JavaScriptIndexingBehavior, List<AnimateTransformElement> native "*SVGAnimatedTransformList" {
 
-  /** @domName SVGAnimatedTransformList.animVal */
-  final SVGTransformList animVal;
+  /// @domName SVGAnimatedTransformList.animVal; @docsEditable true
+  final TransformList animVal;
 
-  /** @domName SVGAnimatedTransformList.baseVal */
-  final SVGTransformList baseVal;
+  /// @domName SVGAnimatedTransformList.baseVal; @docsEditable true
+  final TransformList baseVal;
 
-  SVGAnimateTransformElement operator[](int index) => JS("SVGAnimateTransformElement", "#[#]", this, index);
+  AnimateTransformElement operator[](int index) => JS("AnimateTransformElement", "#[#]", this, index);
 
-  void operator[]=(int index, SVGAnimateTransformElement value) {
+  void operator[]=(int index, AnimateTransformElement value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
-  // -- start List<SVGAnimateTransformElement> mixins.
-  // SVGAnimateTransformElement is the element type.
+  // -- start List<AnimateTransformElement> mixins.
+  // AnimateTransformElement is the element type.
 
-  // From Iterable<SVGAnimateTransformElement>:
+  // From Iterable<AnimateTransformElement>:
 
-  Iterator<SVGAnimateTransformElement> iterator() {
+  Iterator<AnimateTransformElement> 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<SVGAnimateTransformElement>(this);
+    return new FixedSizeListIterator<AnimateTransformElement>(this);
   }
 
-  // From Collection<SVGAnimateTransformElement>:
+  // From Collection<AnimateTransformElement>:
 
-  void add(SVGAnimateTransformElement value) {
+  void add(AnimateTransformElement value) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  void addLast(SVGAnimateTransformElement value) {
+  void addLast(AnimateTransformElement value) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  void addAll(Collection<SVGAnimateTransformElement> collection) {
+  void addAll(Collection<AnimateTransformElement> collection) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  bool contains(SVGAnimateTransformElement element) => _Collections.contains(this, element);
+  bool contains(AnimateTransformElement element) => _Collections.contains(this, element);
 
-  void forEach(void f(SVGAnimateTransformElement element)) => _Collections.forEach(this, f);
+  void forEach(void f(AnimateTransformElement element)) => _Collections.forEach(this, f);
 
-  Collection map(f(SVGAnimateTransformElement element)) => _Collections.map(this, [], f);
+  Collection map(f(AnimateTransformElement element)) => _Collections.map(this, [], f);
 
-  Collection<SVGAnimateTransformElement> filter(bool f(SVGAnimateTransformElement element)) =>
-     _Collections.filter(this, <SVGAnimateTransformElement>[], f);
+  Collection<AnimateTransformElement> filter(bool f(AnimateTransformElement element)) =>
+     _Collections.filter(this, <AnimateTransformElement>[], f);
 
-  bool every(bool f(SVGAnimateTransformElement element)) => _Collections.every(this, f);
+  bool every(bool f(AnimateTransformElement element)) => _Collections.every(this, f);
 
-  bool some(bool f(SVGAnimateTransformElement element)) => _Collections.some(this, f);
+  bool some(bool f(AnimateTransformElement element)) => _Collections.some(this, f);
 
   bool get isEmpty => this.length == 0;
 
-  // From List<SVGAnimateTransformElement>:
+  // From List<AnimateTransformElement>:
 
-  void sort([Comparator<SVGAnimateTransformElement> compare = Comparable.compare]) {
+  void sort([Comparator<AnimateTransformElement> compare = Comparable.compare]) {
     throw new UnsupportedError("Cannot sort immutable List.");
   }
 
-  int indexOf(SVGAnimateTransformElement element, [int start = 0]) =>
+  int indexOf(AnimateTransformElement element, [int start = 0]) =>
       _Lists.indexOf(this, element, start, this.length);
 
-  int lastIndexOf(SVGAnimateTransformElement element, [int start]) {
+  int lastIndexOf(AnimateTransformElement element, [int start]) {
     if (start == null) start = length - 1;
     return _Lists.lastIndexOf(this, element, start);
   }
 
-  SVGAnimateTransformElement get last => this[length - 1];
+  AnimateTransformElement get first => this[0];
 
-  SVGAnimateTransformElement removeLast() {
+  AnimateTransformElement get last => this[length - 1];
+
+  AnimateTransformElement removeLast() {
     throw new UnsupportedError("Cannot removeLast on immutable List.");
   }
 
-  void setRange(int start, int rangeLength, List<SVGAnimateTransformElement> from, [int startFrom]) {
+  void setRange(int start, int rangeLength, List<AnimateTransformElement> from, [int startFrom]) {
     throw new UnsupportedError("Cannot setRange on immutable List.");
   }
 
@@ -638,66 +654,68 @@
     throw new UnsupportedError("Cannot removeRange on immutable List.");
   }
 
-  void insertRange(int start, int rangeLength, [SVGAnimateTransformElement initialValue]) {
+  void insertRange(int start, int rangeLength, [AnimateTransformElement initialValue]) {
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
-  List<SVGAnimateTransformElement> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <SVGAnimateTransformElement>[]);
+  List<AnimateTransformElement> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <AnimateTransformElement>[]);
 
-  // -- end List<SVGAnimateTransformElement> mixins.
+  // -- end List<AnimateTransformElement> mixins.
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for 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 SVGAnimationElement
-class SVGAnimationElement extends SVGElement implements ElementTimeControl, SVGTests, SVGExternalResourcesRequired native "*SVGAnimationElement" {
+/// @domName SVGAnimationElement; @docsEditable true
+class AnimationElement extends SvgElement implements Tests, ElementTimeControl, ExternalResourcesRequired native "*SVGAnimationElement" {
 
-  /** @domName SVGAnimationElement.targetElement */
-  final SVGElement targetElement;
+  factory AnimationElement() => _SvgElementFactoryProvider.createSvgElement_tag("animation");
 
-  /** @domName SVGAnimationElement.getCurrentTime */
+  /// @domName SVGAnimationElement.targetElement; @docsEditable true
+  final SvgElement targetElement;
+
+  /// @domName SVGAnimationElement.getCurrentTime; @docsEditable true
   num getCurrentTime() native;
 
-  /** @domName SVGAnimationElement.getSimpleDuration */
+  /// @domName SVGAnimationElement.getSimpleDuration; @docsEditable true
   num getSimpleDuration() native;
 
-  /** @domName SVGAnimationElement.getStartTime */
+  /// @domName SVGAnimationElement.getStartTime; @docsEditable true
   num getStartTime() native;
 
   // From ElementTimeControl
 
-  /** @domName ElementTimeControl.beginElement */
+  /// @domName ElementTimeControl.beginElement; @docsEditable true
   void beginElement() native;
 
-  /** @domName ElementTimeControl.beginElementAt */
+  /// @domName ElementTimeControl.beginElementAt; @docsEditable true
   void beginElementAt(num offset) native;
 
-  /** @domName ElementTimeControl.endElement */
+  /// @domName ElementTimeControl.endElement; @docsEditable true
   void endElement() native;
 
-  /** @domName ElementTimeControl.endElementAt */
+  /// @domName ElementTimeControl.endElementAt; @docsEditable true
   void endElementAt(num offset) native;
 
   // From SVGExternalResourcesRequired
 
-  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
-  final SVGAnimatedBoolean externalResourcesRequired;
+  /// @domName SVGExternalResourcesRequired.externalResourcesRequired; @docsEditable true
+  final AnimatedBoolean externalResourcesRequired;
 
   // From SVGTests
 
-  /** @domName SVGTests.requiredExtensions */
-  final SVGStringList requiredExtensions;
+  /// @domName SVGTests.requiredExtensions; @docsEditable true
+  final StringList requiredExtensions;
 
-  /** @domName SVGTests.requiredFeatures */
-  final SVGStringList requiredFeatures;
+  /// @domName SVGTests.requiredFeatures; @docsEditable true
+  final StringList requiredFeatures;
 
-  /** @domName SVGTests.systemLanguage */
-  final SVGStringList systemLanguage;
+  /// @domName SVGTests.systemLanguage; @docsEditable true
+  final StringList systemLanguage;
 
-  /** @domName SVGTests.hasExtension */
+  /// @domName SVGTests.hasExtension; @docsEditable true
   bool hasExtension(String extension) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -705,162 +723,166 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGCircleElement
-class SVGCircleElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired native "*SVGCircleElement" {
+/// @domName SVGCircleElement; @docsEditable true
+class CircleElement extends SvgElement implements Transformable, Tests, Stylable, ExternalResourcesRequired, LangSpace native "*SVGCircleElement" {
 
-  /** @domName SVGCircleElement.cx */
-  final SVGAnimatedLength cx;
+  factory CircleElement() => _SvgElementFactoryProvider.createSvgElement_tag("circle");
 
-  /** @domName SVGCircleElement.cy */
-  final SVGAnimatedLength cy;
+  /// @domName SVGCircleElement.cx; @docsEditable true
+  final AnimatedLength cx;
 
-  /** @domName SVGCircleElement.r */
-  final SVGAnimatedLength r;
+  /// @domName SVGCircleElement.cy; @docsEditable true
+  final AnimatedLength cy;
+
+  /// @domName SVGCircleElement.r; @docsEditable true
+  final AnimatedLength r;
 
   // From SVGExternalResourcesRequired
 
-  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
-  final SVGAnimatedBoolean externalResourcesRequired;
+  /// @domName SVGExternalResourcesRequired.externalResourcesRequired; @docsEditable true
+  final AnimatedBoolean externalResourcesRequired;
 
   // From SVGLangSpace
 
-  /** @domName SVGLangSpace.xmllang */
+  /// @domName SVGLangSpace.xmllang; @docsEditable true
   String xmllang;
 
-  /** @domName SVGLangSpace.xmlspace */
+  /// @domName SVGLangSpace.xmlspace; @docsEditable true
   String xmlspace;
 
   // From SVGLocatable
 
-  /** @domName SVGLocatable.farthestViewportElement */
-  final SVGElement farthestViewportElement;
+  /// @domName SVGLocatable.farthestViewportElement; @docsEditable true
+  final SvgElement farthestViewportElement;
 
-  /** @domName SVGLocatable.nearestViewportElement */
-  final SVGElement nearestViewportElement;
+  /// @domName SVGLocatable.nearestViewportElement; @docsEditable true
+  final SvgElement nearestViewportElement;
 
-  /** @domName SVGLocatable.getBBox */
-  SVGRect getBBox() native;
+  /// @domName SVGLocatable.getBBox; @docsEditable true
+  Rect getBBox() native;
 
-  /** @domName SVGLocatable.getCTM */
-  SVGMatrix getCTM() native;
+  /// @domName SVGLocatable.getCTM; @docsEditable true
+  Matrix getCTM() native;
 
-  /** @domName SVGLocatable.getScreenCTM */
-  SVGMatrix getScreenCTM() native;
+  /// @domName SVGLocatable.getScreenCTM; @docsEditable true
+  Matrix getScreenCTM() native;
 
-  /** @domName SVGLocatable.getTransformToElement */
-  SVGMatrix getTransformToElement(SVGElement element) native;
+  /// @domName SVGLocatable.getTransformToElement; @docsEditable true
+  Matrix getTransformToElement(SvgElement element) native;
 
   // From SVGStylable
 
-  /** @domName SVGStylable.className */
-  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+  /// @domName SVGStylable.className; @docsEditable true
+  AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CSSStyleDeclaration style;
 
-  /** @domName SVGStylable.getPresentationAttribute */
+  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
   CSSValue getPresentationAttribute(String name) native;
 
   // From SVGTests
 
-  /** @domName SVGTests.requiredExtensions */
-  final SVGStringList requiredExtensions;
+  /// @domName SVGTests.requiredExtensions; @docsEditable true
+  final StringList requiredExtensions;
 
-  /** @domName SVGTests.requiredFeatures */
-  final SVGStringList requiredFeatures;
+  /// @domName SVGTests.requiredFeatures; @docsEditable true
+  final StringList requiredFeatures;
 
-  /** @domName SVGTests.systemLanguage */
-  final SVGStringList systemLanguage;
+  /// @domName SVGTests.systemLanguage; @docsEditable true
+  final StringList systemLanguage;
 
-  /** @domName SVGTests.hasExtension */
+  /// @domName SVGTests.hasExtension; @docsEditable true
   bool hasExtension(String extension) native;
 
   // From SVGTransformable
 
-  /** @domName SVGTransformable.transform */
-  final SVGAnimatedTransformList transform;
+  /// @domName SVGTransformable.transform; @docsEditable true
+  final AnimatedTransformList transform;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGClipPathElement
-class SVGClipPathElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired native "*SVGClipPathElement" {
+/// @domName SVGClipPathElement; @docsEditable true
+class ClipPathElement extends SvgElement implements Transformable, Tests, Stylable, ExternalResourcesRequired, LangSpace native "*SVGClipPathElement" {
 
-  /** @domName SVGClipPathElement.clipPathUnits */
-  final SVGAnimatedEnumeration clipPathUnits;
+  factory ClipPathElement() => _SvgElementFactoryProvider.createSvgElement_tag("clipPath");
+
+  /// @domName SVGClipPathElement.clipPathUnits; @docsEditable true
+  final AnimatedEnumeration clipPathUnits;
 
   // From SVGExternalResourcesRequired
 
-  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
-  final SVGAnimatedBoolean externalResourcesRequired;
+  /// @domName SVGExternalResourcesRequired.externalResourcesRequired; @docsEditable true
+  final AnimatedBoolean externalResourcesRequired;
 
   // From SVGLangSpace
 
-  /** @domName SVGLangSpace.xmllang */
+  /// @domName SVGLangSpace.xmllang; @docsEditable true
   String xmllang;
 
-  /** @domName SVGLangSpace.xmlspace */
+  /// @domName SVGLangSpace.xmlspace; @docsEditable true
   String xmlspace;
 
   // From SVGLocatable
 
-  /** @domName SVGLocatable.farthestViewportElement */
-  final SVGElement farthestViewportElement;
+  /// @domName SVGLocatable.farthestViewportElement; @docsEditable true
+  final SvgElement farthestViewportElement;
 
-  /** @domName SVGLocatable.nearestViewportElement */
-  final SVGElement nearestViewportElement;
+  /// @domName SVGLocatable.nearestViewportElement; @docsEditable true
+  final SvgElement nearestViewportElement;
 
-  /** @domName SVGLocatable.getBBox */
-  SVGRect getBBox() native;
+  /// @domName SVGLocatable.getBBox; @docsEditable true
+  Rect getBBox() native;
 
-  /** @domName SVGLocatable.getCTM */
-  SVGMatrix getCTM() native;
+  /// @domName SVGLocatable.getCTM; @docsEditable true
+  Matrix getCTM() native;
 
-  /** @domName SVGLocatable.getScreenCTM */
-  SVGMatrix getScreenCTM() native;
+  /// @domName SVGLocatable.getScreenCTM; @docsEditable true
+  Matrix getScreenCTM() native;
 
-  /** @domName SVGLocatable.getTransformToElement */
-  SVGMatrix getTransformToElement(SVGElement element) native;
+  /// @domName SVGLocatable.getTransformToElement; @docsEditable true
+  Matrix getTransformToElement(SvgElement element) native;
 
   // From SVGStylable
 
-  /** @domName SVGStylable.className */
-  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+  /// @domName SVGStylable.className; @docsEditable true
+  AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CSSStyleDeclaration style;
 
-  /** @domName SVGStylable.getPresentationAttribute */
+  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
   CSSValue getPresentationAttribute(String name) native;
 
   // From SVGTests
 
-  /** @domName SVGTests.requiredExtensions */
-  final SVGStringList requiredExtensions;
+  /// @domName SVGTests.requiredExtensions; @docsEditable true
+  final StringList requiredExtensions;
 
-  /** @domName SVGTests.requiredFeatures */
-  final SVGStringList requiredFeatures;
+  /// @domName SVGTests.requiredFeatures; @docsEditable true
+  final StringList requiredFeatures;
 
-  /** @domName SVGTests.systemLanguage */
-  final SVGStringList systemLanguage;
+  /// @domName SVGTests.systemLanguage; @docsEditable true
+  final StringList systemLanguage;
 
-  /** @domName SVGTests.hasExtension */
+  /// @domName SVGTests.hasExtension; @docsEditable true
   bool hasExtension(String extension) native;
 
   // From SVGTransformable
 
-  /** @domName SVGTransformable.transform */
-  final SVGAnimatedTransformList transform;
+  /// @domName SVGTransformable.transform; @docsEditable true
+  final AnimatedTransformList transform;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGColor
-class SVGColor extends CSSValue native "*SVGColor" {
+/// @domName SVGColor; @docsEditable true
+class Color extends CSSValue native "*SVGColor" {
 
   static const int SVG_COLORTYPE_CURRENTCOLOR = 3;
 
@@ -870,19 +892,19 @@
 
   static const int SVG_COLORTYPE_UNKNOWN = 0;
 
-  /** @domName SVGColor.colorType */
+  /// @domName SVGColor.colorType; @docsEditable true
   final int colorType;
 
-  /** @domName SVGColor.rgbColor */
+  /// @domName SVGColor.rgbColor; @docsEditable true
   final RGBColor rgbColor;
 
-  /** @domName SVGColor.setColor */
+  /// @domName SVGColor.setColor; @docsEditable true
   void setColor(int colorType, String rgbColor, String iccColor) native;
 
-  /** @domName SVGColor.setRGBColor */
+  /// @domName SVGColor.setRGBColor; @docsEditable true
   void setRGBColor(String rgbColor) native;
 
-  /** @domName SVGColor.setRGBColorICCColor */
+  /// @domName SVGColor.setRGBColorICCColor; @docsEditable true
   void setRGBColorICCColor(String rgbColor, String iccColor) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -890,8 +912,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGComponentTransferFunctionElement
-class SVGComponentTransferFunctionElement extends SVGElement native "*SVGComponentTransferFunctionElement" {
+/// @domName SVGComponentTransferFunctionElement; @docsEditable true
+class ComponentTransferFunctionElement extends SvgElement native "*SVGComponentTransferFunctionElement" {
 
   static const int SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE = 3;
 
@@ -905,161 +927,167 @@
 
   static const int SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN = 0;
 
-  /** @domName SVGComponentTransferFunctionElement.amplitude */
-  final SVGAnimatedNumber amplitude;
+  /// @domName SVGComponentTransferFunctionElement.amplitude; @docsEditable true
+  final AnimatedNumber amplitude;
 
-  /** @domName SVGComponentTransferFunctionElement.exponent */
-  final SVGAnimatedNumber exponent;
+  /// @domName SVGComponentTransferFunctionElement.exponent; @docsEditable true
+  final AnimatedNumber exponent;
 
-  /** @domName SVGComponentTransferFunctionElement.intercept */
-  final SVGAnimatedNumber intercept;
+  /// @domName SVGComponentTransferFunctionElement.intercept; @docsEditable true
+  final AnimatedNumber intercept;
 
-  /** @domName SVGComponentTransferFunctionElement.offset */
-  final SVGAnimatedNumber offset;
+  /// @domName SVGComponentTransferFunctionElement.offset; @docsEditable true
+  final AnimatedNumber offset;
 
-  /** @domName SVGComponentTransferFunctionElement.slope */
-  final SVGAnimatedNumber slope;
+  /// @domName SVGComponentTransferFunctionElement.slope; @docsEditable true
+  final AnimatedNumber slope;
 
-  /** @domName SVGComponentTransferFunctionElement.tableValues */
-  final SVGAnimatedNumberList tableValues;
+  /// @domName SVGComponentTransferFunctionElement.tableValues; @docsEditable true
+  final AnimatedNumberList tableValues;
 
-  /** @domName SVGComponentTransferFunctionElement.type */
-  final SVGAnimatedEnumeration type;
+  /// @domName SVGComponentTransferFunctionElement.type; @docsEditable true
+  final AnimatedEnumeration type;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for 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 SVGCursorElement
-class SVGCursorElement extends SVGElement implements SVGURIReference, SVGTests, SVGExternalResourcesRequired native "*SVGCursorElement" {
+/// @domName SVGCursorElement; @docsEditable true
+class CursorElement extends SvgElement implements UriReference, Tests, ExternalResourcesRequired native "*SVGCursorElement" {
 
-  /** @domName SVGCursorElement.x */
-  final SVGAnimatedLength x;
+  factory CursorElement() => _SvgElementFactoryProvider.createSvgElement_tag("cursor");
 
-  /** @domName SVGCursorElement.y */
-  final SVGAnimatedLength y;
+  /// @domName SVGCursorElement.x; @docsEditable true
+  final AnimatedLength x;
+
+  /// @domName SVGCursorElement.y; @docsEditable true
+  final AnimatedLength y;
 
   // From SVGExternalResourcesRequired
 
-  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
-  final SVGAnimatedBoolean externalResourcesRequired;
+  /// @domName SVGExternalResourcesRequired.externalResourcesRequired; @docsEditable true
+  final AnimatedBoolean externalResourcesRequired;
 
   // From SVGTests
 
-  /** @domName SVGTests.requiredExtensions */
-  final SVGStringList requiredExtensions;
+  /// @domName SVGTests.requiredExtensions; @docsEditable true
+  final StringList requiredExtensions;
 
-  /** @domName SVGTests.requiredFeatures */
-  final SVGStringList requiredFeatures;
+  /// @domName SVGTests.requiredFeatures; @docsEditable true
+  final StringList requiredFeatures;
 
-  /** @domName SVGTests.systemLanguage */
-  final SVGStringList systemLanguage;
+  /// @domName SVGTests.systemLanguage; @docsEditable true
+  final StringList systemLanguage;
 
-  /** @domName SVGTests.hasExtension */
+  /// @domName SVGTests.hasExtension; @docsEditable true
   bool hasExtension(String extension) native;
 
   // From SVGURIReference
 
-  /** @domName SVGURIReference.href */
-  final SVGAnimatedString href;
+  /// @domName SVGURIReference.href; @docsEditable true
+  final AnimatedString href;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGDefsElement
-class SVGDefsElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired native "*SVGDefsElement" {
+/// @domName SVGDefsElement; @docsEditable true
+class DefsElement extends SvgElement implements Transformable, Tests, Stylable, ExternalResourcesRequired, LangSpace native "*SVGDefsElement" {
+
+  factory DefsElement() => _SvgElementFactoryProvider.createSvgElement_tag("defs");
 
   // From SVGExternalResourcesRequired
 
-  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
-  final SVGAnimatedBoolean externalResourcesRequired;
+  /// @domName SVGExternalResourcesRequired.externalResourcesRequired; @docsEditable true
+  final AnimatedBoolean externalResourcesRequired;
 
   // From SVGLangSpace
 
-  /** @domName SVGLangSpace.xmllang */
+  /// @domName SVGLangSpace.xmllang; @docsEditable true
   String xmllang;
 
-  /** @domName SVGLangSpace.xmlspace */
+  /// @domName SVGLangSpace.xmlspace; @docsEditable true
   String xmlspace;
 
   // From SVGLocatable
 
-  /** @domName SVGLocatable.farthestViewportElement */
-  final SVGElement farthestViewportElement;
+  /// @domName SVGLocatable.farthestViewportElement; @docsEditable true
+  final SvgElement farthestViewportElement;
 
-  /** @domName SVGLocatable.nearestViewportElement */
-  final SVGElement nearestViewportElement;
+  /// @domName SVGLocatable.nearestViewportElement; @docsEditable true
+  final SvgElement nearestViewportElement;
 
-  /** @domName SVGLocatable.getBBox */
-  SVGRect getBBox() native;
+  /// @domName SVGLocatable.getBBox; @docsEditable true
+  Rect getBBox() native;
 
-  /** @domName SVGLocatable.getCTM */
-  SVGMatrix getCTM() native;
+  /// @domName SVGLocatable.getCTM; @docsEditable true
+  Matrix getCTM() native;
 
-  /** @domName SVGLocatable.getScreenCTM */
-  SVGMatrix getScreenCTM() native;
+  /// @domName SVGLocatable.getScreenCTM; @docsEditable true
+  Matrix getScreenCTM() native;
 
-  /** @domName SVGLocatable.getTransformToElement */
-  SVGMatrix getTransformToElement(SVGElement element) native;
+  /// @domName SVGLocatable.getTransformToElement; @docsEditable true
+  Matrix getTransformToElement(SvgElement element) native;
 
   // From SVGStylable
 
-  /** @domName SVGStylable.className */
-  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+  /// @domName SVGStylable.className; @docsEditable true
+  AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CSSStyleDeclaration style;
 
-  /** @domName SVGStylable.getPresentationAttribute */
+  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
   CSSValue getPresentationAttribute(String name) native;
 
   // From SVGTests
 
-  /** @domName SVGTests.requiredExtensions */
-  final SVGStringList requiredExtensions;
+  /// @domName SVGTests.requiredExtensions; @docsEditable true
+  final StringList requiredExtensions;
 
-  /** @domName SVGTests.requiredFeatures */
-  final SVGStringList requiredFeatures;
+  /// @domName SVGTests.requiredFeatures; @docsEditable true
+  final StringList requiredFeatures;
 
-  /** @domName SVGTests.systemLanguage */
-  final SVGStringList systemLanguage;
+  /// @domName SVGTests.systemLanguage; @docsEditable true
+  final StringList systemLanguage;
 
-  /** @domName SVGTests.hasExtension */
+  /// @domName SVGTests.hasExtension; @docsEditable true
   bool hasExtension(String extension) native;
 
   // From SVGTransformable
 
-  /** @domName SVGTransformable.transform */
-  final SVGAnimatedTransformList transform;
+  /// @domName SVGTransformable.transform; @docsEditable true
+  final AnimatedTransformList transform;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGDescElement
-class SVGDescElement extends SVGElement implements SVGLangSpace, SVGStylable native "*SVGDescElement" {
+/// @domName SVGDescElement; @docsEditable true
+class DescElement extends SvgElement implements Stylable, LangSpace native "*SVGDescElement" {
+
+  factory DescElement() => _SvgElementFactoryProvider.createSvgElement_tag("desc");
 
   // From SVGLangSpace
 
-  /** @domName SVGLangSpace.xmllang */
+  /// @domName SVGLangSpace.xmllang; @docsEditable true
   String xmllang;
 
-  /** @domName SVGLangSpace.xmlspace */
+  /// @domName SVGLangSpace.xmlspace; @docsEditable true
   String xmlspace;
 
   // From SVGStylable
 
-  /** @domName SVGStylable.className */
-  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+  /// @domName SVGStylable.className; @docsEditable true
+  AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CSSStyleDeclaration style;
 
-  /** @domName SVGStylable.getPresentationAttribute */
+  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
   CSSValue getPresentationAttribute(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1067,152 +1095,41 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGDocument
-class SVGDocument extends Document native "*SVGDocument" {
+/// @domName SVGElementInstance; @docsEditable true
+class ElementInstance extends EventTarget native "*SVGElementInstance" {
 
-  /** @domName SVGDocument.rootElement */
-  final SVGSVGElement rootElement;
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  ElementInstanceEvents get on =>
+    new ElementInstanceEvents(this);
 
-  /** @domName SVGDocument.createEvent */
-  Event $dom_createEvent(String eventType) native "createEvent";
-}
-// 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.
+  /// @domName SVGElementInstance.childNodes; @docsEditable true
+  @Returns('_ElementInstanceList') @Creates('_ElementInstanceList')
+  final List<ElementInstance> childNodes;
 
+  /// @domName SVGElementInstance.correspondingElement; @docsEditable true
+  final SvgElement correspondingElement;
 
-class _AttributeClassSet extends CssClassSet {
-  final Element _element;
+  /// @domName SVGElementInstance.correspondingUseElement; @docsEditable true
+  final UseElement correspondingUseElement;
 
-  _AttributeClassSet(this._element);
+  /// @domName SVGElementInstance.firstChild; @docsEditable true
+  final ElementInstance firstChild;
 
-  Set<String> readClasses() {
-    var classname = _element.attributes['class'];
+  /// @domName SVGElementInstance.lastChild; @docsEditable true
+  final ElementInstance lastChild;
 
-    Set<String> s = new Set<String>();
-    if (classname == null) {
-      return s;
-    }
-    for (String name in classname.split(' ')) {
-      String trimmed = name.trim();
-      if (!trimmed.isEmpty) {
-        s.add(trimmed);
-      }
-    }
-    return s;
-  }
+  /// @domName SVGElementInstance.nextSibling; @docsEditable true
+  final ElementInstance nextSibling;
 
-  void writeClasses(Set s) {
-    List list = new List.from(s);
-    _element.attributes['class'] = Strings.join(list, ' ');
-  }
+  /// @domName SVGElementInstance.parentNode; @docsEditable true
+  final ElementInstance parentNode;
+
+  /// @domName SVGElementInstance.previousSibling; @docsEditable true
+  final ElementInstance previousSibling;
 }
 
-class SVGElement extends Element native "*SVGElement" {
-  factory SVGElement.tag(String tag) =>
-      _SVGElementFactoryProvider.createSVGElement_tag(tag);
-  factory SVGElement.svg(String svg) =>
-      _SVGElementFactoryProvider.createSVGElement_svg(svg);
-
-  _AttributeClassSet _cssClassSet;
-  CssClassSet get classes {
-    if (_cssClassSet == null) {
-      _cssClassSet = new _AttributeClassSet(this);
-    }
-    return _cssClassSet;
-  }
-
-  List<Element> get elements => new FilteredElementList(this);
-
-  void set elements(Collection<Element> value) {
-    final elements = this.elements;
-    elements.clear();
-    elements.addAll(value);
-  }
-
-  String get outerHTML {
-    final container = new Element.tag("div");
-    final SVGElement cloned = this.clone(true);
-    container.elements.add(cloned);
-    return container.innerHTML;
-  }
-
-  String get innerHTML {
-    final container = new Element.tag("div");
-    final SVGElement cloned = this.clone(true);
-    container.elements.addAll(cloned.elements);
-    return container.innerHTML;
-  }
-
-  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>';
-    this.elements = container.elements[0].elements;
-  }
-
-
-  // Shadowing definition.
-  /** @domName SVGElement.id */
-  String get id => JS("String", "#.id", this);
-
-  /** @domName SVGElement.id */
-  void set id(String value) {
-    JS("void", "#.id = #", this, value);
-  }
-
-  /** @domName SVGElement.ownerSVGElement */
-  final SVGSVGElement ownerSVGElement;
-
-  /** @domName SVGElement.viewportElement */
-  final SVGElement viewportElement;
-
-  /** @domName SVGElement.xmlbase */
-  String xmlbase;
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for 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 SVGElementInstance
-class SVGElementInstance extends EventTarget native "*SVGElementInstance" {
-
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
-  SVGElementInstanceEvents get on =>
-    new SVGElementInstanceEvents(this);
-
-  /** @domName SVGElementInstance.childNodes */
-  final List<SVGElementInstance> childNodes;
-
-  /** @domName SVGElementInstance.correspondingElement */
-  final SVGElement correspondingElement;
-
-  /** @domName SVGElementInstance.correspondingUseElement */
-  final SVGUseElement correspondingUseElement;
-
-  /** @domName SVGElementInstance.firstChild */
-  final SVGElementInstance firstChild;
-
-  /** @domName SVGElementInstance.lastChild */
-  final SVGElementInstance lastChild;
-
-  /** @domName SVGElementInstance.nextSibling */
-  final SVGElementInstance nextSibling;
-
-  /** @domName SVGElementInstance.parentNode */
-  final SVGElementInstance parentNode;
-
-  /** @domName SVGElementInstance.previousSibling */
-  final SVGElementInstance previousSibling;
-}
-
-class SVGElementInstanceEvents extends Events {
-  SVGElementInstanceEvents(EventTarget _ptr) : super(_ptr);
+class ElementInstanceEvents extends Events {
+  ElementInstanceEvents(EventTarget _ptr) : super(_ptr);
 
   EventListenerList get abort => this['abort'];
 
@@ -1299,91 +1216,93 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGEllipseElement
-class SVGEllipseElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired native "*SVGEllipseElement" {
+/// @domName SVGEllipseElement; @docsEditable true
+class EllipseElement extends SvgElement implements Transformable, Tests, Stylable, ExternalResourcesRequired, LangSpace native "*SVGEllipseElement" {
 
-  /** @domName SVGEllipseElement.cx */
-  final SVGAnimatedLength cx;
+  factory EllipseElement() => _SvgElementFactoryProvider.createSvgElement_tag("ellipse");
 
-  /** @domName SVGEllipseElement.cy */
-  final SVGAnimatedLength cy;
+  /// @domName SVGEllipseElement.cx; @docsEditable true
+  final AnimatedLength cx;
 
-  /** @domName SVGEllipseElement.rx */
-  final SVGAnimatedLength rx;
+  /// @domName SVGEllipseElement.cy; @docsEditable true
+  final AnimatedLength cy;
 
-  /** @domName SVGEllipseElement.ry */
-  final SVGAnimatedLength ry;
+  /// @domName SVGEllipseElement.rx; @docsEditable true
+  final AnimatedLength rx;
+
+  /// @domName SVGEllipseElement.ry; @docsEditable true
+  final AnimatedLength ry;
 
   // From SVGExternalResourcesRequired
 
-  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
-  final SVGAnimatedBoolean externalResourcesRequired;
+  /// @domName SVGExternalResourcesRequired.externalResourcesRequired; @docsEditable true
+  final AnimatedBoolean externalResourcesRequired;
 
   // From SVGLangSpace
 
-  /** @domName SVGLangSpace.xmllang */
+  /// @domName SVGLangSpace.xmllang; @docsEditable true
   String xmllang;
 
-  /** @domName SVGLangSpace.xmlspace */
+  /// @domName SVGLangSpace.xmlspace; @docsEditable true
   String xmlspace;
 
   // From SVGLocatable
 
-  /** @domName SVGLocatable.farthestViewportElement */
-  final SVGElement farthestViewportElement;
+  /// @domName SVGLocatable.farthestViewportElement; @docsEditable true
+  final SvgElement farthestViewportElement;
 
-  /** @domName SVGLocatable.nearestViewportElement */
-  final SVGElement nearestViewportElement;
+  /// @domName SVGLocatable.nearestViewportElement; @docsEditable true
+  final SvgElement nearestViewportElement;
 
-  /** @domName SVGLocatable.getBBox */
-  SVGRect getBBox() native;
+  /// @domName SVGLocatable.getBBox; @docsEditable true
+  Rect getBBox() native;
 
-  /** @domName SVGLocatable.getCTM */
-  SVGMatrix getCTM() native;
+  /// @domName SVGLocatable.getCTM; @docsEditable true
+  Matrix getCTM() native;
 
-  /** @domName SVGLocatable.getScreenCTM */
-  SVGMatrix getScreenCTM() native;
+  /// @domName SVGLocatable.getScreenCTM; @docsEditable true
+  Matrix getScreenCTM() native;
 
-  /** @domName SVGLocatable.getTransformToElement */
-  SVGMatrix getTransformToElement(SVGElement element) native;
+  /// @domName SVGLocatable.getTransformToElement; @docsEditable true
+  Matrix getTransformToElement(SvgElement element) native;
 
   // From SVGStylable
 
-  /** @domName SVGStylable.className */
-  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+  /// @domName SVGStylable.className; @docsEditable true
+  AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CSSStyleDeclaration style;
 
-  /** @domName SVGStylable.getPresentationAttribute */
+  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
   CSSValue getPresentationAttribute(String name) native;
 
   // From SVGTests
 
-  /** @domName SVGTests.requiredExtensions */
-  final SVGStringList requiredExtensions;
+  /// @domName SVGTests.requiredExtensions; @docsEditable true
+  final StringList requiredExtensions;
 
-  /** @domName SVGTests.requiredFeatures */
-  final SVGStringList requiredFeatures;
+  /// @domName SVGTests.requiredFeatures; @docsEditable true
+  final StringList requiredFeatures;
 
-  /** @domName SVGTests.systemLanguage */
-  final SVGStringList systemLanguage;
+  /// @domName SVGTests.systemLanguage; @docsEditable true
+  final StringList systemLanguage;
 
-  /** @domName SVGTests.hasExtension */
+  /// @domName SVGTests.hasExtension; @docsEditable true
   bool hasExtension(String extension) native;
 
   // From SVGTransformable
 
-  /** @domName SVGTransformable.transform */
-  final SVGAnimatedTransformList transform;
+  /// @domName SVGTransformable.transform; @docsEditable true
+  final AnimatedTransformList transform;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGException
-class SVGException native "*SVGException" {
+/// @domName SVGException; @docsEditable true
+class Exception native "*SVGException" {
 
   static const int SVG_INVALID_VALUE_ERR = 1;
 
@@ -1391,16 +1310,16 @@
 
   static const int SVG_WRONG_TYPE_ERR = 0;
 
-  /** @domName SVGException.code */
+  /// @domName SVGException.code; @docsEditable true
   final int code;
 
-  /** @domName SVGException.message */
+  /// @domName SVGException.message; @docsEditable true
   final String message;
 
-  /** @domName SVGException.name */
+  /// @domName SVGException.name; @docsEditable true
   final String name;
 
-  /** @domName SVGException.toString */
+  /// @domName SVGException.toString; @docsEditable true
   String toString() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1409,17 +1328,17 @@
 
 
 /// @domName SVGExternalResourcesRequired
-abstract class SVGExternalResourcesRequired {
+abstract class ExternalResourcesRequired {
 
-  SVGAnimatedBoolean externalResourcesRequired;
+  AnimatedBoolean externalResourcesRequired;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGFEBlendElement
-class SVGFEBlendElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes native "*SVGFEBlendElement" {
+/// @domName SVGFEBlendElement; @docsEditable true
+class FEBlendElement extends SvgElement implements FilterPrimitiveStandardAttributes native "*SVGFEBlendElement" {
 
   static const int SVG_FEBLEND_MODE_DARKEN = 4;
 
@@ -1433,41 +1352,41 @@
 
   static const int SVG_FEBLEND_MODE_UNKNOWN = 0;
 
-  /** @domName SVGFEBlendElement.in1 */
-  final SVGAnimatedString in1;
+  /// @domName SVGFEBlendElement.in1; @docsEditable true
+  final AnimatedString in1;
 
-  /** @domName SVGFEBlendElement.in2 */
-  final SVGAnimatedString in2;
+  /// @domName SVGFEBlendElement.in2; @docsEditable true
+  final AnimatedString in2;
 
-  /** @domName SVGFEBlendElement.mode */
-  final SVGAnimatedEnumeration mode;
+  /// @domName SVGFEBlendElement.mode; @docsEditable true
+  final AnimatedEnumeration mode;
 
   // From SVGFilterPrimitiveStandardAttributes
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.height */
-  final SVGAnimatedLength height;
+  /// @domName SVGFilterPrimitiveStandardAttributes.height; @docsEditable true
+  final AnimatedLength height;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.result */
-  final SVGAnimatedString result;
+  /// @domName SVGFilterPrimitiveStandardAttributes.result; @docsEditable true
+  final AnimatedString result;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.width */
-  final SVGAnimatedLength width;
+  /// @domName SVGFilterPrimitiveStandardAttributes.width; @docsEditable true
+  final AnimatedLength width;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.x */
-  final SVGAnimatedLength x;
+  /// @domName SVGFilterPrimitiveStandardAttributes.x; @docsEditable true
+  final AnimatedLength x;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.y */
-  final SVGAnimatedLength y;
+  /// @domName SVGFilterPrimitiveStandardAttributes.y; @docsEditable true
+  final AnimatedLength y;
 
   // From SVGStylable
 
-  /** @domName SVGStylable.className */
-  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+  /// @domName SVGStylable.className; @docsEditable true
+  AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CSSStyleDeclaration style;
 
-  /** @domName SVGStylable.getPresentationAttribute */
+  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
   CSSValue getPresentationAttribute(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1475,8 +1394,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGFEColorMatrixElement
-class SVGFEColorMatrixElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes native "*SVGFEColorMatrixElement" {
+/// @domName SVGFEColorMatrixElement; @docsEditable true
+class FEColorMatrixElement extends SvgElement implements FilterPrimitiveStandardAttributes native "*SVGFEColorMatrixElement" {
 
   static const int SVG_FECOLORMATRIX_TYPE_HUEROTATE = 3;
 
@@ -1488,41 +1407,41 @@
 
   static const int SVG_FECOLORMATRIX_TYPE_UNKNOWN = 0;
 
-  /** @domName SVGFEColorMatrixElement.in1 */
-  final SVGAnimatedString in1;
+  /// @domName SVGFEColorMatrixElement.in1; @docsEditable true
+  final AnimatedString in1;
 
-  /** @domName SVGFEColorMatrixElement.type */
-  final SVGAnimatedEnumeration type;
+  /// @domName SVGFEColorMatrixElement.type; @docsEditable true
+  final AnimatedEnumeration type;
 
-  /** @domName SVGFEColorMatrixElement.values */
-  final SVGAnimatedNumberList values;
+  /// @domName SVGFEColorMatrixElement.values; @docsEditable true
+  final AnimatedNumberList values;
 
   // From SVGFilterPrimitiveStandardAttributes
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.height */
-  final SVGAnimatedLength height;
+  /// @domName SVGFilterPrimitiveStandardAttributes.height; @docsEditable true
+  final AnimatedLength height;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.result */
-  final SVGAnimatedString result;
+  /// @domName SVGFilterPrimitiveStandardAttributes.result; @docsEditable true
+  final AnimatedString result;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.width */
-  final SVGAnimatedLength width;
+  /// @domName SVGFilterPrimitiveStandardAttributes.width; @docsEditable true
+  final AnimatedLength width;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.x */
-  final SVGAnimatedLength x;
+  /// @domName SVGFilterPrimitiveStandardAttributes.x; @docsEditable true
+  final AnimatedLength x;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.y */
-  final SVGAnimatedLength y;
+  /// @domName SVGFilterPrimitiveStandardAttributes.y; @docsEditable true
+  final AnimatedLength y;
 
   // From SVGStylable
 
-  /** @domName SVGStylable.className */
-  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+  /// @domName SVGStylable.className; @docsEditable true
+  AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CSSStyleDeclaration style;
 
-  /** @domName SVGStylable.getPresentationAttribute */
+  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
   CSSValue getPresentationAttribute(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1530,38 +1449,38 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGFEComponentTransferElement
-class SVGFEComponentTransferElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes native "*SVGFEComponentTransferElement" {
+/// @domName SVGFEComponentTransferElement; @docsEditable true
+class FEComponentTransferElement extends SvgElement implements FilterPrimitiveStandardAttributes native "*SVGFEComponentTransferElement" {
 
-  /** @domName SVGFEComponentTransferElement.in1 */
-  final SVGAnimatedString in1;
+  /// @domName SVGFEComponentTransferElement.in1; @docsEditable true
+  final AnimatedString in1;
 
   // From SVGFilterPrimitiveStandardAttributes
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.height */
-  final SVGAnimatedLength height;
+  /// @domName SVGFilterPrimitiveStandardAttributes.height; @docsEditable true
+  final AnimatedLength height;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.result */
-  final SVGAnimatedString result;
+  /// @domName SVGFilterPrimitiveStandardAttributes.result; @docsEditable true
+  final AnimatedString result;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.width */
-  final SVGAnimatedLength width;
+  /// @domName SVGFilterPrimitiveStandardAttributes.width; @docsEditable true
+  final AnimatedLength width;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.x */
-  final SVGAnimatedLength x;
+  /// @domName SVGFilterPrimitiveStandardAttributes.x; @docsEditable true
+  final AnimatedLength x;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.y */
-  final SVGAnimatedLength y;
+  /// @domName SVGFilterPrimitiveStandardAttributes.y; @docsEditable true
+  final AnimatedLength y;
 
   // From SVGStylable
 
-  /** @domName SVGStylable.className */
-  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+  /// @domName SVGStylable.className; @docsEditable true
+  AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CSSStyleDeclaration style;
 
-  /** @domName SVGStylable.getPresentationAttribute */
+  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
   CSSValue getPresentationAttribute(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1569,8 +1488,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGFECompositeElement
-class SVGFECompositeElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes native "*SVGFECompositeElement" {
+/// @domName SVGFECompositeElement; @docsEditable true
+class FECompositeElement extends SvgElement implements FilterPrimitiveStandardAttributes native "*SVGFECompositeElement" {
 
   static const int SVG_FECOMPOSITE_OPERATOR_ARITHMETIC = 6;
 
@@ -1586,53 +1505,53 @@
 
   static const int SVG_FECOMPOSITE_OPERATOR_XOR = 5;
 
-  /** @domName SVGFECompositeElement.in1 */
-  final SVGAnimatedString in1;
+  /// @domName SVGFECompositeElement.in1; @docsEditable true
+  final AnimatedString in1;
 
-  /** @domName SVGFECompositeElement.in2 */
-  final SVGAnimatedString in2;
+  /// @domName SVGFECompositeElement.in2; @docsEditable true
+  final AnimatedString in2;
 
-  /** @domName SVGFECompositeElement.k1 */
-  final SVGAnimatedNumber k1;
+  /// @domName SVGFECompositeElement.k1; @docsEditable true
+  final AnimatedNumber k1;
 
-  /** @domName SVGFECompositeElement.k2 */
-  final SVGAnimatedNumber k2;
+  /// @domName SVGFECompositeElement.k2; @docsEditable true
+  final AnimatedNumber k2;
 
-  /** @domName SVGFECompositeElement.k3 */
-  final SVGAnimatedNumber k3;
+  /// @domName SVGFECompositeElement.k3; @docsEditable true
+  final AnimatedNumber k3;
 
-  /** @domName SVGFECompositeElement.k4 */
-  final SVGAnimatedNumber k4;
+  /// @domName SVGFECompositeElement.k4; @docsEditable true
+  final AnimatedNumber k4;
 
-  /** @domName SVGFECompositeElement.operator */
-  final SVGAnimatedEnumeration operator;
+  /// @domName SVGFECompositeElement.operator; @docsEditable true
+  final AnimatedEnumeration operator;
 
   // From SVGFilterPrimitiveStandardAttributes
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.height */
-  final SVGAnimatedLength height;
+  /// @domName SVGFilterPrimitiveStandardAttributes.height; @docsEditable true
+  final AnimatedLength height;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.result */
-  final SVGAnimatedString result;
+  /// @domName SVGFilterPrimitiveStandardAttributes.result; @docsEditable true
+  final AnimatedString result;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.width */
-  final SVGAnimatedLength width;
+  /// @domName SVGFilterPrimitiveStandardAttributes.width; @docsEditable true
+  final AnimatedLength width;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.x */
-  final SVGAnimatedLength x;
+  /// @domName SVGFilterPrimitiveStandardAttributes.x; @docsEditable true
+  final AnimatedLength x;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.y */
-  final SVGAnimatedLength y;
+  /// @domName SVGFilterPrimitiveStandardAttributes.y; @docsEditable true
+  final AnimatedLength y;
 
   // From SVGStylable
 
-  /** @domName SVGStylable.className */
-  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+  /// @domName SVGStylable.className; @docsEditable true
+  AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CSSStyleDeclaration style;
 
-  /** @domName SVGStylable.getPresentationAttribute */
+  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
   CSSValue getPresentationAttribute(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1640,8 +1559,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGFEConvolveMatrixElement
-class SVGFEConvolveMatrixElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes native "*SVGFEConvolveMatrixElement" {
+/// @domName SVGFEConvolveMatrixElement; @docsEditable true
+class FEConvolveMatrixElement extends SvgElement implements FilterPrimitiveStandardAttributes native "*SVGFEConvolveMatrixElement" {
 
   static const int SVG_EDGEMODE_DUPLICATE = 1;
 
@@ -1651,68 +1570,68 @@
 
   static const int SVG_EDGEMODE_WRAP = 2;
 
-  /** @domName SVGFEConvolveMatrixElement.bias */
-  final SVGAnimatedNumber bias;
+  /// @domName SVGFEConvolveMatrixElement.bias; @docsEditable true
+  final AnimatedNumber bias;
 
-  /** @domName SVGFEConvolveMatrixElement.divisor */
-  final SVGAnimatedNumber divisor;
+  /// @domName SVGFEConvolveMatrixElement.divisor; @docsEditable true
+  final AnimatedNumber divisor;
 
-  /** @domName SVGFEConvolveMatrixElement.edgeMode */
-  final SVGAnimatedEnumeration edgeMode;
+  /// @domName SVGFEConvolveMatrixElement.edgeMode; @docsEditable true
+  final AnimatedEnumeration edgeMode;
 
-  /** @domName SVGFEConvolveMatrixElement.in1 */
-  final SVGAnimatedString in1;
+  /// @domName SVGFEConvolveMatrixElement.in1; @docsEditable true
+  final AnimatedString in1;
 
-  /** @domName SVGFEConvolveMatrixElement.kernelMatrix */
-  final SVGAnimatedNumberList kernelMatrix;
+  /// @domName SVGFEConvolveMatrixElement.kernelMatrix; @docsEditable true
+  final AnimatedNumberList kernelMatrix;
 
-  /** @domName SVGFEConvolveMatrixElement.kernelUnitLengthX */
-  final SVGAnimatedNumber kernelUnitLengthX;
+  /// @domName SVGFEConvolveMatrixElement.kernelUnitLengthX; @docsEditable true
+  final AnimatedNumber kernelUnitLengthX;
 
-  /** @domName SVGFEConvolveMatrixElement.kernelUnitLengthY */
-  final SVGAnimatedNumber kernelUnitLengthY;
+  /// @domName SVGFEConvolveMatrixElement.kernelUnitLengthY; @docsEditable true
+  final AnimatedNumber kernelUnitLengthY;
 
-  /** @domName SVGFEConvolveMatrixElement.orderX */
-  final SVGAnimatedInteger orderX;
+  /// @domName SVGFEConvolveMatrixElement.orderX; @docsEditable true
+  final AnimatedInteger orderX;
 
-  /** @domName SVGFEConvolveMatrixElement.orderY */
-  final SVGAnimatedInteger orderY;
+  /// @domName SVGFEConvolveMatrixElement.orderY; @docsEditable true
+  final AnimatedInteger orderY;
 
-  /** @domName SVGFEConvolveMatrixElement.preserveAlpha */
-  final SVGAnimatedBoolean preserveAlpha;
+  /// @domName SVGFEConvolveMatrixElement.preserveAlpha; @docsEditable true
+  final AnimatedBoolean preserveAlpha;
 
-  /** @domName SVGFEConvolveMatrixElement.targetX */
-  final SVGAnimatedInteger targetX;
+  /// @domName SVGFEConvolveMatrixElement.targetX; @docsEditable true
+  final AnimatedInteger targetX;
 
-  /** @domName SVGFEConvolveMatrixElement.targetY */
-  final SVGAnimatedInteger targetY;
+  /// @domName SVGFEConvolveMatrixElement.targetY; @docsEditable true
+  final AnimatedInteger targetY;
 
   // From SVGFilterPrimitiveStandardAttributes
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.height */
-  final SVGAnimatedLength height;
+  /// @domName SVGFilterPrimitiveStandardAttributes.height; @docsEditable true
+  final AnimatedLength height;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.result */
-  final SVGAnimatedString result;
+  /// @domName SVGFilterPrimitiveStandardAttributes.result; @docsEditable true
+  final AnimatedString result;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.width */
-  final SVGAnimatedLength width;
+  /// @domName SVGFilterPrimitiveStandardAttributes.width; @docsEditable true
+  final AnimatedLength width;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.x */
-  final SVGAnimatedLength x;
+  /// @domName SVGFilterPrimitiveStandardAttributes.x; @docsEditable true
+  final AnimatedLength x;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.y */
-  final SVGAnimatedLength y;
+  /// @domName SVGFilterPrimitiveStandardAttributes.y; @docsEditable true
+  final AnimatedLength y;
 
   // From SVGStylable
 
-  /** @domName SVGStylable.className */
-  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+  /// @domName SVGStylable.className; @docsEditable true
+  AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CSSStyleDeclaration style;
 
-  /** @domName SVGStylable.getPresentationAttribute */
+  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
   CSSValue getPresentationAttribute(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1720,50 +1639,50 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGFEDiffuseLightingElement
-class SVGFEDiffuseLightingElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes native "*SVGFEDiffuseLightingElement" {
+/// @domName SVGFEDiffuseLightingElement; @docsEditable true
+class FEDiffuseLightingElement extends SvgElement implements FilterPrimitiveStandardAttributes native "*SVGFEDiffuseLightingElement" {
 
-  /** @domName SVGFEDiffuseLightingElement.diffuseConstant */
-  final SVGAnimatedNumber diffuseConstant;
+  /// @domName SVGFEDiffuseLightingElement.diffuseConstant; @docsEditable true
+  final AnimatedNumber diffuseConstant;
 
-  /** @domName SVGFEDiffuseLightingElement.in1 */
-  final SVGAnimatedString in1;
+  /// @domName SVGFEDiffuseLightingElement.in1; @docsEditable true
+  final AnimatedString in1;
 
-  /** @domName SVGFEDiffuseLightingElement.kernelUnitLengthX */
-  final SVGAnimatedNumber kernelUnitLengthX;
+  /// @domName SVGFEDiffuseLightingElement.kernelUnitLengthX; @docsEditable true
+  final AnimatedNumber kernelUnitLengthX;
 
-  /** @domName SVGFEDiffuseLightingElement.kernelUnitLengthY */
-  final SVGAnimatedNumber kernelUnitLengthY;
+  /// @domName SVGFEDiffuseLightingElement.kernelUnitLengthY; @docsEditable true
+  final AnimatedNumber kernelUnitLengthY;
 
-  /** @domName SVGFEDiffuseLightingElement.surfaceScale */
-  final SVGAnimatedNumber surfaceScale;
+  /// @domName SVGFEDiffuseLightingElement.surfaceScale; @docsEditable true
+  final AnimatedNumber surfaceScale;
 
   // From SVGFilterPrimitiveStandardAttributes
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.height */
-  final SVGAnimatedLength height;
+  /// @domName SVGFilterPrimitiveStandardAttributes.height; @docsEditable true
+  final AnimatedLength height;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.result */
-  final SVGAnimatedString result;
+  /// @domName SVGFilterPrimitiveStandardAttributes.result; @docsEditable true
+  final AnimatedString result;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.width */
-  final SVGAnimatedLength width;
+  /// @domName SVGFilterPrimitiveStandardAttributes.width; @docsEditable true
+  final AnimatedLength width;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.x */
-  final SVGAnimatedLength x;
+  /// @domName SVGFilterPrimitiveStandardAttributes.x; @docsEditable true
+  final AnimatedLength x;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.y */
-  final SVGAnimatedLength y;
+  /// @domName SVGFilterPrimitiveStandardAttributes.y; @docsEditable true
+  final AnimatedLength y;
 
   // From SVGStylable
 
-  /** @domName SVGStylable.className */
-  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+  /// @domName SVGStylable.className; @docsEditable true
+  AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CSSStyleDeclaration style;
 
-  /** @domName SVGStylable.getPresentationAttribute */
+  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
   CSSValue getPresentationAttribute(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1771,8 +1690,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGFEDisplacementMapElement
-class SVGFEDisplacementMapElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes native "*SVGFEDisplacementMapElement" {
+/// @domName SVGFEDisplacementMapElement; @docsEditable true
+class FEDisplacementMapElement extends SvgElement implements FilterPrimitiveStandardAttributes native "*SVGFEDisplacementMapElement" {
 
   static const int SVG_CHANNEL_A = 4;
 
@@ -1784,47 +1703,47 @@
 
   static const int SVG_CHANNEL_UNKNOWN = 0;
 
-  /** @domName SVGFEDisplacementMapElement.in1 */
-  final SVGAnimatedString in1;
+  /// @domName SVGFEDisplacementMapElement.in1; @docsEditable true
+  final AnimatedString in1;
 
-  /** @domName SVGFEDisplacementMapElement.in2 */
-  final SVGAnimatedString in2;
+  /// @domName SVGFEDisplacementMapElement.in2; @docsEditable true
+  final AnimatedString in2;
 
-  /** @domName SVGFEDisplacementMapElement.scale */
-  final SVGAnimatedNumber scale;
+  /// @domName SVGFEDisplacementMapElement.scale; @docsEditable true
+  final AnimatedNumber scale;
 
-  /** @domName SVGFEDisplacementMapElement.xChannelSelector */
-  final SVGAnimatedEnumeration xChannelSelector;
+  /// @domName SVGFEDisplacementMapElement.xChannelSelector; @docsEditable true
+  final AnimatedEnumeration xChannelSelector;
 
-  /** @domName SVGFEDisplacementMapElement.yChannelSelector */
-  final SVGAnimatedEnumeration yChannelSelector;
+  /// @domName SVGFEDisplacementMapElement.yChannelSelector; @docsEditable true
+  final AnimatedEnumeration yChannelSelector;
 
   // From SVGFilterPrimitiveStandardAttributes
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.height */
-  final SVGAnimatedLength height;
+  /// @domName SVGFilterPrimitiveStandardAttributes.height; @docsEditable true
+  final AnimatedLength height;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.result */
-  final SVGAnimatedString result;
+  /// @domName SVGFilterPrimitiveStandardAttributes.result; @docsEditable true
+  final AnimatedString result;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.width */
-  final SVGAnimatedLength width;
+  /// @domName SVGFilterPrimitiveStandardAttributes.width; @docsEditable true
+  final AnimatedLength width;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.x */
-  final SVGAnimatedLength x;
+  /// @domName SVGFilterPrimitiveStandardAttributes.x; @docsEditable true
+  final AnimatedLength x;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.y */
-  final SVGAnimatedLength y;
+  /// @domName SVGFilterPrimitiveStandardAttributes.y; @docsEditable true
+  final AnimatedLength y;
 
   // From SVGStylable
 
-  /** @domName SVGStylable.className */
-  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+  /// @domName SVGStylable.className; @docsEditable true
+  AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CSSStyleDeclaration style;
 
-  /** @domName SVGStylable.getPresentationAttribute */
+  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
   CSSValue getPresentationAttribute(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1832,67 +1751,67 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGFEDistantLightElement
-class SVGFEDistantLightElement extends SVGElement native "*SVGFEDistantLightElement" {
+/// @domName SVGFEDistantLightElement; @docsEditable true
+class FEDistantLightElement extends SvgElement native "*SVGFEDistantLightElement" {
 
-  /** @domName SVGFEDistantLightElement.azimuth */
-  final SVGAnimatedNumber azimuth;
+  /// @domName SVGFEDistantLightElement.azimuth; @docsEditable true
+  final AnimatedNumber azimuth;
 
-  /** @domName SVGFEDistantLightElement.elevation */
-  final SVGAnimatedNumber elevation;
+  /// @domName SVGFEDistantLightElement.elevation; @docsEditable true
+  final AnimatedNumber elevation;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for 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 SVGFEDropShadowElement
-class SVGFEDropShadowElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes native "*SVGFEDropShadowElement" {
+/// @domName SVGFEDropShadowElement; @docsEditable true
+class FEDropShadowElement extends SvgElement implements FilterPrimitiveStandardAttributes native "*SVGFEDropShadowElement" {
 
-  /** @domName SVGFEDropShadowElement.dx */
-  final SVGAnimatedNumber dx;
+  /// @domName SVGFEDropShadowElement.dx; @docsEditable true
+  final AnimatedNumber dx;
 
-  /** @domName SVGFEDropShadowElement.dy */
-  final SVGAnimatedNumber dy;
+  /// @domName SVGFEDropShadowElement.dy; @docsEditable true
+  final AnimatedNumber dy;
 
-  /** @domName SVGFEDropShadowElement.in1 */
-  final SVGAnimatedString in1;
+  /// @domName SVGFEDropShadowElement.in1; @docsEditable true
+  final AnimatedString in1;
 
-  /** @domName SVGFEDropShadowElement.stdDeviationX */
-  final SVGAnimatedNumber stdDeviationX;
+  /// @domName SVGFEDropShadowElement.stdDeviationX; @docsEditable true
+  final AnimatedNumber stdDeviationX;
 
-  /** @domName SVGFEDropShadowElement.stdDeviationY */
-  final SVGAnimatedNumber stdDeviationY;
+  /// @domName SVGFEDropShadowElement.stdDeviationY; @docsEditable true
+  final AnimatedNumber stdDeviationY;
 
-  /** @domName SVGFEDropShadowElement.setStdDeviation */
+  /// @domName SVGFEDropShadowElement.setStdDeviation; @docsEditable true
   void setStdDeviation(num stdDeviationX, num stdDeviationY) native;
 
   // From SVGFilterPrimitiveStandardAttributes
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.height */
-  final SVGAnimatedLength height;
+  /// @domName SVGFilterPrimitiveStandardAttributes.height; @docsEditable true
+  final AnimatedLength height;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.result */
-  final SVGAnimatedString result;
+  /// @domName SVGFilterPrimitiveStandardAttributes.result; @docsEditable true
+  final AnimatedString result;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.width */
-  final SVGAnimatedLength width;
+  /// @domName SVGFilterPrimitiveStandardAttributes.width; @docsEditable true
+  final AnimatedLength width;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.x */
-  final SVGAnimatedLength x;
+  /// @domName SVGFilterPrimitiveStandardAttributes.x; @docsEditable true
+  final AnimatedLength x;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.y */
-  final SVGAnimatedLength y;
+  /// @domName SVGFilterPrimitiveStandardAttributes.y; @docsEditable true
+  final AnimatedLength y;
 
   // From SVGStylable
 
-  /** @domName SVGStylable.className */
-  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+  /// @domName SVGStylable.className; @docsEditable true
+  AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CSSStyleDeclaration style;
 
-  /** @domName SVGStylable.getPresentationAttribute */
+  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
   CSSValue getPresentationAttribute(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1900,35 +1819,35 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGFEFloodElement
-class SVGFEFloodElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes native "*SVGFEFloodElement" {
+/// @domName SVGFEFloodElement; @docsEditable true
+class FEFloodElement extends SvgElement implements FilterPrimitiveStandardAttributes native "*SVGFEFloodElement" {
 
   // From SVGFilterPrimitiveStandardAttributes
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.height */
-  final SVGAnimatedLength height;
+  /// @domName SVGFilterPrimitiveStandardAttributes.height; @docsEditable true
+  final AnimatedLength height;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.result */
-  final SVGAnimatedString result;
+  /// @domName SVGFilterPrimitiveStandardAttributes.result; @docsEditable true
+  final AnimatedString result;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.width */
-  final SVGAnimatedLength width;
+  /// @domName SVGFilterPrimitiveStandardAttributes.width; @docsEditable true
+  final AnimatedLength width;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.x */
-  final SVGAnimatedLength x;
+  /// @domName SVGFilterPrimitiveStandardAttributes.x; @docsEditable true
+  final AnimatedLength x;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.y */
-  final SVGAnimatedLength y;
+  /// @domName SVGFilterPrimitiveStandardAttributes.y; @docsEditable true
+  final AnimatedLength y;
 
   // From SVGStylable
 
-  /** @domName SVGStylable.className */
-  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+  /// @domName SVGStylable.className; @docsEditable true
+  AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CSSStyleDeclaration style;
 
-  /** @domName SVGStylable.getPresentationAttribute */
+  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
   CSSValue getPresentationAttribute(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1936,79 +1855,79 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGFEFuncAElement
-class SVGFEFuncAElement extends SVGComponentTransferFunctionElement native "*SVGFEFuncAElement" {
+/// @domName SVGFEFuncAElement; @docsEditable true
+class FEFuncAElement extends ComponentTransferFunctionElement native "*SVGFEFuncAElement" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for 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 SVGFEFuncBElement
-class SVGFEFuncBElement extends SVGComponentTransferFunctionElement native "*SVGFEFuncBElement" {
+/// @domName SVGFEFuncBElement; @docsEditable true
+class FEFuncBElement extends ComponentTransferFunctionElement native "*SVGFEFuncBElement" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for 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 SVGFEFuncGElement
-class SVGFEFuncGElement extends SVGComponentTransferFunctionElement native "*SVGFEFuncGElement" {
+/// @domName SVGFEFuncGElement; @docsEditable true
+class FEFuncGElement extends ComponentTransferFunctionElement native "*SVGFEFuncGElement" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for 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 SVGFEFuncRElement
-class SVGFEFuncRElement extends SVGComponentTransferFunctionElement native "*SVGFEFuncRElement" {
+/// @domName SVGFEFuncRElement; @docsEditable true
+class FEFuncRElement extends ComponentTransferFunctionElement native "*SVGFEFuncRElement" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for 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 SVGFEGaussianBlurElement
-class SVGFEGaussianBlurElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes native "*SVGFEGaussianBlurElement" {
+/// @domName SVGFEGaussianBlurElement; @docsEditable true
+class FEGaussianBlurElement extends SvgElement implements FilterPrimitiveStandardAttributes native "*SVGFEGaussianBlurElement" {
 
-  /** @domName SVGFEGaussianBlurElement.in1 */
-  final SVGAnimatedString in1;
+  /// @domName SVGFEGaussianBlurElement.in1; @docsEditable true
+  final AnimatedString in1;
 
-  /** @domName SVGFEGaussianBlurElement.stdDeviationX */
-  final SVGAnimatedNumber stdDeviationX;
+  /// @domName SVGFEGaussianBlurElement.stdDeviationX; @docsEditable true
+  final AnimatedNumber stdDeviationX;
 
-  /** @domName SVGFEGaussianBlurElement.stdDeviationY */
-  final SVGAnimatedNumber stdDeviationY;
+  /// @domName SVGFEGaussianBlurElement.stdDeviationY; @docsEditable true
+  final AnimatedNumber stdDeviationY;
 
-  /** @domName SVGFEGaussianBlurElement.setStdDeviation */
+  /// @domName SVGFEGaussianBlurElement.setStdDeviation; @docsEditable true
   void setStdDeviation(num stdDeviationX, num stdDeviationY) native;
 
   // From SVGFilterPrimitiveStandardAttributes
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.height */
-  final SVGAnimatedLength height;
+  /// @domName SVGFilterPrimitiveStandardAttributes.height; @docsEditable true
+  final AnimatedLength height;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.result */
-  final SVGAnimatedString result;
+  /// @domName SVGFilterPrimitiveStandardAttributes.result; @docsEditable true
+  final AnimatedString result;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.width */
-  final SVGAnimatedLength width;
+  /// @domName SVGFilterPrimitiveStandardAttributes.width; @docsEditable true
+  final AnimatedLength width;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.x */
-  final SVGAnimatedLength x;
+  /// @domName SVGFilterPrimitiveStandardAttributes.x; @docsEditable true
+  final AnimatedLength x;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.y */
-  final SVGAnimatedLength y;
+  /// @domName SVGFilterPrimitiveStandardAttributes.y; @docsEditable true
+  final AnimatedLength y;
 
   // From SVGStylable
 
-  /** @domName SVGStylable.className */
-  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+  /// @domName SVGStylable.className; @docsEditable true
+  AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CSSStyleDeclaration style;
 
-  /** @domName SVGStylable.getPresentationAttribute */
+  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
   CSSValue getPresentationAttribute(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2016,92 +1935,92 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGFEImageElement
-class SVGFEImageElement extends SVGElement implements SVGURIReference, SVGLangSpace, SVGFilterPrimitiveStandardAttributes, SVGExternalResourcesRequired native "*SVGFEImageElement" {
+/// @domName SVGFEImageElement; @docsEditable true
+class FEImageElement extends SvgElement implements FilterPrimitiveStandardAttributes, UriReference, ExternalResourcesRequired, LangSpace native "*SVGFEImageElement" {
 
-  /** @domName SVGFEImageElement.preserveAspectRatio */
-  final SVGAnimatedPreserveAspectRatio preserveAspectRatio;
+  /// @domName SVGFEImageElement.preserveAspectRatio; @docsEditable true
+  final AnimatedPreserveAspectRatio preserveAspectRatio;
 
   // From SVGExternalResourcesRequired
 
-  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
-  final SVGAnimatedBoolean externalResourcesRequired;
+  /// @domName SVGExternalResourcesRequired.externalResourcesRequired; @docsEditable true
+  final AnimatedBoolean externalResourcesRequired;
 
   // From SVGFilterPrimitiveStandardAttributes
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.height */
-  final SVGAnimatedLength height;
+  /// @domName SVGFilterPrimitiveStandardAttributes.height; @docsEditable true
+  final AnimatedLength height;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.result */
-  final SVGAnimatedString result;
+  /// @domName SVGFilterPrimitiveStandardAttributes.result; @docsEditable true
+  final AnimatedString result;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.width */
-  final SVGAnimatedLength width;
+  /// @domName SVGFilterPrimitiveStandardAttributes.width; @docsEditable true
+  final AnimatedLength width;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.x */
-  final SVGAnimatedLength x;
+  /// @domName SVGFilterPrimitiveStandardAttributes.x; @docsEditable true
+  final AnimatedLength x;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.y */
-  final SVGAnimatedLength y;
+  /// @domName SVGFilterPrimitiveStandardAttributes.y; @docsEditable true
+  final AnimatedLength y;
 
   // From SVGLangSpace
 
-  /** @domName SVGLangSpace.xmllang */
+  /// @domName SVGLangSpace.xmllang; @docsEditable true
   String xmllang;
 
-  /** @domName SVGLangSpace.xmlspace */
+  /// @domName SVGLangSpace.xmlspace; @docsEditable true
   String xmlspace;
 
   // From SVGStylable
 
-  /** @domName SVGStylable.className */
-  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+  /// @domName SVGStylable.className; @docsEditable true
+  AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CSSStyleDeclaration style;
 
-  /** @domName SVGStylable.getPresentationAttribute */
+  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
   CSSValue getPresentationAttribute(String name) native;
 
   // From SVGURIReference
 
-  /** @domName SVGURIReference.href */
-  final SVGAnimatedString href;
+  /// @domName SVGURIReference.href; @docsEditable true
+  final AnimatedString href;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGFEMergeElement
-class SVGFEMergeElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes native "*SVGFEMergeElement" {
+/// @domName SVGFEMergeElement; @docsEditable true
+class FEMergeElement extends SvgElement implements FilterPrimitiveStandardAttributes native "*SVGFEMergeElement" {
 
   // From SVGFilterPrimitiveStandardAttributes
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.height */
-  final SVGAnimatedLength height;
+  /// @domName SVGFilterPrimitiveStandardAttributes.height; @docsEditable true
+  final AnimatedLength height;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.result */
-  final SVGAnimatedString result;
+  /// @domName SVGFilterPrimitiveStandardAttributes.result; @docsEditable true
+  final AnimatedString result;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.width */
-  final SVGAnimatedLength width;
+  /// @domName SVGFilterPrimitiveStandardAttributes.width; @docsEditable true
+  final AnimatedLength width;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.x */
-  final SVGAnimatedLength x;
+  /// @domName SVGFilterPrimitiveStandardAttributes.x; @docsEditable true
+  final AnimatedLength x;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.y */
-  final SVGAnimatedLength y;
+  /// @domName SVGFilterPrimitiveStandardAttributes.y; @docsEditable true
+  final AnimatedLength y;
 
   // From SVGStylable
 
-  /** @domName SVGStylable.className */
-  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+  /// @domName SVGStylable.className; @docsEditable true
+  AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CSSStyleDeclaration style;
 
-  /** @domName SVGStylable.getPresentationAttribute */
+  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
   CSSValue getPresentationAttribute(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2109,19 +2028,19 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGFEMergeNodeElement
-class SVGFEMergeNodeElement extends SVGElement native "*SVGFEMergeNodeElement" {
+/// @domName SVGFEMergeNodeElement; @docsEditable true
+class FEMergeNodeElement extends SvgElement native "*SVGFEMergeNodeElement" {
 
-  /** @domName SVGFEMergeNodeElement.in1 */
-  final SVGAnimatedString in1;
+  /// @domName SVGFEMergeNodeElement.in1; @docsEditable true
+  final AnimatedString in1;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for 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 SVGFEMorphologyElement
-class SVGFEMorphologyElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes native "*SVGFEMorphologyElement" {
+/// @domName SVGFEMorphologyElement; @docsEditable true
+class FEMorphologyElement extends SvgElement implements FilterPrimitiveStandardAttributes native "*SVGFEMorphologyElement" {
 
   static const int SVG_MORPHOLOGY_OPERATOR_DILATE = 2;
 
@@ -2129,47 +2048,47 @@
 
   static const int SVG_MORPHOLOGY_OPERATOR_UNKNOWN = 0;
 
-  /** @domName SVGFEMorphologyElement.in1 */
-  final SVGAnimatedString in1;
+  /// @domName SVGFEMorphologyElement.in1; @docsEditable true
+  final AnimatedString in1;
 
-  /** @domName SVGFEMorphologyElement.operator */
-  final SVGAnimatedEnumeration operator;
+  /// @domName SVGFEMorphologyElement.operator; @docsEditable true
+  final AnimatedEnumeration operator;
 
-  /** @domName SVGFEMorphologyElement.radiusX */
-  final SVGAnimatedNumber radiusX;
+  /// @domName SVGFEMorphologyElement.radiusX; @docsEditable true
+  final AnimatedNumber radiusX;
 
-  /** @domName SVGFEMorphologyElement.radiusY */
-  final SVGAnimatedNumber radiusY;
+  /// @domName SVGFEMorphologyElement.radiusY; @docsEditable true
+  final AnimatedNumber radiusY;
 
-  /** @domName SVGFEMorphologyElement.setRadius */
+  /// @domName SVGFEMorphologyElement.setRadius; @docsEditable true
   void setRadius(num radiusX, num radiusY) native;
 
   // From SVGFilterPrimitiveStandardAttributes
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.height */
-  final SVGAnimatedLength height;
+  /// @domName SVGFilterPrimitiveStandardAttributes.height; @docsEditable true
+  final AnimatedLength height;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.result */
-  final SVGAnimatedString result;
+  /// @domName SVGFilterPrimitiveStandardAttributes.result; @docsEditable true
+  final AnimatedString result;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.width */
-  final SVGAnimatedLength width;
+  /// @domName SVGFilterPrimitiveStandardAttributes.width; @docsEditable true
+  final AnimatedLength width;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.x */
-  final SVGAnimatedLength x;
+  /// @domName SVGFilterPrimitiveStandardAttributes.x; @docsEditable true
+  final AnimatedLength x;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.y */
-  final SVGAnimatedLength y;
+  /// @domName SVGFilterPrimitiveStandardAttributes.y; @docsEditable true
+  final AnimatedLength y;
 
   // From SVGStylable
 
-  /** @domName SVGStylable.className */
-  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+  /// @domName SVGStylable.className; @docsEditable true
+  AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CSSStyleDeclaration style;
 
-  /** @domName SVGStylable.getPresentationAttribute */
+  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
   CSSValue getPresentationAttribute(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2177,44 +2096,44 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGFEOffsetElement
-class SVGFEOffsetElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes native "*SVGFEOffsetElement" {
+/// @domName SVGFEOffsetElement; @docsEditable true
+class FEOffsetElement extends SvgElement implements FilterPrimitiveStandardAttributes native "*SVGFEOffsetElement" {
 
-  /** @domName SVGFEOffsetElement.dx */
-  final SVGAnimatedNumber dx;
+  /// @domName SVGFEOffsetElement.dx; @docsEditable true
+  final AnimatedNumber dx;
 
-  /** @domName SVGFEOffsetElement.dy */
-  final SVGAnimatedNumber dy;
+  /// @domName SVGFEOffsetElement.dy; @docsEditable true
+  final AnimatedNumber dy;
 
-  /** @domName SVGFEOffsetElement.in1 */
-  final SVGAnimatedString in1;
+  /// @domName SVGFEOffsetElement.in1; @docsEditable true
+  final AnimatedString in1;
 
   // From SVGFilterPrimitiveStandardAttributes
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.height */
-  final SVGAnimatedLength height;
+  /// @domName SVGFilterPrimitiveStandardAttributes.height; @docsEditable true
+  final AnimatedLength height;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.result */
-  final SVGAnimatedString result;
+  /// @domName SVGFilterPrimitiveStandardAttributes.result; @docsEditable true
+  final AnimatedString result;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.width */
-  final SVGAnimatedLength width;
+  /// @domName SVGFilterPrimitiveStandardAttributes.width; @docsEditable true
+  final AnimatedLength width;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.x */
-  final SVGAnimatedLength x;
+  /// @domName SVGFilterPrimitiveStandardAttributes.x; @docsEditable true
+  final AnimatedLength x;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.y */
-  final SVGAnimatedLength y;
+  /// @domName SVGFilterPrimitiveStandardAttributes.y; @docsEditable true
+  final AnimatedLength y;
 
   // From SVGStylable
 
-  /** @domName SVGStylable.className */
-  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+  /// @domName SVGStylable.className; @docsEditable true
+  AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CSSStyleDeclaration style;
 
-  /** @domName SVGStylable.getPresentationAttribute */
+  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
   CSSValue getPresentationAttribute(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2222,64 +2141,64 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGFEPointLightElement
-class SVGFEPointLightElement extends SVGElement native "*SVGFEPointLightElement" {
+/// @domName SVGFEPointLightElement; @docsEditable true
+class FEPointLightElement extends SvgElement native "*SVGFEPointLightElement" {
 
-  /** @domName SVGFEPointLightElement.x */
-  final SVGAnimatedNumber x;
+  /// @domName SVGFEPointLightElement.x; @docsEditable true
+  final AnimatedNumber x;
 
-  /** @domName SVGFEPointLightElement.y */
-  final SVGAnimatedNumber y;
+  /// @domName SVGFEPointLightElement.y; @docsEditable true
+  final AnimatedNumber y;
 
-  /** @domName SVGFEPointLightElement.z */
-  final SVGAnimatedNumber z;
+  /// @domName SVGFEPointLightElement.z; @docsEditable true
+  final AnimatedNumber z;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGFESpecularLightingElement
-class SVGFESpecularLightingElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes native "*SVGFESpecularLightingElement" {
+/// @domName SVGFESpecularLightingElement; @docsEditable true
+class FESpecularLightingElement extends SvgElement implements FilterPrimitiveStandardAttributes native "*SVGFESpecularLightingElement" {
 
-  /** @domName SVGFESpecularLightingElement.in1 */
-  final SVGAnimatedString in1;
+  /// @domName SVGFESpecularLightingElement.in1; @docsEditable true
+  final AnimatedString in1;
 
-  /** @domName SVGFESpecularLightingElement.specularConstant */
-  final SVGAnimatedNumber specularConstant;
+  /// @domName SVGFESpecularLightingElement.specularConstant; @docsEditable true
+  final AnimatedNumber specularConstant;
 
-  /** @domName SVGFESpecularLightingElement.specularExponent */
-  final SVGAnimatedNumber specularExponent;
+  /// @domName SVGFESpecularLightingElement.specularExponent; @docsEditable true
+  final AnimatedNumber specularExponent;
 
-  /** @domName SVGFESpecularLightingElement.surfaceScale */
-  final SVGAnimatedNumber surfaceScale;
+  /// @domName SVGFESpecularLightingElement.surfaceScale; @docsEditable true
+  final AnimatedNumber surfaceScale;
 
   // From SVGFilterPrimitiveStandardAttributes
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.height */
-  final SVGAnimatedLength height;
+  /// @domName SVGFilterPrimitiveStandardAttributes.height; @docsEditable true
+  final AnimatedLength height;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.result */
-  final SVGAnimatedString result;
+  /// @domName SVGFilterPrimitiveStandardAttributes.result; @docsEditable true
+  final AnimatedString result;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.width */
-  final SVGAnimatedLength width;
+  /// @domName SVGFilterPrimitiveStandardAttributes.width; @docsEditable true
+  final AnimatedLength width;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.x */
-  final SVGAnimatedLength x;
+  /// @domName SVGFilterPrimitiveStandardAttributes.x; @docsEditable true
+  final AnimatedLength x;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.y */
-  final SVGAnimatedLength y;
+  /// @domName SVGFilterPrimitiveStandardAttributes.y; @docsEditable true
+  final AnimatedLength y;
 
   // From SVGStylable
 
-  /** @domName SVGStylable.className */
-  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+  /// @domName SVGStylable.className; @docsEditable true
+  AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CSSStyleDeclaration style;
 
-  /** @domName SVGStylable.getPresentationAttribute */
+  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
   CSSValue getPresentationAttribute(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2287,70 +2206,70 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGFESpotLightElement
-class SVGFESpotLightElement extends SVGElement native "*SVGFESpotLightElement" {
+/// @domName SVGFESpotLightElement; @docsEditable true
+class FESpotLightElement extends SvgElement native "*SVGFESpotLightElement" {
 
-  /** @domName SVGFESpotLightElement.limitingConeAngle */
-  final SVGAnimatedNumber limitingConeAngle;
+  /// @domName SVGFESpotLightElement.limitingConeAngle; @docsEditable true
+  final AnimatedNumber limitingConeAngle;
 
-  /** @domName SVGFESpotLightElement.pointsAtX */
-  final SVGAnimatedNumber pointsAtX;
+  /// @domName SVGFESpotLightElement.pointsAtX; @docsEditable true
+  final AnimatedNumber pointsAtX;
 
-  /** @domName SVGFESpotLightElement.pointsAtY */
-  final SVGAnimatedNumber pointsAtY;
+  /// @domName SVGFESpotLightElement.pointsAtY; @docsEditable true
+  final AnimatedNumber pointsAtY;
 
-  /** @domName SVGFESpotLightElement.pointsAtZ */
-  final SVGAnimatedNumber pointsAtZ;
+  /// @domName SVGFESpotLightElement.pointsAtZ; @docsEditable true
+  final AnimatedNumber pointsAtZ;
 
-  /** @domName SVGFESpotLightElement.specularExponent */
-  final SVGAnimatedNumber specularExponent;
+  /// @domName SVGFESpotLightElement.specularExponent; @docsEditable true
+  final AnimatedNumber specularExponent;
 
-  /** @domName SVGFESpotLightElement.x */
-  final SVGAnimatedNumber x;
+  /// @domName SVGFESpotLightElement.x; @docsEditable true
+  final AnimatedNumber x;
 
-  /** @domName SVGFESpotLightElement.y */
-  final SVGAnimatedNumber y;
+  /// @domName SVGFESpotLightElement.y; @docsEditable true
+  final AnimatedNumber y;
 
-  /** @domName SVGFESpotLightElement.z */
-  final SVGAnimatedNumber z;
+  /// @domName SVGFESpotLightElement.z; @docsEditable true
+  final AnimatedNumber z;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGFETileElement
-class SVGFETileElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes native "*SVGFETileElement" {
+/// @domName SVGFETileElement; @docsEditable true
+class FETileElement extends SvgElement implements FilterPrimitiveStandardAttributes native "*SVGFETileElement" {
 
-  /** @domName SVGFETileElement.in1 */
-  final SVGAnimatedString in1;
+  /// @domName SVGFETileElement.in1; @docsEditable true
+  final AnimatedString in1;
 
   // From SVGFilterPrimitiveStandardAttributes
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.height */
-  final SVGAnimatedLength height;
+  /// @domName SVGFilterPrimitiveStandardAttributes.height; @docsEditable true
+  final AnimatedLength height;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.result */
-  final SVGAnimatedString result;
+  /// @domName SVGFilterPrimitiveStandardAttributes.result; @docsEditable true
+  final AnimatedString result;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.width */
-  final SVGAnimatedLength width;
+  /// @domName SVGFilterPrimitiveStandardAttributes.width; @docsEditable true
+  final AnimatedLength width;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.x */
-  final SVGAnimatedLength x;
+  /// @domName SVGFilterPrimitiveStandardAttributes.x; @docsEditable true
+  final AnimatedLength x;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.y */
-  final SVGAnimatedLength y;
+  /// @domName SVGFilterPrimitiveStandardAttributes.y; @docsEditable true
+  final AnimatedLength y;
 
   // From SVGStylable
 
-  /** @domName SVGStylable.className */
-  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+  /// @domName SVGStylable.className; @docsEditable true
+  AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CSSStyleDeclaration style;
 
-  /** @domName SVGStylable.getPresentationAttribute */
+  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
   CSSValue getPresentationAttribute(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2358,8 +2277,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGFETurbulenceElement
-class SVGFETurbulenceElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes native "*SVGFETurbulenceElement" {
+/// @domName SVGFETurbulenceElement; @docsEditable true
+class FETurbulenceElement extends SvgElement implements FilterPrimitiveStandardAttributes native "*SVGFETurbulenceElement" {
 
   static const int SVG_STITCHTYPE_NOSTITCH = 2;
 
@@ -2373,50 +2292,50 @@
 
   static const int SVG_TURBULENCE_TYPE_UNKNOWN = 0;
 
-  /** @domName SVGFETurbulenceElement.baseFrequencyX */
-  final SVGAnimatedNumber baseFrequencyX;
+  /// @domName SVGFETurbulenceElement.baseFrequencyX; @docsEditable true
+  final AnimatedNumber baseFrequencyX;
 
-  /** @domName SVGFETurbulenceElement.baseFrequencyY */
-  final SVGAnimatedNumber baseFrequencyY;
+  /// @domName SVGFETurbulenceElement.baseFrequencyY; @docsEditable true
+  final AnimatedNumber baseFrequencyY;
 
-  /** @domName SVGFETurbulenceElement.numOctaves */
-  final SVGAnimatedInteger numOctaves;
+  /// @domName SVGFETurbulenceElement.numOctaves; @docsEditable true
+  final AnimatedInteger numOctaves;
 
-  /** @domName SVGFETurbulenceElement.seed */
-  final SVGAnimatedNumber seed;
+  /// @domName SVGFETurbulenceElement.seed; @docsEditable true
+  final AnimatedNumber seed;
 
-  /** @domName SVGFETurbulenceElement.stitchTiles */
-  final SVGAnimatedEnumeration stitchTiles;
+  /// @domName SVGFETurbulenceElement.stitchTiles; @docsEditable true
+  final AnimatedEnumeration stitchTiles;
 
-  /** @domName SVGFETurbulenceElement.type */
-  final SVGAnimatedEnumeration type;
+  /// @domName SVGFETurbulenceElement.type; @docsEditable true
+  final AnimatedEnumeration type;
 
   // From SVGFilterPrimitiveStandardAttributes
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.height */
-  final SVGAnimatedLength height;
+  /// @domName SVGFilterPrimitiveStandardAttributes.height; @docsEditable true
+  final AnimatedLength height;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.result */
-  final SVGAnimatedString result;
+  /// @domName SVGFilterPrimitiveStandardAttributes.result; @docsEditable true
+  final AnimatedString result;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.width */
-  final SVGAnimatedLength width;
+  /// @domName SVGFilterPrimitiveStandardAttributes.width; @docsEditable true
+  final AnimatedLength width;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.x */
-  final SVGAnimatedLength x;
+  /// @domName SVGFilterPrimitiveStandardAttributes.x; @docsEditable true
+  final AnimatedLength x;
 
-  /** @domName SVGFilterPrimitiveStandardAttributes.y */
-  final SVGAnimatedLength y;
+  /// @domName SVGFilterPrimitiveStandardAttributes.y; @docsEditable true
+  final AnimatedLength y;
 
   // From SVGStylable
 
-  /** @domName SVGStylable.className */
-  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+  /// @domName SVGStylable.className; @docsEditable true
+  AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CSSStyleDeclaration style;
 
-  /** @domName SVGStylable.getPresentationAttribute */
+  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
   CSSValue getPresentationAttribute(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2424,64 +2343,66 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGFilterElement
-class SVGFilterElement extends SVGElement implements SVGURIReference, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable native "*SVGFilterElement" {
+/// @domName SVGFilterElement; @docsEditable true
+class FilterElement extends SvgElement implements UriReference, ExternalResourcesRequired, Stylable, LangSpace native "*SVGFilterElement" {
 
-  /** @domName SVGFilterElement.filterResX */
-  final SVGAnimatedInteger filterResX;
+  factory FilterElement() => _SvgElementFactoryProvider.createSvgElement_tag("filter");
 
-  /** @domName SVGFilterElement.filterResY */
-  final SVGAnimatedInteger filterResY;
+  /// @domName SVGFilterElement.filterResX; @docsEditable true
+  final AnimatedInteger filterResX;
 
-  /** @domName SVGFilterElement.filterUnits */
-  final SVGAnimatedEnumeration filterUnits;
+  /// @domName SVGFilterElement.filterResY; @docsEditable true
+  final AnimatedInteger filterResY;
 
-  /** @domName SVGFilterElement.height */
-  final SVGAnimatedLength height;
+  /// @domName SVGFilterElement.filterUnits; @docsEditable true
+  final AnimatedEnumeration filterUnits;
 
-  /** @domName SVGFilterElement.primitiveUnits */
-  final SVGAnimatedEnumeration primitiveUnits;
+  /// @domName SVGFilterElement.height; @docsEditable true
+  final AnimatedLength height;
 
-  /** @domName SVGFilterElement.width */
-  final SVGAnimatedLength width;
+  /// @domName SVGFilterElement.primitiveUnits; @docsEditable true
+  final AnimatedEnumeration primitiveUnits;
 
-  /** @domName SVGFilterElement.x */
-  final SVGAnimatedLength x;
+  /// @domName SVGFilterElement.width; @docsEditable true
+  final AnimatedLength width;
 
-  /** @domName SVGFilterElement.y */
-  final SVGAnimatedLength y;
+  /// @domName SVGFilterElement.x; @docsEditable true
+  final AnimatedLength x;
 
-  /** @domName SVGFilterElement.setFilterRes */
+  /// @domName SVGFilterElement.y; @docsEditable true
+  final AnimatedLength y;
+
+  /// @domName SVGFilterElement.setFilterRes; @docsEditable true
   void setFilterRes(int filterResX, int filterResY) native;
 
   // From SVGExternalResourcesRequired
 
-  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
-  final SVGAnimatedBoolean externalResourcesRequired;
+  /// @domName SVGExternalResourcesRequired.externalResourcesRequired; @docsEditable true
+  final AnimatedBoolean externalResourcesRequired;
 
   // From SVGLangSpace
 
-  /** @domName SVGLangSpace.xmllang */
+  /// @domName SVGLangSpace.xmllang; @docsEditable true
   String xmllang;
 
-  /** @domName SVGLangSpace.xmlspace */
+  /// @domName SVGLangSpace.xmlspace; @docsEditable true
   String xmlspace;
 
   // From SVGStylable
 
-  /** @domName SVGStylable.className */
-  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+  /// @domName SVGStylable.className; @docsEditable true
+  AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CSSStyleDeclaration style;
 
-  /** @domName SVGStylable.getPresentationAttribute */
+  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
   CSSValue getPresentationAttribute(String name) native;
 
   // From SVGURIReference
 
-  /** @domName SVGURIReference.href */
-  final SVGAnimatedString href;
+  /// @domName SVGURIReference.href; @docsEditable true
+  final AnimatedString href;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -2489,25 +2410,25 @@
 
 
 /// @domName SVGFilterPrimitiveStandardAttributes
-abstract class SVGFilterPrimitiveStandardAttributes implements SVGStylable {
+abstract class FilterPrimitiveStandardAttributes implements Stylable {
 
-  SVGAnimatedLength height;
+  AnimatedLength height;
 
-  SVGAnimatedString result;
+  AnimatedString result;
 
-  SVGAnimatedLength width;
+  AnimatedLength width;
 
-  SVGAnimatedLength x;
+  AnimatedLength x;
 
-  SVGAnimatedLength y;
+  AnimatedLength y;
 
   // From SVGStylable
 
-  SVGAnimatedString className;
+  AnimatedString className;
 
   CSSStyleDeclaration style;
 
-  /** @domName SVGStylable.getPresentationAttribute */
+  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
   CSSValue getPresentationAttribute(String name);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2516,271 +2437,289 @@
 
 
 /// @domName SVGFitToViewBox
-abstract class SVGFitToViewBox {
+abstract class FitToViewBox {
 
-  SVGAnimatedPreserveAspectRatio preserveAspectRatio;
+  AnimatedPreserveAspectRatio preserveAspectRatio;
 
-  SVGAnimatedRect viewBox;
+  AnimatedRect viewBox;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGFontElement
-class SVGFontElement extends SVGElement native "*SVGFontElement" {
+/// @domName SVGFontElement; @docsEditable true
+class FontElement extends SvgElement native "*SVGFontElement" {
+
+  factory FontElement() => _SvgElementFactoryProvider.createSvgElement_tag("font");
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for 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 SVGFontFaceElement
-class SVGFontFaceElement extends SVGElement native "*SVGFontFaceElement" {
+/// @domName SVGFontFaceElement; @docsEditable true
+class FontFaceElement extends SvgElement native "*SVGFontFaceElement" {
+
+  factory FontFaceElement() => _SvgElementFactoryProvider.createSvgElement_tag("font-face");
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for 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 SVGFontFaceFormatElement
-class SVGFontFaceFormatElement extends SVGElement native "*SVGFontFaceFormatElement" {
+/// @domName SVGFontFaceFormatElement; @docsEditable true
+class FontFaceFormatElement extends SvgElement native "*SVGFontFaceFormatElement" {
+
+  factory FontFaceFormatElement() => _SvgElementFactoryProvider.createSvgElement_tag("font-face-format");
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for 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 SVGFontFaceNameElement
-class SVGFontFaceNameElement extends SVGElement native "*SVGFontFaceNameElement" {
+/// @domName SVGFontFaceNameElement; @docsEditable true
+class FontFaceNameElement extends SvgElement native "*SVGFontFaceNameElement" {
+
+  factory FontFaceNameElement() => _SvgElementFactoryProvider.createSvgElement_tag("font-face-name");
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGFontFaceSrcElement
-class SVGFontFaceSrcElement extends SVGElement native "*SVGFontFaceSrcElement" {
+/// @domName SVGFontFaceSrcElement; @docsEditable true
+class FontFaceSrcElement extends SvgElement native "*SVGFontFaceSrcElement" {
+
+  factory FontFaceSrcElement() => _SvgElementFactoryProvider.createSvgElement_tag("font-face-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 SVGFontFaceUriElement
-class SVGFontFaceUriElement extends SVGElement native "*SVGFontFaceUriElement" {
+/// @domName SVGFontFaceUriElement; @docsEditable true
+class FontFaceUriElement extends SvgElement native "*SVGFontFaceUriElement" {
+
+  factory FontFaceUriElement() => _SvgElementFactoryProvider.createSvgElement_tag("font-face-uri");
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for 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 SVGForeignObjectElement
-class SVGForeignObjectElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired native "*SVGForeignObjectElement" {
+/// @domName SVGForeignObjectElement; @docsEditable true
+class ForeignObjectElement extends SvgElement implements Transformable, Tests, Stylable, ExternalResourcesRequired, LangSpace native "*SVGForeignObjectElement" {
 
-  /** @domName SVGForeignObjectElement.height */
-  final SVGAnimatedLength height;
+  factory ForeignObjectElement() => _SvgElementFactoryProvider.createSvgElement_tag("foreignObject");
 
-  /** @domName SVGForeignObjectElement.width */
-  final SVGAnimatedLength width;
+  /// @domName SVGForeignObjectElement.height; @docsEditable true
+  final AnimatedLength height;
 
-  /** @domName SVGForeignObjectElement.x */
-  final SVGAnimatedLength x;
+  /// @domName SVGForeignObjectElement.width; @docsEditable true
+  final AnimatedLength width;
 
-  /** @domName SVGForeignObjectElement.y */
-  final SVGAnimatedLength y;
+  /// @domName SVGForeignObjectElement.x; @docsEditable true
+  final AnimatedLength x;
+
+  /// @domName SVGForeignObjectElement.y; @docsEditable true
+  final AnimatedLength y;
 
   // From SVGExternalResourcesRequired
 
-  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
-  final SVGAnimatedBoolean externalResourcesRequired;
+  /// @domName SVGExternalResourcesRequired.externalResourcesRequired; @docsEditable true
+  final AnimatedBoolean externalResourcesRequired;
 
   // From SVGLangSpace
 
-  /** @domName SVGLangSpace.xmllang */
+  /// @domName SVGLangSpace.xmllang; @docsEditable true
   String xmllang;
 
-  /** @domName SVGLangSpace.xmlspace */
+  /// @domName SVGLangSpace.xmlspace; @docsEditable true
   String xmlspace;
 
   // From SVGLocatable
 
-  /** @domName SVGLocatable.farthestViewportElement */
-  final SVGElement farthestViewportElement;
+  /// @domName SVGLocatable.farthestViewportElement; @docsEditable true
+  final SvgElement farthestViewportElement;
 
-  /** @domName SVGLocatable.nearestViewportElement */
-  final SVGElement nearestViewportElement;
+  /// @domName SVGLocatable.nearestViewportElement; @docsEditable true
+  final SvgElement nearestViewportElement;
 
-  /** @domName SVGLocatable.getBBox */
-  SVGRect getBBox() native;
+  /// @domName SVGLocatable.getBBox; @docsEditable true
+  Rect getBBox() native;
 
-  /** @domName SVGLocatable.getCTM */
-  SVGMatrix getCTM() native;
+  /// @domName SVGLocatable.getCTM; @docsEditable true
+  Matrix getCTM() native;
 
-  /** @domName SVGLocatable.getScreenCTM */
-  SVGMatrix getScreenCTM() native;
+  /// @domName SVGLocatable.getScreenCTM; @docsEditable true
+  Matrix getScreenCTM() native;
 
-  /** @domName SVGLocatable.getTransformToElement */
-  SVGMatrix getTransformToElement(SVGElement element) native;
+  /// @domName SVGLocatable.getTransformToElement; @docsEditable true
+  Matrix getTransformToElement(SvgElement element) native;
 
   // From SVGStylable
 
-  /** @domName SVGStylable.className */
-  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+  /// @domName SVGStylable.className; @docsEditable true
+  AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CSSStyleDeclaration style;
 
-  /** @domName SVGStylable.getPresentationAttribute */
+  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
   CSSValue getPresentationAttribute(String name) native;
 
   // From SVGTests
 
-  /** @domName SVGTests.requiredExtensions */
-  final SVGStringList requiredExtensions;
+  /// @domName SVGTests.requiredExtensions; @docsEditable true
+  final StringList requiredExtensions;
 
-  /** @domName SVGTests.requiredFeatures */
-  final SVGStringList requiredFeatures;
+  /// @domName SVGTests.requiredFeatures; @docsEditable true
+  final StringList requiredFeatures;
 
-  /** @domName SVGTests.systemLanguage */
-  final SVGStringList systemLanguage;
+  /// @domName SVGTests.systemLanguage; @docsEditable true
+  final StringList systemLanguage;
 
-  /** @domName SVGTests.hasExtension */
+  /// @domName SVGTests.hasExtension; @docsEditable true
   bool hasExtension(String extension) native;
 
   // From SVGTransformable
 
-  /** @domName SVGTransformable.transform */
-  final SVGAnimatedTransformList transform;
+  /// @domName SVGTransformable.transform; @docsEditable true
+  final AnimatedTransformList transform;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGGElement
-class SVGGElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired native "*SVGGElement" {
+/// @domName SVGGElement; @docsEditable true
+class GElement extends SvgElement implements Transformable, Tests, Stylable, ExternalResourcesRequired, LangSpace native "*SVGGElement" {
+
+  factory GElement() => _SvgElementFactoryProvider.createSvgElement_tag("g");
 
   // From SVGExternalResourcesRequired
 
-  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
-  final SVGAnimatedBoolean externalResourcesRequired;
+  /// @domName SVGExternalResourcesRequired.externalResourcesRequired; @docsEditable true
+  final AnimatedBoolean externalResourcesRequired;
 
   // From SVGLangSpace
 
-  /** @domName SVGLangSpace.xmllang */
+  /// @domName SVGLangSpace.xmllang; @docsEditable true
   String xmllang;
 
-  /** @domName SVGLangSpace.xmlspace */
+  /// @domName SVGLangSpace.xmlspace; @docsEditable true
   String xmlspace;
 
   // From SVGLocatable
 
-  /** @domName SVGLocatable.farthestViewportElement */
-  final SVGElement farthestViewportElement;
+  /// @domName SVGLocatable.farthestViewportElement; @docsEditable true
+  final SvgElement farthestViewportElement;
 
-  /** @domName SVGLocatable.nearestViewportElement */
-  final SVGElement nearestViewportElement;
+  /// @domName SVGLocatable.nearestViewportElement; @docsEditable true
+  final SvgElement nearestViewportElement;
 
-  /** @domName SVGLocatable.getBBox */
-  SVGRect getBBox() native;
+  /// @domName SVGLocatable.getBBox; @docsEditable true
+  Rect getBBox() native;
 
-  /** @domName SVGLocatable.getCTM */
-  SVGMatrix getCTM() native;
+  /// @domName SVGLocatable.getCTM; @docsEditable true
+  Matrix getCTM() native;
 
-  /** @domName SVGLocatable.getScreenCTM */
-  SVGMatrix getScreenCTM() native;
+  /// @domName SVGLocatable.getScreenCTM; @docsEditable true
+  Matrix getScreenCTM() native;
 
-  /** @domName SVGLocatable.getTransformToElement */
-  SVGMatrix getTransformToElement(SVGElement element) native;
+  /// @domName SVGLocatable.getTransformToElement; @docsEditable true
+  Matrix getTransformToElement(SvgElement element) native;
 
   // From SVGStylable
 
-  /** @domName SVGStylable.className */
-  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+  /// @domName SVGStylable.className; @docsEditable true
+  AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CSSStyleDeclaration style;
 
-  /** @domName SVGStylable.getPresentationAttribute */
+  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
   CSSValue getPresentationAttribute(String name) native;
 
   // From SVGTests
 
-  /** @domName SVGTests.requiredExtensions */
-  final SVGStringList requiredExtensions;
+  /// @domName SVGTests.requiredExtensions; @docsEditable true
+  final StringList requiredExtensions;
 
-  /** @domName SVGTests.requiredFeatures */
-  final SVGStringList requiredFeatures;
+  /// @domName SVGTests.requiredFeatures; @docsEditable true
+  final StringList requiredFeatures;
 
-  /** @domName SVGTests.systemLanguage */
-  final SVGStringList systemLanguage;
+  /// @domName SVGTests.systemLanguage; @docsEditable true
+  final StringList systemLanguage;
 
-  /** @domName SVGTests.hasExtension */
+  /// @domName SVGTests.hasExtension; @docsEditable true
   bool hasExtension(String extension) native;
 
   // From SVGTransformable
 
-  /** @domName SVGTransformable.transform */
-  final SVGAnimatedTransformList transform;
+  /// @domName SVGTransformable.transform; @docsEditable true
+  final AnimatedTransformList transform;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGGlyphElement
-class SVGGlyphElement extends SVGElement native "*SVGGlyphElement" {
+/// @domName SVGGlyphElement; @docsEditable true
+class GlyphElement extends SvgElement native "*SVGGlyphElement" {
+
+  factory GlyphElement() => _SvgElementFactoryProvider.createSvgElement_tag("glyph");
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for 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 SVGGlyphRefElement
-class SVGGlyphRefElement extends SVGElement implements SVGURIReference, SVGStylable native "*SVGGlyphRefElement" {
+/// @domName SVGGlyphRefElement; @docsEditable true
+class GlyphRefElement extends SvgElement implements UriReference, Stylable native "*SVGGlyphRefElement" {
 
-  /** @domName SVGGlyphRefElement.dx */
+  /// @domName SVGGlyphRefElement.dx; @docsEditable true
   num dx;
 
-  /** @domName SVGGlyphRefElement.dy */
+  /// @domName SVGGlyphRefElement.dy; @docsEditable true
   num dy;
 
-  /** @domName SVGGlyphRefElement.format */
+  /// @domName SVGGlyphRefElement.format; @docsEditable true
   String format;
 
-  /** @domName SVGGlyphRefElement.glyphRef */
+  /// @domName SVGGlyphRefElement.glyphRef; @docsEditable true
   String glyphRef;
 
-  /** @domName SVGGlyphRefElement.x */
+  /// @domName SVGGlyphRefElement.x; @docsEditable true
   num x;
 
-  /** @domName SVGGlyphRefElement.y */
+  /// @domName SVGGlyphRefElement.y; @docsEditable true
   num y;
 
   // From SVGStylable
 
-  /** @domName SVGStylable.className */
-  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+  /// @domName SVGStylable.className; @docsEditable true
+  AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CSSStyleDeclaration style;
 
-  /** @domName SVGStylable.getPresentationAttribute */
+  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
   CSSValue getPresentationAttribute(String name) native;
 
   // From SVGURIReference
 
-  /** @domName SVGURIReference.href */
-  final SVGAnimatedString href;
+  /// @domName SVGURIReference.href; @docsEditable true
+  final AnimatedString href;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGGradientElement
-class SVGGradientElement extends SVGElement implements SVGURIReference, SVGExternalResourcesRequired, SVGStylable native "*SVGGradientElement" {
+/// @domName SVGGradientElement; @docsEditable true
+class GradientElement extends SvgElement implements UriReference, ExternalResourcesRequired, Stylable native "*SVGGradientElement" {
 
   static const int SVG_SPREADMETHOD_PAD = 1;
 
@@ -2790,134 +2729,138 @@
 
   static const int SVG_SPREADMETHOD_UNKNOWN = 0;
 
-  /** @domName SVGGradientElement.gradientTransform */
-  final SVGAnimatedTransformList gradientTransform;
+  /// @domName SVGGradientElement.gradientTransform; @docsEditable true
+  final AnimatedTransformList gradientTransform;
 
-  /** @domName SVGGradientElement.gradientUnits */
-  final SVGAnimatedEnumeration gradientUnits;
+  /// @domName SVGGradientElement.gradientUnits; @docsEditable true
+  final AnimatedEnumeration gradientUnits;
 
-  /** @domName SVGGradientElement.spreadMethod */
-  final SVGAnimatedEnumeration spreadMethod;
+  /// @domName SVGGradientElement.spreadMethod; @docsEditable true
+  final AnimatedEnumeration spreadMethod;
 
   // From SVGExternalResourcesRequired
 
-  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
-  final SVGAnimatedBoolean externalResourcesRequired;
+  /// @domName SVGExternalResourcesRequired.externalResourcesRequired; @docsEditable true
+  final AnimatedBoolean externalResourcesRequired;
 
   // From SVGStylable
 
-  /** @domName SVGStylable.className */
-  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+  /// @domName SVGStylable.className; @docsEditable true
+  AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CSSStyleDeclaration style;
 
-  /** @domName SVGStylable.getPresentationAttribute */
+  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
   CSSValue getPresentationAttribute(String name) native;
 
   // From SVGURIReference
 
-  /** @domName SVGURIReference.href */
-  final SVGAnimatedString href;
+  /// @domName SVGURIReference.href; @docsEditable true
+  final AnimatedString href;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGHKernElement
-class SVGHKernElement extends SVGElement native "*SVGHKernElement" {
+/// @domName SVGHKernElement; @docsEditable true
+class HKernElement extends SvgElement native "*SVGHKernElement" {
+
+  factory HKernElement() => _SvgElementFactoryProvider.createSvgElement_tag("hkern");
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for 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 SVGImageElement
-class SVGImageElement extends SVGElement implements SVGLangSpace, SVGTests, SVGStylable, SVGURIReference, SVGExternalResourcesRequired, SVGTransformable native "*SVGImageElement" {
+/// @domName SVGImageElement; @docsEditable true
+class ImageElement extends SvgElement implements Transformable, Tests, UriReference, Stylable, ExternalResourcesRequired, LangSpace native "*SVGImageElement" {
 
-  /** @domName SVGImageElement.height */
-  final SVGAnimatedLength height;
+  factory ImageElement() => _SvgElementFactoryProvider.createSvgElement_tag("image");
 
-  /** @domName SVGImageElement.preserveAspectRatio */
-  final SVGAnimatedPreserveAspectRatio preserveAspectRatio;
+  /// @domName SVGImageElement.height; @docsEditable true
+  final AnimatedLength height;
 
-  /** @domName SVGImageElement.width */
-  final SVGAnimatedLength width;
+  /// @domName SVGImageElement.preserveAspectRatio; @docsEditable true
+  final AnimatedPreserveAspectRatio preserveAspectRatio;
 
-  /** @domName SVGImageElement.x */
-  final SVGAnimatedLength x;
+  /// @domName SVGImageElement.width; @docsEditable true
+  final AnimatedLength width;
 
-  /** @domName SVGImageElement.y */
-  final SVGAnimatedLength y;
+  /// @domName SVGImageElement.x; @docsEditable true
+  final AnimatedLength x;
+
+  /// @domName SVGImageElement.y; @docsEditable true
+  final AnimatedLength y;
 
   // From SVGExternalResourcesRequired
 
-  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
-  final SVGAnimatedBoolean externalResourcesRequired;
+  /// @domName SVGExternalResourcesRequired.externalResourcesRequired; @docsEditable true
+  final AnimatedBoolean externalResourcesRequired;
 
   // From SVGLangSpace
 
-  /** @domName SVGLangSpace.xmllang */
+  /// @domName SVGLangSpace.xmllang; @docsEditable true
   String xmllang;
 
-  /** @domName SVGLangSpace.xmlspace */
+  /// @domName SVGLangSpace.xmlspace; @docsEditable true
   String xmlspace;
 
   // From SVGLocatable
 
-  /** @domName SVGLocatable.farthestViewportElement */
-  final SVGElement farthestViewportElement;
+  /// @domName SVGLocatable.farthestViewportElement; @docsEditable true
+  final SvgElement farthestViewportElement;
 
-  /** @domName SVGLocatable.nearestViewportElement */
-  final SVGElement nearestViewportElement;
+  /// @domName SVGLocatable.nearestViewportElement; @docsEditable true
+  final SvgElement nearestViewportElement;
 
-  /** @domName SVGLocatable.getBBox */
-  SVGRect getBBox() native;
+  /// @domName SVGLocatable.getBBox; @docsEditable true
+  Rect getBBox() native;
 
-  /** @domName SVGLocatable.getCTM */
-  SVGMatrix getCTM() native;
+  /// @domName SVGLocatable.getCTM; @docsEditable true
+  Matrix getCTM() native;
 
-  /** @domName SVGLocatable.getScreenCTM */
-  SVGMatrix getScreenCTM() native;
+  /// @domName SVGLocatable.getScreenCTM; @docsEditable true
+  Matrix getScreenCTM() native;
 
-  /** @domName SVGLocatable.getTransformToElement */
-  SVGMatrix getTransformToElement(SVGElement element) native;
+  /// @domName SVGLocatable.getTransformToElement; @docsEditable true
+  Matrix getTransformToElement(SvgElement element) native;
 
   // From SVGStylable
 
-  /** @domName SVGStylable.className */
-  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+  /// @domName SVGStylable.className; @docsEditable true
+  AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CSSStyleDeclaration style;
 
-  /** @domName SVGStylable.getPresentationAttribute */
+  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
   CSSValue getPresentationAttribute(String name) native;
 
   // From SVGTests
 
-  /** @domName SVGTests.requiredExtensions */
-  final SVGStringList requiredExtensions;
+  /// @domName SVGTests.requiredExtensions; @docsEditable true
+  final StringList requiredExtensions;
 
-  /** @domName SVGTests.requiredFeatures */
-  final SVGStringList requiredFeatures;
+  /// @domName SVGTests.requiredFeatures; @docsEditable true
+  final StringList requiredFeatures;
 
-  /** @domName SVGTests.systemLanguage */
-  final SVGStringList systemLanguage;
+  /// @domName SVGTests.systemLanguage; @docsEditable true
+  final StringList systemLanguage;
 
-  /** @domName SVGTests.hasExtension */
+  /// @domName SVGTests.hasExtension; @docsEditable true
   bool hasExtension(String extension) native;
 
   // From SVGTransformable
 
-  /** @domName SVGTransformable.transform */
-  final SVGAnimatedTransformList transform;
+  /// @domName SVGTransformable.transform; @docsEditable true
+  final AnimatedTransformList transform;
 
   // From SVGURIReference
 
-  /** @domName SVGURIReference.href */
-  final SVGAnimatedString href;
+  /// @domName SVGURIReference.href; @docsEditable true
+  final AnimatedString href;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -2925,7 +2868,7 @@
 
 
 /// @domName SVGLangSpace
-abstract class SVGLangSpace {
+abstract class LangSpace {
 
   String xmllang;
 
@@ -2936,8 +2879,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGLength
-class SVGLength native "*SVGLength" {
+/// @domName SVGLength; @docsEditable true
+class Length native "*SVGLength" {
 
   static const int SVG_LENGTHTYPE_CM = 6;
 
@@ -2961,22 +2904,22 @@
 
   static const int SVG_LENGTHTYPE_UNKNOWN = 0;
 
-  /** @domName SVGLength.unitType */
+  /// @domName SVGLength.unitType; @docsEditable true
   final int unitType;
 
-  /** @domName SVGLength.value */
+  /// @domName SVGLength.value; @docsEditable true
   num value;
 
-  /** @domName SVGLength.valueAsString */
+  /// @domName SVGLength.valueAsString; @docsEditable true
   String valueAsString;
 
-  /** @domName SVGLength.valueInSpecifiedUnits */
+  /// @domName SVGLength.valueInSpecifiedUnits; @docsEditable true
   num valueInSpecifiedUnits;
 
-  /** @domName SVGLength.convertToSpecifiedUnits */
+  /// @domName SVGLength.convertToSpecifiedUnits; @docsEditable true
   void convertToSpecifiedUnits(int unitType) native;
 
-  /** @domName SVGLength.newValueSpecifiedUnits */
+  /// @domName SVGLength.newValueSpecifiedUnits; @docsEditable true
   void newValueSpecifiedUnits(int unitType, num valueInSpecifiedUnits) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2984,79 +2927,81 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGLengthList
-class SVGLengthList implements JavaScriptIndexingBehavior, List<SVGLength> native "*SVGLengthList" {
+/// @domName SVGLengthList; @docsEditable true
+class LengthList implements JavaScriptIndexingBehavior, List<Length> native "*SVGLengthList" {
 
-  /** @domName SVGLengthList.numberOfItems */
+  /// @domName SVGLengthList.numberOfItems; @docsEditable true
   final int numberOfItems;
 
-  SVGLength operator[](int index) => JS("SVGLength", "#[#]", this, index);
+  Length operator[](int index) => JS("Length", "#[#]", this, index);
 
-  void operator[]=(int index, SVGLength value) {
+  void operator[]=(int index, Length value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
-  // -- start List<SVGLength> mixins.
-  // SVGLength is the element type.
+  // -- start List<Length> mixins.
+  // Length is the element type.
 
-  // From Iterable<SVGLength>:
+  // From Iterable<Length>:
 
-  Iterator<SVGLength> iterator() {
+  Iterator<Length> 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<SVGLength>(this);
+    return new FixedSizeListIterator<Length>(this);
   }
 
-  // From Collection<SVGLength>:
+  // From Collection<Length>:
 
-  void add(SVGLength value) {
+  void add(Length value) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  void addLast(SVGLength value) {
+  void addLast(Length value) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  void addAll(Collection<SVGLength> collection) {
+  void addAll(Collection<Length> collection) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  bool contains(SVGLength element) => _Collections.contains(this, element);
+  bool contains(Length element) => _Collections.contains(this, element);
 
-  void forEach(void f(SVGLength element)) => _Collections.forEach(this, f);
+  void forEach(void f(Length element)) => _Collections.forEach(this, f);
 
-  Collection map(f(SVGLength element)) => _Collections.map(this, [], f);
+  Collection map(f(Length element)) => _Collections.map(this, [], f);
 
-  Collection<SVGLength> filter(bool f(SVGLength element)) =>
-     _Collections.filter(this, <SVGLength>[], f);
+  Collection<Length> filter(bool f(Length element)) =>
+     _Collections.filter(this, <Length>[], f);
 
-  bool every(bool f(SVGLength element)) => _Collections.every(this, f);
+  bool every(bool f(Length element)) => _Collections.every(this, f);
 
-  bool some(bool f(SVGLength element)) => _Collections.some(this, f);
+  bool some(bool f(Length element)) => _Collections.some(this, f);
 
   bool get isEmpty => this.length == 0;
 
-  // From List<SVGLength>:
+  // From List<Length>:
 
-  void sort([Comparator<SVGLength> compare = Comparable.compare]) {
+  void sort([Comparator<Length> compare = Comparable.compare]) {
     throw new UnsupportedError("Cannot sort immutable List.");
   }
 
-  int indexOf(SVGLength element, [int start = 0]) =>
+  int indexOf(Length element, [int start = 0]) =>
       _Lists.indexOf(this, element, start, this.length);
 
-  int lastIndexOf(SVGLength element, [int start]) {
+  int lastIndexOf(Length element, [int start]) {
     if (start == null) start = length - 1;
     return _Lists.lastIndexOf(this, element, start);
   }
 
-  SVGLength get last => this[length - 1];
+  Length get first => this[0];
 
-  SVGLength removeLast() {
+  Length get last => this[length - 1];
+
+  Length removeLast() {
     throw new UnsupportedError("Cannot removeLast on immutable List.");
   }
 
-  void setRange(int start, int rangeLength, List<SVGLength> from, [int startFrom]) {
+  void setRange(int start, int rangeLength, List<Length> from, [int startFrom]) {
     throw new UnsupportedError("Cannot setRange on immutable List.");
   }
 
@@ -3064,138 +3009,142 @@
     throw new UnsupportedError("Cannot removeRange on immutable List.");
   }
 
-  void insertRange(int start, int rangeLength, [SVGLength initialValue]) {
+  void insertRange(int start, int rangeLength, [Length initialValue]) {
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
-  List<SVGLength> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <SVGLength>[]);
+  List<Length> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <Length>[]);
 
-  // -- end List<SVGLength> mixins.
+  // -- end List<Length> mixins.
 
-  /** @domName SVGLengthList.appendItem */
-  SVGLength appendItem(SVGLength item) native;
+  /// @domName SVGLengthList.appendItem; @docsEditable true
+  Length appendItem(Length item) native;
 
-  /** @domName SVGLengthList.clear */
+  /// @domName SVGLengthList.clear; @docsEditable true
   void clear() native;
 
-  /** @domName SVGLengthList.getItem */
-  SVGLength getItem(int index) native;
+  /// @domName SVGLengthList.getItem; @docsEditable true
+  Length getItem(int index) native;
 
-  /** @domName SVGLengthList.initialize */
-  SVGLength initialize(SVGLength item) native;
+  /// @domName SVGLengthList.initialize; @docsEditable true
+  Length initialize(Length item) native;
 
-  /** @domName SVGLengthList.insertItemBefore */
-  SVGLength insertItemBefore(SVGLength item, int index) native;
+  /// @domName SVGLengthList.insertItemBefore; @docsEditable true
+  Length insertItemBefore(Length item, int index) native;
 
-  /** @domName SVGLengthList.removeItem */
-  SVGLength removeItem(int index) native;
+  /// @domName SVGLengthList.removeItem; @docsEditable true
+  Length removeItem(int index) native;
 
-  /** @domName SVGLengthList.replaceItem */
-  SVGLength replaceItem(SVGLength item, int index) native;
+  /// @domName SVGLengthList.replaceItem; @docsEditable true
+  Length replaceItem(Length 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 SVGLineElement
-class SVGLineElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired native "*SVGLineElement" {
+/// @domName SVGLineElement; @docsEditable true
+class LineElement extends SvgElement implements Transformable, Tests, Stylable, ExternalResourcesRequired, LangSpace native "*SVGLineElement" {
 
-  /** @domName SVGLineElement.x1 */
-  final SVGAnimatedLength x1;
+  factory LineElement() => _SvgElementFactoryProvider.createSvgElement_tag("line");
 
-  /** @domName SVGLineElement.x2 */
-  final SVGAnimatedLength x2;
+  /// @domName SVGLineElement.x1; @docsEditable true
+  final AnimatedLength x1;
 
-  /** @domName SVGLineElement.y1 */
-  final SVGAnimatedLength y1;
+  /// @domName SVGLineElement.x2; @docsEditable true
+  final AnimatedLength x2;
 
-  /** @domName SVGLineElement.y2 */
-  final SVGAnimatedLength y2;
+  /// @domName SVGLineElement.y1; @docsEditable true
+  final AnimatedLength y1;
+
+  /// @domName SVGLineElement.y2; @docsEditable true
+  final AnimatedLength y2;
 
   // From SVGExternalResourcesRequired
 
-  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
-  final SVGAnimatedBoolean externalResourcesRequired;
+  /// @domName SVGExternalResourcesRequired.externalResourcesRequired; @docsEditable true
+  final AnimatedBoolean externalResourcesRequired;
 
   // From SVGLangSpace
 
-  /** @domName SVGLangSpace.xmllang */
+  /// @domName SVGLangSpace.xmllang; @docsEditable true
   String xmllang;
 
-  /** @domName SVGLangSpace.xmlspace */
+  /// @domName SVGLangSpace.xmlspace; @docsEditable true
   String xmlspace;
 
   // From SVGLocatable
 
-  /** @domName SVGLocatable.farthestViewportElement */
-  final SVGElement farthestViewportElement;
+  /// @domName SVGLocatable.farthestViewportElement; @docsEditable true
+  final SvgElement farthestViewportElement;
 
-  /** @domName SVGLocatable.nearestViewportElement */
-  final SVGElement nearestViewportElement;
+  /// @domName SVGLocatable.nearestViewportElement; @docsEditable true
+  final SvgElement nearestViewportElement;
 
-  /** @domName SVGLocatable.getBBox */
-  SVGRect getBBox() native;
+  /// @domName SVGLocatable.getBBox; @docsEditable true
+  Rect getBBox() native;
 
-  /** @domName SVGLocatable.getCTM */
-  SVGMatrix getCTM() native;
+  /// @domName SVGLocatable.getCTM; @docsEditable true
+  Matrix getCTM() native;
 
-  /** @domName SVGLocatable.getScreenCTM */
-  SVGMatrix getScreenCTM() native;
+  /// @domName SVGLocatable.getScreenCTM; @docsEditable true
+  Matrix getScreenCTM() native;
 
-  /** @domName SVGLocatable.getTransformToElement */
-  SVGMatrix getTransformToElement(SVGElement element) native;
+  /// @domName SVGLocatable.getTransformToElement; @docsEditable true
+  Matrix getTransformToElement(SvgElement element) native;
 
   // From SVGStylable
 
-  /** @domName SVGStylable.className */
-  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+  /// @domName SVGStylable.className; @docsEditable true
+  AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CSSStyleDeclaration style;
 
-  /** @domName SVGStylable.getPresentationAttribute */
+  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
   CSSValue getPresentationAttribute(String name) native;
 
   // From SVGTests
 
-  /** @domName SVGTests.requiredExtensions */
-  final SVGStringList requiredExtensions;
+  /// @domName SVGTests.requiredExtensions; @docsEditable true
+  final StringList requiredExtensions;
 
-  /** @domName SVGTests.requiredFeatures */
-  final SVGStringList requiredFeatures;
+  /// @domName SVGTests.requiredFeatures; @docsEditable true
+  final StringList requiredFeatures;
 
-  /** @domName SVGTests.systemLanguage */
-  final SVGStringList systemLanguage;
+  /// @domName SVGTests.systemLanguage; @docsEditable true
+  final StringList systemLanguage;
 
-  /** @domName SVGTests.hasExtension */
+  /// @domName SVGTests.hasExtension; @docsEditable true
   bool hasExtension(String extension) native;
 
   // From SVGTransformable
 
-  /** @domName SVGTransformable.transform */
-  final SVGAnimatedTransformList transform;
+  /// @domName SVGTransformable.transform; @docsEditable true
+  final AnimatedTransformList transform;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGLinearGradientElement
-class SVGLinearGradientElement extends SVGGradientElement native "*SVGLinearGradientElement" {
+/// @domName SVGLinearGradientElement; @docsEditable true
+class LinearGradientElement extends GradientElement native "*SVGLinearGradientElement" {
 
-  /** @domName SVGLinearGradientElement.x1 */
-  final SVGAnimatedLength x1;
+  factory LinearGradientElement() => _SvgElementFactoryProvider.createSvgElement_tag("linearGradient");
 
-  /** @domName SVGLinearGradientElement.x2 */
-  final SVGAnimatedLength x2;
+  /// @domName SVGLinearGradientElement.x1; @docsEditable true
+  final AnimatedLength x1;
 
-  /** @domName SVGLinearGradientElement.y1 */
-  final SVGAnimatedLength y1;
+  /// @domName SVGLinearGradientElement.x2; @docsEditable true
+  final AnimatedLength x2;
 
-  /** @domName SVGLinearGradientElement.y2 */
-  final SVGAnimatedLength y2;
+  /// @domName SVGLinearGradientElement.y1; @docsEditable true
+  final AnimatedLength y1;
+
+  /// @domName SVGLinearGradientElement.y2; @docsEditable true
+  final AnimatedLength y2;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -3203,49 +3152,53 @@
 
 
 /// @domName SVGLocatable
-abstract class SVGLocatable {
+abstract class Locatable {
 
-  SVGElement farthestViewportElement;
+  SvgElement farthestViewportElement;
 
-  SVGElement nearestViewportElement;
+  SvgElement nearestViewportElement;
 
-  /** @domName SVGLocatable.getBBox */
-  SVGRect getBBox();
+  /// @domName SVGLocatable.getBBox; @docsEditable true
+  Rect getBBox();
 
-  /** @domName SVGLocatable.getCTM */
-  SVGMatrix getCTM();
+  /// @domName SVGLocatable.getCTM; @docsEditable true
+  Matrix getCTM();
 
-  /** @domName SVGLocatable.getScreenCTM */
-  SVGMatrix getScreenCTM();
+  /// @domName SVGLocatable.getScreenCTM; @docsEditable true
+  Matrix getScreenCTM();
 
-  /** @domName SVGLocatable.getTransformToElement */
-  SVGMatrix getTransformToElement(SVGElement element);
+  /// @domName SVGLocatable.getTransformToElement; @docsEditable true
+  Matrix getTransformToElement(SvgElement element);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGMPathElement
-class SVGMPathElement extends SVGElement implements SVGURIReference, SVGExternalResourcesRequired native "*SVGMPathElement" {
+/// @domName SVGMPathElement; @docsEditable true
+class MPathElement extends SvgElement implements UriReference, ExternalResourcesRequired native "*SVGMPathElement" {
+
+  factory MPathElement() => _SvgElementFactoryProvider.createSvgElement_tag("mpath");
 
   // From SVGExternalResourcesRequired
 
-  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
-  final SVGAnimatedBoolean externalResourcesRequired;
+  /// @domName SVGExternalResourcesRequired.externalResourcesRequired; @docsEditable true
+  final AnimatedBoolean externalResourcesRequired;
 
   // From SVGURIReference
 
-  /** @domName SVGURIReference.href */
-  final SVGAnimatedString href;
+  /// @domName SVGURIReference.href; @docsEditable true
+  final AnimatedString href;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGMarkerElement
-class SVGMarkerElement extends SVGElement implements SVGLangSpace, SVGFitToViewBox, SVGExternalResourcesRequired, SVGStylable native "*SVGMarkerElement" {
+/// @domName SVGMarkerElement; @docsEditable true
+class MarkerElement extends SvgElement implements FitToViewBox, ExternalResourcesRequired, Stylable, LangSpace native "*SVGMarkerElement" {
+
+  factory MarkerElement() => _SvgElementFactoryProvider.createSvgElement_tag("marker");
 
   static const int SVG_MARKERUNITS_STROKEWIDTH = 2;
 
@@ -3259,63 +3212,63 @@
 
   static const int SVG_MARKER_ORIENT_UNKNOWN = 0;
 
-  /** @domName SVGMarkerElement.markerHeight */
-  final SVGAnimatedLength markerHeight;
+  /// @domName SVGMarkerElement.markerHeight; @docsEditable true
+  final AnimatedLength markerHeight;
 
-  /** @domName SVGMarkerElement.markerUnits */
-  final SVGAnimatedEnumeration markerUnits;
+  /// @domName SVGMarkerElement.markerUnits; @docsEditable true
+  final AnimatedEnumeration markerUnits;
 
-  /** @domName SVGMarkerElement.markerWidth */
-  final SVGAnimatedLength markerWidth;
+  /// @domName SVGMarkerElement.markerWidth; @docsEditable true
+  final AnimatedLength markerWidth;
 
-  /** @domName SVGMarkerElement.orientAngle */
-  final SVGAnimatedAngle orientAngle;
+  /// @domName SVGMarkerElement.orientAngle; @docsEditable true
+  final AnimatedAngle orientAngle;
 
-  /** @domName SVGMarkerElement.orientType */
-  final SVGAnimatedEnumeration orientType;
+  /// @domName SVGMarkerElement.orientType; @docsEditable true
+  final AnimatedEnumeration orientType;
 
-  /** @domName SVGMarkerElement.refX */
-  final SVGAnimatedLength refX;
+  /// @domName SVGMarkerElement.refX; @docsEditable true
+  final AnimatedLength refX;
 
-  /** @domName SVGMarkerElement.refY */
-  final SVGAnimatedLength refY;
+  /// @domName SVGMarkerElement.refY; @docsEditable true
+  final AnimatedLength refY;
 
-  /** @domName SVGMarkerElement.setOrientToAngle */
-  void setOrientToAngle(SVGAngle angle) native;
+  /// @domName SVGMarkerElement.setOrientToAngle; @docsEditable true
+  void setOrientToAngle(Angle angle) native;
 
-  /** @domName SVGMarkerElement.setOrientToAuto */
+  /// @domName SVGMarkerElement.setOrientToAuto; @docsEditable true
   void setOrientToAuto() native;
 
   // From SVGExternalResourcesRequired
 
-  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
-  final SVGAnimatedBoolean externalResourcesRequired;
+  /// @domName SVGExternalResourcesRequired.externalResourcesRequired; @docsEditable true
+  final AnimatedBoolean externalResourcesRequired;
 
   // From SVGFitToViewBox
 
-  /** @domName SVGFitToViewBox.preserveAspectRatio */
-  final SVGAnimatedPreserveAspectRatio preserveAspectRatio;
+  /// @domName SVGFitToViewBox.preserveAspectRatio; @docsEditable true
+  final AnimatedPreserveAspectRatio preserveAspectRatio;
 
-  /** @domName SVGFitToViewBox.viewBox */
-  final SVGAnimatedRect viewBox;
+  /// @domName SVGFitToViewBox.viewBox; @docsEditable true
+  final AnimatedRect viewBox;
 
   // From SVGLangSpace
 
-  /** @domName SVGLangSpace.xmllang */
+  /// @domName SVGLangSpace.xmllang; @docsEditable true
   String xmllang;
 
-  /** @domName SVGLangSpace.xmlspace */
+  /// @domName SVGLangSpace.xmlspace; @docsEditable true
   String xmlspace;
 
   // From SVGStylable
 
-  /** @domName SVGStylable.className */
-  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+  /// @domName SVGStylable.className; @docsEditable true
+  AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CSSStyleDeclaration style;
 
-  /** @domName SVGStylable.getPresentationAttribute */
+  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
   CSSValue getPresentationAttribute(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3323,63 +3276,65 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGMaskElement
-class SVGMaskElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGExternalResourcesRequired native "*SVGMaskElement" {
+/// @domName SVGMaskElement; @docsEditable true
+class MaskElement extends SvgElement implements Tests, Stylable, ExternalResourcesRequired, LangSpace native "*SVGMaskElement" {
 
-  /** @domName SVGMaskElement.height */
-  final SVGAnimatedLength height;
+  factory MaskElement() => _SvgElementFactoryProvider.createSvgElement_tag("mask");
 
-  /** @domName SVGMaskElement.maskContentUnits */
-  final SVGAnimatedEnumeration maskContentUnits;
+  /// @domName SVGMaskElement.height; @docsEditable true
+  final AnimatedLength height;
 
-  /** @domName SVGMaskElement.maskUnits */
-  final SVGAnimatedEnumeration maskUnits;
+  /// @domName SVGMaskElement.maskContentUnits; @docsEditable true
+  final AnimatedEnumeration maskContentUnits;
 
-  /** @domName SVGMaskElement.width */
-  final SVGAnimatedLength width;
+  /// @domName SVGMaskElement.maskUnits; @docsEditable true
+  final AnimatedEnumeration maskUnits;
 
-  /** @domName SVGMaskElement.x */
-  final SVGAnimatedLength x;
+  /// @domName SVGMaskElement.width; @docsEditable true
+  final AnimatedLength width;
 
-  /** @domName SVGMaskElement.y */
-  final SVGAnimatedLength y;
+  /// @domName SVGMaskElement.x; @docsEditable true
+  final AnimatedLength x;
+
+  /// @domName SVGMaskElement.y; @docsEditable true
+  final AnimatedLength y;
 
   // From SVGExternalResourcesRequired
 
-  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
-  final SVGAnimatedBoolean externalResourcesRequired;
+  /// @domName SVGExternalResourcesRequired.externalResourcesRequired; @docsEditable true
+  final AnimatedBoolean externalResourcesRequired;
 
   // From SVGLangSpace
 
-  /** @domName SVGLangSpace.xmllang */
+  /// @domName SVGLangSpace.xmllang; @docsEditable true
   String xmllang;
 
-  /** @domName SVGLangSpace.xmlspace */
+  /// @domName SVGLangSpace.xmlspace; @docsEditable true
   String xmlspace;
 
   // From SVGStylable
 
-  /** @domName SVGStylable.className */
-  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+  /// @domName SVGStylable.className; @docsEditable true
+  AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CSSStyleDeclaration style;
 
-  /** @domName SVGStylable.getPresentationAttribute */
+  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
   CSSValue getPresentationAttribute(String name) native;
 
   // From SVGTests
 
-  /** @domName SVGTests.requiredExtensions */
-  final SVGStringList requiredExtensions;
+  /// @domName SVGTests.requiredExtensions; @docsEditable true
+  final StringList requiredExtensions;
 
-  /** @domName SVGTests.requiredFeatures */
-  final SVGStringList requiredFeatures;
+  /// @domName SVGTests.requiredFeatures; @docsEditable true
+  final StringList requiredFeatures;
 
-  /** @domName SVGTests.systemLanguage */
-  final SVGStringList systemLanguage;
+  /// @domName SVGTests.systemLanguage; @docsEditable true
+  final StringList systemLanguage;
 
-  /** @domName SVGTests.hasExtension */
+  /// @domName SVGTests.hasExtension; @docsEditable true
   bool hasExtension(String extension) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3387,85 +3342,85 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGMatrix
-class SVGMatrix native "*SVGMatrix" {
+/// @domName SVGMatrix; @docsEditable true
+class Matrix native "*SVGMatrix" {
 
-  /** @domName SVGMatrix.a */
+  /// @domName SVGMatrix.a; @docsEditable true
   num a;
 
-  /** @domName SVGMatrix.b */
+  /// @domName SVGMatrix.b; @docsEditable true
   num b;
 
-  /** @domName SVGMatrix.c */
+  /// @domName SVGMatrix.c; @docsEditable true
   num c;
 
-  /** @domName SVGMatrix.d */
+  /// @domName SVGMatrix.d; @docsEditable true
   num d;
 
-  /** @domName SVGMatrix.e */
+  /// @domName SVGMatrix.e; @docsEditable true
   num e;
 
-  /** @domName SVGMatrix.f */
+  /// @domName SVGMatrix.f; @docsEditable true
   num f;
 
-  /** @domName SVGMatrix.flipX */
-  SVGMatrix flipX() native;
+  /// @domName SVGMatrix.flipX; @docsEditable true
+  Matrix flipX() native;
 
-  /** @domName SVGMatrix.flipY */
-  SVGMatrix flipY() native;
+  /// @domName SVGMatrix.flipY; @docsEditable true
+  Matrix flipY() native;
 
-  /** @domName SVGMatrix.inverse */
-  SVGMatrix inverse() native;
+  /// @domName SVGMatrix.inverse; @docsEditable true
+  Matrix inverse() native;
 
-  /** @domName SVGMatrix.multiply */
-  SVGMatrix multiply(SVGMatrix secondMatrix) native;
+  /// @domName SVGMatrix.multiply; @docsEditable true
+  Matrix multiply(Matrix secondMatrix) native;
 
-  /** @domName SVGMatrix.rotate */
-  SVGMatrix rotate(num angle) native;
+  /// @domName SVGMatrix.rotate; @docsEditable true
+  Matrix rotate(num angle) native;
 
-  /** @domName SVGMatrix.rotateFromVector */
-  SVGMatrix rotateFromVector(num x, num y) native;
+  /// @domName SVGMatrix.rotateFromVector; @docsEditable true
+  Matrix rotateFromVector(num x, num y) native;
 
-  /** @domName SVGMatrix.scale */
-  SVGMatrix scale(num scaleFactor) native;
+  /// @domName SVGMatrix.scale; @docsEditable true
+  Matrix scale(num scaleFactor) native;
 
-  /** @domName SVGMatrix.scaleNonUniform */
-  SVGMatrix scaleNonUniform(num scaleFactorX, num scaleFactorY) native;
+  /// @domName SVGMatrix.scaleNonUniform; @docsEditable true
+  Matrix scaleNonUniform(num scaleFactorX, num scaleFactorY) native;
 
-  /** @domName SVGMatrix.skewX */
-  SVGMatrix skewX(num angle) native;
+  /// @domName SVGMatrix.skewX; @docsEditable true
+  Matrix skewX(num angle) native;
 
-  /** @domName SVGMatrix.skewY */
-  SVGMatrix skewY(num angle) native;
+  /// @domName SVGMatrix.skewY; @docsEditable true
+  Matrix skewY(num angle) native;
 
-  /** @domName SVGMatrix.translate */
-  SVGMatrix translate(num x, num y) native;
+  /// @domName SVGMatrix.translate; @docsEditable true
+  Matrix translate(num x, num y) 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 SVGMetadataElement
-class SVGMetadataElement extends SVGElement native "*SVGMetadataElement" {
+/// @domName SVGMetadataElement; @docsEditable true
+class MetadataElement extends SvgElement native "*SVGMetadataElement" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for 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 SVGMissingGlyphElement
-class SVGMissingGlyphElement extends SVGElement native "*SVGMissingGlyphElement" {
+/// @domName SVGMissingGlyphElement; @docsEditable true
+class MissingGlyphElement extends SvgElement native "*SVGMissingGlyphElement" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for 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 SVGNumber
-class SVGNumber native "*SVGNumber" {
+/// @domName SVGNumber; @docsEditable true
+class Number native "*SVGNumber" {
 
-  /** @domName SVGNumber.value */
+  /// @domName SVGNumber.value; @docsEditable true
   num value;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3473,79 +3428,81 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGNumberList
-class SVGNumberList implements JavaScriptIndexingBehavior, List<SVGNumber> native "*SVGNumberList" {
+/// @domName SVGNumberList; @docsEditable true
+class NumberList implements JavaScriptIndexingBehavior, List<Number> native "*SVGNumberList" {
 
-  /** @domName SVGNumberList.numberOfItems */
+  /// @domName SVGNumberList.numberOfItems; @docsEditable true
   final int numberOfItems;
 
-  SVGNumber operator[](int index) => JS("SVGNumber", "#[#]", this, index);
+  Number operator[](int index) => JS("Number", "#[#]", this, index);
 
-  void operator[]=(int index, SVGNumber value) {
+  void operator[]=(int index, Number value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
-  // -- start List<SVGNumber> mixins.
-  // SVGNumber is the element type.
+  // -- start List<Number> mixins.
+  // Number is the element type.
 
-  // From Iterable<SVGNumber>:
+  // From Iterable<Number>:
 
-  Iterator<SVGNumber> iterator() {
+  Iterator<Number> 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<SVGNumber>(this);
+    return new FixedSizeListIterator<Number>(this);
   }
 
-  // From Collection<SVGNumber>:
+  // From Collection<Number>:
 
-  void add(SVGNumber value) {
+  void add(Number value) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  void addLast(SVGNumber value) {
+  void addLast(Number value) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  void addAll(Collection<SVGNumber> collection) {
+  void addAll(Collection<Number> collection) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  bool contains(SVGNumber element) => _Collections.contains(this, element);
+  bool contains(Number element) => _Collections.contains(this, element);
 
-  void forEach(void f(SVGNumber element)) => _Collections.forEach(this, f);
+  void forEach(void f(Number element)) => _Collections.forEach(this, f);
 
-  Collection map(f(SVGNumber element)) => _Collections.map(this, [], f);
+  Collection map(f(Number element)) => _Collections.map(this, [], f);
 
-  Collection<SVGNumber> filter(bool f(SVGNumber element)) =>
-     _Collections.filter(this, <SVGNumber>[], f);
+  Collection<Number> filter(bool f(Number element)) =>
+     _Collections.filter(this, <Number>[], f);
 
-  bool every(bool f(SVGNumber element)) => _Collections.every(this, f);
+  bool every(bool f(Number element)) => _Collections.every(this, f);
 
-  bool some(bool f(SVGNumber element)) => _Collections.some(this, f);
+  bool some(bool f(Number element)) => _Collections.some(this, f);
 
   bool get isEmpty => this.length == 0;
 
-  // From List<SVGNumber>:
+  // From List<Number>:
 
-  void sort([Comparator<SVGNumber> compare = Comparable.compare]) {
+  void sort([Comparator<Number> compare = Comparable.compare]) {
     throw new UnsupportedError("Cannot sort immutable List.");
   }
 
-  int indexOf(SVGNumber element, [int start = 0]) =>
+  int indexOf(Number element, [int start = 0]) =>
       _Lists.indexOf(this, element, start, this.length);
 
-  int lastIndexOf(SVGNumber element, [int start]) {
+  int lastIndexOf(Number element, [int start]) {
     if (start == null) start = length - 1;
     return _Lists.lastIndexOf(this, element, start);
   }
 
-  SVGNumber get last => this[length - 1];
+  Number get first => this[0];
 
-  SVGNumber removeLast() {
+  Number get last => this[length - 1];
+
+  Number removeLast() {
     throw new UnsupportedError("Cannot removeLast on immutable List.");
   }
 
-  void setRange(int start, int rangeLength, List<SVGNumber> from, [int startFrom]) {
+  void setRange(int start, int rangeLength, List<Number> from, [int startFrom]) {
     throw new UnsupportedError("Cannot setRange on immutable List.");
   }
 
@@ -3553,43 +3510,43 @@
     throw new UnsupportedError("Cannot removeRange on immutable List.");
   }
 
-  void insertRange(int start, int rangeLength, [SVGNumber initialValue]) {
+  void insertRange(int start, int rangeLength, [Number initialValue]) {
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
-  List<SVGNumber> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <SVGNumber>[]);
+  List<Number> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <Number>[]);
 
-  // -- end List<SVGNumber> mixins.
+  // -- end List<Number> mixins.
 
-  /** @domName SVGNumberList.appendItem */
-  SVGNumber appendItem(SVGNumber item) native;
+  /// @domName SVGNumberList.appendItem; @docsEditable true
+  Number appendItem(Number item) native;
 
-  /** @domName SVGNumberList.clear */
+  /// @domName SVGNumberList.clear; @docsEditable true
   void clear() native;
 
-  /** @domName SVGNumberList.getItem */
-  SVGNumber getItem(int index) native;
+  /// @domName SVGNumberList.getItem; @docsEditable true
+  Number getItem(int index) native;
 
-  /** @domName SVGNumberList.initialize */
-  SVGNumber initialize(SVGNumber item) native;
+  /// @domName SVGNumberList.initialize; @docsEditable true
+  Number initialize(Number item) native;
 
-  /** @domName SVGNumberList.insertItemBefore */
-  SVGNumber insertItemBefore(SVGNumber item, int index) native;
+  /// @domName SVGNumberList.insertItemBefore; @docsEditable true
+  Number insertItemBefore(Number item, int index) native;
 
-  /** @domName SVGNumberList.removeItem */
-  SVGNumber removeItem(int index) native;
+  /// @domName SVGNumberList.removeItem; @docsEditable true
+  Number removeItem(int index) native;
 
-  /** @domName SVGNumberList.replaceItem */
-  SVGNumber replaceItem(SVGNumber item, int index) native;
+  /// @domName SVGNumberList.replaceItem; @docsEditable true
+  Number replaceItem(Number 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 SVGPaint
-class SVGPaint extends SVGColor native "*SVGPaint" {
+/// @domName SVGPaint; @docsEditable true
+class Paint extends Color native "*SVGPaint" {
 
   static const int SVG_PAINTTYPE_CURRENTCOLOR = 102;
 
@@ -3611,16 +3568,16 @@
 
   static const int SVG_PAINTTYPE_URI_RGBCOLOR_ICCCOLOR = 106;
 
-  /** @domName SVGPaint.paintType */
+  /// @domName SVGPaint.paintType; @docsEditable true
   final int paintType;
 
-  /** @domName SVGPaint.uri */
+  /// @domName SVGPaint.uri; @docsEditable true
   final String uri;
 
-  /** @domName SVGPaint.setPaint */
+  /// @domName SVGPaint.setPaint; @docsEditable true
   void setPaint(int paintType, String uri, String rgbColor, String iccColor) native;
 
-  /** @domName SVGPaint.setUri */
+  /// @domName SVGPaint.setUri; @docsEditable true
   void setUri(String uri) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3628,160 +3585,162 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGPathElement
-class SVGPathElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired native "*SVGPathElement" {
+/// @domName SVGPathElement; @docsEditable true
+class PathElement extends SvgElement implements Transformable, Tests, Stylable, ExternalResourcesRequired, LangSpace native "*SVGPathElement" {
 
-  /** @domName SVGPathElement.animatedNormalizedPathSegList */
-  final SVGPathSegList animatedNormalizedPathSegList;
+  factory PathElement() => _SvgElementFactoryProvider.createSvgElement_tag("path");
 
-  /** @domName SVGPathElement.animatedPathSegList */
-  final SVGPathSegList animatedPathSegList;
+  /// @domName SVGPathElement.animatedNormalizedPathSegList; @docsEditable true
+  final PathSegList animatedNormalizedPathSegList;
 
-  /** @domName SVGPathElement.normalizedPathSegList */
-  final SVGPathSegList normalizedPathSegList;
+  /// @domName SVGPathElement.animatedPathSegList; @docsEditable true
+  final PathSegList animatedPathSegList;
 
-  /** @domName SVGPathElement.pathLength */
-  final SVGAnimatedNumber pathLength;
+  /// @domName SVGPathElement.normalizedPathSegList; @docsEditable true
+  final PathSegList normalizedPathSegList;
 
-  /** @domName SVGPathElement.pathSegList */
-  final SVGPathSegList pathSegList;
+  /// @domName SVGPathElement.pathLength; @docsEditable true
+  final AnimatedNumber pathLength;
 
-  /** @domName SVGPathElement.createSVGPathSegArcAbs */
-  SVGPathSegArcAbs createSVGPathSegArcAbs(num x, num y, num r1, num r2, num angle, bool largeArcFlag, bool sweepFlag) native;
+  /// @domName SVGPathElement.pathSegList; @docsEditable true
+  final PathSegList pathSegList;
 
-  /** @domName SVGPathElement.createSVGPathSegArcRel */
-  SVGPathSegArcRel createSVGPathSegArcRel(num x, num y, num r1, num r2, num angle, bool largeArcFlag, bool sweepFlag) native;
+  /// @domName SVGPathElement.createSVGPathSegArcAbs; @docsEditable true
+  PathSegArcAbs createSVGPathSegArcAbs(num x, num y, num r1, num r2, num angle, bool largeArcFlag, bool sweepFlag) native;
 
-  /** @domName SVGPathElement.createSVGPathSegClosePath */
-  SVGPathSegClosePath createSVGPathSegClosePath() native;
+  /// @domName SVGPathElement.createSVGPathSegArcRel; @docsEditable true
+  PathSegArcRel createSVGPathSegArcRel(num x, num y, num r1, num r2, num angle, bool largeArcFlag, bool sweepFlag) native;
 
-  /** @domName SVGPathElement.createSVGPathSegCurvetoCubicAbs */
-  SVGPathSegCurvetoCubicAbs createSVGPathSegCurvetoCubicAbs(num x, num y, num x1, num y1, num x2, num y2) native;
+  /// @domName SVGPathElement.createSVGPathSegClosePath; @docsEditable true
+  PathSegClosePath createSVGPathSegClosePath() native;
 
-  /** @domName SVGPathElement.createSVGPathSegCurvetoCubicRel */
-  SVGPathSegCurvetoCubicRel createSVGPathSegCurvetoCubicRel(num x, num y, num x1, num y1, num x2, num y2) native;
+  /// @domName SVGPathElement.createSVGPathSegCurvetoCubicAbs; @docsEditable true
+  PathSegCurvetoCubicAbs createSVGPathSegCurvetoCubicAbs(num x, num y, num x1, num y1, num x2, num y2) native;
 
-  /** @domName SVGPathElement.createSVGPathSegCurvetoCubicSmoothAbs */
-  SVGPathSegCurvetoCubicSmoothAbs createSVGPathSegCurvetoCubicSmoothAbs(num x, num y, 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;
 
-  /** @domName SVGPathElement.createSVGPathSegCurvetoCubicSmoothRel */
-  SVGPathSegCurvetoCubicSmoothRel createSVGPathSegCurvetoCubicSmoothRel(num x, num y, num x2, num y2) native;
+  /// @domName SVGPathElement.createSVGPathSegCurvetoCubicSmoothAbs; @docsEditable true
+  PathSegCurvetoCubicSmoothAbs createSVGPathSegCurvetoCubicSmoothAbs(num x, num y, num x2, num y2) native;
 
-  /** @domName SVGPathElement.createSVGPathSegCurvetoQuadraticAbs */
-  SVGPathSegCurvetoQuadraticAbs createSVGPathSegCurvetoQuadraticAbs(num x, num y, num x1, num y1) native;
+  /// @domName SVGPathElement.createSVGPathSegCurvetoCubicSmoothRel; @docsEditable true
+  PathSegCurvetoCubicSmoothRel createSVGPathSegCurvetoCubicSmoothRel(num x, num y, num x2, num y2) native;
 
-  /** @domName SVGPathElement.createSVGPathSegCurvetoQuadraticRel */
-  SVGPathSegCurvetoQuadraticRel createSVGPathSegCurvetoQuadraticRel(num x, num y, num x1, num y1) native;
+  /// @domName SVGPathElement.createSVGPathSegCurvetoQuadraticAbs; @docsEditable true
+  PathSegCurvetoQuadraticAbs createSVGPathSegCurvetoQuadraticAbs(num x, num y, num x1, num y1) native;
 
-  /** @domName SVGPathElement.createSVGPathSegCurvetoQuadraticSmoothAbs */
-  SVGPathSegCurvetoQuadraticSmoothAbs createSVGPathSegCurvetoQuadraticSmoothAbs(num x, num y) native;
+  /// @domName SVGPathElement.createSVGPathSegCurvetoQuadraticRel; @docsEditable true
+  PathSegCurvetoQuadraticRel createSVGPathSegCurvetoQuadraticRel(num x, num y, num x1, num y1) native;
 
-  /** @domName SVGPathElement.createSVGPathSegCurvetoQuadraticSmoothRel */
-  SVGPathSegCurvetoQuadraticSmoothRel createSVGPathSegCurvetoQuadraticSmoothRel(num x, num y) native;
+  /// @domName SVGPathElement.createSVGPathSegCurvetoQuadraticSmoothAbs; @docsEditable true
+  PathSegCurvetoQuadraticSmoothAbs createSVGPathSegCurvetoQuadraticSmoothAbs(num x, num y) native;
 
-  /** @domName SVGPathElement.createSVGPathSegLinetoAbs */
-  SVGPathSegLinetoAbs createSVGPathSegLinetoAbs(num x, num y) native;
+  /// @domName SVGPathElement.createSVGPathSegCurvetoQuadraticSmoothRel; @docsEditable true
+  PathSegCurvetoQuadraticSmoothRel createSVGPathSegCurvetoQuadraticSmoothRel(num x, num y) native;
 
-  /** @domName SVGPathElement.createSVGPathSegLinetoHorizontalAbs */
-  SVGPathSegLinetoHorizontalAbs createSVGPathSegLinetoHorizontalAbs(num x) native;
+  /// @domName SVGPathElement.createSVGPathSegLinetoAbs; @docsEditable true
+  PathSegLinetoAbs createSVGPathSegLinetoAbs(num x, num y) native;
 
-  /** @domName SVGPathElement.createSVGPathSegLinetoHorizontalRel */
-  SVGPathSegLinetoHorizontalRel createSVGPathSegLinetoHorizontalRel(num x) native;
+  /// @domName SVGPathElement.createSVGPathSegLinetoHorizontalAbs; @docsEditable true
+  PathSegLinetoHorizontalAbs createSVGPathSegLinetoHorizontalAbs(num x) native;
 
-  /** @domName SVGPathElement.createSVGPathSegLinetoRel */
-  SVGPathSegLinetoRel createSVGPathSegLinetoRel(num x, num y) native;
+  /// @domName SVGPathElement.createSVGPathSegLinetoHorizontalRel; @docsEditable true
+  PathSegLinetoHorizontalRel createSVGPathSegLinetoHorizontalRel(num x) native;
 
-  /** @domName SVGPathElement.createSVGPathSegLinetoVerticalAbs */
-  SVGPathSegLinetoVerticalAbs createSVGPathSegLinetoVerticalAbs(num y) native;
+  /// @domName SVGPathElement.createSVGPathSegLinetoRel; @docsEditable true
+  PathSegLinetoRel createSVGPathSegLinetoRel(num x, num y) native;
 
-  /** @domName SVGPathElement.createSVGPathSegLinetoVerticalRel */
-  SVGPathSegLinetoVerticalRel createSVGPathSegLinetoVerticalRel(num y) native;
+  /// @domName SVGPathElement.createSVGPathSegLinetoVerticalAbs; @docsEditable true
+  PathSegLinetoVerticalAbs createSVGPathSegLinetoVerticalAbs(num y) native;
 
-  /** @domName SVGPathElement.createSVGPathSegMovetoAbs */
-  SVGPathSegMovetoAbs createSVGPathSegMovetoAbs(num x, num y) native;
+  /// @domName SVGPathElement.createSVGPathSegLinetoVerticalRel; @docsEditable true
+  PathSegLinetoVerticalRel createSVGPathSegLinetoVerticalRel(num y) native;
 
-  /** @domName SVGPathElement.createSVGPathSegMovetoRel */
-  SVGPathSegMovetoRel createSVGPathSegMovetoRel(num x, num y) native;
+  /// @domName SVGPathElement.createSVGPathSegMovetoAbs; @docsEditable true
+  PathSegMovetoAbs createSVGPathSegMovetoAbs(num x, num y) native;
 
-  /** @domName SVGPathElement.getPathSegAtLength */
+  /// @domName SVGPathElement.createSVGPathSegMovetoRel; @docsEditable true
+  PathSegMovetoRel createSVGPathSegMovetoRel(num x, num y) native;
+
+  /// @domName SVGPathElement.getPathSegAtLength; @docsEditable true
   int getPathSegAtLength(num distance) native;
 
-  /** @domName SVGPathElement.getPointAtLength */
-  SVGPoint getPointAtLength(num distance) native;
+  /// @domName SVGPathElement.getPointAtLength; @docsEditable true
+  Point getPointAtLength(num distance) native;
 
-  /** @domName SVGPathElement.getTotalLength */
+  /// @domName SVGPathElement.getTotalLength; @docsEditable true
   num getTotalLength() native;
 
   // From SVGExternalResourcesRequired
 
-  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
-  final SVGAnimatedBoolean externalResourcesRequired;
+  /// @domName SVGExternalResourcesRequired.externalResourcesRequired; @docsEditable true
+  final AnimatedBoolean externalResourcesRequired;
 
   // From SVGLangSpace
 
-  /** @domName SVGLangSpace.xmllang */
+  /// @domName SVGLangSpace.xmllang; @docsEditable true
   String xmllang;
 
-  /** @domName SVGLangSpace.xmlspace */
+  /// @domName SVGLangSpace.xmlspace; @docsEditable true
   String xmlspace;
 
   // From SVGLocatable
 
-  /** @domName SVGLocatable.farthestViewportElement */
-  final SVGElement farthestViewportElement;
+  /// @domName SVGLocatable.farthestViewportElement; @docsEditable true
+  final SvgElement farthestViewportElement;
 
-  /** @domName SVGLocatable.nearestViewportElement */
-  final SVGElement nearestViewportElement;
+  /// @domName SVGLocatable.nearestViewportElement; @docsEditable true
+  final SvgElement nearestViewportElement;
 
-  /** @domName SVGLocatable.getBBox */
-  SVGRect getBBox() native;
+  /// @domName SVGLocatable.getBBox; @docsEditable true
+  Rect getBBox() native;
 
-  /** @domName SVGLocatable.getCTM */
-  SVGMatrix getCTM() native;
+  /// @domName SVGLocatable.getCTM; @docsEditable true
+  Matrix getCTM() native;
 
-  /** @domName SVGLocatable.getScreenCTM */
-  SVGMatrix getScreenCTM() native;
+  /// @domName SVGLocatable.getScreenCTM; @docsEditable true
+  Matrix getScreenCTM() native;
 
-  /** @domName SVGLocatable.getTransformToElement */
-  SVGMatrix getTransformToElement(SVGElement element) native;
+  /// @domName SVGLocatable.getTransformToElement; @docsEditable true
+  Matrix getTransformToElement(SvgElement element) native;
 
   // From SVGStylable
 
-  /** @domName SVGStylable.className */
-  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+  /// @domName SVGStylable.className; @docsEditable true
+  AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CSSStyleDeclaration style;
 
-  /** @domName SVGStylable.getPresentationAttribute */
+  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
   CSSValue getPresentationAttribute(String name) native;
 
   // From SVGTests
 
-  /** @domName SVGTests.requiredExtensions */
-  final SVGStringList requiredExtensions;
+  /// @domName SVGTests.requiredExtensions; @docsEditable true
+  final StringList requiredExtensions;
 
-  /** @domName SVGTests.requiredFeatures */
-  final SVGStringList requiredFeatures;
+  /// @domName SVGTests.requiredFeatures; @docsEditable true
+  final StringList requiredFeatures;
 
-  /** @domName SVGTests.systemLanguage */
-  final SVGStringList systemLanguage;
+  /// @domName SVGTests.systemLanguage; @docsEditable true
+  final StringList systemLanguage;
 
-  /** @domName SVGTests.hasExtension */
+  /// @domName SVGTests.hasExtension; @docsEditable true
   bool hasExtension(String extension) native;
 
   // From SVGTransformable
 
-  /** @domName SVGTransformable.transform */
-  final SVGAnimatedTransformList transform;
+  /// @domName SVGTransformable.transform; @docsEditable true
+  final AnimatedTransformList transform;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGPathSeg
-class SVGPathSeg native "*SVGPathSeg" {
+/// @domName SVGPathSeg; @docsEditable true
+class PathSeg native "*SVGPathSeg" {
 
   static const int PATHSEG_ARC_ABS = 10;
 
@@ -3823,10 +3782,10 @@
 
   static const int PATHSEG_UNKNOWN = 0;
 
-  /** @domName SVGPathSeg.pathSegType */
+  /// @domName SVGPathSeg.pathSegType; @docsEditable true
   final int pathSegType;
 
-  /** @domName SVGPathSeg.pathSegTypeAsLetter */
+  /// @domName SVGPathSeg.pathSegTypeAsLetter; @docsEditable true
   final String pathSegTypeAsLetter;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3834,28 +3793,28 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGPathSegArcAbs
-class SVGPathSegArcAbs extends SVGPathSeg native "*SVGPathSegArcAbs" {
+/// @domName SVGPathSegArcAbs; @docsEditable true
+class PathSegArcAbs extends PathSeg native "*SVGPathSegArcAbs" {
 
-  /** @domName SVGPathSegArcAbs.angle */
+  /// @domName SVGPathSegArcAbs.angle; @docsEditable true
   num angle;
 
-  /** @domName SVGPathSegArcAbs.largeArcFlag */
+  /// @domName SVGPathSegArcAbs.largeArcFlag; @docsEditable true
   bool largeArcFlag;
 
-  /** @domName SVGPathSegArcAbs.r1 */
+  /// @domName SVGPathSegArcAbs.r1; @docsEditable true
   num r1;
 
-  /** @domName SVGPathSegArcAbs.r2 */
+  /// @domName SVGPathSegArcAbs.r2; @docsEditable true
   num r2;
 
-  /** @domName SVGPathSegArcAbs.sweepFlag */
+  /// @domName SVGPathSegArcAbs.sweepFlag; @docsEditable true
   bool sweepFlag;
 
-  /** @domName SVGPathSegArcAbs.x */
+  /// @domName SVGPathSegArcAbs.x; @docsEditable true
   num x;
 
-  /** @domName SVGPathSegArcAbs.y */
+  /// @domName SVGPathSegArcAbs.y; @docsEditable true
   num y;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3863,28 +3822,28 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGPathSegArcRel
-class SVGPathSegArcRel extends SVGPathSeg native "*SVGPathSegArcRel" {
+/// @domName SVGPathSegArcRel; @docsEditable true
+class PathSegArcRel extends PathSeg native "*SVGPathSegArcRel" {
 
-  /** @domName SVGPathSegArcRel.angle */
+  /// @domName SVGPathSegArcRel.angle; @docsEditable true
   num angle;
 
-  /** @domName SVGPathSegArcRel.largeArcFlag */
+  /// @domName SVGPathSegArcRel.largeArcFlag; @docsEditable true
   bool largeArcFlag;
 
-  /** @domName SVGPathSegArcRel.r1 */
+  /// @domName SVGPathSegArcRel.r1; @docsEditable true
   num r1;
 
-  /** @domName SVGPathSegArcRel.r2 */
+  /// @domName SVGPathSegArcRel.r2; @docsEditable true
   num r2;
 
-  /** @domName SVGPathSegArcRel.sweepFlag */
+  /// @domName SVGPathSegArcRel.sweepFlag; @docsEditable true
   bool sweepFlag;
 
-  /** @domName SVGPathSegArcRel.x */
+  /// @domName SVGPathSegArcRel.x; @docsEditable true
   num x;
 
-  /** @domName SVGPathSegArcRel.y */
+  /// @domName SVGPathSegArcRel.y; @docsEditable true
   num y;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3892,33 +3851,33 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGPathSegClosePath
-class SVGPathSegClosePath extends SVGPathSeg native "*SVGPathSegClosePath" {
+/// @domName SVGPathSegClosePath; @docsEditable true
+class PathSegClosePath extends PathSeg native "*SVGPathSegClosePath" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for 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 SVGPathSegCurvetoCubicAbs
-class SVGPathSegCurvetoCubicAbs extends SVGPathSeg native "*SVGPathSegCurvetoCubicAbs" {
+/// @domName SVGPathSegCurvetoCubicAbs; @docsEditable true
+class PathSegCurvetoCubicAbs extends PathSeg native "*SVGPathSegCurvetoCubicAbs" {
 
-  /** @domName SVGPathSegCurvetoCubicAbs.x */
+  /// @domName SVGPathSegCurvetoCubicAbs.x; @docsEditable true
   num x;
 
-  /** @domName SVGPathSegCurvetoCubicAbs.x1 */
+  /// @domName SVGPathSegCurvetoCubicAbs.x1; @docsEditable true
   num x1;
 
-  /** @domName SVGPathSegCurvetoCubicAbs.x2 */
+  /// @domName SVGPathSegCurvetoCubicAbs.x2; @docsEditable true
   num x2;
 
-  /** @domName SVGPathSegCurvetoCubicAbs.y */
+  /// @domName SVGPathSegCurvetoCubicAbs.y; @docsEditable true
   num y;
 
-  /** @domName SVGPathSegCurvetoCubicAbs.y1 */
+  /// @domName SVGPathSegCurvetoCubicAbs.y1; @docsEditable true
   num y1;
 
-  /** @domName SVGPathSegCurvetoCubicAbs.y2 */
+  /// @domName SVGPathSegCurvetoCubicAbs.y2; @docsEditable true
   num y2;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3926,25 +3885,25 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGPathSegCurvetoCubicRel
-class SVGPathSegCurvetoCubicRel extends SVGPathSeg native "*SVGPathSegCurvetoCubicRel" {
+/// @domName SVGPathSegCurvetoCubicRel; @docsEditable true
+class PathSegCurvetoCubicRel extends PathSeg native "*SVGPathSegCurvetoCubicRel" {
 
-  /** @domName SVGPathSegCurvetoCubicRel.x */
+  /// @domName SVGPathSegCurvetoCubicRel.x; @docsEditable true
   num x;
 
-  /** @domName SVGPathSegCurvetoCubicRel.x1 */
+  /// @domName SVGPathSegCurvetoCubicRel.x1; @docsEditable true
   num x1;
 
-  /** @domName SVGPathSegCurvetoCubicRel.x2 */
+  /// @domName SVGPathSegCurvetoCubicRel.x2; @docsEditable true
   num x2;
 
-  /** @domName SVGPathSegCurvetoCubicRel.y */
+  /// @domName SVGPathSegCurvetoCubicRel.y; @docsEditable true
   num y;
 
-  /** @domName SVGPathSegCurvetoCubicRel.y1 */
+  /// @domName SVGPathSegCurvetoCubicRel.y1; @docsEditable true
   num y1;
 
-  /** @domName SVGPathSegCurvetoCubicRel.y2 */
+  /// @domName SVGPathSegCurvetoCubicRel.y2; @docsEditable true
   num y2;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3952,19 +3911,19 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGPathSegCurvetoCubicSmoothAbs
-class SVGPathSegCurvetoCubicSmoothAbs extends SVGPathSeg native "*SVGPathSegCurvetoCubicSmoothAbs" {
+/// @domName SVGPathSegCurvetoCubicSmoothAbs; @docsEditable true
+class PathSegCurvetoCubicSmoothAbs extends PathSeg native "*SVGPathSegCurvetoCubicSmoothAbs" {
 
-  /** @domName SVGPathSegCurvetoCubicSmoothAbs.x */
+  /// @domName SVGPathSegCurvetoCubicSmoothAbs.x; @docsEditable true
   num x;
 
-  /** @domName SVGPathSegCurvetoCubicSmoothAbs.x2 */
+  /// @domName SVGPathSegCurvetoCubicSmoothAbs.x2; @docsEditable true
   num x2;
 
-  /** @domName SVGPathSegCurvetoCubicSmoothAbs.y */
+  /// @domName SVGPathSegCurvetoCubicSmoothAbs.y; @docsEditable true
   num y;
 
-  /** @domName SVGPathSegCurvetoCubicSmoothAbs.y2 */
+  /// @domName SVGPathSegCurvetoCubicSmoothAbs.y2; @docsEditable true
   num y2;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3972,19 +3931,19 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGPathSegCurvetoCubicSmoothRel
-class SVGPathSegCurvetoCubicSmoothRel extends SVGPathSeg native "*SVGPathSegCurvetoCubicSmoothRel" {
+/// @domName SVGPathSegCurvetoCubicSmoothRel; @docsEditable true
+class PathSegCurvetoCubicSmoothRel extends PathSeg native "*SVGPathSegCurvetoCubicSmoothRel" {
 
-  /** @domName SVGPathSegCurvetoCubicSmoothRel.x */
+  /// @domName SVGPathSegCurvetoCubicSmoothRel.x; @docsEditable true
   num x;
 
-  /** @domName SVGPathSegCurvetoCubicSmoothRel.x2 */
+  /// @domName SVGPathSegCurvetoCubicSmoothRel.x2; @docsEditable true
   num x2;
 
-  /** @domName SVGPathSegCurvetoCubicSmoothRel.y */
+  /// @domName SVGPathSegCurvetoCubicSmoothRel.y; @docsEditable true
   num y;
 
-  /** @domName SVGPathSegCurvetoCubicSmoothRel.y2 */
+  /// @domName SVGPathSegCurvetoCubicSmoothRel.y2; @docsEditable true
   num y2;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3992,19 +3951,19 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGPathSegCurvetoQuadraticAbs
-class SVGPathSegCurvetoQuadraticAbs extends SVGPathSeg native "*SVGPathSegCurvetoQuadraticAbs" {
+/// @domName SVGPathSegCurvetoQuadraticAbs; @docsEditable true
+class PathSegCurvetoQuadraticAbs extends PathSeg native "*SVGPathSegCurvetoQuadraticAbs" {
 
-  /** @domName SVGPathSegCurvetoQuadraticAbs.x */
+  /// @domName SVGPathSegCurvetoQuadraticAbs.x; @docsEditable true
   num x;
 
-  /** @domName SVGPathSegCurvetoQuadraticAbs.x1 */
+  /// @domName SVGPathSegCurvetoQuadraticAbs.x1; @docsEditable true
   num x1;
 
-  /** @domName SVGPathSegCurvetoQuadraticAbs.y */
+  /// @domName SVGPathSegCurvetoQuadraticAbs.y; @docsEditable true
   num y;
 
-  /** @domName SVGPathSegCurvetoQuadraticAbs.y1 */
+  /// @domName SVGPathSegCurvetoQuadraticAbs.y1; @docsEditable true
   num y1;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4012,19 +3971,19 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGPathSegCurvetoQuadraticRel
-class SVGPathSegCurvetoQuadraticRel extends SVGPathSeg native "*SVGPathSegCurvetoQuadraticRel" {
+/// @domName SVGPathSegCurvetoQuadraticRel; @docsEditable true
+class PathSegCurvetoQuadraticRel extends PathSeg native "*SVGPathSegCurvetoQuadraticRel" {
 
-  /** @domName SVGPathSegCurvetoQuadraticRel.x */
+  /// @domName SVGPathSegCurvetoQuadraticRel.x; @docsEditable true
   num x;
 
-  /** @domName SVGPathSegCurvetoQuadraticRel.x1 */
+  /// @domName SVGPathSegCurvetoQuadraticRel.x1; @docsEditable true
   num x1;
 
-  /** @domName SVGPathSegCurvetoQuadraticRel.y */
+  /// @domName SVGPathSegCurvetoQuadraticRel.y; @docsEditable true
   num y;
 
-  /** @domName SVGPathSegCurvetoQuadraticRel.y1 */
+  /// @domName SVGPathSegCurvetoQuadraticRel.y1; @docsEditable true
   num y1;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4032,13 +3991,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGPathSegCurvetoQuadraticSmoothAbs
-class SVGPathSegCurvetoQuadraticSmoothAbs extends SVGPathSeg native "*SVGPathSegCurvetoQuadraticSmoothAbs" {
+/// @domName SVGPathSegCurvetoQuadraticSmoothAbs; @docsEditable true
+class PathSegCurvetoQuadraticSmoothAbs extends PathSeg native "*SVGPathSegCurvetoQuadraticSmoothAbs" {
 
-  /** @domName SVGPathSegCurvetoQuadraticSmoothAbs.x */
+  /// @domName SVGPathSegCurvetoQuadraticSmoothAbs.x; @docsEditable true
   num x;
 
-  /** @domName SVGPathSegCurvetoQuadraticSmoothAbs.y */
+  /// @domName SVGPathSegCurvetoQuadraticSmoothAbs.y; @docsEditable true
   num y;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4046,13 +4005,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGPathSegCurvetoQuadraticSmoothRel
-class SVGPathSegCurvetoQuadraticSmoothRel extends SVGPathSeg native "*SVGPathSegCurvetoQuadraticSmoothRel" {
+/// @domName SVGPathSegCurvetoQuadraticSmoothRel; @docsEditable true
+class PathSegCurvetoQuadraticSmoothRel extends PathSeg native "*SVGPathSegCurvetoQuadraticSmoothRel" {
 
-  /** @domName SVGPathSegCurvetoQuadraticSmoothRel.x */
+  /// @domName SVGPathSegCurvetoQuadraticSmoothRel.x; @docsEditable true
   num x;
 
-  /** @domName SVGPathSegCurvetoQuadraticSmoothRel.y */
+  /// @domName SVGPathSegCurvetoQuadraticSmoothRel.y; @docsEditable true
   num y;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4060,13 +4019,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGPathSegLinetoAbs
-class SVGPathSegLinetoAbs extends SVGPathSeg native "*SVGPathSegLinetoAbs" {
+/// @domName SVGPathSegLinetoAbs; @docsEditable true
+class PathSegLinetoAbs extends PathSeg native "*SVGPathSegLinetoAbs" {
 
-  /** @domName SVGPathSegLinetoAbs.x */
+  /// @domName SVGPathSegLinetoAbs.x; @docsEditable true
   num x;
 
-  /** @domName SVGPathSegLinetoAbs.y */
+  /// @domName SVGPathSegLinetoAbs.y; @docsEditable true
   num y;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4074,10 +4033,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGPathSegLinetoHorizontalAbs
-class SVGPathSegLinetoHorizontalAbs extends SVGPathSeg native "*SVGPathSegLinetoHorizontalAbs" {
+/// @domName SVGPathSegLinetoHorizontalAbs; @docsEditable true
+class PathSegLinetoHorizontalAbs extends PathSeg native "*SVGPathSegLinetoHorizontalAbs" {
 
-  /** @domName SVGPathSegLinetoHorizontalAbs.x */
+  /// @domName SVGPathSegLinetoHorizontalAbs.x; @docsEditable true
   num x;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4085,10 +4044,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGPathSegLinetoHorizontalRel
-class SVGPathSegLinetoHorizontalRel extends SVGPathSeg native "*SVGPathSegLinetoHorizontalRel" {
+/// @domName SVGPathSegLinetoHorizontalRel; @docsEditable true
+class PathSegLinetoHorizontalRel extends PathSeg native "*SVGPathSegLinetoHorizontalRel" {
 
-  /** @domName SVGPathSegLinetoHorizontalRel.x */
+  /// @domName SVGPathSegLinetoHorizontalRel.x; @docsEditable true
   num x;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4096,13 +4055,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGPathSegLinetoRel
-class SVGPathSegLinetoRel extends SVGPathSeg native "*SVGPathSegLinetoRel" {
+/// @domName SVGPathSegLinetoRel; @docsEditable true
+class PathSegLinetoRel extends PathSeg native "*SVGPathSegLinetoRel" {
 
-  /** @domName SVGPathSegLinetoRel.x */
+  /// @domName SVGPathSegLinetoRel.x; @docsEditable true
   num x;
 
-  /** @domName SVGPathSegLinetoRel.y */
+  /// @domName SVGPathSegLinetoRel.y; @docsEditable true
   num y;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4110,10 +4069,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGPathSegLinetoVerticalAbs
-class SVGPathSegLinetoVerticalAbs extends SVGPathSeg native "*SVGPathSegLinetoVerticalAbs" {
+/// @domName SVGPathSegLinetoVerticalAbs; @docsEditable true
+class PathSegLinetoVerticalAbs extends PathSeg native "*SVGPathSegLinetoVerticalAbs" {
 
-  /** @domName SVGPathSegLinetoVerticalAbs.y */
+  /// @domName SVGPathSegLinetoVerticalAbs.y; @docsEditable true
   num y;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4121,10 +4080,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGPathSegLinetoVerticalRel
-class SVGPathSegLinetoVerticalRel extends SVGPathSeg native "*SVGPathSegLinetoVerticalRel" {
+/// @domName SVGPathSegLinetoVerticalRel; @docsEditable true
+class PathSegLinetoVerticalRel extends PathSeg native "*SVGPathSegLinetoVerticalRel" {
 
-  /** @domName SVGPathSegLinetoVerticalRel.y */
+  /// @domName SVGPathSegLinetoVerticalRel.y; @docsEditable true
   num y;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4132,79 +4091,81 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGPathSegList
-class SVGPathSegList implements JavaScriptIndexingBehavior, List<SVGPathSeg> native "*SVGPathSegList" {
+/// @domName SVGPathSegList; @docsEditable true
+class PathSegList implements JavaScriptIndexingBehavior, List<PathSeg> native "*SVGPathSegList" {
 
-  /** @domName SVGPathSegList.numberOfItems */
+  /// @domName SVGPathSegList.numberOfItems; @docsEditable true
   final int numberOfItems;
 
-  SVGPathSeg operator[](int index) => JS("SVGPathSeg", "#[#]", this, index);
+  PathSeg operator[](int index) => JS("PathSeg", "#[#]", this, index);
 
-  void operator[]=(int index, SVGPathSeg value) {
+  void operator[]=(int index, PathSeg value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
-  // -- start List<SVGPathSeg> mixins.
-  // SVGPathSeg is the element type.
+  // -- start List<PathSeg> mixins.
+  // PathSeg is the element type.
 
-  // From Iterable<SVGPathSeg>:
+  // From Iterable<PathSeg>:
 
-  Iterator<SVGPathSeg> iterator() {
+  Iterator<PathSeg> 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<SVGPathSeg>(this);
+    return new FixedSizeListIterator<PathSeg>(this);
   }
 
-  // From Collection<SVGPathSeg>:
+  // From Collection<PathSeg>:
 
-  void add(SVGPathSeg value) {
+  void add(PathSeg value) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  void addLast(SVGPathSeg value) {
+  void addLast(PathSeg value) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  void addAll(Collection<SVGPathSeg> collection) {
+  void addAll(Collection<PathSeg> collection) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  bool contains(SVGPathSeg element) => _Collections.contains(this, element);
+  bool contains(PathSeg element) => _Collections.contains(this, element);
 
-  void forEach(void f(SVGPathSeg element)) => _Collections.forEach(this, f);
+  void forEach(void f(PathSeg element)) => _Collections.forEach(this, f);
 
-  Collection map(f(SVGPathSeg element)) => _Collections.map(this, [], f);
+  Collection map(f(PathSeg element)) => _Collections.map(this, [], f);
 
-  Collection<SVGPathSeg> filter(bool f(SVGPathSeg element)) =>
-     _Collections.filter(this, <SVGPathSeg>[], f);
+  Collection<PathSeg> filter(bool f(PathSeg element)) =>
+     _Collections.filter(this, <PathSeg>[], f);
 
-  bool every(bool f(SVGPathSeg element)) => _Collections.every(this, f);
+  bool every(bool f(PathSeg element)) => _Collections.every(this, f);
 
-  bool some(bool f(SVGPathSeg element)) => _Collections.some(this, f);
+  bool some(bool f(PathSeg element)) => _Collections.some(this, f);
 
   bool get isEmpty => this.length == 0;
 
-  // From List<SVGPathSeg>:
+  // From List<PathSeg>:
 
-  void sort([Comparator<SVGPathSeg> compare = Comparable.compare]) {
+  void sort([Comparator<PathSeg> compare = Comparable.compare]) {
     throw new UnsupportedError("Cannot sort immutable List.");
   }
 
-  int indexOf(SVGPathSeg element, [int start = 0]) =>
+  int indexOf(PathSeg element, [int start = 0]) =>
       _Lists.indexOf(this, element, start, this.length);
 
-  int lastIndexOf(SVGPathSeg element, [int start]) {
+  int lastIndexOf(PathSeg element, [int start]) {
     if (start == null) start = length - 1;
     return _Lists.lastIndexOf(this, element, start);
   }
 
-  SVGPathSeg get last => this[length - 1];
+  PathSeg get first => this[0];
 
-  SVGPathSeg removeLast() {
+  PathSeg get last => this[length - 1];
+
+  PathSeg removeLast() {
     throw new UnsupportedError("Cannot removeLast on immutable List.");
   }
 
-  void setRange(int start, int rangeLength, List<SVGPathSeg> from, [int startFrom]) {
+  void setRange(int start, int rangeLength, List<PathSeg> from, [int startFrom]) {
     throw new UnsupportedError("Cannot setRange on immutable List.");
   }
 
@@ -4212,48 +4173,48 @@
     throw new UnsupportedError("Cannot removeRange on immutable List.");
   }
 
-  void insertRange(int start, int rangeLength, [SVGPathSeg initialValue]) {
+  void insertRange(int start, int rangeLength, [PathSeg initialValue]) {
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
-  List<SVGPathSeg> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <SVGPathSeg>[]);
+  List<PathSeg> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <PathSeg>[]);
 
-  // -- end List<SVGPathSeg> mixins.
+  // -- end List<PathSeg> mixins.
 
-  /** @domName SVGPathSegList.appendItem */
-  SVGPathSeg appendItem(SVGPathSeg newItem) native;
+  /// @domName SVGPathSegList.appendItem; @docsEditable true
+  PathSeg appendItem(PathSeg newItem) native;
 
-  /** @domName SVGPathSegList.clear */
+  /// @domName SVGPathSegList.clear; @docsEditable true
   void clear() native;
 
-  /** @domName SVGPathSegList.getItem */
-  SVGPathSeg getItem(int index) native;
+  /// @domName SVGPathSegList.getItem; @docsEditable true
+  PathSeg getItem(int index) native;
 
-  /** @domName SVGPathSegList.initialize */
-  SVGPathSeg initialize(SVGPathSeg newItem) native;
+  /// @domName SVGPathSegList.initialize; @docsEditable true
+  PathSeg initialize(PathSeg newItem) native;
 
-  /** @domName SVGPathSegList.insertItemBefore */
-  SVGPathSeg insertItemBefore(SVGPathSeg newItem, int index) native;
+  /// @domName SVGPathSegList.insertItemBefore; @docsEditable true
+  PathSeg insertItemBefore(PathSeg newItem, int index) native;
 
-  /** @domName SVGPathSegList.removeItem */
-  SVGPathSeg removeItem(int index) native;
+  /// @domName SVGPathSegList.removeItem; @docsEditable true
+  PathSeg removeItem(int index) native;
 
-  /** @domName SVGPathSegList.replaceItem */
-  SVGPathSeg replaceItem(SVGPathSeg newItem, int index) native;
+  /// @domName SVGPathSegList.replaceItem; @docsEditable true
+  PathSeg replaceItem(PathSeg newItem, 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 SVGPathSegMovetoAbs
-class SVGPathSegMovetoAbs extends SVGPathSeg native "*SVGPathSegMovetoAbs" {
+/// @domName SVGPathSegMovetoAbs; @docsEditable true
+class PathSegMovetoAbs extends PathSeg native "*SVGPathSegMovetoAbs" {
 
-  /** @domName SVGPathSegMovetoAbs.x */
+  /// @domName SVGPathSegMovetoAbs.x; @docsEditable true
   num x;
 
-  /** @domName SVGPathSegMovetoAbs.y */
+  /// @domName SVGPathSegMovetoAbs.y; @docsEditable true
   num y;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4261,13 +4222,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGPathSegMovetoRel
-class SVGPathSegMovetoRel extends SVGPathSeg native "*SVGPathSegMovetoRel" {
+/// @domName SVGPathSegMovetoRel; @docsEditable true
+class PathSegMovetoRel extends PathSeg native "*SVGPathSegMovetoRel" {
 
-  /** @domName SVGPathSegMovetoRel.x */
+  /// @domName SVGPathSegMovetoRel.x; @docsEditable true
   num x;
 
-  /** @domName SVGPathSegMovetoRel.y */
+  /// @domName SVGPathSegMovetoRel.y; @docsEditable true
   num y;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4275,291 +4236,300 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGPatternElement
-class SVGPatternElement extends SVGElement implements SVGLangSpace, SVGTests, SVGStylable, SVGURIReference, SVGFitToViewBox, SVGExternalResourcesRequired native "*SVGPatternElement" {
+/// @domName SVGPatternElement; @docsEditable true
+class PatternElement extends SvgElement implements FitToViewBox, Tests, UriReference, Stylable, ExternalResourcesRequired, LangSpace native "*SVGPatternElement" {
 
-  /** @domName SVGPatternElement.height */
-  final SVGAnimatedLength height;
+  factory PatternElement() => _SvgElementFactoryProvider.createSvgElement_tag("pattern");
 
-  /** @domName SVGPatternElement.patternContentUnits */
-  final SVGAnimatedEnumeration patternContentUnits;
+  /// @domName SVGPatternElement.height; @docsEditable true
+  final AnimatedLength height;
 
-  /** @domName SVGPatternElement.patternTransform */
-  final SVGAnimatedTransformList patternTransform;
+  /// @domName SVGPatternElement.patternContentUnits; @docsEditable true
+  final AnimatedEnumeration patternContentUnits;
 
-  /** @domName SVGPatternElement.patternUnits */
-  final SVGAnimatedEnumeration patternUnits;
+  /// @domName SVGPatternElement.patternTransform; @docsEditable true
+  final AnimatedTransformList patternTransform;
 
-  /** @domName SVGPatternElement.width */
-  final SVGAnimatedLength width;
+  /// @domName SVGPatternElement.patternUnits; @docsEditable true
+  final AnimatedEnumeration patternUnits;
 
-  /** @domName SVGPatternElement.x */
-  final SVGAnimatedLength x;
+  /// @domName SVGPatternElement.width; @docsEditable true
+  final AnimatedLength width;
 
-  /** @domName SVGPatternElement.y */
-  final SVGAnimatedLength y;
+  /// @domName SVGPatternElement.x; @docsEditable true
+  final AnimatedLength x;
+
+  /// @domName SVGPatternElement.y; @docsEditable true
+  final AnimatedLength y;
 
   // From SVGExternalResourcesRequired
 
-  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
-  final SVGAnimatedBoolean externalResourcesRequired;
+  /// @domName SVGExternalResourcesRequired.externalResourcesRequired; @docsEditable true
+  final AnimatedBoolean externalResourcesRequired;
 
   // From SVGFitToViewBox
 
-  /** @domName SVGFitToViewBox.preserveAspectRatio */
-  final SVGAnimatedPreserveAspectRatio preserveAspectRatio;
+  /// @domName SVGFitToViewBox.preserveAspectRatio; @docsEditable true
+  final AnimatedPreserveAspectRatio preserveAspectRatio;
 
-  /** @domName SVGFitToViewBox.viewBox */
-  final SVGAnimatedRect viewBox;
+  /// @domName SVGFitToViewBox.viewBox; @docsEditable true
+  final AnimatedRect viewBox;
 
   // From SVGLangSpace
 
-  /** @domName SVGLangSpace.xmllang */
+  /// @domName SVGLangSpace.xmllang; @docsEditable true
   String xmllang;
 
-  /** @domName SVGLangSpace.xmlspace */
+  /// @domName SVGLangSpace.xmlspace; @docsEditable true
   String xmlspace;
 
   // From SVGStylable
 
-  /** @domName SVGStylable.className */
-  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+  /// @domName SVGStylable.className; @docsEditable true
+  AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CSSStyleDeclaration style;
 
-  /** @domName SVGStylable.getPresentationAttribute */
+  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
   CSSValue getPresentationAttribute(String name) native;
 
   // From SVGTests
 
-  /** @domName SVGTests.requiredExtensions */
-  final SVGStringList requiredExtensions;
+  /// @domName SVGTests.requiredExtensions; @docsEditable true
+  final StringList requiredExtensions;
 
-  /** @domName SVGTests.requiredFeatures */
-  final SVGStringList requiredFeatures;
+  /// @domName SVGTests.requiredFeatures; @docsEditable true
+  final StringList requiredFeatures;
 
-  /** @domName SVGTests.systemLanguage */
-  final SVGStringList systemLanguage;
+  /// @domName SVGTests.systemLanguage; @docsEditable true
+  final StringList systemLanguage;
 
-  /** @domName SVGTests.hasExtension */
+  /// @domName SVGTests.hasExtension; @docsEditable true
   bool hasExtension(String extension) native;
 
   // From SVGURIReference
 
-  /** @domName SVGURIReference.href */
-  final SVGAnimatedString href;
+  /// @domName SVGURIReference.href; @docsEditable true
+  final AnimatedString href;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// WARNING: Do not edit - generated code.
 
-/// @domName SVGPoint
-class SVGPoint native "*SVGPoint" {
 
-  /** @domName SVGPoint.x */
+class Point native "*SVGPoint" {
+  factory Point(num x, num y) => _PointFactoryProvider.createPoint(x, y);
+
+  /// @domName SVGPoint.x; @docsEditable true
   num x;
 
-  /** @domName SVGPoint.y */
+  /// @domName SVGPoint.y; @docsEditable true
   num y;
 
-  /** @domName SVGPoint.matrixTransform */
-  SVGPoint matrixTransform(SVGMatrix matrix) native;
+  /// @domName SVGPoint.matrixTransform; @docsEditable true
+  Point matrixTransform(Matrix matrix) 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 SVGPointList
-class SVGPointList native "*SVGPointList" {
+/// @domName SVGPointList; @docsEditable true
+class PointList native "*SVGPointList" {
 
-  /** @domName SVGPointList.numberOfItems */
+  /// @domName SVGPointList.numberOfItems; @docsEditable true
   final int numberOfItems;
 
-  /** @domName SVGPointList.appendItem */
-  SVGPoint appendItem(SVGPoint item) native;
+  /// @domName SVGPointList.appendItem; @docsEditable true
+  Point appendItem(Point item) native;
 
-  /** @domName SVGPointList.clear */
+  /// @domName SVGPointList.clear; @docsEditable true
   void clear() native;
 
-  /** @domName SVGPointList.getItem */
-  SVGPoint getItem(int index) native;
+  /// @domName SVGPointList.getItem; @docsEditable true
+  Point getItem(int index) native;
 
-  /** @domName SVGPointList.initialize */
-  SVGPoint initialize(SVGPoint item) native;
+  /// @domName SVGPointList.initialize; @docsEditable true
+  Point initialize(Point item) native;
 
-  /** @domName SVGPointList.insertItemBefore */
-  SVGPoint insertItemBefore(SVGPoint item, int index) native;
+  /// @domName SVGPointList.insertItemBefore; @docsEditable true
+  Point insertItemBefore(Point item, int index) native;
 
-  /** @domName SVGPointList.removeItem */
-  SVGPoint removeItem(int index) native;
+  /// @domName SVGPointList.removeItem; @docsEditable true
+  Point removeItem(int index) native;
 
-  /** @domName SVGPointList.replaceItem */
-  SVGPoint replaceItem(SVGPoint item, int index) native;
+  /// @domName SVGPointList.replaceItem; @docsEditable true
+  Point replaceItem(Point 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 SVGPolygonElement
-class SVGPolygonElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired native "*SVGPolygonElement" {
+/// @domName SVGPolygonElement; @docsEditable true
+class PolygonElement extends SvgElement implements Transformable, Tests, Stylable, ExternalResourcesRequired, LangSpace native "*SVGPolygonElement" {
 
-  /** @domName SVGPolygonElement.animatedPoints */
-  final SVGPointList animatedPoints;
+  factory PolygonElement() => _SvgElementFactoryProvider.createSvgElement_tag("polygon");
 
-  /** @domName SVGPolygonElement.points */
-  final SVGPointList points;
+  /// @domName SVGPolygonElement.animatedPoints; @docsEditable true
+  final PointList animatedPoints;
+
+  /// @domName SVGPolygonElement.points; @docsEditable true
+  final PointList points;
 
   // From SVGExternalResourcesRequired
 
-  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
-  final SVGAnimatedBoolean externalResourcesRequired;
+  /// @domName SVGExternalResourcesRequired.externalResourcesRequired; @docsEditable true
+  final AnimatedBoolean externalResourcesRequired;
 
   // From SVGLangSpace
 
-  /** @domName SVGLangSpace.xmllang */
+  /// @domName SVGLangSpace.xmllang; @docsEditable true
   String xmllang;
 
-  /** @domName SVGLangSpace.xmlspace */
+  /// @domName SVGLangSpace.xmlspace; @docsEditable true
   String xmlspace;
 
   // From SVGLocatable
 
-  /** @domName SVGLocatable.farthestViewportElement */
-  final SVGElement farthestViewportElement;
+  /// @domName SVGLocatable.farthestViewportElement; @docsEditable true
+  final SvgElement farthestViewportElement;
 
-  /** @domName SVGLocatable.nearestViewportElement */
-  final SVGElement nearestViewportElement;
+  /// @domName SVGLocatable.nearestViewportElement; @docsEditable true
+  final SvgElement nearestViewportElement;
 
-  /** @domName SVGLocatable.getBBox */
-  SVGRect getBBox() native;
+  /// @domName SVGLocatable.getBBox; @docsEditable true
+  Rect getBBox() native;
 
-  /** @domName SVGLocatable.getCTM */
-  SVGMatrix getCTM() native;
+  /// @domName SVGLocatable.getCTM; @docsEditable true
+  Matrix getCTM() native;
 
-  /** @domName SVGLocatable.getScreenCTM */
-  SVGMatrix getScreenCTM() native;
+  /// @domName SVGLocatable.getScreenCTM; @docsEditable true
+  Matrix getScreenCTM() native;
 
-  /** @domName SVGLocatable.getTransformToElement */
-  SVGMatrix getTransformToElement(SVGElement element) native;
+  /// @domName SVGLocatable.getTransformToElement; @docsEditable true
+  Matrix getTransformToElement(SvgElement element) native;
 
   // From SVGStylable
 
-  /** @domName SVGStylable.className */
-  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+  /// @domName SVGStylable.className; @docsEditable true
+  AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CSSStyleDeclaration style;
 
-  /** @domName SVGStylable.getPresentationAttribute */
+  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
   CSSValue getPresentationAttribute(String name) native;
 
   // From SVGTests
 
-  /** @domName SVGTests.requiredExtensions */
-  final SVGStringList requiredExtensions;
+  /// @domName SVGTests.requiredExtensions; @docsEditable true
+  final StringList requiredExtensions;
 
-  /** @domName SVGTests.requiredFeatures */
-  final SVGStringList requiredFeatures;
+  /// @domName SVGTests.requiredFeatures; @docsEditable true
+  final StringList requiredFeatures;
 
-  /** @domName SVGTests.systemLanguage */
-  final SVGStringList systemLanguage;
+  /// @domName SVGTests.systemLanguage; @docsEditable true
+  final StringList systemLanguage;
 
-  /** @domName SVGTests.hasExtension */
+  /// @domName SVGTests.hasExtension; @docsEditable true
   bool hasExtension(String extension) native;
 
   // From SVGTransformable
 
-  /** @domName SVGTransformable.transform */
-  final SVGAnimatedTransformList transform;
+  /// @domName SVGTransformable.transform; @docsEditable true
+  final AnimatedTransformList transform;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGPolylineElement
-class SVGPolylineElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired native "*SVGPolylineElement" {
+/// @domName SVGPolylineElement; @docsEditable true
+class PolylineElement extends SvgElement implements Transformable, Tests, Stylable, ExternalResourcesRequired, LangSpace native "*SVGPolylineElement" {
 
-  /** @domName SVGPolylineElement.animatedPoints */
-  final SVGPointList animatedPoints;
+  factory PolylineElement() => _SvgElementFactoryProvider.createSvgElement_tag("polyline");
 
-  /** @domName SVGPolylineElement.points */
-  final SVGPointList points;
+  /// @domName SVGPolylineElement.animatedPoints; @docsEditable true
+  final PointList animatedPoints;
+
+  /// @domName SVGPolylineElement.points; @docsEditable true
+  final PointList points;
 
   // From SVGExternalResourcesRequired
 
-  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
-  final SVGAnimatedBoolean externalResourcesRequired;
+  /// @domName SVGExternalResourcesRequired.externalResourcesRequired; @docsEditable true
+  final AnimatedBoolean externalResourcesRequired;
 
   // From SVGLangSpace
 
-  /** @domName SVGLangSpace.xmllang */
+  /// @domName SVGLangSpace.xmllang; @docsEditable true
   String xmllang;
 
-  /** @domName SVGLangSpace.xmlspace */
+  /// @domName SVGLangSpace.xmlspace; @docsEditable true
   String xmlspace;
 
   // From SVGLocatable
 
-  /** @domName SVGLocatable.farthestViewportElement */
-  final SVGElement farthestViewportElement;
+  /// @domName SVGLocatable.farthestViewportElement; @docsEditable true
+  final SvgElement farthestViewportElement;
 
-  /** @domName SVGLocatable.nearestViewportElement */
-  final SVGElement nearestViewportElement;
+  /// @domName SVGLocatable.nearestViewportElement; @docsEditable true
+  final SvgElement nearestViewportElement;
 
-  /** @domName SVGLocatable.getBBox */
-  SVGRect getBBox() native;
+  /// @domName SVGLocatable.getBBox; @docsEditable true
+  Rect getBBox() native;
 
-  /** @domName SVGLocatable.getCTM */
-  SVGMatrix getCTM() native;
+  /// @domName SVGLocatable.getCTM; @docsEditable true
+  Matrix getCTM() native;
 
-  /** @domName SVGLocatable.getScreenCTM */
-  SVGMatrix getScreenCTM() native;
+  /// @domName SVGLocatable.getScreenCTM; @docsEditable true
+  Matrix getScreenCTM() native;
 
-  /** @domName SVGLocatable.getTransformToElement */
-  SVGMatrix getTransformToElement(SVGElement element) native;
+  /// @domName SVGLocatable.getTransformToElement; @docsEditable true
+  Matrix getTransformToElement(SvgElement element) native;
 
   // From SVGStylable
 
-  /** @domName SVGStylable.className */
-  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+  /// @domName SVGStylable.className; @docsEditable true
+  AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CSSStyleDeclaration style;
 
-  /** @domName SVGStylable.getPresentationAttribute */
+  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
   CSSValue getPresentationAttribute(String name) native;
 
   // From SVGTests
 
-  /** @domName SVGTests.requiredExtensions */
-  final SVGStringList requiredExtensions;
+  /// @domName SVGTests.requiredExtensions; @docsEditable true
+  final StringList requiredExtensions;
 
-  /** @domName SVGTests.requiredFeatures */
-  final SVGStringList requiredFeatures;
+  /// @domName SVGTests.requiredFeatures; @docsEditable true
+  final StringList requiredFeatures;
 
-  /** @domName SVGTests.systemLanguage */
-  final SVGStringList systemLanguage;
+  /// @domName SVGTests.systemLanguage; @docsEditable true
+  final StringList systemLanguage;
 
-  /** @domName SVGTests.hasExtension */
+  /// @domName SVGTests.hasExtension; @docsEditable true
   bool hasExtension(String extension) native;
 
   // From SVGTransformable
 
-  /** @domName SVGTransformable.transform */
-  final SVGAnimatedTransformList transform;
+  /// @domName SVGTransformable.transform; @docsEditable true
+  final AnimatedTransformList transform;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGPreserveAspectRatio
-class SVGPreserveAspectRatio native "*SVGPreserveAspectRatio" {
+/// @domName SVGPreserveAspectRatio; @docsEditable true
+class PreserveAspectRatio native "*SVGPreserveAspectRatio" {
 
   static const int SVG_MEETORSLICE_MEET = 1;
 
@@ -4589,10 +4559,10 @@
 
   static const int SVG_PRESERVEASPECTRATIO_XMINYMIN = 2;
 
-  /** @domName SVGPreserveAspectRatio.align */
+  /// @domName SVGPreserveAspectRatio.align; @docsEditable true
   int align;
 
-  /** @domName SVGPreserveAspectRatio.meetOrSlice */
+  /// @domName SVGPreserveAspectRatio.meetOrSlice; @docsEditable true
   int meetOrSlice;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4600,45 +4570,47 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGRadialGradientElement
-class SVGRadialGradientElement extends SVGGradientElement native "*SVGRadialGradientElement" {
+/// @domName SVGRadialGradientElement; @docsEditable true
+class RadialGradientElement extends GradientElement native "*SVGRadialGradientElement" {
 
-  /** @domName SVGRadialGradientElement.cx */
-  final SVGAnimatedLength cx;
+  factory RadialGradientElement() => _SvgElementFactoryProvider.createSvgElement_tag("radialGradient");
 
-  /** @domName SVGRadialGradientElement.cy */
-  final SVGAnimatedLength cy;
+  /// @domName SVGRadialGradientElement.cx; @docsEditable true
+  final AnimatedLength cx;
 
-  /** @domName SVGRadialGradientElement.fr */
-  final SVGAnimatedLength fr;
+  /// @domName SVGRadialGradientElement.cy; @docsEditable true
+  final AnimatedLength cy;
 
-  /** @domName SVGRadialGradientElement.fx */
-  final SVGAnimatedLength fx;
+  /// @domName SVGRadialGradientElement.fr; @docsEditable true
+  final AnimatedLength fr;
 
-  /** @domName SVGRadialGradientElement.fy */
-  final SVGAnimatedLength fy;
+  /// @domName SVGRadialGradientElement.fx; @docsEditable true
+  final AnimatedLength fx;
 
-  /** @domName SVGRadialGradientElement.r */
-  final SVGAnimatedLength r;
+  /// @domName SVGRadialGradientElement.fy; @docsEditable true
+  final AnimatedLength fy;
+
+  /// @domName SVGRadialGradientElement.r; @docsEditable true
+  final AnimatedLength r;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for 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 SVGRect
-class SVGRect native "*SVGRect" {
+/// @domName SVGRect; @docsEditable true
+class Rect native "*SVGRect" {
 
-  /** @domName SVGRect.height */
+  /// @domName SVGRect.height; @docsEditable true
   num height;
 
-  /** @domName SVGRect.width */
+  /// @domName SVGRect.width; @docsEditable true
   num width;
 
-  /** @domName SVGRect.x */
+  /// @domName SVGRect.x; @docsEditable true
   num x;
 
-  /** @domName SVGRect.y */
+  /// @domName SVGRect.y; @docsEditable true
   num y;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4646,97 +4618,99 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGRectElement
-class SVGRectElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired native "*SVGRectElement" {
+/// @domName SVGRectElement; @docsEditable true
+class RectElement extends SvgElement implements Transformable, Tests, Stylable, ExternalResourcesRequired, LangSpace native "*SVGRectElement" {
 
-  /** @domName SVGRectElement.height */
-  final SVGAnimatedLength height;
+  factory RectElement() => _SvgElementFactoryProvider.createSvgElement_tag("rect");
 
-  /** @domName SVGRectElement.rx */
-  final SVGAnimatedLength rx;
+  /// @domName SVGRectElement.height; @docsEditable true
+  final AnimatedLength height;
 
-  /** @domName SVGRectElement.ry */
-  final SVGAnimatedLength ry;
+  /// @domName SVGRectElement.rx; @docsEditable true
+  final AnimatedLength rx;
 
-  /** @domName SVGRectElement.width */
-  final SVGAnimatedLength width;
+  /// @domName SVGRectElement.ry; @docsEditable true
+  final AnimatedLength ry;
 
-  /** @domName SVGRectElement.x */
-  final SVGAnimatedLength x;
+  /// @domName SVGRectElement.width; @docsEditable true
+  final AnimatedLength width;
 
-  /** @domName SVGRectElement.y */
-  final SVGAnimatedLength y;
+  /// @domName SVGRectElement.x; @docsEditable true
+  final AnimatedLength x;
+
+  /// @domName SVGRectElement.y; @docsEditable true
+  final AnimatedLength y;
 
   // From SVGExternalResourcesRequired
 
-  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
-  final SVGAnimatedBoolean externalResourcesRequired;
+  /// @domName SVGExternalResourcesRequired.externalResourcesRequired; @docsEditable true
+  final AnimatedBoolean externalResourcesRequired;
 
   // From SVGLangSpace
 
-  /** @domName SVGLangSpace.xmllang */
+  /// @domName SVGLangSpace.xmllang; @docsEditable true
   String xmllang;
 
-  /** @domName SVGLangSpace.xmlspace */
+  /// @domName SVGLangSpace.xmlspace; @docsEditable true
   String xmlspace;
 
   // From SVGLocatable
 
-  /** @domName SVGLocatable.farthestViewportElement */
-  final SVGElement farthestViewportElement;
+  /// @domName SVGLocatable.farthestViewportElement; @docsEditable true
+  final SvgElement farthestViewportElement;
 
-  /** @domName SVGLocatable.nearestViewportElement */
-  final SVGElement nearestViewportElement;
+  /// @domName SVGLocatable.nearestViewportElement; @docsEditable true
+  final SvgElement nearestViewportElement;
 
-  /** @domName SVGLocatable.getBBox */
-  SVGRect getBBox() native;
+  /// @domName SVGLocatable.getBBox; @docsEditable true
+  Rect getBBox() native;
 
-  /** @domName SVGLocatable.getCTM */
-  SVGMatrix getCTM() native;
+  /// @domName SVGLocatable.getCTM; @docsEditable true
+  Matrix getCTM() native;
 
-  /** @domName SVGLocatable.getScreenCTM */
-  SVGMatrix getScreenCTM() native;
+  /// @domName SVGLocatable.getScreenCTM; @docsEditable true
+  Matrix getScreenCTM() native;
 
-  /** @domName SVGLocatable.getTransformToElement */
-  SVGMatrix getTransformToElement(SVGElement element) native;
+  /// @domName SVGLocatable.getTransformToElement; @docsEditable true
+  Matrix getTransformToElement(SvgElement element) native;
 
   // From SVGStylable
 
-  /** @domName SVGStylable.className */
-  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+  /// @domName SVGStylable.className; @docsEditable true
+  AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CSSStyleDeclaration style;
 
-  /** @domName SVGStylable.getPresentationAttribute */
+  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
   CSSValue getPresentationAttribute(String name) native;
 
   // From SVGTests
 
-  /** @domName SVGTests.requiredExtensions */
-  final SVGStringList requiredExtensions;
+  /// @domName SVGTests.requiredExtensions; @docsEditable true
+  final StringList requiredExtensions;
 
-  /** @domName SVGTests.requiredFeatures */
-  final SVGStringList requiredFeatures;
+  /// @domName SVGTests.requiredFeatures; @docsEditable true
+  final StringList requiredFeatures;
 
-  /** @domName SVGTests.systemLanguage */
-  final SVGStringList systemLanguage;
+  /// @domName SVGTests.systemLanguage; @docsEditable true
+  final StringList systemLanguage;
 
-  /** @domName SVGTests.hasExtension */
+  /// @domName SVGTests.hasExtension; @docsEditable true
   bool hasExtension(String extension) native;
 
   // From SVGTransformable
 
-  /** @domName SVGTransformable.transform */
-  final SVGAnimatedTransformList transform;
+  /// @domName SVGTransformable.transform; @docsEditable true
+  final AnimatedTransformList transform;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGRenderingIntent
-class SVGRenderingIntent native "*SVGRenderingIntent" {
+/// @domName SVGRenderingIntent; @docsEditable true
+class RenderingIntent native "*SVGRenderingIntent" {
 
   static const int RENDERING_INTENT_ABSOLUTE_COLORIMETRIC = 5;
 
@@ -4755,245 +4729,56 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-class SVGSVGElement extends SVGElement implements SVGZoomAndPan, SVGLocatable, SVGLangSpace, SVGTests, SVGStylable, SVGFitToViewBox, SVGExternalResourcesRequired native "*SVGSVGElement" {
-  factory SVGSVGElement() => _SVGSVGElementFactoryProvider.createSVGSVGElement();
+/// @domName SVGScriptElement; @docsEditable true
+class ScriptElement extends SvgElement implements UriReference, ExternalResourcesRequired native "*SVGScriptElement" {
 
+  factory ScriptElement() => _SvgElementFactoryProvider.createSvgElement_tag("script");
 
-  /** @domName SVGSVGElement.contentScriptType */
-  String contentScriptType;
-
-  /** @domName SVGSVGElement.contentStyleType */
-  String contentStyleType;
-
-  /** @domName SVGSVGElement.currentScale */
-  num currentScale;
-
-  /** @domName SVGSVGElement.currentTranslate */
-  final SVGPoint currentTranslate;
-
-  /** @domName SVGSVGElement.currentView */
-  final SVGViewSpec currentView;
-
-  /** @domName SVGSVGElement.height */
-  final SVGAnimatedLength height;
-
-  /** @domName SVGSVGElement.pixelUnitToMillimeterX */
-  final num pixelUnitToMillimeterX;
-
-  /** @domName SVGSVGElement.pixelUnitToMillimeterY */
-  final num pixelUnitToMillimeterY;
-
-  /** @domName SVGSVGElement.screenPixelToMillimeterX */
-  final num screenPixelToMillimeterX;
-
-  /** @domName SVGSVGElement.screenPixelToMillimeterY */
-  final num screenPixelToMillimeterY;
-
-  /** @domName SVGSVGElement.useCurrentView */
-  final bool useCurrentView;
-
-  /** @domName SVGSVGElement.viewport */
-  final SVGRect viewport;
-
-  /** @domName SVGSVGElement.width */
-  final SVGAnimatedLength width;
-
-  /** @domName SVGSVGElement.x */
-  final SVGAnimatedLength x;
-
-  /** @domName SVGSVGElement.y */
-  final SVGAnimatedLength y;
-
-  /** @domName SVGSVGElement.animationsPaused */
-  bool animationsPaused() native;
-
-  /** @domName SVGSVGElement.checkEnclosure */
-  bool checkEnclosure(SVGElement element, SVGRect rect) native;
-
-  /** @domName SVGSVGElement.checkIntersection */
-  bool checkIntersection(SVGElement element, SVGRect rect) native;
-
-  /** @domName SVGSVGElement.createSVGAngle */
-  SVGAngle createSVGAngle() native;
-
-  /** @domName SVGSVGElement.createSVGLength */
-  SVGLength createSVGLength() native;
-
-  /** @domName SVGSVGElement.createSVGMatrix */
-  SVGMatrix createSVGMatrix() native;
-
-  /** @domName SVGSVGElement.createSVGNumber */
-  SVGNumber createSVGNumber() native;
-
-  /** @domName SVGSVGElement.createSVGPoint */
-  SVGPoint createSVGPoint() native;
-
-  /** @domName SVGSVGElement.createSVGRect */
-  SVGRect createSVGRect() native;
-
-  /** @domName SVGSVGElement.createSVGTransform */
-  SVGTransform createSVGTransform() native;
-
-  /** @domName SVGSVGElement.createSVGTransformFromMatrix */
-  SVGTransform createSVGTransformFromMatrix(SVGMatrix matrix) native;
-
-  /** @domName SVGSVGElement.deselectAll */
-  void deselectAll() native;
-
-  /** @domName SVGSVGElement.forceRedraw */
-  void forceRedraw() native;
-
-  /** @domName SVGSVGElement.getCurrentTime */
-  num getCurrentTime() native;
-
-  /** @domName SVGSVGElement.getElementById */
-  Element getElementById(String elementId) native;
-
-  /** @domName SVGSVGElement.getEnclosureList */
-  List<Node> getEnclosureList(SVGRect rect, SVGElement referenceElement) native;
-
-  /** @domName SVGSVGElement.getIntersectionList */
-  List<Node> getIntersectionList(SVGRect rect, SVGElement referenceElement) native;
-
-  /** @domName SVGSVGElement.pauseAnimations */
-  void pauseAnimations() native;
-
-  /** @domName SVGSVGElement.setCurrentTime */
-  void setCurrentTime(num seconds) native;
-
-  /** @domName SVGSVGElement.suspendRedraw */
-  int suspendRedraw(int maxWaitMilliseconds) native;
-
-  /** @domName SVGSVGElement.unpauseAnimations */
-  void unpauseAnimations() native;
-
-  /** @domName SVGSVGElement.unsuspendRedraw */
-  void unsuspendRedraw(int suspendHandleId) native;
-
-  /** @domName SVGSVGElement.unsuspendRedrawAll */
-  void unsuspendRedrawAll() native;
-
-  // From SVGExternalResourcesRequired
-
-  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
-  final SVGAnimatedBoolean externalResourcesRequired;
-
-  // From SVGFitToViewBox
-
-  /** @domName SVGFitToViewBox.preserveAspectRatio */
-  final SVGAnimatedPreserveAspectRatio preserveAspectRatio;
-
-  /** @domName SVGFitToViewBox.viewBox */
-  final SVGAnimatedRect viewBox;
-
-  // From SVGLangSpace
-
-  /** @domName SVGLangSpace.xmllang */
-  String xmllang;
-
-  /** @domName SVGLangSpace.xmlspace */
-  String xmlspace;
-
-  // From SVGLocatable
-
-  /** @domName SVGLocatable.farthestViewportElement */
-  final SVGElement farthestViewportElement;
-
-  /** @domName SVGLocatable.nearestViewportElement */
-  final SVGElement nearestViewportElement;
-
-  /** @domName SVGLocatable.getBBox */
-  SVGRect getBBox() native;
-
-  /** @domName SVGLocatable.getCTM */
-  SVGMatrix getCTM() native;
-
-  /** @domName SVGLocatable.getScreenCTM */
-  SVGMatrix getScreenCTM() native;
-
-  /** @domName SVGLocatable.getTransformToElement */
-  SVGMatrix getTransformToElement(SVGElement element) native;
-
-  // From SVGStylable
-
-  /** @domName SVGStylable.className */
-  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
-
-  // Use implementation from Element.
-  // final CSSStyleDeclaration style;
-
-  /** @domName SVGStylable.getPresentationAttribute */
-  CSSValue getPresentationAttribute(String name) native;
-
-  // From SVGTests
-
-  /** @domName SVGTests.requiredExtensions */
-  final SVGStringList requiredExtensions;
-
-  /** @domName SVGTests.requiredFeatures */
-  final SVGStringList requiredFeatures;
-
-  /** @domName SVGTests.systemLanguage */
-  final SVGStringList systemLanguage;
-
-  /** @domName SVGTests.hasExtension */
-  bool hasExtension(String extension) native;
-
-  // From SVGZoomAndPan
-
-  /** @domName SVGZoomAndPan.zoomAndPan */
-  int zoomAndPan;
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for 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 SVGScriptElement
-class SVGScriptElement extends SVGElement implements SVGURIReference, SVGExternalResourcesRequired native "*SVGScriptElement" {
-
-  /** @domName SVGScriptElement.type */
+  /// @domName SVGScriptElement.type; @docsEditable true
   String type;
 
   // From SVGExternalResourcesRequired
 
-  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
-  final SVGAnimatedBoolean externalResourcesRequired;
+  /// @domName SVGExternalResourcesRequired.externalResourcesRequired; @docsEditable true
+  final AnimatedBoolean externalResourcesRequired;
 
   // From SVGURIReference
 
-  /** @domName SVGURIReference.href */
-  final SVGAnimatedString href;
+  /// @domName SVGURIReference.href; @docsEditable true
+  final AnimatedString href;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGSetElement
-class SVGSetElement extends SVGAnimationElement native "*SVGSetElement" {
+/// @domName SVGSetElement; @docsEditable true
+class SetElement extends AnimationElement native "*SVGSetElement" {
+
+  factory SetElement() => _SvgElementFactoryProvider.createSvgElement_tag("set");
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for 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 SVGStopElement
-class SVGStopElement extends SVGElement implements SVGStylable native "*SVGStopElement" {
+/// @domName SVGStopElement; @docsEditable true
+class StopElement extends SvgElement implements Stylable native "*SVGStopElement" {
 
-  /** @domName SVGStopElement.offset */
-  final SVGAnimatedNumber offset;
+  factory StopElement() => _SvgElementFactoryProvider.createSvgElement_tag("stop");
+
+  /// @domName SVGStopElement.offset; @docsEditable true
+  final AnimatedNumber offset;
 
   // From SVGStylable
 
-  /** @domName SVGStylable.className */
-  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+  /// @domName SVGStylable.className; @docsEditable true
+  AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CSSStyleDeclaration style;
 
-  /** @domName SVGStylable.getPresentationAttribute */
+  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
   CSSValue getPresentationAttribute(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5001,10 +4786,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGStringList
-class SVGStringList implements JavaScriptIndexingBehavior, List<String> native "*SVGStringList" {
+/// @domName SVGStringList; @docsEditable true
+class StringList implements JavaScriptIndexingBehavior, List<String> native "*SVGStringList" {
 
-  /** @domName SVGStringList.numberOfItems */
+  /// @domName SVGStringList.numberOfItems; @docsEditable true
   final int numberOfItems;
 
   String operator[](int index) => JS("String", "#[#]", this, index);
@@ -5067,6 +4852,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  String get first => this[0];
+
   String get last => this[length - 1];
 
   String removeLast() {
@@ -5090,25 +4877,25 @@
 
   // -- end List<String> mixins.
 
-  /** @domName SVGStringList.appendItem */
+  /// @domName SVGStringList.appendItem; @docsEditable true
   String appendItem(String item) native;
 
-  /** @domName SVGStringList.clear */
+  /// @domName SVGStringList.clear; @docsEditable true
   void clear() native;
 
-  /** @domName SVGStringList.getItem */
+  /// @domName SVGStringList.getItem; @docsEditable true
   String getItem(int index) native;
 
-  /** @domName SVGStringList.initialize */
+  /// @domName SVGStringList.initialize; @docsEditable true
   String initialize(String item) native;
 
-  /** @domName SVGStringList.insertItemBefore */
+  /// @domName SVGStringList.insertItemBefore; @docsEditable true
   String insertItemBefore(String item, int index) native;
 
-  /** @domName SVGStringList.removeItem */
+  /// @domName SVGStringList.removeItem; @docsEditable true
   String removeItem(int index) native;
 
-  /** @domName SVGStringList.replaceItem */
+  /// @domName SVGStringList.replaceItem; @docsEditable true
   String replaceItem(String item, int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5117,13 +4904,13 @@
 
 
 /// @domName SVGStylable
-abstract class SVGStylable {
+abstract class Stylable {
 
-  SVGAnimatedString className;
+  AnimatedString className;
 
   CSSStyleDeclaration style;
 
-  /** @domName SVGStylable.getPresentationAttribute */
+  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
   CSSValue getPresentationAttribute(String name);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5131,33 +4918,35 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGStyleElement
-class SVGStyleElement extends SVGElement implements SVGLangSpace native "*SVGStyleElement" {
+/// @domName SVGStyleElement; @docsEditable true
+class StyleElement extends SvgElement implements LangSpace native "*SVGStyleElement" {
 
-  /** @domName SVGStyleElement.disabled */
+  factory StyleElement() => _SvgElementFactoryProvider.createSvgElement_tag("style");
+
+  /// @domName SVGStyleElement.disabled; @docsEditable true
   bool disabled;
 
-  /** @domName SVGStyleElement.media */
+  /// @domName SVGStyleElement.media; @docsEditable true
   String media;
 
   // Shadowing definition.
-  /** @domName SVGStyleElement.title */
+  /// @domName SVGStyleElement.title; @docsEditable true
   String get title => JS("String", "#.title", this);
 
-  /** @domName SVGStyleElement.title */
+  /// @domName SVGStyleElement.title; @docsEditable true
   void set title(String value) {
     JS("void", "#.title = #", this, value);
   }
 
-  /** @domName SVGStyleElement.type */
+  /// @domName SVGStyleElement.type; @docsEditable true
   String type;
 
   // From SVGLangSpace
 
-  /** @domName SVGLangSpace.xmllang */
+  /// @domName SVGLangSpace.xmllang; @docsEditable true
   String xmllang;
 
-  /** @domName SVGLangSpace.xmlspace */
+  /// @domName SVGLangSpace.xmlspace; @docsEditable true
   String xmlspace;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5165,110 +4954,429 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGSwitchElement
-class SVGSwitchElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired native "*SVGSwitchElement" {
+/// @domName SVGDocument; @docsEditable true
+class SvgDocument extends Document native "*SVGDocument" {
+
+  /// @domName SVGDocument.rootElement; @docsEditable true
+  final SvgSvgElement rootElement;
+
+  /// @domName SVGDocument.createEvent; @docsEditable true
+  Event $dom_createEvent(String eventType) native "createEvent";
+}
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+class _AttributeClassSet extends CssClassSet {
+  final Element _element;
+
+  _AttributeClassSet(this._element);
+
+  Set<String> readClasses() {
+    var classname = _element.attributes['class'];
+
+    Set<String> s = new Set<String>();
+    if (classname == null) {
+      return s;
+    }
+    for (String name in classname.split(' ')) {
+      String trimmed = name.trim();
+      if (!trimmed.isEmpty) {
+        s.add(trimmed);
+      }
+    }
+    return s;
+  }
+
+  void writeClasses(Set s) {
+    List list = new List.from(s);
+    _element.attributes['class'] = Strings.join(list, ' ');
+  }
+}
+
+class SvgElement extends Element native "*SVGElement" {
+  factory SvgElement.tag(String tag) =>
+      _SvgElementFactoryProvider.createSvgElement_tag(tag);
+  factory SvgElement.svg(String svg) =>
+      _SvgElementFactoryProvider.createSvgElement_svg(svg);
+
+  _AttributeClassSet _cssClassSet;
+  CssClassSet get classes {
+    if (_cssClassSet == null) {
+      _cssClassSet = new _AttributeClassSet(this);
+    }
+    return _cssClassSet;
+  }
+
+  List<Element> get elements => new FilteredElementList(this);
+
+  void set elements(Collection<Element> value) {
+    final elements = this.elements;
+    elements.clear();
+    elements.addAll(value);
+  }
+
+  List<Element> get children => new FilteredElementList(this);
+
+  void set children(Collection<Element> value) {
+    final children = this.children;
+    children.clear();
+    children.addAll(value);
+  }
+
+  String get outerHTML {
+    final container = new Element.tag("div");
+    final SvgElement cloned = this.clone(true);
+    container.children.add(cloned);
+    return container.innerHTML;
+  }
+
+  String get innerHTML {
+    final container = new Element.tag("div");
+    final SvgElement cloned = this.clone(true);
+    container.children.addAll(cloned.children);
+    return container.innerHTML;
+  }
+
+  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>';
+    this.children = container.children[0].children;
+  }
+
+
+  // Shadowing definition.
+  /// @domName SVGElement.id; @docsEditable true
+  String get id => JS("String", "#.id", this);
+
+  /// @domName SVGElement.id; @docsEditable true
+  void set id(String value) {
+    JS("void", "#.id = #", this, value);
+  }
+
+  /// @domName SVGElement.ownerSVGElement; @docsEditable true
+  final SvgSvgElement ownerSVGElement;
+
+  /// @domName SVGElement.viewportElement; @docsEditable true
+  final SvgElement viewportElement;
+
+  /// @domName SVGElement.xmlbase; @docsEditable true
+  String xmlbase;
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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 SvgSvgElement extends SvgElement implements FitToViewBox, Tests, Stylable, Locatable, ExternalResourcesRequired, ZoomAndPan, LangSpace native "*SVGSVGElement" {
+  factory SvgSvgElement() => _SvgSvgElementFactoryProvider.createSvgSvgElement();
+
+
+  /// @domName SVGSVGElement.contentScriptType; @docsEditable true
+  String contentScriptType;
+
+  /// @domName SVGSVGElement.contentStyleType; @docsEditable true
+  String contentStyleType;
+
+  /// @domName SVGSVGElement.currentScale; @docsEditable true
+  num currentScale;
+
+  /// @domName SVGSVGElement.currentTranslate; @docsEditable true
+  final Point currentTranslate;
+
+  /// @domName SVGSVGElement.currentView; @docsEditable true
+  final ViewSpec currentView;
+
+  /// @domName SVGSVGElement.height; @docsEditable true
+  final AnimatedLength height;
+
+  /// @domName SVGSVGElement.pixelUnitToMillimeterX; @docsEditable true
+  final num pixelUnitToMillimeterX;
+
+  /// @domName SVGSVGElement.pixelUnitToMillimeterY; @docsEditable true
+  final num pixelUnitToMillimeterY;
+
+  /// @domName SVGSVGElement.screenPixelToMillimeterX; @docsEditable true
+  final num screenPixelToMillimeterX;
+
+  /// @domName SVGSVGElement.screenPixelToMillimeterY; @docsEditable true
+  final num screenPixelToMillimeterY;
+
+  /// @domName SVGSVGElement.useCurrentView; @docsEditable true
+  final bool useCurrentView;
+
+  /// @domName SVGSVGElement.viewport; @docsEditable true
+  final Rect viewport;
+
+  /// @domName SVGSVGElement.width; @docsEditable true
+  final AnimatedLength width;
+
+  /// @domName SVGSVGElement.x; @docsEditable true
+  final AnimatedLength x;
+
+  /// @domName SVGSVGElement.y; @docsEditable true
+  final AnimatedLength y;
+
+  /// @domName SVGSVGElement.animationsPaused; @docsEditable true
+  bool animationsPaused() native;
+
+  /// @domName SVGSVGElement.checkEnclosure; @docsEditable true
+  bool checkEnclosure(SvgElement element, Rect rect) native;
+
+  /// @domName SVGSVGElement.checkIntersection; @docsEditable true
+  bool checkIntersection(SvgElement element, Rect rect) native;
+
+  /// @domName SVGSVGElement.createSVGAngle; @docsEditable true
+  Angle createSVGAngle() native;
+
+  /// @domName SVGSVGElement.createSVGLength; @docsEditable true
+  Length createSVGLength() native;
+
+  /// @domName SVGSVGElement.createSVGMatrix; @docsEditable true
+  Matrix createSVGMatrix() native;
+
+  /// @domName SVGSVGElement.createSVGNumber; @docsEditable true
+  Number createSVGNumber() native;
+
+  /// @domName SVGSVGElement.createSVGPoint; @docsEditable true
+  Point createSVGPoint() native;
+
+  /// @domName SVGSVGElement.createSVGRect; @docsEditable true
+  Rect createSVGRect() native;
+
+  /// @domName SVGSVGElement.createSVGTransform; @docsEditable true
+  Transform createSVGTransform() native;
+
+  /// @domName SVGSVGElement.createSVGTransformFromMatrix; @docsEditable true
+  Transform createSVGTransformFromMatrix(Matrix matrix) native;
+
+  /// @domName SVGSVGElement.deselectAll; @docsEditable true
+  void deselectAll() native;
+
+  /// @domName SVGSVGElement.forceRedraw; @docsEditable true
+  void forceRedraw() native;
+
+  /// @domName SVGSVGElement.getCurrentTime; @docsEditable true
+  num getCurrentTime() native;
+
+  /// @domName SVGSVGElement.getElementById; @docsEditable true
+  Element getElementById(String elementId) native;
+
+  /// @domName SVGSVGElement.getEnclosureList; @docsEditable true
+  @Returns('_NodeList') @Creates('_NodeList')
+  List<Node> getEnclosureList(Rect rect, SvgElement referenceElement) native;
+
+  /// @domName SVGSVGElement.getIntersectionList; @docsEditable true
+  @Returns('_NodeList') @Creates('_NodeList')
+  List<Node> getIntersectionList(Rect rect, SvgElement referenceElement) native;
+
+  /// @domName SVGSVGElement.pauseAnimations; @docsEditable true
+  void pauseAnimations() native;
+
+  /// @domName SVGSVGElement.setCurrentTime; @docsEditable true
+  void setCurrentTime(num seconds) native;
+
+  /// @domName SVGSVGElement.suspendRedraw; @docsEditable true
+  int suspendRedraw(int maxWaitMilliseconds) native;
+
+  /// @domName SVGSVGElement.unpauseAnimations; @docsEditable true
+  void unpauseAnimations() native;
+
+  /// @domName SVGSVGElement.unsuspendRedraw; @docsEditable true
+  void unsuspendRedraw(int suspendHandleId) native;
+
+  /// @domName SVGSVGElement.unsuspendRedrawAll; @docsEditable true
+  void unsuspendRedrawAll() native;
 
   // From SVGExternalResourcesRequired
 
-  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
-  final SVGAnimatedBoolean externalResourcesRequired;
+  /// @domName SVGExternalResourcesRequired.externalResourcesRequired; @docsEditable true
+  final AnimatedBoolean externalResourcesRequired;
+
+  // From SVGFitToViewBox
+
+  /// @domName SVGFitToViewBox.preserveAspectRatio; @docsEditable true
+  final AnimatedPreserveAspectRatio preserveAspectRatio;
+
+  /// @domName SVGFitToViewBox.viewBox; @docsEditable true
+  final AnimatedRect viewBox;
 
   // From SVGLangSpace
 
-  /** @domName SVGLangSpace.xmllang */
+  /// @domName SVGLangSpace.xmllang; @docsEditable true
   String xmllang;
 
-  /** @domName SVGLangSpace.xmlspace */
+  /// @domName SVGLangSpace.xmlspace; @docsEditable true
   String xmlspace;
 
   // From SVGLocatable
 
-  /** @domName SVGLocatable.farthestViewportElement */
-  final SVGElement farthestViewportElement;
+  /// @domName SVGLocatable.farthestViewportElement; @docsEditable true
+  final SvgElement farthestViewportElement;
 
-  /** @domName SVGLocatable.nearestViewportElement */
-  final SVGElement nearestViewportElement;
+  /// @domName SVGLocatable.nearestViewportElement; @docsEditable true
+  final SvgElement nearestViewportElement;
 
-  /** @domName SVGLocatable.getBBox */
-  SVGRect getBBox() native;
+  /// @domName SVGLocatable.getBBox; @docsEditable true
+  Rect getBBox() native;
 
-  /** @domName SVGLocatable.getCTM */
-  SVGMatrix getCTM() native;
+  /// @domName SVGLocatable.getCTM; @docsEditable true
+  Matrix getCTM() native;
 
-  /** @domName SVGLocatable.getScreenCTM */
-  SVGMatrix getScreenCTM() native;
+  /// @domName SVGLocatable.getScreenCTM; @docsEditable true
+  Matrix getScreenCTM() native;
 
-  /** @domName SVGLocatable.getTransformToElement */
-  SVGMatrix getTransformToElement(SVGElement element) native;
+  /// @domName SVGLocatable.getTransformToElement; @docsEditable true
+  Matrix getTransformToElement(SvgElement element) native;
 
   // From SVGStylable
 
-  /** @domName SVGStylable.className */
-  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+  /// @domName SVGStylable.className; @docsEditable true
+  AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CSSStyleDeclaration style;
 
-  /** @domName SVGStylable.getPresentationAttribute */
+  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
   CSSValue getPresentationAttribute(String name) native;
 
   // From SVGTests
 
-  /** @domName SVGTests.requiredExtensions */
-  final SVGStringList requiredExtensions;
+  /// @domName SVGTests.requiredExtensions; @docsEditable true
+  final StringList requiredExtensions;
 
-  /** @domName SVGTests.requiredFeatures */
-  final SVGStringList requiredFeatures;
+  /// @domName SVGTests.requiredFeatures; @docsEditable true
+  final StringList requiredFeatures;
 
-  /** @domName SVGTests.systemLanguage */
-  final SVGStringList systemLanguage;
+  /// @domName SVGTests.systemLanguage; @docsEditable true
+  final StringList systemLanguage;
 
-  /** @domName SVGTests.hasExtension */
+  /// @domName SVGTests.hasExtension; @docsEditable true
   bool hasExtension(String extension) native;
 
-  // From SVGTransformable
+  // From SVGZoomAndPan
 
-  /** @domName SVGTransformable.transform */
-  final SVGAnimatedTransformList transform;
+  /// @domName SVGZoomAndPan.zoomAndPan; @docsEditable true
+  int zoomAndPan;
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for 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 SVGSymbolElement
-class SVGSymbolElement extends SVGElement implements SVGLangSpace, SVGFitToViewBox, SVGExternalResourcesRequired, SVGStylable native "*SVGSymbolElement" {
+/// @domName SVGSwitchElement; @docsEditable true
+class SwitchElement extends SvgElement implements Transformable, Tests, Stylable, ExternalResourcesRequired, LangSpace native "*SVGSwitchElement" {
+
+  factory SwitchElement() => _SvgElementFactoryProvider.createSvgElement_tag("switch");
 
   // From SVGExternalResourcesRequired
 
-  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
-  final SVGAnimatedBoolean externalResourcesRequired;
-
-  // From SVGFitToViewBox
-
-  /** @domName SVGFitToViewBox.preserveAspectRatio */
-  final SVGAnimatedPreserveAspectRatio preserveAspectRatio;
-
-  /** @domName SVGFitToViewBox.viewBox */
-  final SVGAnimatedRect viewBox;
+  /// @domName SVGExternalResourcesRequired.externalResourcesRequired; @docsEditable true
+  final AnimatedBoolean externalResourcesRequired;
 
   // From SVGLangSpace
 
-  /** @domName SVGLangSpace.xmllang */
+  /// @domName SVGLangSpace.xmllang; @docsEditable true
   String xmllang;
 
-  /** @domName SVGLangSpace.xmlspace */
+  /// @domName SVGLangSpace.xmlspace; @docsEditable true
   String xmlspace;
 
+  // From SVGLocatable
+
+  /// @domName SVGLocatable.farthestViewportElement; @docsEditable true
+  final SvgElement farthestViewportElement;
+
+  /// @domName SVGLocatable.nearestViewportElement; @docsEditable true
+  final SvgElement nearestViewportElement;
+
+  /// @domName SVGLocatable.getBBox; @docsEditable true
+  Rect getBBox() native;
+
+  /// @domName SVGLocatable.getCTM; @docsEditable true
+  Matrix getCTM() native;
+
+  /// @domName SVGLocatable.getScreenCTM; @docsEditable true
+  Matrix getScreenCTM() native;
+
+  /// @domName SVGLocatable.getTransformToElement; @docsEditable true
+  Matrix getTransformToElement(SvgElement element) native;
+
   // From SVGStylable
 
-  /** @domName SVGStylable.className */
-  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+  /// @domName SVGStylable.className; @docsEditable true
+  AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CSSStyleDeclaration style;
 
-  /** @domName SVGStylable.getPresentationAttribute */
+  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
+  CSSValue getPresentationAttribute(String name) native;
+
+  // From SVGTests
+
+  /// @domName SVGTests.requiredExtensions; @docsEditable true
+  final StringList requiredExtensions;
+
+  /// @domName SVGTests.requiredFeatures; @docsEditable true
+  final StringList requiredFeatures;
+
+  /// @domName SVGTests.systemLanguage; @docsEditable true
+  final StringList systemLanguage;
+
+  /// @domName SVGTests.hasExtension; @docsEditable true
+  bool hasExtension(String extension) native;
+
+  // From SVGTransformable
+
+  /// @domName SVGTransformable.transform; @docsEditable true
+  final AnimatedTransformList transform;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+/// @domName SVGSymbolElement; @docsEditable true
+class SymbolElement extends SvgElement implements FitToViewBox, ExternalResourcesRequired, Stylable, LangSpace native "*SVGSymbolElement" {
+
+  factory SymbolElement() => _SvgElementFactoryProvider.createSvgElement_tag("symbol");
+
+  // From SVGExternalResourcesRequired
+
+  /// @domName SVGExternalResourcesRequired.externalResourcesRequired; @docsEditable true
+  final AnimatedBoolean externalResourcesRequired;
+
+  // From SVGFitToViewBox
+
+  /// @domName SVGFitToViewBox.preserveAspectRatio; @docsEditable true
+  final AnimatedPreserveAspectRatio preserveAspectRatio;
+
+  /// @domName SVGFitToViewBox.viewBox; @docsEditable true
+  final AnimatedRect viewBox;
+
+  // From SVGLangSpace
+
+  /// @domName SVGLangSpace.xmllang; @docsEditable true
+  String xmllang;
+
+  /// @domName SVGLangSpace.xmlspace; @docsEditable true
+  String xmlspace;
+
+  // From SVGStylable
+
+  /// @domName SVGStylable.className; @docsEditable true
+  AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
+
+  // Use implementation from Element.
+  // final CSSStyleDeclaration style;
+
+  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
   CSSValue getPresentationAttribute(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5276,21 +5384,25 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGTRefElement
-class SVGTRefElement extends SVGTextPositioningElement implements SVGURIReference native "*SVGTRefElement" {
+/// @domName SVGTRefElement; @docsEditable true
+class TRefElement extends TextPositioningElement implements UriReference native "*SVGTRefElement" {
+
+  factory TRefElement() => _SvgElementFactoryProvider.createSvgElement_tag("tref");
 
   // From SVGURIReference
 
-  /** @domName SVGURIReference.href */
-  final SVGAnimatedString href;
+  /// @domName SVGURIReference.href; @docsEditable true
+  final AnimatedString href;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGTSpanElement
-class SVGTSpanElement extends SVGTextPositioningElement native "*SVGTSpanElement" {
+/// @domName SVGTSpanElement; @docsEditable true
+class TSpanElement extends TextPositioningElement native "*SVGTSpanElement" {
+
+  factory TSpanElement() => _SvgElementFactoryProvider.createSvgElement_tag("tspan");
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -5298,15 +5410,15 @@
 
 
 /// @domName SVGTests
-abstract class SVGTests {
+abstract class Tests {
 
-  SVGStringList requiredExtensions;
+  StringList requiredExtensions;
 
-  SVGStringList requiredFeatures;
+  StringList requiredFeatures;
 
-  SVGStringList systemLanguage;
+  StringList systemLanguage;
 
-  /** @domName SVGTests.hasExtension */
+  /// @domName SVGTests.hasExtension; @docsEditable true
   bool hasExtension(String extension);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5314,8 +5426,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGTextContentElement
-class SVGTextContentElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGExternalResourcesRequired native "*SVGTextContentElement" {
+/// @domName SVGTextContentElement; @docsEditable true
+class TextContentElement extends SvgElement implements Tests, Stylable, ExternalResourcesRequired, LangSpace native "*SVGTextContentElement" {
 
   static const int LENGTHADJUST_SPACING = 1;
 
@@ -5323,75 +5435,75 @@
 
   static const int LENGTHADJUST_UNKNOWN = 0;
 
-  /** @domName SVGTextContentElement.lengthAdjust */
-  final SVGAnimatedEnumeration lengthAdjust;
+  /// @domName SVGTextContentElement.lengthAdjust; @docsEditable true
+  final AnimatedEnumeration lengthAdjust;
 
-  /** @domName SVGTextContentElement.textLength */
-  final SVGAnimatedLength textLength;
+  /// @domName SVGTextContentElement.textLength; @docsEditable true
+  final AnimatedLength textLength;
 
-  /** @domName SVGTextContentElement.getCharNumAtPosition */
-  int getCharNumAtPosition(SVGPoint point) native;
+  /// @domName SVGTextContentElement.getCharNumAtPosition; @docsEditable true
+  int getCharNumAtPosition(Point point) native;
 
-  /** @domName SVGTextContentElement.getComputedTextLength */
+  /// @domName SVGTextContentElement.getComputedTextLength; @docsEditable true
   num getComputedTextLength() native;
 
-  /** @domName SVGTextContentElement.getEndPositionOfChar */
-  SVGPoint getEndPositionOfChar(int offset) native;
+  /// @domName SVGTextContentElement.getEndPositionOfChar; @docsEditable true
+  Point getEndPositionOfChar(int offset) native;
 
-  /** @domName SVGTextContentElement.getExtentOfChar */
-  SVGRect getExtentOfChar(int offset) native;
+  /// @domName SVGTextContentElement.getExtentOfChar; @docsEditable true
+  Rect getExtentOfChar(int offset) native;
 
-  /** @domName SVGTextContentElement.getNumberOfChars */
+  /// @domName SVGTextContentElement.getNumberOfChars; @docsEditable true
   int getNumberOfChars() native;
 
-  /** @domName SVGTextContentElement.getRotationOfChar */
+  /// @domName SVGTextContentElement.getRotationOfChar; @docsEditable true
   num getRotationOfChar(int offset) native;
 
-  /** @domName SVGTextContentElement.getStartPositionOfChar */
-  SVGPoint getStartPositionOfChar(int offset) native;
+  /// @domName SVGTextContentElement.getStartPositionOfChar; @docsEditable true
+  Point getStartPositionOfChar(int offset) native;
 
-  /** @domName SVGTextContentElement.getSubStringLength */
+  /// @domName SVGTextContentElement.getSubStringLength; @docsEditable true
   num getSubStringLength(int offset, int length) native;
 
-  /** @domName SVGTextContentElement.selectSubString */
+  /// @domName SVGTextContentElement.selectSubString; @docsEditable true
   void selectSubString(int offset, int length) native;
 
   // From SVGExternalResourcesRequired
 
-  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
-  final SVGAnimatedBoolean externalResourcesRequired;
+  /// @domName SVGExternalResourcesRequired.externalResourcesRequired; @docsEditable true
+  final AnimatedBoolean externalResourcesRequired;
 
   // From SVGLangSpace
 
-  /** @domName SVGLangSpace.xmllang */
+  /// @domName SVGLangSpace.xmllang; @docsEditable true
   String xmllang;
 
-  /** @domName SVGLangSpace.xmlspace */
+  /// @domName SVGLangSpace.xmlspace; @docsEditable true
   String xmlspace;
 
   // From SVGStylable
 
-  /** @domName SVGStylable.className */
-  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+  /// @domName SVGStylable.className; @docsEditable true
+  AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CSSStyleDeclaration style;
 
-  /** @domName SVGStylable.getPresentationAttribute */
+  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
   CSSValue getPresentationAttribute(String name) native;
 
   // From SVGTests
 
-  /** @domName SVGTests.requiredExtensions */
-  final SVGStringList requiredExtensions;
+  /// @domName SVGTests.requiredExtensions; @docsEditable true
+  final StringList requiredExtensions;
 
-  /** @domName SVGTests.requiredFeatures */
-  final SVGStringList requiredFeatures;
+  /// @domName SVGTests.requiredFeatures; @docsEditable true
+  final StringList requiredFeatures;
 
-  /** @domName SVGTests.systemLanguage */
-  final SVGStringList systemLanguage;
+  /// @domName SVGTests.systemLanguage; @docsEditable true
+  final StringList systemLanguage;
 
-  /** @domName SVGTests.hasExtension */
+  /// @domName SVGTests.hasExtension; @docsEditable true
   bool hasExtension(String extension) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5399,41 +5511,43 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGTextElement
-class SVGTextElement extends SVGTextPositioningElement implements SVGTransformable native "*SVGTextElement" {
+/// @domName SVGTextElement; @docsEditable true
+class TextElement extends TextPositioningElement implements Transformable native "*SVGTextElement" {
+
+  factory TextElement() => _SvgElementFactoryProvider.createSvgElement_tag("text");
 
   // From SVGLocatable
 
-  /** @domName SVGLocatable.farthestViewportElement */
-  final SVGElement farthestViewportElement;
+  /// @domName SVGLocatable.farthestViewportElement; @docsEditable true
+  final SvgElement farthestViewportElement;
 
-  /** @domName SVGLocatable.nearestViewportElement */
-  final SVGElement nearestViewportElement;
+  /// @domName SVGLocatable.nearestViewportElement; @docsEditable true
+  final SvgElement nearestViewportElement;
 
-  /** @domName SVGLocatable.getBBox */
-  SVGRect getBBox() native;
+  /// @domName SVGLocatable.getBBox; @docsEditable true
+  Rect getBBox() native;
 
-  /** @domName SVGLocatable.getCTM */
-  SVGMatrix getCTM() native;
+  /// @domName SVGLocatable.getCTM; @docsEditable true
+  Matrix getCTM() native;
 
-  /** @domName SVGLocatable.getScreenCTM */
-  SVGMatrix getScreenCTM() native;
+  /// @domName SVGLocatable.getScreenCTM; @docsEditable true
+  Matrix getScreenCTM() native;
 
-  /** @domName SVGLocatable.getTransformToElement */
-  SVGMatrix getTransformToElement(SVGElement element) native;
+  /// @domName SVGLocatable.getTransformToElement; @docsEditable true
+  Matrix getTransformToElement(SvgElement element) native;
 
   // From SVGTransformable
 
-  /** @domName SVGTransformable.transform */
-  final SVGAnimatedTransformList transform;
+  /// @domName SVGTransformable.transform; @docsEditable true
+  final AnimatedTransformList transform;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGTextPathElement
-class SVGTextPathElement extends SVGTextContentElement implements SVGURIReference native "*SVGTextPathElement" {
+/// @domName SVGTextPathElement; @docsEditable true
+class TextPathElement extends TextContentElement implements UriReference native "*SVGTextPathElement" {
 
   static const int TEXTPATH_METHODTYPE_ALIGN = 1;
 
@@ -5447,68 +5561,70 @@
 
   static const int TEXTPATH_SPACINGTYPE_UNKNOWN = 0;
 
-  /** @domName SVGTextPathElement.method */
-  final SVGAnimatedEnumeration method;
+  /// @domName SVGTextPathElement.method; @docsEditable true
+  final AnimatedEnumeration method;
 
-  /** @domName SVGTextPathElement.spacing */
-  final SVGAnimatedEnumeration spacing;
+  /// @domName SVGTextPathElement.spacing; @docsEditable true
+  final AnimatedEnumeration spacing;
 
-  /** @domName SVGTextPathElement.startOffset */
-  final SVGAnimatedLength startOffset;
+  /// @domName SVGTextPathElement.startOffset; @docsEditable true
+  final AnimatedLength startOffset;
 
   // From SVGURIReference
 
-  /** @domName SVGURIReference.href */
-  final SVGAnimatedString href;
+  /// @domName SVGURIReference.href; @docsEditable true
+  final AnimatedString href;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGTextPositioningElement
-class SVGTextPositioningElement extends SVGTextContentElement native "*SVGTextPositioningElement" {
+/// @domName SVGTextPositioningElement; @docsEditable true
+class TextPositioningElement extends TextContentElement native "*SVGTextPositioningElement" {
 
-  /** @domName SVGTextPositioningElement.dx */
-  final SVGAnimatedLengthList dx;
+  /// @domName SVGTextPositioningElement.dx; @docsEditable true
+  final AnimatedLengthList dx;
 
-  /** @domName SVGTextPositioningElement.dy */
-  final SVGAnimatedLengthList dy;
+  /// @domName SVGTextPositioningElement.dy; @docsEditable true
+  final AnimatedLengthList dy;
 
-  /** @domName SVGTextPositioningElement.rotate */
-  final SVGAnimatedNumberList rotate;
+  /// @domName SVGTextPositioningElement.rotate; @docsEditable true
+  final AnimatedNumberList rotate;
 
-  /** @domName SVGTextPositioningElement.x */
-  final SVGAnimatedLengthList x;
+  /// @domName SVGTextPositioningElement.x; @docsEditable true
+  final AnimatedLengthList x;
 
-  /** @domName SVGTextPositioningElement.y */
-  final SVGAnimatedLengthList y;
+  /// @domName SVGTextPositioningElement.y; @docsEditable true
+  final AnimatedLengthList y;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for 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 SVGTitleElement
-class SVGTitleElement extends SVGElement implements SVGLangSpace, SVGStylable native "*SVGTitleElement" {
+/// @domName SVGTitleElement; @docsEditable true
+class TitleElement extends SvgElement implements Stylable, LangSpace native "*SVGTitleElement" {
+
+  factory TitleElement() => _SvgElementFactoryProvider.createSvgElement_tag("title");
 
   // From SVGLangSpace
 
-  /** @domName SVGLangSpace.xmllang */
+  /// @domName SVGLangSpace.xmllang; @docsEditable true
   String xmllang;
 
-  /** @domName SVGLangSpace.xmlspace */
+  /// @domName SVGLangSpace.xmlspace; @docsEditable true
   String xmlspace;
 
   // From SVGStylable
 
-  /** @domName SVGStylable.className */
-  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+  /// @domName SVGStylable.className; @docsEditable true
+  AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CSSStyleDeclaration style;
 
-  /** @domName SVGStylable.getPresentationAttribute */
+  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
   CSSValue getPresentationAttribute(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5516,8 +5632,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGTransform
-class SVGTransform native "*SVGTransform" {
+/// @domName SVGTransform; @docsEditable true
+class Transform native "*SVGTransform" {
 
   static const int SVG_TRANSFORM_MATRIX = 1;
 
@@ -5533,31 +5649,31 @@
 
   static const int SVG_TRANSFORM_UNKNOWN = 0;
 
-  /** @domName SVGTransform.angle */
+  /// @domName SVGTransform.angle; @docsEditable true
   final num angle;
 
-  /** @domName SVGTransform.matrix */
-  final SVGMatrix matrix;
+  /// @domName SVGTransform.matrix; @docsEditable true
+  final Matrix matrix;
 
-  /** @domName SVGTransform.type */
+  /// @domName SVGTransform.type; @docsEditable true
   final int type;
 
-  /** @domName SVGTransform.setMatrix */
-  void setMatrix(SVGMatrix matrix) native;
+  /// @domName SVGTransform.setMatrix; @docsEditable true
+  void setMatrix(Matrix matrix) native;
 
-  /** @domName SVGTransform.setRotate */
+  /// @domName SVGTransform.setRotate; @docsEditable true
   void setRotate(num angle, num cx, num cy) native;
 
-  /** @domName SVGTransform.setScale */
+  /// @domName SVGTransform.setScale; @docsEditable true
   void setScale(num sx, num sy) native;
 
-  /** @domName SVGTransform.setSkewX */
+  /// @domName SVGTransform.setSkewX; @docsEditable true
   void setSkewX(num angle) native;
 
-  /** @domName SVGTransform.setSkewY */
+  /// @domName SVGTransform.setSkewY; @docsEditable true
   void setSkewY(num angle) native;
 
-  /** @domName SVGTransform.setTranslate */
+  /// @domName SVGTransform.setTranslate; @docsEditable true
   void setTranslate(num tx, num ty) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5565,79 +5681,81 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGTransformList
-class SVGTransformList implements JavaScriptIndexingBehavior, List<SVGTransform> native "*SVGTransformList" {
+/// @domName SVGTransformList; @docsEditable true
+class TransformList implements List<Transform>, JavaScriptIndexingBehavior native "*SVGTransformList" {
 
-  /** @domName SVGTransformList.numberOfItems */
+  /// @domName SVGTransformList.numberOfItems; @docsEditable true
   final int numberOfItems;
 
-  SVGTransform operator[](int index) => JS("SVGTransform", "#[#]", this, index);
+  Transform operator[](int index) => JS("Transform", "#[#]", this, index);
 
-  void operator[]=(int index, SVGTransform value) {
+  void operator[]=(int index, Transform value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
-  // -- start List<SVGTransform> mixins.
-  // SVGTransform is the element type.
+  // -- start List<Transform> mixins.
+  // Transform is the element type.
 
-  // From Iterable<SVGTransform>:
+  // From Iterable<Transform>:
 
-  Iterator<SVGTransform> iterator() {
+  Iterator<Transform> 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<SVGTransform>(this);
+    return new FixedSizeListIterator<Transform>(this);
   }
 
-  // From Collection<SVGTransform>:
+  // From Collection<Transform>:
 
-  void add(SVGTransform value) {
+  void add(Transform value) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  void addLast(SVGTransform value) {
+  void addLast(Transform value) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  void addAll(Collection<SVGTransform> collection) {
+  void addAll(Collection<Transform> collection) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  bool contains(SVGTransform element) => _Collections.contains(this, element);
+  bool contains(Transform element) => _Collections.contains(this, element);
 
-  void forEach(void f(SVGTransform element)) => _Collections.forEach(this, f);
+  void forEach(void f(Transform element)) => _Collections.forEach(this, f);
 
-  Collection map(f(SVGTransform element)) => _Collections.map(this, [], f);
+  Collection map(f(Transform element)) => _Collections.map(this, [], f);
 
-  Collection<SVGTransform> filter(bool f(SVGTransform element)) =>
-     _Collections.filter(this, <SVGTransform>[], f);
+  Collection<Transform> filter(bool f(Transform element)) =>
+     _Collections.filter(this, <Transform>[], f);
 
-  bool every(bool f(SVGTransform element)) => _Collections.every(this, f);
+  bool every(bool f(Transform element)) => _Collections.every(this, f);
 
-  bool some(bool f(SVGTransform element)) => _Collections.some(this, f);
+  bool some(bool f(Transform element)) => _Collections.some(this, f);
 
   bool get isEmpty => this.length == 0;
 
-  // From List<SVGTransform>:
+  // From List<Transform>:
 
-  void sort([Comparator<SVGTransform> compare = Comparable.compare]) {
+  void sort([Comparator<Transform> compare = Comparable.compare]) {
     throw new UnsupportedError("Cannot sort immutable List.");
   }
 
-  int indexOf(SVGTransform element, [int start = 0]) =>
+  int indexOf(Transform element, [int start = 0]) =>
       _Lists.indexOf(this, element, start, this.length);
 
-  int lastIndexOf(SVGTransform element, [int start]) {
+  int lastIndexOf(Transform element, [int start]) {
     if (start == null) start = length - 1;
     return _Lists.lastIndexOf(this, element, start);
   }
 
-  SVGTransform get last => this[length - 1];
+  Transform get first => this[0];
 
-  SVGTransform removeLast() {
+  Transform get last => this[length - 1];
+
+  Transform removeLast() {
     throw new UnsupportedError("Cannot removeLast on immutable List.");
   }
 
-  void setRange(int start, int rangeLength, List<SVGTransform> from, [int startFrom]) {
+  void setRange(int start, int rangeLength, List<Transform> from, [int startFrom]) {
     throw new UnsupportedError("Cannot setRange on immutable List.");
   }
 
@@ -5645,41 +5763,41 @@
     throw new UnsupportedError("Cannot removeRange on immutable List.");
   }
 
-  void insertRange(int start, int rangeLength, [SVGTransform initialValue]) {
+  void insertRange(int start, int rangeLength, [Transform initialValue]) {
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
-  List<SVGTransform> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <SVGTransform>[]);
+  List<Transform> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <Transform>[]);
 
-  // -- end List<SVGTransform> mixins.
+  // -- end List<Transform> mixins.
 
-  /** @domName SVGTransformList.appendItem */
-  SVGTransform appendItem(SVGTransform item) native;
+  /// @domName SVGTransformList.appendItem; @docsEditable true
+  Transform appendItem(Transform item) native;
 
-  /** @domName SVGTransformList.clear */
+  /// @domName SVGTransformList.clear; @docsEditable true
   void clear() native;
 
-  /** @domName SVGTransformList.consolidate */
-  SVGTransform consolidate() native;
+  /// @domName SVGTransformList.consolidate; @docsEditable true
+  Transform consolidate() native;
 
-  /** @domName SVGTransformList.createSVGTransformFromMatrix */
-  SVGTransform createSVGTransformFromMatrix(SVGMatrix matrix) native;
+  /// @domName SVGTransformList.createSVGTransformFromMatrix; @docsEditable true
+  Transform createSVGTransformFromMatrix(Matrix matrix) native;
 
-  /** @domName SVGTransformList.getItem */
-  SVGTransform getItem(int index) native;
+  /// @domName SVGTransformList.getItem; @docsEditable true
+  Transform getItem(int index) native;
 
-  /** @domName SVGTransformList.initialize */
-  SVGTransform initialize(SVGTransform item) native;
+  /// @domName SVGTransformList.initialize; @docsEditable true
+  Transform initialize(Transform item) native;
 
-  /** @domName SVGTransformList.insertItemBefore */
-  SVGTransform insertItemBefore(SVGTransform item, int index) native;
+  /// @domName SVGTransformList.insertItemBefore; @docsEditable true
+  Transform insertItemBefore(Transform item, int index) native;
 
-  /** @domName SVGTransformList.removeItem */
-  SVGTransform removeItem(int index) native;
+  /// @domName SVGTransformList.removeItem; @docsEditable true
+  Transform removeItem(int index) native;
 
-  /** @domName SVGTransformList.replaceItem */
-  SVGTransform replaceItem(SVGTransform item, int index) native;
+  /// @domName SVGTransformList.replaceItem; @docsEditable true
+  Transform replaceItem(Transform 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
@@ -5687,45 +5805,35 @@
 
 
 /// @domName SVGTransformable
-abstract class SVGTransformable implements SVGLocatable {
+abstract class Transformable implements Locatable {
 
-  SVGAnimatedTransformList transform;
+  AnimatedTransformList transform;
 
   // From SVGLocatable
 
-  SVGElement farthestViewportElement;
+  SvgElement farthestViewportElement;
 
-  SVGElement nearestViewportElement;
+  SvgElement nearestViewportElement;
 
-  /** @domName SVGLocatable.getBBox */
-  SVGRect getBBox();
+  /// @domName SVGLocatable.getBBox; @docsEditable true
+  Rect getBBox();
 
-  /** @domName SVGLocatable.getCTM */
-  SVGMatrix getCTM();
+  /// @domName SVGLocatable.getCTM; @docsEditable true
+  Matrix getCTM();
 
-  /** @domName SVGLocatable.getScreenCTM */
-  SVGMatrix getScreenCTM();
+  /// @domName SVGLocatable.getScreenCTM; @docsEditable true
+  Matrix getScreenCTM();
 
-  /** @domName SVGLocatable.getTransformToElement */
-  SVGMatrix getTransformToElement(SVGElement element);
+  /// @domName SVGLocatable.getTransformToElement; @docsEditable true
+  Matrix getTransformToElement(SvgElement element);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGURIReference
-abstract class SVGURIReference {
-
-  SVGAnimatedString href;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-/// @domName SVGUnitTypes
-class SVGUnitTypes native "*SVGUnitTypes" {
+/// @domName SVGUnitTypes; @docsEditable true
+class UnitTypes native "*SVGUnitTypes" {
 
   static const int SVG_UNIT_TYPE_OBJECTBOUNDINGBOX = 2;
 
@@ -5738,130 +5846,146 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGUseElement
-class SVGUseElement extends SVGElement implements SVGLangSpace, SVGTests, SVGStylable, SVGURIReference, SVGExternalResourcesRequired, SVGTransformable native "*SVGUseElement" {
+/// @domName SVGURIReference
+abstract class UriReference {
 
-  /** @domName SVGUseElement.animatedInstanceRoot */
-  final SVGElementInstance animatedInstanceRoot;
+  AnimatedString href;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
 
-  /** @domName SVGUseElement.height */
-  final SVGAnimatedLength height;
 
-  /** @domName SVGUseElement.instanceRoot */
-  final SVGElementInstance instanceRoot;
+/// @domName SVGUseElement; @docsEditable true
+class UseElement extends SvgElement implements Transformable, Tests, UriReference, Stylable, ExternalResourcesRequired, LangSpace native "*SVGUseElement" {
 
-  /** @domName SVGUseElement.width */
-  final SVGAnimatedLength width;
+  factory UseElement() => _SvgElementFactoryProvider.createSvgElement_tag("use");
 
-  /** @domName SVGUseElement.x */
-  final SVGAnimatedLength x;
+  /// @domName SVGUseElement.animatedInstanceRoot; @docsEditable true
+  final ElementInstance animatedInstanceRoot;
 
-  /** @domName SVGUseElement.y */
-  final SVGAnimatedLength y;
+  /// @domName SVGUseElement.height; @docsEditable true
+  final AnimatedLength height;
+
+  /// @domName SVGUseElement.instanceRoot; @docsEditable true
+  final ElementInstance instanceRoot;
+
+  /// @domName SVGUseElement.width; @docsEditable true
+  final AnimatedLength width;
+
+  /// @domName SVGUseElement.x; @docsEditable true
+  final AnimatedLength x;
+
+  /// @domName SVGUseElement.y; @docsEditable true
+  final AnimatedLength y;
 
   // From SVGExternalResourcesRequired
 
-  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
-  final SVGAnimatedBoolean externalResourcesRequired;
+  /// @domName SVGExternalResourcesRequired.externalResourcesRequired; @docsEditable true
+  final AnimatedBoolean externalResourcesRequired;
 
   // From SVGLangSpace
 
-  /** @domName SVGLangSpace.xmllang */
+  /// @domName SVGLangSpace.xmllang; @docsEditable true
   String xmllang;
 
-  /** @domName SVGLangSpace.xmlspace */
+  /// @domName SVGLangSpace.xmlspace; @docsEditable true
   String xmlspace;
 
   // From SVGLocatable
 
-  /** @domName SVGLocatable.farthestViewportElement */
-  final SVGElement farthestViewportElement;
+  /// @domName SVGLocatable.farthestViewportElement; @docsEditable true
+  final SvgElement farthestViewportElement;
 
-  /** @domName SVGLocatable.nearestViewportElement */
-  final SVGElement nearestViewportElement;
+  /// @domName SVGLocatable.nearestViewportElement; @docsEditable true
+  final SvgElement nearestViewportElement;
 
-  /** @domName SVGLocatable.getBBox */
-  SVGRect getBBox() native;
+  /// @domName SVGLocatable.getBBox; @docsEditable true
+  Rect getBBox() native;
 
-  /** @domName SVGLocatable.getCTM */
-  SVGMatrix getCTM() native;
+  /// @domName SVGLocatable.getCTM; @docsEditable true
+  Matrix getCTM() native;
 
-  /** @domName SVGLocatable.getScreenCTM */
-  SVGMatrix getScreenCTM() native;
+  /// @domName SVGLocatable.getScreenCTM; @docsEditable true
+  Matrix getScreenCTM() native;
 
-  /** @domName SVGLocatable.getTransformToElement */
-  SVGMatrix getTransformToElement(SVGElement element) native;
+  /// @domName SVGLocatable.getTransformToElement; @docsEditable true
+  Matrix getTransformToElement(SvgElement element) native;
 
   // From SVGStylable
 
-  /** @domName SVGStylable.className */
-  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+  /// @domName SVGStylable.className; @docsEditable true
+  AnimatedString get $dom_svgClassName => JS("AnimatedString", "#.className", this);
 
   // Use implementation from Element.
   // final CSSStyleDeclaration style;
 
-  /** @domName SVGStylable.getPresentationAttribute */
+  /// @domName SVGStylable.getPresentationAttribute; @docsEditable true
   CSSValue getPresentationAttribute(String name) native;
 
   // From SVGTests
 
-  /** @domName SVGTests.requiredExtensions */
-  final SVGStringList requiredExtensions;
+  /// @domName SVGTests.requiredExtensions; @docsEditable true
+  final StringList requiredExtensions;
 
-  /** @domName SVGTests.requiredFeatures */
-  final SVGStringList requiredFeatures;
+  /// @domName SVGTests.requiredFeatures; @docsEditable true
+  final StringList requiredFeatures;
 
-  /** @domName SVGTests.systemLanguage */
-  final SVGStringList systemLanguage;
+  /// @domName SVGTests.systemLanguage; @docsEditable true
+  final StringList systemLanguage;
 
-  /** @domName SVGTests.hasExtension */
+  /// @domName SVGTests.hasExtension; @docsEditable true
   bool hasExtension(String extension) native;
 
   // From SVGTransformable
 
-  /** @domName SVGTransformable.transform */
-  final SVGAnimatedTransformList transform;
+  /// @domName SVGTransformable.transform; @docsEditable true
+  final AnimatedTransformList transform;
 
   // From SVGURIReference
 
-  /** @domName SVGURIReference.href */
-  final SVGAnimatedString href;
+  /// @domName SVGURIReference.href; @docsEditable true
+  final AnimatedString href;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGVKernElement
-class SVGVKernElement extends SVGElement native "*SVGVKernElement" {
+/// @domName SVGVKernElement; @docsEditable true
+class VKernElement extends SvgElement native "*SVGVKernElement" {
+
+  factory VKernElement() => _SvgElementFactoryProvider.createSvgElement_tag("vkern");
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for 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 SVGViewElement
-class SVGViewElement extends SVGElement implements SVGFitToViewBox, SVGZoomAndPan, SVGExternalResourcesRequired native "*SVGViewElement" {
+/// @domName SVGViewElement; @docsEditable true
+class ViewElement extends SvgElement implements FitToViewBox, ExternalResourcesRequired, ZoomAndPan native "*SVGViewElement" {
 
-  /** @domName SVGViewElement.viewTarget */
-  final SVGStringList viewTarget;
+  factory ViewElement() => _SvgElementFactoryProvider.createSvgElement_tag("view");
+
+  /// @domName SVGViewElement.viewTarget; @docsEditable true
+  final StringList viewTarget;
 
   // From SVGExternalResourcesRequired
 
-  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
-  final SVGAnimatedBoolean externalResourcesRequired;
+  /// @domName SVGExternalResourcesRequired.externalResourcesRequired; @docsEditable true
+  final AnimatedBoolean externalResourcesRequired;
 
   // From SVGFitToViewBox
 
-  /** @domName SVGFitToViewBox.preserveAspectRatio */
-  final SVGAnimatedPreserveAspectRatio preserveAspectRatio;
+  /// @domName SVGFitToViewBox.preserveAspectRatio; @docsEditable true
+  final AnimatedPreserveAspectRatio preserveAspectRatio;
 
-  /** @domName SVGFitToViewBox.viewBox */
-  final SVGAnimatedRect viewBox;
+  /// @domName SVGFitToViewBox.viewBox; @docsEditable true
+  final AnimatedRect viewBox;
 
   // From SVGZoomAndPan
 
-  /** @domName SVGZoomAndPan.zoomAndPan */
+  /// @domName SVGZoomAndPan.zoomAndPan; @docsEditable true
   int zoomAndPan;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5869,34 +5993,34 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGViewSpec
-class SVGViewSpec native "*SVGViewSpec" {
+/// @domName SVGViewSpec; @docsEditable true
+class ViewSpec native "*SVGViewSpec" {
 
-  /** @domName SVGViewSpec.preserveAspectRatio */
-  final SVGAnimatedPreserveAspectRatio preserveAspectRatio;
+  /// @domName SVGViewSpec.preserveAspectRatio; @docsEditable true
+  final AnimatedPreserveAspectRatio preserveAspectRatio;
 
-  /** @domName SVGViewSpec.preserveAspectRatioString */
+  /// @domName SVGViewSpec.preserveAspectRatioString; @docsEditable true
   final String preserveAspectRatioString;
 
-  /** @domName SVGViewSpec.transform */
-  final SVGTransformList transform;
+  /// @domName SVGViewSpec.transform; @docsEditable true
+  final TransformList transform;
 
-  /** @domName SVGViewSpec.transformString */
+  /// @domName SVGViewSpec.transformString; @docsEditable true
   final String transformString;
 
-  /** @domName SVGViewSpec.viewBox */
-  final SVGAnimatedRect viewBox;
+  /// @domName SVGViewSpec.viewBox; @docsEditable true
+  final AnimatedRect viewBox;
 
-  /** @domName SVGViewSpec.viewBoxString */
+  /// @domName SVGViewSpec.viewBoxString; @docsEditable true
   final String viewBoxString;
 
-  /** @domName SVGViewSpec.viewTarget */
-  final SVGElement viewTarget;
+  /// @domName SVGViewSpec.viewTarget; @docsEditable true
+  final SvgElement viewTarget;
 
-  /** @domName SVGViewSpec.viewTargetString */
+  /// @domName SVGViewSpec.viewTargetString; @docsEditable true
   final String viewTargetString;
 
-  /** @domName SVGViewSpec.zoomAndPan */
+  /// @domName SVGViewSpec.zoomAndPan; @docsEditable true
   int zoomAndPan;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5905,7 +6029,7 @@
 
 
 /// @domName SVGZoomAndPan
-abstract class SVGZoomAndPan {
+abstract class ZoomAndPan {
 
   static const int SVG_ZOOMANDPAN_DISABLE = 1;
 
@@ -5920,102 +6044,104 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/// @domName SVGZoomEvent
-class SVGZoomEvent extends UIEvent native "*SVGZoomEvent" {
+/// @domName SVGZoomEvent; @docsEditable true
+class ZoomEvent extends UIEvent native "*SVGZoomEvent" {
 
-  /** @domName SVGZoomEvent.newScale */
+  /// @domName SVGZoomEvent.newScale; @docsEditable true
   final num newScale;
 
-  /** @domName SVGZoomEvent.newTranslate */
-  final SVGPoint newTranslate;
+  /// @domName SVGZoomEvent.newTranslate; @docsEditable true
+  final Point newTranslate;
 
-  /** @domName SVGZoomEvent.previousScale */
+  /// @domName SVGZoomEvent.previousScale; @docsEditable true
   final num previousScale;
 
-  /** @domName SVGZoomEvent.previousTranslate */
-  final SVGPoint previousTranslate;
+  /// @domName SVGZoomEvent.previousTranslate; @docsEditable true
+  final Point previousTranslate;
 
-  /** @domName SVGZoomEvent.zoomRectScreen */
-  final SVGRect zoomRectScreen;
+  /// @domName SVGZoomEvent.zoomRectScreen; @docsEditable true
+  final Rect zoomRectScreen;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for 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 SVGElementInstanceList
-class _SVGElementInstanceList implements JavaScriptIndexingBehavior, List<SVGElementInstance> native "*SVGElementInstanceList" {
+/// @domName SVGElementInstanceList; @docsEditable true
+class _ElementInstanceList implements JavaScriptIndexingBehavior, List<ElementInstance> native "*SVGElementInstanceList" {
 
-  /** @domName SVGElementInstanceList.length */
+  /// @domName SVGElementInstanceList.length; @docsEditable true
   final int length;
 
-  SVGElementInstance operator[](int index) => JS("SVGElementInstance", "#[#]", this, index);
+  ElementInstance operator[](int index) => JS("ElementInstance", "#[#]", this, index);
 
-  void operator[]=(int index, SVGElementInstance value) {
+  void operator[]=(int index, ElementInstance value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
-  // -- start List<SVGElementInstance> mixins.
-  // SVGElementInstance is the element type.
+  // -- start List<ElementInstance> mixins.
+  // ElementInstance is the element type.
 
-  // From Iterable<SVGElementInstance>:
+  // From Iterable<ElementInstance>:
 
-  Iterator<SVGElementInstance> iterator() {
+  Iterator<ElementInstance> 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<SVGElementInstance>(this);
+    return new FixedSizeListIterator<ElementInstance>(this);
   }
 
-  // From Collection<SVGElementInstance>:
+  // From Collection<ElementInstance>:
 
-  void add(SVGElementInstance value) {
+  void add(ElementInstance value) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  void addLast(SVGElementInstance value) {
+  void addLast(ElementInstance value) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  void addAll(Collection<SVGElementInstance> collection) {
+  void addAll(Collection<ElementInstance> collection) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  bool contains(SVGElementInstance element) => _Collections.contains(this, element);
+  bool contains(ElementInstance element) => _Collections.contains(this, element);
 
-  void forEach(void f(SVGElementInstance element)) => _Collections.forEach(this, f);
+  void forEach(void f(ElementInstance element)) => _Collections.forEach(this, f);
 
-  Collection map(f(SVGElementInstance element)) => _Collections.map(this, [], f);
+  Collection map(f(ElementInstance element)) => _Collections.map(this, [], f);
 
-  Collection<SVGElementInstance> filter(bool f(SVGElementInstance element)) =>
-     _Collections.filter(this, <SVGElementInstance>[], f);
+  Collection<ElementInstance> filter(bool f(ElementInstance element)) =>
+     _Collections.filter(this, <ElementInstance>[], f);
 
-  bool every(bool f(SVGElementInstance element)) => _Collections.every(this, f);
+  bool every(bool f(ElementInstance element)) => _Collections.every(this, f);
 
-  bool some(bool f(SVGElementInstance element)) => _Collections.some(this, f);
+  bool some(bool f(ElementInstance element)) => _Collections.some(this, f);
 
   bool get isEmpty => this.length == 0;
 
-  // From List<SVGElementInstance>:
+  // From List<ElementInstance>:
 
-  void sort([Comparator<SVGElementInstance> compare = Comparable.compare]) {
+  void sort([Comparator<ElementInstance> compare = Comparable.compare]) {
     throw new UnsupportedError("Cannot sort immutable List.");
   }
 
-  int indexOf(SVGElementInstance element, [int start = 0]) =>
+  int indexOf(ElementInstance element, [int start = 0]) =>
       _Lists.indexOf(this, element, start, this.length);
 
-  int lastIndexOf(SVGElementInstance element, [int start]) {
+  int lastIndexOf(ElementInstance element, [int start]) {
     if (start == null) start = length - 1;
     return _Lists.lastIndexOf(this, element, start);
   }
 
-  SVGElementInstance get last => this[length - 1];
+  ElementInstance get first => this[0];
 
-  SVGElementInstance removeLast() {
+  ElementInstance get last => this[length - 1];
+
+  ElementInstance removeLast() {
     throw new UnsupportedError("Cannot removeLast on immutable List.");
   }
 
-  void setRange(int start, int rangeLength, List<SVGElementInstance> from, [int startFrom]) {
+  void setRange(int start, int rangeLength, List<ElementInstance> from, [int startFrom]) {
     throw new UnsupportedError("Cannot setRange on immutable List.");
   }
 
@@ -6023,15 +6149,15 @@
     throw new UnsupportedError("Cannot removeRange on immutable List.");
   }
 
-  void insertRange(int start, int rangeLength, [SVGElementInstance initialValue]) {
+  void insertRange(int start, int rangeLength, [ElementInstance initialValue]) {
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
-  List<SVGElementInstance> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <SVGElementInstance>[]);
+  List<ElementInstance> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <ElementInstance>[]);
 
-  // -- end List<SVGElementInstance> mixins.
+  // -- end List<ElementInstance> mixins.
 
-  /** @domName SVGElementInstanceList.item */
-  SVGElementInstance item(int index) native;
+  /// @domName SVGElementInstanceList.item; @docsEditable true
+  ElementInstance item(int index) native;
 }
diff --git a/sdk/lib/svg/dartium/svg_dartium.dart b/sdk/lib/svg/dartium/svg_dartium.dart
index f372945..9a60401 100644
--- a/sdk/lib/svg/dartium/svg_dartium.dart
+++ b/sdk/lib/svg/dartium/svg_dartium.dart
@@ -16,20 +16,20 @@
 
 final _START_TAG_REGEXP = new RegExp('<(\\w+)');
 
-class _SVGElementFactoryProvider {
-  static SVGElement createSVGElement_tag(String tag) {
+class _SvgElementFactoryProvider {
+  static SvgElement createSvgElement_tag(String tag) {
     final Element temp =
       document.$dom_createElementNS("http://www.w3.org/2000/svg", tag);
     return temp;
   }
 
-  static SVGElement createSVGElement_svg(String svg) {
+  static SvgElement createSvgElement_svg(String svg) {
     Element parentTag;
     final match = _START_TAG_REGEXP.firstMatch(svg);
     if (match != null && match.group(1).toLowerCase() == 'svg') {
       parentTag = new Element.tag('div');
     } else {
-      parentTag = new SVGSVGElement();
+      parentTag = new SvgSvgElement();
     }
 
     parentTag.innerHTML = svg;
@@ -41,9 +41,9 @@
   }
 }
 
-class _SVGSVGElementFactoryProvider {
-  static SVGSVGElement createSVGSVGElement() {
-    final el = new SVGElement.tag("svg");
+class _SvgSvgElementFactoryProvider {
+  static SvgSvgElement createSvgSvgElement() {
+    final el = new SvgElement.tag("svg");
     // The SVG spec requires the version attribute to match the spec version
     el.attributes['version'] = "1.1";
     return el;
@@ -57,16 +57,18 @@
 
 
 /// @domName SVGAElement
-class SVGAElement extends SVGElement implements SVGLangSpace, SVGTests, SVGStylable, SVGURIReference, SVGExternalResourcesRequired, SVGTransformable {
-  SVGAElement.internal(): super.internal();
+class AElement extends SvgElement implements Transformable, Tests, UriReference, Stylable, ExternalResourcesRequired, LangSpace {
+
+  factory AElement() => _SvgElementFactoryProvider.createSvgElement_tag("a");
+  AElement.internal(): super.internal();
 
 
   /** @domName SVGAElement.target */
-  SVGAnimatedString get target native "SVGAElement_target_Getter";
+  AnimatedString get target native "SVGAElement_target_Getter";
 
 
   /** @domName SVGAElement.externalResourcesRequired */
-  SVGAnimatedBoolean get externalResourcesRequired native "SVGAElement_externalResourcesRequired_Getter";
+  AnimatedBoolean get externalResourcesRequired native "SVGAElement_externalResourcesRequired_Getter";
 
 
   /** @domName SVGAElement.xmllang */
@@ -86,31 +88,31 @@
 
 
   /** @domName SVGAElement.farthestViewportElement */
-  SVGElement get farthestViewportElement native "SVGAElement_farthestViewportElement_Getter";
+  SvgElement get farthestViewportElement native "SVGAElement_farthestViewportElement_Getter";
 
 
   /** @domName SVGAElement.nearestViewportElement */
-  SVGElement get nearestViewportElement native "SVGAElement_nearestViewportElement_Getter";
+  SvgElement get nearestViewportElement native "SVGAElement_nearestViewportElement_Getter";
 
 
   /** @domName SVGAElement.getBBox */
-  SVGRect getBBox() native "SVGAElement_getBBox_Callback";
+  Rect getBBox() native "SVGAElement_getBBox_Callback";
 
 
   /** @domName SVGAElement.getCTM */
-  SVGMatrix getCTM() native "SVGAElement_getCTM_Callback";
+  Matrix getCTM() native "SVGAElement_getCTM_Callback";
 
 
   /** @domName SVGAElement.getScreenCTM */
-  SVGMatrix getScreenCTM() native "SVGAElement_getScreenCTM_Callback";
+  Matrix getScreenCTM() native "SVGAElement_getScreenCTM_Callback";
 
 
   /** @domName SVGAElement.getTransformToElement */
-  SVGMatrix getTransformToElement(SVGElement element) native "SVGAElement_getTransformToElement_Callback";
+  Matrix getTransformToElement(SvgElement element) native "SVGAElement_getTransformToElement_Callback";
 
 
   /** @domName SVGAElement.className */
-  SVGAnimatedString get $dom_svgClassName native "SVGAElement_className_Getter";
+  AnimatedString get $dom_svgClassName native "SVGAElement_className_Getter";
 
 
   /** @domName SVGAElement.style */
@@ -122,15 +124,15 @@
 
 
   /** @domName SVGAElement.requiredExtensions */
-  SVGStringList get requiredExtensions native "SVGAElement_requiredExtensions_Getter";
+  StringList get requiredExtensions native "SVGAElement_requiredExtensions_Getter";
 
 
   /** @domName SVGAElement.requiredFeatures */
-  SVGStringList get requiredFeatures native "SVGAElement_requiredFeatures_Getter";
+  StringList get requiredFeatures native "SVGAElement_requiredFeatures_Getter";
 
 
   /** @domName SVGAElement.systemLanguage */
-  SVGStringList get systemLanguage native "SVGAElement_systemLanguage_Getter";
+  StringList get systemLanguage native "SVGAElement_systemLanguage_Getter";
 
 
   /** @domName SVGAElement.hasExtension */
@@ -138,11 +140,11 @@
 
 
   /** @domName SVGAElement.transform */
-  SVGAnimatedTransformList get transform native "SVGAElement_transform_Getter";
+  AnimatedTransformList get transform native "SVGAElement_transform_Getter";
 
 
   /** @domName SVGAElement.href */
-  SVGAnimatedString get href native "SVGAElement_href_Getter";
+  AnimatedString get href native "SVGAElement_href_Getter";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -153,8 +155,8 @@
 
 
 /// @domName SVGAltGlyphDefElement
-class SVGAltGlyphDefElement extends SVGElement {
-  SVGAltGlyphDefElement.internal(): super.internal();
+class AltGlyphDefElement extends SvgElement {
+  AltGlyphDefElement.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -165,8 +167,8 @@
 
 
 /// @domName SVGAltGlyphElement
-class SVGAltGlyphElement extends SVGTextPositioningElement implements SVGURIReference {
-  SVGAltGlyphElement.internal(): super.internal();
+class AltGlyphElement extends TextPositioningElement implements UriReference {
+  AltGlyphElement.internal(): super.internal();
 
 
   /** @domName SVGAltGlyphElement.format */
@@ -186,7 +188,7 @@
 
 
   /** @domName SVGAltGlyphElement.href */
-  SVGAnimatedString get href native "SVGAltGlyphElement_href_Getter";
+  AnimatedString get href native "SVGAltGlyphElement_href_Getter";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -197,8 +199,8 @@
 
 
 /// @domName SVGAltGlyphItemElement
-class SVGAltGlyphItemElement extends SVGElement {
-  SVGAltGlyphItemElement.internal(): super.internal();
+class AltGlyphItemElement extends SvgElement {
+  AltGlyphItemElement.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -209,8 +211,8 @@
 
 
 /// @domName SVGAngle
-class SVGAngle extends NativeFieldWrapperClass1 {
-  SVGAngle.internal();
+class Angle extends NativeFieldWrapperClass1 {
+  Angle.internal();
 
   static const int SVG_ANGLETYPE_DEG = 2;
 
@@ -267,8 +269,10 @@
 
 
 /// @domName SVGAnimateColorElement
-class SVGAnimateColorElement extends SVGAnimationElement {
-  SVGAnimateColorElement.internal(): super.internal();
+class AnimateColorElement extends AnimationElement {
+
+  factory AnimateColorElement() => _SvgElementFactoryProvider.createSvgElement_tag("animateColor");
+  AnimateColorElement.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -279,8 +283,10 @@
 
 
 /// @domName SVGAnimateElement
-class SVGAnimateElement extends SVGAnimationElement {
-  SVGAnimateElement.internal(): super.internal();
+class AnimateElement extends AnimationElement {
+
+  factory AnimateElement() => _SvgElementFactoryProvider.createSvgElement_tag("animate");
+  AnimateElement.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -291,8 +297,10 @@
 
 
 /// @domName SVGAnimateMotionElement
-class SVGAnimateMotionElement extends SVGAnimationElement {
-  SVGAnimateMotionElement.internal(): super.internal();
+class AnimateMotionElement extends AnimationElement {
+
+  factory AnimateMotionElement() => _SvgElementFactoryProvider.createSvgElement_tag("animateMotion");
+  AnimateMotionElement.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -303,8 +311,10 @@
 
 
 /// @domName SVGAnimateTransformElement
-class SVGAnimateTransformElement extends SVGAnimationElement {
-  SVGAnimateTransformElement.internal(): super.internal();
+class AnimateTransformElement extends AnimationElement {
+
+  factory AnimateTransformElement() => _SvgElementFactoryProvider.createSvgElement_tag("animateTransform");
+  AnimateTransformElement.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -315,16 +325,16 @@
 
 
 /// @domName SVGAnimatedAngle
-class SVGAnimatedAngle extends NativeFieldWrapperClass1 {
-  SVGAnimatedAngle.internal();
+class AnimatedAngle extends NativeFieldWrapperClass1 {
+  AnimatedAngle.internal();
 
 
   /** @domName SVGAnimatedAngle.animVal */
-  SVGAngle get animVal native "SVGAnimatedAngle_animVal_Getter";
+  Angle get animVal native "SVGAnimatedAngle_animVal_Getter";
 
 
   /** @domName SVGAnimatedAngle.baseVal */
-  SVGAngle get baseVal native "SVGAnimatedAngle_baseVal_Getter";
+  Angle get baseVal native "SVGAnimatedAngle_baseVal_Getter";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -335,8 +345,8 @@
 
 
 /// @domName SVGAnimatedBoolean
-class SVGAnimatedBoolean extends NativeFieldWrapperClass1 {
-  SVGAnimatedBoolean.internal();
+class AnimatedBoolean extends NativeFieldWrapperClass1 {
+  AnimatedBoolean.internal();
 
 
   /** @domName SVGAnimatedBoolean.animVal */
@@ -359,8 +369,8 @@
 
 
 /// @domName SVGAnimatedEnumeration
-class SVGAnimatedEnumeration extends NativeFieldWrapperClass1 {
-  SVGAnimatedEnumeration.internal();
+class AnimatedEnumeration extends NativeFieldWrapperClass1 {
+  AnimatedEnumeration.internal();
 
 
   /** @domName SVGAnimatedEnumeration.animVal */
@@ -383,8 +393,8 @@
 
 
 /// @domName SVGAnimatedInteger
-class SVGAnimatedInteger extends NativeFieldWrapperClass1 {
-  SVGAnimatedInteger.internal();
+class AnimatedInteger extends NativeFieldWrapperClass1 {
+  AnimatedInteger.internal();
 
 
   /** @domName SVGAnimatedInteger.animVal */
@@ -407,16 +417,16 @@
 
 
 /// @domName SVGAnimatedLength
-class SVGAnimatedLength extends NativeFieldWrapperClass1 {
-  SVGAnimatedLength.internal();
+class AnimatedLength extends NativeFieldWrapperClass1 {
+  AnimatedLength.internal();
 
 
   /** @domName SVGAnimatedLength.animVal */
-  SVGLength get animVal native "SVGAnimatedLength_animVal_Getter";
+  Length get animVal native "SVGAnimatedLength_animVal_Getter";
 
 
   /** @domName SVGAnimatedLength.baseVal */
-  SVGLength get baseVal native "SVGAnimatedLength_baseVal_Getter";
+  Length get baseVal native "SVGAnimatedLength_baseVal_Getter";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -427,84 +437,86 @@
 
 
 /// @domName SVGAnimatedLengthList
-class SVGAnimatedLengthList extends NativeFieldWrapperClass1 implements List<SVGAnimatedLength> {
-  SVGAnimatedLengthList.internal();
+class AnimatedLengthList extends NativeFieldWrapperClass1 implements List<AnimatedLength> {
+  AnimatedLengthList.internal();
 
 
   /** @domName SVGAnimatedLengthList.animVal */
-  SVGLengthList get animVal native "SVGAnimatedLengthList_animVal_Getter";
+  LengthList get animVal native "SVGAnimatedLengthList_animVal_Getter";
 
 
   /** @domName SVGAnimatedLengthList.baseVal */
-  SVGLengthList get baseVal native "SVGAnimatedLengthList_baseVal_Getter";
+  LengthList get baseVal native "SVGAnimatedLengthList_baseVal_Getter";
 
-  SVGAnimatedLength operator[](int index) native "SVGAnimatedLengthList_item_Callback";
+  AnimatedLength operator[](int index) native "SVGAnimatedLengthList_item_Callback";
 
-  void operator[]=(int index, SVGAnimatedLength value) {
+  void operator[]=(int index, AnimatedLength value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
-  // -- start List<SVGAnimatedLength> mixins.
-  // SVGAnimatedLength is the element type.
+  // -- start List<AnimatedLength> mixins.
+  // AnimatedLength is the element type.
 
-  // From Iterable<SVGAnimatedLength>:
+  // From Iterable<AnimatedLength>:
 
-  Iterator<SVGAnimatedLength> iterator() {
+  Iterator<AnimatedLength> 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<SVGAnimatedLength>(this);
+    return new FixedSizeListIterator<AnimatedLength>(this);
   }
 
-  // From Collection<SVGAnimatedLength>:
+  // From Collection<AnimatedLength>:
 
-  void add(SVGAnimatedLength value) {
+  void add(AnimatedLength value) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  void addLast(SVGAnimatedLength value) {
+  void addLast(AnimatedLength value) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  void addAll(Collection<SVGAnimatedLength> collection) {
+  void addAll(Collection<AnimatedLength> collection) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  bool contains(SVGAnimatedLength element) => _Collections.contains(this, element);
+  bool contains(AnimatedLength element) => _Collections.contains(this, element);
 
-  void forEach(void f(SVGAnimatedLength element)) => _Collections.forEach(this, f);
+  void forEach(void f(AnimatedLength element)) => _Collections.forEach(this, f);
 
-  Collection map(f(SVGAnimatedLength element)) => _Collections.map(this, [], f);
+  Collection map(f(AnimatedLength element)) => _Collections.map(this, [], f);
 
-  Collection<SVGAnimatedLength> filter(bool f(SVGAnimatedLength element)) =>
-     _Collections.filter(this, <SVGAnimatedLength>[], f);
+  Collection<AnimatedLength> filter(bool f(AnimatedLength element)) =>
+     _Collections.filter(this, <AnimatedLength>[], f);
 
-  bool every(bool f(SVGAnimatedLength element)) => _Collections.every(this, f);
+  bool every(bool f(AnimatedLength element)) => _Collections.every(this, f);
 
-  bool some(bool f(SVGAnimatedLength element)) => _Collections.some(this, f);
+  bool some(bool f(AnimatedLength element)) => _Collections.some(this, f);
 
   bool get isEmpty => this.length == 0;
 
-  // From List<SVGAnimatedLength>:
+  // From List<AnimatedLength>:
 
-  void sort([Comparator<SVGAnimatedLength> compare = Comparable.compare]) {
+  void sort([Comparator<AnimatedLength> compare = Comparable.compare]) {
     throw new UnsupportedError("Cannot sort immutable List.");
   }
 
-  int indexOf(SVGAnimatedLength element, [int start = 0]) =>
+  int indexOf(AnimatedLength element, [int start = 0]) =>
       _Lists.indexOf(this, element, start, this.length);
 
-  int lastIndexOf(SVGAnimatedLength element, [int start]) {
+  int lastIndexOf(AnimatedLength element, [int start]) {
     if (start == null) start = length - 1;
     return _Lists.lastIndexOf(this, element, start);
   }
 
-  SVGAnimatedLength get last => this[length - 1];
+  AnimatedLength get first => this[0];
 
-  SVGAnimatedLength removeLast() {
+  AnimatedLength get last => this[length - 1];
+
+  AnimatedLength removeLast() {
     throw new UnsupportedError("Cannot removeLast on immutable List.");
   }
 
-  void setRange(int start, int rangeLength, List<SVGAnimatedLength> from, [int startFrom]) {
+  void setRange(int start, int rangeLength, List<AnimatedLength> from, [int startFrom]) {
     throw new UnsupportedError("Cannot setRange on immutable List.");
   }
 
@@ -512,14 +524,14 @@
     throw new UnsupportedError("Cannot removeRange on immutable List.");
   }
 
-  void insertRange(int start, int rangeLength, [SVGAnimatedLength initialValue]) {
+  void insertRange(int start, int rangeLength, [AnimatedLength initialValue]) {
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
-  List<SVGAnimatedLength> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <SVGAnimatedLength>[]);
+  List<AnimatedLength> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <AnimatedLength>[]);
 
-  // -- end List<SVGAnimatedLength> mixins.
+  // -- end List<AnimatedLength> mixins.
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -530,8 +542,8 @@
 
 
 /// @domName SVGAnimatedNumber
-class SVGAnimatedNumber extends NativeFieldWrapperClass1 {
-  SVGAnimatedNumber.internal();
+class AnimatedNumber extends NativeFieldWrapperClass1 {
+  AnimatedNumber.internal();
 
 
   /** @domName SVGAnimatedNumber.animVal */
@@ -554,84 +566,86 @@
 
 
 /// @domName SVGAnimatedNumberList
-class SVGAnimatedNumberList extends NativeFieldWrapperClass1 implements List<SVGAnimatedNumber> {
-  SVGAnimatedNumberList.internal();
+class AnimatedNumberList extends NativeFieldWrapperClass1 implements List<AnimatedNumber> {
+  AnimatedNumberList.internal();
 
 
   /** @domName SVGAnimatedNumberList.animVal */
-  SVGNumberList get animVal native "SVGAnimatedNumberList_animVal_Getter";
+  NumberList get animVal native "SVGAnimatedNumberList_animVal_Getter";
 
 
   /** @domName SVGAnimatedNumberList.baseVal */
-  SVGNumberList get baseVal native "SVGAnimatedNumberList_baseVal_Getter";
+  NumberList get baseVal native "SVGAnimatedNumberList_baseVal_Getter";
 
-  SVGAnimatedNumber operator[](int index) native "SVGAnimatedNumberList_item_Callback";
+  AnimatedNumber operator[](int index) native "SVGAnimatedNumberList_item_Callback";
 
-  void operator[]=(int index, SVGAnimatedNumber value) {
+  void operator[]=(int index, AnimatedNumber value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
-  // -- start List<SVGAnimatedNumber> mixins.
-  // SVGAnimatedNumber is the element type.
+  // -- start List<AnimatedNumber> mixins.
+  // AnimatedNumber is the element type.
 
-  // From Iterable<SVGAnimatedNumber>:
+  // From Iterable<AnimatedNumber>:
 
-  Iterator<SVGAnimatedNumber> iterator() {
+  Iterator<AnimatedNumber> 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<SVGAnimatedNumber>(this);
+    return new FixedSizeListIterator<AnimatedNumber>(this);
   }
 
-  // From Collection<SVGAnimatedNumber>:
+  // From Collection<AnimatedNumber>:
 
-  void add(SVGAnimatedNumber value) {
+  void add(AnimatedNumber value) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  void addLast(SVGAnimatedNumber value) {
+  void addLast(AnimatedNumber value) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  void addAll(Collection<SVGAnimatedNumber> collection) {
+  void addAll(Collection<AnimatedNumber> collection) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  bool contains(SVGAnimatedNumber element) => _Collections.contains(this, element);
+  bool contains(AnimatedNumber element) => _Collections.contains(this, element);
 
-  void forEach(void f(SVGAnimatedNumber element)) => _Collections.forEach(this, f);
+  void forEach(void f(AnimatedNumber element)) => _Collections.forEach(this, f);
 
-  Collection map(f(SVGAnimatedNumber element)) => _Collections.map(this, [], f);
+  Collection map(f(AnimatedNumber element)) => _Collections.map(this, [], f);
 
-  Collection<SVGAnimatedNumber> filter(bool f(SVGAnimatedNumber element)) =>
-     _Collections.filter(this, <SVGAnimatedNumber>[], f);
+  Collection<AnimatedNumber> filter(bool f(AnimatedNumber element)) =>
+     _Collections.filter(this, <AnimatedNumber>[], f);
 
-  bool every(bool f(SVGAnimatedNumber element)) => _Collections.every(this, f);
+  bool every(bool f(AnimatedNumber element)) => _Collections.every(this, f);
 
-  bool some(bool f(SVGAnimatedNumber element)) => _Collections.some(this, f);
+  bool some(bool f(AnimatedNumber element)) => _Collections.some(this, f);
 
   bool get isEmpty => this.length == 0;
 
-  // From List<SVGAnimatedNumber>:
+  // From List<AnimatedNumber>:
 
-  void sort([Comparator<SVGAnimatedNumber> compare = Comparable.compare]) {
+  void sort([Comparator<AnimatedNumber> compare = Comparable.compare]) {
     throw new UnsupportedError("Cannot sort immutable List.");
   }
 
-  int indexOf(SVGAnimatedNumber element, [int start = 0]) =>
+  int indexOf(AnimatedNumber element, [int start = 0]) =>
       _Lists.indexOf(this, element, start, this.length);
 
-  int lastIndexOf(SVGAnimatedNumber element, [int start]) {
+  int lastIndexOf(AnimatedNumber element, [int start]) {
     if (start == null) start = length - 1;
     return _Lists.lastIndexOf(this, element, start);
   }
 
-  SVGAnimatedNumber get last => this[length - 1];
+  AnimatedNumber get first => this[0];
 
-  SVGAnimatedNumber removeLast() {
+  AnimatedNumber get last => this[length - 1];
+
+  AnimatedNumber removeLast() {
     throw new UnsupportedError("Cannot removeLast on immutable List.");
   }
 
-  void setRange(int start, int rangeLength, List<SVGAnimatedNumber> from, [int startFrom]) {
+  void setRange(int start, int rangeLength, List<AnimatedNumber> from, [int startFrom]) {
     throw new UnsupportedError("Cannot setRange on immutable List.");
   }
 
@@ -639,14 +653,14 @@
     throw new UnsupportedError("Cannot removeRange on immutable List.");
   }
 
-  void insertRange(int start, int rangeLength, [SVGAnimatedNumber initialValue]) {
+  void insertRange(int start, int rangeLength, [AnimatedNumber initialValue]) {
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
-  List<SVGAnimatedNumber> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <SVGAnimatedNumber>[]);
+  List<AnimatedNumber> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <AnimatedNumber>[]);
 
-  // -- end List<SVGAnimatedNumber> mixins.
+  // -- end List<AnimatedNumber> mixins.
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -657,16 +671,16 @@
 
 
 /// @domName SVGAnimatedPreserveAspectRatio
-class SVGAnimatedPreserveAspectRatio extends NativeFieldWrapperClass1 {
-  SVGAnimatedPreserveAspectRatio.internal();
+class AnimatedPreserveAspectRatio extends NativeFieldWrapperClass1 {
+  AnimatedPreserveAspectRatio.internal();
 
 
   /** @domName SVGAnimatedPreserveAspectRatio.animVal */
-  SVGPreserveAspectRatio get animVal native "SVGAnimatedPreserveAspectRatio_animVal_Getter";
+  PreserveAspectRatio get animVal native "SVGAnimatedPreserveAspectRatio_animVal_Getter";
 
 
   /** @domName SVGAnimatedPreserveAspectRatio.baseVal */
-  SVGPreserveAspectRatio get baseVal native "SVGAnimatedPreserveAspectRatio_baseVal_Getter";
+  PreserveAspectRatio get baseVal native "SVGAnimatedPreserveAspectRatio_baseVal_Getter";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -677,16 +691,16 @@
 
 
 /// @domName SVGAnimatedRect
-class SVGAnimatedRect extends NativeFieldWrapperClass1 {
-  SVGAnimatedRect.internal();
+class AnimatedRect extends NativeFieldWrapperClass1 {
+  AnimatedRect.internal();
 
 
   /** @domName SVGAnimatedRect.animVal */
-  SVGRect get animVal native "SVGAnimatedRect_animVal_Getter";
+  Rect get animVal native "SVGAnimatedRect_animVal_Getter";
 
 
   /** @domName SVGAnimatedRect.baseVal */
-  SVGRect get baseVal native "SVGAnimatedRect_baseVal_Getter";
+  Rect get baseVal native "SVGAnimatedRect_baseVal_Getter";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -697,8 +711,8 @@
 
 
 /// @domName SVGAnimatedString
-class SVGAnimatedString extends NativeFieldWrapperClass1 {
-  SVGAnimatedString.internal();
+class AnimatedString extends NativeFieldWrapperClass1 {
+  AnimatedString.internal();
 
 
   /** @domName SVGAnimatedString.animVal */
@@ -721,84 +735,86 @@
 
 
 /// @domName SVGAnimatedTransformList
-class SVGAnimatedTransformList extends NativeFieldWrapperClass1 implements List<SVGAnimateTransformElement> {
-  SVGAnimatedTransformList.internal();
+class AnimatedTransformList extends NativeFieldWrapperClass1 implements List<AnimateTransformElement> {
+  AnimatedTransformList.internal();
 
 
   /** @domName SVGAnimatedTransformList.animVal */
-  SVGTransformList get animVal native "SVGAnimatedTransformList_animVal_Getter";
+  TransformList get animVal native "SVGAnimatedTransformList_animVal_Getter";
 
 
   /** @domName SVGAnimatedTransformList.baseVal */
-  SVGTransformList get baseVal native "SVGAnimatedTransformList_baseVal_Getter";
+  TransformList get baseVal native "SVGAnimatedTransformList_baseVal_Getter";
 
-  SVGAnimateTransformElement operator[](int index) native "SVGAnimatedTransformList_item_Callback";
+  AnimateTransformElement operator[](int index) native "SVGAnimatedTransformList_item_Callback";
 
-  void operator[]=(int index, SVGAnimateTransformElement value) {
+  void operator[]=(int index, AnimateTransformElement value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
-  // -- start List<SVGAnimateTransformElement> mixins.
-  // SVGAnimateTransformElement is the element type.
+  // -- start List<AnimateTransformElement> mixins.
+  // AnimateTransformElement is the element type.
 
-  // From Iterable<SVGAnimateTransformElement>:
+  // From Iterable<AnimateTransformElement>:
 
-  Iterator<SVGAnimateTransformElement> iterator() {
+  Iterator<AnimateTransformElement> 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<SVGAnimateTransformElement>(this);
+    return new FixedSizeListIterator<AnimateTransformElement>(this);
   }
 
-  // From Collection<SVGAnimateTransformElement>:
+  // From Collection<AnimateTransformElement>:
 
-  void add(SVGAnimateTransformElement value) {
+  void add(AnimateTransformElement value) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  void addLast(SVGAnimateTransformElement value) {
+  void addLast(AnimateTransformElement value) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  void addAll(Collection<SVGAnimateTransformElement> collection) {
+  void addAll(Collection<AnimateTransformElement> collection) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  bool contains(SVGAnimateTransformElement element) => _Collections.contains(this, element);
+  bool contains(AnimateTransformElement element) => _Collections.contains(this, element);
 
-  void forEach(void f(SVGAnimateTransformElement element)) => _Collections.forEach(this, f);
+  void forEach(void f(AnimateTransformElement element)) => _Collections.forEach(this, f);
 
-  Collection map(f(SVGAnimateTransformElement element)) => _Collections.map(this, [], f);
+  Collection map(f(AnimateTransformElement element)) => _Collections.map(this, [], f);
 
-  Collection<SVGAnimateTransformElement> filter(bool f(SVGAnimateTransformElement element)) =>
-     _Collections.filter(this, <SVGAnimateTransformElement>[], f);
+  Collection<AnimateTransformElement> filter(bool f(AnimateTransformElement element)) =>
+     _Collections.filter(this, <AnimateTransformElement>[], f);
 
-  bool every(bool f(SVGAnimateTransformElement element)) => _Collections.every(this, f);
+  bool every(bool f(AnimateTransformElement element)) => _Collections.every(this, f);
 
-  bool some(bool f(SVGAnimateTransformElement element)) => _Collections.some(this, f);
+  bool some(bool f(AnimateTransformElement element)) => _Collections.some(this, f);
 
   bool get isEmpty => this.length == 0;
 
-  // From List<SVGAnimateTransformElement>:
+  // From List<AnimateTransformElement>:
 
-  void sort([Comparator<SVGAnimateTransformElement> compare = Comparable.compare]) {
+  void sort([Comparator<AnimateTransformElement> compare = Comparable.compare]) {
     throw new UnsupportedError("Cannot sort immutable List.");
   }
 
-  int indexOf(SVGAnimateTransformElement element, [int start = 0]) =>
+  int indexOf(AnimateTransformElement element, [int start = 0]) =>
       _Lists.indexOf(this, element, start, this.length);
 
-  int lastIndexOf(SVGAnimateTransformElement element, [int start]) {
+  int lastIndexOf(AnimateTransformElement element, [int start]) {
     if (start == null) start = length - 1;
     return _Lists.lastIndexOf(this, element, start);
   }
 
-  SVGAnimateTransformElement get last => this[length - 1];
+  AnimateTransformElement get first => this[0];
 
-  SVGAnimateTransformElement removeLast() {
+  AnimateTransformElement get last => this[length - 1];
+
+  AnimateTransformElement removeLast() {
     throw new UnsupportedError("Cannot removeLast on immutable List.");
   }
 
-  void setRange(int start, int rangeLength, List<SVGAnimateTransformElement> from, [int startFrom]) {
+  void setRange(int start, int rangeLength, List<AnimateTransformElement> from, [int startFrom]) {
     throw new UnsupportedError("Cannot setRange on immutable List.");
   }
 
@@ -806,14 +822,14 @@
     throw new UnsupportedError("Cannot removeRange on immutable List.");
   }
 
-  void insertRange(int start, int rangeLength, [SVGAnimateTransformElement initialValue]) {
+  void insertRange(int start, int rangeLength, [AnimateTransformElement initialValue]) {
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
-  List<SVGAnimateTransformElement> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <SVGAnimateTransformElement>[]);
+  List<AnimateTransformElement> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <AnimateTransformElement>[]);
 
-  // -- end List<SVGAnimateTransformElement> mixins.
+  // -- end List<AnimateTransformElement> mixins.
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -824,12 +840,14 @@
 
 
 /// @domName SVGAnimationElement
-class SVGAnimationElement extends SVGElement implements ElementTimeControl, SVGTests, SVGExternalResourcesRequired {
-  SVGAnimationElement.internal(): super.internal();
+class AnimationElement extends SvgElement implements Tests, ElementTimeControl, ExternalResourcesRequired {
+
+  factory AnimationElement() => _SvgElementFactoryProvider.createSvgElement_tag("animation");
+  AnimationElement.internal(): super.internal();
 
 
   /** @domName SVGAnimationElement.targetElement */
-  SVGElement get targetElement native "SVGAnimationElement_targetElement_Getter";
+  SvgElement get targetElement native "SVGAnimationElement_targetElement_Getter";
 
 
   /** @domName SVGAnimationElement.getCurrentTime */
@@ -861,19 +879,19 @@
 
 
   /** @domName SVGAnimationElement.externalResourcesRequired */
-  SVGAnimatedBoolean get externalResourcesRequired native "SVGAnimationElement_externalResourcesRequired_Getter";
+  AnimatedBoolean get externalResourcesRequired native "SVGAnimationElement_externalResourcesRequired_Getter";
 
 
   /** @domName SVGAnimationElement.requiredExtensions */
-  SVGStringList get requiredExtensions native "SVGAnimationElement_requiredExtensions_Getter";
+  StringList get requiredExtensions native "SVGAnimationElement_requiredExtensions_Getter";
 
 
   /** @domName SVGAnimationElement.requiredFeatures */
-  SVGStringList get requiredFeatures native "SVGAnimationElement_requiredFeatures_Getter";
+  StringList get requiredFeatures native "SVGAnimationElement_requiredFeatures_Getter";
 
 
   /** @domName SVGAnimationElement.systemLanguage */
-  SVGStringList get systemLanguage native "SVGAnimationElement_systemLanguage_Getter";
+  StringList get systemLanguage native "SVGAnimationElement_systemLanguage_Getter";
 
 
   /** @domName SVGAnimationElement.hasExtension */
@@ -888,24 +906,26 @@
 
 
 /// @domName SVGCircleElement
-class SVGCircleElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired {
-  SVGCircleElement.internal(): super.internal();
+class CircleElement extends SvgElement implements Transformable, Tests, Stylable, ExternalResourcesRequired, LangSpace {
+
+  factory CircleElement() => _SvgElementFactoryProvider.createSvgElement_tag("circle");
+  CircleElement.internal(): super.internal();
 
 
   /** @domName SVGCircleElement.cx */
-  SVGAnimatedLength get cx native "SVGCircleElement_cx_Getter";
+  AnimatedLength get cx native "SVGCircleElement_cx_Getter";
 
 
   /** @domName SVGCircleElement.cy */
-  SVGAnimatedLength get cy native "SVGCircleElement_cy_Getter";
+  AnimatedLength get cy native "SVGCircleElement_cy_Getter";
 
 
   /** @domName SVGCircleElement.r */
-  SVGAnimatedLength get r native "SVGCircleElement_r_Getter";
+  AnimatedLength get r native "SVGCircleElement_r_Getter";
 
 
   /** @domName SVGCircleElement.externalResourcesRequired */
-  SVGAnimatedBoolean get externalResourcesRequired native "SVGCircleElement_externalResourcesRequired_Getter";
+  AnimatedBoolean get externalResourcesRequired native "SVGCircleElement_externalResourcesRequired_Getter";
 
 
   /** @domName SVGCircleElement.xmllang */
@@ -925,31 +945,31 @@
 
 
   /** @domName SVGCircleElement.farthestViewportElement */
-  SVGElement get farthestViewportElement native "SVGCircleElement_farthestViewportElement_Getter";
+  SvgElement get farthestViewportElement native "SVGCircleElement_farthestViewportElement_Getter";
 
 
   /** @domName SVGCircleElement.nearestViewportElement */
-  SVGElement get nearestViewportElement native "SVGCircleElement_nearestViewportElement_Getter";
+  SvgElement get nearestViewportElement native "SVGCircleElement_nearestViewportElement_Getter";
 
 
   /** @domName SVGCircleElement.getBBox */
-  SVGRect getBBox() native "SVGCircleElement_getBBox_Callback";
+  Rect getBBox() native "SVGCircleElement_getBBox_Callback";
 
 
   /** @domName SVGCircleElement.getCTM */
-  SVGMatrix getCTM() native "SVGCircleElement_getCTM_Callback";
+  Matrix getCTM() native "SVGCircleElement_getCTM_Callback";
 
 
   /** @domName SVGCircleElement.getScreenCTM */
-  SVGMatrix getScreenCTM() native "SVGCircleElement_getScreenCTM_Callback";
+  Matrix getScreenCTM() native "SVGCircleElement_getScreenCTM_Callback";
 
 
   /** @domName SVGCircleElement.getTransformToElement */
-  SVGMatrix getTransformToElement(SVGElement element) native "SVGCircleElement_getTransformToElement_Callback";
+  Matrix getTransformToElement(SvgElement element) native "SVGCircleElement_getTransformToElement_Callback";
 
 
   /** @domName SVGCircleElement.className */
-  SVGAnimatedString get $dom_svgClassName native "SVGCircleElement_className_Getter";
+  AnimatedString get $dom_svgClassName native "SVGCircleElement_className_Getter";
 
 
   /** @domName SVGCircleElement.style */
@@ -961,15 +981,15 @@
 
 
   /** @domName SVGCircleElement.requiredExtensions */
-  SVGStringList get requiredExtensions native "SVGCircleElement_requiredExtensions_Getter";
+  StringList get requiredExtensions native "SVGCircleElement_requiredExtensions_Getter";
 
 
   /** @domName SVGCircleElement.requiredFeatures */
-  SVGStringList get requiredFeatures native "SVGCircleElement_requiredFeatures_Getter";
+  StringList get requiredFeatures native "SVGCircleElement_requiredFeatures_Getter";
 
 
   /** @domName SVGCircleElement.systemLanguage */
-  SVGStringList get systemLanguage native "SVGCircleElement_systemLanguage_Getter";
+  StringList get systemLanguage native "SVGCircleElement_systemLanguage_Getter";
 
 
   /** @domName SVGCircleElement.hasExtension */
@@ -977,7 +997,7 @@
 
 
   /** @domName SVGCircleElement.transform */
-  SVGAnimatedTransformList get transform native "SVGCircleElement_transform_Getter";
+  AnimatedTransformList get transform native "SVGCircleElement_transform_Getter";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -988,16 +1008,18 @@
 
 
 /// @domName SVGClipPathElement
-class SVGClipPathElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired {
-  SVGClipPathElement.internal(): super.internal();
+class ClipPathElement extends SvgElement implements Transformable, Tests, Stylable, ExternalResourcesRequired, LangSpace {
+
+  factory ClipPathElement() => _SvgElementFactoryProvider.createSvgElement_tag("clipPath");
+  ClipPathElement.internal(): super.internal();
 
 
   /** @domName SVGClipPathElement.clipPathUnits */
-  SVGAnimatedEnumeration get clipPathUnits native "SVGClipPathElement_clipPathUnits_Getter";
+  AnimatedEnumeration get clipPathUnits native "SVGClipPathElement_clipPathUnits_Getter";
 
 
   /** @domName SVGClipPathElement.externalResourcesRequired */
-  SVGAnimatedBoolean get externalResourcesRequired native "SVGClipPathElement_externalResourcesRequired_Getter";
+  AnimatedBoolean get externalResourcesRequired native "SVGClipPathElement_externalResourcesRequired_Getter";
 
 
   /** @domName SVGClipPathElement.xmllang */
@@ -1017,31 +1039,31 @@
 
 
   /** @domName SVGClipPathElement.farthestViewportElement */
-  SVGElement get farthestViewportElement native "SVGClipPathElement_farthestViewportElement_Getter";
+  SvgElement get farthestViewportElement native "SVGClipPathElement_farthestViewportElement_Getter";
 
 
   /** @domName SVGClipPathElement.nearestViewportElement */
-  SVGElement get nearestViewportElement native "SVGClipPathElement_nearestViewportElement_Getter";
+  SvgElement get nearestViewportElement native "SVGClipPathElement_nearestViewportElement_Getter";
 
 
   /** @domName SVGClipPathElement.getBBox */
-  SVGRect getBBox() native "SVGClipPathElement_getBBox_Callback";
+  Rect getBBox() native "SVGClipPathElement_getBBox_Callback";
 
 
   /** @domName SVGClipPathElement.getCTM */
-  SVGMatrix getCTM() native "SVGClipPathElement_getCTM_Callback";
+  Matrix getCTM() native "SVGClipPathElement_getCTM_Callback";
 
 
   /** @domName SVGClipPathElement.getScreenCTM */
-  SVGMatrix getScreenCTM() native "SVGClipPathElement_getScreenCTM_Callback";
+  Matrix getScreenCTM() native "SVGClipPathElement_getScreenCTM_Callback";
 
 
   /** @domName SVGClipPathElement.getTransformToElement */
-  SVGMatrix getTransformToElement(SVGElement element) native "SVGClipPathElement_getTransformToElement_Callback";
+  Matrix getTransformToElement(SvgElement element) native "SVGClipPathElement_getTransformToElement_Callback";
 
 
   /** @domName SVGClipPathElement.className */
-  SVGAnimatedString get $dom_svgClassName native "SVGClipPathElement_className_Getter";
+  AnimatedString get $dom_svgClassName native "SVGClipPathElement_className_Getter";
 
 
   /** @domName SVGClipPathElement.style */
@@ -1053,15 +1075,15 @@
 
 
   /** @domName SVGClipPathElement.requiredExtensions */
-  SVGStringList get requiredExtensions native "SVGClipPathElement_requiredExtensions_Getter";
+  StringList get requiredExtensions native "SVGClipPathElement_requiredExtensions_Getter";
 
 
   /** @domName SVGClipPathElement.requiredFeatures */
-  SVGStringList get requiredFeatures native "SVGClipPathElement_requiredFeatures_Getter";
+  StringList get requiredFeatures native "SVGClipPathElement_requiredFeatures_Getter";
 
 
   /** @domName SVGClipPathElement.systemLanguage */
-  SVGStringList get systemLanguage native "SVGClipPathElement_systemLanguage_Getter";
+  StringList get systemLanguage native "SVGClipPathElement_systemLanguage_Getter";
 
 
   /** @domName SVGClipPathElement.hasExtension */
@@ -1069,7 +1091,7 @@
 
 
   /** @domName SVGClipPathElement.transform */
-  SVGAnimatedTransformList get transform native "SVGClipPathElement_transform_Getter";
+  AnimatedTransformList get transform native "SVGClipPathElement_transform_Getter";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1080,8 +1102,8 @@
 
 
 /// @domName SVGColor
-class SVGColor extends CSSValue {
-  SVGColor.internal(): super.internal();
+class Color extends CSSValue {
+  Color.internal(): super.internal();
 
   static const int SVG_COLORTYPE_CURRENTCOLOR = 3;
 
@@ -1120,8 +1142,8 @@
 
 
 /// @domName SVGComponentTransferFunctionElement
-class SVGComponentTransferFunctionElement extends SVGElement {
-  SVGComponentTransferFunctionElement.internal(): super.internal();
+class ComponentTransferFunctionElement extends SvgElement {
+  ComponentTransferFunctionElement.internal(): super.internal();
 
   static const int SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE = 3;
 
@@ -1137,31 +1159,31 @@
 
 
   /** @domName SVGComponentTransferFunctionElement.amplitude */
-  SVGAnimatedNumber get amplitude native "SVGComponentTransferFunctionElement_amplitude_Getter";
+  AnimatedNumber get amplitude native "SVGComponentTransferFunctionElement_amplitude_Getter";
 
 
   /** @domName SVGComponentTransferFunctionElement.exponent */
-  SVGAnimatedNumber get exponent native "SVGComponentTransferFunctionElement_exponent_Getter";
+  AnimatedNumber get exponent native "SVGComponentTransferFunctionElement_exponent_Getter";
 
 
   /** @domName SVGComponentTransferFunctionElement.intercept */
-  SVGAnimatedNumber get intercept native "SVGComponentTransferFunctionElement_intercept_Getter";
+  AnimatedNumber get intercept native "SVGComponentTransferFunctionElement_intercept_Getter";
 
 
   /** @domName SVGComponentTransferFunctionElement.offset */
-  SVGAnimatedNumber get offset native "SVGComponentTransferFunctionElement_offset_Getter";
+  AnimatedNumber get offset native "SVGComponentTransferFunctionElement_offset_Getter";
 
 
   /** @domName SVGComponentTransferFunctionElement.slope */
-  SVGAnimatedNumber get slope native "SVGComponentTransferFunctionElement_slope_Getter";
+  AnimatedNumber get slope native "SVGComponentTransferFunctionElement_slope_Getter";
 
 
   /** @domName SVGComponentTransferFunctionElement.tableValues */
-  SVGAnimatedNumberList get tableValues native "SVGComponentTransferFunctionElement_tableValues_Getter";
+  AnimatedNumberList get tableValues native "SVGComponentTransferFunctionElement_tableValues_Getter";
 
 
   /** @domName SVGComponentTransferFunctionElement.type */
-  SVGAnimatedEnumeration get type native "SVGComponentTransferFunctionElement_type_Getter";
+  AnimatedEnumeration get type native "SVGComponentTransferFunctionElement_type_Getter";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1172,32 +1194,34 @@
 
 
 /// @domName SVGCursorElement
-class SVGCursorElement extends SVGElement implements SVGURIReference, SVGTests, SVGExternalResourcesRequired {
-  SVGCursorElement.internal(): super.internal();
+class CursorElement extends SvgElement implements UriReference, Tests, ExternalResourcesRequired {
+
+  factory CursorElement() => _SvgElementFactoryProvider.createSvgElement_tag("cursor");
+  CursorElement.internal(): super.internal();
 
 
   /** @domName SVGCursorElement.x */
-  SVGAnimatedLength get x native "SVGCursorElement_x_Getter";
+  AnimatedLength get x native "SVGCursorElement_x_Getter";
 
 
   /** @domName SVGCursorElement.y */
-  SVGAnimatedLength get y native "SVGCursorElement_y_Getter";
+  AnimatedLength get y native "SVGCursorElement_y_Getter";
 
 
   /** @domName SVGCursorElement.externalResourcesRequired */
-  SVGAnimatedBoolean get externalResourcesRequired native "SVGCursorElement_externalResourcesRequired_Getter";
+  AnimatedBoolean get externalResourcesRequired native "SVGCursorElement_externalResourcesRequired_Getter";
 
 
   /** @domName SVGCursorElement.requiredExtensions */
-  SVGStringList get requiredExtensions native "SVGCursorElement_requiredExtensions_Getter";
+  StringList get requiredExtensions native "SVGCursorElement_requiredExtensions_Getter";
 
 
   /** @domName SVGCursorElement.requiredFeatures */
-  SVGStringList get requiredFeatures native "SVGCursorElement_requiredFeatures_Getter";
+  StringList get requiredFeatures native "SVGCursorElement_requiredFeatures_Getter";
 
 
   /** @domName SVGCursorElement.systemLanguage */
-  SVGStringList get systemLanguage native "SVGCursorElement_systemLanguage_Getter";
+  StringList get systemLanguage native "SVGCursorElement_systemLanguage_Getter";
 
 
   /** @domName SVGCursorElement.hasExtension */
@@ -1205,7 +1229,7 @@
 
 
   /** @domName SVGCursorElement.href */
-  SVGAnimatedString get href native "SVGCursorElement_href_Getter";
+  AnimatedString get href native "SVGCursorElement_href_Getter";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1216,12 +1240,14 @@
 
 
 /// @domName SVGDefsElement
-class SVGDefsElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired {
-  SVGDefsElement.internal(): super.internal();
+class DefsElement extends SvgElement implements Transformable, Tests, Stylable, ExternalResourcesRequired, LangSpace {
+
+  factory DefsElement() => _SvgElementFactoryProvider.createSvgElement_tag("defs");
+  DefsElement.internal(): super.internal();
 
 
   /** @domName SVGDefsElement.externalResourcesRequired */
-  SVGAnimatedBoolean get externalResourcesRequired native "SVGDefsElement_externalResourcesRequired_Getter";
+  AnimatedBoolean get externalResourcesRequired native "SVGDefsElement_externalResourcesRequired_Getter";
 
 
   /** @domName SVGDefsElement.xmllang */
@@ -1241,31 +1267,31 @@
 
 
   /** @domName SVGDefsElement.farthestViewportElement */
-  SVGElement get farthestViewportElement native "SVGDefsElement_farthestViewportElement_Getter";
+  SvgElement get farthestViewportElement native "SVGDefsElement_farthestViewportElement_Getter";
 
 
   /** @domName SVGDefsElement.nearestViewportElement */
-  SVGElement get nearestViewportElement native "SVGDefsElement_nearestViewportElement_Getter";
+  SvgElement get nearestViewportElement native "SVGDefsElement_nearestViewportElement_Getter";
 
 
   /** @domName SVGDefsElement.getBBox */
-  SVGRect getBBox() native "SVGDefsElement_getBBox_Callback";
+  Rect getBBox() native "SVGDefsElement_getBBox_Callback";
 
 
   /** @domName SVGDefsElement.getCTM */
-  SVGMatrix getCTM() native "SVGDefsElement_getCTM_Callback";
+  Matrix getCTM() native "SVGDefsElement_getCTM_Callback";
 
 
   /** @domName SVGDefsElement.getScreenCTM */
-  SVGMatrix getScreenCTM() native "SVGDefsElement_getScreenCTM_Callback";
+  Matrix getScreenCTM() native "SVGDefsElement_getScreenCTM_Callback";
 
 
   /** @domName SVGDefsElement.getTransformToElement */
-  SVGMatrix getTransformToElement(SVGElement element) native "SVGDefsElement_getTransformToElement_Callback";
+  Matrix getTransformToElement(SvgElement element) native "SVGDefsElement_getTransformToElement_Callback";
 
 
   /** @domName SVGDefsElement.className */
-  SVGAnimatedString get $dom_svgClassName native "SVGDefsElement_className_Getter";
+  AnimatedString get $dom_svgClassName native "SVGDefsElement_className_Getter";
 
 
   /** @domName SVGDefsElement.style */
@@ -1277,15 +1303,15 @@
 
 
   /** @domName SVGDefsElement.requiredExtensions */
-  SVGStringList get requiredExtensions native "SVGDefsElement_requiredExtensions_Getter";
+  StringList get requiredExtensions native "SVGDefsElement_requiredExtensions_Getter";
 
 
   /** @domName SVGDefsElement.requiredFeatures */
-  SVGStringList get requiredFeatures native "SVGDefsElement_requiredFeatures_Getter";
+  StringList get requiredFeatures native "SVGDefsElement_requiredFeatures_Getter";
 
 
   /** @domName SVGDefsElement.systemLanguage */
-  SVGStringList get systemLanguage native "SVGDefsElement_systemLanguage_Getter";
+  StringList get systemLanguage native "SVGDefsElement_systemLanguage_Getter";
 
 
   /** @domName SVGDefsElement.hasExtension */
@@ -1293,7 +1319,7 @@
 
 
   /** @domName SVGDefsElement.transform */
-  SVGAnimatedTransformList get transform native "SVGDefsElement_transform_Getter";
+  AnimatedTransformList get transform native "SVGDefsElement_transform_Getter";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1304,8 +1330,10 @@
 
 
 /// @domName SVGDescElement
-class SVGDescElement extends SVGElement implements SVGLangSpace, SVGStylable {
-  SVGDescElement.internal(): super.internal();
+class DescElement extends SvgElement implements Stylable, LangSpace {
+
+  factory DescElement() => _SvgElementFactoryProvider.createSvgElement_tag("desc");
+  DescElement.internal(): super.internal();
 
 
   /** @domName SVGDescElement.xmllang */
@@ -1325,7 +1353,7 @@
 
 
   /** @domName SVGDescElement.className */
-  SVGAnimatedString get $dom_svgClassName native "SVGDescElement_className_Getter";
+  AnimatedString get $dom_svgClassName native "SVGDescElement_className_Getter";
 
 
   /** @domName SVGDescElement.style */
@@ -1343,175 +1371,50 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGDocument
-class SVGDocument extends Document {
-  SVGDocument.internal(): super.internal();
-
-
-  /** @domName SVGDocument.rootElement */
-  SVGSVGElement get rootElement native "SVGDocument_rootElement_Getter";
-
-
-  /** @domName SVGDocument.createEvent */
-  Event $dom_createEvent(String eventType) native "SVGDocument_createEvent_Callback";
-
-}
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-class _AttributeClassSet extends CssClassSet {
-  final Element _element;
-
-  _AttributeClassSet(this._element);
-
-  Set<String> readClasses() {
-    var classname = _element.attributes['class'];
-
-    Set<String> s = new Set<String>();
-    if (classname == null) {
-      return s;
-    }
-    for (String name in classname.split(' ')) {
-      String trimmed = name.trim();
-      if (!trimmed.isEmpty) {
-        s.add(trimmed);
-      }
-    }
-    return s;
-  }
-
-  void writeClasses(Set s) {
-    List list = new List.from(s);
-    _element.attributes['class'] = Strings.join(list, ' ');
-  }
-}
-
-class SVGElement extends Element {
-  factory SVGElement.tag(String tag) =>
-      _SVGElementFactoryProvider.createSVGElement_tag(tag);
-  factory SVGElement.svg(String svg) =>
-      _SVGElementFactoryProvider.createSVGElement_svg(svg);
-
-  _AttributeClassSet _cssClassSet;
-  CssClassSet get classes {
-    if (_cssClassSet == null) {
-      _cssClassSet = new _AttributeClassSet(this);
-    }
-    return _cssClassSet;
-  }
-
-  List<Element> get elements => new FilteredElementList(this);
-
-  void set elements(Collection<Element> value) {
-    final elements = this.elements;
-    elements.clear();
-    elements.addAll(value);
-  }
-
-  String get outerHTML {
-    final container = new Element.tag("div");
-    final SVGElement cloned = this.clone(true);
-    container.elements.add(cloned);
-    return container.innerHTML;
-  }
-
-  String get innerHTML {
-    final container = new Element.tag("div");
-    final SVGElement cloned = this.clone(true);
-    container.elements.addAll(cloned.elements);
-    return container.innerHTML;
-  }
-
-  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>';
-    this.elements = container.elements[0].elements;
-  }
-
-  SVGElement.internal(): super.internal();
-
-
-  /** @domName SVGElement.id */
-  String get id native "SVGElement_id_Getter";
-
-
-  /** @domName SVGElement.id */
-  void set id(String value) native "SVGElement_id_Setter";
-
-
-  /** @domName SVGElement.ownerSVGElement */
-  SVGSVGElement get ownerSVGElement native "SVGElement_ownerSVGElement_Getter";
-
-
-  /** @domName SVGElement.viewportElement */
-  SVGElement get viewportElement native "SVGElement_viewportElement_Getter";
-
-
-  /** @domName SVGElement.xmlbase */
-  String get xmlbase native "SVGElement_xmlbase_Getter";
-
-
-  /** @domName SVGElement.xmlbase */
-  void set xmlbase(String value) native "SVGElement_xmlbase_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 SVGElementInstance
-class SVGElementInstance extends EventTarget {
-  SVGElementInstance.internal(): super.internal();
+class ElementInstance extends EventTarget {
+  ElementInstance.internal(): super.internal();
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
-  SVGElementInstanceEvents get on =>
-    new SVGElementInstanceEvents(this);
+  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
+  ElementInstanceEvents get on =>
+    new ElementInstanceEvents(this);
 
 
   /** @domName SVGElementInstance.childNodes */
-  List<SVGElementInstance> get childNodes native "SVGElementInstance_childNodes_Getter";
+  List<ElementInstance> get childNodes native "SVGElementInstance_childNodes_Getter";
 
 
   /** @domName SVGElementInstance.correspondingElement */
-  SVGElement get correspondingElement native "SVGElementInstance_correspondingElement_Getter";
+  SvgElement get correspondingElement native "SVGElementInstance_correspondingElement_Getter";
 
 
   /** @domName SVGElementInstance.correspondingUseElement */
-  SVGUseElement get correspondingUseElement native "SVGElementInstance_correspondingUseElement_Getter";
+  UseElement get correspondingUseElement native "SVGElementInstance_correspondingUseElement_Getter";
 
 
   /** @domName SVGElementInstance.firstChild */
-  SVGElementInstance get firstChild native "SVGElementInstance_firstChild_Getter";
+  ElementInstance get firstChild native "SVGElementInstance_firstChild_Getter";
 
 
   /** @domName SVGElementInstance.lastChild */
-  SVGElementInstance get lastChild native "SVGElementInstance_lastChild_Getter";
+  ElementInstance get lastChild native "SVGElementInstance_lastChild_Getter";
 
 
   /** @domName SVGElementInstance.nextSibling */
-  SVGElementInstance get nextSibling native "SVGElementInstance_nextSibling_Getter";
+  ElementInstance get nextSibling native "SVGElementInstance_nextSibling_Getter";
 
 
   /** @domName SVGElementInstance.parentNode */
-  SVGElementInstance get parentNode native "SVGElementInstance_parentNode_Getter";
+  ElementInstance get parentNode native "SVGElementInstance_parentNode_Getter";
 
 
   /** @domName SVGElementInstance.previousSibling */
-  SVGElementInstance get previousSibling native "SVGElementInstance_previousSibling_Getter";
+  ElementInstance get previousSibling native "SVGElementInstance_previousSibling_Getter";
 
 }
 
-class SVGElementInstanceEvents extends Events {
-  SVGElementInstanceEvents(EventTarget _ptr) : super(_ptr);
+class ElementInstanceEvents extends Events {
+  ElementInstanceEvents(EventTarget _ptr) : super(_ptr);
 
   EventListenerList get abort => this['abort'];
 
@@ -1601,28 +1504,30 @@
 
 
 /// @domName SVGEllipseElement
-class SVGEllipseElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired {
-  SVGEllipseElement.internal(): super.internal();
+class EllipseElement extends SvgElement implements Transformable, Tests, Stylable, ExternalResourcesRequired, LangSpace {
+
+  factory EllipseElement() => _SvgElementFactoryProvider.createSvgElement_tag("ellipse");
+  EllipseElement.internal(): super.internal();
 
 
   /** @domName SVGEllipseElement.cx */
-  SVGAnimatedLength get cx native "SVGEllipseElement_cx_Getter";
+  AnimatedLength get cx native "SVGEllipseElement_cx_Getter";
 
 
   /** @domName SVGEllipseElement.cy */
-  SVGAnimatedLength get cy native "SVGEllipseElement_cy_Getter";
+  AnimatedLength get cy native "SVGEllipseElement_cy_Getter";
 
 
   /** @domName SVGEllipseElement.rx */
-  SVGAnimatedLength get rx native "SVGEllipseElement_rx_Getter";
+  AnimatedLength get rx native "SVGEllipseElement_rx_Getter";
 
 
   /** @domName SVGEllipseElement.ry */
-  SVGAnimatedLength get ry native "SVGEllipseElement_ry_Getter";
+  AnimatedLength get ry native "SVGEllipseElement_ry_Getter";
 
 
   /** @domName SVGEllipseElement.externalResourcesRequired */
-  SVGAnimatedBoolean get externalResourcesRequired native "SVGEllipseElement_externalResourcesRequired_Getter";
+  AnimatedBoolean get externalResourcesRequired native "SVGEllipseElement_externalResourcesRequired_Getter";
 
 
   /** @domName SVGEllipseElement.xmllang */
@@ -1642,31 +1547,31 @@
 
 
   /** @domName SVGEllipseElement.farthestViewportElement */
-  SVGElement get farthestViewportElement native "SVGEllipseElement_farthestViewportElement_Getter";
+  SvgElement get farthestViewportElement native "SVGEllipseElement_farthestViewportElement_Getter";
 
 
   /** @domName SVGEllipseElement.nearestViewportElement */
-  SVGElement get nearestViewportElement native "SVGEllipseElement_nearestViewportElement_Getter";
+  SvgElement get nearestViewportElement native "SVGEllipseElement_nearestViewportElement_Getter";
 
 
   /** @domName SVGEllipseElement.getBBox */
-  SVGRect getBBox() native "SVGEllipseElement_getBBox_Callback";
+  Rect getBBox() native "SVGEllipseElement_getBBox_Callback";
 
 
   /** @domName SVGEllipseElement.getCTM */
-  SVGMatrix getCTM() native "SVGEllipseElement_getCTM_Callback";
+  Matrix getCTM() native "SVGEllipseElement_getCTM_Callback";
 
 
   /** @domName SVGEllipseElement.getScreenCTM */
-  SVGMatrix getScreenCTM() native "SVGEllipseElement_getScreenCTM_Callback";
+  Matrix getScreenCTM() native "SVGEllipseElement_getScreenCTM_Callback";
 
 
   /** @domName SVGEllipseElement.getTransformToElement */
-  SVGMatrix getTransformToElement(SVGElement element) native "SVGEllipseElement_getTransformToElement_Callback";
+  Matrix getTransformToElement(SvgElement element) native "SVGEllipseElement_getTransformToElement_Callback";
 
 
   /** @domName SVGEllipseElement.className */
-  SVGAnimatedString get $dom_svgClassName native "SVGEllipseElement_className_Getter";
+  AnimatedString get $dom_svgClassName native "SVGEllipseElement_className_Getter";
 
 
   /** @domName SVGEllipseElement.style */
@@ -1678,15 +1583,15 @@
 
 
   /** @domName SVGEllipseElement.requiredExtensions */
-  SVGStringList get requiredExtensions native "SVGEllipseElement_requiredExtensions_Getter";
+  StringList get requiredExtensions native "SVGEllipseElement_requiredExtensions_Getter";
 
 
   /** @domName SVGEllipseElement.requiredFeatures */
-  SVGStringList get requiredFeatures native "SVGEllipseElement_requiredFeatures_Getter";
+  StringList get requiredFeatures native "SVGEllipseElement_requiredFeatures_Getter";
 
 
   /** @domName SVGEllipseElement.systemLanguage */
-  SVGStringList get systemLanguage native "SVGEllipseElement_systemLanguage_Getter";
+  StringList get systemLanguage native "SVGEllipseElement_systemLanguage_Getter";
 
 
   /** @domName SVGEllipseElement.hasExtension */
@@ -1694,7 +1599,7 @@
 
 
   /** @domName SVGEllipseElement.transform */
-  SVGAnimatedTransformList get transform native "SVGEllipseElement_transform_Getter";
+  AnimatedTransformList get transform native "SVGEllipseElement_transform_Getter";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1705,8 +1610,8 @@
 
 
 /// @domName SVGException
-class SVGException extends NativeFieldWrapperClass1 {
-  SVGException.internal();
+class Exception extends NativeFieldWrapperClass1 {
+  Exception.internal();
 
   static const int SVG_INVALID_VALUE_ERR = 1;
 
@@ -1739,12 +1644,12 @@
 
 
 /// @domName SVGExternalResourcesRequired
-class SVGExternalResourcesRequired extends NativeFieldWrapperClass1 {
-  SVGExternalResourcesRequired.internal();
+class ExternalResourcesRequired extends NativeFieldWrapperClass1 {
+  ExternalResourcesRequired.internal();
 
 
   /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
-  SVGAnimatedBoolean get externalResourcesRequired native "SVGExternalResourcesRequired_externalResourcesRequired_Getter";
+  AnimatedBoolean get externalResourcesRequired native "SVGExternalResourcesRequired_externalResourcesRequired_Getter";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1755,8 +1660,8 @@
 
 
 /// @domName SVGFEBlendElement
-class SVGFEBlendElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes {
-  SVGFEBlendElement.internal(): super.internal();
+class FEBlendElement extends SvgElement implements FilterPrimitiveStandardAttributes {
+  FEBlendElement.internal(): super.internal();
 
   static const int SVG_FEBLEND_MODE_DARKEN = 4;
 
@@ -1772,39 +1677,39 @@
 
 
   /** @domName SVGFEBlendElement.in1 */
-  SVGAnimatedString get in1 native "SVGFEBlendElement_in1_Getter";
+  AnimatedString get in1 native "SVGFEBlendElement_in1_Getter";
 
 
   /** @domName SVGFEBlendElement.in2 */
-  SVGAnimatedString get in2 native "SVGFEBlendElement_in2_Getter";
+  AnimatedString get in2 native "SVGFEBlendElement_in2_Getter";
 
 
   /** @domName SVGFEBlendElement.mode */
-  SVGAnimatedEnumeration get mode native "SVGFEBlendElement_mode_Getter";
+  AnimatedEnumeration get mode native "SVGFEBlendElement_mode_Getter";
 
 
   /** @domName SVGFEBlendElement.height */
-  SVGAnimatedLength get height native "SVGFEBlendElement_height_Getter";
+  AnimatedLength get height native "SVGFEBlendElement_height_Getter";
 
 
   /** @domName SVGFEBlendElement.result */
-  SVGAnimatedString get result native "SVGFEBlendElement_result_Getter";
+  AnimatedString get result native "SVGFEBlendElement_result_Getter";
 
 
   /** @domName SVGFEBlendElement.width */
-  SVGAnimatedLength get width native "SVGFEBlendElement_width_Getter";
+  AnimatedLength get width native "SVGFEBlendElement_width_Getter";
 
 
   /** @domName SVGFEBlendElement.x */
-  SVGAnimatedLength get x native "SVGFEBlendElement_x_Getter";
+  AnimatedLength get x native "SVGFEBlendElement_x_Getter";
 
 
   /** @domName SVGFEBlendElement.y */
-  SVGAnimatedLength get y native "SVGFEBlendElement_y_Getter";
+  AnimatedLength get y native "SVGFEBlendElement_y_Getter";
 
 
   /** @domName SVGFEBlendElement.className */
-  SVGAnimatedString get $dom_svgClassName native "SVGFEBlendElement_className_Getter";
+  AnimatedString get $dom_svgClassName native "SVGFEBlendElement_className_Getter";
 
 
   /** @domName SVGFEBlendElement.style */
@@ -1823,8 +1728,8 @@
 
 
 /// @domName SVGFEColorMatrixElement
-class SVGFEColorMatrixElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes {
-  SVGFEColorMatrixElement.internal(): super.internal();
+class FEColorMatrixElement extends SvgElement implements FilterPrimitiveStandardAttributes {
+  FEColorMatrixElement.internal(): super.internal();
 
   static const int SVG_FECOLORMATRIX_TYPE_HUEROTATE = 3;
 
@@ -1838,39 +1743,39 @@
 
 
   /** @domName SVGFEColorMatrixElement.in1 */
-  SVGAnimatedString get in1 native "SVGFEColorMatrixElement_in1_Getter";
+  AnimatedString get in1 native "SVGFEColorMatrixElement_in1_Getter";
 
 
   /** @domName SVGFEColorMatrixElement.type */
-  SVGAnimatedEnumeration get type native "SVGFEColorMatrixElement_type_Getter";
+  AnimatedEnumeration get type native "SVGFEColorMatrixElement_type_Getter";
 
 
   /** @domName SVGFEColorMatrixElement.values */
-  SVGAnimatedNumberList get values native "SVGFEColorMatrixElement_values_Getter";
+  AnimatedNumberList get values native "SVGFEColorMatrixElement_values_Getter";
 
 
   /** @domName SVGFEColorMatrixElement.height */
-  SVGAnimatedLength get height native "SVGFEColorMatrixElement_height_Getter";
+  AnimatedLength get height native "SVGFEColorMatrixElement_height_Getter";
 
 
   /** @domName SVGFEColorMatrixElement.result */
-  SVGAnimatedString get result native "SVGFEColorMatrixElement_result_Getter";
+  AnimatedString get result native "SVGFEColorMatrixElement_result_Getter";
 
 
   /** @domName SVGFEColorMatrixElement.width */
-  SVGAnimatedLength get width native "SVGFEColorMatrixElement_width_Getter";
+  AnimatedLength get width native "SVGFEColorMatrixElement_width_Getter";
 
 
   /** @domName SVGFEColorMatrixElement.x */
-  SVGAnimatedLength get x native "SVGFEColorMatrixElement_x_Getter";
+  AnimatedLength get x native "SVGFEColorMatrixElement_x_Getter";
 
 
   /** @domName SVGFEColorMatrixElement.y */
-  SVGAnimatedLength get y native "SVGFEColorMatrixElement_y_Getter";
+  AnimatedLength get y native "SVGFEColorMatrixElement_y_Getter";
 
 
   /** @domName SVGFEColorMatrixElement.className */
-  SVGAnimatedString get $dom_svgClassName native "SVGFEColorMatrixElement_className_Getter";
+  AnimatedString get $dom_svgClassName native "SVGFEColorMatrixElement_className_Getter";
 
 
   /** @domName SVGFEColorMatrixElement.style */
@@ -1889,36 +1794,36 @@
 
 
 /// @domName SVGFEComponentTransferElement
-class SVGFEComponentTransferElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes {
-  SVGFEComponentTransferElement.internal(): super.internal();
+class FEComponentTransferElement extends SvgElement implements FilterPrimitiveStandardAttributes {
+  FEComponentTransferElement.internal(): super.internal();
 
 
   /** @domName SVGFEComponentTransferElement.in1 */
-  SVGAnimatedString get in1 native "SVGFEComponentTransferElement_in1_Getter";
+  AnimatedString get in1 native "SVGFEComponentTransferElement_in1_Getter";
 
 
   /** @domName SVGFEComponentTransferElement.height */
-  SVGAnimatedLength get height native "SVGFEComponentTransferElement_height_Getter";
+  AnimatedLength get height native "SVGFEComponentTransferElement_height_Getter";
 
 
   /** @domName SVGFEComponentTransferElement.result */
-  SVGAnimatedString get result native "SVGFEComponentTransferElement_result_Getter";
+  AnimatedString get result native "SVGFEComponentTransferElement_result_Getter";
 
 
   /** @domName SVGFEComponentTransferElement.width */
-  SVGAnimatedLength get width native "SVGFEComponentTransferElement_width_Getter";
+  AnimatedLength get width native "SVGFEComponentTransferElement_width_Getter";
 
 
   /** @domName SVGFEComponentTransferElement.x */
-  SVGAnimatedLength get x native "SVGFEComponentTransferElement_x_Getter";
+  AnimatedLength get x native "SVGFEComponentTransferElement_x_Getter";
 
 
   /** @domName SVGFEComponentTransferElement.y */
-  SVGAnimatedLength get y native "SVGFEComponentTransferElement_y_Getter";
+  AnimatedLength get y native "SVGFEComponentTransferElement_y_Getter";
 
 
   /** @domName SVGFEComponentTransferElement.className */
-  SVGAnimatedString get $dom_svgClassName native "SVGFEComponentTransferElement_className_Getter";
+  AnimatedString get $dom_svgClassName native "SVGFEComponentTransferElement_className_Getter";
 
 
   /** @domName SVGFEComponentTransferElement.style */
@@ -1937,8 +1842,8 @@
 
 
 /// @domName SVGFECompositeElement
-class SVGFECompositeElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes {
-  SVGFECompositeElement.internal(): super.internal();
+class FECompositeElement extends SvgElement implements FilterPrimitiveStandardAttributes {
+  FECompositeElement.internal(): super.internal();
 
   static const int SVG_FECOMPOSITE_OPERATOR_ARITHMETIC = 6;
 
@@ -1956,55 +1861,55 @@
 
 
   /** @domName SVGFECompositeElement.in1 */
-  SVGAnimatedString get in1 native "SVGFECompositeElement_in1_Getter";
+  AnimatedString get in1 native "SVGFECompositeElement_in1_Getter";
 
 
   /** @domName SVGFECompositeElement.in2 */
-  SVGAnimatedString get in2 native "SVGFECompositeElement_in2_Getter";
+  AnimatedString get in2 native "SVGFECompositeElement_in2_Getter";
 
 
   /** @domName SVGFECompositeElement.k1 */
-  SVGAnimatedNumber get k1 native "SVGFECompositeElement_k1_Getter";
+  AnimatedNumber get k1 native "SVGFECompositeElement_k1_Getter";
 
 
   /** @domName SVGFECompositeElement.k2 */
-  SVGAnimatedNumber get k2 native "SVGFECompositeElement_k2_Getter";
+  AnimatedNumber get k2 native "SVGFECompositeElement_k2_Getter";
 
 
   /** @domName SVGFECompositeElement.k3 */
-  SVGAnimatedNumber get k3 native "SVGFECompositeElement_k3_Getter";
+  AnimatedNumber get k3 native "SVGFECompositeElement_k3_Getter";
 
 
   /** @domName SVGFECompositeElement.k4 */
-  SVGAnimatedNumber get k4 native "SVGFECompositeElement_k4_Getter";
+  AnimatedNumber get k4 native "SVGFECompositeElement_k4_Getter";
 
 
   /** @domName SVGFECompositeElement.operator */
-  SVGAnimatedEnumeration get operator native "SVGFECompositeElement_operator_Getter";
+  AnimatedEnumeration get operator native "SVGFECompositeElement_operator_Getter";
 
 
   /** @domName SVGFECompositeElement.height */
-  SVGAnimatedLength get height native "SVGFECompositeElement_height_Getter";
+  AnimatedLength get height native "SVGFECompositeElement_height_Getter";
 
 
   /** @domName SVGFECompositeElement.result */
-  SVGAnimatedString get result native "SVGFECompositeElement_result_Getter";
+  AnimatedString get result native "SVGFECompositeElement_result_Getter";
 
 
   /** @domName SVGFECompositeElement.width */
-  SVGAnimatedLength get width native "SVGFECompositeElement_width_Getter";
+  AnimatedLength get width native "SVGFECompositeElement_width_Getter";
 
 
   /** @domName SVGFECompositeElement.x */
-  SVGAnimatedLength get x native "SVGFECompositeElement_x_Getter";
+  AnimatedLength get x native "SVGFECompositeElement_x_Getter";
 
 
   /** @domName SVGFECompositeElement.y */
-  SVGAnimatedLength get y native "SVGFECompositeElement_y_Getter";
+  AnimatedLength get y native "SVGFECompositeElement_y_Getter";
 
 
   /** @domName SVGFECompositeElement.className */
-  SVGAnimatedString get $dom_svgClassName native "SVGFECompositeElement_className_Getter";
+  AnimatedString get $dom_svgClassName native "SVGFECompositeElement_className_Getter";
 
 
   /** @domName SVGFECompositeElement.style */
@@ -2023,8 +1928,8 @@
 
 
 /// @domName SVGFEConvolveMatrixElement
-class SVGFEConvolveMatrixElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes {
-  SVGFEConvolveMatrixElement.internal(): super.internal();
+class FEConvolveMatrixElement extends SvgElement implements FilterPrimitiveStandardAttributes {
+  FEConvolveMatrixElement.internal(): super.internal();
 
   static const int SVG_EDGEMODE_DUPLICATE = 1;
 
@@ -2036,75 +1941,75 @@
 
 
   /** @domName SVGFEConvolveMatrixElement.bias */
-  SVGAnimatedNumber get bias native "SVGFEConvolveMatrixElement_bias_Getter";
+  AnimatedNumber get bias native "SVGFEConvolveMatrixElement_bias_Getter";
 
 
   /** @domName SVGFEConvolveMatrixElement.divisor */
-  SVGAnimatedNumber get divisor native "SVGFEConvolveMatrixElement_divisor_Getter";
+  AnimatedNumber get divisor native "SVGFEConvolveMatrixElement_divisor_Getter";
 
 
   /** @domName SVGFEConvolveMatrixElement.edgeMode */
-  SVGAnimatedEnumeration get edgeMode native "SVGFEConvolveMatrixElement_edgeMode_Getter";
+  AnimatedEnumeration get edgeMode native "SVGFEConvolveMatrixElement_edgeMode_Getter";
 
 
   /** @domName SVGFEConvolveMatrixElement.in1 */
-  SVGAnimatedString get in1 native "SVGFEConvolveMatrixElement_in1_Getter";
+  AnimatedString get in1 native "SVGFEConvolveMatrixElement_in1_Getter";
 
 
   /** @domName SVGFEConvolveMatrixElement.kernelMatrix */
-  SVGAnimatedNumberList get kernelMatrix native "SVGFEConvolveMatrixElement_kernelMatrix_Getter";
+  AnimatedNumberList get kernelMatrix native "SVGFEConvolveMatrixElement_kernelMatrix_Getter";
 
 
   /** @domName SVGFEConvolveMatrixElement.kernelUnitLengthX */
-  SVGAnimatedNumber get kernelUnitLengthX native "SVGFEConvolveMatrixElement_kernelUnitLengthX_Getter";
+  AnimatedNumber get kernelUnitLengthX native "SVGFEConvolveMatrixElement_kernelUnitLengthX_Getter";
 
 
   /** @domName SVGFEConvolveMatrixElement.kernelUnitLengthY */
-  SVGAnimatedNumber get kernelUnitLengthY native "SVGFEConvolveMatrixElement_kernelUnitLengthY_Getter";
+  AnimatedNumber get kernelUnitLengthY native "SVGFEConvolveMatrixElement_kernelUnitLengthY_Getter";
 
 
   /** @domName SVGFEConvolveMatrixElement.orderX */
-  SVGAnimatedInteger get orderX native "SVGFEConvolveMatrixElement_orderX_Getter";
+  AnimatedInteger get orderX native "SVGFEConvolveMatrixElement_orderX_Getter";
 
 
   /** @domName SVGFEConvolveMatrixElement.orderY */
-  SVGAnimatedInteger get orderY native "SVGFEConvolveMatrixElement_orderY_Getter";
+  AnimatedInteger get orderY native "SVGFEConvolveMatrixElement_orderY_Getter";
 
 
   /** @domName SVGFEConvolveMatrixElement.preserveAlpha */
-  SVGAnimatedBoolean get preserveAlpha native "SVGFEConvolveMatrixElement_preserveAlpha_Getter";
+  AnimatedBoolean get preserveAlpha native "SVGFEConvolveMatrixElement_preserveAlpha_Getter";
 
 
   /** @domName SVGFEConvolveMatrixElement.targetX */
-  SVGAnimatedInteger get targetX native "SVGFEConvolveMatrixElement_targetX_Getter";
+  AnimatedInteger get targetX native "SVGFEConvolveMatrixElement_targetX_Getter";
 
 
   /** @domName SVGFEConvolveMatrixElement.targetY */
-  SVGAnimatedInteger get targetY native "SVGFEConvolveMatrixElement_targetY_Getter";
+  AnimatedInteger get targetY native "SVGFEConvolveMatrixElement_targetY_Getter";
 
 
   /** @domName SVGFEConvolveMatrixElement.height */
-  SVGAnimatedLength get height native "SVGFEConvolveMatrixElement_height_Getter";
+  AnimatedLength get height native "SVGFEConvolveMatrixElement_height_Getter";
 
 
   /** @domName SVGFEConvolveMatrixElement.result */
-  SVGAnimatedString get result native "SVGFEConvolveMatrixElement_result_Getter";
+  AnimatedString get result native "SVGFEConvolveMatrixElement_result_Getter";
 
 
   /** @domName SVGFEConvolveMatrixElement.width */
-  SVGAnimatedLength get width native "SVGFEConvolveMatrixElement_width_Getter";
+  AnimatedLength get width native "SVGFEConvolveMatrixElement_width_Getter";
 
 
   /** @domName SVGFEConvolveMatrixElement.x */
-  SVGAnimatedLength get x native "SVGFEConvolveMatrixElement_x_Getter";
+  AnimatedLength get x native "SVGFEConvolveMatrixElement_x_Getter";
 
 
   /** @domName SVGFEConvolveMatrixElement.y */
-  SVGAnimatedLength get y native "SVGFEConvolveMatrixElement_y_Getter";
+  AnimatedLength get y native "SVGFEConvolveMatrixElement_y_Getter";
 
 
   /** @domName SVGFEConvolveMatrixElement.className */
-  SVGAnimatedString get $dom_svgClassName native "SVGFEConvolveMatrixElement_className_Getter";
+  AnimatedString get $dom_svgClassName native "SVGFEConvolveMatrixElement_className_Getter";
 
 
   /** @domName SVGFEConvolveMatrixElement.style */
@@ -2123,52 +2028,52 @@
 
 
 /// @domName SVGFEDiffuseLightingElement
-class SVGFEDiffuseLightingElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes {
-  SVGFEDiffuseLightingElement.internal(): super.internal();
+class FEDiffuseLightingElement extends SvgElement implements FilterPrimitiveStandardAttributes {
+  FEDiffuseLightingElement.internal(): super.internal();
 
 
   /** @domName SVGFEDiffuseLightingElement.diffuseConstant */
-  SVGAnimatedNumber get diffuseConstant native "SVGFEDiffuseLightingElement_diffuseConstant_Getter";
+  AnimatedNumber get diffuseConstant native "SVGFEDiffuseLightingElement_diffuseConstant_Getter";
 
 
   /** @domName SVGFEDiffuseLightingElement.in1 */
-  SVGAnimatedString get in1 native "SVGFEDiffuseLightingElement_in1_Getter";
+  AnimatedString get in1 native "SVGFEDiffuseLightingElement_in1_Getter";
 
 
   /** @domName SVGFEDiffuseLightingElement.kernelUnitLengthX */
-  SVGAnimatedNumber get kernelUnitLengthX native "SVGFEDiffuseLightingElement_kernelUnitLengthX_Getter";
+  AnimatedNumber get kernelUnitLengthX native "SVGFEDiffuseLightingElement_kernelUnitLengthX_Getter";
 
 
   /** @domName SVGFEDiffuseLightingElement.kernelUnitLengthY */
-  SVGAnimatedNumber get kernelUnitLengthY native "SVGFEDiffuseLightingElement_kernelUnitLengthY_Getter";
+  AnimatedNumber get kernelUnitLengthY native "SVGFEDiffuseLightingElement_kernelUnitLengthY_Getter";
 
 
   /** @domName SVGFEDiffuseLightingElement.surfaceScale */
-  SVGAnimatedNumber get surfaceScale native "SVGFEDiffuseLightingElement_surfaceScale_Getter";
+  AnimatedNumber get surfaceScale native "SVGFEDiffuseLightingElement_surfaceScale_Getter";
 
 
   /** @domName SVGFEDiffuseLightingElement.height */
-  SVGAnimatedLength get height native "SVGFEDiffuseLightingElement_height_Getter";
+  AnimatedLength get height native "SVGFEDiffuseLightingElement_height_Getter";
 
 
   /** @domName SVGFEDiffuseLightingElement.result */
-  SVGAnimatedString get result native "SVGFEDiffuseLightingElement_result_Getter";
+  AnimatedString get result native "SVGFEDiffuseLightingElement_result_Getter";
 
 
   /** @domName SVGFEDiffuseLightingElement.width */
-  SVGAnimatedLength get width native "SVGFEDiffuseLightingElement_width_Getter";
+  AnimatedLength get width native "SVGFEDiffuseLightingElement_width_Getter";
 
 
   /** @domName SVGFEDiffuseLightingElement.x */
-  SVGAnimatedLength get x native "SVGFEDiffuseLightingElement_x_Getter";
+  AnimatedLength get x native "SVGFEDiffuseLightingElement_x_Getter";
 
 
   /** @domName SVGFEDiffuseLightingElement.y */
-  SVGAnimatedLength get y native "SVGFEDiffuseLightingElement_y_Getter";
+  AnimatedLength get y native "SVGFEDiffuseLightingElement_y_Getter";
 
 
   /** @domName SVGFEDiffuseLightingElement.className */
-  SVGAnimatedString get $dom_svgClassName native "SVGFEDiffuseLightingElement_className_Getter";
+  AnimatedString get $dom_svgClassName native "SVGFEDiffuseLightingElement_className_Getter";
 
 
   /** @domName SVGFEDiffuseLightingElement.style */
@@ -2187,8 +2092,8 @@
 
 
 /// @domName SVGFEDisplacementMapElement
-class SVGFEDisplacementMapElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes {
-  SVGFEDisplacementMapElement.internal(): super.internal();
+class FEDisplacementMapElement extends SvgElement implements FilterPrimitiveStandardAttributes {
+  FEDisplacementMapElement.internal(): super.internal();
 
   static const int SVG_CHANNEL_A = 4;
 
@@ -2202,47 +2107,47 @@
 
 
   /** @domName SVGFEDisplacementMapElement.in1 */
-  SVGAnimatedString get in1 native "SVGFEDisplacementMapElement_in1_Getter";
+  AnimatedString get in1 native "SVGFEDisplacementMapElement_in1_Getter";
 
 
   /** @domName SVGFEDisplacementMapElement.in2 */
-  SVGAnimatedString get in2 native "SVGFEDisplacementMapElement_in2_Getter";
+  AnimatedString get in2 native "SVGFEDisplacementMapElement_in2_Getter";
 
 
   /** @domName SVGFEDisplacementMapElement.scale */
-  SVGAnimatedNumber get scale native "SVGFEDisplacementMapElement_scale_Getter";
+  AnimatedNumber get scale native "SVGFEDisplacementMapElement_scale_Getter";
 
 
   /** @domName SVGFEDisplacementMapElement.xChannelSelector */
-  SVGAnimatedEnumeration get xChannelSelector native "SVGFEDisplacementMapElement_xChannelSelector_Getter";
+  AnimatedEnumeration get xChannelSelector native "SVGFEDisplacementMapElement_xChannelSelector_Getter";
 
 
   /** @domName SVGFEDisplacementMapElement.yChannelSelector */
-  SVGAnimatedEnumeration get yChannelSelector native "SVGFEDisplacementMapElement_yChannelSelector_Getter";
+  AnimatedEnumeration get yChannelSelector native "SVGFEDisplacementMapElement_yChannelSelector_Getter";
 
 
   /** @domName SVGFEDisplacementMapElement.height */
-  SVGAnimatedLength get height native "SVGFEDisplacementMapElement_height_Getter";
+  AnimatedLength get height native "SVGFEDisplacementMapElement_height_Getter";
 
 
   /** @domName SVGFEDisplacementMapElement.result */
-  SVGAnimatedString get result native "SVGFEDisplacementMapElement_result_Getter";
+  AnimatedString get result native "SVGFEDisplacementMapElement_result_Getter";
 
 
   /** @domName SVGFEDisplacementMapElement.width */
-  SVGAnimatedLength get width native "SVGFEDisplacementMapElement_width_Getter";
+  AnimatedLength get width native "SVGFEDisplacementMapElement_width_Getter";
 
 
   /** @domName SVGFEDisplacementMapElement.x */
-  SVGAnimatedLength get x native "SVGFEDisplacementMapElement_x_Getter";
+  AnimatedLength get x native "SVGFEDisplacementMapElement_x_Getter";
 
 
   /** @domName SVGFEDisplacementMapElement.y */
-  SVGAnimatedLength get y native "SVGFEDisplacementMapElement_y_Getter";
+  AnimatedLength get y native "SVGFEDisplacementMapElement_y_Getter";
 
 
   /** @domName SVGFEDisplacementMapElement.className */
-  SVGAnimatedString get $dom_svgClassName native "SVGFEDisplacementMapElement_className_Getter";
+  AnimatedString get $dom_svgClassName native "SVGFEDisplacementMapElement_className_Getter";
 
 
   /** @domName SVGFEDisplacementMapElement.style */
@@ -2261,16 +2166,16 @@
 
 
 /// @domName SVGFEDistantLightElement
-class SVGFEDistantLightElement extends SVGElement {
-  SVGFEDistantLightElement.internal(): super.internal();
+class FEDistantLightElement extends SvgElement {
+  FEDistantLightElement.internal(): super.internal();
 
 
   /** @domName SVGFEDistantLightElement.azimuth */
-  SVGAnimatedNumber get azimuth native "SVGFEDistantLightElement_azimuth_Getter";
+  AnimatedNumber get azimuth native "SVGFEDistantLightElement_azimuth_Getter";
 
 
   /** @domName SVGFEDistantLightElement.elevation */
-  SVGAnimatedNumber get elevation native "SVGFEDistantLightElement_elevation_Getter";
+  AnimatedNumber get elevation native "SVGFEDistantLightElement_elevation_Getter";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2281,28 +2186,28 @@
 
 
 /// @domName SVGFEDropShadowElement
-class SVGFEDropShadowElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes {
-  SVGFEDropShadowElement.internal(): super.internal();
+class FEDropShadowElement extends SvgElement implements FilterPrimitiveStandardAttributes {
+  FEDropShadowElement.internal(): super.internal();
 
 
   /** @domName SVGFEDropShadowElement.dx */
-  SVGAnimatedNumber get dx native "SVGFEDropShadowElement_dx_Getter";
+  AnimatedNumber get dx native "SVGFEDropShadowElement_dx_Getter";
 
 
   /** @domName SVGFEDropShadowElement.dy */
-  SVGAnimatedNumber get dy native "SVGFEDropShadowElement_dy_Getter";
+  AnimatedNumber get dy native "SVGFEDropShadowElement_dy_Getter";
 
 
   /** @domName SVGFEDropShadowElement.in1 */
-  SVGAnimatedString get in1 native "SVGFEDropShadowElement_in1_Getter";
+  AnimatedString get in1 native "SVGFEDropShadowElement_in1_Getter";
 
 
   /** @domName SVGFEDropShadowElement.stdDeviationX */
-  SVGAnimatedNumber get stdDeviationX native "SVGFEDropShadowElement_stdDeviationX_Getter";
+  AnimatedNumber get stdDeviationX native "SVGFEDropShadowElement_stdDeviationX_Getter";
 
 
   /** @domName SVGFEDropShadowElement.stdDeviationY */
-  SVGAnimatedNumber get stdDeviationY native "SVGFEDropShadowElement_stdDeviationY_Getter";
+  AnimatedNumber get stdDeviationY native "SVGFEDropShadowElement_stdDeviationY_Getter";
 
 
   /** @domName SVGFEDropShadowElement.setStdDeviation */
@@ -2310,27 +2215,27 @@
 
 
   /** @domName SVGFEDropShadowElement.height */
-  SVGAnimatedLength get height native "SVGFEDropShadowElement_height_Getter";
+  AnimatedLength get height native "SVGFEDropShadowElement_height_Getter";
 
 
   /** @domName SVGFEDropShadowElement.result */
-  SVGAnimatedString get result native "SVGFEDropShadowElement_result_Getter";
+  AnimatedString get result native "SVGFEDropShadowElement_result_Getter";
 
 
   /** @domName SVGFEDropShadowElement.width */
-  SVGAnimatedLength get width native "SVGFEDropShadowElement_width_Getter";
+  AnimatedLength get width native "SVGFEDropShadowElement_width_Getter";
 
 
   /** @domName SVGFEDropShadowElement.x */
-  SVGAnimatedLength get x native "SVGFEDropShadowElement_x_Getter";
+  AnimatedLength get x native "SVGFEDropShadowElement_x_Getter";
 
 
   /** @domName SVGFEDropShadowElement.y */
-  SVGAnimatedLength get y native "SVGFEDropShadowElement_y_Getter";
+  AnimatedLength get y native "SVGFEDropShadowElement_y_Getter";
 
 
   /** @domName SVGFEDropShadowElement.className */
-  SVGAnimatedString get $dom_svgClassName native "SVGFEDropShadowElement_className_Getter";
+  AnimatedString get $dom_svgClassName native "SVGFEDropShadowElement_className_Getter";
 
 
   /** @domName SVGFEDropShadowElement.style */
@@ -2349,32 +2254,32 @@
 
 
 /// @domName SVGFEFloodElement
-class SVGFEFloodElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes {
-  SVGFEFloodElement.internal(): super.internal();
+class FEFloodElement extends SvgElement implements FilterPrimitiveStandardAttributes {
+  FEFloodElement.internal(): super.internal();
 
 
   /** @domName SVGFEFloodElement.height */
-  SVGAnimatedLength get height native "SVGFEFloodElement_height_Getter";
+  AnimatedLength get height native "SVGFEFloodElement_height_Getter";
 
 
   /** @domName SVGFEFloodElement.result */
-  SVGAnimatedString get result native "SVGFEFloodElement_result_Getter";
+  AnimatedString get result native "SVGFEFloodElement_result_Getter";
 
 
   /** @domName SVGFEFloodElement.width */
-  SVGAnimatedLength get width native "SVGFEFloodElement_width_Getter";
+  AnimatedLength get width native "SVGFEFloodElement_width_Getter";
 
 
   /** @domName SVGFEFloodElement.x */
-  SVGAnimatedLength get x native "SVGFEFloodElement_x_Getter";
+  AnimatedLength get x native "SVGFEFloodElement_x_Getter";
 
 
   /** @domName SVGFEFloodElement.y */
-  SVGAnimatedLength get y native "SVGFEFloodElement_y_Getter";
+  AnimatedLength get y native "SVGFEFloodElement_y_Getter";
 
 
   /** @domName SVGFEFloodElement.className */
-  SVGAnimatedString get $dom_svgClassName native "SVGFEFloodElement_className_Getter";
+  AnimatedString get $dom_svgClassName native "SVGFEFloodElement_className_Getter";
 
 
   /** @domName SVGFEFloodElement.style */
@@ -2393,8 +2298,8 @@
 
 
 /// @domName SVGFEFuncAElement
-class SVGFEFuncAElement extends SVGComponentTransferFunctionElement {
-  SVGFEFuncAElement.internal(): super.internal();
+class FEFuncAElement extends ComponentTransferFunctionElement {
+  FEFuncAElement.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2405,8 +2310,8 @@
 
 
 /// @domName SVGFEFuncBElement
-class SVGFEFuncBElement extends SVGComponentTransferFunctionElement {
-  SVGFEFuncBElement.internal(): super.internal();
+class FEFuncBElement extends ComponentTransferFunctionElement {
+  FEFuncBElement.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2417,8 +2322,8 @@
 
 
 /// @domName SVGFEFuncGElement
-class SVGFEFuncGElement extends SVGComponentTransferFunctionElement {
-  SVGFEFuncGElement.internal(): super.internal();
+class FEFuncGElement extends ComponentTransferFunctionElement {
+  FEFuncGElement.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2429,8 +2334,8 @@
 
 
 /// @domName SVGFEFuncRElement
-class SVGFEFuncRElement extends SVGComponentTransferFunctionElement {
-  SVGFEFuncRElement.internal(): super.internal();
+class FEFuncRElement extends ComponentTransferFunctionElement {
+  FEFuncRElement.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2441,20 +2346,20 @@
 
 
 /// @domName SVGFEGaussianBlurElement
-class SVGFEGaussianBlurElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes {
-  SVGFEGaussianBlurElement.internal(): super.internal();
+class FEGaussianBlurElement extends SvgElement implements FilterPrimitiveStandardAttributes {
+  FEGaussianBlurElement.internal(): super.internal();
 
 
   /** @domName SVGFEGaussianBlurElement.in1 */
-  SVGAnimatedString get in1 native "SVGFEGaussianBlurElement_in1_Getter";
+  AnimatedString get in1 native "SVGFEGaussianBlurElement_in1_Getter";
 
 
   /** @domName SVGFEGaussianBlurElement.stdDeviationX */
-  SVGAnimatedNumber get stdDeviationX native "SVGFEGaussianBlurElement_stdDeviationX_Getter";
+  AnimatedNumber get stdDeviationX native "SVGFEGaussianBlurElement_stdDeviationX_Getter";
 
 
   /** @domName SVGFEGaussianBlurElement.stdDeviationY */
-  SVGAnimatedNumber get stdDeviationY native "SVGFEGaussianBlurElement_stdDeviationY_Getter";
+  AnimatedNumber get stdDeviationY native "SVGFEGaussianBlurElement_stdDeviationY_Getter";
 
 
   /** @domName SVGFEGaussianBlurElement.setStdDeviation */
@@ -2462,27 +2367,27 @@
 
 
   /** @domName SVGFEGaussianBlurElement.height */
-  SVGAnimatedLength get height native "SVGFEGaussianBlurElement_height_Getter";
+  AnimatedLength get height native "SVGFEGaussianBlurElement_height_Getter";
 
 
   /** @domName SVGFEGaussianBlurElement.result */
-  SVGAnimatedString get result native "SVGFEGaussianBlurElement_result_Getter";
+  AnimatedString get result native "SVGFEGaussianBlurElement_result_Getter";
 
 
   /** @domName SVGFEGaussianBlurElement.width */
-  SVGAnimatedLength get width native "SVGFEGaussianBlurElement_width_Getter";
+  AnimatedLength get width native "SVGFEGaussianBlurElement_width_Getter";
 
 
   /** @domName SVGFEGaussianBlurElement.x */
-  SVGAnimatedLength get x native "SVGFEGaussianBlurElement_x_Getter";
+  AnimatedLength get x native "SVGFEGaussianBlurElement_x_Getter";
 
 
   /** @domName SVGFEGaussianBlurElement.y */
-  SVGAnimatedLength get y native "SVGFEGaussianBlurElement_y_Getter";
+  AnimatedLength get y native "SVGFEGaussianBlurElement_y_Getter";
 
 
   /** @domName SVGFEGaussianBlurElement.className */
-  SVGAnimatedString get $dom_svgClassName native "SVGFEGaussianBlurElement_className_Getter";
+  AnimatedString get $dom_svgClassName native "SVGFEGaussianBlurElement_className_Getter";
 
 
   /** @domName SVGFEGaussianBlurElement.style */
@@ -2501,36 +2406,36 @@
 
 
 /// @domName SVGFEImageElement
-class SVGFEImageElement extends SVGElement implements SVGURIReference, SVGLangSpace, SVGFilterPrimitiveStandardAttributes, SVGExternalResourcesRequired {
-  SVGFEImageElement.internal(): super.internal();
+class FEImageElement extends SvgElement implements FilterPrimitiveStandardAttributes, UriReference, ExternalResourcesRequired, LangSpace {
+  FEImageElement.internal(): super.internal();
 
 
   /** @domName SVGFEImageElement.preserveAspectRatio */
-  SVGAnimatedPreserveAspectRatio get preserveAspectRatio native "SVGFEImageElement_preserveAspectRatio_Getter";
+  AnimatedPreserveAspectRatio get preserveAspectRatio native "SVGFEImageElement_preserveAspectRatio_Getter";
 
 
   /** @domName SVGFEImageElement.externalResourcesRequired */
-  SVGAnimatedBoolean get externalResourcesRequired native "SVGFEImageElement_externalResourcesRequired_Getter";
+  AnimatedBoolean get externalResourcesRequired native "SVGFEImageElement_externalResourcesRequired_Getter";
 
 
   /** @domName SVGFEImageElement.height */
-  SVGAnimatedLength get height native "SVGFEImageElement_height_Getter";
+  AnimatedLength get height native "SVGFEImageElement_height_Getter";
 
 
   /** @domName SVGFEImageElement.result */
-  SVGAnimatedString get result native "SVGFEImageElement_result_Getter";
+  AnimatedString get result native "SVGFEImageElement_result_Getter";
 
 
   /** @domName SVGFEImageElement.width */
-  SVGAnimatedLength get width native "SVGFEImageElement_width_Getter";
+  AnimatedLength get width native "SVGFEImageElement_width_Getter";
 
 
   /** @domName SVGFEImageElement.x */
-  SVGAnimatedLength get x native "SVGFEImageElement_x_Getter";
+  AnimatedLength get x native "SVGFEImageElement_x_Getter";
 
 
   /** @domName SVGFEImageElement.y */
-  SVGAnimatedLength get y native "SVGFEImageElement_y_Getter";
+  AnimatedLength get y native "SVGFEImageElement_y_Getter";
 
 
   /** @domName SVGFEImageElement.xmllang */
@@ -2550,7 +2455,7 @@
 
 
   /** @domName SVGFEImageElement.className */
-  SVGAnimatedString get $dom_svgClassName native "SVGFEImageElement_className_Getter";
+  AnimatedString get $dom_svgClassName native "SVGFEImageElement_className_Getter";
 
 
   /** @domName SVGFEImageElement.style */
@@ -2562,7 +2467,7 @@
 
 
   /** @domName SVGFEImageElement.href */
-  SVGAnimatedString get href native "SVGFEImageElement_href_Getter";
+  AnimatedString get href native "SVGFEImageElement_href_Getter";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2573,32 +2478,32 @@
 
 
 /// @domName SVGFEMergeElement
-class SVGFEMergeElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes {
-  SVGFEMergeElement.internal(): super.internal();
+class FEMergeElement extends SvgElement implements FilterPrimitiveStandardAttributes {
+  FEMergeElement.internal(): super.internal();
 
 
   /** @domName SVGFEMergeElement.height */
-  SVGAnimatedLength get height native "SVGFEMergeElement_height_Getter";
+  AnimatedLength get height native "SVGFEMergeElement_height_Getter";
 
 
   /** @domName SVGFEMergeElement.result */
-  SVGAnimatedString get result native "SVGFEMergeElement_result_Getter";
+  AnimatedString get result native "SVGFEMergeElement_result_Getter";
 
 
   /** @domName SVGFEMergeElement.width */
-  SVGAnimatedLength get width native "SVGFEMergeElement_width_Getter";
+  AnimatedLength get width native "SVGFEMergeElement_width_Getter";
 
 
   /** @domName SVGFEMergeElement.x */
-  SVGAnimatedLength get x native "SVGFEMergeElement_x_Getter";
+  AnimatedLength get x native "SVGFEMergeElement_x_Getter";
 
 
   /** @domName SVGFEMergeElement.y */
-  SVGAnimatedLength get y native "SVGFEMergeElement_y_Getter";
+  AnimatedLength get y native "SVGFEMergeElement_y_Getter";
 
 
   /** @domName SVGFEMergeElement.className */
-  SVGAnimatedString get $dom_svgClassName native "SVGFEMergeElement_className_Getter";
+  AnimatedString get $dom_svgClassName native "SVGFEMergeElement_className_Getter";
 
 
   /** @domName SVGFEMergeElement.style */
@@ -2617,12 +2522,12 @@
 
 
 /// @domName SVGFEMergeNodeElement
-class SVGFEMergeNodeElement extends SVGElement {
-  SVGFEMergeNodeElement.internal(): super.internal();
+class FEMergeNodeElement extends SvgElement {
+  FEMergeNodeElement.internal(): super.internal();
 
 
   /** @domName SVGFEMergeNodeElement.in1 */
-  SVGAnimatedString get in1 native "SVGFEMergeNodeElement_in1_Getter";
+  AnimatedString get in1 native "SVGFEMergeNodeElement_in1_Getter";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2633,8 +2538,8 @@
 
 
 /// @domName SVGFEMorphologyElement
-class SVGFEMorphologyElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes {
-  SVGFEMorphologyElement.internal(): super.internal();
+class FEMorphologyElement extends SvgElement implements FilterPrimitiveStandardAttributes {
+  FEMorphologyElement.internal(): super.internal();
 
   static const int SVG_MORPHOLOGY_OPERATOR_DILATE = 2;
 
@@ -2644,19 +2549,19 @@
 
 
   /** @domName SVGFEMorphologyElement.in1 */
-  SVGAnimatedString get in1 native "SVGFEMorphologyElement_in1_Getter";
+  AnimatedString get in1 native "SVGFEMorphologyElement_in1_Getter";
 
 
   /** @domName SVGFEMorphologyElement.operator */
-  SVGAnimatedEnumeration get operator native "SVGFEMorphologyElement_operator_Getter";
+  AnimatedEnumeration get operator native "SVGFEMorphologyElement_operator_Getter";
 
 
   /** @domName SVGFEMorphologyElement.radiusX */
-  SVGAnimatedNumber get radiusX native "SVGFEMorphologyElement_radiusX_Getter";
+  AnimatedNumber get radiusX native "SVGFEMorphologyElement_radiusX_Getter";
 
 
   /** @domName SVGFEMorphologyElement.radiusY */
-  SVGAnimatedNumber get radiusY native "SVGFEMorphologyElement_radiusY_Getter";
+  AnimatedNumber get radiusY native "SVGFEMorphologyElement_radiusY_Getter";
 
 
   /** @domName SVGFEMorphologyElement.setRadius */
@@ -2664,27 +2569,27 @@
 
 
   /** @domName SVGFEMorphologyElement.height */
-  SVGAnimatedLength get height native "SVGFEMorphologyElement_height_Getter";
+  AnimatedLength get height native "SVGFEMorphologyElement_height_Getter";
 
 
   /** @domName SVGFEMorphologyElement.result */
-  SVGAnimatedString get result native "SVGFEMorphologyElement_result_Getter";
+  AnimatedString get result native "SVGFEMorphologyElement_result_Getter";
 
 
   /** @domName SVGFEMorphologyElement.width */
-  SVGAnimatedLength get width native "SVGFEMorphologyElement_width_Getter";
+  AnimatedLength get width native "SVGFEMorphologyElement_width_Getter";
 
 
   /** @domName SVGFEMorphologyElement.x */
-  SVGAnimatedLength get x native "SVGFEMorphologyElement_x_Getter";
+  AnimatedLength get x native "SVGFEMorphologyElement_x_Getter";
 
 
   /** @domName SVGFEMorphologyElement.y */
-  SVGAnimatedLength get y native "SVGFEMorphologyElement_y_Getter";
+  AnimatedLength get y native "SVGFEMorphologyElement_y_Getter";
 
 
   /** @domName SVGFEMorphologyElement.className */
-  SVGAnimatedString get $dom_svgClassName native "SVGFEMorphologyElement_className_Getter";
+  AnimatedString get $dom_svgClassName native "SVGFEMorphologyElement_className_Getter";
 
 
   /** @domName SVGFEMorphologyElement.style */
@@ -2703,44 +2608,44 @@
 
 
 /// @domName SVGFEOffsetElement
-class SVGFEOffsetElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes {
-  SVGFEOffsetElement.internal(): super.internal();
+class FEOffsetElement extends SvgElement implements FilterPrimitiveStandardAttributes {
+  FEOffsetElement.internal(): super.internal();
 
 
   /** @domName SVGFEOffsetElement.dx */
-  SVGAnimatedNumber get dx native "SVGFEOffsetElement_dx_Getter";
+  AnimatedNumber get dx native "SVGFEOffsetElement_dx_Getter";
 
 
   /** @domName SVGFEOffsetElement.dy */
-  SVGAnimatedNumber get dy native "SVGFEOffsetElement_dy_Getter";
+  AnimatedNumber get dy native "SVGFEOffsetElement_dy_Getter";
 
 
   /** @domName SVGFEOffsetElement.in1 */
-  SVGAnimatedString get in1 native "SVGFEOffsetElement_in1_Getter";
+  AnimatedString get in1 native "SVGFEOffsetElement_in1_Getter";
 
 
   /** @domName SVGFEOffsetElement.height */
-  SVGAnimatedLength get height native "SVGFEOffsetElement_height_Getter";
+  AnimatedLength get height native "SVGFEOffsetElement_height_Getter";
 
 
   /** @domName SVGFEOffsetElement.result */
-  SVGAnimatedString get result native "SVGFEOffsetElement_result_Getter";
+  AnimatedString get result native "SVGFEOffsetElement_result_Getter";
 
 
   /** @domName SVGFEOffsetElement.width */
-  SVGAnimatedLength get width native "SVGFEOffsetElement_width_Getter";
+  AnimatedLength get width native "SVGFEOffsetElement_width_Getter";
 
 
   /** @domName SVGFEOffsetElement.x */
-  SVGAnimatedLength get x native "SVGFEOffsetElement_x_Getter";
+  AnimatedLength get x native "SVGFEOffsetElement_x_Getter";
 
 
   /** @domName SVGFEOffsetElement.y */
-  SVGAnimatedLength get y native "SVGFEOffsetElement_y_Getter";
+  AnimatedLength get y native "SVGFEOffsetElement_y_Getter";
 
 
   /** @domName SVGFEOffsetElement.className */
-  SVGAnimatedString get $dom_svgClassName native "SVGFEOffsetElement_className_Getter";
+  AnimatedString get $dom_svgClassName native "SVGFEOffsetElement_className_Getter";
 
 
   /** @domName SVGFEOffsetElement.style */
@@ -2759,20 +2664,20 @@
 
 
 /// @domName SVGFEPointLightElement
-class SVGFEPointLightElement extends SVGElement {
-  SVGFEPointLightElement.internal(): super.internal();
+class FEPointLightElement extends SvgElement {
+  FEPointLightElement.internal(): super.internal();
 
 
   /** @domName SVGFEPointLightElement.x */
-  SVGAnimatedNumber get x native "SVGFEPointLightElement_x_Getter";
+  AnimatedNumber get x native "SVGFEPointLightElement_x_Getter";
 
 
   /** @domName SVGFEPointLightElement.y */
-  SVGAnimatedNumber get y native "SVGFEPointLightElement_y_Getter";
+  AnimatedNumber get y native "SVGFEPointLightElement_y_Getter";
 
 
   /** @domName SVGFEPointLightElement.z */
-  SVGAnimatedNumber get z native "SVGFEPointLightElement_z_Getter";
+  AnimatedNumber get z native "SVGFEPointLightElement_z_Getter";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2783,48 +2688,48 @@
 
 
 /// @domName SVGFESpecularLightingElement
-class SVGFESpecularLightingElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes {
-  SVGFESpecularLightingElement.internal(): super.internal();
+class FESpecularLightingElement extends SvgElement implements FilterPrimitiveStandardAttributes {
+  FESpecularLightingElement.internal(): super.internal();
 
 
   /** @domName SVGFESpecularLightingElement.in1 */
-  SVGAnimatedString get in1 native "SVGFESpecularLightingElement_in1_Getter";
+  AnimatedString get in1 native "SVGFESpecularLightingElement_in1_Getter";
 
 
   /** @domName SVGFESpecularLightingElement.specularConstant */
-  SVGAnimatedNumber get specularConstant native "SVGFESpecularLightingElement_specularConstant_Getter";
+  AnimatedNumber get specularConstant native "SVGFESpecularLightingElement_specularConstant_Getter";
 
 
   /** @domName SVGFESpecularLightingElement.specularExponent */
-  SVGAnimatedNumber get specularExponent native "SVGFESpecularLightingElement_specularExponent_Getter";
+  AnimatedNumber get specularExponent native "SVGFESpecularLightingElement_specularExponent_Getter";
 
 
   /** @domName SVGFESpecularLightingElement.surfaceScale */
-  SVGAnimatedNumber get surfaceScale native "SVGFESpecularLightingElement_surfaceScale_Getter";
+  AnimatedNumber get surfaceScale native "SVGFESpecularLightingElement_surfaceScale_Getter";
 
 
   /** @domName SVGFESpecularLightingElement.height */
-  SVGAnimatedLength get height native "SVGFESpecularLightingElement_height_Getter";
+  AnimatedLength get height native "SVGFESpecularLightingElement_height_Getter";
 
 
   /** @domName SVGFESpecularLightingElement.result */
-  SVGAnimatedString get result native "SVGFESpecularLightingElement_result_Getter";
+  AnimatedString get result native "SVGFESpecularLightingElement_result_Getter";
 
 
   /** @domName SVGFESpecularLightingElement.width */
-  SVGAnimatedLength get width native "SVGFESpecularLightingElement_width_Getter";
+  AnimatedLength get width native "SVGFESpecularLightingElement_width_Getter";
 
 
   /** @domName SVGFESpecularLightingElement.x */
-  SVGAnimatedLength get x native "SVGFESpecularLightingElement_x_Getter";
+  AnimatedLength get x native "SVGFESpecularLightingElement_x_Getter";
 
 
   /** @domName SVGFESpecularLightingElement.y */
-  SVGAnimatedLength get y native "SVGFESpecularLightingElement_y_Getter";
+  AnimatedLength get y native "SVGFESpecularLightingElement_y_Getter";
 
 
   /** @domName SVGFESpecularLightingElement.className */
-  SVGAnimatedString get $dom_svgClassName native "SVGFESpecularLightingElement_className_Getter";
+  AnimatedString get $dom_svgClassName native "SVGFESpecularLightingElement_className_Getter";
 
 
   /** @domName SVGFESpecularLightingElement.style */
@@ -2843,40 +2748,40 @@
 
 
 /// @domName SVGFESpotLightElement
-class SVGFESpotLightElement extends SVGElement {
-  SVGFESpotLightElement.internal(): super.internal();
+class FESpotLightElement extends SvgElement {
+  FESpotLightElement.internal(): super.internal();
 
 
   /** @domName SVGFESpotLightElement.limitingConeAngle */
-  SVGAnimatedNumber get limitingConeAngle native "SVGFESpotLightElement_limitingConeAngle_Getter";
+  AnimatedNumber get limitingConeAngle native "SVGFESpotLightElement_limitingConeAngle_Getter";
 
 
   /** @domName SVGFESpotLightElement.pointsAtX */
-  SVGAnimatedNumber get pointsAtX native "SVGFESpotLightElement_pointsAtX_Getter";
+  AnimatedNumber get pointsAtX native "SVGFESpotLightElement_pointsAtX_Getter";
 
 
   /** @domName SVGFESpotLightElement.pointsAtY */
-  SVGAnimatedNumber get pointsAtY native "SVGFESpotLightElement_pointsAtY_Getter";
+  AnimatedNumber get pointsAtY native "SVGFESpotLightElement_pointsAtY_Getter";
 
 
   /** @domName SVGFESpotLightElement.pointsAtZ */
-  SVGAnimatedNumber get pointsAtZ native "SVGFESpotLightElement_pointsAtZ_Getter";
+  AnimatedNumber get pointsAtZ native "SVGFESpotLightElement_pointsAtZ_Getter";
 
 
   /** @domName SVGFESpotLightElement.specularExponent */
-  SVGAnimatedNumber get specularExponent native "SVGFESpotLightElement_specularExponent_Getter";
+  AnimatedNumber get specularExponent native "SVGFESpotLightElement_specularExponent_Getter";
 
 
   /** @domName SVGFESpotLightElement.x */
-  SVGAnimatedNumber get x native "SVGFESpotLightElement_x_Getter";
+  AnimatedNumber get x native "SVGFESpotLightElement_x_Getter";
 
 
   /** @domName SVGFESpotLightElement.y */
-  SVGAnimatedNumber get y native "SVGFESpotLightElement_y_Getter";
+  AnimatedNumber get y native "SVGFESpotLightElement_y_Getter";
 
 
   /** @domName SVGFESpotLightElement.z */
-  SVGAnimatedNumber get z native "SVGFESpotLightElement_z_Getter";
+  AnimatedNumber get z native "SVGFESpotLightElement_z_Getter";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2887,36 +2792,36 @@
 
 
 /// @domName SVGFETileElement
-class SVGFETileElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes {
-  SVGFETileElement.internal(): super.internal();
+class FETileElement extends SvgElement implements FilterPrimitiveStandardAttributes {
+  FETileElement.internal(): super.internal();
 
 
   /** @domName SVGFETileElement.in1 */
-  SVGAnimatedString get in1 native "SVGFETileElement_in1_Getter";
+  AnimatedString get in1 native "SVGFETileElement_in1_Getter";
 
 
   /** @domName SVGFETileElement.height */
-  SVGAnimatedLength get height native "SVGFETileElement_height_Getter";
+  AnimatedLength get height native "SVGFETileElement_height_Getter";
 
 
   /** @domName SVGFETileElement.result */
-  SVGAnimatedString get result native "SVGFETileElement_result_Getter";
+  AnimatedString get result native "SVGFETileElement_result_Getter";
 
 
   /** @domName SVGFETileElement.width */
-  SVGAnimatedLength get width native "SVGFETileElement_width_Getter";
+  AnimatedLength get width native "SVGFETileElement_width_Getter";
 
 
   /** @domName SVGFETileElement.x */
-  SVGAnimatedLength get x native "SVGFETileElement_x_Getter";
+  AnimatedLength get x native "SVGFETileElement_x_Getter";
 
 
   /** @domName SVGFETileElement.y */
-  SVGAnimatedLength get y native "SVGFETileElement_y_Getter";
+  AnimatedLength get y native "SVGFETileElement_y_Getter";
 
 
   /** @domName SVGFETileElement.className */
-  SVGAnimatedString get $dom_svgClassName native "SVGFETileElement_className_Getter";
+  AnimatedString get $dom_svgClassName native "SVGFETileElement_className_Getter";
 
 
   /** @domName SVGFETileElement.style */
@@ -2935,8 +2840,8 @@
 
 
 /// @domName SVGFETurbulenceElement
-class SVGFETurbulenceElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes {
-  SVGFETurbulenceElement.internal(): super.internal();
+class FETurbulenceElement extends SvgElement implements FilterPrimitiveStandardAttributes {
+  FETurbulenceElement.internal(): super.internal();
 
   static const int SVG_STITCHTYPE_NOSTITCH = 2;
 
@@ -2952,51 +2857,51 @@
 
 
   /** @domName SVGFETurbulenceElement.baseFrequencyX */
-  SVGAnimatedNumber get baseFrequencyX native "SVGFETurbulenceElement_baseFrequencyX_Getter";
+  AnimatedNumber get baseFrequencyX native "SVGFETurbulenceElement_baseFrequencyX_Getter";
 
 
   /** @domName SVGFETurbulenceElement.baseFrequencyY */
-  SVGAnimatedNumber get baseFrequencyY native "SVGFETurbulenceElement_baseFrequencyY_Getter";
+  AnimatedNumber get baseFrequencyY native "SVGFETurbulenceElement_baseFrequencyY_Getter";
 
 
   /** @domName SVGFETurbulenceElement.numOctaves */
-  SVGAnimatedInteger get numOctaves native "SVGFETurbulenceElement_numOctaves_Getter";
+  AnimatedInteger get numOctaves native "SVGFETurbulenceElement_numOctaves_Getter";
 
 
   /** @domName SVGFETurbulenceElement.seed */
-  SVGAnimatedNumber get seed native "SVGFETurbulenceElement_seed_Getter";
+  AnimatedNumber get seed native "SVGFETurbulenceElement_seed_Getter";
 
 
   /** @domName SVGFETurbulenceElement.stitchTiles */
-  SVGAnimatedEnumeration get stitchTiles native "SVGFETurbulenceElement_stitchTiles_Getter";
+  AnimatedEnumeration get stitchTiles native "SVGFETurbulenceElement_stitchTiles_Getter";
 
 
   /** @domName SVGFETurbulenceElement.type */
-  SVGAnimatedEnumeration get type native "SVGFETurbulenceElement_type_Getter";
+  AnimatedEnumeration get type native "SVGFETurbulenceElement_type_Getter";
 
 
   /** @domName SVGFETurbulenceElement.height */
-  SVGAnimatedLength get height native "SVGFETurbulenceElement_height_Getter";
+  AnimatedLength get height native "SVGFETurbulenceElement_height_Getter";
 
 
   /** @domName SVGFETurbulenceElement.result */
-  SVGAnimatedString get result native "SVGFETurbulenceElement_result_Getter";
+  AnimatedString get result native "SVGFETurbulenceElement_result_Getter";
 
 
   /** @domName SVGFETurbulenceElement.width */
-  SVGAnimatedLength get width native "SVGFETurbulenceElement_width_Getter";
+  AnimatedLength get width native "SVGFETurbulenceElement_width_Getter";
 
 
   /** @domName SVGFETurbulenceElement.x */
-  SVGAnimatedLength get x native "SVGFETurbulenceElement_x_Getter";
+  AnimatedLength get x native "SVGFETurbulenceElement_x_Getter";
 
 
   /** @domName SVGFETurbulenceElement.y */
-  SVGAnimatedLength get y native "SVGFETurbulenceElement_y_Getter";
+  AnimatedLength get y native "SVGFETurbulenceElement_y_Getter";
 
 
   /** @domName SVGFETurbulenceElement.className */
-  SVGAnimatedString get $dom_svgClassName native "SVGFETurbulenceElement_className_Getter";
+  AnimatedString get $dom_svgClassName native "SVGFETurbulenceElement_className_Getter";
 
 
   /** @domName SVGFETurbulenceElement.style */
@@ -3015,40 +2920,42 @@
 
 
 /// @domName SVGFilterElement
-class SVGFilterElement extends SVGElement implements SVGURIReference, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable {
-  SVGFilterElement.internal(): super.internal();
+class FilterElement extends SvgElement implements UriReference, ExternalResourcesRequired, Stylable, LangSpace {
+
+  factory FilterElement() => _SvgElementFactoryProvider.createSvgElement_tag("filter");
+  FilterElement.internal(): super.internal();
 
 
   /** @domName SVGFilterElement.filterResX */
-  SVGAnimatedInteger get filterResX native "SVGFilterElement_filterResX_Getter";
+  AnimatedInteger get filterResX native "SVGFilterElement_filterResX_Getter";
 
 
   /** @domName SVGFilterElement.filterResY */
-  SVGAnimatedInteger get filterResY native "SVGFilterElement_filterResY_Getter";
+  AnimatedInteger get filterResY native "SVGFilterElement_filterResY_Getter";
 
 
   /** @domName SVGFilterElement.filterUnits */
-  SVGAnimatedEnumeration get filterUnits native "SVGFilterElement_filterUnits_Getter";
+  AnimatedEnumeration get filterUnits native "SVGFilterElement_filterUnits_Getter";
 
 
   /** @domName SVGFilterElement.height */
-  SVGAnimatedLength get height native "SVGFilterElement_height_Getter";
+  AnimatedLength get height native "SVGFilterElement_height_Getter";
 
 
   /** @domName SVGFilterElement.primitiveUnits */
-  SVGAnimatedEnumeration get primitiveUnits native "SVGFilterElement_primitiveUnits_Getter";
+  AnimatedEnumeration get primitiveUnits native "SVGFilterElement_primitiveUnits_Getter";
 
 
   /** @domName SVGFilterElement.width */
-  SVGAnimatedLength get width native "SVGFilterElement_width_Getter";
+  AnimatedLength get width native "SVGFilterElement_width_Getter";
 
 
   /** @domName SVGFilterElement.x */
-  SVGAnimatedLength get x native "SVGFilterElement_x_Getter";
+  AnimatedLength get x native "SVGFilterElement_x_Getter";
 
 
   /** @domName SVGFilterElement.y */
-  SVGAnimatedLength get y native "SVGFilterElement_y_Getter";
+  AnimatedLength get y native "SVGFilterElement_y_Getter";
 
 
   /** @domName SVGFilterElement.setFilterRes */
@@ -3056,7 +2963,7 @@
 
 
   /** @domName SVGFilterElement.externalResourcesRequired */
-  SVGAnimatedBoolean get externalResourcesRequired native "SVGFilterElement_externalResourcesRequired_Getter";
+  AnimatedBoolean get externalResourcesRequired native "SVGFilterElement_externalResourcesRequired_Getter";
 
 
   /** @domName SVGFilterElement.xmllang */
@@ -3076,7 +2983,7 @@
 
 
   /** @domName SVGFilterElement.className */
-  SVGAnimatedString get $dom_svgClassName native "SVGFilterElement_className_Getter";
+  AnimatedString get $dom_svgClassName native "SVGFilterElement_className_Getter";
 
 
   /** @domName SVGFilterElement.style */
@@ -3088,7 +2995,7 @@
 
 
   /** @domName SVGFilterElement.href */
-  SVGAnimatedString get href native "SVGFilterElement_href_Getter";
+  AnimatedString get href native "SVGFilterElement_href_Getter";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3099,32 +3006,32 @@
 
 
 /// @domName SVGFilterPrimitiveStandardAttributes
-class SVGFilterPrimitiveStandardAttributes extends NativeFieldWrapperClass1 implements SVGStylable {
-  SVGFilterPrimitiveStandardAttributes.internal();
+class FilterPrimitiveStandardAttributes extends NativeFieldWrapperClass1 implements Stylable {
+  FilterPrimitiveStandardAttributes.internal();
 
 
   /** @domName SVGFilterPrimitiveStandardAttributes.height */
-  SVGAnimatedLength get height native "SVGFilterPrimitiveStandardAttributes_height_Getter";
+  AnimatedLength get height native "SVGFilterPrimitiveStandardAttributes_height_Getter";
 
 
   /** @domName SVGFilterPrimitiveStandardAttributes.result */
-  SVGAnimatedString get result native "SVGFilterPrimitiveStandardAttributes_result_Getter";
+  AnimatedString get result native "SVGFilterPrimitiveStandardAttributes_result_Getter";
 
 
   /** @domName SVGFilterPrimitiveStandardAttributes.width */
-  SVGAnimatedLength get width native "SVGFilterPrimitiveStandardAttributes_width_Getter";
+  AnimatedLength get width native "SVGFilterPrimitiveStandardAttributes_width_Getter";
 
 
   /** @domName SVGFilterPrimitiveStandardAttributes.x */
-  SVGAnimatedLength get x native "SVGFilterPrimitiveStandardAttributes_x_Getter";
+  AnimatedLength get x native "SVGFilterPrimitiveStandardAttributes_x_Getter";
 
 
   /** @domName SVGFilterPrimitiveStandardAttributes.y */
-  SVGAnimatedLength get y native "SVGFilterPrimitiveStandardAttributes_y_Getter";
+  AnimatedLength get y native "SVGFilterPrimitiveStandardAttributes_y_Getter";
 
 
   /** @domName SVGFilterPrimitiveStandardAttributes.className */
-  SVGAnimatedString get $dom_svgClassName native "SVGFilterPrimitiveStandardAttributes_className_Getter";
+  AnimatedString get $dom_svgClassName native "SVGFilterPrimitiveStandardAttributes_className_Getter";
 
 
   /** @domName SVGFilterPrimitiveStandardAttributes.style */
@@ -3143,16 +3050,16 @@
 
 
 /// @domName SVGFitToViewBox
-class SVGFitToViewBox extends NativeFieldWrapperClass1 {
-  SVGFitToViewBox.internal();
+class FitToViewBox extends NativeFieldWrapperClass1 {
+  FitToViewBox.internal();
 
 
   /** @domName SVGFitToViewBox.preserveAspectRatio */
-  SVGAnimatedPreserveAspectRatio get preserveAspectRatio native "SVGFitToViewBox_preserveAspectRatio_Getter";
+  AnimatedPreserveAspectRatio get preserveAspectRatio native "SVGFitToViewBox_preserveAspectRatio_Getter";
 
 
   /** @domName SVGFitToViewBox.viewBox */
-  SVGAnimatedRect get viewBox native "SVGFitToViewBox_viewBox_Getter";
+  AnimatedRect get viewBox native "SVGFitToViewBox_viewBox_Getter";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3163,8 +3070,10 @@
 
 
 /// @domName SVGFontElement
-class SVGFontElement extends SVGElement {
-  SVGFontElement.internal(): super.internal();
+class FontElement extends SvgElement {
+
+  factory FontElement() => _SvgElementFactoryProvider.createSvgElement_tag("font");
+  FontElement.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3175,8 +3084,10 @@
 
 
 /// @domName SVGFontFaceElement
-class SVGFontFaceElement extends SVGElement {
-  SVGFontFaceElement.internal(): super.internal();
+class FontFaceElement extends SvgElement {
+
+  factory FontFaceElement() => _SvgElementFactoryProvider.createSvgElement_tag("font-face");
+  FontFaceElement.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3187,8 +3098,10 @@
 
 
 /// @domName SVGFontFaceFormatElement
-class SVGFontFaceFormatElement extends SVGElement {
-  SVGFontFaceFormatElement.internal(): super.internal();
+class FontFaceFormatElement extends SvgElement {
+
+  factory FontFaceFormatElement() => _SvgElementFactoryProvider.createSvgElement_tag("font-face-format");
+  FontFaceFormatElement.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3199,8 +3112,10 @@
 
 
 /// @domName SVGFontFaceNameElement
-class SVGFontFaceNameElement extends SVGElement {
-  SVGFontFaceNameElement.internal(): super.internal();
+class FontFaceNameElement extends SvgElement {
+
+  factory FontFaceNameElement() => _SvgElementFactoryProvider.createSvgElement_tag("font-face-name");
+  FontFaceNameElement.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3211,8 +3126,10 @@
 
 
 /// @domName SVGFontFaceSrcElement
-class SVGFontFaceSrcElement extends SVGElement {
-  SVGFontFaceSrcElement.internal(): super.internal();
+class FontFaceSrcElement extends SvgElement {
+
+  factory FontFaceSrcElement() => _SvgElementFactoryProvider.createSvgElement_tag("font-face-src");
+  FontFaceSrcElement.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3223,8 +3140,10 @@
 
 
 /// @domName SVGFontFaceUriElement
-class SVGFontFaceUriElement extends SVGElement {
-  SVGFontFaceUriElement.internal(): super.internal();
+class FontFaceUriElement extends SvgElement {
+
+  factory FontFaceUriElement() => _SvgElementFactoryProvider.createSvgElement_tag("font-face-uri");
+  FontFaceUriElement.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3235,28 +3154,30 @@
 
 
 /// @domName SVGForeignObjectElement
-class SVGForeignObjectElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired {
-  SVGForeignObjectElement.internal(): super.internal();
+class ForeignObjectElement extends SvgElement implements Transformable, Tests, Stylable, ExternalResourcesRequired, LangSpace {
+
+  factory ForeignObjectElement() => _SvgElementFactoryProvider.createSvgElement_tag("foreignObject");
+  ForeignObjectElement.internal(): super.internal();
 
 
   /** @domName SVGForeignObjectElement.height */
-  SVGAnimatedLength get height native "SVGForeignObjectElement_height_Getter";
+  AnimatedLength get height native "SVGForeignObjectElement_height_Getter";
 
 
   /** @domName SVGForeignObjectElement.width */
-  SVGAnimatedLength get width native "SVGForeignObjectElement_width_Getter";
+  AnimatedLength get width native "SVGForeignObjectElement_width_Getter";
 
 
   /** @domName SVGForeignObjectElement.x */
-  SVGAnimatedLength get x native "SVGForeignObjectElement_x_Getter";
+  AnimatedLength get x native "SVGForeignObjectElement_x_Getter";
 
 
   /** @domName SVGForeignObjectElement.y */
-  SVGAnimatedLength get y native "SVGForeignObjectElement_y_Getter";
+  AnimatedLength get y native "SVGForeignObjectElement_y_Getter";
 
 
   /** @domName SVGForeignObjectElement.externalResourcesRequired */
-  SVGAnimatedBoolean get externalResourcesRequired native "SVGForeignObjectElement_externalResourcesRequired_Getter";
+  AnimatedBoolean get externalResourcesRequired native "SVGForeignObjectElement_externalResourcesRequired_Getter";
 
 
   /** @domName SVGForeignObjectElement.xmllang */
@@ -3276,31 +3197,31 @@
 
 
   /** @domName SVGForeignObjectElement.farthestViewportElement */
-  SVGElement get farthestViewportElement native "SVGForeignObjectElement_farthestViewportElement_Getter";
+  SvgElement get farthestViewportElement native "SVGForeignObjectElement_farthestViewportElement_Getter";
 
 
   /** @domName SVGForeignObjectElement.nearestViewportElement */
-  SVGElement get nearestViewportElement native "SVGForeignObjectElement_nearestViewportElement_Getter";
+  SvgElement get nearestViewportElement native "SVGForeignObjectElement_nearestViewportElement_Getter";
 
 
   /** @domName SVGForeignObjectElement.getBBox */
-  SVGRect getBBox() native "SVGForeignObjectElement_getBBox_Callback";
+  Rect getBBox() native "SVGForeignObjectElement_getBBox_Callback";
 
 
   /** @domName SVGForeignObjectElement.getCTM */
-  SVGMatrix getCTM() native "SVGForeignObjectElement_getCTM_Callback";
+  Matrix getCTM() native "SVGForeignObjectElement_getCTM_Callback";
 
 
   /** @domName SVGForeignObjectElement.getScreenCTM */
-  SVGMatrix getScreenCTM() native "SVGForeignObjectElement_getScreenCTM_Callback";
+  Matrix getScreenCTM() native "SVGForeignObjectElement_getScreenCTM_Callback";
 
 
   /** @domName SVGForeignObjectElement.getTransformToElement */
-  SVGMatrix getTransformToElement(SVGElement element) native "SVGForeignObjectElement_getTransformToElement_Callback";
+  Matrix getTransformToElement(SvgElement element) native "SVGForeignObjectElement_getTransformToElement_Callback";
 
 
   /** @domName SVGForeignObjectElement.className */
-  SVGAnimatedString get $dom_svgClassName native "SVGForeignObjectElement_className_Getter";
+  AnimatedString get $dom_svgClassName native "SVGForeignObjectElement_className_Getter";
 
 
   /** @domName SVGForeignObjectElement.style */
@@ -3312,15 +3233,15 @@
 
 
   /** @domName SVGForeignObjectElement.requiredExtensions */
-  SVGStringList get requiredExtensions native "SVGForeignObjectElement_requiredExtensions_Getter";
+  StringList get requiredExtensions native "SVGForeignObjectElement_requiredExtensions_Getter";
 
 
   /** @domName SVGForeignObjectElement.requiredFeatures */
-  SVGStringList get requiredFeatures native "SVGForeignObjectElement_requiredFeatures_Getter";
+  StringList get requiredFeatures native "SVGForeignObjectElement_requiredFeatures_Getter";
 
 
   /** @domName SVGForeignObjectElement.systemLanguage */
-  SVGStringList get systemLanguage native "SVGForeignObjectElement_systemLanguage_Getter";
+  StringList get systemLanguage native "SVGForeignObjectElement_systemLanguage_Getter";
 
 
   /** @domName SVGForeignObjectElement.hasExtension */
@@ -3328,7 +3249,7 @@
 
 
   /** @domName SVGForeignObjectElement.transform */
-  SVGAnimatedTransformList get transform native "SVGForeignObjectElement_transform_Getter";
+  AnimatedTransformList get transform native "SVGForeignObjectElement_transform_Getter";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3339,12 +3260,14 @@
 
 
 /// @domName SVGGElement
-class SVGGElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired {
-  SVGGElement.internal(): super.internal();
+class GElement extends SvgElement implements Transformable, Tests, Stylable, ExternalResourcesRequired, LangSpace {
+
+  factory GElement() => _SvgElementFactoryProvider.createSvgElement_tag("g");
+  GElement.internal(): super.internal();
 
 
   /** @domName SVGGElement.externalResourcesRequired */
-  SVGAnimatedBoolean get externalResourcesRequired native "SVGGElement_externalResourcesRequired_Getter";
+  AnimatedBoolean get externalResourcesRequired native "SVGGElement_externalResourcesRequired_Getter";
 
 
   /** @domName SVGGElement.xmllang */
@@ -3364,31 +3287,31 @@
 
 
   /** @domName SVGGElement.farthestViewportElement */
-  SVGElement get farthestViewportElement native "SVGGElement_farthestViewportElement_Getter";
+  SvgElement get farthestViewportElement native "SVGGElement_farthestViewportElement_Getter";
 
 
   /** @domName SVGGElement.nearestViewportElement */
-  SVGElement get nearestViewportElement native "SVGGElement_nearestViewportElement_Getter";
+  SvgElement get nearestViewportElement native "SVGGElement_nearestViewportElement_Getter";
 
 
   /** @domName SVGGElement.getBBox */
-  SVGRect getBBox() native "SVGGElement_getBBox_Callback";
+  Rect getBBox() native "SVGGElement_getBBox_Callback";
 
 
   /** @domName SVGGElement.getCTM */
-  SVGMatrix getCTM() native "SVGGElement_getCTM_Callback";
+  Matrix getCTM() native "SVGGElement_getCTM_Callback";
 
 
   /** @domName SVGGElement.getScreenCTM */
-  SVGMatrix getScreenCTM() native "SVGGElement_getScreenCTM_Callback";
+  Matrix getScreenCTM() native "SVGGElement_getScreenCTM_Callback";
 
 
   /** @domName SVGGElement.getTransformToElement */
-  SVGMatrix getTransformToElement(SVGElement element) native "SVGGElement_getTransformToElement_Callback";
+  Matrix getTransformToElement(SvgElement element) native "SVGGElement_getTransformToElement_Callback";
 
 
   /** @domName SVGGElement.className */
-  SVGAnimatedString get $dom_svgClassName native "SVGGElement_className_Getter";
+  AnimatedString get $dom_svgClassName native "SVGGElement_className_Getter";
 
 
   /** @domName SVGGElement.style */
@@ -3400,15 +3323,15 @@
 
 
   /** @domName SVGGElement.requiredExtensions */
-  SVGStringList get requiredExtensions native "SVGGElement_requiredExtensions_Getter";
+  StringList get requiredExtensions native "SVGGElement_requiredExtensions_Getter";
 
 
   /** @domName SVGGElement.requiredFeatures */
-  SVGStringList get requiredFeatures native "SVGGElement_requiredFeatures_Getter";
+  StringList get requiredFeatures native "SVGGElement_requiredFeatures_Getter";
 
 
   /** @domName SVGGElement.systemLanguage */
-  SVGStringList get systemLanguage native "SVGGElement_systemLanguage_Getter";
+  StringList get systemLanguage native "SVGGElement_systemLanguage_Getter";
 
 
   /** @domName SVGGElement.hasExtension */
@@ -3416,7 +3339,7 @@
 
 
   /** @domName SVGGElement.transform */
-  SVGAnimatedTransformList get transform native "SVGGElement_transform_Getter";
+  AnimatedTransformList get transform native "SVGGElement_transform_Getter";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3427,8 +3350,10 @@
 
 
 /// @domName SVGGlyphElement
-class SVGGlyphElement extends SVGElement {
-  SVGGlyphElement.internal(): super.internal();
+class GlyphElement extends SvgElement {
+
+  factory GlyphElement() => _SvgElementFactoryProvider.createSvgElement_tag("glyph");
+  GlyphElement.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3439,8 +3364,8 @@
 
 
 /// @domName SVGGlyphRefElement
-class SVGGlyphRefElement extends SVGElement implements SVGURIReference, SVGStylable {
-  SVGGlyphRefElement.internal(): super.internal();
+class GlyphRefElement extends SvgElement implements UriReference, Stylable {
+  GlyphRefElement.internal(): super.internal();
 
 
   /** @domName SVGGlyphRefElement.dx */
@@ -3492,7 +3417,7 @@
 
 
   /** @domName SVGGlyphRefElement.className */
-  SVGAnimatedString get $dom_svgClassName native "SVGGlyphRefElement_className_Getter";
+  AnimatedString get $dom_svgClassName native "SVGGlyphRefElement_className_Getter";
 
 
   /** @domName SVGGlyphRefElement.style */
@@ -3504,7 +3429,7 @@
 
 
   /** @domName SVGGlyphRefElement.href */
-  SVGAnimatedString get href native "SVGGlyphRefElement_href_Getter";
+  AnimatedString get href native "SVGGlyphRefElement_href_Getter";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3515,8 +3440,8 @@
 
 
 /// @domName SVGGradientElement
-class SVGGradientElement extends SVGElement implements SVGURIReference, SVGExternalResourcesRequired, SVGStylable {
-  SVGGradientElement.internal(): super.internal();
+class GradientElement extends SvgElement implements UriReference, ExternalResourcesRequired, Stylable {
+  GradientElement.internal(): super.internal();
 
   static const int SVG_SPREADMETHOD_PAD = 1;
 
@@ -3528,23 +3453,23 @@
 
 
   /** @domName SVGGradientElement.gradientTransform */
-  SVGAnimatedTransformList get gradientTransform native "SVGGradientElement_gradientTransform_Getter";
+  AnimatedTransformList get gradientTransform native "SVGGradientElement_gradientTransform_Getter";
 
 
   /** @domName SVGGradientElement.gradientUnits */
-  SVGAnimatedEnumeration get gradientUnits native "SVGGradientElement_gradientUnits_Getter";
+  AnimatedEnumeration get gradientUnits native "SVGGradientElement_gradientUnits_Getter";
 
 
   /** @domName SVGGradientElement.spreadMethod */
-  SVGAnimatedEnumeration get spreadMethod native "SVGGradientElement_spreadMethod_Getter";
+  AnimatedEnumeration get spreadMethod native "SVGGradientElement_spreadMethod_Getter";
 
 
   /** @domName SVGGradientElement.externalResourcesRequired */
-  SVGAnimatedBoolean get externalResourcesRequired native "SVGGradientElement_externalResourcesRequired_Getter";
+  AnimatedBoolean get externalResourcesRequired native "SVGGradientElement_externalResourcesRequired_Getter";
 
 
   /** @domName SVGGradientElement.className */
-  SVGAnimatedString get $dom_svgClassName native "SVGGradientElement_className_Getter";
+  AnimatedString get $dom_svgClassName native "SVGGradientElement_className_Getter";
 
 
   /** @domName SVGGradientElement.style */
@@ -3556,7 +3481,7 @@
 
 
   /** @domName SVGGradientElement.href */
-  SVGAnimatedString get href native "SVGGradientElement_href_Getter";
+  AnimatedString get href native "SVGGradientElement_href_Getter";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3567,8 +3492,10 @@
 
 
 /// @domName SVGHKernElement
-class SVGHKernElement extends SVGElement {
-  SVGHKernElement.internal(): super.internal();
+class HKernElement extends SvgElement {
+
+  factory HKernElement() => _SvgElementFactoryProvider.createSvgElement_tag("hkern");
+  HKernElement.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3579,32 +3506,34 @@
 
 
 /// @domName SVGImageElement
-class SVGImageElement extends SVGElement implements SVGLangSpace, SVGTests, SVGStylable, SVGURIReference, SVGExternalResourcesRequired, SVGTransformable {
-  SVGImageElement.internal(): super.internal();
+class ImageElement extends SvgElement implements Transformable, Tests, UriReference, Stylable, ExternalResourcesRequired, LangSpace {
+
+  factory ImageElement() => _SvgElementFactoryProvider.createSvgElement_tag("image");
+  ImageElement.internal(): super.internal();
 
 
   /** @domName SVGImageElement.height */
-  SVGAnimatedLength get height native "SVGImageElement_height_Getter";
+  AnimatedLength get height native "SVGImageElement_height_Getter";
 
 
   /** @domName SVGImageElement.preserveAspectRatio */
-  SVGAnimatedPreserveAspectRatio get preserveAspectRatio native "SVGImageElement_preserveAspectRatio_Getter";
+  AnimatedPreserveAspectRatio get preserveAspectRatio native "SVGImageElement_preserveAspectRatio_Getter";
 
 
   /** @domName SVGImageElement.width */
-  SVGAnimatedLength get width native "SVGImageElement_width_Getter";
+  AnimatedLength get width native "SVGImageElement_width_Getter";
 
 
   /** @domName SVGImageElement.x */
-  SVGAnimatedLength get x native "SVGImageElement_x_Getter";
+  AnimatedLength get x native "SVGImageElement_x_Getter";
 
 
   /** @domName SVGImageElement.y */
-  SVGAnimatedLength get y native "SVGImageElement_y_Getter";
+  AnimatedLength get y native "SVGImageElement_y_Getter";
 
 
   /** @domName SVGImageElement.externalResourcesRequired */
-  SVGAnimatedBoolean get externalResourcesRequired native "SVGImageElement_externalResourcesRequired_Getter";
+  AnimatedBoolean get externalResourcesRequired native "SVGImageElement_externalResourcesRequired_Getter";
 
 
   /** @domName SVGImageElement.xmllang */
@@ -3624,31 +3553,31 @@
 
 
   /** @domName SVGImageElement.farthestViewportElement */
-  SVGElement get farthestViewportElement native "SVGImageElement_farthestViewportElement_Getter";
+  SvgElement get farthestViewportElement native "SVGImageElement_farthestViewportElement_Getter";
 
 
   /** @domName SVGImageElement.nearestViewportElement */
-  SVGElement get nearestViewportElement native "SVGImageElement_nearestViewportElement_Getter";
+  SvgElement get nearestViewportElement native "SVGImageElement_nearestViewportElement_Getter";
 
 
   /** @domName SVGImageElement.getBBox */
-  SVGRect getBBox() native "SVGImageElement_getBBox_Callback";
+  Rect getBBox() native "SVGImageElement_getBBox_Callback";
 
 
   /** @domName SVGImageElement.getCTM */
-  SVGMatrix getCTM() native "SVGImageElement_getCTM_Callback";
+  Matrix getCTM() native "SVGImageElement_getCTM_Callback";
 
 
   /** @domName SVGImageElement.getScreenCTM */
-  SVGMatrix getScreenCTM() native "SVGImageElement_getScreenCTM_Callback";
+  Matrix getScreenCTM() native "SVGImageElement_getScreenCTM_Callback";
 
 
   /** @domName SVGImageElement.getTransformToElement */
-  SVGMatrix getTransformToElement(SVGElement element) native "SVGImageElement_getTransformToElement_Callback";
+  Matrix getTransformToElement(SvgElement element) native "SVGImageElement_getTransformToElement_Callback";
 
 
   /** @domName SVGImageElement.className */
-  SVGAnimatedString get $dom_svgClassName native "SVGImageElement_className_Getter";
+  AnimatedString get $dom_svgClassName native "SVGImageElement_className_Getter";
 
 
   /** @domName SVGImageElement.style */
@@ -3660,15 +3589,15 @@
 
 
   /** @domName SVGImageElement.requiredExtensions */
-  SVGStringList get requiredExtensions native "SVGImageElement_requiredExtensions_Getter";
+  StringList get requiredExtensions native "SVGImageElement_requiredExtensions_Getter";
 
 
   /** @domName SVGImageElement.requiredFeatures */
-  SVGStringList get requiredFeatures native "SVGImageElement_requiredFeatures_Getter";
+  StringList get requiredFeatures native "SVGImageElement_requiredFeatures_Getter";
 
 
   /** @domName SVGImageElement.systemLanguage */
-  SVGStringList get systemLanguage native "SVGImageElement_systemLanguage_Getter";
+  StringList get systemLanguage native "SVGImageElement_systemLanguage_Getter";
 
 
   /** @domName SVGImageElement.hasExtension */
@@ -3676,11 +3605,11 @@
 
 
   /** @domName SVGImageElement.transform */
-  SVGAnimatedTransformList get transform native "SVGImageElement_transform_Getter";
+  AnimatedTransformList get transform native "SVGImageElement_transform_Getter";
 
 
   /** @domName SVGImageElement.href */
-  SVGAnimatedString get href native "SVGImageElement_href_Getter";
+  AnimatedString get href native "SVGImageElement_href_Getter";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3691,8 +3620,8 @@
 
 
 /// @domName SVGLangSpace
-class SVGLangSpace extends NativeFieldWrapperClass1 {
-  SVGLangSpace.internal();
+class LangSpace extends NativeFieldWrapperClass1 {
+  LangSpace.internal();
 
 
   /** @domName SVGLangSpace.xmllang */
@@ -3719,8 +3648,8 @@
 
 
 /// @domName SVGLength
-class SVGLength extends NativeFieldWrapperClass1 {
-  SVGLength.internal();
+class Length extends NativeFieldWrapperClass1 {
+  Length.internal();
 
   static const int SVG_LENGTHTYPE_CM = 6;
 
@@ -3789,80 +3718,82 @@
 
 
 /// @domName SVGLengthList
-class SVGLengthList extends NativeFieldWrapperClass1 implements List<SVGLength> {
-  SVGLengthList.internal();
+class LengthList extends NativeFieldWrapperClass1 implements List<Length> {
+  LengthList.internal();
 
 
   /** @domName SVGLengthList.numberOfItems */
   int get numberOfItems native "SVGLengthList_numberOfItems_Getter";
 
-  SVGLength operator[](int index) native "SVGLengthList_item_Callback";
+  Length operator[](int index) native "SVGLengthList_item_Callback";
 
-  void operator[]=(int index, SVGLength value) {
+  void operator[]=(int index, Length value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
-  // -- start List<SVGLength> mixins.
-  // SVGLength is the element type.
+  // -- start List<Length> mixins.
+  // Length is the element type.
 
-  // From Iterable<SVGLength>:
+  // From Iterable<Length>:
 
-  Iterator<SVGLength> iterator() {
+  Iterator<Length> 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<SVGLength>(this);
+    return new FixedSizeListIterator<Length>(this);
   }
 
-  // From Collection<SVGLength>:
+  // From Collection<Length>:
 
-  void add(SVGLength value) {
+  void add(Length value) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  void addLast(SVGLength value) {
+  void addLast(Length value) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  void addAll(Collection<SVGLength> collection) {
+  void addAll(Collection<Length> collection) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  bool contains(SVGLength element) => _Collections.contains(this, element);
+  bool contains(Length element) => _Collections.contains(this, element);
 
-  void forEach(void f(SVGLength element)) => _Collections.forEach(this, f);
+  void forEach(void f(Length element)) => _Collections.forEach(this, f);
 
-  Collection map(f(SVGLength element)) => _Collections.map(this, [], f);
+  Collection map(f(Length element)) => _Collections.map(this, [], f);
 
-  Collection<SVGLength> filter(bool f(SVGLength element)) =>
-     _Collections.filter(this, <SVGLength>[], f);
+  Collection<Length> filter(bool f(Length element)) =>
+     _Collections.filter(this, <Length>[], f);
 
-  bool every(bool f(SVGLength element)) => _Collections.every(this, f);
+  bool every(bool f(Length element)) => _Collections.every(this, f);
 
-  bool some(bool f(SVGLength element)) => _Collections.some(this, f);
+  bool some(bool f(Length element)) => _Collections.some(this, f);
 
   bool get isEmpty => this.length == 0;
 
-  // From List<SVGLength>:
+  // From List<Length>:
 
-  void sort([Comparator<SVGLength> compare = Comparable.compare]) {
+  void sort([Comparator<Length> compare = Comparable.compare]) {
     throw new UnsupportedError("Cannot sort immutable List.");
   }
 
-  int indexOf(SVGLength element, [int start = 0]) =>
+  int indexOf(Length element, [int start = 0]) =>
       _Lists.indexOf(this, element, start, this.length);
 
-  int lastIndexOf(SVGLength element, [int start]) {
+  int lastIndexOf(Length element, [int start]) {
     if (start == null) start = length - 1;
     return _Lists.lastIndexOf(this, element, start);
   }
 
-  SVGLength get last => this[length - 1];
+  Length get first => this[0];
 
-  SVGLength removeLast() {
+  Length get last => this[length - 1];
+
+  Length removeLast() {
     throw new UnsupportedError("Cannot removeLast on immutable List.");
   }
 
-  void setRange(int start, int rangeLength, List<SVGLength> from, [int startFrom]) {
+  void setRange(int start, int rangeLength, List<Length> from, [int startFrom]) {
     throw new UnsupportedError("Cannot setRange on immutable List.");
   }
 
@@ -3870,18 +3801,18 @@
     throw new UnsupportedError("Cannot removeRange on immutable List.");
   }
 
-  void insertRange(int start, int rangeLength, [SVGLength initialValue]) {
+  void insertRange(int start, int rangeLength, [Length initialValue]) {
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
-  List<SVGLength> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <SVGLength>[]);
+  List<Length> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <Length>[]);
 
-  // -- end List<SVGLength> mixins.
+  // -- end List<Length> mixins.
 
 
   /** @domName SVGLengthList.appendItem */
-  SVGLength appendItem(SVGLength item) native "SVGLengthList_appendItem_Callback";
+  Length appendItem(Length item) native "SVGLengthList_appendItem_Callback";
 
 
   /** @domName SVGLengthList.clear */
@@ -3889,23 +3820,23 @@
 
 
   /** @domName SVGLengthList.getItem */
-  SVGLength getItem(int index) native "SVGLengthList_getItem_Callback";
+  Length getItem(int index) native "SVGLengthList_getItem_Callback";
 
 
   /** @domName SVGLengthList.initialize */
-  SVGLength initialize(SVGLength item) native "SVGLengthList_initialize_Callback";
+  Length initialize(Length item) native "SVGLengthList_initialize_Callback";
 
 
   /** @domName SVGLengthList.insertItemBefore */
-  SVGLength insertItemBefore(SVGLength item, int index) native "SVGLengthList_insertItemBefore_Callback";
+  Length insertItemBefore(Length item, int index) native "SVGLengthList_insertItemBefore_Callback";
 
 
   /** @domName SVGLengthList.removeItem */
-  SVGLength removeItem(int index) native "SVGLengthList_removeItem_Callback";
+  Length removeItem(int index) native "SVGLengthList_removeItem_Callback";
 
 
   /** @domName SVGLengthList.replaceItem */
-  SVGLength replaceItem(SVGLength item, int index) native "SVGLengthList_replaceItem_Callback";
+  Length replaceItem(Length item, int index) native "SVGLengthList_replaceItem_Callback";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3916,28 +3847,30 @@
 
 
 /// @domName SVGLineElement
-class SVGLineElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired {
-  SVGLineElement.internal(): super.internal();
+class LineElement extends SvgElement implements Transformable, Tests, Stylable, ExternalResourcesRequired, LangSpace {
+
+  factory LineElement() => _SvgElementFactoryProvider.createSvgElement_tag("line");
+  LineElement.internal(): super.internal();
 
 
   /** @domName SVGLineElement.x1 */
-  SVGAnimatedLength get x1 native "SVGLineElement_x1_Getter";
+  AnimatedLength get x1 native "SVGLineElement_x1_Getter";
 
 
   /** @domName SVGLineElement.x2 */
-  SVGAnimatedLength get x2 native "SVGLineElement_x2_Getter";
+  AnimatedLength get x2 native "SVGLineElement_x2_Getter";
 
 
   /** @domName SVGLineElement.y1 */
-  SVGAnimatedLength get y1 native "SVGLineElement_y1_Getter";
+  AnimatedLength get y1 native "SVGLineElement_y1_Getter";
 
 
   /** @domName SVGLineElement.y2 */
-  SVGAnimatedLength get y2 native "SVGLineElement_y2_Getter";
+  AnimatedLength get y2 native "SVGLineElement_y2_Getter";
 
 
   /** @domName SVGLineElement.externalResourcesRequired */
-  SVGAnimatedBoolean get externalResourcesRequired native "SVGLineElement_externalResourcesRequired_Getter";
+  AnimatedBoolean get externalResourcesRequired native "SVGLineElement_externalResourcesRequired_Getter";
 
 
   /** @domName SVGLineElement.xmllang */
@@ -3957,31 +3890,31 @@
 
 
   /** @domName SVGLineElement.farthestViewportElement */
-  SVGElement get farthestViewportElement native "SVGLineElement_farthestViewportElement_Getter";
+  SvgElement get farthestViewportElement native "SVGLineElement_farthestViewportElement_Getter";
 
 
   /** @domName SVGLineElement.nearestViewportElement */
-  SVGElement get nearestViewportElement native "SVGLineElement_nearestViewportElement_Getter";
+  SvgElement get nearestViewportElement native "SVGLineElement_nearestViewportElement_Getter";
 
 
   /** @domName SVGLineElement.getBBox */
-  SVGRect getBBox() native "SVGLineElement_getBBox_Callback";
+  Rect getBBox() native "SVGLineElement_getBBox_Callback";
 
 
   /** @domName SVGLineElement.getCTM */
-  SVGMatrix getCTM() native "SVGLineElement_getCTM_Callback";
+  Matrix getCTM() native "SVGLineElement_getCTM_Callback";
 
 
   /** @domName SVGLineElement.getScreenCTM */
-  SVGMatrix getScreenCTM() native "SVGLineElement_getScreenCTM_Callback";
+  Matrix getScreenCTM() native "SVGLineElement_getScreenCTM_Callback";
 
 
   /** @domName SVGLineElement.getTransformToElement */
-  SVGMatrix getTransformToElement(SVGElement element) native "SVGLineElement_getTransformToElement_Callback";
+  Matrix getTransformToElement(SvgElement element) native "SVGLineElement_getTransformToElement_Callback";
 
 
   /** @domName SVGLineElement.className */
-  SVGAnimatedString get $dom_svgClassName native "SVGLineElement_className_Getter";
+  AnimatedString get $dom_svgClassName native "SVGLineElement_className_Getter";
 
 
   /** @domName SVGLineElement.style */
@@ -3993,15 +3926,15 @@
 
 
   /** @domName SVGLineElement.requiredExtensions */
-  SVGStringList get requiredExtensions native "SVGLineElement_requiredExtensions_Getter";
+  StringList get requiredExtensions native "SVGLineElement_requiredExtensions_Getter";
 
 
   /** @domName SVGLineElement.requiredFeatures */
-  SVGStringList get requiredFeatures native "SVGLineElement_requiredFeatures_Getter";
+  StringList get requiredFeatures native "SVGLineElement_requiredFeatures_Getter";
 
 
   /** @domName SVGLineElement.systemLanguage */
-  SVGStringList get systemLanguage native "SVGLineElement_systemLanguage_Getter";
+  StringList get systemLanguage native "SVGLineElement_systemLanguage_Getter";
 
 
   /** @domName SVGLineElement.hasExtension */
@@ -4009,7 +3942,7 @@
 
 
   /** @domName SVGLineElement.transform */
-  SVGAnimatedTransformList get transform native "SVGLineElement_transform_Getter";
+  AnimatedTransformList get transform native "SVGLineElement_transform_Getter";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4020,24 +3953,26 @@
 
 
 /// @domName SVGLinearGradientElement
-class SVGLinearGradientElement extends SVGGradientElement {
-  SVGLinearGradientElement.internal(): super.internal();
+class LinearGradientElement extends GradientElement {
+
+  factory LinearGradientElement() => _SvgElementFactoryProvider.createSvgElement_tag("linearGradient");
+  LinearGradientElement.internal(): super.internal();
 
 
   /** @domName SVGLinearGradientElement.x1 */
-  SVGAnimatedLength get x1 native "SVGLinearGradientElement_x1_Getter";
+  AnimatedLength get x1 native "SVGLinearGradientElement_x1_Getter";
 
 
   /** @domName SVGLinearGradientElement.x2 */
-  SVGAnimatedLength get x2 native "SVGLinearGradientElement_x2_Getter";
+  AnimatedLength get x2 native "SVGLinearGradientElement_x2_Getter";
 
 
   /** @domName SVGLinearGradientElement.y1 */
-  SVGAnimatedLength get y1 native "SVGLinearGradientElement_y1_Getter";
+  AnimatedLength get y1 native "SVGLinearGradientElement_y1_Getter";
 
 
   /** @domName SVGLinearGradientElement.y2 */
-  SVGAnimatedLength get y2 native "SVGLinearGradientElement_y2_Getter";
+  AnimatedLength get y2 native "SVGLinearGradientElement_y2_Getter";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4048,32 +3983,32 @@
 
 
 /// @domName SVGLocatable
-class SVGLocatable extends NativeFieldWrapperClass1 {
-  SVGLocatable.internal();
+class Locatable extends NativeFieldWrapperClass1 {
+  Locatable.internal();
 
 
   /** @domName SVGLocatable.farthestViewportElement */
-  SVGElement get farthestViewportElement native "SVGLocatable_farthestViewportElement_Getter";
+  SvgElement get farthestViewportElement native "SVGLocatable_farthestViewportElement_Getter";
 
 
   /** @domName SVGLocatable.nearestViewportElement */
-  SVGElement get nearestViewportElement native "SVGLocatable_nearestViewportElement_Getter";
+  SvgElement get nearestViewportElement native "SVGLocatable_nearestViewportElement_Getter";
 
 
   /** @domName SVGLocatable.getBBox */
-  SVGRect getBBox() native "SVGLocatable_getBBox_Callback";
+  Rect getBBox() native "SVGLocatable_getBBox_Callback";
 
 
   /** @domName SVGLocatable.getCTM */
-  SVGMatrix getCTM() native "SVGLocatable_getCTM_Callback";
+  Matrix getCTM() native "SVGLocatable_getCTM_Callback";
 
 
   /** @domName SVGLocatable.getScreenCTM */
-  SVGMatrix getScreenCTM() native "SVGLocatable_getScreenCTM_Callback";
+  Matrix getScreenCTM() native "SVGLocatable_getScreenCTM_Callback";
 
 
   /** @domName SVGLocatable.getTransformToElement */
-  SVGMatrix getTransformToElement(SVGElement element) native "SVGLocatable_getTransformToElement_Callback";
+  Matrix getTransformToElement(SvgElement element) native "SVGLocatable_getTransformToElement_Callback";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4084,16 +4019,18 @@
 
 
 /// @domName SVGMPathElement
-class SVGMPathElement extends SVGElement implements SVGURIReference, SVGExternalResourcesRequired {
-  SVGMPathElement.internal(): super.internal();
+class MPathElement extends SvgElement implements UriReference, ExternalResourcesRequired {
+
+  factory MPathElement() => _SvgElementFactoryProvider.createSvgElement_tag("mpath");
+  MPathElement.internal(): super.internal();
 
 
   /** @domName SVGMPathElement.externalResourcesRequired */
-  SVGAnimatedBoolean get externalResourcesRequired native "SVGMPathElement_externalResourcesRequired_Getter";
+  AnimatedBoolean get externalResourcesRequired native "SVGMPathElement_externalResourcesRequired_Getter";
 
 
   /** @domName SVGMPathElement.href */
-  SVGAnimatedString get href native "SVGMPathElement_href_Getter";
+  AnimatedString get href native "SVGMPathElement_href_Getter";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4104,8 +4041,10 @@
 
 
 /// @domName SVGMarkerElement
-class SVGMarkerElement extends SVGElement implements SVGLangSpace, SVGFitToViewBox, SVGExternalResourcesRequired, SVGStylable {
-  SVGMarkerElement.internal(): super.internal();
+class MarkerElement extends SvgElement implements FitToViewBox, ExternalResourcesRequired, Stylable, LangSpace {
+
+  factory MarkerElement() => _SvgElementFactoryProvider.createSvgElement_tag("marker");
+  MarkerElement.internal(): super.internal();
 
   static const int SVG_MARKERUNITS_STROKEWIDTH = 2;
 
@@ -4121,35 +4060,35 @@
 
 
   /** @domName SVGMarkerElement.markerHeight */
-  SVGAnimatedLength get markerHeight native "SVGMarkerElement_markerHeight_Getter";
+  AnimatedLength get markerHeight native "SVGMarkerElement_markerHeight_Getter";
 
 
   /** @domName SVGMarkerElement.markerUnits */
-  SVGAnimatedEnumeration get markerUnits native "SVGMarkerElement_markerUnits_Getter";
+  AnimatedEnumeration get markerUnits native "SVGMarkerElement_markerUnits_Getter";
 
 
   /** @domName SVGMarkerElement.markerWidth */
-  SVGAnimatedLength get markerWidth native "SVGMarkerElement_markerWidth_Getter";
+  AnimatedLength get markerWidth native "SVGMarkerElement_markerWidth_Getter";
 
 
   /** @domName SVGMarkerElement.orientAngle */
-  SVGAnimatedAngle get orientAngle native "SVGMarkerElement_orientAngle_Getter";
+  AnimatedAngle get orientAngle native "SVGMarkerElement_orientAngle_Getter";
 
 
   /** @domName SVGMarkerElement.orientType */
-  SVGAnimatedEnumeration get orientType native "SVGMarkerElement_orientType_Getter";
+  AnimatedEnumeration get orientType native "SVGMarkerElement_orientType_Getter";
 
 
   /** @domName SVGMarkerElement.refX */
-  SVGAnimatedLength get refX native "SVGMarkerElement_refX_Getter";
+  AnimatedLength get refX native "SVGMarkerElement_refX_Getter";
 
 
   /** @domName SVGMarkerElement.refY */
-  SVGAnimatedLength get refY native "SVGMarkerElement_refY_Getter";
+  AnimatedLength get refY native "SVGMarkerElement_refY_Getter";
 
 
   /** @domName SVGMarkerElement.setOrientToAngle */
-  void setOrientToAngle(SVGAngle angle) native "SVGMarkerElement_setOrientToAngle_Callback";
+  void setOrientToAngle(Angle angle) native "SVGMarkerElement_setOrientToAngle_Callback";
 
 
   /** @domName SVGMarkerElement.setOrientToAuto */
@@ -4157,15 +4096,15 @@
 
 
   /** @domName SVGMarkerElement.externalResourcesRequired */
-  SVGAnimatedBoolean get externalResourcesRequired native "SVGMarkerElement_externalResourcesRequired_Getter";
+  AnimatedBoolean get externalResourcesRequired native "SVGMarkerElement_externalResourcesRequired_Getter";
 
 
   /** @domName SVGMarkerElement.preserveAspectRatio */
-  SVGAnimatedPreserveAspectRatio get preserveAspectRatio native "SVGMarkerElement_preserveAspectRatio_Getter";
+  AnimatedPreserveAspectRatio get preserveAspectRatio native "SVGMarkerElement_preserveAspectRatio_Getter";
 
 
   /** @domName SVGMarkerElement.viewBox */
-  SVGAnimatedRect get viewBox native "SVGMarkerElement_viewBox_Getter";
+  AnimatedRect get viewBox native "SVGMarkerElement_viewBox_Getter";
 
 
   /** @domName SVGMarkerElement.xmllang */
@@ -4185,7 +4124,7 @@
 
 
   /** @domName SVGMarkerElement.className */
-  SVGAnimatedString get $dom_svgClassName native "SVGMarkerElement_className_Getter";
+  AnimatedString get $dom_svgClassName native "SVGMarkerElement_className_Getter";
 
 
   /** @domName SVGMarkerElement.style */
@@ -4204,36 +4143,38 @@
 
 
 /// @domName SVGMaskElement
-class SVGMaskElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGExternalResourcesRequired {
-  SVGMaskElement.internal(): super.internal();
+class MaskElement extends SvgElement implements Tests, Stylable, ExternalResourcesRequired, LangSpace {
+
+  factory MaskElement() => _SvgElementFactoryProvider.createSvgElement_tag("mask");
+  MaskElement.internal(): super.internal();
 
 
   /** @domName SVGMaskElement.height */
-  SVGAnimatedLength get height native "SVGMaskElement_height_Getter";
+  AnimatedLength get height native "SVGMaskElement_height_Getter";
 
 
   /** @domName SVGMaskElement.maskContentUnits */
-  SVGAnimatedEnumeration get maskContentUnits native "SVGMaskElement_maskContentUnits_Getter";
+  AnimatedEnumeration get maskContentUnits native "SVGMaskElement_maskContentUnits_Getter";
 
 
   /** @domName SVGMaskElement.maskUnits */
-  SVGAnimatedEnumeration get maskUnits native "SVGMaskElement_maskUnits_Getter";
+  AnimatedEnumeration get maskUnits native "SVGMaskElement_maskUnits_Getter";
 
 
   /** @domName SVGMaskElement.width */
-  SVGAnimatedLength get width native "SVGMaskElement_width_Getter";
+  AnimatedLength get width native "SVGMaskElement_width_Getter";
 
 
   /** @domName SVGMaskElement.x */
-  SVGAnimatedLength get x native "SVGMaskElement_x_Getter";
+  AnimatedLength get x native "SVGMaskElement_x_Getter";
 
 
   /** @domName SVGMaskElement.y */
-  SVGAnimatedLength get y native "SVGMaskElement_y_Getter";
+  AnimatedLength get y native "SVGMaskElement_y_Getter";
 
 
   /** @domName SVGMaskElement.externalResourcesRequired */
-  SVGAnimatedBoolean get externalResourcesRequired native "SVGMaskElement_externalResourcesRequired_Getter";
+  AnimatedBoolean get externalResourcesRequired native "SVGMaskElement_externalResourcesRequired_Getter";
 
 
   /** @domName SVGMaskElement.xmllang */
@@ -4253,7 +4194,7 @@
 
 
   /** @domName SVGMaskElement.className */
-  SVGAnimatedString get $dom_svgClassName native "SVGMaskElement_className_Getter";
+  AnimatedString get $dom_svgClassName native "SVGMaskElement_className_Getter";
 
 
   /** @domName SVGMaskElement.style */
@@ -4265,15 +4206,15 @@
 
 
   /** @domName SVGMaskElement.requiredExtensions */
-  SVGStringList get requiredExtensions native "SVGMaskElement_requiredExtensions_Getter";
+  StringList get requiredExtensions native "SVGMaskElement_requiredExtensions_Getter";
 
 
   /** @domName SVGMaskElement.requiredFeatures */
-  SVGStringList get requiredFeatures native "SVGMaskElement_requiredFeatures_Getter";
+  StringList get requiredFeatures native "SVGMaskElement_requiredFeatures_Getter";
 
 
   /** @domName SVGMaskElement.systemLanguage */
-  SVGStringList get systemLanguage native "SVGMaskElement_systemLanguage_Getter";
+  StringList get systemLanguage native "SVGMaskElement_systemLanguage_Getter";
 
 
   /** @domName SVGMaskElement.hasExtension */
@@ -4288,8 +4229,8 @@
 
 
 /// @domName SVGMatrix
-class SVGMatrix extends NativeFieldWrapperClass1 {
-  SVGMatrix.internal();
+class Matrix extends NativeFieldWrapperClass1 {
+  Matrix.internal();
 
 
   /** @domName SVGMatrix.a */
@@ -4341,47 +4282,47 @@
 
 
   /** @domName SVGMatrix.flipX */
-  SVGMatrix flipX() native "SVGMatrix_flipX_Callback";
+  Matrix flipX() native "SVGMatrix_flipX_Callback";
 
 
   /** @domName SVGMatrix.flipY */
-  SVGMatrix flipY() native "SVGMatrix_flipY_Callback";
+  Matrix flipY() native "SVGMatrix_flipY_Callback";
 
 
   /** @domName SVGMatrix.inverse */
-  SVGMatrix inverse() native "SVGMatrix_inverse_Callback";
+  Matrix inverse() native "SVGMatrix_inverse_Callback";
 
 
   /** @domName SVGMatrix.multiply */
-  SVGMatrix multiply(SVGMatrix secondMatrix) native "SVGMatrix_multiply_Callback";
+  Matrix multiply(Matrix secondMatrix) native "SVGMatrix_multiply_Callback";
 
 
   /** @domName SVGMatrix.rotate */
-  SVGMatrix rotate(num angle) native "SVGMatrix_rotate_Callback";
+  Matrix rotate(num angle) native "SVGMatrix_rotate_Callback";
 
 
   /** @domName SVGMatrix.rotateFromVector */
-  SVGMatrix rotateFromVector(num x, num y) native "SVGMatrix_rotateFromVector_Callback";
+  Matrix rotateFromVector(num x, num y) native "SVGMatrix_rotateFromVector_Callback";
 
 
   /** @domName SVGMatrix.scale */
-  SVGMatrix scale(num scaleFactor) native "SVGMatrix_scale_Callback";
+  Matrix scale(num scaleFactor) native "SVGMatrix_scale_Callback";
 
 
   /** @domName SVGMatrix.scaleNonUniform */
-  SVGMatrix scaleNonUniform(num scaleFactorX, num scaleFactorY) native "SVGMatrix_scaleNonUniform_Callback";
+  Matrix scaleNonUniform(num scaleFactorX, num scaleFactorY) native "SVGMatrix_scaleNonUniform_Callback";
 
 
   /** @domName SVGMatrix.skewX */
-  SVGMatrix skewX(num angle) native "SVGMatrix_skewX_Callback";
+  Matrix skewX(num angle) native "SVGMatrix_skewX_Callback";
 
 
   /** @domName SVGMatrix.skewY */
-  SVGMatrix skewY(num angle) native "SVGMatrix_skewY_Callback";
+  Matrix skewY(num angle) native "SVGMatrix_skewY_Callback";
 
 
   /** @domName SVGMatrix.translate */
-  SVGMatrix translate(num x, num y) native "SVGMatrix_translate_Callback";
+  Matrix translate(num x, num y) native "SVGMatrix_translate_Callback";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4392,8 +4333,8 @@
 
 
 /// @domName SVGMetadataElement
-class SVGMetadataElement extends SVGElement {
-  SVGMetadataElement.internal(): super.internal();
+class MetadataElement extends SvgElement {
+  MetadataElement.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4404,8 +4345,8 @@
 
 
 /// @domName SVGMissingGlyphElement
-class SVGMissingGlyphElement extends SVGElement {
-  SVGMissingGlyphElement.internal(): super.internal();
+class MissingGlyphElement extends SvgElement {
+  MissingGlyphElement.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4416,8 +4357,8 @@
 
 
 /// @domName SVGNumber
-class SVGNumber extends NativeFieldWrapperClass1 {
-  SVGNumber.internal();
+class Number extends NativeFieldWrapperClass1 {
+  Number.internal();
 
 
   /** @domName SVGNumber.value */
@@ -4436,80 +4377,82 @@
 
 
 /// @domName SVGNumberList
-class SVGNumberList extends NativeFieldWrapperClass1 implements List<SVGNumber> {
-  SVGNumberList.internal();
+class NumberList extends NativeFieldWrapperClass1 implements List<Number> {
+  NumberList.internal();
 
 
   /** @domName SVGNumberList.numberOfItems */
   int get numberOfItems native "SVGNumberList_numberOfItems_Getter";
 
-  SVGNumber operator[](int index) native "SVGNumberList_item_Callback";
+  Number operator[](int index) native "SVGNumberList_item_Callback";
 
-  void operator[]=(int index, SVGNumber value) {
+  void operator[]=(int index, Number value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
-  // -- start List<SVGNumber> mixins.
-  // SVGNumber is the element type.
+  // -- start List<Number> mixins.
+  // Number is the element type.
 
-  // From Iterable<SVGNumber>:
+  // From Iterable<Number>:
 
-  Iterator<SVGNumber> iterator() {
+  Iterator<Number> 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<SVGNumber>(this);
+    return new FixedSizeListIterator<Number>(this);
   }
 
-  // From Collection<SVGNumber>:
+  // From Collection<Number>:
 
-  void add(SVGNumber value) {
+  void add(Number value) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  void addLast(SVGNumber value) {
+  void addLast(Number value) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  void addAll(Collection<SVGNumber> collection) {
+  void addAll(Collection<Number> collection) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  bool contains(SVGNumber element) => _Collections.contains(this, element);
+  bool contains(Number element) => _Collections.contains(this, element);
 
-  void forEach(void f(SVGNumber element)) => _Collections.forEach(this, f);
+  void forEach(void f(Number element)) => _Collections.forEach(this, f);
 
-  Collection map(f(SVGNumber element)) => _Collections.map(this, [], f);
+  Collection map(f(Number element)) => _Collections.map(this, [], f);
 
-  Collection<SVGNumber> filter(bool f(SVGNumber element)) =>
-     _Collections.filter(this, <SVGNumber>[], f);
+  Collection<Number> filter(bool f(Number element)) =>
+     _Collections.filter(this, <Number>[], f);
 
-  bool every(bool f(SVGNumber element)) => _Collections.every(this, f);
+  bool every(bool f(Number element)) => _Collections.every(this, f);
 
-  bool some(bool f(SVGNumber element)) => _Collections.some(this, f);
+  bool some(bool f(Number element)) => _Collections.some(this, f);
 
   bool get isEmpty => this.length == 0;
 
-  // From List<SVGNumber>:
+  // From List<Number>:
 
-  void sort([Comparator<SVGNumber> compare = Comparable.compare]) {
+  void sort([Comparator<Number> compare = Comparable.compare]) {
     throw new UnsupportedError("Cannot sort immutable List.");
   }
 
-  int indexOf(SVGNumber element, [int start = 0]) =>
+  int indexOf(Number element, [int start = 0]) =>
       _Lists.indexOf(this, element, start, this.length);
 
-  int lastIndexOf(SVGNumber element, [int start]) {
+  int lastIndexOf(Number element, [int start]) {
     if (start == null) start = length - 1;
     return _Lists.lastIndexOf(this, element, start);
   }
 
-  SVGNumber get last => this[length - 1];
+  Number get first => this[0];
 
-  SVGNumber removeLast() {
+  Number get last => this[length - 1];
+
+  Number removeLast() {
     throw new UnsupportedError("Cannot removeLast on immutable List.");
   }
 
-  void setRange(int start, int rangeLength, List<SVGNumber> from, [int startFrom]) {
+  void setRange(int start, int rangeLength, List<Number> from, [int startFrom]) {
     throw new UnsupportedError("Cannot setRange on immutable List.");
   }
 
@@ -4517,18 +4460,18 @@
     throw new UnsupportedError("Cannot removeRange on immutable List.");
   }
 
-  void insertRange(int start, int rangeLength, [SVGNumber initialValue]) {
+  void insertRange(int start, int rangeLength, [Number initialValue]) {
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
-  List<SVGNumber> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <SVGNumber>[]);
+  List<Number> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <Number>[]);
 
-  // -- end List<SVGNumber> mixins.
+  // -- end List<Number> mixins.
 
 
   /** @domName SVGNumberList.appendItem */
-  SVGNumber appendItem(SVGNumber item) native "SVGNumberList_appendItem_Callback";
+  Number appendItem(Number item) native "SVGNumberList_appendItem_Callback";
 
 
   /** @domName SVGNumberList.clear */
@@ -4536,23 +4479,23 @@
 
 
   /** @domName SVGNumberList.getItem */
-  SVGNumber getItem(int index) native "SVGNumberList_getItem_Callback";
+  Number getItem(int index) native "SVGNumberList_getItem_Callback";
 
 
   /** @domName SVGNumberList.initialize */
-  SVGNumber initialize(SVGNumber item) native "SVGNumberList_initialize_Callback";
+  Number initialize(Number item) native "SVGNumberList_initialize_Callback";
 
 
   /** @domName SVGNumberList.insertItemBefore */
-  SVGNumber insertItemBefore(SVGNumber item, int index) native "SVGNumberList_insertItemBefore_Callback";
+  Number insertItemBefore(Number item, int index) native "SVGNumberList_insertItemBefore_Callback";
 
 
   /** @domName SVGNumberList.removeItem */
-  SVGNumber removeItem(int index) native "SVGNumberList_removeItem_Callback";
+  Number removeItem(int index) native "SVGNumberList_removeItem_Callback";
 
 
   /** @domName SVGNumberList.replaceItem */
-  SVGNumber replaceItem(SVGNumber item, int index) native "SVGNumberList_replaceItem_Callback";
+  Number replaceItem(Number item, int index) native "SVGNumberList_replaceItem_Callback";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4563,8 +4506,8 @@
 
 
 /// @domName SVGPaint
-class SVGPaint extends SVGColor {
-  SVGPaint.internal(): super.internal();
+class Paint extends Color {
+  Paint.internal(): super.internal();
 
   static const int SVG_PAINTTYPE_CURRENTCOLOR = 102;
 
@@ -4611,104 +4554,106 @@
 
 
 /// @domName SVGPathElement
-class SVGPathElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired {
-  SVGPathElement.internal(): super.internal();
+class PathElement extends SvgElement implements Transformable, Tests, Stylable, ExternalResourcesRequired, LangSpace {
+
+  factory PathElement() => _SvgElementFactoryProvider.createSvgElement_tag("path");
+  PathElement.internal(): super.internal();
 
 
   /** @domName SVGPathElement.animatedNormalizedPathSegList */
-  SVGPathSegList get animatedNormalizedPathSegList native "SVGPathElement_animatedNormalizedPathSegList_Getter";
+  PathSegList get animatedNormalizedPathSegList native "SVGPathElement_animatedNormalizedPathSegList_Getter";
 
 
   /** @domName SVGPathElement.animatedPathSegList */
-  SVGPathSegList get animatedPathSegList native "SVGPathElement_animatedPathSegList_Getter";
+  PathSegList get animatedPathSegList native "SVGPathElement_animatedPathSegList_Getter";
 
 
   /** @domName SVGPathElement.normalizedPathSegList */
-  SVGPathSegList get normalizedPathSegList native "SVGPathElement_normalizedPathSegList_Getter";
+  PathSegList get normalizedPathSegList native "SVGPathElement_normalizedPathSegList_Getter";
 
 
   /** @domName SVGPathElement.pathLength */
-  SVGAnimatedNumber get pathLength native "SVGPathElement_pathLength_Getter";
+  AnimatedNumber get pathLength native "SVGPathElement_pathLength_Getter";
 
 
   /** @domName SVGPathElement.pathSegList */
-  SVGPathSegList get pathSegList native "SVGPathElement_pathSegList_Getter";
+  PathSegList get pathSegList native "SVGPathElement_pathSegList_Getter";
 
 
   /** @domName SVGPathElement.createSVGPathSegArcAbs */
-  SVGPathSegArcAbs 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 */
-  SVGPathSegArcRel 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 */
-  SVGPathSegClosePath createSVGPathSegClosePath() native "SVGPathElement_createSVGPathSegClosePath_Callback";
+  PathSegClosePath createSVGPathSegClosePath() native "SVGPathElement_createSVGPathSegClosePath_Callback";
 
 
   /** @domName SVGPathElement.createSVGPathSegCurvetoCubicAbs */
-  SVGPathSegCurvetoCubicAbs 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 */
-  SVGPathSegCurvetoCubicRel 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 */
-  SVGPathSegCurvetoCubicSmoothAbs 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 */
-  SVGPathSegCurvetoCubicSmoothRel 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 */
-  SVGPathSegCurvetoQuadraticAbs 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 */
-  SVGPathSegCurvetoQuadraticRel 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 */
-  SVGPathSegCurvetoQuadraticSmoothAbs createSVGPathSegCurvetoQuadraticSmoothAbs(num x, num y) native "SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothAbs_Callback";
+  PathSegCurvetoQuadraticSmoothAbs createSVGPathSegCurvetoQuadraticSmoothAbs(num x, num y) native "SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothAbs_Callback";
 
 
   /** @domName SVGPathElement.createSVGPathSegCurvetoQuadraticSmoothRel */
-  SVGPathSegCurvetoQuadraticSmoothRel createSVGPathSegCurvetoQuadraticSmoothRel(num x, num y) native "SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothRel_Callback";
+  PathSegCurvetoQuadraticSmoothRel createSVGPathSegCurvetoQuadraticSmoothRel(num x, num y) native "SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothRel_Callback";
 
 
   /** @domName SVGPathElement.createSVGPathSegLinetoAbs */
-  SVGPathSegLinetoAbs createSVGPathSegLinetoAbs(num x, num y) native "SVGPathElement_createSVGPathSegLinetoAbs_Callback";
+  PathSegLinetoAbs createSVGPathSegLinetoAbs(num x, num y) native "SVGPathElement_createSVGPathSegLinetoAbs_Callback";
 
 
   /** @domName SVGPathElement.createSVGPathSegLinetoHorizontalAbs */
-  SVGPathSegLinetoHorizontalAbs createSVGPathSegLinetoHorizontalAbs(num x) native "SVGPathElement_createSVGPathSegLinetoHorizontalAbs_Callback";
+  PathSegLinetoHorizontalAbs createSVGPathSegLinetoHorizontalAbs(num x) native "SVGPathElement_createSVGPathSegLinetoHorizontalAbs_Callback";
 
 
   /** @domName SVGPathElement.createSVGPathSegLinetoHorizontalRel */
-  SVGPathSegLinetoHorizontalRel createSVGPathSegLinetoHorizontalRel(num x) native "SVGPathElement_createSVGPathSegLinetoHorizontalRel_Callback";
+  PathSegLinetoHorizontalRel createSVGPathSegLinetoHorizontalRel(num x) native "SVGPathElement_createSVGPathSegLinetoHorizontalRel_Callback";
 
 
   /** @domName SVGPathElement.createSVGPathSegLinetoRel */
-  SVGPathSegLinetoRel createSVGPathSegLinetoRel(num x, num y) native "SVGPathElement_createSVGPathSegLinetoRel_Callback";
+  PathSegLinetoRel createSVGPathSegLinetoRel(num x, num y) native "SVGPathElement_createSVGPathSegLinetoRel_Callback";
 
 
   /** @domName SVGPathElement.createSVGPathSegLinetoVerticalAbs */
-  SVGPathSegLinetoVerticalAbs createSVGPathSegLinetoVerticalAbs(num y) native "SVGPathElement_createSVGPathSegLinetoVerticalAbs_Callback";
+  PathSegLinetoVerticalAbs createSVGPathSegLinetoVerticalAbs(num y) native "SVGPathElement_createSVGPathSegLinetoVerticalAbs_Callback";
 
 
   /** @domName SVGPathElement.createSVGPathSegLinetoVerticalRel */
-  SVGPathSegLinetoVerticalRel createSVGPathSegLinetoVerticalRel(num y) native "SVGPathElement_createSVGPathSegLinetoVerticalRel_Callback";
+  PathSegLinetoVerticalRel createSVGPathSegLinetoVerticalRel(num y) native "SVGPathElement_createSVGPathSegLinetoVerticalRel_Callback";
 
 
   /** @domName SVGPathElement.createSVGPathSegMovetoAbs */
-  SVGPathSegMovetoAbs createSVGPathSegMovetoAbs(num x, num y) native "SVGPathElement_createSVGPathSegMovetoAbs_Callback";
+  PathSegMovetoAbs createSVGPathSegMovetoAbs(num x, num y) native "SVGPathElement_createSVGPathSegMovetoAbs_Callback";
 
 
   /** @domName SVGPathElement.createSVGPathSegMovetoRel */
-  SVGPathSegMovetoRel createSVGPathSegMovetoRel(num x, num y) native "SVGPathElement_createSVGPathSegMovetoRel_Callback";
+  PathSegMovetoRel createSVGPathSegMovetoRel(num x, num y) native "SVGPathElement_createSVGPathSegMovetoRel_Callback";
 
 
   /** @domName SVGPathElement.getPathSegAtLength */
@@ -4716,7 +4661,7 @@
 
 
   /** @domName SVGPathElement.getPointAtLength */
-  SVGPoint getPointAtLength(num distance) native "SVGPathElement_getPointAtLength_Callback";
+  Point getPointAtLength(num distance) native "SVGPathElement_getPointAtLength_Callback";
 
 
   /** @domName SVGPathElement.getTotalLength */
@@ -4724,7 +4669,7 @@
 
 
   /** @domName SVGPathElement.externalResourcesRequired */
-  SVGAnimatedBoolean get externalResourcesRequired native "SVGPathElement_externalResourcesRequired_Getter";
+  AnimatedBoolean get externalResourcesRequired native "SVGPathElement_externalResourcesRequired_Getter";
 
 
   /** @domName SVGPathElement.xmllang */
@@ -4744,31 +4689,31 @@
 
 
   /** @domName SVGPathElement.farthestViewportElement */
-  SVGElement get farthestViewportElement native "SVGPathElement_farthestViewportElement_Getter";
+  SvgElement get farthestViewportElement native "SVGPathElement_farthestViewportElement_Getter";
 
 
   /** @domName SVGPathElement.nearestViewportElement */
-  SVGElement get nearestViewportElement native "SVGPathElement_nearestViewportElement_Getter";
+  SvgElement get nearestViewportElement native "SVGPathElement_nearestViewportElement_Getter";
 
 
   /** @domName SVGPathElement.getBBox */
-  SVGRect getBBox() native "SVGPathElement_getBBox_Callback";
+  Rect getBBox() native "SVGPathElement_getBBox_Callback";
 
 
   /** @domName SVGPathElement.getCTM */
-  SVGMatrix getCTM() native "SVGPathElement_getCTM_Callback";
+  Matrix getCTM() native "SVGPathElement_getCTM_Callback";
 
 
   /** @domName SVGPathElement.getScreenCTM */
-  SVGMatrix getScreenCTM() native "SVGPathElement_getScreenCTM_Callback";
+  Matrix getScreenCTM() native "SVGPathElement_getScreenCTM_Callback";
 
 
   /** @domName SVGPathElement.getTransformToElement */
-  SVGMatrix getTransformToElement(SVGElement element) native "SVGPathElement_getTransformToElement_Callback";
+  Matrix getTransformToElement(SvgElement element) native "SVGPathElement_getTransformToElement_Callback";
 
 
   /** @domName SVGPathElement.className */
-  SVGAnimatedString get $dom_svgClassName native "SVGPathElement_className_Getter";
+  AnimatedString get $dom_svgClassName native "SVGPathElement_className_Getter";
 
 
   /** @domName SVGPathElement.style */
@@ -4780,15 +4725,15 @@
 
 
   /** @domName SVGPathElement.requiredExtensions */
-  SVGStringList get requiredExtensions native "SVGPathElement_requiredExtensions_Getter";
+  StringList get requiredExtensions native "SVGPathElement_requiredExtensions_Getter";
 
 
   /** @domName SVGPathElement.requiredFeatures */
-  SVGStringList get requiredFeatures native "SVGPathElement_requiredFeatures_Getter";
+  StringList get requiredFeatures native "SVGPathElement_requiredFeatures_Getter";
 
 
   /** @domName SVGPathElement.systemLanguage */
-  SVGStringList get systemLanguage native "SVGPathElement_systemLanguage_Getter";
+  StringList get systemLanguage native "SVGPathElement_systemLanguage_Getter";
 
 
   /** @domName SVGPathElement.hasExtension */
@@ -4796,7 +4741,7 @@
 
 
   /** @domName SVGPathElement.transform */
-  SVGAnimatedTransformList get transform native "SVGPathElement_transform_Getter";
+  AnimatedTransformList get transform native "SVGPathElement_transform_Getter";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4807,8 +4752,8 @@
 
 
 /// @domName SVGPathSeg
-class SVGPathSeg extends NativeFieldWrapperClass1 {
-  SVGPathSeg.internal();
+class PathSeg extends NativeFieldWrapperClass1 {
+  PathSeg.internal();
 
   static const int PATHSEG_ARC_ABS = 10;
 
@@ -4867,8 +4812,8 @@
 
 
 /// @domName SVGPathSegArcAbs
-class SVGPathSegArcAbs extends SVGPathSeg {
-  SVGPathSegArcAbs.internal(): super.internal();
+class PathSegArcAbs extends PathSeg {
+  PathSegArcAbs.internal(): super.internal();
 
 
   /** @domName SVGPathSegArcAbs.angle */
@@ -4935,8 +4880,8 @@
 
 
 /// @domName SVGPathSegArcRel
-class SVGPathSegArcRel extends SVGPathSeg {
-  SVGPathSegArcRel.internal(): super.internal();
+class PathSegArcRel extends PathSeg {
+  PathSegArcRel.internal(): super.internal();
 
 
   /** @domName SVGPathSegArcRel.angle */
@@ -5003,8 +4948,8 @@
 
 
 /// @domName SVGPathSegClosePath
-class SVGPathSegClosePath extends SVGPathSeg {
-  SVGPathSegClosePath.internal(): super.internal();
+class PathSegClosePath extends PathSeg {
+  PathSegClosePath.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5015,8 +4960,8 @@
 
 
 /// @domName SVGPathSegCurvetoCubicAbs
-class SVGPathSegCurvetoCubicAbs extends SVGPathSeg {
-  SVGPathSegCurvetoCubicAbs.internal(): super.internal();
+class PathSegCurvetoCubicAbs extends PathSeg {
+  PathSegCurvetoCubicAbs.internal(): super.internal();
 
 
   /** @domName SVGPathSegCurvetoCubicAbs.x */
@@ -5075,8 +5020,8 @@
 
 
 /// @domName SVGPathSegCurvetoCubicRel
-class SVGPathSegCurvetoCubicRel extends SVGPathSeg {
-  SVGPathSegCurvetoCubicRel.internal(): super.internal();
+class PathSegCurvetoCubicRel extends PathSeg {
+  PathSegCurvetoCubicRel.internal(): super.internal();
 
 
   /** @domName SVGPathSegCurvetoCubicRel.x */
@@ -5135,8 +5080,8 @@
 
 
 /// @domName SVGPathSegCurvetoCubicSmoothAbs
-class SVGPathSegCurvetoCubicSmoothAbs extends SVGPathSeg {
-  SVGPathSegCurvetoCubicSmoothAbs.internal(): super.internal();
+class PathSegCurvetoCubicSmoothAbs extends PathSeg {
+  PathSegCurvetoCubicSmoothAbs.internal(): super.internal();
 
 
   /** @domName SVGPathSegCurvetoCubicSmoothAbs.x */
@@ -5179,8 +5124,8 @@
 
 
 /// @domName SVGPathSegCurvetoCubicSmoothRel
-class SVGPathSegCurvetoCubicSmoothRel extends SVGPathSeg {
-  SVGPathSegCurvetoCubicSmoothRel.internal(): super.internal();
+class PathSegCurvetoCubicSmoothRel extends PathSeg {
+  PathSegCurvetoCubicSmoothRel.internal(): super.internal();
 
 
   /** @domName SVGPathSegCurvetoCubicSmoothRel.x */
@@ -5223,8 +5168,8 @@
 
 
 /// @domName SVGPathSegCurvetoQuadraticAbs
-class SVGPathSegCurvetoQuadraticAbs extends SVGPathSeg {
-  SVGPathSegCurvetoQuadraticAbs.internal(): super.internal();
+class PathSegCurvetoQuadraticAbs extends PathSeg {
+  PathSegCurvetoQuadraticAbs.internal(): super.internal();
 
 
   /** @domName SVGPathSegCurvetoQuadraticAbs.x */
@@ -5267,8 +5212,8 @@
 
 
 /// @domName SVGPathSegCurvetoQuadraticRel
-class SVGPathSegCurvetoQuadraticRel extends SVGPathSeg {
-  SVGPathSegCurvetoQuadraticRel.internal(): super.internal();
+class PathSegCurvetoQuadraticRel extends PathSeg {
+  PathSegCurvetoQuadraticRel.internal(): super.internal();
 
 
   /** @domName SVGPathSegCurvetoQuadraticRel.x */
@@ -5311,8 +5256,8 @@
 
 
 /// @domName SVGPathSegCurvetoQuadraticSmoothAbs
-class SVGPathSegCurvetoQuadraticSmoothAbs extends SVGPathSeg {
-  SVGPathSegCurvetoQuadraticSmoothAbs.internal(): super.internal();
+class PathSegCurvetoQuadraticSmoothAbs extends PathSeg {
+  PathSegCurvetoQuadraticSmoothAbs.internal(): super.internal();
 
 
   /** @domName SVGPathSegCurvetoQuadraticSmoothAbs.x */
@@ -5339,8 +5284,8 @@
 
 
 /// @domName SVGPathSegCurvetoQuadraticSmoothRel
-class SVGPathSegCurvetoQuadraticSmoothRel extends SVGPathSeg {
-  SVGPathSegCurvetoQuadraticSmoothRel.internal(): super.internal();
+class PathSegCurvetoQuadraticSmoothRel extends PathSeg {
+  PathSegCurvetoQuadraticSmoothRel.internal(): super.internal();
 
 
   /** @domName SVGPathSegCurvetoQuadraticSmoothRel.x */
@@ -5367,8 +5312,8 @@
 
 
 /// @domName SVGPathSegLinetoAbs
-class SVGPathSegLinetoAbs extends SVGPathSeg {
-  SVGPathSegLinetoAbs.internal(): super.internal();
+class PathSegLinetoAbs extends PathSeg {
+  PathSegLinetoAbs.internal(): super.internal();
 
 
   /** @domName SVGPathSegLinetoAbs.x */
@@ -5395,8 +5340,8 @@
 
 
 /// @domName SVGPathSegLinetoHorizontalAbs
-class SVGPathSegLinetoHorizontalAbs extends SVGPathSeg {
-  SVGPathSegLinetoHorizontalAbs.internal(): super.internal();
+class PathSegLinetoHorizontalAbs extends PathSeg {
+  PathSegLinetoHorizontalAbs.internal(): super.internal();
 
 
   /** @domName SVGPathSegLinetoHorizontalAbs.x */
@@ -5415,8 +5360,8 @@
 
 
 /// @domName SVGPathSegLinetoHorizontalRel
-class SVGPathSegLinetoHorizontalRel extends SVGPathSeg {
-  SVGPathSegLinetoHorizontalRel.internal(): super.internal();
+class PathSegLinetoHorizontalRel extends PathSeg {
+  PathSegLinetoHorizontalRel.internal(): super.internal();
 
 
   /** @domName SVGPathSegLinetoHorizontalRel.x */
@@ -5435,8 +5380,8 @@
 
 
 /// @domName SVGPathSegLinetoRel
-class SVGPathSegLinetoRel extends SVGPathSeg {
-  SVGPathSegLinetoRel.internal(): super.internal();
+class PathSegLinetoRel extends PathSeg {
+  PathSegLinetoRel.internal(): super.internal();
 
 
   /** @domName SVGPathSegLinetoRel.x */
@@ -5463,8 +5408,8 @@
 
 
 /// @domName SVGPathSegLinetoVerticalAbs
-class SVGPathSegLinetoVerticalAbs extends SVGPathSeg {
-  SVGPathSegLinetoVerticalAbs.internal(): super.internal();
+class PathSegLinetoVerticalAbs extends PathSeg {
+  PathSegLinetoVerticalAbs.internal(): super.internal();
 
 
   /** @domName SVGPathSegLinetoVerticalAbs.y */
@@ -5483,8 +5428,8 @@
 
 
 /// @domName SVGPathSegLinetoVerticalRel
-class SVGPathSegLinetoVerticalRel extends SVGPathSeg {
-  SVGPathSegLinetoVerticalRel.internal(): super.internal();
+class PathSegLinetoVerticalRel extends PathSeg {
+  PathSegLinetoVerticalRel.internal(): super.internal();
 
 
   /** @domName SVGPathSegLinetoVerticalRel.y */
@@ -5503,80 +5448,82 @@
 
 
 /// @domName SVGPathSegList
-class SVGPathSegList extends NativeFieldWrapperClass1 implements List<SVGPathSeg> {
-  SVGPathSegList.internal();
+class PathSegList extends NativeFieldWrapperClass1 implements List<PathSeg> {
+  PathSegList.internal();
 
 
   /** @domName SVGPathSegList.numberOfItems */
   int get numberOfItems native "SVGPathSegList_numberOfItems_Getter";
 
-  SVGPathSeg operator[](int index) native "SVGPathSegList_item_Callback";
+  PathSeg operator[](int index) native "SVGPathSegList_item_Callback";
 
-  void operator[]=(int index, SVGPathSeg value) {
+  void operator[]=(int index, PathSeg value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
-  // -- start List<SVGPathSeg> mixins.
-  // SVGPathSeg is the element type.
+  // -- start List<PathSeg> mixins.
+  // PathSeg is the element type.
 
-  // From Iterable<SVGPathSeg>:
+  // From Iterable<PathSeg>:
 
-  Iterator<SVGPathSeg> iterator() {
+  Iterator<PathSeg> 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<SVGPathSeg>(this);
+    return new FixedSizeListIterator<PathSeg>(this);
   }
 
-  // From Collection<SVGPathSeg>:
+  // From Collection<PathSeg>:
 
-  void add(SVGPathSeg value) {
+  void add(PathSeg value) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  void addLast(SVGPathSeg value) {
+  void addLast(PathSeg value) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  void addAll(Collection<SVGPathSeg> collection) {
+  void addAll(Collection<PathSeg> collection) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  bool contains(SVGPathSeg element) => _Collections.contains(this, element);
+  bool contains(PathSeg element) => _Collections.contains(this, element);
 
-  void forEach(void f(SVGPathSeg element)) => _Collections.forEach(this, f);
+  void forEach(void f(PathSeg element)) => _Collections.forEach(this, f);
 
-  Collection map(f(SVGPathSeg element)) => _Collections.map(this, [], f);
+  Collection map(f(PathSeg element)) => _Collections.map(this, [], f);
 
-  Collection<SVGPathSeg> filter(bool f(SVGPathSeg element)) =>
-     _Collections.filter(this, <SVGPathSeg>[], f);
+  Collection<PathSeg> filter(bool f(PathSeg element)) =>
+     _Collections.filter(this, <PathSeg>[], f);
 
-  bool every(bool f(SVGPathSeg element)) => _Collections.every(this, f);
+  bool every(bool f(PathSeg element)) => _Collections.every(this, f);
 
-  bool some(bool f(SVGPathSeg element)) => _Collections.some(this, f);
+  bool some(bool f(PathSeg element)) => _Collections.some(this, f);
 
   bool get isEmpty => this.length == 0;
 
-  // From List<SVGPathSeg>:
+  // From List<PathSeg>:
 
-  void sort([Comparator<SVGPathSeg> compare = Comparable.compare]) {
+  void sort([Comparator<PathSeg> compare = Comparable.compare]) {
     throw new UnsupportedError("Cannot sort immutable List.");
   }
 
-  int indexOf(SVGPathSeg element, [int start = 0]) =>
+  int indexOf(PathSeg element, [int start = 0]) =>
       _Lists.indexOf(this, element, start, this.length);
 
-  int lastIndexOf(SVGPathSeg element, [int start]) {
+  int lastIndexOf(PathSeg element, [int start]) {
     if (start == null) start = length - 1;
     return _Lists.lastIndexOf(this, element, start);
   }
 
-  SVGPathSeg get last => this[length - 1];
+  PathSeg get first => this[0];
 
-  SVGPathSeg removeLast() {
+  PathSeg get last => this[length - 1];
+
+  PathSeg removeLast() {
     throw new UnsupportedError("Cannot removeLast on immutable List.");
   }
 
-  void setRange(int start, int rangeLength, List<SVGPathSeg> from, [int startFrom]) {
+  void setRange(int start, int rangeLength, List<PathSeg> from, [int startFrom]) {
     throw new UnsupportedError("Cannot setRange on immutable List.");
   }
 
@@ -5584,18 +5531,18 @@
     throw new UnsupportedError("Cannot removeRange on immutable List.");
   }
 
-  void insertRange(int start, int rangeLength, [SVGPathSeg initialValue]) {
+  void insertRange(int start, int rangeLength, [PathSeg initialValue]) {
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
-  List<SVGPathSeg> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <SVGPathSeg>[]);
+  List<PathSeg> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <PathSeg>[]);
 
-  // -- end List<SVGPathSeg> mixins.
+  // -- end List<PathSeg> mixins.
 
 
   /** @domName SVGPathSegList.appendItem */
-  SVGPathSeg appendItem(SVGPathSeg newItem) native "SVGPathSegList_appendItem_Callback";
+  PathSeg appendItem(PathSeg newItem) native "SVGPathSegList_appendItem_Callback";
 
 
   /** @domName SVGPathSegList.clear */
@@ -5603,23 +5550,23 @@
 
 
   /** @domName SVGPathSegList.getItem */
-  SVGPathSeg getItem(int index) native "SVGPathSegList_getItem_Callback";
+  PathSeg getItem(int index) native "SVGPathSegList_getItem_Callback";
 
 
   /** @domName SVGPathSegList.initialize */
-  SVGPathSeg initialize(SVGPathSeg newItem) native "SVGPathSegList_initialize_Callback";
+  PathSeg initialize(PathSeg newItem) native "SVGPathSegList_initialize_Callback";
 
 
   /** @domName SVGPathSegList.insertItemBefore */
-  SVGPathSeg insertItemBefore(SVGPathSeg newItem, int index) native "SVGPathSegList_insertItemBefore_Callback";
+  PathSeg insertItemBefore(PathSeg newItem, int index) native "SVGPathSegList_insertItemBefore_Callback";
 
 
   /** @domName SVGPathSegList.removeItem */
-  SVGPathSeg removeItem(int index) native "SVGPathSegList_removeItem_Callback";
+  PathSeg removeItem(int index) native "SVGPathSegList_removeItem_Callback";
 
 
   /** @domName SVGPathSegList.replaceItem */
-  SVGPathSeg replaceItem(SVGPathSeg newItem, int index) native "SVGPathSegList_replaceItem_Callback";
+  PathSeg replaceItem(PathSeg newItem, int index) native "SVGPathSegList_replaceItem_Callback";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5630,8 +5577,8 @@
 
 
 /// @domName SVGPathSegMovetoAbs
-class SVGPathSegMovetoAbs extends SVGPathSeg {
-  SVGPathSegMovetoAbs.internal(): super.internal();
+class PathSegMovetoAbs extends PathSeg {
+  PathSegMovetoAbs.internal(): super.internal();
 
 
   /** @domName SVGPathSegMovetoAbs.x */
@@ -5658,8 +5605,8 @@
 
 
 /// @domName SVGPathSegMovetoRel
-class SVGPathSegMovetoRel extends SVGPathSeg {
-  SVGPathSegMovetoRel.internal(): super.internal();
+class PathSegMovetoRel extends PathSeg {
+  PathSegMovetoRel.internal(): super.internal();
 
 
   /** @domName SVGPathSegMovetoRel.x */
@@ -5686,48 +5633,50 @@
 
 
 /// @domName SVGPatternElement
-class SVGPatternElement extends SVGElement implements SVGLangSpace, SVGTests, SVGStylable, SVGURIReference, SVGFitToViewBox, SVGExternalResourcesRequired {
-  SVGPatternElement.internal(): super.internal();
+class PatternElement extends SvgElement implements FitToViewBox, Tests, UriReference, Stylable, ExternalResourcesRequired, LangSpace {
+
+  factory PatternElement() => _SvgElementFactoryProvider.createSvgElement_tag("pattern");
+  PatternElement.internal(): super.internal();
 
 
   /** @domName SVGPatternElement.height */
-  SVGAnimatedLength get height native "SVGPatternElement_height_Getter";
+  AnimatedLength get height native "SVGPatternElement_height_Getter";
 
 
   /** @domName SVGPatternElement.patternContentUnits */
-  SVGAnimatedEnumeration get patternContentUnits native "SVGPatternElement_patternContentUnits_Getter";
+  AnimatedEnumeration get patternContentUnits native "SVGPatternElement_patternContentUnits_Getter";
 
 
   /** @domName SVGPatternElement.patternTransform */
-  SVGAnimatedTransformList get patternTransform native "SVGPatternElement_patternTransform_Getter";
+  AnimatedTransformList get patternTransform native "SVGPatternElement_patternTransform_Getter";
 
 
   /** @domName SVGPatternElement.patternUnits */
-  SVGAnimatedEnumeration get patternUnits native "SVGPatternElement_patternUnits_Getter";
+  AnimatedEnumeration get patternUnits native "SVGPatternElement_patternUnits_Getter";
 
 
   /** @domName SVGPatternElement.width */
-  SVGAnimatedLength get width native "SVGPatternElement_width_Getter";
+  AnimatedLength get width native "SVGPatternElement_width_Getter";
 
 
   /** @domName SVGPatternElement.x */
-  SVGAnimatedLength get x native "SVGPatternElement_x_Getter";
+  AnimatedLength get x native "SVGPatternElement_x_Getter";
 
 
   /** @domName SVGPatternElement.y */
-  SVGAnimatedLength get y native "SVGPatternElement_y_Getter";
+  AnimatedLength get y native "SVGPatternElement_y_Getter";
 
 
   /** @domName SVGPatternElement.externalResourcesRequired */
-  SVGAnimatedBoolean get externalResourcesRequired native "SVGPatternElement_externalResourcesRequired_Getter";
+  AnimatedBoolean get externalResourcesRequired native "SVGPatternElement_externalResourcesRequired_Getter";
 
 
   /** @domName SVGPatternElement.preserveAspectRatio */
-  SVGAnimatedPreserveAspectRatio get preserveAspectRatio native "SVGPatternElement_preserveAspectRatio_Getter";
+  AnimatedPreserveAspectRatio get preserveAspectRatio native "SVGPatternElement_preserveAspectRatio_Getter";
 
 
   /** @domName SVGPatternElement.viewBox */
-  SVGAnimatedRect get viewBox native "SVGPatternElement_viewBox_Getter";
+  AnimatedRect get viewBox native "SVGPatternElement_viewBox_Getter";
 
 
   /** @domName SVGPatternElement.xmllang */
@@ -5747,7 +5696,7 @@
 
 
   /** @domName SVGPatternElement.className */
-  SVGAnimatedString get $dom_svgClassName native "SVGPatternElement_className_Getter";
+  AnimatedString get $dom_svgClassName native "SVGPatternElement_className_Getter";
 
 
   /** @domName SVGPatternElement.style */
@@ -5759,15 +5708,15 @@
 
 
   /** @domName SVGPatternElement.requiredExtensions */
-  SVGStringList get requiredExtensions native "SVGPatternElement_requiredExtensions_Getter";
+  StringList get requiredExtensions native "SVGPatternElement_requiredExtensions_Getter";
 
 
   /** @domName SVGPatternElement.requiredFeatures */
-  SVGStringList get requiredFeatures native "SVGPatternElement_requiredFeatures_Getter";
+  StringList get requiredFeatures native "SVGPatternElement_requiredFeatures_Getter";
 
 
   /** @domName SVGPatternElement.systemLanguage */
-  SVGStringList get systemLanguage native "SVGPatternElement_systemLanguage_Getter";
+  StringList get systemLanguage native "SVGPatternElement_systemLanguage_Getter";
 
 
   /** @domName SVGPatternElement.hasExtension */
@@ -5775,7 +5724,7 @@
 
 
   /** @domName SVGPatternElement.href */
-  SVGAnimatedString get href native "SVGPatternElement_href_Getter";
+  AnimatedString get href native "SVGPatternElement_href_Getter";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5785,9 +5734,9 @@
 // WARNING: Do not edit - generated code.
 
 
-/// @domName SVGPoint
-class SVGPoint extends NativeFieldWrapperClass1 {
-  SVGPoint.internal();
+class Point extends NativeFieldWrapperClass1 {
+  factory Point(num x, num y) => _PointFactoryProvider.createPoint(x, y);
+  Point.internal();
 
 
   /** @domName SVGPoint.x */
@@ -5807,7 +5756,7 @@
 
 
   /** @domName SVGPoint.matrixTransform */
-  SVGPoint matrixTransform(SVGMatrix matrix) native "SVGPoint_matrixTransform_Callback";
+  Point matrixTransform(Matrix matrix) native "SVGPoint_matrixTransform_Callback";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5818,8 +5767,8 @@
 
 
 /// @domName SVGPointList
-class SVGPointList extends NativeFieldWrapperClass1 {
-  SVGPointList.internal();
+class PointList extends NativeFieldWrapperClass1 {
+  PointList.internal();
 
 
   /** @domName SVGPointList.numberOfItems */
@@ -5827,7 +5776,7 @@
 
 
   /** @domName SVGPointList.appendItem */
-  SVGPoint appendItem(SVGPoint item) native "SVGPointList_appendItem_Callback";
+  Point appendItem(Point item) native "SVGPointList_appendItem_Callback";
 
 
   /** @domName SVGPointList.clear */
@@ -5835,23 +5784,23 @@
 
 
   /** @domName SVGPointList.getItem */
-  SVGPoint getItem(int index) native "SVGPointList_getItem_Callback";
+  Point getItem(int index) native "SVGPointList_getItem_Callback";
 
 
   /** @domName SVGPointList.initialize */
-  SVGPoint initialize(SVGPoint item) native "SVGPointList_initialize_Callback";
+  Point initialize(Point item) native "SVGPointList_initialize_Callback";
 
 
   /** @domName SVGPointList.insertItemBefore */
-  SVGPoint insertItemBefore(SVGPoint item, int index) native "SVGPointList_insertItemBefore_Callback";
+  Point insertItemBefore(Point item, int index) native "SVGPointList_insertItemBefore_Callback";
 
 
   /** @domName SVGPointList.removeItem */
-  SVGPoint removeItem(int index) native "SVGPointList_removeItem_Callback";
+  Point removeItem(int index) native "SVGPointList_removeItem_Callback";
 
 
   /** @domName SVGPointList.replaceItem */
-  SVGPoint replaceItem(SVGPoint item, int index) native "SVGPointList_replaceItem_Callback";
+  Point replaceItem(Point item, int index) native "SVGPointList_replaceItem_Callback";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5862,20 +5811,22 @@
 
 
 /// @domName SVGPolygonElement
-class SVGPolygonElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired {
-  SVGPolygonElement.internal(): super.internal();
+class PolygonElement extends SvgElement implements Transformable, Tests, Stylable, ExternalResourcesRequired, LangSpace {
+
+  factory PolygonElement() => _SvgElementFactoryProvider.createSvgElement_tag("polygon");
+  PolygonElement.internal(): super.internal();
 
 
   /** @domName SVGPolygonElement.animatedPoints */
-  SVGPointList get animatedPoints native "SVGPolygonElement_animatedPoints_Getter";
+  PointList get animatedPoints native "SVGPolygonElement_animatedPoints_Getter";
 
 
   /** @domName SVGPolygonElement.points */
-  SVGPointList get points native "SVGPolygonElement_points_Getter";
+  PointList get points native "SVGPolygonElement_points_Getter";
 
 
   /** @domName SVGPolygonElement.externalResourcesRequired */
-  SVGAnimatedBoolean get externalResourcesRequired native "SVGPolygonElement_externalResourcesRequired_Getter";
+  AnimatedBoolean get externalResourcesRequired native "SVGPolygonElement_externalResourcesRequired_Getter";
 
 
   /** @domName SVGPolygonElement.xmllang */
@@ -5895,31 +5846,31 @@
 
 
   /** @domName SVGPolygonElement.farthestViewportElement */
-  SVGElement get farthestViewportElement native "SVGPolygonElement_farthestViewportElement_Getter";
+  SvgElement get farthestViewportElement native "SVGPolygonElement_farthestViewportElement_Getter";
 
 
   /** @domName SVGPolygonElement.nearestViewportElement */
-  SVGElement get nearestViewportElement native "SVGPolygonElement_nearestViewportElement_Getter";
+  SvgElement get nearestViewportElement native "SVGPolygonElement_nearestViewportElement_Getter";
 
 
   /** @domName SVGPolygonElement.getBBox */
-  SVGRect getBBox() native "SVGPolygonElement_getBBox_Callback";
+  Rect getBBox() native "SVGPolygonElement_getBBox_Callback";
 
 
   /** @domName SVGPolygonElement.getCTM */
-  SVGMatrix getCTM() native "SVGPolygonElement_getCTM_Callback";
+  Matrix getCTM() native "SVGPolygonElement_getCTM_Callback";
 
 
   /** @domName SVGPolygonElement.getScreenCTM */
-  SVGMatrix getScreenCTM() native "SVGPolygonElement_getScreenCTM_Callback";
+  Matrix getScreenCTM() native "SVGPolygonElement_getScreenCTM_Callback";
 
 
   /** @domName SVGPolygonElement.getTransformToElement */
-  SVGMatrix getTransformToElement(SVGElement element) native "SVGPolygonElement_getTransformToElement_Callback";
+  Matrix getTransformToElement(SvgElement element) native "SVGPolygonElement_getTransformToElement_Callback";
 
 
   /** @domName SVGPolygonElement.className */
-  SVGAnimatedString get $dom_svgClassName native "SVGPolygonElement_className_Getter";
+  AnimatedString get $dom_svgClassName native "SVGPolygonElement_className_Getter";
 
 
   /** @domName SVGPolygonElement.style */
@@ -5931,15 +5882,15 @@
 
 
   /** @domName SVGPolygonElement.requiredExtensions */
-  SVGStringList get requiredExtensions native "SVGPolygonElement_requiredExtensions_Getter";
+  StringList get requiredExtensions native "SVGPolygonElement_requiredExtensions_Getter";
 
 
   /** @domName SVGPolygonElement.requiredFeatures */
-  SVGStringList get requiredFeatures native "SVGPolygonElement_requiredFeatures_Getter";
+  StringList get requiredFeatures native "SVGPolygonElement_requiredFeatures_Getter";
 
 
   /** @domName SVGPolygonElement.systemLanguage */
-  SVGStringList get systemLanguage native "SVGPolygonElement_systemLanguage_Getter";
+  StringList get systemLanguage native "SVGPolygonElement_systemLanguage_Getter";
 
 
   /** @domName SVGPolygonElement.hasExtension */
@@ -5947,7 +5898,7 @@
 
 
   /** @domName SVGPolygonElement.transform */
-  SVGAnimatedTransformList get transform native "SVGPolygonElement_transform_Getter";
+  AnimatedTransformList get transform native "SVGPolygonElement_transform_Getter";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5958,20 +5909,22 @@
 
 
 /// @domName SVGPolylineElement
-class SVGPolylineElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired {
-  SVGPolylineElement.internal(): super.internal();
+class PolylineElement extends SvgElement implements Transformable, Tests, Stylable, ExternalResourcesRequired, LangSpace {
+
+  factory PolylineElement() => _SvgElementFactoryProvider.createSvgElement_tag("polyline");
+  PolylineElement.internal(): super.internal();
 
 
   /** @domName SVGPolylineElement.animatedPoints */
-  SVGPointList get animatedPoints native "SVGPolylineElement_animatedPoints_Getter";
+  PointList get animatedPoints native "SVGPolylineElement_animatedPoints_Getter";
 
 
   /** @domName SVGPolylineElement.points */
-  SVGPointList get points native "SVGPolylineElement_points_Getter";
+  PointList get points native "SVGPolylineElement_points_Getter";
 
 
   /** @domName SVGPolylineElement.externalResourcesRequired */
-  SVGAnimatedBoolean get externalResourcesRequired native "SVGPolylineElement_externalResourcesRequired_Getter";
+  AnimatedBoolean get externalResourcesRequired native "SVGPolylineElement_externalResourcesRequired_Getter";
 
 
   /** @domName SVGPolylineElement.xmllang */
@@ -5991,31 +5944,31 @@
 
 
   /** @domName SVGPolylineElement.farthestViewportElement */
-  SVGElement get farthestViewportElement native "SVGPolylineElement_farthestViewportElement_Getter";
+  SvgElement get farthestViewportElement native "SVGPolylineElement_farthestViewportElement_Getter";
 
 
   /** @domName SVGPolylineElement.nearestViewportElement */
-  SVGElement get nearestViewportElement native "SVGPolylineElement_nearestViewportElement_Getter";
+  SvgElement get nearestViewportElement native "SVGPolylineElement_nearestViewportElement_Getter";
 
 
   /** @domName SVGPolylineElement.getBBox */
-  SVGRect getBBox() native "SVGPolylineElement_getBBox_Callback";
+  Rect getBBox() native "SVGPolylineElement_getBBox_Callback";
 
 
   /** @domName SVGPolylineElement.getCTM */
-  SVGMatrix getCTM() native "SVGPolylineElement_getCTM_Callback";
+  Matrix getCTM() native "SVGPolylineElement_getCTM_Callback";
 
 
   /** @domName SVGPolylineElement.getScreenCTM */
-  SVGMatrix getScreenCTM() native "SVGPolylineElement_getScreenCTM_Callback";
+  Matrix getScreenCTM() native "SVGPolylineElement_getScreenCTM_Callback";
 
 
   /** @domName SVGPolylineElement.getTransformToElement */
-  SVGMatrix getTransformToElement(SVGElement element) native "SVGPolylineElement_getTransformToElement_Callback";
+  Matrix getTransformToElement(SvgElement element) native "SVGPolylineElement_getTransformToElement_Callback";
 
 
   /** @domName SVGPolylineElement.className */
-  SVGAnimatedString get $dom_svgClassName native "SVGPolylineElement_className_Getter";
+  AnimatedString get $dom_svgClassName native "SVGPolylineElement_className_Getter";
 
 
   /** @domName SVGPolylineElement.style */
@@ -6027,15 +5980,15 @@
 
 
   /** @domName SVGPolylineElement.requiredExtensions */
-  SVGStringList get requiredExtensions native "SVGPolylineElement_requiredExtensions_Getter";
+  StringList get requiredExtensions native "SVGPolylineElement_requiredExtensions_Getter";
 
 
   /** @domName SVGPolylineElement.requiredFeatures */
-  SVGStringList get requiredFeatures native "SVGPolylineElement_requiredFeatures_Getter";
+  StringList get requiredFeatures native "SVGPolylineElement_requiredFeatures_Getter";
 
 
   /** @domName SVGPolylineElement.systemLanguage */
-  SVGStringList get systemLanguage native "SVGPolylineElement_systemLanguage_Getter";
+  StringList get systemLanguage native "SVGPolylineElement_systemLanguage_Getter";
 
 
   /** @domName SVGPolylineElement.hasExtension */
@@ -6043,7 +5996,7 @@
 
 
   /** @domName SVGPolylineElement.transform */
-  SVGAnimatedTransformList get transform native "SVGPolylineElement_transform_Getter";
+  AnimatedTransformList get transform native "SVGPolylineElement_transform_Getter";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6054,8 +6007,8 @@
 
 
 /// @domName SVGPreserveAspectRatio
-class SVGPreserveAspectRatio extends NativeFieldWrapperClass1 {
-  SVGPreserveAspectRatio.internal();
+class PreserveAspectRatio extends NativeFieldWrapperClass1 {
+  PreserveAspectRatio.internal();
 
   static const int SVG_MEETORSLICE_MEET = 1;
 
@@ -6110,32 +6063,34 @@
 
 
 /// @domName SVGRadialGradientElement
-class SVGRadialGradientElement extends SVGGradientElement {
-  SVGRadialGradientElement.internal(): super.internal();
+class RadialGradientElement extends GradientElement {
+
+  factory RadialGradientElement() => _SvgElementFactoryProvider.createSvgElement_tag("radialGradient");
+  RadialGradientElement.internal(): super.internal();
 
 
   /** @domName SVGRadialGradientElement.cx */
-  SVGAnimatedLength get cx native "SVGRadialGradientElement_cx_Getter";
+  AnimatedLength get cx native "SVGRadialGradientElement_cx_Getter";
 
 
   /** @domName SVGRadialGradientElement.cy */
-  SVGAnimatedLength get cy native "SVGRadialGradientElement_cy_Getter";
+  AnimatedLength get cy native "SVGRadialGradientElement_cy_Getter";
 
 
   /** @domName SVGRadialGradientElement.fr */
-  SVGAnimatedLength get fr native "SVGRadialGradientElement_fr_Getter";
+  AnimatedLength get fr native "SVGRadialGradientElement_fr_Getter";
 
 
   /** @domName SVGRadialGradientElement.fx */
-  SVGAnimatedLength get fx native "SVGRadialGradientElement_fx_Getter";
+  AnimatedLength get fx native "SVGRadialGradientElement_fx_Getter";
 
 
   /** @domName SVGRadialGradientElement.fy */
-  SVGAnimatedLength get fy native "SVGRadialGradientElement_fy_Getter";
+  AnimatedLength get fy native "SVGRadialGradientElement_fy_Getter";
 
 
   /** @domName SVGRadialGradientElement.r */
-  SVGAnimatedLength get r native "SVGRadialGradientElement_r_Getter";
+  AnimatedLength get r native "SVGRadialGradientElement_r_Getter";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6146,8 +6101,8 @@
 
 
 /// @domName SVGRect
-class SVGRect extends NativeFieldWrapperClass1 {
-  SVGRect.internal();
+class Rect extends NativeFieldWrapperClass1 {
+  Rect.internal();
 
 
   /** @domName SVGRect.height */
@@ -6190,36 +6145,38 @@
 
 
 /// @domName SVGRectElement
-class SVGRectElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired {
-  SVGRectElement.internal(): super.internal();
+class RectElement extends SvgElement implements Transformable, Tests, Stylable, ExternalResourcesRequired, LangSpace {
+
+  factory RectElement() => _SvgElementFactoryProvider.createSvgElement_tag("rect");
+  RectElement.internal(): super.internal();
 
 
   /** @domName SVGRectElement.height */
-  SVGAnimatedLength get height native "SVGRectElement_height_Getter";
+  AnimatedLength get height native "SVGRectElement_height_Getter";
 
 
   /** @domName SVGRectElement.rx */
-  SVGAnimatedLength get rx native "SVGRectElement_rx_Getter";
+  AnimatedLength get rx native "SVGRectElement_rx_Getter";
 
 
   /** @domName SVGRectElement.ry */
-  SVGAnimatedLength get ry native "SVGRectElement_ry_Getter";
+  AnimatedLength get ry native "SVGRectElement_ry_Getter";
 
 
   /** @domName SVGRectElement.width */
-  SVGAnimatedLength get width native "SVGRectElement_width_Getter";
+  AnimatedLength get width native "SVGRectElement_width_Getter";
 
 
   /** @domName SVGRectElement.x */
-  SVGAnimatedLength get x native "SVGRectElement_x_Getter";
+  AnimatedLength get x native "SVGRectElement_x_Getter";
 
 
   /** @domName SVGRectElement.y */
-  SVGAnimatedLength get y native "SVGRectElement_y_Getter";
+  AnimatedLength get y native "SVGRectElement_y_Getter";
 
 
   /** @domName SVGRectElement.externalResourcesRequired */
-  SVGAnimatedBoolean get externalResourcesRequired native "SVGRectElement_externalResourcesRequired_Getter";
+  AnimatedBoolean get externalResourcesRequired native "SVGRectElement_externalResourcesRequired_Getter";
 
 
   /** @domName SVGRectElement.xmllang */
@@ -6239,31 +6196,31 @@
 
 
   /** @domName SVGRectElement.farthestViewportElement */
-  SVGElement get farthestViewportElement native "SVGRectElement_farthestViewportElement_Getter";
+  SvgElement get farthestViewportElement native "SVGRectElement_farthestViewportElement_Getter";
 
 
   /** @domName SVGRectElement.nearestViewportElement */
-  SVGElement get nearestViewportElement native "SVGRectElement_nearestViewportElement_Getter";
+  SvgElement get nearestViewportElement native "SVGRectElement_nearestViewportElement_Getter";
 
 
   /** @domName SVGRectElement.getBBox */
-  SVGRect getBBox() native "SVGRectElement_getBBox_Callback";
+  Rect getBBox() native "SVGRectElement_getBBox_Callback";
 
 
   /** @domName SVGRectElement.getCTM */
-  SVGMatrix getCTM() native "SVGRectElement_getCTM_Callback";
+  Matrix getCTM() native "SVGRectElement_getCTM_Callback";
 
 
   /** @domName SVGRectElement.getScreenCTM */
-  SVGMatrix getScreenCTM() native "SVGRectElement_getScreenCTM_Callback";
+  Matrix getScreenCTM() native "SVGRectElement_getScreenCTM_Callback";
 
 
   /** @domName SVGRectElement.getTransformToElement */
-  SVGMatrix getTransformToElement(SVGElement element) native "SVGRectElement_getTransformToElement_Callback";
+  Matrix getTransformToElement(SvgElement element) native "SVGRectElement_getTransformToElement_Callback";
 
 
   /** @domName SVGRectElement.className */
-  SVGAnimatedString get $dom_svgClassName native "SVGRectElement_className_Getter";
+  AnimatedString get $dom_svgClassName native "SVGRectElement_className_Getter";
 
 
   /** @domName SVGRectElement.style */
@@ -6275,15 +6232,15 @@
 
 
   /** @domName SVGRectElement.requiredExtensions */
-  SVGStringList get requiredExtensions native "SVGRectElement_requiredExtensions_Getter";
+  StringList get requiredExtensions native "SVGRectElement_requiredExtensions_Getter";
 
 
   /** @domName SVGRectElement.requiredFeatures */
-  SVGStringList get requiredFeatures native "SVGRectElement_requiredFeatures_Getter";
+  StringList get requiredFeatures native "SVGRectElement_requiredFeatures_Getter";
 
 
   /** @domName SVGRectElement.systemLanguage */
-  SVGStringList get systemLanguage native "SVGRectElement_systemLanguage_Getter";
+  StringList get systemLanguage native "SVGRectElement_systemLanguage_Getter";
 
 
   /** @domName SVGRectElement.hasExtension */
@@ -6291,7 +6248,7 @@
 
 
   /** @domName SVGRectElement.transform */
-  SVGAnimatedTransformList get transform native "SVGRectElement_transform_Getter";
+  AnimatedTransformList get transform native "SVGRectElement_transform_Getter";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6302,8 +6259,8 @@
 
 
 /// @domName SVGRenderingIntent
-class SVGRenderingIntent extends NativeFieldWrapperClass1 {
-  SVGRenderingIntent.internal();
+class RenderingIntent extends NativeFieldWrapperClass1 {
+  RenderingIntent.internal();
 
   static const int RENDERING_INTENT_ABSOLUTE_COLORIMETRIC = 5;
 
@@ -6322,275 +6279,14 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-
-class SVGSVGElement extends SVGElement implements SVGZoomAndPan, SVGLocatable, SVGLangSpace, SVGTests, SVGStylable, SVGFitToViewBox, SVGExternalResourcesRequired {
-  factory SVGSVGElement() => _SVGSVGElementFactoryProvider.createSVGSVGElement();
-
-  SVGSVGElement.internal(): super.internal();
-
-
-  /** @domName SVGSVGElement.contentScriptType */
-  String get contentScriptType native "SVGSVGElement_contentScriptType_Getter";
-
-
-  /** @domName SVGSVGElement.contentScriptType */
-  void set contentScriptType(String value) native "SVGSVGElement_contentScriptType_Setter";
-
-
-  /** @domName SVGSVGElement.contentStyleType */
-  String get contentStyleType native "SVGSVGElement_contentStyleType_Getter";
-
-
-  /** @domName SVGSVGElement.contentStyleType */
-  void set contentStyleType(String value) native "SVGSVGElement_contentStyleType_Setter";
-
-
-  /** @domName SVGSVGElement.currentScale */
-  num get currentScale native "SVGSVGElement_currentScale_Getter";
-
-
-  /** @domName SVGSVGElement.currentScale */
-  void set currentScale(num value) native "SVGSVGElement_currentScale_Setter";
-
-
-  /** @domName SVGSVGElement.currentTranslate */
-  SVGPoint get currentTranslate native "SVGSVGElement_currentTranslate_Getter";
-
-
-  /** @domName SVGSVGElement.currentView */
-  SVGViewSpec get currentView native "SVGSVGElement_currentView_Getter";
-
-
-  /** @domName SVGSVGElement.height */
-  SVGAnimatedLength get height native "SVGSVGElement_height_Getter";
-
-
-  /** @domName SVGSVGElement.pixelUnitToMillimeterX */
-  num get pixelUnitToMillimeterX native "SVGSVGElement_pixelUnitToMillimeterX_Getter";
-
-
-  /** @domName SVGSVGElement.pixelUnitToMillimeterY */
-  num get pixelUnitToMillimeterY native "SVGSVGElement_pixelUnitToMillimeterY_Getter";
-
-
-  /** @domName SVGSVGElement.screenPixelToMillimeterX */
-  num get screenPixelToMillimeterX native "SVGSVGElement_screenPixelToMillimeterX_Getter";
-
-
-  /** @domName SVGSVGElement.screenPixelToMillimeterY */
-  num get screenPixelToMillimeterY native "SVGSVGElement_screenPixelToMillimeterY_Getter";
-
-
-  /** @domName SVGSVGElement.useCurrentView */
-  bool get useCurrentView native "SVGSVGElement_useCurrentView_Getter";
-
-
-  /** @domName SVGSVGElement.viewport */
-  SVGRect get viewport native "SVGSVGElement_viewport_Getter";
-
-
-  /** @domName SVGSVGElement.width */
-  SVGAnimatedLength get width native "SVGSVGElement_width_Getter";
-
-
-  /** @domName SVGSVGElement.x */
-  SVGAnimatedLength get x native "SVGSVGElement_x_Getter";
-
-
-  /** @domName SVGSVGElement.y */
-  SVGAnimatedLength get y native "SVGSVGElement_y_Getter";
-
-
-  /** @domName SVGSVGElement.animationsPaused */
-  bool animationsPaused() native "SVGSVGElement_animationsPaused_Callback";
-
-
-  /** @domName SVGSVGElement.checkEnclosure */
-  bool checkEnclosure(SVGElement element, SVGRect rect) native "SVGSVGElement_checkEnclosure_Callback";
-
-
-  /** @domName SVGSVGElement.checkIntersection */
-  bool checkIntersection(SVGElement element, SVGRect rect) native "SVGSVGElement_checkIntersection_Callback";
-
-
-  /** @domName SVGSVGElement.createSVGAngle */
-  SVGAngle createSVGAngle() native "SVGSVGElement_createSVGAngle_Callback";
-
-
-  /** @domName SVGSVGElement.createSVGLength */
-  SVGLength createSVGLength() native "SVGSVGElement_createSVGLength_Callback";
-
-
-  /** @domName SVGSVGElement.createSVGMatrix */
-  SVGMatrix createSVGMatrix() native "SVGSVGElement_createSVGMatrix_Callback";
-
-
-  /** @domName SVGSVGElement.createSVGNumber */
-  SVGNumber createSVGNumber() native "SVGSVGElement_createSVGNumber_Callback";
-
-
-  /** @domName SVGSVGElement.createSVGPoint */
-  SVGPoint createSVGPoint() native "SVGSVGElement_createSVGPoint_Callback";
-
-
-  /** @domName SVGSVGElement.createSVGRect */
-  SVGRect createSVGRect() native "SVGSVGElement_createSVGRect_Callback";
-
-
-  /** @domName SVGSVGElement.createSVGTransform */
-  SVGTransform createSVGTransform() native "SVGSVGElement_createSVGTransform_Callback";
-
-
-  /** @domName SVGSVGElement.createSVGTransformFromMatrix */
-  SVGTransform createSVGTransformFromMatrix(SVGMatrix matrix) native "SVGSVGElement_createSVGTransformFromMatrix_Callback";
-
-
-  /** @domName SVGSVGElement.deselectAll */
-  void deselectAll() native "SVGSVGElement_deselectAll_Callback";
-
-
-  /** @domName SVGSVGElement.forceRedraw */
-  void forceRedraw() native "SVGSVGElement_forceRedraw_Callback";
-
-
-  /** @domName SVGSVGElement.getCurrentTime */
-  num getCurrentTime() native "SVGSVGElement_getCurrentTime_Callback";
-
-
-  /** @domName SVGSVGElement.getElementById */
-  Element getElementById(String elementId) native "SVGSVGElement_getElementById_Callback";
-
-
-  /** @domName SVGSVGElement.getEnclosureList */
-  List<Node> getEnclosureList(SVGRect rect, SVGElement referenceElement) native "SVGSVGElement_getEnclosureList_Callback";
-
-
-  /** @domName SVGSVGElement.getIntersectionList */
-  List<Node> getIntersectionList(SVGRect rect, SVGElement referenceElement) native "SVGSVGElement_getIntersectionList_Callback";
-
-
-  /** @domName SVGSVGElement.pauseAnimations */
-  void pauseAnimations() native "SVGSVGElement_pauseAnimations_Callback";
-
-
-  /** @domName SVGSVGElement.setCurrentTime */
-  void setCurrentTime(num seconds) native "SVGSVGElement_setCurrentTime_Callback";
-
-
-  /** @domName SVGSVGElement.suspendRedraw */
-  int suspendRedraw(int maxWaitMilliseconds) native "SVGSVGElement_suspendRedraw_Callback";
-
-
-  /** @domName SVGSVGElement.unpauseAnimations */
-  void unpauseAnimations() native "SVGSVGElement_unpauseAnimations_Callback";
-
-
-  /** @domName SVGSVGElement.unsuspendRedraw */
-  void unsuspendRedraw(int suspendHandleId) native "SVGSVGElement_unsuspendRedraw_Callback";
-
-
-  /** @domName SVGSVGElement.unsuspendRedrawAll */
-  void unsuspendRedrawAll() native "SVGSVGElement_unsuspendRedrawAll_Callback";
-
-
-  /** @domName SVGSVGElement.externalResourcesRequired */
-  SVGAnimatedBoolean get externalResourcesRequired native "SVGSVGElement_externalResourcesRequired_Getter";
-
-
-  /** @domName SVGSVGElement.preserveAspectRatio */
-  SVGAnimatedPreserveAspectRatio get preserveAspectRatio native "SVGSVGElement_preserveAspectRatio_Getter";
-
-
-  /** @domName SVGSVGElement.viewBox */
-  SVGAnimatedRect get viewBox native "SVGSVGElement_viewBox_Getter";
-
-
-  /** @domName SVGSVGElement.xmllang */
-  String get xmllang native "SVGSVGElement_xmllang_Getter";
-
-
-  /** @domName SVGSVGElement.xmllang */
-  void set xmllang(String value) native "SVGSVGElement_xmllang_Setter";
-
-
-  /** @domName SVGSVGElement.xmlspace */
-  String get xmlspace native "SVGSVGElement_xmlspace_Getter";
-
-
-  /** @domName SVGSVGElement.xmlspace */
-  void set xmlspace(String value) native "SVGSVGElement_xmlspace_Setter";
-
-
-  /** @domName SVGSVGElement.farthestViewportElement */
-  SVGElement get farthestViewportElement native "SVGSVGElement_farthestViewportElement_Getter";
-
-
-  /** @domName SVGSVGElement.nearestViewportElement */
-  SVGElement get nearestViewportElement native "SVGSVGElement_nearestViewportElement_Getter";
-
-
-  /** @domName SVGSVGElement.getBBox */
-  SVGRect getBBox() native "SVGSVGElement_getBBox_Callback";
-
-
-  /** @domName SVGSVGElement.getCTM */
-  SVGMatrix getCTM() native "SVGSVGElement_getCTM_Callback";
-
-
-  /** @domName SVGSVGElement.getScreenCTM */
-  SVGMatrix getScreenCTM() native "SVGSVGElement_getScreenCTM_Callback";
-
-
-  /** @domName SVGSVGElement.getTransformToElement */
-  SVGMatrix getTransformToElement(SVGElement element) native "SVGSVGElement_getTransformToElement_Callback";
-
-
-  /** @domName SVGSVGElement.className */
-  SVGAnimatedString get $dom_svgClassName native "SVGSVGElement_className_Getter";
-
-
-  /** @domName SVGSVGElement.style */
-  CSSStyleDeclaration get style native "SVGSVGElement_style_Getter";
-
-
-  /** @domName SVGSVGElement.getPresentationAttribute */
-  CSSValue getPresentationAttribute(String name) native "SVGSVGElement_getPresentationAttribute_Callback";
-
-
-  /** @domName SVGSVGElement.requiredExtensions */
-  SVGStringList get requiredExtensions native "SVGSVGElement_requiredExtensions_Getter";
-
-
-  /** @domName SVGSVGElement.requiredFeatures */
-  SVGStringList get requiredFeatures native "SVGSVGElement_requiredFeatures_Getter";
-
-
-  /** @domName SVGSVGElement.systemLanguage */
-  SVGStringList get systemLanguage native "SVGSVGElement_systemLanguage_Getter";
-
-
-  /** @domName SVGSVGElement.hasExtension */
-  bool hasExtension(String extension) native "SVGSVGElement_hasExtension_Callback";
-
-
-  /** @domName SVGSVGElement.zoomAndPan */
-  int get zoomAndPan native "SVGSVGElement_zoomAndPan_Getter";
-
-
-  /** @domName SVGSVGElement.zoomAndPan */
-  void set zoomAndPan(int value) native "SVGSVGElement_zoomAndPan_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 SVGScriptElement
-class SVGScriptElement extends SVGElement implements SVGURIReference, SVGExternalResourcesRequired {
-  SVGScriptElement.internal(): super.internal();
+class ScriptElement extends SvgElement implements UriReference, ExternalResourcesRequired {
+
+  factory ScriptElement() => _SvgElementFactoryProvider.createSvgElement_tag("script");
+  ScriptElement.internal(): super.internal();
 
 
   /** @domName SVGScriptElement.type */
@@ -6602,11 +6298,11 @@
 
 
   /** @domName SVGScriptElement.externalResourcesRequired */
-  SVGAnimatedBoolean get externalResourcesRequired native "SVGScriptElement_externalResourcesRequired_Getter";
+  AnimatedBoolean get externalResourcesRequired native "SVGScriptElement_externalResourcesRequired_Getter";
 
 
   /** @domName SVGScriptElement.href */
-  SVGAnimatedString get href native "SVGScriptElement_href_Getter";
+  AnimatedString get href native "SVGScriptElement_href_Getter";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6617,8 +6313,10 @@
 
 
 /// @domName SVGSetElement
-class SVGSetElement extends SVGAnimationElement {
-  SVGSetElement.internal(): super.internal();
+class SetElement extends AnimationElement {
+
+  factory SetElement() => _SvgElementFactoryProvider.createSvgElement_tag("set");
+  SetElement.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6629,16 +6327,18 @@
 
 
 /// @domName SVGStopElement
-class SVGStopElement extends SVGElement implements SVGStylable {
-  SVGStopElement.internal(): super.internal();
+class StopElement extends SvgElement implements Stylable {
+
+  factory StopElement() => _SvgElementFactoryProvider.createSvgElement_tag("stop");
+  StopElement.internal(): super.internal();
 
 
   /** @domName SVGStopElement.offset */
-  SVGAnimatedNumber get offset native "SVGStopElement_offset_Getter";
+  AnimatedNumber get offset native "SVGStopElement_offset_Getter";
 
 
   /** @domName SVGStopElement.className */
-  SVGAnimatedString get $dom_svgClassName native "SVGStopElement_className_Getter";
+  AnimatedString get $dom_svgClassName native "SVGStopElement_className_Getter";
 
 
   /** @domName SVGStopElement.style */
@@ -6657,8 +6357,8 @@
 
 
 /// @domName SVGStringList
-class SVGStringList extends NativeFieldWrapperClass1 implements List<String> {
-  SVGStringList.internal();
+class StringList extends NativeFieldWrapperClass1 implements List<String> {
+  StringList.internal();
 
 
   /** @domName SVGStringList.numberOfItems */
@@ -6724,6 +6424,8 @@
     return _Lists.lastIndexOf(this, element, start);
   }
 
+  String get first => this[0];
+
   String get last => this[length - 1];
 
   String removeLast() {
@@ -6784,12 +6486,12 @@
 
 
 /// @domName SVGStylable
-class SVGStylable extends NativeFieldWrapperClass1 {
-  SVGStylable.internal();
+class Stylable extends NativeFieldWrapperClass1 {
+  Stylable.internal();
 
 
   /** @domName SVGStylable.className */
-  SVGAnimatedString get $dom_svgClassName native "SVGStylable_className_Getter";
+  AnimatedString get $dom_svgClassName native "SVGStylable_className_Getter";
 
 
   /** @domName SVGStylable.style */
@@ -6808,8 +6510,10 @@
 
 
 /// @domName SVGStyleElement
-class SVGStyleElement extends SVGElement implements SVGLangSpace {
-  SVGStyleElement.internal(): super.internal();
+class StyleElement extends SvgElement implements LangSpace {
+
+  factory StyleElement() => _SvgElementFactoryProvider.createSvgElement_tag("style");
+  StyleElement.internal(): super.internal();
 
 
   /** @domName SVGStyleElement.disabled */
@@ -6867,13 +6571,409 @@
 // WARNING: Do not edit - generated code.
 
 
+/// @domName SVGDocument
+class SvgDocument extends Document {
+  SvgDocument.internal(): super.internal();
+
+
+  /** @domName SVGDocument.rootElement */
+  SvgSvgElement get rootElement native "SVGDocument_rootElement_Getter";
+
+
+  /** @domName SVGDocument.createEvent */
+  Event $dom_createEvent(String eventType) native "SVGDocument_createEvent_Callback";
+
+}
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+class _AttributeClassSet extends CssClassSet {
+  final Element _element;
+
+  _AttributeClassSet(this._element);
+
+  Set<String> readClasses() {
+    var classname = _element.attributes['class'];
+
+    Set<String> s = new Set<String>();
+    if (classname == null) {
+      return s;
+    }
+    for (String name in classname.split(' ')) {
+      String trimmed = name.trim();
+      if (!trimmed.isEmpty) {
+        s.add(trimmed);
+      }
+    }
+    return s;
+  }
+
+  void writeClasses(Set s) {
+    List list = new List.from(s);
+    _element.attributes['class'] = Strings.join(list, ' ');
+  }
+}
+
+class SvgElement extends Element {
+  factory SvgElement.tag(String tag) =>
+      _SvgElementFactoryProvider.createSvgElement_tag(tag);
+  factory SvgElement.svg(String svg) =>
+      _SvgElementFactoryProvider.createSvgElement_svg(svg);
+
+  _AttributeClassSet _cssClassSet;
+  CssClassSet get classes {
+    if (_cssClassSet == null) {
+      _cssClassSet = new _AttributeClassSet(this);
+    }
+    return _cssClassSet;
+  }
+
+  List<Element> get elements => new FilteredElementList(this);
+
+  void set elements(Collection<Element> value) {
+    final elements = this.elements;
+    elements.clear();
+    elements.addAll(value);
+  }
+
+  List<Element> get children => new FilteredElementList(this);
+
+  void set children(Collection<Element> value) {
+    final children = this.children;
+    children.clear();
+    children.addAll(value);
+  }
+
+  String get outerHTML {
+    final container = new Element.tag("div");
+    final SvgElement cloned = this.clone(true);
+    container.children.add(cloned);
+    return container.innerHTML;
+  }
+
+  String get innerHTML {
+    final container = new Element.tag("div");
+    final SvgElement cloned = this.clone(true);
+    container.children.addAll(cloned.children);
+    return container.innerHTML;
+  }
+
+  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>';
+    this.children = container.children[0].children;
+  }
+
+  SvgElement.internal(): super.internal();
+
+
+  /** @domName SVGElement.id */
+  String get id native "SVGElement_id_Getter";
+
+
+  /** @domName SVGElement.id */
+  void set id(String value) native "SVGElement_id_Setter";
+
+
+  /** @domName SVGElement.ownerSVGElement */
+  SvgSvgElement get ownerSVGElement native "SVGElement_ownerSVGElement_Getter";
+
+
+  /** @domName SVGElement.viewportElement */
+  SvgElement get viewportElement native "SVGElement_viewportElement_Getter";
+
+
+  /** @domName SVGElement.xmlbase */
+  String get xmlbase native "SVGElement_xmlbase_Getter";
+
+
+  /** @domName SVGElement.xmlbase */
+  void set xmlbase(String value) native "SVGElement_xmlbase_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 SvgSvgElement extends SvgElement implements FitToViewBox, Tests, Stylable, Locatable, ExternalResourcesRequired, ZoomAndPan, LangSpace {
+  factory SvgSvgElement() => _SvgSvgElementFactoryProvider.createSvgSvgElement();
+
+  SvgSvgElement.internal(): super.internal();
+
+
+  /** @domName SVGSVGElement.contentScriptType */
+  String get contentScriptType native "SVGSVGElement_contentScriptType_Getter";
+
+
+  /** @domName SVGSVGElement.contentScriptType */
+  void set contentScriptType(String value) native "SVGSVGElement_contentScriptType_Setter";
+
+
+  /** @domName SVGSVGElement.contentStyleType */
+  String get contentStyleType native "SVGSVGElement_contentStyleType_Getter";
+
+
+  /** @domName SVGSVGElement.contentStyleType */
+  void set contentStyleType(String value) native "SVGSVGElement_contentStyleType_Setter";
+
+
+  /** @domName SVGSVGElement.currentScale */
+  num get currentScale native "SVGSVGElement_currentScale_Getter";
+
+
+  /** @domName SVGSVGElement.currentScale */
+  void set currentScale(num value) native "SVGSVGElement_currentScale_Setter";
+
+
+  /** @domName SVGSVGElement.currentTranslate */
+  Point get currentTranslate native "SVGSVGElement_currentTranslate_Getter";
+
+
+  /** @domName SVGSVGElement.currentView */
+  ViewSpec get currentView native "SVGSVGElement_currentView_Getter";
+
+
+  /** @domName SVGSVGElement.height */
+  AnimatedLength get height native "SVGSVGElement_height_Getter";
+
+
+  /** @domName SVGSVGElement.pixelUnitToMillimeterX */
+  num get pixelUnitToMillimeterX native "SVGSVGElement_pixelUnitToMillimeterX_Getter";
+
+
+  /** @domName SVGSVGElement.pixelUnitToMillimeterY */
+  num get pixelUnitToMillimeterY native "SVGSVGElement_pixelUnitToMillimeterY_Getter";
+
+
+  /** @domName SVGSVGElement.screenPixelToMillimeterX */
+  num get screenPixelToMillimeterX native "SVGSVGElement_screenPixelToMillimeterX_Getter";
+
+
+  /** @domName SVGSVGElement.screenPixelToMillimeterY */
+  num get screenPixelToMillimeterY native "SVGSVGElement_screenPixelToMillimeterY_Getter";
+
+
+  /** @domName SVGSVGElement.useCurrentView */
+  bool get useCurrentView native "SVGSVGElement_useCurrentView_Getter";
+
+
+  /** @domName SVGSVGElement.viewport */
+  Rect get viewport native "SVGSVGElement_viewport_Getter";
+
+
+  /** @domName SVGSVGElement.width */
+  AnimatedLength get width native "SVGSVGElement_width_Getter";
+
+
+  /** @domName SVGSVGElement.x */
+  AnimatedLength get x native "SVGSVGElement_x_Getter";
+
+
+  /** @domName SVGSVGElement.y */
+  AnimatedLength get y native "SVGSVGElement_y_Getter";
+
+
+  /** @domName SVGSVGElement.animationsPaused */
+  bool animationsPaused() native "SVGSVGElement_animationsPaused_Callback";
+
+
+  /** @domName SVGSVGElement.checkEnclosure */
+  bool checkEnclosure(SvgElement element, Rect rect) native "SVGSVGElement_checkEnclosure_Callback";
+
+
+  /** @domName SVGSVGElement.checkIntersection */
+  bool checkIntersection(SvgElement element, Rect rect) native "SVGSVGElement_checkIntersection_Callback";
+
+
+  /** @domName SVGSVGElement.createSVGAngle */
+  Angle createSVGAngle() native "SVGSVGElement_createSVGAngle_Callback";
+
+
+  /** @domName SVGSVGElement.createSVGLength */
+  Length createSVGLength() native "SVGSVGElement_createSVGLength_Callback";
+
+
+  /** @domName SVGSVGElement.createSVGMatrix */
+  Matrix createSVGMatrix() native "SVGSVGElement_createSVGMatrix_Callback";
+
+
+  /** @domName SVGSVGElement.createSVGNumber */
+  Number createSVGNumber() native "SVGSVGElement_createSVGNumber_Callback";
+
+
+  /** @domName SVGSVGElement.createSVGPoint */
+  Point createSVGPoint() native "SVGSVGElement_createSVGPoint_Callback";
+
+
+  /** @domName SVGSVGElement.createSVGRect */
+  Rect createSVGRect() native "SVGSVGElement_createSVGRect_Callback";
+
+
+  /** @domName SVGSVGElement.createSVGTransform */
+  Transform createSVGTransform() native "SVGSVGElement_createSVGTransform_Callback";
+
+
+  /** @domName SVGSVGElement.createSVGTransformFromMatrix */
+  Transform createSVGTransformFromMatrix(Matrix matrix) native "SVGSVGElement_createSVGTransformFromMatrix_Callback";
+
+
+  /** @domName SVGSVGElement.deselectAll */
+  void deselectAll() native "SVGSVGElement_deselectAll_Callback";
+
+
+  /** @domName SVGSVGElement.forceRedraw */
+  void forceRedraw() native "SVGSVGElement_forceRedraw_Callback";
+
+
+  /** @domName SVGSVGElement.getCurrentTime */
+  num getCurrentTime() native "SVGSVGElement_getCurrentTime_Callback";
+
+
+  /** @domName SVGSVGElement.getElementById */
+  Element getElementById(String elementId) native "SVGSVGElement_getElementById_Callback";
+
+
+  /** @domName SVGSVGElement.getEnclosureList */
+  List<Node> getEnclosureList(Rect rect, SvgElement referenceElement) native "SVGSVGElement_getEnclosureList_Callback";
+
+
+  /** @domName SVGSVGElement.getIntersectionList */
+  List<Node> getIntersectionList(Rect rect, SvgElement referenceElement) native "SVGSVGElement_getIntersectionList_Callback";
+
+
+  /** @domName SVGSVGElement.pauseAnimations */
+  void pauseAnimations() native "SVGSVGElement_pauseAnimations_Callback";
+
+
+  /** @domName SVGSVGElement.setCurrentTime */
+  void setCurrentTime(num seconds) native "SVGSVGElement_setCurrentTime_Callback";
+
+
+  /** @domName SVGSVGElement.suspendRedraw */
+  int suspendRedraw(int maxWaitMilliseconds) native "SVGSVGElement_suspendRedraw_Callback";
+
+
+  /** @domName SVGSVGElement.unpauseAnimations */
+  void unpauseAnimations() native "SVGSVGElement_unpauseAnimations_Callback";
+
+
+  /** @domName SVGSVGElement.unsuspendRedraw */
+  void unsuspendRedraw(int suspendHandleId) native "SVGSVGElement_unsuspendRedraw_Callback";
+
+
+  /** @domName SVGSVGElement.unsuspendRedrawAll */
+  void unsuspendRedrawAll() native "SVGSVGElement_unsuspendRedrawAll_Callback";
+
+
+  /** @domName SVGSVGElement.externalResourcesRequired */
+  AnimatedBoolean get externalResourcesRequired native "SVGSVGElement_externalResourcesRequired_Getter";
+
+
+  /** @domName SVGSVGElement.preserveAspectRatio */
+  AnimatedPreserveAspectRatio get preserveAspectRatio native "SVGSVGElement_preserveAspectRatio_Getter";
+
+
+  /** @domName SVGSVGElement.viewBox */
+  AnimatedRect get viewBox native "SVGSVGElement_viewBox_Getter";
+
+
+  /** @domName SVGSVGElement.xmllang */
+  String get xmllang native "SVGSVGElement_xmllang_Getter";
+
+
+  /** @domName SVGSVGElement.xmllang */
+  void set xmllang(String value) native "SVGSVGElement_xmllang_Setter";
+
+
+  /** @domName SVGSVGElement.xmlspace */
+  String get xmlspace native "SVGSVGElement_xmlspace_Getter";
+
+
+  /** @domName SVGSVGElement.xmlspace */
+  void set xmlspace(String value) native "SVGSVGElement_xmlspace_Setter";
+
+
+  /** @domName SVGSVGElement.farthestViewportElement */
+  SvgElement get farthestViewportElement native "SVGSVGElement_farthestViewportElement_Getter";
+
+
+  /** @domName SVGSVGElement.nearestViewportElement */
+  SvgElement get nearestViewportElement native "SVGSVGElement_nearestViewportElement_Getter";
+
+
+  /** @domName SVGSVGElement.getBBox */
+  Rect getBBox() native "SVGSVGElement_getBBox_Callback";
+
+
+  /** @domName SVGSVGElement.getCTM */
+  Matrix getCTM() native "SVGSVGElement_getCTM_Callback";
+
+
+  /** @domName SVGSVGElement.getScreenCTM */
+  Matrix getScreenCTM() native "SVGSVGElement_getScreenCTM_Callback";
+
+
+  /** @domName SVGSVGElement.getTransformToElement */
+  Matrix getTransformToElement(SvgElement element) native "SVGSVGElement_getTransformToElement_Callback";
+
+
+  /** @domName SVGSVGElement.className */
+  AnimatedString get $dom_svgClassName native "SVGSVGElement_className_Getter";
+
+
+  /** @domName SVGSVGElement.style */
+  CSSStyleDeclaration get style native "SVGSVGElement_style_Getter";
+
+
+  /** @domName SVGSVGElement.getPresentationAttribute */
+  CSSValue getPresentationAttribute(String name) native "SVGSVGElement_getPresentationAttribute_Callback";
+
+
+  /** @domName SVGSVGElement.requiredExtensions */
+  StringList get requiredExtensions native "SVGSVGElement_requiredExtensions_Getter";
+
+
+  /** @domName SVGSVGElement.requiredFeatures */
+  StringList get requiredFeatures native "SVGSVGElement_requiredFeatures_Getter";
+
+
+  /** @domName SVGSVGElement.systemLanguage */
+  StringList get systemLanguage native "SVGSVGElement_systemLanguage_Getter";
+
+
+  /** @domName SVGSVGElement.hasExtension */
+  bool hasExtension(String extension) native "SVGSVGElement_hasExtension_Callback";
+
+
+  /** @domName SVGSVGElement.zoomAndPan */
+  int get zoomAndPan native "SVGSVGElement_zoomAndPan_Getter";
+
+
+  /** @domName SVGSVGElement.zoomAndPan */
+  void set zoomAndPan(int value) native "SVGSVGElement_zoomAndPan_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 SVGSwitchElement
-class SVGSwitchElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired {
-  SVGSwitchElement.internal(): super.internal();
+class SwitchElement extends SvgElement implements Transformable, Tests, Stylable, ExternalResourcesRequired, LangSpace {
+
+  factory SwitchElement() => _SvgElementFactoryProvider.createSvgElement_tag("switch");
+  SwitchElement.internal(): super.internal();
 
 
   /** @domName SVGSwitchElement.externalResourcesRequired */
-  SVGAnimatedBoolean get externalResourcesRequired native "SVGSwitchElement_externalResourcesRequired_Getter";
+  AnimatedBoolean get externalResourcesRequired native "SVGSwitchElement_externalResourcesRequired_Getter";
 
 
   /** @domName SVGSwitchElement.xmllang */
@@ -6893,31 +6993,31 @@
 
 
   /** @domName SVGSwitchElement.farthestViewportElement */
-  SVGElement get farthestViewportElement native "SVGSwitchElement_farthestViewportElement_Getter";
+  SvgElement get farthestViewportElement native "SVGSwitchElement_farthestViewportElement_Getter";
 
 
   /** @domName SVGSwitchElement.nearestViewportElement */
-  SVGElement get nearestViewportElement native "SVGSwitchElement_nearestViewportElement_Getter";
+  SvgElement get nearestViewportElement native "SVGSwitchElement_nearestViewportElement_Getter";
 
 
   /** @domName SVGSwitchElement.getBBox */
-  SVGRect getBBox() native "SVGSwitchElement_getBBox_Callback";
+  Rect getBBox() native "SVGSwitchElement_getBBox_Callback";
 
 
   /** @domName SVGSwitchElement.getCTM */
-  SVGMatrix getCTM() native "SVGSwitchElement_getCTM_Callback";
+  Matrix getCTM() native "SVGSwitchElement_getCTM_Callback";
 
 
   /** @domName SVGSwitchElement.getScreenCTM */
-  SVGMatrix getScreenCTM() native "SVGSwitchElement_getScreenCTM_Callback";
+  Matrix getScreenCTM() native "SVGSwitchElement_getScreenCTM_Callback";
 
 
   /** @domName SVGSwitchElement.getTransformToElement */
-  SVGMatrix getTransformToElement(SVGElement element) native "SVGSwitchElement_getTransformToElement_Callback";
+  Matrix getTransformToElement(SvgElement element) native "SVGSwitchElement_getTransformToElement_Callback";
 
 
   /** @domName SVGSwitchElement.className */
-  SVGAnimatedString get $dom_svgClassName native "SVGSwitchElement_className_Getter";
+  AnimatedString get $dom_svgClassName native "SVGSwitchElement_className_Getter";
 
 
   /** @domName SVGSwitchElement.style */
@@ -6929,15 +7029,15 @@
 
 
   /** @domName SVGSwitchElement.requiredExtensions */
-  SVGStringList get requiredExtensions native "SVGSwitchElement_requiredExtensions_Getter";
+  StringList get requiredExtensions native "SVGSwitchElement_requiredExtensions_Getter";
 
 
   /** @domName SVGSwitchElement.requiredFeatures */
-  SVGStringList get requiredFeatures native "SVGSwitchElement_requiredFeatures_Getter";
+  StringList get requiredFeatures native "SVGSwitchElement_requiredFeatures_Getter";
 
 
   /** @domName SVGSwitchElement.systemLanguage */
-  SVGStringList get systemLanguage native "SVGSwitchElement_systemLanguage_Getter";
+  StringList get systemLanguage native "SVGSwitchElement_systemLanguage_Getter";
 
 
   /** @domName SVGSwitchElement.hasExtension */
@@ -6945,7 +7045,7 @@
 
 
   /** @domName SVGSwitchElement.transform */
-  SVGAnimatedTransformList get transform native "SVGSwitchElement_transform_Getter";
+  AnimatedTransformList get transform native "SVGSwitchElement_transform_Getter";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6956,20 +7056,22 @@
 
 
 /// @domName SVGSymbolElement
-class SVGSymbolElement extends SVGElement implements SVGLangSpace, SVGFitToViewBox, SVGExternalResourcesRequired, SVGStylable {
-  SVGSymbolElement.internal(): super.internal();
+class SymbolElement extends SvgElement implements FitToViewBox, ExternalResourcesRequired, Stylable, LangSpace {
+
+  factory SymbolElement() => _SvgElementFactoryProvider.createSvgElement_tag("symbol");
+  SymbolElement.internal(): super.internal();
 
 
   /** @domName SVGSymbolElement.externalResourcesRequired */
-  SVGAnimatedBoolean get externalResourcesRequired native "SVGSymbolElement_externalResourcesRequired_Getter";
+  AnimatedBoolean get externalResourcesRequired native "SVGSymbolElement_externalResourcesRequired_Getter";
 
 
   /** @domName SVGSymbolElement.preserveAspectRatio */
-  SVGAnimatedPreserveAspectRatio get preserveAspectRatio native "SVGSymbolElement_preserveAspectRatio_Getter";
+  AnimatedPreserveAspectRatio get preserveAspectRatio native "SVGSymbolElement_preserveAspectRatio_Getter";
 
 
   /** @domName SVGSymbolElement.viewBox */
-  SVGAnimatedRect get viewBox native "SVGSymbolElement_viewBox_Getter";
+  AnimatedRect get viewBox native "SVGSymbolElement_viewBox_Getter";
 
 
   /** @domName SVGSymbolElement.xmllang */
@@ -6989,7 +7091,7 @@
 
 
   /** @domName SVGSymbolElement.className */
-  SVGAnimatedString get $dom_svgClassName native "SVGSymbolElement_className_Getter";
+  AnimatedString get $dom_svgClassName native "SVGSymbolElement_className_Getter";
 
 
   /** @domName SVGSymbolElement.style */
@@ -7008,12 +7110,14 @@
 
 
 /// @domName SVGTRefElement
-class SVGTRefElement extends SVGTextPositioningElement implements SVGURIReference {
-  SVGTRefElement.internal(): super.internal();
+class TRefElement extends TextPositioningElement implements UriReference {
+
+  factory TRefElement() => _SvgElementFactoryProvider.createSvgElement_tag("tref");
+  TRefElement.internal(): super.internal();
 
 
   /** @domName SVGTRefElement.href */
-  SVGAnimatedString get href native "SVGTRefElement_href_Getter";
+  AnimatedString get href native "SVGTRefElement_href_Getter";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7024,8 +7128,10 @@
 
 
 /// @domName SVGTSpanElement
-class SVGTSpanElement extends SVGTextPositioningElement {
-  SVGTSpanElement.internal(): super.internal();
+class TSpanElement extends TextPositioningElement {
+
+  factory TSpanElement() => _SvgElementFactoryProvider.createSvgElement_tag("tspan");
+  TSpanElement.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7036,20 +7142,20 @@
 
 
 /// @domName SVGTests
-class SVGTests extends NativeFieldWrapperClass1 {
-  SVGTests.internal();
+class Tests extends NativeFieldWrapperClass1 {
+  Tests.internal();
 
 
   /** @domName SVGTests.requiredExtensions */
-  SVGStringList get requiredExtensions native "SVGTests_requiredExtensions_Getter";
+  StringList get requiredExtensions native "SVGTests_requiredExtensions_Getter";
 
 
   /** @domName SVGTests.requiredFeatures */
-  SVGStringList get requiredFeatures native "SVGTests_requiredFeatures_Getter";
+  StringList get requiredFeatures native "SVGTests_requiredFeatures_Getter";
 
 
   /** @domName SVGTests.systemLanguage */
-  SVGStringList get systemLanguage native "SVGTests_systemLanguage_Getter";
+  StringList get systemLanguage native "SVGTests_systemLanguage_Getter";
 
 
   /** @domName SVGTests.hasExtension */
@@ -7064,8 +7170,8 @@
 
 
 /// @domName SVGTextContentElement
-class SVGTextContentElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGExternalResourcesRequired {
-  SVGTextContentElement.internal(): super.internal();
+class TextContentElement extends SvgElement implements Tests, Stylable, ExternalResourcesRequired, LangSpace {
+  TextContentElement.internal(): super.internal();
 
   static const int LENGTHADJUST_SPACING = 1;
 
@@ -7075,15 +7181,15 @@
 
 
   /** @domName SVGTextContentElement.lengthAdjust */
-  SVGAnimatedEnumeration get lengthAdjust native "SVGTextContentElement_lengthAdjust_Getter";
+  AnimatedEnumeration get lengthAdjust native "SVGTextContentElement_lengthAdjust_Getter";
 
 
   /** @domName SVGTextContentElement.textLength */
-  SVGAnimatedLength get textLength native "SVGTextContentElement_textLength_Getter";
+  AnimatedLength get textLength native "SVGTextContentElement_textLength_Getter";
 
 
   /** @domName SVGTextContentElement.getCharNumAtPosition */
-  int getCharNumAtPosition(SVGPoint point) native "SVGTextContentElement_getCharNumAtPosition_Callback";
+  int getCharNumAtPosition(Point point) native "SVGTextContentElement_getCharNumAtPosition_Callback";
 
 
   /** @domName SVGTextContentElement.getComputedTextLength */
@@ -7091,11 +7197,11 @@
 
 
   /** @domName SVGTextContentElement.getEndPositionOfChar */
-  SVGPoint getEndPositionOfChar(int offset) native "SVGTextContentElement_getEndPositionOfChar_Callback";
+  Point getEndPositionOfChar(int offset) native "SVGTextContentElement_getEndPositionOfChar_Callback";
 
 
   /** @domName SVGTextContentElement.getExtentOfChar */
-  SVGRect getExtentOfChar(int offset) native "SVGTextContentElement_getExtentOfChar_Callback";
+  Rect getExtentOfChar(int offset) native "SVGTextContentElement_getExtentOfChar_Callback";
 
 
   /** @domName SVGTextContentElement.getNumberOfChars */
@@ -7107,7 +7213,7 @@
 
 
   /** @domName SVGTextContentElement.getStartPositionOfChar */
-  SVGPoint getStartPositionOfChar(int offset) native "SVGTextContentElement_getStartPositionOfChar_Callback";
+  Point getStartPositionOfChar(int offset) native "SVGTextContentElement_getStartPositionOfChar_Callback";
 
 
   /** @domName SVGTextContentElement.getSubStringLength */
@@ -7119,7 +7225,7 @@
 
 
   /** @domName SVGTextContentElement.externalResourcesRequired */
-  SVGAnimatedBoolean get externalResourcesRequired native "SVGTextContentElement_externalResourcesRequired_Getter";
+  AnimatedBoolean get externalResourcesRequired native "SVGTextContentElement_externalResourcesRequired_Getter";
 
 
   /** @domName SVGTextContentElement.xmllang */
@@ -7139,7 +7245,7 @@
 
 
   /** @domName SVGTextContentElement.className */
-  SVGAnimatedString get $dom_svgClassName native "SVGTextContentElement_className_Getter";
+  AnimatedString get $dom_svgClassName native "SVGTextContentElement_className_Getter";
 
 
   /** @domName SVGTextContentElement.style */
@@ -7151,15 +7257,15 @@
 
 
   /** @domName SVGTextContentElement.requiredExtensions */
-  SVGStringList get requiredExtensions native "SVGTextContentElement_requiredExtensions_Getter";
+  StringList get requiredExtensions native "SVGTextContentElement_requiredExtensions_Getter";
 
 
   /** @domName SVGTextContentElement.requiredFeatures */
-  SVGStringList get requiredFeatures native "SVGTextContentElement_requiredFeatures_Getter";
+  StringList get requiredFeatures native "SVGTextContentElement_requiredFeatures_Getter";
 
 
   /** @domName SVGTextContentElement.systemLanguage */
-  SVGStringList get systemLanguage native "SVGTextContentElement_systemLanguage_Getter";
+  StringList get systemLanguage native "SVGTextContentElement_systemLanguage_Getter";
 
 
   /** @domName SVGTextContentElement.hasExtension */
@@ -7174,36 +7280,38 @@
 
 
 /// @domName SVGTextElement
-class SVGTextElement extends SVGTextPositioningElement implements SVGTransformable {
-  SVGTextElement.internal(): super.internal();
+class TextElement extends TextPositioningElement implements Transformable {
+
+  factory TextElement() => _SvgElementFactoryProvider.createSvgElement_tag("text");
+  TextElement.internal(): super.internal();
 
 
   /** @domName SVGTextElement.farthestViewportElement */
-  SVGElement get farthestViewportElement native "SVGTextElement_farthestViewportElement_Getter";
+  SvgElement get farthestViewportElement native "SVGTextElement_farthestViewportElement_Getter";
 
 
   /** @domName SVGTextElement.nearestViewportElement */
-  SVGElement get nearestViewportElement native "SVGTextElement_nearestViewportElement_Getter";
+  SvgElement get nearestViewportElement native "SVGTextElement_nearestViewportElement_Getter";
 
 
   /** @domName SVGTextElement.getBBox */
-  SVGRect getBBox() native "SVGTextElement_getBBox_Callback";
+  Rect getBBox() native "SVGTextElement_getBBox_Callback";
 
 
   /** @domName SVGTextElement.getCTM */
-  SVGMatrix getCTM() native "SVGTextElement_getCTM_Callback";
+  Matrix getCTM() native "SVGTextElement_getCTM_Callback";
 
 
   /** @domName SVGTextElement.getScreenCTM */
-  SVGMatrix getScreenCTM() native "SVGTextElement_getScreenCTM_Callback";
+  Matrix getScreenCTM() native "SVGTextElement_getScreenCTM_Callback";
 
 
   /** @domName SVGTextElement.getTransformToElement */
-  SVGMatrix getTransformToElement(SVGElement element) native "SVGTextElement_getTransformToElement_Callback";
+  Matrix getTransformToElement(SvgElement element) native "SVGTextElement_getTransformToElement_Callback";
 
 
   /** @domName SVGTextElement.transform */
-  SVGAnimatedTransformList get transform native "SVGTextElement_transform_Getter";
+  AnimatedTransformList get transform native "SVGTextElement_transform_Getter";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7214,8 +7322,8 @@
 
 
 /// @domName SVGTextPathElement
-class SVGTextPathElement extends SVGTextContentElement implements SVGURIReference {
-  SVGTextPathElement.internal(): super.internal();
+class TextPathElement extends TextContentElement implements UriReference {
+  TextPathElement.internal(): super.internal();
 
   static const int TEXTPATH_METHODTYPE_ALIGN = 1;
 
@@ -7231,19 +7339,19 @@
 
 
   /** @domName SVGTextPathElement.method */
-  SVGAnimatedEnumeration get method native "SVGTextPathElement_method_Getter";
+  AnimatedEnumeration get method native "SVGTextPathElement_method_Getter";
 
 
   /** @domName SVGTextPathElement.spacing */
-  SVGAnimatedEnumeration get spacing native "SVGTextPathElement_spacing_Getter";
+  AnimatedEnumeration get spacing native "SVGTextPathElement_spacing_Getter";
 
 
   /** @domName SVGTextPathElement.startOffset */
-  SVGAnimatedLength get startOffset native "SVGTextPathElement_startOffset_Getter";
+  AnimatedLength get startOffset native "SVGTextPathElement_startOffset_Getter";
 
 
   /** @domName SVGTextPathElement.href */
-  SVGAnimatedString get href native "SVGTextPathElement_href_Getter";
+  AnimatedString get href native "SVGTextPathElement_href_Getter";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7254,28 +7362,28 @@
 
 
 /// @domName SVGTextPositioningElement
-class SVGTextPositioningElement extends SVGTextContentElement {
-  SVGTextPositioningElement.internal(): super.internal();
+class TextPositioningElement extends TextContentElement {
+  TextPositioningElement.internal(): super.internal();
 
 
   /** @domName SVGTextPositioningElement.dx */
-  SVGAnimatedLengthList get dx native "SVGTextPositioningElement_dx_Getter";
+  AnimatedLengthList get dx native "SVGTextPositioningElement_dx_Getter";
 
 
   /** @domName SVGTextPositioningElement.dy */
-  SVGAnimatedLengthList get dy native "SVGTextPositioningElement_dy_Getter";
+  AnimatedLengthList get dy native "SVGTextPositioningElement_dy_Getter";
 
 
   /** @domName SVGTextPositioningElement.rotate */
-  SVGAnimatedNumberList get rotate native "SVGTextPositioningElement_rotate_Getter";
+  AnimatedNumberList get rotate native "SVGTextPositioningElement_rotate_Getter";
 
 
   /** @domName SVGTextPositioningElement.x */
-  SVGAnimatedLengthList get x native "SVGTextPositioningElement_x_Getter";
+  AnimatedLengthList get x native "SVGTextPositioningElement_x_Getter";
 
 
   /** @domName SVGTextPositioningElement.y */
-  SVGAnimatedLengthList get y native "SVGTextPositioningElement_y_Getter";
+  AnimatedLengthList get y native "SVGTextPositioningElement_y_Getter";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7286,8 +7394,10 @@
 
 
 /// @domName SVGTitleElement
-class SVGTitleElement extends SVGElement implements SVGLangSpace, SVGStylable {
-  SVGTitleElement.internal(): super.internal();
+class TitleElement extends SvgElement implements Stylable, LangSpace {
+
+  factory TitleElement() => _SvgElementFactoryProvider.createSvgElement_tag("title");
+  TitleElement.internal(): super.internal();
 
 
   /** @domName SVGTitleElement.xmllang */
@@ -7307,7 +7417,7 @@
 
 
   /** @domName SVGTitleElement.className */
-  SVGAnimatedString get $dom_svgClassName native "SVGTitleElement_className_Getter";
+  AnimatedString get $dom_svgClassName native "SVGTitleElement_className_Getter";
 
 
   /** @domName SVGTitleElement.style */
@@ -7326,8 +7436,8 @@
 
 
 /// @domName SVGTransform
-class SVGTransform extends NativeFieldWrapperClass1 {
-  SVGTransform.internal();
+class Transform extends NativeFieldWrapperClass1 {
+  Transform.internal();
 
   static const int SVG_TRANSFORM_MATRIX = 1;
 
@@ -7349,7 +7459,7 @@
 
 
   /** @domName SVGTransform.matrix */
-  SVGMatrix get matrix native "SVGTransform_matrix_Getter";
+  Matrix get matrix native "SVGTransform_matrix_Getter";
 
 
   /** @domName SVGTransform.type */
@@ -7357,7 +7467,7 @@
 
 
   /** @domName SVGTransform.setMatrix */
-  void setMatrix(SVGMatrix matrix) native "SVGTransform_setMatrix_Callback";
+  void setMatrix(Matrix matrix) native "SVGTransform_setMatrix_Callback";
 
 
   /** @domName SVGTransform.setRotate */
@@ -7388,80 +7498,82 @@
 
 
 /// @domName SVGTransformList
-class SVGTransformList extends NativeFieldWrapperClass1 implements List<SVGTransform> {
-  SVGTransformList.internal();
+class TransformList extends NativeFieldWrapperClass1 implements List<Transform> {
+  TransformList.internal();
 
 
   /** @domName SVGTransformList.numberOfItems */
   int get numberOfItems native "SVGTransformList_numberOfItems_Getter";
 
-  SVGTransform operator[](int index) native "SVGTransformList_item_Callback";
+  Transform operator[](int index) native "SVGTransformList_item_Callback";
 
-  void operator[]=(int index, SVGTransform value) {
+  void operator[]=(int index, Transform value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
-  // -- start List<SVGTransform> mixins.
-  // SVGTransform is the element type.
+  // -- start List<Transform> mixins.
+  // Transform is the element type.
 
-  // From Iterable<SVGTransform>:
+  // From Iterable<Transform>:
 
-  Iterator<SVGTransform> iterator() {
+  Iterator<Transform> 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<SVGTransform>(this);
+    return new FixedSizeListIterator<Transform>(this);
   }
 
-  // From Collection<SVGTransform>:
+  // From Collection<Transform>:
 
-  void add(SVGTransform value) {
+  void add(Transform value) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  void addLast(SVGTransform value) {
+  void addLast(Transform value) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  void addAll(Collection<SVGTransform> collection) {
+  void addAll(Collection<Transform> collection) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  bool contains(SVGTransform element) => _Collections.contains(this, element);
+  bool contains(Transform element) => _Collections.contains(this, element);
 
-  void forEach(void f(SVGTransform element)) => _Collections.forEach(this, f);
+  void forEach(void f(Transform element)) => _Collections.forEach(this, f);
 
-  Collection map(f(SVGTransform element)) => _Collections.map(this, [], f);
+  Collection map(f(Transform element)) => _Collections.map(this, [], f);
 
-  Collection<SVGTransform> filter(bool f(SVGTransform element)) =>
-     _Collections.filter(this, <SVGTransform>[], f);
+  Collection<Transform> filter(bool f(Transform element)) =>
+     _Collections.filter(this, <Transform>[], f);
 
-  bool every(bool f(SVGTransform element)) => _Collections.every(this, f);
+  bool every(bool f(Transform element)) => _Collections.every(this, f);
 
-  bool some(bool f(SVGTransform element)) => _Collections.some(this, f);
+  bool some(bool f(Transform element)) => _Collections.some(this, f);
 
   bool get isEmpty => this.length == 0;
 
-  // From List<SVGTransform>:
+  // From List<Transform>:
 
-  void sort([Comparator<SVGTransform> compare = Comparable.compare]) {
+  void sort([Comparator<Transform> compare = Comparable.compare]) {
     throw new UnsupportedError("Cannot sort immutable List.");
   }
 
-  int indexOf(SVGTransform element, [int start = 0]) =>
+  int indexOf(Transform element, [int start = 0]) =>
       _Lists.indexOf(this, element, start, this.length);
 
-  int lastIndexOf(SVGTransform element, [int start]) {
+  int lastIndexOf(Transform element, [int start]) {
     if (start == null) start = length - 1;
     return _Lists.lastIndexOf(this, element, start);
   }
 
-  SVGTransform get last => this[length - 1];
+  Transform get first => this[0];
 
-  SVGTransform removeLast() {
+  Transform get last => this[length - 1];
+
+  Transform removeLast() {
     throw new UnsupportedError("Cannot removeLast on immutable List.");
   }
 
-  void setRange(int start, int rangeLength, List<SVGTransform> from, [int startFrom]) {
+  void setRange(int start, int rangeLength, List<Transform> from, [int startFrom]) {
     throw new UnsupportedError("Cannot setRange on immutable List.");
   }
 
@@ -7469,18 +7581,18 @@
     throw new UnsupportedError("Cannot removeRange on immutable List.");
   }
 
-  void insertRange(int start, int rangeLength, [SVGTransform initialValue]) {
+  void insertRange(int start, int rangeLength, [Transform initialValue]) {
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
-  List<SVGTransform> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <SVGTransform>[]);
+  List<Transform> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <Transform>[]);
 
-  // -- end List<SVGTransform> mixins.
+  // -- end List<Transform> mixins.
 
 
   /** @domName SVGTransformList.appendItem */
-  SVGTransform appendItem(SVGTransform item) native "SVGTransformList_appendItem_Callback";
+  Transform appendItem(Transform item) native "SVGTransformList_appendItem_Callback";
 
 
   /** @domName SVGTransformList.clear */
@@ -7488,31 +7600,31 @@
 
 
   /** @domName SVGTransformList.consolidate */
-  SVGTransform consolidate() native "SVGTransformList_consolidate_Callback";
+  Transform consolidate() native "SVGTransformList_consolidate_Callback";
 
 
   /** @domName SVGTransformList.createSVGTransformFromMatrix */
-  SVGTransform createSVGTransformFromMatrix(SVGMatrix matrix) native "SVGTransformList_createSVGTransformFromMatrix_Callback";
+  Transform createSVGTransformFromMatrix(Matrix matrix) native "SVGTransformList_createSVGTransformFromMatrix_Callback";
 
 
   /** @domName SVGTransformList.getItem */
-  SVGTransform getItem(int index) native "SVGTransformList_getItem_Callback";
+  Transform getItem(int index) native "SVGTransformList_getItem_Callback";
 
 
   /** @domName SVGTransformList.initialize */
-  SVGTransform initialize(SVGTransform item) native "SVGTransformList_initialize_Callback";
+  Transform initialize(Transform item) native "SVGTransformList_initialize_Callback";
 
 
   /** @domName SVGTransformList.insertItemBefore */
-  SVGTransform insertItemBefore(SVGTransform item, int index) native "SVGTransformList_insertItemBefore_Callback";
+  Transform insertItemBefore(Transform item, int index) native "SVGTransformList_insertItemBefore_Callback";
 
 
   /** @domName SVGTransformList.removeItem */
-  SVGTransform removeItem(int index) native "SVGTransformList_removeItem_Callback";
+  Transform removeItem(int index) native "SVGTransformList_removeItem_Callback";
 
 
   /** @domName SVGTransformList.replaceItem */
-  SVGTransform replaceItem(SVGTransform item, int index) native "SVGTransformList_replaceItem_Callback";
+  Transform replaceItem(Transform item, int index) native "SVGTransformList_replaceItem_Callback";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7523,52 +7635,36 @@
 
 
 /// @domName SVGTransformable
-class SVGTransformable extends NativeFieldWrapperClass1 implements SVGLocatable {
-  SVGTransformable.internal();
+class Transformable extends NativeFieldWrapperClass1 implements Locatable {
+  Transformable.internal();
 
 
   /** @domName SVGTransformable.transform */
-  SVGAnimatedTransformList get transform native "SVGTransformable_transform_Getter";
+  AnimatedTransformList get transform native "SVGTransformable_transform_Getter";
 
 
   /** @domName SVGTransformable.farthestViewportElement */
-  SVGElement get farthestViewportElement native "SVGTransformable_farthestViewportElement_Getter";
+  SvgElement get farthestViewportElement native "SVGTransformable_farthestViewportElement_Getter";
 
 
   /** @domName SVGTransformable.nearestViewportElement */
-  SVGElement get nearestViewportElement native "SVGTransformable_nearestViewportElement_Getter";
+  SvgElement get nearestViewportElement native "SVGTransformable_nearestViewportElement_Getter";
 
 
   /** @domName SVGTransformable.getBBox */
-  SVGRect getBBox() native "SVGTransformable_getBBox_Callback";
+  Rect getBBox() native "SVGTransformable_getBBox_Callback";
 
 
   /** @domName SVGTransformable.getCTM */
-  SVGMatrix getCTM() native "SVGTransformable_getCTM_Callback";
+  Matrix getCTM() native "SVGTransformable_getCTM_Callback";
 
 
   /** @domName SVGTransformable.getScreenCTM */
-  SVGMatrix getScreenCTM() native "SVGTransformable_getScreenCTM_Callback";
+  Matrix getScreenCTM() native "SVGTransformable_getScreenCTM_Callback";
 
 
   /** @domName SVGTransformable.getTransformToElement */
-  SVGMatrix getTransformToElement(SVGElement element) native "SVGTransformable_getTransformToElement_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-/// @domName SVGURIReference
-class SVGURIReference extends NativeFieldWrapperClass1 {
-  SVGURIReference.internal();
-
-
-  /** @domName SVGURIReference.href */
-  SVGAnimatedString get href native "SVGURIReference_href_Getter";
+  Matrix getTransformToElement(SvgElement element) native "SVGTransformable_getTransformToElement_Callback";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7579,8 +7675,8 @@
 
 
 /// @domName SVGUnitTypes
-class SVGUnitTypes extends NativeFieldWrapperClass1 {
-  SVGUnitTypes.internal();
+class UnitTypes extends NativeFieldWrapperClass1 {
+  UnitTypes.internal();
 
   static const int SVG_UNIT_TYPE_OBJECTBOUNDINGBOX = 2;
 
@@ -7596,37 +7692,55 @@
 // WARNING: Do not edit - generated code.
 
 
+/// @domName SVGURIReference
+class UriReference extends NativeFieldWrapperClass1 {
+  UriReference.internal();
+
+
+  /** @domName SVGURIReference.href */
+  AnimatedString get href native "SVGURIReference_href_Getter";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
 /// @domName SVGUseElement
-class SVGUseElement extends SVGElement implements SVGLangSpace, SVGTests, SVGStylable, SVGURIReference, SVGExternalResourcesRequired, SVGTransformable {
-  SVGUseElement.internal(): super.internal();
+class UseElement extends SvgElement implements Transformable, Tests, UriReference, Stylable, ExternalResourcesRequired, LangSpace {
+
+  factory UseElement() => _SvgElementFactoryProvider.createSvgElement_tag("use");
+  UseElement.internal(): super.internal();
 
 
   /** @domName SVGUseElement.animatedInstanceRoot */
-  SVGElementInstance get animatedInstanceRoot native "SVGUseElement_animatedInstanceRoot_Getter";
+  ElementInstance get animatedInstanceRoot native "SVGUseElement_animatedInstanceRoot_Getter";
 
 
   /** @domName SVGUseElement.height */
-  SVGAnimatedLength get height native "SVGUseElement_height_Getter";
+  AnimatedLength get height native "SVGUseElement_height_Getter";
 
 
   /** @domName SVGUseElement.instanceRoot */
-  SVGElementInstance get instanceRoot native "SVGUseElement_instanceRoot_Getter";
+  ElementInstance get instanceRoot native "SVGUseElement_instanceRoot_Getter";
 
 
   /** @domName SVGUseElement.width */
-  SVGAnimatedLength get width native "SVGUseElement_width_Getter";
+  AnimatedLength get width native "SVGUseElement_width_Getter";
 
 
   /** @domName SVGUseElement.x */
-  SVGAnimatedLength get x native "SVGUseElement_x_Getter";
+  AnimatedLength get x native "SVGUseElement_x_Getter";
 
 
   /** @domName SVGUseElement.y */
-  SVGAnimatedLength get y native "SVGUseElement_y_Getter";
+  AnimatedLength get y native "SVGUseElement_y_Getter";
 
 
   /** @domName SVGUseElement.externalResourcesRequired */
-  SVGAnimatedBoolean get externalResourcesRequired native "SVGUseElement_externalResourcesRequired_Getter";
+  AnimatedBoolean get externalResourcesRequired native "SVGUseElement_externalResourcesRequired_Getter";
 
 
   /** @domName SVGUseElement.xmllang */
@@ -7646,31 +7760,31 @@
 
 
   /** @domName SVGUseElement.farthestViewportElement */
-  SVGElement get farthestViewportElement native "SVGUseElement_farthestViewportElement_Getter";
+  SvgElement get farthestViewportElement native "SVGUseElement_farthestViewportElement_Getter";
 
 
   /** @domName SVGUseElement.nearestViewportElement */
-  SVGElement get nearestViewportElement native "SVGUseElement_nearestViewportElement_Getter";
+  SvgElement get nearestViewportElement native "SVGUseElement_nearestViewportElement_Getter";
 
 
   /** @domName SVGUseElement.getBBox */
-  SVGRect getBBox() native "SVGUseElement_getBBox_Callback";
+  Rect getBBox() native "SVGUseElement_getBBox_Callback";
 
 
   /** @domName SVGUseElement.getCTM */
-  SVGMatrix getCTM() native "SVGUseElement_getCTM_Callback";
+  Matrix getCTM() native "SVGUseElement_getCTM_Callback";
 
 
   /** @domName SVGUseElement.getScreenCTM */
-  SVGMatrix getScreenCTM() native "SVGUseElement_getScreenCTM_Callback";
+  Matrix getScreenCTM() native "SVGUseElement_getScreenCTM_Callback";
 
 
   /** @domName SVGUseElement.getTransformToElement */
-  SVGMatrix getTransformToElement(SVGElement element) native "SVGUseElement_getTransformToElement_Callback";
+  Matrix getTransformToElement(SvgElement element) native "SVGUseElement_getTransformToElement_Callback";
 
 
   /** @domName SVGUseElement.className */
-  SVGAnimatedString get $dom_svgClassName native "SVGUseElement_className_Getter";
+  AnimatedString get $dom_svgClassName native "SVGUseElement_className_Getter";
 
 
   /** @domName SVGUseElement.style */
@@ -7682,15 +7796,15 @@
 
 
   /** @domName SVGUseElement.requiredExtensions */
-  SVGStringList get requiredExtensions native "SVGUseElement_requiredExtensions_Getter";
+  StringList get requiredExtensions native "SVGUseElement_requiredExtensions_Getter";
 
 
   /** @domName SVGUseElement.requiredFeatures */
-  SVGStringList get requiredFeatures native "SVGUseElement_requiredFeatures_Getter";
+  StringList get requiredFeatures native "SVGUseElement_requiredFeatures_Getter";
 
 
   /** @domName SVGUseElement.systemLanguage */
-  SVGStringList get systemLanguage native "SVGUseElement_systemLanguage_Getter";
+  StringList get systemLanguage native "SVGUseElement_systemLanguage_Getter";
 
 
   /** @domName SVGUseElement.hasExtension */
@@ -7698,11 +7812,11 @@
 
 
   /** @domName SVGUseElement.transform */
-  SVGAnimatedTransformList get transform native "SVGUseElement_transform_Getter";
+  AnimatedTransformList get transform native "SVGUseElement_transform_Getter";
 
 
   /** @domName SVGUseElement.href */
-  SVGAnimatedString get href native "SVGUseElement_href_Getter";
+  AnimatedString get href native "SVGUseElement_href_Getter";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7713,8 +7827,10 @@
 
 
 /// @domName SVGVKernElement
-class SVGVKernElement extends SVGElement {
-  SVGVKernElement.internal(): super.internal();
+class VKernElement extends SvgElement {
+
+  factory VKernElement() => _SvgElementFactoryProvider.createSvgElement_tag("vkern");
+  VKernElement.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7725,24 +7841,26 @@
 
 
 /// @domName SVGViewElement
-class SVGViewElement extends SVGElement implements SVGFitToViewBox, SVGZoomAndPan, SVGExternalResourcesRequired {
-  SVGViewElement.internal(): super.internal();
+class ViewElement extends SvgElement implements FitToViewBox, ExternalResourcesRequired, ZoomAndPan {
+
+  factory ViewElement() => _SvgElementFactoryProvider.createSvgElement_tag("view");
+  ViewElement.internal(): super.internal();
 
 
   /** @domName SVGViewElement.viewTarget */
-  SVGStringList get viewTarget native "SVGViewElement_viewTarget_Getter";
+  StringList get viewTarget native "SVGViewElement_viewTarget_Getter";
 
 
   /** @domName SVGViewElement.externalResourcesRequired */
-  SVGAnimatedBoolean get externalResourcesRequired native "SVGViewElement_externalResourcesRequired_Getter";
+  AnimatedBoolean get externalResourcesRequired native "SVGViewElement_externalResourcesRequired_Getter";
 
 
   /** @domName SVGViewElement.preserveAspectRatio */
-  SVGAnimatedPreserveAspectRatio get preserveAspectRatio native "SVGViewElement_preserveAspectRatio_Getter";
+  AnimatedPreserveAspectRatio get preserveAspectRatio native "SVGViewElement_preserveAspectRatio_Getter";
 
 
   /** @domName SVGViewElement.viewBox */
-  SVGAnimatedRect get viewBox native "SVGViewElement_viewBox_Getter";
+  AnimatedRect get viewBox native "SVGViewElement_viewBox_Getter";
 
 
   /** @domName SVGViewElement.zoomAndPan */
@@ -7761,12 +7879,12 @@
 
 
 /// @domName SVGViewSpec
-class SVGViewSpec extends NativeFieldWrapperClass1 {
-  SVGViewSpec.internal();
+class ViewSpec extends NativeFieldWrapperClass1 {
+  ViewSpec.internal();
 
 
   /** @domName SVGViewSpec.preserveAspectRatio */
-  SVGAnimatedPreserveAspectRatio get preserveAspectRatio native "SVGViewSpec_preserveAspectRatio_Getter";
+  AnimatedPreserveAspectRatio get preserveAspectRatio native "SVGViewSpec_preserveAspectRatio_Getter";
 
 
   /** @domName SVGViewSpec.preserveAspectRatioString */
@@ -7774,7 +7892,7 @@
 
 
   /** @domName SVGViewSpec.transform */
-  SVGTransformList get transform native "SVGViewSpec_transform_Getter";
+  TransformList get transform native "SVGViewSpec_transform_Getter";
 
 
   /** @domName SVGViewSpec.transformString */
@@ -7782,7 +7900,7 @@
 
 
   /** @domName SVGViewSpec.viewBox */
-  SVGAnimatedRect get viewBox native "SVGViewSpec_viewBox_Getter";
+  AnimatedRect get viewBox native "SVGViewSpec_viewBox_Getter";
 
 
   /** @domName SVGViewSpec.viewBoxString */
@@ -7790,7 +7908,7 @@
 
 
   /** @domName SVGViewSpec.viewTarget */
-  SVGElement get viewTarget native "SVGViewSpec_viewTarget_Getter";
+  SvgElement get viewTarget native "SVGViewSpec_viewTarget_Getter";
 
 
   /** @domName SVGViewSpec.viewTargetString */
@@ -7813,8 +7931,8 @@
 
 
 /// @domName SVGZoomAndPan
-class SVGZoomAndPan extends NativeFieldWrapperClass1 {
-  SVGZoomAndPan.internal();
+class ZoomAndPan extends NativeFieldWrapperClass1 {
+  ZoomAndPan.internal();
 
   static const int SVG_ZOOMANDPAN_DISABLE = 1;
 
@@ -7839,8 +7957,8 @@
 
 
 /// @domName SVGZoomEvent
-class SVGZoomEvent extends UIEvent {
-  SVGZoomEvent.internal(): super.internal();
+class ZoomEvent extends UIEvent {
+  ZoomEvent.internal(): super.internal();
 
 
   /** @domName SVGZoomEvent.newScale */
@@ -7848,7 +7966,7 @@
 
 
   /** @domName SVGZoomEvent.newTranslate */
-  SVGPoint get newTranslate native "SVGZoomEvent_newTranslate_Getter";
+  Point get newTranslate native "SVGZoomEvent_newTranslate_Getter";
 
 
   /** @domName SVGZoomEvent.previousScale */
@@ -7856,11 +7974,11 @@
 
 
   /** @domName SVGZoomEvent.previousTranslate */
-  SVGPoint get previousTranslate native "SVGZoomEvent_previousTranslate_Getter";
+  Point get previousTranslate native "SVGZoomEvent_previousTranslate_Getter";
 
 
   /** @domName SVGZoomEvent.zoomRectScreen */
-  SVGRect get zoomRectScreen native "SVGZoomEvent_zoomRectScreen_Getter";
+  Rect get zoomRectScreen native "SVGZoomEvent_zoomRectScreen_Getter";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7871,80 +7989,82 @@
 
 
 /// @domName SVGElementInstanceList
-class _SVGElementInstanceList extends NativeFieldWrapperClass1 implements List<SVGElementInstance> {
-  _SVGElementInstanceList.internal();
+class _ElementInstanceList extends NativeFieldWrapperClass1 implements List<ElementInstance> {
+  _ElementInstanceList.internal();
 
 
   /** @domName SVGElementInstanceList.length */
   int get length native "SVGElementInstanceList_length_Getter";
 
-  SVGElementInstance operator[](int index) native "SVGElementInstanceList_item_Callback";
+  ElementInstance operator[](int index) native "SVGElementInstanceList_item_Callback";
 
-  void operator[]=(int index, SVGElementInstance value) {
+  void operator[]=(int index, ElementInstance value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
-  // -- start List<SVGElementInstance> mixins.
-  // SVGElementInstance is the element type.
+  // -- start List<ElementInstance> mixins.
+  // ElementInstance is the element type.
 
-  // From Iterable<SVGElementInstance>:
+  // From Iterable<ElementInstance>:
 
-  Iterator<SVGElementInstance> iterator() {
+  Iterator<ElementInstance> 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<SVGElementInstance>(this);
+    return new FixedSizeListIterator<ElementInstance>(this);
   }
 
-  // From Collection<SVGElementInstance>:
+  // From Collection<ElementInstance>:
 
-  void add(SVGElementInstance value) {
+  void add(ElementInstance value) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  void addLast(SVGElementInstance value) {
+  void addLast(ElementInstance value) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  void addAll(Collection<SVGElementInstance> collection) {
+  void addAll(Collection<ElementInstance> collection) {
     throw new UnsupportedError("Cannot add to immutable List.");
   }
 
-  bool contains(SVGElementInstance element) => _Collections.contains(this, element);
+  bool contains(ElementInstance element) => _Collections.contains(this, element);
 
-  void forEach(void f(SVGElementInstance element)) => _Collections.forEach(this, f);
+  void forEach(void f(ElementInstance element)) => _Collections.forEach(this, f);
 
-  Collection map(f(SVGElementInstance element)) => _Collections.map(this, [], f);
+  Collection map(f(ElementInstance element)) => _Collections.map(this, [], f);
 
-  Collection<SVGElementInstance> filter(bool f(SVGElementInstance element)) =>
-     _Collections.filter(this, <SVGElementInstance>[], f);
+  Collection<ElementInstance> filter(bool f(ElementInstance element)) =>
+     _Collections.filter(this, <ElementInstance>[], f);
 
-  bool every(bool f(SVGElementInstance element)) => _Collections.every(this, f);
+  bool every(bool f(ElementInstance element)) => _Collections.every(this, f);
 
-  bool some(bool f(SVGElementInstance element)) => _Collections.some(this, f);
+  bool some(bool f(ElementInstance element)) => _Collections.some(this, f);
 
   bool get isEmpty => this.length == 0;
 
-  // From List<SVGElementInstance>:
+  // From List<ElementInstance>:
 
-  void sort([Comparator<SVGElementInstance> compare = Comparable.compare]) {
+  void sort([Comparator<ElementInstance> compare = Comparable.compare]) {
     throw new UnsupportedError("Cannot sort immutable List.");
   }
 
-  int indexOf(SVGElementInstance element, [int start = 0]) =>
+  int indexOf(ElementInstance element, [int start = 0]) =>
       _Lists.indexOf(this, element, start, this.length);
 
-  int lastIndexOf(SVGElementInstance element, [int start]) {
+  int lastIndexOf(ElementInstance element, [int start]) {
     if (start == null) start = length - 1;
     return _Lists.lastIndexOf(this, element, start);
   }
 
-  SVGElementInstance get last => this[length - 1];
+  ElementInstance get first => this[0];
 
-  SVGElementInstance removeLast() {
+  ElementInstance get last => this[length - 1];
+
+  ElementInstance removeLast() {
     throw new UnsupportedError("Cannot removeLast on immutable List.");
   }
 
-  void setRange(int start, int rangeLength, List<SVGElementInstance> from, [int startFrom]) {
+  void setRange(int start, int rangeLength, List<ElementInstance> from, [int startFrom]) {
     throw new UnsupportedError("Cannot setRange on immutable List.");
   }
 
@@ -7952,17 +8072,17 @@
     throw new UnsupportedError("Cannot removeRange on immutable List.");
   }
 
-  void insertRange(int start, int rangeLength, [SVGElementInstance initialValue]) {
+  void insertRange(int start, int rangeLength, [ElementInstance initialValue]) {
     throw new UnsupportedError("Cannot insertRange on immutable List.");
   }
 
-  List<SVGElementInstance> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <SVGElementInstance>[]);
+  List<ElementInstance> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <ElementInstance>[]);
 
-  // -- end List<SVGElementInstance> mixins.
+  // -- end List<ElementInstance> mixins.
 
 
   /** @domName SVGElementInstanceList.item */
-  SVGElementInstance item(int index) native "SVGElementInstanceList_item_Callback";
+  ElementInstance item(int index) native "SVGElementInstanceList_item_Callback";
 
 }
diff --git a/sdk/lib/utf/utf16.dart b/sdk/lib/utf/utf16.dart
index d1bd012..e37c603 100644
--- a/sdk/lib/utf/utf16.dart
+++ b/sdk/lib/utf/utf16.dart
@@ -62,15 +62,8 @@
   Utf16BytesToCodeUnitsDecoder decoder = new Utf16BytesToCodeUnitsDecoder(bytes,
       offset, length, replacementCodepoint);
   List<int> codeunits = decoder.decodeRest();
-  // TODO is16BitCodeUnit() is used to work around a bug with dart2js
-  // (http://code.google.com/p/dart/issues/detail?id=1357). Consider
-  // removing after this issue is resolved.
-  if (_is16BitCodeUnit()) {
-    return new String.fromCharCodes(codeunits);
-  } else {
-    return new String.fromCharCodes(
-        _utf16CodeUnitsToCodepoints(codeunits, 0, null, replacementCodepoint));
-  }
+  return new String.fromCharCodes(
+      _utf16CodeUnitsToCodepoints(codeunits, 0, null, replacementCodepoint));
 }
 
 /**
@@ -85,15 +78,8 @@
     int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) {
   List<int> codeunits = (new Utf16beBytesToCodeUnitsDecoder(bytes, offset,
       length, stripBom, replacementCodepoint)).decodeRest();
-  // TODO is16BitCodeUnit() is used to work around a bug with dart2js
-  // (http://code.google.com/p/dart/issues/detail?id=1357). Consider
-  // removing after this issue is resolved.
-  if (_is16BitCodeUnit()) {
-    return new String.fromCharCodes(codeunits);
-  } else {
-    return new String.fromCharCodes(
-        _utf16CodeUnitsToCodepoints(codeunits, 0, null, replacementCodepoint));
-  }
+  return new String.fromCharCodes(
+      _utf16CodeUnitsToCodepoints(codeunits, 0, null, replacementCodepoint));
 }
 
 /**
@@ -108,15 +94,8 @@
     int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) {
   List<int> codeunits = (new Utf16leBytesToCodeUnitsDecoder(bytes, offset,
       length, stripBom, replacementCodepoint)).decodeRest();
-  // TODO is16BitCodeUnit() is used to work around a bug with dart2js
-  // (http://code.google.com/p/dart/issues/detail?id=1357). Consider
-  // removing after this issue is resolved.
-  if (_is16BitCodeUnit()) {
-    return new String.fromCharCodes(codeunits);
-  } else {
-    return new String.fromCharCodes(
-        _utf16CodeUnitsToCodepoints(codeunits, 0, null, replacementCodepoint));
-  }
+  return new String.fromCharCodes(
+      _utf16CodeUnitsToCodepoints(codeunits, 0, null, replacementCodepoint));
 }
 
 /**
@@ -198,14 +177,7 @@
 }
 
 List<int> _stringToUtf16CodeUnits(String str) {
-  // TODO is16BitCodeUnit() is used to work around a bug with dart2js
-  // (http://code.google.com/p/dart/issues/detail?id=1357). Consider
-  // removing after this issue is resolved.
-  if (_is16BitCodeUnit()) {
-    return str.charCodes;
-  } else {
-    return _codepointsToUtf16CodeUnits(str.charCodes);
-  }
+  return _codepointsToUtf16CodeUnits(str.charCodes);
 }
 
 typedef _ListRangeIterator _CodeUnitsProvider();
@@ -304,7 +276,7 @@
     utf16EncodedBytesIterator.skip(2 * count);
   }
 
-  abstract int decode();
+  int decode();
 }
 
 /**
diff --git a/sdk/lib/utf/utf32.dart b/sdk/lib/utf/utf32.dart
index 9cbfd7a..8472b52 100644
--- a/sdk/lib/utf/utf32.dart
+++ b/sdk/lib/utf/utf32.dart
@@ -261,7 +261,7 @@
     utf32EncodedBytesIterator.skip(4 * count);
   }
 
-  abstract int decode();
+  int decode();
 }
 
 /**
diff --git a/sdk/lib/utf/utf_core.dart b/sdk/lib/utf/utf_core.dart
index a1cedce..8b1751d 100644
--- a/sdk/lib/utf/utf_core.dart
+++ b/sdk/lib/utf/utf_core.dart
@@ -8,8 +8,7 @@
  */
 List<int> stringToCodepoints(String str) {
   // Note: str.charCodes gives us 16-bit code units on all Dart implementations.
-  // So we need to convert. The same is not true of "new String.fromCharCodes",
-  // which accepts code points on the VM but not dart2js (dartbug.com/1357).
+  // So we need to convert.
   return _utf16CodeUnitsToCodepoints(str.charCodes);
 }
 
@@ -17,31 +16,7 @@
  * Generate a string from the provided Unicode codepoints.
  */
 String codepointsToString(List<int> codepoints) {
-  // TODO _is16BitCodeUnit() is used to work around a bug with dart2js
-  // (http://code.google.com/p/dart/issues/detail?id=1357). Consider
-  // removing after this issue is resolved.
-  if (_is16BitCodeUnit()) {
-    return new String.fromCharCodes(
-        _codepointsToUtf16CodeUnits(codepoints));
-  } else {
-    return new String.fromCharCodes(codepoints);
-  }
-}
-
-/*
- * Test for presence of bug related to the use of UTF-16 code units for
- * Dart compiled to JS.
- */
-bool _test16BitCodeUnit = null;
-// TODO _is16BitCodeUnit() is used to work around a bug with dart2js
-// (http://code.google.com/p/dart/issues/detail?id=1357). Consider
-// removing after this issue is resolved.
-bool _is16BitCodeUnit() {
-  if (_test16BitCodeUnit == null) {
-    _test16BitCodeUnit = (new String.fromCharCodes([0x1D11E])) ==
-        (new String.fromCharCodes([0xD11E]));
-  }
-  return _test16BitCodeUnit;
+  return new String.fromCharCodes(codepoints);
 }
 
 /**
diff --git a/tests/co19/co19-compiler.status b/tests/co19/co19-compiler.status
index b88fcc3..ea0e63a 100644
--- a/tests/co19/co19-compiler.status
+++ b/tests/co19/co19-compiler.status
@@ -21,7 +21,10 @@
 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/06_Functions/2_Formal_Parameters_A02_t01: 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/08_Interfaces/5_Superinterfaces_A01_t02: Fail # TODO(analyzer-team): Please triage this failure.
@@ -30,49 +33,14 @@
 Language/11_Expressions/01_Constants_A03_t01: Fail # TODO(analyzer-team): Please triage this failure.
 Language/11_Expressions/01_Constants_A05_t01: Fail # TODO(analyzer-team): Please triage this failure.
 Language/11_Expressions/01_Constants_A14_t01: Fail # TODO(analyzer-team): Please triage this failure.
-Language/11_Expressions/05_Strings/1_String_Interpolation_A01_t06: Fail # TODO(analyzer-team): Please triage this failure.
+Language/11_Expressions/01_Constants_A20_t03: Fail # TODO(analyzer-team): Please triage this failure.
 Language/11_Expressions/05_Strings/1_String_Interpolation_A01_t07: Fail # TODO(analyzer-team): Please triage this failure.
 Language/11_Expressions/05_Strings/1_String_Interpolation_A01_t13: Fail # TODO(analyzer-team): Please triage this failure.
 Language/11_Expressions/08_Throw_A05_t01: Fail # TODO(analyzer-team): Please triage this failure.
 Language/11_Expressions/11_Instance_Creation/1_New_A02_t07: Fail # TODO(analyzer-team): Please triage this failure.
 Language/11_Expressions/11_Instance_Creation/1_New_A06_t06: Fail # TODO(analyzer-team): Please triage this failure.
 Language/11_Expressions/11_Instance_Creation/2_Const_A10_t01: Fail # TODO(analyzer-team): Please triage this failure.
-Language/11_Expressions/11_Instance_Creation_A02_t01: Fail # TODO(analyzer-team): Please triage this failure.
 Language/11_Expressions/18_Assignment_A05_t05: Fail # TODO(analyzer-team): Please triage this failure.
-Language/11_Expressions/19_Conditional_A01_t14: Fail # TODO(analyzer-team): Please triage this failure.
-Language/11_Expressions/19_Conditional_A01_t15: Fail # TODO(analyzer-team): Please triage this failure.
-Language/11_Expressions/20_Logical_Boolean_Expressions_A01_t14: Fail # TODO(analyzer-team): Please triage this failure.
-Language/11_Expressions/21_Bitwise_Expressions_A01_t16: Fail # TODO(analyzer-team): Please triage this failure.
-Language/11_Expressions/21_Bitwise_Expressions_A01_t17: Fail # TODO(analyzer-team): Please triage this failure.
-Language/11_Expressions/22_Equality_A01_t23: Fail # TODO(analyzer-team): Please triage this failure.
-Language/11_Expressions/22_Equality_A01_t24: Fail # TODO(analyzer-team): Please triage this failure.
-Language/11_Expressions/23_Relational_Expressions_A01_t22: Fail # TODO(analyzer-team): Please triage this failure.
-Language/11_Expressions/23_Relational_Expressions_A01_t23: Fail # TODO(analyzer-team): Please triage this failure.
-Language/11_Expressions/24_Shift_A01_t13: Fail # TODO(analyzer-team): Please triage this failure.
-Language/11_Expressions/24_Shift_A01_t14: Fail # TODO(analyzer-team): Please triage this failure.
-Language/11_Expressions/25_Additive_Expressions_A01_t11: Fail # TODO(analyzer-team): Please triage this failure.
-Language/11_Expressions/25_Additive_Expressions_A01_t12: Fail # TODO(analyzer-team): Please triage this failure.
-Language/11_Expressions/25_Additive_Expressions_A01_t13: Fail # TODO(analyzer-team): Please triage this failure.
-Language/11_Expressions/25_Additive_Expressions_A01_t14: Fail # TODO(analyzer-team): Please triage this failure.
-Language/11_Expressions/26_Multiplicative_Expressions_A01_t14: Fail # TODO(analyzer-team): Please triage this failure.
-Language/11_Expressions/26_Multiplicative_Expressions_A01_t15: Fail # TODO(analyzer-team): Please triage this failure.
-Language/11_Expressions/26_Multiplicative_Expressions_A01_t16: Fail # TODO(analyzer-team): Please triage this failure.
-Language/11_Expressions/26_Multiplicative_Expressions_A01_t17: Fail # TODO(analyzer-team): Please triage this failure.
-Language/11_Expressions/27_Unary_Expressions_A01_t04: Fail # TODO(analyzer-team): Please triage this failure.
-Language/11_Expressions/27_Unary_Expressions_A01_t05: Fail # TODO(analyzer-team): Please triage this failure.
-Language/11_Expressions/27_Unary_Expressions_A01_t17: Fail # TODO(analyzer-team): Please triage this failure.
-Language/11_Expressions/27_Unary_Expressions_A01_t18: Fail # TODO(analyzer-team): Please triage this failure.
-Language/11_Expressions/27_Unary_Expressions_A01_t19: Fail # TODO(analyzer-team): Please triage this failure.
-Language/11_Expressions/27_Unary_Expressions_A01_t20: Fail # TODO(analyzer-team): Please triage this failure.
-Language/11_Expressions/27_Unary_Expressions_A01_t21: Fail # TODO(analyzer-team): Please triage this failure.
-Language/11_Expressions/27_Unary_Expressions_A01_t22: Fail # TODO(analyzer-team): Please triage this failure.
-Language/11_Expressions/28_Postfix_Expressions_A01_t02: Fail # TODO(analyzer-team): Please triage this failure.
-Language/11_Expressions/28_Postfix_Expressions_A01_t05: Fail # TODO(analyzer-team): Please triage this failure.
-Language/11_Expressions/29_Assignable_Expressions_A01_t08: Fail # TODO(analyzer-team): Please triage this failure.
-Language/11_Expressions/29_Assignable_Expressions_A01_t09: Fail # TODO(analyzer-team): Please triage this failure.
-Language/11_Expressions/30_Identifier_Reference_A05_t04: Fail # TODO(analyzer-team): Please triage this failure.
-Language/11_Expressions/30_Identifier_Reference_A06_t02: Fail # TODO(analyzer-team): Please triage this failure.
-Language/11_Expressions/30_Identifier_Reference_A07_t01: Fail # TODO(analyzer-team): Please triage this failure.
 Language/11_Expressions/30_Identifier_Reference_A13_t01: Fail # TODO(analyzer-team): Please triage this failure.
 Language/11_Expressions/31_Type_Test_A01_t02: Fail # TODO(analyzer-team): Please triage this failure.
 Language/11_Expressions/31_Type_Test_A01_t04: Fail # TODO(analyzer-team): Please triage this failure.
@@ -90,38 +58,52 @@
 Language/12_Statements/06_For_A01_t11: Fail # TODO(analyzer-team): Please triage this failure.
 Language/12_Statements/09_Switch_A02_t03: Fail # TODO(analyzer-team): Please triage this failure.
 Language/12_Statements/09_Switch_A06_t02: Fail # TODO(analyzer-team): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A01_t51: Fail # TODO(analyzer-team): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A01_t52: Fail # TODO(analyzer-team): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A02_t03: Fail # TODO(analyzer-team): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A02_t05: Fail # TODO(analyzer-team): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A02_t12: Fail # TODO(analyzer-team): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A02_t13: Fail # TODO(analyzer-team): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A02_t15: Fail # TODO(analyzer-team): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A02_t18: Fail # TODO(analyzer-team): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A02_t19: Fail # TODO(analyzer-team): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A02_t24: Fail # TODO(analyzer-team): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A03_t02: Fail # TODO(analyzer-team): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A03_t06: Fail # TODO(analyzer-team): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A03_t22: Fail # TODO(analyzer-team): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A03_t26: Fail # TODO(analyzer-team): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A03_t42: Fail # TODO(analyzer-team): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A03_t46: Fail # TODO(analyzer-team): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A03_t62: Fail # TODO(analyzer-team): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A03_t66: Fail # TODO(analyzer-team): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A05_t02: Fail # TODO(analyzer-team): Please triage this failure.
-Language/13_Libraries_and_Scripts/2_Exports_A01_t02: Fail # TODO(analyzer-team): Please triage this failure.
-Language/13_Libraries_and_Scripts/2_Exports_A01_t03: Fail # TODO(analyzer-team): Please triage this failure.
-Language/13_Libraries_and_Scripts/2_Exports_A01_t17: Fail # TODO(analyzer-team): Please triage this failure.
-Language/13_Libraries_and_Scripts/2_Exports_A03_t01: Fail # TODO(analyzer-team): Please triage this failure.
-Language/13_Libraries_and_Scripts/2_Exports_A03_t02: Fail # TODO(analyzer-team): Please triage this failure.
-Language/13_Libraries_and_Scripts/2_Exports_A04_t01: Fail # TODO(analyzer-team): Please triage this failure.
-Language/13_Libraries_and_Scripts/2_Exports_A04_t02: Fail # TODO(analyzer-team): Please triage this failure.
-Language/13_Libraries_and_Scripts/2_Exports_A04_t04: Fail # TODO(analyzer-team): Please triage this failure.
-Language/13_Libraries_and_Scripts/2_Exports_A04_t05: 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.
+Language/13_Libraries_and_Scripts/4_Scripts_A01_t21: Fail # TODO(analyzer-team): Please triage this failure.
+Language/13_Libraries_and_Scripts/4_Scripts_A01_t22: Fail # TODO(analyzer-team): Please triage this failure.
+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.
+
+# co19 issue 319
+Language/13_Libraries_and_Scripts/1_Imports_A01_t51: Fail, OK
+Language/13_Libraries_and_Scripts/1_Imports_A01_t52: Fail, OK
+Language/13_Libraries_and_Scripts/2_Exports_A01_t02: Fail, OK
+Language/13_Libraries_and_Scripts/2_Exports_A01_t03: Fail, OK
+
+# co19 issue 320
+Language/13_Libraries_and_Scripts/1_Imports_A02_t03: Fail, OK
+Language/13_Libraries_and_Scripts/1_Imports_A02_t05: Fail, OK
+Language/13_Libraries_and_Scripts/1_Imports_A02_t12: Fail, OK
+Language/13_Libraries_and_Scripts/1_Imports_A02_t13: Fail, OK
+Language/13_Libraries_and_Scripts/1_Imports_A02_t15: Fail, OK
+Language/13_Libraries_and_Scripts/1_Imports_A02_t18: Fail, OK
+Language/13_Libraries_and_Scripts/1_Imports_A02_t19: Fail, OK
+
+# issue 6822
+Language/13_Libraries_and_Scripts/1_Imports_A02_t24: Fail
+
+# issue 6823
+Language/13_Libraries_and_Scripts/1_Imports_A03_t06: Fail
+Language/13_Libraries_and_Scripts/1_Imports_A03_t26: Fail
+Language/13_Libraries_and_Scripts/1_Imports_A03_t46: Fail
+Language/13_Libraries_and_Scripts/1_Imports_A03_t66: Fail
+
+# co19 issue 324
+Language/13_Libraries_and_Scripts/2_Exports_A03_t01: Fail, OK
+Language/13_Libraries_and_Scripts/2_Exports_A03_t02: Fail, OK
+
+# issue 6824
+Language/13_Libraries_and_Scripts/2_Exports_A04_t02: Fail
+Language/13_Libraries_and_Scripts/2_Exports_A04_t05: Fail
+
+# issue 6825
+Language/13_Libraries_and_Scripts/2_Exports_A01_t17: Fail
+
+# wait for answer from Gilad
 Language/13_Libraries_and_Scripts/2_Exports_A04_t06: Fail # TODO(analyzer-team): Please triage this failure.
-Language/13_Libraries_and_Scripts/4_Scripts_A01_t16: Fail # TODO(analyzer-team): Please triage this failure.
-LibTest/core/Queue/Queue.from_A01_t02: Fail # TODO(analyzer-team): Please triage this failure.
-LibTest/core/Set/Set.from_A01_t02: Fail # TODO(analyzer-team): Please triage this failure.
 
 Language/03_Overview/2_Privacy_A01_t08: pass # http://dartbug.com/5179
 Language/03_Overview/2_Privacy_A01_t11: pass # http://dartbug.com/5179
@@ -160,216 +142,13 @@
 Language/11_Expressions/30_Identifier_Reference_A05_t06: pass # http://dartbug.com/5179
 Language/13_Libraries_and_Scripts/13_Libraries_and_Scripts_A05_t01: pass # http://dartbug.com/5179
 
-Language/07_Classes/3_Setters_A04_t03: Fail, OK # getter and method with the same name
-Language/07_Classes/3_Setters_A04_t06: Fail OK # getter and method with the same name
-
-# co19 issue 217
-Language/07_Classes/07_Classes_A07_t03: Fail, OK
-Language/07_Classes/07_Classes_A07_t06: Fail, OK
-
 # co19 issue 298
-Language/03_Overview/1_Scoping_A03_t02: Fail, OK
-Language/03_Overview/2_Privacy_A01_t01: Fail, OK
-Language/03_Overview/2_Privacy_A01_t02: Fail, OK
-Language/03_Overview/2_Privacy_A01_t06: Fail, OK
 Language/03_Overview/2_Privacy_A01_t07: Fail, OK
-Language/03_Overview/2_Privacy_A01_t12: Fail, OK
-Language/03_Overview/2_Privacy_A01_t16: Fail, OK
-Language/07_Classes/07_Classes_A02_t01: Fail, OK
-Language/07_Classes/07_Classes_A03_t01: Fail, OK
-Language/07_Classes/07_Classes_A02_t34: Fail, OK
-Language/07_Classes/07_Classes_A03_t04: Fail, OK
-Language/07_Classes/07_Classes_A03_t10: Fail, OK
-Language/07_Classes/07_Classes_A07_t10: Fail, OK
-Language/07_Classes/1_Instance_Methods_A05_t02: Fail, OK
-Language/07_Classes/9_Superclasses/1_Inheritance_and_Overriding_A02_t04: Fail, OK
-Language/08_Interfaces/5_Superinterfaces/1_Inheritance_and_Overriding_A01_t01: Fail, OK
-Language/08_Interfaces/5_Superinterfaces/1_Inheritance_and_Overriding_A02_t05: Fail, OK
-Language/11_Expressions/15_Method_Invocation/2_Cascaded_Invocation_A01_t01: Fail, OK
-Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A03_t07: Fail, OK
-Language/11_Expressions/16_Getter_Lookup_A02_t04: Fail, OK
-Language/11_Expressions/18_Assignment_A04_t05: Fail, OK
-Language/11_Expressions/23_Relational_Expressions_A01_t01: Fail, OK
-Language/11_Expressions/24_Shift_A01_t01: Fail, OK
-Language/11_Expressions/30_Identifier_Reference_A12_t01: Fail, OK
-Language/13_Libraries_and_Scripts/13_Libraries_and_Scripts_A01_t01: Fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A02_t02: Fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A02_t01: Fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A02_t04: Fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A02_t06: Fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A02_t11: Fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A02_t14: Fail, OK
 Language/13_Libraries_and_Scripts/1_Imports_A02_t16: Fail, OK
 Language/13_Libraries_and_Scripts/1_Imports_A02_t17: Fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A02_t20: Fail, OK
-Language/13_Libraries_and_Scripts/3_Parts_A02_t04: Fail, OK
-
-
-# co19 issue 218
-Language/10_Expressions/28_Identifier_Reference_A08_t38: Fail, OK
-
-# co19 issue 270
-Language/13_Libraries_and_Scripts/3_Includes_A01_t14: Fail, OK
-Language/13_Libraries_and_Scripts/3_Includes_A02_t03: Fail, OK
-Language/13_Libraries_and_Scripts/3_Includes_A02_t04: Fail, OK
-Language/13_Libraries_and_Scripts/4_Scripts_A01_t16: Fail, OK
-
-# co19 issue 303
-Language/05_Variables/05_Variables_A07_t09: Fail, OK
-Language/05_Variables/05_Variables_A08_t03: Fail, OK
-Language/05_Variables/05_Variables_A12_t06: Fail, OK
-Language/07_Classes/6_Constructors/1_Generative_Constructors_A17_t01: Fail, OK
-Language/07_Classes/6_Constructors/1_Generative_Constructors_A17_t02: Fail, OK
-Language/07_Classes/6_Constructors/1_Generative_Constructors_A17_t03: Fail, OK
-Language/07_Classes/6_Constructors/1_Generative_Constructors_A17_t04: Fail, OK
-Language/07_Classes/6_Constructors/1_Generative_Constructors_A18_t03: Fail, OK
-Language/07_Classes/6_Constructors/2_Factories_A01_t01: Fail, OK
-Language/07_Classes/6_Constructors/2_Factories_A06_t01: Fail, OK
-Language/07_Classes/6_Constructors/2_Factories_A06_t02: Fail, OK
-Language/07_Classes/6_Constructors/2_Factories_A06_t03: Fail, OK
-Language/07_Classes/6_Constructors/2_Factories_A06_t04: Fail, OK
-Language/07_Classes/9_Superclasses/1_Inheritance_and_Overriding_A01_t06: Fail, OK
-Language/09_Generics/09_Generics_A03_t01: Fail, OK
-Language/09_Generics/09_Generics_A04_t06: Fail, OK
-Language/11_Expressions/04_Booleans/1_Boolean_Conversion_A01_t02: Fail, OK
-Language/11_Expressions/04_Booleans/1_Boolean_Conversion_A01_t01: Fail, OK
-Language/11_Expressions/05_Strings/1_String_Interpolation_A01_t01: Fail, OK
-Language/11_Expressions/05_Strings_A18_t02: Fail, OK
-Language/11_Expressions/05_Strings_A18_t03: Fail, OK
-Language/11_Expressions/05_Strings_A18_t04: Fail, OK
-Language/11_Expressions/05_Strings_A18_t06: Fail, OK
-Language/11_Expressions/05_Strings_A18_t07: Fail, OK
-Language/11_Expressions/05_Strings_A18_t05: Fail, OK
-Language/11_Expressions/05_Strings_A18_t08: Fail, OK
-Language/11_Expressions/05_Strings_A18_t09: Fail, OK
-Language/11_Expressions/06_Lists_A09_t01: Fail, OK
-Language/11_Expressions/06_Lists_A09_t02: Fail, OK
-Language/11_Expressions/06_Lists_A09_t03: Fail, OK
-Language/11_Expressions/06_Lists_A09_t04: Fail, OK
-Language/11_Expressions/06_Lists_A09_t05: Fail, OK
-Language/11_Expressions/07_Maps_A10_t02: Fail, OK
-Language/11_Expressions/07_Maps_A10_t03: Fail, OK
-Language/11_Expressions/07_Maps_A10_t05: Fail, OK
-Language/11_Expressions/07_Maps_A10_t04: Fail, OK
-Language/11_Expressions/09_Function_Expressions_A03_t03: Fail, OK
-Language/11_Expressions/09_Function_Expressions_A03_t04: Fail, OK
-Language/11_Expressions/09_Function_Expressions_A04_t03: Fail, OK
-Language/11_Expressions/09_Function_Expressions_A04_t04: Fail, OK
-Language/11_Expressions/09_Function_Expressions_A05_t02: Fail, OK
-Language/11_Expressions/09_Function_Expressions_A05_t03: Fail, OK
-Language/11_Expressions/09_Function_Expressions_A05_t04: Fail, OK
-Language/11_Expressions/09_Function_Expressions_A05_t05: Fail, OK
-Language/11_Expressions/09_Function_Expressions_A06_t02: Fail, OK
-Language/11_Expressions/09_Function_Expressions_A06_t03: Fail, OK
-Language/11_Expressions/09_Function_Expressions_A06_t04: Fail, OK
-Language/11_Expressions/09_Function_Expressions_A06_t05: Fail, OK
-Language/11_Expressions/14_Function_Invocation/2_Binding_Actuals_to_Formals_A02_t01: Fail, OK
-Language/11_Expressions/14_Function_Invocation/2_Binding_Actuals_to_Formals_A03_t01: Fail, OK
-Language/11_Expressions/14_Function_Invocation/2_Binding_Actuals_to_Formals_A05_t01: Fail, OK
-Language/11_Expressions/14_Function_Invocation/2_Binding_Actuals_to_Formals_A05_t02: Fail, OK
-Language/11_Expressions/14_Function_Invocation/2_Binding_Actuals_to_Formals_A05_t03: Fail, OK
-Language/11_Expressions/14_Function_Invocation/2_Binding_Actuals_to_Formals_A05_t04: Fail, OK
-Language/11_Expressions/14_Function_Invocation/2_Binding_Actuals_to_Formals_A08_t01: Fail, OK
-Language/11_Expressions/14_Function_Invocation/2_Binding_Actuals_to_Formals_A08_t02: Fail, OK
-Language/11_Expressions/14_Function_Invocation/2_Binding_Actuals_to_Formals_A08_t04: Fail, OK
-Language/11_Expressions/14_Function_Invocation/2_Binding_Actuals_to_Formals_A08_t03: Fail, OK
-Language/11_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t02: Fail, OK
-Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A06_t02: Fail, OK
-Language/11_Expressions/18_Assignment_A02_t01: Fail, OK
-Language/11_Expressions/18_Assignment_A03_t01: Fail, OK
-Language/11_Expressions/18_Assignment_A04_t06: Fail, OK
-Language/11_Expressions/18_Assignment_A04_t07: Fail, OK
-Language/11_Expressions/18_Assignment_A06_t01: Fail, OK
-Language/11_Expressions/19_Conditional_A02_t03: Fail, OK
-Language/11_Expressions/19_Conditional_A02_t04: Fail, OK
-Language/11_Expressions/20_Logical_Boolean_Expressions_A03_t01: Fail, OK
-Language/11_Expressions/22_Equality_A10_t02: Fail, OK
-Language/11_Expressions/27_Unary_Expressions_A02_t03: Fail, OK
-Language/11_Expressions/30_Identifier_Reference_A03_t01: Fail, OK
-Language/11_Expressions/30_Identifier_Reference_A10_t02: Fail, OK
-Language/12_Statements/03_Variable_Declaration_A01_t01: Fail, OK
-Language/12_Statements/03_Variable_Declaration_A01_t02: Fail, OK
-Language/12_Statements/05_If_A05_t01: Fail, OK
-Language/12_Statements/05_If_A05_t02: Fail, OK
-Language/12_Statements/06_For/1_For_Loop_A01_t07: Fail, OK
-Language/12_Statements/06_For/1_For_Loop_A01_t08: Fail, OK
-Language/12_Statements/07_While_A02_t02: Fail, OK
-Language/12_Statements/07_While_A03_t01: Fail, OK
-Language/12_Statements/07_While_A03_t02: Fail, OK
-Language/12_Statements/07_While_A03_t03: Fail, OK
-Language/12_Statements/08_Do_A02_t03: Fail, OK
-Language/12_Statements/15_Assert_A02_t01: Fail, OK
-Language/12_Statements/15_Assert_A03_t01: Fail, OK
-Language/12_Statements/15_Assert_A03_t02: Fail, OK
-Language/12_Statements/15_Assert_A03_t04: Fail, OK
-Language/12_Statements/15_Assert_A03_t03: Fail, OK
-Language/12_Statements/15_Assert_A03_t05: Fail, OK
-Language/12_Statements/15_Assert_A03_t08: Fail, OK
-Language/12_Statements/15_Assert_A03_t06: Fail, OK
-Language/12_Statements/15_Assert_A03_t09: Fail, OK
-Language/13_Libraries_and_Scripts/4_Scripts_A01_t17: Fail, OK
-Language/13_Libraries_and_Scripts/4_Scripts_A03_t01: Fail, OK
-Language/13_Libraries_and_Scripts/4_Scripts_A03_t02: Fail, OK
-Language/14_Types/1_Static_Types_A02_t09: Fail, OK
-Language/14_Types/2_Dynamic_Type_System_A01_t01: Fail, OK
-Language/14_Types/4_Interface_Types_A08_t03: Fail, OK
-Language/14_Types/8_Parameterized_Types_A02_t01: Fail, OK
-LibTest/core/AssertionError/column_A01_t02: Fail, OK
-LibTest/core/AssertionError/failedAssertion_A01_t01: Fail, OK
-LibTest/core/AssertionError/line_A01_t02: Fail, OK
-LibTest/core/AssertionError/toString_A01_t01: Fail, OK
-LibTest/core/AssertionError/url_A01_t01: Fail, OK
-LibTest/core/double/ceil_A01_t01: Fail, OK
-LibTest/core/double/ceil_A01_t03: Fail, OK
-LibTest/core/double/ceil_A01_t06: Fail, OK
-LibTest/core/double/floor_A01_t01: Fail, OK
-LibTest/core/double/floor_A01_t03: Fail, OK
-LibTest/core/double/floor_A01_t06: Fail, OK
-LibTest/core/double/operator_remainder_A01_t01: Fail, OK
-LibTest/core/double/round_A01_t05: Fail, OK
-LibTest/core/double/toDouble_A01_t03: Fail, OK
-LibTest/core/double/toInt_A01_t05: Fail, OK
-LibTest/core/double/truncate_A01_t05: Fail, OK
-LibTest/core/Future/chain_A02_t05: Fail, OK
-LibTest/core/Future/transform_A02_t04: Fail, OK
-LibTest/core/int/operator_addition_A01_t01: Fail, OK
-LibTest/core/int/operator_division_A01_t01: Fail, OK
-LibTest/core/int/operator_GE_A01_t01: Fail, OK
-LibTest/core/int/operator_GT_A01_t01: Fail, OK
-LibTest/core/int/operator_LE_A01_t01: Fail, OK
-LibTest/core/int/operator_LT_A01_t01: Fail, OK
-LibTest/core/int/operator_remainder_A01_t02: Fail, OK
-LibTest/core/int/operator_subtraction_A01_t01: Fail, OK
-LibTest/core/int/remainder_A01_t02: Fail, OK
-LibTest/core/int/toDouble_A01_t01: Fail, OK
-LibTest/core/List/addAll_A04_t01: Fail, OK
-LibTest/core/List/every_A01_t01: Fail, OK
-LibTest/core/List/forEach_A01_t02: Fail, OK
-LibTest/core/List/getRange_A06_t01: Fail, OK
-LibTest/core/List/indexOf_A06_t01: Fail, OK
-LibTest/core/List/insertRange_A08_t01: Fail, OK
-LibTest/core/List/length_A07_t01: Fail, OK
-LibTest/core/List/List.from_A03_t02: Fail, OK
-LibTest/core/List/List_A04_t01: Fail, OK
-LibTest/core/List/operator_subscript_A03_t01: Fail, OK
-LibTest/core/List/operator_subscripted_assignment_A03_t01: Fail, OK
-LibTest/core/List/setRange_A05_t01: Fail, OK
-LibTest/core/TypeError/dstName_A01_t01: Fail, OK
-LibTest/core/TypeError/column_A01_t01: Fail, OK
-LibTest/core/TypeError/failedAssertion_A01_t01: Fail, OK
-LibTest/core/TypeError/dstType_A01_t01: Fail, OK
-LibTest/core/TypeError/line_A01_t01: Fail, OK
-LibTest/core/TypeError/srcType_A01_t01: Fail, OK
-LibTest/core/TypeError/toString_A01_t01: Fail, OK
-LibTest/core/TypeError/url_A01_t01: Fail, OK
 
 Language/07_Classes/6_Constructors/2_Factories_A03_t01: Fail, OK # co19 issue 307
 
-LibTest/core/RegExp/RegExp_A01_t04: Fail, OK # co19 issue 314
-LibTest/core/String/contains_A01_t01: Fail, OK # co19 issue 314
-LibTest/core/String/contains_A01_t03: Fail, OK # co19 issue 314
-
-Language/10_Expressions/30_Type_Cast_A01_t04: Fail, OK # the expected error is not specified
 Language/13_Libraries_and_Scripts/13_Libraries_and_Scripts_A05_t03: Fail, OK # contains syntax error
 Language/13_Libraries_and_Scripts/13_Libraries_and_Scripts_A05_t04: Fail, OK # contains syntax error
 Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A03_t02: Fail, OK # deprecated parameter syntax
@@ -382,10 +161,6 @@
 Language/11_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A05_t02: Fail, OK # co19 issue 195
 Language/13_Libraries_and_Scripts/13_Libraries_and_Scripts_A05_t01: Fail, OK # co19 issue 195
 
-# Rename "BadNumberFormatException" to "FormatException"
-# TODO(rnystrom): These can be enabled when
-# http://code.google.com/p/co19/issues/detail?id=167 is fixed.
-
 Language/03_Overview/1_Scoping_A02_t28: Fail # language change 1031
 Language/07_Classes/6_Constructors/1_Generative_Constructors_A15_t07: Fail # Issue 3323
 Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t01: Fail # Issue 2477
@@ -395,21 +170,10 @@
 Language/11_Expressions/01_Constants_A16_t02: Fail # Issue 1473
 Language/11_Expressions/01_Constants_A16_t03: Fail # Issue 1473
 Language/11_Expressions/01_Constants_A17_t03: Fail # Issue 1473
-Language/11_Expressions/05_Strings/1_String_Interpolation_A01_t05: Fail # language change 3368
 Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t03: Fail # Issue 3524
-Language/11_Expressions/19_Conditional_A01_t12: Fail # language change 3368
-Language/11_Expressions/19_Conditional_A01_t13: Fail # language change 3368
-Language/11_Expressions/20_Logical_Boolean_Expressions_A01_t12: Fail # language change 3368
-Language/11_Expressions/20_Logical_Boolean_Expressions_A01_t13: Fail # language change 3368
-Language/11_Expressions/21_Bitwise_Expressions_A01_t14: Fail # language change 3368
-Language/11_Expressions/21_Bitwise_Expressions_A01_t15: Fail # language change 3368
 Language/11_Expressions/22_Equality_A01_t19: Fail # language change 3368
 Language/11_Expressions/22_Equality_A01_t20: Fail # language change 3368
 Language/11_Expressions/22_Equality_A02_t03: Fail, OK # co19 issue 169
-Language/11_Expressions/23_Relational_Expressions_A01_t20: Fail # language change 3368
-Language/11_Expressions/23_Relational_Expressions_A01_t21: Fail # language change 3368
-Language/11_Expressions/24_Shift_A01_t11: Fail # language change 3368
-Language/11_Expressions/24_Shift_A01_t12: Fail # language change 3368
 
 # The following tests use hashCode() (function) instead of hashCode (getter).
 # co19 issue 273
@@ -417,13 +181,6 @@
 LibTest/core/String/hashCode_A01_t01: Pass, OK
 LibTest/core/int/hashCode_A01_t01: Pass, OK
 
-LibTest/core/List/iterator_next_A02_t01: Fail, OK # co19 issue 288
-LibTest/core/Queue/removeFirst_A02_t01: Fail, OK # co19 issue 288
-LibTest/core/Queue/last_A02_t01: Fail, OK # co19 issue 288
-LibTest/core/Queue/removeLast_A02_t01: Fail, OK # co19 issue 288
-LibTest/core/Queue/first_A02_t01: Fail, OK # co19 issue 288
-LibTest/core/Queue/iterator_next_A02_t01: Fail, OK # co19 issue 288
-
 Language/06_Functions/3_Type_of_a_Function_A01_t01: Fail, OK
 Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t07: Fail, OK
 Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A03_t02: Fail, OK
@@ -439,23 +196,14 @@
 Language/11_Expressions/15_Method_Invocation/2_Cascaded_Invocation_A02_t02: Fail, OK
 Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t03: Fail, OK
 Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A02_t04: Fail, OK
-Language/11_Expressions/21_Bitwise_Expressions_A01_t15: Fail, OK
-Language/11_Expressions/19_Conditional_A01_t13: Fail, OK
-Language/11_Expressions/20_Logical_Boolean_Expressions_A01_t12: Fail, OK
-Language/11_Expressions/21_Bitwise_Expressions_A01_t14: Fail, OK
-Language/11_Expressions/23_Relational_Expressions_A01_t21: Fail, OK
 Language/11_Expressions/22_Equality_A01_t19: Fail, OK
 Language/11_Expressions/01_Constants_A17_t03: Fail, OK
 Language/11_Expressions/05_Strings/1_String_Interpolation_A04_t02: Fail, OK
 Language/11_Expressions/05_Strings/1_String_Interpolation_A03_t02: Fail, OK
-Language/11_Expressions/05_Strings/1_String_Interpolation_A01_t05: Fail, OK
-Language/11_Expressions/24_Shift_A01_t11: Fail, OK
-Language/11_Expressions/20_Logical_Boolean_Expressions_A01_t13: Fail, OK
 Language/11_Expressions/22_Equality_A01_t20: Fail, OK
 Language/11_Expressions/30_Identifier_Reference_A04_t07: Fail, OK
 Language/11_Expressions/30_Identifier_Reference_A04_t05: Fail, OK
 Language/11_Expressions/01_Constants_A16_t02: Fail, OK
-Language/11_Expressions/23_Relational_Expressions_A01_t20: Fail, OK
 Language/11_Expressions/30_Identifier_Reference_A05_t06: Fail, OK
 Language/11_Expressions/01_Constants_A15_t16: Fail, OK
 Language/11_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t04: Fail, OK
@@ -464,10 +212,8 @@
 Language/11_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A03_t01: Fail, OK
 Language/11_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A02_t01: Fail, OK
 Language/11_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t05: Fail, OK
-Language/11_Expressions/19_Conditional_A01_t12: Fail, OK
 Language/11_Expressions/01_Constants_A16_t03: Fail, OK
 Language/11_Expressions/01_Constants_A16_t01: Fail, OK
-Language/11_Expressions/24_Shift_A01_t12: Fail, OK
 Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t02: Fail, OK
 Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t03: Fail, OK
 Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t01: Fail, OK
@@ -476,27 +222,5 @@
 Language/03_Overview/2_Privacy_A01_t18: Fail, OK
 Language/03_Overview/2_Privacy_A01_t08: Fail, OK
 
-LibTest/core/List/getRange_A04_t01: Fail, OK # co19 issue 290
-LibTest/core/List/insertRange_A06_t01: Fail, OK # co19 issue 290
-LibTest/core/List/last_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/List/length_A05_t01: Fail, OK # co19 issue 290
-LibTest/core/List/List_A01_t01: Fail, OK # co19 issue 290
-LibTest/core/List/operator_subscript_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/List/operator_subscripted_assignment_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/List/removeLast_A01_t02: Fail, OK # co19 issue 290
-LibTest/core/List/removeRange_A05_t01: Fail, OK # co19 issue 290
-LibTest/core/List/setRange_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/List/setRange_A02_t02: Fail, OK # co19 issue 290
-LibTest/core/List/setRange_A03_t01: Fail, OK # co19 issue 290
-LibTest/core/List/setRange_A03_t02: Fail, OK # co19 issue 290
-LibTest/core/Match/group_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/Match/groups_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/Match/operator_subscript_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/String/charCodeAt_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/String/contains_A01_t02: Fail, OK # co19 issue 290
-LibTest/core/String/operator_subscript_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/String/substring_A02_t01: Fail, OK # co19 issue 290
-
-
 [ $runtime == drt && ($compiler == none || $compiler == frog) ]
 *: Skip
diff --git a/tests/co19/co19-dart2dart.status b/tests/co19/co19-dart2dart.status
index 8d33d10..1614758 100644
--- a/tests/co19/co19-dart2dart.status
+++ b/tests/co19/co19-dart2dart.status
@@ -3,11 +3,6 @@
 # BSD-style license that can be found in the LICENSE file.
 
 [ $compiler == dart2dart ]
-# Factory redirection:
-Language/07_Classes/07_Classes_A03_t01: Fail, Pass # http://dartbug.com/6634 Passes in conservative renaming mode.
-Language/11_Expressions/11_Instance_Creation/1_New_A12_t02: Fail, Pass # http://dartbug.com/6634 Passes in conservative renaming mode.
-Language/11_Expressions/11_Instance_Creation/1_New_A12_t01: Fail, Pass # http://dartbug.com/6634 Passes in conservative renaming mode.
-
 # Calling unresolved class constructor:
 Language/03_Overview/2_Privacy_A01_t19: Fail
 Language/03_Overview/2_Privacy_A01_t20: Fail
@@ -16,10 +11,6 @@
 Language/11_Expressions/11_Instance_Creation/1_New_A06_t05: Fail
 Language/11_Expressions/11_Instance_Creation/1_New_A06_t06: Fail
 
-# Renaming type from platform library:
-Language/09_Generics/09_Generics_A02_t01: Fail # http://dartbug.com/6633
-Language/14_Types/4_Interface_Types_A10_t03: Fail # http://dartbug.com/6633
-
 Language/03_Overview/1_Scoping_A01_t39: Fail # http://dartbug.com/5519
 Language/03_Overview/1_Scoping_A01_t40: Fail # http://dartbug.com/5519
 Language/03_Overview/1_Scoping_A01_t41: Fail # http://dartbug.com/5519
@@ -28,7 +19,6 @@
 Language/03_Overview/1_Scoping_A02_t07: Fail # inherited from dart2js
 Language/03_Overview/1_Scoping_A02_t12: Fail # inherited from dart2js
 Language/03_Overview/2_Privacy_A01_t06: Fail # New import syntax
-Language/03_Overview/2_Privacy_A01_t14: Fail # inherited from dart2js
 Language/05_Variables/05_Variables_A01_t04: Fail # http://dartbug.com/5519
 Language/05_Variables/05_Variables_A01_t05: Fail # http://dartbug.com/5519
 Language/05_Variables/05_Variables_A01_t08: Fail # http://dartbug.com/5519
@@ -80,7 +70,6 @@
 Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A01_t06: Fail # http://dartbug.com/5519
 Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A01_t07: Fail # http://dartbug.com/5519
 Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A01_t10: Fail # http://dartbug.com/5519
-Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A01_t11: Fail # http://dartbug.com/5519
 Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A01_t14: Fail # http://dartbug.com/5519
 Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A01_t15: Fail # http://dartbug.com/5519
 Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A02_t01: Fail # http://dartbug.com/5519
@@ -96,7 +85,6 @@
 Language/06_Functions/2_Formal_Parameters_A03_t05: Fail # http://dartbug.com/5519
 Language/06_Functions/2_Formal_Parameters_A03_t06: Fail # http://dartbug.com/5519
 Language/06_Functions/4_External_Functions_A01_t01: Fail # inherited from VM
-Language/07_Classes/6_Constructors/2_Factories_A01_t05: Fail # Inherited from dartjs
 Language/07_Classes/07_Classes_A02_t02: Fail # http://dartbug.com/5519
 Language/07_Classes/07_Classes_A02_t04: Fail # http://dartbug.com/5519
 Language/07_Classes/07_Classes_A02_t11: Fail # http://dartbug.com/5519
@@ -104,13 +92,13 @@
 Language/07_Classes/07_Classes_A03_t07: Fail # inherited from dart2js
 Language/07_Classes/07_Classes_A03_t08: Fail # inherited from dart2js
 Language/07_Classes/07_Classes_A03_t09: Fail # inherited from dart2js
+Language/07_Classes/07_Classes_A03_t10: Fail # http://dartbug.com/6687
 Language/07_Classes/07_Classes_A04_t19: Fail # inherited from dart2js
 Language/07_Classes/07_Classes_A04_t21: Fail # inherited from dart2js
 Language/07_Classes/07_Classes_A04_t22: Fail # inherited from dart2js
 Language/07_Classes/07_Classes_A04_t24: Fail # inherited from dart2js
 Language/07_Classes/07_Classes_A04_t25: Fail # inherited from dart2js
 Language/07_Classes/10_Superinterfaces_A04_t01: Fail # http://dartbug.com/5519
-Language/07_Classes/1_Instance_Methods/2_Operators_A02_t01: Fail # inherited from VM
 Language/07_Classes/1_Instance_Methods/2_Operators_A03_t01: Fail # inherited from dart2js
 Language/07_Classes/1_Instance_Methods/2_Operators_A03_t02: Fail # inherited from dart2js
 Language/07_Classes/1_Instance_Methods/2_Operators_A04_t02: Fail # inherited from dart2js
@@ -136,10 +124,11 @@
 Language/07_Classes/1_Instance_Methods/2_Operators_A07_t02: Fail # http://dartbug.com/5519
 Language/07_Classes/1_Instance_Methods/2_Operators_A07_t03: Fail # inherited from dart2js
 Language/07_Classes/1_Instance_Methods/2_Operators_A07_t04: Fail # http://dartbug.com/5519
-Language/07_Classes/1_Instance_Methods_A02_t01: Fail # http://dartbug.com/5519
 Language/07_Classes/1_Instance_Methods_A02_t02: Fail # http://dartbug.com/5519
 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
@@ -160,7 +149,6 @@
 Language/07_Classes/3_Setters_A04_t05: Fail # inherited from VM
 Language/07_Classes/3_Setters_A04_t06: Fail # inherited from VM
 Language/07_Classes/3_Setters_A04_t07: Fail # inherited from VM
-Language/07_Classes/3_Setters_A04_t08: Fail # inherited from VM
 Language/07_Classes/4_Abstract_Instance_Members_A04_t01: Fail # http://dartbug.com/5519
 Language/07_Classes/4_Abstract_Instance_Members_A04_t05: Fail # inherited from VM
 Language/07_Classes/4_Abstract_Instance_Members_A04_t06: Fail # inherited from VM
@@ -169,6 +157,7 @@
 Language/07_Classes/6_Constructors/1_Generative_Constructors_A15_t07: Fail # inherited from VM
 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
@@ -185,6 +174,11 @@
 Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t02: Fail # inherited from VM
 Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t03: Fail # inherited from VM
 Language/07_Classes/6_Constructors_A01_t01: Fail # inherited from VM
+Language/07_Classes/6_Constructors_A01_t02: Fail # Inherited from dart2js
+Language/07_Classes/6_Constructors_A01_t03: Fail # Inherited from dart2js
+Language/07_Classes/6_Constructors_A01_t04: Fail # Inherited from dart2js
+Language/07_Classes/6_Constructors_A01_t05: Fail # Inherited from dart2js
+Language/07_Classes/6_Constructors_A01_t06: Fail # Inherited from dart2js
 Language/07_Classes/6_Constructors_A02_t01: Fail # http://dartbug.com/5519
 Language/11_Expressions/01_Constants_A03_t01: Fail # Inherited from dart2js
 Language/11_Expressions/01_Constants_A03_t02: Fail # http://dartbug.com/5519
@@ -211,6 +205,7 @@
 Language/11_Expressions/01_Constants_A13_t05: Fail # http://dartbug.com/5519
 Language/11_Expressions/01_Constants_A14_t01: Fail # inherited from VM
 Language/11_Expressions/01_Constants_A14_t01: Fail # inherited from dart2js
+Language/11_Expressions/01_Constants_A14_t02: Fail # http://dartbug.com/5810
 Language/11_Expressions/01_Constants_A15_t06: Fail # http://dartbug.com/5519
 Language/11_Expressions/01_Constants_A15_t07: Fail # http://dartbug.com/5519
 Language/11_Expressions/01_Constants_A15_t08: Fail # http://dartbug.com/5519
@@ -235,13 +230,13 @@
 Language/11_Expressions/01_Constants_A17_t02: Fail # http://dartbug.com/5519
 Language/11_Expressions/01_Constants_A17_t03: Crash # inherited from VM
 Language/11_Expressions/01_Constants_A17_t03: Fail # http://dartbug.com/5519
+Language/11_Expressions/01_Constants_A19_t02: Fail # http://dartbug.com/5810
+Language/11_Expressions/01_Constants_A19_t03: Fail # http://dartbug.com/5810
 Language/11_Expressions/01_Constants_A19_t04: Fail # http://dartbug.com/5519
-Language/11_Expressions/01_Constants_A20_t01: Fail # http://dartbug.com/5810
 Language/11_Expressions/01_Constants_A20_t02: Fail # http://dartbug.com/5810
+Language/11_Expressions/01_Constants_A20_t03: Fail # http://dartbug.com/5810
 Language/11_Expressions/05_Strings/1_String_Interpolation_A01_t06: Fail # Inherited from dart2js
 Language/11_Expressions/05_Strings/1_String_Interpolation_A01_t09: Fail, OK # co19 issue 210
-Language/11_Expressions/05_Strings/1_String_Interpolation_A03_t02: Fail # inherited from VM
-Language/11_Expressions/05_Strings/1_String_Interpolation_A04_t02: Fail # inherited from VM
 Language/11_Expressions/05_Strings_A02_t01: Skip # co19 issue 90.
 Language/11_Expressions/05_Strings_A02_t46: Fail # inherited from VM
 Language/11_Expressions/05_Strings_A02_t48: Fail # inherited from VM
@@ -259,15 +254,16 @@
 Language/11_Expressions/11_Instance_Creation/1_New_A02_t05: Fail # inherited from dart2js
 Language/11_Expressions/11_Instance_Creation/1_New_A02_t06: Fail # inherited from dart2js
 Language/11_Expressions/11_Instance_Creation/1_New_A02_t07: Fail # inherited from dart2js
+Language/11_Expressions/11_Instance_Creation/1_New_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/1_New_A13_t04: Fail # Inherited from VM
-Language/11_Expressions/11_Instance_Creation/1_New_A14_t01: Fail # Inherited from dart2js
 Language/11_Expressions/11_Instance_Creation/2_Const_A01_t02: Fail # http://dartbug.com/5519
 Language/11_Expressions/11_Instance_Creation/2_Const_A06_t01: Fail # http://dartbug.com/5519
 Language/11_Expressions/11_Instance_Creation/2_Const_A06_t02: Fail # http://dartbug.com/5519
 Language/11_Expressions/11_Instance_Creation/2_Const_A10_t01: Fail # inherited from VM
 Language/11_Expressions/14_Function_Invocation/2_Binding_Actuals_to_Formals_A04_t01: Fail # http://dartbug.com/5519
-Language/11_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A03_t01: Fail # inherited from VM
 Language/11_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A05_t01: Fail # inherited from VM
 Language/11_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A05_t02: Fail # inherited from VM
 Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t02: Fail # inherited from VM
@@ -275,19 +271,10 @@
 Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A03_t03: Fail # inherited from VM
 Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A03_t04: Fail # http://dartbug.com/5519
 Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A03_t06: Fail # inherited from VM
-Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t02: Fail # inherited from VM
-Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t03: Fail # inherited from VM
 Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t08: Fail # inherited from VM
-Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A05_t01: Fail # inherited from VM
-Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A06_t02: Fail # inherited from VM
-Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A02_t04: Fail # co19 issue 251 or issue 5732
-Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A03_t02: Fail # co19 issue 251 or issue 5732
-Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A03_t03: Fail # co19 issue 251 or issue 5732
-Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A07_t01: Fail # co19 issue 251 or issue 5732
-Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A08_t02: Fail # co19 issue 251 or issue 5732
 Language/11_Expressions/17_Getter_Invocation_A02_t01: Fail # inherited from VM
 Language/11_Expressions/18_Assignment_A05_t02: Fail # inherited from VM
-Language/11_Expressions/18_Assignment_A05_t04: Fail # inherited from VM
+Language/11_Expressions/18_Assignment_A05_t04: Fail, Pass, OK # Fails in minified, depends on method names.
 Language/11_Expressions/18_Assignment_A05_t05: Fail # inherited from VM
 Language/11_Expressions/19_Conditional_A01_t14: Fail # Inherited from dart2js
 Language/11_Expressions/19_Conditional_A01_t15: Fail # Inherited from dart2js
@@ -330,7 +317,6 @@
 Language/11_Expressions/30_Identifier_Reference_A02_t01: Fail # Pseudo keyword "abstract".
 Language/11_Expressions/30_Identifier_Reference_A04_t09: Fail # Inherited from dart2js
 Language/11_Expressions/30_Identifier_Reference_A05_t01: Fail # Inherited from dart2js
-Language/11_Expressions/30_Identifier_Reference_A05_t04: Fail # Inherited from dart2js
 Language/11_Expressions/30_Identifier_Reference_A05_t12: Fail # Inherited from dart2js
 Language/11_Expressions/30_Identifier_Reference_A06_t01: Fail # Inherited from VM (error returning class name).
 Language/11_Expressions/30_Identifier_Reference_A06_t02: Fail # Inherited from VM (error returning typedef).
@@ -372,47 +358,51 @@
 Language/12_Statements/12_Labels_A03_t04: Fail # Inherited from dart2js
 Language/12_Statements/14_Continue_A02_t12: Fail # Inherited from dart2js
 Language/12_Statements/14_Continue_A02_t13: Fail # Inherited from dart2js
-Language/13_Libraries_and_Scripts/1_Imports_A02_t01: Fail # Inherited from dart2js
-Language/13_Libraries_and_Scripts/1_Imports_A02_t02: Fail # Inherited from dart2js
+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_t19: Fail # Inherited from VM (does not throw NSME).
 Language/13_Libraries_and_Scripts/1_Imports_A02_t28: Fail # Inherited from dart2js
-Language/13_Libraries_and_Scripts/1_Imports_A03_t02: Fail # Inherited from dart2js
-Language/13_Libraries_and_Scripts/1_Imports_A03_t22: Fail # Inherited from dart2js
-Language/13_Libraries_and_Scripts/1_Imports_A03_t42: Fail # Inherited from dart2js
-Language/13_Libraries_and_Scripts/1_Imports_A03_t62: Fail # Inherited from dart2js
-Language/13_Libraries_and_Scripts/2_Exports_A01_t07: Fail # Inherited from dart2js
-Language/13_Libraries_and_Scripts/2_Exports_A01_t15: Fail # Inherited from dart2js
-Language/13_Libraries_and_Scripts/2_Exports_A01_t16: Fail # Inherited from dart2js
-Language/13_Libraries_and_Scripts/2_Exports_A04_t04: 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_t16: 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
+Language/13_Libraries_and_Scripts/4_Scripts_A01_t23: Fail # Inherited from dart2js
 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
 Language/14_Types/2_Dynamic_Type_System_A02_t01: Fail # inherited from VM
 Language/14_Types/3_Type_Declarations/1_Typedef_A06_t01: Fail # http://dartbug.com/5519
 Language/14_Types/3_Type_Declarations/1_Typedef_A06_t02: Fail # http://dartbug.com/5519
 Language/14_Types/3_Type_Declarations/1_Typedef_A06_t03: Fail # http://dartbug.com/5519
 Language/14_Types/3_Type_Declarations/1_Typedef_A06_t04: Fail # http://dartbug.com/5519
+Language/14_Types/3_Type_Declarations/1_Typedef_A06_t05: Fail # Inherited from dart2js
 Language/14_Types/3_Type_Declarations/1_Typedef_A07_t01: Fail, Pass # inherited from dart2js: fails in minify, self-reference typedef check not performed
 Language/14_Types/3_Type_Declarations/1_Typedef_A07_t02: Fail, Pass # inherited from dart2js: fails in minify, self-reference typedef check not performed
 Language/14_Types/3_Type_Declarations/1_Typedef_A07_t03: Fail, Pass # inherited from dart2js: fails in minify, self-reference typedef check not performed
-Language/14_Types/5_Function_Types_A01_t05: Fail # inherited from dart2js
-Language/14_Types/5_Function_Types_A02_t01: Fail # inherited from VM
+Language/14_Types/3_Type_Declarations/1_Typedef_A07_t04: Fail # Inherited from dart2js
+Language/14_Types/5_Function_Types_A01_t03: Fail # Inherited from dart2js
+Language/14_Types/5_Function_Types_A06_t01: Fail # Inherited from dart2js
 Language/15_Reference/1_Lexical_Rules/1_Reserved_Words_A40_t04: Fail # inherited from dart2js
 Language/15_Reference/1_Lexical_Rules_A02_t06: Fail # inherited from dart2js
 LibTest/core/Date/Date.fromMillisecondsSinceEpoch_A03_t01: Fail # Inherited from dart2js
 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/EmptyQueueException/EmptyQueueException_A01_t01: Fail, OK # co19 issue 288
-LibTest/core/EmptyQueueException/toString_A01_t01: Fail, OK # co19 issue 288
+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/List/iterator_next_A02_t01: Fail, OK # co19 issue 288
 LibTest/core/Map/getKeys_A01_t01: Fail, OK # co19 issue 293
 LibTest/core/Map/getKeys_A01_t02: Fail, OK # co19 issue 293
 LibTest/core/Map/getValues_A01_t01: Fail, OK # co19 issue 293
@@ -420,22 +410,13 @@
 LibTest/core/Map/getValues_A01_t02: Fail, OK # co19 issue 293
 LibTest/core/Match/operator_subscript_A01_t01: Fail # inherited from VM
 LibTest/core/Match/operator_subscript_A01_t01: Fail, OK # co19 issue 294
-LibTest/core/NoMoreElementsException/NoMoreElementsException_A01_t01: Fail, OK # co19 issue 288
-LibTest/core/NoMoreElementsException/toString_A01_t01: Fail, OK # co19 issue 288
-LibTest/core/NoSuchMethodError/NoSuchMethodError_A01_t01: Fail, OK # co19 issue 300
-LibTest/core/NoSuchMethodError/toString_A01_t01: Fail, OK # co19 issue 300
-LibTest/core/Queue/Queue.from_A01_t02: Fail # Inherited from dart2js
-LibTest/core/Queue/first_A02_t01: Fail, OK # co19 issue 288
-LibTest/core/Queue/first_A02_t01: Fail, OK # co19 issue 291
-LibTest/core/Queue/iterator_next_A02_t01: Fail, OK # co19 issue 288
-LibTest/core/Queue/last_A02_t01: Fail, OK # co19 issue 288
-LibTest/core/Queue/last_A02_t01: Fail, OK # co19 issue 291
-LibTest/core/Queue/removeFirst_A02_t01: Fail, OK # co19 issue 288
-LibTest/core/Queue/removeLast_A02_t01: Fail, OK # co19 issue 288
 LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A02_t01: Fail # inherited from VM
 LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A02_t01: Fail, OK # co19 issue 294
+LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterClassEscape_A01_t01: Fail # Inherited from dart2js
+LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterClassEscape_A02_t01: Fail # Inherited from dart2js
 LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterClassEscape_A03_t01: Fail # inherited from VM
 LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterClassEscape_A04_t01: Fail # inherited from VM
+LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterClassEscape_A06_t01: Fail # Inherited from dart2js
 LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterEscape_A06_t02: Fail
 LibTest/core/RegExp/Pattern_semantics/firstMatch_DecimalEscape_A01_t02: Fail # inherited from VM
 LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t01: Fail # inherited from VM
@@ -444,22 +425,8 @@
 LibTest/core/RegExp/Pattern_semantics/firstMatch_Term_A03_t01: Fail # inherited from VM
 LibTest/core/RegExp/Pattern_semantics/firstMatch_Term_A03_t01: Fail, OK # co19 issue 294
 LibTest/core/RegExp/firstMatch_A01_t01: Fail, OK # co19 issue 294
-LibTest/core/Set/Set.from_A01_t02: Fail # Inherited from dart2js
-LibTest/core/Stopwatch/Stopwatch_A01_t01: Fail, OK # co19 issue 297
-LibTest/core/Stopwatch/elapsedInMs_A01_t01: Fail, OK # co19 issue 297
-LibTest/core/Stopwatch/elapsedInUs_A01_t01: Fail, OK # co19 issue 297
-LibTest/core/Stopwatch/elapsed_A01_t01: Fail, OK # co19 issue 297
-LibTest/core/Stopwatch/elapsed_A01_t02: Fail, OK # co19 issue 297
-LibTest/core/Stopwatch/elapsed_A01_t03: Fail, OK # co19 issue 297
-LibTest/core/Stopwatch/frequency_A01_t01: Fail, OK # co19 issue 297
-LibTest/core/Stopwatch/start_A01_t01: Fail, OK # co19 issue 297
-LibTest/core/Stopwatch/start_A01_t02: Fail, OK # co19 issue 297
-LibTest/core/Stopwatch/start_A01_t03: Fail, OK # co19 issue 297
-LibTest/core/Stopwatch/stop_A01_t01: Fail, OK # co19 issue 297
-LibTest/core/String/String_class_A02_t01: Fail, OK # co19 issue 284
-LibTest/core/String/charCodeAt_A01_t01: Fail, OK # co19 issue 284
-LibTest/core/String/charCodes_A01_t01: Fail, OK # co19 issue 284
 LibTest/core/String/contains_A01_t02: Fail # inherited from VM
+LibTest/core/double/parse_A02_t01: Fail # Inherited from VM.
 LibTest/core/double/toRadixString_A01_t01: Fail # inherited from VM
 LibTest/core/int/operator_left_shift_A01_t02: Fail, OK # co19 issue 129
 LibTest/core/int/toRadixString_A01_t01: Fail # inherited from VM
@@ -468,7 +435,6 @@
 LibTest/isolate/SendPort/send_A02_t03: Fail, 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
 LibTest/isolate/isolate_api/spawnUri_A01_t02: Fail, OK # Problems with the test: encoded file name
 LibTest/isolate/isolate_api/spawnUri_A01_t03: Fail, OK # Problems with the test: encoded file name
@@ -476,45 +442,12 @@
 LibTest/isolate/isolate_api/spawnUri_A01_t05: Fail, OK # Problems with the test: encoded file name
 LibTest/math/Random/nextDouble_A01_t01: Fail # Inherited from VM.
 LibTest/math/exp_A01_t01: Fail # Issue co19 - 44
-LibTest/math/parseDouble_A02_t01: Fail # Inherited from VM.
 LibTest/math/pow_A01_t01: Fail # Inherited from VM.
 LibTest/math/pow_A11_t01: Fail # Inherited from VM.
 LibTest/math/pow_A13_t01: Fail # Inherited from VM.
 LibTest/math/sin_A01_t01: Fail # Inherited from VM.
 LibTest/math/tan_A01_t01: Fail # Issue co19 - 44
 
-Language/07_Classes/07_Classes_A01_t20: Fail # http://dartbug.com/6687
-Language/07_Classes/07_Classes_A02_t34: Fail # http://dartbug.com/6687
-Language/07_Classes/07_Classes_A03_t10: Fail # http://dartbug.com/6687
-
-LibTest/core/RegExp/RegExp_A01_t04: Fail, OK # co19 issue 314
-LibTest/core/String/contains_A01_t01: Fail, OK # co19 issue 314
-LibTest/core/String/contains_A01_t03: Fail, OK # co19 issue 314
-
-LibTest/core/NotImplementedException/NotImplementedException_A01_t01: Fail, OK # co19 issue 315
-LibTest/core/NotImplementedException/toString_A01_t01: Fail, OK # co19 issue 315
-
-LibTest/core/IndexOutOfRangeException/IndexOutOfRangeException_A01_t01: Fail, OK # co19 issue 290
-LibTest/core/IndexOutOfRangeException/toString_A01_t01: Fail, OK # co19 issue 290
-LibTest/core/List/getRange_A04_t01: Fail, OK # co19 issue 290
-LibTest/core/List/insertRange_A06_t01: Fail, OK # co19 issue 290
-LibTest/core/List/last_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/List/length_A05_t01: Fail, OK # co19 issue 290
-LibTest/core/List/List_A01_t01: Fail, OK # co19 issue 290
-LibTest/core/List/operator_subscript_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/List/operator_subscripted_assignment_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/List/removeLast_A01_t02: Fail, OK # co19 issue 290
-LibTest/core/List/removeRange_A05_t01: Fail, OK # co19 issue 290
-LibTest/core/List/setRange_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/List/setRange_A02_t02: Fail, OK # co19 issue 290
-LibTest/core/List/setRange_A03_t01: Fail, OK # co19 issue 290
-LibTest/core/List/setRange_A03_t02: Fail, OK # co19 issue 290
-LibTest/core/Match/group_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/Match/groups_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/Match/operator_subscript_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/String/charCodeAt_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/String/operator_subscript_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/String/substring_A02_t01: Fail, OK # co19 issue 290
 
 [ $compiler == dart2dart && $system == windows ]
 LibTest/core/double/operator_remainder_A01_t04: Fail # Result is NaN
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index 3675613..b878b65 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -2,7 +2,6 @@
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
 
-
 # Crashes first, please. Then untriaged bugs. There is a section below
 # for co19 bugs.
 [ $compiler == dart2js ]
@@ -35,6 +34,8 @@
 Language/06_Functions/06_Functions_A01_t22: Fail # TODO(ahe): Please triage this failure.
 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.
@@ -42,10 +43,16 @@
 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.
+Language/07_Classes/6_Constructors_A01_t02: Fail # TODO(ahe): Please triage this failure.
+Language/07_Classes/6_Constructors_A01_t03: Fail # TODO(ahe): Please triage this failure.
+Language/07_Classes/6_Constructors_A01_t04: Fail # TODO(ahe): Please triage this failure.
+Language/07_Classes/6_Constructors_A01_t05: Fail # TODO(ahe): Please triage this failure.
+Language/07_Classes/6_Constructors_A01_t06: Fail # TODO(ahe): Please triage this failure.
 Language/07_Classes/9_Superclasses/1_Inheritance_and_Overriding_A02_t03: Fail # TODO(ahe): Please triage this failure.
 Language/09_Generics/09_Generics_A05_t01: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/01_Constants_A05_t01: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/01_Constants_A13_t06: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/01_Constants_A20_t03: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/05_Strings/1_String_Interpolation_A01_t06: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/08_Throw_A01_t01: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/08_Throw_A05_t01: Fail # TODO(ahe): Please triage this failure.
@@ -64,6 +71,7 @@
 Language/11_Expressions/19_Conditional_A01_t14: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/19_Conditional_A01_t15: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/20_Logical_Boolean_Expressions_A01_t14: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/20_Logical_Boolean_Expressions_A01_t15: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/21_Bitwise_Expressions_A01_t16: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/21_Bitwise_Expressions_A01_t17: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/22_Equality_A01_t23: Fail # TODO(ahe): Please triage this failure.
@@ -82,9 +90,7 @@
 Language/11_Expressions/27_Unary_Expressions_A01_t22: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/30_Identifier_Reference_A04_t09: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/30_Identifier_Reference_A05_t01: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/30_Identifier_Reference_A05_t04: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/30_Identifier_Reference_A05_t12: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/30_Identifier_Reference_A06_t02: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/31_Type_Test_A01_t02: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/31_Type_Test_A01_t04: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/31_Type_Test_A04_t01: Fail # TODO(ahe): Please triage this failure.
@@ -117,36 +123,68 @@
 Language/12_Statements/12_Labels_A03_t04: Fail # TODO(ahe): Please triage this failure.
 Language/12_Statements/14_Continue_A02_t12: Fail # TODO(ahe): Please triage this failure.
 Language/12_Statements/14_Continue_A02_t13: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A02_t01: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A02_t02: Fail # TODO(ahe): Please triage this failure.
+Language/13_Libraries_and_Scripts/1_Imports_A02_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_t02: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A03_t22: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A03_t42: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A03_t62: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/2_Exports_A01_t07: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/2_Exports_A01_t15: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/2_Exports_A01_t16: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/2_Exports_A04_t04: 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/3_Parts_A03_t02: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/4_Scripts_A01_t16: 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.
+Language/14_Types/3_Type_Declarations/1_Typedef_A07_t05: Fail # TODO(ahe): Please triage this failure.
+Language/14_Types/3_Type_Declarations/1_Typedef_A07_t06: Fail # TODO(ahe): Please triage this failure.
+Language/14_Types/3_Type_Declarations/1_Typedef_A07_t07: Fail # TODO(ahe): Please triage this failure.
+Language/14_Types/5_Function_Types_A01_t04: Fail # TODO(ahe): Please triage this failure.
+Language/14_Types/5_Function_Types_A01_t10: Fail # TODO(ahe): Please triage this failure.
+Language/14_Types/5_Function_Types_A02_t02: Fail # TODO(ahe): Please triage this failure.
+Language/14_Types/5_Function_Types_A02_t03: Fail # TODO(ahe): Please triage this failure.
+Language/14_Types/5_Function_Types_A02_t04: Fail # TODO(ahe): Please triage this failure.
+Language/14_Types/5_Function_Types_A02_t05: Fail # TODO(ahe): Please triage this failure.
+Language/14_Types/5_Function_Types_A02_t06: Fail # TODO(ahe): Please triage this failure.
+Language/14_Types/5_Function_Types_A02_t07: Fail # TODO(ahe): Please triage this failure.
+Language/14_Types/5_Function_Types_A02_t08: Fail # TODO(ahe): Please triage this failure.
+Language/14_Types/5_Function_Types_A02_t09: Fail # TODO(ahe): Please triage this failure.
+Language/14_Types/5_Function_Types_A02_t10: Fail # TODO(ahe): Please triage this failure.
+Language/14_Types/5_Function_Types_A03_t01: Fail # TODO(ahe): Please triage this failure.
+Language/14_Types/5_Function_Types_A03_t02: Fail # TODO(ahe): Please triage this failure.
+Language/14_Types/5_Function_Types_A03_t03: Fail # TODO(ahe): Please triage this failure.
+Language/14_Types/5_Function_Types_A03_t04: Fail # TODO(ahe): Please triage this failure.
+Language/14_Types/5_Function_Types_A03_t06: Fail # TODO(ahe): Please triage this failure.
+Language/14_Types/5_Function_Types_A03_t07: Fail # TODO(ahe): Please triage this failure.
+Language/14_Types/5_Function_Types_A03_t08: Fail # TODO(ahe): Please triage this failure.
+Language/14_Types/5_Function_Types_A03_t09: Fail # TODO(ahe): Please triage this failure.
+Language/14_Types/5_Function_Types_A03_t10: Fail # TODO(ahe): Please triage this failure.
+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_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.
-LibTest/core/Queue/Queue.from_A01_t02: Fail # TODO(ahe): Please triage this failure.
-LibTest/core/Set/Set.from_A01_t02: Fail # TODO(ahe): Please triage this failure.
-LibTest/core/String/replaceAll_A02_t01: Fail # TODO(ahe): Please triage this failure.
-LibTest/core/String/replaceFirst_A02_t01: 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.
 LibTest/core/double/INFINITY_A01_t04: Fail # TODO(ahe): Please triage this failure.
 LibTest/core/double/NEGATIVE_INFINITY_A01_t04: Fail # TODO(ahe): Please triage this failure.
+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/parseDouble_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.
@@ -157,24 +195,10 @@
 Language/07_Classes/6_Constructors/2_Factories_A01_t05: Fail
 
 
-LibTest/core/List/iterator_next_A02_t01: Fail, OK # co19 issue 288
-LibTest/core/Queue/iterator_next_A02_t01: Fail, OK # co19 issue 288
-LibTest/core/Queue/first_A02_t01: Fail, OK # co19 issue 288
-LibTest/core/Queue/removeLast_A02_t01: Fail, OK # co19 issue 288
-LibTest/core/Queue/last_A02_t01: Fail, OK # co19 issue 288
-LibTest/core/Queue/removeFirst_A02_t01: Fail, OK # co19 issue 288
-LibTest/core/NoMoreElementsException/NoMoreElementsException_A01_t01: Fail, OK # co19 issue 288
-LibTest/core/NoMoreElementsException/toString_A01_t01: Fail, OK # co19 issue 288
-LibTest/core/EmptyQueueException/EmptyQueueException_A01_t01: Fail, OK # co19 issue 288
-LibTest/core/EmptyQueueException/toString_A01_t01: Fail, OK # co19 issue 288
-
 [ $compiler == dart2js && $unchecked ]
 LibTest/core/Date/Date.fromMillisecondsSinceEpoch_A03_t01: Fail # TODO(ahe): Please triage this failure.
 
 [ $compiler == dart2js && $runtime == jsshell ]
-Language/06_Functions/3_Type_of_a_Function_A01_t01: Fail # TODO(ahe): Triage these tests.
-Language/07_Classes/8_Static_Variables_A02_t01: Fail # TODO(ahe): Triage these tests.
-LibTest/core/Map/putIfAbsent_A01_t08: Fail # TODO(ahe): Triage these tests.
 LibTest/core/double/round_A01_t01: Fail # TODO(ahe): Triage these tests.
 LibTest/core/double/toStringAsExponential_A01_t07: Fail # TODO(ahe): Triage these tests.
 LibTest/core/double/toStringAsFixed_A01_t05: Fail # TODO(ahe): Triage these tests.
@@ -193,12 +217,13 @@
 Language/07_Classes/6_Constructors/2_Factories_A06_t04: Fail # TODO(ahe): Please triage this failure.
 Language/09_Generics/09_Generics_A03_t01: Fail # TODO(ahe): Please triage this failure.
 Language/09_Generics/09_Generics_A04_t06: Fail # TODO(ahe): Please triage this failure.
-Language/09_Generics/09_Generics_A05_t02: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/03_Numbers_A05_t02: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/06_Lists_A09_t01: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/06_Lists_A09_t04: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/06_Lists_A09_t05: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/07_Maps_A10_t04: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/07_Maps_A10_t05: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/07_Maps_A11_t01: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/09_Function_Expressions_A03_t03: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/09_Function_Expressions_A04_t03: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/09_Function_Expressions_A05_t02: Fail # TODO(ahe): Please triage this failure.
@@ -209,15 +234,20 @@
 Language/11_Expressions/11_Instance_Creation/1_New_A11_t01: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/11_Instance_Creation/2_Const_A09_t02: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/11_Instance_Creation/2_Const_A09_t03: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/11_Instance_Creation_A05_t01: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/11_Instance_Creation_A05_t02: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A03_t04: Fail # TODO(ahe): Please triage this failure.
+Language/11_Expressions/19_Conditional_A04_t03: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/20_Logical_Boolean_Expressions_A03_t01: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/27_Unary_Expressions_A02_t03: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/32_Type_Cast_A05_t03: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/32_Type_Cast_A05_t05: Fail # TODO(ahe): Please triage this failure.
-Language/12_Statements/05_If_A02_t01: Fail # TODO(ahe): Please triage this failure.
 Language/12_Statements/06_For/1_For_Loop_A01_t08: Fail # TODO(ahe): Please triage this failure.
 Language/12_Statements/09_Switch_A05_t01: Fail # TODO(ahe): Please triage this failure.
+Language/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_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.
 Language/14_Types/8_Parameterized_Types_A02_t01: Fail # TODO(ahe): Please triage this failure.
 LibTest/core/AssertionError/column_A01_t02: Fail # TODO(ahe): Please triage this failure.
@@ -227,9 +257,9 @@
 LibTest/core/List/operator_subscript_A03_t01: Fail # TODO(ahe): Please triage this failure.
 LibTest/core/List/operator_subscripted_assignment_A03_t01: Fail # TODO(ahe): Please triage this failure.
 LibTest/core/Map/putIfAbsent_A01_t04: Fail # TODO(ahe): Please triage this failure.
-LibTest/core/Map/putIfAbsent_A01_t07: Fail # TODO(ahe): Please triage this failure.
-LibTest/core/Map/putIfAbsent_A01_t08: Fail # TODO(ahe): Please triage this failure.
 LibTest/core/Queue/iterator_hasNext_A01_t01: Fail # TODO(ahe): Please triage this failure.
+LibTest/core/String/contains_A01_t01: Fail # TODO(ahe): Please triage this failure.
+LibTest/core/String/contains_A01_t03: Fail # TODO(ahe): Please triage this failure.
 LibTest/core/TypeError/column_A01_t01: Fail # TODO(ahe): Please triage this failure.
 LibTest/core/TypeError/dstName_A01_t01: Fail # TODO(ahe): Please triage this failure.
 LibTest/core/TypeError/dstType_A01_t01: Fail # TODO(ahe): Please triage this failure.
@@ -247,12 +277,6 @@
 Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A06_t01: Fail # Checked mode failure for noSuchMethod type.
 Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A06_t02: Fail # Checked mode failure for noSuchMethod type.
 
-# These tests return an object from a void function.
-Language/14_Types/7_Type_Void_A04_t02: Fail, OK
-Language/14_Types/7_Type_Void_A04_t03: Fail, OK
-Language/14_Types/7_Type_Void_A04_t04: Fail, OK
-Language/14_Types/7_Type_Void_A04_t05: Fail, OK
-
 Language/11_Expressions/11_Instance_Creation/1_New_A12_t02: Fail # http://dartbug.com/3970
 
 
@@ -273,21 +297,6 @@
 # These tests need to be updated for new optional parameter syntax and semantics, co19 issue 258:
 Language/07_Classes/1_Instance_Methods_A02_t05: Fail, OK
 Language/07_Classes/6_Constructors/1_Generative_Constructors_A13_t01: Fail, OK
-Language/14_Types/5_Function_Types_A01_t21: Fail, OK
-
-LibTest/core/String/charCodes_A01_t01: Fail, OK # co19 issue 289
-
-LibTest/core/Stopwatch/Stopwatch_A01_t01: Fail, OK # co19 issue 297
-LibTest/core/Stopwatch/elapsed_A01_t03: Fail, OK # co19 issue 297
-LibTest/core/Stopwatch/elapsed_A01_t01: Fail, OK # co19 issue 297
-LibTest/core/Stopwatch/elapsed_A01_t02: Fail, OK # co19 issue 297
-LibTest/core/Stopwatch/elapsedInUs_A01_t01: Fail, OK # co19 issue 297
-LibTest/core/Stopwatch/elapsedInMs_A01_t01: Fail, OK # co19 issue 297
-LibTest/core/Stopwatch/start_A01_t01: Fail, OK # co19 issue 297
-LibTest/core/Stopwatch/start_A01_t02: Fail, OK # co19 issue 297
-LibTest/core/Stopwatch/start_A01_t03: Fail, OK # co19 issue 297
-LibTest/core/Stopwatch/stop_A01_t01: Fail, OK # co19 issue 297
-LibTest/core/Stopwatch/frequency_A01_t01: Fail, OK # co19 issue 297
 
 LibTest/isolate/SendPort/send_A02_t02: Fail, OK # co19 issue 293
 LibTest/isolate/SendPort/send_A02_t03: Fail, OK # co19 issue 293
@@ -313,8 +322,6 @@
 LibTest/core/double/operator_remainder_A01_t04: Fail
 
 [ $compiler == dart2js ]
-Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A01_t10: Fail # TODO(ahe): Enforce optional parameter semantics.
-Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A01_t11: Fail # TODO(ahe): Enforce optional parameter semantics.
 Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A03_t03: Fail # TODO(ahe): Enforce optional parameter semantics.
 Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A01_t01: Fail # http://dartbug.com/5026
 Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A03_t04: Fail # TODO(ahe): Enforce optional parameter semantics.
@@ -332,19 +339,6 @@
 Language/11_Expressions/22_Equality_A02_t03: Fail # Compile-time error: unexpected token 'equals'
 Language/11_Expressions/05_Strings_A20_t01: Fail # Runtime error: Expect.identical(expected: <abyr, abyr
 LibTest/isolate/isolate_api/spawnUri_A02_t01: Fail # Runtime error: Expect.throws() fails
-Language/11_Expressions/05_Strings/1_String_Interpolation_A03_t02: Fail # Runtime error: TypeError: Cannot call method '$call$0' of undefined
-Language/11_Expressions/05_Strings/1_String_Interpolation_A04_t02: Fail # Runtime error: TypeError: Cannot call method '$call$0' of undefined
-Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A08_t01: Fail # Runtime error: TypeError: Cannot call method '$call$0' of undefined
-Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t02: Fail # Runtime error: TypeError: Cannot call method '$call$0' of undefined
-Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t03: Fail # Runtime error: TypeError: Cannot call method '$call$0' of undefined
-Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A05_t01: Fail # Runtime error: TypeError: Cannot call method '$call$0' of undefined
-Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A06_t02: Fail # Runtime error: TypeError: Cannot call method '$call$0' of undefined
-Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A03_t02: Fail # Runtime error: TypeError: Cannot call method '$call$0' of undefined
-Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A03_t03: Fail # Runtime error: TypeError: Cannot call method '$call$0' of undefined
-Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A07_t01: Fail # Runtime error: TypeError: Cannot call method '$call$0' of undefined
-Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A08_t02: Fail # Runtime error: TypeError: Cannot call method '$call$0' of undefined
-Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A02_t04: Fail # Runtime error: TypeError: Cannot call method '$call$2' of undefined
-Language/11_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A03_t01: Fail # Runtime error: TypeError: Object 1 has no method '$call$0'
 LibTest/isolate/isolate_api/spawnUri_A01_t01: Fail # Runtime error: UnsupportedError: Currently spawnUri is not supported without web workers.
 LibTest/isolate/isolate_api/spawnUri_A01_t02: Fail # Runtime error: UnsupportedError: Currently spawnUri is not supported without web workers.
 LibTest/isolate/isolate_api/spawnUri_A01_t03: Fail # Runtime error: UnsupportedError: Currently spawnUri is not supported without web workers.
@@ -390,9 +384,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.
-LibTest/core/String/String_class_A02_t01: Pass, Fail, OK # issue 6418 compiler cancelled: Unhandled non-BMP character: U+10000
-LibTest/core/String/charCodeAt_A01_t01: Fail, OK # compiler cancelled: Unhandled non-BMP character: U+10000
-LibTest/core/String/charCodes_A01_t01: Fail, OK # compiler cancelled: Unhandled non-BMP character: U+10000
 
 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
@@ -410,36 +401,10 @@
 
 LibTest/core/int/hashCode_A01_t01: Fail, OK # co19 issue 308
 
-LibTest/core/NoSuchMethodError/NoSuchMethodError_A01_t01: Fail, OK # co19 issue 300
-LibTest/core/NoSuchMethodError/toString_A01_t01: Fail, OK # co19 issue 300
-
-LibTest/core/String/contains_A01_t01: Fail, OK # co19 issue 314
-LibTest/core/String/contains_A01_t03: Fail, OK # co19 issue 314
-
-LibTest/core/NotImplementedException/NotImplementedException_A01_t01: Fail, OK # co19 issue 315
-LibTest/core/NotImplementedException/toString_A01_t01: Fail, OK # co19 issue 315
-
-LibTest/core/IndexOutOfRangeException/IndexOutOfRangeException_A01_t01: Fail, OK # co19 issue 290
-LibTest/core/IndexOutOfRangeException/toString_A01_t01: Fail, OK # co19 issue 290
-LibTest/core/List/getRange_A04_t01: Fail, OK # co19 issue 290
-LibTest/core/List/insertRange_A06_t01: Fail, OK # co19 issue 290
-LibTest/core/List/last_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/List/length_A05_t01: Fail, OK # co19 issue 290
-LibTest/core/List/List_A01_t01: Fail, OK # co19 issue 290
-LibTest/core/List/operator_subscript_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/List/operator_subscripted_assignment_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/List/removeLast_A01_t02: Fail, OK # co19 issue 290
-LibTest/core/List/removeRange_A05_t01: Fail, OK # co19 issue 290
-LibTest/core/List/setRange_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/List/setRange_A02_t02: Fail, OK # co19 issue 290
-LibTest/core/List/setRange_A03_t01: Fail, OK # co19 issue 290
-LibTest/core/List/setRange_A03_t02: Fail, OK # co19 issue 290
-LibTest/core/Match/group_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/Match/groups_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/Match/operator_subscript_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/String/charCodeAt_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/String/operator_subscript_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/String/substring_A02_t01: Fail, OK # co19 issue 290
+Language/03_Overview/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
@@ -475,7 +440,6 @@
 LibTest/core/int/toDouble_A01_t01: Fail, OK # Requires big int.
 LibTest/core/int/toRadixString_A01_t01: Fail, OK # Bad test: uses Expect.fail, Expect.throws, assumes case of result, and uses unsupported radixes.
 LibTest/core/String/contains_A01_t02: Fail, OK # co19 issue 105.
-Language/07_Classes/1_Instance_Methods/2_Operators_A02_t01: Fail, OK # Expects negative result from bit-operation.
 
 
 [ $compiler == dart2js && $system == macos ]
@@ -495,12 +459,9 @@
 Language/03_Overview/1_Scoping_A02_t07: Fail # duplicate definition of f(var f){f();}
 Language/03_Overview/1_Scoping_A02_t12: Fail # duplicate definition of x=42
 Language/03_Overview/2_Privacy_A01_t06: Fail # cannot resolve type _inaccessibleFuncType
-Language/03_Overview/2_Privacy_A01_t11: Fail # internal error: super property read not implemented
-Language/03_Overview/2_Privacy_A01_t14: Fail # duplicate definition of _(var _)=> _
 
 Language/11_Expressions/01_Constants_A12_t01: Fail # internal error: CompileTimeConstantEvaluator not implemented
 Language/11_Expressions/22_Equality_A05_t01: Fail # != cannot be called on super
-Language/11_Expressions/27_Unary_Expressions_A01_t01: Fail # ! cannot be called on super
 Language/11_Expressions/27_Unary_Expressions_A01_t10: Fail # cannot deal with super in complex assignments
 Language/11_Expressions/30_Identifier_Reference_A02_t01: Fail # Pseudo keyword "abstract".
 
@@ -572,7 +533,6 @@
 Language/07_Classes/1_Instance_Methods/2_Operators_A07_t02: Fail # Checks that a compile-time error is produced if a user-defined operator [] specifies an optional named parameter in addition to the required one.
 Language/07_Classes/1_Instance_Methods/2_Operators_A07_t03: Fail # Checks that a compile-time error is produced if a user-defined operator []= specifies one optional named parameter.
 Language/07_Classes/1_Instance_Methods/2_Operators_A07_t04: Fail # Checks that a compile-time error is produced if a user-defined operator []= specifies one optional named parameter in addition to the two required ones
-Language/07_Classes/1_Instance_Methods_A02_t01: Fail # Checks that a compile-time error is produced if m1 has fewer named parameters than m2 (2 vs 3) and neither have any required parameters.
 Language/07_Classes/1_Instance_Methods_A02_t02: Fail # Checks that a compile-time error is produced if m1 has fewer named parameters than m2 (1 vs. 0) and neither have any required parameters.
 Language/07_Classes/1_Instance_Methods_A02_t05: Fail # Checks that a compile-time error is produced if m1 has almost the same set of named  parameters as m2 except for one of them having a different name.
 Language/07_Classes/2_Getters_A01_t03: Fail # Checks that a compile-time error is produced if empty formal parameter list is present.
@@ -615,9 +575,6 @@
 Language/11_Expressions/23_Relational_Expressions_A01_t13: Fail # Checks that a relational expression cannot be the operand of another relational expression.
 Language/11_Expressions/30_Identifier_Reference_A07_t01: Fail # Checks that it is a compile-time error when a built-in identifier "abstract" is used as a type annotation of a local variable.
 Language/12_Statements/03_Variable_Declaration_A04_t01: Fail # Checks that if the variable declaration is prefixed with the const modifier, then variable must be initialized to a constant expression.
-Language/14_Types/3_Type_Declarations/1_Typedef_A07_t01: Fail # Checks that self-referencing typedef is not allowed (return value type annotation has the same name as a type alias).
-Language/14_Types/3_Type_Declarations/1_Typedef_A07_t02: Fail # Checks that self-referencing typedef is not allowed (positional formal parameter type annotation has the same name as a type alias).
-Language/14_Types/3_Type_Declarations/1_Typedef_A07_t03: Fail # Checks that self-referencing typedef is not allowed (optional formal parameter type annotation has the same name as a type alias).
 Language/15_Reference/1_Lexical_Rules_A02_t06: Fail # Checks that Unicode whitespaces other than WHITESPACE are not permitted in the source code. Checks symbol U+00a0.
 
 
@@ -631,8 +588,6 @@
 
 Language/14_Types/2_Dynamic_Type_System_A02_t01: Fail # http://dartbug.com/5029
 
-Language/03_Overview/03_Overview_A01_t01: Fail # http://dartbug.com/3903
-
 Language/07_Classes/3_Setters_A04_t01: Fail # http://dartbug.com/5023
 Language/07_Classes/3_Setters_A04_t02: Fail # http://dartbug.com/5023
 Language/07_Classes/3_Setters_A04_t03: Fail # http://dartbug.com/5023
@@ -640,7 +595,6 @@
 Language/07_Classes/3_Setters_A04_t05: Fail # http://dartbug.com/5023
 Language/07_Classes/3_Setters_A04_t06: Fail # http://dartbug.com/5023
 Language/07_Classes/3_Setters_A04_t07: Fail # http://dartbug.com/5023
-Language/07_Classes/3_Setters_A04_t08: Fail # http://dartbug.com/5023
 
 Language/14_Types/3_Type_Declarations/1_Typedef_A02_t01: Fail # http://dartbug.com/5022
 Language/14_Types/3_Type_Declarations/1_Typedef_A02_t02: Fail # http://dartbug.com/5022
@@ -657,26 +611,12 @@
 Language/14_Types/5_Function_Types_A01_t08: Fail # http://dartbug.com/5022
 Language/14_Types/5_Function_Types_A01_t09: Fail # http://dartbug.com/5022
 Language/14_Types/5_Function_Types_A01_t11: Fail # http://dartbug.com/5022
-Language/14_Types/5_Function_Types_A01_t12: Fail # http://dartbug.com/5022
-Language/14_Types/5_Function_Types_A01_t13: Fail # http://dartbug.com/5022
-Language/14_Types/5_Function_Types_A01_t14: Fail # http://dartbug.com/5022
-Language/14_Types/5_Function_Types_A01_t15: Fail # http://dartbug.com/5022
-Language/14_Types/5_Function_Types_A01_t16: Fail # http://dartbug.com/5022
-Language/14_Types/5_Function_Types_A01_t17: Fail # http://dartbug.com/5022
-Language/14_Types/5_Function_Types_A01_t18: Fail # http://dartbug.com/5022
-Language/14_Types/5_Function_Types_A01_t19: Fail # http://dartbug.com/5022
-Language/14_Types/5_Function_Types_A01_t20: Fail # http://dartbug.com/5022
-Language/14_Types/5_Function_Types_A01_t21: Fail # http://dartbug.com/5022
-Language/14_Types/5_Function_Types_A01_t22: Fail # http://dartbug.com/5022
-Language/14_Types/5_Function_Types_A01_t23: Fail # http://dartbug.com/5022
 
 Language/13_Libraries_and_Scripts/4_Scripts_A03_t01: Fail # http://dartbug.com/5683
 Language/13_Libraries_and_Scripts/4_Scripts_A03_t03: Fail # http://dartbug.com/5683
 
 Language/13_Libraries_and_Scripts/13_Libraries_and_Scripts_A05_t02: Fail # http://dartbug.com/5713
 
-Language/07_Classes/07_Classes_A01_t20: Fail # http://dartbug.com/6687
-Language/07_Classes/07_Classes_A02_t34: Fail # http://dartbug.com/6687
 Language/07_Classes/07_Classes_A03_t10: Fail # http://dartbug.com/6687
 
 
@@ -686,7 +626,6 @@
 [ $compiler == dart2js ]
 Language/14_Types/5_Function_Types_A02_t01: Fail # Expect.isTrue(false) fails.
 
-Language/14_Types/4_Interface_Types_A05_t03: Fail # http://dartbug.com/5020
 Language/14_Types/4_Interface_Types_A08_t06: Fail # http://dartbug.com/5020
 Language/14_Types/4_Interface_Types_A10_t01: Fail # http://dartbug.com/5020
 Language/14_Types/4_Interface_Types_A10_t02: Fail # http://dartbug.com/5020
diff --git a/tests/co19/co19-runtime.status b/tests/co19/co19-runtime.status
index 068e299..60702b9 100644
--- a/tests/co19/co19-runtime.status
+++ b/tests/co19/co19-runtime.status
@@ -2,33 +2,10 @@
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
 
-# These tests either wrongly expect a compile-time error or wrongly reject a type error in production mode, co19 issue 282:
-[ $compiler == none && $runtime == vm ]
-Language/13_Libraries_and_Scripts/1_Imports_A03_t05: Fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t08: Fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t25: Fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t28: Fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t45: Fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t48: Fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t65: Fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t68: Fail, OK
-[ $compiler == none && $runtime == vm && $unchecked ]
-Language/13_Libraries_and_Scripts/1_Imports_A03_t02: Fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t22: Fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t42: Fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t62: Fail, OK
-[ $compiler == none && $runtime == vm && $checked ]
-Language/13_Libraries_and_Scripts/1_Imports_A03_t06: Fail, OK
-Language/13_Libraries_and_Scripts/1_Imports_A03_t66: Fail, OK
-
-
 [ $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/11_Expressions/30_Identifier_Reference_A05_t04: Fail, OK # co19 issue 302
-
-
 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.
@@ -36,14 +13,12 @@
 Language/05_Variables/05_Variables_A05_t15: Fail # TODO(vm-team): Please triage this failure.
 Language/05_Variables/1_Evaluation_of_Implicit_Variable_Getters_A01_t02: Fail # TODO(vm-team): Please triage this failure.
 Language/05_Variables/1_Evaluation_of_Implicit_Variable_Getters_A01_t05: Fail # TODO(vm-team): Please triage this failure.
-Language/07_Classes/07_Classes_A07_t03: Fail, OK # co19 issue 306
-Language/07_Classes/07_Classes_A07_t06: Fail, OK # co19 issue 306
+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_t03: Fail, OK # Syntax error, issue 304
-Language/07_Classes/3_Setters_A04_t06: Fail, OK # Syntax error, issue 304
-Language/07_Classes/3_Setters_A04_t07: Fail, OK # test error, issue 305
-Language/07_Classes/3_Setters_A04_t08: Fail, OK # test error, issue 305
+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.
 Language/07_Classes/4_Abstract_Instance_Members_A03_t02: Fail # TODO(vm-team): Please triage this failure.
 Language/07_Classes/4_Abstract_Instance_Members_A03_t03: Fail # TODO(vm-team): Please triage this failure.
 Language/07_Classes/4_Abstract_Instance_Members_A03_t04: Fail # TODO(vm-team): Please triage this failure.
@@ -63,6 +38,8 @@
 Language/11_Expressions/01_Constants_A05_t01: Fail # TODO(vm-team): Please triage this failure.
 Language/11_Expressions/01_Constants_A06_t01: Fail # TODO(vm-team): Please triage this failure.
 Language/11_Expressions/01_Constants_A14_t01: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/01_Constants_A20_t02: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/01_Constants_A20_t03: Fail # TODO(vm-team): Please triage this failure.
 Language/11_Expressions/05_Strings/1_String_Interpolation_A01_t04: Fail # TODO(vm-team): Please triage this failure.
 Language/11_Expressions/05_Strings/1_String_Interpolation_A01_t05: Fail # TODO(vm-team): Please triage this failure.
 Language/11_Expressions/05_Strings/1_String_Interpolation_A01_t06: Fail # TODO(vm-team): Please triage this failure.
@@ -72,12 +49,10 @@
 Language/11_Expressions/11_Instance_Creation/1_New_A02_t05: Fail # TODO(vm-team): Please triage this failure.
 Language/11_Expressions/11_Instance_Creation/1_New_A09_t09: Fail # TODO(vm-team): Please triage this failure.
 Language/11_Expressions/11_Instance_Creation/2_Const_A10_t01: Fail # TODO(vm-team): Please triage this failure.
-Language/11_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A03_t01: Fail # TODO(vm-team): Please triage this failure.
 Language/11_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A05_t02: Fail # TODO(vm-team): Please triage this failure.
 Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t08: Fail # TODO(vm-team): Please triage this failure.
 Language/11_Expressions/17_Getter_Invocation_A02_t01: Fail # TODO(vm-team): Please triage this failure.
 Language/11_Expressions/18_Assignment_A05_t02: Fail # TODO(vm-team): Please triage this failure.
-Language/11_Expressions/18_Assignment_A05_t04: Fail # TODO(vm-team): Please triage this failure.
 Language/11_Expressions/18_Assignment_A05_t05: Fail # TODO(vm-team): Please triage this failure.
 Language/11_Expressions/19_Conditional_A01_t10: Fail # TODO(vm-team): Please triage this failure.
 Language/11_Expressions/19_Conditional_A01_t11: Fail # TODO(vm-team): Please triage this failure.
@@ -90,6 +65,7 @@
 Language/11_Expressions/20_Logical_Boolean_Expressions_A01_t12: Fail # TODO(vm-team): Please triage this failure.
 Language/11_Expressions/20_Logical_Boolean_Expressions_A01_t13: Fail # TODO(vm-team): Please triage this failure.
 Language/11_Expressions/20_Logical_Boolean_Expressions_A01_t14: Fail # TODO(vm-team): Please triage this failure.
+Language/11_Expressions/20_Logical_Boolean_Expressions_A01_t15: Fail # TODO(vm-team): Please triage this failure.
 Language/11_Expressions/21_Bitwise_Expressions_A01_t12: Fail # TODO(vm-team): Please triage this failure.
 Language/11_Expressions/21_Bitwise_Expressions_A01_t13: Fail # TODO(vm-team): Please triage this failure.
 Language/11_Expressions/21_Bitwise_Expressions_A01_t14: Fail # TODO(vm-team): Please triage this failure.
@@ -147,11 +123,6 @@
 Language/11_Expressions/30_Identifier_Reference_A08_t02: Fail # TODO(vm-team): Please triage this failure.
 Language/11_Expressions/31_Type_Test_A01_t02: Fail # TODO(vm-team): Please triage this failure.
 Language/11_Expressions/31_Type_Test_A01_t04: Fail # TODO(vm-team): Please triage this failure.
-Language/11_Expressions/31_Type_Test_A05_t01: Fail # TODO(vm-team): Please triage this failure.
-Language/11_Expressions/31_Type_Test_A05_t02: Fail # TODO(vm-team): Please triage this failure.
-Language/11_Expressions/31_Type_Test_A05_t03: Fail # TODO(vm-team): Please triage this failure.
-Language/11_Expressions/32_Type_Cast_A04_t01: Fail # TODO(vm-team): Please triage this failure.
-Language/11_Expressions/32_Type_Cast_A04_t02: Fail # TODO(vm-team): Please triage this failure.
 Language/12_Statements/04_Local_Function_Declaration_A02_t02: Fail # TODO(vm-team): Please triage this failure.
 Language/12_Statements/06_For_A01_t11: Fail # TODO(vm-team): Please triage this failure.
 Language/12_Statements/09_Switch_A01_t02: Fail # TODO(vm-team): Please triage this failure.
@@ -163,28 +134,25 @@
 Language/12_Statements/09_Switch_A06_t02: Fail # TODO(vm-team): Please triage this failure.
 Language/12_Statements/10_Try_A11_t01: Fail # TODO(vm-team): Please triage this failure.
 Language/12_Statements/12_Labels_A01_t03: Fail # TODO(vm-team): Please triage this failure.
-Language/13_Libraries_and_Scripts/13_Libraries_and_Scripts_A03_t01: Fail # TODO(vm-team): Please triage this failure.
 Language/13_Libraries_and_Scripts/13_Libraries_and_Scripts_A05_t04: Fail # TODO(vm-team): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A02_t01: Fail, OK # co 19 issue 313
-Language/13_Libraries_and_Scripts/1_Imports_A02_t02: Fail, OK # co 19 issue 313
-Language/13_Libraries_and_Scripts/1_Imports_A02_t16: Fail # TODO(vm-team): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A02_t17: Fail # TODO(vm-team): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A02_t18: Fail # TODO(vm-team): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A02_t19: Fail # TODO(vm-team): Please triage this failure.
-Language/13_Libraries_and_Scripts/2_Exports_A01_t15: Fail, OK # co19 issue 311.
-Language/13_Libraries_and_Scripts/2_Exports_A01_t16: Fail, OK # co19 issue 312.
+Language/13_Libraries_and_Scripts/1_Imports_A02_t29: Fail # TODO(vm-team): Please triage this failure.
+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_t16: Fail # TODO(vm-team): Please triage this failure.
-Language/14_Types/5_Function_Types_A02_t01: Fail # TODO(vm-team): Please triage this failure.
-LibTest/core/Queue/Queue.from_A01_t02: Fail # TODO(vm-team): Please triage this failure.
-LibTest/core/Set/Set.from_A01_t02: 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_t11: 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_A06_t01: 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.
+LibTest/core/double/parse_A02_t01: Fail # TODO(vm-team): Please triage this failure.
 LibTest/isolate/isolate_api/spawnUri_A01_t03: Fail # TODO(vm-team): Please triage this failure.
 LibTest/isolate/isolate_api/spawnUri_A01_t04: Fail # TODO(vm-team): Please triage this failure.
 LibTest/math/Random/nextDouble_A01_t01: Fail # TODO(vm-team): Please triage this failure.
-LibTest/math/parseDouble_A02_t01: Fail # TODO(vm-team): Please triage this failure.
 LibTest/math/pow_A01_t01: Fail # TODO(vm-team): Please triage this failure.
 LibTest/math/pow_A11_t01: Fail # TODO(vm-team): Please triage this failure.
 LibTest/math/pow_A13_t01: Fail # TODO(vm-team): Please triage this failure.
@@ -192,49 +160,25 @@
 
 LibTest/isolate/isolate_api/port_A01_t01: Skip # Times out.
 
-LibTest/core/String/String_class_A02_t01: Fail, OK # co19 issue 284
-LibTest/core/String/charCodeAt_A01_t01: Fail, OK # co19 issue 284
-LibTest/core/String/charCodes_A01_t01: Fail, OK # co19 issue 284
-
 Language/06_Functions/1_Function_Declaration_A02_t03: Fail # issue 6058
 Language/06_Functions/1_Function_Declaration_A03_t03: Fail # issue 6058
 Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A03_t01: Fail # issue 6085
 Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A03_t02: Fail # issue 6085
 Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A03_t03: Fail # issue 6085
 
-LibTest/core/EmptyQueueException/EmptyQueueException_A01_t01: Fail, OK # co19 issue 288
-LibTest/core/EmptyQueueException/toString_A01_t01: Fail, OK # co19 issue 288
-LibTest/core/List/iterator_next_A02_t01: Fail, OK # co19 issue 288
-LibTest/core/NoMoreElementsException/NoMoreElementsException_A01_t01: Fail, OK # co19 issue 288
-LibTest/core/NoMoreElementsException/toString_A01_t01: Fail, OK # co19 issue 288
-LibTest/core/Queue/iterator_next_A02_t01: Fail, OK # co19 issue 288
-LibTest/core/Queue/removeFirst_A02_t01: Fail, OK # co19 issue 288
-LibTest/core/Queue/removeLast_A02_t01: Fail, OK # co19 issue 288
-
-LibTest/core/NoSuchMethodError/NoSuchMethodError_A01_t01: Fail, OK # co19 issue 300
-LibTest/core/NoSuchMethodError/toString_A01_t01: Fail, OK # co19 issue 300
 
 [ $compiler == none && $runtime == vm && $checked ]
-Language/12_Statements/05_If_A02_t01: Fail # TODO(vm-team): Please triage this failure.
 Language/12_Statements/09_Switch_A05_t01: Fail # TODO(vm-team): Please triage this failure.
-Language/14_Types/7_Type_Void_A04_t02: Fail # TODO(vm-team): Please triage this failure.
-Language/14_Types/7_Type_Void_A04_t03: Fail # TODO(vm-team): Please triage this failure.
-Language/14_Types/7_Type_Void_A04_t04: Fail # TODO(vm-team): Please triage this failure.
-Language/14_Types/7_Type_Void_A04_t05: Fail # TODO(vm-team): Please triage this failure.
-LibTest/core/Map/putIfAbsent_A01_t07: Fail # TODO(vm-team): Please triage this failure.
-LibTest/core/Map/putIfAbsent_A01_t08: Fail # TODO(vm-team): Please triage this failure.
-
-Language/14_Types/7_Type_Void_A04_t02: Fail, OK # co19 issue 158
-Language/14_Types/7_Type_Void_A04_t03: Fail, OK # co19 issue 158
-Language/14_Types/7_Type_Void_A04_t04: Fail, OK # co19 issue 158
-Language/14_Types/7_Type_Void_A04_t05: Fail, OK # co19 issue 158
+Language/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/14_Types/2_Dynamic_Type_System_A02_t01: Fail # TODO(vm-team): Please triage this failure.
+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
@@ -270,7 +214,6 @@
 Language/11_Expressions/07_Maps_A01_t01: Skip # co19 issue 91: map literals illegal at statement beginning.
 
 Language/11_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A05_t01: Fail # issue 1604.
-Language/11_Expressions/27_Unary_Expressions_A01_t01: Fail # issue 1288 (unary super operator call)
 
 LibTest/core/List/every_A03_t01: Skip # Promise removed (co19 issue #79)
 LibTest/core/List/filter_A03_t01: Skip # Promise removed (co19 issue #79)
@@ -286,31 +229,8 @@
 # New failures
 LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterEscape_A06_t02: Fail
 
-LibTest/core/NotImplementedException/NotImplementedException_A01_t01: Fail, OK # co19 issue 315
-LibTest/core/NotImplementedException/toString_A01_t01: Fail, OK # co19 issue 315
-
-LibTest/core/IndexOutOfRangeException/IndexOutOfRangeException_A01_t01: Fail, OK # co19 issue 290
-LibTest/core/IndexOutOfRangeException/toString_A01_t01: Fail, OK # co19 issue 290
-LibTest/core/List/getRange_A04_t01: Fail, OK # co19 issue 290
-LibTest/core/List/insertRange_A06_t01: Fail, OK # co19 issue 290
-LibTest/core/List/last_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/List/length_A05_t01: Fail, OK # co19 issue 290
-LibTest/core/List/List_A01_t01: Fail, OK # co19 issue 290
-LibTest/core/List/operator_subscript_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/List/operator_subscripted_assignment_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/List/removeLast_A01_t02: Fail, OK # co19 issue 290
-LibTest/core/List/removeRange_A05_t01: Fail, OK # co19 issue 290
-LibTest/core/List/setRange_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/List/setRange_A02_t02: Fail, OK # co19 issue 290
-LibTest/core/List/setRange_A03_t01: Fail, OK # co19 issue 290
-LibTest/core/List/setRange_A03_t02: Fail, OK # co19 issue 290
-LibTest/core/Match/group_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/Match/groups_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/Match/operator_subscript_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/String/charCodeAt_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/String/operator_subscript_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/String/substring_A02_t01: Fail, OK # co19 issue 290
-
+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
@@ -367,32 +287,14 @@
 LibTest/core/Map/getValues_A01_t02: Fail, OK # co19 issue 293
 LibTest/core/Map/getValues_A01_t01: Fail, OK # co19 issue 293
 
-LibTest/core/Stopwatch/Stopwatch_A01_t01: Fail, OK # co19 issue 297
-LibTest/core/Stopwatch/elapsed_A01_t03: Fail, OK # co19 issue 297
-LibTest/core/Stopwatch/elapsed_A01_t01: Fail, OK # co19 issue 297
-LibTest/core/Stopwatch/elapsed_A01_t02: Fail, OK # co19 issue 297
-LibTest/core/Stopwatch/elapsedInUs_A01_t01: Fail, OK # co19 issue 297
-LibTest/core/Stopwatch/elapsedInMs_A01_t01: Fail, OK # co19 issue 297
-LibTest/core/Stopwatch/start_A01_t01: Fail, OK # co19 issue 297
-LibTest/core/Stopwatch/start_A01_t02: Fail, OK # co19 issue 297
-LibTest/core/Stopwatch/start_A01_t03: Fail, OK # co19 issue 297
-LibTest/core/Stopwatch/stop_A01_t01: Fail, OK # co19 issue 297
-LibTest/core/Stopwatch/frequency_A01_t01: Fail, OK # co19 issue 297
-
 LibTest/core/Match/operator_subscript_A01_t01: Fail, OK # co19 issue 294
 LibTest/core/RegExp/firstMatch_A01_t01: Fail, OK # co19 issue 294
 LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A02_t01: Fail, OK # co19 issue 294
 LibTest/core/RegExp/Pattern_semantics/firstMatch_Term_A03_t01: Fail, OK # co19 issue 294
 
-LibTest/core/Queue/first_A02_t01: Fail, OK # co19 issue 291
-LibTest/core/Queue/last_A02_t01: Fail, OK # co19 issue 291
-
 Language/11_Expressions/07_Maps_A07_t03: Fail, OK # co19 issue 287
 Language/11_Expressions/07_Maps_A04_t02: Fail, OK # co19 issue 287
 
-LibTest/core/RegExp/RegExp_A01_t04: Fail, OK # co19 issue 314
-LibTest/core/String/contains_A01_t01: Fail, OK # co19 issue 314
-
 LibTest/core/Map/getValues_A01_t02: Fail, OK # co19 issue 287
 
 [ $compiler == none && $runtime == vm ]
@@ -408,13 +310,7 @@
 [ $compiler == none && $runtime == vm ]
 Language/07_Classes/07_Classes_A02_t29: Fail
 Language/07_Classes/07_Classes_A02_t31: Fail
-Language/11_Expressions/05_Strings/1_String_Interpolation_A03_t02: Fail
-Language/11_Expressions/05_Strings/1_String_Interpolation_A04_t02: Fail
 Language/11_Expressions/05_Strings_A20_t01: Fail
-Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t02: Fail # Issue 1604, exception should be NoSuchMethodException instead of ObjectNotClosureException
-Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t03: Fail # Issue 1604, exception should be NoSuchMethodException instead of ObjectNotClosureException
-Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A05_t01: Fail # Issue 1604, exception should be NoSuchMethodException instead of ObjectNotClosureException
-Language/11_Expressions/15_Method_Invocation/3_Static_Invocation_A06_t02: Fail # Issue 1604, exception should be NoSuchMethodException instead of ObjectNotClosureException
 LibTest/isolate/ReceivePort/receive_A01_t02: Fail
 LibTest/isolate/isolate_api/spawnUri_A01_t03: Crash
 LibTest/isolate/isolate_api/spawnUri_A01_t04: Crash
@@ -425,18 +321,6 @@
 Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t03: Fail
 
 
-# function 'func' not found in super class, getter 'func' should be invoked first.
-Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A02_t04: Fail # co19 issue 251 or issue 5732
-Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A03_t02: Fail # co19 issue 251 or issue 5732
-Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A03_t03: Fail # co19 issue 251 or issue 5732
-Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A07_t01: Fail # co19 issue 251 or issue 5732
-Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A08_t02: Fail # co19 issue 251 or issue 5732
-
-
-# invalid operator overloading
-Language/07_Classes/1_Instance_Methods/2_Operators_A02_t01: Fail
-
-
 # parameter name or type expected
 Language/07_Classes/6_Constructors/1_Generative_Constructors_A15_t07: Fail
 
diff --git a/tests/compiler/dart2js/array_static_intercept_test.dart b/tests/compiler/dart2js/array_static_intercept_test.dart
index d75efea..a5b343a 100644
--- a/tests/compiler/dart2js/array_static_intercept_test.dart
+++ b/tests/compiler/dart2js/array_static_intercept_test.dart
@@ -15,6 +15,6 @@
 main() {
   String generated = compile(TEST_ONE, entry: 'foo');
   Expect.isTrue(generated.contains(r'.add$1('));
-  Expect.isTrue(generated.contains(r'.removeLast('));
+  Expect.isTrue(generated.contains(r'.removeLast$0('));
   Expect.isTrue(generated.contains(r'.get$length('));
 }
diff --git a/tests/compiler/dart2js/builtin_interceptor_test.dart b/tests/compiler/dart2js/builtin_interceptor_test.dart
index f5a9b2f..90cdfcc 100644
--- a/tests/compiler/dart2js/builtin_interceptor_test.dart
+++ b/tests/compiler/dart2js/builtin_interceptor_test.dart
@@ -6,10 +6,12 @@
 
 const String TEST_ONE = r"""
 foo(String a) {
+  // Make sure the string class is registered.
+  var c = 'foo';
   // index into the parameter and move into a loop to make sure we'll get a
   // type guard.
   for (int i = 0; i < 1; i++) {
-    print(a[0]);
+    print(a[0] + c);
   }
   return a.length;
 }
@@ -35,7 +37,7 @@
 
 main() {
   String generated = compile(TEST_ONE, entry: 'foo');
-  Expect.isTrue(generated.contains("return a.length;"));
+  Expect.isTrue(generated.contains("a.length"));
 
   generated = compile(TEST_TWO, entry: 'foo');
   Expect.isTrue(generated.contains("return 3;"));
@@ -44,5 +46,6 @@
   Expect.isTrue(generated.contains("return 3;"));
 
   generated = compile(TEST_FOUR, entry: 'foo');
-  Expect.isTrue(generated.contains("push(2);"));
+  // TODO(6829): Re-enable this test.
+  // Expect.isTrue(generated.contains("push(2);"));
 }
diff --git a/tests/compiler/dart2js/class_codegen_test.dart b/tests/compiler/dart2js/class_codegen_test.dart
index 6f751c7..51b2d07 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 = {\n "super": "Object"'));
+  Expect.isTrue(generated.contains('\$.B = {\n "super": "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 = {\n "super": "Object"'));
+    Expect.isTrue(generated.contains('\$.B = {\n "super": "A"'));
   }
 
   checkOutput(compileAll(TEST_TWO));
diff --git a/tests/compiler/dart2js/constant_folding_test.dart b/tests/compiler/dart2js/constant_folding_test.dart
index f803b25..482b8da 100644
--- a/tests/compiler/dart2js/constant_folding_test.dart
+++ b/tests/compiler/dart2js/constant_folding_test.dart
@@ -46,6 +46,6 @@
   regexp = new RegExp(r'4 === c');
   Expect.isTrue(regexp.hasMatch(generated));
 
-  regexp = new RegExp("'foo' === d");
+  regexp = new RegExp('"foo" === d');
   Expect.isTrue(regexp.hasMatch(generated));
 }
diff --git a/tests/compiler/dart2js/dart_backend_test.dart b/tests/compiler/dart2js/dart_backend_test.dart
index 026e015..b6824c6 100644
--- a/tests/compiler/dart2js/dart_backend_test.dart
+++ b/tests/compiler/dart2js/dart_backend_test.dart
@@ -692,6 +692,22 @@
       continuation: (String result) { Expect.equals(expectedResult, result); });
 }
 
+testUnresolvedNamedConstructor() {
+  var src = '''
+class A {
+  A() {}
+}
+
+main() {
+  new A();
+  new A.named();
+}
+''';
+  var expectedResult = "class A{A(){}}main(){new A();new p_Unresolved();}";
+  testDart2Dart(src,
+      continuation: (String result) { Expect.equals(expectedResult, result); });
+}
+
 main() {
   testSimpleFileUnparse();
   testTopLevelField();
@@ -722,4 +738,5 @@
   testDeclarationTypePlaceholders();
   testPlatformLibraryMemberNamesAreFixed();
   testConflictsWithCoreLib();
+  testUnresolvedNamedConstructor();
 }
diff --git a/tests/compiler/dart2js/mock_compiler.dart b/tests/compiler/dart2js/mock_compiler.dart
index 0d327af..42b0300 100644
--- a/tests/compiler/dart2js/mock_compiler.dart
+++ b/tests/compiler/dart2js/mock_compiler.dart
@@ -48,13 +48,13 @@
   assertHelper(a){}''';
 
 const String DEFAULT_INTERCEPTORSLIB = r'''
-  add$1(receiver, value) {}
-  get$length(receiver) {}
-  filter(receiver, predicate) {}
-  removeLast(receiver) {}
-  iterator(receiver) {}
-  next(receiver) {}
-  hasNext(receiver) {}''';
+  class JSArray {
+    var length;
+  }
+  class JSString {
+    var length;
+  }
+  getInterceptor(x) {}''';
 
 const String DEFAULT_CORELIB = r'''
   print(var obj) {}
diff --git a/tests/compiler/dart2js/no_constructor_body_test.dart b/tests/compiler/dart2js/no_constructor_body_test.dart
index ea1a6b2..2193286 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 = {\n "super": "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 8e4eae6..67fa8fc 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 = {"":');
+  RegExp regexp = new RegExp(r'\$.A = {\n "super"');
   Iterator<Match> matches = regexp.allMatches(generated).iterator();
   checkNumberOfMatches(matches, 1);
 }
diff --git a/tests/compiler/dart2js/resolver_test.dart b/tests/compiler/dart2js/resolver_test.dart
index 42ae534..95e5b47 100644
--- a/tests/compiler/dart2js/resolver_test.dart
+++ b/tests/compiler/dart2js/resolver_test.dart
@@ -85,9 +85,9 @@
     visitor.visit(definition.type);
     InterfaceType type = visitor.mapping.getType(definition.type);
     Expect.equals(definition.type.typeArguments.length(),
-                  length(type.arguments));
+                  length(type.typeArguments));
     int index = 0;
-    Link<DartType> arguments = type.arguments;
+    Link<DartType> arguments = type.typeArguments;
     while (!arguments.isEmpty) {
       Expect.equals(true, index < expectedElements.length);
       Expect.equals(expectedElements[index], arguments.head.element);
diff --git a/tests/compiler/dart2js/type_substitution_test.dart b/tests/compiler/dart2js/type_substitution_test.dart
new file mode 100644
index 0000000..8c841cc
--- /dev/null
+++ b/tests/compiler/dart2js/type_substitution_test.dart
@@ -0,0 +1,183 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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 type_substitution_test;
+
+import "../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart";
+import "../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart";
+import "../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart";
+import "../../../sdk/lib/_internal/compiler/implementation/util/util.dart";
+import "compiler_helper.dart";
+import "parser_helper.dart";
+import "dart:uri";
+
+DartType getElementType(compiler, String name) {
+  var element = findElement(compiler, name);
+  Expect.isNotNull(element);
+  if (identical(element.kind, ElementKind.CLASS)) {
+    element.ensureResolved(compiler);
+  }
+  return element.computeType(compiler);
+}
+
+DartType getType(compiler, String name) {
+  var clazz = findElement(compiler, "Class");
+  clazz.ensureResolved(compiler);
+  var element = clazz.buildScope().lookup(buildSourceString(name));
+  Expect.isNotNull(element);
+  Expect.equals(element.kind, ElementKind.FUNCTION);
+  FunctionSignature signature = element.computeSignature(compiler);
+
+  // Function signatures are used to be to provide void types (only occuring as
+  // as return types) and (inlined) function types (only occuring as method
+  // parameter types).
+  //
+  // Only a single type is used from each signature. That is, it is not the
+  // intention to check the whole signatures against eachother.
+  if (signature.requiredParameterCount == 0) {
+    // If parameters is empty, use return type.
+    return signature.returnType;
+  } else {
+    // Otherwise use the first argument type.
+    return signature.requiredParameters.head.computeType(compiler);
+  }
+}
+
+int length(Link link) {
+  int count = 0;
+  while (!link.isEmpty) {
+    count++;
+    link = link.tail;
+  }
+  return count;
+}
+
+/**
+ * Test that substitution of [parameters] by [arguments] in the type found
+ * through [name1] is the same as the type found through [name2].
+ */
+bool test(compiler, arguments, parameters,
+          String name1, String name2) {
+  DartType type1 = getType(compiler, name1);
+  DartType type2 = getType(compiler, name2);
+  DartType subst = type1.subst(arguments, parameters);
+  print('$type1.subst($arguments,$parameters)=$subst');
+  Expect.equals(type2, subst,
+      "$type1.subst($arguments,$parameters)=$subst != $type2");
+}
+
+
+void main() {
+  var uri = new Uri.fromComponents(scheme: 'source');
+  var compiler = compilerFor(
+      r"""
+      typedef void Typedef1<X,Y>(X x1, Y y2);
+      typedef void Typedef2<Z>(Z z1);
+
+      class Class<T,S> {
+        void void1() {}
+        void void2() {}
+        void dynamic1(dynamic a) {}
+        void dynamic2(dynamic b) {}
+        void int1(int a) {}
+        void int2(int a) {}
+        void String1(String a) {}
+        void String2(String a) {}
+        void ListInt1(List<int> a) {}
+        void ListInt2(List<int> b) {}
+        void ListT1(List<T> a) {}
+        void ListT2(List<int> b) {}
+        void ListS1(List<S> a) {}
+        void ListS2(List<String> b) {}
+        void ListListT1(List<List<T>> a) {}
+        void ListListT2(List<List<int>> b) {}
+        void ListRaw1(List a) {}
+        void ListRaw2(List b) {}
+        void ListDynamic1(List<dynamic> a) {}
+        void ListDynamic2(List<dynamic> b) {}
+        void MapIntString1(Map<T,S> a) {}
+        void MapIntString2(Map<int,String> b) {}
+        void MapTString1(Map<T,String> a) {}
+        void MapTString2(Map<int,String> b) {}
+        void MapDynamicString1(Map<dynamic,String> a) {}
+        void MapDynamicString2(Map<dynamic,String> b) {}
+        void TypeVarT1(T t1) {}
+        void TypeVarT2(int t2) {}
+        void TypeVarS1(S s1) {}
+        void TypeVarS2(String s2) {}
+        void Function1a(int a(String s1)) {}
+        void Function2a(int b(String s2)) {}
+        void Function1b(void a(T t1, S s1)) {}
+        void Function2b(void b(int t2, String s2)) {}
+        void Function1c(void a(dynamic t1, dynamic s1)) {}
+        void Function2c(void b(dynamic t2, dynamic s2)) {}
+        void Typedef1a(Typedef1<T,S> a) {}
+        void Typedef2a(Typedef1<int,String> b) {}
+        void Typedef1b(Typedef1<dynamic,dynamic> a) {}
+        void Typedef2b(Typedef1<dynamic,dynamic> b) {}
+        void Typedef1c(Typedef1 a) {}
+        void Typedef2c(Typedef1 b) {}
+        void Typedef1d(Typedef2<T> a) {}
+        void Typedef2d(Typedef2<int> b) {}
+        void Typedef1e(Typedef2<S> a) {}
+        void Typedef2e(Typedef2<String> b) {}
+      }
+
+      void main() {}
+      """,
+      uri);
+  compiler.runCompiler(uri);
+
+  DartType Class_T_S = getElementType(compiler, "Class");
+  Expect.isNotNull(Class_T_S);
+  Expect.identical(Class_T_S.kind, TypeKind.INTERFACE);
+  Expect.equals(2, length(Class_T_S.typeArguments));
+
+  DartType T = Class_T_S.typeArguments.head;
+  Expect.isNotNull(T);
+  Expect.identical(T.kind, TypeKind.TYPE_VARIABLE);
+
+  DartType S = Class_T_S.typeArguments.tail.head;
+  Expect.isNotNull(S);
+  Expect.identical(S.kind, TypeKind.TYPE_VARIABLE);
+
+  DartType intType = getType(compiler, "int1");
+  Expect.isNotNull(intType);
+  Expect.identical(intType.kind, TypeKind.INTERFACE);
+
+  DartType StringType = getType(compiler, "String1");
+  Expect.isNotNull(StringType);
+  Expect.identical(StringType.kind, TypeKind.INTERFACE);
+
+  var parameters = new Link<DartType>.fromList(<DartType>[T, S]);
+  var arguments = new Link<DartType>.fromList(<DartType>[intType, StringType]);
+
+  // TODO(johnniwinther): Create types directly from strings to improve test
+  // readability.
+
+  test(compiler, arguments, parameters, "void1", "void2");
+  test(compiler, arguments, parameters, "dynamic1", "dynamic2");
+  test(compiler, arguments, parameters, "int1", "int2");
+  test(compiler, arguments, parameters, "String1", "String2");
+  test(compiler, arguments, parameters, "ListInt1", "ListInt2");
+  test(compiler, arguments, parameters, "ListT1", "ListT2");
+  test(compiler, arguments, parameters, "ListS1", "ListS2");
+  test(compiler, arguments, parameters, "ListListT1", "ListListT2");
+  test(compiler, arguments, parameters, "ListRaw1", "ListRaw2");
+  test(compiler, arguments, parameters, "ListDynamic1", "ListDynamic2");
+  test(compiler, arguments, parameters, "MapIntString1", "MapIntString2");
+  test(compiler, arguments, parameters, "MapTString1", "MapTString2");
+  test(compiler, arguments, parameters,
+    "MapDynamicString1", "MapDynamicString2");
+  test(compiler, arguments, parameters, "TypeVarT1", "TypeVarT2");
+  test(compiler, arguments, parameters, "TypeVarS1", "TypeVarS2");
+  test(compiler, arguments, parameters, "Function1a", "Function2a");
+  test(compiler, arguments, parameters, "Function1b", "Function2b");
+  test(compiler, arguments, parameters, "Function1c", "Function2c");
+  test(compiler, arguments, parameters, "Typedef1a", "Typedef2a");
+  test(compiler, arguments, parameters, "Typedef1b", "Typedef2b");
+  test(compiler, arguments, parameters, "Typedef1c", "Typedef2c");
+  test(compiler, arguments, parameters, "Typedef1d", "Typedef2d");
+  test(compiler, arguments, parameters, "Typedef1e", "Typedef2e");
+}
diff --git a/tests/compiler/dart2js/value_range_test.dart b/tests/compiler/dart2js/value_range_test.dart
index 3a78bdc..177eae5 100644
--- a/tests/compiler/dart2js/value_range_test.dart
+++ b/tests/compiler/dart2js/value_range_test.dart
@@ -64,7 +64,7 @@
   return a.removeLast();
 }
 """,
-KEPT,
+REMOVED, // TODO(6829): Put it back to KEPT
 
 """
 main() {
@@ -211,8 +211,7 @@
   class Object {}
   class Type {}
   class Function {}
-  interface List default ListImplementation { List([length]);}
-  class ListImplementation { factory List([length]) => null; }
+  class List { List([length]); }
   abstract class Map {}
   class Closure {}
   class Null {}
diff --git a/tests/compiler/dart2js_extra/dart2js_extra.status b/tests/compiler/dart2js_extra/dart2js_extra.status
index 4743a49..9e569d2 100644
--- a/tests/compiler/dart2js_extra/dart2js_extra.status
+++ b/tests/compiler/dart2js_extra/dart2js_extra.status
@@ -7,7 +7,6 @@
 statements_test: Fail
 typed_locals_test: Fail
 no_such_method_test: Fail # Wrong InvocationMirror.memberName.
-break_test: Fail # Complex control flow TODO(ngeoffray): investigating
 
 [ $compiler == dart2js && $checked ]
 parameter_bailout_test: Fail, OK
diff --git a/tests/compiler/dart2js_extra/first_class_types_hashcode_test.dart b/tests/compiler/dart2js_extra/first_class_types_hashcode_test.dart
new file mode 100644
index 0000000..26b5c13
--- /dev/null
+++ b/tests/compiler/dart2js_extra/first_class_types_hashcode_test.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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 Type instances work with maps. This behavior is not required by
+// the specification.
+
+class A {}
+
+class B<T> {}
+
+main() {
+  Map<Type, String> map = new Map<Type, String>();
+  Type a = new A().runtimeType;
+  Type b1 = new B<int>().runtimeType;
+  Type b2 = new B<String>().runtimeType;
+  map[a] = 'A';
+  map[b1] = 'B<int>';
+  map[b2] = 'B<String>';
+  Expect.equals('A', map[new A().runtimeType]);
+  Expect.equals('B<int>', map[new B<int>().runtimeType]);
+  Expect.equals('B<String>', map[new B<String>().runtimeType]);
+}
diff --git a/tests/compiler/dart2js_extra/hash_code_test.dart b/tests/compiler/dart2js_extra/hash_code_test.dart
index 5db341b..869c60b 100644
--- a/tests/compiler/dart2js_extra/hash_code_test.dart
+++ b/tests/compiler/dart2js_extra/hash_code_test.dart
@@ -2,10 +2,80 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// dart2js specific test to make sure String.hashCode behaves as
+// dart2js specific test to make sure hashCode on intercepted types behaves as
 // intended.
 
+
+class Hasher {
+  confuse(x) => [1, 'x', true, null, x].last;
+  hash(x) => confuse(x).hashCode;
+}
+
+// Hashing via [hash] should be forced to use the general interceptor, but the
+// local x.hashCode calls might be optimized.
+var hash = new Hasher().hash;
+
+check(value1, value2) {
+  var h1 = hash(value1);
+  var h2 = hash(value2);
+
+  Expect.isTrue(h1 is int);
+  Expect.isTrue(h2 is int);
+  Expect.isFalse(h1 == h2);
+
+  // We expect that the hash function is reasonable quality - there are some
+  // difference in the low bits.
+  Expect.isFalse((h1 & 0xf) == (h2 & 0xf));
+
+  // Quality check - the values should be SMIs for efficient arithmetic.
+  Expect.equals((h1 & 0x1fffffff), h1);
+  Expect.equals((h2 & 0x1fffffff), h2);
+}
+
+bools() {
+  check(true, false);
+
+  Expect.equals(true.hashCode, hash(true));   // First can be optimized.
+  Expect.equals(false.hashCode, hash(false));
+}
+
+ints() {
+  var i1 = 100;
+  var i2 = 101;
+  check(i1, i2);
+  Expect.equals(i1.hashCode, hash(i1));
+  Expect.equals(i2.hashCode, hash(i2));
+}
+
+lists() {
+  var list1 = [];
+  var list2 = [];
+  check(list1, list2);
+
+  Expect.equals(list1.hashCode, hash(list1));
+  Expect.equals(list2.hashCode, hash(list2));
+}
+
+strings() {
+  var str1 = 'a';
+  var str2 = 'b';
+  var str3 = 'c';
+  check(str1, str2);
+  check(str1, str3);
+  check(str2, str3);
+
+  Expect.equals(str1.hashCode, hash(str1));
+  Expect.equals(str2.hashCode, hash(str2));
+  Expect.equals(str3.hashCode, hash(str3));
+
+  Expect.equals(0xA2E9442, 'a'.hashCode);
+  Expect.equals(0x0DB819B, 'b'.hashCode);
+  Expect.equals(0xEBA5D59, 'c'.hashCode);
+}
+
 main() {
-  Expect.equals(67633152, 'a'.hashCode);
-  Expect.equals(37224448, 'b'.hashCode);
+  bools();
+  ints();
+  lists();
+  strings();
 }
diff --git a/tests/compiler/dart2js_foreign/dart2js_foreign.status b/tests/compiler/dart2js_foreign/dart2js_foreign.status
index 1b70a56..d383e88 100644
--- a/tests/compiler/dart2js_foreign/dart2js_foreign.status
+++ b/tests/compiler/dart2js_foreign/dart2js_foreign.status
@@ -32,8 +32,6 @@
 native_method_rename2_test: Fail # TODO(ahe): Convert to metadata syntax.
 native_method_rename3_test: Fail # TODO(ahe): Convert to metadata syntax.
 native_method_with_keyword_name_test: Fail # TODO(ahe): Convert to metadata syntax.
-native_missing_method1_test: Fail # TODO(ahe): Convert to metadata syntax.
-native_missing_method2_test: Fail # TODO(ahe): Convert to metadata syntax.
 native_named_constructors2_test: Fail # TODO(ahe): Convert to metadata syntax.
 native_named_constructors3_test: Fail # TODO(ahe): Convert to metadata syntax.
 native_no_such_method_exception2_test: Fail # TODO(ahe): Convert to metadata syntax.
diff --git a/tests/compiler/dart2js_native/dart2js_native.status b/tests/compiler/dart2js_native/dart2js_native.status
index bbe5431..94108e9 100644
--- a/tests/compiler/dart2js_native/dart2js_native.status
+++ b/tests/compiler/dart2js_native/dart2js_native.status
@@ -4,3 +4,6 @@
 
 [ $compiler == dartc || $browser ]
 *: Skip
+
+[ $compiler == dart2js ]
+native_null_closure_frog_test: Fail
diff --git a/tests/corelib/core_runtime_types_test.dart b/tests/corelib/core_runtime_types_test.dart
index e3d94ce..c40b781 100644
--- a/tests/corelib/core_runtime_types_test.dart
+++ b/tests/corelib/core_runtime_types_test.dart
@@ -47,7 +47,6 @@
   static assertTypeError(void f()) {
     Expect.throws(f, (exception) => (exception is TypeError) ||
                                     (exception is NoSuchMethodError) ||
-                                    (exception is NullPointerException) ||
                                     (exception is ArgumentError));
   }
 
diff --git a/tests/corelib/corelib.status b/tests/corelib/corelib.status
index 356cedf..f48942d 100644
--- a/tests/corelib/corelib.status
+++ b/tests/corelib/corelib.status
@@ -2,18 +2,22 @@
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
 
+reg_exp_unicode_2_test: Fail # Bug 6592
+
 [ $compiler == none ]
-unicode_test: Fail        # Bug 5163868
+unicode_test: Fail        # Bug 6706
 *dartc_test: Skip
 compare_to2_test: Fail    # Bug 4018
 null_test: Fail           # Bug 5511
-null_nosuchmethod_test: Fail # Bug 5518
 apply_test: Fail # Bug 5670
 apply2_test: Fail # Bug 5670
 
 [ $runtime == ff || $runtime == ie9 || $runtime == jsshell ]
 unicode_test: Fail
 
+[ $compiler == dart2js && ($runtime == chrome || $runtime == drt || $runtime == d8 || $runtime == safari) ]
+string_trim_unicode_test: Fail  # V8 bug 2408
+
 [ $runtime == opera ]
 core_runtime_types_test: Fail
 date_time7_test: Fail
@@ -25,6 +29,9 @@
 [ $runtime == safari && ($system == linux || $system == windows) ]
 *: Skip
 
+[ $runtime == vm ]
+string_trim_unicode_test: Fail  # Bug 6569
+
 [ $arch == simarm ]
 *: Skip
 
@@ -34,6 +41,7 @@
 [ $compiler == dart2js ]
 math_parse_double_test: Fail # Expect.equals(expected: <78187493520>, actual: <0>)
 math_test: Fail # issue 3333
+surrogate_pair_toUpper_test: Fail # Issue 6707
 
 # Bad test, assumes RegExp.allMatches returns a Collection.
 reg_exp_all_matches_test: Fail, OK # NoSuchMethodError : method not found: 'forEach'
@@ -44,8 +52,6 @@
 compare_to2_test: Fail, OK    # Requires bigint support.
 string_base_vm_test: Fail, OK # VM specific test.
 
-null_nosuchmethod_test: Fail # Bug 5513
-
 [ $compiler == dart2js && $runtime == none ]
 *: Fail, Pass # TODO(ahe): Triage these tests.
 
@@ -61,7 +67,6 @@
 apply_test: Fail # inherited from VM
 apply2_test: Fail # inherited from VM
 compare_to2_test: Fail # inherited from VM
-null_nosuchmethod_test: Fail # inherited from VM
 null_test: Fail # inherited from VM
 unicode_test: Fail # inherited from VM
 
diff --git a/tests/corelib/expando_test.dart b/tests/corelib/expando_test.dart
index 318c630..c6b65d8 100644
--- a/tests/corelib/expando_test.dart
+++ b/tests/corelib/expando_test.dart
@@ -62,7 +62,7 @@
   static testIllegal() {
     Expando<int> expando = new Expando<int>();
     Expect.throws(() => expando[null], (exception)
-                  => exception is NullPointerException);
+                  => exception is ArgumentError);
     Expect.throws(() => expando['string'], (exception)
                   => exception is ArgumentError);
     Expect.throws(() => expando['string'], (exception)
diff --git a/tests/corelib/future_test.dart b/tests/corelib/future_test.dart
index 9ed1db5..1916ddd 100644
--- a/tests/corelib/future_test.dart
+++ b/tests/corelib/future_test.dart
@@ -565,6 +565,92 @@
   Expect.equals("transformed value", transformedFuture.value);
 }
 
+// Tests for branching exceptions
+
+testExceptionTravelsAlongBothBranches() {
+  var results = <int>[];
+
+  var completer = new Completer();
+  var branch1 = completer.future.transform((_) => null);
+  var branch2 = completer.future.transform((_) => null);
+
+  branch1.handleException((e) {
+    results.add(1);
+    return true;
+  });
+
+  branch2.handleException((e) {
+    results.add(2);
+    return true;
+  });
+
+  completer.completeException("error");
+  Expect.setEquals([1, 2], results);
+}
+
+testExceptionTravelsAlongBothBranchesAfterComplete() {
+  var results = <int>[];
+
+  var completer = new Completer();
+  completer.completeException("error");
+
+  var branch1 = completer.future.transform((_) => null);
+  var branch2 = completer.future.transform((_) => null);
+
+  branch1.handleException((e) {
+    results.add(1);
+    return true;
+  });
+
+  branch2.handleException((e) {
+    results.add(2);
+    return true;
+  });
+
+  Expect.setEquals([1, 2], results);
+}
+
+testExceptionIsHandledInBaseAndBranch() {
+  var results = <String>[];
+
+  var completer = new Completer();
+  var branch = completer.future.transform((_) => null);
+
+  completer.future.handleException((e) {
+    results.add("base");
+    return true;
+  });
+
+  branch.handleException((e) {
+    results.add("branch");
+    return true;
+  });
+
+  completer.completeException("error");
+  Expect.setEquals(["base", "branch"], results);
+}
+
+testExceptionIsHandledInBaseAndBranchAfterComplete() {
+  var results = <String>[];
+
+  var completer = new Completer();
+  completer.completeException("error");
+
+  var branch = completer.future.transform((_) => null);
+
+  completer.future.handleException((e) {
+    results.add("base");
+    return true;
+  });
+
+  branch.handleException((e) {
+    results.add("branch");
+    return true;
+  });
+
+  Expect.setEquals(["base", "branch"], results);
+}
+
 main() {
   testImmediate();
   testNeverComplete();
@@ -605,4 +691,8 @@
   testTransformExceptionThrows();
   testTransformExceptionReturns();
   testTransformExceptionReturnsAFuture();
+  testExceptionTravelsAlongBothBranches();
+  testExceptionTravelsAlongBothBranchesAfterComplete();
+  testExceptionIsHandledInBaseAndBranch();
+  testExceptionIsHandledInBaseAndBranchAfterComplete();
 }
diff --git a/tests/corelib/list_first_test.dart b/tests/corelib/list_first_test.dart
new file mode 100644
index 0000000..cdd718b
--- /dev/null
+++ b/tests/corelib/list_first_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.
+
+void test(List list) {
+  if (list.isEmpty) {
+    Expect.throws(() => list.first, (e) => e is RangeError);
+  } else {
+    Expect.equals(list[0], list.first);
+  }
+}
+
+main() {
+  test([1, 2, 3]);
+  test(const ["foo", "bar"]);
+  test([]);
+  test(const []);
+}
diff --git a/tests/corelib/null_nosuchmethod_test.dart b/tests/corelib/null_nosuchmethod_test.dart
index 2d6514c..7ae7540 100644
--- a/tests/corelib/null_nosuchmethod_test.dart
+++ b/tests/corelib/null_nosuchmethod_test.dart
@@ -8,15 +8,15 @@
   var x;
   // Non-existing method calls noSuchMethod.
   Expect.throws(() => x.foo(),
-                (e) => e is NullPointerException);
+                (e) => e is NoSuchMethodError);
 
   // Calling noSuchMethod directly.
   Expect.throws(() => x.noSuchMethod("foo", []),
-                (e) => e is NullPointerException);
+                (e) => e is NoSuchMethodError);
 
   // Closurizing noSuchMethod and calling it.
   var nsm = x.noSuchMethod;
   Expect.notEquals(null, nsm);
   Expect.throws(() => nsm("foo", []),
-                (e) => e is NullPointerException);
+                (e) => e is NoSuchMethodError);
 }
diff --git a/tests/corelib/reg_exp4_test.dart b/tests/corelib/reg_exp4_test.dart
index 41d8f50..bef3397 100644
--- a/tests/corelib/reg_exp4_test.dart
+++ b/tests/corelib/reg_exp4_test.dart
@@ -6,42 +6,42 @@
 main() {
   try {
     RegExp ex = new RegExp(null);
-    Expect.fail("Expected: NullPointerException got: no exception");
-  } on Exception catch (ex) {
-    if (!(ex is NullPointerException)) {
-      Expect.fail("Expected: NullPointerException got: ${ex}");
+    Expect.fail("Expected: ArgumentError got: no exception");
+  } catch (ex) {
+    if (!(ex is ArgumentError)) {
+      Expect.fail("Expected: ArgumentError got: ${ex}");
     }
   }
   try {
     new RegExp(r"^\w+$").hasMatch(null);
-    Expect.fail("Expected: NullPointerException got: no exception");
-  } on Exception catch (ex) {
-    if (!(ex is NullPointerException)) {
-      Expect.fail("Expected: NullPointerException got: ${ex}");
+    Expect.fail("Expected: ArgumentError got: no exception");
+  } catch (ex) {
+    if (!(ex is ArgumentError)) {
+      Expect.fail("Expected: ArgumentError got: ${ex}");
     }
   }
   try {
     new RegExp(r"^\w+$").firstMatch(null);
-    Expect.fail("Expected: NullPointerException got: no exception");
-  } on Exception catch (ex) {
-    if (!(ex is NullPointerException)) {
-      Expect.fail("Expected: NullPointerException got: ${ex}");
+    Expect.fail("Expected: ArgumentError got: no exception");
+  } catch (ex) {
+    if (!(ex is ArgumentError)) {
+      Expect.fail("Expected: ArgumentError got: ${ex}");
     }
   }
   try {
     new RegExp(r"^\w+$").allMatches(null);
-    Expect.fail("Expected: NullPointerException got: no exception");
-  } on Exception catch (ex) {
-    if (!(ex is NullPointerException)) {
-      Expect.fail("Expected: NullPointerException got: ${ex}");
+    Expect.fail("Expected: ArgumentError got: no exception");
+  } catch (ex) {
+    if (!(ex is ArgumentError)) {
+      Expect.fail("Expected: ArgumentError got: ${ex}");
     }
   }
   try {
     new RegExp(r"^\w+$").stringMatch(null);
-    Expect.fail("Expected: NullPointerException got: no exception");
-  } on Exception catch (ex) {
-    if (!(ex is NullPointerException)) {
-      Expect.fail("Expected: NullPointerException got: ${ex}");
+    Expect.fail("Expected: ArgumentError got: no exception");
+  } catch (ex) {
+    if (!(ex is ArgumentError)) {
+      Expect.fail("Expected: ArgumentError got: ${ex}");
     }
   }
 }
diff --git a/tests/corelib/reg_exp5_test.dart b/tests/corelib/reg_exp5_test.dart
index 17217a8..56002ca 100644
--- a/tests/corelib/reg_exp5_test.dart
+++ b/tests/corelib/reg_exp5_test.dart
@@ -7,9 +7,9 @@
   String str = "";
   try {
     RegExp ex = new RegExp(str);
-  } on Exception catch (e) {
-    if (!(e is NullPointerException)) {
-      Expect.fail("Expected: NullPointerException got: ${e}");
+  } catch (e) {
+    if (!(e is ArgumentError)) {
+      Expect.fail("Expected: ArgumentError got: ${e}");
     }
   }
   Expect.isFalse(new RegExp(r"^\w+$").hasMatch(str));
diff --git a/tests/corelib/safe_to_string_test.dart b/tests/corelib/safe_to_string_test.dart
index 70d6624..dd80be1 100644
--- a/tests/corelib/safe_to_string_test.dart
+++ b/tests/corelib/safe_to_string_test.dart
@@ -3,19 +3,19 @@
 // BSD-style license that can be found in the LICENSE file.
 
 main() {
-  Expect.stringEquals('1', NoSuchMethodError.safeToString(1));
-  Expect.stringEquals('0.5', NoSuchMethodError.safeToString(0.5));
-  Expect.stringEquals('"1"', NoSuchMethodError.safeToString("1"));
-  Expect.stringEquals('"\'"', NoSuchMethodError.safeToString("'"));
-  Expect.stringEquals('"\'\'"', NoSuchMethodError.safeToString("''"));
-  Expect.stringEquals(r'"\""', NoSuchMethodError.safeToString('"'));
-  Expect.stringEquals(r'"\"\""', NoSuchMethodError.safeToString('""'));
+  Expect.stringEquals('1', Error.safeToString(1));
+  Expect.stringEquals('0.5', Error.safeToString(0.5));
+  Expect.stringEquals('"1"', Error.safeToString("1"));
+  Expect.stringEquals('"\'"', Error.safeToString("'"));
+  Expect.stringEquals('"\'\'"', Error.safeToString("''"));
+  Expect.stringEquals(r'"\""', Error.safeToString('"'));
+  Expect.stringEquals(r'"\"\""', Error.safeToString('""'));
 
-  Expect.stringEquals(r'"\\\"\n\r"', NoSuchMethodError.safeToString('\\"\n\r'));
+  Expect.stringEquals(r'"\\\"\n\r"', Error.safeToString('\\"\n\r'));
 
-  Expect.stringEquals('null', NoSuchMethodError.safeToString(null));
-  Expect.stringEquals('true', NoSuchMethodError.safeToString(true));
-  Expect.stringEquals('false', NoSuchMethodError.safeToString(false));
+  Expect.stringEquals('null', Error.safeToString(null));
+  Expect.stringEquals('true', Error.safeToString(true));
+  Expect.stringEquals('false', Error.safeToString(false));
   Expect.stringEquals("Instance of 'Object'",
-                      NoSuchMethodError.safeToString(new Object()));
+                      Error.safeToString(new Object()));
 }
diff --git a/tests/corelib/string_from_list_test.dart b/tests/corelib/string_from_list_test.dart
index acd0f5c..ec43592 100644
--- a/tests/corelib/string_from_list_test.dart
+++ b/tests/corelib/string_from_list_test.dart
@@ -9,11 +9,16 @@
     Expect.equals("", new String.fromCharCodes(const []));
     Expect.equals("AB", new String.fromCharCodes([65, 66]));
     Expect.equals("AB", new String.fromCharCodes(const [65, 66]));
+    Expect.equals("Ærø", new String.fromCharCodes(const [0xc6, 0x72, 0xf8]));
+    Expect.equals("\u{1234}", new String.fromCharCodes([0x1234]));
+    Expect.equals("\u{12345}*", new String.fromCharCodes([0x12345, 42]));
     Expect.equals("", new String.fromCharCodes(new List()));
-    var a = new List();
-    a.add(65);
-    a.add(66);
-    Expect.equals("AB", new String.fromCharCodes(a));
+    {
+      var a = new List();
+      a.add(65);
+      a.add(66);
+      Expect.equals("AB", new String.fromCharCodes(a));
+    }
   }
 }
 
diff --git a/tests/corelib/string_test.dart b/tests/corelib/string_test.dart
index a5ba35b..1518181 100644
--- a/tests/corelib/string_test.dart
+++ b/tests/corelib/string_test.dart
@@ -193,6 +193,8 @@
     Expect.equals(5, "strstr".lastIndexOf("r", 5));
     Expect.equals(2, "strstr".lastIndexOf("r", 4));
     Expect.equals(2, "strstr".lastIndexOf("r", 3));
+    Expect.equals(5, "strstr".lastIndexOf("r"));
+    Expect.equals(5, "strstr".lastIndexOf("r"), null);
 
     String str = "hello";
     for (int i = 0; i < 10; i++) {
diff --git a/tests/html/cssstyledeclaration_test.dart b/tests/html/cssstyledeclaration_test.dart
index 3822e07..1383561 100644
--- a/tests/html/cssstyledeclaration_test.dart
+++ b/tests/html/cssstyledeclaration_test.dart
@@ -49,7 +49,7 @@
   test('CSS property empty getters and setters', () {
     var style = createTestStyle();
     expect(style.border, equals(""));
-    
+
     style.border = "1px solid blue";
     style.border = "";
     expect(style.border, equals(""));
@@ -70,7 +70,7 @@
   test('Browser prefixes', () {
     var element = new DivElement();
     element.style.transform = 'translateX(10px)';
-    document.body.elements.add(element);
+    document.body.children.add(element);
 
     element.getComputedStyle('').then(expectAsync1(
       (CSSStyleDeclaration style) {
@@ -84,7 +84,7 @@
   // IE9 requires an extra poke for some properties to get applied.
   test('IE9 Invalidation', () {
     var element = new DivElement();
-    document.body.elements.add(element);
+    document.body.children.add(element);
 
     // Need to wait one tick after the element has been added to the page.
     window.setTimeout(expectAsync0(() {
diff --git a/tests/html/documentfragment_test.dart b/tests/html/documentfragment_test.dart
index 71b92c4..cd47c38 100644
--- a/tests/html/documentfragment_test.dart
+++ b/tests/html/documentfragment_test.dart
@@ -60,23 +60,23 @@
   group('constructors', () {
     test('0-argument makes an empty fragment', () {
       final fragment = new DocumentFragment();
-      expect(fragment.elements, equals([]));
+      expect(fragment.children, equals([]));
     });
 
     test('.html parses input as HTML', () {
       final fragment = new DocumentFragment.html('<a>foo</a>');
-      expect(fragment.elements[0], isAnchorElement);
+      expect(fragment.children[0], isAnchorElement);
     });
 
     // test('.svg parses input as SVG', () {
     //   final fragment = new DocumentFragment.svg('<a>foo</a>');
-    //   expect(fragment.elements[0] is SVGAElement, isTrue);
+    //   expect(fragment.children[0] is SVGAElement, isTrue);
     // });
 
     // TODO(nweiz): enable this once XML is ported.
     // test('.xml parses input as XML', () {
     //   final fragment = new DocumentFragment.xml('<a>foo</a>');
-    //   expect(fragment.elements[0] is XMLElement, isTrue);
+    //   expect(fragment.children[0] is XMLElement, isTrue);
     // });
   });
 
@@ -104,13 +104,13 @@
     expectUnsupported(() => emptyFragment.webkitRegionOverflow = "foo");
   });
 
-  group('elements', () {
+  group('children', () {
     var fragment;
-    var elements;
+    var children;
 
     init() {
       fragment = new DocumentFragment();
-      elements = fragment.elements;
+      children = fragment.children;
       fragment.nodes.addAll(
         [new Text("1"), new Element.tag("A"), new Element.tag("B"),
          new Text("2"), new Element.tag("I"), new Text("3"),
@@ -118,66 +118,66 @@
     };
 
     test('is initially empty', () {
-      elements = new DocumentFragment().elements;
-      expect(elements, equals([]));
-      expect(elements.isEmpty, isTrue);
+      children = new DocumentFragment().children;
+      expect(children, equals([]));
+      expect(children.isEmpty, isTrue);
     });
 
     test('filters out non-element nodes', () {
       init();
       expect(_nodeStrings(fragment.nodes),
           orderedEquals(["1", "A", "B", "2", "I", "3", "U"]));
-      expect(_nodeStrings(elements),
+      expect(_nodeStrings(children),
           orderedEquals(["A", "B", "I", "U"]));
     });
 
-    test('only indexes elements, not other nodes', () {
+    test('only indexes children, not other nodes', () {
       init();
-      elements[1] = new Element.tag("BR");
+      children[1] = new Element.tag("BR");
       expect(_nodeStrings(fragment.nodes),
           orderedEquals(["1", "A", "BR", "2", "I", "3", "U"]));
-      expect(_nodeStrings(elements),
+      expect(_nodeStrings(children),
           orderedEquals(["A", "BR", "I", "U"]));
     });
 
-    test('adds to both elements and nodes', () {
+    test('adds to both children and nodes', () {
       init();
-      elements.add(new Element.tag("UL"));
+      children.add(new Element.tag("UL"));
       expect(_nodeStrings(fragment.nodes),
           orderedEquals(["1", "A", "B", "2", "I", "3", "U", "UL"]));
-      expect(_nodeStrings(elements),
+      expect(_nodeStrings(children),
           orderedEquals(["A", "B", "I", "U", "UL"]));
     });
 
-    test('removes only elements, from both elements and nodes', () {
+    test('removes only children, from both children and nodes', () {
       init();
-      expect(elements.removeLast().tagName, equals('U'));
+      expect(children.removeLast().tagName, equals('U'));
       expect(_nodeStrings(fragment.nodes),
           orderedEquals(["1", "A", "B", "2", "I", "3"]));
-      expect(_nodeStrings(elements),
+      expect(_nodeStrings(children),
           orderedEquals(["A", "B", "I"]));
 
-      expect(elements.removeLast().tagName, "I");
-      expect(_nodeStrings(fragment.nodes), 
+      expect(children.removeLast().tagName, "I");
+      expect(_nodeStrings(fragment.nodes),
           equals(["1", "A", "B", "2", "3"]));
-      expect(_nodeStrings(elements), equals(["A", "B"]));
+      expect(_nodeStrings(children), equals(["A", "B"]));
     });
 
     test('accessors are wrapped', () {
       init();
-      expect(elements[0].tagName, "A");
-      expect(_nodeStrings(elements.filter((e) => e.tagName == "I")), ["I"]);
-      expect(elements.every((e) => e is Element), isTrue);
-      expect(elements.some((e) => e.tagName == "U"), isTrue);
-      expect(elements.isEmpty, isFalse);
-      expect(elements.length, 4);
-      expect(elements[2].tagName, "I");
-      expect(elements.last.tagName, "U");
+      expect(children[0].tagName, "A");
+      expect(_nodeStrings(children.filter((e) => e.tagName == "I")), ["I"]);
+      expect(children.every((e) => e is Element), isTrue);
+      expect(children.some((e) => e.tagName == "U"), isTrue);
+      expect(children.isEmpty, isFalse);
+      expect(children.length, 4);
+      expect(children[2].tagName, "I");
+      expect(children.last.tagName, "U");
     });
 
-    test('setting elements overwrites nodes as well', () {
+    test('setting children overwrites nodes as well', () {
       init();
-      fragment.elements = [new Element.tag("DIV"), new Element.tag("HEAD")];
+      fragment.children = [new Element.tag("DIV"), new Element.tag("HEAD")];
       expect(_nodeStrings(fragment.nodes), equals(["DIV", "HEAD"]));
     });
   });
diff --git a/tests/html/element_add_test.dart b/tests/html/element_add_test.dart
index 4156ca5..ef911fdd 100644
--- a/tests/html/element_add_test.dart
+++ b/tests/html/element_add_test.dart
@@ -22,22 +22,22 @@
     test('htmlelement', () {
       var el = new DivElement();
       el.addHtml('<span></span>');
-      expect(el.elements.length, equals(1));
-      var span = el.elements[0];
+      expect(el.children.length, equals(1));
+      var span = el.children[0];
       expect(span, isSpanElement);
 
       el.addHtml('<div></div>');
-      expect(el.elements.length, equals(2));
+      expect(el.children.length, equals(2));
       // Validate that the first item is still first.
-      expect(el.elements[0], equals(span));
-      expect(el.elements[1], isDivElement);
+      expect(el.children[0], equals(span));
+      expect(el.children[1], isDivElement);
     });
 
     test('documentFragment', () {
       var fragment = new DocumentFragment();
       fragment.addHtml('<span>something</span>');
-      expect(fragment.elements.length, equals(1));
-      expect(fragment.elements[0], isSpanElement);
+      expect(fragment.children.length, equals(1));
+      expect(fragment.children[0], isSpanElement);
     });
   });
 
@@ -45,8 +45,8 @@
     test('htmlelement', () {
       var el = new DivElement();
       el.addText('foo');
-      // No elements were created.
-      expect(el.elements.length, equals(0));
+      // No children were created.
+      expect(el.children.length, equals(0));
       // One text node was added.
       expect(el.nodes.length, equals(1));
     });
@@ -54,8 +54,8 @@
     test('documentFragment', () {
       var fragment = new DocumentFragment();
       fragment.addText('foo');
-      // No elements were created.
-      expect(fragment.elements.length, equals(0));
+      // No children were created.
+      expect(fragment.children.length, equals(0));
       // One text node was added.
       expect(fragment.nodes.length, equals(1));
     });
@@ -66,48 +66,48 @@
       var parent = new DivElement();
       var child = new DivElement();
       var newChild = new SpanElement();
-      parent.elements.add(child);
+      parent.children.add(child);
 
       child.insertAdjacentElement('beforebegin', newChild);
 
-      expect(parent.elements.length, 2);
-      expect(parent.elements[0], isSpanElement);
+      expect(parent.children.length, 2);
+      expect(parent.children[0], isSpanElement);
     });
 
     test('afterend', () {
       var parent = new DivElement();
       var child = new DivElement();
       var newChild = new SpanElement();
-      parent.elements.add(child);
+      parent.children.add(child);
 
       child.insertAdjacentElement('afterend', newChild);
 
-      expect(parent.elements.length, 2);
-      expect(parent.elements[1], isSpanElement);
+      expect(parent.children.length, 2);
+      expect(parent.children[1], isSpanElement);
     });
 
     test('afterbegin', () {
       var parent = new DivElement();
       var child = new DivElement();
       var newChild = new SpanElement();
-      parent.elements.add(child);
+      parent.children.add(child);
 
       parent.insertAdjacentElement('afterbegin', newChild);
 
-      expect(parent.elements.length, 2);
-      expect(parent.elements[0], isSpanElement);
+      expect(parent.children.length, 2);
+      expect(parent.children[0], isSpanElement);
     });
 
     test('beforeend', () {
       var parent = new DivElement();
       var child = new DivElement();
       var newChild = new SpanElement();
-      parent.elements.add(child);
+      parent.children.add(child);
 
       parent.insertAdjacentElement('beforeend', newChild);
 
-      expect(parent.elements.length, 2);
-      expect(parent.elements[1], isSpanElement);
+      expect(parent.children.length, 2);
+      expect(parent.children[1], isSpanElement);
     });
   });
 
@@ -115,45 +115,45 @@
     test('beforebegin', () {
       var parent = new DivElement();
       var child = new DivElement();
-      parent.elements.add(child);
+      parent.children.add(child);
 
       child.insertAdjacentHTML('beforebegin', '<span></span>');
 
-      expect(parent.elements.length, 2);
-      expect(parent.elements[0], isSpanElement);
+      expect(parent.children.length, 2);
+      expect(parent.children[0], isSpanElement);
     });
 
     test('afterend', () {
       var parent = new DivElement();
       var child = new DivElement();
-      parent.elements.add(child);
+      parent.children.add(child);
 
       child.insertAdjacentHTML('afterend', '<span></span>');
 
-      expect(parent.elements.length, 2);
-      expect(parent.elements[1], isSpanElement);
+      expect(parent.children.length, 2);
+      expect(parent.children[1], isSpanElement);
     });
 
     test('afterbegin', () {
       var parent = new DivElement();
       var child = new DivElement();
-      parent.elements.add(child);
+      parent.children.add(child);
 
       parent.insertAdjacentHTML('afterbegin', '<span></span>');
 
-      expect(parent.elements.length, 2);
-      expect(parent.elements[0], isSpanElement);
+      expect(parent.children.length, 2);
+      expect(parent.children[0], isSpanElement);
     });
 
     test('beforeend', () {
       var parent = new DivElement();
       var child = new DivElement();
-      parent.elements.add(child);
+      parent.children.add(child);
 
       parent.insertAdjacentHTML('beforeend', '<span></span>');
 
-      expect(parent.elements.length, 2);
-      expect(parent.elements[1], isSpanElement);
+      expect(parent.children.length, 2);
+      expect(parent.children[1], isSpanElement);
     });
   });
 
@@ -161,7 +161,7 @@
     test('beforebegin', () {
       var parent = new DivElement();
       var child = new DivElement();
-      parent.elements.add(child);
+      parent.children.add(child);
 
       child.insertAdjacentText('beforebegin', 'test');
 
@@ -172,7 +172,7 @@
     test('afterend', () {
       var parent = new DivElement();
       var child = new DivElement();
-      parent.elements.add(child);
+      parent.children.add(child);
 
       child.insertAdjacentText('afterend', 'test');
 
@@ -183,7 +183,7 @@
     test('afterbegin', () {
       var parent = new DivElement();
       var child = new DivElement();
-      parent.elements.add(child);
+      parent.children.add(child);
 
       parent.insertAdjacentText('afterbegin', 'test');
 
@@ -194,7 +194,7 @@
     test('beforeend', () {
       var parent = new DivElement();
       var child = new DivElement();
-      parent.elements.add(child);
+      parent.children.add(child);
 
       parent.insertAdjacentText('beforeend', 'test');
 
diff --git a/tests/html/element_test.dart b/tests/html/element_test.dart
index a3e6acd..2a5d460 100644
--- a/tests/html/element_test.dart
+++ b/tests/html/element_test.dart
@@ -6,7 +6,7 @@
 import '../../pkg/unittest/lib/unittest.dart';
 import '../../pkg/unittest/lib/html_individual_config.dart';
 import 'dart:html';
-import 'dart:svg';
+import 'dart:svg' as svg;
 
 expectLargeRect(ClientRect rect) {
   expect(rect.top, 0);
@@ -90,8 +90,8 @@
     final element = new Element.tag("div");
     element.style.width = '200px';
     element.style.height = '200px';
-    container.elements.add(element);
-    document.body.elements.add(container);
+    container.children.add(element);
+    document.body.children.add(container);
 
     expect(element.clientWidth, greaterThan(100));
     expect(element.clientHeight, greaterThan(100));
@@ -149,7 +149,7 @@
         '<thead><tr><td>foo</td></tr></thead>', 'foo',
         (element) => element is TableSectionElement));
   });
-    
+
   group('constructors', () {
     test('error', () {
       expect(() => new Element.html('<br/><br/>'), throwsArgumentError);
@@ -283,7 +283,7 @@
     //     '<someunknown>foo</someunknown>', 'foo',
     //     (element) => element is UnknownElement));
   });
-  
+
   group('eventListening', () {
     test('eventListeners', () {
       final element = new Element.tag('div');
@@ -466,47 +466,47 @@
       });
   });
 
-  group('elements', () {
+  group('children', () {
     test('is a subset of nodes', () {
       var el = new Element.html("<div>Foo<br/><img/></div>");
       expect(el.nodes.length, 3);
-      expect(el.elements.length, 2);
-      expect(el.nodes[1], el.elements[0]);
-      expect(el.nodes[2], el.elements[1]);
+      expect(el.children.length, 2);
+      expect(el.nodes[1], el.children[0]);
+      expect(el.nodes[2], el.children[1]);
     });
 
     test('changes when an element is added to nodes', () {
       var el = new Element.html("<div>Foo<br/><img/></div>");
       el.nodes.add(new Element.tag('hr'));
-      expect(el.elements.length, 3);
-      expect(el.elements[2], isHRElement);
-      expect(el.nodes[3], el.elements[2]);
+      expect(el.children.length, 3);
+      expect(el.children[2], isHRElement);
+      expect(el.nodes[3], el.children[2]);
     });
 
     test('changes nodes when an element is added', () {
       var el = new Element.html("<div>Foo<br/><img/></div>");
-      el.elements.add(new Element.tag('hr'));
+      el.children.add(new Element.tag('hr'));
       expect(el.nodes.length, 4);
       expect(el.nodes[3], isHRElement);
-      expect(el.elements[2], el.nodes[3]);
+      expect(el.children[2], el.nodes[3]);
     });
 
     test('last', () {
       var el = makeElementWithChildren();
-      expect(el.elements.last, isInputElement);
+      expect(el.children.last, isInputElement);
     });
 
     test('forEach', () {
       var els = [];
       var el = makeElementWithChildren();
-      el.elements.forEach((n) => els.add(n));
+      el.children.forEach((n) => els.add(n));
       expect(els[0], isBRElement);
       expect(els[1], isImageElement);
       expect(els[2], isInputElement);
     });
 
     test('filter', () {
-      var filtered = makeElementWithChildren().elements.
+      var filtered = makeElementWithChildren().children.
         filter((n) => n is ImageElement);
       expect(1, filtered.length);
       expect(filtered[0], isImageElement);
@@ -515,57 +515,57 @@
 
     test('every', () {
       var el = makeElementWithChildren();
-      expect(el.elements.every((n) => n is Element), isTrue);
-      expect(el.elements.every((n) => n is InputElement), isFalse);
+      expect(el.children.every((n) => n is Element), isTrue);
+      expect(el.children.every((n) => n is InputElement), isFalse);
     });
 
     test('some', () {
       var el = makeElementWithChildren();
-      expect(el.elements.some((n) => n is InputElement), isTrue);
-      expect(el.elements.some((n) => n is SVGElement), isFalse);
+      expect(el.children.some((n) => n is InputElement), isTrue);
+      expect(el.children.some((n) => n is svg.SvgElement), isFalse);
     });
 
     test('isEmpty', () {
-      expect(makeElement().elements.isEmpty, isTrue);
-      expect(makeElementWithChildren().elements.isEmpty, isFalse);
+      expect(makeElement().children.isEmpty, isTrue);
+      expect(makeElementWithChildren().children.isEmpty, isFalse);
     });
 
     test('length', () {
-      expect(makeElement().elements.length, 0);
-      expect(makeElementWithChildren().elements.length, 3);
+      expect(makeElement().children.length, 0);
+      expect(makeElementWithChildren().children.length, 3);
     });
 
     test('[]', () {
       var el = makeElementWithChildren();
-      expect(el.elements[0], isBRElement);
-      expect(el.elements[1], isImageElement);
-      expect(el.elements[2], isInputElement);
+      expect(el.children[0], isBRElement);
+      expect(el.children[1], isImageElement);
+      expect(el.children[2], isInputElement);
     });
 
     test('[]=', () {
       var el = makeElementWithChildren();
-      el.elements[1] = new Element.tag('hr');
-      expect(el.elements[0], isBRElement);
-      expect(el.elements[1], isHRElement);
-      expect(el.elements[2], isInputElement);
+      el.children[1] = new Element.tag('hr');
+      expect(el.children[0], isBRElement);
+      expect(el.children[1], isHRElement);
+      expect(el.children[2], isInputElement);
     });
 
     test('add', () {
       var el = makeElement();
-      el.elements.add(new Element.tag('hr'));
-      expect(el.elements.last, isHRElement);
+      el.children.add(new Element.tag('hr'));
+      expect(el.children.last, isHRElement);
     });
 
     test('addLast', () {
       var el = makeElement();
-      el.elements.addLast(new Element.tag('hr'));
-      expect(el.elements.last, isHRElement);
+      el.children.addLast(new Element.tag('hr'));
+      expect(el.children.last, isHRElement);
     });
 
     test('iterator', () {
       var els = [];
       var el = makeElementWithChildren();
-      for (var subel in el.elements) {
+      for (var subel in el.children) {
         els.add(subel);
       }
       expect(els[0], isBRElement);
@@ -575,36 +575,36 @@
 
     test('addAll', () {
       var el = makeElementWithChildren();
-      el.elements.addAll([
+      el.children.addAll([
         new Element.tag('span'),
         new Element.tag('a'),
         new Element.tag('h1')
       ]);
-      expect(el.elements[0], isBRElement);
-      expect(el.elements[1], isImageElement);
-      expect(el.elements[2], isInputElement);
-      expect(el.elements[3], isSpanElement);
-      expect(el.elements[4], isAnchorElement);
-      expect(el.elements[5], isHeadingElement);
+      expect(el.children[0], isBRElement);
+      expect(el.children[1], isImageElement);
+      expect(el.children[2], isInputElement);
+      expect(el.children[3], isSpanElement);
+      expect(el.children[4], isAnchorElement);
+      expect(el.children[5], isHeadingElement);
     });
 
     test('clear', () {
       var el = makeElementWithChildren();
-      el.elements.clear();
-      expect(el.elements, equals([]));
+      el.children.clear();
+      expect(el.children, equals([]));
     });
 
     test('removeLast', () {
       var el = makeElementWithChildren();
-      expect(el.elements.removeLast(), isInputElement);
-      expect(el.elements.length, 2);
-      expect(el.elements.removeLast(), isImageElement);
-      expect(el.elements.length, 1);
+      expect(el.children.removeLast(), isInputElement);
+      expect(el.children.length, 2);
+      expect(el.children.removeLast(), isImageElement);
+      expect(el.children.length, 1);
     });
 
     test('getRange', () {
       var el = makeElementWithChildren();
-      expect(el.elements.getRange(1, 1), isElementList);
+      expect(el.children.getRange(1, 1), isElementList);
     });
   });
 
@@ -664,7 +664,7 @@
     test('some', () {
       var el = getQueryAll();
       expect(el.some((n) => n is SpanElement), isTrue);
-      expect(el.some((n) => n is SVGElement), isFalse);
+      expect(el.some((n) => n is svg.SvgElement), isFalse);
     });
 
     test('isEmpty', () {
@@ -725,7 +725,7 @@
   });
 
   group('_ElementList', () {
-    List<Element> makeElList() => makeElementWithChildren().elements;
+    List<Element> makeElList() => makeElementWithChildren().children;
 
     test('filter', () {
       var filtered = makeElList().filter((n) => n is ImageElement);
diff --git a/tests/html/hidden_dom_1_test.dart b/tests/html/hidden_dom_1_test.dart
index 318bf4b..b2a51bd 100644
--- a/tests/html/hidden_dom_1_test.dart
+++ b/tests/html/hidden_dom_1_test.dart
@@ -10,7 +10,7 @@
   useHtmlConfiguration();
 
   test('test1', () {
-    document.body.elements.add(new Element.html(r'''
+    document.body.children.add(new Element.html(r'''
 <div id='div1'>
 Hello World!
 </div>'''));
diff --git a/tests/html/hidden_dom_2_test.dart b/tests/html/hidden_dom_2_test.dart
index a2cb124..1c1bad5 100644
--- a/tests/html/hidden_dom_2_test.dart
+++ b/tests/html/hidden_dom_2_test.dart
@@ -10,7 +10,7 @@
   useHtmlConfiguration();
 
   test('test1', () {
-    document.body.elements.add(new Element.html(r'''
+    document.body.children.add(new Element.html(r'''
 <div id='div1'>
 Hello World!
 </div>'''));
diff --git a/tests/html/html.status b/tests/html/html.status
index f49b807..49e137f 100644
--- a/tests/html/html.status
+++ b/tests/html/html.status
@@ -77,8 +77,6 @@
 inner_frame_test: Skip
 isolates_test: Skip
 js_interop_2_test: Fail
-js_interop_3_test: Fail
-js_interop_4_test: Fail
 localstorage_test: Fail
 measurement_test: Fail, Pass
 messageevent_test: Fail
@@ -137,8 +135,6 @@
 indexeddb_3_test: Fail
 indexeddb_4_test: Fail
 js_interop_2_test: Fail
-js_interop_3_test: Fail
-js_interop_4_test: Fail
 messageevent_test: Fail
 mutationobserver_test: Fail
 postmessage_structured_test: Skip   # BUG(5685): times out.
@@ -183,11 +179,13 @@
 datalistelement_test: Pass,Fail
 document_test: Fail
 dom_constructors_test: Fail
+element_test/additionalConstructors: Fail
 element_test/attributes: Fail, Crash
+element_test/constructors: Fail
 element_test/elements: Crash
 element_test/eventListening: Fail
 element_test/_ElementList: Fail, Crash
-element_test/queryAll: Crash
+element_test/queryAll: Fail, Crash
 element_add_test: Fail
 element_constructor_1_test: Fail
 element_webkit_test: Fail
@@ -199,10 +197,11 @@
 serialized_script_value_test: Fail
 svgelement2_test: Fail
 svgelement_test/constructors: Crash
+svgelement_test/css: Crash
 svgelement_test/additionalConstructors: Fail
 svgelement_test/elementget: Fail
 svgelement_test/elementset: Fail
-svgelement_test/innerHTML: Crash
+svgelement_test/innerHTML: Crash, Fail
 svgelement_test/outerHTML: Fail
 svgelement_test/svg: Fail
 url_test: Fail
diff --git a/tests/html/htmlcollection_test.dart b/tests/html/htmlcollection_test.dart
index 32a31d9..ad993ff 100644
--- a/tests/html/htmlcollection_test.dart
+++ b/tests/html/htmlcollection_test.dart
@@ -38,7 +38,7 @@
     Element root = insertTestDiv();
 
     List<Element> eachChecked =
-        document.query('#allChecked').elements;
+        document.query('#allChecked').children;
 
     expect(eachChecked, isList);
 
@@ -48,13 +48,13 @@
     Element root = insertTestDiv();
 
     List<Element> eachChecked =
-        document.query('#allChecked').elements;
+        document.query('#allChecked').children;
 
     List<Element> someChecked =
-        document.query('#someChecked').elements;
+        document.query('#someChecked').children;
 
     List<Element> noneChecked =
-        document.query('#noneChecked').elements;
+        document.query('#noneChecked').children;
 
     expect(eachChecked.length, 4);
     expect(someChecked.length, 4);
@@ -73,13 +73,13 @@
     Element root = insertTestDiv();
 
     List<Element> eachChecked =
-        document.query('#allChecked').elements;
+        document.query('#allChecked').children;
 
     List<Element> someChecked =
-        document.query('#someChecked').elements;
+        document.query('#someChecked').children;
 
     List<Element> noneChecked =
-        document.query('#noneChecked').elements;
+        document.query('#noneChecked').children;
 
     expect(eachChecked.length, 4);
     expect(someChecked.length, 4);
@@ -98,13 +98,13 @@
     Element root = insertTestDiv();
 
     List<Element> eachChecked =
-        document.query('#allChecked').elements;
+        document.query('#allChecked').children;
 
     List<Element> someChecked =
-        document.query('#someChecked').elements;
+        document.query('#someChecked').children;
 
     List<Element> noneChecked =
-        document.query('#noneChecked').elements;
+        document.query('#noneChecked').children;
 
     expect(eachChecked.length, 4);
     expect(someChecked.length, 4);
@@ -123,10 +123,10 @@
     Element root = insertTestDiv();
 
     List<Element> someChecked =
-        document.query('#someChecked').elements;
+        document.query('#someChecked').children;
 
     List<Element> emptyDiv =
-        document.query('#emptyDiv').elements;
+        document.query('#emptyDiv').children;
 
     expect(someChecked.length, 4);
     expect(emptyDiv.length, 0);
@@ -149,13 +149,13 @@
     Element root = insertTestDiv();
 
     List<Element> eachChecked =
-        document.query('#allChecked').elements;
+        document.query('#allChecked').children;
 
     List<Element> someChecked =
-        document.query('#someChecked').elements;
+        document.query('#someChecked').children;
 
     List<Element> noneChecked =
-        document.query('#noneChecked').elements;
+        document.query('#noneChecked').children;
 
     expect(eachChecked.length, 4);
     expect(someChecked.length, 4);
@@ -183,13 +183,13 @@
     Element root = insertTestDiv();
 
     List<Element> eachChecked =
-        document.query('#allChecked').elements;
+        document.query('#allChecked').children;
 
     List<Element> someChecked =
-        document.query('#someChecked').elements;
+        document.query('#someChecked').children;
 
     List<Element> noneChecked =
-        document.query('#noneChecked').elements;
+        document.query('#noneChecked').children;
 
     expect(eachChecked.length, 4);
     expect(someChecked.length, 4);
@@ -208,7 +208,7 @@
     Element root = insertTestDiv();
 
     List<Element> someChecked =
-        document.query('#someChecked').elements;
+        document.query('#someChecked').children;
 
     expect(someChecked.length, 4);
 
@@ -220,10 +220,10 @@
     Element root = insertTestDiv();
 
     List<Element> someChecked =
-        document.query('#someChecked').elements;
+        document.query('#someChecked').children;
 
     List<Element> noneChecked =
-        document.query('#noneChecked').elements;
+        document.query('#noneChecked').children;
 
     expect(someChecked.length, 4);
     expect(noneChecked.length, 4);
@@ -249,10 +249,10 @@
     Element root = insertTestDiv();
 
     List<Element> someChecked =
-        document.query('#someChecked').elements;
+        document.query('#someChecked').children;
 
     List<Element> noneChecked =
-        document.query('#noneChecked').elements;
+        document.query('#noneChecked').children;
 
     expect(someChecked.length, 4);
     expect(noneChecked.length, 4);
diff --git a/tests/html/indexeddb_1_test.dart b/tests/html/indexeddb_1_test.dart
index d55494c..8eda6c4 100644
--- a/tests/html/indexeddb_1_test.dart
+++ b/tests/html/indexeddb_1_test.dart
@@ -15,7 +15,7 @@
 
   fail(e) {
     guardAsync(() {
-      throw const Exception('IndexedDB failure');
+      throw new Exception('IndexedDB failure');
     });
   }
 
@@ -91,7 +91,7 @@
 
   fail(e) {
     guardAsync(() {
-      throw const Exception('IndexedDB failure');
+      throw new Exception('IndexedDB failure');
     });
   }
 
diff --git a/tests/html/indexeddb_2_test.dart b/tests/html/indexeddb_2_test.dart
index 0054f0e..be3c3c1 100644
--- a/tests/html/indexeddb_2_test.dart
+++ b/tests/html/indexeddb_2_test.dart
@@ -19,7 +19,7 @@
 
   fail(e) {
     guardAsync(() {
-      throw const Exception('IndexedDB failure');
+      throw new Exception('IndexedDB failure');
     });
   }
 
diff --git a/tests/html/node_test.dart b/tests/html/node_test.dart
index 7197a42..01ac3c3 100644
--- a/tests/html/node_test.dart
+++ b/tests/html/node_test.dart
@@ -6,7 +6,7 @@
 import '../../pkg/unittest/lib/unittest.dart';
 import '../../pkg/unittest/lib/html_individual_config.dart';
 import 'dart:html';
-import 'dart:svg';
+import 'dart:svg' as svg;
 
 Node makeNode() => new Element.tag('div');
 Node makeNodeWithChildren() =>
@@ -95,7 +95,7 @@
     test('some', () {
       var node = makeNodeWithChildren();
       expect(node.nodes.some((n) => n is Comment), isTrue);
-      expect(node.nodes.some((n) => n is SVGElement), isFalse);
+      expect(node.nodes.some((n) => n is svg.SvgElement), isFalse);
     });
 
     test('isEmpty', () {
diff --git a/tests/html/selectelement_test.dart b/tests/html/selectelement_test.dart
index 9de1d68..300e29e 100644
--- a/tests/html/selectelement_test.dart
+++ b/tests/html/selectelement_test.dart
@@ -21,7 +21,7 @@
       new OptionElement('data', 'two', false, true),
       new OptionElement(),
     ];
-    element.elements.addAll(options);
+    element.children.addAll(options);
     expect(element.selectedOptions.length, 1);
     expect(element.selectedOptions[0], equals(options[4]));
   });
@@ -37,7 +37,7 @@
       new OptionElement('data', 'two', false, true),
       new OptionElement(),
     ];
-    element.elements.addAll(options);
+    element.children.addAll(options);
     expect(element.selectedOptions.length, 2);
     expect(element.selectedOptions[0], equals(options[2]));
     expect(element.selectedOptions[1], equals(options[4]));
@@ -51,7 +51,7 @@
       new OptionElement('data', 'two', false, true),
       new OptionElement(),
     ];
-    element.elements.addAll(options);
+    element.children.addAll(options);
     // Use last to make sure that the list was correctly wrapped.
     expect(element.options.last, equals(options[3]));
   });
diff --git a/tests/html/shadow_dom_layout_test.dart b/tests/html/shadow_dom_layout_test.dart
index a316a2c..ec809ca 100644
--- a/tests/html/shadow_dom_layout_test.dart
+++ b/tests/html/shadow_dom_layout_test.dart
@@ -11,7 +11,7 @@
 // ordered blue, red, green down the page.
 main() {
   var div = new DivElement();
-  document.body.elements.add(div);
+  document.body.children.add(div);
 
   // build some DOM elements
   var bluebox = _colorBox('blue', 40, 20);
diff --git a/tests/html/svg_1_test.dart b/tests/html/svg_1_test.dart
index 997a361..a6bfc44 100644
--- a/tests/html/svg_1_test.dart
+++ b/tests/html/svg_1_test.dart
@@ -2,14 +2,14 @@
 import '../../pkg/unittest/lib/unittest.dart';
 import '../../pkg/unittest/lib/html_config.dart';
 import 'dart:html';
-import 'dart:svg';
+import 'dart:svg' as svg;
 
 // Test that SVG is present in dart:html API
 
 main() {
   useHtmlConfiguration();
 
-  var isSVGElement = predicate((x) => x is SVGElement, 'is a SVGElement');
+  var isSvgElement = predicate((x) => x is svg.SvgElement, 'is a SvgElement');
 
   test('simpleRect', () {
       var div = new Element.tag('div');
@@ -24,7 +24,7 @@
     var e = document.query('#svg1');
     expect(e, isNotNull);
 
-    SVGRectElement r = document.query('#rect1');
+    svg.RectElement r = document.query('#rect1');
     expect(r.x.baseVal.value, 10);
     expect(r.y.baseVal.value, 20);
     expect(r.height.baseVal.value, 40);
@@ -34,13 +34,13 @@
 
   test('trailing newline', () {
     // Ensures that we handle SVG with trailing newlines.
-    var logo = new SVGElement.svg("""
+    var logo = new svg.SvgElement.svg("""
       <svg xmlns="http://www.w3.org/2000/svg" version="1.1">
         <path/>
       </svg>
       """);
 
-  expect(logo, isSVGElement);
+  expect(logo, isSvgElement);
 
   });
 }
diff --git a/tests/html/svg_2_test.dart b/tests/html/svg_2_test.dart
index 11500d3..2b12818 100644
--- a/tests/html/svg_2_test.dart
+++ b/tests/html/svg_2_test.dart
@@ -2,7 +2,7 @@
 import '../../pkg/unittest/lib/unittest.dart';
 import '../../pkg/unittest/lib/html_config.dart';
 import 'dart:html';
-import 'dart:svg';
+import 'dart:svg' as svg;
 
 // Test that SVG elements explicitly implement the IDL interfaces (is-checks
 // only, see SVGTest3 for behavioural tests).
@@ -23,43 +23,44 @@
   useHtmlConfiguration();
 
   var isElement = predicate((x) => x is Element, 'is an Element');
-  var isSVGElement = predicate((x) => x is SVGElement, 'is a SVGElement');
-  var isSVGSVGElement =
-      predicate((x) => x is SVGSVGElement, 'is a SVGSVGElement');
+  var isSvgElement = predicate((x) => x is svg.SvgElement, 'is a SvgElement');
+  var isSvgSvgElement =
+      predicate((x) => x is svg.SvgSvgElement, 'is a SvgSvgElement');
   var isNode = predicate((x) => x is Node, 'is a Node');
-  var isSVGTests = predicate((x) => x is SVGTests, 'is a SVGTests');
-  var isSVGLangSpace = predicate((x) => x is SVGLangSpace, 'is a SVGLangSpace');
-  var isSVGExternalResourcesRequired =
-      predicate((x) => x is SVGExternalResourcesRequired,
-          'is a SVGExternalResourcesRequired');
-  var isSVGStylable = predicate((x) => x is SVGStylable, 'is a SVGStylable');
-  var isSVGTransformable =
-      predicate((x) => x is SVGTransformable, 'is a SVGTransformable');
-  var isSVGLocatable = predicate((x) => x is SVGLocatable, 'is a SVGLocatable');
-  var isSVGNumber = predicate((x) => x is SVGNumber, 'is a SVGNumber');
-  var isSVGRect = predicate((x) => x is SVGRect, 'is a SVGRect');
+  var isSvgTests = predicate((x) => x is svg.Tests, 'is a svg.Tests');
+  var isSvgLangSpace = predicate((x) => x is svg.LangSpace, 'is a svg.LangSpace');
+  var isSvgExternalResourcesRequired =
+      predicate((x) => x is svg.ExternalResourcesRequired,
+          'is a svg.ExternalResourcesRequired');
+  var isSvgStylable = predicate((x) => x is svg.Stylable, 'is a svg.Stylable');
+  var isSvgTransformable =
+      predicate((x) => x is svg.Transformable, 'is a svg.Transformable');
+  var isSvgLocatable =
+      predicate((x) => x is svg.Locatable, 'is a svg.Locatable');
+  var isSvgNumber = predicate((x) => x is svg.Number, 'is a svg.Number');
+  var isSvgRect = predicate((x) => x is svg.Rect, 'is a svg.Rect');
 
   test('rect_isChecks', () {
       var div = insertTestDiv();
       var r = document.query('#rect1');
 
       // Direct inheritance chain
-      expect(r, isSVGElement);
+      expect(r, isSvgElement);
       expect(r, isElement);
       expect(r, isNode);
 
       // Other implemented interfaces.
-      expect(r, isSVGTests);
-      expect(r, isSVGLangSpace);
-      expect(r, isSVGExternalResourcesRequired);
-      expect(r, isSVGStylable);
-      expect(r, isSVGTransformable);
-      expect(r, isSVGLocatable);
+      expect(r, isSvgTests);
+      expect(r, isSvgLangSpace);
+      expect(r, isSvgExternalResourcesRequired);
+      expect(r, isSvgStylable);
+      expect(r, isSvgTransformable);
+      expect(r, isSvgLocatable);
 
       // Interfaces not implemented.
-      expect(r, isNot(isSVGNumber));
-      expect(r, isNot(isSVGRect));
-      expect(r, isNot(isSVGSVGElement));
+      expect(r, isNot(isSvgNumber));
+      expect(r, isNot(isSvgRect));
+      expect(r, isNot(isSvgSvgElement));
 
       div.remove();
     });
diff --git a/tests/html/svg_3_test.dart b/tests/html/svg_3_test.dart
index b5762d2..d5a4e4f 100644
--- a/tests/html/svg_3_test.dart
+++ b/tests/html/svg_3_test.dart
@@ -2,7 +2,7 @@
 import '../../pkg/unittest/lib/unittest.dart';
 import '../../pkg/unittest/lib/html_config.dart';
 import 'dart:html';
-import 'dart:svg';
+import 'dart:svg' as svg;
 
 // Test that SVG elements have the operations advertised through all the IDL
 // interfaces.  This is a 'duck typing' test, and does not explicitly use 'is'
@@ -12,15 +12,15 @@
 
   var isString = predicate((x) => x is String, 'is a String');
   var isStringList = predicate((x) => x is List<String>, 'is a List<String>');
-  var isSVGMatrix = predicate((x) => x is SVGMatrix, 'is a SVGMatrix');
-  var isSVGAnimatedBoolean =
-      predicate((x) => x is SVGAnimatedBoolean, 'is an SVGAnimatedBoolean');
-  var isSVGAnimatedString =
-      predicate((x) => x is SVGAnimatedString, 'is an SVGAnimatedString');
-  var isSVGRect = predicate((x) => x is SVGRect, 'is a SVGRect');
-  var isSVGAnimatedTransformList =
-      predicate((x) => x is SVGAnimatedTransformList,
-          'is an SVGAnimatedTransformList');
+  var isSvgMatrix = predicate((x) => x is svg.Matrix, 'is a svg.Matrix');
+  var isSvgAnimatedBoolean =
+      predicate((x) => x is svg.AnimatedBoolean, 'is an svg.AnimatedBoolean');
+  var isSvgAnimatedString =
+      predicate((x) => x is svg.AnimatedString, 'is an svg.AnimatedString');
+  var isSvgRect = predicate((x) => x is svg.Rect, 'is a svg.Rect');
+  var isSvgAnimatedTransformList =
+      predicate((x) => x is svg.AnimatedTransformList,
+          'is an svg.AnimatedTransformList');
   var isCSSStyleDeclaration =
       predicate((x) => x is CSSStyleDeclaration, 'is a CSSStyleDeclaration');
   var isCSSValue = predicate((x) => x is CSSValue, 'is a CSSValue');
@@ -39,9 +39,9 @@
   useHtmlConfiguration();
 
   /**
-   * Verifies that [e] supports the operations on the SVGTests interface.
+   * Verifies that [e] supports the operations on the svg.Tests interface.
    */
-  checkSVGTests(e) {
+  checkSvgTests(e) {
     // Just check that the operations seem to exist.
     var rx = e.requiredExtensions;
     expect(rx, isStringList);
@@ -55,9 +55,9 @@
   }
 
   /**
-   * Verifies that [e] supports the operations on the SVGLangSpace interface.
+   * Verifies that [e] supports the operations on the svg.LangSpace interface.
    */
-  checkSVGLangSpace(e) {
+  checkSvgLangSpace(e) {
     // Just check that the attribtes seem to exist.
     var lang = e.xmllang;
     e.xmllang = lang;
@@ -71,21 +71,21 @@
 
   /**
    * Verifies that [e] supports the operations on the
-   * SVGExternalResourcesRequired interface.
+   * svg.ExternalResourcesRequired interface.
    */
-  checkSVGExternalResourcesRequired(e) {
+  checkSvgExternalResourcesRequired(e) {
     var b = e.externalResourcesRequired;
-    expect(b, isSVGAnimatedBoolean);
+    expect(b, isSvgAnimatedBoolean);
     expect(b.baseVal, isFalse);
     expect(b.animVal, isFalse);
   }
 
   /**
-   * Verifies that [e] supports the operations on the SVGStylable interface.
+   * Verifies that [e] supports the operations on the svg.Stylable interface.
    */
-  checkSVGStylable(e) {
+  checkSvgStylable(e) {
     var className = e.$dom_svgClassName;
-    expect(className, isSVGAnimatedString);
+    expect(className, isSvgAnimatedString);
 
     var s = e.style;
     expect(s, isCSSStyleDeclaration);
@@ -95,33 +95,33 @@
   }
 
   /**
-   * Verifies that [e] supports the operations on the SVGLocatable interface.
+   * Verifies that [e] supports the operations on the svg.Locatable interface.
    */
-  checkSVGLocatable(e) {
+  checkSvgLocatable(e) {
     var v1 = e.farthestViewportElement;
     var v2 = e.nearestViewportElement;
     expect(v1, same(v2));
 
     var bbox = e.getBBox();
-    expect(bbox, isSVGRect);
+    expect(bbox, isSvgRect);
 
     var ctm = e.getCTM();
-    expect(ctm, isSVGMatrix);
+    expect(ctm, isSvgMatrix);
 
     var sctm = e.getScreenCTM();
-    expect(sctm, isSVGMatrix);
+    expect(sctm, isSvgMatrix);
 
     var xf2e = e.getTransformToElement(e);
-    expect(xf2e, isSVGMatrix);
+    expect(xf2e, isSvgMatrix);
   }
 
   /**
-   * Verifies that [e] supports the operations on the SVGTransformable
+   * Verifies that [e] supports the operations on the svg.Transformable
    * interface.
    */
-  checkSVGTransformable(e) {
+  checkSvgTransformable(e) {
     var trans = e.transform;
-    expect(trans, isSVGAnimatedTransformList);
+    expect(trans, isSvgAnimatedTransformList);
   }
 
   testRect(name, checker) {
@@ -133,12 +133,12 @@
       });
   }
 
-  testRect('rect_SVGTests', checkSVGTests);
-  testRect('rect_SVGLangSpace', checkSVGLangSpace);
-  testRect('rect_SVGExternalResourcesRequired',
-           checkSVGExternalResourcesRequired);
-  testRect('rect_SVGStylable', checkSVGStylable);
-  testRect('rect_SVGLocatable', checkSVGLocatable);
-  testRect('rect_SVGTransformable', checkSVGTransformable);
+  testRect('rect_SvgTests', checkSvgTests);
+  testRect('rect_SvgLangSpace', checkSvgLangSpace);
+  testRect('rect_SvgExternalResourcesRequired',
+           checkSvgExternalResourcesRequired);
+  testRect('rect_SvgStylable', checkSvgStylable);
+  testRect('rect_SvgLocatable', checkSvgLocatable);
+  testRect('rect_SvgTransformable', checkSvgTransformable);
 
 }
diff --git a/tests/html/svgelement_test.dart b/tests/html/svgelement_test.dart
index 6787d3c..e41c35614 100644
--- a/tests/html/svgelement_test.dart
+++ b/tests/html/svgelement_test.dart
@@ -2,17 +2,17 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library SVGElementTest;
+library SvgElementTest;
 import '../../pkg/unittest/lib/unittest.dart';
 import '../../pkg/unittest/lib/html_individual_config.dart';
 import 'dart:html';
-import 'dart:svg';
+import 'dart:svg' as svg;
 
 main() {
   useHtmlIndividualConfiguration();
 
-  var isSVGSVGElement =
-      predicate((x) => x is SVGSVGElement, 'is a SVGSVGElement');
+  var isSvgSvgElement =
+      predicate((x) => x is svg.SvgSvgElement, 'is a SvgSvgElement');
 
   Collection<String> _nodeStrings(Collection<Node> input) {
     final out = new List<String>();
@@ -29,131 +29,131 @@
 
   testConstructor(String tagName, Function isExpectedClass) {
     test(tagName, () {
-      expect(isExpectedClass(new SVGElement.tag(tagName)), isTrue);
+      expect(isExpectedClass(new svg.SvgElement.tag(tagName)), isTrue);
       expect(isExpectedClass(
-          new SVGElement.svg('<$tagName></$tagName>')), isTrue);
+          new svg.SvgElement.svg('<$tagName></$tagName>')), isTrue);
     });
   }
   group('additionalConstructors', () {
     group('svg', () {
       test('valid', () {
-        final svg = """
+        final svgContent = """
 <svg version="1.1">
   <circle></circle>
   <path></path>
 </svg>""";
-        final el = new SVGElement.svg(svg);
-        expect(el, isSVGSVGElement);
+        final el = new svg.SvgElement.svg(svgContent);
+        expect(el, isSvgSvgElement);
         expect(el.innerHTML, "<circle></circle><path></path>");
-        expect(el.outerHTML, svg);
+        expect(el.outerHTML, svgContent);
       });
 
       test('has no parent', () =>
-        expect(new SVGElement.svg('<circle/>').parent, isNull)
+        expect(new svg.SvgElement.svg('<circle/>').parent, isNull)
       );
 
       test('empty', () {
-        expect(() => new SVGElement.svg(""), throwsArgumentError);
+        expect(() => new svg.SvgElement.svg(""), throwsArgumentError);
       });
 
       test('too many elements', () {
-        expect(() => new SVGElement.svg("<circle></circle><path></path>"),
+        expect(() => new svg.SvgElement.svg("<circle></circle><path></path>"),
             throwsArgumentError);
       });
     });
-    testConstructor('altGlyphDef', (e) => e is SVGAltGlyphDefElement);
-    testConstructor('altGlyph', (e) => e is SVGAltGlyphElement);
-    testConstructor('animateColor', (e) => e is SVGAnimateColorElement);
-    testConstructor('animate', (e) => e is SVGAnimateElement);
+    testConstructor('altGlyphDef', (e) => e is svg.AltGlyphDefElement);
+    testConstructor('altGlyph', (e) => e is svg.AltGlyphElement);
+    testConstructor('animateColor', (e) => e is svg.AnimateColorElement);
+    testConstructor('animate', (e) => e is svg.AnimateElement);
     // WebKit doesn't recognize animateMotion
-    // testConstructor('animateMotion', (e) => e is SVGAnimateMotionElement);
-    testConstructor('animateTransform', (e) => e is SVGAnimateTransformElement);
-    testConstructor('cursor', (e) => e is SVGCursorElement);
-    testConstructor('feBlend', (e) => e is SVGFEBlendElement);
-    testConstructor('feColorMatrix', (e) => e is SVGFEColorMatrixElement);
+    // testConstructor('animateMotion', (e) => e is svg.AnimateMotionElement);
+    testConstructor('animateTransform', (e) => e is svg.AnimateTransformElement);
+    testConstructor('cursor', (e) => e is svg.CursorElement);
+    testConstructor('feBlend', (e) => e is svg.FEBlendElement);
+    testConstructor('feColorMatrix', (e) => e is svg.FEColorMatrixElement);
     testConstructor('feComponentTransfer',
-        (e) => e is SVGFEComponentTransferElement);
-    testConstructor('feConvolveMatrix', (e) => e is SVGFEConvolveMatrixElement);
+        (e) => e is svg.FEComponentTransferElement);
+    testConstructor('feConvolveMatrix', (e) => e is svg.FEConvolveMatrixElement);
     testConstructor('feDiffuseLighting',
-        (e) => e is SVGFEDiffuseLightingElement);
+        (e) => e is svg.FEDiffuseLightingElement);
     testConstructor('feDisplacementMap',
-        (e) => e is SVGFEDisplacementMapElement);
-    testConstructor('feDistantLight', (e) => e is SVGFEDistantLightElement);
-    testConstructor('feDropShadow', (e) => e is SVGFEDropShadowElement);
-    testConstructor('feFlood', (e) => e is SVGFEFloodElement);
-    testConstructor('feFuncA', (e) => e is SVGFEFuncAElement);
-    testConstructor('feFuncB', (e) => e is SVGFEFuncBElement);
-    testConstructor('feFuncG', (e) => e is SVGFEFuncGElement);
-    testConstructor('feFuncR', (e) => e is SVGFEFuncRElement);
-    testConstructor('feGaussianBlur', (e) => e is SVGFEGaussianBlurElement);
-    testConstructor('feImage', (e) => e is SVGFEImageElement);
-    testConstructor('feMerge', (e) => e is SVGFEMergeElement);
-    testConstructor('feMergeNode', (e) => e is SVGFEMergeNodeElement);
-    testConstructor('feOffset', (e) => e is SVGFEOffsetElement);
-    testConstructor('fePointLight', (e) => e is SVGFEPointLightElement);
+        (e) => e is svg.FEDisplacementMapElement);
+    testConstructor('feDistantLight', (e) => e is svg.FEDistantLightElement);
+    testConstructor('feDropShadow', (e) => e is svg.FEDropShadowElement);
+    testConstructor('feFlood', (e) => e is svg.FEFloodElement);
+    testConstructor('feFuncA', (e) => e is svg.FEFuncAElement);
+    testConstructor('feFuncB', (e) => e is svg.FEFuncBElement);
+    testConstructor('feFuncG', (e) => e is svg.FEFuncGElement);
+    testConstructor('feFuncR', (e) => e is svg.FEFuncRElement);
+    testConstructor('feGaussianBlur', (e) => e is svg.FEGaussianBlurElement);
+    testConstructor('feImage', (e) => e is svg.FEImageElement);
+    testConstructor('feMerge', (e) => e is svg.FEMergeElement);
+    testConstructor('feMergeNode', (e) => e is svg.FEMergeNodeElement);
+    testConstructor('feOffset', (e) => e is svg.FEOffsetElement);
+    testConstructor('fePointLight', (e) => e is svg.FEPointLightElement);
     testConstructor('feSpecularLighting',
-        (e) => e is SVGFESpecularLightingElement);
-    testConstructor('feSpotLight', (e) => e is SVGFESpotLightElement);
-    testConstructor('feTile', (e) => e is SVGFETileElement);
-    testConstructor('feTurbulence', (e) => e is SVGFETurbulenceElement);
-    testConstructor('filter', (e) => e is SVGFilterElement);
-    testConstructor('font', (e) => e is SVGFontElement);
-    testConstructor('font-face', (e) => e is SVGFontFaceElement);
-    testConstructor('font-face-format', (e) => e is SVGFontFaceFormatElement);
-    testConstructor('font-face-name', (e) => e is SVGFontFaceNameElement);
-    testConstructor('font-face-src', (e) => e is SVGFontFaceSrcElement);
-    testConstructor('font-face-uri', (e) => e is SVGFontFaceUriElement);
-    testConstructor('foreignObject', (e) => e is SVGForeignObjectElement);
-    testConstructor('glyph', (e) => e is SVGGlyphElement);
-    testConstructor('glyphRef', (e) => e is SVGGlyphRefElement);
-    testConstructor('metadata', (e) => e is SVGMetadataElement);
-    testConstructor('missing-glyph', (e) => e is SVGMissingGlyphElement);
-    testConstructor('set', (e) => e is SVGSetElement);
-    testConstructor('tref', (e) => e is SVGTRefElement);
-    testConstructor('vkern', (e) => e is SVGVKernElement);
+        (e) => e is svg.FESpecularLightingElement);
+    testConstructor('feSpotLight', (e) => e is svg.FESpotLightElement);
+    testConstructor('feTile', (e) => e is svg.FETileElement);
+    testConstructor('feTurbulence', (e) => e is svg.FETurbulenceElement);
+    testConstructor('filter', (e) => e is svg.FilterElement);
+    testConstructor('font', (e) => e is svg.FontElement);
+    testConstructor('font-face', (e) => e is svg.FontFaceElement);
+    testConstructor('font-face-format', (e) => e is svg.FontFaceFormatElement);
+    testConstructor('font-face-name', (e) => e is svg.FontFaceNameElement);
+    testConstructor('font-face-src', (e) => e is svg.FontFaceSrcElement);
+    testConstructor('font-face-uri', (e) => e is svg.FontFaceUriElement);
+    testConstructor('foreignObject', (e) => e is svg.ForeignObjectElement);
+    testConstructor('glyph', (e) => e is svg.GlyphElement);
+    testConstructor('glyphRef', (e) => e is svg.GlyphRefElement);
+    testConstructor('metadata', (e) => e is svg.MetadataElement);
+    testConstructor('missing-glyph', (e) => e is svg.MissingGlyphElement);
+    testConstructor('set', (e) => e is svg.SetElement);
+    testConstructor('tref', (e) => e is svg.TRefElement);
+    testConstructor('vkern', (e) => e is svg.VKernElement);
   });
 
   group('constructors', () {
-    testConstructor('a', (e) => e is SVGAElement);
-    testConstructor('circle', (e) => e is SVGCircleElement);
-    testConstructor('clipPath', (e) => e is SVGClipPathElement);
-    testConstructor('defs', (e) => e is SVGDefsElement);
-    testConstructor('desc', (e) => e is SVGDescElement);
-    testConstructor('ellipse', (e) => e is SVGEllipseElement);
-    testConstructor('g', (e) => e is SVGGElement);
+    testConstructor('a', (e) => e is svg.AElement);
+    testConstructor('circle', (e) => e is svg.CircleElement);
+    testConstructor('clipPath', (e) => e is svg.ClipPathElement);
+    testConstructor('defs', (e) => e is svg.DefsElement);
+    testConstructor('desc', (e) => e is svg.DescElement);
+    testConstructor('ellipse', (e) => e is svg.EllipseElement);
+    testConstructor('g', (e) => e is svg.GElement);
     // WebKit doesn't recognize hkern
-    // testConstructor('hkern', (e) => e is SVGHKernElement);
-    testConstructor('image', (e) => e is SVGImageElement);
-    testConstructor('line', (e) => e is SVGLineElement);
-    testConstructor('linearGradient', (e) => e is SVGLinearGradientElement);
+    // testConstructor('hkern', (e) => e is svg.HKernElement);
+    testConstructor('image', (e) => e is svg.ImageElement);
+    testConstructor('line', (e) => e is svg.LineElement);
+    testConstructor('linearGradient', (e) => e is svg.LinearGradientElement);
     // WebKit doesn't recognize mpath
-    // testConstructor('mpath', (e) => e is SVGMPathElement);
-    testConstructor('marker', (e) => e is SVGMarkerElement);
-    testConstructor('mask', (e) => e is SVGMaskElement);
-    testConstructor('path', (e) => e is SVGPathElement);
-    testConstructor('pattern', (e) => e is SVGPatternElement);
-    testConstructor('polygon', (e) => e is SVGPolygonElement);
-    testConstructor('polyline', (e) => e is SVGPolylineElement);
-    testConstructor('radialGradient', (e) => e is SVGRadialGradientElement);
-    testConstructor('rect', (e) => e is SVGRectElement);
-    testConstructor('script', (e) => e is SVGScriptElement);
-    testConstructor('stop', (e) => e is SVGStopElement);
-    testConstructor('style', (e) => e is SVGStyleElement);
-    testConstructor('switch', (e) => e is SVGSwitchElement);
-    testConstructor('symbol', (e) => e is SVGSymbolElement);
-    testConstructor('tspan', (e) => e is SVGTSpanElement);
-    testConstructor('text', (e) => e is SVGTextElement);
-    testConstructor('textPath', (e) => e is SVGTextPathElement);
-    testConstructor('title', (e) => e is SVGTitleElement);
-    testConstructor('use', (e) => e is SVGUseElement);
-    testConstructor('view', (e) => e is SVGViewElement);
+    // testConstructor('mpath', (e) => e is svg.MPathElement);
+    testConstructor('marker', (e) => e is svg.MarkerElement);
+    testConstructor('mask', (e) => e is svg.MaskElement);
+    testConstructor('path', (e) => e is svg.PathElement);
+    testConstructor('pattern', (e) => e is svg.PatternElement);
+    testConstructor('polygon', (e) => e is svg.PolygonElement);
+    testConstructor('polyline', (e) => e is svg.PolylineElement);
+    testConstructor('radialGradient', (e) => e is svg.RadialGradientElement);
+    testConstructor('rect', (e) => e is svg.RectElement);
+    testConstructor('script', (e) => e is svg.ScriptElement);
+    testConstructor('stop', (e) => e is svg.StopElement);
+    testConstructor('style', (e) => e is svg.StyleElement);
+    testConstructor('switch', (e) => e is svg.SwitchElement);
+    testConstructor('symbol', (e) => e is svg.SymbolElement);
+    testConstructor('tspan', (e) => e is svg.TSpanElement);
+    testConstructor('text', (e) => e is svg.TextElement);
+    testConstructor('textPath', (e) => e is svg.TextPathElement);
+    testConstructor('title', (e) => e is svg.TitleElement);
+    testConstructor('use', (e) => e is svg.UseElement);
+    testConstructor('view', (e) => e is svg.ViewElement);
   });
 
   group('outerHTML', () {
     test('outerHTML', () {
-      final el = new SVGSVGElement();
-      el.elements.add(new SVGElement.tag("circle"));
-      el.elements.add(new SVGElement.tag("path"));
+      final el = new svg.SvgSvgElement();
+      el.children.add(new svg.CircleElement());
+      el.children.add(new svg.PathElement());
       expect(el.outerHTML,
           '<svg version="1.1"><circle></circle><path></path></svg>');
     });
@@ -161,44 +161,44 @@
 
   group('innerHTML', () {
     test('get', () {
-      final el = new SVGSVGElement();
-      el.elements.add(new SVGElement.tag("circle"));
-      el.elements.add(new SVGElement.tag("path"));
+      final el = new svg.SvgSvgElement();
+      el.children.add(new svg.CircleElement());
+      el.children.add(new svg.PathElement());
       expect(el.innerHTML, '<circle></circle><path></path>');
     });
 
     test('set', () {
-      final el = new SVGSVGElement();
-      el.elements.add(new SVGElement.tag("circle"));
-      el.elements.add(new SVGElement.tag("path"));
+      final el = new svg.SvgSvgElement();
+      el.children.add(new svg.CircleElement());
+      el.children.add(new svg.PathElement());
       el.innerHTML = '<rect></rect><a></a>';
-      expect(_nodeStrings(el.elements), ["rect", "a"]);
+      expect(_nodeStrings(el.children), ["rect", "a"]);
     });
   });
 
   group('elementget', () {
     test('get', () {
-      final el = new SVGElement.svg("""
+      final el = new svg.SvgElement.svg("""
 <svg version="1.1">
   <circle></circle>
   <path></path>
   text
 </svg>""");
-      expect(_nodeStrings(el.elements), ["circle", "path"]);
+      expect(_nodeStrings(el.children), ["circle", "path"]);
     });
   });
 
   group('elementset', () {
     test('set', () {
-      final el = new SVGSVGElement();
-      el.elements = [new SVGElement.tag("circle"), new SVGElement.tag("path")];
+      final el = new svg.SvgSvgElement();
+      el.children = [new svg.SvgElement.tag("circle"), new svg.SvgElement.tag("path")];
       expect(el.innerHTML, '<circle></circle><path></path>');
     });
   });
 
   group('css', () {
     test('classes', () {
-      var el = new SVGElement.tag("circle");
+      var el = new svg.CircleElement();
       var classes = el.classes;
       expect(el.classes.length, 0);
       classes.toggle('foo');
diff --git a/tests/html/xmldocument_test.dart b/tests/html/xmldocument_test.dart
index 5667812..53c3bc4 100644
--- a/tests/html/xmldocument_test.dart
+++ b/tests/html/xmldocument_test.dart
@@ -19,8 +19,8 @@
     test('with a well-formed document', () {
       final doc = makeDocument();
       expect(doc, isXMLDocument);
-      expect(doc.elements[0].tagName, 'foo');
-      expect(doc.elements[1].tagName, 'bar');
+      expect(doc.children[0].tagName, 'foo');
+      expect(doc.children[1].tagName, 'bar');
     });
 
     // TODO(nweiz): re-enable this when Document#query matches the root-level
@@ -33,20 +33,20 @@
 
     test('with a PARSERERROR tag', () {
       final doc = new XMLDocument.xml("<xml><parsererror /></xml>");
-      expect(doc.elements[0].tagName, 'parsererror');
+      expect(doc.children[0].tagName, 'parsererror');
     });
   });
 
   // FilteredElementList is tested more thoroughly in DocumentFragmentTests.
-  group('elements', () {
+  group('children', () {
     test('filters out non-element nodes', () {
       final doc = new XMLDocument.xml("<xml>1<a/><b/>2<c/>3<d/></xml>");
-      expect(doc.elements.map((e) => e.tagName), ["a", "b", "c", "d"]);
+      expect(doc.children.map((e) => e.tagName), ["a", "b", "c", "d"]);
     });
 
     test('overwrites nodes when set', () {
       final doc = new XMLDocument.xml("<xml>1<a/><b/>2<c/>3<d/></xml>");
-      doc.elements = [new XMLElement.tag('x'), new XMLElement.tag('y')];
+      doc.children = [new XMLElement.tag('x'), new XMLElement.tag('y')];
       expect(doc.outerHTML, "<xml><x></x><y></y></xml>");
     });
   });
diff --git a/tests/html/xmlelement_test.dart b/tests/html/xmlelement_test.dart
index 0831518..1436b18 100644
--- a/tests/html/xmlelement_test.dart
+++ b/tests/html/xmlelement_test.dart
@@ -17,7 +17,7 @@
   makeElementWithParent() {
     final parent = new XMLElement.xml(
         "<parent><before/><xml><foo/><bar/></xml><after/></parent>");
-    return parent.elements[1];
+    return parent.children[1];
   }
 
   group('constructors', () {
@@ -25,8 +25,8 @@
       test('with a well-formed document', () {
         final el = makeElement();
         expect(el, isXMLElement);
-        expect(el.elements[0].tagName, 'foo');
-        expect(el.elements[1].tagName, 'bar');
+        expect(el.children[0].tagName, 'foo');
+        expect(el.children[1].tagName, 'bar');
       });
 
       test('with too many nodes', () {
@@ -39,7 +39,7 @@
 
       test('with a PARSERERROR tag', () {
         final el = new XMLElement.xml("<xml><parsererror /></xml>");
-        expect('parsererror', el.elements[0].tagName, 'parsererror');
+        expect('parsererror', el.children[0].tagName, 'parsererror');
       });
 
       test('has no parent', () =>
@@ -54,15 +54,15 @@
   });
 
   // FilteredElementList is tested more thoroughly in DocumentFragmentTests.
-  group('elements', () {
+  group('children', () {
     test('filters out non-element nodes', () {
       final el = new XMLElement.xml("<xml>1<a/><b/>2<c/>3<d/></xml>");
-      expect(el.elements.map((e) => e.tagName), ["a", "b", "c", "d"]);
+      expect(el.children.map((e) => e.tagName), ["a", "b", "c", "d"]);
     });
 
     test('overwrites nodes when set', () {
       final el = new XMLElement.xml("<xml>1<a/><b/>2<c/>3<d/></xml>");
-      el.elements = [new XMLElement.tag('x'), new XMLElement.tag('y')];
+      el.children = [new XMLElement.tag('x'), new XMLElement.tag('y')];
       expect(el.outerHTML, "<xml><x></x><y></y></xml>");
     });
   });
@@ -450,7 +450,7 @@
       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.parent.innerHTML,
           "<before></before><b></b><xml><foo></foo><bar></bar>"
           "</xml><after></after>");
     });
@@ -460,7 +460,7 @@
       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.parent.innerHTML,
           "<before></before><xml><foo></foo><bar></bar></xml><b>"
           "</b><after></after>");
     });
@@ -497,7 +497,7 @@
       final el = makeElementWithParent();
       el.insertAdjacentText("beforeBegin", "foo");
       expect(el.innerHTML, "<foo></foo><bar></bar>");
-      expect(el.parent.innerHTML, 
+      expect(el.parent.innerHTML,
           "<before></before>foo<xml><foo></foo><bar></bar></xml>"
           "<after></after>");
     });
@@ -506,7 +506,7 @@
       final el = makeElementWithParent();
       el.insertAdjacentText("afterEnd", "foo");
       expect(el.innerHTML, "<foo></foo><bar></bar>");
-      expect(el.parent.innerHTML, 
+      expect(el.parent.innerHTML,
           "<before></before><xml><foo></foo><bar></bar></xml>foo"
           "<after></after>");
     });
diff --git a/tests/isolate/unresolved_ports_negative_test.dart b/tests/isolate/unresolved_ports_negative_test.dart
index 518884b..3007645 100644
--- a/tests/isolate/unresolved_ports_negative_test.dart
+++ b/tests/isolate/unresolved_ports_negative_test.dart
@@ -2,46 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// negative test to ensure that API_unresolvedPortsTest works.
-library unresolved_ports;
+// negative test to ensure that unresolved_ports works.
+library unresolved_ports_negative;
 import 'dart:isolate';
 import '../../pkg/unittest/lib/unittest.dart';
-
-bethIsolate() {
-  port.receive(expectAsync2((msg, reply) => msg[1].send(
-        '${msg[0]}\nBeth says: Tim are you coming? And Bob?', reply)));
-}
-
-timIsolate() {
-  SendPort bob = spawnFunction(bobIsolate);
-  port.receive(expectAsync2((msg, reply) => bob.send(
-        '$msg\nTim says: Can you tell "main" that we are all coming?', reply)));
-}
-
-bobIsolate() {
-  port.receive(expectAsync2((msg, reply) => reply.send(
-        '$msg\nBob says: we are all coming!')));
-}
+import 'unresolved_ports_test.dart' as positive_test;
 
 main() {
-  test('Message chain with unresolved ports', () {
-    ReceivePort port = new ReceivePort();
-    port.receive(expectAsync2((msg, _) {
-      expect(msg, equals('main says: Beth, find out if Tim is coming.'
-        + '\nBeth says: Tim are you coming? And Bob?'
-        + '\nTim says: Can you tell "main" that we are all coming?'
-        + '\nBob says: we are NOT coming!')); // should be 'all', not 'NOT'
-      port.close();
-    }));
-
-    SendPort tim = spawnFunction(timIsolate);
-    SendPort beth = spawnFunction(bethIsolate);
-
-    beth.send(
-        // because tim is created asynchronously, here we are sending an
-        // unresolved port:
-        ['main says: Beth, find out if Tim is coming.', tim],
-        port.toSendPort());
-  });
+  positive_test.baseTest(failForNegativeTest: true);
 }
-
diff --git a/tests/isolate/unresolved_ports_test.dart b/tests/isolate/unresolved_ports_test.dart
index 06f5d58..1072000 100644
--- a/tests/isolate/unresolved_ports_test.dart
+++ b/tests/isolate/unresolved_ports_test.dart
@@ -15,6 +15,8 @@
 //    by giving 'beth' a send-port to 'tim'.
 
 bethIsolate() {
+  // TODO(sigmund): use expectAsync2 when it is OK to use it within an isolate
+  // (issue #6856)
   port.receive((msg, reply) => msg[1].send(
         '${msg[0]}\nBeth says: Tim are you coming? And Bob?', reply));
 }
@@ -30,7 +32,7 @@
         '$msg\nBob says: we are all coming!'));
 }
 
-main() {
+baseTest({bool failForNegativeTest: false}) {
   test('Message chain with unresolved ports', () {
     ReceivePort port = new ReceivePort();
     port.receive(expectAsync2((msg, _) {
@@ -38,6 +40,7 @@
         '\nBeth says: Tim are you coming? And Bob?'
         '\nTim says: Can you tell "main" that we are all coming?'
         '\nBob says: we are all coming!'));
+      expect(failForNegativeTest, isFalse);
       port.close();
     }));
 
@@ -51,3 +54,5 @@
         port.toSendPort());
   });
 }
+
+main() => baseTest();
diff --git a/tests/language/abstract_factory_constructor_test.dart b/tests/language/abstract_factory_constructor_test.dart
index 0fc35de..d2e3a6f 100644
--- a/tests/language/abstract_factory_constructor_test.dart
+++ b/tests/language/abstract_factory_constructor_test.dart
@@ -13,12 +13,12 @@
 
 class A1 {
   A1() {}
-  abstract method();
+  method();  // Abstract.
   factory A1.make() { return new B(); }
 }
 
 class A2 {
-  abstract method();
+  method();  // Abstract.
   A2.make() {}
 }
 
diff --git a/tests/language/abstract_getter_test.dart b/tests/language/abstract_getter_test.dart
index 9e6e2c7..a745e35 100644
--- a/tests/language/abstract_getter_test.dart
+++ b/tests/language/abstract_getter_test.dart
@@ -5,7 +5,7 @@
 // Test to ensure that an abstract getter is not mistaken for a field.
 
 class Foo {
-  abstract get i;
+  get i;  // Abstract.
 }
 
 class Bar {
diff --git a/tests/language/abstract_syntax_test.dart b/tests/language/abstract_syntax_test.dart
index 4e653bf..b3f0a20 100644
--- a/tests/language/abstract_syntax_test.dart
+++ b/tests/language/abstract_syntax_test.dart
@@ -8,13 +8,11 @@
 }
 
 class A {
-  abstract foo();
-  abstract static bar(); /// 01: compile-time error
-  static abstract baz(); /// 02: compile-time error
+  /* abstract */ foo();
+  /* abstract */ static bar(); /// 01: compile-time error
 }
 
 class B extends A {
   foo() => 42;
   bar() => 87;
-  baz() => 99;
 }
diff --git a/tests/language/allocate_large_object.dart b/tests/language/allocate_large_object_test.dart
similarity index 100%
rename from tests/language/allocate_large_object.dart
rename to tests/language/allocate_large_object_test.dart
diff --git a/tests/language/arithmetic2_test.dart b/tests/language/arithmetic2_test.dart
index 64fc0c9..b0715e0 100644
--- a/tests/language/arithmetic2_test.dart
+++ b/tests/language/arithmetic2_test.dart
@@ -26,8 +26,6 @@
     return true;
   } on ArgumentError catch (e) {
     return true;
-  } on NullPointerException catch (e) {
-    return true;
   } on TypeError catch (e) {
     // In type checked mode.
     return true;
diff --git a/tests/language/bad_constructor_test.dart b/tests/language/bad_constructor_test.dart
index f4245af..3228017 100644
--- a/tests/language/bad_constructor_test.dart
+++ b/tests/language/bad_constructor_test.dart
@@ -10,12 +10,6 @@
   // Factory may not be static.
   static factory A() { return null; }  /// 01: compile-time error
 
-  // Constructor may not be abstract.
-  abstract A();  /// 02: compile-time error
-
-  // Factory may not be abstract
-  abstract factory A() { return null; }  /// 03: compile-time error
-
   // Named constructor may not conflict with names of methods and fields.
   var m;
   A.m() { m = 0; }  /// 04: compile-time error
diff --git a/tests/language/bailout2_test.dart b/tests/language/bailout2_test.dart
new file mode 100644
index 0000000..085c1d8
--- /dev/null
+++ b/tests/language/bailout2_test.dart
@@ -0,0 +1,24 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+var a;
+
+main() {
+  // Write a loop to force a bailout method on [A.foo].
+  for (int i = 0; i < 10; i++) {
+    if (a != null) new A().foo([]);
+    Expect.equals(42, new A().foo(new A()));
+  }
+}
+
+class A {
+  // In dart2js, the optimized version of foo tries to optimize the
+  // uses of a.length (which is used two times here: for the index,
+  // and for the bounds check), and that optmization used to crash
+  // the compiler.
+  foo(a) => a[a.length];
+
+  int get length => 42;
+  operator[] (index) => 42;
+}
diff --git a/tests/language/bailout3_test.dart b/tests/language/bailout3_test.dart
new file mode 100644
index 0000000..16cc121
--- /dev/null
+++ b/tests/language/bailout3_test.dart
@@ -0,0 +1,39 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test that the return type of a method is being registered for both
+// its bailout and optimized version in dart2js.
+
+var a;
+
+bar() {
+  if (a[0] == 0) {
+    // Force bailout version.
+    bar();
+    // Avoid inlining.
+    throw 0;
+  }
+  for (int i = 0; i < 10; i++) {
+    a[0] = 42;
+  }
+  // This return should say that bar can return an array or unknown.
+  return a;
+}
+
+foo() {
+  if (a[0] == 0) {
+    // Avoid inlining.
+    throw 0;
+  }
+  var a = bar();
+  // This check used to fail because dart2js was assuming [a] was an
+  // array.
+  Expect.equals(1, a.length);
+}
+
+main() {
+  a = new Map();
+  bar();
+  foo();
+}
diff --git a/tests/language/bailout4_test.dart b/tests/language/bailout4_test.dart
new file mode 100644
index 0000000..52e9713
--- /dev/null
+++ b/tests/language/bailout4_test.dart
@@ -0,0 +1,30 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test that dart2s computes the right bailout environment in presence
+// of nested loops.
+
+class A {
+  operator[] (index) => 42;
+}
+
+var a = new A();
+var b = new List(4);
+int count = 0;
+
+main() {
+  // Make the method recursive to make sure it gets an optimized
+  // version.
+  if (b[0] != null) main();
+
+  for (int i = 0; i < 2; i++) {
+    for (int j = 0; j < 2; j++) {
+      for (int k = 0; k < 2; k++) {
+        Expect.equals(42, a[i + j + k]);
+        count++;
+      }
+    }
+  }
+  Expect.equals(8, count);
+}
diff --git a/tests/language/call_through_null_getter_test.dart b/tests/language/call_through_null_getter_test.dart
index 0502496..24edb03 100644
--- a/tests/language/call_through_null_getter_test.dart
+++ b/tests/language/call_through_null_getter_test.dart
@@ -19,57 +19,39 @@
 
   static void testTopLevel() {
     topLevel = null;
-    expectThrowsNullPointerException(() { topLevel(); });
-    expectThrowsNullPointerException(() { (topLevel)(); });
-    expectThrowsNullPointerException(() { TOP_LEVEL_NULL(); });
-    expectThrowsNullPointerException(() { (TOP_LEVEL_NULL)(); });
+    expectThrowsNoSuchMethodError(() { topLevel(); });
+    expectThrowsNoSuchMethodError(() { (topLevel)(); });
+    expectThrowsNoSuchMethodError(() { TOP_LEVEL_NULL(); });
+    expectThrowsNoSuchMethodError(() { (TOP_LEVEL_NULL)(); });
   }
 
   static void testField() {
     A a = new A();
 
     a.field = null;
-    expectThrowsNullPointerException(() { a.field(); });
-    expectThrowsNullPointerException(() { (a.field)(); });
+    expectThrowsNoSuchMethodError(() { a.field(); });
+    expectThrowsNoSuchMethodError(() { (a.field)(); });
   }
 
   static void testGetter() {
     A a = new A();
 
     a.field = null;
-    expectThrowsNullPointerException(() { a.getter(); });
-    expectThrowsNullPointerException(() { (a.getter)(); });
+    expectThrowsNoSuchMethodError(() { a.getter(); });
+    expectThrowsNoSuchMethodError(() { (a.getter)(); });
   }
 
   static void testMethod() {
     A a = new A();
 
     a.field = null;
-    expectThrowsNullPointerException(() { a.method()(); });
+    expectThrowsNoSuchMethodError(() { a.method()(); });
   }
 
-  static void expectThrowsNullPointerException(fn) {
-    var exception = catchException(fn);
-    if (exception is! NullPointerException) {
-      Expect.fail("Wrong exception.  Expected: NullPointerException"
-          " got: ${exception}");
-    }
+  static void expectThrowsNoSuchMethodError(fn) {
+    Expect.throws(fn, (e) => e is NoSuchMethodError,
+                  "Should throw NoSuchMethodError");
   }
-
-  static catchException(fn) {
-    bool caught = false;
-    var result = null;
-    try {
-      fn();
-      Expect.equals(true, false);  // Shouldn't reach this.
-    } catch (e) {
-      caught = true;
-      result = e;
-    }
-    Expect.equals(true, caught);
-    return result;
-  }
-
 }
 
 
diff --git a/tests/language/closure3_test.dart b/tests/language/closure3_test.dart
index 8123228..c01bfc1 100644
--- a/tests/language/closure3_test.dart
+++ b/tests/language/closure3_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.
 
-// Test that a NullPointerException is thrown even when an expression
+// Test that a NoSuchMethodError is thrown even when an expression
 // seems to be free of side-effects.
 
 test(x, y) {
@@ -10,11 +10,5 @@
 }
 
 main() {
-  try {
-    test(null, 2);
-    Expect.fail('Expected NullPointerException');
-  } on NullPointerException catch (ex) {
-    return;
-  }
-  Expect.fail('Expected NullPointerException');
+  Expect.throws(() { test(null, 2); }, (e) => e is NoSuchMethodError);
 }
diff --git "a/tests/standalone/io/\303\246\303\270\303\245.dart" b/tests/language/compile_time_constant_q_test.dart
similarity index 71%
copy from "tests/standalone/io/\303\246\303\270\303\245.dart"
copy to tests/language/compile_time_constant_q_test.dart
index d03e720..3b38e3c 100644
--- "a/tests/standalone/io/\303\246\303\270\303\245.dart"
+++ b/tests/language/compile_time_constant_q_test.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:io';
-
+const double x = 14.0;
 main() {
-  Expect.equals('æøå', new File('æøå.dat').readAsStringSync());
+  print(x);
 }
diff --git a/tests/language/deopt_smi_op.dart b/tests/language/deopt_smi_op_test.dart
similarity index 100%
rename from tests/language/deopt_smi_op.dart
rename to tests/language/deopt_smi_op_test.dart
diff --git "a/tests/standalone/io/\303\246\303\270\303\245.dart" b/tests/language/do_while3_test.dart
similarity index 63%
copy from "tests/standalone/io/\303\246\303\270\303\245.dart"
copy to tests/language/do_while3_test.dart
index d03e720..615ebd1 100644
--- "a/tests/standalone/io/\303\246\303\270\303\245.dart"
+++ b/tests/language/do_while3_test.dart
@@ -2,8 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:io';
+// Test that a condition is only evaluated once in a loop.
 
 main() {
-  Expect.equals('æøå', new File('æøå.dat').readAsStringSync());
+  int c = 0;
+  do {
+    c++;
+  } while (c++ < 2);
+  Expect.equals(4, c);
 }
diff --git a/tests/language/double_int_to_string_test.dart b/tests/language/double_int_to_string_test.dart
new file mode 100644
index 0000000..96dbe0e
--- /dev/null
+++ b/tests/language/double_int_to_string_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.
+// Test basic integer operations.
+
+main() {
+  Expect.equals("0.0", (0.0).toString());
+  Expect.equals("9.0", (9.0).toString());
+  Expect.equals("90.0", (90.0).toString());
+  Expect.equals("111111111111111110000.0",
+                (111111111111111111111.0).toString());
+  Expect.equals("-9.0", (-9.0).toString());
+  Expect.equals("-90.0", (-90.0).toString());
+  Expect.equals("-111111111111111110000.0",
+                (-111111111111111111111.0).toString());
+  Expect.equals("1000.0", (1000.0).toString());
+  Expect.equals("1000000000000000100.0", (1000000000000000128.0).toString());
+}
diff --git a/tests/language/double_to_string.dart b/tests/language/double_to_string_test.dart
similarity index 82%
rename from tests/language/double_to_string.dart
rename to tests/language/double_to_string_test.dart
index 6e852a1..ce30f50 100644
--- a/tests/language/double_to_string.dart
+++ b/tests/language/double_to_string_test.dart
@@ -7,15 +7,10 @@
   Expect.equals("NaN", (double.NAN).toString());
   Expect.equals("Infinity", (1/0).toString());
   Expect.equals("-Infinity", (-1/0).toString());
-  Expect.equals("0.0", (0.0).toString());
-  Expect.equals("9.0", (9.0).toString());
-  Expect.equals("90.0", (90.0).toString());
   Expect.equals("90.12", (90.12).toString());
   Expect.equals("0.1", (0.1).toString());
   Expect.equals("0.01", (0.01).toString());
   Expect.equals("0.0123", (0.0123).toString());
-  Expect.equals("111111111111111110000.0",
-                (111111111111111111111.0).toString());
   Expect.equals("1.1111111111111111e+21",
                 (1111111111111111111111.0).toString());
   Expect.equals("1.1111111111111111e+22",
@@ -30,14 +25,10 @@
   Expect.equals("1.23e-8", (0.0000000123).toString());
 
   Expect.equals("-0.0", (-0.0).toString());
-  Expect.equals("-9.0", (-9.0).toString());
-  Expect.equals("-90.0", (-90.0).toString());
   Expect.equals("-90.12", (-90.12).toString());
   Expect.equals("-0.1", (-0.1).toString());
   Expect.equals("-0.01", (-0.01).toString());
   Expect.equals("-0.0123", (-0.0123).toString());
-  Expect.equals("-111111111111111110000.0",
-                (-111111111111111111111.0).toString());
   Expect.equals("-1.1111111111111111e+21",
                 (-1111111111111111111111.0).toString());
   Expect.equals("-1.1111111111111111e+22",
@@ -51,9 +42,7 @@
   Expect.equals("-1.2e-8", (-0.000000012).toString());
   Expect.equals("-1.23e-8", (-0.0000000123).toString());
 
-  Expect.equals("1000.0", (1000.0).toString());
   Expect.equals("0.00001", (0.00001).toString());
-  Expect.equals("1000000000000000100.0", (1000000000000000128.0).toString());
   Expect.equals("1e+21", (1000000000000000012800.0).toString());
   Expect.equals("-1e+21", (-1000000000000000012800.0).toString());
   Expect.equals("1e-7", (0.0000001).toString());
diff --git a/tests/language/exception_in_increment.dart b/tests/language/exception_in_increment_test.dart
similarity index 100%
rename from tests/language/exception_in_increment.dart
rename to tests/language/exception_in_increment_test.dart
diff --git a/tests/language/exception_test.dart b/tests/language/exception_test.dart
index c08a872..0876c5c 100644
--- a/tests/language/exception_test.dart
+++ b/tests/language/exception_test.dart
@@ -21,11 +21,11 @@
 
     bool correctCatch = false;
     try {
-      // This throws NullPointerException.
+      // This throws NullThrownError
       throw null;
     } on String catch (s) {
       correctCatch = false;
-    } on NullPointerException catch (e) {
+    } on NullThrownError catch (e) {
       correctCatch = true;
     } catch (x) {
       correctCatch = false;
diff --git a/tests/language/external_test.dart b/tests/language/external_test.dart
index 8e1b879..324629a 100644
--- a/tests/language/external_test.dart
+++ b/tests/language/external_test.dart
@@ -14,7 +14,6 @@
   external f12() => 1;  /// 12: compile-time error
   external static f13();  /// 13: runtime error
   static external f14();  /// 14: compile-time error
-  external abstract f15();  /// 15: compile-time error
   int external f16();  /// 16: compile-time error
 
   external Foo.n20();  /// 20: runtime error
diff --git a/tests/language/factory_redirection2_test.dart b/tests/language/factory_redirection2_test.dart
new file mode 100644
index 0000000..b4592d8
--- /dev/null
+++ b/tests/language/factory_redirection2_test.dart
@@ -0,0 +1,21 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test that it is a compile-time error to have a redirection in a
+// non-factory constructor.
+
+class Foo {
+  Foo()
+  = Bar /// 01: compile-time error
+  ;
+}
+
+class Bar extends Foo {
+  factory Bar() => null;
+}
+
+main() {
+  Expect.isTrue(new Foo() is Foo);
+  Expect.isFalse(new Foo() is Bar);
+}
diff --git a/tests/language/first_class_types_constants_test.dart b/tests/language/first_class_types_constants_test.dart
new file mode 100644
index 0000000..6a4c4d4
--- /dev/null
+++ b/tests/language/first_class_types_constants_test.dart
@@ -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.
+
+class C<T> {
+  final T t;
+  const C(this.t);
+}
+
+typedef int Fun(bool, String);
+
+const c0 = C;
+const c1 = const C(C);
+const c2 = Fun;
+const c3 = const C(Fun);
+
+main() {
+  Expect.identical(C, C);
+  Expect.identical(C, c0);
+  Expect.identical(c1, c1);
+  Expect.notEquals(c0, c1);
+  Expect.notEquals(c1, c2);
+  Expect.identical(c1.t, c0);
+  Expect.notEquals(C, Fun);
+  Expect.identical(Fun, Fun);
+  Expect.identical(Fun, c2);
+  Expect.identical(c3.t, c2);
+}
diff --git a/tests/language/first_class_types_literals_test.dart b/tests/language/first_class_types_literals_test.dart
index df8d6d6..31724b6 100644
--- a/tests/language/first_class_types_literals_test.dart
+++ b/tests/language/first_class_types_literals_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.
 
-class C<T> {}
+class C<T, U, V> {}
 
 class D {}
 
@@ -23,6 +23,9 @@
 
   // Test that types from runtimeType and literals agree.
   Expect.equals(int, 1.runtimeType);
+  Expect.equals(String, 'hest'.runtimeType);
+  Expect.equals(double, (0.5).runtimeType);
+  Expect.equals(bool, true.runtimeType);
   Expect.equals(C, new C().runtimeType);
   Expect.equals(D, new D().runtimeType);
 
diff --git a/tests/language/first_class_types_test.dart b/tests/language/first_class_types_test.dart
index 419dbbb..95090d6 100644
--- a/tests/language/first_class_types_test.dart
+++ b/tests/language/first_class_types_test.dart
@@ -24,12 +24,19 @@
   var i = 1;
   var s = 'string';
   var d = 3.14;
+  var b = true;
   sameType(2, i);
   sameType('hest', s);
   sameType(1.2, d);
+  sameType(false, b);
 
   var l = [1, 2, 3];
   var m = {'a': 1, 'b': 2};
   sameType([], l);
   sameType({}, m);
+
+  // Test parameterized lists.
+  sameType(new List<int>(), new List<int>());
+  differentType(new List<int>(), new List<num>());
+  differentType(new List<int>(), new List());
 }
diff --git a/tests/language/get_set_syntax_test.dart b/tests/language/get_set_syntax_test.dart
index 4f9d80c..2882f45 100644
--- a/tests/language/get_set_syntax_test.dart
+++ b/tests/language/get_set_syntax_test.dart
@@ -23,8 +23,6 @@
 class C1 {
   List get;
   List get a;
-  abstract List get a2;
-  abstract List get a3 => null;  /// 08: compile-time error
   List get b, c;      /// 09: compile-time error
 
   List set;
@@ -35,8 +33,6 @@
 class C2 {
   List<int> get;
   List<int> get a;
-  abstract List<int> get a2;
-  abstract List<int> get a3 => null;  /// 08: compile-time error
   List<int> get b, c; /// 13: compile-time error
 
   List<int> set;
diff --git a/tests/language/implicit_this_test.dart b/tests/language/implicit_this_test.dart
index 4d776e2..3ae0ea8 100644
--- a/tests/language/implicit_this_test.dart
+++ b/tests/language/implicit_this_test.dart
@@ -17,7 +17,7 @@
 // This class is implicitly abstract as it declares an abstract getter
 // method.
 class SubAbstract2 extends Abstract {
-  abstract get x;
+  get x;  // Abstract.
 }
 
 // This class does not implement "x" either, but it is not marked
diff --git a/tests/language/inline_add_constants_to_initial_env.dart b/tests/language/inline_add_constants_to_initial_env_test.dart
similarity index 100%
rename from tests/language/inline_add_constants_to_initial_env.dart
rename to tests/language/inline_add_constants_to_initial_env_test.dart
diff --git a/tests/language/inline_closure_with_constant_arguments.dart b/tests/language/inline_closure_with_constant_arguments_test.dart
similarity index 100%
rename from tests/language/inline_closure_with_constant_arguments.dart
rename to tests/language/inline_closure_with_constant_arguments_test.dart
diff --git a/tests/language/interface_test.dart b/tests/language/interface_test.dart
index 9104354..b36fbc7 100644
--- a/tests/language/interface_test.dart
+++ b/tests/language/interface_test.dart
@@ -30,9 +30,9 @@
   int foo() { return 1; }
 
   // intentionally unimplemented methods
-  abstract beta();
-  abstract String beta1();
-  abstract String beta2(double d);
+  beta();  // Abstract.
+  String beta1();  // Abstract.
+  String beta2(double d);  // Abstract.
 }
 
 main() {
diff --git a/tests/language/language.status b/tests/language/language.status
index ee3775a..5c4c267 100644
--- a/tests/language/language.status
+++ b/tests/language/language.status
@@ -16,10 +16,12 @@
 # 3) Update the language/src directory with the updated test.
 
 [ $compiler == none ]
+library_juxtaposition_test: Fail # Issue 6877
 part_test: Fail
 part2_test: Fail
 gc_test: Pass, Fail # Issue 1487
 pseudo_kw_illegal_test/14: Fail  # Issue 356
+first_class_types_constants_test: Fail # Issue 6282
 
 # These bugs refer currently ongoing language discussions.
 constructor5_test: Fail           # (Discussion ongoing)
@@ -48,8 +50,6 @@
 
 compile_time_constant10_test/none: Fail # issue 5214
 
-call_through_null_getter_test: Fail # issue 6124
-
 invocation_mirror_test: Fail # issue 3326, 3622.
 no_such_method_test: Fail # issue 3326, 3622.
 
@@ -82,6 +82,8 @@
 compile_time_constant_checked3_test/06: Fail, OK
 
 [ $compiler == dartc ]
+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
 implicit_this_test/none: Fail # should not warn about allocating SubAbstract2
 metadata_test: Fail
@@ -89,7 +91,6 @@
 bad_override_test/02: Fail, OK # issue 6578, warning expected on "static" modifier
 const_locals_test: Fail
 const_nested_test: Fail
-get_set_syntax_test/none: Fail # does not accept getter/setter with no method body
 application_negative_test: Fail # Runtime only test, rewrite as multitest
 assign_instance_method_negative_test: Fail # Runtime only test, rewrite as multitest
 body_less_constructor_wrong_arg_negative_test: Fail # Runtime only test, rewrite as multitest
@@ -138,7 +139,6 @@
 factory5_test/00: Fail # issue 3079
 field_method4_negative_test: Fail  # Runtime only test, rewrite as multitest
 
-first_class_types_literals_test: Fail # issue 6283
 getter_no_setter_test/01: Fail # Fails to detect compile-time error.
 getter_no_setter2_test/01: Fail # Fails to detect compile-time error.
 instance_call_wrong_argument_count_negative_test: Fail # Runtime only test, rewrite as multitest
@@ -191,8 +191,6 @@
 bad_constructor_test/05: Fail, OK
 
 # test issue 5529
-abstract_factory_constructor_test/none: Fail, OK
-abstract_syntax_test/none: Fail, OK
 interface_test/none: Fail, OK
 
 # test issue 6338
@@ -336,6 +334,12 @@
 typed_message_test: Fail, OK
 
 
+# test issue 6818
+type_variable_identifier_expression_negative_test: Fail, OK
+
+# test issue 6866
+abstract_factory_constructor_test/00: Fail, OK
+
 
 #
 # Add new dartc annotations above in alphabetical order
@@ -381,13 +385,13 @@
 *: Skip
 
 [ $compiler == dart2dart ]
-const_factory_redirection_test: Fail # TRIAGE
-redirecting_factory_infinite_steps_test/01: Fail, Pass # TRIAGE: fails in minified mode. http://dartbug.com/6603
+factory_redirection2_test/01: Fail # Inherited from dart2js.
+const_factory_redirection_test: Fail # http://dartbug.com/6894
 
-many_overridden_no_such_method_test: Fail, Pass # TRIAGE: fails in minified mode
-overridden_no_such_method_test: Fail, Pass # TRIAGE: fails in minified mode
+many_overridden_no_such_method_test: Fail, Pass, OK # Fails in minified mode, test depends on method names.
+overridden_no_such_method_test: Fail, Pass, OK # Fails in minified mode, test depends on method names.
+
 # Calling unresolved class constructor:
-# call_constructor_on_unresolvable_class_test/07: Fail
 call_nonexistent_constructor_test: Fail
 
 bad_override_test/01: Fail
@@ -396,8 +400,7 @@
 illegal_invocation_test/04: Fail, OK # Class literals are expressions now.
 illegal_invocation_test/05: Fail, OK # Type variables are expressions now.
 
-# Renaming type from platform library:
-dynamic_test: Fail
+first_class_types_constants_test: Fail # Issue 6282
 
 # Missing compile-time error when modifying final local variables
 final_variable_assignment_test/01: Fail
@@ -554,7 +557,9 @@
 
 named_parameters_aggregated_test/05: Fail # Compile-time error reported instead of static type warning.
 
-new_expression_type_args_test/02: Fail # Test does not conform with spec.
+type_variable_bounds_test/07: Fail # Wrongly reports compile-time error.
+new_expression_type_args_test/00: Fail # Wrongly reports compile-time error.
+new_expression_type_args_test/01: Fail # Wrongly reports compile-time error.
 
 get_set_syntax_test/00: Fail # Fixed by https://chromiumcodereview.appspot.com/10915111
 get_set_syntax_test/01: Fail # Fixed by https://chromiumcodereview.appspot.com/10915111
@@ -589,8 +594,6 @@
 
 type_error_test: Fail, OK # VM bug: http://dartbug.com/5280
 
-call_through_null_getter_test: Fail # issue 6130
-
 # This is a VM error when the compiled code is run.
 invocation_mirror_test: Fail # issue 3326, 3622.
 invocation_mirror_indirect_test: Fail # issue 3326, 3622.
diff --git a/tests/language/language_dart2js.status b/tests/language/language_dart2js.status
index 224e0e6..ceece29 100644
--- a/tests/language/language_dart2js.status
+++ b/tests/language/language_dart2js.status
@@ -42,13 +42,6 @@
 type_variable_bounds2_test/03: Fail
 type_variable_bounds2_test/05: Fail
 type_variable_bounds2_test/06: Pass # For the wrong reasons.
-type_variable_scope_test/00: Fail
-type_variable_scope_test/01: Fail
-type_variable_scope_test/02: Fail
-type_variable_scope_test/03: Fail
-type_variable_scope_test/04: Fail
-type_variable_scope_test/05: Fail
-type_variable_scope2_test: Fail
 assign_top_method_negative_test: Pass # For the wrong reasons.
 f_bounded_quantification_test/01: Fail
 f_bounded_quantification_test/02: Fail
@@ -59,16 +52,11 @@
 factory1_test/00: Fail
 factory1_test/01: Fail
 
-type_parameter_test/01: Fail # Issue 4932
-type_parameter_test/02: Fail # Issue 4932
-type_parameter_test/03: Fail # Issue 4932
-type_parameter_test/04: Fail # Issue 4932
-
 super_call4_test: Fail # Badly generated noSuchMethod call.
 
 [ $compiler == dart2js && $unchecked ]
 assertion_test: Fail
-new_expression_type_args_test/02: Fail # Test does not conform with spec.
+type_variable_bounds_test/07: Fail # Wrongly reports compile-time error.
 factory_redirection_test/08: Fail
 factory_redirection_test/09: Fail
 factory_redirection_test/10: Fail
@@ -94,6 +82,11 @@
 compile_time_constant_checked3_test/06: Fail, OK
 
 [ $compiler == dart2js ]
+factory_redirection2_test/01: Fail # http://dartbug.com/6791
+new_expression_type_args_test/00: Fail # Wrongly reports compile-time error.
+new_expression_type_args_test/01: Fail # Wrongly reports compile-time error.
+double_int_to_string_test: Fail # Issue 1533 (double/integer distinction)
+mint_arithmetic_test: Fail # Issue 1533 (big integer arithmetic).
 arithmetic_test: Fail # http://dartbug.com/6627
 factory_redirection_test/01: Fail
 factory_redirection_test/02: Crash
@@ -151,7 +144,6 @@
 const_var_test: Fail # Map literals take 2 type arguments.
 map_literal3_test: Fail # Map literals take 2 type arguments.
 ct_const_test: Fail # We don't take the generic type into account yet.
-char_escape_test: Fail # Unhandled non-BMP character: U+10000
 default_factory_library_test: Fail # lib is not a type
 dynamic_test: Fail # cannot resolve type F1
 constructor_redirect2_test/03: Fail # redirecting ctor with initializing formal
@@ -168,7 +160,6 @@
 function_type_parameter2_test: Fail # Internal Error: expected optional parameters
 function_type_parameter_test: Fail # Internal Error: expected optional parameters
 generic_instanceof_test: Fail # cannot resolve type T
-generic_instanceof2_test: Fail # fails an instance of test at run time
 generic_instanceof3_test: Fail # cannot handle generics.
 generic_test: Fail # cannot resolve type T
 get_set_syntax_test/00: Fail # Fixed by https://chromiumcodereview.appspot.com/10915111
@@ -379,3 +370,6 @@
 string_interpolate_npe_test: Fail
 closure_call_wrong_argument_count_negative_test: Skip
 label_test: Skip
+
+[ $compiler == dart2js && $host_checked ]
+factory_redirection2_test/01: Crash # http://dartbug.com/6791
diff --git "a/tests/standalone/io/\303\246\303\270\303\245.dart" b/tests/language/library_juxtaposition_lib.dart
similarity index 68%
copy from "tests/standalone/io/\303\246\303\270\303\245.dart"
copy to tests/language/library_juxtaposition_lib.dart
index d03e720..93f6691 100644
--- "a/tests/standalone/io/\303\246\303\270\303\245.dart"
+++ b/tests/language/library_juxtaposition_lib.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:io';
+library lib;
 
-main() {
-  Expect.equals('æøå', new File('æøå.dat').readAsStringSync());
-}
+part "library_" "juxtaposition_" "part.dart";
diff --git "a/tests/standalone/io/\303\246\303\270\303\245.dart" b/tests/language/library_juxtaposition_part.dart
similarity index 67%
copy from "tests/standalone/io/\303\246\303\270\303\245.dart"
copy to tests/language/library_juxtaposition_part.dart
index d03e720..2b14942 100644
--- "a/tests/standalone/io/\303\246\303\270\303\245.dart"
+++ b/tests/language/library_juxtaposition_part.dart
@@ -2,8 +2,4 @@
 // for 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';
-
-main() {
-  Expect.equals('æøå', new File('æøå.dat').readAsStringSync());
-}
+const c = 47;
diff --git "a/tests/standalone/io/\303\246\303\270\303\245.dart" b/tests/language/library_juxtaposition_test.dart
similarity index 71%
rename from "tests/standalone/io/\303\246\303\270\303\245.dart"
rename to tests/language/library_juxtaposition_test.dart
index d03e720..ee1e7b4 100644
--- "a/tests/standalone/io/\303\246\303\270\303\245.dart"
+++ b/tests/language/library_juxtaposition_test.dart
@@ -2,8 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:io';
+import "library_" "juxtaposition_" "lib.dart";
 
 main() {
-  Expect.equals('æøå', new File('æøå.dat').readAsStringSync());
+  Expect.equals(c, 47);
 }
diff --git a/tests/language/method_invocation_test.dart b/tests/language/method_invocation_test.dart
index 22e5282..44c9da2 100644
--- a/tests/language/method_invocation_test.dart
+++ b/tests/language/method_invocation_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 // Testing method invocation.
-// Currently testing only NullPointerException.
+// Currently testing only NoSuchMethodError.
 
 class A {
   A() {}
@@ -20,7 +20,7 @@
     bool exceptionCaught = false;
     try {
       a.foo();
-    } on NullPointerException catch (e) {
+    } on NoSuchMethodError catch (e) {
       exceptionCaught = true;
     }
     Expect.equals(true, exceptionCaught);
diff --git a/tests/language/mint_arithmetic.dart b/tests/language/mint_arithmetic_test.dart
similarity index 97%
rename from tests/language/mint_arithmetic.dart
rename to tests/language/mint_arithmetic_test.dart
index f45d07c..0e05d92 100644
--- a/tests/language/mint_arithmetic.dart
+++ b/tests/language/mint_arithmetic_test.dart
@@ -71,7 +71,6 @@
 test_mint_double_op() {
   for (var i=0; i<10000; i++) test_func(4294967295, 1);
   Expect.equals(2.0, test_func(4294967295, 1));
-  Expect.equals(4294967296.0, test_func(4294967295, 1));
 }
 
 main() {
diff --git a/tests/language/mint_compares.dart b/tests/language/mint_compares_test.dart
similarity index 100%
rename from tests/language/mint_compares.dart
rename to tests/language/mint_compares_test.dart
diff --git a/tests/language/new_expression_type_args_test.dart b/tests/language/new_expression_type_args_test.dart
index 4f1a11b..c454c17 100644
--- a/tests/language/new_expression_type_args_test.dart
+++ b/tests/language/new_expression_type_args_test.dart
@@ -1,16 +1,16 @@
-// 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.
 
 // Tests showing errors using type-arguments in new expressions:
 class A<T> {
-  // Can't intantiate type parameter (within static or instance method).
-  m1() => new T();         /// 00: compile-time error
-  static m2() => new T();  /// 01: compile-time error
+  // Can't instantiate type parameter (within static or instance method).
+  m1() => new T();         /// 00: static type warning, runtime error
+  static m2() => new T();  /// 01: static type warning, runtime error
 
   // OK when used within instance method, but not in static method.
   m3() => new A<T>();
-  static m4() => new A<T>(); /// 02: compile-time error
+  static m4() => new A<T>(); /// 02: static type warning, dynamic type error
 }
 
 main() {
diff --git a/tests/language/null_access_error_test.dart b/tests/language/null_access_error_test.dart
new file mode 100644
index 0000000..f36a9f3
--- /dev/null
+++ b/tests/language/null_access_error_test.dart
@@ -0,0 +1,49 @@
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class NullAccessTest {
+
+  static void testNullVariable() {
+    int variable;
+    bool exceptionCaught = false;
+    bool wrongExceptionCaught = false;
+    try {
+      variable++;
+    } on NoSuchMethodError catch (ex) {
+      exceptionCaught = true;
+    } catch (ex) {
+      wrongExceptionCaught = true;
+    }
+    Expect.isTrue(exceptionCaught);
+    Expect.isFalse(wrongExceptionCaught);
+  }
+
+  static int helperFunction(int parameter) {
+    return parameter++;
+  }
+
+  static void testNullFunctionCall() {
+    int variable;
+    bool exceptionCaught = false;
+    bool wrongExceptionCaught = false;
+    try {
+      variable = helperFunction(variable);
+    } on NoSuchMethodError catch (ex) {
+      exceptionCaught = true;
+    } catch (ex) {
+      wrongExceptionCaught = true;
+    }
+    Expect.isTrue(exceptionCaught);
+    Expect.isFalse(wrongExceptionCaught);
+  }
+
+  static void testMain() {
+    testNullVariable();
+    testNullFunctionCall();
+  }
+}
+
+main() {
+  NullAccessTest.testMain();
+}
diff --git a/tests/language/null_pointer_exception_test.dart b/tests/language/null_pointer_exception_test.dart
deleted file mode 100644
index 0872cea..0000000
--- a/tests/language/null_pointer_exception_test.dart
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class NullPointerExceptionTest {
-
-  static void testNullPointerExceptionVariable() {
-    int variable;
-    bool exceptionCaught = false;
-    bool wrongExceptionCaught = false;
-    try {
-      variable++;
-    } on NullPointerException catch (ex) {
-      exceptionCaught = true;
-    } on Exception catch (ex) {
-      wrongExceptionCaught = true;
-    }
-    Expect.equals(true, exceptionCaught);
-    Expect.equals(true, !wrongExceptionCaught);
-  }
-
-  static int helperFunction(int parameter) {
-    return parameter++;
-  }
-
-  static void testNullPointerExceptionFunctionCall() {
-    int variable;
-    bool exceptionCaught = false;
-    bool wrongExceptionCaught = false;
-    try {
-      variable = helperFunction(variable);
-    } on NullPointerException catch (ex) {
-      exceptionCaught = true;
-    } on Exception catch (ex) {
-      wrongExceptionCaught = true;
-    }
-    Expect.equals(true, exceptionCaught);
-    Expect.equals(true, !wrongExceptionCaught);
-  }
-
-  static void testMain() {
-    testNullPointerExceptionVariable();
-    testNullPointerExceptionFunctionCall();
-  }
-}
-
-main() {
-  NullPointerExceptionTest.testMain();
-}
diff --git a/tests/language/optimize_redundant_array_load.dart b/tests/language/optimize_redundant_array_load_test.dart
similarity index 100%
rename from tests/language/optimize_redundant_array_load.dart
rename to tests/language/optimize_redundant_array_load_test.dart
diff --git a/tests/language/optimized_constant_array_string_access.dart b/tests/language/optimized_constant_array_string_access_test.dart
similarity index 100%
rename from tests/language/optimized_constant_array_string_access.dart
rename to tests/language/optimized_constant_array_string_access_test.dart
diff --git a/tests/language/optimized_hoisting_checked_mode_assert.dart b/tests/language/optimized_hoisting_checked_mode_assert_test.dart
similarity index 100%
rename from tests/language/optimized_hoisting_checked_mode_assert.dart
rename to tests/language/optimized_hoisting_checked_mode_assert_test.dart
diff --git a/tests/language/optimized_lists.dart b/tests/language/optimized_lists_test.dart
similarity index 96%
rename from tests/language/optimized_lists.dart
rename to tests/language/optimized_lists_test.dart
index 399b744..cc3b862 100644
--- a/tests/language/optimized_lists.dart
+++ b/tests/language/optimized_lists_test.dart
@@ -25,5 +25,5 @@
   Expect.equals(2, c[1]);
   // Test elimination of array length computation.
   var v = c[n];
-  Expet equals(v, c[n]);
+  Expect.equals(v, c[n]);
 }
diff --git a/tests/language/optimized_string_charat_test.dart b/tests/language/optimized_string_charat_test.dart
new file mode 100644
index 0000000..b11c672
--- /dev/null
+++ b/tests/language/optimized_string_charat_test.dart
@@ -0,0 +1,65 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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 optimized [] on strings.
+
+var a = "abc";
+var b = "øbc";
+var c = new String.fromCharCodes([123, 456, 789]);
+
+test_charat(s, i) {
+  return s[i];
+}
+
+test_const_str(i) {
+  return "abc"[i];
+}
+
+
+test_const_index(s) {
+  return s[0];
+}
+
+test_const_index2(s) {
+  return s[3];
+}
+
+main() {
+  Expect.equals("a", test_charat(a, 0));
+  for (var i=0; i<10000; i++) test_charat(a, 0);
+  Expect.equals("a", test_charat(a, 0));
+  Expect.equals("b", test_charat(a, 1));
+  Expect.equals("c", test_charat(a, 2));
+  Expect.throws(() => test_charat(a, 3));
+
+  Expect.equals("a", test_const_str(0));
+  for (var i=0; i<10000; i++) test_const_str(0);
+  Expect.equals("a", test_const_str(0));
+  Expect.equals("b", test_const_str(1));
+  Expect.equals("c", test_const_str(2));
+  Expect.throws(() => test_const_str(3));
+
+  Expect.equals("a", test_const_index(a));
+  for (var i=0; i<10000; i++) test_const_index(a);
+  Expect.equals("a", test_const_index(a));
+  Expect.equals("ø", test_const_index(b));
+  Expect.equals(new String.fromCharCodes([123]), test_const_index(c));
+  Expect.throws(() => test_const_index2(a));
+
+  Expect.equals("ø", test_charat(b, 0));
+  for (var i=0; i<10000; i++) test_charat(b, 0);
+  Expect.equals("ø", test_charat(b, 0));
+  Expect.equals("b", test_charat(b, 1));
+  Expect.equals("c", test_charat(b, 2));
+  Expect.throws(() => test_charat(b, 3));
+
+  Expect.equals(new String.fromCharCodes([123]), test_charat(c, 0));
+  for (var i=0; i<10000; i++) test_charat(c, 0);
+  Expect.equals(new String.fromCharCodes([123]), test_charat(c, 0));
+  Expect.equals(new String.fromCharCodes([456]), test_charat(c, 1));
+  Expect.equals(new String.fromCharCodes([789]), test_charat(c, 2));
+  Expect.throws(() => test_charat(c, 3));
+
+
+}
diff --git a/tests/language/optimized_string_charcodeat.dart b/tests/language/optimized_string_charcodeat_test.dart
similarity index 100%
rename from tests/language/optimized_string_charcodeat.dart
rename to tests/language/optimized_string_charcodeat_test.dart
diff --git a/tests/language/property_field_override_test.dart b/tests/language/property_field_override_test.dart
index 7ce82bd..50f64cb9 100644
--- a/tests/language/property_field_override_test.dart
+++ b/tests/language/property_field_override_test.dart
@@ -4,7 +4,7 @@
 
 // Test overriding a getter property with a field.
 class A {
-  abstract int get v;
+  int get v;  // Abstract.
 
   int a() {
     return v - 1;
diff --git a/tests/language/string_interpolate_npe_test.dart b/tests/language/string_interpolate_null_test.dart
similarity index 84%
rename from tests/language/string_interpolate_npe_test.dart
rename to tests/language/string_interpolate_null_test.dart
index 0baa32a..c8aff4a 100644
--- a/tests/language/string_interpolate_npe_test.dart
+++ b/tests/language/string_interpolate_null_test.dart
@@ -15,8 +15,8 @@
   a = null;
   try {
     s = "Hello Mr. ${a.name}";
-  } on NullPointerException catch (e) {
+  } on NoSuchMethodError catch (e) {
     return;
   }
-  Expect.fail("NullPointerException not thrown");
+  Expect.fail("NoSuchMethodError not thrown");
 }
diff --git a/tests/language/type_error_test.dart b/tests/language/type_error_test.dart
index 18d72ce..60784dc 100644
--- a/tests/language/type_error_test.dart
+++ b/tests/language/type_error_test.dart
@@ -151,7 +151,7 @@
   try {
     print(o);
   } on TypeError catch (e) {
-    print('unexpected type error: ${NoSuchMethodError.safeToString(e)}');
+    print('unexpected type error: ${Error.safeToString(e)}');
     throw; // Unexpected type error.
   } on CastError catch (e) {
     print(e); // This might provoke an error.
diff --git a/tests/language/type_variable_bounds_test.dart b/tests/language/type_variable_bounds_test.dart
index fd97593..a357b8c 100644
--- a/tests/language/type_variable_bounds_test.dart
+++ b/tests/language/type_variable_bounds_test.dart
@@ -60,7 +60,7 @@
   new Box<String>().makeFoo();
 
   // Fisk does not exist.
-  new Box<Fisk>(); /// 07: compile-time error
+  new Box<Fisk>(); /// 07: static type warning, dynamic type error
 
   // Too many type arguments.
   new Box<Object, Object>(); /// 08: compile-time error
diff --git a/tests/language/type_variable_shadows_class.dart b/tests/language/type_variable_shadows_class.dart
deleted file mode 100644
index 1d0538a..0000000
--- a/tests/language/type_variable_shadows_class.dart
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// A reference to a class that is shadowed by a type variable should still work
-// in a static context.
-
-class T {
-  String toString() => "Class T";
-  static String staticToString() => "Class T (static)";
-}
-
-class A<T> {
-  static method() {
-    var foo = new T();
-    Expect.equals("Class T", foo.toString());
-  }
-  instMethod() {
-    var foo = T.staticToString();
-    Expect.equals("Class T (static)", foo);
-  }
-}
-
-main() {
-  A.method();
-  new A<String>().instMethod();
-}
diff --git a/tests/language/typed_selector_test.dart b/tests/language/typed_selector_test.dart
index 5431d36..8624528 100644
--- a/tests/language/typed_selector_test.dart
+++ b/tests/language/typed_selector_test.dart
@@ -12,7 +12,7 @@
 }
 
 abstract class B {
-  abstract get document;
+  get document;  // Abstract.
 }
 
 class C extends A implements B {
diff --git a/tests/lib/crypto/hmac_md5_test.dart b/tests/lib/crypto/hmac_md5_test.dart
index 24753bf..f47c710 100644
--- a/tests/lib/crypto/hmac_md5_test.dart
+++ b/tests/lib/crypto/hmac_md5_test.dart
@@ -71,7 +71,7 @@
                     0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
                     0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa ] ];
 
-var hmac_md5_macs =
+var hmac_md5_string_macs =
     const [ '9294727a3638bb1c13f48ef8158bfc9d',
             '750c783e6ab0b503eaa86e310a5db738',
             '56be34521d144c88dbb8c733f0e8b3f6',
@@ -80,13 +80,34 @@
             '6b1ab7fe4bd7bf8f0b62e6ce61b9d0cd',
             '6f630fad67cda0ee1fb1f562db3aa53e' ];
 
-void testStandardVectors(inputs, keys, macs) {
+var hmac_md5_macs =
+    const [ const [0x92, 0x94, 0x72, 0x7a, 0x36, 0x38, 0xbb, 0x1c, 0x13, 0xf4,
+                   0x8e, 0xf8, 0x15, 0x8b, 0xfc, 0x9d],
+            const [0x75, 0x0c, 0x78, 0x3e, 0x6a, 0xb0, 0xb5, 0x03, 0xea, 0xa8,
+                   0x6e, 0x31, 0x0a, 0x5d, 0xb7, 0x38],
+            const [0x56, 0xbe, 0x34, 0x52, 0x1d, 0x14, 0x4c, 0x88, 0xdb, 0xb8,
+                   0xc7, 0x33, 0xf0, 0xe8, 0xb3, 0xf6],
+            const [0x69, 0x7e, 0xaf, 0x0a, 0xca, 0x3a, 0x3a, 0xea, 0x3a, 0x75,
+                   0x16, 0x47, 0x46, 0xff, 0xaa, 0x79],
+            const [0x56, 0x46, 0x1e, 0xf2, 0x34, 0x2e, 0xdc, 0x00, 0xf9, 0xba,
+                   0xb9, 0x95, 0x69, 0x0e, 0xfd, 0x4c],
+            const [0x6b, 0x1a, 0xb7, 0xfe, 0x4b, 0xd7, 0xbf, 0x8f, 0x0b, 0x62,
+                   0xe6, 0xce, 0x61, 0xb9, 0xd0, 0xcd],
+            const [0x6f, 0x63, 0x0f, 0xad, 0x67, 0xcd, 0xa0, 0xee, 0x1f, 0xb1,
+                   0xf5, 0x62, 0xdb, 0x3a, 0xa5, 0x3e]];
+
+void testStandardVectors(inputs, keys, string_macs, macs) {
   for (var i = 0; i < inputs.length; i++) {
-    var d = new HMAC(new MD5(), keys[i]).update(inputs[i]).digest();
-    Expect.isTrue(CryptoUtils.bytesToHex(d).startsWith(macs[i]), '$i');
+    var h = new HMAC(new MD5(), keys[i]);
+    var d = h.update(inputs[i]).digest();
+    Expect.isTrue(CryptoUtils.bytesToHex(d).startsWith(string_macs[i]), '$i');
+    Expect.isTrue(h.verify(macs[i]));
+    Expect.isFalse(h.verify(macs[(i+1)%macs.length]));
+    Expect.throws(() => h.verify([]));
   }
 }
 
 void main() {
-  testStandardVectors(hmac_md5_inputs, hmac_md5_keys, hmac_md5_macs);
+  testStandardVectors(hmac_md5_inputs, hmac_md5_keys,
+                      hmac_md5_string_macs, hmac_md5_macs);
 }
diff --git a/tests/standalone/io/directory_non_ascii_sync_test.dart b/tests/standalone/io/directory_non_ascii_sync_test.dart
index bbcf4c7..3932731 100644
--- a/tests/standalone/io/directory_non_ascii_sync_test.dart
+++ b/tests/standalone/io/directory_non_ascii_sync_test.dart
@@ -5,18 +5,20 @@
 import 'dart:io';
 
 main() {
-  Directory scriptDir = new File(new Options().script).directorySync();
-  var d = new Directory("${scriptDir.path}/æøå");
+  Directory tempDir = new Directory('').createTempSync();
+  var nonAsciiDir = new Directory("${tempDir.path}/æøå");
   // On MacOS you get the decomposed utf8 form of file and directory
   // names from the system. Therefore, we have to check for both here.
   var precomposed = 'æøå';
   var decomposed = new String.fromCharCodes([47, 230, 248, 97, 778]);
-  Expect.isTrue(d.existsSync());
-  d.createSync();
-  var temp = new Directory('').createTempSync();
-  var temp2 = new Directory("${temp.path}/æøå").createTempSync();
-  Expect.isTrue(temp2.path.contains(precomposed) ||
-                temp2.path.contains(decomposed));
-  temp2.deleteSync();
-  temp.deleteSync(recursive: true);
+  Expect.isFalse(nonAsciiDir.existsSync());
+  nonAsciiDir.createSync();
+  Expect.isTrue(nonAsciiDir.existsSync());
+  var temp = new Directory("${tempDir.path}/æøå").createTempSync();
+  Expect.isTrue(temp.path.contains(precomposed) ||
+                temp.path.contains(decomposed));
+  temp.deleteSync();
+  tempDir.deleteSync(recursive: true);
+  Expect.isFalse(nonAsciiDir.existsSync());
+  Expect.isFalse(temp.existsSync());
 }
diff --git a/tests/standalone/io/directory_non_ascii_test.dart b/tests/standalone/io/directory_non_ascii_test.dart
index c29e9ce..2745086 100644
--- a/tests/standalone/io/directory_non_ascii_test.dart
+++ b/tests/standalone/io/directory_non_ascii_test.dart
@@ -7,22 +7,28 @@
 
 main() {
   var port = new ReceivePort();
-  Directory scriptDir = new File(new Options().script).directorySync();
-  var d = new Directory("${scriptDir.path}/æøå");
+
   // On MacOS you get the decomposed utf8 form of file and directory
   // names from the system. Therefore, we have to check for both here.
   var precomposed = 'æøå';
   var decomposed = new String.fromCharCodes([47, 230, 248, 97, 778]);
-  d.exists().then((e) {
-    Expect.isTrue(e);
-    d.create().then((_) {
-      new Directory('').createTemp().then((temp) {
-        new Directory("${temp.path}/æøå").createTemp().then((temp2) {
-          Expect.isTrue(temp2.path.contains(precomposed) ||
-                        temp2.path.contains(decomposed));
-          temp2.delete().then((_) {
-            temp.delete(recursive: true).then((_) {
-              port.close();
+
+  new Directory('').createTemp().then((tempDir) {
+    var nonAsciiDir = new Directory("${tempDir.path}/æøå");
+    nonAsciiDir.exists().then((e) {
+      Expect.isFalse(e);
+      nonAsciiDir.create().then((_) {
+        nonAsciiDir.exists().then((e) {
+          Expect.isTrue(e);
+          new Directory("${tempDir.path}/æøå").createTemp().then((temp) {
+            Expect.isTrue(temp.path.contains(precomposed) ||
+                          temp.path.contains(decomposed));
+            temp.delete().then((_) {
+              tempDir.delete(recursive: true).then((_) {
+                Expect.isFalse(temp.existsSync());
+                Expect.isFalse(nonAsciiDir.existsSync());
+                port.close();
+              });
             });
           });
         });
diff --git a/tests/standalone/io/file_non_ascii_sync_test.dart b/tests/standalone/io/file_non_ascii_sync_test.dart
index 3a10b93..19bf7aa 100644
--- a/tests/standalone/io/file_non_ascii_sync_test.dart
+++ b/tests/standalone/io/file_non_ascii_sync_test.dart
@@ -5,21 +5,26 @@
 import 'dart:io';
 
 main() {
-  Directory scriptDir = new File(new Options().script).directorySync();
-  var f = new File("${scriptDir.path}/æøå/æøå.dat");
+  Directory tempDir = new Directory('').createTempSync();
+  Directory nonAsciiDir = new Directory('${tempDir.path}/æøå');
+  nonAsciiDir.createSync();
+  Expect.isTrue(nonAsciiDir.existsSync());
+  File nonAsciiFile = new File('${nonAsciiDir.path}/æøå.txt');
+  nonAsciiFile.writeAsStringSync('æøå');
+  Expect.isTrue(nonAsciiFile.existsSync());
   // On MacOS you get the decomposed utf8 form of file and directory
   // names from the system. Therefore, we have to check for both here.
   var precomposed = 'æøå';
   var decomposed = new String.fromCharCodes([47, 230, 248, 97, 778]);
-  Expect.isTrue(f.existsSync());
-  f.createSync();
-  var path = f.directorySync().path;
-  Expect.isTrue(f.directorySync().path.endsWith(precomposed) ||
-                f.directorySync().path.endsWith(decomposed));
-  Expect.equals(6, f.lengthSync());
-  f.lastModifiedSync();
-  Expect.isTrue(f.fullPathSync().endsWith('${precomposed}.dat') ||
-                f.fullPathSync().endsWith('${decomposed}.dat'));
   // The contents of the file is precomposed utf8.
-  Expect.equals(precomposed, f.readAsStringSync());
+  Expect.equals(precomposed, nonAsciiFile.readAsStringSync());
+  nonAsciiFile.createSync();
+  var path = nonAsciiFile.directorySync().path;
+  Expect.isTrue(path.endsWith(precomposed) || path.endsWith(decomposed));
+  Expect.equals(6, nonAsciiFile.lengthSync());
+  nonAsciiFile.lastModifiedSync();
+  path = nonAsciiFile.fullPathSync();
+  Expect.isTrue(path.endsWith('${precomposed}.txt') ||
+                path.endsWith('${decomposed}.txt'));
+  tempDir.deleteSync(recursive: true);
 }
diff --git a/tests/standalone/io/file_non_ascii_test.dart b/tests/standalone/io/file_non_ascii_test.dart
index d082080..da136e6 100644
--- a/tests/standalone/io/file_non_ascii_test.dart
+++ b/tests/standalone/io/file_non_ascii_test.dart
@@ -6,28 +6,42 @@
 import 'dart:isolate';
 
 main() {
-  var port = new ReceivePort();
-  Directory scriptDir = new File(new Options().script).directorySync();
-  var f = new File("${scriptDir.path}/æøå/æøå.dat");
+  ReceivePort port = new ReceivePort();
+
   // On MacOS you get the decomposed utf8 form of file and directory
   // names from the system. Therefore, we have to check for both here.
   var precomposed = 'æøå';
   var decomposed = new String.fromCharCodes([47, 230, 248, 97, 778]);
-  f.exists().then((e) {
-    Expect.isTrue(e);
-    f.create().then((_) {
-      f.directory().then((d) {
-        Expect.isTrue(d.path.endsWith(precomposed) ||
-                      d.path.endsWith(decomposed));
-        f.length().then((l) {
-          Expect.equals(6, l);
-          f.lastModified().then((_) {
-            f.fullPath().then((p) {
-              Expect.isTrue(p.endsWith('${precomposed}.dat') ||
-                            p.endsWith('${decomposed}.dat'));
-              f.readAsString().then((contents) {
+
+  new Directory('').createTemp().then((tempDir) {
+      Directory nonAsciiDir = new Directory('${tempDir.path}/æøå');
+      nonAsciiDir.create().then((nonAsciiDir) {
+        nonAsciiDir.exists().then((result) {
+          Expect.isTrue(result);
+          File nonAsciiFile = new File('${nonAsciiDir.path}/æøå.txt');
+          nonAsciiFile.writeAsString('æøå').then((_) {
+            nonAsciiFile.exists().then((result) {
+              Expect.isTrue(result);
+              nonAsciiFile.readAsString().then((contents) {
+                // The contents of the file is precomposed utf8.
                 Expect.equals(precomposed, contents);
-                port.close();
+                nonAsciiFile.create().then((_) {
+                  nonAsciiFile.directory().then((d) {
+                  Expect.isTrue(d.path.endsWith(precomposed) ||
+                                d.path.endsWith(decomposed));
+                  nonAsciiFile.length().then((length) {
+                    Expect.equals(6, length);
+                    nonAsciiFile.lastModified().then((_) {
+                      nonAsciiFile.fullPath().then((path) {
+                        Expect.isTrue(path.endsWith('${precomposed}.txt') ||
+                                      path.endsWith('${decomposed}.txt'));
+                        tempDir.delete(recursive: true).then((_) {
+                          port.close();
+                        });
+                      });
+                    });
+                  });
+                });
               });
             });
           });
diff --git a/tests/standalone/io/file_write_as_test.dart b/tests/standalone/io/file_write_as_test.dart
new file mode 100644
index 0000000..5212b79
--- /dev/null
+++ b/tests/standalone/io/file_write_as_test.dart
@@ -0,0 +1,79 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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:isolate';
+
+testWriteAsBytesSync(dir) {
+  var f = new File('${dir.path}/bytes_sync.txt');
+  var data = [50,50,50];
+  f.writeAsBytesSync(data);
+  Expect.listEquals(data, f.readAsBytesSync());
+  f.writeAsBytesSync(data, FileMode.APPEND);
+  var expected = [50, 50, 50, 50, 50, 50];
+  Expect.listEquals(expected, f.readAsBytesSync());
+}
+
+testWriteAsStringSync(dir) {
+  var f = new File('${dir.path}/string_sync.txt');
+  var data = 'asdf';
+  f.writeAsStringSync(data);
+  Expect.equals(data, f.readAsStringSync());
+  f.writeAsStringSync(data, FileMode.APPEND);
+  Expect.equals('$data$data', f.readAsStringSync());
+}
+
+Future testWriteAsBytes(dir) {
+  var completer = new Completer();
+  var f = new File('${dir.path}/bytes.txt');
+  var data = [50,50,50];
+  f.writeAsBytes(data).then((file){
+    Expect.equals(f, file);
+    f.readAsBytes().then((bytes) {
+      Expect.listEquals(data, bytes);
+      f.writeAsBytes(data, FileMode.APPEND).then((file) {
+        Expect.equals(f, file);
+        f.readAsBytes().then((bytes) {
+          var expected = [50, 50, 50, 50, 50, 50];
+          Expect.listEquals(expected, bytes);
+          completer.complete(true);
+        });
+      });
+    });
+  });
+  return completer.future;
+}
+
+Future testWriteAsString(dir) {
+  var completer = new Completer();
+  var f = new File('${dir.path}/strings.txt');
+  var data = 'asdf';
+  f.writeAsString(data).then((file){
+    Expect.equals(f, file);
+    f.readAsString().then((str) {
+      Expect.equals(data, str);
+      f.writeAsString(data, FileMode.APPEND).then((file) {
+        Expect.equals(f, file);
+        f.readAsString().then((str) {
+          Expect.equals('$data$data', str);
+          completer.complete(true);
+        });
+      });
+    });
+  });
+  return completer.future;
+}
+
+main() {
+  var port = new ReceivePort();
+  var tempDir = new Directory('').createTempSync();
+  testWriteAsBytesSync(tempDir);
+  testWriteAsStringSync(tempDir);
+  testWriteAsBytes(tempDir).chain((_) {
+    return testWriteAsString(tempDir);
+  }).then((_) {
+    tempDir.deleteSync(recursive: true);
+    port.close();
+  });
+}
diff --git a/tests/standalone/io/http_advanced_test.dart b/tests/standalone/io/http_advanced_test.dart
index bca0def..165af0b 100644
--- a/tests/standalone/io/http_advanced_test.dart
+++ b/tests/standalone/io/http_advanced_test.dart
@@ -287,9 +287,12 @@
     };
     conn.onResponse = (HttpClientResponse response) {
       Expect.equals(HttpStatus.OK, response.statusCode);
-      httpClient.shutdown();
-      testServerMain.shutdown();
-      completer.complete(true);
+      response.inputStream.onData = response.inputStream.read;
+      response.inputStream.onClosed = () {
+        httpClient.shutdown();
+        testServerMain.shutdown();
+        completer.complete(true);
+      };
     };
   });
   testServerMain.start();
@@ -309,12 +312,15 @@
                     response.headers["expires"][0]);
       Expect.equals(new Date.utc(1999, Date.JUN, 11, 18, 46, 53, 0),
                     response.headers.expires);
-      responses++;
-      if (responses == 2) {
-        httpClient.shutdown();
-        testServerMain.shutdown();
-        completer.complete(true);
-      }
+      response.inputStream.onData = response.inputStream.read;
+      response.inputStream.onClosed = () {
+        responses++;
+        if (responses == 2) {
+          httpClient.shutdown();
+          testServerMain.shutdown();
+          completer.complete(true);
+        }
+      };
     }
 
     HttpClientConnection conn1 = httpClient.get("127.0.0.1", port, "/expires1");
@@ -346,12 +352,15 @@
       Expect.equals("html", response.headers.contentType.subType);
       Expect.equals("utf-8",
                     response.headers.contentType.parameters["charset"]);
-      responses++;
-      if (responses == 2) {
-        httpClient.shutdown();
-        testServerMain.shutdown();
-        completer.complete(true);
-      }
+      response.inputStream.onData = response.inputStream.read;
+      response.inputStream.onClosed = () {
+        responses++;
+        if (responses == 2) {
+          httpClient.shutdown();
+          testServerMain.shutdown();
+          completer.complete(true);
+        }
+      };
     }
 
     HttpClientConnection conn1 =
@@ -415,10 +424,13 @@
         request.cookies.add(response.cookies[1]);
         request.outputStream.close();
       };
-      conn2.onResponse = (HttpClientResponse ignored) {
-        httpClient.shutdown();
-        testServerMain.shutdown();
-        completer.complete(true);
+      conn2.onResponse = (HttpClientResponse response) {
+        response.inputStream.onData = response.inputStream.read;
+        response.inputStream.onClosed = () {
+          httpClient.shutdown();
+          testServerMain.shutdown();
+          completer.complete(true);
+        };
       };
     };
   });
@@ -439,9 +451,12 @@
     };
     conn.onResponse = (HttpClientResponse response) {
       Expect.equals(HttpStatus.OK, response.statusCode);
-      httpClient.shutdown();
-      testServerMain.shutdown();
-      completer.complete(true);
+      response.inputStream.onData = response.inputStream.read;
+      response.inputStream.onClosed = () {
+        httpClient.shutdown();
+        testServerMain.shutdown();
+        completer.complete(true);
+      };
     };
   });
   testServerMain.start();
diff --git a/tests/standalone/io/http_auth_test.dart b/tests/standalone/io/http_auth_test.dart
index 7347b5d..07705de 100644
--- a/tests/standalone/io/http_auth_test.dart
+++ b/tests/standalone/io/http_auth_test.dart
@@ -80,8 +80,11 @@
           new Uri.fromString(
               "http://username:password@127.0.0.1:${server.port}/"));
   conn.onResponse = (HttpClientResponse response) {
-    server.shutdown();
-    client.shutdown();
+    response.inputStream.onData = response.inputStream.read;
+    response.inputStream.onClosed = () {
+      server.shutdown();
+      client.shutdown();
+    };
   };
 }
 
@@ -94,7 +97,8 @@
     HttpClientConnection conn = client.getUrl(url);
     conn.onResponse = (HttpClientResponse response) {
       Expect.equals(HttpStatus.UNAUTHORIZED, response.statusCode);
-      completer.complete(null);
+      response.inputStream.onData = response.inputStream.read;
+      response.inputStream.onClosed = () => completer.complete(null);
     };
     return completer.future;
   }
@@ -123,7 +127,8 @@
     HttpClientConnection conn = client.getUrl(url);
     conn.onResponse = (HttpClientResponse response) {
       Expect.equals(HttpStatus.OK, response.statusCode);
-      completer.complete(null);
+      response.inputStream.onData = response.inputStream.read;
+      response.inputStream.onClosed = () => completer.complete(null);
     };
     return completer.future;
   }
@@ -175,7 +180,8 @@
     HttpClientConnection conn = client.getUrl(url);
     conn.onResponse = (HttpClientResponse response) {
       Expect.equals(HttpStatus.OK, response.statusCode);
-      completer.complete(null);
+      response.inputStream.onData = response.inputStream.read;
+      response.inputStream.onClosed = () => completer.complete(null);
     };
     return completer.future;
   }
diff --git a/tests/standalone/io/http_connection_close_test.dart b/tests/standalone/io/http_connection_close_test.dart
index ac6cedd..c46dd41 100644
--- a/tests/standalone/io/http_connection_close_test.dart
+++ b/tests/standalone/io/http_connection_close_test.dart
@@ -5,6 +5,7 @@
 
 #import("dart:isolate");
 #import("dart:io");
+#import("dart:uri");
 
 void testHttp10Close(bool closeRequest) {
   HttpServer server = new HttpServer();
@@ -41,9 +42,41 @@
   };
 }
 
+void testStreamResponse() {
+  var server = new HttpServer();
+  server.listen("127.0.0.1", 0, backlog: 5);
+  server.defaultRequestHandler = (var request, var response) {
+    new Timer.repeating(10, (x) {
+      Date now = new Date.now();
+      try {
+        response.outputStream.writeString(
+            'data:${now.millisecondsSinceEpoch}\n\n');
+      } catch (e) {
+        x.cancel();
+        server.close();
+      }
+    });
+  };
+
+  var client = new HttpClient();
+  var connection =
+      client.getUrl(new Uri.fromString("http://127.0.0.1:${server.port}"));
+  connection.onResponse = (resp) {
+    int bytes = 0;
+    resp.inputStream.onData = () {
+      bytes += resp.inputStream.read().length;
+      if (bytes > 100) {
+        client.shutdown(force: true);
+      }
+    };
+  };
+  connection.onError = (e) => Expect.isTrue(e is HttpException);
+}
+
 main() {
   testHttp10Close(false);
   testHttp10Close(true);
   testHttp11Close(false);
   testHttp11Close(true);
+  testStreamResponse();
 }
diff --git a/tests/standalone/io/http_connection_header_test.dart b/tests/standalone/io/http_connection_header_test.dart
index 617854a..ead2067 100644
--- a/tests/standalone/io/http_connection_header_test.dart
+++ b/tests/standalone/io/http_connection_header_test.dart
@@ -64,11 +64,13 @@
       Expect.isFalse(response.persistentConnection);
       checkExpectedConnectionHeaders(response.headers,
                                      response.persistentConnection);
-      count++;
-      if (count == totalConnections) {
-        client.shutdown();
-        server.close();
-      }
+      response.inputStream.onClosed = () {
+        count++;
+        if (count == totalConnections) {
+          client.shutdown();
+          server.close();
+        }
+      };
     };
   }
 }
diff --git a/tests/standalone/io/http_content_length_test.dart b/tests/standalone/io/http_content_length_test.dart
index 917b014..47ef941 100644
--- a/tests/standalone/io/http_content_length_test.dart
+++ b/tests/standalone/io/http_content_length_test.dart
@@ -38,10 +38,13 @@
       Expect.equals("0", response.headers.value('content-length'));
       Expect.equals(0, response.contentLength);
       count++;
-      if (count == totalConnections) {
-        client.shutdown();
-        server.close();
-      }
+      response.inputStream.onData = response.inputStream.read;
+      response.inputStream.onClosed = () {
+        if (count == totalConnections) {
+          client.shutdown();
+          server.close();
+        }
+      };
     };
   }
 }
@@ -82,10 +85,13 @@
       Expect.equals("2", response.headers.value('content-length'));
       Expect.equals(2, response.contentLength);
       count++;
-      if (count == totalConnections) {
-        client.shutdown();
-        server.close();
-      }
+      response.inputStream.onData = response.inputStream.read;
+      response.inputStream.onClosed = () {
+        if (count == totalConnections) {
+          client.shutdown();
+          server.close();
+        }
+      };
     };
   }
 }
diff --git a/tests/standalone/io/http_redirect_test.dart b/tests/standalone/io/http_redirect_test.dart
index 668225e..4ea9fe0 100644
--- a/tests/standalone/io/http_redirect_test.dart
+++ b/tests/standalone/io/http_redirect_test.dart
@@ -91,7 +91,7 @@
      client.getUrl(new Uri.fromString("http://127.0.0.1:${server.port}/1"));
   conn.followRedirects = false;
   conn.onResponse = (HttpClientResponse response) {
-    response.inputStream.onData = () => response.inputStream.read();
+    response.inputStream.onData = response.inputStream.read;
     response.inputStream.onClosed = () {
       redirectCount++;
       if (redirectCount < 10) {
diff --git a/tests/standalone/io/http_server_early_client_close_test.dart b/tests/standalone/io/http_server_early_client_close_test.dart
index 66a2b06..5d23fc4 100644
--- a/tests/standalone/io/http_server_early_client_close_test.dart
+++ b/tests/standalone/io/http_server_early_client_close_test.dart
@@ -63,17 +63,18 @@
   // The empty packet is valid.
 
   // Close while sending header
-  add("G", "Connection closed before full header was received");
-  add("GET /", "Connection closed before full header was received");
-  add("GET / HTTP/1.1", "Connection closed before full header was received");
-  add("GET / HTTP/1.1\r\n", "Connection closed before full header was received");
+  String message = "Connection closed before full request header was received";
+  add("G", message);
+  add("GET /", message);
+  add("GET / HTTP/1.1", message);
+  add("GET / HTTP/1.1\r\n", message);
 
   // Close while sending content
   add("GET / HTTP/1.1\r\nContent-Length: 100\r\n\r\n",
-      "Connection closed before full body was received",
+      "Connection closed before full request body was received",
       expectRequest: true);
   add("GET / HTTP/1.1\r\nContent-Length: 100\r\n\r\n1",
-      "Connection closed before full body was received",
+      "Connection closed before full request body was received",
       expectRequest: true);
 
 
diff --git a/tests/standalone/io/http_server_handler_test.dart b/tests/standalone/io/http_server_handler_test.dart
index e44a6cf..62d77ed 100644
--- a/tests/standalone/io/http_server_handler_test.dart
+++ b/tests/standalone/io/http_server_handler_test.dart
@@ -101,7 +101,7 @@
       conn.onResponse = (HttpClientResponse response) {
         Expect.equals(HttpStatus.NOT_FOUND, response.statusCode);
         Expect.equals("Non Trouvé", response.reasonPhrase);
-        done();
+        response.inputStream.onClosed = done;
       };
       conn.onError = error;
     };
diff --git a/tests/standalone/io/http_session_test.dart b/tests/standalone/io/http_session_test.dart
index 2b7f81c..1538c2c 100644
--- a/tests/standalone/io/http_session_test.dart
+++ b/tests/standalone/io/http_session_test.dart
@@ -30,8 +30,11 @@
     request.outputStream.close();
   };
   conn.onResponse = (response) {
-    client.shutdown();
-    c.complete(getSessionId(response.cookies));
+    response.inputStream.onData = response.inputStream.read;
+    response.inputStream.onClosed = () {
+      client.shutdown();
+      c.complete(getSessionId(response.cookies));
+    };
   };
   return c.future;
 }
diff --git a/tests/standalone/io/http_shutdown_test.dart b/tests/standalone/io/http_shutdown_test.dart
index 0a65ea8..1d19e96 100644
--- a/tests/standalone/io/http_shutdown_test.dart
+++ b/tests/standalone/io/http_shutdown_test.dart
@@ -22,11 +22,13 @@
       request.outputStream.close();
     };
     conn.onResponse = (HttpClientResponse response) {
-      count++;
-      if (count == totalConnections) {
-        client.shutdown();
-        server.close();
-      }
+      response.inputStream.onClosed = () {
+        count++;
+        if (count == totalConnections) {
+          client.shutdown();
+          server.close();
+        }
+      };
     };
   }
 }
@@ -51,11 +53,14 @@
       request.outputStream.close();
     };
     conn.onResponse = (HttpClientResponse response) {
-      count++;
-      if (count == totalConnections) {
-        client.shutdown();
-        server.close();
-      }
+      response.inputStream.onData = response.inputStream.read;
+      response.inputStream.onClosed = () {
+        count++;
+        if (count == totalConnections) {
+          client.shutdown();
+          server.close();
+        }
+      };
     };
   }
 }
@@ -85,16 +90,81 @@
       request.outputStream.close();
     };
     conn.onResponse = (HttpClientResponse response) {
-      count++;
-      if (count == totalConnections) {
-        client.shutdown();
-        server.close();
-      }
+      response.inputStream.onData = response.inputStream.read;
+      response.inputStream.onClosed = () {
+        count++;
+        if (count == totalConnections) {
+          client.shutdown();
+          server.close();
+        }
+      };
     };
   }
 }
 
 
+void test4() {
+  var server = new HttpServer();
+  server.listen("127.0.0.1", 0);
+  server.defaultRequestHandler = (var request, var response) {
+    request.inputStream.onClosed = () {
+      new Timer.repeating(100, (timer) {
+        if (server.connectionsInfo().total == 0) {
+          server.close();
+          timer.cancel();
+        }
+      });
+      response.outputStream.close();
+    };
+  };
+
+  var client= new HttpClient();
+  var conn = client.get("127.0.0.1", server.port, "/");
+  conn.onResponse = (var response) {
+    response.inputStream.onData = response.inputStream.read;
+    response.inputStream.onClosed = () {
+      client.shutdown();
+    };
+  };
+}
+
+
+void test5(int totalConnections) {
+  var server = new HttpServer();
+  server.listen("127.0.0.1", 0, backlog: totalConnections);
+  server.defaultRequestHandler = (var request, var response) {
+    request.inputStream.onClosed = () {
+      response.outputStream.close();
+    };
+  };
+  server.onError = (e) => { };
+
+  // Create a number of client requests and keep then active. Then
+  // close the client and wait for the server to lose all active
+  // connections.
+  var client= new HttpClient();
+  for (int i = 0; i < totalConnections; i++) {
+    var conn = client.post("127.0.0.1", server.port, "/");
+    conn.onRequest = (req) { req.outputStream.write([0]); };
+    conn.onError = (e) => Expect.isTrue(e is HttpException);
+  }
+  bool clientClosed = false;
+  new Timer.repeating(100, (timer) {
+    if (!clientClosed) {
+      if (server.connectionsInfo().total == totalConnections) {
+        clientClosed = true;
+        client.shutdown(force: true);
+      }
+    } else {
+      if (server.connectionsInfo().total == 0) {
+        server.close();
+        timer.cancel();
+      }
+    }
+  });
+}
+
+
 void main() {
   test1(1);
   test1(10);
@@ -102,4 +172,7 @@
   test2(10);
   test3(1);
   test3(10);
+  test4();
+  test5(1);
+  test5(10);
 }
diff --git a/tests/standalone/io/pkcert/README b/tests/standalone/io/pkcert/README
new file mode 100644
index 0000000..32c8246
--- /dev/null
+++ b/tests/standalone/io/pkcert/README
@@ -0,0 +1,15 @@
+This is a certificate database used by Dart for testing purposes.
+
+It is created as a certificate database by NSS (Network Security Services),
+a library from Mozilla, using the certutil tool.  It uses a cert9.db file,
+rather than a cert8.db file, so the database directory must be specified with
+"sql:" in front of the directory path, or the environment variable
+NSS_DEFAULT_DB_TYPE must be set to "sql".
+
+The password for the key database is "dartdart".
+
+The database contains a root certificate from Equifax, used to verify the
+client https connection to www.google.dk.  It contains a self-signed
+certificate for a local certificate authority myauthority_cert, and a
+server certificate for localhost called localhost_cert, signed by
+myauthority_cert.
diff --git a/tests/standalone/io/pkcert/cert9.db b/tests/standalone/io/pkcert/cert9.db
index d7ce362..1c4913b 100644
--- a/tests/standalone/io/pkcert/cert9.db
+++ b/tests/standalone/io/pkcert/cert9.db
Binary files differ
diff --git a/tests/standalone/io/pkcert/key4.db b/tests/standalone/io/pkcert/key4.db
index 614a210..6610e75 100644
--- a/tests/standalone/io/pkcert/key4.db
+++ b/tests/standalone/io/pkcert/key4.db
Binary files differ
diff --git a/tests/standalone/io/process_non_ascii_test.dart b/tests/standalone/io/process_non_ascii_test.dart
index 5ea4e3c..e7b31e3 100644
--- a/tests/standalone/io/process_non_ascii_test.dart
+++ b/tests/standalone/io/process_non_ascii_test.dart
@@ -3,15 +3,31 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:io';
+import 'dart:isolate';
 
 main() {
-  var scriptDir = new File(new Options().script).directorySync();
+  var port = new ReceivePort();
   var executable = new File(new Options().executable).fullPathSync();
+  var tempDir = new Directory('').createTempSync();
+  var nonAsciiDir = new Directory('${tempDir.path}/æøå');
+  nonAsciiDir.createSync();
+  var nonAsciiFile = new File('${nonAsciiDir.path}/æøå.dart');
+  nonAsciiFile.writeAsStringSync(
+"""
+import 'dart:io';
+
+main() {
+  Expect.equals('æøå', new File('æøå.txt').readAsStringSync());
+}
+""");
+  var nonAsciiTxtFile = new File('${nonAsciiDir.path}/æøå.txt');
+  nonAsciiTxtFile.writeAsStringSync('æøå');
   var options = new ProcessOptions();
-  options.workingDirectory = "${scriptDir.path}/æøå";
-  var script = "${scriptDir.path}/æøå.dart";
-  print(options.workingDirectory);
+  options.workingDirectory = nonAsciiDir.path;
+  var script = nonAsciiFile.name;
   Process.run(executable, [script], options).then((result) {
     Expect.equals(0, result.exitCode);
+    tempDir.deleteSync(recursive: true);
+    port.close();
   });
 }
diff --git a/tests/standalone/io/secure_server_stream_test.dart b/tests/standalone/io/secure_server_stream_test.dart
new file mode 100644
index 0000000..82271ce
--- /dev/null
+++ b/tests/standalone/io/secure_server_stream_test.dart
@@ -0,0 +1,98 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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";
+
+const SERVER_ADDRESS = "127.0.0.1";
+const HOST_NAME = "localhost";
+
+class SecureTestServer {
+  void onConnection(Socket connection) {
+    numConnections++;
+    var input = connection.inputStream;
+    String received = "";
+    input.onData = () {
+      received = received.concat(new String.fromCharCodes(input.read()));
+    };
+    input.onClosed = () {
+      Expect.isTrue(received.contains("Hello from client "));
+      String name = received.substring(received.indexOf("client ") + 7);
+      connection.outputStream.write("Welcome, client $name".charCodes);
+      connection.outputStream.close();
+    };
+  }
+
+  void errorHandlerServer(Exception e) {
+    Expect.fail("Server socket error $e");
+  }
+
+  int start() {
+    server = new SecureServerSocket(SERVER_ADDRESS, 0, 10, "CN=$HOST_NAME");
+    Expect.isNotNull(server);
+    server.onConnection = onConnection;
+    server.onError = errorHandlerServer;
+    return server.port;
+  }
+
+  void stop() {
+    server.close();
+  }
+
+  int numConnections = 0;
+  SecureServerSocket server;
+}
+
+class SecureTestClient {
+  SecureTestClient(int this.port, String this.name) {
+    socket = new SecureSocket(HOST_NAME, port);
+    numRequests++;
+    socket.outputStream.write("Hello from client $name".charCodes);
+    socket.outputStream.close();
+    socket.inputStream.onData = () {
+      reply = reply.concat(new String.fromCharCodes(socket.inputStream.read()));
+    };
+    socket.inputStream.onClosed = this.done;
+    reply = "";
+  }
+
+  void done() {
+    Expect.equals("Welcome, client $name", reply);
+    numReplies++;
+    if (numReplies == CLIENT_NAMES.length) {
+      Expect.equals(numRequests, numReplies);
+      EndTest();
+    }
+  }
+
+  static int numRequests = 0;
+  static int numReplies = 0;
+
+  int port;
+  String name;
+  SecureSocket socket;
+  String reply;
+}
+
+Function EndTest;
+
+const CLIENT_NAMES = const ['able', 'baker', 'camera', 'donut', 'echo'];
+
+void main() {
+  Path scriptDir = new Path.fromNative(new Options().script).directoryPath;
+  Path certificateDatabase = scriptDir.append('pkcert');
+  SecureSocket.setCertificateDatabase(certificateDatabase.toNativePath(),
+                                   'dartdart');
+
+  var server = new SecureTestServer();
+  int port = server.start();
+
+  EndTest = () {
+    Expect.equals(CLIENT_NAMES.length, server.numConnections);
+    server.stop();
+  };
+
+  for (var x in CLIENT_NAMES) {
+    new SecureTestClient(port, x);
+  }
+}
diff --git a/tests/standalone/io/secure_server_test.dart b/tests/standalone/io/secure_server_test.dart
new file mode 100644
index 0000000..f2fc280
--- /dev/null
+++ b/tests/standalone/io/secure_server_test.dart
@@ -0,0 +1,115 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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";
+
+const SERVER_ADDRESS = "127.0.0.1";
+const HOST_NAME = "localhost";
+
+void WriteAndClose(Socket socket, String message) {
+  var data = message.charCodes;
+  int written = 0;
+  void write() {
+    written += socket.writeList(data, written, data.length - written);
+    if (written < data.length) {
+      socket.onWrite = write;
+    } else {
+      socket.close(true);
+    }
+  }
+  write();
+}
+
+class SecureTestServer {
+  void onConnection(Socket connection) {
+    connection.onConnect = () {
+      numConnections++;
+    };
+    String received = "";
+    connection.onData = () {
+      received = received.concat(new String.fromCharCodes(connection.read()));
+    };
+    connection.onClosed = () {
+      Expect.isTrue(received.contains("Hello from client "));
+      String name = received.substring(received.indexOf("client ") + 7);
+      WriteAndClose(connection, "Welcome, client $name");
+    };
+  }
+
+  void errorHandlerServer(Exception e) {
+    Expect.fail("Server socket error $e");
+  }
+
+  int start() {
+    server = new SecureServerSocket(SERVER_ADDRESS, 0, 10, "CN=$HOST_NAME");
+    Expect.isNotNull(server);
+    server.onConnection = onConnection;
+    server.onError = errorHandlerServer;
+    return server.port;
+  }
+
+  void stop() {
+    server.close();
+  }
+
+  int numConnections = 0;
+  SecureServerSocket server;
+}
+
+class SecureTestClient {
+  SecureTestClient(int this.port, String this.name) {
+    socket = new SecureSocket(HOST_NAME, port);
+    socket.onConnect = this.onConnect;
+    socket.onData = () {
+      reply = reply.concat(new String.fromCharCodes(socket.read()));
+    };
+    socket.onClosed = done;
+    reply = "";
+  }
+
+  void onConnect() {
+    numRequests++;
+    WriteAndClose(socket, "Hello from client $name");
+  }
+
+  void done() {
+    Expect.equals("Welcome, client $name", reply);
+    numReplies++;
+    if (numReplies == CLIENT_NAMES.length) {
+      Expect.equals(numRequests, numReplies);
+      EndTest();
+    }
+  }
+
+  static int numRequests = 0;
+  static int numReplies = 0;
+
+  int port;
+  String name;
+  SecureSocket socket;
+  String reply;
+}
+
+Function EndTest;
+
+const CLIENT_NAMES = const ['able', 'baker', 'camera', 'donut', 'echo'];
+
+void main() {
+  Path scriptDir = new Path.fromNative(new Options().script).directoryPath;
+  Path certificateDatabase = scriptDir.append('pkcert');
+  SecureSocket.setCertificateDatabase(certificateDatabase.toNativePath(),
+                                   'dartdart');
+
+  var server = new SecureTestServer();
+  int port = server.start();
+
+  EndTest = () {
+    Expect.equals(CLIENT_NAMES.length, server.numConnections);
+    server.stop();
+  };
+
+  for (var x in CLIENT_NAMES) {
+    new SecureTestClient(port, x);
+  }
+}
diff --git a/tests/standalone/io/tls_socket_test.dart b/tests/standalone/io/secure_socket_test.dart
similarity index 61%
rename from tests/standalone/io/tls_socket_test.dart
rename to tests/standalone/io/secure_socket_test.dart
index 061d93f..36386f0 100644
--- a/tests/standalone/io/tls_socket_test.dart
+++ b/tests/standalone/io/secure_socket_test.dart
@@ -11,40 +11,50 @@
 #import("dart:isolate");
 #import("dart:io");
 
+void WriteAndClose(Socket socket, String message) {
+  var data = message.charCodes;
+  int written = 0;
+  void write() {
+    written += socket.writeList(data, written, data.length - written);
+    if (written < data.length) {
+      socket.onWrite = write;
+    } else {
+      socket.close(true);
+    }
+  }
+  write();
+}
+
 void main() {
   var testPkcertDatabase =
       new Path.fromNative(new Options().script).directoryPath.append('pkcert/');
-  TlsSocket.setCertificateDatabase(testPkcertDatabase.toNativePath());
-  // TODO(3593): Use a Dart HTTPS server for this test using TLS server sockets.
+  SecureSocket.setCertificateDatabase(testPkcertDatabase.toNativePath());
+  // TODO(3593): Use a Dart HTTPS server for this test.
   // When we use a Dart HTTPS server, allow --short_socket_write. The flag
   // causes fragmentation of the client hello message, which doesn't seem to
   // work with www.google.dk.
-  var tls = new TlsSocket("www.google.dk", 443);
+  var secure = new SecureSocket("www.google.dk", 443);
   List<String> chunks = <String>[];
-  tls.onConnect = () {
-    var request_bytes =
-      "GET / HTTP/1.0\r\nHost: www.google.dk\r\n\r\n".charCodes;
-    tls.writeList(request_bytes, 0, 20);
-    tls.writeList(request_bytes, 20, request_bytes.length - 20);
+  secure.onConnect = () {
+    WriteAndClose(secure, "GET / HTTP/1.0\r\nHost: www.google.dk\r\n\r\n");
   };
   var useReadList;  // Mutually recursive onData callbacks.
   void useRead() {
-    var data = tls.read();
+    var data = secure.read();
     var received = new String.fromCharCodes(data);
     chunks.add(received);
-    tls.onData = useReadList;
+    secure.onData = useReadList;
   }
   useReadList = () {
     var buffer = new List(2000);
-    int len = tls.readList(buffer, 0, 2000);
+    int len = secure.readList(buffer, 0, 2000);
     var received = new String.fromCharCodes(buffer.getRange(0, len));
     chunks.add(received);
-    tls.onData = useRead;
+    secure.onData = useRead;
   };
-  tls.onData = useRead;
-  tls.onClosed = () {
+  secure.onData = useRead;
+  secure.onClosed = () {
     String fullPage = Strings.concatAll(chunks);
     Expect.isTrue(fullPage.contains('</body></html>'));
-    tls.close();
   };
 }
diff --git a/tests/standalone/io/secure_stream_test.dart b/tests/standalone/io/secure_stream_test.dart
new file mode 100644
index 0000000..54969f2
--- /dev/null
+++ b/tests/standalone/io/secure_stream_test.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// VMOptions=
+// VMOptions=--short_socket_read
+// The --short_socket_write option does not work with external server
+// www.google.dk.  Add this to the test when we have secure server sockets.
+// See TODO below.
+
+#import("dart:isolate");
+#import("dart:io");
+
+void main() {
+  var testPkcertDatabase =
+      new Path.fromNative(new Options().script).directoryPath.append('pkcert/');
+  SecureSocket.setCertificateDatabase(testPkcertDatabase.toNativePath());
+  // TODO(3593): Use a Dart HTTPS server for this test.
+  // When we use a Dart HTTPS server, allow --short_socket_write. The flag
+  // causes fragmentation of the client hello message, which doesn't seem to
+  // work with www.google.dk.
+  var secure = new SecureSocket("www.google.dk", 443);
+  List<String> chunks = <String>[];
+  var input = secure.inputStream;
+  var output = secure.outputStream;
+
+  output.write("GET / HTTP/1.0\r\nHost: www.google.dk\r\n\r\n".charCodes);
+  output.close();
+  input.onData = () {
+    chunks.add(new String.fromCharCodes(input.read()));
+  };
+  input.onClosed = () {
+    String fullPage = Strings.concatAll(chunks);
+    Expect.isTrue(fullPage.contains('</body></html>'));
+  };
+}
diff --git a/tests/standalone/io/string_stream_test.dart b/tests/standalone/io/string_stream_test.dart
index f335291..d1369dc 100644
--- a/tests/standalone/io/string_stream_test.dart
+++ b/tests/standalone/io/string_stream_test.dart
@@ -29,8 +29,8 @@
     Expect.equals(new String.fromCharCodes([0xffff]), s[5]);
 
     // Surrogate pair for U+1D11E.
-    Expect.equals(new String.fromCharCodes([0xd834]), s[6]);
-    Expect.equals(new String.fromCharCodes([0xdd1e]), s[7]);
+    Expect.equals(new String.fromCharCodes([0xd834, 0xdd1e]),
+                  s.substring(6, 8));
   }
   stream.onData = stringData;
 }
diff --git a/tests/standalone/io/test_runner_exit_code_script.dart b/tests/standalone/io/test_runner_exit_code_script.dart
index f137022..37fbc8e 100644
--- a/tests/standalone/io/test_runner_exit_code_script.dart
+++ b/tests/standalone/io/test_runner_exit_code_script.dart
@@ -14,6 +14,9 @@
   var startTime = new Date.now();
   var progress =
     new ProgressIndicator.fromName(progressType, startTime, false);
+  if (progressType == 'buildbot') {
+    BuildbotProgressIndicator.stepName = 'myStepName';
+  }
   // Build a dummy test case.
   var configuration = new TestOptionsParser().parse(['--timeout', '2'])[0];
   var dummyCommand = new Command("noop", []);
diff --git a/tests/standalone/io/testing_server.dart b/tests/standalone/io/testing_server.dart
index 62b2404..59a0c9e 100644
--- a/tests/standalone/io/testing_server.dart
+++ b/tests/standalone/io/testing_server.dart
@@ -8,7 +8,7 @@
   static const INIT = 0;
   static const SHUTDOWN = -1;
 
-  abstract void onConnection(Socket connection);
+  void onConnection(Socket connection);  // Abstract.
 
   void errorHandlerServer(Exception e) {
     Expect.fail("Server socket error $e");
@@ -38,7 +38,7 @@
     initialize();
   }
 
-  abstract void run();
+  void run();  // Abstract.
 
   void initialize() {
     _receivePort.receive((var message, SendPort replyTo) {
diff --git "a/tests/standalone/io/\303\246\303\270\303\245/\303\246\303\270\303\245.dat" "b/tests/standalone/io/\303\246\303\270\303\245/\303\246\303\270\303\245.dat"
deleted file mode 100644
index 5a9c6c8..0000000
--- "a/tests/standalone/io/\303\246\303\270\303\245/\303\246\303\270\303\245.dat"
+++ /dev/null
@@ -1 +0,0 @@
-æøå
\ No newline at end of file
diff --git a/tests/standalone/package/package1_test.dart b/tests/standalone/package/package1_test.dart
index f449868..b331d1c 100644
--- a/tests/standalone/package/package1_test.dart
+++ b/tests/standalone/package/package1_test.dart
@@ -2,5 +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=none
+
 #library('package1_test.dart');
 #import('package:package1.dart');
diff --git a/tests/standalone/package/package_isolate_test.dart b/tests/standalone/package/package_isolate_test.dart
index 96e304f..7f4bc61 100644
--- a/tests/standalone/package/package_isolate_test.dart
+++ b/tests/standalone/package/package_isolate_test.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// PackageRoot=tests/standalone/package/packages/
+
 library package_isolate_test;
 import 'package:shared.dart' as shared;
 import 'dart:isolate';
diff --git a/tests/standalone/package/package_test.dart b/tests/standalone/package/package_test.dart
index b304f6d..e55181a 100644
--- a/tests/standalone/package/package_test.dart
+++ b/tests/standalone/package/package_test.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// PackageRoot=none
+
 #library('package_test');
 
 #import('package:lib1.dart');
diff --git a/tests/standalone/standalone.status b/tests/standalone/standalone.status
index 0f9c960..d888b07 100644
--- a/tests/standalone/standalone.status
+++ b/tests/standalone/standalone.status
@@ -6,7 +6,8 @@
 
 package/invalid_uri_test: Fail, OK # Fails intentionally
 
-io/tls_socket_test: Pass, Timeout # Issue 6730.
+io/secure_socket_test: Pass, Timeout # Issue 6730.
+io/secure_stream_test: Pass, Timeout # Issue 6730.
 
 [ $runtime == vm && $checked ]
 # These tests have type errors on purpose.
@@ -41,6 +42,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
 
 [ $compiler == none && $runtime == drt ]
 io/*: Skip # Don't run tests using dart:io in the browser
diff --git a/tests/utils/uri_test.dart b/tests/utils/uri_test.dart
index 7acc5cf..66820dc 100644
--- a/tests/utils/uri_test.dart
+++ b/tests/utils/uri_test.dart
@@ -187,10 +187,11 @@
       "origin for non-http/https uri should fail");
 
   // URI encode tests
-  // Note: dart2js won't handle '\ud800\udc00' and frog
-  // won't handle '\u{10000}'. So we cons this up synthetically...
+  // Create a string with code point 0x10000 encoded as a surrogate pair.
   var s = decodeUtf8([0xf0, 0x90, 0x80, 0x80]);
 
+  Expect.stringEquals("\u{10000}", s);
+
   testEncodeDecode("\uFFFE", "%EF%BF%BE");
   testEncodeDecode("\uFFFF", "%EF%BF%BF");
   testEncodeDecode("\uFFFE", "%EF%BF%BE");
diff --git a/tests/utils/utf8_test.dart b/tests/utils/utf8_test.dart
index 541f101..b92d5aaa 100644
--- a/tests/utils/utf8_test.dart
+++ b/tests/utils/utf8_test.dart
@@ -7,8 +7,6 @@
 
 String decode(List<int> bytes) => decodeUtf8(bytes);
 
-bool isRunningOnJavaScript() => identical(1, 1.0);
-
 main() {
   // Google favorite: "Îñţérñåţîöñåļîžåţîờñ".
   String string = decode([0xc3, 0x8e, 0xc3, 0xb1, 0xc5, 0xa3, 0xc3, 0xa9, 0x72,
@@ -37,14 +35,12 @@
                    0xb2, 0xe0, 0xa5, 0x88]);
   Expect.stringEquals("िसवा अणामालै", string);
 
-  if (!isRunningOnJavaScript()) {
-    // DESERET CAPITAL LETTER BEE, unicode 0x10412(0xD801+0xDC12)
-    // UTF-8: F0 90 90 92
-    string = decode([0xf0, 0x90, 0x90, 0x92]);
-    Expect.stringEquals("𐐒", string);
-  } else {
-    print('Skipping non-BMP character test');
-  }
+  // DESERET CAPITAL LETTER BEE, unicode 0x10412(0xD801+0xDC12)
+  // UTF-8: F0 90 90 92
+  string = decode([0xf0, 0x90, 0x90, 0x92]);
+  Expect.equals(string.length, 2);
+  Expect.equals("𐐒".length, 2);
+  Expect.stringEquals("𐐒", string);
 
   // TODO(ahe): Add tests of bad input.
 }
diff --git a/tests/utils/utils.status b/tests/utils/utils.status
index 1ddd3b0..2ce46b6 100644
--- a/tests/utils/utils.status
+++ b/tests/utils/utils.status
@@ -8,7 +8,6 @@
 [ $compiler == dart2js ]
 dummy_compiler_test: Slow, Pass
 recursive_import_test: Slow, Pass
-utf8_test: Fail # issue 6418
 
 [ $compiler == none && $runtime == drt ]
 dummy_compiler_test: Fail # http://dartbug.com/2264
@@ -23,12 +22,6 @@
 [ $system == macos || $system == windows ]
 *_layout_test: Skip
 
-[ $compiler == dartc ]
-# dart2js issue 6323
-dummy_compiler_test: Fail, OK
-recursive_import_test: Fail, OK
-
-
 [ $compiler == dart2dart ]
 # Skip until we stabilize language tests.
 *: Skip
diff --git a/tools/VERSION b/tools/VERSION
index 1889699..9937b3b 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -1,4 +1,4 @@
 MAJOR 0
 MINOR 2
-BUILD 4
-PATCH 2
+BUILD 5
+PATCH 0
diff --git a/tools/bots/pub.py b/tools/bots/pub.py
index e101783..29e49ae 100755
--- a/tools/bots/pub.py
+++ b/tools/bots/pub.py
@@ -41,6 +41,12 @@
     print 'Generating API Docs: %s' % (' '.join(args))
     bot.RunProcess(args)
 
+  with bot.BuildStep('Build package-root'):
+    args = [sys.executable, './tools/build.py', '--mode=' + build_info.mode,
+            'packages']
+    print 'Building package-root: %s' % (' '.join(args))
+    bot.RunProcess(args)
+
   bot.RunTest('pub', build_info, ['pub', 'pkg'])
 
 
diff --git a/tools/create_sdk.py b/tools/create_sdk.py
index a3235e8..5793e3e 100755
--- a/tools/create_sdk.py
+++ b/tools/create_sdk.py
@@ -112,14 +112,12 @@
     CopyShellScript(os.path.join(home, 'sdk', 'bin', executable),
                     os.path.join(sdk_root, 'bin'))
 
-  if utils.GuessOS() != 'win32':
-    # TODO(ahe): Enable for Windows as well.
-    subprocess.call([os.path.join(build_dir, 'gen_snapshot'),
-                     '--script_snapshot=%s' %
-                     os.path.join(sdk_root, 'lib', '_internal', 'compiler',
-                                  'implementation', 'dart2js.dart.snapshot'),
-                     os.path.join(sdk_root, 'lib', '_internal', 'compiler',
-                                  'implementation', 'dart2js.dart')])
+  subprocess.call([os.path.join(build_dir, 'gen_snapshot'),
+                   '--script_snapshot=%s' %
+                   os.path.join(sdk_root, 'lib', '_internal', 'compiler',
+                                'implementation', 'dart2js.dart.snapshot'),
+                   os.path.join(sdk_root, 'lib', '_internal', 'compiler',
+                                'implementation', 'dart2js.dart')])
 
 
 
@@ -263,6 +261,23 @@
          "var pathTo7zip = '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' \
+      else ignore_patterns('.svn', '*.exe')
+  copytree(join(HOME, 'third_party', 'curl'),
+           join(join(UTIL, 'pub'), 'curl'),
+           ignore=curl_ignore_patterns)
+
+  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';"),
+    ])
+
   version = utils.GetVersion()
 
   # Copy dart2js/dartdoc/pub.
diff --git a/tools/gyp/configurations_make.gypi b/tools/gyp/configurations_make.gypi
index 6900999..b4679b5 100644
--- a/tools/gyp/configurations_make.gypi
+++ b/tools/gyp/configurations_make.gypi
@@ -29,10 +29,6 @@
           '-fvisibility-inlines-hidden',
           '-fno-omit-frame-pointer',
         ],
-        'ldflags': [
-          '-rdynamic',
-          '-Wl,-rpath,<(PRODUCT_DIR)/lib.target',
-        ],
       },
 
       'Dart_ia32_Base': {
@@ -57,9 +53,6 @@
           '-mfloat-abi=softfp',
           '-fno-strict-overflow',
         ],
-        'ldflags': [
-          '-Wl,-rpath=<(arm_cross_libc)/usr/lib',
-        ],
       },
 
       'Dart_Debug': {
diff --git a/tools/make_links.py b/tools/make_links.py
new file mode 100644
index 0000000..3f54004
--- /dev/null
+++ b/tools/make_links.py
@@ -0,0 +1,71 @@
+#!/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.
+
+
+'''Tool for creating symlinks from SOURCES to TARGET.
+
+For each SOURCE in SOURCES create a link from SOURCE to TARGET.  If a
+SOURCE ends with .../lib, the lib suffix is ignored when determining
+the name of the target link.
+
+Usage:
+  python tools/make_links.py TARGET SOURCES...
+'''
+
+import os
+import subprocess
+import sys
+import utils
+
+
+def make_link(source, target):
+  # TODO(ahe): Remove this code when the build bots are green again.
+  bug_cleanup = os.path.join(target, 'lib')
+  if os.path.islink(bug_cleanup):
+    print 'Removing %s' % bug_cleanup
+    sys.stdout.flush()
+    os.unlink(bug_cleanup)
+  # End of temporary code.
+
+  if os.path.islink(target):
+    print 'Removing %s' % target
+    sys.stdout.flush()
+    os.unlink(target)
+
+  if os.path.isdir(target):
+    print 'Removing %s' % target
+    sys.stdout.flush()
+    os.rmdir(target)
+
+  print 'Creating link from %s to %s' % (source, target)
+  sys.stdout.flush()
+
+  if utils.GuessOS() == 'win32':
+    return subprocess.call(['mklink', '/j', target, source], shell=True)
+  else:
+    return subprocess.call(['ln', '-s', source, target])
+
+
+def main(argv):
+  target = os.path.relpath(argv[1])
+  for source in argv[2:]:
+    # Assume the source directory is named ".../TARGET_NAME/lib".
+    (name, lib) = os.path.split(source)
+    if lib != 'lib':
+      name = source
+    # Remove any addtional path components preceding TARGET_NAME.
+    (path, name) = os.path.split(name)
+    if utils.GuessOS() == 'win32':
+      source = os.path.relpath(source)
+    else:
+      source = os.path.relpath(source, start=target)
+    exit_code = make_link(source, os.path.join(target, name))
+    if exit_code != 0:
+      return exit_code
+  return 0
+
+
+if __name__ == '__main__':
+  sys.exit(main(sys.argv))
diff --git a/tools/revert.py b/tools/revert.py
index 33d014c..ce3eff0 100755
--- a/tools/revert.py
+++ b/tools/revert.py
@@ -177,14 +177,10 @@
   revisions = parse_args()
   git_user = runs_git()
   if has_new_code(git_user):
-    if git_user:
-      maybe_fail('Your tree has local modifications! Move to a clean tree and '
-          'try running this script again.')
-    else:
-      maybe_fail('WARNING: This checkout has local modifications!! This could '
-           'result in a CL that is not just a revert and/or you could lose your'
-           ' local changes! Are you **SURE** you want to continue? ',
-         user_input=True)
+    maybe_fail('WARNING: This checkout has local modifications!! This could '
+         'result in a CL that is not just a revert and/or you could lose your'
+         ' local changes! Are you **SURE** you want to continue? ',
+       user_input=True)
   if git_user:
     run_cmd(['git', 'cl', 'rebase'])
   run_cmd(['gclient', 'sync'])
diff --git a/tools/testing/dart/test_options.dart b/tools/testing/dart/test_options.dart
index 0b1ee54..8a3a2a6 100644
--- a/tools/testing/dart/test_options.dart
+++ b/tools/testing/dart/test_options.dart
@@ -156,7 +156,7 @@
               'Step name for use by -pbuildbot',
               ['--step_name'],
               [],
-              'string'),
+              null),
           new _TestOptionSpecification(
               'report',
               'Print a summary report of the number of tests, by expectation',
@@ -227,12 +227,6 @@
               false,
               'bool'),
           new _TestOptionSpecification(
-              'additional-compiler-flags',
-              'Additional flags to control test compilation',
-              ['--additional-compiler-flags'],
-              [],
-              ''),
-          new _TestOptionSpecification(
               'dart',
               'Path to dart executable',
               ['--dart'],
@@ -263,6 +257,12 @@
               false,
               'bool'),
           new _TestOptionSpecification(
+              'build_directory',
+              'The name of the build directory, where products are placed.',
+              ['--build-directory'],
+              [],
+              ''),
+          new _TestOptionSpecification(
               'noBatch',
               'Do not run browser tests in batch mode',
               ['-n', '--nobatch'],
diff --git a/tools/testing/dart/test_progress.dart b/tools/testing/dart/test_progress.dart
index 68ee945..33e0765 100644
--- a/tools/testing/dart/test_progress.dart
+++ b/tools/testing/dart/test_progress.dart
@@ -407,7 +407,7 @@
   }
 
   void _printFailureSummary() {
-    if (!_failureSummary.isEmpty) {
+    if (!_failureSummary.isEmpty && stepName != null) {
       print('@@@STEP_FAILURE@@@');
       print('@@@BUILD_STEP $stepName failures@@@');
     }
diff --git a/tools/testing/dart/test_suite.dart b/tools/testing/dart/test_suite.dart
index 84fd882..4ce2287 100644
--- a/tools/testing/dart/test_suite.dart
+++ b/tools/testing/dart/test_suite.dart
@@ -105,11 +105,7 @@
   /**
    * The output directory for this suite's configuration.
    */
-  String get buildDir {
-    var mode = (configuration['mode'] == 'debug') ? 'Debug' : 'Release';
-    var arch = configuration['arch'].toUpperCase();
-    return "${TestUtils.outputDir(configuration)}$mode$arch";
-  }
+  String get buildDir => TestUtils.buildDir(configuration);
 
   /**
    * The path to the compiler for this suite's configuration. Returns `null` if
@@ -619,7 +615,8 @@
 
     Set<String> expectations = testExpectations.expectations(testName);
     if (info.hasCompileError &&
-        TestUtils.isBrowserRuntime(configuration['runtime'])) {
+        TestUtils.isBrowserRuntime(configuration['runtime']) &&
+        configuration['report']) {
       SummaryReport.addCompileErrorSkipTest();
       return;
     }
@@ -711,12 +708,6 @@
 
     case 'dart2dart':
       var compilerArguments = new List.from(args);
-      var additionalFlags =
-          configuration['additional-compiler-flags'].split(' ');
-      for (final flag in additionalFlags) {
-        if (flag.isEmpty) continue;
-        compilerArguments.add(flag);
-      }
       compilerArguments.add('--output-type=dart');
       String tempDir = createOutputDirectory(info.filePath, '');
       compilerArguments.add('--out=$tempDir/out.dart');
@@ -888,7 +879,7 @@
       if (compiler != 'none') {
         commands.add(_compileCommand(
             dartWrapperFilename, compiledDartWrapperFilename,
-            compiler, tempDir, vmOptions));
+            compiler, tempDir, vmOptions, optionsFromFile));
 
         // some tests require compiling multiple input scripts.
         List<String> otherScripts = optionsFromFile['otherScripts'];
@@ -899,7 +890,7 @@
           Path fromPath = filePath.directoryPath.join(namePath);
           commands.add(_compileCommand(
               fromPath.toNativePath(), '$tempDir/$baseName.js',
-              compiler, tempDir, vmOptions));
+              compiler, tempDir, vmOptions, optionsFromFile));
         }
       }
 
@@ -931,6 +922,13 @@
               dumpRenderTreeFilename,
               '--no-timeout'
           ];
+          if (compiler == 'none') {
+            String packageRoot =
+                packageRootArgument(optionsFromFile['packageRoot']);
+            if (packageRoot != null) {
+              args.add(packageRoot);
+            }
+          }
           if (runtime == 'drt' &&
               (compiler == 'none' || compiler == 'dart2dart')) {
             var dartFlags = ['--ignore-unrecognized-flags'];
@@ -981,12 +979,17 @@
 
   /** Helper to create a compilation command for a single input file. */
   Command _compileCommand(String inputFile, String outputFile,
-      String compiler, String dir, var vmOptions) {
+      String compiler, String dir, vmOptions, optionsFromFile) {
     String executable = compilerPath;
     List<String> args = TestUtils.standardOptions(configuration);
     switch (compiler) {
       case 'dart2js':
       case 'dart2dart':
+        String packageRoot =
+          packageRootArgument(optionsFromFile['packageRoot']);
+        if (packageRoot != null) {
+          args.add(packageRoot);
+        }
         if (compiler == 'dart2dart') args.add('--out=$outputFile');
         args.add('--out=$outputFile');
         args.add(inputFile);
@@ -1096,6 +1099,11 @@
 
   List<String> commonArgumentsFromFile(Path filePath, Map optionsFromFile) {
     List args = TestUtils.standardOptions(configuration);
+
+    String packageRoot = packageRootArgument(optionsFromFile['packageRoot']);
+    if (packageRoot != null) {
+      args.add(packageRoot);
+    }
     args.addAll(additionalOptions(filePath));
     if (configuration['compiler'] == 'dartc') {
       args.add('--error_format');
@@ -1123,6 +1131,15 @@
     return args;
   }
 
+  String packageRootArgument(String packageRootFromFile) {
+    if (packageRootFromFile == "none") return null;
+    String packageRoot = packageRootFromFile;
+    if (packageRootFromFile == null) {
+      packageRoot = "$buildDir/packages/";
+    }
+    return "--package-root=$packageRoot";
+  }
+
   /**
    * Special options for individual tests are currently specified in various
    * ways: with comments directly in test files, by using certain imports, or by
@@ -1183,6 +1200,7 @@
     RegExp testOptionsRegExp = new RegExp(r"// VMOptions=(.*)");
     RegExp dartOptionsRegExp = new RegExp(r"// DartOptions=(.*)");
     RegExp otherScriptsRegExp = new RegExp(r"// OtherScripts=(.*)");
+    RegExp packageRootRegExp = new RegExp(r"// PackageRoot=(.*)");
     RegExp multiTestRegExp = new RegExp(r"/// [0-9][0-9]:(.*)");
     RegExp multiHtmlTestRegExp =
         new RegExp(r"useHtmlIndividualConfiguration()");
@@ -1217,6 +1235,7 @@
     // Find the options in the file.
     List<List> result = new List<List>();
     List<String> dartOptions;
+    String packageRoot;
     bool hasCompileError = contents.contains("@compile-error");
     bool hasRuntimeError = contents.contains("@runtime-error");
     bool isStaticClean = false;
@@ -1236,6 +1255,15 @@
       dartOptions = match[1].split(' ').filter((e) => e != '');
     }
 
+    matches = packageRootRegExp.allMatches(contents);
+    for (var match in matches) {
+      if (packageRoot != null) {
+        throw new Exception(
+            'More than one "// PackageRoot=" line in test $filePath');
+      }
+      packageRoot = match[1];
+    }
+
     matches = staticCleanRegExp.allMatches(contents);
     for (var match in matches) {
       if (isStaticClean) {
@@ -1284,6 +1312,7 @@
 
     return { "vmOptions": result,
              "dartOptions": dartOptions,
+             "packageRoot": packageRoot,
              "hasCompileError": hasCompileError,
              "hasRuntimeError": hasRuntimeError,
              "isStaticClean" : isStaticClean,
@@ -1474,6 +1503,9 @@
    * [base] directory if that [relativePath] does not already exist.
    */
   static Directory mkdirRecursive(Path base, Path relativePath) {
+    if (relativePath.isAbsolute) {
+      base = new Path('/');
+    }
     Directory dir = new Directory.fromPath(base);
     Expect.isTrue(dir.existsSync(),
                   "Expected ${dir} to already exist");
@@ -1516,19 +1548,6 @@
     }
   }
 
-  static String outputDir(Map configuration) {
-    var result = '';
-    var system = configuration['system'];
-    if (system == 'linux') {
-      result = 'out/';
-    } else if (system == 'macos') {
-      result = 'xcodebuild/';
-    } else if (system == 'windows') {
-      result = 'build/';
-    }
-    return result;
-  }
-
   static Path dartDir() {
     File scriptFile = new File(testScriptPath);
     Path scriptPath = new Path.fromNative(scriptFile.fullPathSync());
@@ -1552,9 +1571,8 @@
         args.add("--allow-mock-compilation");
       }
     }
-    // TODO(riocw): Unify our minification calling convention between dart2js
-    // and dart2dart.
-    if (compiler == "dart2js" && configuration["minified"]) {
+    if ((compiler == "dart2js" || compiler == "dart2dart") &&
+        configuration["minified"]) {
       args.add("--minify");
     }
     return args;
@@ -1579,6 +1597,23 @@
   static bool isJsCommandLineRuntime(String runtime) =>
       const ['d8', 'jsshell'].contains(runtime);
 
+  static String buildDir(Map configuration) {
+    if (configuration['build_directory'] != '') {
+      return configuration['build_directory'];
+    }
+    var outputDir = '';
+    var system = configuration['system'];
+    if (system == 'linux') {
+      outputDir = 'out/';
+    } else if (system == 'macos') {
+      outputDir = 'xcodebuild/';
+    } else if (system == 'windows') {
+      outputDir = 'build/';
+    }
+    var mode = (configuration['mode'] == 'debug') ? 'Debug' : 'Release';
+    var arch = configuration['arch'].toUpperCase();
+    return "$outputDir$mode$arch";
+  }
 }
 
 class SummaryReport {
diff --git a/tools/testing/drt-trampoline.py b/tools/testing/drt-trampoline.py
index fc27a7d..ac5b23d69 100644
--- a/tools/testing/drt-trampoline.py
+++ b/tools/testing/drt-trampoline.py
@@ -8,40 +8,70 @@
 #
 # Expected invocation: python drt-trampoline.py <path to DRT> <DRT command line>
 
+import optparse
 import os
 import signal
 import subprocess
 import sys
 
-DART_FLAGS_PREFIX = '--dart-flags='
-OUT_EXPECTATION_PREFIX = '--out-expectation='
+def parse_options(argv):
+  parser = optparse.OptionParser()
+  parser.add_option('--dart-flags',
+                    metavar='FLAGS',
+                    dest='dart_flags')
+  parser.add_option('--out-expectation',
+                    metavar='FILE',
+                    dest='out_expected_file')
+  parser.add_option('--package-root',
+                    metavar='DIRECTORY',
+                    dest='dart_package_root')
+  parser.add_option('--no-timeout',
+                    action='store_true')
+  return parser.parse_args(args=argv)
+
 
 def main(argv):
   drt_path = argv[1]
-  command_line = argv[2:]
+  (options, arguments) = parse_options(argv[2:])
 
   cmd = [drt_path]
 
   env = None
   test_file = None
-  out_expected_file = None
+  dart_flags = options.dart_flags
+  out_expected_file = options.out_expected_file
+  dart_package_root = options.dart_package_root
   is_png = False
 
-  # parse arguments, filtering out flags, and selecting the input test file
-  for arg in command_line:
-    if arg.startswith(DART_FLAGS_PREFIX):
+  if dart_flags:
+    if not env:
       env = dict(os.environ.items())
-      env['DART_FLAGS'] = arg[len(DART_FLAGS_PREFIX):]
-    elif arg.startswith(OUT_EXPECTATION_PREFIX):
-      out_expected_file = arg[len(OUT_EXPECTATION_PREFIX):]
-      if out_expected_file.endswith('.png'):
-        cmd.append('--notree')
-        is_png = True
-      elif not out_expected_file.endswith('.txt'):
-        raise Exception(
-            'Bad file expectation (%s), ' % out_expected_file
-            + 'please specify either a .txt or a .png file')
-    elif '.html' in arg:
+    env['DART_FLAGS'] = dart_flags
+
+  if dart_package_root:
+    if not env:
+      env = dict(os.environ.items())
+    absolute_path = os.path.abspath(dart_package_root)
+    absolute_path = absolute_path.replace(os.path.sep, '/')
+    if not absolute_path.startswith('/'):
+      # Happens on Windows for C:\packages
+      absolute_path = '/%s' % absolute_path
+    env['DART_PACKAGE_ROOT'] = 'file://%s' % absolute_path
+
+  if out_expected_file:
+    if out_expected_file.endswith('.png'):
+      cmd.append('--notree')
+      is_png = True
+    elif not out_expected_file.endswith('.txt'):
+      raise Exception(
+        'Bad file expectation (%s) please specify either a .txt or a .png file'
+        % out_expected_file)
+
+  if options.no_timeout:
+    cmd.append('--no-timeout')
+
+  for arg in arguments:
+    if '.html' in arg:
       test_file = arg
     else:
       cmd.append(arg)
diff --git a/tools/utils/vim/syntax/dart.vim b/tools/utils/vim/syntax/dart.vim
index f954ebd..669db58 100644
--- a/tools/utils/vim/syntax/dart.vim
+++ b/tools/utils/vim/syntax/dart.vim
@@ -34,7 +34,7 @@
 syn keyword dartStatement      return
 syn keyword dartStorageClass   static abstract
 syn keyword dartExceptions     throw try catch finally
-syn keyword dartExceptions     Error FormatException Exception ExpectException FutureAlreadyCompleteException FutureNotCompleteException ArgumentError IllegalJSRegExpException IntegerDivisionByZeroException NoSuchMethodError NullPointerException OutOfMemoryError RangeError StackOverflowException StateError UnimplementedError UnsupportedError
+syn keyword dartExceptions     Error FormatException Exception ExpectException FutureAlreadyCompleteException FutureNotCompleteException ArgumentError IllegalJSRegExpException IntegerDivisionByZeroException NoSuchMethodError NullThrownError OutOfMemoryError RangeError StackOverflowException StateError UnimplementedError UnsupportedError
 syn keyword dartExceptions_DEPRECATED     BadNumberFormatException
 syn keyword dartAssert         assert
 syn keyword dartClassDecl      extends implements interface
diff --git a/utils/apidoc/apidoc.gyp b/utils/apidoc/apidoc.gyp
index abd2961..c029b94 100644
--- a/utils/apidoc/apidoc.gyp
+++ b/utils/apidoc/apidoc.gyp
@@ -45,6 +45,7 @@
             '--mode=static',
             '--exclude-lib=dartdoc',
             '--exclude-lib=http',
+            '--exclude-lib=oauth2',
             '--exclude-lib=webdriver',
             '--include-lib=matcher',
             '--include-lib=mock',
diff --git a/pkg/http/lib/src/curl_client.dart b/utils/pub/curl_client.dart
similarity index 70%
rename from pkg/http/lib/src/curl_client.dart
rename to utils/pub/curl_client.dart
index 079d1c3..20a1027 100644
--- a/pkg/http/lib/src/curl_client.dart
+++ b/utils/pub/curl_client.dart
@@ -6,32 +6,36 @@
 
 import 'dart:io';
 
-import 'base_client.dart';
-import 'base_request.dart';
-import 'streamed_response.dart';
+import '../../pkg/http/lib/http.dart' as http;
+import 'io.dart';
 import 'utils.dart';
 
-/// A drop-in replacement for [Client] that uses the `curl` command-line utility
-/// rather than [dart:io] to make requests. This class will only exist
+/// A drop-in replacement for [http.Client] that uses the `curl` command-line
+/// utility rather than [dart:io] to make requests. This class will only exist
 /// temporarily until [dart:io] natively supports requests over HTTPS.
-class CurlClient extends BaseClient {
-  /// The path to the `curl` executable to run. By default, this will look up
-  /// `curl` on the system path.
+class CurlClient extends http.BaseClient {
+  /// The path to the `curl` executable to run.
+  ///
+  /// By default on Unix-like operating systems, this will look up `curl` on the
+  /// system path. On Windows, it will use the bundled `curl.exe`.
   final String executable;
 
   /// Creates a new [CurlClient] with [executable] as the path to the `curl`
-  /// executable. By default, this will look up `curl` on the system path.
+  /// executable.
+  ///
+  /// By default on Unix-like operating systems, this will look up `curl` on the
+  /// system path. On Windows, it will use the bundled `curl.exe`.
   CurlClient([String executable])
-    : executable = executable == null ? "curl" : executable;
+    : executable = executable == null ? _defaultExecutable : executable;
 
   /// Sends a request via `curl` and returns the response.
-  Future<StreamedResponse> send(BaseRequest request) {
+  Future<http.StreamedResponse> send(http.BaseRequest request) {
     var requestStream = request.finalize();
     return withTempDir((tempDir) {
       var headerFile = new Path(tempDir).append("curl-headers").toNativePath();
       var arguments = _argumentsForRequest(request, headerFile);
       var process;
-      return Process.start("curl", arguments).chain((process_) {
+      return Process.start(executable, arguments).chain((process_) {
         process = process_;
         if (requestStream.closed) {
           process.stdin.close();
@@ -48,8 +52,16 @@
   /// Returns the list of arguments to `curl` necessary for performing
   /// [request]. [headerFile] is the path to the file where the response headers
   /// should be stored.
-  List<String> _argumentsForRequest(BaseRequest request, String headerFile) {
-    var arguments = ["--dump-header", headerFile];
+  List<String> _argumentsForRequest(
+      http.BaseRequest request, String headerFile) {
+    // Note: This line of code gets munged by create_sdk.py to be the correct
+    // relative path to the certificate file in the SDK.
+    var pathToCertificates = "../../third_party/curl/ca-certificates.crt";
+
+    var arguments = [
+      "--dump-header", headerFile,
+      "--cacert", relativeToPub(pathToCertificates)
+    ];
     if (request.method == 'HEAD') {
       arguments.add("--head");
     } else {
@@ -72,7 +84,7 @@
       'accept': '',
       'user-agent': ''
     };
-    mapAddAll(headers, request.headers);
+    request.headers.forEach((name, value) => headers[name] = value);
     if (request.contentLength < 0) {
       headers['content-length'] = '';
       headers['transfer-encoding'] = 'chunked';
@@ -106,7 +118,7 @@
             .transform((stderrBytes) {
         var message = new String.fromCharCodes(stderrBytes);
         if (exitCode == 47) {
-          throw new RedirectLimitExceededException(message);
+          throw new RedirectLimitExceededException([]);
         } else {
           throw new HttpException(message);
         }
@@ -148,9 +160,9 @@
     return completer.future;
   }
 
-  /// Returns a [StreamedResponse] from the response data printed by the `curl`
-  /// [process]. [lines] are the headers that `curl` wrote to a file.
-  StreamedResponse _buildResponse(Process process, List<String> lines) {
+  /// 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) {
     // 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
@@ -162,7 +174,7 @@
     var status = int.parse(statusParts[1]);
     var isRedirect = status >= 300 && status < 400;
     var reasonPhrase =
-        Strings.join(" ", statusParts.getRange(2, statusParts.length - 2));
+        Strings.join(statusParts.getRange(2, statusParts.length - 2), " ");
     var headers = <String>{};
     for (var line in lines) {
       if (line.isEmpty) continue;
@@ -179,9 +191,20 @@
       contentLength = int.parse(headers['content-length']);
     }
 
-    return new StreamedResponse(responseStream, status, contentLength,
+    return new http.StreamedResponse(responseStream, status, contentLength,
         headers: headers,
         isRedirect: isRedirect,
         reasonPhrase: reasonPhrase);
   }
+
+  /// The default executable to use for running curl. On Windows, this is the
+  /// path to the bundled `curl.exe`; elsewhere, this is just "curl", and we
+  /// assume it to be installed and on the user's PATH.
+  static String get _defaultExecutable {
+    if (Platform.operatingSystem != 'windows') return 'curl';
+    // Note: This line of code gets munged by create_sdk.py to be the correct
+    // relative path to curl in the SDK.
+    var pathToCurl = "../../third_party/curl/curl.exe";
+    return relativeToPub(pathToCurl);
+  }
 }
diff --git a/utils/pub/io.dart b/utils/pub/io.dart
index 793c7263..ed5dee6 100644
--- a/utils/pub/io.dart
+++ b/utils/pub/io.dart
@@ -365,6 +365,13 @@
       .toNativePath();
 }
 
+/// 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();
+}
+
 // TODO(nweiz): make this configurable
 /**
  * The amount of time in milliseconds to allow HTTP requests before assuming
@@ -535,6 +542,19 @@
   return completer.future;
 }
 
+/// Creates a temporary directory and passes its path to [fn]. Once the [Future]
+/// returned by [fn] completes, the temporary directory and all its contents
+/// will be deleted.
+Future withTempDir(Future fn(String path)) {
+  var tempDir;
+  var future = new Directory('').createTemp().chain((dir) {
+    tempDir = dir;
+    return fn(tempDir.path);
+  });
+  future.onComplete((_) => tempDir.delete(recursive: true));
+  return future;
+}
+
 /// Tests whether or not the git command-line app is available for use.
 Future<bool> get isGitInstalled {
   if (_isGitInstalledCache != null) {
@@ -633,14 +653,10 @@
   // read from stdin instead of a file. Consider resurrecting that version if
   // we can figure out why it fails.
 
-  // Find 7zip.
-  var scriptPath = new File(new Options().script).fullPathSync();
-  var scriptDir = new Path.fromNative(scriptPath).directoryPath;
-
   // 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 = scriptDir.append(pathTo7zip).canonicalize().toNativePath();
+  var command = relativeToPub(pathTo7zip);
 
   var tempDir;
 
@@ -674,8 +690,7 @@
     if (tarFile == null) throw 'The gzip file did not contain a tar file.';
 
     // Untar the archive into the destination directory.
-    return runProcess(command, ['x', '-o"$destination"', tarFile],
-        workingDir: tempDir);
+    return runProcess(command, ['x', tarFile], workingDir: destination);
   }).chain((result) {
     if (result.exitCode != 0) {
       throw 'Could not un-tar (exit code ${result.exitCode}). Error:\n'
diff --git a/utils/pub/utils.dart b/utils/pub/utils.dart
index 21275f8..4097885 100644
--- a/utils/pub/utils.dart
+++ b/utils/pub/utils.dart
@@ -129,3 +129,24 @@
   new Timer(milliSeconds, completer.complete);
   return completer.future;
 }
+
+/// Configures [future] so that its result (success or exception) is passed on
+/// to [completer].
+void chainToCompleter(Future future, Completer completer) {
+  future.handleException((e) {
+    completer.completeException(e);
+    return true;
+  });
+  future.then(completer.complete);
+}
+
+/// 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) {
+  if (toSplit.isEmpty) return <String>[];
+
+  var index = toSplit.indexOf(pattern);
+  if (index == -1) return [toSplit];
+  return [toSplit.substring(0, index),
+    toSplit.substring(index + pattern.length)];
+}
diff --git a/pkg/http/test/curl_client_test.dart b/utils/tests/pub/curl_client_test.dart
similarity index 82%
rename from pkg/http/test/curl_client_test.dart
rename to utils/tests/pub/curl_client_test.dart
index d94ad38..98432e0 100644
--- a/pkg/http/test/curl_client_test.dart
+++ b/utils/tests/pub/curl_client_test.dart
@@ -8,24 +8,25 @@
 import 'dart:isolate';
 import 'dart:uri';
 
-import '../../unittest/lib/unittest.dart';
-import '../lib/http.dart' as http;
-import '../lib/src/utils.dart';
-import 'utils.dart';
+import '../../../pkg/unittest/lib/unittest.dart';
+import '../../../pkg/http/lib/http.dart' as http;
+import '../../../pkg/http/test/utils.dart';
+import '../../pub/curl_client.dart';
+import '../../pub/io.dart';
 
 void main() {
   setUp(startServer);
   tearDown(stopServer);
 
   test('head', () {
-    expect(new http.CurlClient().head(serverUrl).transform((response) {
+    expect(new CurlClient().head(serverUrl).transform((response) {
       expect(response.statusCode, equals(200));
       expect(response.body, equals(''));
     }), completes);
   });
 
   test('get', () {
-    expect(new http.CurlClient().get(serverUrl, headers: {
+    expect(new CurlClient().get(serverUrl, headers: {
       'X-Random-Header': 'Value',
       'X-Other-Header': 'Other Value'
     }).transform((response) {
@@ -42,7 +43,7 @@
   });
 
   test('post', () {
-    expect(new http.CurlClient().post(serverUrl, headers: {
+    expect(new CurlClient().post(serverUrl, headers: {
       'X-Random-Header': 'Value',
       'X-Other-Header': 'Other Value'
     }, fields: {
@@ -67,7 +68,7 @@
   });
 
   test('post without fields', () {
-    expect(new http.CurlClient().post(serverUrl, headers: {
+    expect(new CurlClient().post(serverUrl, headers: {
       'X-Random-Header': 'Value',
       'X-Other-Header': 'Other Value',
       'Content-Type': 'text/plain'
@@ -86,7 +87,7 @@
   });
 
   test('put', () {
-    expect(new http.CurlClient().put(serverUrl, headers: {
+    expect(new CurlClient().put(serverUrl, headers: {
       'X-Random-Header': 'Value',
       'X-Other-Header': 'Other Value'
     }, fields: {
@@ -111,7 +112,7 @@
   });
 
   test('put without fields', () {
-    expect(new http.CurlClient().put(serverUrl, headers: {
+    expect(new CurlClient().put(serverUrl, headers: {
       'X-Random-Header': 'Value',
       'X-Other-Header': 'Other Value',
       'Content-Type': 'text/plain'
@@ -130,7 +131,7 @@
   });
 
   test('delete', () {
-    expect(new http.CurlClient().delete(serverUrl, headers: {
+    expect(new CurlClient().delete(serverUrl, headers: {
       'X-Random-Header': 'Value',
       'X-Other-Header': 'Other Value'
     }).transform((response) {
@@ -147,7 +148,7 @@
   });
 
   test('read', () {
-    expect(new http.CurlClient().read(serverUrl, headers: {
+    expect(new CurlClient().read(serverUrl, headers: {
       'X-Random-Header': 'Value',
       'X-Other-Header': 'Other Value'
     }), completion(parse(equals({
@@ -161,12 +162,12 @@
   });
 
   test('read throws an error for a 4** status code', () {
-    expect(new http.CurlClient().read(serverUrl.resolve('/error')),
+    expect(new CurlClient().read(serverUrl.resolve('/error')),
         throwsHttpException);
   });
 
   test('readBytes', () {
-    var future = new http.CurlClient().readBytes(serverUrl, headers: {
+    var future = new CurlClient().readBytes(serverUrl, headers: {
       'X-Random-Header': 'Value',
       'X-Other-Header': 'Other Value'
     }).transform((bytes) => new String.fromCharCodes(bytes));
@@ -182,12 +183,12 @@
   });
 
   test('readBytes throws an error for a 4** status code', () {
-    expect(new http.CurlClient().readBytes(serverUrl.resolve('/error')),
+    expect(new CurlClient().readBytes(serverUrl.resolve('/error')),
         throwsHttpException);
   });
 
   test('#send a StreamedRequest', () {
-    var client = new http.CurlClient();
+    var client = new CurlClient();
     var request = new http.StreamedRequest("POST", serverUrl);
     request.headers[HttpHeaders.CONTENT_TYPE] =
       'application/json; charset=utf-8';
@@ -214,7 +215,7 @@
 
   test('with one redirect', () {
     var url = serverUrl.resolve('/redirect');
-    expect(new http.CurlClient().get(url).transform((response) {
+    expect(new CurlClient().get(url).transform((response) {
       expect(response.statusCode, equals(200));
       expect(response.body, parse(equals({
         'method': 'GET',
@@ -225,36 +226,36 @@
   });
 
   test('with too many redirects', () {
-    expect(new http.CurlClient().get(serverUrl.resolve('/loop?1')),
+    expect(new CurlClient().get(serverUrl.resolve('/loop?1')),
         throwsRedirectLimitExceededException);
   });
 
   test('with a generic failure', () {
-    expect(new http.CurlClient().get('url fail'),
+    expect(new CurlClient().get('url fail'),
         throwsHttpException);
   });
 
   test('with one redirect via HEAD', () {
     var url = serverUrl.resolve('/redirect');
-    expect(new http.CurlClient().head(url).transform((response) {
+    expect(new CurlClient().head(url).transform((response) {
       expect(response.statusCode, equals(200));
     }), completes);
   });
 
   test('with too many redirects via HEAD', () {
-    expect(new http.CurlClient().head(serverUrl.resolve('/loop?1')),
+    expect(new CurlClient().head(serverUrl.resolve('/loop?1')),
         throwsRedirectLimitExceededException);
   });
 
   test('with a generic failure via HEAD', () {
-    expect(new http.CurlClient().head('url fail'),
+    expect(new CurlClient().head('url fail'),
         throwsHttpException);
   });
 
   test('without following redirects', () {
     var request = new http.Request('GET', serverUrl.resolve('/redirect'));
     request.followRedirects = false;
-    expect(new http.CurlClient().send(request).chain(http.Response.fromStream)
+    expect(new CurlClient().send(request).chain(http.Response.fromStream)
         .transform((response) {
       expect(response.statusCode, equals(302));
       expect(response.isRedirect, true);
diff --git a/utils/tests/string_encoding/unicode_test.dart b/utils/tests/string_encoding/unicode_test.dart
index 3fb23a6..054ff45 100755
--- a/utils/tests/string_encoding/unicode_test.dart
+++ b/utils/tests/string_encoding/unicode_test.dart
@@ -24,24 +24,24 @@
 
   void registerTests(TestSuite suite) {
     register("testCodepointsToString", testCodepointsToString, suite);
-    register("testStringToCodepoints", testStringToCodepoints, suite);
-    register("testEmptyCodepointsToString", testEmptyCodepointsToString, suite);
-    register("testEmptyStringToCodepoints", testEmptyStringToCodepoints, suite);
+    register("testStringCharCodes", testStringCharCodes, suite);
+    register("testEmptyStringFromCharCodes", testEmptyStringFromCharCodes, suite);
+    register("testEmptyStringCharCodes", testEmptyStringCharCodes, suite);
   }
 
-  void testStringToCodepoints() {
-    Expect.listEquals(testCodepoints, stringToCodepoints(testPhrase));
+  void testStringCharCodes() {
+    Expect.listEquals(testCodepoints, testPhrase.charCodes());
   }
 
   void testCodepointsToString() {
-    Expect.stringEquals(testPhrase, codepointsToString(testCodepoints));
+    Expect.stringEquals(testPhrase, new String.fromCharCodes(testCodepoints));
   }
 
-  void testEmptyCodepointsToString() {
-    Expect.stringEquals("", codepointsToString(<int>[]));
+  void testEmptyStringFromCharCodes() {
+    Expect.stringEquals("", new String.fromCharCodes(<int>[]));
   }
 
-  void testEmptyStringToCodepoints() {
-    Expect.listEquals([], stringToCodepoints(""));
+  void testEmptyStringCharCodes() {
+    Expect.listEquals([], "".charCodes());
   }
 }
