diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8701a43..e9239fa 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,810 +1,303 @@
-## 2.0.0-dev.69.5
-* Cherry-pick cb70de8afaf72ffccc2cb296960d3ed755979167 to dev
-* Cherry-pick 4482d13ff75dadc68df64758a35976c5cbeadbc6 to dev
-* Cherry-pick 5a45b2a62b3d647b7b4feca78da5948b5d108573 to dev
-* Cherry-pick 24158b773d29d36305ce6e8dbc1a1ce24a54e58e to dev
-* Cherry-pick 68bfaf3ac349e78cf5a7ea78d48e0b51bae2e605 to dev
-* Cherry-pick 23ba527735b386371395cd06c4cf39381072fc89 to dev
-* Cherry-pick 72960de5f9a8bc36c7a6265d56c6643d93c512b5 to dev
+## 2.0.0
 
-## 2.0.0-dev.69.4
+This is the first major version release of Dart since 1.0.0, so it contains many
+significant changes across all areas of the platform. Large changes include:
 
-* Revert cherry-pick 9727a4a to dev
-* Cherry-pick 6bddb6c to dev
-* Cherry-pick 57e11e3 to dev
-* Cherry-pick 0998153 to dev
+*   **(Breaking)** The unsound optional static type system has been replaced
+    with a sound static type system using type inference and runtime checks.
+    This was formerly called "[strong mode][]" and only used by the Dart for web
+    products. Now it is the one official static type system for the entire
+    platform and replaces the previous "checked" and "production" modes.
 
-## 2.0.0-dev.69.3
+*   **(Breaking)** Functions marked `async` now run synchronously until the
+    first `await` statement. Previously, they would return to the event loop
+    once at the top of the function body before any code runs ([issue 30345][]).
 
-Cherry-pick f3625375744979a4c65e289a3140cbdd7fbf6f32 to dev
-Cherry-pick 7b77fa217b7b7e45ceb1d5ca820e18853b7728a4 to dev
-Cherry-pick 071ca8c05c62d227b22d0c95a831bea98ec5aeb8 to dev
-Cherry-pick 9727a4a4ef6a3c3de8cd6be75ab515643ee15bc6 to dev
-Cherry-pick c353d02a3c1c26e78b17768e31e6093e6cbf538b to dev
+*   **(Breaking)** Constants in the core libraries have been renamed from
+    `SCREAMING_CAPS` to `lowerCamelCase`.
 
-## 2.0.0-dev.69.2
+*   **(Breaking)** Many new methods have been added to core library classes. If
+    you implement the interfaces of these classes, you will need to implement
+    the new methods.
 
-### Core library changes
-* Remove deprecated UPPER_CASE constant names. Use the lower-case names only
-  from now on. Example `HTML_ESCAPE` is now only `htmlEscape`.
+*   **(Breaking)** "dart:isolate" and "dart:mirrors" are no longer supported
+    when using Dart for the web. They are still supported in the command-line
+    VM.
 
-## 2.0.0-dev.69.1
+*   **(Breaking)** Pub's transformer-based build system has been [replaced by a
+    new build system][transformers].
 
-Cherry-pick 11f3c57e9c09c62c46aaf7824c3ffdc8debb3960 to dev
-Cherry-pick 83a615cf4b4acfd6c0fb58a15ed82b09ff1669cf to dev
-Cherry-pick ec733c3b3c20adefb188e4b6e55103eef452a691 to dev
-Cherry-pick a7e511f4dce66362fb6ec921e80cc8c93cc277d7 to dev
-Cherry-pick 651994ba70fbf916316af8dd37571a4549bb66a1 to dev
-Cherry-pick 296319d2f00e3f51942f884f8f340f725c598ac8 to dev
-Cherry-pick cc1a7b35d009eb0fb526baf87202d3e97cd8aa1f to dev
-Cherry-pick 64a1f8f69c5538ec89d3349c0dcee6f7304e9f75 to dev
-Cherry-pick 389b8997b3e8a9f0eea287a99099b1d847851b6d to dev
-Cherry-pick db45d049dbcd05e359f5ca09396d0685fa47ba4e to dev
-Cherry-pick c6f525634f7238eb2e55d04f839b4e300d1f7cc2 to dev
-Cherry-pick a3bb529eecf1b88b69f61500a311100a39e39899 to dev
+*   The `new` keyword is optional and can be omitted. Likewise, `const` can be
+    omitted inside a const context ([issue 30921][]).
 
-## 2.0.0-dev.69.0
+*   Dartium is no longer maintained or supported.
 
-### Core library changes
-* `dart:collection`, `dart:core`:
-  * Re-enable `Iterable.whereType`. The method was disabled because code
-    was still being compiled in Dart 1 mode, and the function was
-    error-prone when used in that code.
-* `dart:async`
-  * Changed an internal lazily-allocated reusable "null future" to always belong
-    to the root zone. This avoids race conditions where the first access to the
-    future determined which zone it would belong to. The zone is only used
-    for *scheduling* the callback of listeners, the listeners themselves will
-    run in the correct zone in any case.
-    Issue [#32556](http://dartbug.com/32556).
-
-## 2.0.0-dev.68.0
-
-### Tool Changes
-
-#### dartfmt
-
-* Do not split long strings inside their string interpolations.
-
-#### Analyzer
-
-  * The analysis server will now only analyze code in Dart 2 mode ('strong
-    mode'). It will emit warnings for analysis options files that have
-    `strong-mode: false` set (and will emit a hint for `strong-mode: true`,
-    which is no longer necessary).
-  * The dartanalyzer `--strong` flag is now deprecated and ignored; the
-    command-line analyzer now only analyzes code in strong mode.
-
-## 2.0.0-dev.67.0
+[issue 30345]: https://github.com/dart-lang/sdk/issues/30345
+[issue 30921]: https://github.com/dart-lang/sdk/issues/30921
+[strong mode]: https://www.dartlang.org/guides/language/sound-dart
+[transformers]: https://www.dartlang.org/tools/pub/obsolete
 
 ### Language
 
-* New member conflict rules have been implemented. Most cases of conflicting
-  members with the same name are now static errors. Issue [33235][issue 33235].
+*   "[Strong mode][]" is now the official type system of the language.
 
-[issue 33235]: https://github.com/dart-lang/sdk/issues/33235
+*   The `new` keyword is optional and can be omitted. Likewise, `const` can be
+    omitted inside a const context.
 
-### Tool Changes
+*   A string in a `part of` declaration may now be used to refer to the library
+    this file is part of. A library part can now declare its library as either:
 
-#### dartfmt
+    ```dart
+    part of name.of.library;
+    ```
 
-  * Format expressions inside string interpolation.
+    Or:
 
-### Core library changes
+    ```dart
+    part of "uriReferenceOfLibrary.dart";
+    ```
 
-  * `dart:io`
-    * Adds `HttpClient.connectionTimeout`.
-    * Adds `{Socket,RawSocket,SecureSocket}.startConnect`. These return a
-      `ConnectionTask`, which can be used to cancel an in-flight connection
-      attempt.
+    This allows libraries with no library declarations (and therefore no name)
+    to have parts, and it allows tools to easily find the library of a part
+    file. The Dart 1.0 syntax is supported but deprecated.
 
-## 2.0.0-dev.66.0
+*   Functions marked `async` now run synchronously until the first `await`
+    statement. Previously, they would return to the event loop once at the top
+    of the function body before any code runs ([issue 30345][]).
 
-## 2.0.0-dev.65.0
+*   The type `void` is now a Top type like `dynamic`, and `Object`. It also now
+    has new errors for being used where not allowed (such as being assigned to
+    any non-`void`-typed parameter). Some libraries (importantly, mockito) may
+    need to be updated to accept void values to keep their APIs working.
 
-### Tool Changes
+*   Future flattening is now done only as specified in the Dart 2.0 spec, rather
+    than more broadly. This means that the following code has an error on the
+    assignment to `y`.
 
-#### dartfmt
+    ```dart
+    test() {
+      Future<int> f;
+      var x = f.then<Future<List<int>>>((x) => []);
+      Future<List<int>> y = x;
+    }
+    ```
 
-  * Add `--fix` to remove unneeded `new` and `const` keywords, and change `:`
-    to `=` before named parameter default values.
-  * Change formatting rules around static methods to uniformly format code with
-    and without `new` and `const`.
+*   Invocations of `noSuchMethod()` receive default values for optional args.
+    The following program used to print "No arguments passed", and now prints
+    "First argument is 3".
 
-#### Pub
+    ```dart
+    abstract class B {
+      void m([int x = 3]);
+    }
 
-  * Pub no longer supports running with `DART_VM_OPTIONS=--no-preview-dart2`.
+    class A implements B {
+      noSuchMethod(Invocation i) {
+        if (i.positionalArguments.length == 0) {
+          print("No arguments passed");
+        } else {
+          print("First argument is ${i.positionalArguments[0]}");
+        }
+      }
+    }
 
-## 2.0.0-dev.64.1
+    void main() {
+      A().m();
+    }
+    ```
 
-### Language
+*   Bounds on generic functions are invariant. The following program now issues
+    an invalid override error ([issue 29014][sdk#29014]):
 
-* Numerous corner case bugs around return statements in synchronous and
-asynchronous functions fixed.  Specifically:
-  * Issues [31887][issue 31887], [32881][issue 32881]. Future flattening should
-    not be recursive.
-  * Issues [30638][issue 30638], [32233][issue 32233]. Incorrect downcast errors
-    with `FutureOr`
-  * Issue [32233][issue 32233]. Errors when returning `FutureOr`
-  * Issue [33218][issue 33218]. Returns in functions with void related types
-  * Issue [31278][issue 31278]. Incorrect hint on empty returns in async
-    functions
-* An empty `return;` in an async function with return type `Future<Object>` will
-    not report an error.
-* `return exp;` where `exp` has type `void` in an async function is now an error
-unless the return type of the function is `void` or `dynamic`.
-* Mixed return statements of the form `return;` and `return exp;` are now
-allowed when `exp` has type `void`.
+    ```dart
+    class A {
+      void f<T extends int>() {}
+    }
 
-* A compile time error is emitted for any literal which cannot be exactly
-  represented on the target platform. As a result, dart2js and DDC will
-  report errors if an integer literal cannot be represented exactly in
-  JavaScript. Issue [33282][issue 33282].
+    class B extends A {
+      @override
+      void f<T extends num>() {}
+    }
+    ```
 
-[issue 31887]: https://github.com/dart-lang/sdk/issues/31887
+*   Numerous corner case bugs around return statements in synchronous and
+    asynchronous functions fixed. Specifically:
+
+    *   Issues [31887][issue 31887], [32881][issue 32881]. Future flattening
+        should not be recursive.
+    *   Issues [30638][issue 30638], [32233][issue 32233]. Incorrect downcast
+        errors with `FutureOr`.
+    *   Issue [32233][issue 32233]. Errors when returning `FutureOr`.
+    *   Issue [33218][issue 33218]. Returns in functions with void related
+        types.
+    *   Issue [31278][issue 31278]. Incorrect hint on empty returns in async.
+        functions.
+
+*   An empty `return;` in an async function with return type `Future<Object>`
+    does not report an error.
+
+*   `return exp;` where `exp` has type `void` in an async function is now an
+    error unless the return type of the function is `void` or `dynamic`.
+
+*   Mixed return statements of the form `return;` and `return exp;` are now
+    allowed when `exp` has type `void`.
+
+*   A compile time error is emitted for any literal which cannot be exactly
+    represented on the target platform. As a result, dart2js and DDC report
+    errors if an integer literal cannot be represented exactly in JavaScript
+    ([issue 33282][]).
+
+*   New member conflict rules have been implemented. Most cases of conflicting
+    members with the same name are now static errors ([issue 33235][]).
+
+[sdk#29014]: https://github.com/dart-lang/sdk/issues/29014
 [issue 30638]: https://github.com/dart-lang/sdk/issues/30638
+[issue 31278]: https://github.com/dart-lang/sdk/issues/31278
+[issue 31887]: https://github.com/dart-lang/sdk/issues/31887
 [issue 32233]: https://github.com/dart-lang/sdk/issues/32233
 [issue 32881]: https://github.com/dart-lang/sdk/issues/32881
 [issue 33218]: https://github.com/dart-lang/sdk/issues/33218
-[issue 31278]: https://github.com/dart-lang/sdk/issues/31278
+[issue 33235]: https://github.com/dart-lang/sdk/issues/33235
 [issue 33282]: https://github.com/dart-lang/sdk/issues/33282
+[issue 33341]: https://github.com/dart-lang/sdk/issues/33341
 
-### Dart VM
+### Core libraries
 
-* The Dart VM now runs programs by default with Dart 2.0 semantics. The flag
-  `--preview-dart-2` is not available anymore.
+*   Replaced `UPPER_CASE` constant names with `lowerCamelCase`. For example,
+    `HTML_ESCAPE` is now `htmlEscape`.
 
-* A new flag `--no-preview-dart-2` has been added, this flag can be used
-  to revert to Dart 1.0 semantics. The flag is temporary and only meant to
-  help users in the migration process. The flag will go away in a future dev
-  release, when we no longer support Dart 1.0.
+*   The Web libraries were re-generated using Chrome 63 WebIDLs
+    ([details][idl]).
 
-### Tool Changes
+[idl]: https://github.com/dart-lang/sdk/wiki/Chrome-63-Dart-Web-Libraries
 
-#### Dart2js
+#### `dart:async`
 
-* Dart2js now compiles programs by default with Dart 2.0 semantics. Apps are
-  expected to be bigger than before, because Dart 2.0 has many more implicit
-  checks (similar to the `--checked` flag in Dart 1.0). Other relevant flags:
-
-  * `--omit-implicit-checks`: is a flag that removes most of the extra implicit
-    checks. Only use this if you have enough test coverage to know that the app
-    will work well without the checks. If a check would have failed and it is
-    omitted, your app may crash or behave in unexpected ways.
-
-  * `--no-preview-dart-2`: a temporary flag to revert to Dart 1.0. This flag is
-    temporary and only meant to help users in the migration process. The flag
-    will go away in a future dev release, when we no longer support Dart 1.0.
-
-### Core library changes
-
-* `dart:core`
-  * `int.parse` on the VM no longer accepts unsigned hexadecimal numbers
-    greater than or equal to 2**63 when not prefixed by `0x`.
-    (SDK issue [32858](https://github.com/dart-lang/sdk/issues/32858))
-
-## 2.0.0-dev.63.0
-
-### Tool Changes
-
-#### Pub
-
-* Fix an error which prevented `pub publish` due to the package validation.
-
-## 2.0.0-dev.62.0
-
-### Language
-
-* Inference chooses `void` when combining `Object` or `dynamic` and `void` ([issue
-3341]).  When combining with other top types, inference now prefers `void`.  So
-for example, given:
-
-```dart
-void foo() {};
-dynamic bar() {};
-var a = [foo(), bar()];
-```
-
-the variable `a` would previously have been inferred as `dynamic`, and will now
-be inferred as `void`.
-
-[issue 3341]: https://github.com/dart-lang/sdk/issues/33341
-
-
-#### Strong Mode
-
-### Dart VM
-
-* The dart VM will no longer attempt to perform `packages/` directory
-  resolution (for loading scripts, and in `Isolate.resolveUri`). Users
-  relying on `packages/` directories should switch to `.packages` files.
-
-### Tool Changes
-
-#### Pub
-
-* Fix an error on `pub get` when running with Dart 2 mode and already existing
-  snapshots of executables.
-
-#### Other Tools
-
-### Core library changes
-
-* `dart:core`/`dart:collection`
-  * Remove the `retype` method on iterables and maps again. Use `cast` instead.
-  * Deprecated `Platform.packageRoot`, which is only used for `packages/`
-    directory resolution which is no longer supported. It will now always
-    return null, which is a value that was always possible for it to return
-    previously.
-* `dart:isolate`
-  * Deprecated `Isolate.packageRoot`, which is only used for `packages/`
-    directory resolution which is no longer supported. It will now always
-    return null, which is a value that was always possible for it to return
-    previously.
-  * Deprecated `packageRoot` parameter in `Isolate.spawnUri`, which is was
-    previously used only for `packages/` directory resolution. That style
-    of resolution is no longer supported in dart 2.
-
-## 2.0.0-dev.61.0
-
-### Dart VM
-
-* `async` functions now start synchronously by default.
-  Passing the `--no-sync-async` flag will produce the old behavior,
-  starting `async` functions asynchronously.
-
-### Tool Changes
-
-#### Pub
-
-* Fix support for running executables in Dart 2 mode.
-
-### Core library changes
-
-* `dart:io`
-  * Dart-styled constants have been added for `HttpStatus`, `HttpHeaders`,
-    `ContentType`, `HttpClient`, `WebSocketStatus`, `CompressionOptions`,
-    and `WebSocket`. The `SCREAMING_CAPS` constants are marked deprecated.
-    Note that `HttpStatus.CONTINUE` is now `HttpStatus.continue_`, and that
-    e.g. `HttpHeaders.FIELD_NAME` is now `HttpHeaders.fieldNameHeader`.
-
-## 2.0.0-dev.60.0
-
-### Core library changes
-
-* `dart:convert`
-  * Allow `utf8.decoder.fuse(json.decoder)` to ignore leading Unicode BOM.
-
-### Tool Changes
-
-#### Analyzer
-
-* New static checking of duplicate shown or hidden names in an export directive
-  ([issue 33182]).
-
-[issue 33182]: https://github.com/dart-lang/sdk/issues/33182
-
-## 2.0.0-dev.59.0
-
-### Language
-
-The change to make bounds on generic functions invariant has landed in the
-analyzer.  The analyzer will now issue an invalid override error on the
-following program ([issue 29014][sdk#29014]).
-
-```dart
-class A {
-  void f<T extends int>() {}
-}
-
-class B extends A {
-  @override
-  void f<T extends num>() {}
-}
-```
-
-[sdk#29014]: https://github.com/dart-lang/sdk/issues/29014
-
-## 2.0.0-dev.58.0
-
-## 2.0.0-dev.57.0
-
-* Support Javascript Promise APIs as a Dart Future.  In Javascript a Promise has two
-  callbacks one for success and one for failure.  For success the Future returns the
-  value e.g.,
-
-BackgroundFetchManager.get is exposed as:
-
-```dart
-  Future<BackgroundFetchRegistration> get(String id)
-```
-
-usage could be:
-
-   BackgroundFetchRegistration result = await fetchMgr.get('abc');
-
-  The underlying JS Promise to Future mechanism will be exposed as a public API in a future checkin.
-
-## 2.0.0-dev.56.0
-
-### Language
-
-* Invocations of noSuchMethod receive default values for optional args.
-  * The following program used to print "No arguments passed", and now prints
-    "First argument is 3".
-
-```dart
-abstract class B {
-  void m([int x = 3]);
-}
-
-class A implements B {
-  noSuchMethod(Invocation i) {
-    if (i.positionalArguments.length == 0) {
-      print("No arguments passed");
-    } else {
-      print("First argument is ${i.positionalArguments[0]}");
-    }
-  }
-}
-
-void main() {
-  A().m();
-}
-```
-
-### Core library changes
-
-* `dart:core`
-  * Deprecated the `NoSuchMethodError` constructor.
-
-* `dart:mirrors`
-  * Marked `MirrorsUsed` as deprecated. The mirrors library is no longer
-    supported by dart2js, and `MirrorsUsed` only affected dart2js.
-
-* `dart:io`
-  * Added `X509Certificate.der`, `X509Certificate.pem`, and
-    `X509Certificate.sha1`.
-  * Added `FileSystemEntity.fromRawPath` constructor to allow for
-    the creation of `FileSystemEntity` using `Uint8List` buffers.
-
-### Dart VM
-
-* `async` functions now start synchronously when previewing Dart 2 with
-  `--preview-dart-2`.  Build tools (e.g., build_runner) may override the
-  default and/or allow developers to configure.  Passing the
-  `--no-sync-async` flag will produce the old behavior, starting `async`
-  functions asynchronously.
-
-### Tool Changes
-
-#### dartfmt
-
-  * Support metadata annotations on enum cases.
-
-## 2.0.0-dev.55.0
-
-### Language
-
-* Changed the `cast` method to always change the type.  Deprecated the
-  `retype` method and made it redirect to `cast`.  Applies to all of the
-  following interfaces:
-  * `Stream`:
-  * `StreamTransformer`
-  * `Iterable`
-  * `Map`
-
-### Tool Changes
-
-#### dart2js
-
-* Several fixes to improve support for running output of dart2js as a webworker.
-
-* `dart:isolate` implementation removed. To launch background tasks,
-  please use webworkers instead. APIs for webworkers can be accessed from
-  `dart:html` or JS-interop.
-
-#### Pub
-
-* Use forward-slash paths to Git on Windows
-
-## 2.0.0-dev.54.0
-
-### Core library changes
-
-* `dart:io`
-  * Added Dart-styled constants to  `ZLibOptions`, `FileMode`, `FileLock`,
-    `FileSystemEntityType`, `FileSystemEvent`, `ProcessStartMode`,
-    `ProcessSignal`, `InternetAddressType`, `InternetAddress`,
-    `SocketDirection`, `SocketOption`, `RawSocketEvent`, and `StdioType`, and
-    deprecated the old `SCREAMING_CAPS` constants.
-  * Added the Dart-styled top-level constants `zlib`, `gzip`, and
-    `systemEncoding`, and deprecated the old `SCREAMING_CAPS` top-level
-    constants.
-  * Removed the top-level `FileMode` constants `READ`, `WRITE`, `APPEND`,
-    `WRITE_ONLY`, and `WRITE_ONLY_APPEND`. Please use e.g. `FileMode.read`
-    instead.
-
-### Tool Changes
-
-#### Pub
-
-* Retry on 500 errors from the pub server.
-
-## 2.0.0-dev.53.0
-
-## 2.0.0-dev.52.0
-
-### Tool Changes
-
-#### Dart Dev Compiler
-
-* Failed `as` casts on `Iterable<T>`, `Map<T>`, `Future<T>`, and `Stream<T>`
-  are no longer ignored. These failures were ignored to make it easier to
-  migrate Dart 1 code to strong mode, but ignoring them is a hole in the type
-  system. This closes part of that hole. (We still need to stop ignoring
-  "as" cast failures on function types, and implicit cast failures on the above
-  types and function types.)
-
-* `async` functions now start synchronously by default.  Build tools
-  (e.g., build_runner) may override the default and/or allow
-  developers to configure.
-
-## 2.0.0-dev.51.0
-
-### Tool Changes
-
-#### dartfmt
-  * Fixes a runtime error when dart_style is itself run in Dart 2.
-  * Force splitting an empty block as the then body of an if with an else.
-  * Uses the new lowercase Dart 2 constant names.
-
-#### Pub
-
-* The `build` and `serve` commands will now fail and point users to
-  https://webdev.dartlang.org/dart-2
-
-#### dart2js
-
-* `async` functions now start synchronously. This will be the default behavior
-  across all tools. To temporarily opt-out, use the `--no-sync-async` flag.
-
-## 2.0.0-dev.50.0
-
-## 2.0.0-dev.49.0
-
-### Tool Changes
-
-#### Pub
-
-* Fix another bug where the version solver could crash when resolving a conflict
-  involving pre-release constraints ([`pub_semver` issue 20][]).
-
-[`pub_semver` issue 20]: https://github.com/dart-lang/pub_semver/issues/20
-
-## 2.0.0-dev.48.0
-
-### Core library changes
-
-* `dart:core`
-  * Added `tryParse` static method to `int`, `double`, `num`, `BigInt`,
-    `Uri` and `DateTime`.
-  * Deprecated `onError` parameter on `int.parse`, `double.parse`
-    and `num.parse`.
-
-## 2.0.0-dev.47.0
-
-### Tool Changes
-
-#### Analyzer
-
-* The command line analyzer (dartanalyzer) and the analysis server no longer
-  treat directories named `packages` specially. Previously they had ignored
-  these directories - and their contents - from the point of view of analysis. Now
-  they'll be treated just as regular directories. This special-casing of
-  `packages` directories was to support using symlinks for package: resolution;
-  that functionality is now handled by `.packages` files.
-
-## 2.0.0-dev.46.0
-
-## 2.0.0-dev.45.0
-
-### Core library changes
-
-* `dart:async`
-  * Removed the deprecated `defaultValue` parameter on `Stream.firstWhere` and
+*   `Stream`:
+    *   Added `cast` and `castFrom`.
+    *   Changed `firstWhere`, `lastWhere`, and `singleWhere` to return
+        `Future<T>` and added an optional `T orElse()` callback.
+*   `StreamTransformer`: added `cast` and `castFrom`.
+*   `StreamTransformerBase`: new class.
+*   `Timer`: added `tick` property.
+*   `Zone`
+    *   changed to be strong-mode clean. This required some breaking API
+        changes. See https://goo.gl/y9mW2x for more information.
+    *   Added `bindBinaryCallbackGuarded`, `bindCallbackGuarded`, and
+        `bindUnaryCallbackGuarded`.
+    *   Renamed `Zone.ROOT` to `Zone.root`.
+*   Removed the deprecated `defaultValue` parameter on `Stream.firstWhere` and
     `Stream.lastWhere`.
+*   Changed an internal lazily-allocated reusable "null future" to always belong
+    to the root zone. This avoids race conditions where the first access to the
+    future determined which zone it would belong to. The zone is only used for
+    *scheduling* the callback of listeners, the listeners themselves will run in
+    the correct zone in any case. Issue [#32556](http://dartbug.com/32556).
 
-### Tool Changes
+#### `dart:cli`
 
-#### Pub
-
-* Fix a bug where the version solver could loop infinitely when resolving a
-  conflict involving pre-release constraints ([issue 1863][pub#1863]).
-
-[pub#1863]: https://github.com/dart-lang/pub/issues/1863
-
-## 2.0.0-dev.45.0
-
-### Tool Changes
-
-#### Pub
-
-* Fix a bug where the version solver could crash when resolving a conflict
-  involving pre-release constraints ([issue 1856][pub#1856]).
-
-[pub#1856]: https://github.com/dart-lang/pub/issues/1856
-
-
-## 2.0.0-dev.44.0
-
-### Tool Changes
-
-#### Pub
-
-* Pub has a brand new version solver! It supports all the same features as the
-  old version solver, but it's much less likely to stall out on difficult
-  package graphs, and it's much clearer about why a solution can't be found when
-  version solving fails.
-
-## 2.0.0-dev.43.0
-
-## 2.0.0-dev.42.0
-
-### Core library changes
-
-* `dart:collection`
-  * Removed `Maps` class. Extend `MapBase` or mix in `MapMixin` instead to
-    provide map method implementations for a class.
-* `dart:html`
-  * Removed deprecated `query` and `queryAll` use `querySelector` and `queryAllSelector`.
-  * Removed experimental `Document` method `getCSSCanvasContext` and property
-    `supportsCssCanvasContext`.
-  * Removed obsolete `Element` property `xtag` no longer supported in browsers.
-  * Exposed `ServiceWorker` class.
-  * Added constructor to `MessageChannel` and `MessagePort` `addEventListener` automatically calls
-    `start` method to receive queued messages.
-* `dart:io`
-  * Added `IOOverrides.socketConnect`.
-
-### Tool Changes
-
-#### dart2js
-
-* Fixed bug where dart2js crashed when invoked from `pub build` and `pub serve`
-  when given files that contain non-ASCII characters ([issue 32561][sdk#32561]).
-
-* Fixed `--no-frequency-based-minification`, which was not working together with
-  the common front-end ([issue 32600][sdk#32600]).
-
-* Support `--categories=Server` with the common front-end. This included also
-  fixes for the constant value `bool.fromEnvironment("*")` of
-  "dart.libraries.io", "dart.libraries.mirrors", "dart.libraries.isolate", and
-  "dart.libraries.html".
-
-[sdk#32561]: https://github.com/dart-lang/sdk/issues/32561
-[sdk#32600]: https://github.com/dart-lang/sdk/issues/32600
-
-#### Pub
-
-* Pub will now automatically retry HTTP requests that fail with an IO error
-  ([issue 1826][pub#1826]).
-
-* `pub deps` now includes the SDK version. This makes the output more helpful
-  when included in bug reports ([issue 1827][pub#1827]).
-
-* `build` and `serve` now print a deprecation warning pointing users to
-  https://webdev.dartlang.org/dart-2 ([issue 1823][pub#1823]).
-
-[pub#1823]: https://github.com/dart-lang/pub/issues/1823
-[pub#1826]: https://github.com/dart-lang/pub/issues/1826
-[pub#1827]: https://github.com/dart-lang/pub/issues/1827
-
-## 2.0.0-dev.41.0
-
-Not released, due to a failure in the pub tool.
-
-## 2.0.0-dev.40.0
-
-### Core library changes
-
-* The Web libraries were re-genereated using Chrome 63 WebIDLs.
-  See https://github.com/dart-lang/sdk/wiki/Chrome-63-Dart-Web-Libraries for
-  details.
-
-## 2.0.0-dev.39.0
-### Tool Changes
-#### Pub
-
-* Fixed bug in dart2js transformer when using the common front-end.
-
-## 2.0.0-dev.37.0
-### Tool Changes
-#### dart2js
-  * The dart2js compiler now uses the common front-end by default. This is a
-    step towards supporting Dart 2.0. At this time dart2js has no semantic
-    changes: the Dart 2.0 strong-mode semantics are not enabled, so dart2js
-    continues to support the Dart 1 type system. This change however lets us
-    start supporting new syntactic features of Dart 2.0, like optional
-    new/const. With this change you may notice:
-
-    * small code differences (~1% code size): some code is generated slightly
-      different, this is expected because the internal representation of the
-      program has small differences between the old and new front end.
-
-    * source-maps changes: with the new front-end, dart2js also is using a new
-      mechanism to generate source-map files. We don't expect big differences
-      here either, the new source-maps try to encode more data for locations
-      that are commonly used during debugging.
-
-    * some missing errors: the CFE is not complete and may not report some
-      static errors that the old front-end did. This is temporary. If you run
-      the analyzer on all your project already, you may never notice those
-      missing error messages.
-
-    * as announced earlier, this is the first version of dart2js that no longer
-      supports `dart:mirrors`.
-
-    * this is the first version of dart2js that no longer supports
-      `--package-root`, which long ago was deprecated in favor of `--packages`.
-
-#### Pub
-
-* dart2js transformer runs with the common front-end.
-
-## 2.0.0-dev.36.0
-
-### Core library changes
-* `dart:core`
-  * Temporarily disabled the `whereType` method until generic methods are
-    enabled on all platforms
-    ([issue 32463](https://github.com/dart-lang/sdk/issues/32463)).
-  * Changed return type of `UriData.dataAsBytes` to `Uint8List`.
-* `dart:convert`
-  * Added `jsonEncode`, `jsonDecode`, `base64Encode`, `base64UrlEncode` and
-    `base64Decode` top-level functions.
-  * Changed return type of `encode` on `AsciiCodec` and `Latin1Codec`,
-    and `convert` on `AsciiEncoder`, `Latin1Encoder`, to `Uint8List`.
-
-## 2.0.0
-
-### Language
-* A string in a `part of` declaration may now be used to refer to the library
-  this file is part of.
-  A library part can now declare its library either as:
-  `part of name.of.library;` or as `part of "uriReferenceOfLibrary.dart";`.
-  This allows libraries with no library declarations (and therefore no name)
-  to have parts, and it allows tools to easily find the library of a part
-  file.
-* Added support for starting `async` functions synchronously. All tools (VM,
-  dart2js, DDC) have now a flag `--sync-async` to enable this behavior.
-  Currently this behavior is opt-in. It will become the default.
-* The type `void` is now a Top type like `dynamic`, and `Object`. It also now
-  has new errors for being used where not allowed (such as being assigned to any
-  non-`void`-typed parameter). Some libraries (importantly, mockito) may need to
-  be updated to accept void values to keep their APIs working.
-
-#### Strong Mode
-
-* Future flattening is now done only as specified in the Dart 2.0 spec, rather
-than more broadly.  This means that the following code will now have an error on
-the assignment to `y`.
-
-  ```dart
-  test() {
-    Future<int> f;
-    var x = f.then<Future<List<int>>>((x) => []);
-    Future<List<int>> y = x;
-  }
-  ```
-
-### Core library changes
-
-* `dart:async`
-
-  * `Stream`:
-    * Added `cast`, `castFrom`, and `retype`.
-    * Changed `firstWhere`, `lastWhere`, and `singleWhere` to return `Future<T>`
-      and added an optional `T orElse()` callback.
-  * `StreamTransformer`: added `cast`, `castFrom`, `retype`.
-  * `StreamTransformerBase`: new class.
-  * `Timer`: added `tick` property.
-  * `Zone`
-    * changed to be strong-mode clean.
-      This required some breaking API changes.
-      See https://goo.gl/y9mW2x for more information.
-    * Added `bindBinaryCallbackGuarded`, `bindCallbackGuarded`, and
-      `bindUnaryCallbackGuarded`.
-    * Renamed `Zone.ROOT` to `Zone.root`.
-
-* `dart:cli`
-
-  * *New* "provisional" library for CLI-specific features.
-
-  * `waitFor`: function that suspends a stack to wait for a `Future` to
+*   *New* "provisional" library for CLI-specific features.
+*   `waitFor`: function that suspends a stack to wait for a `Future` to
     complete.
 
-* `dart:collection`
+#### `dart:collection`
 
-  * `MapBase`: added `mapToString`.
-  * `LinkedHashMap` no longer implements `HashMap`
-  * `LinkedHashSet` no longer implements `HashSet`.
-  * Added `of` constructor to `Queue`, `ListQueue`,
-    `DoubleLinkedQueue`, `HashSet`, `LinkedHashSet`, `SplayTreeSet`,
-    `Map`, `HashMap`, `LinkedHashMap`, `SplayTreeMap`.
+*   `MapBase`: added `mapToString`.
+*   `LinkedHashMap` no longer implements `HashMap`
+*   `LinkedHashSet` no longer implements `HashSet`.
+*   Added `of` constructor to `Queue`, `ListQueue`, `DoubleLinkedQueue`,
+    `HashSet`, `LinkedHashSet`, `SplayTreeSet`, `Map`, `HashMap`,
+    `LinkedHashMap`, `SplayTreeMap`.
+*   Removed `Maps` class. Extend `MapBase` or mix in `MapMixin` instead to
+    provide map method implementations for a class.
+*   Removed experimental `Document` method `getCSSCanvasContext` and property
+    `supportsCssCanvasContext`.
+*   Removed obsolete `Element` property `xtag` no longer supported in browsers.
+*   Exposed `ServiceWorker` class.
+*   Added constructor to `MessageChannel` and `MessagePort` `addEventListener`
+    automatically calls `start` method to receive queued messages.
 
-* `dart:convert`
+#### `dart:convert`
 
-  * `Base64Codec.decode` return type is now `Uint8List`.
-  * `JsonUnsupportedObjectError`: added `partialResult` property
-  * `LineSplitter` now implements `StreamTransformer<String, String>` instead of
-    `Converter`.
-    It retains `Converter` methods `convert` and `startChunkedConversion`.
-  * `Utf8Decoder` when compiled with dart2js uses the browser's `TextDecoder` in
+*   `Base64Codec.decode` return type is now `Uint8List`.
+*   `JsonUnsupportedObjectError`: added `partialResult` property
+*   `LineSplitter` now implements `StreamTransformer<String, String>` instead of
+    `Converter`. It retains `Converter` methods `convert` and
+    `startChunkedConversion`.
+*   `Utf8Decoder` when compiled with dart2js uses the browser's `TextDecoder` in
     some common cases for faster decoding.
-  * Renamed `ASCII`, `BASE64`, `BASE64URI`, `JSON`, `LATIN1` and `UTF8` to
+*   Renamed `ASCII`, `BASE64`, `BASE64URI`, `JSON`, `LATIN1` and `UTF8` to
     `ascii`, `base64`, `base64Uri`, `json`, `latin1` and `utf8`.
-  * Renamed the `HtmlEscapeMode` constants `UNKNOWN`, `ATTRIBUTE`,
+*   Renamed the `HtmlEscapeMode` constants `UNKNOWN`, `ATTRIBUTE`,
     `SQ_ATTRIBUTE` and `ELEMENT` to `unknown`, `attribute`, `sqAttribute` and
     `elements`.
+*   Added `jsonEncode`, `jsonDecode`, `base64Encode`, `base64UrlEncode` and
+    `base64Decode` top-level functions.
+*   Changed return type of `encode` on `AsciiCodec` and `Latin1Codec`, and
+    `convert` on `AsciiEncoder`, `Latin1Encoder`, to `Uint8List`.
+*   Allow `utf8.decoder.fuse(json.decoder)` to ignore leading Unicode BOM.
 
-* `dart:core`
+#### `dart:core`
 
-  * `BigInt` class added to support integers greater than 64-bits.
-  * Deprecated the `proxy` annotation.
-  * Added `Provisional` class and `provisional` field.
-  * Added `pragma` annotation.
-  * `RegExp` added static `escape` function.
-  * The `Uri` class now correctly handles paths while running on Node.js on
+*   `BigInt` class added to support integers greater than 64-bits.
+*   Deprecated the `proxy` annotation.
+*   Added `Provisional` class and `provisional` field.
+*   Added `pragma` annotation.
+*   `RegExp` added static `escape` function.
+*   The `Uri` class now correctly handles paths while running on Node.js on
     Windows.
-  * Core collection changes
-      * `Iterable` added members `cast`, `castFrom`, `followedBy`, `retype` and
+*   Core collection changes:
+    *   `Iterable` added members `cast`, `castFrom`, `followedBy` and
         `whereType`.
-      * `Iterable.singleWhere` added `orElse` parameter.
-      * `List` added `+` operator, `first` and `last` setters, and `indexWhere`
+    *   `Iterable.singleWhere` added `orElse` parameter.
+    *   `List` added `+` operator, `first` and `last` setters, and `indexWhere`
         and `lastIndexWhere` methods, and static `copyRange` and `writeIterable`
         methods.
-      * `Map` added `fromEntries` constructor.
-      * `Map` added `addEntries`, `cast`, `entries`, `map`, `removeWhere`,
-        `retype`, `update` and `updateAll` members.
-      * `MapEntry`: new class used by `Map.entries`.
-      * *Note*: if a class extends `IterableBase`, `ListBase`, `SetBase` or
+    *   `Map` added `fromEntries` constructor.
+    *   `Map` added `addEntries`, `cast`, `entries`, `map`, `removeWhere`,
+        `update` and `updateAll` members.
+    *   `MapEntry`: new class used by `Map.entries`.
+    *   *Note*: if a class extends `IterableBase`, `ListBase`, `SetBase` or
         `MapBase` (or uses the corresponding mixins) from `dart:collection`, the
         new members are implemented automatically.
-      * Added `of` constructor to `List`, `Set`, `Map`.
-  * Renamed `double.INFINITY`, `double.NEGATIVE_INFINITY`, `double.NAN`,
-    `double.MAX_FINITE` and `double.MIN_POSITIVE`
-    to `double.infinity`, `double.negativeInfinity`, `double.nan`,
-    `double.maxFinite` and `double.minPositive`.
-  * Renamed the following constants in `DateTime` to lower case:
-    `MONDAY` through `SUNDAY`, `DAYS_PER_WEEK` (as `daysPerWeek`),
-    `JANUARY` through `DECEMBER` and `MONTHS_PER_YEAR` (as `monthsPerYear`).
-  * Renamed the following constants in `Duration` to lower case:
+    *   Added `of` constructor to `List`, `Set`, `Map`.
+*   Renamed `double.INFINITY`, `double.NEGATIVE_INFINITY`, `double.NAN`,
+    `double.MAX_FINITE` and `double.MIN_POSITIVE` to `double.infinity`,
+    `double.negativeInfinity`, `double.nan`, `double.maxFinite` and
+    `double.minPositive`.
+*   Renamed the following constants in `DateTime` to lower case: `MONDAY`
+    through `SUNDAY`, `DAYS_PER_WEEK` (as `daysPerWeek`), `JANUARY` through
+    `DECEMBER` and `MONTHS_PER_YEAR` (as `monthsPerYear`).
+*   Renamed the following constants in `Duration` to lower case:
     `MICROSECONDS_PER_MILLISECOND` to `microsecondsPerMillisecond`,
-    `MILLISECONDS_PER_SECOND` to `millisecondsPerSecond`,
-    `SECONDS_PER_MINUTE` to `secondsPerMinute`,
-    `MINUTES_PER_HOUR` to `minutesPerHour`,
-    `HOURS_PER_DAY` to `hoursPerDay`,
-    `MICROSECONDS_PER_SECOND` to `microsecondsPerSecond`,
-    `MICROSECONDS_PER_MINUTE` to `microsecondsPerMinute`,
-    `MICROSECONDS_PER_HOUR` to `microsecondsPerHour`,
-    `MICROSECONDS_PER_DAY` to `microsecondsPerDay`,
-    `MILLISECONDS_PER_MINUTE` to `millisecondsPerMinute`,
-    `MILLISECONDS_PER_HOUR` to `millisecondsPerHour`,
-    `MILLISECONDS_PER_DAY` to `millisecondsPerDay`,
-    `SECONDS_PER_HOUR` to `secondsPerHour`,
-    `SECONDS_PER_DAY` to `secondsPerDay`,
-    `MINUTES_PER_DAY` to `minutesPerDay`, and
-    `ZERO` to `zero`.
-  * Added `typeArguments` to `Invocation` class.
-  * Added constructors to invocation class that allows creation of
-    `Invocation` objects directly, without going through `noSuchMethod`.
-  * Added `unaryMinus` and `empty` constant symbols on the `Symbol` class.
+    `MILLISECONDS_PER_SECOND` to `millisecondsPerSecond`, `SECONDS_PER_MINUTE`
+    to `secondsPerMinute`, `MINUTES_PER_HOUR` to `minutesPerHour`,
+    `HOURS_PER_DAY` to `hoursPerDay`, `MICROSECONDS_PER_SECOND` to
+    `microsecondsPerSecond`, `MICROSECONDS_PER_MINUTE` to
+    `microsecondsPerMinute`, `MICROSECONDS_PER_HOUR` to `microsecondsPerHour`,
+    `MICROSECONDS_PER_DAY` to `microsecondsPerDay`, `MILLISECONDS_PER_MINUTE` to
+    `millisecondsPerMinute`, `MILLISECONDS_PER_HOUR` to `millisecondsPerHour`,
+    `MILLISECONDS_PER_DAY` to `millisecondsPerDay`, `SECONDS_PER_HOUR` to
+    `secondsPerHour`, `SECONDS_PER_DAY` to `secondsPerDay`, `MINUTES_PER_DAY` to
+    `minutesPerDay`, and `ZERO` to `zero`.
+*   Added `typeArguments` to `Invocation` class.
+*   Added constructors to invocation class that allows creation of `Invocation`
+    objects directly, without going through `noSuchMethod`.
+*   Added `unaryMinus` and `empty` constant symbols on the `Symbol` class.
+*   Changed return type of `UriData.dataAsBytes` to `Uint8List`.
+*   Added `tryParse` static method to `int`, `double`, `num`, `BigInt`, `Uri`
+    and `DateTime`.
+*   Deprecated `onError` parameter on `int.parse`, `double.parse` and
+    `num.parse`.
+*   Deprecated the `NoSuchMethodError` constructor.
+*   `int.parse` on the VM no longer accepts unsigned hexadecimal numbers greater
+    than or equal to `2**63` when not prefixed by `0x`. (SDK issue
+    [32858](https://github.com/dart-lang/sdk/issues/32858))
 
-* `dart:developer`
+#### `dart:developer`
 
-  * `Flow` class added.
-  * `Timeline.startSync` and `Timeline.timeSync` now accept an optional
+*   `Flow` class added.
+*   `Timeline.startSync` and `Timeline.timeSync` now accept an optional
     parameter `flow` of type `Flow`. The `flow` parameter is used to generate
     flow timeline events that are enclosed by the slice described by
     `Timeline.{start,finish}Sync` and `Timeline.timeSync`.
@@ -813,69 +306,111 @@
 Still need entries for all changes to dart:html since 1.x
 -->
 
-* `dart:io`
+#### `dart:html`
 
-  * `HttpStatus` added `UPGRADE_REQUIRED`.
-  * `IOOverrides` and `HttpOverrides` added to aid in writing tests that wish to
+*   Removed deprecated `query` and `queryAll`. Use `querySelector` and
+    `querySelectorAll`.
+
+#### `dart:io`
+
+*   `HttpStatus` added `UPGRADE_REQUIRED`.
+*   `IOOverrides` and `HttpOverrides` added to aid in writing tests that wish to
     mock varios `dart:io` objects.
-  * `Platform.operatingSystemVersion` added  that gives a platform-specific
+*   `Platform.operatingSystemVersion` added  that gives a platform-specific
     String describing the version of the operating system.
-  * `ProcessStartMode.INHERIT_STDIO` added, which allows a child process to
+*   `ProcessStartMode.INHERIT_STDIO` added, which allows a child process to
     inherit the parent's stdio handles.
-  * `RawZLibFilter` added  for low-level access to compression and
-    decompression routines.
-  * Unified backends for `SecureSocket`, `SecurityContext`, and
-    `X509Certificate` to be consistent across all platforms. All
-    `SecureSocket`, `SecurityContext`, and `X509Certificate` properties and
-    methods are now supported on iOS and OSX.
-  * `SecurityContext.alpnSupported` deprecated as ALPN is now supported on all
+*   `RawZLibFilter` added  for low-level access to compression and decompression
+    routines.
+*   Unified backends for `SecureSocket`, `SecurityContext`, and
+    `X509Certificate` to be consistent across all platforms. All `SecureSocket`,
+    `SecurityContext`, and `X509Certificate` properties and methods are now
+    supported on iOS and OSX.
+*   `SecurityContext.alpnSupported` deprecated as ALPN is now supported on all
     platforms.
-  * `SecurityContext`: added `withTrustedRoots` named optional parameter
+*   `SecurityContext`: added `withTrustedRoots` named optional parameter
     constructor, which defaults to false.
-  * Added a `timeout` parameter to `Socket.connect`, `RawSocket.connect`,
-    `SecureSocket.connect` and `RawSecureSocket.connect`. If a connection attempt
-    takes longer than the duration specified in `timeout`, a `SocketException`
-    will be thrown. Note: if the duration specified in `timeout` is greater than
-    the OS level timeout, a timeout may occur sooner than specified in
-    `timeout`.
-  * `Stdin.hasTerminal` added, which is true if stdin is attached to a terminal.
-  * `WebSocket` added static `userAgent` property.
-  * `RandomAccessFile.close` returns `Future<void>`
+*   Added a `timeout` parameter to `Socket.connect`, `RawSocket.connect`,
+    `SecureSocket.connect` and `RawSecureSocket.connect`. If a connection
+    attempt takes longer than the duration specified in `timeout`, a
+    `SocketException` will be thrown. Note: if the duration specified in
+    `timeout` is greater than the OS level timeout, a timeout may occur sooner
+    than specified in `timeout`.
+*   `Stdin.hasTerminal` added, which is true if stdin is attached to a terminal.
+*   `WebSocket` added static `userAgent` property.
+*   `RandomAccessFile.close` returns `Future<void>`
+*   Added `IOOverrides.socketConnect`.
+*   Added Dart-styled constants to  `ZLibOptions`, `FileMode`, `FileLock`,
+    `FileSystemEntityType`, `FileSystemEvent`, `ProcessStartMode`,
+    `ProcessSignal`, `InternetAddressType`, `InternetAddress`,
+    `SocketDirection`, `SocketOption`, `RawSocketEvent`, and `StdioType`, and
+    deprecated the old `SCREAMING_CAPS` constants.
+*   Added the Dart-styled top-level constants `zlib`, `gzip`, and
+    `systemEncoding`, and deprecated the old `SCREAMING_CAPS` top-level
+    constants.
+*   Removed the top-level `FileMode` constants `READ`, `WRITE`, `APPEND`,
+    `WRITE_ONLY`, and `WRITE_ONLY_APPEND`. Please use e.g. `FileMode.read`
+    instead.
+*   Added `X509Certificate.der`, `X509Certificate.pem`, and
+    `X509Certificate.sha1`.
+*   Added `FileSystemEntity.fromRawPath` constructor to allow for the creation
+    of `FileSystemEntity` using `Uint8List` buffers.
+*   Dart-styled constants have been added for `HttpStatus`, `HttpHeaders`,
+    `ContentType`, `HttpClient`, `WebSocketStatus`, `CompressionOptions`, and
+    `WebSocket`. The `SCREAMING_CAPS` constants are marked deprecated. Note that
+    `HttpStatus.CONTINUE` is now `HttpStatus.continue_`, and that e.g.
+    `HttpHeaders.FIELD_NAME` is now `HttpHeaders.fieldNameHeader`.
+*   Deprecated `Platform.packageRoot`, which is only used for `packages/`
+    directory resolution which is no longer supported. It will now always return
+    null, which is a value that was always possible for it to return previously.
+*   Adds `HttpClient.connectionTimeout`.
+*   Adds `{Socket,RawSocket,SecureSocket}.startConnect`. These return a
+    `ConnectionTask`, which can be used to cancel an in-flight connection
+    attempt.
 
-* `dart:isolate`
+#### `dart:isolate`
 
-  * Make `Isolate.spawn` take a type parameter representing the argument type
-    of the provided function. This allows functions with arguments types other
-    than `Object` in strong mode.
-  * Rename `IMMEDIATE` and `BEFORE_NEXT_EVENT` on `Isolate` to `immediate` and
+*   Make `Isolate.spawn` take a type parameter representing the argument type of
+    the provided function. This allows functions with arguments types other than
+    `Object` in strong mode.
+*   Rename `IMMEDIATE` and `BEFORE_NEXT_EVENT` on `Isolate` to `immediate` and
     `beforeNextEvent`.
+*   Deprecated `Isolate.packageRoot`, which is only used for `packages/`
+    directory resolution which is no longer supported. It will now always return
+    null, which is a value that was always possible for it to return previously.
+*   Deprecated `packageRoot` parameter in `Isolate.spawnUri`, which is was
+    previously used only for `packages/` directory resolution. That style of
+    resolution is no longer supported in Dart 2.
 
 <!--
 Still need entries for all changes to dart:js since 1.x
 -->
 
-* `dart.math`
+#### `dart.math`
 
-  * Renamed `E`, `LN10`, `LN`, `LOG2E`, `LOG10E`, `PI`, `SQRT1_2` and `SQRT2`
-    to `e`, `ln10`, `ln`, `log2e`, `log10e`, `pi`, `sqrt1_2` and `sqrt2`.
+*   Renamed `E`, `LN10`, `LN`, `LOG2E`, `LOG10E`, `PI`, `SQRT1_2` and `SQRT2` to
+    `e`, `ln10`, `ln`, `log2e`, `log10e`, `pi`, `sqrt1_2` and `sqrt2`.
 
-* `dart.mirrors`
-  * Added `IsolateMirror.loadUri`, which allows dynamically loading additional
+#### `dart.mirrors`
+
+*   Added `IsolateMirror.loadUri`, which allows dynamically loading additional
     code.
+*   Marked `MirrorsUsed` as deprecated. The `MirrorsUsed` annotation was only
+    used to inform the dart2js compiler about how mirrors were used, but dart2js
+    no longer supports the mirrors library altogether.
 
 <!--
 Still need entries for all changes to dart:svg since 1.x
 -->
 
-* `dart:typed_data`
+#### `dart:typed_data`
 
-  * Added `Unmodifiable` view classes over all `List` types.
-  * Renamed `BYTES_PER_ELEMENT` to `bytesPerElement` on all typed data lists.
-  * Renamed constants `XXXX` through `WWWW` on `Float32x4` and `Int32x4` to
+*   Added `Unmodifiable` view classes over all `List` types.
+*   Renamed `BYTES_PER_ELEMENT` to `bytesPerElement` on all typed data lists.
+*   Renamed constants `XXXX` through `WWWW` on `Float32x4` and `Int32x4` to
     lower-case `xxxx` through `wwww`.
-  * Renamed `Endinanness` to `Endian` and its constants from
-    `BIG_ENDIAN`, `LITTLE_ENDIAN` and `HOST_ENDIAN` to
-    `little`, `big` and `host`.
+*   Renamed `Endinanness` to `Endian` and its constants from `BIG_ENDIAN`,
+    `LITTLE_ENDIAN` and `HOST_ENDIAN` to `little`, `big` and `host`.
 
 <!--
 Still need entries for all changes to dart:web_audio,web_gl,web_sql since 1.x
@@ -883,169 +418,40 @@
 
 ### Dart VM
 
-* Support for MIPS has been removed.
+*   Support for MIPS has been removed.
 
-* Dart `int` is now restricted to 64 bits. On overflow, arithmetic operations wrap
-  around, and integer literals larger than 64 bits are not allowed.
-  See https://github.com/dart-lang/sdk/blob/master/docs/language/informal/int64.md
-  for details.
+*   Dart `int` is now restricted to 64 bits. On overflow, arithmetic operations
+    wrap around, and integer literals larger than 64 bits are not allowed. See
+    https://github.com/dart-lang/sdk/blob/master/docs/language/informal/int64.md
+    for details.
 
-### Tool Changes
+*   The Dart VM no longer attempts to perform `packages/` directory resolution
+    (for loading scripts, and in `Isolate.resolveUri`). Users relying on
+    `packages/` directories should switch to `.packages` files.
 
-#### Analyzer
+### Dart for the Web
 
-* The analyzer will no longer issue a warning when a generic type parameter
-  is used as the type in an instance check. For example:
-
-  ```dart
-  test<T>() {
-    print(3 is T); // No warning
-  }
-  ```
-
-* New static checking of `@visibleForTesting` elements. Accessing a method,
-  function, class, etc. annotated with `@visibleForTesting` from a file _not_
-  in a `test/` directory will result in a new hint ([issue 28273]).
-* Static analysis now respects functions annotated with `@alwaysThrows`
-  ([issue 31384]).
-* New hints added:
-  * `NULL_AWARE_BEFORE_OPERATOR` when an operator is used after a null-aware
-    access. For example:
+*   Expose JavaScript Promise APIs using Dart futures. For example,
+    `BackgroundFetchManager.get` is defined as:
 
     ```dart
-    x?.a - ''; // HINT
+      Future<BackgroundFetchRegistration> get(String id)
     ```
 
-  * `NULL_AWARE_IN_LOGICAL_OPERATOR` when an expression with null-aware access
-    is used as a condition in logical operators. For example:
+    It can be used like:
 
     ```dart
-    x.a || x?.b; // HINT
+    BackgroundFetchRegistration result = await fetchMgr.get('abc');
     ```
 
-[issue 28273]: https://github.com/dart-lang/sdk/issues/28273
-[issue 31384]: https://github.com/dart-lang/sdk/issues/31384
+    The underlying JS Promise-to-Future mechanism will be exposed as a public
+    API in the future.
 
-#### Pub
+#### Dart Dev Compiler (DDC)
 
-##### SDK Constraints
+*   dartdevc will no longer throw an error from `is` checks that return a
+    different result in weak mode (SDK [issue 28988][sdk#28988]). For example:
 
-There is now a default SDK constraint of `<2.0.0` for any package with no
-existing upper bound. This allows us to move more safely to 2.0.0. All new
-packages published on pub will now require an upper bound SDK constraint so
-future major releases of Dart don't destabilize the package ecosystem.
-
-All SDK constraint exclusive upper bounds are now treated as though they allow
-pre-release versions of that upper bound. For example, the SDK constraint
-`>=1.8.0 <2.0.0` now allows pre-release SDK versions such as `2.0.0-beta.3.0`.
-This allows early adopters to try out packages that don't explicitly declare
-support for the new version yet. You can disable this functionality by setting
-the `PUB_ALLOW_PRERELEASE_SDK` environment variable to `false`.
-
-##### Other Features
-
-* Git dependencies may now include a `path` parameter, indicating that the
-  package exists in a subdirectory of the Git repository. For example:
-
-  ```yaml
-  dependencies:
-    foobar:
-      git:
-        url: git://github.com/dart-lang/multi_package_repo
-        path: pkg/foobar
-  ```
-
-* Added an `--executables` option to `pub deps` command. This will list all
-  available executables that can be run with `pub run`.
-
-* Added a `PUB_MAX_WORKERS_PER_TASK` environment variable which can be set to
-  configure the number of dartdevc/analyzer workers that are used when compiling
-  with `--web-compiler=dartdevc`.
-
-* The Flutter `sdk` source will now look for packages in
-  `flutter/bin/cache/pkg/` as well as `flutter/packages/`. In particular, this
-  means that packages can depend on the `sky_engine` package from the `sdk`
-  source ([issue 1775][pub#1775]).
-
-* Pub will now automatically retry HTTP requests that fail with a 502, 503, of
-  504 error code ([issue 1556][pub#1556]).
-
-* Pub now caches compiled packages and snapshots in the `.dart_tool/pub`
-  directory, rather than the `.pub` directory ([issue 1795][pub#1795]).
-
-* Emit exit code 66 when a path dependency doesn't exist ([issue 1747][pub#1747]).
-
-* `pub publish` throws a more explicit error if the `publish_to` field isn't an
-  absolute URL ([issue 1769][pub#1769]).
-
-* `pub publish` provides more detailed information if the package is too large
-  to upload.
-
-[pub#1556]: https://github.com/dart-lang/pub/issues/1556
-[pub#1747]: https://github.com/dart-lang/pub/issues/1747
-[pub#1769]: https://github.com/dart-lang/pub/issues/1769
-[pub#1775]: https://github.com/dart-lang/pub/issues/1775
-[pub#1795]: https://github.com/dart-lang/pub/issues/1795
-
-##### Bug Fixes
-
-* Added a `--build-delay` argument to `pub serve` which sets the amount of time
-  (in ms) to wait between file watcher events before scheduling a build.
-  Defaults to 50.
-
-* `pub get` and `pub upgrade` properly produce an error message and exit code
-  when no network is present.
-
-* `pub serve` now waits for file watcher events to stabilize before scheduling
-   new builds. This helps specifically with `safe-write` features in editors,
-   as well as other situations such as `save all` which cause many fast edits.
-
-* Removed the require.js module loading timeout for dartdevc, which resolves an
-  issue where the initial load of an app might give a timeout error.
-
-* Root package analysis options are no longer enforced for dependencies when
-  compiling with dartdevc ([issue 1684][pub#1684]).
-
-* Dart scripts can be included from subdirectories with dartdevc
-  ([issue 30246][]).
-
-* The `barback` infrastructure now supports `async` 2.0.0.
-
-* Print a more informative error message when the Flutter SDK isn't
-  available ([issue 1719][pub#1719]).
-
-* Don't crash when publishing a package that contains an empty submodule
-  ([issue 1679][pub#1679]).
-
-* Emit exit code 69 for TLS errors ([issue 1729][pub#1729]).
-
-* Fix `pub global run` for packages activated from a local path that also have
-  relative path dependencies ([issue 1751][pub#1751]).
-
-* `pub build` and `pub serve` support using the common front-end in the dart2js
-  transformer.
-
-[pub#1684]: https://github.com/dart-lang/pub/issues/1684
-[pub#1719]: https://github.com/dart-lang/pub/issues/1719
-[pub#1679]: https://github.com/dart-lang/pub/issues/1679
-[pub#1729]: https://github.com/dart-lang/pub/issues/1729
-[pub#1751]: https://github.com/dart-lang/pub/issues/1751
-[issue 30246]: https://github.com/dart-lang/sdk/issues/30246
-
-#### Other Tools
-
-* dartfmt
-
-    * Support assert in const constructor initializer lists.
-    * Better formatting for multi-line strings in argument lists.
-    wasn't in a Git repository.
-
-* Dart Dev Compiler
-
-  * dartdevc will no longer throw an error from `is` checks that return a
-    different result in weak mode
-    (SDK issue [28988](https://github.com/dart-lang/sdk/issues/28988)).
-    For example:
     ```dart
     main() {
       List l = [];
@@ -1054,6 +460,178 @@
     }
     ```
 
+*   Failed `as` casts on `Iterable<T>`, `Map<T>`, `Future<T>`, and `Stream<T>`
+    are no longer ignored. These failures were ignored to make it easier to
+    migrate Dart 1 code to strong mode, but ignoring them is a hole in the type
+    system. This closes part of that hole. (We still need to stop ignoring "as"
+    cast failures on function types, and implicit cast failures on the above
+    types and function types.)
+
+[sdk#28988]: https://github.com/dart-lang/sdk/issues/28988
+
+#### dart2js
+
+*   dart2js now compiles programs with Dart 2.0 semantics. Apps are expected to
+    be bigger than before, because Dart 2.0 has many more implicit checks
+    (similar to the `--checked` flag in Dart 1.0).
+
+    We exposed a `--omit-implicit-checks` flag which removes most of the extra
+    implicit checks. Only use this if you have enough test coverage to know that
+    the app will work well without the checks. If a check would have failed and
+    it is omitted, your app may crash or behave in unexpected ways. This flag is
+    similar to `--trust-type-annotations` in Dart 1.0.
+
+*   dart2js replaced its front-end with the common front-end (CFE). Thanks to
+    the CFE, dart2js errors are more consistent with all other Dart tools.
+
+*   dart2js replaced its source-map implementation.  There aren't any big
+    differences, but more data is emitted for synthetic code generated by the
+    compiler.
+
+*   `dart:mirrors` support was removed. Frameworks are encouraged to use
+    code-generation instead. Conditional imports indicate that mirrors are not
+    supported, and any API in the mirrors library will throw at runtime.
+
+*   The generated output of dart2js can now be run as a webworker.
+
+*   `dart:isolate` support was removed. To launch background tasks, please
+    use webworkers instead. APIs for webworkers can be accessed from `dart:html`
+    or JS-interop.
+
+*   dart2js no longer supports the `--package-root` flag. This flag was
+    deprecated in favor of `--packages` long ago.
+
+### Tool Changes
+
+#### Analyzer
+
+*   The analyzer will no longer issue a warning when a generic type parameter is
+    used as the type in an instance check. For example:
+
+    ```dart
+    test<T>() {
+      print(3 is T); // No warning
+    }
+    ```
+
+*   New static checking of `@visibleForTesting` elements. Accessing a method,
+    function, class, etc. annotated with `@visibleForTesting` from a file _not_
+    in a `test/` directory will result in a new hint ([issue 28273][]).
+
+*   Static analysis now respects functions annotated with `@alwaysThrows`
+    ([issue 31384][]).
+
+*   New hints added:
+
+    *   `NULL_AWARE_BEFORE_OPERATOR` when an operator is used after a null-aware
+        access. For example:
+
+        ```dart
+        x?.a - ''; // HINT
+        ```
+
+    *   `NULL_AWARE_IN_LOGICAL_OPERATOR` when an expression with null-aware
+        access is used as a condition in logical operators. For example:
+
+        ```dart
+        x.a || x?.b; // HINT
+        ```
+
+*   The command line analyzer (dartanalyzer) and the analysis server no longer
+    treat directories named `packages` specially. Previously they had ignored
+    these directories - and their contents - from the point of view of analysis.
+    Now they'll be treated just as regular directories. This special-casing of
+    `packages` directories was to support using symlinks for package:
+    resolution; that functionality is now handled by `.packages` files.
+
+*   New static checking of duplicate shown or hidden names in an export
+    directive ([issue 33182][]).
+
+*   The analysis server will now only analyze code in Dart 2 mode ('strong
+    mode'). It will emit warnings for analysis options files that have
+    `strong-mode: false` set (and will emit a hint for `strong-mode: true`,
+    which is no longer necessary).
+
+*   The dartanalyzer `--strong` flag is now deprecated and ignored. The
+    command-line analyzer now only analyzes code in strong mode.
+
+[issue 28273]: https://github.com/dart-lang/sdk/issues/28273
+[issue 31384]: https://github.com/dart-lang/sdk/issues/31384
+[issue 33182]: https://github.com/dart-lang/sdk/issues/33182
+
+#### dartfmt
+
+*   Support `assert()` in const constructor initializer lists.
+
+*   Better formatting for multi-line strings in argument lists.
+
+*   Force splitting an empty block as the then body of an if with an else.
+
+*   Support metadata annotations on enum cases.
+
+*   Add `--fix` to remove unneeded `new` and `const` keywords, and change `:` to
+    `=` before named parameter default values.
+
+*   Change formatting rules around static methods to uniformly format code with
+    and without `new` and `const`.
+
+*   Format expressions inside string interpolation.
+
+#### Pub
+
+*   Pub has a brand new version solver! It supports all the same features as the
+    old version solver, but it's much less likely to stall out on difficult
+    package graphs, and it's much clearer about why a solution can't be found
+    when version solving fails.
+
+*   Remove support for transformers, `pub build`, and `pub serve`. Use the
+    [new build system][transformers] instead.
+
+*   There is now a default SDK constraint of `<2.0.0` for any package with no
+    existing upper bound. This allows us to move more safely to 2.0.0. All new
+    packages published on pub will now require an upper bound SDK constraint so
+    future major releases of Dart don't destabilize the package ecosystem.
+
+    All SDK constraint exclusive upper bounds are now treated as though they
+    allow pre-release versions of that upper bound. For example, the SDK
+    constraint `>=1.8.0 <2.0.0` now allows pre-release SDK versions such as
+    `2.0.0-beta.3.0`. This allows early adopters to try out packages that don't
+    explicitly declare support for the new version yet. You can disable this
+    functionality by setting the `PUB_ALLOW_PRERELEASE_SDK` environment variable
+    to `false`.
+
+*   Allow depending on a package in a subdirectory of a Git repository. Git
+    dependencies may now include a `path` parameter, indicating that the package
+    exists in a subdirectory of the Git repository. For example:
+
+    ```yaml
+    dependencies:
+      foobar:
+        git:
+          url: git://github.com/dart-lang/multi_package_repo
+          path: pkg/foobar
+    ```
+
+*   Added an `--executables` option to `pub deps` command. This will list all
+    available executables that can be run with `pub run`.
+
+*   The Flutter `sdk` source will now look for packages in
+    `flutter/bin/cache/pkg/` as well as `flutter/packages/`. In particular, this
+    means that packages can depend on the `sky_engine` package from the `sdk`
+    source ([issue 1775][pub#1775]).
+
+*   Pub now caches compiled packages and snapshots in the `.dart_tool/pub`
+    directory, rather than the `.pub` directory ([issue 1795][pub#1795]).
+
+*   Other bug fixes and improvements.
+
+[issue 30246]: https://github.com/dart-lang/sdk/issues/30246
+[pub#1679]: https://github.com/dart-lang/pub/issues/1679
+[pub#1684]: https://github.com/dart-lang/pub/issues/1684
+[pub#1775]: https://github.com/dart-lang/pub/issues/1775
+[pub#1795]: https://github.com/dart-lang/pub/issues/1795
+[pub#1823]: https://github.com/dart-lang/pub/issues/1823
+
 ## 1.24.3 - 14-12-2017
 
 * Fix for constructing a new SecurityContext that contains the built-in
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index aba685b..835c514 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -239,7 +239,7 @@
 [ $compiler == dartk && ($hot_reload || $hot_reload_rollback) ]
 dart/data_uri_spawn_test: Skip # Timeout
 
-[ $compiler != dartk && $compiler != dartkb && $compiler != none ]
+[ $compiler != dartk && $compiler != none ]
 dart/appjit*: SkipByDesign # Test needs to run from source
 dart/script_determinism_test: SkipByDesign # Test needs to run from source
 
@@ -262,7 +262,7 @@
 dart/inline_stack_frame_test: Skip
 dart/optimized_stacktrace_line_test: Skip
 
-[ ($arch == simarm || $arch == simarm64 || $arch == simdbc || $arch == simdbc64) && ($compiler == dartk || $compiler == dartkb) ]
+[ ($arch == simarm || $arch == simarm64 || $arch == simdbc || $arch == simdbc64) && $compiler == dartk ]
 dart/appjit*: SkipSlow # DFE too slow
 dart/script_determinism_test: SkipSlow # DFE too slow
 
diff --git a/tools/VERSION b/tools/VERSION
index 01a87d1..b4d3056 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -23,9 +23,9 @@
 #  * Making cherry-picks to stable channel
 #     - increase PATCH by 1
 #
-CHANNEL dev
+CHANNEL stable
 MAJOR 2
 MINOR 0
 PATCH 0
-PRERELEASE 69
-PRERELEASE_PATCH 5
+PRERELEASE 0
+PRERELEASE_PATCH 0
