diff --git a/runtime/vm/stub_code_x64.cc b/runtime/vm/stub_code_x64.cc
index 49eec4b..84c562e 100644
--- a/runtime/vm/stub_code_x64.cc
+++ b/runtime/vm/stub_code_x64.cc
@@ -453,6 +453,7 @@
   // require allocation.
   __ EnterStubFrame();
   if (preserve_result) {
+    __ pushq(Immediate(0));  // Workaround for dropped stack slot during GC.
     __ pushq(RBX);  // Preserve result, it will be GC-d here.
   }
   __ pushq(Immediate(Smi::RawValue(0)));  // Space for the result.
@@ -463,6 +464,7 @@
   __ SmiUntag(RBX);
   if (preserve_result) {
     __ popq(RAX);  // Restore result.
+    __ Drop(1);  // Workaround for dropped stack slot during GC.
   }
   __ LeaveFrame();
 
@@ -1820,7 +1822,7 @@
 //  RBX, R10: May contain arguments to runtime stub.
 //  TOS(0): return address (Dart code).
 void StubCode::GenerateBreakpointRuntimeStub(Assembler* assembler) {
-  __ EnterStubFrame();
+  __ EnterStubFrameWithPP();
   // Preserve runtime args.
   __ pushq(RBX);
   __ pushq(R10);
@@ -1832,7 +1834,7 @@
   __ popq(RAX);  // Address of original.
   __ popq(R10);  // Restore arguments.
   __ popq(RBX);
-  __ LeaveFrame();
+  __ LeaveFrameWithPP();
   __ jmp(RAX);   // Jump to original stub.
 }
 
@@ -1861,11 +1863,11 @@
 
 //  TOS(0): return address (Dart code).
 void StubCode::GenerateBreakpointReturnStub(Assembler* assembler) {
-  __ EnterStubFrame();
+  __ EnterStubFrameWithPP();
   __ pushq(RAX);
   __ CallRuntime(kBreakpointReturnHandlerRuntimeEntry, 0);
   __ popq(RAX);
-  __ LeaveFrame();
+  __ LeaveFrameWithPP();
 
   __ popq(R11);  // discard return address of call to this stub.
   __ LeaveFrameWithPP();
diff --git a/sdk/lib/_internal/compiler/implementation/elements/elements.dart b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
index 1d7ecf8..d530651 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/elements.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
@@ -932,7 +932,8 @@
 
 abstract class MixinApplicationElement extends ClassElement {
   ClassElement get mixin;
-  void set mixin(ClassElement value);
+  InterfaceType get mixinType;
+  void set mixinType(InterfaceType value);
   void addConstructor(FunctionElement constructor);
 }
 
diff --git a/sdk/lib/_internal/compiler/implementation/elements/modelx.dart b/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
index b10064e..0b6c4c2 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
@@ -2172,12 +2172,14 @@
 
   Link<FunctionElement> constructors = new Link<FunctionElement>();
 
-  ClassElement mixin;
+  InterfaceType mixinType;
 
   MixinApplicationElementX(String name, Element enclosing, int id,
                            this.node, this.modifiers)
       : super(name, enclosing, id, STATE_NOT_STARTED);
 
+  ClassElement get mixin => mixinType != null ? mixinType.element : null;
+
   bool get isMixinApplication => true;
   bool get isUnnamedMixinApplication => node is! NamedMixinApplication;
   bool get hasConstructor => !constructors.isEmpty;
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirror.dart b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirror.dart
index 987b996..86ef658 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirror.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirror.dart
@@ -293,6 +293,8 @@
 
   String get simpleName => _element.name;
 
+  bool get isNameSynthetic => false;
+
   /**
    * Computes the first token for this declaration using the begin token of the
    * element node or element position as indicator.
@@ -537,13 +539,7 @@
    */
   String get simpleName {
     if (_library.libraryTag != null) {
-      // TODO(ahe): Remove StringNode check when old syntax is removed.
-      StringNode name = _library.libraryTag.name.asStringNode();
-      if (name != null) {
-        return name.dartString.slowToString();
-      } else {
-        return _library.libraryTag.name.toString();
-      }
+      return _library.libraryTag.name.toString();
     } else {
       // Use the file name as script name.
       String path = _library.canonicalUri.path;
@@ -847,6 +843,23 @@
     return null;
   }
 
+  ClassMirror get mixin {
+    if (_class.isMixinApplication) {
+      MixinApplicationElement mixinApplication = _class;
+      return new Dart2JsInterfaceTypeMirror(mirrors,
+                                            mixinApplication.mixinType);
+    }
+    return this;
+  }
+
+  bool get isNameSynthetic {
+    if (_class.isMixinApplication) {
+      MixinApplicationElement mixinApplication = _class;
+      return mixinApplication.isUnnamedMixinApplication;
+    }
+    return false;
+  }
+
   List<ClassMirror> get superinterfaces {
     var list = <ClassMirror>[];
     Link<DartType> link = _class.interfaces;
@@ -958,6 +971,10 @@
 
   List<ClassMirror> get superinterfaces => const <ClassMirror>[];
 
+  // TODO(johnniwinther): Refactor [TypedefMirror] to not extend [ClassMirror]
+  // and remove this.
+  ClassMirror get mixin => this;
+
   bool get isClass => false;
 
   bool get isOriginalDeclaration => true;
@@ -1077,6 +1094,8 @@
 
   InterfaceType get _interfaceType => _type;
 
+  bool get isNameSynthetic => originalDeclaration.isNameSynthetic;
+
   String get qualifiedName => originalDeclaration.qualifiedName;
 
   // TODO(johnniwinther): Substitute type arguments for type variables.
@@ -1096,6 +1115,14 @@
   // TODO(johnniwinther): Substitute type arguments for type variables.
   List<ClassMirror> get superinterfaces => originalDeclaration.superinterfaces;
 
+  // TODO(johnniwinther): Substitute type arguments for type variables.
+  ClassMirror get mixin {
+    if (originalDeclaration.mixin == originalDeclaration) {
+      return this;
+    }
+    return originalDeclaration.mixin;
+  }
+
   bool get isClass => originalDeclaration.isClass;
 
   bool get isAbstract => originalDeclaration.isAbstract;
@@ -1170,7 +1197,7 @@
   List<ParameterMirror> _parameters;
 
   Dart2JsFunctionTypeMirror(Dart2JsMirrorSystem system,
-                             FunctionType functionType, this._functionSignature)
+                            FunctionType functionType, this._functionSignature)
       : super(system, functionType) {
     assert (_functionSignature != null);
   }
@@ -1209,6 +1236,8 @@
   // TODO(johnniwinther): Substitute type arguments for type variables.
   List<ClassMirror> get superinterfaces => originalDeclaration.superinterfaces;
 
+  ClassMirror get mixin => this;
+
   bool get isClass => originalDeclaration.isClass;
 
   bool get isPrivate => originalDeclaration.isPrivate;
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/mirrors.dart b/sdk/lib/_internal/compiler/implementation/mirrors/mirrors.dart
index 7347573..8e83643 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors/mirrors.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/mirrors.dart
@@ -64,6 +64,10 @@
    */
   String get simpleName;
 
+  /// Returns `true` if the name of this declaration is generated by the
+  /// provider of the mirror system.
+  bool get isNameSynthetic;
+
   /**
    * Returns the name of this entity qualified by is enclosing context. For
    * instance, the qualified name of a method 'method' in class 'Class' in
@@ -107,7 +111,7 @@
   /**
    * Looks up [name] in the scope of this declaration.
    *
-   * [name] may be either a single identifier, like 'foo', or of the 
+   * [name] may be either a single identifier, like 'foo', or of the
    * a prefixed identifier, like 'foo.bar', where 'foo' must be a prefix.
    * For methods and constructors, the scope includes the parameters. For
    * classes and typedefs, the scope includes the type variables.
@@ -368,6 +372,13 @@
   List<ClassMirror> get superinterfaces;
 
   /**
+   * The mixin of this class. If this class is the result of a mixin application
+   * of the form S with M, returns a class mirror on M. Otherwise return the
+   * class mirror itself.
+   */
+  ClassMirror get mixin;
+
+  /**
    * Is [:true:] iff this type is a class.
    */
   bool get isClass;
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart b/sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart
index 81fcc90..4336d05 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart
@@ -172,6 +172,83 @@
   }
 }
 
+bool isMixinApplication(Mirror mirror) {
+  return mirror is ClassMirror && mirror.mixin != mirror;
+}
+
+/**
+ * Returns the superclass of [cls] skipping unnamed mixin applications.
+ *
+ * For instance, for all of the following definitions this method returns [:B:].
+ *
+ *     class A extends B {}
+ *     class A extends B with C1, C2 {}
+ *     class A extends B implements D1, D2 {}
+ *     class A extends B with C1, C2 implements D1, D2 {}
+ *     class A = B with C1, C2;
+ *     abstract class A = B with C1, C2 implements D1, D2;
+ */
+ClassMirror getSuperclass(ClassMirror cls) {
+  ClassMirror superclass = cls.superclass;
+  while (isMixinApplication(superclass) && superclass.isNameSynthetic) {
+    superclass = superclass.superclass;
+  }
+  return superclass;
+}
+
+/**
+ * Returns the mixins directly applied to [cls].
+ *
+ * For instance, for all of the following definitions this method returns
+ * [:C1, C2:].
+ *
+ *     class A extends B with C1, C2 {}
+ *     class A extends B with C1, C2 implements D1, D2 {}
+ *     class A = B with C1, C2;
+ *     abstract class A = B with C1, C2 implements D1, D2;
+ */
+Iterable<ClassMirror> getAppliedMixins(ClassMirror cls) {
+  List<ClassMirror> mixins = <ClassMirror>[];
+  ClassMirror superclass = cls.superclass;
+  while (isMixinApplication(superclass) && superclass.isNameSynthetic) {
+    mixins.add(superclass.mixin);
+    superclass = superclass.superclass;
+  }
+  if (mixins.length > 1) {
+    mixins = new List<ClassMirror>.from(mixins.reversed);
+  }
+  if (isMixinApplication(cls)) {
+    mixins.add(cls.mixin);
+  }
+  return mixins;
+}
+
+/**
+ * Returns the superinterfaces directly and explicitly implemented by [cls].
+ *
+ * For instance, for all of the following definitions this method returns
+ * [:D1, D2:].
+ *
+ *     class A extends B implements D1, D2 {}
+ *     class A extends B with C1, C2 implements D1, D2 {}
+ *     abstract class A = B with C1, C2 implements D1, D2;
+ */
+Iterable<ClassMirror> getExplicitInterfaces(ClassMirror cls) {
+  if (isMixinApplication(cls)) {
+    bool first = true;
+    ClassMirror mixin = cls.mixin;
+    bool filter(ClassMirror superinterface) {
+      if (first && superinterface == mixin) {
+        first = false;
+        return false;
+      }
+      return true;
+    }
+    return cls.superinterfaces.where(filter);
+  }
+  return cls.superinterfaces;
+}
+
 final RegExp _singleLineCommentStart = new RegExp(r'^///? ?(.*)');
 final RegExp _multiLineCommentStartEnd =
     new RegExp(r'^/\*\*? ?([\s\S]*)\*/$', multiLine: true);
@@ -220,12 +297,12 @@
  * Looks up [name] in the scope [declaration].
  *
  * If [name] is of the form 'a.b.c', 'a' is looked up in the scope of
- * [declaration] and if unresolved 'a.b' is looked in the scope of 
+ * [declaration] and if unresolved 'a.b' is looked in the scope of
  * [declaration]. Each identifier of the remaining suffix, 'c' or 'b.c', is
  * then looked up in the local scope of the previous result.
- * 
+ *
  * For instance, assumming that [:Iterable:] is imported into the scope of
- * [declaration] via the prefix 'col', 'col.Iterable.E' finds the type 
+ * [declaration] via the prefix 'col', 'col.Iterable.E' finds the type
  * variable of [:Iterable:] and 'col.Iterable.contains.element' finds the
  * [:element:] parameter of the [:contains:] method on [:Iterable:].
  */
@@ -233,7 +310,7 @@
                                          String name) {
   // TODO(11653): Support lookup of constructors using the [:new Foo:]
   // syntax.
-  int offset = 1; 
+  int offset = 1;
   List<String> parts = name.split('.');
   DeclarationMirror result = declaration.lookupInScope(parts[0]);
   if (result == null && parts.length > 1) {
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/members.dart b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
index 40703cf..699f026 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/members.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
@@ -3949,10 +3949,8 @@
       return;
     }
 
-    assert(mixinApplication.mixin == null);
-    Element mixin = resolveMixinFor(mixinApplication, mixinType);
-
-    mixinApplication.mixin = mixin;
+    assert(mixinApplication.mixinType == null);
+    mixinApplication.mixinType = resolveMixinFor(mixinApplication, mixinType);
 
     // Create forwarding constructors for constructor defined in the superclass
     // because they are now hidden by the mixin application.
@@ -3966,8 +3964,8 @@
     calculateAllSupertypes(mixinApplication);
   }
 
-  ClassElement resolveMixinFor(MixinApplicationElement mixinApplication,
-                               DartType mixinType) {
+  InterfaceType resolveMixinFor(MixinApplicationElement mixinApplication,
+                                DartType mixinType) {
     ClassElement mixin = mixinType.element;
     mixin.ensureResolved(compiler);
 
@@ -3989,7 +3987,7 @@
       current = currentMixinApplication.mixin;
     }
     compiler.world.registerMixinUse(mixinApplication, mixin);
-    return mixin;
+    return mixinType;
   }
 
   DartType resolveType(TypeAnnotation node) {
diff --git a/sdk/lib/_internal/dartdoc/lib/dartdoc.dart b/sdk/lib/_internal/dartdoc/lib/dartdoc.dart
index 33e2c46..b0536bd 100644
--- a/sdk/lib/_internal/dartdoc/lib/dartdoc.dart
+++ b/sdk/lib/_internal/dartdoc/lib/dartdoc.dart
@@ -1186,12 +1186,13 @@
     subtypes.sort((x, y) => x.simpleName.compareTo(y.simpleName));
 
     // Show the chain of superclasses.
-    if (!type.superclass.isObject) {
+    var superclass = getSuperclass(type);
+    if (!superclass.isObject) {
       final supertypes = [];
-      var thisType = type.superclass;
+      var thisType = superclass;
       do {
         supertypes.add(thisType);
-        thisType = thisType.superclass;
+        thisType = getSuperclass(thisType);
       } while (!thisType.isObject);
 
       writeln('<h3>Extends</h3>');
@@ -1207,7 +1208,8 @@
     }
 
     listTypes(subtypes, 'Subclasses');
-    listTypes(type.superinterfaces, 'Implements');
+    listTypes(getAppliedMixins(type), 'Mixins');
+    listTypes(getExplicitInterfaces(type), 'Implements');
   }
 
   /**
@@ -1572,9 +1574,7 @@
     writeln('</h4>');
 
     if (inherited) {
-      write('<div class="inherited-from">inherited from ');
-      annotateType(host, member.owner);
-      write('</div>');
+      docInherited(host, member.owner);
     }
 
     writeln('<div class="doc">');
@@ -1589,6 +1589,21 @@
     _currentMember = null;
   }
 
+  /**
+   * Annotate a member as inherited or mixed in from [owner].
+   */
+  void docInherited(ContainerMirror host, ClassMirror owner) {
+    if (isMixinApplication(owner)) {
+      write('<div class="inherited-from">mixed in from ');
+      annotateType(host, owner.mixin);
+      write('</div>');
+    } else {
+      write('<div class="inherited-from">inherited from ');
+      annotateType(host, owner);
+      write('</div>');
+    }
+  }
+
   void docField(ContainerMirror host, VariableMirror field,
                 {bool asGetter: false, bool asSetter: false}) {
     if (asGetter) {
@@ -1654,9 +1669,7 @@
         ''');
 
     if (inherited) {
-      write('<div class="inherited-from">inherited from ');
-      annotateType(host, getter.owner);
-      write('</div>');
+      docInherited(host, getter.owner);
     }
 
     DocComment comment = getMemberComment(getter);
@@ -1779,6 +1792,9 @@
       }
     }
     if (comment == null) return null;
+    if (isMixinApplication(inheritedFrom)) {
+      inheritedFrom = inheritedFrom.mixin;
+    }
     return new DocComment(comment, inheritedFrom, dartdocSyntaxes,
         dartdocResolver);
   }
diff --git a/sdk/lib/_internal/lib/js_mirrors.dart b/sdk/lib/_internal/lib/js_mirrors.dart
index 802563e..79bbdb6 100644
--- a/sdk/lib/_internal/lib/js_mirrors.dart
+++ b/sdk/lib/_internal/lib/js_mirrors.dart
@@ -204,6 +204,8 @@
 
   String get _prettyName => 'TypeVariableMirror';
 
+  bool get isTopLevel => false;
+
   TypeMirror get upperBound {
     if (_cachedUpperBound != null) return _cachedUpperBound;
     return _cachedUpperBound = typeMirrorFromRuntimeTypeRepresentation(
@@ -555,6 +557,16 @@
   return result;
 }
 
+Map<Symbol, MethodMirror> filterConstructors(methods) {
+  var result = new Map();
+  for (JsMethodMirror method in methods) {
+    if (method.isConstructor) {
+      result[method.simpleName] = method;
+    }
+  }
+  return result;
+}
+
 Map<Symbol, MethodMirror> filterGetters(List<MethodMirror> methods,
                                         Map<Symbol, VariableMirror> fields) {
   var result = new Map();
@@ -571,7 +583,7 @@
 }
 
 Map<Symbol, MethodMirror> filterSetters(List<MethodMirror> methods,
-                                          Map<Symbol, VariableMirror> fields) {
+                                        Map<Symbol, VariableMirror> fields) {
   var result = new Map();
   for (JsMethodMirror method in methods) {
     if (method.isSetter) {
@@ -587,6 +599,24 @@
   return result;
 }
 
+Map<Symbol, Mirror> filterMembers(List<MethodMirror> methods,
+                                  Map<Symbol, VariableMirror> variables) {
+  Map<Symbol, Mirror> result = new Map.from(variables);
+  for (JsMethodMirror method in methods) {
+    if (method.isSetter) {
+      String name = n(method.simpleName);
+      name = name.substring(0, name.length - 1);
+      // Filter-out setters corresponding to variables.
+      if (result[s(name)] is VariableMirror) continue;
+    }
+    // Constructors aren't 'members'.
+    if (method.isConstructor) continue;
+    // Use putIfAbsent to filter-out getters corresponding to variables.
+    result.putIfAbsent(method.simpleName, () => method);
+  }
+  return result;
+}
+
 int counter = 0;
 
 ClassMirror reflectMixinApplication(mixinNames, String mangledName) {
@@ -861,6 +891,9 @@
   String _typeArguments;
 
   UnmodifiableListView<TypeMirror> _cachedTypeArguments;
+  UnmodifiableMapView<Symbol, DeclarationMirror> _cachedDeclarations;
+  UnmodifiableMapView<Symbol, DeclarationMirror> _cachedMembers;
+  UnmodifiableMapView<Symbol, MethodMirror> _cachedConstructors;
   Map<Symbol, VariableMirror> _cachedVariables;
   Map<Symbol, MethodMirror> _cachedGetters;
   Map<Symbol, MethodMirror> _cachedSetters;
@@ -927,8 +960,6 @@
     return _cachedTypeArguments = new UnmodifiableListView(result);
   }
 
-  Map<Symbol, MethodMirror> get constructors => _class.constructors;
-
   List<JsMethodMirror> get _methods {
     if (_cachedMethods != null) return _cachedMethods;
     return _cachedMethods =_class._getMethodsWithOwner(this);
@@ -940,6 +971,13 @@
         filterMethods(_methods));
   }
 
+  Map<Symbol, MethodMirror> get constructors {
+    if (_cachedConstructors != null) return _cachedConstructors;
+    return _cachedConstructors =
+        new UnmodifiableMapView<Symbol, MethodMirror>(
+            filterConstructors(_methods));
+  }
+
   Map<Symbol, MethodMirror> get getters {
     if (_cachedGetters != null) return _cachedGetters;
     return _cachedGetters = new UnmodifiableMapView<Symbol, MethodMirror>(
@@ -962,7 +1000,22 @@
         new UnmodifiableMapView<Symbol, VariableMirror>(result);
   }
 
-  Map<Symbol, Mirror> get members => _class.members;
+  Map<Symbol, DeclarationMirror> get members {
+    if (_cachedMembers != null) return _cachedMembers;
+    return _cachedMembers = new UnmodifiableMapView<Symbol, DeclarationMirror>(
+        filterMembers(_methods, variables));
+  }
+
+  Map<Symbol, DeclarationMirror> get declarations {
+    if (_cachedDeclarations != null) return _cachedDeclarations;
+    Map<Symbol, DeclarationMirror> result =
+        new Map<Symbol, DeclarationMirror>();
+    result.addAll(members);
+    result.addAll(constructors);
+    typeVariables.forEach((tv) => result[tv.simpleName] = tv);
+    return _cachedDeclarations =
+        new UnmodifiableMapView<Symbol, DeclarationMirror>(result);
+  }
 
   InstanceMirror setField(Symbol fieldName, Object arg) {
     return _class.setField(fieldName, arg);
@@ -1068,14 +1121,9 @@
 
   Map<Symbol, MethodMirror> get constructors {
     if (_cachedConstructors != null) return _cachedConstructors;
-    var result = new Map();
-    for (JsMethodMirror method in _methods) {
-      if (method.isConstructor) {
-        result[method.simpleName] = method;
-      }
-    }
     return _cachedConstructors =
-        new UnmodifiableMapView<Symbol, MethodMirror>(result);
+        new UnmodifiableMapView<Symbol, MethodMirror>(
+            filterConstructors(_methods));
   }
 
   List<JsMethodMirror> _getMethodsWithOwner(DeclarationMirror methodOwner) {
@@ -1189,20 +1237,8 @@
 
   Map<Symbol, Mirror> get members {
     if (_cachedMembers != null) return _cachedMembers;
-    Map<Symbol, Mirror> result = new Map.from(variables);
-    for (JsMethodMirror method in _methods) {
-      if (method.isSetter) {
-        String name = n(method.simpleName);
-        name = name.substring(0, name.length - 1);
-        // Filter-out setters corresponding to variables.
-        if (result[s(name)] is VariableMirror) continue;
-      }
-      // Constructors aren't 'members'.
-      if (method.isConstructor) continue;
-      // Use putIfAbsent to filter-out getters corresponding to variables.
-      result.putIfAbsent(method.simpleName, () => method);
-    }
-    return _cachedMembers = new UnmodifiableMapView<Symbol, Mirror>(result);
+    return _cachedMembers = new UnmodifiableMapView<Symbol, Mirror>(
+        filterMembers(_methods, variables));
   }
 
   Map<Symbol, DeclarationMirror> get declarations {
diff --git a/sdk/lib/convert/utf.dart b/sdk/lib/convert/utf.dart
index a6c6720..8e480f8 100644
--- a/sdk/lib/convert/utf.dart
+++ b/sdk/lib/convert/utf.dart
@@ -5,10 +5,10 @@
 part of dart.convert;
 
 /** The Unicode Replacement character `U+FFFD` (�). */
-const UNICODE_REPLACEMENT_CHARACTER_RUNE = 0xFFFD;
+const int UNICODE_REPLACEMENT_CHARACTER_RUNE = 0xFFFD;
 
 /** The Unicode Byte Order Marker (BOM) character `U+FEFF`. */
-const UNICODE_BOM_CHARACTER_RUNE = 0xFEFF;
+const int UNICODE_BOM_CHARACTER_RUNE = 0xFEFF;
 
 /**
  * An instance of the default implementation of the [Utf8Codec].
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index 3f455e92..32db241 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -14448,6 +14448,22 @@
   @DocsEditable()
   final String statusText;
 
+  /**
+   * Length of time before a request is automatically terminated.
+   *
+   * When the time has passed, a [TimeoutEvent] is dispatched.
+   *
+   * If [timeout] is set to 0, then the request will not time out.
+   *
+   * ## Other resources
+   *
+   * * [XMLHttpRequest.timeout]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest#timeout)
+   * from MDN.
+   * * [The timeout attribute]
+   * (http://www.w3.org/TR/XMLHttpRequest/#the-timeout-attribute)
+   * from W3C.
+   */
   @DomName('XMLHttpRequest.timeout')
   @DocsEditable()
   @Experimental() // untriaged
@@ -14550,15 +14566,34 @@
    * `send` method is intended only for more complext HTTP requests where
    * finer-grained control is needed.
    *
-   * See also:
+   * ## Other resources
    *
-   *   * [send](https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#send%28%29)
+   * * [XMLHttpRequest.send]
+   * (https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#send%28%29)
    * from MDN.
    */
   @DomName('XMLHttpRequest.send')
   @DocsEditable()
   void send([data]) native;
 
+  /**
+   * Sets the value of an HTTP requst header.
+   *
+   * This method should be called after the request is opened, but before
+   * the request is sent.
+   *
+   * Multiple calls with the same header will combine all their values into a
+   * single header.
+   *
+   * ## Other resources
+   *
+   * * [XMLHttpRequest.setRequestHeader]
+   * (https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#send%28%29)
+   * from MDN.
+   * * [The setRequestHeader() method]
+   * (http://www.w3.org/TR/XMLHttpRequest/#the-setrequestheader()-method) from
+   * W3C.
+   */
   @DomName('XMLHttpRequest.setRequestHeader')
   @DocsEditable()
   void setRequestHeader(String header, String value) native;
@@ -19292,6 +19327,9 @@
   // Custom element created callback.
   Node._created() : super._created();
 
+  /**
+   * A modifiable list of this node's children.
+   */
   List<Node> get nodes {
     return new _ChildNodeListLazy(this);
   }
@@ -19418,16 +19456,43 @@
   @DocsEditable()
   final String _baseUri;
 
+  /**
+   * A list of this node's children.
+   *
+   * ## Other resources
+   *
+   * * [Node.childNodes]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Node.childNodes)
+   * from MDN.
+   */
   @DomName('Node.childNodes')
   @DocsEditable()
   @Returns('NodeList')
   @Creates('NodeList')
   final List<Node> childNodes;
 
+  /**
+   * The first child of this node.
+   *
+   * ## Other resources
+   *
+   * * [Node.firstChild]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Node.firstChild)
+   * from MDN.
+   */
   @DomName('Node.firstChild')
   @DocsEditable()
   final Node firstChild;
 
+  /**
+   * The last child of this node.
+   *
+   * ## Other resources
+   *
+   * * [Node.lastChild]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Node.lastChild)
+   * from MDN.
+   */
   @DomName('Node.lastChild')
   @DocsEditable()
   final Node lastChild;
@@ -19443,41 +19508,147 @@
   final String _namespaceUri;
 
   @JSName('nextSibling')
+  /**
+   * The next sibling node.
+   *
+   * ## Other resources
+   *
+   * * [Node.nextSibling]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Node.nextSibling)
+   * from MDN.
+   */
   @DomName('Node.nextSibling')
   @DocsEditable()
   final Node nextNode;
 
+  /**
+   * The name of this node.
+   *
+   * This varies by this node's [nodeType].
+   *
+   * ## Other resources
+   *
+   * * [Node.nodeName]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Node.nodeName)
+   * from MDN. This page contains a table of [nodeName] values for each
+   * [nodeType].
+   */
   @DomName('Node.nodeName')
   @DocsEditable()
   final String nodeName;
 
+  /**
+   * The type of node.
+   *
+   * This value is one of:
+   *
+   * * [ATTRIBUTE_NODE] if this node is an attribute.
+   * * [CDATA_SECTION_NODE] if this node is a [CDataSection].
+   * * [COMMENT_NODE] if this node is a [Comment].
+   * * [DOCUMENT_FRAGMENT_NODE] if this node is a [DocumentFragment].
+   * * [DOCUMENT_NODE] if this node is a [Document].
+   * * [DOCUMENT_TYPE_NODE] if this node is a [DocumentType] node.
+   * * [ELEMENT_NODE] if this node is an [Element].
+   * * [ENTITY_NODE] if this node is an entity.
+   * * [ENTITY_REFERENCE_NODE] if this node is an entity reference.
+   * * [NOTATION_NODE] if this node is a notation.
+   * * [PROCESSING_INSTRUCTION_NODE] if this node is a [ProcessingInstruction].
+   * * [TEXT_NODE] if this node is a [Text] node.
+   *
+   * ## Other resources
+   *
+   * * [Node.nodeType]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Node.nodeType) from MDN.
+   */
   @DomName('Node.nodeType')
   @DocsEditable()
   final int nodeType;
 
+  /**
+   * The value of this node.
+   *
+   * This varies by this type's [nodeType].
+   *
+   * ## Other resources
+   *
+   * * [Node.nodeValue]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Node.nodeValue)
+   * from MDN. This page contains a table of [nodeValue] values for each
+   * [nodeType].
+   */
   @DomName('Node.nodeValue')
   @DocsEditable()
   final String nodeValue;
 
+  /**
+   * The document this node belongs to.
+   *
+   * Returns `null` if this node does not belong to any document.
+   *
+   * ## Other resources
+   *
+   * * [Node.ownerDocument]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Node.ownerDocument) from
+   * MDN.
+   */
   @DomName('Node.ownerDocument')
   @DocsEditable()
   final Document ownerDocument;
 
   @JSName('parentElement')
+  /**
+   * The parent element of this node.
+   *
+   * Returns `null` if this node either does not have a parent or its parent is
+   * not an element.
+   *
+   * ## Other resources
+   *
+   * * [Node.parentElement]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Node.parentElement) from
+   * W3C.
+   */
   @DomName('Node.parentElement')
   @DocsEditable()
   final Element parent;
 
+  /**
+   * The parent node of this node.
+   *
+   * ## Other resources
+   *
+   * * [Node.parentNode]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Node.parentNode) from
+   * MDN.
+   */
   @DomName('Node.parentNode')
   @DocsEditable()
   final Node parentNode;
 
   @JSName('previousSibling')
+  /**
+   * The previous sibling node.
+   *
+   * ## Other resources
+   *
+   * * [Node.previousSibling]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Node.previousSibling)
+   * from MDN.
+   */
   @DomName('Node.previousSibling')
   @DocsEditable()
   final Node previousNode;
 
   @JSName('textContent')
+  /**
+   * All text within this node and its decendents.
+   *
+   * ## Other resources
+   *
+   * * [Node.textContent]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Node.textContent) from
+   * MDN.
+   */
   @DomName('Node.textContent')
   @DocsEditable()
   String text;
@@ -19497,18 +19668,56 @@
   Node append(Node newChild) native;
 
   @JSName('cloneNode')
+  /**
+   * Returns a copy of this node.
+   *
+   * If [deep] is `true`, then all of this node's children and decendents are
+   * copied as well. If [deep] is `false`, then only this node is copied.
+   *
+   * ## Other resources
+   *
+   * * [Node.cloneNode]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Node.cloneNode) from
+   * MDN.
+   */
   @DomName('Node.cloneNode')
   @DocsEditable()
   Node clone(bool deep) native;
 
+  /**
+   * Returns true if this node contains the specified node.
+   *
+   * ## Other resources
+   *
+   * * [Node.contains]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Node.contains) from MDN.
+   */
   @DomName('Node.contains')
   @DocsEditable()
   bool contains(Node other) native;
 
+  /**
+   * Returns true if this node has any children.
+   *
+   * ## Other resources
+   *
+   * * [Node.hasChildNodes]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Node.hasChildNodes) from
+   * MDN.
+   */
   @DomName('Node.hasChildNodes')
   @DocsEditable()
   bool hasChildNodes() native;
 
+  /**
+   * Inserts all of the nodes into this node directly before refChild.
+   *
+   * ## Other resources
+   *
+   * * [Node.insertBefore]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Node.insertBefore) from
+   * MDN.
+   */
   @DomName('Node.insertBefore')
   @DocsEditable()
   Node insertBefore(Node newChild, Node refChild) native;
@@ -26315,12 +26524,14 @@
  * Top-level container for the current browser tab or window.
  *
  * In a web browser, each window has a [Window] object, but within the context
- * of a script, a [Window] object represents only the current window. In
- * addition to the open window, each window, tab, and iframe has its own
- * [Window] object. A [Window] contains a [Document] object, which contains this
- * web page's content.
+ * of a script, this object represents only the current window.
+ * Each other window, tab, and iframe has its own [Window] object.
  *
- * Use `window` to access properties of the current window. For example:
+ * Each window contains a [Document] object, which contains all of the window's
+ * content.
+ *
+ * Use the top-level `window` object to access the current window.
+ * For example:
  *
  *     // Draw a scene when the window repaints.
  *     drawScene(num delta) {...}
@@ -26330,8 +26541,12 @@
  *     window.console.log('Jinkies!');
  *     window.console.error('Jeepers!');
  *
- * **Note:** This class represents the current window, whereas [WindowBase] is
- * a representation of any window, including other tabs, windows, and frames.
+ * **Note:** This class represents only the current window, while [WindowBase]
+ * is a representation of any window, including other tabs, windows, and frames.
+ *
+ * ## See also
+ *
+ * * [WindowBase]
  *
  * ## Other resources
  *
@@ -29759,10 +29974,7 @@
 /**
  * An object that can be drawn to a 2D canvas rendering context.
  *
- * This object is either an [ImageElement], [VideoElement], or
- * [CanvasElement].
- *
- * The image drawn to the canvas differs by implementation:
+ * The image drawn to the canvas depends on the type of this object:
  *
  * * If this object is an [ImageElement], then this element's image is
  * drawn to the canvas. If this element is an animated image, then this
@@ -29804,13 +30016,17 @@
 /**
  * Top-level container for a browser tab or window.
  *
- * In a web browser, a [WindowBase] object represents any browser window.  This
- * abstract class contains the state of the window and its relation to other
- * windows, such as which window opened it.
+ * In a web browser, a [WindowBase] object represents any browser window. This
+ * object contains the window's state and its relation to other
+ * windows, such as which window opened this window.
  *
- * **Note:** This class represents any window, whereas [Window] is
+ * **Note:** This class represents any window, while [Window] is
  * used to access the properties and content of the current window or tab.
  *
+ * ## See also
+ *
+ * * [Window]
+ *
  * ## Other resources
  *
  * * [DOM Window](https://developer.mozilla.org/en-US/docs/DOM/window) from MDN.
diff --git a/sdk/lib/html/dartium/html_dartium.dart b/sdk/lib/html/dartium/html_dartium.dart
index 7cd038f..9c76577 100644
--- a/sdk/lib/html/dartium/html_dartium.dart
+++ b/sdk/lib/html/dartium/html_dartium.dart
@@ -14877,11 +14877,43 @@
   @DocsEditable()
   String get statusText native "XMLHttpRequest_statusText_Getter";
 
+  /**
+   * Length of time before a request is automatically terminated.
+   *
+   * When the time has passed, a [TimeoutEvent] is dispatched.
+   *
+   * If [timeout] is set to 0, then the request will not time out.
+   *
+   * ## Other resources
+   *
+   * * [XMLHttpRequest.timeout]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest#timeout)
+   * from MDN.
+   * * [The timeout attribute]
+   * (http://www.w3.org/TR/XMLHttpRequest/#the-timeout-attribute)
+   * from W3C.
+   */
   @DomName('XMLHttpRequest.timeout')
   @DocsEditable()
   @Experimental() // untriaged
   int get timeout native "XMLHttpRequest_timeout_Getter";
 
+  /**
+   * Length of time before a request is automatically terminated.
+   *
+   * When the time has passed, a [TimeoutEvent] is dispatched.
+   *
+   * If [timeout] is set to 0, then the request will not time out.
+   *
+   * ## Other resources
+   *
+   * * [XMLHttpRequest.timeout]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest#timeout)
+   * from MDN.
+   * * [The timeout attribute]
+   * (http://www.w3.org/TR/XMLHttpRequest/#the-timeout-attribute)
+   * from W3C.
+   */
   @DomName('XMLHttpRequest.timeout')
   @DocsEditable()
   @Experimental() // untriaged
@@ -14994,15 +15026,34 @@
    * `send` method is intended only for more complext HTTP requests where
    * finer-grained control is needed.
    *
-   * See also:
+   * ## Other resources
    *
-   *   * [send](https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#send%28%29)
+   * * [XMLHttpRequest.send]
+   * (https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#send%28%29)
    * from MDN.
    */
   @DomName('XMLHttpRequest.send')
   @DocsEditable()
   void send([data]) native "XMLHttpRequest_send_Callback";
 
+  /**
+   * Sets the value of an HTTP requst header.
+   *
+   * This method should be called after the request is opened, but before
+   * the request is sent.
+   *
+   * Multiple calls with the same header will combine all their values into a
+   * single header.
+   *
+   * ## Other resources
+   *
+   * * [XMLHttpRequest.setRequestHeader]
+   * (https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#send%28%29)
+   * from MDN.
+   * * [The setRequestHeader() method]
+   * (http://www.w3.org/TR/XMLHttpRequest/#the-setrequestheader()-method) from
+   * W3C.
+   */
   @DomName('XMLHttpRequest.setRequestHeader')
   @DocsEditable()
   void setRequestHeader(String header, String value) native "XMLHttpRequest_setRequestHeader_Callback";
@@ -20421,6 +20472,9 @@
   // Custom element created callback.
   Node._created() : super._created();
 
+  /**
+   * A modifiable list of this node's children.
+   */
   List<Node> get nodes {
     return new _ChildNodeListLazy(this);
   }
@@ -20546,14 +20600,41 @@
   @DocsEditable()
   String get _baseUri native "Node_baseURI_Getter";
 
+  /**
+   * A list of this node's children.
+   *
+   * ## Other resources
+   *
+   * * [Node.childNodes]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Node.childNodes)
+   * from MDN.
+   */
   @DomName('Node.childNodes')
   @DocsEditable()
   List<Node> get childNodes native "Node_childNodes_Getter";
 
+  /**
+   * The first child of this node.
+   *
+   * ## Other resources
+   *
+   * * [Node.firstChild]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Node.firstChild)
+   * from MDN.
+   */
   @DomName('Node.firstChild')
   @DocsEditable()
   Node get firstChild native "Node_firstChild_Getter";
 
+  /**
+   * The last child of this node.
+   *
+   * ## Other resources
+   *
+   * * [Node.lastChild]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Node.lastChild)
+   * from MDN.
+   */
   @DomName('Node.lastChild')
   @DocsEditable()
   Node get lastChild native "Node_lastChild_Getter";
@@ -20566,42 +20647,157 @@
   @DocsEditable()
   String get _namespaceUri native "Node_namespaceURI_Getter";
 
+  /**
+   * The next sibling node.
+   *
+   * ## Other resources
+   *
+   * * [Node.nextSibling]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Node.nextSibling)
+   * from MDN.
+   */
   @DomName('Node.nextSibling')
   @DocsEditable()
   Node get nextNode native "Node_nextSibling_Getter";
 
+  /**
+   * The name of this node.
+   *
+   * This varies by this node's [nodeType].
+   *
+   * ## Other resources
+   *
+   * * [Node.nodeName]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Node.nodeName)
+   * from MDN. This page contains a table of [nodeName] values for each
+   * [nodeType].
+   */
   @DomName('Node.nodeName')
   @DocsEditable()
   String get nodeName native "Node_nodeName_Getter";
 
+  /**
+   * The type of node.
+   *
+   * This value is one of:
+   *
+   * * [ATTRIBUTE_NODE] if this node is an attribute.
+   * * [CDATA_SECTION_NODE] if this node is a [CDataSection].
+   * * [COMMENT_NODE] if this node is a [Comment].
+   * * [DOCUMENT_FRAGMENT_NODE] if this node is a [DocumentFragment].
+   * * [DOCUMENT_NODE] if this node is a [Document].
+   * * [DOCUMENT_TYPE_NODE] if this node is a [DocumentType] node.
+   * * [ELEMENT_NODE] if this node is an [Element].
+   * * [ENTITY_NODE] if this node is an entity.
+   * * [ENTITY_REFERENCE_NODE] if this node is an entity reference.
+   * * [NOTATION_NODE] if this node is a notation.
+   * * [PROCESSING_INSTRUCTION_NODE] if this node is a [ProcessingInstruction].
+   * * [TEXT_NODE] if this node is a [Text] node.
+   *
+   * ## Other resources
+   *
+   * * [Node.nodeType]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Node.nodeType) from MDN.
+   */
   @DomName('Node.nodeType')
   @DocsEditable()
   int get nodeType native "Node_nodeType_Getter";
 
+  /**
+   * The value of this node.
+   *
+   * This varies by this type's [nodeType].
+   *
+   * ## Other resources
+   *
+   * * [Node.nodeValue]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Node.nodeValue)
+   * from MDN. This page contains a table of [nodeValue] values for each
+   * [nodeType].
+   */
   @DomName('Node.nodeValue')
   @DocsEditable()
   String get nodeValue native "Node_nodeValue_Getter";
 
+  /**
+   * The document this node belongs to.
+   *
+   * Returns `null` if this node does not belong to any document.
+   *
+   * ## Other resources
+   *
+   * * [Node.ownerDocument]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Node.ownerDocument) from
+   * MDN.
+   */
   @DomName('Node.ownerDocument')
   @DocsEditable()
   Document get ownerDocument native "Node_ownerDocument_Getter";
 
+  /**
+   * The parent element of this node.
+   *
+   * Returns `null` if this node either does not have a parent or its parent is
+   * not an element.
+   *
+   * ## Other resources
+   *
+   * * [Node.parentElement]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Node.parentElement) from
+   * W3C.
+   */
   @DomName('Node.parentElement')
   @DocsEditable()
   Element get parent native "Node_parentElement_Getter";
 
+  /**
+   * The parent node of this node.
+   *
+   * ## Other resources
+   *
+   * * [Node.parentNode]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Node.parentNode) from
+   * MDN.
+   */
   @DomName('Node.parentNode')
   @DocsEditable()
   Node get parentNode native "Node_parentNode_Getter";
 
+  /**
+   * The previous sibling node.
+   *
+   * ## Other resources
+   *
+   * * [Node.previousSibling]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Node.previousSibling)
+   * from MDN.
+   */
   @DomName('Node.previousSibling')
   @DocsEditable()
   Node get previousNode native "Node_previousSibling_Getter";
 
+  /**
+   * All text within this node and its decendents.
+   *
+   * ## Other resources
+   *
+   * * [Node.textContent]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Node.textContent) from
+   * MDN.
+   */
   @DomName('Node.textContent')
   @DocsEditable()
   String get text native "Node_textContent_Getter";
 
+  /**
+   * All text within this node and its decendents.
+   *
+   * ## Other resources
+   *
+   * * [Node.textContent]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Node.textContent) from
+   * MDN.
+   */
   @DomName('Node.textContent')
   @DocsEditable()
   void set text(String value) native "Node_textContent_Setter";
@@ -20619,18 +20815,56 @@
   @DocsEditable()
   Node append(Node newChild) native "Node_appendChild_Callback";
 
+  /**
+   * Returns a copy of this node.
+   *
+   * If [deep] is `true`, then all of this node's children and decendents are
+   * copied as well. If [deep] is `false`, then only this node is copied.
+   *
+   * ## Other resources
+   *
+   * * [Node.cloneNode]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Node.cloneNode) from
+   * MDN.
+   */
   @DomName('Node.cloneNode')
   @DocsEditable()
   Node clone(bool deep) native "Node_cloneNode_Callback";
 
+  /**
+   * Returns true if this node contains the specified node.
+   *
+   * ## Other resources
+   *
+   * * [Node.contains]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Node.contains) from MDN.
+   */
   @DomName('Node.contains')
   @DocsEditable()
   bool contains(Node other) native "Node_contains_Callback";
 
+  /**
+   * Returns true if this node has any children.
+   *
+   * ## Other resources
+   *
+   * * [Node.hasChildNodes]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Node.hasChildNodes) from
+   * MDN.
+   */
   @DomName('Node.hasChildNodes')
   @DocsEditable()
   bool hasChildNodes() native "Node_hasChildNodes_Callback";
 
+  /**
+   * Inserts all of the nodes into this node directly before refChild.
+   *
+   * ## Other resources
+   *
+   * * [Node.insertBefore]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Node.insertBefore) from
+   * MDN.
+   */
   @DomName('Node.insertBefore')
   @DocsEditable()
   Node insertBefore(Node newChild, Node refChild) native "Node_insertBefore_Callback";
@@ -28096,12 +28330,14 @@
  * Top-level container for the current browser tab or window.
  *
  * In a web browser, each window has a [Window] object, but within the context
- * of a script, a [Window] object represents only the current window. In
- * addition to the open window, each window, tab, and iframe has its own
- * [Window] object. A [Window] contains a [Document] object, which contains this
- * web page's content.
+ * of a script, this object represents only the current window.
+ * Each other window, tab, and iframe has its own [Window] object.
  *
- * Use `window` to access properties of the current window. For example:
+ * Each window contains a [Document] object, which contains all of the window's
+ * content.
+ *
+ * Use the top-level `window` object to access the current window.
+ * For example:
  *
  *     // Draw a scene when the window repaints.
  *     drawScene(num delta) {...}
@@ -28111,8 +28347,12 @@
  *     window.console.log('Jinkies!');
  *     window.console.error('Jeepers!');
  *
- * **Note:** This class represents the current window, whereas [WindowBase] is
- * a representation of any window, including other tabs, windows, and frames.
+ * **Note:** This class represents only the current window, while [WindowBase]
+ * is a representation of any window, including other tabs, windows, and frames.
+ *
+ * ## See also
+ *
+ * * [WindowBase]
  *
  * ## Other resources
  *
@@ -31656,10 +31896,7 @@
 /**
  * An object that can be drawn to a 2D canvas rendering context.
  *
- * This object is either an [ImageElement], [VideoElement], or
- * [CanvasElement].
- *
- * The image drawn to the canvas differs by implementation:
+ * The image drawn to the canvas depends on the type of this object:
  *
  * * If this object is an [ImageElement], then this element's image is
  * drawn to the canvas. If this element is an animated image, then this
@@ -31701,13 +31938,17 @@
 /**
  * Top-level container for a browser tab or window.
  *
- * In a web browser, a [WindowBase] object represents any browser window.  This
- * abstract class contains the state of the window and its relation to other
- * windows, such as which window opened it.
+ * In a web browser, a [WindowBase] object represents any browser window. This
+ * object contains the window's state and its relation to other
+ * windows, such as which window opened this window.
  *
- * **Note:** This class represents any window, whereas [Window] is
+ * **Note:** This class represents any window, while [Window] is
  * used to access the properties and content of the current window or tab.
  *
+ * ## See also
+ *
+ * * [Window]
+ *
  * ## Other resources
  *
  * * [DOM Window](https://developer.mozilla.org/en-US/docs/DOM/window) from MDN.
diff --git a/sdk/lib/io/data_transformer.dart b/sdk/lib/io/data_transformer.dart
index fb3fbe4..79df03c 100644
--- a/sdk/lib/io/data_transformer.dart
+++ b/sdk/lib/io/data_transformer.dart
@@ -8,7 +8,7 @@
 /**
  * An instance of the default implementation of the [ZLibCodec].
  */
-const ZLIB = const ZLibCodec();
+const ZLibCodec ZLIB = const ZLibCodec();
 
 
 /**
@@ -45,7 +45,7 @@
 /**
  * An instance of the default implementation of the [GZipCodec].
  */
-const GZIP = const GZipCodec();
+const GZipCodec GZIP = const GZipCodec();
 
 
 /**
diff --git a/sdk/lib/io/string_transformer.dart b/sdk/lib/io/string_transformer.dart
index dafd2bd..091f0d6 100644
--- a/sdk/lib/io/string_transformer.dart
+++ b/sdk/lib/io/string_transformer.dart
@@ -4,7 +4,7 @@
 
 part of dart.io;
 
-const SYSTEM_ENCODING = const SystemEncoding();
+const SystemEncoding SYSTEM_ENCODING = const SystemEncoding();
 
 /**
  * The system encoding is the current code page on Windows and UTF-8 on
diff --git a/tests/compiler/dart2js/mirror_system_helper.dart b/tests/compiler/dart2js/mirror_system_helper.dart
new file mode 100644
index 0000000..2776de6
--- /dev/null
+++ b/tests/compiler/dart2js/mirror_system_helper.dart
@@ -0,0 +1,139 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library mirror_system_helper;
+
+import 'dart:async';
+import '../../../sdk/lib/_internal/compiler/implementation/mirrors/mirrors.dart';
+import '../../../sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirror.dart';
+import 'mock_compiler.dart';
+
+export '../../../sdk/lib/_internal/compiler/implementation/mirrors/mirrors.dart';
+export '../../../sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart';
+
+const String SOURCE = 'source';
+final Uri SOURCE_URI = new Uri(scheme: SOURCE, path: SOURCE);
+
+// TODO(johnniwinther): Move this to a mirrors helper library.
+Future<MirrorSystem> createMirrorSystem(String source) {
+  MockCompiler compiler = new MockCompiler(
+      analyzeOnly: true,
+      analyzeAll: true,
+      preserveComments: true);
+    compiler.registerSource(SOURCE_URI, source);
+    compiler.librariesToAnalyzeWhenRun = <Uri>[SOURCE_URI];
+  return compiler.runCompiler(null).then((_) {
+    return new Dart2JsMirrorSystem(compiler);
+  });
+}
+
+/**
+ * Returns [:true:] if [type] is an instance of [:decl:] with type arguments
+ * equal to [typeArgument].
+ */
+bool isInstance(ClassMirror decl, List<TypeMirror> typeArguments,
+            ClassMirror type) {
+  if (type.isOriginalDeclaration) return false;
+  if (!isSameDeclaration(decl, type)) return false;
+  return areEqualsTypes(typeArguments, type.typeArguments);
+}
+
+/**
+ * Returns [:true:] if [type] is the same type as [expected]. This method
+ * equates a non-generic declaration with its instantiation.
+ */
+bool isEqualType(TypeMirror expected, TypeMirror type) {
+  if (expected == type) return true;
+  if (expected is ClassMirror && type is ClassMirror) {
+    if (!isSameDeclaration(expected, type)) return false;
+    if (expected.isOriginalDeclaration || expected.typeArguments.isEmpty) {
+      return type.isOriginalDeclaration || type.typeArguments.isEmpty;
+    }
+    return areEqualsTypes(expected.typeArguments, type.typeArguments);
+  }
+  return true;
+}
+
+/**
+ * Returns [:true:] if [types] are equals to [expected] using the equalitry
+ * defined by [isEqualType].
+ */
+bool areEqualsTypes(List<TypeMirror> expected, List<TypeMirror> types) {
+  return checkSameList(expected, types, isEqualType);
+}
+
+/**
+ * Returns [:true:] if an instance of [type] with type arguments equal to
+ * [typeArguments] is found in [types].
+ */
+bool containsType(ClassMirror decl, List<TypeMirror> typeArguments,
+                  Iterable<TypeMirror> types) {
+  return types.any((type) => isInstance(decl, typeArguments, type));
+}
+
+/**
+ * Returns the declaration of [type].
+ */
+TypeMirror toDeclaration(TypeMirror type) {
+  return type is ClassMirror ? type.originalDeclaration : type;
+}
+
+/**
+ * Returns [:true:] if [type] is of the same declaration as [expected].
+ */
+bool isSameDeclaration(TypeMirror expected, TypeMirror type) {
+  return toDeclaration(expected) == toDeclaration(type);
+}
+
+/**
+ * Returns [:true:] if a type of the declaration of [expected] is in [types].
+ */
+bool containsDeclaration(TypeMirror expected, Iterable<TypeMirror> types) {
+  for (var type in types) {
+    if (isSameDeclaration(expected, type)) {
+      return true;
+    }
+  }
+  return false;
+}
+
+/**
+ * Returns [:true:] if declarations of [expected] are the same as those of
+ * [types], taking order into account.
+ */
+bool isSameDeclarationList(Iterable<TypeMirror> expected,
+                           Iterable<TypeMirror> types) {
+  return checkSameList(expected, types, isSameDeclaration);
+}
+
+/**
+ * Returns [:true:] if declarations of [expected] are the same as those of
+ * [iterable], not taking order into account.
+ */
+bool isSameDeclarationSet(Iterable<TypeMirror> expected,
+                          Iterable<TypeMirror> types) {
+   Set<TypeMirror> expectedSet = expected.map(toDeclaration).toSet();
+   Set<TypeMirror> typesSet = types.map(toDeclaration).toSet();
+   return expectedSet.length == typesSet.length &&
+          expectedSet.containsAll(typesSet);
+}
+
+/**
+ * Utility method for checking whether [expected] and [iterable] contains the
+ * same elements with respect to the checking function [check], takin order
+ * into account.
+ */
+bool checkSameList(Iterable<TypeMirror> expected,
+                   Iterable<TypeMirror> types,
+                   bool check(TypeMirror a, TypeMirror b)) {
+  if (expected.length != types.length) return false;
+  Iterator<TypeMirror> expectedIterator = expected.iterator;
+  Iterator<TypeMirror> typesIterator = types.iterator;
+  while (expectedIterator.moveNext() && typesIterator.moveNext()) {
+    if (!check(expectedIterator.current, typesIterator.current)) {
+      return false;
+    }
+  }
+  return true;
+}
diff --git a/tests/compiler/dart2js/mirrors_metadata_test.dart b/tests/compiler/dart2js/mirrors_metadata_test.dart
index 1e3307c..66c2e41 100644
--- a/tests/compiler/dart2js/mirrors_metadata_test.dart
+++ b/tests/compiler/dart2js/mirrors_metadata_test.dart
@@ -3,29 +3,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:expect/expect.dart';
-import 'dart:async';
 import "package:async_helper/async_helper.dart";
-import 'dart:io';
-import '../../../sdk/lib/_internal/compiler/implementation/filenames.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/mirrors/mirrors.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirror.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/source_file_provider.dart';
-import 'mock_compiler.dart';
-
-const String SOURCE = 'source';
-Uri SOURCE_URI = new Uri(scheme: SOURCE, path: SOURCE);
-
-Future<MirrorSystem> createMirrorSystem(String source) {
-  MockCompiler compiler = new MockCompiler(
-      analyzeOnly: true,
-      analyzeAll: true,
-      preserveComments: true);
-    compiler.registerSource(SOURCE_URI, source);
-    compiler.librariesToAnalyzeWhenRun = <Uri>[SOURCE_URI];
-  return compiler.runCompiler(null).then((_) {
-    return new Dart2JsMirrorSystem(compiler);
-  });
-}
+import 'dart:async';
+import 'mirror_system_helper.dart';
 
 void validateDeclarationComment(String code,
                                 String text,
diff --git a/tests/compiler/dart2js/mirrors_mixin_test.dart b/tests/compiler/dart2js/mirrors_mixin_test.dart
new file mode 100644
index 0000000..1486851
--- /dev/null
+++ b/tests/compiler/dart2js/mirrors_mixin_test.dart
@@ -0,0 +1,240 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library mirrors_mixin_test;
+
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
+import 'mirror_system_helper.dart';
+
+const String CLASS_SOURCE = '''
+class A {}
+
+class S {}
+class M1<T> {}
+class M2 {}
+
+class C extends S with M1<A> {}
+class D extends S with M1, M2 {}
+class E extends S with M2, M1 implements A, M1 {}
+class E2 extends E {}
+
+class F = S with M1<A>;
+abstract class G = S with M1, M2;
+class H = S with M2, M1 implements A, M1;
+class H2 extends H {}
+''';
+
+void main() {
+  asyncTest(() => createMirrorSystem(CLASS_SOURCE).then((MirrorSystem mirrors) {
+    LibraryMirror library = mirrors.libraries[SOURCE_URI];
+
+    checkSimpleClass(var cls) {
+      Expect.isNotNull(cls);
+      Expect.isTrue(cls is ClassMirror);
+      Expect.isFalse(isMixinApplication(cls));
+      Expect.isFalse(cls.isNameSynthetic);
+      Expect.isFalse(cls.isObject);
+      Expect.isTrue(cls.superclass.isObject);
+      Expect.equals(0, cls.superinterfaces.length);
+
+      Expect.isTrue(getSuperclass(cls).isObject);
+      Expect.isTrue(getAppliedMixins(cls).isEmpty);
+      Expect.isTrue(getExplicitInterfaces(cls).isEmpty);
+    }
+
+    // class A {}
+    var A = library.classes['A'];
+    checkSimpleClass(A);
+
+    // class S {}
+    var S = library.classes['S'];
+    checkSimpleClass(S);
+
+    // class M1 {}
+    var M1 = library.classes['M1'];
+    checkSimpleClass(M1);
+
+    // class M2 {}
+    var M2 = library.classes['M2'];
+    checkSimpleClass(M2);
+
+    // class C extends S with M1<A> {}
+    var C = library.classes['C'];
+    Expect.isNotNull(C);
+    Expect.isTrue(C is ClassMirror);
+    Expect.isFalse(isMixinApplication(C));
+    Expect.isFalse(C.isObject);
+    Expect.equals(0, C.superinterfaces.length);
+    var C_super = C.superclass;
+    Expect.isNotNull(C_super);
+    Expect.isTrue(C_super is ClassMirror);
+    Expect.isTrue(isMixinApplication(C_super));
+    Expect.isTrue(C_super.isNameSynthetic);
+    Expect.equals(1, C_super.superinterfaces.length);
+    Expect.isTrue(containsType(M1, [A], C_super.superinterfaces));
+    Expect.isTrue(isInstance(M1, [A], C_super.mixin));
+    Expect.isFalse(C_super.isObject);
+    Expect.isTrue(isSameDeclaration(S, C_super.superclass));
+
+    Expect.isTrue(isSameDeclaration(S, getSuperclass(C)));
+    Expect.isTrue(isSameDeclarationList([M1], getAppliedMixins(C)));
+    Expect.isTrue(getExplicitInterfaces(C).isEmpty);
+
+    // D extends S with M1, M2 {}
+    var D = library.classes['D'];
+    Expect.isNotNull(D);
+    Expect.isTrue(D is ClassMirror);
+    Expect.isFalse(isMixinApplication(D));
+    Expect.isFalse(D.isObject);
+    Expect.equals(0, D.superinterfaces.length);
+    var D_super = D.superclass;
+    Expect.isNotNull(D_super);
+    Expect.isTrue(D_super is ClassMirror);
+    Expect.isTrue(isMixinApplication(D_super));
+    Expect.isTrue(D_super.isNameSynthetic);
+    Expect.equals(1, D_super.superinterfaces.length);
+    Expect.isTrue(containsDeclaration(M2, D_super.superinterfaces));
+    Expect.isTrue(isSameDeclaration(M2, D_super.mixin));
+    Expect.isFalse(D_super.isObject);
+    Expect.isFalse(isSameDeclaration(S, D_super.superclass));
+    var D_super_super = D_super.superclass;
+    Expect.isNotNull(D_super_super);
+    Expect.isTrue(D_super_super is ClassMirror);
+    Expect.isTrue(isMixinApplication(D_super_super));
+    Expect.isTrue(D_super_super.isNameSynthetic);
+    Expect.equals(1, D_super_super.superinterfaces.length);
+    Expect.isTrue(containsDeclaration(M1, D_super_super.superinterfaces));
+    Expect.isTrue(isSameDeclaration(M1, D_super_super.mixin));
+    Expect.isFalse(D_super_super.isObject);
+    Expect.isTrue(isSameDeclaration(S, D_super_super.superclass));
+
+    Expect.isTrue(isSameDeclaration(S, getSuperclass(D)));
+    Expect.isTrue(isSameDeclarationList([M1, M2], getAppliedMixins(D)));
+    Expect.isTrue(getExplicitInterfaces(D).isEmpty);
+
+    // class E extends S with M2, M1 implements A, M1 {}
+    var E = library.classes['E'];
+    Expect.isNotNull(E);
+    Expect.isTrue(E is ClassMirror);
+    Expect.isFalse(isMixinApplication(E));
+    Expect.isFalse(E.isObject);
+    Expect.equals(2, E.superinterfaces.length);
+    Expect.isTrue(containsDeclaration(A, E.superinterfaces));
+    Expect.isTrue(containsDeclaration(M1, E.superinterfaces));
+    var E_super = E.superclass;
+    Expect.isNotNull(E_super);
+    Expect.isTrue(E_super is ClassMirror);
+    Expect.isTrue(isMixinApplication(E_super));
+    Expect.isTrue(E_super.isNameSynthetic);
+    Expect.equals(1, E_super.superinterfaces.length);
+    Expect.isTrue(containsDeclaration(M1, E_super.superinterfaces));
+    Expect.isTrue(isSameDeclaration(M1, E_super.mixin));
+    Expect.isFalse(E_super.isObject);
+    Expect.isFalse(isSameDeclaration(S, E_super.superclass));
+    var E_super_super = E_super.superclass;
+    Expect.isNotNull(E_super_super);
+    Expect.isTrue(E_super_super is ClassMirror);
+    Expect.isTrue(isMixinApplication(E_super_super));
+    Expect.isTrue(E_super_super.isNameSynthetic);
+    Expect.equals(1, E_super_super.superinterfaces.length);
+    Expect.isTrue(containsDeclaration(M2, E_super_super.superinterfaces));
+    Expect.isTrue(isSameDeclaration(M2, E_super_super.mixin));
+    Expect.isFalse(E_super_super.isObject);
+    Expect.isTrue(isSameDeclaration(S, E_super_super.superclass));
+
+    Expect.isTrue(isSameDeclaration(S, getSuperclass(E)));
+    Expect.isTrue(isSameDeclarationList([M2, M1], getAppliedMixins(E)));
+    Expect.isTrue(isSameDeclarationSet([A, M1], getExplicitInterfaces(E)));
+
+    // class E2 extends E {}
+    var E2 = library.classes['E2'];
+    Expect.isTrue(isSameDeclaration(E, getSuperclass(E2)));
+    Expect.isTrue(getAppliedMixins(E2).isEmpty);
+    Expect.isTrue(getExplicitInterfaces(E2).isEmpty);
+
+    // class F = S with M1<A>;
+    var F = library.classes['F'];
+    Expect.isNotNull(F);
+    Expect.isTrue(F is ClassMirror);
+    Expect.isFalse(F.isAbstract);
+    Expect.isTrue(isMixinApplication(F));
+    Expect.isFalse(F.isNameSynthetic);
+    Expect.equals('F', F.simpleName);
+    Expect.isFalse(F.isObject);
+    Expect.equals(1, F.superinterfaces.length);
+    Expect.isTrue(containsDeclaration(M1, F.superinterfaces));
+    Expect.isTrue(isInstance(M1, [A], F.mixin));
+    var F_super = F.superclass;
+    Expect.isNotNull(F_super);
+    Expect.isTrue(F_super is ClassMirror);
+    Expect.isFalse(isMixinApplication(F_super));
+    Expect.isFalse(F_super.isObject);
+    Expect.isTrue(isSameDeclaration(S, F_super));
+
+    Expect.isTrue(isSameDeclaration(S, getSuperclass(F)));
+    Expect.isTrue(isSameDeclarationList([M1], getAppliedMixins(F)));
+    Expect.isTrue(getExplicitInterfaces(F).isEmpty);
+
+    // typedef G = abstract S with M1, M2;
+    var G = library.classes['G'];
+    Expect.isNotNull(G);
+    Expect.isTrue(G is ClassMirror);
+    Expect.isTrue(G.isAbstract);
+    Expect.isTrue(isMixinApplication(G));
+    Expect.isFalse(G.isNameSynthetic);
+    Expect.equals('G', G.simpleName);
+    Expect.isFalse(G.isObject);
+    Expect.equals(1, G.superinterfaces.length);
+    Expect.isTrue(containsDeclaration(M2, G.superinterfaces));
+    Expect.isTrue(isSameDeclaration(M2, G.mixin));
+    var G_super = G.superclass;
+    Expect.isNotNull(G_super);
+    Expect.isTrue(G_super is ClassMirror);
+    Expect.isTrue(isMixinApplication(G_super));
+    Expect.equals(1, G_super.superinterfaces.length);
+    Expect.isTrue(containsDeclaration(M1, G_super.superinterfaces));
+    Expect.isTrue(isSameDeclaration(M1, G_super.mixin));
+    Expect.isFalse(G_super.isObject);
+    Expect.isTrue(isSameDeclaration(S, G_super.superclass));
+
+    Expect.isTrue(isSameDeclaration(S, getSuperclass(G)));
+    Expect.isTrue(isSameDeclarationList([M1, M2], getAppliedMixins(G)));
+    Expect.isTrue(getExplicitInterfaces(G).isEmpty);
+
+    // typedef H = S with M2, M1 implements A, M1;
+    var H = library.classes['H'];
+    Expect.isNotNull(H);
+    Expect.isTrue(H is ClassMirror);
+    Expect.isFalse(H.isAbstract);
+    Expect.isTrue(isMixinApplication(H));
+    Expect.isFalse(H.isNameSynthetic);
+    Expect.equals('H', H.simpleName);
+    Expect.isFalse(H.isObject);
+    Expect.equals(3, H.superinterfaces.length);
+    Expect.isTrue(containsDeclaration(A, H.superinterfaces));
+    Expect.isTrue(containsDeclaration(M1, H.superinterfaces));
+    Expect.isFalse(containsDeclaration(M2, H.superinterfaces));
+    Expect.isTrue(isSameDeclaration(M1, H.mixin));
+    var H_super = H.superclass;
+    Expect.isNotNull(H_super);
+    Expect.isTrue(H_super is ClassMirror);
+    Expect.isTrue(isMixinApplication(H_super));
+    Expect.equals(1, H_super.superinterfaces.length);
+    Expect.isTrue(containsDeclaration(M2, H_super.superinterfaces));
+    Expect.isTrue(isSameDeclaration(M2, H_super.mixin));
+    Expect.isFalse(H_super.isObject);
+    Expect.isTrue(isSameDeclaration(S, H_super.superclass));
+
+    Expect.isTrue(isSameDeclaration(S, getSuperclass(H)));
+    Expect.isTrue(isSameDeclarationList([M2, M1], getAppliedMixins(H)));
+    Expect.isTrue(isSameDeclarationSet([A, M1], getExplicitInterfaces(H)));
+
+    // class H2 extends H {}
+    var H2 = library.classes['H2'];
+    Expect.isTrue(isSameDeclaration(H, getSuperclass(H2)));
+    Expect.isTrue(getAppliedMixins(H2).isEmpty);
+    Expect.isTrue(getExplicitInterfaces(H2).isEmpty);
+  }));
+}
\ No newline at end of file
diff --git a/tests/language/language_analyzer.status b/tests/language/language_analyzer.status
index 50eb8a4..2ce056c 100644
--- a/tests/language/language_analyzer.status
+++ b/tests/language/language_analyzer.status
@@ -21,15 +21,13 @@
 method_override7_test/03: Fail # Issue 11496
 method_override8_test/03: Fail # Issue 11496
 
-export_double_same_main_test: Fail # Issue 14772
-
 # Please add new failing tests before this line.
 # Section below is for invalid tests.
 #
 #
 
-ref_before_declaration_test/07: fail # please triage
-ref_before_declaration_test/none: fail # please triage
+ref_before_declaration_test/none: fail # test issue 14879, "P" is not defined
+bad_initializer2_negative_test: fail # tester issue 14880, Analyzer reports compile-time error, but test runner is not satisfied
 
 # test issue 11124, It is warning, not error to don't initialize final field
 field3a_negative_test: Fail # Issue 11124
@@ -71,9 +69,6 @@
 constructor_call_wrong_argument_count_negative_test: fail
 instance_call_wrong_argument_count_negative_test: fail
 
-# test issue 11589, export D from 2 export directives
-export_cyclic_test: fail
-
 # test issue 11590, runtime only negative test
 field_method4_negative_test: fail
 
@@ -130,9 +125,6 @@
 static_field_test/03: fail # Issue 12541
 static_field_test/04: fail # Issue 12541
 
-# test issue 13787; duplicate exports of the same declaration is not handled
-duplicate_export_test: fail # Issue 13787
-
 # test issue 13916, Looks as no warning should be in this redirecting factory
 redirecting_factory_infinite_steps_test/01: fail
 
diff --git a/tests/lib/mirrors/generic_class_declaration_test.dart b/tests/lib/mirrors/generic_class_declaration_test.dart
new file mode 100644
index 0000000..0b8260f
--- /dev/null
+++ b/tests/lib/mirrors/generic_class_declaration_test.dart
@@ -0,0 +1,83 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:mirrors';
+import 'package:expect/expect.dart';
+
+import 'stringify.dart';
+
+class A<T> {
+  var instanceVariable;
+  get instanceGetter => null;
+  set instanceSetter(x) => x;
+  instanceMethod() => null;
+
+  var _instanceVariable;
+  get _instanceGetter => null;
+  set _instanceSetter(x) => x;
+  _instanceMethod() => null;
+
+  static var staticVariable;
+  static get staticGetter => null;
+  static set staticSetter(x) => x;
+  static staticMethod() => null;
+
+  static var _staticVariable;
+  static get _staticGetter => null;
+  static set _staticSetter(x) => x;
+  static _staticMethod() => null;
+}
+
+main() {
+  ClassMirror cm = reflect(new A<String>()).type;
+  Expect.setEquals(
+      ['Variable(s(_instanceVariable) in s(A), private)',
+       'Variable(s(_staticVariable) in s(A), private, static)',
+       'Variable(s(instanceVariable) in s(A))',
+       'Variable(s(staticVariable) in s(A), static)'],
+       cm.declarations.values
+         .where((dm) => dm is VariableMirror).map(stringify),
+  'variables');
+
+  Expect.setEquals(
+      ['Method(s(_instanceGetter) in s(A), private, getter)',
+       'Method(s(_staticGetter) in s(A), private, static, getter)',
+       'Method(s(instanceGetter) in s(A), getter)',
+       'Method(s(staticGetter) in s(A), static, getter)'],
+       cm.declarations.values
+         .where((dm) => dm is MethodMirror && dm.isGetter).map(stringify),
+  'getters');
+
+  Expect.setEquals(
+      ['Method(s(_instanceSetter=) in s(A), private, setter)',
+       'Method(s(_staticSetter=) in s(A), private, static, setter)',
+       'Method(s(instanceSetter=) in s(A), setter)',
+       'Method(s(staticSetter=) in s(A), static, setter)'],
+       cm.declarations.values
+         .where((dm) => dm is MethodMirror && dm.isSetter).map(stringify),
+  'setters');
+
+  Expect.setEquals(
+      ['Method(s(_instanceMethod) in s(A), private)',
+       'Method(s(_staticMethod) in s(A), private, static)',
+       'Method(s(instanceMethod) in s(A))',
+       'Method(s(staticMethod) in s(A), static)'],
+       cm.declarations.values
+         .where((dm) => dm is MethodMirror && dm.isRegularMethod)
+           .map(stringify), 'methods');
+
+  Expect.setEquals(
+      ['Method(s(A) in s(A), constructor)'],
+       cm.declarations.values
+         .where((dm) => dm is MethodMirror && dm.isConstructor).map(stringify),
+  'constructors');
+
+  Expect.setEquals(
+      ['TypeVariable(s(T) in s(A), upperBound = Class(s(Object) in '
+       's(dart.core), top-level))'],
+       cm.declarations.values
+         .where((dm) => dm is TypeVariableMirror).map(stringify),
+  'type variables');
+
+}
\ No newline at end of file
diff --git a/tools/VERSION b/tools/VERSION
index a12320b..0f1a9ac 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -1,4 +1,4 @@
 MAJOR 0
 MINOR 8
 BUILD 10
-PATCH 7
+PATCH 8
diff --git a/tools/dom/docs/docs.json b/tools/dom/docs/docs.json
index 43706bc..ba4e5fc 100644
--- a/tools/dom/docs/docs.json
+++ b/tools/dom/docs/docs.json
@@ -2311,6 +2311,209 @@
           "   * This method is more efficient than `nodes.add`, and is the preferred",
           "   * way of appending a child node.",
           "   */"
+        ],
+        "childNodes": [
+          "/**",
+          "   * A list of this node's children.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Node.childNodes]",
+          "   * (https://developer.mozilla.org/en-US/docs/Web/API/Node.childNodes)",
+          "   * from MDN.",
+          "   */"
+        ],
+        "cloneNode": [
+          "/**",
+          "   * Returns a copy of this node.",
+          "   *",
+          "   * If [deep] is `true`, then all of this node's children and decendents are",
+          "   * copied as well. If [deep] is `false`, then only this node is copied.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Node.cloneNode]",
+          "   * (https://developer.mozilla.org/en-US/docs/Web/API/Node.cloneNode) from",
+          "   * MDN.",
+          "   */"
+        ],
+        "contains": [
+          "/**",
+          "   * Returns true if this node contains the specified node.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Node.contains]",
+          "   * (https://developer.mozilla.org/en-US/docs/Web/API/Node.contains) from MDN.",
+          "   */"
+        ],
+        "firstChild": [
+          "/**",
+          "   * The first child of this node.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Node.firstChild]",
+          "   * (https://developer.mozilla.org/en-US/docs/Web/API/Node.firstChild)",
+          "   * from MDN.",
+          "   */"
+        ],
+        "hasChildNodes": [
+          "/**",
+          "   * Returns true if this node has any children.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Node.hasChildNodes]",
+          "   * (https://developer.mozilla.org/en-US/docs/Web/API/Node.hasChildNodes) from",
+          "   * MDN.",
+          "   */"
+        ],
+        "insertBefore": [
+          "/**",
+          "   * Inserts all of the nodes into this node directly before refChild.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Node.insertBefore]",
+          "   * (https://developer.mozilla.org/en-US/docs/Web/API/Node.insertBefore) from",
+          "   * MDN.",
+          "   */"
+        ],
+        "lastChild": [
+          "/**",
+          "   * The last child of this node.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Node.lastChild]",
+          "   * (https://developer.mozilla.org/en-US/docs/Web/API/Node.lastChild)",
+          "   * from MDN.",
+          "   */"
+        ],
+        "nextSibling": [
+          "/**",
+          "   * The next sibling node.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Node.nextSibling]",
+          "   * (https://developer.mozilla.org/en-US/docs/Web/API/Node.nextSibling)",
+          "   * from MDN.",
+          "   */"
+        ],
+        "nodeName": [
+          "/**",
+          "   * The name of this node.",
+          "   *",
+          "   * This varies by this node's [nodeType].",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Node.nodeName]",
+          "   * (https://developer.mozilla.org/en-US/docs/Web/API/Node.nodeName)",
+          "   * from MDN. This page contains a table of [nodeName] values for each",
+          "   * [nodeType].",
+          "   */"
+        ],
+        "nodeType": [
+          "/**",
+          "   * The type of node.",
+          "   *",
+          "   * This value is one of:",
+          "   *",
+          "   * * [ATTRIBUTE_NODE] if this node is an attribute.",
+          "   * * [CDATA_SECTION_NODE] if this node is a [CDataSection].",
+          "   * * [COMMENT_NODE] if this node is a [Comment].",
+          "   * * [DOCUMENT_FRAGMENT_NODE] if this node is a [DocumentFragment].",
+          "   * * [DOCUMENT_NODE] if this node is a [Document].",
+          "   * * [DOCUMENT_TYPE_NODE] if this node is a [DocumentType] node.",
+          "   * * [ELEMENT_NODE] if this node is an [Element].",
+          "   * * [ENTITY_NODE] if this node is an entity.",
+          "   * * [ENTITY_REFERENCE_NODE] if this node is an entity reference.",
+          "   * * [NOTATION_NODE] if this node is a notation.",
+          "   * * [PROCESSING_INSTRUCTION_NODE] if this node is a [ProcessingInstruction].",
+          "   * * [TEXT_NODE] if this node is a [Text] node.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Node.nodeType]",
+          "   * (https://developer.mozilla.org/en-US/docs/Web/API/Node.nodeType) from MDN.",
+          "   */"
+        ],
+        "nodeValue": [
+          "/**",
+          "   * The value of this node.",
+          "   *",
+          "   * This varies by this type's [nodeType].",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Node.nodeValue]",
+          "   * (https://developer.mozilla.org/en-US/docs/Web/API/Node.nodeValue)",
+          "   * from MDN. This page contains a table of [nodeValue] values for each",
+          "   * [nodeType].",
+          "   */"
+        ],
+        "ownerDocument": [
+          "/**",
+          "   * The document this node belongs to.",
+          "   *",
+          "   * Returns `null` if this node does not belong to any document.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Node.ownerDocument]",
+          "   * (https://developer.mozilla.org/en-US/docs/Web/API/Node.ownerDocument) from",
+          "   * MDN.",
+          "   */"
+        ],
+        "parentElement": [
+          "/**",
+          "   * The parent element of this node.",
+          "   *",
+          "   * Returns `null` if this node either does not have a parent or its parent is",
+          "   * not an element.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Node.parentElement]",
+          "   * (https://developer.mozilla.org/en-US/docs/Web/API/Node.parentElement) from",
+          "   * W3C.",
+          "   */"
+        ],
+        "parentNode": [
+          "/**",
+          "   * The parent node of this node.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Node.parentNode]",
+          "   * (https://developer.mozilla.org/en-US/docs/Web/API/Node.parentNode) from",
+          "   * MDN.",
+          "   */"
+        ],
+        "previousSibling": [
+          "/**",
+          "   * The previous sibling node.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Node.previousSibling]",
+          "   * (https://developer.mozilla.org/en-US/docs/Web/API/Node.previousSibling)",
+          "   * from MDN.",
+          "   */"
+        ],
+        "textContent": [
+          "/**",
+          "   * All text within this node and its decendents.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Node.textContent]",
+          "   * (https://developer.mozilla.org/en-US/docs/Web/API/Node.textContent) from",
+          "   * MDN.",
+          "   */"
         ]
       }
     },
@@ -2908,12 +3111,14 @@
         " * Top-level container for the current browser tab or window.",
         " *",
         " * In a web browser, each window has a [Window] object, but within the context",
-        " * of a script, a [Window] object represents only the current window. In",
-        " * addition to the open window, each window, tab, and iframe has its own",
-        " * [Window] object. A [Window] contains a [Document] object, which contains this",
-        " * web page's content.",
+        " * of a script, this object represents only the current window.",
+        " * Each other window, tab, and iframe has its own [Window] object.",
         " *",
-        " * Use `window` to access properties of the current window. For example:",
+        " * Each window contains a [Document] object, which contains all of the window's",
+        " * content.",
+        " *",
+        " * Use the top-level `window` object to access the current window.",
+        " * For example:",
         " *",
         " *     // Draw a scene when the window repaints.",
         " *     drawScene(num delta) {...}",
@@ -2923,8 +3128,12 @@
         " *     window.console.log('Jinkies!');",
         " *     window.console.error('Jeepers!');",
         " *",
-        " * **Note:** This class represents the current window, whereas [WindowBase] is",
-        " * a representation of any window, including other tabs, windows, and frames.",
+        " * **Note:** This class represents only the current window, while [WindowBase]",
+        " * is a representation of any window, including other tabs, windows, and frames.",
+        " *",
+        " * ## See also",
+        " *",
+        " * * [WindowBase]",
         " *",
         " * ## Other resources",
         " *",
@@ -3419,12 +3628,33 @@
           "   * `send` method is intended only for more complext HTTP requests where",
           "   * finer-grained control is needed.",
           "   *",
-          "   * See also:",
+          "   * ## Other resources",
           "   *",
-          "   *   * [send](https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#send%28%29)",
+          "   * * [XMLHttpRequest.send]",
+          "   * (https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#send%28%29)",
           "   * from MDN.",
           "   */"
         ],
+        "setRequestHeader": [
+          "/**",
+          "   * Sets the value of an HTTP requst header.",
+          "   *",
+          "   * This method should be called after the request is opened, but before",
+          "   * the request is sent.",
+          "   *",
+          "   * Multiple calls with the same header will combine all their values into a",
+          "   * single header.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [XMLHttpRequest.setRequestHeader]",
+          "   * (https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#send%28%29)",
+          "   * from MDN.",
+          "   * * [The setRequestHeader() method]",
+          "   * (http://www.w3.org/TR/XMLHttpRequest/#the-setrequestheader()-method) from",
+          "   * W3C.",
+          "   */"
+        ],
         "status": [
           "/**",
           "   * The http result code from the request (200, 404, etc).",
@@ -3437,6 +3667,24 @@
           "   * See also: [Http Status Codes](http://en.wikipedia.org/wiki/List_of_HTTP_status_codes)",
           "   */"
         ],
+        "timeout": [
+          "/**",
+          "   * Length of time before a request is automatically terminated.",
+          "   *",
+          "   * When the time has passed, a [TimeoutEvent] is dispatched.",
+          "   *",
+          "   * If [timeout] is set to 0, then the request will not time out.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [XMLHttpRequest.timeout]",
+          "   * (https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest#timeout)",
+          "   * from MDN.",
+          "   * * [The timeout attribute]",
+          "   * (http://www.w3.org/TR/XMLHttpRequest/#the-timeout-attribute)",
+          "   * from W3C.",
+          "   */"
+        ],
         "upload": [
           "/**",
           "   * [EventTarget] that can hold listeners to track the progress of the request.",
diff --git a/tools/dom/src/CanvasImageSource.dart b/tools/dom/src/CanvasImageSource.dart
index b6a770c..e030533 100644
--- a/tools/dom/src/CanvasImageSource.dart
+++ b/tools/dom/src/CanvasImageSource.dart
@@ -7,10 +7,7 @@
 /**
  * An object that can be drawn to a 2D canvas rendering context.
  *
- * This object is either an [ImageElement], [VideoElement], or
- * [CanvasElement].
- *
- * The image drawn to the canvas differs by implementation:
+ * The image drawn to the canvas depends on the type of this object:
  *
  * * If this object is an [ImageElement], then this element's image is
  * drawn to the canvas. If this element is an animated image, then this
diff --git a/tools/dom/src/CrossFrameTypes.dart b/tools/dom/src/CrossFrameTypes.dart
index f8ed874..679092d 100644
--- a/tools/dom/src/CrossFrameTypes.dart
+++ b/tools/dom/src/CrossFrameTypes.dart
@@ -7,13 +7,17 @@
 /**
  * Top-level container for a browser tab or window.
  *
- * In a web browser, a [WindowBase] object represents any browser window.  This
- * abstract class contains the state of the window and its relation to other
- * windows, such as which window opened it.
+ * In a web browser, a [WindowBase] object represents any browser window. This
+ * object contains the window's state and its relation to other
+ * windows, such as which window opened this window.
  *
- * **Note:** This class represents any window, whereas [Window] is
+ * **Note:** This class represents any window, while [Window] is
  * used to access the properties and content of the current window or tab.
  *
+ * ## See also
+ *
+ * * [Window]
+ *
  * ## Other resources
  *
  * * [DOM Window](https://developer.mozilla.org/en-US/docs/DOM/window) from MDN.
diff --git a/tools/dom/templates/html/impl/impl_Node.darttemplate b/tools/dom/templates/html/impl/impl_Node.darttemplate
index 2f7b2d7..bb01401 100644
--- a/tools/dom/templates/html/impl/impl_Node.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Node.darttemplate
@@ -190,6 +190,9 @@
   // Custom element created callback.
   Node._created() : super._created();
 
+  /**
+   * A modifiable list of this node's children.
+   */
   List<Node> get nodes {
     return new _ChildNodeListLazy(this);
   }
