Deprecate the DeferredCommand API.
Patch by: bobv
Review by: rjrjr

Review at http://gwt-code-reviews.appspot.com/718802


git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@8508 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/jsonp/client/JsonpRequest.java b/user/src/com/google/gwt/jsonp/client/JsonpRequest.java
index c199339..422743c 100644
--- a/user/src/com/google/gwt/jsonp/client/JsonpRequest.java
+++ b/user/src/com/google/gwt/jsonp/client/JsonpRequest.java
@@ -16,11 +16,11 @@
 package com.google.gwt.jsonp.client;
 
 import com.google.gwt.core.client.JavaScriptObject;
+import com.google.gwt.core.client.Scheduler;
 import com.google.gwt.dom.client.Document;
 import com.google.gwt.dom.client.Node;
 import com.google.gwt.dom.client.ScriptElement;
 import com.google.gwt.user.client.Command;
-import com.google.gwt.user.client.DeferredCommand;
 import com.google.gwt.user.client.Timer;
 import com.google.gwt.user.client.rpc.AsyncCallback;
 
@@ -246,7 +246,7 @@
      * scope of the script itself. Therefore, we need to defer the delete
      * statement after the callback execution.
      */
-    DeferredCommand.addCommand(new Command() {
+    Scheduler.get().scheduleDeferred(new Command() {
       public void execute() {
         unregisterCallbacks(CALLBACKS);
         Node script = Document.get().getElementById(callbackId);
diff --git a/user/src/com/google/gwt/user/client/Command.java b/user/src/com/google/gwt/user/client/Command.java
index 90b9bde..e97f5bf 100644
--- a/user/src/com/google/gwt/user/client/Command.java
+++ b/user/src/com/google/gwt/user/client/Command.java
@@ -15,6 +15,8 @@
  */
 package com.google.gwt.user.client;
 
+import com.google.gwt.core.client.Scheduler.ScheduledCommand;
+
 /**
  * Encapsulates an action for later execution, often from a different context.
  * 
@@ -22,14 +24,16 @@
  * The Command interface provides a layer of separation between the code
  * specifying some behavior and the code invoking that behavior. This separation
  * aids in creating reusable code. For example, a
- * {@link com.google.gwt.user.client.ui.MenuItem} can have a Command
- * associated with it that it executes when the menu item is chosen by the user.
+ * {@link com.google.gwt.user.client.ui.MenuItem} can have a Command associated
+ * with it that it executes when the menu item is chosen by the user.
  * Importantly, the code that constructed the Command to be executed when the
  * menu item is invoked knows nothing about the internals of the MenuItem class
- * and vice-versa.</p>
+ * and vice-versa.
+ * </p>
  * 
- * <p> The Command interface is often implemented with an anonymous inner class.
- * For example,
+ * <p>
+ * The Command interface is often implemented with an anonymous inner class. For
+ * example,
  * 
  * <pre>
  * Command sayHello = new Command() {
@@ -42,10 +46,17 @@
  * 
  * </p>
  */
-public interface Command {
+public interface Command extends ScheduledCommand {
+  /*
+   * NB: This extends ScheduledCommand to aid in transitioning from the old
+   * DeferredCommand interface. We can't have a class in core depend on a class
+   * in user, but we'd like switching to the Scheduler API to be pretty much
+   * just a name change. This type isn't deprecated, because it's used by other
+   * UI widget classes.
+   */
 
   /**
    * Causes the Command to perform its encapsulated behavior.
-   */
+   * */
   void execute();
 }
diff --git a/user/src/com/google/gwt/user/client/CommandExecutor.java b/user/src/com/google/gwt/user/client/CommandExecutor.java
deleted file mode 100644
index 8db1fe2..0000000
--- a/user/src/com/google/gwt/user/client/CommandExecutor.java
+++ /dev/null
@@ -1,398 +0,0 @@
-/*
- * Copyright 2007 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.user.client;
-
-import com.google.gwt.core.client.Duration;
-import com.google.gwt.core.client.GWT;
-import com.google.gwt.core.client.GWT.UncaughtExceptionHandler;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * Class which executes {@link Command}s and {@link IncrementalCommand}s after
- * all currently pending event handlers have completed. This class attempts to
- * protect against slow script warnings by running commands in small time
- * increments.
- * 
- * <p>
- * It is still possible that a poorly written command could cause a slow script
- * warning which a user may choose to cancel. In that event, a
- * {@link CommandCanceledException} or an
- * {@link IncrementalCommandCanceledException} is reported through the current
- * {@link UncaughtExceptionHandler} depending on the type of command which
- * caused the warning. All other commands will continue to be executed.
- * </p>
- * 
- * TODO(mmendez): Can an SSW be detected without using a timer? Currently, if a
- * {@link Command} or an {@link IncrementalCommand} calls either
- * {@link Window#alert(String)} or the JavaScript <code>alert(String)</code>
- * methods directly or indirectly then the  cancellation timer can fire,
- * resulting in a false SSW cancellation detection.
- */
-class CommandExecutor {
-
-  /**
-   * A circular iterator used by this class. This iterator will wrap back to
-   * zero when it hits the end of the commands.
-   */
-  private class CircularIterator implements Iterator<Object> {
-    /**
-     * Index of the element where this iterator should wrap back to the
-     * beginning of the collection.
-     */
-    private int end;
-
-    /**
-     * Index of the last item returned by {@link #next()}.
-     */
-    private int last = -1;
-
-    /**
-     * Index of the next command to execute.
-     */
-    private int next = 0;
-
-    /**
-     * Returns <code>true</code> if there are more commands in the queue.
-     * 
-     * @return <code>true</code> if there are more commands in the queue.
-     */
-    public boolean hasNext() {
-      return next < end;
-    }
-
-    /**
-     * Returns the next command from the queue. When the end of the dispatch
-     * region is reached it will wrap back to the start.
-     * 
-     * @return next command from the queue.
-     */
-    public Object next() {
-      last = next;
-      Object command = commands.get(next++);
-      if (next >= end) {
-        next = 0;
-      }
-
-      return command;
-    }
-
-    /**
-     * Removes the command which was previously returned by {@link #next()}.
-     * 
-     */
-    public void remove() {
-      assert (last >= 0);
-
-      commands.remove(last);
-      --end;
-
-      if (last <= next) {
-        if (--next < 0) {
-          next = 0;
-        }
-      }
-
-      last = -1;
-    }
-
-    /**
-     * Returns the last element returned by {@link #next()}.
-     * 
-     * @return last element returned by {@link #next()}
-     */
-    private Object getLast() {
-      assert (last >= 0);
-      return commands.get(last);
-    }
-
-    private void setEnd(int end) {
-      assert (end >= next);
-
-      this.end = end;
-    }
-
-    private void setLast(int last) {
-      this.last = last;
-    }
-
-    private boolean wasRemoved() {
-      return last == -1;
-    }
-  }
-
-  /**
-   * Default amount of time to wait before assuming that a script cancellation
-   * has taken place. This should be a platform dependent value, ultimately we
-   * may need to acquire this value based on a rebind decision. For now, we
-   * chose the smallest value known to cause an SSW.
-   */
-  private static final int DEFAULT_CANCELLATION_TIMEOUT_MILLIS = 10000;
-
-  /**
-   * Default amount of time to spend dispatching commands before we yield to the
-   * system.
-   */
-  private static final int DEFAULT_TIME_SLICE_MILLIS = 100;
-
-  /**
-   * Returns true the end time has been reached or exceeded.
-   * 
-   * @param currentTimeMillis current time in milliseconds
-   * @param startTimeMillis end time in milliseconds
-   * @return true if the end time has been reached
-   */
-  private static boolean hasTimeSliceExpired(double currentTimeMillis,
-      double startTimeMillis) {
-    return currentTimeMillis - startTimeMillis >= DEFAULT_TIME_SLICE_MILLIS;
-  }
-
-  /**
-   * Timer used to recover from script cancellations arising from slow script
-   * warnings.
-   */
-  private final Timer cancellationTimer = new Timer() {
-    @Override
-    public void run() {
-      if (!isExecuting()) {
-        /*
-         * If we are not executing, then the cancellation timer expired right
-         * about the time that the command dispatcher finished -- we are okay so
-         * we just exit.
-         */
-        return;
-      }
-
-      doCommandCanceled();
-    }
-  };
-
-  /**
-   * Commands that need to be executed.
-   */
-  private final List<Object> commands = new ArrayList<Object>();
-
-  /**
-   * Set to <code>true</code> when we are actively dispatching commands.
-   */
-  private boolean executing = false;
-
-  /**
-   * Timer used to drive the dispatching of commands in the background.
-   */
-  private final Timer executionTimer = new Timer() {
-    @Override
-    public void run() {
-      assert (!isExecuting());
-
-      setExecutionTimerPending(false);
-
-      doExecuteCommands(Duration.currentTimeMillis());
-    }
-  };
-
-  /**
-   * Set to <code>true</code> when we are waiting for a dispatch timer event
-   * to fire.
-   */
-  private boolean executionTimerPending = false;
-
-  /**
-   * The single circular iterator instance that we use to iterate over the
-   * collection of commands.
-   */
-  private final CircularIterator iterator = new CircularIterator();
-
-  /**
-   * Submits a {@link Command} for execution.
-   * 
-   * @param command command to submit
-   */
-  public void submit(Command command) {
-    commands.add(command);
-
-    maybeStartExecutionTimer();
-  }
-
-  /**
-   * Submits an {@link IncrementalCommand} for execution.
-   * 
-   * @param command command to submit
-   */
-  public void submit(IncrementalCommand command) {
-    commands.add(command);
-
-    maybeStartExecutionTimer();
-  }
-
-  /**
-   * Reports either a {@link CommandCanceledException} or an
-   * {@link IncrementalCommandCanceledException} back through the
-   * {@link UncaughtExceptionHandler} if one is set.
-   */
-  protected void doCommandCanceled() {
-    Object cmd = iterator.getLast();
-    iterator.remove();
-    assert (cmd != null);
-
-    RuntimeException ex = null;
-    if (cmd instanceof Command) {
-      ex = new CommandCanceledException((Command) cmd);
-    } else if (cmd instanceof IncrementalCommand) {
-      ex = new IncrementalCommandCanceledException((IncrementalCommand) cmd);
-    }
-
-    if (ex != null) {
-      UncaughtExceptionHandler ueh = GWT.getUncaughtExceptionHandler();
-      if (ueh != null) {
-        ueh.onUncaughtException(ex);
-      }
-    }
-
-    setExecuting(false);
-
-    maybeStartExecutionTimer();
-  }
-
-  /**
-   * This method will dispatch commands from the command queue. It will dispatch
-   * commands until one of the following conditions is <code>true</code>:
-   * <ul>
-   * <li>It consumed its dispatching time slice
-   * {@value #DEFAULT_TIME_SLICE_MILLIS}</li>
-   * <li>It encounters a <code>null</code> in the command queue</li>
-   * <li>All commands which were present at the start of the dispatching have
-   * been removed from the command queue</li>
-   * <li>The command that it was processing was canceled due to a false
-   * cancellation -- in this case we exit without updating any state</li>
-   * </ul>
-   * 
-   * @param startTimeMillis the time when this method started
-   */
-  protected void doExecuteCommands(double startTimeMillis) {
-    assert (!isExecutionTimerPending());
-
-    boolean wasCanceled = false;
-    try {
-      setExecuting(true);
-
-      iterator.setEnd(commands.size());
-
-      cancellationTimer.schedule(DEFAULT_CANCELLATION_TIMEOUT_MILLIS);
-
-      while (iterator.hasNext()) {
-        Object element = iterator.next();
-
-        boolean removeCommand = true;
-        try {
-          if (element == null) {
-            // null forces a yield or pause in execution
-            return;
-          }
-
-          if (element instanceof Command) {
-            Command command = (Command) element;
-            command.execute();
-          } else if (element instanceof IncrementalCommand) {
-            IncrementalCommand incrementalCommand = (IncrementalCommand) element;
-            removeCommand = !incrementalCommand.execute();
-          }
-
-        } finally {
-          wasCanceled = iterator.wasRemoved();
-          if (!wasCanceled) {
-            if (removeCommand) {
-              iterator.remove();
-            }
-          }
-        }
-
-        if (hasTimeSliceExpired(Duration.currentTimeMillis(), startTimeMillis)) {
-          // the time slice has expired
-          return;
-        }
-      }
-    } finally {
-      if (!wasCanceled) {
-        cancellationTimer.cancel();
-
-        setExecuting(false);
-
-        maybeStartExecutionTimer();
-      }
-    }
-  }
-
-  /**
-   * Starts the dispatch timer if there are commands to dispatch and we are not
-   * waiting for a dispatch timer and we are not actively dispatching.
-   */
-  protected void maybeStartExecutionTimer() {
-    if (!commands.isEmpty() && !isExecutionTimerPending() && !isExecuting()) {
-      setExecutionTimerPending(true);
-      executionTimer.schedule(1);
-    }
-  }
-
-  /**
-   * This method is for testing only.
-   */
-  List<Object> getPendingCommands() {
-    return commands;
-  }
-
-  /**
-   * This method is for testing only.
-   */
-  void setExecuting(boolean executing) {
-    this.executing = executing;
-  }
-
-  /**
-   * This method is for testing only.
-   */
-  void setLast(int last) {
-    iterator.setLast(last);
-  }
-
-  /**
-   * Returns <code>true</code> if this instance is currently dispatching
-   * commands.
-   * 
-   * @return <code>true</code> if this instance is currently dispatching
-   *         commands
-   */
-  private boolean isExecuting() {
-    return executing;
-  }
-
-  /**
-   * Returns <code>true</code> if a the dispatch timer was scheduled but it
-   * still has not fired.
-   * 
-   * @return <code>true</code> if a the dispatch timer was scheduled but it
-   *         still has not fired
-   */
-  private boolean isExecutionTimerPending() {
-    return executionTimerPending;
-  }
-
-  private void setExecutionTimerPending(boolean pending) {
-    executionTimerPending = pending;
-  }
-}
\ No newline at end of file
diff --git a/user/src/com/google/gwt/user/client/DeferredCommand.java b/user/src/com/google/gwt/user/client/DeferredCommand.java
index 9fe21d4..c7ed6eb 100644
--- a/user/src/com/google/gwt/user/client/DeferredCommand.java
+++ b/user/src/com/google/gwt/user/client/DeferredCommand.java
@@ -15,14 +15,41 @@
  */
 package com.google.gwt.user.client;
 
+import com.google.gwt.core.client.Scheduler;
+import com.google.gwt.core.client.Scheduler.ScheduledCommand;
+
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * This class allows you to execute code after all currently pending event
  * handlers have completed, using the {@link #addCommand(Command)} or
  * {@link #addCommand(IncrementalCommand)} methods. This is useful when you need
  * to execute code outside of the context of the current stack.
+ * 
+ * @deprecated Replaced by {@link Scheduler}
  */
+@Deprecated
 public class DeferredCommand {
-  private static final CommandExecutor commandExecutor = new CommandExecutor();
+  private static class PausedCommand implements ScheduledCommand {
+    List<ScheduledCommand> toSchedule = new ArrayList<ScheduledCommand>();
+    PausedCommand next;
+
+    public void execute() {
+      if (lastPaused == this) {
+        lastPaused = null;
+      }
+      for (ScheduledCommand cmd : toSchedule) {
+        Scheduler.get().scheduleDeferred(cmd);
+      }
+      if (next != null) {
+        // Scheduled a chained pause
+        Scheduler.get().scheduleDeferred(next);
+      }
+    }
+  }
+
+  private static PausedCommand lastPaused;
 
   /**
    * Enqueues a {@link Command} to be fired after all current events have been
@@ -32,12 +59,14 @@
    *          inserted into the queue. Any events added after the pause will
    *          wait for an additional cycle through the system event loop before
    *          executing. Pauses are cumulative.
-   * 
    * @deprecated As of release 1.4, replaced by {@link #addCommand(Command)}
    */
-  @Deprecated
   public static void add(Command cmd) {
-    commandExecutor.submit(cmd);
+    if (cmd == null) {
+      addPause();
+    } else {
+      addCommand(cmd);
+    }
   }
 
   /**
@@ -48,13 +77,19 @@
    * 
    * @param cmd the command to be fired
    * @throws NullPointerException if cmd is <code>null</code>
+   * @deprecated Replaced by
+   *             {@link Scheduler#scheduleDeferred(ScheduledCommand)}
    */
   public static void addCommand(Command cmd) {
     if (cmd == null) {
       throw new NullPointerException("cmd cannot be null");
     }
 
-    commandExecutor.submit(cmd);
+    if (lastPaused != null) {
+      lastPaused.toSchedule.add(cmd);
+    } else {
+      Scheduler.get().scheduleDeferred(cmd);
+    }
   }
 
   /**
@@ -66,13 +101,14 @@
    * 
    * @param cmd the command to be fired
    * @throws NullPointerException if cmd is <code>null</code>
+   * @deprecated Replaced by {@link Scheduler#scheduleIncremental}
    */
   public static void addCommand(IncrementalCommand cmd) {
     if (cmd == null) {
       throw new NullPointerException("cmd cannot be null");
     }
 
-    commandExecutor.submit(cmd);
+    Scheduler.get().scheduleIncremental(cmd);
   }
 
   /**
@@ -80,8 +116,20 @@
    * {@link DeferredCommand}s or pauses that are added after this pause will
    * wait for an additional cycle through the system event loop before
    * executing.
+   * 
+   * @deprecated No direct replacement; instead, a ScheduledCommand should cause
+   *             any other strictly-ordered commands to be scheduled
    */
   public static void addPause() {
-    commandExecutor.submit((Command) null);
+    if (lastPaused == null) {
+      // No existing pause
+      lastPaused = new PausedCommand();
+      Scheduler.get().scheduleDeferred(lastPaused);
+    } else {
+      // Chained pauses
+      PausedCommand newPaused = new PausedCommand();
+      lastPaused.next = newPaused;
+      lastPaused = newPaused;
+    }
   }
 }
diff --git a/user/src/com/google/gwt/user/client/IncrementalCommand.java b/user/src/com/google/gwt/user/client/IncrementalCommand.java
index d2f9739..4d18b32 100644
--- a/user/src/com/google/gwt/user/client/IncrementalCommand.java
+++ b/user/src/com/google/gwt/user/client/IncrementalCommand.java
@@ -15,6 +15,8 @@
  */
 package com.google.gwt.user.client;
 
+import com.google.gwt.core.client.Scheduler;
+
 /**
  * An <code>IncrementalCommand</code> is a command that is broken into one or
  * more substeps, each substep brings the whole command nearer to completion.
@@ -22,8 +24,12 @@
  * <code>false</code>.
  * 
  * {@example com.google.gwt.examples.IncrementalCommandExample}
+ * 
+ * @deprecated Replaced by {@link Scheduler.RepeatingCommand} for use with
+ *             {@link Scheduler#scheduleIncremental}
  */
-public interface IncrementalCommand {
+@Deprecated
+public interface IncrementalCommand extends Scheduler.RepeatingCommand {
   /**
    * Causes the <code>IncrementalCommand</code> to execute its encapsulated
    * behavior.
diff --git a/user/src/com/google/gwt/user/client/ui/CaptionPanel.java b/user/src/com/google/gwt/user/client/ui/CaptionPanel.java
index 4364b2b..bacaaf1 100644
--- a/user/src/com/google/gwt/user/client/ui/CaptionPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/CaptionPanel.java
@@ -16,12 +16,12 @@
 package com.google.gwt.user.client.ui;
 
 import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.Scheduler;
 import com.google.gwt.dom.client.Document;
 import com.google.gwt.dom.client.Element;
 import com.google.gwt.dom.client.FieldSetElement;
 import com.google.gwt.dom.client.LegendElement;
 import com.google.gwt.user.client.Command;
-import com.google.gwt.user.client.DeferredCommand;
 
 import java.util.Iterator;
 
@@ -80,7 +80,7 @@
         boolean asHTML) {
       fieldset.getStyle().setProperty("visibility", "hidden");
       super.setCaption(fieldset, legend, caption, asHTML);
-      DeferredCommand.addCommand(new Command() {
+      Scheduler.get().scheduleDeferred(new Command() {
         public void execute() {
           fieldset.getStyle().setProperty("visibility", "");
         }
diff --git a/user/src/com/google/gwt/user/client/ui/FormPanel.java b/user/src/com/google/gwt/user/client/ui/FormPanel.java
index 2ad6825..f3c4941 100644
--- a/user/src/com/google/gwt/user/client/ui/FormPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/FormPanel.java
@@ -16,6 +16,7 @@
 package com.google.gwt.user.client.ui;
 
 import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.Scheduler;
 import com.google.gwt.dom.client.Document;
 import com.google.gwt.dom.client.Element;
 import com.google.gwt.dom.client.FormElement;
@@ -23,7 +24,6 @@
 import com.google.gwt.event.shared.GwtEvent;
 import com.google.gwt.event.shared.HandlerRegistration;
 import com.google.gwt.user.client.Command;
-import com.google.gwt.user.client.DeferredCommand;
 import com.google.gwt.user.client.Event;
 import com.google.gwt.user.client.ui.impl.FormPanelImpl;
 import com.google.gwt.user.client.ui.impl.FormPanelImplHost;
@@ -627,7 +627,7 @@
     // because clients that detach the form panel when submission is
     // complete can cause some browsers (i.e. Mozilla) to go into an
     // 'infinite loading' state. See issue 916.
-    DeferredCommand.addCommand(new Command() {
+    Scheduler.get().scheduleDeferred(new Command() {
       public void execute() {
         fireEvent(new SubmitCompleteEvent(impl.getContents(synthesizedFrame)));
       }
diff --git a/user/src/com/google/gwt/user/client/ui/HorizontalSplitPanel.java b/user/src/com/google/gwt/user/client/ui/HorizontalSplitPanel.java
index c4b9157..09cd37a 100644
--- a/user/src/com/google/gwt/user/client/ui/HorizontalSplitPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/HorizontalSplitPanel.java
@@ -16,12 +16,12 @@
 package com.google.gwt.user.client.ui;
 
 import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.Scheduler;
 import com.google.gwt.i18n.client.LocaleInfo;
 import com.google.gwt.resources.client.ClientBundle;
 import com.google.gwt.resources.client.ImageResource;
 import com.google.gwt.user.client.Command;
 import com.google.gwt.user.client.DOM;
-import com.google.gwt.user.client.DeferredCommand;
 import com.google.gwt.user.client.Element;
 import com.google.gwt.user.client.Timer;
 
@@ -301,7 +301,7 @@
           // before layout completes, the RIGHT element will
           // appear to be blanked out.
 
-          DeferredCommand.addCommand(new Command() {
+          Scheduler.get().scheduleDeferred(new Command() {
             public void execute() {
               setWidth(panel.getElement(LEFT), "0px");
             }
@@ -578,7 +578,7 @@
      * possible.
      */
     setSplitPosition(lastSplitPosition);
-    DeferredCommand.addCommand(new Command() {
+    Scheduler.get().scheduleDeferred(new Command() {
       public void execute() {
         setSplitPosition(lastSplitPosition);
       }
diff --git a/user/src/com/google/gwt/user/client/ui/Image.java b/user/src/com/google/gwt/user/client/ui/Image.java
index 8d85c76..b7d7ec9 100644
--- a/user/src/com/google/gwt/user/client/ui/Image.java
+++ b/user/src/com/google/gwt/user/client/ui/Image.java
@@ -16,6 +16,7 @@
 package com.google.gwt.user.client.ui;
 
 import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.Scheduler;
 import com.google.gwt.dom.client.Document;
 import com.google.gwt.dom.client.Element;
 import com.google.gwt.dom.client.ImageElement;
@@ -45,7 +46,6 @@
 import com.google.gwt.event.shared.HandlerRegistration;
 import com.google.gwt.resources.client.ImageResource;
 import com.google.gwt.user.client.Command;
-import com.google.gwt.user.client.DeferredCommand;
 import com.google.gwt.user.client.Event;
 import com.google.gwt.user.client.ui.impl.ClippedImageImpl;
 
@@ -258,7 +258,7 @@
        * that a second load event would occur while you are in the load event
        * handler.
        */
-      DeferredCommand.addCommand(new Command() {
+      Scheduler.get().scheduleDeferred(new Command() {
         public void execute() {
           NativeEvent evt = Document.get().createLoadEvent();
           getImageElement(image).dispatchEvent(evt);
diff --git a/user/src/com/google/gwt/user/client/ui/SplitLayoutPanel.java b/user/src/com/google/gwt/user/client/ui/SplitLayoutPanel.java
index b7277d7..352c815 100644
--- a/user/src/com/google/gwt/user/client/ui/SplitLayoutPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/SplitLayoutPanel.java
@@ -15,10 +15,10 @@
  */
 package com.google.gwt.user.client.ui;
 
+import com.google.gwt.core.client.Scheduler;
 import com.google.gwt.dom.client.Document;
 import com.google.gwt.dom.client.Style.Unit;
 import com.google.gwt.user.client.Command;
-import com.google.gwt.user.client.DeferredCommand;
 import com.google.gwt.user.client.Event;
 
 /**
@@ -170,7 +170,7 @@
             forceLayout();
           }
         };
-        DeferredCommand.addCommand(layoutCommand);
+        Scheduler.get().scheduleDeferred(layoutCommand);
       }
     }
   }
diff --git a/user/src/com/google/gwt/user/client/ui/VerticalSplitPanel.java b/user/src/com/google/gwt/user/client/ui/VerticalSplitPanel.java
index c3f720d..b655644 100644
--- a/user/src/com/google/gwt/user/client/ui/VerticalSplitPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/VerticalSplitPanel.java
@@ -16,11 +16,11 @@
 package com.google.gwt.user.client.ui;
 
 import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.Scheduler;
 import com.google.gwt.resources.client.ClientBundle;
 import com.google.gwt.resources.client.ImageResource;
 import com.google.gwt.user.client.Command;
 import com.google.gwt.user.client.DOM;
-import com.google.gwt.user.client.DeferredCommand;
 import com.google.gwt.user.client.Element;
 import com.google.gwt.user.client.Timer;
 
@@ -397,7 +397,7 @@
      * This first call is simply to try to avoid a jitter effect if possible.
      */
     setSplitPosition(lastSplitPosition);
-    DeferredCommand.addCommand(new Command() {
+    Scheduler.get().scheduleDeferred(new Command() {
       public void execute() {
         setSplitPosition(lastSplitPosition);
       }
diff --git a/user/src/com/google/gwt/user/client/ui/impl/PopupImplMozilla.java b/user/src/com/google/gwt/user/client/ui/impl/PopupImplMozilla.java
index 0c1dfef..0d9c16a 100644
--- a/user/src/com/google/gwt/user/client/ui/impl/PopupImplMozilla.java
+++ b/user/src/com/google/gwt/user/client/ui/impl/PopupImplMozilla.java
@@ -15,12 +15,12 @@
  */
 package com.google.gwt.user.client.ui.impl;
 
+import com.google.gwt.core.client.Scheduler;
 import com.google.gwt.dom.client.Element;
 import com.google.gwt.dom.client.Style.Display;
 import com.google.gwt.dom.client.Style.Overflow;
 import com.google.gwt.user.client.Command;
 import com.google.gwt.user.client.DOM;
-import com.google.gwt.user.client.DeferredCommand;
 
 /**
  * Implementation class used by {@link com.google.gwt.user.client.ui.PopupPanel}.
@@ -99,7 +99,7 @@
       // 'overflow:auto' after all of the elements on the page have been
       // rendered,
       // the PopupPanel becomes the highest element in the stacking order.
-      DeferredCommand.addCommand(new Command() {
+      Scheduler.get().scheduleDeferred(new Command() {
         public void execute() {
           outerElem.getStyle().setOverflow(Overflow.AUTO);
         }
diff --git a/user/src/com/google/gwt/user/client/ui/impl/RichTextAreaImplOldMozilla.java b/user/src/com/google/gwt/user/client/ui/impl/RichTextAreaImplOldMozilla.java
index d78a4e6..548e928 100644
--- a/user/src/com/google/gwt/user/client/ui/impl/RichTextAreaImplOldMozilla.java
+++ b/user/src/com/google/gwt/user/client/ui/impl/RichTextAreaImplOldMozilla.java
@@ -15,8 +15,8 @@
  */
 package com.google.gwt.user.client.ui.impl;
 
+import com.google.gwt.core.client.Scheduler;
 import com.google.gwt.user.client.Command;
-import com.google.gwt.user.client.DeferredCommand;
 
 /**
  * Old Mozilla-specific implementation of rich-text editing.
@@ -28,7 +28,7 @@
    */
   @Override
   protected void onElementInitialized() {
-    DeferredCommand.addCommand(new Command() {
+    Scheduler.get().scheduleDeferred(new Command() {
       public void execute() {
         RichTextAreaImplOldMozilla.super.onElementInitialized();
       }
diff --git a/user/src/com/google/gwt/user/datepicker/client/DateBox.java b/user/src/com/google/gwt/user/datepicker/client/DateBox.java
index 7105c80..d060235 100644
--- a/user/src/com/google/gwt/user/datepicker/client/DateBox.java
+++ b/user/src/com/google/gwt/user/datepicker/client/DateBox.java
@@ -17,6 +17,7 @@
 package com.google.gwt.user.datepicker.client;
 
 import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.Scheduler;
 import com.google.gwt.event.dom.client.BlurEvent;
 import com.google.gwt.event.dom.client.BlurHandler;
 import com.google.gwt.event.dom.client.ClickEvent;
@@ -33,7 +34,6 @@
 import com.google.gwt.event.shared.HandlerRegistration;
 import com.google.gwt.i18n.client.DateTimeFormat;
 import com.google.gwt.user.client.Command;
-import com.google.gwt.user.client.DeferredCommand;
 import com.google.gwt.user.client.ui.Composite;
 import com.google.gwt.user.client.ui.HasValue;
 import com.google.gwt.user.client.ui.PopupPanel;
@@ -458,7 +458,7 @@
 
   private void preventDatePickerPopup() {
     allowDPShow = false;
-    DeferredCommand.addCommand(new Command() {
+    Scheduler.get().scheduleDeferred(new Command() {
       public void execute() {
         allowDPShow = true;
       }
diff --git a/user/src/com/google/gwt/view/client/ListViewAdapter.java b/user/src/com/google/gwt/view/client/ListViewAdapter.java
index 0694d16..50cfce6 100644
--- a/user/src/com/google/gwt/view/client/ListViewAdapter.java
+++ b/user/src/com/google/gwt/view/client/ListViewAdapter.java
@@ -15,8 +15,8 @@
  */
 package com.google.gwt.view.client;
 
+import com.google.gwt.core.client.Scheduler;
 import com.google.gwt.user.client.Command;
-import com.google.gwt.user.client.DeferredCommand;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -390,7 +390,7 @@
       flushCancelled = false;
       if (!flushPending) {
         flushPending = true;
-        DeferredCommand.addCommand(flushCommand);
+        Scheduler.get().scheduleDeferred(flushCommand);
       }
     }
 
diff --git a/user/test/com/google/gwt/dev/jjs/test/RunAsyncMetricsIntegrationTest.java b/user/test/com/google/gwt/dev/jjs/test/RunAsyncMetricsIntegrationTest.java
index 37085f6..fa8136e 100644
--- a/user/test/com/google/gwt/dev/jjs/test/RunAsyncMetricsIntegrationTest.java
+++ b/user/test/com/google/gwt/dev/jjs/test/RunAsyncMetricsIntegrationTest.java
@@ -18,9 +18,9 @@
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.core.client.JavaScriptObject;
 import com.google.gwt.core.client.RunAsyncCallback;
+import com.google.gwt.core.client.Scheduler;
 import com.google.gwt.junit.client.GWTTestCase;
 import com.google.gwt.user.client.Command;
-import com.google.gwt.user.client.DeferredCommand;
 
 import java.util.LinkedList;
 import java.util.Queue;
@@ -131,7 +131,7 @@
       }
 
       public void onSuccess() {
-        DeferredCommand.addCommand(new Command() {
+        Scheduler.get().scheduleDeferred(new Command() {
 
           public void execute() {
             checkMetrics();
diff --git a/user/test/com/google/gwt/dom/client/ElementTest.java b/user/test/com/google/gwt/dom/client/ElementTest.java
index 5806456..857dede 100644
--- a/user/test/com/google/gwt/dom/client/ElementTest.java
+++ b/user/test/com/google/gwt/dom/client/ElementTest.java
@@ -16,13 +16,13 @@
 package com.google.gwt.dom.client;
 
 import com.google.gwt.core.client.JavaScriptObject;
+import com.google.gwt.core.client.Scheduler;
 import com.google.gwt.dom.client.Style.Position;
 import com.google.gwt.dom.client.Style.Unit;
 import com.google.gwt.junit.DoNotRunWith;
 import com.google.gwt.junit.Platform;
 import com.google.gwt.junit.client.GWTTestCase;
 import com.google.gwt.user.client.Command;
-import com.google.gwt.user.client.DeferredCommand;
 
 /**
  * Element tests (many stolen from DOMTest).
@@ -201,7 +201,7 @@
     elem.getStyle().setPropertyPx("width", width);
     elem.getStyle().setPropertyPx("height", height);
 
-    DeferredCommand.addCommand(new Command() {
+    Scheduler.get().scheduleDeferred(new Command() {
       public void execute() {
         int absLeft = left + margin;
         int absTop = top + margin;
diff --git a/user/test/com/google/gwt/dom/client/StyleInjectorTest.java b/user/test/com/google/gwt/dom/client/StyleInjectorTest.java
index be61d38..c9a217f 100644
--- a/user/test/com/google/gwt/dom/client/StyleInjectorTest.java
+++ b/user/test/com/google/gwt/dom/client/StyleInjectorTest.java
@@ -15,9 +15,9 @@
  */
 package com.google.gwt.dom.client;
 
+import com.google.gwt.core.client.Scheduler;
 import com.google.gwt.junit.client.GWTTestCase;
 import com.google.gwt.user.client.Command;
-import com.google.gwt.user.client.DeferredCommand;
 
 /**
  * Tests StyleInjector by looking for effects of injected CSS on DOM elements.
@@ -45,7 +45,7 @@
     // We need to allow the document to be redrawn
     delayTestFinish(TEST_DELAY);
 
-    DeferredCommand.addCommand(new Command() {
+    Scheduler.get().scheduleDeferred(new Command() {
       public void execute() {
         assertEquals(100, elt.getOffsetLeft());
         assertEquals(100, elt.getClientHeight());
@@ -80,7 +80,7 @@
     // We need to allow the document to be redrawn
     delayTestFinish(TEST_DELAY);
 
-    DeferredCommand.addCommand(new Command() {
+    Scheduler.get().scheduleDeferred(new Command() {
       public void execute() {
         assertEquals(100, elt.getOffsetLeft());
         assertEquals(100, elt.getClientHeight());
@@ -131,7 +131,7 @@
     if (immediate) {
       command.execute();
     } else {
-      DeferredCommand.addCommand(command);
+      Scheduler.get().scheduleDeferred(command);
       // We need to allow the BatchedCommands to execute
       delayTestFinish(TEST_DELAY);
     }
diff --git a/user/test/com/google/gwt/user/UISuite.java b/user/test/com/google/gwt/user/UISuite.java
index 06960cc..0940f39 100644
--- a/user/test/com/google/gwt/user/UISuite.java
+++ b/user/test/com/google/gwt/user/UISuite.java
@@ -18,7 +18,6 @@
 import com.google.gwt.junit.tools.GWTTestSuite;
 import com.google.gwt.layout.client.LayoutTest;
 import com.google.gwt.user.client.AsyncProxyTest;
-import com.google.gwt.user.client.CommandExecutorTest;
 import com.google.gwt.user.client.CookieTest;
 import com.google.gwt.user.client.EventTest;
 import com.google.gwt.user.client.HistoryDisabledTest;
@@ -117,7 +116,6 @@
     suite.addTestSuite(CaptionPanelTest.class);
     suite.addTestSuite(CheckBoxTest.class);
     suite.addTestSuite(ClippedImagePrototypeTest.class);
-    suite.addTestSuite(CommandExecutorTest.class);
     suite.addTestSuite(CompositeTest.class);
     suite.addTestSuite(CookieTest.class);
     suite.addTestSuite(CustomButtonTest.class);
diff --git a/user/test/com/google/gwt/user/client/CommandExecutorTest.java b/user/test/com/google/gwt/user/client/CommandExecutorTest.java
deleted file mode 100644
index 1e970d9..0000000
--- a/user/test/com/google/gwt/user/client/CommandExecutorTest.java
+++ /dev/null
@@ -1,343 +0,0 @@
-/*
- * Copyright 2007 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.user.client;
-
-import com.google.gwt.core.client.Duration;
-import com.google.gwt.core.client.GWT;
-import com.google.gwt.core.client.GWT.UncaughtExceptionHandler;
-import com.google.gwt.junit.client.GWTTestCase;
-
-/**
- * Test cases for {@link CommandExecutor}.
- */
-public class CommandExecutorTest extends GWTTestCase {
-
-  private static class NonRestartingCommandExecutor extends CommandExecutor {
-    protected void maybeStartExecutionTimer() {
-      // keeps the executing timer for interfering with the test
-    }
-  }
-
-  private static class TestCommand implements Command {
-    private boolean executed;
-
-    public boolean didExecute() {
-      return executed;
-    }
-
-    public void execute() {
-      executed = true;
-    }
-  }
-
-  private static class TestIncrementalCommand implements IncrementalCommand {
-    private boolean done = false;
-    private int executeCount;
-
-    public boolean execute() {
-      ++executeCount;
-
-      return !isDone();
-    }
-
-    public int getExecuteCount() {
-      return executeCount;
-    }
-
-    public boolean isDone() {
-      return done;
-    }
-
-    public void setDone(boolean done) {
-      this.done = done;
-    }
-  }
-
-  /**
-   * A sufficiently large delay to let the SSW triggers.
-   */
-  private static final int TEST_FINISH_DELAY_MILLIS = 40000;
-
-  public String getModuleName() {
-    return "com.google.gwt.user.User";
-  }
-
-  /**
-   * Test method for
-   * {@link com.google.gwt.user.client.CommandExecutor#doExecuteCommands(int)}.
-   * 
-   * Checks that we can recover after a cancellation
-   */
-  public void testDoExecuteCommands_CancellationRecovery() {
-    final CommandExecutor ce = new NonRestartingCommandExecutor();
-
-    final Command c1 = new Command() {
-      public void execute() {
-      }
-    };
-
-    ce.setExecuting(true);
-    ce.submit(c1);
-    ce.setLast(0);
-
-    final UncaughtExceptionHandler originalUEH = GWT.getUncaughtExceptionHandler();
-
-    UncaughtExceptionHandler ueh1 = new UncaughtExceptionHandler() {
-      public void onUncaughtException(Throwable e) {
-        if (!(e instanceof CommandCanceledException)) {
-          originalUEH.onUncaughtException(e);
-          return;
-        }
-
-        CommandCanceledException cce = (CommandCanceledException) e;
-        if (cce.getCommand() != c1) {
-          fail("CommandCanceledException did not contain the correct failed command");
-        }
-
-        // Submit some more work and do another dispatch
-        ce.submit(new IncrementalCommand() {
-          public boolean execute() {
-            return false;
-          }
-        });
-
-        delayTestFinish(TEST_FINISH_DELAY_MILLIS);
-        ce.submit(new Command() {
-          public void execute() {
-            finishTest();
-          }
-        });
-
-        ce.doExecuteCommands(Duration.currentTimeMillis());
-      }
-    };
-
-    GWT.setUncaughtExceptionHandler(ueh1);
-    ce.doCommandCanceled();
-  }
-
-  /**
-   * Test method for
-   * {@link com.google.gwt.user.client.CommandExecutor#doExecuteCommands(int)}.
-   * 
-   * Checks Command cancellation detection
-   */
-  public void testDoExecuteCommands_CommandCancellation() {
-    final CommandExecutor ce = new NonRestartingCommandExecutor();
-
-    final Command c1 = new Command() {
-      public void execute() {
-      }
-    };
-
-    // Setup the cancellation state
-    ce.setExecuting(true);
-    ce.submit(c1);
-    ce.setLast(0);
-
-    final UncaughtExceptionHandler originalUEH = GWT.getUncaughtExceptionHandler();
-
-    UncaughtExceptionHandler ueh1 = new UncaughtExceptionHandler() {
-      public void onUncaughtException(Throwable e) {
-        if (!(e instanceof CommandCanceledException)) {
-          originalUEH.onUncaughtException(e);
-          return;
-        }
-
-        CommandCanceledException cce = (CommandCanceledException) e;
-        if (cce.getCommand() != c1) {
-          fail("CommandCanceledException did not contain the correct failed command");
-        }
-      }
-    };
-
-    GWT.setUncaughtExceptionHandler(ueh1);
-    ce.doCommandCanceled();
-  }
-
-  /**
-   * Test method for
-   * {@link com.google.gwt.user.client.CommandExecutor#doExecuteCommands(int)}.
-   * 
-   * Checks that calling {@link CommandExecutor#doExecuteCommands(double)} with no
-   * items in the queue is safe
-   */
-  public void testDoExecuteCommands_emptyQueue() {
-    final CommandExecutor ce = new NonRestartingCommandExecutor();
-
-    ce.doExecuteCommands(Duration.currentTimeMillis());
-  }
-
-  /**
-   * Test method for
-   * {@link com.google.gwt.user.client.CommandExecutor#doExecuteCommands(int)}.
-   * 
-   * Checks IncrementalCommand cancellation detection
-   */
-  public void testDoExecuteCommands_IncrementalCommandCancellation() {
-    final CommandExecutor ce = new NonRestartingCommandExecutor();
-
-    final IncrementalCommand ic = new IncrementalCommand() {
-      public boolean execute() {
-        return false;
-      }
-    };
-
-    // setup the cancellation state
-    ce.setExecuting(true);
-    ce.submit(ic);
-    ce.setLast(0);
-
-    final UncaughtExceptionHandler originalUEH = GWT.getUncaughtExceptionHandler();
-
-    UncaughtExceptionHandler ueh1 = new UncaughtExceptionHandler() {
-      public void onUncaughtException(Throwable e) {
-        if (!(e instanceof IncrementalCommandCanceledException)) {
-          originalUEH.onUncaughtException(e);
-          return;
-        }
-
-        IncrementalCommandCanceledException icce = (IncrementalCommandCanceledException) e;
-        if (icce.getCommand() != ic) {
-          fail("IncrementalCommandCanceledException did not contain the correct failed command");
-        }
-      }
-    };
-
-    GWT.setUncaughtExceptionHandler(ueh1);
-    ce.doCommandCanceled();
-  }
-
-  /**
-   * Test method for
-   * {@link com.google.gwt.user.client.CommandExecutor#doExecuteCommands(int)}.
-   * 
-   * Checks that an incremental command executes and is removed from the queue
-   * when it is done
-   */
-  public void testDoExecuteCommands_IncrementalCommands() {
-    TestIncrementalCommand tic = new TestIncrementalCommand();
-    final CommandExecutor ce = new NonRestartingCommandExecutor();
-
-    tic.setDone(true);
-    ce.submit(tic);
-    ce.doExecuteCommands(Duration.currentTimeMillis());
-    assertTrue(tic.getExecuteCount() > 0);
-    assertTrue(ce.getPendingCommands().isEmpty());
-  }
-
-  /**
-   * Test method for
-   * {@link com.google.gwt.user.client.CommandExecutor#doExecuteCommands(int)}.
-   * 
-   * Checks that null does in fact cause a pause.
-   */
-  public void testDoExecuteCommands_pause() {
-    final CommandExecutor ce = new NonRestartingCommandExecutor();
-
-    TestCommand tc1 = new TestCommand();
-    TestCommand tc2 = new TestCommand();
-
-    ce.submit(tc1);
-    ce.submit((Command) null);
-    ce.submit(tc2);
-
-    ce.doExecuteCommands(Duration.currentTimeMillis());
-
-    assertTrue(tc1.didExecute() && !tc2.didExecute());
-    assertEquals(1, ce.getPendingCommands().size());
-    assertTrue(ce.getPendingCommands().contains(tc2));
-  }
-
-  /**
-   * Test method for
-   * {@link com.google.gwt.user.client.CommandExecutor#doExecuteCommands(int)}.
-   * 
-   * Checks that after one pass dispatch pass, we still have the incremental
-   * command in the queue
-   */
-  public void testDoExecuteCommands_timeSliceUsage() {
-    final CommandExecutor ce = new NonRestartingCommandExecutor();
-
-    Command tc = new TestCommand();
-    ce.submit(tc);
-
-    TestIncrementalCommand tic = new TestIncrementalCommand();
-    ce.submit(tic);
-    ce.doExecuteCommands(Duration.currentTimeMillis());
-
-    assertEquals(1, ce.getPendingCommands().size());
-    assertTrue(ce.getPendingCommands().contains(tic));
-    assertTrue(tic.getExecuteCount() > 0);
-  }
-
-  /**
-   * Test method for
-   * {@link com.google.gwt.user.client.CommandExecutor#submit(com.google.gwt.user.client.Command)}.
-   * 
-   * <p/> Cases:
-   * <ul>
-   * <li>Submit <code>null</code></li>
-   * <li>Submit {@link Command} and make sure that it fires</li>
-   * </ul>
-   */
-  public void testSubmitCommand() {
-    CommandExecutor ce = new CommandExecutor();
-    ce.submit((Command) null);
-
-    delayTestFinish(TEST_FINISH_DELAY_MILLIS);
-
-    ce.submit(new Command() {
-      public void execute() {
-        finishTest();
-      }
-    });
-  }
-
-  /**
-   * Test method for
-   * {@link com.google.gwt.user.client.CommandExecutor#submit(com.google.gwt.user.client.IncrementalCommand)}.
-   * 
-   * <p/> Cases:
-   * <ul>
-   * <li>Submit <code>null</code></li>
-   * <li>Submit {@link IncrementalCommand} and make sure that it fires as many
-   * times as we want it to</li>
-   * </ul>
-   */
-  public void testSubmitIncrementalCommand() {
-    CommandExecutor ce = new CommandExecutor();
-    ce.submit((Command) null);
-
-    delayTestFinish(TEST_FINISH_DELAY_MILLIS);
-
-    ce.submit(new IncrementalCommand() {
-      private int executionCount = 0;
-
-      public boolean execute() {
-        if (++executionCount > 10) {
-          fail("IncrementalCommand was fired more than 10 times");
-        }
-
-        if (executionCount == 10) {
-          finishTest();
-        }
-
-        return executionCount < 10;
-      }
-    });
-  }
-}
diff --git a/user/test/com/google/gwt/user/client/WindowTest.java b/user/test/com/google/gwt/user/client/WindowTest.java
index 82e04da..3361ba9 100644
--- a/user/test/com/google/gwt/user/client/WindowTest.java
+++ b/user/test/com/google/gwt/user/client/WindowTest.java
@@ -16,6 +16,7 @@
 package com.google.gwt.user.client;
 
 import com.google.gwt.core.client.JavaScriptException;
+import com.google.gwt.core.client.Scheduler;
 import com.google.gwt.event.logical.shared.ResizeEvent;
 import com.google.gwt.event.logical.shared.ResizeHandler;
 import com.google.gwt.event.shared.HandlerRegistration;
@@ -219,7 +220,7 @@
     largeDOM.setPixelSize(oldClientWidth + 100, oldClientHeight + 100);
     RootPanel.get().add(largeDOM);
     delayTestFinish(200);
-    DeferredCommand.addCommand(new Command() {
+    Scheduler.get().scheduleDeferred(new Command() {
       public void execute() {
         int newClientHeight = Window.getClientHeight();
         int newClientWidth = Window.getClientWidth();
@@ -359,7 +360,7 @@
     final HandlerRegistration handlerRegistration = Window.addResizeHandler(resizeHandler);
 
     delayTestFinish(2000);
-    DeferredCommand.addCommand(new Command() {
+    Scheduler.get().scheduleDeferred(new Command() {
       public void execute() {
         // Sizes must be appropriate, otherwise browsers may not resize as
         // requested. See comments in ResizeHelper.
diff --git a/user/test/com/google/gwt/user/client/ui/CompositeTest.java b/user/test/com/google/gwt/user/client/ui/CompositeTest.java
index 37abcf8..9e414f5 100644
--- a/user/test/com/google/gwt/user/client/ui/CompositeTest.java
+++ b/user/test/com/google/gwt/user/client/ui/CompositeTest.java
@@ -15,6 +15,7 @@
  */
 package com.google.gwt.user.client.ui;
 
+import com.google.gwt.core.client.Scheduler;
 import com.google.gwt.event.dom.client.BlurEvent;
 import com.google.gwt.event.dom.client.BlurHandler;
 import com.google.gwt.event.dom.client.FocusEvent;
@@ -22,7 +23,6 @@
 import com.google.gwt.junit.client.GWTTestCase;
 import com.google.gwt.user.client.Command;
 import com.google.gwt.user.client.DOM;
-import com.google.gwt.user.client.DeferredCommand;
 import com.google.gwt.user.client.Event;
 
 /**
@@ -100,9 +100,9 @@
     // Focus, then blur, the composite's text box. This has to be done in
     // deferred commands, because focus events usually require the event loop
     // to be pumped in order to fire.
-    DeferredCommand.addCommand(new Command() {
+    Scheduler.get().scheduleDeferred(new Command() {
       public void execute() {
-        DeferredCommand.addCommand(new Command() {
+        Scheduler.get().scheduleDeferred(new Command() {
           public void execute() {
             // Ensure all events fired as expected.
             assertTrue(c.domFocusFired);
diff --git a/user/test/com/google/gwt/user/client/ui/DOMTest.java b/user/test/com/google/gwt/user/client/ui/DOMTest.java
index 17e09b9..24b9e89 100644
--- a/user/test/com/google/gwt/user/client/ui/DOMTest.java
+++ b/user/test/com/google/gwt/user/client/ui/DOMTest.java
@@ -16,6 +16,7 @@
 package com.google.gwt.user.client.ui;
 
 import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.Scheduler;
 import com.google.gwt.core.client.GWT.UncaughtExceptionHandler;
 import com.google.gwt.dom.client.BodyElement;
 import com.google.gwt.dom.client.Document;
@@ -27,7 +28,6 @@
 import com.google.gwt.junit.client.GWTTestCase;
 import com.google.gwt.user.client.Command;
 import com.google.gwt.user.client.DOM;
-import com.google.gwt.user.client.DeferredCommand;
 import com.google.gwt.user.client.Element;
 import com.google.gwt.user.client.Event;
 import com.google.gwt.user.client.Timer;
@@ -141,7 +141,7 @@
     DOM.setStyleAttribute(elem, "left", (left - doc.getBodyOffsetTop()) + "px");
 
     delayTestFinish(1000);
-    DeferredCommand.addCommand(new Command() {
+    Scheduler.get().scheduleDeferred(new Command() {
       public void execute() {
         assertEquals(top + margin, DOM.getAbsoluteTop(elem));
         assertEquals(left + margin, DOM.getAbsoluteLeft(elem));
diff --git a/user/test/com/google/gwt/user/client/ui/DialogBoxTest.java b/user/test/com/google/gwt/user/client/ui/DialogBoxTest.java
index d6603ae..4ecc0e4 100644
--- a/user/test/com/google/gwt/user/client/ui/DialogBoxTest.java
+++ b/user/test/com/google/gwt/user/client/ui/DialogBoxTest.java
@@ -15,13 +15,13 @@
  */
 package com.google.gwt.user.client.ui;
 
+import com.google.gwt.core.client.Scheduler;
 import com.google.gwt.event.dom.client.ClickEvent;
 import com.google.gwt.event.dom.client.ClickHandler;
 import com.google.gwt.junit.DoNotRunWith;
 import com.google.gwt.junit.Platform;
 import com.google.gwt.user.client.Command;
 import com.google.gwt.user.client.DOM;
-import com.google.gwt.user.client.DeferredCommand;
 
 /**
  * Unit test for {@link DialogBox}.
@@ -103,7 +103,7 @@
 
     delayTestFinish(250);
     // Check the header IDs
-    DeferredCommand.addCommand(new Command() {
+    Scheduler.get().scheduleDeferred(new Command() {
       public void execute() {
         UIObjectTest.assertDebugIdContents("myDialogBox-caption",
             "test caption");
diff --git a/user/test/com/google/gwt/user/client/ui/LayoutPanelTest.java b/user/test/com/google/gwt/user/client/ui/LayoutPanelTest.java
index 6ac4e96..7e48183 100644
--- a/user/test/com/google/gwt/user/client/ui/LayoutPanelTest.java
+++ b/user/test/com/google/gwt/user/client/ui/LayoutPanelTest.java
@@ -15,12 +15,12 @@
  */
 package com.google.gwt.user.client.ui;
 
+import com.google.gwt.core.client.Scheduler;
 import com.google.gwt.dom.client.Document;
 import com.google.gwt.dom.client.Style.Unit;
 import com.google.gwt.layout.client.Layout.AnimationCallback;
 import com.google.gwt.layout.client.Layout.Layer;
 import com.google.gwt.user.client.Command;
-import com.google.gwt.user.client.DeferredCommand;
 
 /**
  * Tests for {@link LayoutPanel}. Note that this only tests LayoutPanel-specific
@@ -42,7 +42,7 @@
     p.forceLayout();
 
     delayTestFinish(5000);
-    DeferredCommand.addCommand(new Command() {
+    Scheduler.get().scheduleDeferred(new Command() {
       public void execute() {
         p.animate(100, new AnimationCallback() {
           public void onLayout(Layer layer, double progress) {
@@ -73,7 +73,7 @@
     popup.center();
 
     delayTestFinish(2000);
-    DeferredCommand.addCommand(new Command() {
+    Scheduler.get().scheduleDeferred(new Command() {
       public void execute() {
         int offsetWidth = lp.getOffsetWidth();
         int offsetHeight = lp.getOffsetHeight();
diff --git a/user/test/com/google/gwt/user/client/ui/ListBoxTest.java b/user/test/com/google/gwt/user/client/ui/ListBoxTest.java
index eb06f9e..e9c6f44 100644
--- a/user/test/com/google/gwt/user/client/ui/ListBoxTest.java
+++ b/user/test/com/google/gwt/user/client/ui/ListBoxTest.java
@@ -15,9 +15,9 @@
  */
 package com.google.gwt.user.client.ui;
 
+import com.google.gwt.core.client.Scheduler;
 import com.google.gwt.junit.client.GWTTestCase;
 import com.google.gwt.user.client.Command;
-import com.google.gwt.user.client.DeferredCommand;
 
 /**
  * Tests {@link ListBox}. Needs many, many more tests.
@@ -50,7 +50,7 @@
     UIObjectTest.assertDebugId("myList", list.getElement());
 
     delayTestFinish(5000);
-    DeferredCommand.addCommand(new Command() {
+    Scheduler.get().scheduleDeferred(new Command() {
       public void execute() {
         UIObjectTest.assertDebugIdContents("myList-item0", "option0");   
         UIObjectTest.assertDebugIdContents("myList-item1", "option1");   
diff --git a/user/test/com/google/gwt/user/client/ui/MenuBarTest.java b/user/test/com/google/gwt/user/client/ui/MenuBarTest.java
index f08931f..bf4dccb 100644
--- a/user/test/com/google/gwt/user/client/ui/MenuBarTest.java
+++ b/user/test/com/google/gwt/user/client/ui/MenuBarTest.java
@@ -15,13 +15,13 @@
  */
 package com.google.gwt.user.client.ui;
 
+import com.google.gwt.core.client.Scheduler;
 import com.google.gwt.dom.client.Document;
 import com.google.gwt.dom.client.NativeEvent;
 import com.google.gwt.event.dom.client.KeyCodes;
 import com.google.gwt.junit.DoNotRunWith;
 import com.google.gwt.junit.Platform;
 import com.google.gwt.user.client.Command;
-import com.google.gwt.user.client.DeferredCommand;
 
 import java.util.List;
 
@@ -297,7 +297,7 @@
     UIObjectTest.assertDebugId("myMenu", bar.getElement());
 
     delayTestFinish(250);
-    DeferredCommand.addCommand(new Command() {
+    Scheduler.get().scheduleDeferred(new Command() {
       public void execute() {
         UIObjectTest.assertDebugIdContents("myMenu-item0", "top0");
         UIObjectTest.assertDebugIdContents("myMenu-item1", "top1");
diff --git a/user/test/com/google/gwt/user/client/ui/StackPanelTest.java b/user/test/com/google/gwt/user/client/ui/StackPanelTest.java
index 4bf82e6..ee4576d 100644
--- a/user/test/com/google/gwt/user/client/ui/StackPanelTest.java
+++ b/user/test/com/google/gwt/user/client/ui/StackPanelTest.java
@@ -15,9 +15,9 @@
  */
 package com.google.gwt.user.client.ui;
 
+import com.google.gwt.core.client.Scheduler;
 import com.google.gwt.user.client.Command;
 import com.google.gwt.user.client.DOM;
-import com.google.gwt.user.client.DeferredCommand;
 import com.google.gwt.user.client.Element;
 
 /**
@@ -78,7 +78,7 @@
     delayTestFinish(5000);
 
     // Check the header IDs
-    DeferredCommand.addCommand(new Command() {
+    Scheduler.get().scheduleDeferred(new Command() {
       public void execute() {
         UIObjectTest.assertDebugIdContents("myStack-text0", "header a");
         UIObjectTest.assertDebugIdContents("myStack-text1", "header b");
diff --git a/user/test/com/google/gwt/user/client/ui/TabLayoutPanelTest.java b/user/test/com/google/gwt/user/client/ui/TabLayoutPanelTest.java
index 5e062b2..dcace37 100644
--- a/user/test/com/google/gwt/user/client/ui/TabLayoutPanelTest.java
+++ b/user/test/com/google/gwt/user/client/ui/TabLayoutPanelTest.java
@@ -15,6 +15,7 @@
  */
 package com.google.gwt.user.client.ui;
 
+import com.google.gwt.core.client.Scheduler;
 import com.google.gwt.dom.client.Style.Unit;
 import com.google.gwt.event.logical.shared.BeforeSelectionEvent;
 import com.google.gwt.event.logical.shared.BeforeSelectionHandler;
@@ -24,7 +25,6 @@
 import com.google.gwt.junit.Platform;
 import com.google.gwt.junit.client.GWTTestCase;
 import com.google.gwt.user.client.Command;
-import com.google.gwt.user.client.DeferredCommand;
 
 import java.util.ArrayList;
 import java.util.Iterator;
@@ -90,13 +90,13 @@
     p.add(bar, new Label("bar"));
 
     delayTestFinish(2000);
-    DeferredCommand.addCommand(new Command() {
+    Scheduler.get().scheduleDeferred(new Command() {
       public void execute() {
         assertEquals(128, foo.getOffsetWidth());
         assertEquals(128 - 32, foo.getOffsetHeight());
 
         p.selectTab(1);
-        DeferredCommand.addCommand(new Command() {
+        Scheduler.get().scheduleDeferred(new Command() {
           public void execute() {
             assertEquals(128, bar.getOffsetWidth());
             assertEquals(128 - 32, bar.getOffsetHeight());