Version 1.18.0-dev.4.3

Cherry-pick 30b489578d9ee587d2ca622346e2051a869fb994 to dev
Cherry-pick bde8d3efc6f7558edda6a1cad879ff4a264ddabe to dev
Cherry-pick 69a8b11f6717d4cc8e55f9bc0123eac4f90db849 to dev
diff --git a/sdk/lib/async/timer.dart b/sdk/lib/async/timer.dart
index 135c868..1bbb65b 100644
--- a/sdk/lib/async/timer.dart
+++ b/sdk/lib/async/timer.dart
@@ -4,84 +4,6 @@
 
 part of dart.async;
 
-abstract class _TimerTask implements Timer {
-  final Zone _zone;
-  final Timer _nativeTimer;
-
-  _TimerTask(this._nativeTimer, this._zone);
-
-  void cancel() {
-    _nativeTimer.cancel();
-  }
-
-  bool get isActive => _nativeTimer.isActive;
-}
-
-class _SingleShotTimerTask extends _TimerTask {
-  // TODO(floitsch): the generic argument should be 'void'.
-  final ZoneCallback<dynamic> _callback;
-
-  _SingleShotTimerTask(Timer timer, this._callback, Zone zone)
-      : super(timer, zone);
-}
-
-class _PeriodicTimerTask extends _TimerTask {
-  // TODO(floitsch): the first generic argument should be 'void'.
-  final ZoneUnaryCallback<dynamic, Timer> _callback;
-
-  _PeriodicTimerTask(Timer timer, this._callback, Zone zone)
-      : super(timer, zone);
-}
-
-/**
- * A task specification for a single-shot timer.
- *
- * *Experimental*. Might disappear without notice.
- */
-class SingleShotTimerTaskSpecification implements TaskSpecification {
-  static const String specificationName = "dart.async.timer";
-
-  /** The duration after which the timer should invoke the [callback]. */
-  final Duration duration;
-
-  /** The callback that should be run when the timer triggers. */
-  // TODO(floitsch): the generic argument should be void.
-  final ZoneCallback<dynamic> callback;
-
-  SingleShotTimerTaskSpecification(this.duration, void this.callback());
-
-  @override
-  String get name => specificationName;
-
-  @override
-  bool get isOneShot => true;
-}
-
-/**
- * A task specification for a periodic timer.
- *
- * *Experimental*. Might disappear without notice.
- */
-class PeriodicTimerTaskSpecification implements TaskSpecification {
-  static const String specificationName = "dart.async.periodic-timer";
-
-  /** The interval at which the periodic timer should invoke the [callback]. */
-  final Duration duration;
-
-  /** The callback that should be run when the timer triggers. */
-  // TODO(floitsch): the first generic argument should be void.
-  final ZoneUnaryCallback<dynamic, Timer> callback;
-
-  PeriodicTimerTaskSpecification(
-      this.duration, void this.callback(Timer timer));
-
-  @override
-  String get name => specificationName;
-
-  @override
-  bool get isOneShot => false;
-}
-
 /**
  * A count-down timer that can be configured to fire once or repeatedly.
  *
@@ -125,15 +47,10 @@
     if (Zone.current == Zone.ROOT) {
       // No need to bind the callback. We know that the root's timer will
       // be invoked in the root zone.
-      return Timer._createTimer(duration, callback);
+      return Zone.current.createTimer(duration, callback);
     }
-    return Zone.current.createTimer(duration, callback);
-  }
-
-  factory Timer._task(Zone zone, Duration duration, void callback()) {
-    SingleShotTimerTaskSpecification specification =
-        new SingleShotTimerTaskSpecification(duration, callback);
-    return zone.createTask(_createSingleShotTimerTask, specification);
+    return Zone.current.createTimer(
+        duration, Zone.current.bindCallback(callback, runGuarded: true));
   }
 
   /**
@@ -153,65 +70,17 @@
    * scheduled for - even if the actual callback was delayed.
    */
   factory Timer.periodic(Duration duration,
-      void callback(Timer timer)) {
+                         void callback(Timer timer)) {
     if (Zone.current == Zone.ROOT) {
       // No need to bind the callback. We know that the root's timer will
       // be invoked in the root zone.
-      return Timer._createPeriodicTimer(duration, callback);
+      return Zone.current.createPeriodicTimer(duration, callback);
     }
-    return Zone.current.createPeriodicTimer(duration, callback);
-  }
-
-  factory Timer._periodicTask(Zone zone, Duration duration,
-      void callback(Timer timer)) {
-    PeriodicTimerTaskSpecification specification =
-        new PeriodicTimerTaskSpecification(duration, callback);
-    return zone.createTask(_createPeriodicTimerTask, specification);
-  }
-
-  static Timer _createSingleShotTimerTask(
-      SingleShotTimerTaskSpecification specification, Zone zone) {
-    ZoneCallback registeredCallback = identical(_ROOT_ZONE, zone)
-        ? specification.callback
-        : zone.registerCallback(specification.callback);
-
-    _TimerTask timerTask;
-
-    Timer nativeTimer = Timer._createTimer(specification.duration, () {
-      timerTask._zone.runTask(_runSingleShotCallback, timerTask, null);
-    });
-
-    timerTask = new _SingleShotTimerTask(nativeTimer, registeredCallback, zone);
-    return timerTask;
-  }
-
-  static void _runSingleShotCallback(_SingleShotTimerTask timerTask, Object _) {
-    timerTask._callback();
-  }
-
-  static Timer _createPeriodicTimerTask(
-      PeriodicTimerTaskSpecification specification, Zone zone) {
     // TODO(floitsch): the return type should be 'void', and the type
     // should be inferred.
-    ZoneUnaryCallback<dynamic, Timer> registeredCallback =
-        identical(_ROOT_ZONE, zone)
-        ? specification.callback
-        : zone.registerUnaryCallback/*<dynamic, Timer>*/(
-            specification.callback);
-
-    _TimerTask timerTask;
-
-    Timer nativeTimer =
-        Timer._createPeriodicTimer(specification.duration, (Timer _) {
-      timerTask._zone.runTask(_runPeriodicCallback, timerTask, null);
-    });
-
-    timerTask = new _PeriodicTimerTask(nativeTimer, registeredCallback, zone);
-    return timerTask;
-  }
-
-  static void _runPeriodicCallback(_PeriodicTimerTask timerTask, Object _) {
-    timerTask._callback(timerTask);
+    var boundCallback = Zone.current.bindUnaryCallback/*<dynamic, Timer>*/(
+        callback, runGuarded: true);
+    return Zone.current.createPeriodicTimer(duration, boundCallback);
   }
 
   /**
diff --git a/sdk/lib/async/zone.dart b/sdk/lib/async/zone.dart
index e0c3e4b..24f83f8 100644
--- a/sdk/lib/async/zone.dart
+++ b/sdk/lib/async/zone.dart
@@ -8,13 +8,6 @@
 typedef R ZoneUnaryCallback<R, T>(T arg);
 typedef R ZoneBinaryCallback<R, T1, T2>(T1 arg1, T2 arg2);
 
-/// *Experimental*. Might disappear without warning.
-typedef T TaskCreate<T, S extends TaskSpecification>(
-    S specification, Zone zone);
-/// *Experimental*. Might disappear without warning.
-typedef void TaskRun<T, A>(T task, A arg);
-
-
 // TODO(floitsch): we are abusing generic typedefs as typedefs for generic
 // functions.
 /*ABUSE*/
@@ -40,30 +33,18 @@
     Zone self, ZoneDelegate parent, Zone zone, R f(T1 arg1, T2 arg2));
 typedef AsyncError ErrorCallbackHandler(Zone self, ZoneDelegate parent,
     Zone zone, Object error, StackTrace stackTrace);
-/// *Experimental*. Might disappear without warning.
-/*ABUSE*/
-typedef T CreateTaskHandler<T, S extends TaskSpecification>(
-    Zone self, ZoneDelegate parent, Zone zone,
-    TaskCreate<T, S> create, S taskSpecification);
-/// *Experimental*. Might disappear without warning.
-/*ABUSE*/
-typedef void RunTaskHandler<T, A>(Zone self, ZoneDelegate parent, Zone zone,
-    TaskRun<T, A> run, T task, A arg);
 typedef void ScheduleMicrotaskHandler(
     Zone self, ZoneDelegate parent, Zone zone, void f());
-typedef void PrintHandler(
-    Zone self, ZoneDelegate parent, Zone zone, String line);
-typedef Zone ForkHandler(Zone self, ZoneDelegate parent, Zone zone,
-                         ZoneSpecification specification,
-                         Map zoneValues);
-
-// The following typedef declarations are used by functionality which
-// will be removed and replaced by tasksif the task experiment is successful.
 typedef Timer CreateTimerHandler(
     Zone self, ZoneDelegate parent, Zone zone, Duration duration, void f());
 typedef Timer CreatePeriodicTimerHandler(
     Zone self, ZoneDelegate parent, Zone zone,
     Duration period, void f(Timer timer));
+typedef void PrintHandler(
+    Zone self, ZoneDelegate parent, Zone zone, String line);
+typedef Zone ForkHandler(Zone self, ZoneDelegate parent, Zone zone,
+                         ZoneSpecification specification,
+                         Map zoneValues);
 
 /** Pair of error and stack trace. Returned by [Zone.errorCallback]. */
 class AsyncError implements Error {
@@ -75,41 +56,10 @@
   String toString() => '$error';
 }
 
-/**
- * A task specification contains the necessary information to create a task.
- *
- * See [Zone.createTask] for how a specification is used to create a task.
- *
- * Task specifications should be public and it should be possible to create
- * new instances as a user. That is, custom zones should be able to replace
- * an existing specification with a modified one.
- *
- * *Experimental*. This class might disappear without warning.
- */
-abstract class TaskSpecification {
-  /**
-   * Description of the task.
-   *
-   * This string is unused by the root-zone, but might be used for debugging,
-   * and testing. As such, it should be relatively unique in its category.
-   *
-   * As a general guideline we recommend: "package-name.library.action".
-   */
-  String get name;
-
-  /**
-   * Whether the scheduled task triggers at most once.
-   *
-   * If the task is not a one-shot task, it may need to be canceled to prevent
-   * further iterations of the task.
-   */
-  bool get isOneShot;
-}
 
 class _ZoneFunction<T extends Function> {
   final _Zone zone;
   final T function;
-
   const _ZoneFunction(this.zone, this.function);
 }
 
@@ -135,9 +85,6 @@
 abstract class ZoneSpecification {
   /**
    * Creates a specification with the provided handlers.
-   *
-   * The task-related parameters ([createTask] and [runTask]) are experimental
-   * and might be removed without warning.
    */
   const factory ZoneSpecification({
       HandleUncaughtErrorHandler handleUncaughtError,
@@ -149,11 +96,7 @@
       RegisterBinaryCallbackHandler registerBinaryCallback,
       ErrorCallbackHandler errorCallback,
       ScheduleMicrotaskHandler scheduleMicrotask,
-      CreateTaskHandler createTask,
-      RunTaskHandler runTask,
-      // TODO(floitsch): mark as deprecated once tasks are non-experimental.
       CreateTimerHandler createTimer,
-      // TODO(floitsch): mark as deprecated once tasks are non-experimental.
       CreatePeriodicTimerHandler createPeriodicTimer,
       PrintHandler print,
       ForkHandler fork
@@ -162,9 +105,6 @@
   /**
    * Creates a specification from [other] with the provided handlers overriding
    * the ones in [other].
-   *
-   * The task-related parameters ([createTask] and [runTask]) are experimental
-   * and might be removed without warning.
    */
   factory ZoneSpecification.from(ZoneSpecification other, {
       HandleUncaughtErrorHandler handleUncaughtError: null,
@@ -176,11 +116,7 @@
       RegisterBinaryCallbackHandler registerBinaryCallback: null,
       ErrorCallbackHandler errorCallback: null,
       ScheduleMicrotaskHandler scheduleMicrotask: null,
-      CreateTaskHandler createTask: null,
-      RunTaskHandler runTask: null,
-      // TODO(floitsch): mark as deprecated once tasks are non-experimental.
       CreateTimerHandler createTimer: null,
-      // TODO(floitsch): mark as deprecated once tasks are non-experimental.
       CreatePeriodicTimerHandler createPeriodicTimer: null,
       PrintHandler print: null,
       ForkHandler fork: null
@@ -196,14 +132,11 @@
       registerBinaryCallback: registerBinaryCallback ??
                               other.registerBinaryCallback,
       errorCallback: errorCallback ?? other.errorCallback,
-
-      createTask: createTask ?? other.createTask,
-      runTask: runTask ?? other.runTask,
-      print : print ?? other.print,
-      fork: fork ?? other.fork,
       scheduleMicrotask: scheduleMicrotask ?? other.scheduleMicrotask,
       createTimer : createTimer ?? other.createTimer,
-      createPeriodicTimer: createPeriodicTimer ?? other.createPeriodicTimer);
+      createPeriodicTimer: createPeriodicTimer ?? other.createPeriodicTimer,
+      print : print ?? other.print,
+      fork: fork ?? other.fork);
   }
 
   HandleUncaughtErrorHandler get handleUncaughtError;
@@ -215,17 +148,10 @@
   RegisterBinaryCallbackHandler get registerBinaryCallback;
   ErrorCallbackHandler get errorCallback;
   ScheduleMicrotaskHandler get scheduleMicrotask;
-  /// *Experimental*. Might disappear without warning.
-  CreateTaskHandler get createTask;
-  /// *Experimental*. Might disappear without warning.
-  RunTaskHandler get runTask;
+  CreateTimerHandler get createTimer;
+  CreatePeriodicTimerHandler get createPeriodicTimer;
   PrintHandler get print;
   ForkHandler get fork;
-
-  // TODO(floitsch): deprecate once tasks are non-experimental.
-  CreateTimerHandler get createTimer;
-  // TODO(floitsch): deprecate once tasks are non-experimental.
-  CreatePeriodicTimerHandler get createPeriodicTimer;
 }
 
 /**
@@ -246,14 +172,10 @@
     this.registerBinaryCallback: null,
     this.errorCallback: null,
     this.scheduleMicrotask: null,
-    this.createTask: null,
-    this.runTask: null,
-    this.print: null,
-    this.fork: null,
-    // TODO(floitsch): deprecate once tasks are non-experimental.
     this.createTimer: null,
-    // TODO(floitsch): deprecate once tasks are non-experimental.
-    this.createPeriodicTimer: null
+    this.createPeriodicTimer: null,
+    this.print: null,
+    this.fork: null
   });
 
   final HandleUncaughtErrorHandler handleUncaughtError;
@@ -265,15 +187,10 @@
   final RegisterBinaryCallbackHandler registerBinaryCallback;
   final ErrorCallbackHandler errorCallback;
   final ScheduleMicrotaskHandler scheduleMicrotask;
-  final CreateTaskHandler createTask;
-  final RunTaskHandler runTask;
+  final CreateTimerHandler createTimer;
+  final CreatePeriodicTimerHandler createPeriodicTimer;
   final PrintHandler print;
   final ForkHandler fork;
-
-  // TODO(floitsch): deprecate once tasks are non-experimental.
-  final CreateTimerHandler createTimer;
-  // TODO(floitsch): deprecate once tasks are non-experimental.
-  final CreatePeriodicTimerHandler createPeriodicTimer;
 }
 
 /**
@@ -300,23 +217,10 @@
       Zone zone, /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2));
   AsyncError errorCallback(Zone zone, Object error, StackTrace stackTrace);
   void scheduleMicrotask(Zone zone, void f());
-
-  /// *Experimental*. Might disappear without notice.
-  Object/*=T*/ createTask/*<T, S extends TaskSpecification>*/(
-      Zone zone, TaskCreate/*<T, S>*/ create,
-      TaskSpecification/*=S*/ specification);
-  /// *Experimental*. Might disappear without notice.
-  void runTask/*<T, A>*/(
-      Zone zone, TaskRun/*<T, A>*/ run, Object/*=T*/ task,
-      Object/*=A*/ argument);
-
+  Timer createTimer(Zone zone, Duration duration, void f());
+  Timer createPeriodicTimer(Zone zone, Duration period, void f(Timer timer));
   void print(Zone zone, String line);
   Zone fork(Zone zone, ZoneSpecification specification, Map zoneValues);
-
-  // TODO(floitsch): deprecate once tasks are non-experimental.
-  Timer createTimer(Zone zone, Duration duration, void f());
-  // TODO(floitsch): deprecate once tasks are non-experimental.
-  Timer createPeriodicTimer(Zone zone, Duration period, void f(Timer timer));
 }
 
 /**
@@ -507,102 +411,13 @@
   void scheduleMicrotask(void f());
 
   /**
-   * Creates a task in the current zone.
-   *
-   * A task represents an asynchronous operation or process that reports back
-   * through the event loop.
-   *
-   * This function allows the zone to intercept the initialization of the
-   * task while the [runTask] function is invoked when the task reports back.
-   *
-   * By default, in the root zone, the [create] function is invoked with the
-   * [specification] as argument. It returns a task object which is used for all
-   * future interactions between the zone and the task. The object is
-   * a unique instance representing the task. It is generally returned to
-   * whoever initiated the task.
-   * For example, the HTML library uses the returned [StreamSubscription] as
-   * task object when users register an event listener.
-   *
-   * Tasks are created when the program starts an operation that reports back
-   * through the event loop. For example, a timer or an HTTP request both
-   * return through the event loop and are therefore tasks.
-   *
-   * If the [create] function is not invoked (because a custom zone has
-   * replaced or intercepted it), then the operation is *not* started. This
-   * means that a custom zone can intercept tasks, like HTTP requests.
-   *
-   * A task goes through the following steps:
-   * - a user invokes a library function that should eventually return through
-   *   the event loop.
-   * - the library function creates a [TaskSpecification] that contains the
-   *   necessary information to start the operation, and invokes
-   *   `Zone.current.createTask` with the specification and a [create] closure.
-   *   The closure, when invoked, uses the specification to start the operation
-   *   (usually by interacting with the underlying system, or as a native
-   *   extension), and returns a task object that identifies the running task.
-   * - custom zones handle the request and (unless completely intercepted and
-   *   aborted), end up calling the root zone's [createTask] which runs the
-   *   provided `create` closure, which may have been replaced at this point.
-   * - later, the asynchronous operation returns through the event loop.
-   *   It invokes [Zone.runTask] on the zone in which the task should run
-   *   (and which was originally passed to the `create` function by
-   *   `createTask`). The [runTask] function receives the
-   *   task object, a `run` function and an argument. As before, custom zones
-   *   may intercept this call. Eventually (unless aborted), the `run` function
-   *   is invoked. This last step may happen multiple times for tasks that are
-   *   not oneshot tasks (see [ZoneSpecification.isOneShot]).
-   *
-   * Custom zones may replace the [specification] with a different one, thus
-   * modifying the task parameters. An operation that wishes to be an
-   * interceptable task must publicly specify the types that intercepting code
-   * sees:
-   * - The specification type (extending [TaskSpecification]) which holds the
-   *   information available when intercepting the `createTask` call.
-   * - The task object type, returned by `createTask` and [create]. This object
-   *   may simply be typed as [Object].
-   * - The argument type, if [runTask] takes a meaningful argument.
-   *
-   * *Experimental*. Might disappear without notice.
-   */
-  Object/*=T*/ createTask/*<T, S extends TaskSpecification>*/(
-      /*=T*/ create(TaskSpecification/*=S*/ specification, Zone zone),
-      TaskSpecification/*=S*/ specification);
-
-  /**
-   * Runs a task callback.
-   *
-   * This function is invoked when an operation, started through [createTask],
-   * generates an event.
-   *
-   * Generally, tasks schedule Dart code in the global event loop when the
-   * [createTask] function is invoked. Since the
-   * event loop does not expect any return value from the code it runs, the
-   * [runTask] function is a void function.
-   *
-   * The [task] object must be the same as the one created with [createTask].
-   *
-   * It is good practice that task operations provide a meaningful [argument],
-   * so that custom zones can interact with it. They might want to log or
-   * replace the argument before calling the [run] function.
-   *
-   * See [createTask].
-   *
-   * *Experimental*. Might disappear without notice.
-   */
-  void runTask/*<T, A>*/(
-      /*=T*/ run(/*=T*/ task, /*=A*/ argument), Object/*=T*/ task,
-      Object/*=A*/ argument);
-
-  /**
    * Creates a Timer where the callback is executed in this zone.
    */
-  // TODO(floitsch): deprecate once tasks are non-experimental.
   Timer createTimer(Duration duration, void callback());
 
   /**
    * Creates a periodic Timer where the callback is executed in this zone.
    */
-  // TODO(floitsch): deprecate once tasks are non-experimental.
   Timer createPeriodicTimer(Duration period, void callback(Timer timer));
 
   /**
@@ -708,7 +523,7 @@
     // TODO(floitsch): make this a generic method call on '<R>' once it's
     // supported. Remove the unnecessary cast.
     return handler(implZone, _parentDelegate(implZone), zone, f)
-        as dynamic/*=ZoneCallback<R>*/;
+        as Object/*=ZoneCallback<R>*/;
   }
 
   ZoneUnaryCallback/*<R, T>*/ registerUnaryCallback/*<R, T>*/(
@@ -719,7 +534,7 @@
     // TODO(floitsch): make this a generic method call on '<R, T>' once it's
     // supported. Remove the unnecessary cast.
     return handler(implZone, _parentDelegate(implZone), zone, f)
-        as dynamic/*=ZoneUnaryCallback<R, T>*/;
+        as Object/*=ZoneUnaryCallback<R, T>*/;
   }
 
   ZoneBinaryCallback/*<R, T1, T2>*/ registerBinaryCallback/*<R, T1, T2>*/(
@@ -730,7 +545,7 @@
     // TODO(floitsch): make this a generic method call on '<R, T1, T2>' once
     // it's supported. Remove the unnecessary cast.
     return handler(implZone, _parentDelegate(implZone), zone, f)
-        as dynamic/*=ZoneBinaryCallback<R, T1, T2>*/;
+        as Object/*=ZoneBinaryCallback<R, T1, T2>*/;
   }
 
   AsyncError errorCallback(Zone zone, Object error, StackTrace stackTrace) {
@@ -749,25 +564,18 @@
     handler(implZone, _parentDelegate(implZone), zone, f);
   }
 
-  Object/*=T*/ createTask/*<T, S extends TaskSpecification>*/(
-      Zone zone, TaskCreate/*<T, S>*/ create, TaskSpecification/*=S*/ specification) {
-    var implementation = _delegationTarget._createTask;
+  Timer createTimer(Zone zone, Duration duration, void f()) {
+    var implementation = _delegationTarget._createTimer;
     _Zone implZone = implementation.zone;
-    // TODO(floitsch): make the handler call a generic method call on '<T, S>'
-    // once it's supported. Remove the unnecessary cast.
-    var handler =
-        implementation.function as CreateTaskHandler/*<T, S>*/;
-    return handler(
-        implZone, _parentDelegate(implZone), zone, create, specification);
+    CreateTimerHandler handler = implementation.function;
+    return handler(implZone, _parentDelegate(implZone), zone, duration, f);
   }
 
-  void runTask/*<T, A>*/(Zone zone, TaskRun run, Object /*=T*/ task,
-      Object /*=A*/ argument) {
-    var implementation = _delegationTarget._runTask;
+  Timer createPeriodicTimer(Zone zone, Duration period, void f(Timer timer)) {
+    var implementation = _delegationTarget._createPeriodicTimer;
     _Zone implZone = implementation.zone;
-    RunTaskHandler handler = implementation.function;
-    // TODO(floitsch): make this a generic call on '<T, A>'.
-    handler(implZone, _parentDelegate(implZone), zone, run, task, argument);
+    CreatePeriodicTimerHandler handler = implementation.function;
+    return handler(implZone, _parentDelegate(implZone), zone, period, f);
   }
 
   void print(Zone zone, String line) {
@@ -785,22 +593,6 @@
     return handler(
         implZone, _parentDelegate(implZone), zone, specification, zoneValues);
   }
-
-  // TODO(floitsch): deprecate once tasks are non-experimental.
-  Timer createTimer(Zone zone, Duration duration, void f()) {
-    var implementation = _delegationTarget._createTimer;
-    _Zone implZone = implementation.zone;
-    CreateTimerHandler handler = implementation.function;
-    return handler(implZone, _parentDelegate(implZone), zone, duration, f);
-  }
-
-  // TODO(floitsch): deprecate once tasks are non-experimental.
-  Timer createPeriodicTimer(Zone zone, Duration period, void f(Timer timer)) {
-    var implementation = _delegationTarget._createPeriodicTimer;
-    _Zone implZone = implementation.zone;
-    CreatePeriodicTimerHandler handler = implementation.function;
-    return handler(implZone, _parentDelegate(implZone), zone, period, f);
-  }
 }
 
 
@@ -818,17 +610,11 @@
   _ZoneFunction<RegisterBinaryCallbackHandler> get _registerBinaryCallback;
   _ZoneFunction<ErrorCallbackHandler> get _errorCallback;
   _ZoneFunction<ScheduleMicrotaskHandler> get _scheduleMicrotask;
-  _ZoneFunction<CreateTaskHandler> get _createTask;
-  _ZoneFunction<RunTaskHandler> get _runTask;
+  _ZoneFunction<CreateTimerHandler> get _createTimer;
+  _ZoneFunction<CreatePeriodicTimerHandler> get _createPeriodicTimer;
   _ZoneFunction<PrintHandler> get _print;
   _ZoneFunction<ForkHandler> get _fork;
   _ZoneFunction<HandleUncaughtErrorHandler> get _handleUncaughtError;
-
-  // TODO(floitsch): deprecate once tasks are non-experimental.
-  _ZoneFunction<CreateTimerHandler> get _createTimer;
-  // TODO(floitsch): deprecate once tasks are non-experimental.
-  _ZoneFunction<CreatePeriodicTimerHandler> get _createPeriodicTimer;
-
   _Zone get parent;
   ZoneDelegate get _delegate;
   Map get _map;
@@ -850,17 +636,12 @@
   _ZoneFunction<RegisterBinaryCallbackHandler> _registerBinaryCallback;
   _ZoneFunction<ErrorCallbackHandler> _errorCallback;
   _ZoneFunction<ScheduleMicrotaskHandler> _scheduleMicrotask;
-  _ZoneFunction<CreateTaskHandler> _createTask;
-  _ZoneFunction<RunTaskHandler> _runTask;
+  _ZoneFunction<CreateTimerHandler> _createTimer;
+  _ZoneFunction<CreatePeriodicTimerHandler> _createPeriodicTimer;
   _ZoneFunction<PrintHandler> _print;
   _ZoneFunction<ForkHandler> _fork;
   _ZoneFunction<HandleUncaughtErrorHandler> _handleUncaughtError;
 
-  // TODO(floitsch): deprecate once tasks are non-experimental.
-  _ZoneFunction<CreateTimerHandler> _createTimer;
-  // TODO(floitsch): deprecate once tasks are non-experimental.
-  _ZoneFunction<CreatePeriodicTimerHandler> _createPeriodicTimer;
-
   // A cached delegate to this zone.
   ZoneDelegate _delegateCache;
 
@@ -911,14 +692,13 @@
         ? new _ZoneFunction<ScheduleMicrotaskHandler>(
             this, specification.scheduleMicrotask)
         : parent._scheduleMicrotask;
-    _createTask = (specification.createTask != null)
-        ? new _ZoneFunction<CreateTaskHandler>(
-            this, specification.createTask)
-        : parent._createTask;
-    _runTask = (specification.runTask != null)
-        ? new _ZoneFunction<RunTaskHandler>(
-            this, specification.runTask)
-        : parent._runTask;
+    _createTimer = (specification.createTimer != null)
+        ? new _ZoneFunction<CreateTimerHandler>(this, specification.createTimer)
+        : parent._createTimer;
+    _createPeriodicTimer = (specification.createPeriodicTimer != null)
+        ? new _ZoneFunction<CreatePeriodicTimerHandler>(
+            this, specification.createPeriodicTimer)
+        : parent._createPeriodicTimer;
     _print = (specification.print != null)
         ? new _ZoneFunction<PrintHandler>(this, specification.print)
         : parent._print;
@@ -929,16 +709,6 @@
         ? new _ZoneFunction<HandleUncaughtErrorHandler>(
             this, specification.handleUncaughtError)
         : parent._handleUncaughtError;
-
-    // Deprecated fields, once tasks are non-experimental.
-    _createTimer = (specification.createTimer != null)
-        ? new _ZoneFunction<CreateTimerHandler>(
-            this, specification.createTimer)
-        : parent._createTimer;
-    _createPeriodicTimer = (specification.createPeriodicTimer != null)
-        ? new _ZoneFunction<CreatePeriodicTimerHandler>(
-            this, specification.createPeriodicTimer)
-        : parent._createPeriodicTimer;
   }
 
   /**
@@ -1089,7 +859,7 @@
     // TODO(floitsch): make this a generic method call on '<R>' once it's
     // supported. Remove the unnecessary cast.
     return handler(implementation.zone, parentDelegate, this, callback)
-        as dynamic/*=ZoneCallback<R>*/;
+        as Object/*=ZoneCallback<R>*/;
   }
 
   ZoneUnaryCallback/*<R, T>*/ registerUnaryCallback/*<R, T>*/(
@@ -1101,7 +871,7 @@
     // TODO(floitsch): make this a generic method call on '<R, T>' once it's
     // supported. Remove the unnecessary cast.
     return handler(implementation.zone, parentDelegate, this, callback)
-        as dynamic/*=ZoneUnaryCallback<R, T>*/;
+        as Object/*=ZoneUnaryCallback<R, T>*/;
   }
 
   ZoneBinaryCallback/*<R, T1, T2>*/ registerBinaryCallback/*<R, T1, T2>*/(
@@ -1113,7 +883,7 @@
     // TODO(floitsch): make this a generic method call on '<R, T1, T2>' once
     // it's supported. Remove the unnecessary cast.
     return handler(implementation.zone, parentDelegate, this, callback)
-        as dynamic/*=ZoneBinaryCallback<R, T1, T2>*/;
+        as Object/*=ZoneBinaryCallback<R, T1, T2>*/;
   }
 
   AsyncError errorCallback(Object error, StackTrace stackTrace) {
@@ -1132,40 +902,9 @@
     assert(implementation != null);
     ZoneDelegate parentDelegate = _parentDelegate(implementation.zone);
     ScheduleMicrotaskHandler handler = implementation.function;
-    handler(implementation.zone, parentDelegate, this, f);
+    return handler(implementation.zone, parentDelegate, this, f);
   }
 
-  Object/*=T*/ createTask/*<T, S extends TaskSpecification>*/(
-      TaskCreate/*<T, S>*/ create, TaskSpecification/*=S*/ specification) {
-    var implementation = this._createTask;
-    ZoneDelegate parentDelegate = _parentDelegate(implementation.zone);
-    // TODO(floitsch): make the handler call a generic method call on '<T, S>'
-    // once it's supported. Remove the unnecessary cast.
-    var handler =
-        implementation.function as CreateTaskHandler/*<T, S>*/;
-    return handler(
-        implementation.zone, parentDelegate, this, create, specification);
-  }
-
-  void runTask/*<T, A>*/(
-      TaskRun/*<T, A>*/ run, Object/*=T*/ task, Object/*=A*/ arg1) {
-    var implementation = this._runTask;
-    ZoneDelegate parentDelegate = _parentDelegate(implementation.zone);
-    RunTaskHandler handler = implementation.function;
-    // TODO(floitsch): make this a generic method call on '<T, A>' once it's
-    // supported.
-    handler(implementation.zone, parentDelegate, this, run, task, arg1);
-  }
-
-  void print(String line) {
-    var implementation = this._print;
-    assert(implementation != null);
-    ZoneDelegate parentDelegate = _parentDelegate(implementation.zone);
-    PrintHandler handler = implementation.function;
-    return handler(implementation.zone, parentDelegate, this, line);
-  }
-
-  // TODO(floitsch): deprecate once tasks are non-experimental.
   Timer createTimer(Duration duration, void f()) {
     var implementation = this._createTimer;
     assert(implementation != null);
@@ -1174,7 +913,6 @@
     return handler(implementation.zone, parentDelegate, this, duration, f);
   }
 
-  // TODO(floitsch): deprecate once tasks are non-experimental.
   Timer createPeriodicTimer(Duration duration, void f(Timer timer)) {
     var implementation = this._createPeriodicTimer;
     assert(implementation != null);
@@ -1183,6 +921,14 @@
     return handler(
         implementation.zone, parentDelegate, this, duration, f);
   }
+
+  void print(String line) {
+    var implementation = this._print;
+    assert(implementation != null);
+    ZoneDelegate parentDelegate = _parentDelegate(implementation.zone);
+    PrintHandler handler = implementation.function;
+    return handler(implementation.zone, parentDelegate, this, line);
+  }
 }
 
 /*=R*/ _rootHandleUncaughtError/*<R>*/(
@@ -1260,39 +1006,22 @@
   _scheduleAsyncCallback(f);
 }
 
-Object/*=T*/ _rootCreateTask/*<T, S extends TaskSpecification>*/(
-    Zone self, ZoneDelegate parent, Zone zone,
-    TaskCreate/*<T, S>*/ create, TaskSpecification/*=S*/ specification) {
-  return create(specification, zone);
-}
-
-void _rootRunTask/*<T, A>*/(
-    Zone self, ZoneDelegate parent, Zone zone, TaskRun run/*<T, A>*/,
-    Object/*=T*/ task, Object/*=A*/ arg) {
-  if (Zone._current == zone) {
-    run(task, arg);
-    return;
-  }
-
-  Zone old = Zone._enter(zone);
-  try {
-    run(task, arg);
-  } catch (e, s) {
-    zone.handleUncaughtError/*<dynamic>*/(e, s);
-  } finally {
-    Zone._leave(old);
-  }
-}
-
 Timer _rootCreateTimer(Zone self, ZoneDelegate parent, Zone zone,
                        Duration duration, void callback()) {
-  return new Timer._task(zone, duration, callback);
+  if (!identical(_ROOT_ZONE, zone)) {
+    callback = zone.bindCallback(callback);
+  }
+  return Timer._createTimer(duration, callback);
 }
 
 Timer _rootCreatePeriodicTimer(
     Zone self, ZoneDelegate parent, Zone zone,
     Duration duration, void callback(Timer timer)) {
-  return new Timer._periodicTask(zone, duration, callback);
+  if (!identical(_ROOT_ZONE, zone)) {
+    // TODO(floitsch): the return type should be 'void'.
+    callback = zone.bindUnaryCallback/*<dynamic, Timer>*/(callback);
+  }
+  return Timer._createPeriodicTimer(duration, callback);
 }
 
 void _rootPrint(Zone self, ZoneDelegate parent, Zone zone, String line) {
@@ -1353,10 +1082,10 @@
   _ZoneFunction<ScheduleMicrotaskHandler> get _scheduleMicrotask =>
       const _ZoneFunction<ScheduleMicrotaskHandler>(
           _ROOT_ZONE, _rootScheduleMicrotask);
-  _ZoneFunction<CreateTaskHandler> get _createTask =>
-      const _ZoneFunction<CreateTaskHandler>(_ROOT_ZONE, _rootCreateTask);
-  _ZoneFunction<RunTaskHandler> get _runTask =>
-      const _ZoneFunction<RunTaskHandler>(_ROOT_ZONE, _rootRunTask);
+  _ZoneFunction<CreateTimerHandler> get _createTimer =>
+      const _ZoneFunction<CreateTimerHandler>(_ROOT_ZONE, _rootCreateTimer);
+  _ZoneFunction<CreatePeriodicTimerHandler> get _createPeriodicTimer =>
+      const _ZoneFunction<CreatePeriodicTimerHandler>(_ROOT_ZONE, _rootCreatePeriodicTimer);
   _ZoneFunction<PrintHandler> get _print =>
       const _ZoneFunction<PrintHandler>(_ROOT_ZONE, _rootPrint);
   _ZoneFunction<ForkHandler> get _fork =>
@@ -1365,14 +1094,6 @@
       const _ZoneFunction<HandleUncaughtErrorHandler>(
           _ROOT_ZONE, _rootHandleUncaughtError);
 
-  // TODO(floitsch): deprecate once tasks are non-experimental.
-  _ZoneFunction<CreateTimerHandler> get _createTimer =>
-      const _ZoneFunction<CreateTimerHandler>(_ROOT_ZONE, _rootCreateTimer);
-  // TODO(floitsch): deprecate once tasks are non-experimental.
-  _ZoneFunction<CreatePeriodicTimerHandler> get _createPeriodicTimer =>
-      const _ZoneFunction<CreatePeriodicTimerHandler>(
-          _ROOT_ZONE, _rootCreatePeriodicTimer);
-
   // The parent zone.
   _Zone get parent => null;
 
@@ -1504,16 +1225,6 @@
     _rootScheduleMicrotask(null, null, this, f);
   }
 
-  Object/*=T*/ createTask/*<T, S extends TaskSpecification>*/(
-      TaskCreate/*<T, S>*/ create, TaskSpecification/*=S*/ specification) {
-    return _rootCreateTask/*<T, S>*/(null, null, this, create, specification);
-  }
-
-  void runTask/*<T, A>*/(
-      TaskRun/*<T, A>*/ run, Object/*=T*/ task, Object/*=A*/ arg) {
-    _rootRunTask/*<T, A>*/(null, null, this, run, task, arg);
-  }
-
   Timer createTimer(Duration duration, void f()) {
     return Timer._createTimer(duration, f);
   }
diff --git a/sdk/lib/core/uri.dart b/sdk/lib/core/uri.dart
index 17f290d..b43b3ad 100644
--- a/sdk/lib/core/uri.dart
+++ b/sdk/lib/core/uri.dart
@@ -4207,7 +4207,7 @@
     if (fragment != null) {
       fragment = _Uri._makeFragment(fragment, 0, fragment.length);
     } else if (_fragmentStart < _uri.length) {
-      fragment = _uri.substring(_fragmentStart);
+      fragment = _uri.substring(_fragmentStart + 1);
     }
 
     return new _Uri._internal(
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index c9cd5cb..0bc3749 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -19240,109 +19240,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/**
- * A task specification for HTTP requests.
- *
- * This specification is not available when an HTTP request is sent through
- * direct use of [HttpRequest.send]. See [HttpRequestSendTaskSpecification].
- *
- * A task created from this specification is a `Future<HttpRequest>`.
- *
- * *Experimental*. This class may disappear without notice.
- */
-class HttpRequestTaskSpecification extends TaskSpecification {
-  /// The URL of the request.
-  final String url;
-
-  /// The HTTP request method.
-  ///
-  /// By default (when `null`) this is a `"GET"` request. Alternatively, the
-  /// method can be `"POST"`, `"PUT"`, `"DELETE"`, etc.
-  final String method;
-
-  /// Whether the request should send credentials. Credentials are only useful
-  /// for cross-origin requests.
-  ///
-  /// See [HttpRequest.request] for more information.
-  final bool withCredentials;
-
-  /// The desired response format.
-  ///
-  /// Supported types are:
-  /// - `""`: (same as `"text"`),
-  /// - `"arraybuffer"`,
-  /// - `"blob"`,
-  /// - `"document"`,
-  /// - `"json"`,
-  /// - `"text"`
-  ///
-  /// When no value is provided (when equal to `null`) defaults to `""`.
-  final String responseType;
-
-  /// The desired MIME type.
-  ///
-  /// This overrides the default MIME type which is set up to transfer textual
-  /// data.
-  final String mimeType;
-
-  /// The request headers that should be sent with the request.
-  final Map<String, String> requestHeaders;
-
-  /// The data that is sent with the request.
-  ///
-  /// When data is provided (the value is not `null`), it must be a
-  /// [ByteBuffer], [Blob], [Document], [String], or [FormData].
-  final dynamic sendData;
-
-  /// The function that is invoked on progress updates. This function is
-  /// registered as an event listener on the created [HttpRequest] object, and
-  /// thus has its own task. Further invocations of the progress function do
-  /// *not* use the HTTP request task as task object.
-  ///
-  /// Creating an HTTP request automatically registers the on-progress listener.
-  final ZoneUnaryCallback<dynamic, ProgressEvent> onProgress;
-
-  HttpRequestTaskSpecification(this.url,
-      {String this.method, bool this.withCredentials, String this.responseType,
-      String this.mimeType, Map<String, String> this.requestHeaders,
-      this.sendData,
-      void this.onProgress(ProgressEvent e)});
-
-  String get name => "dart.html.http-request";
-  bool get isOneShot => true;
-}
-
-/**
- * A task specification for HTTP requests that are initiated through a direct
- * invocation of [HttpRequest.send].
- *
- * This specification serves as signal to zones that an HTTP request has been
- * initiated. The created task is the [request] object itself, and
- * no callback is ever executed in this task.
- *
- * Note that event listeners on the HTTP request are also registered in the
- * zone (although with their own task creations), and that a zone can thus
- * detect when the HTTP request returns.
- *
- * HTTP requests that are initiated through `request` methods don't use
- * this class but use [HttpRequestTaskSpecification].
- *
- * *Experimental*. This class may disappear without notice.
- */
-class HttpRequestSendTaskSpecification extends TaskSpecification {
-  final HttpRequest request;
-  final dynamic sendData;
-
-  HttpRequestSendTaskSpecification(this.request, this.sendData);
-
-  String get name => "dart.html.http-request-send";
-
-  /**
-   * No callback is ever executed in an HTTP request send task.
-   */
-  bool get isOneShot => false;
-}
-
  /**
   * A client-side XHR request for getting data from a URL,
   * formally known as XMLHttpRequest.
@@ -19531,34 +19428,7 @@
       {String method, bool withCredentials, String responseType,
       String mimeType, Map<String, String> requestHeaders, sendData,
       void onProgress(ProgressEvent e)}) {
-    var spec = new HttpRequestTaskSpecification(
-        url, method: method,
-        withCredentials: withCredentials,
-        responseType: responseType,
-        mimeType: mimeType,
-        requestHeaders: requestHeaders,
-        sendData: sendData,
-        onProgress: onProgress);
-
-    if (identical(Zone.current, Zone.ROOT)) {
-      return _createHttpRequestTask(spec, null);
-    }
-    return Zone.current.createTask(_createHttpRequestTask, spec);
-  }
-
-  static Future<HttpRequest> _createHttpRequestTask(
-      HttpRequestTaskSpecification spec, Zone zone) {
-    String url = spec.url;
-    String method = spec.method;
-    bool withCredentials = spec.withCredentials;
-    String responseType = spec.responseType;
-    String mimeType = spec.mimeType;
-    Map<String, String> requestHeaders = spec.requestHeaders;
-    var sendData = spec.sendData;
-    var onProgress = spec.onProgress;
-
     var completer = new Completer<HttpRequest>();
-    var task = completer.future;
 
     var xhr = new HttpRequest();
     if (method == null) {
@@ -19598,42 +19468,23 @@
       // redirect case will be handled by the browser before it gets to us,
       // so if we see it we should pass it through to the user.
       var unknownRedirect = xhr.status > 307 && xhr.status < 400;
-
-      var isSuccessful = accepted || fileUri || notModified || unknownRedirect;
-
-      if (zone == null && isSuccessful) {
+      
+      if (accepted || fileUri || notModified || unknownRedirect) {
         completer.complete(xhr);
-      } else if (zone == null) {
-        completer.completeError(e);
-      } else if (isSuccessful) {
-        zone.runTask((task, value) {
-          completer.complete(value);
-        }, task, xhr);
       } else {
-        zone.runTask((task, error) {
-          completer.completeError(error);
-        }, task, e);
+        completer.completeError(e);
       }
     });
 
-    if (zone == null) {
-      xhr.onError.listen(completer.completeError);
-    } else {
-      xhr.onError.listen((error) {
-        zone.runTask((task, error) {
-          completer.completeError(error);
-        }, task, error);
-      });
-    }
+    xhr.onError.listen(completer.completeError);
 
     if (sendData != null) {
-      // TODO(floitsch): should we go through 'send()' and have nested tasks?
-      xhr._send(sendData);
+      xhr.send(sendData);
     } else {
-      xhr._send();
+      xhr.send();
     }
 
-    return task;
+    return completer.future;
   }
 
   /**
@@ -19687,9 +19538,6 @@
         return xhr.responseText;
       });
     }
-    // TODO(floitsch): the following code doesn't go through task zones.
-    // Since 'XDomainRequest' is an IE9 feature we should probably just remove
-    // it.
     var completer = new Completer<String>();
     if (method == null) {
       method = 'GET';
@@ -19768,43 +19616,13 @@
    *
    * Note: Most simple HTTP requests can be accomplished using the [getString],
    * [request], [requestCrossOrigin], or [postFormData] methods. Use of this
-   * `open` method is intended only for more complex HTTP requests where
+   * `open` method is intended only for more complext HTTP requests where
    * finer-grained control is needed.
    */
   @DomName('XMLHttpRequest.open')
   @DocsEditable()
   void open(String method, String url, {bool async, String user, String password}) native;
 
-  /**
-   * Sends the request with any given `data`.
-   *
-   * Note: Most simple HTTP requests can be accomplished using the [getString],
-   * [request], [requestCrossOrigin], or [postFormData] methods. Use of this
-   * `send` method is intended only for more complex HTTP requests where
-   * finer-grained control is needed.
-   *
-   * ## Other resources
-   *
-   * * [XMLHttpRequest.send](https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#send%28%29)
-   *   from MDN.
-   */
-  @DomName('XMLHttpRequest.send')
-  @DocsEditable()
-  void send([body_OR_data]) {
-    if (identical(Zone.current, Zone.ROOT)) {
-      _send(body_OR_data);
-    } else {
-      Zone.current.createTask(_createHttpRequestSendTask,
-          new HttpRequestSendTaskSpecification(this, body_OR_data));
-    }
-  }
-
-  static HttpRequest _createHttpRequestSendTask(
-      HttpRequestSendTaskSpecification spec, Zone zone) {
-    spec.request._send(spec.sendData);
-    return spec.request;
-  }
-
   // To suppress missing implicit constructor warnings.
   factory HttpRequest._() { throw new UnsupportedError("Not supported"); }
 
@@ -20075,13 +19893,12 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   void overrideMimeType(String mime) native;
 
-  @JSName('send')
   /**
    * Send the request with any given `data`.
    *
    * Note: Most simple HTTP requests can be accomplished using the [getString],
    * [request], [requestCrossOrigin], or [postFormData] methods. Use of this
-   * `send` method is intended only for more complex HTTP requests where
+   * `send` method is intended only for more complext HTTP requests where
    * finer-grained control is needed.
    *
    * ## Other resources
@@ -20091,7 +19908,7 @@
    */
   @DomName('XMLHttpRequest.send')
   @DocsEditable()
-  void _send([body_OR_data]) native;
+  void send([body_OR_data]) native;
 
   /**
    * Sets the value of an HTTP requst header.
@@ -34668,99 +34485,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-typedef void RemoveFrameRequestMapping(int id);
-
-/**
- * The task object representing animation-frame requests.
- *
- * For historical reasons, [Window.requestAnimationFrame] returns an integer
- * to users. However, zone tasks must be unique objects, and an integer can
- * therefore not be used as task object. The [Window] class thus keeps a mapping
- * from the integer ID to the corresponding task object. All zone related
- * operations work on this task object, whereas users of
- * [Window.requestAnimationFrame] only see the integer ID.
- *
- * Since this mapping takes up space, it must be removed when the
- * animation-frame task has triggered. The default implementation does this
- * automatically, but intercepting implementations of `requestAnimationFrame`
- * must make sure to call the [AnimationFrameTask.removeMapping]
- * function that is provided in the task specification.
- *
- * *Experimental*. This class may disappear without notice.
- */
-abstract class AnimationFrameTask {
-  /** The ID that is returned to users. */
-  int get id;
-
-  /** The zone in which the task will run. */
-  Zone get zone;
-
-  /**
-   * Cancels the animation-frame request.
-   *
-   * A call to [Window.cancelAnimationFrame] with an `id` argument equal to [id]
-   * forwards the request to this function.
-   *
-   * Zones that intercept animation-frame requests implement this method so
-   * that they can react to cancelation requests.
-   */
-  void cancel(Window window);
-
-  /**
-   * Maps animation-frame request IDs to their task objects.
-   */
-  static final Map<int, _AnimationFrameTask> _tasks = {};
-
-  /**
-   * Removes the mapping from [id] to [AnimationFrameTask].
-   *
-   * This function must be invoked by user-implemented animation-frame
-   * tasks, before running [callback].
-   *
-   * See [AnimationFrameTask].
-   */
-  static void removeMapping(int id) {
-    _tasks.remove(id);
-  }
-}
-
-class _AnimationFrameTask implements AnimationFrameTask {
-  final int id;
-  final Zone zone;
-  final FrameRequestCallback _callback;
-
-  _AnimationFrameTask(this.id, this.zone, this._callback);
-
-  void cancel(Window window) {
-    window._cancelAnimationFrame(this.id);
-  }
-}
-
-/**
- * The task specification for an animation-frame request.
- *
- * *Experimental*. This class may disappear without notice.
- */
-class AnimationFrameRequestSpecification implements TaskSpecification {
-  /**
-   * The window on which [Window.requestAnimationFrame] was invoked.
-   */
-  final Window window;
-
-  /**
-   * The callback that is executed when the animation-frame is ready.
-   *
-   * Note that the callback hasn't been registered in any zone when the `create`
-   * function (passed to [Zone.createTask]) is invoked.
-   */
-  final FrameRequestCallback callback;
-
-  AnimationFrameRequestSpecification(this.window, this.callback);
-
-  String get name => "dart.html.request-animation-frame";
-  bool get isOneShot => true;
-}
-
 @DocsEditable()
 /**
  * Top-level container for the current browser tab or window.
@@ -34816,7 +34540,9 @@
    */
   Future<num> get animationFrame {
     var completer = new Completer<num>.sync();
-    requestAnimationFrame(completer.complete);
+    requestAnimationFrame((time) {
+      completer.complete(time);
+    });
     return completer.future;
   }
 
@@ -34880,7 +34606,6 @@
     JS('void', '#.location = #', this, value);
   }
 
-
   /**
    * Called to draw an animation frame and then request the window to repaint
    * after [callback] has finished (creating the animation).
@@ -34900,30 +34625,7 @@
   @DomName('Window.requestAnimationFrame')
   int requestAnimationFrame(FrameRequestCallback callback) {
     _ensureRequestAnimationFrame();
-    if (identical(Zone.current, Zone.ROOT)) {
-      return _requestAnimationFrame(callback);
-    }
-    var spec = new AnimationFrameRequestSpecification(this, callback);
-    var task = Zone.current.createTask/*<AnimationFrameTask>*/(
-        _createAnimationFrameTask, spec);
-    AnimationFrameTask._tasks[task.id] = task;
-    return task.id;
-  }
-
-  static _AnimationFrameTask _createAnimationFrameTask(
-      AnimationFrameRequestSpecification spec, Zone zone) {
-    var task;
-    var id = spec.window._requestAnimationFrame((num time) {
-      AnimationFrameTask.removeMapping(task.id);
-      zone.runTask(_runAnimationFrame, task, time);
-    });
-    var callback = zone.registerUnaryCallback(spec.callback);
-    task = new _AnimationFrameTask(id, zone, callback);
-    return task;
-  }
-
-  static void _runAnimationFrame(_AnimationFrameTask task, num time) {
-    task._callback(time);
+    return _requestAnimationFrame(_wrapZone/*<num, dynamic>*/(callback));
   }
 
   /**
@@ -34934,16 +34636,9 @@
    * * [Window.cancelAnimationFrame](https://developer.mozilla.org/en-US/docs/Web/API/Window.cancelAnimationFrame)
    *   from MDN.
    */
-  @DomName('Window.cancelAnimationFrame')
   void cancelAnimationFrame(int id) {
     _ensureRequestAnimationFrame();
-    var task = AnimationFrameTask._tasks.remove(id);
-    if (task == null) {
-      // Assume that the animation frame request wasn't intercepted by a zone.
-      _cancelAnimationFrame(id);
-      return;
-    }
-    task.cancel(this);
+    _cancelAnimationFrame(id);
   }
 
   @JSName('requestAnimationFrame')
@@ -34997,6 +34692,7 @@
   @DomName('Window.console')
   Console get console => Console._safeConsole;
 
+
   /**
    * Access a sandboxed file system of the specified `size`. If `persistent` is
    * true, the application will request permission from the user to create
@@ -40268,41 +39964,6 @@
   StreamSubscription<T> capture(void onData(T event));
 }
 
-/// Task specification for DOM Events.
-///
-/// *Experimental*. May disappear without notice.
-class EventSubscriptionSpecification<T extends Event>
-    implements TaskSpecification {
-  @override
-  final String name;
-  @override
-  final bool isOneShot;
-
-  final EventTarget target;
-  /// The event-type of the event. For example 'click' for click events.
-  final String eventType;
-  // TODO(floitsch): the first generic argument should be 'void'.
-  final ZoneUnaryCallback<dynamic, T> onData;
-  final bool useCapture;
-
-  EventSubscriptionSpecification({this.name, this.isOneShot, this.target,
-      this.eventType, void this.onData(T event), this.useCapture});
-
-  /// Returns a copy of this instance, with every non-null argument replaced
-  /// by the given value.
-  EventSubscriptionSpecification<T> replace(
-      {String name, bool isOneShot, EventTarget target,
-       String eventType, void onData(T event), bool useCapture}) {
-    return new EventSubscriptionSpecification<T>(
-        name: name ?? this.name,
-        isOneShot: isOneShot ?? this.isOneShot,
-        target: target ?? this.target,
-        eventType: eventType ?? this.eventType,
-        onData: onData ?? this.onData,
-        useCapture: useCapture ?? this.useCapture);
-  }
-}
-
 /**
  * Adapter for exposing DOM events as Dart streams.
  */
@@ -40310,16 +39971,8 @@
   final EventTarget _target;
   final String _eventType;
   final bool _useCapture;
-  /// The name that is used in the task specification.
-  final String _name;
-  /// Whether the stream can trigger multiple times.
-  final bool _isOneShot;
 
-  _EventStream(this._target, String eventType, this._useCapture,
-      {String name, bool isOneShot: false})
-      : _eventType = eventType,
-        _isOneShot = isOneShot,
-        _name = name ?? "dart.html.event.$eventType";
+  _EventStream(this._target, this._eventType, this._useCapture);
 
   // DOM events are inherently multi-subscribers.
   Stream<T> asBroadcastStream({void onListen(StreamSubscription<T> subscription),
@@ -40327,31 +39980,13 @@
       => this;
   bool get isBroadcast => true;
 
-  StreamSubscription<T> _listen(
-      void onData(T event), {bool useCapture}) {
-
-    if (identical(Zone.current, Zone.ROOT)) {
-      return new _EventStreamSubscription<T>(
-          this._target, this._eventType, onData, this._useCapture,
-          Zone.current);
-    }
-
-    var specification = new EventSubscriptionSpecification<T>(
-        name: this._name, isOneShot: this._isOneShot,
-        target: this._target, eventType: this._eventType,
-        onData: onData, useCapture: useCapture);
-    // We need to wrap the _createStreamSubscription call, since a tear-off
-    // would not bind the generic type 'T'.
-    return Zone.current.createTask((spec, Zone zone) {
-      return _createStreamSubscription/*<T>*/(spec, zone);
-    }, specification);
-  }
-
   StreamSubscription<T> listen(void onData(T event),
       { Function onError,
         void onDone(),
         bool cancelOnError}) {
-    return _listen(onData, useCapture: this._useCapture);
+
+    return new _EventStreamSubscription<T>(
+        this._target, this._eventType, onData, this._useCapture);
   }
 }
 
@@ -40366,9 +40001,8 @@
  */
 class _ElementEventStreamImpl<T extends Event> extends _EventStream<T>
     implements ElementStream<T> {
-  _ElementEventStreamImpl(target, eventType, useCapture,
-      {String name, bool isOneShot: false}) :
-      super(target, eventType, useCapture, name: name, isOneShot: isOneShot);
+  _ElementEventStreamImpl(target, eventType, useCapture) :
+      super(target, eventType, useCapture);
 
   Stream<T> matches(String selector) => this.where(
       (event) => _matchesWithAncestors(event, selector)).map((e) {
@@ -40376,9 +40010,9 @@
         return e;
       });
 
-  StreamSubscription<T> capture(void onData(T event)) {
-    return _listen(onData, useCapture: true);
-  }
+  StreamSubscription<T> capture(void onData(T event)) =>
+    new _EventStreamSubscription<T>(
+        this._target, this._eventType, onData, true);
 }
 
 /**
@@ -40427,13 +40061,7 @@
   bool get isBroadcast => true;
 }
 
-StreamSubscription/*<T>*/ _createStreamSubscription/*<T>*/(
-    EventSubscriptionSpecification/*<T>*/ spec, Zone zone) {
-  return new _EventStreamSubscription/*<T>*/(spec.target, spec.eventType,
-      spec.onData, spec.useCapture, zone);
-}
-
-// We would like this to just be EventListener<T> but that typedef cannot
+// We would like this to just be EventListener<T> but that typdef cannot
 // use generics until dartbug/26276 is fixed.
 typedef _EventListener<T extends Event>(T event);
 
@@ -40442,19 +40070,15 @@
   EventTarget _target;
   final String _eventType;
   EventListener _onData;
-  EventListener _domCallback;
   final bool _useCapture;
-  final Zone _zone;
 
   // TODO(jacobr): for full strong mode correctness we should write
-  // _onData = onData == null ? null : _wrapZone/*<dynamic, Event>*/((e) => onData(e as T))
+  // _onData = onData == null ? null : _wrapZone/*<Event, dynamic>*/((e) => onData(e as T))
   // but that breaks 114 co19 tests as well as multiple html tests as it is reasonable
   // to pass the wrong type of event object to an event listener as part of a
   // test.
   _EventStreamSubscription(this._target, this._eventType, void onData(T event),
-      this._useCapture, Zone zone)
-      : _zone = zone,
-        _onData = _registerZone/*<dynamic, Event>*/(zone, onData) {
+      this._useCapture) : _onData = _wrapZone/*<Event, dynamic>*/(onData) {
     _tryResume();
   }
 
@@ -40476,7 +40100,7 @@
     }
     // Remove current event listener.
     _unlisten();
-    _onData = _registerZone/*<dynamic, Event>*/(_zone, handleData);
+    _onData = _wrapZone/*<Event, dynamic>*/(handleData);
     _tryResume();
   }
 
@@ -40505,25 +40129,14 @@
   }
 
   void _tryResume() {
-    if (_onData == null || isPaused) return;
-    if (identical(_zone, Zone.ROOT)) {
-      _domCallback = _onData;
-    } else {
-      _domCallback = (event) {
-        _zone.runTask(_runEventNotification, this, event);
-      };
+    if (_onData != null && !isPaused) {
+      _target.addEventListener(_eventType, _onData, _useCapture);
     }
-    _target.addEventListener(_eventType, _domCallback, _useCapture);
-  }
-
-  static void _runEventNotification/*<T>*/(
-      _EventStreamSubscription/*<T>*/ subscription, /*=T*/ event) {
-    subscription._onData(event);
   }
 
   void _unlisten() {
     if (_onData != null) {
-      _target.removeEventListener(_eventType, _domCallback, _useCapture);
+      _target.removeEventListener(_eventType, _onData, _useCapture);
     }
   }
 
@@ -43757,26 +43370,31 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-ZoneUnaryCallback/*<R, T>*/ _registerZone/*<R, T>*/(Zone zone,
-    ZoneUnaryCallback/*<R, T>*/ callback) {
-  // For performance reasons avoid registering if we are in the root zone.
-  if (identical(zone, Zone.ROOT)) return callback;
-  if (callback == null) return null;
-  return zone.registerUnaryCallback(callback);
-}
+// TODO(jacobr): remove these typedefs when dart:async supports generic types.
+typedef R _wrapZoneCallback<A, R>(A a);
+typedef R _wrapZoneBinaryCallback<A, B, R>(A a, B b);
 
-ZoneUnaryCallback/*<R, T>*/ _wrapZone/*<R, T>*/(ZoneUnaryCallback/*<R, T>*/ callback) {
+_wrapZoneCallback/*<A, R>*/ _wrapZone/*<A, R>*/(_wrapZoneCallback/*<A, R>*/ callback) {
   // For performance reasons avoid wrapping if we are in the root zone.
-  if (identical(Zone.current, Zone.ROOT)) return callback;
+  if (Zone.current == Zone.ROOT) return callback;
   if (callback == null) return null;
-  return Zone.current.bindUnaryCallback(callback, runGuarded: true);
+  // TODO(jacobr): we cast to _wrapZoneCallback/*<A, R>*/ to hack around missing
+  // generic method support in zones.
+  // ignore: STRONG_MODE_DOWN_CAST_COMPOSITE
+  _wrapZoneCallback/*<A, R>*/ wrapped =
+      Zone.current.bindUnaryCallback(callback, runGuarded: true);
+  return wrapped;
 }
 
-ZoneBinaryCallback/*<R, A, B>*/ _wrapBinaryZone/*<R, A, B>*/(
-    ZoneBinaryCallback/*<R, A, B>*/ callback) {
-  if (identical(Zone.current, Zone.ROOT)) return callback;
+_wrapZoneBinaryCallback/*<A, B, R>*/ _wrapBinaryZone/*<A, B, R>*/(_wrapZoneBinaryCallback/*<A, B, R>*/ callback) {
+  if (Zone.current == Zone.ROOT) return callback;
   if (callback == null) return null;
-  return Zone.current.bindBinaryCallback(callback, runGuarded: true);
+  // We cast to _wrapZoneBinaryCallback/*<A, B, R>*/ to hack around missing
+  // generic method support in zones.
+  // ignore: STRONG_MODE_DOWN_CAST_COMPOSITE
+  _wrapZoneBinaryCallback/*<A, B, R>*/ wrapped =
+      Zone.current.bindBinaryCallback(callback, runGuarded: true);
+  return wrapped;
 }
 
 /**
diff --git a/sdk/lib/html/dartium/html_dartium.dart b/sdk/lib/html/dartium/html_dartium.dart
index b9da2c4..bc92d6d 100644
--- a/sdk/lib/html/dartium/html_dartium.dart
+++ b/sdk/lib/html/dartium/html_dartium.dart
@@ -20997,109 +20997,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-/**
- * A task specification for HTTP requests.
- *
- * This specification is not available when an HTTP request is sent through
- * direct use of [HttpRequest.send]. See [HttpRequestSendTaskSpecification].
- *
- * A task created from this specification is a `Future<HttpRequest>`.
- *
- * *Experimental*. This class may disappear without notice.
- */
-class HttpRequestTaskSpecification extends TaskSpecification {
-  /// The URL of the request.
-  final String url;
-
-  /// The HTTP request method.
-  ///
-  /// By default (when `null`) this is a `"GET"` request. Alternatively, the
-  /// method can be `"POST"`, `"PUT"`, `"DELETE"`, etc.
-  final String method;
-
-  /// Whether the request should send credentials. Credentials are only useful
-  /// for cross-origin requests.
-  ///
-  /// See [HttpRequest.request] for more information.
-  final bool withCredentials;
-
-  /// The desired response format.
-  ///
-  /// Supported types are:
-  /// - `""`: (same as `"text"`),
-  /// - `"arraybuffer"`,
-  /// - `"blob"`,
-  /// - `"document"`,
-  /// - `"json"`,
-  /// - `"text"`
-  ///
-  /// When no value is provided (when equal to `null`) defaults to `""`.
-  final String responseType;
-
-  /// The desired MIME type.
-  ///
-  /// This overrides the default MIME type which is set up to transfer textual
-  /// data.
-  final String mimeType;
-
-  /// The request headers that should be sent with the request.
-  final Map<String, String> requestHeaders;
-
-  /// The data that is sent with the request.
-  ///
-  /// When data is provided (the value is not `null`), it must be a
-  /// [ByteBuffer], [Blob], [Document], [String], or [FormData].
-  final dynamic sendData;
-
-  /// The function that is invoked on progress updates. This function is
-  /// registered as an event listener on the created [HttpRequest] object, and
-  /// thus has its own task. Further invocations of the progress function do
-  /// *not* use the HTTP request task as task object.
-  ///
-  /// Creating an HTTP request automatically registers the on-progress listener.
-  final ZoneUnaryCallback<dynamic, ProgressEvent> onProgress;
-
-  HttpRequestTaskSpecification(this.url,
-      {String this.method, bool this.withCredentials, String this.responseType,
-      String this.mimeType, Map<String, String> this.requestHeaders,
-      this.sendData,
-      void this.onProgress(ProgressEvent e)});
-
-  String get name => "dart.html.http-request";
-  bool get isOneShot => true;
-}
-
-/**
- * A task specification for HTTP requests that are initiated through a direct
- * invocation of [HttpRequest.send].
- *
- * This specification serves as signal to zones that an HTTP request has been
- * initiated. The created task is the [request] object itself, and
- * no callback is ever executed in this task.
- *
- * Note that event listeners on the HTTP request are also registered in the
- * zone (although with their own task creations), and that a zone can thus
- * detect when the HTTP request returns.
- *
- * HTTP requests that are initiated through `request` methods don't use
- * this class but use [HttpRequestTaskSpecification].
- *
- * *Experimental*. This class may disappear without notice.
- */
-class HttpRequestSendTaskSpecification extends TaskSpecification {
-  final HttpRequest request;
-  final dynamic sendData;
-
-  HttpRequestSendTaskSpecification(this.request, this.sendData);
-
-  String get name => "dart.html.http-request-send";
-
-  /**
-   * No callback is ever executed in an HTTP request send task.
-   */
-  bool get isOneShot => false;
-}
-
  /**
   * A client-side XHR request for getting data from a URL,
   * formally known as XMLHttpRequest.
@@ -21287,34 +21184,7 @@
       {String method, bool withCredentials, String responseType,
       String mimeType, Map<String, String> requestHeaders, sendData,
       void onProgress(ProgressEvent e)}) {
-    var spec = new HttpRequestTaskSpecification(
-        url, method: method,
-        withCredentials: withCredentials,
-        responseType: responseType,
-        mimeType: mimeType,
-        requestHeaders: requestHeaders,
-        sendData: sendData,
-        onProgress: onProgress);
-
-    if (identical(Zone.current, Zone.ROOT)) {
-      return _createHttpRequestTask(spec, null);
-    }
-    return Zone.current.createTask(_createHttpRequestTask, spec);
-  }
-
-  static Future<HttpRequest> _createHttpRequestTask(
-      HttpRequestTaskSpecification spec, Zone zone) {
-    String url = spec.url;
-    String method = spec.method;
-    bool withCredentials = spec.withCredentials;
-    String responseType = spec.responseType;
-    String mimeType = spec.mimeType;
-    Map<String, String> requestHeaders = spec.requestHeaders;
-    var sendData = spec.sendData;
-    var onProgress = spec.onProgress;
-
     var completer = new Completer<HttpRequest>();
-    var task = completer.future;
 
     var xhr = new HttpRequest();
     if (method == null) {
@@ -21354,42 +21224,23 @@
       // redirect case will be handled by the browser before it gets to us,
       // so if we see it we should pass it through to the user.
       var unknownRedirect = xhr.status > 307 && xhr.status < 400;
-
-      var isSuccessful = accepted || fileUri || notModified || unknownRedirect;
-
-      if (zone == null && isSuccessful) {
+      
+      if (accepted || fileUri || notModified || unknownRedirect) {
         completer.complete(xhr);
-      } else if (zone == null) {
-        completer.completeError(e);
-      } else if (isSuccessful) {
-        zone.runTask((task, value) {
-          completer.complete(value);
-        }, task, xhr);
       } else {
-        zone.runTask((task, error) {
-          completer.completeError(error);
-        }, task, e);
+        completer.completeError(e);
       }
     });
 
-    if (zone == null) {
-      xhr.onError.listen(completer.completeError);
-    } else {
-      xhr.onError.listen((error) {
-        zone.runTask((task, error) {
-          completer.completeError(error);
-        }, task, error);
-      });
-    }
+    xhr.onError.listen(completer.completeError);
 
     if (sendData != null) {
-      // TODO(floitsch): should we go through 'send()' and have nested tasks?
-      xhr._send(sendData);
+      xhr.send(sendData);
     } else {
-      xhr._send();
+      xhr.send();
     }
 
-    return task;
+    return completer.future;
   }
 
   /**
@@ -21439,9 +21290,6 @@
         return xhr.responseText;
       });
     }
-    // TODO(floitsch): the following code doesn't go through task zones.
-    // Since 'XDomainRequest' is an IE9 feature we should probably just remove
-    // it.
   }
 
   /**
@@ -21492,7 +21340,7 @@
    *
    * Note: Most simple HTTP requests can be accomplished using the [getString],
    * [request], [requestCrossOrigin], or [postFormData] methods. Use of this
-   * `open` method is intended only for more complex HTTP requests where
+   * `open` method is intended only for more complext HTTP requests where
    * finer-grained control is needed.
    */
   @DomName('XMLHttpRequest.open')
@@ -21505,36 +21353,6 @@
     }
   }
 
-  /**
-   * Sends the request with any given `data`.
-   *
-   * Note: Most simple HTTP requests can be accomplished using the [getString],
-   * [request], [requestCrossOrigin], or [postFormData] methods. Use of this
-   * `send` method is intended only for more complex HTTP requests where
-   * finer-grained control is needed.
-   *
-   * ## Other resources
-   *
-   * * [XMLHttpRequest.send](https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#send%28%29)
-   *   from MDN.
-   */
-  @DomName('XMLHttpRequest.send')
-  @DocsEditable()
-  void send([body_OR_data]) {
-    if (identical(Zone.current, Zone.ROOT)) {
-      _send(body_OR_data);
-    } else {
-      Zone.current.createTask(_createHttpRequestSendTask,
-          new HttpRequestSendTaskSpecification(this, body_OR_data));
-    }
-  }
-
-  static HttpRequest _createHttpRequestSendTask(
-      HttpRequestSendTaskSpecification spec, Zone zone) {
-    spec.request._send(spec.sendData);
-    return spec.request;
-  }
-
   // To suppress missing implicit constructor warnings.
   factory HttpRequest._() { throw new UnsupportedError("Not supported"); }
 
@@ -21838,7 +21656,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   void overrideMimeType(String mime) => _blink.BlinkXMLHttpRequest.instance.overrideMimeType_Callback_1_(this, mime);
   
-  void _send([body_OR_data]) {
+  void send([body_OR_data]) {
     if (body_OR_data != null) {
       _blink.BlinkXMLHttpRequest.instance.send_Callback_1_(this, body_OR_data);
       return;
@@ -37844,10 +37662,10 @@
     if ((blob_OR_source_OR_stream is Blob || blob_OR_source_OR_stream == null)) {
       return _blink.BlinkURL.instance.createObjectURL_Callback_1_(blob_OR_source_OR_stream);
     }
-    if ((blob_OR_source_OR_stream is MediaSource)) {
+    if ((blob_OR_source_OR_stream is MediaStream)) {
       return _blink.BlinkURL.instance.createObjectURL_Callback_1_(blob_OR_source_OR_stream);
     }
-    if ((blob_OR_source_OR_stream is MediaStream)) {
+    if ((blob_OR_source_OR_stream is MediaSource)) {
       return _blink.BlinkURL.instance.createObjectURL_Callback_1_(blob_OR_source_OR_stream);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -39313,99 +39131,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-typedef void RemoveFrameRequestMapping(int id);
-
-/**
- * The task object representing animation-frame requests.
- *
- * For historical reasons, [Window.requestAnimationFrame] returns an integer
- * to users. However, zone tasks must be unique objects, and an integer can
- * therefore not be used as task object. The [Window] class thus keeps a mapping
- * from the integer ID to the corresponding task object. All zone related
- * operations work on this task object, whereas users of
- * [Window.requestAnimationFrame] only see the integer ID.
- *
- * Since this mapping takes up space, it must be removed when the
- * animation-frame task has triggered. The default implementation does this
- * automatically, but intercepting implementations of `requestAnimationFrame`
- * must make sure to call the [AnimationFrameTask.removeMapping]
- * function that is provided in the task specification.
- *
- * *Experimental*. This class may disappear without notice.
- */
-abstract class AnimationFrameTask {
-  /** The ID that is returned to users. */
-  int get id;
-
-  /** The zone in which the task will run. */
-  Zone get zone;
-
-  /**
-   * Cancels the animation-frame request.
-   *
-   * A call to [Window.cancelAnimationFrame] with an `id` argument equal to [id]
-   * forwards the request to this function.
-   *
-   * Zones that intercept animation-frame requests implement this method so
-   * that they can react to cancelation requests.
-   */
-  void cancel(Window window);
-
-  /**
-   * Maps animation-frame request IDs to their task objects.
-   */
-  static final Map<int, _AnimationFrameTask> _tasks = {};
-
-  /**
-   * Removes the mapping from [id] to [AnimationFrameTask].
-   *
-   * This function must be invoked by user-implemented animation-frame
-   * tasks, before running [callback].
-   *
-   * See [AnimationFrameTask].
-   */
-  static void removeMapping(int id) {
-    _tasks.remove(id);
-  }
-}
-
-class _AnimationFrameTask implements AnimationFrameTask {
-  final int id;
-  final Zone zone;
-  final FrameRequestCallback _callback;
-
-  _AnimationFrameTask(this.id, this.zone, this._callback);
-
-  void cancel(Window window) {
-    window._cancelAnimationFrame(this.id);
-  }
-}
-
-/**
- * The task specification for an animation-frame request.
- *
- * *Experimental*. This class may disappear without notice.
- */
-class AnimationFrameRequestSpecification implements TaskSpecification {
-  /**
-   * The window on which [Window.requestAnimationFrame] was invoked.
-   */
-  final Window window;
-
-  /**
-   * The callback that is executed when the animation-frame is ready.
-   *
-   * Note that the callback hasn't been registered in any zone when the `create`
-   * function (passed to [Zone.createTask]) is invoked.
-   */
-  final FrameRequestCallback callback;
-
-  AnimationFrameRequestSpecification(this.window, this.callback);
-
-  String get name => "dart.html.request-animation-frame";
-  bool get isOneShot => true;
-}
-
 @DocsEditable()
 /**
  * Top-level container for the current browser tab or window.
@@ -39460,11 +39185,12 @@
    */
   Future<num> get animationFrame {
     var completer = new Completer<num>.sync();
-    requestAnimationFrame(completer.complete);
+    requestAnimationFrame((time) {
+      completer.complete(time);
+    });
     return completer.future;
   }
 
-
   /**
    * Called to draw an animation frame and then request the window to repaint
    * after [callback] has finished (creating the animation).
@@ -39483,52 +39209,9 @@
    */
   @DomName('Window.requestAnimationFrame')
   int requestAnimationFrame(FrameRequestCallback callback) {
-    if (identical(Zone.current, Zone.ROOT)) {
-      return _requestAnimationFrame(callback);
-    }
-    var spec = new AnimationFrameRequestSpecification(this, callback);
-    var task = Zone.current.createTask/*<AnimationFrameTask>*/(
-        _createAnimationFrameTask, spec);
-    AnimationFrameTask._tasks[task.id] = task;
-    return task.id;
+    return _requestAnimationFrame(_wrapZone(callback));
   }
 
-  static _AnimationFrameTask _createAnimationFrameTask(
-      AnimationFrameRequestSpecification spec, Zone zone) {
-    var task;
-    var id = spec.window._requestAnimationFrame((num time) {
-      AnimationFrameTask.removeMapping(task.id);
-      zone.runTask(_runAnimationFrame, task, time);
-    });
-    var callback = zone.registerUnaryCallback(spec.callback);
-    task = new _AnimationFrameTask(id, zone, callback);
-    return task;
-  }
-
-  static void _runAnimationFrame(_AnimationFrameTask task, num time) {
-    task._callback(time);
-  }
-
-  /**
-   * Cancels an animation frame request.
-   *
-   * ## Other resources
-   *
-   * * [Window.cancelAnimationFrame](https://developer.mozilla.org/en-US/docs/Web/API/Window.cancelAnimationFrame)
-   *   from MDN.
-   */
-  @DomName('Window.cancelAnimationFrame')
-  void cancelAnimationFrame(int id) {
-    var task = AnimationFrameTask._tasks.remove(id);
-    if (task == null) {
-      // Assume that the animation frame request wasn't intercepted by a zone.
-      _cancelAnimationFrame(id);
-      return;
-    }
-    task.cancel(this);
-  }
-
-
   /**
    * Access a sandboxed file system of the specified `size`. If `persistent` is
    * true, the application will request permission from the user to create
@@ -40295,7 +39978,7 @@
 
   @DomName('Window.cancelAnimationFrame')
   @DocsEditable()
-  void _cancelAnimationFrame(int handle) => _blink.BlinkWindow.instance.cancelAnimationFrame_Callback_1_(this, handle);
+  void cancelAnimationFrame(int handle) => _blink.BlinkWindow.instance.cancelAnimationFrame_Callback_1_(this, handle);
   
   @DomName('Window.close')
   @DocsEditable()
@@ -44809,41 +44492,6 @@
   StreamSubscription<T> capture(void onData(T event));
 }
 
-/// Task specification for DOM Events.
-///
-/// *Experimental*. May disappear without notice.
-class EventSubscriptionSpecification<T extends Event>
-    implements TaskSpecification {
-  @override
-  final String name;
-  @override
-  final bool isOneShot;
-
-  final EventTarget target;
-  /// The event-type of the event. For example 'click' for click events.
-  final String eventType;
-  // TODO(floitsch): the first generic argument should be 'void'.
-  final ZoneUnaryCallback<dynamic, T> onData;
-  final bool useCapture;
-
-  EventSubscriptionSpecification({this.name, this.isOneShot, this.target,
-      this.eventType, void this.onData(T event), this.useCapture});
-
-  /// Returns a copy of this instance, with every non-null argument replaced
-  /// by the given value.
-  EventSubscriptionSpecification<T> replace(
-      {String name, bool isOneShot, EventTarget target,
-       String eventType, void onData(T event), bool useCapture}) {
-    return new EventSubscriptionSpecification<T>(
-        name: name ?? this.name,
-        isOneShot: isOneShot ?? this.isOneShot,
-        target: target ?? this.target,
-        eventType: eventType ?? this.eventType,
-        onData: onData ?? this.onData,
-        useCapture: useCapture ?? this.useCapture);
-  }
-}
-
 /**
  * Adapter for exposing DOM events as Dart streams.
  */
@@ -44851,16 +44499,8 @@
   final EventTarget _target;
   final String _eventType;
   final bool _useCapture;
-  /// The name that is used in the task specification.
-  final String _name;
-  /// Whether the stream can trigger multiple times.
-  final bool _isOneShot;
 
-  _EventStream(this._target, String eventType, this._useCapture,
-      {String name, bool isOneShot: false})
-      : _eventType = eventType,
-        _isOneShot = isOneShot,
-        _name = name ?? "dart.html.event.$eventType";
+  _EventStream(this._target, this._eventType, this._useCapture);
 
   // DOM events are inherently multi-subscribers.
   Stream<T> asBroadcastStream({void onListen(StreamSubscription<T> subscription),
@@ -44868,31 +44508,13 @@
       => this;
   bool get isBroadcast => true;
 
-  StreamSubscription<T> _listen(
-      void onData(T event), {bool useCapture}) {
-
-    if (identical(Zone.current, Zone.ROOT)) {
-      return new _EventStreamSubscription<T>(
-          this._target, this._eventType, onData, this._useCapture,
-          Zone.current);
-    }
-
-    var specification = new EventSubscriptionSpecification<T>(
-        name: this._name, isOneShot: this._isOneShot,
-        target: this._target, eventType: this._eventType,
-        onData: onData, useCapture: useCapture);
-    // We need to wrap the _createStreamSubscription call, since a tear-off
-    // would not bind the generic type 'T'.
-    return Zone.current.createTask((spec, Zone zone) {
-      return _createStreamSubscription/*<T>*/(spec, zone);
-    }, specification);
-  }
-
   StreamSubscription<T> listen(void onData(T event),
       { Function onError,
         void onDone(),
         bool cancelOnError}) {
-    return _listen(onData, useCapture: this._useCapture);
+
+    return new _EventStreamSubscription<T>(
+        this._target, this._eventType, onData, this._useCapture);
   }
 }
 
@@ -44907,9 +44529,8 @@
  */
 class _ElementEventStreamImpl<T extends Event> extends _EventStream<T>
     implements ElementStream<T> {
-  _ElementEventStreamImpl(target, eventType, useCapture,
-      {String name, bool isOneShot: false}) :
-      super(target, eventType, useCapture, name: name, isOneShot: isOneShot);
+  _ElementEventStreamImpl(target, eventType, useCapture) :
+      super(target, eventType, useCapture);
 
   Stream<T> matches(String selector) => this.where(
       (event) => _matchesWithAncestors(event, selector)).map((e) {
@@ -44917,9 +44538,9 @@
         return e;
       });
 
-  StreamSubscription<T> capture(void onData(T event)) {
-    return _listen(onData, useCapture: true);
-  }
+  StreamSubscription<T> capture(void onData(T event)) =>
+    new _EventStreamSubscription<T>(
+        this._target, this._eventType, onData, true);
 }
 
 /**
@@ -44968,13 +44589,7 @@
   bool get isBroadcast => true;
 }
 
-StreamSubscription/*<T>*/ _createStreamSubscription/*<T>*/(
-    EventSubscriptionSpecification/*<T>*/ spec, Zone zone) {
-  return new _EventStreamSubscription/*<T>*/(spec.target, spec.eventType,
-      spec.onData, spec.useCapture, zone);
-}
-
-// We would like this to just be EventListener<T> but that typedef cannot
+// We would like this to just be EventListener<T> but that typdef cannot
 // use generics until dartbug/26276 is fixed.
 typedef _EventListener<T extends Event>(T event);
 
@@ -44983,19 +44598,15 @@
   EventTarget _target;
   final String _eventType;
   EventListener _onData;
-  EventListener _domCallback;
   final bool _useCapture;
-  final Zone _zone;
 
   // TODO(jacobr): for full strong mode correctness we should write
-  // _onData = onData == null ? null : _wrapZone/*<dynamic, Event>*/((e) => onData(e as T))
+  // _onData = onData == null ? null : _wrapZone/*<Event, dynamic>*/((e) => onData(e as T))
   // but that breaks 114 co19 tests as well as multiple html tests as it is reasonable
   // to pass the wrong type of event object to an event listener as part of a
   // test.
   _EventStreamSubscription(this._target, this._eventType, void onData(T event),
-      this._useCapture, Zone zone)
-      : _zone = zone,
-        _onData = _registerZone/*<dynamic, Event>*/(zone, onData) {
+      this._useCapture) : _onData = _wrapZone/*<Event, dynamic>*/(onData) {
     _tryResume();
   }
 
@@ -45017,7 +44628,7 @@
     }
     // Remove current event listener.
     _unlisten();
-    _onData = _registerZone/*<dynamic, Event>*/(_zone, handleData);
+    _onData = _wrapZone/*<Event, dynamic>*/(handleData);
     _tryResume();
   }
 
@@ -45046,25 +44657,14 @@
   }
 
   void _tryResume() {
-    if (_onData == null || isPaused) return;
-    if (identical(_zone, Zone.ROOT)) {
-      _domCallback = _onData;
-    } else {
-      _domCallback = (event) {
-        _zone.runTask(_runEventNotification, this, event);
-      };
+    if (_onData != null && !isPaused) {
+      _target.addEventListener(_eventType, _onData, _useCapture);
     }
-    _target.addEventListener(_eventType, _domCallback, _useCapture);
-  }
-
-  static void _runEventNotification/*<T>*/(
-      _EventStreamSubscription/*<T>*/ subscription, /*=T*/ event) {
-    subscription._onData(event);
   }
 
   void _unlisten() {
     if (_onData != null) {
-      _target.removeEventListener(_eventType, _domCallback, _useCapture);
+      _target.removeEventListener(_eventType, _onData, _useCapture);
     }
   }
 
@@ -48256,26 +47856,31 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-ZoneUnaryCallback/*<R, T>*/ _registerZone/*<R, T>*/(Zone zone,
-    ZoneUnaryCallback/*<R, T>*/ callback) {
-  // For performance reasons avoid registering if we are in the root zone.
-  if (identical(zone, Zone.ROOT)) return callback;
-  if (callback == null) return null;
-  return zone.registerUnaryCallback(callback);
-}
+// TODO(jacobr): remove these typedefs when dart:async supports generic types.
+typedef R _wrapZoneCallback<A, R>(A a);
+typedef R _wrapZoneBinaryCallback<A, B, R>(A a, B b);
 
-ZoneUnaryCallback/*<R, T>*/ _wrapZone/*<R, T>*/(ZoneUnaryCallback/*<R, T>*/ callback) {
+_wrapZoneCallback/*<A, R>*/ _wrapZone/*<A, R>*/(_wrapZoneCallback/*<A, R>*/ callback) {
   // For performance reasons avoid wrapping if we are in the root zone.
-  if (identical(Zone.current, Zone.ROOT)) return callback;
+  if (Zone.current == Zone.ROOT) return callback;
   if (callback == null) return null;
-  return Zone.current.bindUnaryCallback(callback, runGuarded: true);
+  // TODO(jacobr): we cast to _wrapZoneCallback/*<A, R>*/ to hack around missing
+  // generic method support in zones.
+  // ignore: STRONG_MODE_DOWN_CAST_COMPOSITE
+  _wrapZoneCallback/*<A, R>*/ wrapped =
+      Zone.current.bindUnaryCallback(callback, runGuarded: true);
+  return wrapped;
 }
 
-ZoneBinaryCallback/*<R, A, B>*/ _wrapBinaryZone/*<R, A, B>*/(
-    ZoneBinaryCallback/*<R, A, B>*/ callback) {
-  if (identical(Zone.current, Zone.ROOT)) return callback;
+_wrapZoneBinaryCallback/*<A, B, R>*/ _wrapBinaryZone/*<A, B, R>*/(_wrapZoneBinaryCallback/*<A, B, R>*/ callback) {
+  if (Zone.current == Zone.ROOT) return callback;
   if (callback == null) return null;
-  return Zone.current.bindBinaryCallback(callback, runGuarded: true);
+  // We cast to _wrapZoneBinaryCallback/*<A, B, R>*/ to hack around missing
+  // generic method support in zones.
+  // ignore: STRONG_MODE_DOWN_CAST_COMPOSITE
+  _wrapZoneBinaryCallback/*<A, B, R>*/ wrapped =
+      Zone.current.bindBinaryCallback(callback, runGuarded: true);
+  return wrapped;
 }
 
 /**
diff --git a/tests/corelib/uri_test.dart b/tests/corelib/uri_test.dart
index a9166be..3d24e2d 100644
--- a/tests/corelib/uri_test.dart
+++ b/tests/corelib/uri_test.dart
@@ -32,6 +32,11 @@
     Expect.equals(uri,
                   Uri.parse(uriText + "#fragment").removeFragment());
   }
+
+  // Test uri.replace on uri with fragment
+  uri = Uri.parse('http://hello.com/fake#fragment');
+  uri = uri.replace(path: "D/E/E");
+  Expect.stringEquals('http://hello.com/D/E/E#fragment', uri.toString());
 }
 
 testEncodeDecode(String orig, String encoded) {
diff --git a/tests/html/event_subscription_specification_test.dart b/tests/html/event_subscription_specification_test.dart
deleted file mode 100644
index 406ed37..0000000
--- a/tests/html/event_subscription_specification_test.dart
+++ /dev/null
@@ -1,121 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for 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 EventTaskZoneTest;
-
-import 'package:unittest/unittest.dart';
-import 'package:unittest/html_config.dart';
-import 'dart:async';
-import 'dart:html';
-
-// Tests event-subscription specifications.
-
-main() {
-  useHtmlConfiguration();
-
-  var defaultTarget = new Element.div();
-  var defaultOnData = (x) => null;
-
-  EventSubscriptionSpecification createSpec({useCapture, isOneShot}) {
-    return new EventSubscriptionSpecification(
-        name: "name",
-        target: defaultTarget,
-        useCapture: useCapture,
-        isOneShot: isOneShot,
-        onData: defaultOnData,
-        eventType: "eventType");
-  }
-
-  for (var useCapture in [true, false]) {
-    for (var isOneShot in [true, false]) {
-      var spec = createSpec(useCapture: useCapture, isOneShot: isOneShot);
-
-      test(
-          "EventSubscriptionSpecification - constructor "
-          "useCapture: $useCapture isOneShot: $isOneShot", () {
-        var replaced = spec.replace(eventType: 'replace-eventType');
-        expect(replaced.name, "name");
-        expect(replaced.target, defaultTarget);
-        expect(replaced.useCapture, useCapture);
-        expect(replaced.isOneShot, isOneShot);
-        expect(replaced.onData, equals(defaultOnData));
-        expect(replaced.eventType, "replace-eventType");
-      });
-
-      test(
-          "replace name "
-          "useCapture: $useCapture isOneShot: $isOneShot", () {
-        var replaced = spec.replace(name: 'replace-name');
-        expect(replaced.name, "replace-name");
-        expect(replaced.target, defaultTarget);
-        expect(replaced.useCapture, useCapture);
-        expect(replaced.isOneShot, isOneShot);
-        expect(replaced.onData, equals(defaultOnData));
-        expect(replaced.eventType, "eventType");
-      });
-
-      test(
-          "replace target "
-          "useCapture: $useCapture isOneShot: $isOneShot", () {
-        var replacementTarget = new Element.a();
-        var replaced = spec.replace(target: replacementTarget);
-        expect(replaced.name, "name");
-        expect(replaced.target, replacementTarget);
-        expect(replaced.useCapture, useCapture);
-        expect(replaced.isOneShot, isOneShot);
-        expect(replaced.onData, equals(defaultOnData));
-        expect(replaced.eventType, "eventType");
-      });
-
-      test(
-          "replace useCapture "
-              "useCapture: $useCapture isOneShot: $isOneShot", () {
-        var replaced = spec.replace(useCapture: !useCapture);
-        expect(replaced.name, "name");
-        expect(replaced.target, defaultTarget);
-        expect(replaced.useCapture, !useCapture);
-        expect(replaced.isOneShot, isOneShot);
-        expect(replaced.onData, equals(defaultOnData));
-        expect(replaced.eventType, "eventType");
-      });
-
-      test(
-          "replace isOneShot "
-              "useCapture: $useCapture isOneShot: $isOneShot", () {
-        var replaced = spec.replace(isOneShot: !isOneShot);
-        expect(replaced.name, "name");
-        expect(replaced.target, defaultTarget);
-        expect(replaced.useCapture, useCapture);
-        expect(replaced.isOneShot, !isOneShot);
-        expect(replaced.onData, equals(defaultOnData));
-        expect(replaced.eventType, "eventType");
-      });
-
-      test(
-          "replace onData "
-              "useCapture: $useCapture isOneShot: $isOneShot", () {
-        var replacementOnData = (x) {};
-        var replaced = spec.replace(onData: replacementOnData);
-        expect(replaced.name, "name");
-        expect(replaced.target, defaultTarget);
-        expect(replaced.useCapture, useCapture);
-        expect(replaced.isOneShot, isOneShot);
-        expect(replaced.onData, equals(replacementOnData));
-        expect(replaced.eventType, "eventType");
-      });
-
-      test(
-          "replace eventType "
-          "useCapture: $useCapture isOneShot: $isOneShot", () {
-        var replaced = spec.replace(eventType: 'replace-eventType');
-        expect(replaced.name, "name");
-        expect(replaced.target, defaultTarget);
-        expect(replaced.useCapture, useCapture);
-        expect(replaced.isOneShot, isOneShot);
-        expect(replaced.onData, equals(defaultOnData));
-        expect(replaced.eventType, "replace-eventType");
-      });
-    }
-  }
-}
diff --git a/tests/html/event_zone_task_test.dart b/tests/html/event_zone_task_test.dart
deleted file mode 100644
index a0e85c8..0000000
--- a/tests/html/event_zone_task_test.dart
+++ /dev/null
@@ -1,239 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for 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 EventTaskZoneTest;
-
-import 'package:unittest/unittest.dart';
-import 'package:unittest/html_config.dart';
-import 'dart:async';
-import 'dart:html';
-
-// Tests zone tasks with DOM events.
-
-class AbortedEventStreamSubscription implements StreamSubscription<Event> {
-  final Zone zone;
-
-  AbortedEventStreamSubscription(this.zone);
-
-  @override
-  Future asFuture([futureValue]) {
-    throw new UnsupportedError("asFuture");
-  }
-
-  @override
-  Future cancel() {
-    return null;
-  }
-
-  @override
-  bool get isPaused => throw new UnsupportedError("pause");
-
-  @override
-  void onData(void handleData(Event data)) {
-    throw new UnsupportedError("cancel");
-  }
-
-  @override
-  void onDone(void handleDone()) {
-    throw new UnsupportedError("onDone");
-  }
-
-  @override
-  void onError(Function handleError) {
-    throw new UnsupportedError("onError");
-  }
-
-  @override
-  void pause([Future resumeSignal]) {
-    throw new UnsupportedError("pause");
-  }
-
-  @override
-  void resume() {
-    throw new UnsupportedError("resume");
-  }
-
-  static AbortedEventStreamSubscription _create(
-      EventSubscriptionSpecification spec, Zone zone) {
-    return new AbortedEventStreamSubscription(zone);
-  }
-}
-
-eventTest(String name, Event eventFn(), void validate(Event event),
-    void validateSpec(EventSubscriptionSpecification spec),
-    {String type: 'foo',
-    bool abortCreation: false,
-    EventSubscriptionSpecification modifySpec(
-        EventSubscriptionSpecification spec),
-    bool abortEvent: false,
-    Event modifyEvent(Event event)}) {
-  test(name, () {
-    var lastSpec;
-    var lastTask;
-    var lastEvent;
-
-    Object createTaskHandler(Zone self, ZoneDelegate parent, Zone zone,
-        TaskCreate create, TaskSpecification specification) {
-      if (specification is EventSubscriptionSpecification) {
-        if (abortCreation) {
-          create = AbortedEventStreamSubscription._create;
-        }
-        if (modifySpec != null) {
-          specification = modifySpec(specification);
-        }
-        lastSpec = specification;
-        return lastTask = parent.createTask(zone, create, specification);
-      }
-      return parent.createTask(zone, create, specification);
-    }
-
-    void runTaskHandler(Zone self, ZoneDelegate parent, Zone zone, TaskRun run,
-        Object task, Object arg) {
-      if (identical(task, lastTask)) {
-        if (abortEvent) return;
-        if (modifyEvent != null) {
-          arg = modifyEvent(arg);
-        }
-        parent.runTask(zone, run, task, arg);
-        return;
-      }
-      parent.runTask(zone, run, task, arg);
-    }
-
-    runZoned(() {
-      final el = new Element.tag('div');
-      var fired = false;
-      var sub = el.on[type].listen((ev) {
-        lastEvent = ev;
-        fired = true;
-      });
-      el.dispatchEvent(eventFn());
-
-      validateSpec(lastSpec);
-      validate(lastEvent);
-
-      if (abortEvent || abortCreation) {
-        expect(fired, isFalse, reason: 'Expected event to be intercepted.');
-      } else {
-        expect(fired, isTrue, reason: 'Expected event to be dispatched.');
-      }
-
-      sub.cancel();
-    },
-        zoneSpecification: new ZoneSpecification(
-            createTask: createTaskHandler,
-            runTask: runTaskHandler));
-  });
-}
-
-Function checkSpec(
-    [String expectedType = 'foo', bool expectedUseCapture = false]) {
-  return (EventSubscriptionSpecification spec) {
-    expect(spec.eventType, expectedType);
-    expect(spec.useCapture, expectedUseCapture);
-  };
-}
-
-main() {
-  useHtmlConfiguration();
-
-  eventTest('Event', () => new Event('foo'), (ev) {
-    expect(ev.type, equals('foo'));
-  }, checkSpec('foo'));
-
-  eventTest(
-      'WheelEvent',
-      () => new WheelEvent("mousewheel",
-          deltaX: 1,
-          deltaY: 0,
-          detail: 4,
-          screenX: 3,
-          screenY: 4,
-          clientX: 5,
-          clientY: 6,
-          ctrlKey: true,
-          altKey: true,
-          shiftKey: true,
-          metaKey: true), (ev) {
-    expect(ev.deltaX, 1);
-    expect(ev.deltaY, 0);
-    expect(ev.screen.x, 3);
-    expect(ev.screen.y, 4);
-    expect(ev.client.x, 5);
-    expect(ev.client.y, 6);
-    expect(ev.ctrlKey, isTrue);
-    expect(ev.altKey, isTrue);
-    expect(ev.shiftKey, isTrue);
-    expect(ev.metaKey, isTrue);
-  }, checkSpec('mousewheel'), type: 'mousewheel');
-
-  eventTest('Event - no-create', () => new Event('foo'), (ev) {
-    expect(ev, isNull);
-  }, checkSpec('foo'), abortCreation: true);
-
-  eventTest(
-      'WheelEvent - no-create',
-      () => new WheelEvent("mousewheel",
-          deltaX: 1,
-          deltaY: 0,
-          detail: 4,
-          screenX: 3,
-          screenY: 4,
-          clientX: 5,
-          clientY: 6,
-          ctrlKey: true,
-          altKey: true,
-          shiftKey: true,
-          metaKey: true), (ev) {
-    expect(ev, isNull);
-  }, checkSpec('mousewheel'), type: 'mousewheel', abortCreation: true);
-
-  eventTest('Event - no-run', () => new Event('foo'), (ev) {
-    expect(ev, isNull);
-  }, checkSpec('foo'), abortEvent: true);
-
-  eventTest(
-      'WheelEvent - no-run',
-      () => new WheelEvent("mousewheel",
-          deltaX: 1,
-          deltaY: 0,
-          detail: 4,
-          screenX: 3,
-          screenY: 4,
-          clientX: 5,
-          clientY: 6,
-          ctrlKey: true,
-          altKey: true,
-          shiftKey: true,
-          metaKey: true), (ev) {
-    expect(ev, isNull);
-  }, checkSpec('mousewheel'), type: 'mousewheel', abortEvent: true);
-
-  // Register for 'foo', but receive a 'bar' event, because the specification
-  // is rewritten.
-  eventTest(
-      'Event - replace eventType',
-      () => new Event('bar'),
-      (ev) {
-        expect(ev.type, equals('bar'));
-      },
-      checkSpec('bar'),
-      type: 'foo',
-      modifySpec: (EventSubscriptionSpecification spec) {
-        return spec.replace(eventType: 'bar');
-      });
-
-  // Intercept the 'foo' event and replace it with a 'bar' event.
-  eventTest(
-      'Event - intercept result',
-      () => new Event('foo'),
-      (ev) {
-        expect(ev.type, equals('bar'));
-      },
-      checkSpec('foo'),
-      type: 'foo',
-      modifyEvent: (Event event) {
-        return new Event('bar');
-      });
-}
diff --git a/tests/html/html.status b/tests/html/html.status
index 65ff46f..4d57f42 100644
--- a/tests/html/html.status
+++ b/tests/html/html.status
@@ -142,7 +142,6 @@
 event_test: RuntimeError # Issue 23437. Only three failures, but hard to break them out.
 wheelevent_test: RuntimeError # Issue 23437
 text_event_test: RuntimeError # Issue 23437
-event_zone_task_test: RuntimeError # Issue 23437
 transition_event_test/functional: Skip # Times out. Issue 22167
 request_animation_frame_test: Skip # Times out. Issue 22167
 
@@ -186,7 +185,6 @@
 webgl_1_test/supported: Fail
 websql_test/supported: Fail
 xhr_test/json: Fail # IE10 returns string, not JSON object
-xhr_task_test/json: Fail # IE10 returns string, not JSON object
 xhr_test/supported_overrideMimeType: Fail
 xsltprocessor_test/supported: Fail
 worker_test/functional: Fail # IE uses incorrect security context for Blob URIs.
@@ -244,8 +242,7 @@
 touchevent_test/supported: Fail # IE does not support TouchEvents
 webgl_1_test/functional: Fail
 websql_test/supported: Fail
-xhr_test/json: Fail # IE11 returns string, not JSON object
-xhr_task_test/json: Fail # IE11 returns string, not JSON object
+xhr_test/json: Fail # IE10 returns string, not JSON object
 xsltprocessor_test/supported: Fail
 
 [ $runtime == ie10 ]
@@ -364,7 +361,6 @@
 
 [ (($runtime == dartium || $runtime == drt) && $system == macos) || $system == windows ]
 xhr_test/xhr: Skip # Times out.  Issue 21527
-xhr_task_test/xhr: Skip # Times out.  Issue 21527
 
 [ $compiler == dart2analyzer ]
 custom/document_register_basic_test: StaticWarning
diff --git a/tests/html/request_animation_task_test.dart b/tests/html/request_animation_task_test.dart
deleted file mode 100644
index 3d388dd..0000000
--- a/tests/html/request_animation_task_test.dart
+++ /dev/null
@@ -1,170 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for 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 EventTaskZoneTest;
-
-import 'package:unittest/unittest.dart';
-import 'package:unittest/html_config.dart';
-import 'dart:async';
-import 'dart:html';
-
-// Tests zone tasks with window.requestAnimationFrame.
-
-class MockAnimationFrameTask implements AnimationFrameTask {
-  static int taskId = 499;
-
-  final int id;
-  final Zone zone;
-  bool _isCanceled = false;
-  Function _callback;
-
-  MockAnimationFrameTask(
-      this.id, this.zone, this._callback);
-
-  void cancel(Window window) {
-    _isCanceled = true;
-  }
-
-  trigger(num stamp) {
-    zone.runTask(run, this, stamp);
-  }
-
-  static create(AnimationFrameRequestSpecification spec, Zone zone) {
-    var callback = zone.registerUnaryCallback(spec.callback);
-    return new MockAnimationFrameTask(
-        taskId++, zone, callback);
-  }
-
-  static run(MockAnimationFrameTask task, num arg) {
-    AnimationFrameTask.removeMapping(task.id);
-    task._callback(arg);
-  }
-}
-
-animationFrameTest() {
-  test("animationFrameTest - no intercept", () async {
-    AnimationFrameTask lastTask;
-    bool sawRequest = false;
-    int id;
-    num providedArg;
-
-    Object createTaskHandler(Zone self, ZoneDelegate parent, Zone zone,
-        TaskCreate create, TaskSpecification specification) {
-      if (specification is AnimationFrameRequestSpecification) {
-        sawRequest = true;
-        lastTask = parent.createTask(zone, create, specification);
-        id = lastTask.id;
-        return lastTask;
-      }
-      return parent.createTask(zone, create, specification);
-    }
-
-    void runTaskHandler(Zone self, ZoneDelegate parent, Zone zone, TaskRun run,
-        Object task, Object arg) {
-      if (identical(task, lastTask)) {
-        providedArg = arg;
-      }
-      parent.runTask(zone, run, task, arg);
-    }
-
-    var completer = new Completer();
-    var publicId;
-    runZoned(() {
-      publicId = window.requestAnimationFrame((num stamp) {
-        completer.complete(stamp);
-      });
-    },
-        zoneSpecification: new ZoneSpecification(
-            createTask: createTaskHandler, runTask: runTaskHandler));
-
-    var referenceCompleter = new Completer();
-    window.requestAnimationFrame((num stamp) {
-      referenceCompleter.complete(stamp);
-    });
-
-    var callbackStamp = await completer.future;
-    var referenceStamp = await referenceCompleter.future;
-
-    expect(callbackStamp, equals(referenceStamp));
-    expect(providedArg, equals(callbackStamp));
-    expect(sawRequest, isTrue);
-    expect(publicId, isNotNull);
-    expect(publicId, equals(id));
-  });
-}
-
-interceptedAnimationFrameTest() {
-  test("animationFrameTest - intercepted", () {
-    List<MockAnimationFrameTask> tasks = [];
-    List<num> loggedRuns = [];
-    int executedTaskId;
-    num executedStamp;
-
-    Object createTaskHandler(Zone self, ZoneDelegate parent, Zone zone,
-        TaskCreate create, TaskSpecification specification) {
-      if (specification is AnimationFrameRequestSpecification) {
-        var task = parent.createTask(
-            zone, MockAnimationFrameTask.create, specification);
-        tasks.add(task);
-        return task;
-      }
-      return parent.createTask(zone, create, specification);
-    }
-
-    void runTaskHandler(Zone self, ZoneDelegate parent, Zone zone, TaskRun run,
-        Object task, Object arg) {
-      if (tasks.contains(task)) {
-        loggedRuns.add(arg);
-      }
-      parent.runTask(zone, run, task, arg);
-    }
-
-    var id0, id1, id2;
-
-    runZoned(() {
-      id0 = window.requestAnimationFrame((num stamp) {
-        executedTaskId = id0;
-        executedStamp = stamp;
-      });
-      id1 = window.requestAnimationFrame((num stamp) {
-        executedTaskId = id1;
-        executedStamp = stamp;
-      });
-      id2 = window.requestAnimationFrame((num stamp) {
-        executedTaskId = id2;
-        executedStamp = stamp;
-      });
-    },
-        zoneSpecification: new ZoneSpecification(
-            createTask: createTaskHandler, runTask: runTaskHandler));
-
-    expect(tasks.length, 3);
-    expect(executedTaskId, isNull);
-    expect(executedStamp, isNull);
-    expect(loggedRuns.isEmpty, isTrue);
-
-    tasks[0].trigger(123.1);
-    expect(executedTaskId, id0);
-    expect(executedStamp, 123.1);
-
-    tasks[1].trigger(123.2);
-    expect(executedTaskId, id1);
-    expect(executedStamp, 123.2);
-
-    expect(loggedRuns, equals([123.1, 123.2]));
-
-    window.cancelAnimationFrame(id2);
-    expect(tasks[2]._isCanceled, isTrue);
-    // Cancel it a second time. Should not crash.
-    window.cancelAnimationFrame(id2);
-    expect(tasks[2]._isCanceled, isTrue);
-  });
-}
-
-main() {
-  useHtmlConfiguration();
-
-  animationFrameTest();
-  interceptedAnimationFrameTest();
-}
diff --git a/tests/html/xhr_task2_test.dart b/tests/html/xhr_task2_test.dart
deleted file mode 100644
index 6dee69e..0000000
--- a/tests/html/xhr_task2_test.dart
+++ /dev/null
@@ -1,280 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for 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 XHRTask2Test;
-
-import 'dart:async';
-import 'dart:convert';
-import 'dart:html';
-import 'dart:typed_data';
-import 'package:unittest/html_individual_config.dart';
-import 'package:unittest/unittest.dart';
-
-class MockProgressEvent implements ProgressEvent {
-  final target;
-  MockProgressEvent(this.target);
-
-  noSuchMethod(Invocation invocation) {
-    throw "missing function in MockProgressEvent";
-  }
-}
-
-class MockHttpRequestTask implements Future<HttpRequest> {
-  final Completer completer = new Completer<HttpRequest>();
-  final HttpRequestTaskSpecification spec;
-  final Zone zone;
-
-  MockHttpRequestTask(this.spec, this.zone);
-
-  void trigger(response) {
-    var xhr = new MockHttpRequest(spec, response);
-    var arg;
-    if (spec.url == "NonExistingFile") {
-      arg = new MockProgressEvent(xhr);
-    } else {
-      arg = xhr;
-    }
-    zone.runTask(run, this, arg);
-  }
-
-  then(onData, {onError}) => completer.future.then(onData, onError: onError);
-  catchError(f, {test}) => completer.future.catchError(f, test: test);
-  whenComplete(f) => completer.future.whenComplete(f);
-  asStream() => completer.future.asStream();
-  timeout(timeLimit, {onTimeout}) =>
-      completer.future.timeout(timeLimit, onTimeout: onTimeout);
-
-  static create(HttpRequestTaskSpecification spec, Zone zone) {
-    return new MockHttpRequestTask(spec, zone);
-  }
-
-  static run(MockHttpRequestTask task, value) {
-    if (value is HttpRequest) {
-      task.completer.complete(value);
-    } else {
-      task.completer.completeError(value);
-    }
-  }
-}
-
-class MockHttpRequest implements HttpRequest {
-  final HttpRequestTaskSpecification spec;
-  final response;
-
-  MockHttpRequest(this.spec, this.response);
-
-  noSuchMethod(Invocation invocation) {
-    print("isGetter: ${invocation.isGetter}");
-    print("isMethod: ${invocation.isMethod}");
-    print("memberName: ${invocation.memberName}");
-  }
-
-  int get status => spec.url == "NonExistingFile" ? 404 : 200;
-
-  get readyState => HttpRequest.DONE;
-  get responseText => "$response";
-
-  Map get responseHeaders => {'content-type': 'text/plain; charset=utf-8',};
-}
-
-main() {
-  useHtmlIndividualConfiguration();
-  unittestConfiguration.timeout = const Duration(milliseconds: 800);
-
-  var urlExpando = new Expando();
-
-  var url = 'some/url.html';
-
-  Function buildCreateTaskHandler(List log, List tasks) {
-    Object createTaskHandler(Zone self, ZoneDelegate parent, Zone zone,
-        TaskCreate create, TaskSpecification spec) {
-      if (spec is HttpRequestTaskSpecification) {
-        var url = spec.url;
-        var method = spec.method;
-        var withCredentials = spec.withCredentials;
-        var responseType = spec.responseType;
-        var mimeType = spec.mimeType;
-        var data = spec.sendData;
-
-        log.add("request $url");
-        var dataLog = data is List<int> ? "binary ${data.length}" : "$data";
-        log.add("  method: $method withCredentials: $withCredentials "
-            "responseType: $responseType mimeType: $mimeType data: $dataLog");
-        var task = parent.createTask(zone, MockHttpRequestTask.create, spec);
-        urlExpando[task] = url;
-        tasks.add(task);
-        return task;
-      }
-      if (spec is EventSubscriptionSpecification) {
-        EventSubscriptionSpecification eventSpec = spec;
-        if (eventSpec.target is HttpRequest) {
-          HttpRequest target = eventSpec.target;
-          log.add("event listener on http-request ${eventSpec.eventType}");
-          if (eventSpec.eventType == "readystatechange") {
-            var oldOnData = eventSpec.onData;
-            spec = eventSpec.replace(onData: (event) {
-              oldOnData(event);
-              if (target.readyState == HttpRequest.DONE) {
-                log.add("unknown request done");
-              }
-            });
-          }
-        }
-      }
-      return parent.createTask(zone, create, spec);
-    }
-
-    return createTaskHandler;
-  }
-
-  Function buildRunTaskHandler(List log, List tasks) {
-    void runTaskHandler(Zone self, ZoneDelegate parent, Zone zone, TaskRun run,
-        Object task, Object arg) {
-      if (tasks.contains(task)) {
-        var url = urlExpando[task];
-        if (arg is Error || arg is Exception) {
-          log.add("failed $url");
-        } else {
-          if (arg is ProgressEvent) {
-            log.add("success $url with progress-event");
-          } else if (arg is HttpRequest) {
-            log.add("success $url with http-request");
-          } else {
-            log.add("success $url (unknown arg)");
-          }
-        }
-      }
-      parent.runTask(zone, run, task, arg);
-    }
-
-    return runTaskHandler;
-  }
-
-  Future<List> runMocked(response, fun) async {
-    var log = [];
-    var tasks = [];
-    var future = runZoned(fun,
-        zoneSpecification: new ZoneSpecification(
-            createTask: buildCreateTaskHandler(log, tasks),
-            runTask: buildRunTaskHandler(log, tasks)));
-    // Wait a full cycle to make sure things settle.
-    await new Future(() {});
-    var beforeTriggerLog = log.toList();
-    log.clear();
-    expect(tasks.length, 1);
-    tasks.single.trigger(response);
-    await future;
-    return [beforeTriggerLog, log];
-  }
-
-  void validate200Response(xhr) {
-    expect(xhr.status, equals(200));
-    var data = JSON.decode(xhr.responseText);
-    expect(data, contains('feed'));
-    expect(data['feed'], contains('entry'));
-    expect(data, isMap);
-  }
-
-  void validate404(xhr) {
-    expect(xhr.status, equals(404));
-    // We cannot say much about xhr.responseText, most HTTP servers will
-    // include an HTML page explaining the error to a human.
-    String responseText = xhr.responseText;
-    expect(responseText, isNotNull);
-  }
-
-  group('xhr', () {
-    test('XHR.request No file', () async {
-      var log = await runMocked("404", () {
-        var completer = new Completer();
-        HttpRequest.request('NonExistingFile').then((_) {
-          fail('Request should not have succeeded.');
-        }, onError: expectAsync((error) {
-          var xhr = error.target;
-          expect(xhr.readyState, equals(HttpRequest.DONE));
-          validate404(xhr);
-          completer.complete('done');
-        }));
-        return completer.future;
-      });
-      expect(
-          log,
-          equals([
-            [
-              'request NonExistingFile',
-              '  method: null withCredentials: null responseType: null '
-                  'mimeType: null data: null',
-            ],
-            ['success NonExistingFile with progress-event']
-          ]));
-    });
-
-    test('XHR.request file', () async {
-      var log = await runMocked('{"feed": {"entry": 499}}', () {
-        var completer = new Completer();
-        HttpRequest.request(url).then(expectAsync((xhr) {
-          expect(xhr.readyState, equals(HttpRequest.DONE));
-          validate200Response(xhr);
-          completer.complete('done');
-        }));
-        return completer.future;
-      });
-      expect(
-          log,
-          equals([
-            [
-              'request $url',
-              '  method: null withCredentials: null responseType: null '
-                  'mimeType: null data: null'
-            ],
-            ['success $url with http-request']
-          ]));
-    });
-
-    test('XHR.getString file', () async {
-      var log = await runMocked("foo", () {
-        return HttpRequest.getString(url).then(expectAsync((str) {}));
-      });
-      expect(
-          log,
-          equals([
-            [
-              'request $url',
-              '  method: null withCredentials: null responseType: null '
-                  'mimeType: null data: null'
-            ],
-            ['success $url with http-request']
-          ]));
-    });
-
-    test('XHR.request responseType arraybuffer', () async {
-      if (Platform.supportsTypedData) {
-        var data = new Uint8List(128);
-        var log = await runMocked(data.buffer, () {
-          return HttpRequest.request(url,
-              responseType: 'arraybuffer',
-              requestHeaders: {
-                'Content-Type': 'text/xml'
-              }).then(expectAsync((xhr) {
-            expect(xhr.status, equals(200));
-            var byteBuffer = xhr.response;
-            expect(byteBuffer, new isInstanceOf<ByteBuffer>());
-            expect(byteBuffer, isNotNull);
-          }));
-        });
-        expect(
-            log,
-            equals([
-              [
-                'request $url',
-                '  method: null withCredentials: null responseType: arraybuffer'
-                    ' mimeType: null data: null'
-              ],
-              ['success $url with http-request']
-            ]));
-      }
-      ;
-    });
-  });
-}
diff --git a/tests/html/xhr_task_test.dart b/tests/html/xhr_task_test.dart
deleted file mode 100644
index c315ae6..0000000
--- a/tests/html/xhr_task_test.dart
+++ /dev/null
@@ -1,508 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for 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 XHRTaskTest;
-
-import 'dart:async';
-import 'dart:convert';
-import 'dart:html';
-import 'dart:typed_data';
-import 'package:unittest/html_individual_config.dart';
-import 'package:unittest/unittest.dart';
-
-main() {
-  useHtmlIndividualConfiguration();
-
-  // Cache blocker is a workaround for:
-  // https://code.google.com/p/dart/issues/detail?id=11834
-  var cacheBlocker = new DateTime.now().millisecondsSinceEpoch;
-  var url = '/root_dart/tests/html/xhr_cross_origin_data.txt?'
-      'cacheBlock=$cacheBlocker';
-
-  var urlExpando = new Expando();
-
-  Function buildCreateTaskHandler(List log, List tasks) {
-    Object createTaskHandler(Zone self, ZoneDelegate parent, Zone zone,
-        TaskCreate create, TaskSpecification spec) {
-      if (spec is HttpRequestTaskSpecification) {
-        var url = spec.url;
-        var method = spec.method;
-        var withCredentials = spec.withCredentials;
-        var responseType = spec.responseType;
-        var mimeType = spec.mimeType;
-        var data = spec.sendData;
-
-        log.add("request $url");
-        var dataLog = data is List<int> ? "binary ${data.length}" : "$data";
-        log.add("  method: $method withCredentials: $withCredentials "
-            "responseType: $responseType mimeType: $mimeType data: $dataLog");
-        var task = parent.createTask(zone, create, spec);
-        urlExpando[task] = url;
-        tasks.add(task);
-        return task;
-      }
-      if (spec is HttpRequestSendTaskSpecification) {
-        var data = spec.sendData;
-        var dataLog = data is List<int> ? "binary ${data.length}" : "$data";
-        log.add("http-request (no info), data: $dataLog");
-        var task = parent.createTask(zone, create, spec);
-        tasks.add(task);
-        urlExpando[task] = "unknown";
-        return task;
-      }
-      if (spec is EventSubscriptionSpecification) {
-        EventSubscriptionSpecification eventSpec = spec;
-        if (eventSpec.target is HttpRequest) {
-          HttpRequest target = eventSpec.target;
-          log.add("event listener on http-request ${eventSpec.eventType}");
-          if (eventSpec.eventType == "readystatechange") {
-            var oldOnData = eventSpec.onData;
-            spec = eventSpec.replace(onData: (event) {
-              oldOnData(event);
-              if (target.readyState == HttpRequest.DONE) {
-                log.add("unknown request done");
-              }
-            });
-          }
-        }
-      }
-      return parent.createTask(zone, create, spec);
-    }
-
-    return createTaskHandler;
-  }
-
-  Function buildRunTaskHandler(List log, List tasks) {
-    void runTaskHandler(Zone self, ZoneDelegate parent, Zone zone,
-        TaskRun run, Object task, Object arg) {
-      if (tasks.contains(task)) {
-        var url = urlExpando[task];
-        if (arg is Error || arg is Exception) {
-          log.add("failed $url");
-        } else {
-          if (arg is ProgressEvent) {
-            log.add("success $url with progress-event");
-          } else if (arg is HttpRequest){
-            log.add("success $url with http-request");
-          } else {
-            log.add("success $url (unknown arg)");
-          }
-        }
-      }
-      parent.runTask(zone, run, task, arg);
-    }
-
-    return runTaskHandler;
-  }
-
-  Future<List> runWithLogging(fun) async {
-    var log = [];
-    var tasks = [];
-    await runZoned(fun, zoneSpecification: new ZoneSpecification(
-        createTask: buildCreateTaskHandler(log, tasks),
-        runTask: buildRunTaskHandler(log, tasks)));
-    return log;
-  }
-
-  void validate200Response(xhr) {
-    expect(xhr.status, equals(200));
-    var data = JSON.decode(xhr.responseText);
-    expect(data, contains('feed'));
-    expect(data['feed'], contains('entry'));
-    expect(data, isMap);
-  }
-
-  void validate404(xhr) {
-    expect(xhr.status, equals(404));
-    // We cannot say much about xhr.responseText, most HTTP servers will
-    // include an HTML page explaining the error to a human.
-    String responseText = xhr.responseText;
-    expect(responseText, isNotNull);
-  }
-
-  group('xhr', () {
-    test('XHR No file', () async {
-      var log = await runWithLogging(() {
-        var completer = new Completer();
-        HttpRequest xhr = new HttpRequest();
-        xhr.open("GET", "NonExistingFile", async: true);
-        xhr.onReadyStateChange.listen(expectAsyncUntil((event) {
-          if (xhr.readyState == HttpRequest.DONE) {
-            validate404(xhr);
-            completer.complete("done");
-          }
-        }, () => xhr.readyState == HttpRequest.DONE));
-        xhr.send();
-        return completer.future;
-      });
-      expect(log, equals([
-        'event listener on http-request readystatechange',
-        'http-request (no info), data: null',
-        'unknown request done'
-      ]));
-    });
-
-    test('XHR_file', () async {
-      var log = await runWithLogging(() {
-        var completer = new Completer();
-        var loadEndCalled = false;
-
-        var xhr = new HttpRequest();
-        xhr.open('GET', url, async: true);
-        xhr.onReadyStateChange.listen(expectAsyncUntil((e) {
-          if (xhr.readyState == HttpRequest.DONE) {
-            validate200Response(xhr);
-
-            Timer.run(expectAsync(() {
-              expect(loadEndCalled, HttpRequest.supportsLoadEndEvent);
-              completer.complete("done");
-            }));
-          }
-        }, () => xhr.readyState == HttpRequest.DONE));
-
-        xhr.onLoadEnd.listen((ProgressEvent e) {
-          loadEndCalled = true;
-        });
-        xhr.send();
-        return completer.future;
-      });
-      expect(log, equals([
-        'event listener on http-request readystatechange',
-        'event listener on http-request loadend',
-        'http-request (no info), data: null',
-        'unknown request done'
-      ]));
-    });
-
-    test('XHR.request No file', () async {
-      var log = await runWithLogging(() {
-        var completer = new Completer();
-        HttpRequest.request('NonExistingFile').then(
-            (_) { fail('Request should not have succeeded.'); },
-            onError: expectAsync((error) {
-              var xhr = error.target;
-              expect(xhr.readyState, equals(HttpRequest.DONE));
-              validate404(xhr);
-              completer.complete('done');
-            }));
-        return completer.future;
-      });
-      expect(log, equals([
-        'request NonExistingFile',
-        '  method: null withCredentials: null responseType: null '
-            'mimeType: null data: null',
-        'event listener on http-request load',
-        'event listener on http-request error',
-        'success NonExistingFile with progress-event'
-      ]));
-    });
-
-    test('XHR.request file', () async {
-      var log = await runWithLogging(() {
-        var completer = new Completer();
-        HttpRequest.request(url).then(expectAsync((xhr) {
-          expect(xhr.readyState, equals(HttpRequest.DONE));
-          validate200Response(xhr);
-          completer.complete('done');
-        }));
-        return completer.future;
-      });
-      expect(log, equals([
-        'request $url',
-        '  method: null withCredentials: null responseType: null '
-            'mimeType: null data: null',
-        'event listener on http-request load',
-        'event listener on http-request error',
-        'success $url with http-request'
-      ]));
-    });
-
-    test('XHR.request onProgress', () async {
-      var log = await runWithLogging(() {
-        var completer = new Completer();
-        var progressCalled = false;
-        HttpRequest.request(url,
-            onProgress: (_) {
-              progressCalled = true;
-            }).then(expectAsync(
-            (xhr) {
-              expect(xhr.readyState, equals(HttpRequest.DONE));
-              expect(progressCalled, HttpRequest.supportsProgressEvent);
-              validate200Response(xhr);
-              completer.complete("done");
-        }));
-        return completer.future;
-      });
-      expect(log, equals([
-        'request $url',
-        '  method: null withCredentials: null responseType: null '
-            'mimeType: null data: null',
-        'event listener on http-request progress',
-        'event listener on http-request load',
-        'event listener on http-request error',
-        'success $url with http-request'
-      ]));
-    });
-
-    test('XHR.request withCredentials No file', () async {
-      var log = await runWithLogging(() {
-        var completer = new Completer();
-        HttpRequest.request('NonExistingFile', withCredentials: true).then(
-            (_) { fail('Request should not have succeeded.'); },
-            onError: expectAsync((error) {
-              var xhr = error.target;
-              expect(xhr.readyState, equals(HttpRequest.DONE));
-              validate404(xhr);
-              completer.complete("done");
-            }));
-        return completer.future;
-      });
-      expect(log, equals([
-        'request NonExistingFile',
-        '  method: null withCredentials: true responseType: null '
-            'mimeType: null data: null',
-        'event listener on http-request load',
-        'event listener on http-request error',
-        'success NonExistingFile with progress-event'
-      ]));
-    });
-
-
-    test('XHR.request withCredentials file', () async {
-      var log = await runWithLogging(() {
-        var completer = new Completer();
-        HttpRequest.request(url, withCredentials: true).then(expectAsync((xhr) {
-          expect(xhr.readyState, equals(HttpRequest.DONE));
-          validate200Response(xhr);
-          completer.complete("done");
-        }));
-        return completer.future;
-      });
-      expect(log, equals([
-        'request $url',
-        '  method: null withCredentials: true responseType: null '
-            'mimeType: null data: null',
-        'event listener on http-request load',
-        'event listener on http-request error',
-        'success $url with http-request'
-      ]));
-    });
-
-    test('XHR.getString file', () async {
-      var log = await runWithLogging(() {
-        return HttpRequest.getString(url).then(expectAsync((str) {}));
-      });
-      expect(log, equals([
-        'request $url',
-        '  method: null withCredentials: null responseType: null '
-            'mimeType: null data: null',
-        'event listener on http-request load',
-        'event listener on http-request error',
-        'success $url with http-request'
-      ]));
-    });
-
-    test('XHR.getString No file', () async {
-      var log = await runWithLogging(() {
-        return HttpRequest.getString('NonExistingFile').then(
-            (_) { fail('Succeeded for non-existing file.'); },
-            onError: expectAsync((error) {
-              validate404(error.target);
-            }));
-      });
-      expect(log, equals([
-        'request NonExistingFile',
-        '  method: null withCredentials: null responseType: null '
-            'mimeType: null data: null',
-        'event listener on http-request load',
-        'event listener on http-request error',
-        'success NonExistingFile with progress-event'
-      ]));
-    });
-
-    test('XHR.request responseType arraybuffer', () async {
-      if (Platform.supportsTypedData) {
-        var log = await runWithLogging(() {
-          return HttpRequest.request(url, responseType: 'arraybuffer',
-              requestHeaders: {'Content-Type': 'text/xml'}).then(
-              expectAsync((xhr) {
-                expect(xhr.status, equals(200));
-                var byteBuffer = xhr.response;
-                expect(byteBuffer, new isInstanceOf<ByteBuffer>());
-                expect(byteBuffer, isNotNull);
-              }));
-        });
-        expect(log, equals([
-          'request $url',
-          '  method: null withCredentials: null responseType: arraybuffer '
-              'mimeType: null data: null',
-          'event listener on http-request load',
-          'event listener on http-request error',
-          'success $url with http-request'
-        ]));
-      };
-    });
-
-    test('overrideMimeType', () async {
-      var expectation =
-          HttpRequest.supportsOverrideMimeType ? returnsNormally : throws;
-
-      var log = await runWithLogging(() {
-        var completer = new Completer();
-        expect(() {
-          HttpRequest.request(url, mimeType: 'application/binary')
-              .whenComplete(completer.complete);
-        }, expectation);
-        return completer.future;
-      });
-      expect(log, equals([
-        'request $url',
-        '  method: null withCredentials: null responseType: null '
-            'mimeType: application/binary data: null',
-        'event listener on http-request load',
-        'event listener on http-request error',
-        'success $url with http-request'
-      ]));
-    });
-
-    if (Platform.supportsTypedData) {
-      test('xhr upload', () async {
-        var log = await runWithLogging(() {
-          var xhr = new HttpRequest();
-          var progressCalled = false;
-          xhr.upload.onProgress.listen((e) {
-            progressCalled = true;
-          });
-
-          xhr.open('POST',
-              '${window.location.protocol}//${window.location.host}/echo');
-
-          // 10MB of payload data w/ a bit of data to make sure it
-          // doesn't get compressed to nil.
-          var data = new Uint8List(1 * 1024 * 1024);
-          for (var i = 0; i < data.length; ++i) {
-            data[i] = i & 0xFF;
-          }
-          xhr.send(new Uint8List.view(data.buffer));
-
-          return xhr.onLoad.first.then((_) {
-            expect(
-                progressCalled, isTrue, reason: 'onProgress should be fired');
-          });
-        });
-        expect(log, equals([
-          'http-request (no info), data: binary 1048576',
-          'event listener on http-request load',
-        ]));
-      });
-    }
-
-    test('xhr postFormData', () async {
-      var url = '${window.location.protocol}//${window.location.host}/echo';
-      var log = await runWithLogging(() {
-        var data = { 'name': 'John', 'time': '2 pm'};
-
-        var parts = [];
-        for (var key in data.keys) {
-          parts.add('${Uri.encodeQueryComponent(key)}='
-              '${Uri.encodeQueryComponent(data[key])}');
-        }
-        var encodedData = parts.join('&');
-
-        return HttpRequest.postFormData(url, data).then((xhr) {
-          expect(xhr.responseText, encodedData);
-        });
-      });
-      expect(log, equals([
-        'request $url',
-        '  method: POST withCredentials: null responseType: null '
-            'mimeType: null data: name=John&time=2+pm',
-        'event listener on http-request load',
-        'event listener on http-request error',
-        'success $url with http-request'
-      ]));
-    });
-  });
-
-  group('xhr_requestBlob', () {
-    test('XHR.request responseType blob', () async {
-      if (Platform.supportsTypedData) {
-        var log = await runWithLogging(() {
-          return HttpRequest.request(url, responseType: 'blob').then(
-              (xhr) {
-            expect(xhr.status, equals(200));
-            var blob = xhr.response;
-            expect(blob is Blob, isTrue);
-            expect(blob, isNotNull);
-          });
-        });
-        expect(log, equals([
-          'request $url',
-          '  method: null withCredentials: null responseType: blob '
-              'mimeType: null data: null',
-          'event listener on http-request load',
-          'event listener on http-request error',
-          'success $url with http-request'
-        ]));
-      }
-    });
-  });
-
-  group('json', () {
-    test('xhr responseType json', () async {
-      var url = '${window.location.protocol}//${window.location.host}/echo';
-      var log = await runWithLogging(() {
-        var completer = new Completer();
-        var data = {
-          'key': 'value',
-          'a': 'b',
-          'one': 2,
-        };
-
-        HttpRequest.request(url,
-            method: 'POST',
-            sendData: JSON.encode(data),
-            responseType: 'json').then(
-            expectAsync((xhr) {
-              expect(xhr.status, equals(200));
-              var json = xhr.response;
-              expect(json, equals(data));
-              completer.complete("done");
-            }));
-        return completer.future;
-      });
-      expect(log, equals([
-        'request $url',
-        '  method: POST withCredentials: null responseType: json mimeType: null'
-            ' data: {"key":"value","a":"b","one":2}',
-        'event listener on http-request load',
-        'event listener on http-request error',
-        'success $url with http-request'
-      ]));
-    });
-  });
-
-  group('headers', () {
-    test('xhr responseHeaders', () async {
-      var log = await runWithLogging(() {
-        return HttpRequest.request(url).then(
-            (xhr) {
-          var contentTypeHeader = xhr.responseHeaders['content-type'];
-          expect(contentTypeHeader, isNotNull);
-          // Should be like: 'text/plain; charset=utf-8'
-          expect(contentTypeHeader.contains('text/plain'), isTrue);
-          expect(contentTypeHeader.contains('charset=utf-8'), isTrue);
-        });
-      });
-      expect(log, equals([
-        'request $url',
-        '  method: null withCredentials: null responseType: null'
-            ' mimeType: null data: null',
-        'event listener on http-request load',
-        'event listener on http-request error',
-        'success $url with http-request'
-      ]));
-    });
-  });
-}
diff --git a/tests/lib/async/zone_task_test.dart b/tests/lib/async/zone_task_test.dart
deleted file mode 100644
index aa9b008..0000000
--- a/tests/lib/async/zone_task_test.dart
+++ /dev/null
@@ -1,310 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// Tests basic functionality of tasks in zones.
-
-import 'package:expect/expect.dart';
-import 'package:async_helper/async_helper.dart';
-import 'dart:async';
-
-List log = [];
-
-class MySpecification extends TaskSpecification {
-  final Function callback;
-  final bool isOneShot;
-  final int value;
-
-  MySpecification(void this.callback(), this.isOneShot, this.value);
-
-  String get name => "test.specification-name";
-}
-
-class MyTask {
-  final Zone zone;
-  final Function callback;
-  final int id;
-  int invocationCount = 0;
-  bool shouldStop = false;
-
-  MyTask(this.zone, void this.callback(), this.id);
-}
-
-void runMyTask(MyTask task, int value) {
-  log.add("running "
-      "zone: ${Zone.current['name']} "
-      "task-id: ${task.id} "
-      "invocation-count: ${task.invocationCount} "
-      "value: $value");
-  task.callback();
-  task.invocationCount++;
-}
-
-MyTask createMyTask(MySpecification spec, Zone zone) {
-  var task = new MyTask(zone, spec.callback, spec.value);
-  log.add("creating task: ${spec.value} oneshot?: ${spec.isOneShot}");
-  if (spec.isOneShot) {
-    Timer.run(() {
-      zone.runTask(runMyTask, task, task.id);
-    });
-  } else {
-    new Timer.periodic(const Duration(milliseconds: 10), (Timer timer) {
-      zone.runTask(runMyTask, task, task.id);
-      if (task.shouldStop) {
-        timer.cancel();
-      }
-    });
-  }
-  return task;
-}
-
-MyTask startTask(f, bool oneShot, int value) {
-  var spec = new MySpecification(f, oneShot, value);
-  return Zone.current.createTask(createMyTask, spec);
-}
-
-/// Makes sure things are working in a simple setting.
-/// No interceptions, changes, ...
-Future testCustomTask() {
-  var testCompleter = new Completer();
-  asyncStart();
-
-  Object createTaskHandler(Zone self, ZoneDelegate parent, Zone zone,
-      TaskCreate create, TaskSpecification specification) {
-    if (specification is MySpecification) {
-      log.add("create enter "
-          "zone: ${self['name']} "
-          "spec-value: ${specification.value} "
-          "spec-oneshot?: ${specification.isOneShot}");
-      MyTask result = parent.createTask(zone, create, specification);
-      log.add("create leave");
-      return result;
-    }
-    return parent.createTask(zone, create, specification);
-  }
-
-  void runTaskHandler(Zone self, ZoneDelegate parent, Zone zone, TaskRun run,
-      Object task, Object arg) {
-    if (task is MyTask) {
-      log.add("run enter "
-          "zone: ${self['name']} "
-          "task-id: ${task.id} "
-          "invocation-count: ${task.invocationCount} "
-          "arg: $arg");
-      parent.runTask(zone, run, task, arg);
-      log.add("run leave invocation-count: ${task.invocationCount}");
-      return;
-    }
-    parent.runTask(zone, run, task, arg);
-  }
-
-  runZoned(() async {
-    var completer0 = new Completer();
-    startTask(() {
-      completer0.complete("done");
-    }, true, 0);
-    await completer0.future;
-
-    Expect.listEquals([
-      'create enter zone: custom zone spec-value: 0 spec-oneshot?: true',
-      'creating task: 0 oneshot?: true',
-      'create leave',
-      'run enter zone: custom zone task-id: 0 invocation-count: 0 arg: 0',
-      'running zone: custom zone task-id: 0 invocation-count: 0 value: 0',
-      'run leave invocation-count: 1'
-    ], log);
-    log.clear();
-
-    var completer1 = new Completer();
-    MyTask task1;
-    task1 = startTask(() {
-      if (task1.invocationCount == 1) {
-        task1.shouldStop = true;
-        completer1.complete("done");
-      }
-    }, false, 1);
-    await completer1.future;
-
-    Expect.listEquals([
-      'create enter zone: custom zone spec-value: 1 spec-oneshot?: false',
-      'creating task: 1 oneshot?: false',
-      'create leave',
-      'run enter zone: custom zone task-id: 1 invocation-count: 0 arg: 1',
-      'running zone: custom zone task-id: 1 invocation-count: 0 value: 1',
-      'run leave invocation-count: 1',
-      'run enter zone: custom zone task-id: 1 invocation-count: 1 arg: 1',
-      'running zone: custom zone task-id: 1 invocation-count: 1 value: 1',
-      'run leave invocation-count: 2',
-    ], log);
-    log.clear();
-
-    testCompleter.complete("done");
-    asyncEnd();
-  },
-      zoneValues: {'name': 'custom zone'},
-      zoneSpecification: new ZoneSpecification(
-          createTask: createTaskHandler,
-          runTask: runTaskHandler));
-
-  return testCompleter.future;
-}
-
-/// More complicated zone, that intercepts...
-Future testCustomTask2() {
-  var testCompleter = new Completer();
-  asyncStart();
-
-  Object createTaskHandler(Zone self, ZoneDelegate parent, Zone zone,
-      TaskCreate create, TaskSpecification specification) {
-    if (specification is MySpecification) {
-      log.add("create enter "
-          "zone: ${self['name']} "
-          "spec-value: ${specification.value} "
-          "spec-oneshot?: ${specification.isOneShot}");
-      var replacement = new MySpecification(specification.callback,
-          specification.isOneShot, specification.value + 1);
-      MyTask result = parent.createTask(zone, create, replacement);
-      log.add("create leave");
-      return result;
-    }
-    return parent.createTask(zone, create, specification);
-  }
-
-  void runTaskHandler(Zone self, ZoneDelegate parent, Zone zone, TaskRun run,
-      Object task, Object arg) {
-    if (task is MyTask) {
-      log.add("run enter "
-          "zone: ${self['name']} "
-          "task-id: ${task.id} "
-          "invocation-count: ${task.invocationCount} "
-          "arg: $arg");
-      int value = arg;
-      parent.runTask(zone, run, task, value + 101);
-      log.add("run leave invocation-count: ${task.invocationCount}");
-      return;
-    }
-    parent.runTask(zone, run, task, arg);
-  }
-
-  runZoned(() async {
-    var completer0 = new Completer();
-    startTask(() {
-      completer0.complete("done");
-    }, true, 0);
-    await completer0.future;
-
-    Expect.listEquals([
-      'create enter zone: outer-zone spec-value: 0 spec-oneshot?: true',
-      'creating task: 1 oneshot?: true',
-      'create leave',
-      'run enter zone: outer-zone task-id: 1 invocation-count: 0 arg: 1',
-      'running zone: outer-zone task-id: 1 invocation-count: 0 value: 102',
-      'run leave invocation-count: 1'
-    ], log);
-    log.clear();
-
-    var completer1 = new Completer();
-    MyTask task1;
-    task1 = startTask(() {
-      if (task1.invocationCount == 1) {
-        task1.shouldStop = true;
-        completer1.complete("done");
-      }
-    }, false, 1);
-    await completer1.future;
-
-    Expect.listEquals([
-      'create enter zone: outer-zone spec-value: 1 spec-oneshot?: false',
-      'creating task: 2 oneshot?: false',
-      'create leave',
-      'run enter zone: outer-zone task-id: 2 invocation-count: 0 arg: 2',
-      'running zone: outer-zone task-id: 2 invocation-count: 0 value: 103',
-      'run leave invocation-count: 1',
-      'run enter zone: outer-zone task-id: 2 invocation-count: 1 arg: 2',
-      'running zone: outer-zone task-id: 2 invocation-count: 1 value: 103',
-      'run leave invocation-count: 2',
-    ], log);
-    log.clear();
-
-    var nestedCompleter = new Completer();
-
-    runZoned(() async {
-      var completer0 = new Completer();
-      startTask(() {
-        completer0.complete("done");
-      }, true, 0);
-      await completer0.future;
-
-      Expect.listEquals([
-        'create enter zone: inner-zone spec-value: 0 spec-oneshot?: true',
-        'create enter zone: outer-zone spec-value: 1 spec-oneshot?: true',
-        'creating task: 2 oneshot?: true',
-        'create leave',
-        'create leave',
-        'run enter zone: inner-zone task-id: 2 invocation-count: 0 arg: 2',
-        'run enter zone: outer-zone task-id: 2 invocation-count: 0 arg: 103',
-        'running zone: inner-zone task-id: 2 invocation-count: 0 value: 204',
-        'run leave invocation-count: 1',
-        'run leave invocation-count: 1'
-      ], log);
-      log.clear();
-
-      var completer1 = new Completer();
-      MyTask task1;
-      task1 = startTask(() {
-        if (task1.invocationCount == 1) {
-          task1.shouldStop = true;
-          completer1.complete("done");
-        }
-      }, false, 1);
-      await completer1.future;
-
-      Expect.listEquals([
-        'create enter zone: inner-zone spec-value: 1 spec-oneshot?: false',
-        'create enter zone: outer-zone spec-value: 2 spec-oneshot?: false',
-        'creating task: 3 oneshot?: false',
-        'create leave',
-        'create leave',
-        'run enter zone: inner-zone task-id: 3 invocation-count: 0 arg: 3',
-        'run enter zone: outer-zone task-id: 3 invocation-count: 0 arg: 104',
-        'running zone: inner-zone task-id: 3 invocation-count: 0 value: 205',
-        'run leave invocation-count: 1',
-        'run leave invocation-count: 1',
-        'run enter zone: inner-zone task-id: 3 invocation-count: 1 arg: 3',
-        'run enter zone: outer-zone task-id: 3 invocation-count: 1 arg: 104',
-        'running zone: inner-zone task-id: 3 invocation-count: 1 value: 205',
-        'run leave invocation-count: 2',
-        'run leave invocation-count: 2',
-      ], log);
-      log.clear();
-
-      nestedCompleter.complete("done");
-    },
-        zoneValues: {'name': 'inner-zone'},
-        zoneSpecification: new ZoneSpecification(
-            createTask: createTaskHandler,
-            runTask: runTaskHandler));
-
-    await nestedCompleter.future;
-    testCompleter.complete("done");
-    asyncEnd();
-  },
-      zoneValues: {'name': 'outer-zone'},
-      zoneSpecification: new ZoneSpecification(
-          createTask: createTaskHandler,
-          runTask: runTaskHandler));
-
-  return testCompleter.future;
-}
-
-runTests() async {
-  await testCustomTask();
-  await testCustomTask2();
-}
-
-main() {
-  asyncStart();
-  runTests().then((_) {
-    asyncEnd();
-  });
-}
diff --git a/tests/lib/async/zone_timer_task_test.dart b/tests/lib/async/zone_timer_task_test.dart
deleted file mode 100644
index 310f7ca..0000000
--- a/tests/lib/async/zone_timer_task_test.dart
+++ /dev/null
@@ -1,515 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// Tests timer tasks.
-
-import 'package:expect/expect.dart';
-import 'package:async_helper/async_helper.dart';
-import 'dart:async';
-import 'dart:collection';
-
-class MyTimerSpecification implements SingleShotTimerTaskSpecification {
-  final Function callback;
-  final Duration duration;
-
-  MyTimerSpecification(this.callback, this.duration);
-
-  bool get isOneShot => true;
-  String get name => "test.timer-override";
-}
-
-class MyPeriodicTimerSpecification implements PeriodicTimerTaskSpecification {
-  final Function callback;
-  final Duration duration;
-
-  MyPeriodicTimerSpecification(this.callback, this.duration);
-
-  bool get isOneShot => true;
-  String get name => "test.periodic-timer-override";
-}
-
-/// Makes sure things are working in a simple setting.
-/// No interceptions, changes, ...
-Future testTimerTask() {
-  List log = [];
-
-  var testCompleter = new Completer();
-  asyncStart();
-
-  int taskIdCounter = 0;
-
-  Object createTaskHandler(Zone self, ZoneDelegate parent, Zone zone,
-      TaskCreate create, TaskSpecification specification) {
-    var taskMap = self['taskMap'];
-    var taskIdMap = self['taskIdMap'];
-    if (specification is SingleShotTimerTaskSpecification) {
-      log.add("create enter "
-          "zone: ${self['name']} "
-          "spec-duration: ${specification.duration} "
-          "spec-oneshot?: ${specification.isOneShot}");
-      var result = parent.createTask(zone, create, specification);
-      taskMap[result] = specification;
-      taskIdMap[specification] = taskIdCounter++;
-      log.add("create leave");
-      return result;
-    } else if (specification is PeriodicTimerTaskSpecification) {
-      log.add("create enter "
-          "zone: ${self['name']} "
-          "spec-duration: ${specification.duration} "
-          "spec-oneshot?: ${specification.isOneShot}");
-      var result = parent.createTask(zone, create, specification);
-      taskMap[result] = specification;
-      taskIdMap[specification] = taskIdCounter++;
-      log.add("create leave");
-      return result;
-    }
-    return parent.createTask(zone, create, specification);
-  }
-
-  void runTaskHandler(Zone self, ZoneDelegate parent, Zone zone, TaskRun run,
-      Object task, Object arg) {
-    var taskMap = self['taskMap'];
-    var taskIdMap = self['taskIdMap'];
-    if (taskMap.containsKey(task)) {
-      var spec = taskMap[task];
-      log.add("run enter "
-          "zone: ${self['name']} "
-          "task-id: ${taskIdMap[spec]} "
-          "arg: $arg");
-      parent.runTask(zone, run, task, arg);
-      log.add("run leave");
-      return;
-    }
-    parent.runTask(zone, run, task, arg);
-  }
-
-  runZoned(() async {
-    var completer0 = new Completer();
-    Timer.run(() {
-      completer0.complete("done");
-    });
-    await completer0.future;
-
-    Expect.listEquals([
-      'create enter zone: custom zone spec-duration: 0:00:00.000000 '
-          'spec-oneshot?: true',
-      'create leave',
-      'run enter zone: custom zone task-id: 0 arg: null',
-      'run leave'
-    ], log);
-    log.clear();
-
-    var completer1 = new Completer();
-    var counter1 = 0;
-    new Timer.periodic(const Duration(milliseconds: 5), (Timer timer) {
-      if (counter1++ > 1) {
-        timer.cancel();
-        completer1.complete("done");
-      }
-    });
-    await completer1.future;
-
-    Expect.listEquals([
-      'create enter zone: custom zone spec-duration: 0:00:00.005000 '
-          'spec-oneshot?: false',
-      'create leave',
-      'run enter zone: custom zone task-id: 1 arg: null',
-      'run leave',
-      'run enter zone: custom zone task-id: 1 arg: null',
-      'run leave',
-      'run enter zone: custom zone task-id: 1 arg: null',
-      'run leave'
-    ], log);
-    log.clear();
-
-    testCompleter.complete("done");
-    asyncEnd();
-  },
-      zoneValues: {'name': 'custom zone', 'taskMap': {}, 'taskIdMap': {}},
-      zoneSpecification: new ZoneSpecification(
-          createTask: createTaskHandler,
-          runTask: runTaskHandler));
-
-  return testCompleter.future;
-}
-
-/// More complicated zone, that intercepts...
-Future testTimerTask2() {
-  List log = [];
-
-  var testCompleter = new Completer();
-  asyncStart();
-
-  int taskIdCounter = 0;
-
-  Object createTaskHandler(Zone self, ZoneDelegate parent, Zone zone,
-      TaskCreate create, TaskSpecification specification) {
-    var taskMap = self['taskMap'];
-    var taskIdMap = self['taskIdMap'];
-    if (specification is SingleShotTimerTaskSpecification) {
-      log.add("create enter "
-          "zone: ${self['name']} "
-          "spec-duration: ${specification.duration} "
-          "spec-oneshot?: ${specification.isOneShot}");
-      var mySpec = new MyTimerSpecification(specification.callback,
-          specification.duration + const Duration(milliseconds: 2));
-      var result = parent.createTask(zone, create, mySpec);
-      taskMap[result] = specification;
-      taskIdMap[specification] = taskIdCounter++;
-      log.add("create leave");
-      return result;
-    } else if (specification is PeriodicTimerTaskSpecification) {
-      log.add("create enter "
-          "zone: ${self['name']} "
-          "spec-duration: ${specification.duration} "
-          "spec-oneshot?: ${specification.isOneShot}");
-      var mySpec = new MyPeriodicTimerSpecification(specification.callback,
-          specification.duration + const Duration(milliseconds: 2));
-      var result = parent.createTask(zone, create, specification);
-      taskMap[result] = specification;
-      taskIdMap[specification] = taskIdCounter++;
-      log.add("create leave");
-      return result;
-    }
-    return parent.createTask(zone, create, specification);
-  }
-
-  void runTaskHandler(Zone self, ZoneDelegate parent, Zone zone, TaskRun run,
-      Object task, Object arg) {
-    var taskMap = self['taskMap'];
-    var taskIdMap = self['taskIdMap'];
-    if (taskMap.containsKey(task)) {
-      var spec = taskMap[task];
-      log.add("run enter "
-          "zone: ${self['name']} "
-          "task-id: ${taskIdMap[spec]} "
-          "arg: $arg");
-      parent.runTask(zone, run, task, arg);
-      log.add("run leave");
-      return;
-    }
-    parent.runTask(zone, run, task, arg);
-  }
-
-  runZoned(() async {
-    var completer0 = new Completer();
-    Timer.run(() {
-      completer0.complete("done");
-    });
-    await completer0.future;
-
-    // No visible change (except for the zone name) in the log, compared to the
-    // simple invocations.
-    Expect.listEquals([
-      'create enter zone: outer-zone spec-duration: 0:00:00.000000 '
-          'spec-oneshot?: true',
-      'create leave',
-      'run enter zone: outer-zone task-id: 0 arg: null',
-      'run leave'
-    ], log);
-    log.clear();
-
-    var completer1 = new Completer();
-    var counter1 = 0;
-    new Timer.periodic(const Duration(milliseconds: 5), (Timer timer) {
-      if (counter1++ > 1) {
-        timer.cancel();
-        completer1.complete("done");
-      }
-    });
-    await completer1.future;
-
-    // No visible change (except for the zone nome) in the log, compared to the
-    // simple invocations.
-    Expect.listEquals([
-      'create enter zone: outer-zone spec-duration: 0:00:00.005000 '
-          'spec-oneshot?: false',
-      'create leave',
-      'run enter zone: outer-zone task-id: 1 arg: null',
-      'run leave',
-      'run enter zone: outer-zone task-id: 1 arg: null',
-      'run leave',
-      'run enter zone: outer-zone task-id: 1 arg: null',
-      'run leave'
-    ], log);
-    log.clear();
-
-    var nestedCompleter = new Completer();
-
-    runZoned(() async {
-      var completer0 = new Completer();
-      Timer.run(() {
-        completer0.complete("done");
-      });
-      await completer0.future;
-
-      // The outer zone sees the duration change of the inner zone.
-      Expect.listEquals([
-        'create enter zone: inner-zone spec-duration: 0:00:00.000000 '
-            'spec-oneshot?: true',
-        'create enter zone: outer-zone spec-duration: 0:00:00.002000 '
-            'spec-oneshot?: true',
-        'create leave',
-        'create leave',
-        'run enter zone: inner-zone task-id: 3 arg: null',
-        'run enter zone: outer-zone task-id: 2 arg: null',
-        'run leave',
-        'run leave'
-      ], log);
-      log.clear();
-
-      var completer1 = new Completer();
-      var counter1 = 0;
-      new Timer.periodic(const Duration(milliseconds: 5), (Timer timer) {
-        if (counter1++ > 1) {
-          timer.cancel();
-          completer1.complete("done");
-        }
-      });
-      await completer1.future;
-
-      // The outer zone sees the duration change of the inner zone.
-      Expect.listEquals([
-        'create enter zone: inner-zone spec-duration: 0:00:00.005000 '
-            'spec-oneshot?: false',
-        'create enter zone: outer-zone spec-duration: 0:00:00.005000 '
-            'spec-oneshot?: false',
-        'create leave',
-        'create leave',
-        'run enter zone: inner-zone task-id: 5 arg: null',
-        'run enter zone: outer-zone task-id: 4 arg: null',
-        'run leave',
-        'run leave',
-        'run enter zone: inner-zone task-id: 5 arg: null',
-        'run enter zone: outer-zone task-id: 4 arg: null',
-        'run leave',
-        'run leave',
-        'run enter zone: inner-zone task-id: 5 arg: null',
-        'run enter zone: outer-zone task-id: 4 arg: null',
-        'run leave',
-        'run leave'
-      ], log);
-      log.clear();
-
-      nestedCompleter.complete("done");
-    },
-        zoneValues: {'name': 'inner-zone', 'taskMap': {}, 'taskIdMap': {}},
-        zoneSpecification: new ZoneSpecification(
-            createTask: createTaskHandler,
-            runTask: runTaskHandler));
-
-    await nestedCompleter.future;
-    testCompleter.complete("done");
-    asyncEnd();
-  },
-      zoneValues: {'name': 'outer-zone', 'taskMap': {}, 'taskIdMap': {}},
-      zoneSpecification: new ZoneSpecification(
-          createTask: createTaskHandler,
-          runTask: runTaskHandler));
-
-  return testCompleter.future;
-}
-
-class TimerEntry {
-  final int time;
-  final SimulatedTimer timer;
-
-  TimerEntry(this.time, this.timer);
-}
-
-class SimulatedTimer implements Timer {
-  static int _idCounter = 0;
-
-  Zone _zone;
-  final int _id = _idCounter++;
-  final Duration _duration;
-  final Function _callback;
-  final bool _isPeriodic;
-  bool _isActive = true;
-
-  SimulatedTimer(this._zone, this._duration, this._callback, this._isPeriodic);
-
-  bool get isActive => _isActive;
-
-  void cancel() {
-    _isActive = false;
-  }
-
-  void _run() {
-    if (!isActive) return;
-    _zone.runTask(_runTimer, this, null);
-  }
-
-  static void _runTimer(SimulatedTimer timer, _) {
-    if (timer._isPeriodic) {
-      timer._callback(timer);
-    } else {
-      timer._callback();
-    }
-  }
-}
-
-testSimulatedTimer() {
-  List log = [];
-
-  var currentTime = 0;
-  // Using a simple list as queue. Not very efficient, but the test has only
-  // very few timers running at the same time.
-  var queue = new DoubleLinkedQueue<TimerEntry>();
-
-  // Schedules the given callback at now + duration.
-  void schedule(int scheduledTime, SimulatedTimer timer) {
-    log.add("scheduling timer ${timer._id} for $scheduledTime");
-    if (queue.isEmpty) {
-      queue.add(new TimerEntry(scheduledTime, timer));
-    } else {
-      DoubleLinkedQueueEntry current = queue.firstEntry();
-      while (current != null) {
-        if (current.element.time <= scheduledTime) {
-          current = current.nextEntry();
-        } else {
-          current.prepend(new TimerEntry(scheduledTime, timer));
-          break;
-        }
-      }
-      if (current == null) {
-        queue.add(new TimerEntry(scheduledTime, timer));
-      }
-    }
-  }
-
-  void runQueue() {
-    while (queue.isNotEmpty) {
-      var item = queue.removeFirst();
-      // If multiple callbacks were scheduled at the same time, increment the
-      // current time instead of staying at the same time.
-      currentTime = item.time > currentTime ? item.time : currentTime + 1;
-      SimulatedTimer timer = item.timer;
-      log.add("running timer ${timer._id} at $currentTime "
-          "(active?: ${timer.isActive})");
-      if (!timer.isActive) continue;
-      if (timer._isPeriodic) {
-        schedule(currentTime + timer._duration.inMilliseconds, timer);
-      }
-      item.timer._run();
-    }
-  }
-
-  SimulatedTimer createSimulatedOneShotTimer(
-      SingleShotTimerTaskSpecification spec, Zone zone) {
-    var timer = new SimulatedTimer(zone, spec.duration, spec.callback, false);
-    schedule(currentTime + spec.duration.inMilliseconds, timer);
-    return timer;
-  }
-
-  SimulatedTimer createSimulatedPeriodicTimer(
-      PeriodicTimerTaskSpecification spec, Zone zone) {
-    var timer = new SimulatedTimer(zone, spec.duration, spec.callback, true);
-    schedule(currentTime + spec.duration.inMilliseconds, timer);
-    return timer;
-  }
-
-  Object createSimulatedTaskHandler(Zone self, ZoneDelegate parent, Zone zone,
-      TaskCreate create, TaskSpecification specification) {
-    var taskMap = self['taskMap'];
-    var taskIdMap = self['taskIdMap'];
-    if (specification is SingleShotTimerTaskSpecification) {
-      log.add("create enter "
-          "zone: ${self['name']} "
-          "spec-duration: ${specification.duration} "
-          "spec-oneshot?: ${specification.isOneShot}");
-      var result =
-          parent.createTask(zone, createSimulatedOneShotTimer, specification);
-      log.add("create leave");
-      return result;
-    }
-    if (specification is PeriodicTimerTaskSpecification) {
-      log.add("create enter "
-          "zone: ${self['name']} "
-          "spec-duration: ${specification.duration} "
-          "spec-oneshot?: ${specification.isOneShot}");
-      var result =
-          parent.createTask(zone, createSimulatedPeriodicTimer, specification);
-      log.add("create leave");
-      return result;
-    }
-    return parent.createTask(zone, create, specification);
-  }
-
-  runZoned(() {
-    Timer.run(() {
-      log.add("running Timer.run");
-    });
-
-    var timer0;
-
-    new Timer(const Duration(milliseconds: 10), () {
-      log.add("running Timer(10)");
-      timer0.cancel();
-      log.add("canceled timer0");
-    });
-
-    timer0 = new Timer(const Duration(milliseconds: 15), () {
-      log.add("running Timer(15)");
-    });
-
-    var counter1 = 0;
-    new Timer.periodic(const Duration(milliseconds: 5), (Timer timer) {
-      log.add("running periodic timer $counter1");
-      if (counter1++ > 1) {
-        timer.cancel();
-      }
-    });
-  },
-      zoneSpecification:
-          new ZoneSpecification(createTask: createSimulatedTaskHandler));
-
-  runQueue();
-
-  Expect.listEquals([
-    'create enter zone: null spec-duration: 0:00:00.000000 spec-oneshot?: true',
-    'scheduling timer 0 for 0',
-    'create leave',
-    'create enter zone: null spec-duration: 0:00:00.010000 spec-oneshot?: true',
-    'scheduling timer 1 for 10',
-    'create leave',
-    'create enter zone: null spec-duration: 0:00:00.015000 spec-oneshot?: true',
-    'scheduling timer 2 for 15',
-    'create leave',
-    'create enter zone: null spec-duration: 0:00:00.005000 '
-        'spec-oneshot?: false',
-    'scheduling timer 3 for 5',
-    'create leave',
-    'running timer 0 at 1 (active?: true)',
-    'running Timer.run',
-    'running timer 3 at 5 (active?: true)',
-    'scheduling timer 3 for 10',
-    'running periodic timer 0',
-    'running timer 1 at 10 (active?: true)',
-    'running Timer(10)',
-    'canceled timer0',
-    'running timer 3 at 11 (active?: true)',
-    'scheduling timer 3 for 16',
-    'running periodic timer 1',
-    'running timer 2 at 15 (active?: false)',
-    'running timer 3 at 16 (active?: true)',
-    'scheduling timer 3 for 21',
-    'running periodic timer 2',
-    'running timer 3 at 21 (active?: false)'
-  ], log);
-  log.clear();
-}
-
-runTests() async {
-  await testTimerTask();
-  await testTimerTask2();
-  testSimulatedTimer();
-}
-
-main() {
-  asyncStart();
-  runTests().then((_) {
-    asyncEnd();
-  });
-}
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index ecfc10d..8d3dcee 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -167,8 +167,6 @@
 async/stream_transformation_broadcast_test: RuntimeError # Timer interface not supported: Issue 7728.
 async/stream_controller_test: Fail # Timer interface not supported: Issue 7728.
 async/future_constructor2_test: Fail # Timer interface not supported: Issue 7728.
-async/zone_timer_task_test: Fail # Timer interface not supported: Issue 7728.
-async/zone_task_test: Fail # Timer interface not supported: Issue 7728.
 mirrors/mirrors_reader_test: Skip # Running in v8 suffices. Issue 16589 - RuntimeError.  Issue 22130 - Crash (out of memory).
 
 [ $compiler == dart2js && $checked ]
diff --git a/tools/VERSION b/tools/VERSION
index e275633..261629f 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -28,4 +28,4 @@
 MINOR 18
 PATCH 0
 PRERELEASE 4
-PRERELEASE_PATCH 2
+PRERELEASE_PATCH 3
diff --git a/tools/dom/docs/docs.json b/tools/dom/docs/docs.json
index 98455fd..123447d 100644
--- a/tools/dom/docs/docs.json
+++ b/tools/dom/docs/docs.json
@@ -4201,7 +4201,7 @@
           "   *",
           "   * Note: Most simple HTTP requests can be accomplished using the [getString],",
           "   * [request], [requestCrossOrigin], or [postFormData] methods. Use of this",
-          "   * `open` method is intended only for more complex HTTP requests where",
+          "   * `open` method is intended only for more complext HTTP requests where",
           "   * finer-grained control is needed.",
           "   */"
         ],
@@ -4298,7 +4298,7 @@
           "   *",
           "   * Note: Most simple HTTP requests can be accomplished using the [getString],",
           "   * [request], [requestCrossOrigin], or [postFormData] methods. Use of this",
-          "   * `send` method is intended only for more complex HTTP requests where",
+          "   * `send` method is intended only for more complext HTTP requests where",
           "   * finer-grained control is needed.",
           "   *",
           "   * ## Other resources",
diff --git a/tools/dom/scripts/htmlrenamer.py b/tools/dom/scripts/htmlrenamer.py
index 3d3c410..856da50 100644
--- a/tools/dom/scripts/htmlrenamer.py
+++ b/tools/dom/scripts/htmlrenamer.py
@@ -402,11 +402,8 @@
   'WindowTimers.setTimeout',
   'Window.moveTo',
   'Window.requestAnimationFrame',
-  'Window.cancelAnimationFrame',
   'Window.setInterval',
   'Window.setTimeout',
-
-  'XMLHttpRequest.send',
 ])
 
 # Members from the standard dom that exist in the dart:html library with
diff --git a/tools/dom/src/EventStreamProvider.dart b/tools/dom/src/EventStreamProvider.dart
index b6c32fc..474a143 100644
--- a/tools/dom/src/EventStreamProvider.dart
+++ b/tools/dom/src/EventStreamProvider.dart
@@ -118,41 +118,6 @@
   StreamSubscription<T> capture(void onData(T event));
 }
 
-/// Task specification for DOM Events.
-///
-/// *Experimental*. May disappear without notice.
-class EventSubscriptionSpecification<T extends Event>
-    implements TaskSpecification {
-  @override
-  final String name;
-  @override
-  final bool isOneShot;
-
-  final EventTarget target;
-  /// The event-type of the event. For example 'click' for click events.
-  final String eventType;
-  // TODO(floitsch): the first generic argument should be 'void'.
-  final ZoneUnaryCallback<dynamic, T> onData;
-  final bool useCapture;
-
-  EventSubscriptionSpecification({this.name, this.isOneShot, this.target,
-      this.eventType, void this.onData(T event), this.useCapture});
-
-  /// Returns a copy of this instance, with every non-null argument replaced
-  /// by the given value.
-  EventSubscriptionSpecification<T> replace(
-      {String name, bool isOneShot, EventTarget target,
-       String eventType, void onData(T event), bool useCapture}) {
-    return new EventSubscriptionSpecification<T>(
-        name: name ?? this.name,
-        isOneShot: isOneShot ?? this.isOneShot,
-        target: target ?? this.target,
-        eventType: eventType ?? this.eventType,
-        onData: onData ?? this.onData,
-        useCapture: useCapture ?? this.useCapture);
-  }
-}
-
 /**
  * Adapter for exposing DOM events as Dart streams.
  */
@@ -160,16 +125,8 @@
   final EventTarget _target;
   final String _eventType;
   final bool _useCapture;
-  /// The name that is used in the task specification.
-  final String _name;
-  /// Whether the stream can trigger multiple times.
-  final bool _isOneShot;
 
-  _EventStream(this._target, String eventType, this._useCapture,
-      {String name, bool isOneShot: false})
-      : _eventType = eventType,
-        _isOneShot = isOneShot,
-        _name = name ?? "dart.html.event.$eventType";
+  _EventStream(this._target, this._eventType, this._useCapture);
 
   // DOM events are inherently multi-subscribers.
   Stream<T> asBroadcastStream({void onListen(StreamSubscription<T> subscription),
@@ -177,31 +134,13 @@
       => this;
   bool get isBroadcast => true;
 
-  StreamSubscription<T> _listen(
-      void onData(T event), {bool useCapture}) {
-
-    if (identical(Zone.current, Zone.ROOT)) {
-      return new _EventStreamSubscription<T>(
-          this._target, this._eventType, onData, this._useCapture,
-          Zone.current);
-    }
-
-    var specification = new EventSubscriptionSpecification<T>(
-        name: this._name, isOneShot: this._isOneShot,
-        target: this._target, eventType: this._eventType,
-        onData: onData, useCapture: useCapture);
-    // We need to wrap the _createStreamSubscription call, since a tear-off
-    // would not bind the generic type 'T'.
-    return Zone.current.createTask((spec, Zone zone) {
-      return _createStreamSubscription/*<T>*/(spec, zone);
-    }, specification);
-  }
-
   StreamSubscription<T> listen(void onData(T event),
       { Function onError,
         void onDone(),
         bool cancelOnError}) {
-    return _listen(onData, useCapture: this._useCapture);
+
+    return new _EventStreamSubscription<T>(
+        this._target, this._eventType, onData, this._useCapture);
   }
 }
 
@@ -216,9 +155,8 @@
  */
 class _ElementEventStreamImpl<T extends Event> extends _EventStream<T>
     implements ElementStream<T> {
-  _ElementEventStreamImpl(target, eventType, useCapture,
-      {String name, bool isOneShot: false}) :
-      super(target, eventType, useCapture, name: name, isOneShot: isOneShot);
+  _ElementEventStreamImpl(target, eventType, useCapture) :
+      super(target, eventType, useCapture);
 
   Stream<T> matches(String selector) => this.where(
       (event) => _matchesWithAncestors(event, selector)).map((e) {
@@ -226,9 +164,9 @@
         return e;
       });
 
-  StreamSubscription<T> capture(void onData(T event)) {
-    return _listen(onData, useCapture: true);
-  }
+  StreamSubscription<T> capture(void onData(T event)) =>
+    new _EventStreamSubscription<T>(
+        this._target, this._eventType, onData, true);
 }
 
 /**
@@ -277,13 +215,7 @@
   bool get isBroadcast => true;
 }
 
-StreamSubscription/*<T>*/ _createStreamSubscription/*<T>*/(
-    EventSubscriptionSpecification/*<T>*/ spec, Zone zone) {
-  return new _EventStreamSubscription/*<T>*/(spec.target, spec.eventType,
-      spec.onData, spec.useCapture, zone);
-}
-
-// We would like this to just be EventListener<T> but that typedef cannot
+// We would like this to just be EventListener<T> but that typdef cannot
 // use generics until dartbug/26276 is fixed.
 typedef _EventListener<T extends Event>(T event);
 
@@ -292,19 +224,15 @@
   EventTarget _target;
   final String _eventType;
   EventListener _onData;
-  EventListener _domCallback;
   final bool _useCapture;
-  final Zone _zone;
 
   // TODO(jacobr): for full strong mode correctness we should write
-  // _onData = onData == null ? null : _wrapZone/*<dynamic, Event>*/((e) => onData(e as T))
+  // _onData = onData == null ? null : _wrapZone/*<Event, dynamic>*/((e) => onData(e as T))
   // but that breaks 114 co19 tests as well as multiple html tests as it is reasonable
   // to pass the wrong type of event object to an event listener as part of a
   // test.
   _EventStreamSubscription(this._target, this._eventType, void onData(T event),
-      this._useCapture, Zone zone)
-      : _zone = zone,
-        _onData = _registerZone/*<dynamic, Event>*/(zone, onData) {
+      this._useCapture) : _onData = _wrapZone/*<Event, dynamic>*/(onData) {
     _tryResume();
   }
 
@@ -326,7 +254,7 @@
     }
     // Remove current event listener.
     _unlisten();
-    _onData = _registerZone/*<dynamic, Event>*/(_zone, handleData);
+    _onData = _wrapZone/*<Event, dynamic>*/(handleData);
     _tryResume();
   }
 
@@ -355,25 +283,14 @@
   }
 
   void _tryResume() {
-    if (_onData == null || isPaused) return;
-    if (identical(_zone, Zone.ROOT)) {
-      _domCallback = _onData;
-    } else {
-      _domCallback = (event) {
-        _zone.runTask(_runEventNotification, this, event);
-      };
+    if (_onData != null && !isPaused) {
+      _target.addEventListener(_eventType, _onData, _useCapture);
     }
-    _target.addEventListener(_eventType, _domCallback, _useCapture);
-  }
-
-  static void _runEventNotification/*<T>*/(
-      _EventStreamSubscription/*<T>*/ subscription, /*=T*/ event) {
-    subscription._onData(event);
   }
 
   void _unlisten() {
     if (_onData != null) {
-      _target.removeEventListener(_eventType, _domCallback, _useCapture);
+      _target.removeEventListener(_eventType, _onData, _useCapture);
     }
   }
 
diff --git a/tools/dom/src/shared_html.dart b/tools/dom/src/shared_html.dart
index f2c32f3..7342cdf 100644
--- a/tools/dom/src/shared_html.dart
+++ b/tools/dom/src/shared_html.dart
@@ -4,26 +4,31 @@
 
 part of dart.dom.html;
 
-ZoneUnaryCallback/*<R, T>*/ _registerZone/*<R, T>*/(Zone zone,
-    ZoneUnaryCallback/*<R, T>*/ callback) {
-  // For performance reasons avoid registering if we are in the root zone.
-  if (identical(zone, Zone.ROOT)) return callback;
-  if (callback == null) return null;
-  return zone.registerUnaryCallback(callback);
-}
+// TODO(jacobr): remove these typedefs when dart:async supports generic types.
+typedef R _wrapZoneCallback<A, R>(A a);
+typedef R _wrapZoneBinaryCallback<A, B, R>(A a, B b);
 
-ZoneUnaryCallback/*<R, T>*/ _wrapZone/*<R, T>*/(ZoneUnaryCallback/*<R, T>*/ callback) {
+_wrapZoneCallback/*<A, R>*/ _wrapZone/*<A, R>*/(_wrapZoneCallback/*<A, R>*/ callback) {
   // For performance reasons avoid wrapping if we are in the root zone.
-  if (identical(Zone.current, Zone.ROOT)) return callback;
+  if (Zone.current == Zone.ROOT) return callback;
   if (callback == null) return null;
-  return Zone.current.bindUnaryCallback(callback, runGuarded: true);
+  // TODO(jacobr): we cast to _wrapZoneCallback/*<A, R>*/ to hack around missing
+  // generic method support in zones.
+  // ignore: STRONG_MODE_DOWN_CAST_COMPOSITE
+  _wrapZoneCallback/*<A, R>*/ wrapped =
+      Zone.current.bindUnaryCallback(callback, runGuarded: true);
+  return wrapped;
 }
 
-ZoneBinaryCallback/*<R, A, B>*/ _wrapBinaryZone/*<R, A, B>*/(
-    ZoneBinaryCallback/*<R, A, B>*/ callback) {
-  if (identical(Zone.current, Zone.ROOT)) return callback;
+_wrapZoneBinaryCallback/*<A, B, R>*/ _wrapBinaryZone/*<A, B, R>*/(_wrapZoneBinaryCallback/*<A, B, R>*/ callback) {
+  if (Zone.current == Zone.ROOT) return callback;
   if (callback == null) return null;
-  return Zone.current.bindBinaryCallback(callback, runGuarded: true);
+  // We cast to _wrapZoneBinaryCallback/*<A, B, R>*/ to hack around missing
+  // generic method support in zones.
+  // ignore: STRONG_MODE_DOWN_CAST_COMPOSITE
+  _wrapZoneBinaryCallback/*<A, B, R>*/ wrapped =
+      Zone.current.bindBinaryCallback(callback, runGuarded: true);
+  return wrapped;
 }
 
 /**
diff --git a/tools/dom/templates/html/impl/impl_Window.darttemplate b/tools/dom/templates/html/impl/impl_Window.darttemplate
index e2cdaee..8abac37 100644
--- a/tools/dom/templates/html/impl/impl_Window.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Window.darttemplate
@@ -4,99 +4,6 @@
 
 part of $LIBRARYNAME;
 
-typedef void RemoveFrameRequestMapping(int id);
-
-/**
- * The task object representing animation-frame requests.
- *
- * For historical reasons, [Window.requestAnimationFrame] returns an integer
- * to users. However, zone tasks must be unique objects, and an integer can
- * therefore not be used as task object. The [Window] class thus keeps a mapping
- * from the integer ID to the corresponding task object. All zone related
- * operations work on this task object, whereas users of
- * [Window.requestAnimationFrame] only see the integer ID.
- *
- * Since this mapping takes up space, it must be removed when the
- * animation-frame task has triggered. The default implementation does this
- * automatically, but intercepting implementations of `requestAnimationFrame`
- * must make sure to call the [AnimationFrameTask.removeMapping]
- * function that is provided in the task specification.
- *
- * *Experimental*. This class may disappear without notice.
- */
-abstract class AnimationFrameTask {
-  /** The ID that is returned to users. */
-  int get id;
-
-  /** The zone in which the task will run. */
-  Zone get zone;
-
-  /**
-   * Cancels the animation-frame request.
-   *
-   * A call to [Window.cancelAnimationFrame] with an `id` argument equal to [id]
-   * forwards the request to this function.
-   *
-   * Zones that intercept animation-frame requests implement this method so
-   * that they can react to cancelation requests.
-   */
-  void cancel(Window window);
-
-  /**
-   * Maps animation-frame request IDs to their task objects.
-   */
-  static final Map<int, _AnimationFrameTask> _tasks = {};
-
-  /**
-   * Removes the mapping from [id] to [AnimationFrameTask].
-   *
-   * This function must be invoked by user-implemented animation-frame
-   * tasks, before running [callback].
-   *
-   * See [AnimationFrameTask].
-   */
-  static void removeMapping(int id) {
-    _tasks.remove(id);
-  }
-}
-
-class _AnimationFrameTask implements AnimationFrameTask {
-  final int id;
-  final Zone zone;
-  final FrameRequestCallback _callback;
-
-  _AnimationFrameTask(this.id, this.zone, this._callback);
-
-  void cancel(Window window) {
-    window._cancelAnimationFrame(this.id);
-  }
-}
-
-/**
- * The task specification for an animation-frame request.
- *
- * *Experimental*. This class may disappear without notice.
- */
-class AnimationFrameRequestSpecification implements TaskSpecification {
-  /**
-   * The window on which [Window.requestAnimationFrame] was invoked.
-   */
-  final Window window;
-
-  /**
-   * The callback that is executed when the animation-frame is ready.
-   *
-   * Note that the callback hasn't been registered in any zone when the `create`
-   * function (passed to [Zone.createTask]) is invoked.
-   */
-  final FrameRequestCallback callback;
-
-  AnimationFrameRequestSpecification(this.window, this.callback);
-
-  String get name => "dart.html.request-animation-frame";
-  bool get isOneShot => true;
-}
-
 @DocsEditable()
 $if DART2JS
 $(ANNOTATIONS)@Native("Window,DOMWindow")
@@ -122,7 +29,9 @@
    */
   Future<num> get animationFrame {
     var completer = new Completer<num>.sync();
-    requestAnimationFrame(completer.complete);
+    requestAnimationFrame((time) {
+      completer.complete(time);
+    });
     return completer.future;
   }
 
@@ -187,8 +96,6 @@
     JS('void', '#.location = #', this, value);
   }
 
-$endif
-
   /**
    * Called to draw an animation frame and then request the window to repaint
    * after [callback] has finished (creating the animation).
@@ -207,33 +114,8 @@
    */
   @DomName('Window.requestAnimationFrame')
   int requestAnimationFrame(FrameRequestCallback callback) {
-$if DART2JS
     _ensureRequestAnimationFrame();
-$endif
-    if (identical(Zone.current, Zone.ROOT)) {
-      return _requestAnimationFrame(callback);
-    }
-    var spec = new AnimationFrameRequestSpecification(this, callback);
-    var task = Zone.current.createTask/*<AnimationFrameTask>*/(
-        _createAnimationFrameTask, spec);
-    AnimationFrameTask._tasks[task.id] = task;
-    return task.id;
-  }
-
-  static _AnimationFrameTask _createAnimationFrameTask(
-      AnimationFrameRequestSpecification spec, Zone zone) {
-    var task;
-    var id = spec.window._requestAnimationFrame((num time) {
-      AnimationFrameTask.removeMapping(task.id);
-      zone.runTask(_runAnimationFrame, task, time);
-    });
-    var callback = zone.registerUnaryCallback(spec.callback);
-    task = new _AnimationFrameTask(id, zone, callback);
-    return task;
-  }
-
-  static void _runAnimationFrame(_AnimationFrameTask task, num time) {
-    task._callback(time);
+    return _requestAnimationFrame(_wrapZone/*<num, dynamic>*/(callback));
   }
 
   /**
@@ -244,21 +126,11 @@
    * * [Window.cancelAnimationFrame](https://developer.mozilla.org/en-US/docs/Web/API/Window.cancelAnimationFrame)
    *   from MDN.
    */
-  @DomName('Window.cancelAnimationFrame')
   void cancelAnimationFrame(int id) {
-$if DART2JS
     _ensureRequestAnimationFrame();
-$endif
-    var task = AnimationFrameTask._tasks.remove(id);
-    if (task == null) {
-      // Assume that the animation frame request wasn't intercepted by a zone.
-      _cancelAnimationFrame(id);
-      return;
-    }
-    task.cancel(this);
+    _cancelAnimationFrame(id);
   }
 
-$if DART2JS
   @JSName('requestAnimationFrame')
   int _requestAnimationFrame(FrameRequestCallback callback) native;
 
@@ -309,6 +181,28 @@
   /// The debugging console for this window.
   @DomName('Window.console')
   Console get console => Console._safeConsole;
+
+$else
+  /**
+   * Called to draw an animation frame and then request the window to repaint
+   * after [callback] has finished (creating the animation).
+   *
+   * Use this method only if you need to later call [cancelAnimationFrame]. If
+   * not, the preferred Dart idiom is to set animation frames by calling
+   * [animationFrame], which returns a Future.
+   *
+   * Returns a non-zero valued integer to represent the request id for this
+   * request. This value only needs to be saved if you intend to call
+   * [cancelAnimationFrame] so you can specify the particular animation to
+   * cancel.
+   *
+   * Note: The supplied [callback] needs to call [requestAnimationFrame] again
+   * for the animation to continue.
+   */
+  @DomName('Window.requestAnimationFrame')
+  int requestAnimationFrame(FrameRequestCallback callback) {
+    return _requestAnimationFrame(_wrapZone(callback));
+  }
 $endif
 
   /**
diff --git a/tools/dom/templates/html/impl/impl_XMLHttpRequest.darttemplate b/tools/dom/templates/html/impl/impl_XMLHttpRequest.darttemplate
index 35683fc..9ad00f6 100644
--- a/tools/dom/templates/html/impl/impl_XMLHttpRequest.darttemplate
+++ b/tools/dom/templates/html/impl/impl_XMLHttpRequest.darttemplate
@@ -4,109 +4,6 @@
 
 part of $LIBRARYNAME;
 
-/**
- * A task specification for HTTP requests.
- *
- * This specification is not available when an HTTP request is sent through
- * direct use of [HttpRequest.send]. See [HttpRequestSendTaskSpecification].
- *
- * A task created from this specification is a `Future<HttpRequest>`.
- *
- * *Experimental*. This class may disappear without notice.
- */
-class HttpRequestTaskSpecification extends TaskSpecification {
-  /// The URL of the request.
-  final String url;
-
-  /// The HTTP request method.
-  ///
-  /// By default (when `null`) this is a `"GET"` request. Alternatively, the
-  /// method can be `"POST"`, `"PUT"`, `"DELETE"`, etc.
-  final String method;
-
-  /// Whether the request should send credentials. Credentials are only useful
-  /// for cross-origin requests.
-  ///
-  /// See [HttpRequest.request] for more information.
-  final bool withCredentials;
-
-  /// The desired response format.
-  ///
-  /// Supported types are:
-  /// - `""`: (same as `"text"`),
-  /// - `"arraybuffer"`,
-  /// - `"blob"`,
-  /// - `"document"`,
-  /// - `"json"`,
-  /// - `"text"`
-  ///
-  /// When no value is provided (when equal to `null`) defaults to `""`.
-  final String responseType;
-
-  /// The desired MIME type.
-  ///
-  /// This overrides the default MIME type which is set up to transfer textual
-  /// data.
-  final String mimeType;
-
-  /// The request headers that should be sent with the request.
-  final Map<String, String> requestHeaders;
-
-  /// The data that is sent with the request.
-  ///
-  /// When data is provided (the value is not `null`), it must be a
-  /// [ByteBuffer], [Blob], [Document], [String], or [FormData].
-  final dynamic sendData;
-
-  /// The function that is invoked on progress updates. This function is
-  /// registered as an event listener on the created [HttpRequest] object, and
-  /// thus has its own task. Further invocations of the progress function do
-  /// *not* use the HTTP request task as task object.
-  ///
-  /// Creating an HTTP request automatically registers the on-progress listener.
-  final ZoneUnaryCallback<dynamic, ProgressEvent> onProgress;
-
-  HttpRequestTaskSpecification(this.url,
-      {String this.method, bool this.withCredentials, String this.responseType,
-      String this.mimeType, Map<String, String> this.requestHeaders,
-      this.sendData,
-      void this.onProgress(ProgressEvent e)});
-
-  String get name => "dart.html.http-request";
-  bool get isOneShot => true;
-}
-
-/**
- * A task specification for HTTP requests that are initiated through a direct
- * invocation of [HttpRequest.send].
- *
- * This specification serves as signal to zones that an HTTP request has been
- * initiated. The created task is the [request] object itself, and
- * no callback is ever executed in this task.
- *
- * Note that event listeners on the HTTP request are also registered in the
- * zone (although with their own task creations), and that a zone can thus
- * detect when the HTTP request returns.
- *
- * HTTP requests that are initiated through `request` methods don't use
- * this class but use [HttpRequestTaskSpecification].
- *
- * *Experimental*. This class may disappear without notice.
- */
-class HttpRequestSendTaskSpecification extends TaskSpecification {
-  final HttpRequest request;
-  final dynamic sendData;
-
-  HttpRequestSendTaskSpecification(this.request, this.sendData);
-
-  String get name => "dart.html.http-request-send";
-
-  /**
-   * No callback is ever executed in an HTTP request send task.
-   */
-  bool get isOneShot => false;
-}
-
  /**
   * A client-side XHR request for getting data from a URL,
   * formally known as XMLHttpRequest.
@@ -293,34 +190,7 @@
       {String method, bool withCredentials, String responseType,
       String mimeType, Map<String, String> requestHeaders, sendData,
       void onProgress(ProgressEvent e)}) {
-    var spec = new HttpRequestTaskSpecification(
-        url, method: method,
-        withCredentials: withCredentials,
-        responseType: responseType,
-        mimeType: mimeType,
-        requestHeaders: requestHeaders,
-        sendData: sendData,
-        onProgress: onProgress);
-
-    if (identical(Zone.current, Zone.ROOT)) {
-      return _createHttpRequestTask(spec, null);
-    }
-    return Zone.current.createTask(_createHttpRequestTask, spec);
-  }
-
-  static Future<HttpRequest> _createHttpRequestTask(
-      HttpRequestTaskSpecification spec, Zone zone) {
-    String url = spec.url;
-    String method = spec.method;
-    bool withCredentials = spec.withCredentials;
-    String responseType = spec.responseType;
-    String mimeType = spec.mimeType;
-    Map<String, String> requestHeaders = spec.requestHeaders;
-    var sendData = spec.sendData;
-    var onProgress = spec.onProgress;
-
     var completer = new Completer<HttpRequest>();
-    var task = completer.future;
 
     var xhr = new HttpRequest();
     if (method == null) {
@@ -360,42 +230,23 @@
       // redirect case will be handled by the browser before it gets to us,
       // so if we see it we should pass it through to the user.
       var unknownRedirect = xhr.status > 307 && xhr.status < 400;
-
-      var isSuccessful = accepted || fileUri || notModified || unknownRedirect;
-
-      if (zone == null && isSuccessful) {
+      
+      if (accepted || fileUri || notModified || unknownRedirect) {
         completer.complete(xhr);
-      } else if (zone == null) {
-        completer.completeError(e);
-      } else if (isSuccessful) {
-        zone.runTask((task, value) {
-          completer.complete(value);
-        }, task, xhr);
       } else {
-        zone.runTask((task, error) {
-          completer.completeError(error);
-        }, task, e);
+        completer.completeError(e);
       }
     });
 
-    if (zone == null) {
-      xhr.onError.listen(completer.completeError);
-    } else {
-      xhr.onError.listen((error) {
-        zone.runTask((task, error) {
-          completer.completeError(error);
-        }, task, error);
-      });
-    }
+    xhr.onError.listen(completer.completeError);
 
     if (sendData != null) {
-      // TODO(floitsch): should we go through 'send()' and have nested tasks?
-      xhr._send(sendData);
+      xhr.send(sendData);
     } else {
-      xhr._send();
+      xhr.send();
     }
 
-    return task;
+    return completer.future;
   }
 
   /**
@@ -465,9 +316,6 @@
         return xhr.responseText;
       });
     }
-    // TODO(floitsch): the following code doesn't go through task zones.
-    // Since 'XDomainRequest' is an IE9 feature we should probably just remove
-    // it.
 $if DART2JS
     var completer = new Completer<String>();
     if (method == null) {
@@ -548,7 +396,7 @@
    *
    * Note: Most simple HTTP requests can be accomplished using the [getString],
    * [request], [requestCrossOrigin], or [postFormData] methods. Use of this
-   * `open` method is intended only for more complex HTTP requests where
+   * `open` method is intended only for more complext HTTP requests where
    * finer-grained control is needed.
    */
   @DomName('XMLHttpRequest.open')
@@ -565,35 +413,5 @@
   void open(String method, String url, {bool async, String user, String password}) native;
 $endif
 
-  /**
-   * Sends the request with any given `data`.
-   *
-   * Note: Most simple HTTP requests can be accomplished using the [getString],
-   * [request], [requestCrossOrigin], or [postFormData] methods. Use of this
-   * `send` method is intended only for more complex HTTP requests where
-   * finer-grained control is needed.
-   *
-   * ## Other resources
-   *
-   * * [XMLHttpRequest.send](https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#send%28%29)
-   *   from MDN.
-   */
-  @DomName('XMLHttpRequest.send')
-  @DocsEditable()
-  void send([body_OR_data]) {
-    if (identical(Zone.current, Zone.ROOT)) {
-      _send(body_OR_data);
-    } else {
-      Zone.current.createTask(_createHttpRequestSendTask,
-          new HttpRequestSendTaskSpecification(this, body_OR_data));
-    }
-  }
-
-  static HttpRequest _createHttpRequestSendTask(
-      HttpRequestSendTaskSpecification spec, Zone zone) {
-    spec.request._send(spec.sendData);
-    return spec.request;
-  }
-
 $!MEMBERS
 }