diff --git a/build-tools/ant-gwt/src/com/google/gwt/ant/taskdefs/SvnInfo.java b/build-tools/ant-gwt/src/com/google/gwt/ant/taskdefs/SvnInfo.java
index 280c200..f326367 100644
--- a/build-tools/ant-gwt/src/com/google/gwt/ant/taskdefs/SvnInfo.java
+++ b/build-tools/ant-gwt/src/com/google/gwt/ant/taskdefs/SvnInfo.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2008 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
@@ -25,27 +25,29 @@
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-
 /**
  * A Svn interface task, because the initial solution of <exec> and
- * <propertyregex> is unhappy in ant 1.6.5, and while that's old, it's not
- * quite "too old" for us to care.
+ * <propertyregex> is unhappy in ant 1.6.5, and while that's old, it's not quite
+ * "too old" for us to care.
  */
 public class SvnInfo extends Task {
 
   // URL line from svn info output, selecting the very last term of the URL as
   // the branch specifier
   private static final String URL_REGEX = "\\s*URL:\\s*https?://.*/([^/]*)\\s*";
-  
-  
+
+  private String fileprop;
+
+  private String outprop;
+
+  private String workdir;
+
   public SvnInfo() {
     super();
   }
 
   @Override
   public void execute() throws BuildException {
-    String result;
-  
     if (outprop == null) {
       throw new BuildException(
           "<svninfo> task requires an outputproperty attribute");
@@ -73,34 +75,37 @@
 
     getProject().setNewProperty(outprop, branch + "@" + revision);
     if (fileprop != null) {
-      getProject().setNewProperty(fileprop, branch + "-" 
-          + revision.replaceAll(":", "-"));
+      getProject().setNewProperty(fileprop,
+          branch + "-" + revision.replaceAll(":", "-"));
     }
   }
 
   /**
-   * Establishes the property containing the SVN output string, branch@rev.
-   * @param propname  Name of a property
+   * Establishes the directory used as the SVN workspace to fetch version
+   * information.
+   * 
+   * @param srcdir workspace directory name
    */
-  public void setOutputProperty(String propname) {
-    outprop = propname;
+  public void setDirectory(String srcdir) {
+    workdir = srcdir;
   }
 
   /**
    * Establishes the property containing the SVN output string, branch@rev.
-   * @param propname  Name of a property
+   * 
+   * @param propname Name of a property
    */
   public void setOutputFileProperty(String propname) {
     fileprop = propname;
   }
 
   /**
-   * Establishes the directory used as the SVN workspace to fetch version
-   * information about
-   * @param srcdir  workspace directory name
+   * Establishes the property containing the SVN output string, branch@rev.
+   * 
+   * @param propname Name of a property
    */
-  public void setDirectory(String srcdir) {
-    workdir = srcdir;
+  public void setOutputProperty(String propname) {
+    outprop = propname;
   }
 
   private String getSvnBranch(File workdir) {
@@ -109,24 +114,24 @@
     LineNumberReader svnout = runCommand(workdir, "svn", "info");
     try {
       String line = svnout.readLine();
-      
+
       Pattern urlRegex = Pattern.compile(URL_REGEX);
       while (line != null) {
         Matcher m = urlRegex.matcher(line);
-        
+
         if (m.matches()) {
           branchName = m.group(1);
           if (branchName == null || "".equals(branchName)) {
-            throw new BuildException("svn info didn't get branch from URL line " 
-                + line);
+            throw new BuildException(
+                "svn info didn't get branch from URL line " + line);
           }
           break;
         }
         line = svnout.readLine();
       }
     } catch (IOException e) {
-      throw new BuildException("<svninfo> cannot read svn info's output stream", 
-          e);
+      throw new BuildException(
+          "<svninfo> cannot read svn info's output stream", e);
     }
     return branchName;
   }
@@ -138,8 +143,8 @@
     try {
       line = svnout.readLine();
     } catch (IOException e) {
-      throw new BuildException("<svninfo> cannot read svnversion's output stream",
-          e);
+      throw new BuildException(
+          "<svninfo> cannot read svnversion's output stream", e);
     }
     if (line == null || "".equals(line)) {
       throw new BuildException("svnversion didn't give any answer");
@@ -147,13 +152,13 @@
     return line;
   }
 
-  private LineNumberReader runCommand (File workdir, String... cmd) {
+  private LineNumberReader runCommand(File workdir, String... cmd) {
     String cmdString = "";
     for (String arg : cmd) {
       cmdString = cmdString + arg + " ";
     }
     cmdString = cmdString.substring(0, cmdString.length() - 1);
-    
+
     ProcessBuilder svnPb = new ProcessBuilder(cmd);
     svnPb.directory(workdir);
     Process svnproc;
@@ -162,9 +167,9 @@
     } catch (IOException e) {
       throw new BuildException("cannot launch command " + cmdString, e);
     }
-    
-    LineNumberReader svnerr = 
-      new LineNumberReader(new InputStreamReader(svnproc.getErrorStream()));
+
+    LineNumberReader svnerr = new LineNumberReader(new InputStreamReader(
+        svnproc.getErrorStream()));
     try {
       String line = svnerr.readLine();
       String errorText = "";
@@ -173,20 +178,15 @@
           errorText = errorText + "  " + line + "\n";
           line = svnerr.readLine();
         }
-        throw new BuildException(cmdString + " returned error output:\n" 
+        throw new BuildException(cmdString + " returned error output:\n"
             + errorText);
       }
     } catch (IOException e) {
-      throw new BuildException("cannot read error stream from " + cmdString, 
-          e);
+      throw new BuildException("cannot read error stream from " + cmdString, e);
     }
-    
-    LineNumberReader svnout = 
-      new LineNumberReader(new InputStreamReader(svnproc.getInputStream()));    
+
+    LineNumberReader svnout = new LineNumberReader(new InputStreamReader(
+        svnproc.getInputStream()));
     return svnout;
   }
-  
-  private String fileprop;
-  private String outprop;
-  private String workdir;
 }
diff --git a/dev-ext/build.xml b/dev-ext/build.xml
new file mode 100644
index 0000000..8be986b
--- /dev/null
+++ b/dev-ext/build.xml
@@ -0,0 +1,24 @@
+<project name="dev-ext" default="build" basedir=".">
+  <property name="gwt.root" location=".." />
+  <property name="project.tail" value="dev-ext" />
+  <import file="${gwt.root}/common.ant.xml" />
+
+  <property.ensure name="gwt.dev.src" location="${gwt.root}/dev/core/src" />
+  <property.ensure name="gwt.dev.bin" location="${gwt.build.out}/dev/core/bin" />
+
+  <target name="build" description="Packages this project into a jar">
+    <mkdir dir="${gwt.build.lib}" />
+    <gwt.jar>
+      <fileset dir="${gwt.dev.src}">
+        <include name="com/google/gwt/core/ext/*.java" />
+      </fileset>
+      <fileset dir="${gwt.dev.bin}">
+        <include name="com/google/gwt/core/ext/*.class" />
+      </fileset>
+    </gwt.jar>
+  </target>
+
+  <target name="clean" description="Cleans this project's intermediate and output files">
+    <delete file="${project.lib}" />
+  </target>
+</project>
diff --git a/dev/core/src/com/google/gwt/core/ext/typeinfo/JClassType.java b/dev/core/src/com/google/gwt/core/ext/typeinfo/JClassType.java
index 3acd448..17f0d83 100644
--- a/dev/core/src/com/google/gwt/core/ext/typeinfo/JClassType.java
+++ b/dev/core/src/com/google/gwt/core/ext/typeinfo/JClassType.java
@@ -27,12 +27,6 @@
     HasMetaData {
 
   /**
-   * Cached set of supertypes for this type (including itself).  If null,
-   * the set has not been calculated yet.
-   */
-  private Set<JClassType> flattenedSupertypes;
-  
-  /**
    * Returns all of the superclasses and superinterfaces for a given type
    * including the type itself.
    */
@@ -327,6 +321,12 @@
     }
   }
 
+  /**
+   * Cached set of supertypes for this type (including itself).  If null,
+   * the set has not been calculated yet.
+   */
+  private Set<JClassType> flattenedSupertypes;
+
   public abstract void addImplementedInterface(JClassType intf);
 
   public abstract void addMetaData(String tagName, String[] values);
diff --git a/dev/core/src/com/google/gwt/core/linker/SingleScriptLinker.java b/dev/core/src/com/google/gwt/core/linker/SingleScriptLinker.java
index 790c1cc..7a69716 100644
--- a/dev/core/src/com/google/gwt/core/linker/SingleScriptLinker.java
+++ b/dev/core/src/com/google/gwt/core/linker/SingleScriptLinker.java
@@ -26,7 +26,6 @@
 import com.google.gwt.core.ext.linker.impl.SelectionScriptLinker;
 import com.google.gwt.dev.About;
 import com.google.gwt.dev.util.DefaultTextOutput;
-import com.google.gwt.dev.util.Util;
 
 import java.util.Collection;
 import java.util.Set;
@@ -73,16 +72,13 @@
 
     DefaultTextOutput out = new DefaultTextOutput(true);
 
-    // Emit the selection script in a function closure.
-    out.print("(function () {");
-    out.newlineOpt();
+    // Emit the selection script.
     String bootstrap = generateSelectionScript(logger, context, artifacts);
     bootstrap = context.optimizeJavaScript(logger, bootstrap);
     out.print(bootstrap);
-    out.print("})();");
     out.newlineOpt();
 
-    // Emit the module's JS in another closure
+    // Emit the module's JS a closure.
     out.print("(function () {");
     out.newlineOpt();
     out.print("var $gwt_version = \"" + About.GWT_VERSION_NUM + "\";");
@@ -116,22 +112,15 @@
     }
     out.print(js[0]);
 
-    // Add a callback to the selection script
+    // Generate the call to tell the bootstrap code that we're ready to go.
     out.newlineOpt();
-    out.print("if (" + context.getModuleFunctionName() + ") {");
-    out.newlineOpt();
-    out.print("  var __gwt_initHandlers = " + context.getModuleFunctionName()
-        + ".__gwt_initHandlers;");
-    out.print("  " + context.getModuleFunctionName()
-        + ".onScriptLoad(gwtOnLoad);");
-    out.newlineOpt();
-    out.print("}");
+    out.print("if (" + context.getModuleFunctionName() + ") "
+        + context.getModuleFunctionName() + ".onScriptLoad();");
     out.newlineOpt();
     out.print("})();");
     out.newlineOpt();
 
-    byte[] selectionScriptBytes = Util.getBytes(out.toString());
-    return emitBytes(logger, selectionScriptBytes, context.getModuleName()
+    return emitString(logger, out.toString(), context.getModuleName()
         + ".nocache.js");
   }
 
diff --git a/dev/core/src/com/google/gwt/core/linker/SingleScriptTemplate.js b/dev/core/src/com/google/gwt/core/linker/SingleScriptTemplate.js
index d7c6c3d..3668e91 100644
--- a/dev/core/src/com/google/gwt/core/linker/SingleScriptTemplate.js
+++ b/dev/core/src/com/google/gwt/core/linker/SingleScriptTemplate.js
@@ -1,5 +1,5 @@
 /*
- * Copyright 2007 Google Inc.
+ * Copyright 2008 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
@@ -14,7 +14,7 @@
  * the License.
  */
 
-window.__MODULE_FUNC__ = function() {
+function __MODULE_FUNC__() {
   // ---------------- INTERNAL GLOBALS ----------------
   
   // Cache symbols locally for good obfuscation
@@ -77,17 +77,23 @@
   }
 
   // Determine our own script's URL via magic :)
+  // This function produces one side-effect, it sets base to the module's
+  // base url.
   //
   function computeScriptBase() {
-    // see if gwt.js left a marker for us
-    var thisScript, markerScript;
+    var thisScript
+    ,markerId = "__gwt_marker___MODULE_NAME__"
+    ,markerScript;
 
-    // try writing a marker
-    $doc.write('<script id="__gwt_marker___MODULE_NAME__"></script>');
-    markerScript = $doc.getElementById("__gwt_marker___MODULE_NAME__");
-    if (markerScript) {
-      // this script should be the previous element
-      thisScript = markerScript.previousSibling;
+    $doc.write('<script id="' + markerId + '"></script>');
+    markerScript = $doc.getElementById(markerId);
+
+    // Our script element is assumed to be the closest previous script element
+    // to the marker, so start at the marker and walk backwards until we find
+    // a script.
+    thisScript = markerScript && markerScript.previousSibling;
+    while (thisScript && thisScript.tagName != 'SCRIPT') {
+      thisScript = thisScript.previousSibling;
     }
 
     // Gets the part of a url up to and including the 'path' portion.
@@ -217,6 +223,12 @@
 
   // --------------- STRAIGHT-LINE CODE ---------------
 
+  if (isHostedMode()) {
+    alert("Single-script hosted mode not yet implemented. See issue " +
+      "http://code.google.com/p/google-web-toolkit/issues/detail?id=2079");
+    return;
+  }
+
   // do it early for compile/browse rebasing
   computeScriptBase();
   processMetas();
@@ -243,7 +255,9 @@
 
   // For everyone that supports DOMContentLoaded.
   if ($doc.addEventListener) {
-    $doc.addEventListener("DOMContentLoaded", onBodyDone, false);
+    $doc.addEventListener("DOMContentLoaded", function() {
+      onBodyDone();
+    }, false);
   }
 
   // Fallback. If onBodyDone() gets fired twice, it's not a big deal.
diff --git a/dev/core/src/com/google/gwt/core/linker/XSLinker.java b/dev/core/src/com/google/gwt/core/linker/XSLinker.java
index 8d2d9fc..0511b40 100644
--- a/dev/core/src/com/google/gwt/core/linker/XSLinker.java
+++ b/dev/core/src/com/google/gwt/core/linker/XSLinker.java
@@ -96,14 +96,8 @@
 
     // Generate the call to tell the bootstrap code that we're ready to go.
     out.newlineOpt();
-    out.print("if (" + context.getModuleFunctionName() + ") {");
-    out.newlineOpt();
-    out.print("  var __gwt_initHandlers = " + context.getModuleFunctionName()
-        + ".__gwt_initHandlers;");
-    out.print("  " + context.getModuleFunctionName()
-        + ".onScriptLoad(gwtOnLoad);");
-    out.newlineOpt();
-    out.print("}");
+    out.print("if (" + context.getModuleFunctionName() + ") "
+        + context.getModuleFunctionName() + ".onScriptLoad();");
     out.newlineOpt();
     out.print("})();");
     out.newlineOpt();
diff --git a/dev/core/src/com/google/gwt/dev/About.java b/dev/core/src/com/google/gwt/dev/About.java
index b64eb5a..e6dabfb 100644
--- a/dev/core/src/com/google/gwt/dev/About.java
+++ b/dev/core/src/com/google/gwt/dev/About.java
@@ -42,11 +42,14 @@
     }
 
     GWT_SVNREV = props.getProperty("gwt.svnrev");
-    if (GWT_SVNREV == null) {
+    // Check for null or sentinel value (break up to avoid text replace)
+    if (GWT_SVNREV == null || GWT_SVNREV.equals("@GWT_" + "SVNREV@")) {
       GWT_SVNREV = "unknown";
     }
+
     GWT_VERSION_NUM = props.getProperty("gwt.version");
-    if (GWT_VERSION_NUM == null) {
+    // Check for null or sentinel value (break up to avoid text replace)
+    if (GWT_VERSION_NUM == null || GWT_VERSION_NUM.equals("@GWT_" + "VERSION@")) {
       GWT_VERSION_NUM = "0.0.0";
     }
     GWT_VERSION = GWT_NAME + " " + GWT_VERSION_NUM;
diff --git a/dev/core/src/com/google/gwt/dev/ArgProcessorBase.java b/dev/core/src/com/google/gwt/dev/ArgProcessorBase.java
index 3f38920..641ae7a 100644
--- a/dev/core/src/com/google/gwt/dev/ArgProcessorBase.java
+++ b/dev/core/src/com/google/gwt/dev/ArgProcessorBase.java
@@ -20,7 +20,7 @@
 /**
  * Base class for new-style argument processors.
  */
-abstract class ArgProcessorBase extends ToolBase {
+public abstract class ArgProcessorBase extends ToolBase {
   /*
    * Overridden to make public.
    */
diff --git a/dev/core/src/com/google/gwt/dev/CompileArgProcessor.java b/dev/core/src/com/google/gwt/dev/CompileArgProcessor.java
index 56eb33c..d0964de 100644
--- a/dev/core/src/com/google/gwt/dev/CompileArgProcessor.java
+++ b/dev/core/src/com/google/gwt/dev/CompileArgProcessor.java
@@ -25,6 +25,11 @@
     registerHandler(new ArgHandlerLogLevel(options));
     registerHandler(new ArgHandlerTreeLoggerFlag(options));
     registerHandler(new ArgHandlerWorkDirRequired(options));
-    registerHandler(new ArgHandlerModuleName(options));
+    registerHandler(new ArgHandlerModuleName(options) {
+      @Override
+      public String getPurpose() {
+        return super.getPurpose() + " to compile";
+      }
+    });
   }
 }
diff --git a/dev/core/src/com/google/gwt/dev/CompilePerms.java b/dev/core/src/com/google/gwt/dev/CompilePerms.java
index a35da85..5efa683 100644
--- a/dev/core/src/com/google/gwt/dev/CompilePerms.java
+++ b/dev/core/src/com/google/gwt/dev/CompilePerms.java
@@ -175,24 +175,21 @@
 
   /**
    * Compile a single permutation.
+   * 
+   * @throws UnableToCompleteException if the permutation compile fails
    */
   public static PermutationResult compile(TreeLogger logger,
-      Permutation permutation, UnifiedAst unifiedAst) {
-    try {
-      return JavaToJavaScriptCompiler.compilePermutation(logger, unifiedAst,
-          permutation.getRebindAnswers());
-    } catch (UnableToCompleteException e) {
-      // We intentionally don't pass in the exception here since the real
-      // cause has been logged.
-      return null;
-    }
+      Permutation permutation, UnifiedAst unifiedAst)
+      throws UnableToCompleteException {
+    return JavaToJavaScriptCompiler.compilePermutation(logger, unifiedAst,
+        permutation.getRebindAnswers());
   }
 
   /**
    * Compile multiple permutations.
    */
-  public static void compile(TreeLogger logger,
-      Precompilation precompilation, Permutation[] perms, int localWorkers,
+  public static void compile(TreeLogger logger, Precompilation precompilation,
+      Permutation[] perms, int localWorkers,
       List<FileBackedObject<PermutationResult>> resultFiles)
       throws UnableToCompleteException {
     final TreeLogger branch = logger.branch(TreeLogger.INFO, "Compiling "
diff --git a/dev/core/src/com/google/gwt/dev/CompilePermsServer.java b/dev/core/src/com/google/gwt/dev/CompilePermsServer.java
index 3971ef7..93111de 100644
--- a/dev/core/src/com/google/gwt/dev/CompilePermsServer.java
+++ b/dev/core/src/com/google/gwt/dev/CompilePermsServer.java
@@ -282,27 +282,32 @@
     } catch (ClassNotFoundException e) {
       logger.log(TreeLogger.ERROR, "Probable client/server mismatch or "
           + "classpath misconfiguration", e);
-    } catch (UnableToCompleteException e) {
-      logger.log(TreeLogger.ERROR, "Internal compiler error", e);
     }
     return false;
   }
 
   static void compilePermutation(TreeLogger logger, UnifiedAst ast,
       ObjectInputStream in, ObjectOutputStream out)
-      throws ClassNotFoundException, IOException, UnableToCompleteException {
+      throws ClassNotFoundException, IOException {
     FileBackedObject<PermutationResult> resultFile = (FileBackedObject<PermutationResult>) in.readObject();
     Permutation p = (Permutation) in.readObject();
     logger.log(TreeLogger.SPAM, "Permutation read");
 
-    PermutationResult result = CompilePerms.compile(logger.branch(
-        TreeLogger.DEBUG, "Compiling"), p, ast);
-    logger.log(TreeLogger.DEBUG, "Successfully compiled permutation");
+    Throwable caught = null;
+    try {
+      PermutationResult result = CompilePerms.compile(logger.branch(
+          TreeLogger.DEBUG, "Compiling"), p, ast);
+      resultFile.set(logger, result);
+      logger.log(TreeLogger.DEBUG, "Successfully compiled permutation");
+    } catch (UnableToCompleteException e) {
+      caught = e;
+    } catch (Throwable e) {
+      logger.log(TreeLogger.ERROR, "Compile failed", e);
+      caught = e;
+    }
 
-    resultFile.set(logger, result);
-
-    // Send a placeholder null indicating no Throwable
-    out.writeObject(null);
+    // Might send a placeholder null indicating no Throwable.
+    out.writeObject(caught);
     out.flush();
     logger.log(TreeLogger.SPAM, "Sent result");
   }
diff --git a/dev/core/src/com/google/gwt/dev/ExternalPermutationWorkerFactory.java b/dev/core/src/com/google/gwt/dev/ExternalPermutationWorkerFactory.java
index 312e4bd..2b0790e 100644
--- a/dev/core/src/com/google/gwt/dev/ExternalPermutationWorkerFactory.java
+++ b/dev/core/src/com/google/gwt/dev/ExternalPermutationWorkerFactory.java
@@ -150,7 +150,6 @@
           logger.log(TreeLogger.ERROR, "Error from external worker", t);
           throw new UnableToCompleteException();
         }
-
       } catch (IOException e) {
         logger.log(TreeLogger.WARN, "Lost communication with remote process", e);
         throw new TransientWorkerException(
diff --git a/dev/core/src/com/google/gwt/dev/GWTShell.java b/dev/core/src/com/google/gwt/dev/GWTShell.java
index 705eb28..c9955de 100644
--- a/dev/core/src/com/google/gwt/dev/GWTShell.java
+++ b/dev/core/src/com/google/gwt/dev/GWTShell.java
@@ -174,7 +174,9 @@
   protected void compile(TreeLogger logger, ModuleDef moduleDef)
       throws UnableToCompleteException {
     LegacyCompilerOptions newOptions = new GWTCompilerOptionsImpl(options);
-    new GWTCompiler(newOptions).run(logger, moduleDef);
+    if (!new GWTCompiler(newOptions).run(logger, moduleDef)) {
+      throw new UnableToCompleteException();
+    }
   }
 
   @Override
diff --git a/dev/core/src/com/google/gwt/dev/HostedMode.java b/dev/core/src/com/google/gwt/dev/HostedMode.java
index cebda22..90a4920 100644
--- a/dev/core/src/com/google/gwt/dev/HostedMode.java
+++ b/dev/core/src/com/google/gwt/dev/HostedMode.java
@@ -31,13 +31,11 @@
 import com.google.gwt.dev.util.arg.ArgHandlerModuleName;
 import com.google.gwt.dev.util.arg.ArgHandlerWarDir;
 import com.google.gwt.dev.util.arg.ArgHandlerWorkDirOptional;
-import com.google.gwt.dev.util.log.PrintWriterTreeLogger;
 import com.google.gwt.util.tools.ArgHandlerString;
 import com.google.gwt.util.tools.Utility;
 
 import java.io.File;
 import java.io.IOException;
-import java.io.PrintWriter;
 import java.net.BindException;
 import java.util.HashMap;
 import java.util.Map;
@@ -150,7 +148,12 @@
       registerHandler(new ArgHandlerExtraDir(options));
       registerHandler(new ArgHandlerWorkDirOptional(options));
       registerHandler(new ArgHandlerLocalWorkers(options));
-      registerHandler(new ArgHandlerModuleName(options));
+      registerHandler(new ArgHandlerModuleName(options) {
+        @Override
+        public String getPurpose() {
+          return super.getPurpose() + " to host";
+        }
+      });
     }
 
     @Override
@@ -233,9 +236,6 @@
     System.exit(-1);
   }
 
-  protected final PrintWriterTreeLogger console = new PrintWriterTreeLogger(
-      new PrintWriter(System.err, true));
-
   /**
    * Hiding super field because it's actually the same object, just with a
    * stronger type.
@@ -264,10 +264,6 @@
    */
   private boolean tempWorkDir = false;
 
-  {
-    console.setMaxDetail(TreeLogger.WARN);
-  }
-
   /**
    * Default constructor for testing; no public API yet.
    */
@@ -346,7 +342,7 @@
                   + "'; add servlet tags to your web.xml instead");
         }
 
-        link(loadLogger, module, false);
+        link(loadLogger, module);
       } catch (UnableToCompleteException e) {
         // Already logged.
         return false;
@@ -400,7 +396,7 @@
         shouldRefreshPage = true;
         module = loadModule(getTopLogger(), module.getCanonicalName(), false);
       }
-      link(getTopLogger(), module, true);
+      link(getTopLogger(), module);
       return shouldRefreshPage;
     } catch (UnableToCompleteException e) {
       // Already logged.
@@ -429,8 +425,8 @@
    *          the link, otherwise do not include them
    * @throws UnableToCompleteException
    */
-  private void link(TreeLogger logger, ModuleDef module,
-      boolean includePublicFiles) throws UnableToCompleteException {
+  private void link(TreeLogger logger, ModuleDef module)
+      throws UnableToCompleteException {
     // TODO: move the module-specific computations to a helper function.
     File moduleOutDir = new File(options.getWarDir(), module.getName());
     File moduleExtraDir = (options.getExtraDir() == null) ? null : new File(
@@ -441,10 +437,6 @@
         module, options);
     linkerStacks.put(module.getName(), linkerStack);
 
-    if (!includePublicFiles) {
-      linkerStack.getArtifacts().clear();
-    }
-
     ArtifactSet artifacts = linkerStack.invokeLink(logger);
     linkerStack.produceOutputDirectory(logger, artifacts, moduleOutDir,
         moduleExtraDir);
diff --git a/dev/core/src/com/google/gwt/dev/HostedModeBase.java b/dev/core/src/com/google/gwt/dev/HostedModeBase.java
index 0685260..92e8b13 100644
--- a/dev/core/src/com/google/gwt/dev/HostedModeBase.java
+++ b/dev/core/src/com/google/gwt/dev/HostedModeBase.java
@@ -501,17 +501,14 @@
    */
   public final void run() {
     try {
-      if (!startUp()) {
-        // Failed to initalize.
-        return;
+      if (startUp()) {
+        // Eager AWT init for OS X to ensure safe coexistence with SWT.
+        BootStrapPlatform.initGui();
+
+        // Tomcat's running now, so launch browsers for startup urls now.
+        launchStartupUrls(getTopLogger());
       }
 
-      // Eager AWT initialization for OS X to ensure safe coexistence with SWT.
-      BootStrapPlatform.initGui();
-
-      // Tomcat's running now, so launch browsers for startup urls now.
-      launchStartupUrls(getTopLogger());
-
       pumpEventLoop();
     } catch (Exception e) {
       e.printStackTrace();
diff --git a/dev/core/src/com/google/gwt/dev/PermutationWorker.java b/dev/core/src/com/google/gwt/dev/PermutationWorker.java
index be16ba2..124c497 100644
--- a/dev/core/src/com/google/gwt/dev/PermutationWorker.java
+++ b/dev/core/src/com/google/gwt/dev/PermutationWorker.java
@@ -34,7 +34,7 @@
    * 
    * @throws TransientWorkerException if the Permutation should be tried again
    *           on another worker
-   * @throws UnableToCompleteException due to a fatal error
+   * @throws UnableToCompleteException if the compile fails for any reason
    */
   void compile(TreeLogger logger, Permutation permutation,
       FileBackedObject<PermutationResult> resultFile)
diff --git a/dev/core/src/com/google/gwt/dev/PermutationWorkerFactory.java b/dev/core/src/com/google/gwt/dev/PermutationWorkerFactory.java
index 6c50d96..cc324c5 100644
--- a/dev/core/src/com/google/gwt/dev/PermutationWorkerFactory.java
+++ b/dev/core/src/com/google/gwt/dev/PermutationWorkerFactory.java
@@ -78,7 +78,6 @@
             } catch (UnableToCompleteException e) {
               logger.log(TreeLogger.ERROR,
                   "Unrecoverable exception, shutting down", e);
-              threadDeathResult = Result.FAIL;
               return;
             }
           }
diff --git a/dev/core/src/com/google/gwt/dev/javac/CompilationState.java b/dev/core/src/com/google/gwt/dev/javac/CompilationState.java
index 0ad7a78..3ada290 100644
--- a/dev/core/src/com/google/gwt/dev/javac/CompilationState.java
+++ b/dev/core/src/com/google/gwt/dev/javac/CompilationState.java
@@ -261,5 +261,6 @@
     exposedUnits = Collections.unmodifiableSet(new HashSet<CompilationUnit>(
         unitMap.values()));
     exposedClassFileMap = null;
+    exposedClassFileMapBySource = null;
   }
 }
diff --git a/dev/core/src/com/google/gwt/dev/javac/CompilationUnit.java b/dev/core/src/com/google/gwt/dev/javac/CompilationUnit.java
index 210995c..f5a77bd 100644
--- a/dev/core/src/com/google/gwt/dev/javac/CompilationUnit.java
+++ b/dev/core/src/com/google/gwt/dev/javac/CompilationUnit.java
@@ -15,7 +15,11 @@
  */
 package com.google.gwt.dev.javac;
 
+import com.google.gwt.dev.asm.ClassReader;
+import com.google.gwt.dev.asm.Opcodes;
+import com.google.gwt.dev.asm.commons.EmptyVisitor;
 import com.google.gwt.dev.jdt.TypeRefVisitor;
+import com.google.gwt.dev.shell.CompilingClassLoader;
 
 import org.eclipse.jdt.core.compiler.CategorizedProblem;
 import org.eclipse.jdt.internal.compiler.ASTVisitor;
@@ -26,9 +30,12 @@
 import org.eclipse.jdt.internal.compiler.lookup.CompilationUnitScope;
 import org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding;
 
+import java.util.ArrayList;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.IdentityHashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
@@ -39,6 +46,25 @@
  */
 public abstract class CompilationUnit {
 
+  static class AnonymousClassVisitor extends EmptyVisitor {
+    /*
+     * array of classNames of inner clases that aren't synthetic.
+     */
+    List<String> classNames = new ArrayList<String>();
+
+    public List<String> getInnerClassNames() {
+      return classNames;
+    }
+
+    @Override
+    public void visitInnerClass(String name, String outerName,
+        String innerName, int access) {
+      if ((access & Opcodes.ACC_SYNTHETIC) == 0) {
+        classNames.add(name);
+      }
+    }
+  }
+
   /**
    * Tracks the state of a compilation unit through the compile and recompile
    * process.
@@ -128,12 +154,45 @@
     return result;
   }
 
+  /**
+   * Map from the className in javac to the className in jdt. String represents
+   * the part of className after the compilation unit name. Emma-specific.
+   */
+  private Map<String, String> anonymousClassMap = null;
   private CompilationUnitDeclaration cud;
   private CategorizedProblem[] errors;
   private Set<CompiledClass> exposedCompiledClasses;
   private Set<String> fileNameRefs;
+  private List<JsniMethod> jsniMethods = null;
   private State state = State.FRESH;
 
+  /*
+   * Check if the unit has one or more anonymous classes. 'javac' below refers
+   * to the compiler that was used to compile the java files on disk. Returns
+   * true if our heuristic for constructing the anonymous class mappings worked.
+   */
+  public boolean constructAnonymousClassMappings(byte classBytes[]) {
+    // map from the name in javac to the name in jdt
+    anonymousClassMap = new HashMap<String, String>();
+    List<String> javacClasses = getJavacClassNames(classBytes);
+    List<String> jdtClasses = getJdtClassNames();
+    if (javacClasses.size() == jdtClasses.size()) {
+      int size = javacClasses.size();
+      for (int i = 0; i < size; i++) {
+        if (!javacClasses.get(i).equals(jdtClasses.get(i))) {
+          anonymousClassMap.put(javacClasses.get(i), jdtClasses.get(i));
+        }
+      }
+      return true;
+    }
+    anonymousClassMap = Collections.emptyMap();
+    return false;
+  }
+
+  public boolean createdClassMapping() {
+    return anonymousClassMap != null;
+  }
+
   /**
    * Overridden to finalize; always returns object identity.
    */
@@ -142,12 +201,33 @@
     return super.equals(obj);
   }
 
+  public Map<String, String> getAnonymousClassMap() {
+    /*
+     * Return an empty map so that class-rewriter does not need to check for
+     * null. A null value indicates that anonymousClassMap was never created
+     * which is the case for many units. An example is a class containing jsni
+     * units but no inner classes.
+     */
+    if (anonymousClassMap == null) {
+      return Collections.emptyMap();
+    }
+    return anonymousClassMap;
+  }
+
   /**
    * Returns the user-relevant location of the source file. No programmatic
    * assumptions should be made about the return value.
    */
   public abstract String getDisplayLocation();
 
+  public boolean getJsniInjected() {
+    return jsniMethods != null;
+  }
+
+  public List<JsniMethod> getJsniMethods() {
+    return jsniMethods;
+  }
+
   /**
    * Returns the last modified time of the compilation unit.
    */
@@ -163,6 +243,15 @@
    */
   public abstract String getTypeName();
 
+  public boolean hasAnonymousClasses() {
+    for (CompiledClass cc : getCompiledClasses()) {
+      if (isAnonymousClass(cc)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
   /**
    * Overridden to finalize; always returns identity hash code.
    */
@@ -189,7 +278,7 @@
   public abstract boolean isGenerated();
 
   /**
-   *
+   * 
    * @return true if the Compilation Unit is from a super-source.
    */
   public abstract boolean isSuperSource();
@@ -257,6 +346,10 @@
     state = State.COMPILED;
   }
 
+  void setJsniMethods(List<JsniMethod> jsniMethods) {
+    this.jsniMethods = Collections.unmodifiableList(jsniMethods);
+  }
+
   /**
    * Changes the compilation unit's internal state.
    */
@@ -290,12 +383,39 @@
     }
   }
 
+  private List<String> getJavacClassNames(byte classBytes[]) {
+    AnonymousClassVisitor cv = new AnonymousClassVisitor();
+    new ClassReader(classBytes).accept(cv, 0);
+    List<String> classNames = cv.getInnerClassNames();
+    List<String> namesToRemove = new ArrayList<String>();
+    for (String className : classNames) {
+      if (!CompilingClassLoader.isClassnameGenerated(className)) {
+        namesToRemove.add(className);
+      }
+    }
+    classNames.removeAll(namesToRemove);
+    Collections.sort(classNames, new GeneratedClassnameComparator());
+    return classNames;
+  }
+
+  private List<String> getJdtClassNames() {
+    List<String> classNames = new ArrayList<String>();
+    for (CompiledClass cc : getCompiledClasses()) {
+      if (isAnonymousClass(cc)) {
+        classNames.add(cc.getBinaryName());
+      }
+    }
+    Collections.sort(classNames, new GeneratedClassnameComparator());
+    return classNames;
+  }
+
   /**
    * Removes all accumulated state associated with compilation.
    */
   private void invalidate() {
     cud = null;
     fileNameRefs = null;
+    jsniMethods = null;
     if (exposedCompiledClasses != null) {
       for (CompiledClass compiledClass : exposedCompiledClasses) {
         compiledClass.invalidate();
@@ -303,4 +423,12 @@
       exposedCompiledClasses = null;
     }
   }
+
+  private boolean isAnonymousClass(CompiledClass cc) {
+    if (!cc.getRealClassType().isLocalType()) {
+      return false;
+    }
+    return CompilingClassLoader.isClassnameGenerated(cc.getBinaryName());
+  }
+
 }
diff --git a/dev/core/src/com/google/gwt/dev/javac/CompiledClass.java b/dev/core/src/com/google/gwt/dev/javac/CompiledClass.java
index 44e8e90..29ad532 100644
--- a/dev/core/src/com/google/gwt/dev/javac/CompiledClass.java
+++ b/dev/core/src/com/google/gwt/dev/javac/CompiledClass.java
@@ -27,9 +27,6 @@
 import org.eclipse.jdt.internal.compiler.lookup.LocalTypeBinding;
 import org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding;
 
-import java.util.Collections;
-import java.util.List;
-
 /**
  * Encapsulates the state of a single compiled class file.
  */
@@ -61,7 +58,6 @@
   protected final CompilationUnit unit;
 
   // The state below is transient.
-  private List<JsniMethod> jsniMethods;
   private NameEnvironmentAnswer nameEnvironmentAnswer;
   private JRealClassType realClassType;
   // Can be killed after parent is CHECKED.
@@ -106,10 +102,6 @@
     return enclosingClass;
   }
 
-  public List<JsniMethod> getJsniMethods() {
-    return jsniMethods;
-  }
-
   /**
    * Returns the enclosing package, e.g. {@code java.util}.
    */
@@ -163,17 +155,12 @@
   void invalidate() {
     nameEnvironmentAnswer = null;
     typeDeclaration = null;
-    jsniMethods = null;
     if (realClassType != null) {
       realClassType.invalidate();
       realClassType = null;
     }
   }
 
-  void setJsniMethods(List<JsniMethod> jsniMethods) {
-    this.jsniMethods = Collections.unmodifiableList(jsniMethods);
-  }
-
   void setRealClassType(JRealClassType realClassType) {
     this.realClassType = realClassType;
   }
diff --git a/dev/core/src/com/google/gwt/dev/javac/GeneratedClassnameComparator.java b/dev/core/src/com/google/gwt/dev/javac/GeneratedClassnameComparator.java
new file mode 100644
index 0000000..e7280b2
--- /dev/null
+++ b/dev/core/src/com/google/gwt/dev/javac/GeneratedClassnameComparator.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2008 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.dev.javac;
+
+import java.util.Comparator;
+
+class GeneratedClassnameComparator implements Comparator<String> {
+
+  public int compare(String arg0, String arg1) {
+    String pattern = "\\$";
+    String splits0[] = arg0.split(pattern);
+    String splits1[] = arg1.split(pattern);
+    if (splits0.length != splits1.length) {
+      return splits0.length - splits1.length;
+    }
+    for (int i = 0; i < splits0.length; i++) {
+      int answer = compareWithoutDollars(splits0[i], splits1[i]);
+      if (answer != 0) {
+        return answer;
+      }
+    }
+    return 0;
+  }
+
+  /*
+   * 3 cases: (i) both can be converted to integer: compare the integral value.
+   * (ii) only one can be converted to integer: the one with integral value is
+   * lower. (iii) none can be converted to integer: compare the strings.
+   */
+  private int compareWithoutDollars(String arg0, String arg1) {
+    boolean arg0IsInt = false;
+    boolean arg1IsInt = false;
+    int int0 = 0, int1 = 0;
+    if ((arg0 == null) != (arg1 == null)) {
+      return (arg0 == null) ? -1 : 1;
+    }
+    if (arg0 == null) {
+      return 0;
+    }
+
+    if (arg0.charAt(0) != '-') {
+      try {
+        int0 = Integer.parseInt(arg0);
+        arg0IsInt = true;
+      } catch (NumberFormatException ex) {
+        // ignored
+      }
+    }
+
+    if (arg1.charAt(0) != '-') {
+      try {
+        int1 = Integer.parseInt(arg1);
+        arg1IsInt = true;
+      } catch (NumberFormatException ex) {
+        // ignored
+      }
+    }
+
+    if (arg0IsInt != arg1IsInt) {
+      return arg0IsInt ? -1 : 1;
+    }
+
+    // now either both are int or both are Strings
+    if (arg0IsInt) {
+      return int0 - int1;
+    }
+    return arg0.compareTo(arg1);
+  }
+}
diff --git a/dev/core/src/com/google/gwt/dev/javac/JsniCollector.java b/dev/core/src/com/google/gwt/dev/javac/JsniCollector.java
index 2df9839..0bc1d6f 100644
--- a/dev/core/src/com/google/gwt/dev/javac/JsniCollector.java
+++ b/dev/core/src/com/google/gwt/dev/javac/JsniCollector.java
@@ -65,7 +65,7 @@
     private final String[] paramNames;
     private final String source;
     private final JsProgram program;
-
+    
     private JsniMethodImpl(String name, String source, String[] paramNames,
         int line, String location, JsProgram program) {
       this.name = name;
@@ -143,10 +143,13 @@
       if (unit.getState() == State.COMPILED) {
         String loc = unit.getDisplayLocation();
         String source = unit.getSource();
+        assert unit.getJsniMethods() == null;
+        List<JsniMethod> jsniMethods = new ArrayList<JsniMethod>();
         for (CompiledClass compiledClass : unit.getCompiledClasses()) {
-          assert compiledClass.getJsniMethods() == null;
-          collectJsniMethods(logger, loc, source, compiledClass, program);
+          jsniMethods.addAll(collectJsniMethods(logger, loc, source,
+              compiledClass, program));
         }
+        unit.setJsniMethods(jsniMethods);
       }
     }
   }
@@ -154,8 +157,8 @@
   /**
    * TODO: log real errors, replacing GenerateJavaScriptAST?
    */
-  private static void collectJsniMethods(TreeLogger logger, String loc,
-      String source, CompiledClass compiledClass, JsProgram program) {
+  private static List<JsniMethod> collectJsniMethods(TreeLogger logger,
+      String loc, String source, CompiledClass compiledClass, JsProgram program) {
     TypeDeclaration typeDecl = compiledClass.getTypeDeclaration();
     int[] lineEnds = typeDecl.compilationResult.getLineSeparatorPositions();
     List<JsniMethod> jsniMethods = new ArrayList<JsniMethod>();
@@ -184,7 +187,7 @@
             startLine, loc, program));
       }
     }
-    compiledClass.setJsniMethods(jsniMethods);
+    return jsniMethods;
   }
 
   private static Interval findJsniSource(String source,
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/ControlFlowAnalyzer.java b/dev/core/src/com/google/gwt/dev/jjs/impl/ControlFlowAnalyzer.java
index bcac220..d401d5e 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/ControlFlowAnalyzer.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/ControlFlowAnalyzer.java
@@ -121,11 +121,12 @@
         boolean doSkip = false;
         JExpression lhs = x.getLhs();
         if (lhs.hasSideEffects() || isVolatileField(lhs)) {
-          // If the lhs has side effects, skipping it would lose the side
-          // effect.
-          // If the lhs is volatile, also keep it. This behavior provides a
-          // useful
-          // idiom for test cases to prevent code from being pruned.
+          /*
+           * If the lhs has side effects, skipping it would lose the side
+           * effect. If the lhs is volatile, also keep it. This behavior
+           * provides a useful idiom for test cases to prevent code from being
+           * pruned.
+           */
         } else if (lhs instanceof JLocalRef) {
           // locals are ok to skip
           doSkip = true;
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsRootScope.java b/dev/core/src/com/google/gwt/dev/js/ast/JsRootScope.java
index 95ce00a..62b564b 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsRootScope.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsRootScope.java
@@ -74,13 +74,33 @@
         // B.2 Additional Properties (non-normative)
         "escape", "unescape",
 
+        // Window props (http://www.w3schools.com/HTMLDOM/dom_obj_window.asp)
+        "closed", "defaultStatus", "document", "frames", "history", "length",
+        "location", "name", "opener", "outerHeight", "outerWidth",
+        "pageXOffset", "pageYOffset", "parent", "personalbar", "scrollbars",
+        "self", "status", "statusbar", "toolbar", "top",
+
+        // Window methods (http://www.w3schools.com/HTMLDOM/dom_obj_window.asp)
+        "alert", "blur", "clearInterval", "clearTimeout", "close", "confirm",
+        "createPopup", "focus", "moveBy", "moveTo", "open", "print", "prompt",
+        "resizeBy", "resizeTo", "scrollBy", "scrollTo", "setInterval",
+        "setTimeout",
+
+        // IE event methods
+        // (http://msdn.microsoft.com/en-us/library/ms535873(VS.85).aspx#)
+        "onafterprint", "onbeforedeactivate", "onbeforeprint",
+        "onbeforeunload", "onblur", "oncontrolselect", "ondeactivate",
+        "onerror", "onfocus", "onhashchange  ", "onhelp", "onload", "onresize",
+        "onresizeend", "onscroll",
+        "onunload",
+
         // Common browser-defined identifiers not defined in ECMAScript
-        "window", "document", "event", "location", "history", "external",
+        "window", "dispatchEvent", "event", "external", "navigator", "screen",
         "Debug", "Enumerator", "Global", "Image", "ActiveXObject", "VBArray",
         "Components",
 
         // Functions commonly defined on Object
-        "toString", "getClass",
+        "toString", "getClass", "constructor", "prototype",
 
         // GWT-defined identifiers
         "$wnd", "$doc", "$moduleName", "$moduleBase", "$gwt_version",
diff --git a/dev/core/src/com/google/gwt/dev/shell/CompilingClassLoader.java b/dev/core/src/com/google/gwt/dev/shell/CompilingClassLoader.java
index 10bdbef..d5c86f2 100644
--- a/dev/core/src/com/google/gwt/dev/shell/CompilingClassLoader.java
+++ b/dev/core/src/com/google/gwt/dev/shell/CompilingClassLoader.java
@@ -23,7 +23,9 @@
 import com.google.gwt.core.ext.typeinfo.JParameter;
 import com.google.gwt.core.ext.typeinfo.TypeOracle;
 import com.google.gwt.dev.javac.CompilationState;
+import com.google.gwt.dev.javac.CompilationUnit;
 import com.google.gwt.dev.javac.CompiledClass;
+import com.google.gwt.dev.javac.JsniMethod;
 import com.google.gwt.dev.shell.rewrite.HostedModeClassRewriter;
 import com.google.gwt.dev.shell.rewrite.HostedModeClassRewriter.InstanceMethodOracle;
 import com.google.gwt.dev.util.JsniRef;
@@ -45,14 +47,16 @@
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.Stack;
+import java.util.regex.Pattern;
 
 /**
  * An isolated {@link ClassLoader} for running all user code. All user files are
- * compiled from source code byte a {@link ByteCodeCompiler}. After compilation,
- * some byte code rewriting is performed to support
+ * compiled from source code byte a {@link ByteCodeCompiler}. After
+ * compilation, some byte code rewriting is performed to support
  * <code>JavaScriptObject</code> and its subtypes.
  * 
  * TODO: we should refactor this class to move the getClassInfoByDispId,
@@ -352,10 +356,12 @@
 
   private static final String CLASS_DUMP_PATH = "rewritten-classes";
 
-  private static boolean emmaIsAvailable = false;
+  private static boolean emmaAvailable = false;
 
   private static EmmaStrategy emmaStrategy;
 
+  private static final Pattern GENERATED_CLASSNAME_PATTERN = Pattern.compile(".+\\$\\d+(\\$.*)?");
+
   /**
    * Caches the byte code for {@link JavaScriptHost}.
    */
@@ -376,10 +382,28 @@
       Class<?> emmaBridge = Class.forName(EmmaStrategy.EMMA_RT_CLASSNAME,
           false, Thread.currentThread().getContextClassLoader());
       BRIDGE_CLASS_NAMES.put(EmmaStrategy.EMMA_RT_CLASSNAME, emmaBridge);
-      emmaIsAvailable = true;
+      emmaAvailable = true;
     } catch (ClassNotFoundException ignored) {
     }
-    emmaStrategy = EmmaStrategy.get(emmaIsAvailable);
+    emmaStrategy = EmmaStrategy.get(emmaAvailable);
+  }
+
+  /**
+   * Checks if the class names is generated. Accepts any classes whose names
+   * match .+$\d+($.*)? (handling named classes within anonymous classes).
+   * Checks if the class or any of its enclosing classes are anonymous or
+   * synthetic.
+   * <p>
+   * If new compilers have different conventions for anonymous and synthetic
+   * classes, this code needs to be updated.
+   * </p>
+   * 
+   * @param className name of the class to be checked.
+   * @return true iff class or any of its enclosing classes are anonymous or
+   *         synthetic.
+   */
+  public static boolean isClassnameGenerated(String className) {
+    return GENERATED_CLASSNAME_PATTERN.matcher(className).matches();
   }
 
   private static void classDump(String name, byte[] bytes) {
@@ -456,6 +480,11 @@
     }
   }
 
+  /**
+   * The set of units whose JSNI has already been injected.
+   */
+  private Set<CompilationUnit> alreadyInjected = new HashSet<CompilationUnit>();
+
   private final HostedModeClassRewriter classRewriter;
 
   private CompilationState compilationState;
@@ -464,10 +493,20 @@
 
   private Class<?> gwtClass, javaScriptHostClass;
 
+  /**
+   * Used by {@link #findClass(String)} to prevent reentrant JSNI injection.
+   */
+  private boolean isInjectingClass = false;
+
   private final TreeLogger logger;
 
   private ShellJavaScriptHost shellJavaScriptHost;
 
+  /**
+   * Used by {@link #findClass(String)} to prevent reentrant JSNI injection.
+   */
+  private Stack<CompilationUnit> toInject = new Stack<CompilationUnit>();
+
   private final TypeOracle typeOracle;
 
   @SuppressWarnings("unchecked")
@@ -478,16 +517,6 @@
   private final Map<Integer, Object> weakJsoCache = new ReferenceMap(
       AbstractReferenceMap.HARD, AbstractReferenceMap.WEAK);
 
-  /**
-   * Used by {@link #findClass(String)} to prevent reentrant JSNI injection.
-   */
-  private boolean isInjectingClass = false;
-
-  /**
-   * Used by {@link #findClass(String)} to prevent reentrant JSNI injection.
-   */
-  private Stack<CompiledClass> toInject = new Stack<CompiledClass>();
-
   public CompilingClassLoader(TreeLogger logger,
       CompilationState compilationState, ShellJavaScriptHost javaScriptHost)
       throws UnableToCompleteException {
@@ -568,8 +597,8 @@
    * was previously cached and has not been garbage collected.
    * 
    * @param javaObject the Object being wrapped
-   * @return the mapped wrapper, or <code>null</code> if the Java object mapped
-   *         or if the wrapper has been garbage collected
+   * @return the mapped wrapper, or <code>null</code> if the Java object
+   *         mapped or if the wrapper has been garbage collected
    */
   public Object getWrapperForObject(Object javaObject) {
     return weakJavaWrapperCache.get(javaObject);
@@ -604,13 +633,6 @@
           new NullPointerException());
     }
 
-    // Don't mess with anything in the standard Java packages.
-    //
-    if (isInStandardJavaPackage(className)) {
-      // make my superclass load it
-      throw new ClassNotFoundException(className);
-    }
-
     // Check for a bridge class that spans hosted and user space.
     if (BRIDGE_CLASS_NAMES.containsKey(className)) {
       return BRIDGE_CLASS_NAMES.get(className);
@@ -650,10 +672,9 @@
      * class is loaded.
      */
     if (!classRewriter.isJsoIntf(className)) {
-      CompiledClass compiledClass = compilationState.getClassFileMap().get(
-          canonicalizeClassName(className));
-      if (compiledClass != null) {
-        toInject.push(compiledClass);
+      CompilationUnit unit = getUnitForClassName(className);
+      if (unit != null) {
+        toInject.push(unit);
       }
     }
 
@@ -664,7 +685,11 @@
          * additional entries to be added.
          */
         while (toInject.size() > 0) {
-          injectJsniFor(toInject.remove(0));
+          CompilationUnit unit = toInject.remove(0);
+          if (!alreadyInjected.contains(unit)) {
+            injectJsniMethods(unit);
+            alreadyInjected.add(unit);
+          }
         }
       } finally {
         isInjectingClass = false;
@@ -718,41 +743,71 @@
     CompiledClass compiledClass = compilationState.getClassFileMap().get(
         lookupClassName);
 
+    CompilationUnit unit = (compiledClass == null)
+        ? getUnitForClassName(className) : compiledClass.getUnit();
+    if (emmaAvailable) {
+      /*
+       * build the map for anonymous classes. Do so only if unit has anonymous
+       * classes, jsni methods, is not super-source and the map has not been
+       * built before.
+       */
+      List<JsniMethod> jsniMethods = (unit == null) ? null
+          : unit.getJsniMethods();
+      if (unit != null && !unit.isSuperSource() && unit.hasAnonymousClasses()
+          && jsniMethods != null && jsniMethods.size() > 0
+          && !unit.createdClassMapping()) {
+        String mainLookupClassName = unit.getTypeName().replace('.', '/');
+        byte mainClassBytes[] = emmaStrategy.getEmmaClassBytes(null,
+            mainLookupClassName, 0);
+        if (mainClassBytes != null) {
+          if (!unit.constructAnonymousClassMappings(mainClassBytes)) {
+            logger.log(TreeLogger.ERROR,
+                "Our heuristic for mapping anonymous classes between compilers "
+                    + "failed. Unsafe to continue because the wrong jsni code "
+                    + "could end up running. className = " + className);
+            return null;
+          }
+        } else {
+          logger.log(TreeLogger.ERROR, "main class bytes is null for unit = "
+              + unit + ", mainLookupClassName = " + mainLookupClassName);
+        }
+      }
+    }
+
     byte classBytes[] = null;
     if (compiledClass != null) {
       classBytes = compiledClass.getBytes();
       if (!compiledClass.getUnit().isSuperSource()) {
-        /*
-         * It is okay if Emma throws away the old classBytes since the actual
-         * jsni injection happens in the rewriter. The injectJsniFor method
-         * above simply defines the native methods in the browser.
-         */
         classBytes = emmaStrategy.getEmmaClassBytes(classBytes,
             lookupClassName, compiledClass.getUnit().getLastModified());
       } else {
         logger.log(TreeLogger.SPAM, "no emma instrumentation for "
             + lookupClassName + " because it is from super-source");
       }
-    } else if (emmaIsAvailable) {
+    } else if (emmaAvailable) {
       /*
        * TypeOracle does not know about this class. Most probably, this class
        * was referenced in one of the classes loaded from disk. Check if we can
        * find it on disk. Typically this is a synthetic class added by the
-       * compiler. If the synthetic class contains native methods, it will fail
-       * later.
+       * compiler.
        */
-      if (isSynthetic(className)) {
+      if (shouldLoadClassFromDisk(className)) {
         /*
          * modification time = 0 ensures that whatever is on the disk is always
          * loaded.
          */
-        logger.log(TreeLogger.SPAM, "EmmaStrategy: loading " + lookupClassName
+        logger.log(TreeLogger.DEBUG, "EmmaStrategy: loading " + lookupClassName
             + " from disk even though TypeOracle does not know about it");
         classBytes = emmaStrategy.getEmmaClassBytes(null, lookupClassName, 0);
       }
     }
     if (classBytes != null && classRewriter != null) {
-      byte[] newBytes = classRewriter.rewrite(className, classBytes);
+      Map<String, String> anonymousClassMap = Collections.emptyMap();
+      if (unit != null) {
+        anonymousClassMap = unit.getAnonymousClassMap();
+      }
+      byte[] newBytes = classRewriter.rewrite(className, classBytes,
+          anonymousClassMap);
       if (CLASS_DUMP) {
         if (!Arrays.equals(classBytes, newBytes)) {
           classDump(className, newBytes);
@@ -769,49 +824,36 @@
     return name;
   }
 
-  private void injectJsniFor(CompiledClass compiledClass) {
-    shellJavaScriptHost.createNativeMethods(logger, compiledClass,
-        compiledClass.getJsniMethods(), this);
-  }
-
   /**
-   * NOTE: This logic is also used in SerializableTypeOracleBuilder; don't
-   * change this one without changing the other.
-   */
-  private boolean isInStandardJavaPackage(String className) {
-    if (className.startsWith("java.")) {
-      return true;
-    }
-
-    if (className.startsWith("javax.")) {
-      return true;
-    }
-
-    return false;
-  }
-
-  /**
-   * For safety, we only allow synthetic classes to be loaded this way. Accepts
-   * any classes whose names match .+$\d+
+   * Returns the compilationUnit corresponding to the className.
    * <p>
-   * If new compilers have different conventions for synthetic classes, this
-   * code needs to be updated.
-   * </p>
-   * 
-   * @param className class to be loaded from disk.
-   * @return true iff class should be loaded from disk
+   * Not considering classnames where a $ sign appears.
    */
-  private boolean isSynthetic(String className) {
-    int index = className.lastIndexOf("$");
-    if (index <= 0 || index == className.length() - 1) {
-      return false;
+  private CompilationUnit getUnitForClassName(String className) {
+    String mainTypeName = className;
+    int index = mainTypeName.length();
+    CompilationUnit unit = null;
+    while (unit == null && index != -1) {
+      mainTypeName = mainTypeName.substring(0, index);
+      unit = compilationState.getCompilationUnitMap().get(mainTypeName);
+      index = mainTypeName.lastIndexOf('$');
     }
-    for (int i = index + 1; i < className.length(); i++) {
-      if (!Character.isDigit(className.charAt(i))) {
-        return false;
-      }
+    return unit;
+  }
+
+  private void injectJsniMethods(CompilationUnit unit) {
+    if (unit == null || unit.getJsniMethods() == null) {
+      return;
     }
-    return true;
+    shellJavaScriptHost.createNativeMethods(logger, unit.getJsniMethods(), this);
+  }
+
+  private boolean isBaseClassInGwt(String className) {
+    return getUnitForClassName(className) != null;
+  }
+
+  private boolean shouldLoadClassFromDisk(String className) {
+    return isBaseClassInGwt(className) && isClassnameGenerated(className);
   }
 
   /**
diff --git a/dev/core/src/com/google/gwt/dev/shell/ShellJavaScriptHost.java b/dev/core/src/com/google/gwt/dev/shell/ShellJavaScriptHost.java
index f6fb3ff..967de58 100644
--- a/dev/core/src/com/google/gwt/dev/shell/ShellJavaScriptHost.java
+++ b/dev/core/src/com/google/gwt/dev/shell/ShellJavaScriptHost.java
@@ -17,7 +17,6 @@
 
 import com.google.gwt.core.ext.TreeLogger;
 import com.google.gwt.core.ext.UnableToCompleteException;
-import com.google.gwt.dev.javac.CompiledClass;
 import com.google.gwt.dev.javac.JsniMethod;
 
 import java.util.List;
@@ -42,8 +41,8 @@
    * @param jsniMethods
    * @param dispatchIdOracle
    */
-  void createNativeMethods(TreeLogger logger, CompiledClass compiledClass,
-      List<JsniMethod> jsniMethods, DispatchIdOracle dispatchIdOracle);
+  void createNativeMethods(TreeLogger logger, List<JsniMethod> jsniMethods,
+      DispatchIdOracle dispatchIdOracle);
 
   /**
    * Call this when a JavaScript exception is caught.
diff --git a/dev/core/src/com/google/gwt/dev/shell/rewrite/HostedModeClassRewriter.java b/dev/core/src/com/google/gwt/dev/shell/rewrite/HostedModeClassRewriter.java
index 418429b..393c364 100644
--- a/dev/core/src/com/google/gwt/dev/shell/rewrite/HostedModeClassRewriter.java
+++ b/dev/core/src/com/google/gwt/dev/shell/rewrite/HostedModeClassRewriter.java
@@ -33,15 +33,15 @@
  * <ol>
  * <li>Rewrites all native methods into non-native thunks to call JSNI via
  * {@link com.google.gwt.dev.shell.JavaScriptHost}.</li>
- * <li>Rewrites all JSO types into an interface type (which retains the
- * original name) and an implementation type (which has a $ appended).</li>
- * <li>All JSO interface types are empty and mirror the original type
- * hierarchy.</li>
- * <li>All JSO impl types contain the guts of the original type, except that
- * all instance methods are reimplemented as statics.</li>
- * <li>Calls sites to JSO types rewritten to dispatch to impl types. Any
- * virtual calls are also made static. Static field references to JSO types
- * reference static fields in the the impl class.</li>
+ * <li>Rewrites all JSO types into an interface type (which retains the original
+ * name) and an implementation type (which has a $ appended).</li>
+ * <li>All JSO interface types are empty and mirror the original type hierarchy.
+ * </li>
+ * <li>All JSO impl types contain the guts of the original type, except that all
+ * instance methods are reimplemented as statics.</li>
+ * <li>Calls sites to JSO types rewritten to dispatch to impl types. Any virtual
+ * calls are also made static. Static field references to JSO types reference
+ * static fields in the the impl class.</li>
  * <li>JavaScriptObject$ implements all the interface types and is the only
  * instantiable type.</li>
  * </ol>
@@ -167,8 +167,11 @@
    * 
    * @param className the name of the class
    * @param classBytes the bytes of the class
+   * @param anonymousClassMap a map between the anonymous class names of java
+   *          compiler used to compile code and jdt. Emma-specific.
    */
-  public byte[] rewrite(String className, byte[] classBytes) {
+  public byte[] rewrite(String className, byte[] classBytes,
+      Map<String, String> anonymousClassMap) {
     String desc = toDescriptor(className);
     assert (!jsoIntfDescs.contains(desc));
 
@@ -185,7 +188,7 @@
       v = new WriteJsoImpl(v, jsoIntfDescs, mapper);
     }
 
-    v = new RewriteJsniMethods(v);
+    v = new RewriteJsniMethods(v, anonymousClassMap);
 
     if (Double.parseDouble(System.getProperty("java.class.version")) < Opcodes.V1_6) {
       v = new ForceClassVersion15(v);
diff --git a/dev/core/src/com/google/gwt/dev/shell/rewrite/RewriteJsniMethods.java b/dev/core/src/com/google/gwt/dev/shell/rewrite/RewriteJsniMethods.java
index a00ce8d..31de8ff 100644
--- a/dev/core/src/com/google/gwt/dev/shell/rewrite/RewriteJsniMethods.java
+++ b/dev/core/src/com/google/gwt/dev/shell/rewrite/RewriteJsniMethods.java
@@ -25,6 +25,7 @@
 import com.google.gwt.dev.shell.JavaScriptHost;
 
 import java.lang.reflect.Modifier;
+import java.util.Map;
 
 /**
  * Turns native method declarations into normal Java functions which perform the
@@ -224,9 +225,8 @@
 
     /**
      * Does all of the work necessary to do the dispatch to the appropriate
-     * variant of
-     * {@link JavaScriptHost#invokeNativeVoid JavaScriptHost.invokeNative*}.
-     * And example output:
+     * variant of {@link JavaScriptHost#invokeNativeVoid
+     * JavaScriptHost.invokeNative*}. And example output:
      * 
      * <pre>
      * return JavaScriptHost.invokeNativeInt(
@@ -238,8 +238,8 @@
       super.visitCode();
 
       /*
-       * If you modify the generated code, you must recompute the stack size
-       * in visitEnd(). 
+       * If you modify the generated code, you must recompute the stack size in
+       * visitEnd().
        */
 
       // First argument - JSNI signature
@@ -322,9 +322,12 @@
    * The name of the class we're operating on.
    */
   private String classDesc;
+  private Map<String, String> anonymousClassMap;
 
-  public RewriteJsniMethods(ClassVisitor v) {
+  public RewriteJsniMethods(ClassVisitor v,
+      Map<String, String> anonymousClassMap) {
     super(v);
+    this.anonymousClassMap = anonymousClassMap;
   }
 
   @Override
@@ -356,8 +359,8 @@
    * 
    * @param name the name of the method; for example {@code "echo"}
    * @param descriptor the descriptor for the method; for example {@code "(I)I"}
-   * @return the JSNI signature for the method; for example,
-   *         {@code "@com.google.gwt.sample.hello.client.Hello::echo(I)"}
+   * @return the JSNI signature for the method; for example, {@code
+   *         "@com.google.gwt.sample.hello.client.Hello::echo(I)"}
    */
   private String getJsniSignature(String name, String descriptor) {
     int argsIndexBegin = descriptor.indexOf('(');
@@ -367,6 +370,11 @@
         + descriptor;
     String argsDescriptor = descriptor.substring(argsIndexBegin,
         argsIndexEnd + 1);
-    return "@" + classDesc.replace('/', '.') + "::" + name + argsDescriptor;
+    String classDescriptor = classDesc.replace('/', '.');
+    String newDescriptor = anonymousClassMap.get(classDesc);
+    if (newDescriptor != null) {
+      classDescriptor = newDescriptor.replace('/', '.');
+    }
+    return "@" + classDescriptor + "::" + name + argsDescriptor;
   }
 }
diff --git a/dev/core/src/com/google/gwt/dev/util/Util.java b/dev/core/src/com/google/gwt/dev/util/Util.java
index 6de59ba..feabaf3 100644
--- a/dev/core/src/com/google/gwt/dev/util/Util.java
+++ b/dev/core/src/com/google/gwt/dev/util/Util.java
@@ -729,6 +729,18 @@
     return null;
   }
 
+  /**
+   * @return null if the file could not be read
+   */
+  public static String readURLAsString(URL url) {
+    byte[] bytes = readURLAsBytes(url);
+    if (bytes != null) {
+      return toString(bytes, DEFAULT_ENCODING);
+    }
+
+    return null;
+  }
+
   public static byte[] readURLConnectionAsBytes(URLConnection connection) {
     // ENH: add a weak cache that has an additional check against the file date
     InputStream input = null;
diff --git a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerModuleName.java b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerModuleName.java
index 4b010ed..0f29740 100644
--- a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerModuleName.java
+++ b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerModuleName.java
@@ -18,9 +18,9 @@
 import com.google.gwt.util.tools.ArgHandlerExtra;
 
 /**
- * Argument handler for module name, which has no option profix.
+ * Argument handler for one or more module names at the end of the command line.
  */
-public final class ArgHandlerModuleName extends ArgHandlerExtra {
+public class ArgHandlerModuleName extends ArgHandlerExtra {
 
   private final OptionModuleName option;
 
@@ -36,12 +36,12 @@
 
   @Override
   public String getPurpose() {
-    return "Specifies the name of the module to compile";
+    return "Specifies the name(s) of the module(s)";
   }
 
   @Override
   public String[] getTagArgs() {
-    return new String[] {"module"};
+    return new String[] {"module[s]"};
   }
 
   @Override
diff --git a/dev/core/src/com/google/gwt/util/tools/Utility.java b/dev/core/src/com/google/gwt/util/tools/Utility.java
index 7d89854..ed1d59c 100644
--- a/dev/core/src/com/google/gwt/util/tools/Utility.java
+++ b/dev/core/src/com/google/gwt/util/tools/Utility.java
@@ -225,10 +225,7 @@
         throw new FileNotFoundException(partialPath);
       }
       ByteArrayOutputStream os = new ByteArrayOutputStream();
-      int ch;
-      while ((ch = in.read()) != -1) {
-        os.write(ch);
-      }
+      streamOut(in, os, 1024);
       return new String(os.toByteArray(), "UTF-8");
     } finally {
       close(in);
diff --git a/dev/core/test/com/google/gwt/dev/javac/GeneratedClassnameComparatorTest.java b/dev/core/test/com/google/gwt/dev/javac/GeneratedClassnameComparatorTest.java
new file mode 100644
index 0000000..630d438
--- /dev/null
+++ b/dev/core/test/com/google/gwt/dev/javac/GeneratedClassnameComparatorTest.java
@@ -0,0 +1,49 @@
+package com.google.gwt.dev.javac;
+
+import junit.framework.TestCase;
+
+import java.util.Arrays;
+
+/**
+ * 
+ * This class tests to see if the anonymous class names are sorted in the right
+ * order. For example, Foo$10 should be after Foo$2.
+ */
+public class GeneratedClassnameComparatorTest extends TestCase {
+
+  public void testBasicOrder() {
+    int max = 15;
+    String original[] = new String[max];
+    String expected[] = new String[max];
+    for (int i = 0; i < max; i++) {
+      String name = "Foo$" + (i + 1);
+      original[i] = name;
+      expected[i] = name;
+    }
+    Arrays.sort(original, new GeneratedClassnameComparator());
+    for (int i = 0; i < max; i++) {
+      assertEquals("index = " + i, expected[i], original[i]);
+    }
+  }
+
+  public void testHierarchicalOrder() {
+    String original[] = {
+        "Foo$1", "Foo$1$1$1", "Foo$1$2", "Foo$2", "Foo$2$1", "Foo$3",};
+    String expected[] = {
+        "Foo$1", "Foo$2", "Foo$3", "Foo$1$2", "Foo$2$1", "Foo$1$1$1"};
+    Arrays.sort(original, new GeneratedClassnameComparator());
+    for (int i = 0; i < original.length; i++) {
+      assertEquals("index = " + i, expected[i], original[i]);
+    }
+  }
+
+  public void testMixedNames() {
+    String original[] = {"Foo", "Foo$1", "Foo$1xyz", "Foo$2", "Foo$xyz"};
+    String expected[] = {"Foo", "Foo$1", "Foo$2", "Foo$1xyz", "Foo$xyz"};
+    Arrays.sort(original, new GeneratedClassnameComparator());
+    for (int i = 0; i < original.length; i++) {
+      assertEquals("index = " + i, expected[i], original[i]);
+    }
+  }
+
+}
diff --git a/dev/core/test/com/google/gwt/dev/shell/GeneratedClassnameTest.java b/dev/core/test/com/google/gwt/dev/shell/GeneratedClassnameTest.java
new file mode 100644
index 0000000..b5040c1
--- /dev/null
+++ b/dev/core/test/com/google/gwt/dev/shell/GeneratedClassnameTest.java
@@ -0,0 +1,27 @@
+package com.google.gwt.dev.shell;
+
+import junit.framework.TestCase;
+
+public class GeneratedClassnameTest extends TestCase {
+
+  /**
+   * Test if {@link CompilingClassLoader#isClassnameGenerated(String)} works
+   * correctly.
+   */
+  public void testGeneratedClassnames() {
+    String namesToAccept[] = {
+        "Test$1", "Test$10", "Test$Foo$1", "Test$1$Foo", "Test$10$Foo",
+        "$$345", "Test$1$Foo$"};
+    String namesToReject[] = {"Test1", "$345", "Test$2Foo", "Test$Foo$1Bar"};
+
+    for (String name : namesToAccept) {
+      assertTrue("className = " + name + " should have been accepted",
+          CompilingClassLoader.isClassnameGenerated(name));
+    }
+
+    for (String name : namesToReject) {
+      assertFalse("className = " + name + " should not have been accepted",
+          CompilingClassLoader.isClassnameGenerated(name));
+    }
+  }
+}
diff --git a/dev/linux/src/com/google/gwt/dev/shell/moz/ModuleSpaceMoz.java b/dev/linux/src/com/google/gwt/dev/shell/moz/ModuleSpaceMoz.java
index 59a650c..907055d 100644
--- a/dev/linux/src/com/google/gwt/dev/shell/moz/ModuleSpaceMoz.java
+++ b/dev/linux/src/com/google/gwt/dev/shell/moz/ModuleSpaceMoz.java
@@ -16,7 +16,6 @@
 package com.google.gwt.dev.shell.moz;
 
 import com.google.gwt.core.ext.TreeLogger;
-import com.google.gwt.dev.javac.CompiledClass;
 import com.google.gwt.dev.javac.JsniMethod;
 import com.google.gwt.dev.shell.CompilingClassLoader;
 import com.google.gwt.dev.shell.DispatchIdOracle;
@@ -56,8 +55,7 @@
    * @param jsniMethods
    */
   public void createNativeMethods(TreeLogger logger,
-      CompiledClass compiledClass, List<JsniMethod> jsniMethods,
-      DispatchIdOracle dispatchIdOracle) {
+      List<JsniMethod> jsniMethods, DispatchIdOracle dispatchIdOracle) {
     for (JsniMethod jsniMethod : jsniMethods) {
       String body = Jsni.getJavaScriptForHostedMode(logger, dispatchIdOracle,
           jsniMethod);
diff --git a/dev/mac/src/com/google/gwt/dev/shell/mac/ModuleSpaceSaf.java b/dev/mac/src/com/google/gwt/dev/shell/mac/ModuleSpaceSaf.java
index a7bb9c0..a98f5a0 100644
--- a/dev/mac/src/com/google/gwt/dev/shell/mac/ModuleSpaceSaf.java
+++ b/dev/mac/src/com/google/gwt/dev/shell/mac/ModuleSpaceSaf.java
@@ -16,7 +16,6 @@
 package com.google.gwt.dev.shell.mac;
 
 import com.google.gwt.core.ext.TreeLogger;
-import com.google.gwt.dev.javac.CompiledClass;
 import com.google.gwt.dev.javac.JsniMethod;
 import com.google.gwt.dev.shell.CompilingClassLoader;
 import com.google.gwt.dev.shell.DispatchIdOracle;
@@ -56,8 +55,7 @@
   }
 
   public void createNativeMethods(TreeLogger logger,
-      CompiledClass compiledClass, List<JsniMethod> jsniMethods,
-      DispatchIdOracle dispatchIdOracle) {
+      List<JsniMethod> jsniMethods, DispatchIdOracle dispatchIdOracle) {
     for (JsniMethod jsniMethod : jsniMethods) {
       String body = Jsni.getJavaScriptForHostedMode(logger, dispatchIdOracle,
           jsniMethod);
@@ -65,8 +63,8 @@
         // The error has been logged; just ignore it for now.
         continue;
       }
-      createNative(jsniMethod.location(),
-          jsniMethod.line(), jsniMethod.name(), jsniMethod.paramNames(), body);
+      createNative(jsniMethod.location(), jsniMethod.line(), jsniMethod.name(),
+          jsniMethod.paramNames(), body);
     }
   }
 
@@ -105,7 +103,7 @@
     int argc = args.length;
     int[] argv = new int[argc];
     // GC protect passed arguments on the Java stack for call duration.
-    JsValueSaf[] jsValueArgs = new JsValueSaf[argc]; 
+    JsValueSaf[] jsValueArgs = new JsValueSaf[argc];
     for (int i = 0; i < argc; ++i) {
       JsValueSaf jsValue = jsValueArgs[i] = new JsValueSaf();
       JsValueGlue.set(jsValue, isolatedClassLoader, types[i], args[i]);
diff --git a/dev/oophm/src/com/google/gwt/dev/shell/ModuleSpaceOOPHM.java b/dev/oophm/src/com/google/gwt/dev/shell/ModuleSpaceOOPHM.java
index c9a93b1..5250efa 100644
--- a/dev/oophm/src/com/google/gwt/dev/shell/ModuleSpaceOOPHM.java
+++ b/dev/oophm/src/com/google/gwt/dev/shell/ModuleSpaceOOPHM.java
@@ -16,7 +16,6 @@
 package com.google.gwt.dev.shell;
 
 import com.google.gwt.core.ext.TreeLogger;
-import com.google.gwt.dev.javac.CompiledClass;
 import com.google.gwt.dev.javac.JsniMethod;
 import com.google.gwt.dev.shell.JsValue.DispatchObject;
 import com.google.gwt.dev.util.Jsni;
@@ -39,13 +38,11 @@
   }
 
   public void createNativeMethods(TreeLogger logger,
-      CompiledClass compiledClass, List<JsniMethod> jsniMethods,
-      DispatchIdOracle dispatchIdOracle) {
+      List<JsniMethod> jsniMethods, DispatchIdOracle dispatchIdOracle) {
     if (jsniMethods.isEmpty()) {
       return;
     }
     StringBuilder jsni = new StringBuilder();
-    String sourceName = compiledClass.getSourceName();
     for (JsniMethod jsniMethod : jsniMethods) {
       String body = Jsni.getJavaScriptForHostedMode(logger, dispatchIdOracle,
           jsniMethod);
@@ -67,11 +64,10 @@
       jsni.append(body);
       jsni.append(";\n\n");
     }
-    logger.log(TreeLogger.DEBUG, "Defining JSNI for " + sourceName);
     channel.loadJsni(jsni.toString());
   }
 
-//  @Override
+  // @Override
   protected void cleanupJsValues() {
     Set<Integer> refIdsForCleanup = channel.getRefIdsForCleanup();
     if (refIdsForCleanup.isEmpty()) {
@@ -87,12 +83,11 @@
   }
 
   /**
-   *
+   * 
    */
   @Override
   protected void createStaticDispatcher(TreeLogger logger) {
-    channel.loadJsni(
-        "function __defineStatic(__arg0) { window.__static = __arg0; }");
+    channel.loadJsni("function __defineStatic(__arg0) { window.__static = __arg0; }");
   }
 
   /**
diff --git a/dev/windows/src/com/google/gwt/dev/shell/ie/ModuleSpaceIE6.java b/dev/windows/src/com/google/gwt/dev/shell/ie/ModuleSpaceIE6.java
index 09413fb..9e91cef 100644
--- a/dev/windows/src/com/google/gwt/dev/shell/ie/ModuleSpaceIE6.java
+++ b/dev/windows/src/com/google/gwt/dev/shell/ie/ModuleSpaceIE6.java
@@ -16,7 +16,6 @@
 package com.google.gwt.dev.shell.ie;
 
 import com.google.gwt.core.ext.TreeLogger;
-import com.google.gwt.dev.javac.CompiledClass;
 import com.google.gwt.dev.javac.JsniMethod;
 import com.google.gwt.dev.shell.CompilingClassLoader;
 import com.google.gwt.dev.shell.DispatchIdOracle;
@@ -99,8 +98,7 @@
   }
 
   public void createNativeMethods(TreeLogger logger,
-      CompiledClass compiledClass, List<JsniMethod> jsniMethods,
-      DispatchIdOracle dispatchIdOracle) {
+      List<JsniMethod> jsniMethods, DispatchIdOracle dispatchIdOracle) {
     for (JsniMethod jsniMethod : jsniMethods) {
       String body = Jsni.getJavaScriptForHostedMode(logger, dispatchIdOracle,
           jsniMethod);
@@ -108,8 +106,8 @@
         // The error has been logged; just ignore it for now.
         continue;
       }
-      createNative(jsniMethod.location(),
-          jsniMethod.line(), jsniMethod.name(), jsniMethod.paramNames(), body);
+      createNative(jsniMethod.location(), jsniMethod.line(), jsniMethod.name(),
+          jsniMethod.paramNames(), body);
     }
   }
 
diff --git a/distro-source/linux/build.xml b/distro-source/linux/build.xml
index d4fb171..5fde893 100755
--- a/distro-source/linux/build.xml
+++ b/distro-source/linux/build.xml
@@ -49,13 +49,10 @@
         <include name="samples" />
         <include name="samples/*" />
         <include name="samples/*/src/**" />
-        <include name="samples/*/bin/**" />
-        <include name="samples/*/www/**" />
-        <exclude name="samples/*/www/.*/**" />
+        <include name="samples/*/war/**" />
       </tarfileset>
       <tarfileset dir="${gwt.build.out}/samples-scripts/${dist.platform}" mode="755" prefix="${project.distname}/samples">
-        <include name="*/*-compile" />
-        <include name="*/*-shell" />
+        <include name="*/*" />
       </tarfileset>
 
       <includetar src="${gwt.tools.redist}/mozilla/mozilla-1.7.12.tar.gz" compression="gzip" prefix="${project.distname}" />
diff --git a/distro-source/mac/build.xml b/distro-source/mac/build.xml
index ca97f73..4114eb6 100755
--- a/distro-source/mac/build.xml
+++ b/distro-source/mac/build.xml
@@ -51,13 +51,10 @@
         <include name="samples" />
         <include name="samples/*" />
         <include name="samples/*/src/**" />
-        <include name="samples/*/bin/**" />
-        <include name="samples/*/www/**" />
-        <exclude name="samples/*/www/.*/**" />
+        <include name="samples/*/war/**" />
       </tarfileset>
       <tarfileset dir="${gwt.build.out}/samples-scripts/${dist.platform}" mode="755" prefix="${project.distname}/samples">
-        <include name="*/*-compile" />
-        <include name="*/*-shell" />
+        <include name="*/*" />
       </tarfileset>
     </gwt.tgz.cat>
 
diff --git a/distro-source/windows/build.xml b/distro-source/windows/build.xml
index 0749c6a..6110f07 100755
--- a/distro-source/windows/build.xml
+++ b/distro-source/windows/build.xml
@@ -39,13 +39,10 @@
         <include name="samples" />
         <include name="samples/*" />
         <include name="samples/*/src/**" />
-        <include name="samples/*/bin/**" />
-        <include name="samples/*/www/**" />
-        <exclude name="samples/*/www/.*/**" />
+        <include name="samples/*/war/**" />
       </zipfileset>
       <zipfileset dir="${gwt.build.out}/samples-scripts/${dist.platform}" prefix="${project.distname}/samples">
-        <include name="*/*-compile.cmd" />
-        <include name="*/*-shell.cmd" />
+        <include name="*/*" />
       </zipfileset>
     </zip>
 
diff --git a/eclipse/samples/DynaTable/.classpath b/eclipse/samples/DynaTable/.classpath
index 8996e78..26f2949 100644
--- a/eclipse/samples/DynaTable/.classpath
+++ b/eclipse/samples/DynaTable/.classpath
@@ -1,7 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
 	<classpathentry kind="src" path="core/src"/>
+	<classpathentry kind="src" output="war" path="core/war"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/gwt-user"/>
-	<classpathentry kind="output" path="bin"/>
+	<classpathentry kind="output" path="war/WEB-INF/classes"/>
 </classpath>
diff --git a/eclipse/samples/DynaTable/.project b/eclipse/samples/DynaTable/.project
index cfe0e91..ff0de95 100644
--- a/eclipse/samples/DynaTable/.project
+++ b/eclipse/samples/DynaTable/.project
@@ -24,7 +24,7 @@
 		<link>
 			<name>core</name>
 			<type>2</type>
-			<location>GWT_ROOT/samples/dynatable</location>
+			<locationURI>GWT_ROOT/samples/dynatable</locationURI>
 		</link>
 	</linkedResources>
 </projectDescription>
diff --git a/eclipse/samples/DynaTable/DynaTable-gwtc.launch b/eclipse/samples/DynaTable/DynaTable-gwtc.launch
new file mode 100644
index 0000000..5284dbf
--- /dev/null
+++ b/eclipse/samples/DynaTable/DynaTable-gwtc.launch
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication">
+<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
+<listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.eclipse.jdt.launching.JRE_CONTAINER&quot; javaProject=&quot;DynaTable&quot; path=&quot;1&quot; type=&quot;4&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/DynaTable/core/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/gwt-user/core/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/gwt-user/core/super&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/gwt-dev-windows/core/super&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry id=&quot;org.eclipse.jdt.launching.classpathentry.defaultClasspath&quot;&gt;&#10;&lt;memento exportedEntriesOnly=&quot;false&quot; project=&quot;DynaTable&quot;/&gt;&#10;&lt;/runtimeClasspathEntry&gt;&#10;"/>
+</listAttribute>
+<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="false"/>
+<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.google.gwt.dev.Compiler"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="com.google.gwt.sample.dynatable.DynaTable"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="DynaTable"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-ea&#13;&#10;-Xmx256M&#13;&#10;-Dgwt.devjar=${gwt_devjar}"/>
+</launchConfiguration>
diff --git a/eclipse/samples/DynaTable/DynaTable.launch b/eclipse/samples/DynaTable/DynaTable.launch
new file mode 100644
index 0000000..6c971f5
--- /dev/null
+++ b/eclipse/samples/DynaTable/DynaTable.launch
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication">
+<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
+<listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.eclipse.jdt.launching.JRE_CONTAINER&quot; javaProject=&quot;DynaTable&quot; path=&quot;1&quot; type=&quot;4&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/DynaTable/core/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/gwt-user/core/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/gwt-user/core/super&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/gwt-dev-windows/core/super&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry id=&quot;org.eclipse.jdt.launching.classpathentry.defaultClasspath&quot;&gt;&#10;&lt;memento exportedEntriesOnly=&quot;false&quot; project=&quot;DynaTable&quot;/&gt;&#10;&lt;/runtimeClasspathEntry&gt;&#10;"/>
+</listAttribute>
+<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="false"/>
+<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.google.gwt.dev.HostedMode"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-startupUrl DynaTable.html&#13;&#10;com.google.gwt.sample.dynatable.DynaTable"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="DynaTable"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-ea&#13;&#10;-Xmx256M&#13;&#10;-Dgwt.devjar=${gwt_devjar}"/>
+</launchConfiguration>
diff --git a/eclipse/samples/DynaTable2/DynaTable2 hosted.launch b/eclipse/samples/DynaTable2/DynaTable2 hosted.launch
index 4231f27..21d67c1 100644
--- a/eclipse/samples/DynaTable2/DynaTable2 hosted.launch
+++ b/eclipse/samples/DynaTable2/DynaTable2 hosted.launch
@@ -1,10 +1,10 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication">
 <listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
-<listEntry value="/gwt-dev-windows/core/src/com/google/gwt/dev/HostedMode.java"/>
+<listEntry value="/DynaTable2"/>
 </listAttribute>
 <listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
-<listEntry value="1"/>
+<listEntry value="4"/>
 </listAttribute>
 <booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
 <listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
diff --git a/eclipse/samples/Hello/.classpath b/eclipse/samples/Hello/.classpath
index 8996e78..26f2949 100644
--- a/eclipse/samples/Hello/.classpath
+++ b/eclipse/samples/Hello/.classpath
@@ -1,7 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
 	<classpathentry kind="src" path="core/src"/>
+	<classpathentry kind="src" output="war" path="core/war"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/gwt-user"/>
-	<classpathentry kind="output" path="bin"/>
+	<classpathentry kind="output" path="war/WEB-INF/classes"/>
 </classpath>
diff --git a/eclipse/samples/Hello/.project b/eclipse/samples/Hello/.project
index 7e40312..45a8900 100644
--- a/eclipse/samples/Hello/.project
+++ b/eclipse/samples/Hello/.project
@@ -24,7 +24,7 @@
 		<link>
 			<name>core</name>
 			<type>2</type>
-			<location>GWT_ROOT/samples/hello</location>
+			<locationURI>GWT_ROOT/samples/hello</locationURI>
 		</link>
 	</linkedResources>
 </projectDescription>
diff --git a/eclipse/samples/Hello/Hello compile.launch b/eclipse/samples/Hello/Hello compile.launch
deleted file mode 100644
index 84a3a68..0000000
--- a/eclipse/samples/Hello/Hello compile.launch
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication">
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
-<listEntry value="/Hello"/>
-</listAttribute>
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
-<listEntry value="4"/>
-</listAttribute>
-<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
-<listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
-<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.eclipse.jdt.launching.JRE_CONTAINER&quot; javaProject=&quot;Hello&quot; path=&quot;1&quot; type=&quot;4&quot;/&gt;&#13;&#10;"/>
-<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/Hello/core/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
-<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/gwt-user/core/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
-<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/gwt-user/core/super&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
-<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/gwt-dev-windows/core/super&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
-<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry id=&quot;org.eclipse.jdt.launching.classpathentry.defaultClasspath&quot;&gt;&#13;&#10;&lt;memento exportedEntriesOnly=&quot;false&quot; project=&quot;Hello&quot;/&gt;&#13;&#10;&lt;/runtimeClasspathEntry&gt;&#13;&#10;"/>
-</listAttribute>
-<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="false"/>
-<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.google.gwt.dev.GWTCompiler"/>
-<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-out www&#13;&#10;com.google.gwt.sample.hello.Hello"/>
-<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="Hello"/>
-<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-ea&#13;&#10;-Dgwt.devjar=C:\gwt\trunk\build\staging\gwt-windows-0.0.0\gwt-dev-windows.jar"/>
-</launchConfiguration>
diff --git a/eclipse/samples/Hello/Hello-gwtc.launch b/eclipse/samples/Hello/Hello-gwtc.launch
new file mode 100644
index 0000000..d8c4a4d
--- /dev/null
+++ b/eclipse/samples/Hello/Hello-gwtc.launch
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication">
+<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
+<listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.eclipse.jdt.launching.JRE_CONTAINER&quot; javaProject=&quot;Hello&quot; path=&quot;1&quot; type=&quot;4&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/Hello/core/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/gwt-user/core/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/gwt-user/core/super&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/gwt-dev-windows/core/super&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry id=&quot;org.eclipse.jdt.launching.classpathentry.defaultClasspath&quot;&gt;&#10;&lt;memento exportedEntriesOnly=&quot;false&quot; project=&quot;Hello&quot;/&gt;&#10;&lt;/runtimeClasspathEntry&gt;&#10;"/>
+</listAttribute>
+<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="false"/>
+<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.google.gwt.dev.Compiler"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="com.google.gwt.sample.hello.Hello"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="Hello"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-ea&#13;&#10;-Xmx256M&#13;&#10;-Dgwt.devjar=${gwt_devjar}"/>
+</launchConfiguration>
diff --git a/eclipse/samples/Hello/Hello.launch b/eclipse/samples/Hello/Hello.launch
index bf03582..2698052 100644
--- a/eclipse/samples/Hello/Hello.launch
+++ b/eclipse/samples/Hello/Hello.launch
@@ -1,23 +1,17 @@
-<?xml version="1.0" encoding="UTF-8"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication">
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
-<listEntry value="/Hello"/>
-</listAttribute>
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
-<listEntry value="4"/>
-</listAttribute>
 <booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
 <listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
-<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.eclipse.jdt.launching.JRE_CONTAINER&quot; javaProject=&quot;Hello&quot; path=&quot;1&quot; type=&quot;4&quot;/&gt;&#13;&#10;"/>
-<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/Hello/core/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
-<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/gwt-user/core/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
-<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/gwt-user/core/super&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
-<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/gwt-dev-windows/core/super&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
-<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry id=&quot;org.eclipse.jdt.launching.classpathentry.defaultClasspath&quot;&gt;&#13;&#10;&lt;memento exportedEntriesOnly=&quot;false&quot; project=&quot;Hello&quot;/&gt;&#13;&#10;&lt;/runtimeClasspathEntry&gt;&#13;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.eclipse.jdt.launching.JRE_CONTAINER&quot; javaProject=&quot;Hello&quot; path=&quot;1&quot; type=&quot;4&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/Hello/core/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/gwt-user/core/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/gwt-user/core/super&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/gwt-dev-windows/core/super&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry id=&quot;org.eclipse.jdt.launching.classpathentry.defaultClasspath&quot;&gt;&#10;&lt;memento exportedEntriesOnly=&quot;false&quot; project=&quot;Hello&quot;/&gt;&#10;&lt;/runtimeClasspathEntry&gt;&#10;"/>
 </listAttribute>
 <booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="false"/>
-<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.google.gwt.dev.GWTShell"/>
-<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-out www&#13;&#10;com.google.gwt.sample.hello.Hello/Hello.html"/>
+<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.google.gwt.dev.HostedMode"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-startupUrl Hello.html&#13;&#10;com.google.gwt.sample.hello.Hello"/>
 <stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="Hello"/>
-<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-ea&#13;&#10;-Dgwt.devjar=C:\gwt\trunk\build\staging\gwt-windows-0.0.0\gwt-dev-windows.jar"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-ea&#13;&#10;-Xmx256M&#13;&#10;-Dgwt.devjar=${gwt_devjar}"/>
 </launchConfiguration>
diff --git a/eclipse/samples/I18N/.classpath b/eclipse/samples/I18N/.classpath
index 8996e78..26f2949 100644
--- a/eclipse/samples/I18N/.classpath
+++ b/eclipse/samples/I18N/.classpath
@@ -1,7 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
 	<classpathentry kind="src" path="core/src"/>
+	<classpathentry kind="src" output="war" path="core/war"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/gwt-user"/>
-	<classpathentry kind="output" path="bin"/>
+	<classpathentry kind="output" path="war/WEB-INF/classes"/>
 </classpath>
diff --git a/eclipse/samples/I18N/I18N-gwtc.launch b/eclipse/samples/I18N/I18N-gwtc.launch
new file mode 100644
index 0000000..0de5f68
--- /dev/null
+++ b/eclipse/samples/I18N/I18N-gwtc.launch
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication">
+<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
+<listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.eclipse.jdt.launching.JRE_CONTAINER&quot; javaProject=&quot;I18N&quot; path=&quot;1&quot; type=&quot;4&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/I18N/core/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/gwt-user/core/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/gwt-user/core/super&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/gwt-dev-windows/core/super&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry id=&quot;org.eclipse.jdt.launching.classpathentry.defaultClasspath&quot;&gt;&#10;&lt;memento exportedEntriesOnly=&quot;false&quot; project=&quot;I18N&quot;/&gt;&#10;&lt;/runtimeClasspathEntry&gt;&#10;"/>
+</listAttribute>
+<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="false"/>
+<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.google.gwt.dev.Compiler"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="com.google.gwt.sample.i18n.I18N"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="I18N"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-ea&#13;&#10;-Xmx256M&#13;&#10;-Dgwt.devjar=${gwt_devjar}"/>
+</launchConfiguration>
diff --git a/eclipse/samples/I18N/I18N.launch b/eclipse/samples/I18N/I18N.launch
new file mode 100644
index 0000000..e531a50
--- /dev/null
+++ b/eclipse/samples/I18N/I18N.launch
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication">
+<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
+<listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.eclipse.jdt.launching.JRE_CONTAINER&quot; javaProject=&quot;I18N&quot; path=&quot;1&quot; type=&quot;4&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/I18N/core/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/gwt-user/core/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/gwt-user/core/super&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/gwt-dev-windows/core/super&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry id=&quot;org.eclipse.jdt.launching.classpathentry.defaultClasspath&quot;&gt;&#10;&lt;memento exportedEntriesOnly=&quot;false&quot; project=&quot;I18N&quot;/&gt;&#10;&lt;/runtimeClasspathEntry&gt;&#10;"/>
+</listAttribute>
+<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="false"/>
+<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.google.gwt.dev.HostedMode"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-startupUrl I18N.html&#13;&#10;com.google.gwt.sample.i18n.I18N"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="I18N"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-ea&#13;&#10;-Xmx256M&#13;&#10;-Dgwt.devjar=${gwt_devjar}"/>
+</launchConfiguration>
diff --git a/eclipse/samples/JSON/.classpath b/eclipse/samples/JSON/.classpath
index 8996e78..26f2949 100644
--- a/eclipse/samples/JSON/.classpath
+++ b/eclipse/samples/JSON/.classpath
@@ -1,7 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
 	<classpathentry kind="src" path="core/src"/>
+	<classpathentry kind="src" output="war" path="core/war"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/gwt-user"/>
-	<classpathentry kind="output" path="bin"/>
+	<classpathentry kind="output" path="war/WEB-INF/classes"/>
 </classpath>
diff --git a/eclipse/samples/JSON/.project b/eclipse/samples/JSON/.project
index bd13bfd..201b21a 100644
--- a/eclipse/samples/JSON/.project
+++ b/eclipse/samples/JSON/.project
@@ -24,7 +24,7 @@
 		<link>
 			<name>core</name>
 			<type>2</type>
-			<location>GWT_ROOT/samples/json</location>
+			<locationURI>GWT_ROOT/samples/json</locationURI>
 		</link>
 	</linkedResources>
 </projectDescription>
diff --git a/eclipse/samples/JSON/JSON-gwtc.launch b/eclipse/samples/JSON/JSON-gwtc.launch
new file mode 100644
index 0000000..ff8f309
--- /dev/null
+++ b/eclipse/samples/JSON/JSON-gwtc.launch
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication">
+<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
+<listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.eclipse.jdt.launching.JRE_CONTAINER&quot; javaProject=&quot;JSON&quot; path=&quot;1&quot; type=&quot;4&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/JSON/core/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/gwt-user/core/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/gwt-user/core/super&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/gwt-dev-windows/core/super&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry id=&quot;org.eclipse.jdt.launching.classpathentry.defaultClasspath&quot;&gt;&#10;&lt;memento exportedEntriesOnly=&quot;false&quot; project=&quot;JSON&quot;/&gt;&#10;&lt;/runtimeClasspathEntry&gt;&#10;"/>
+</listAttribute>
+<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="false"/>
+<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.google.gwt.dev.Compiler"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="com.google.gwt.sample.json.JSON"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="JSON"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-ea&#13;&#10;-Xmx256M&#13;&#10;-Dgwt.devjar=${gwt_devjar}"/>
+</launchConfiguration>
diff --git a/eclipse/samples/JSON/JSON.launch b/eclipse/samples/JSON/JSON.launch
new file mode 100644
index 0000000..7c65850
--- /dev/null
+++ b/eclipse/samples/JSON/JSON.launch
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication">
+<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
+<listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.eclipse.jdt.launching.JRE_CONTAINER&quot; javaProject=&quot;JSON&quot; path=&quot;1&quot; type=&quot;4&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/JSON/core/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/gwt-user/core/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/gwt-user/core/super&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/gwt-dev-windows/core/super&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry id=&quot;org.eclipse.jdt.launching.classpathentry.defaultClasspath&quot;&gt;&#10;&lt;memento exportedEntriesOnly=&quot;false&quot; project=&quot;JSON&quot;/&gt;&#10;&lt;/runtimeClasspathEntry&gt;&#10;"/>
+</listAttribute>
+<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="false"/>
+<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.google.gwt.dev.HostedMode"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-startupUrl JSON.html&#13;&#10;com.google.gwt.sample.json.JSON"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="JSON"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-ea&#13;&#10;-Xmx256M&#13;&#10;-Dgwt.devjar=${gwt_devjar}"/>
+</launchConfiguration>
diff --git a/eclipse/samples/Mail/.classpath b/eclipse/samples/Mail/.classpath
index 8996e78..26f2949 100644
--- a/eclipse/samples/Mail/.classpath
+++ b/eclipse/samples/Mail/.classpath
@@ -1,7 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
 	<classpathentry kind="src" path="core/src"/>
+	<classpathentry kind="src" output="war" path="core/war"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/gwt-user"/>
-	<classpathentry kind="output" path="bin"/>
+	<classpathentry kind="output" path="war/WEB-INF/classes"/>
 </classpath>
diff --git a/eclipse/samples/Mail/.project b/eclipse/samples/Mail/.project
index ebcf8d8..9b9ccaf 100644
--- a/eclipse/samples/Mail/.project
+++ b/eclipse/samples/Mail/.project
@@ -24,7 +24,7 @@
 		<link>
 			<name>core</name>
 			<type>2</type>
-			<location>GWT_ROOT/samples/mail</location>
+			<locationURI>GWT_ROOT/samples/mail</locationURI>
 		</link>
 	</linkedResources>
 </projectDescription>
diff --git a/eclipse/samples/Mail/Mail-gwtc.launch b/eclipse/samples/Mail/Mail-gwtc.launch
new file mode 100644
index 0000000..93f868b
--- /dev/null
+++ b/eclipse/samples/Mail/Mail-gwtc.launch
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication">
+<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
+<listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.eclipse.jdt.launching.JRE_CONTAINER&quot; javaProject=&quot;Mail&quot; path=&quot;1&quot; type=&quot;4&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/Mail/core/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/gwt-user/core/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/gwt-user/core/super&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/gwt-dev-windows/core/super&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry id=&quot;org.eclipse.jdt.launching.classpathentry.defaultClasspath&quot;&gt;&#10;&lt;memento exportedEntriesOnly=&quot;false&quot; project=&quot;Mail&quot;/&gt;&#10;&lt;/runtimeClasspathEntry&gt;&#10;"/>
+</listAttribute>
+<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="false"/>
+<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.google.gwt.dev.Compiler"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="com.google.gwt.sample.mail.Mail"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="Mail"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-ea&#13;&#10;-Xmx256M&#13;&#10;-Dgwt.devjar=${gwt_devjar}"/>
+</launchConfiguration>
diff --git a/eclipse/samples/Mail/Mail.launch b/eclipse/samples/Mail/Mail.launch
new file mode 100644
index 0000000..8969458
--- /dev/null
+++ b/eclipse/samples/Mail/Mail.launch
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication">
+<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
+<listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.eclipse.jdt.launching.JRE_CONTAINER&quot; javaProject=&quot;Mail&quot; path=&quot;1&quot; type=&quot;4&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/Mail/core/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/gwt-user/core/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/gwt-user/core/super&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/gwt-dev-windows/core/super&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry id=&quot;org.eclipse.jdt.launching.classpathentry.defaultClasspath&quot;&gt;&#10;&lt;memento exportedEntriesOnly=&quot;false&quot; project=&quot;Mail&quot;/&gt;&#10;&lt;/runtimeClasspathEntry&gt;&#10;"/>
+</listAttribute>
+<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="false"/>
+<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.google.gwt.dev.HostedMode"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-startupUrl Mail.html&#13;&#10;com.google.gwt.sample.mail.Mail"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="Mail"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-ea&#13;&#10;-Xmx256M&#13;&#10;-Dgwt.devjar=${gwt_devjar}"/>
+</launchConfiguration>
diff --git a/eclipse/samples/Showcase/.classpath b/eclipse/samples/Showcase/.classpath
index a8c5efa..9ced56b 100644
--- a/eclipse/samples/Showcase/.classpath
+++ b/eclipse/samples/Showcase/.classpath
@@ -1,8 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
 	<classpathentry kind="src" path="core/src"/>
+	<classpathentry kind="src" output="war" path="core/war"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/gwt-dev-linux"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/gwt-user"/>
-	<classpathentry kind="output" path="bin"/>
+	<classpathentry combineaccessrules="false" kind="src" path="/gwt-dev-windows"/>
+	<classpathentry kind="output" path="war/WEB-INF/classes"/>
 </classpath>
diff --git a/eclipse/samples/Showcase/Showcase-gwtc.launch b/eclipse/samples/Showcase/Showcase-gwtc.launch
new file mode 100644
index 0000000..cc73877
--- /dev/null
+++ b/eclipse/samples/Showcase/Showcase-gwtc.launch
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication">
+<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
+<listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.eclipse.jdt.launching.JRE_CONTAINER&quot; javaProject=&quot;Showcase&quot; path=&quot;1&quot; type=&quot;4&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/Showcase/core/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/gwt-user/core/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/gwt-user/core/super&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/gwt-dev-windows/core/super&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry id=&quot;org.eclipse.jdt.launching.classpathentry.defaultClasspath&quot;&gt;&#10;&lt;memento exportedEntriesOnly=&quot;false&quot; project=&quot;Showcase&quot;/&gt;&#10;&lt;/runtimeClasspathEntry&gt;&#10;"/>
+</listAttribute>
+<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="false"/>
+<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.google.gwt.dev.Compiler"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="com.google.gwt.sample.showcase.Showcase"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="Showcase"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-ea&#13;&#10;-Xmx256M&#13;&#10;-Dgwt.devjar=${gwt_devjar}"/>
+</launchConfiguration>
diff --git a/eclipse/samples/Showcase/Showcase.launch b/eclipse/samples/Showcase/Showcase.launch
new file mode 100644
index 0000000..7c7f985
--- /dev/null
+++ b/eclipse/samples/Showcase/Showcase.launch
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication">
+<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
+<listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.eclipse.jdt.launching.JRE_CONTAINER&quot; javaProject=&quot;Showcase&quot; path=&quot;1&quot; type=&quot;4&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/Showcase/core/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/gwt-user/core/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/gwt-user/core/super&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/gwt-dev-windows/core/super&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry id=&quot;org.eclipse.jdt.launching.classpathentry.defaultClasspath&quot;&gt;&#10;&lt;memento exportedEntriesOnly=&quot;false&quot; project=&quot;Showcase&quot;/&gt;&#10;&lt;/runtimeClasspathEntry&gt;&#10;"/>
+</listAttribute>
+<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="false"/>
+<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.google.gwt.dev.HostedMode"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-startupUrl Showcase.html&#13;&#10;com.google.gwt.sample.showcase.Showcase"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="Showcase"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-ea&#13;&#10;-Xmx256M&#13;&#10;-Dgwt.devjar=${gwt_devjar}"/>
+</launchConfiguration>
diff --git a/eclipse/samples/SimpleRPC/.classpath b/eclipse/samples/SimpleRPC/.classpath
index 8996e78..26f2949 100644
--- a/eclipse/samples/SimpleRPC/.classpath
+++ b/eclipse/samples/SimpleRPC/.classpath
@@ -1,7 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
 	<classpathentry kind="src" path="core/src"/>
+	<classpathentry kind="src" output="war" path="core/war"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/gwt-user"/>
-	<classpathentry kind="output" path="bin"/>
+	<classpathentry kind="output" path="war/WEB-INF/classes"/>
 </classpath>
diff --git a/eclipse/samples/SimpleRPC/.project b/eclipse/samples/SimpleRPC/.project
index 4aa9253..2bb608a 100644
--- a/eclipse/samples/SimpleRPC/.project
+++ b/eclipse/samples/SimpleRPC/.project
@@ -24,7 +24,7 @@
 		<link>
 			<name>core</name>
 			<type>2</type>
-			<location>GWT_ROOT/samples/simplerpc</location>
+			<locationURI>GWT_ROOT/samples/simplerpc</locationURI>
 		</link>
 	</linkedResources>
 </projectDescription>
diff --git a/eclipse/samples/SimpleRPC/SimpleRPC-gwtc.launch b/eclipse/samples/SimpleRPC/SimpleRPC-gwtc.launch
new file mode 100644
index 0000000..7147610
--- /dev/null
+++ b/eclipse/samples/SimpleRPC/SimpleRPC-gwtc.launch
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication">
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
+<listEntry value="/SimpleRPC"/>
+</listAttribute>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
+<listEntry value="4"/>
+</listAttribute>
+<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
+<listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.eclipse.jdt.launching.JRE_CONTAINER&quot; javaProject=&quot;SimpleRPC&quot; path=&quot;1&quot; type=&quot;4&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/SimpleRPC/core/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/gwt-user/core/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/gwt-user/core/super&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/gwt-dev-windows/core/super&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry id=&quot;org.eclipse.jdt.launching.classpathentry.defaultClasspath&quot;&gt;&#10;&lt;memento exportedEntriesOnly=&quot;false&quot; project=&quot;SimpleRPC&quot;/&gt;&#10;&lt;/runtimeClasspathEntry&gt;&#10;"/>
+</listAttribute>
+<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="false"/>
+<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.google.gwt.dev.Compiler"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="com.google.gwt.sample.simplerpc.SimpleRPC"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="SimpleRPC"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-ea&#13;&#10;-Xmx256M&#13;&#10;-Dgwt.devjar=${gwt_devjar}"/>
+</launchConfiguration>
diff --git a/eclipse/samples/SimpleRPC/SimpleRPC.launch b/eclipse/samples/SimpleRPC/SimpleRPC.launch
new file mode 100644
index 0000000..de170b8
--- /dev/null
+++ b/eclipse/samples/SimpleRPC/SimpleRPC.launch
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication">
+<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
+<listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.eclipse.jdt.launching.JRE_CONTAINER&quot; javaProject=&quot;SimpleRPC&quot; path=&quot;1&quot; type=&quot;4&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/SimpleRPC/core/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/gwt-user/core/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/gwt-user/core/super&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/gwt-dev-windows/core/super&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry id=&quot;org.eclipse.jdt.launching.classpathentry.defaultClasspath&quot;&gt;&#10;&lt;memento exportedEntriesOnly=&quot;false&quot; project=&quot;SimpleRPC&quot;/&gt;&#10;&lt;/runtimeClasspathEntry&gt;&#10;"/>
+</listAttribute>
+<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="false"/>
+<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.google.gwt.dev.HostedMode"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-startupUrl SimpleRPC.html&#13;&#10;com.google.gwt.sample.simplerpc.SimpleRPC"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="SimpleRPC"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-ea&#13;&#10;-Xmx256M&#13;&#10;-Dgwt.devjar=${gwt_devjar}"/>
+</launchConfiguration>
diff --git a/eclipse/samples/SimpleXML/.classpath b/eclipse/samples/SimpleXML/.classpath
index 8996e78..26f2949 100644
--- a/eclipse/samples/SimpleXML/.classpath
+++ b/eclipse/samples/SimpleXML/.classpath
@@ -1,7 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
 	<classpathentry kind="src" path="core/src"/>
+	<classpathentry kind="src" output="war" path="core/war"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/gwt-user"/>
-	<classpathentry kind="output" path="bin"/>
+	<classpathentry kind="output" path="war/WEB-INF/classes"/>
 </classpath>
diff --git a/eclipse/samples/SimpleXML/.project b/eclipse/samples/SimpleXML/.project
index 72c2e13..5c0a10f 100644
--- a/eclipse/samples/SimpleXML/.project
+++ b/eclipse/samples/SimpleXML/.project
@@ -24,7 +24,7 @@
 		<link>
 			<name>core</name>
 			<type>2</type>
-			<location>GWT_ROOT/samples/simplexml</location>
+			<locationURI>GWT_ROOT/samples/simplexml</locationURI>
 		</link>
 	</linkedResources>
 </projectDescription>
diff --git a/eclipse/samples/SimpleXML/SimpleXML-gwtc.launch b/eclipse/samples/SimpleXML/SimpleXML-gwtc.launch
new file mode 100644
index 0000000..052f4f1
--- /dev/null
+++ b/eclipse/samples/SimpleXML/SimpleXML-gwtc.launch
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication">
+<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
+<listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.eclipse.jdt.launching.JRE_CONTAINER&quot; javaProject=&quot;SimpleXML&quot; path=&quot;1&quot; type=&quot;4&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/SimpleXML/core/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/gwt-user/core/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/gwt-user/core/super&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/gwt-dev-windows/core/super&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry id=&quot;org.eclipse.jdt.launching.classpathentry.defaultClasspath&quot;&gt;&#10;&lt;memento exportedEntriesOnly=&quot;false&quot; project=&quot;SimpleXML&quot;/&gt;&#10;&lt;/runtimeClasspathEntry&gt;&#10;"/>
+</listAttribute>
+<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="false"/>
+<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.google.gwt.dev.Compiler"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="com.google.gwt.sample.simplexml.SimpleXML"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="SimpleXML"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-ea&#13;&#10;-Xmx256M&#13;&#10;-Dgwt.devjar=${gwt_devjar}"/>
+</launchConfiguration>
diff --git a/eclipse/samples/SimpleXML/SimpleXML.launch b/eclipse/samples/SimpleXML/SimpleXML.launch
new file mode 100644
index 0000000..8276f65
--- /dev/null
+++ b/eclipse/samples/SimpleXML/SimpleXML.launch
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication">
+<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
+<listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.eclipse.jdt.launching.JRE_CONTAINER&quot; javaProject=&quot;SimpleXML&quot; path=&quot;1&quot; type=&quot;4&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/SimpleXML/core/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/gwt-user/core/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/gwt-user/core/super&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/gwt-dev-windows/core/super&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry id=&quot;org.eclipse.jdt.launching.classpathentry.defaultClasspath&quot;&gt;&#10;&lt;memento exportedEntriesOnly=&quot;false&quot; project=&quot;SimpleXML&quot;/&gt;&#10;&lt;/runtimeClasspathEntry&gt;&#10;"/>
+</listAttribute>
+<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="false"/>
+<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.google.gwt.dev.HostedMode"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-startupUrl SimpleXML.html&#13;&#10;com.google.gwt.sample.simplexml.SimpleXML"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="SimpleXML"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-ea&#13;&#10;-Xmx256M&#13;&#10;-Dgwt.devjar=${gwt_devjar}"/>
+</launchConfiguration>
diff --git a/reference/code-museum/src/com/google/gwt/museum/DefaultMuseum.gwt.xml b/reference/code-museum/src/com/google/gwt/museum/DefaultMuseum.gwt.xml
index 21d12fd..cee0aa1 100644
--- a/reference/code-museum/src/com/google/gwt/museum/DefaultMuseum.gwt.xml
+++ b/reference/code-museum/src/com/google/gwt/museum/DefaultMuseum.gwt.xml
@@ -3,5 +3,6 @@
     <!-- Inherit the core Web Toolkit stuff.                  -->
     <inherits name='com.google.gwt.museum.Museum'/>
     <source path="client/defaultmuseum"/>
-    <entry-point class="com.google.gwt.museum.client.defaultmuseum.DefaultMuseum"/>
-</module>
+      <!-- Specify the app entry point class.                   -->
+    <entry-point class='com.google.gwt.museum.client.defaultmuseum.Issue3190'/>
+ </module>
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/common/EventReporter.java b/reference/code-museum/src/com/google/gwt/museum/client/common/EventReporter.java
index c7e674a..9790aad 100644
--- a/reference/code-museum/src/com/google/gwt/museum/client/common/EventReporter.java
+++ b/reference/code-museum/src/com/google/gwt/museum/client/common/EventReporter.java
@@ -16,7 +16,6 @@
 
 package com.google.gwt.museum.client.common;
 
-import com.google.gwt.event.dom.client.HandlesAllKeyEvents;
 import com.google.gwt.event.dom.client.BlurEvent;
 import com.google.gwt.event.dom.client.BlurHandler;
 import com.google.gwt.event.dom.client.ChangeEvent;
@@ -26,15 +25,17 @@
 import com.google.gwt.event.dom.client.FocusEvent;
 import com.google.gwt.event.dom.client.FocusHandler;
 import com.google.gwt.event.dom.client.KeyDownEvent;
+import com.google.gwt.event.dom.client.KeyDownHandler;
 import com.google.gwt.event.dom.client.KeyPressEvent;
+import com.google.gwt.event.dom.client.KeyPressHandler;
 import com.google.gwt.event.dom.client.KeyUpEvent;
+import com.google.gwt.event.dom.client.KeyUpHandler;
 import com.google.gwt.event.logical.shared.CloseEvent;
 import com.google.gwt.event.logical.shared.CloseHandler;
 import com.google.gwt.event.logical.shared.SelectionEvent;
 import com.google.gwt.event.logical.shared.SelectionHandler;
 import com.google.gwt.event.logical.shared.ValueChangeEvent;
 import com.google.gwt.event.logical.shared.ValueChangeHandler;
-import com.google.gwt.event.shared.GwtEvent;
 import com.google.gwt.user.client.ui.ChangeListener;
 import com.google.gwt.user.client.ui.CheckBox;
 import com.google.gwt.user.client.ui.ClickListener;
@@ -42,13 +43,11 @@
 import com.google.gwt.user.client.ui.HasHTML;
 import com.google.gwt.user.client.ui.HasText;
 import com.google.gwt.user.client.ui.KeyboardListener;
-import com.google.gwt.user.client.ui.Label;
 import com.google.gwt.user.client.ui.MouseListener;
 import com.google.gwt.user.client.ui.Panel;
 import com.google.gwt.user.client.ui.SuggestionEvent;
 import com.google.gwt.user.client.ui.SuggestionHandler;
 import com.google.gwt.user.client.ui.UIObject;
-import com.google.gwt.user.client.ui.VerticalPanel;
 import com.google.gwt.user.client.ui.Widget;
 import com.google.gwt.user.client.ui.SuggestOracle.Suggestion;
 
@@ -59,11 +58,12 @@
  * @param <T> target type
  */
 @SuppressWarnings("deprecation")
-public class EventReporter<V, T> extends HandlesAllKeyEvents implements
+public class EventReporter<V, T> extends SimpleLogger implements
     ChangeListener, FocusListener, ValueChangeHandler<V>,
     SelectionHandler<Suggestion>, SuggestionHandler, KeyboardListener,
     ChangeHandler, BlurHandler, FocusHandler, ClickHandler, ClickListener,
-    CloseHandler<T>, MouseListener {
+    CloseHandler<T>, MouseListener, KeyDownHandler, KeyUpHandler,
+    KeyPressHandler {
 
   /**
    * Add/remove handlers via check box.
@@ -96,10 +96,8 @@
     public abstract void removeHandler();
   }
 
-  private VerticalPanel panel = new VerticalPanel();
-
   public EventReporter(Panel parent) {
-    parent.add(this.panel);
+    parent.add(this);
   }
 
   public String getInfo(Object sender) {
@@ -211,17 +209,4 @@
   public void onValueChange(ValueChangeEvent<V> event) {
     report(event);
   }
-
-  // will be replaced by logging
-  public void report(String s) {
-    panel.insert(new Label(s), 0);
-    if (panel.getWidgetCount() == 10) {
-      panel.remove(9);
-    }
-  }
-
-  private void report(GwtEvent<?> event) {
-    report(getInfo(event.getSource()) + " fired " + event.toDebugString());
-  }
-
 }
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/common/SimpleLogger.java b/reference/code-museum/src/com/google/gwt/museum/client/common/SimpleLogger.java
new file mode 100644
index 0000000..eeba505
--- /dev/null
+++ b/reference/code-museum/src/com/google/gwt/museum/client/common/SimpleLogger.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2009 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.museum.client.common;
+
+import com.google.gwt.event.shared.GwtEvent;
+import com.google.gwt.user.client.ui.Composite;
+import com.google.gwt.user.client.ui.HasHTML;
+import com.google.gwt.user.client.ui.HasText;
+import com.google.gwt.user.client.ui.Label;
+import com.google.gwt.user.client.ui.UIObject;
+import com.google.gwt.user.client.ui.VerticalPanel;
+
+/**
+ * Helper class to create visual tests.
+ * 
+ * @param <V> value type
+ * @param <T> target type
+ */
+@SuppressWarnings("deprecation")
+public class SimpleLogger<V, T> extends Composite {
+
+  private VerticalPanel panel = new VerticalPanel();
+
+  public SimpleLogger() {
+    initWidget(panel);
+  }
+
+  public String getInfo(Object sender) {
+    if (sender instanceof HasText) {
+      return ((HasText) sender).getText();
+    } else if (sender instanceof UIObject
+        && ((UIObject) sender).getTitle() != null) {
+      return ((UIObject) sender).getTitle();
+    } else if (sender instanceof HasHTML) {
+      return ((HasHTML) sender).getHTML();
+    } else {
+      return sender.toString();
+    }
+  }
+
+  public void report(String s) {
+    panel.insert(new Label(s), 0);
+    if (panel.getWidgetCount() == 10) {
+      panel.remove(9);
+    }
+  }
+
+  public void report(GwtEvent<?> event) {
+    report(getInfo(event.getSource()) + " fired " + event.toDebugString());
+  }
+
+}
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/DefaultMuseum.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/DefaultMuseum.java
index b49d292..19bf121 100644
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/DefaultMuseum.java
+++ b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/DefaultMuseum.java
@@ -64,5 +64,6 @@
     addIssue(new VisualsForTreeEvents());
     addIssue(new VisualsForWindowEvents());
     addIssue(new VisualsForDialogBox());
+    addIssue(new VisualsForSuggestBox());
   }
 }
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForCheckBoxAndRadioButtonEvents.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForCheckBoxAndRadioButtonEvents.java
index 468b95a..1afbee1 100644
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForCheckBoxAndRadioButtonEvents.java
+++ b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForCheckBoxAndRadioButtonEvents.java
@@ -18,6 +18,7 @@
 
 import com.google.gwt.event.dom.client.ClickEvent;
 import com.google.gwt.event.dom.client.ClickHandler;
+import com.google.gwt.event.dom.client.HandlesAllKeyEvents;
 import com.google.gwt.museum.client.common.AbstractIssue;
 import com.google.gwt.museum.client.common.EventReporter;
 import com.google.gwt.user.client.ui.Button;
@@ -49,8 +50,7 @@
       }
     }));
     b.addKeyboardListener(handler);
-    handler.addKeyHandlersTo(b);
-
+    HandlesAllKeyEvents.addHandlers(b, handler);
     b.addFocusHandler(handler);
     b.addBlurHandler(handler);
     b.addFocusListener(handler);
@@ -65,7 +65,8 @@
     p.add(radio);
     handler = new EventReporter<Boolean, Object>(p);
     radio.addKeyboardListener(handler);
-    handler.addKeyHandlersTo(radio);
+
+    HandlesAllKeyEvents.addHandlers(radio, handler);
     radio.addBlurHandler(handler);
     radio.addFocusHandler(handler);
     radio.addClickHandler(handler);
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForEventsFiring.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForEventsFiring.java
index 8450fd9..07efe27 100644
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForEventsFiring.java
+++ b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForEventsFiring.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2008 Google Inc.
+ * Copyright 2009 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
@@ -29,8 +29,10 @@
 import com.google.gwt.event.dom.client.ErrorHandler;
 import com.google.gwt.event.dom.client.FocusEvent;
 import com.google.gwt.event.dom.client.FocusHandler;
+import com.google.gwt.event.dom.client.HasChangeHandlers;
 import com.google.gwt.event.dom.client.HasContextMenuHandlers;
 import com.google.gwt.event.dom.client.HasDoubleClickHandlers;
+import com.google.gwt.event.dom.client.HasMouseWheelHandlers;
 import com.google.gwt.event.dom.client.KeyDownEvent;
 import com.google.gwt.event.dom.client.KeyDownHandler;
 import com.google.gwt.event.dom.client.KeyPressEvent;
@@ -49,6 +51,8 @@
 import com.google.gwt.event.dom.client.MouseOverHandler;
 import com.google.gwt.event.dom.client.MouseUpEvent;
 import com.google.gwt.event.dom.client.MouseUpHandler;
+import com.google.gwt.event.dom.client.MouseWheelEvent;
+import com.google.gwt.event.dom.client.MouseWheelHandler;
 import com.google.gwt.event.dom.client.ScrollEvent;
 import com.google.gwt.event.dom.client.ScrollHandler;
 import com.google.gwt.event.logical.shared.ResizeEvent;
@@ -87,9 +91,28 @@
     }
   }
 
+  private static class CustomScrollPanel extends ScrollPanel implements
+      HasMouseWheelHandlers {
+    public CustomScrollPanel(Widget content) {
+      super(content);
+    }
+
+    public HandlerRegistration addMouseWheelHandler(MouseWheelHandler handler) {
+      return addDomHandler(handler, MouseWheelEvent.getType());
+    }
+  }
+
+  private static class CustomTextBox extends TextBox implements
+      HasChangeHandlers {
+    public HandlerRegistration addChangeHandler(ChangeHandler handler) {
+      return addDomHandler(handler, ChangeEvent.getType());
+    }
+  }
+
   private static final int WINDOW_EVENT_SCROLL = -1;
   private static final int WINDOW_EVENT_RESIZE = -2;
   private static final int WINDOW_EVENT_CLOSING = -3;
+  private static final int VELOCITY_EVENT = -4;
 
   /**
    * The main grid used for layout.
@@ -143,8 +166,9 @@
    * 
    * @param eventType the type of event defined in {@link Event}
    * @param eventName the name of the event
+   * @return the index of the test
    */
-  private void addDependentTest(int eventType, String eventName) {
+  private int addDependentTest(int eventType, String eventName) {
     // Find the last test
     int numRows = layout.getRowCount();
     eventMap.put(new Integer(eventType), new Integer(numRows));
@@ -158,6 +182,7 @@
     }
     layout.setText(numRows, 0, eventName);
     layout.setText(numRows, 1, "?");
+    return numRows;
   }
 
   /**
@@ -166,8 +191,9 @@
    * @param eventType the type of event defined in {@link Event}
    * @param eventName the name of the event
    * @param trigger the widget that triggers the events
+   * @return the index of the test
    */
-  private void addTest(int eventType, String eventName, Widget trigger) {
+  private int addTest(int eventType, String eventName, Widget trigger) {
     int numRows = layout.getRowCount();
     eventMap.put(new Integer(eventType), new Integer(numRows));
     layout.setWidget(numRows, 0, trigger);
@@ -179,6 +205,7 @@
         HasVerticalAlignment.ALIGN_MIDDLE);
     formatter.setHorizontalAlignment(numRows, 0,
         HasHorizontalAlignment.ALIGN_CENTER);
+    return numRows;
   }
 
   /**
@@ -206,7 +233,7 @@
 
   private void prepKeyboardEvents() {
     // Setup a text box to trigger the events
-    TextBox textBox = new TextBox();
+    CustomTextBox textBox = new CustomTextBox();
 
     // Setup the tests
     textBox.setText("Type a letter");
@@ -377,25 +404,8 @@
         + "if supported)";
     HTML scrollableContents = new HTML(scrollableMessage);
     scrollableContents.setPixelSize(400, 400);
-    scrollableContents.getElement().getStyle().setProperty("textAlign",
-        "left");
-    ScrollPanel scrollable = new ScrollPanel(scrollableContents) {
-      @Override
-      public void onBrowserEvent(Event event) {
-        super.onBrowserEvent(event);
-
-        // Verify that values associated with events are defined
-        if (event.getTypeInt() == Event.ONMOUSEWHEEL) {
-          event.getClientX();
-          event.getClientY();
-          event.getScreenX();
-          event.getScreenY();
-          event.getMouseWheelVelocityY();
-          passTest(event);
-        }
-      }
-    };
-    scrollable.sinkEvents(Event.ONMOUSEWHEEL);
+    scrollableContents.getElement().getStyle().setProperty("textAlign", "left");
+    CustomScrollPanel scrollable = new CustomScrollPanel(scrollableContents);
 
     // Setup the tests
     scrollable.setAlwaysShowScrollBars(true);
@@ -403,12 +413,26 @@
     addTest(Event.ONSCROLL, "scroll", scrollable);
     addDependentTest(Event.ONMOUSEWHEEL, "mousewheel");
 
+    // Display the mouse wheel velocity
+    final int velocityIndex = addDependentTest(VELOCITY_EVENT, "velocityY");
+
     // Add event handlers
     scrollable.addScrollHandler(new ScrollHandler() {
       public void onScroll(ScrollEvent event) {
         passTest(event.getNativeEvent());
       }
     });
+    scrollable.addMouseWheelHandler(new MouseWheelHandler() {
+      public void onMouseWheel(MouseWheelEvent event) {
+        event.getClientX();
+        event.getClientY();
+        event.getScreenX();
+        event.getScreenY();
+        int velocityY = event.getDeltaY();
+        layout.setText(velocityIndex, 1, velocityY + "");
+        passTest(event.getNativeEvent());
+      }
+    });
   }
 
   private void prepWindowEvents() {
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForPopupEvents.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForPopupEvents.java
index ffa898a..81fa475 100644
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForPopupEvents.java
+++ b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForPopupEvents.java
@@ -24,12 +24,14 @@
 import com.google.gwt.user.client.Window;
 import com.google.gwt.user.client.ui.Button;
 import com.google.gwt.user.client.ui.HTML;
+import com.google.gwt.user.client.ui.HorizontalPanel;
+import com.google.gwt.user.client.ui.Label;
 import com.google.gwt.user.client.ui.PopupPanel;
 import com.google.gwt.user.client.ui.VerticalPanel;
 import com.google.gwt.user.client.ui.Widget;
 
 /**
- * A simple tree used to quickly exercise tree behavior.
+ * Visual tests for {@link PopupPanel}.
  */
 public class VisualsForPopupEvents extends AbstractIssue {
   static int xPos = 0;
@@ -37,10 +39,26 @@
   @Override
   public Widget createIssue() {
     VerticalPanel panel = new VerticalPanel();
+    panel.setSpacing(3);
+    {
+      PopupPanel popup = createButton(true, false, panel);
+      Label partner0 = new Label("AutoHide Partner 0");
+      Label partner1 = new Label("AutoHide Partner 1");
+      popup.addAutoHidePartner(partner0.getElement());
+      popup.addAutoHidePartner(partner1.getElement());
+
+      HorizontalPanel hPanel = new HorizontalPanel();
+      hPanel.setBorderWidth(1);
+      hPanel.setSpacing(3);
+      hPanel.add(partner0);
+      hPanel.add(partner1);
+      panel.add(new Label(
+          "Clicking on partners should not autoHide this popup:"));
+      panel.add(hPanel);
+    }
     createButton(true, true, panel);
-    createButton(true, false, panel);
-    createButton(false, true, panel);
     createButton(false, false, panel);
+    createButton(false, true, panel);
     return panel;
   }
 
@@ -59,7 +77,8 @@
     return false;
   }
 
-  private void createButton(boolean autoHide, boolean modal, VerticalPanel panel) {
+  private PopupPanel createButton(boolean autoHide, boolean modal,
+      VerticalPanel panel) {
     final String text = " popup " + (modal ? " modal " : " non-modal ")
         + (autoHide ? "auto hide" : " persistent");
     panel.add(new HTML("<h2>" + text + "</h2>"));
@@ -85,5 +104,7 @@
             + event.isAutoClosed());
       }
     });
+
+    return p;
   }
 }
\ No newline at end of file
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForSuggestBox.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForSuggestBox.java
new file mode 100644
index 0000000..b0964e3
--- /dev/null
+++ b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForSuggestBox.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright 2009 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.museum.client.defaultmuseum;
+
+import com.google.gwt.event.dom.client.ClickEvent;
+import com.google.gwt.event.dom.client.ClickHandler;
+import com.google.gwt.event.dom.client.MouseDownEvent;
+import com.google.gwt.event.dom.client.MouseDownHandler;
+import com.google.gwt.museum.client.common.AbstractIssue;
+import com.google.gwt.user.client.Timer;
+import com.google.gwt.user.client.ui.Button;
+import com.google.gwt.user.client.ui.FlexTable;
+import com.google.gwt.user.client.ui.HTML;
+import com.google.gwt.user.client.ui.Label;
+import com.google.gwt.user.client.ui.MultiWordSuggestOracle;
+import com.google.gwt.user.client.ui.SuggestBox;
+import com.google.gwt.user.client.ui.VerticalPanel;
+import com.google.gwt.user.client.ui.Widget;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Visual test for suggest box.
+ */
+public class VisualsForSuggestBox extends AbstractIssue {
+  MultiWordSuggestOracle girlsNames = new MultiWordSuggestOracle();
+  MultiWordSuggestOracle girlsNamesWithDefault = new MultiWordSuggestOracle();
+
+  VisualsForSuggestBox() {
+    List<String> femaleNames = Arrays.asList("Jamie", "Jill", "Jackie",
+        "Susan", "Helen", "Emily", "Karen", "Emily", "Isabella", "Emma", "Ava",
+        "Madison", "Sophia", "Olivia", "Abigail", "Hannah", "Elizabeth",
+        "Addison", "Samantha", "Ashley", "Alyssa", "Mia", "Chloe", "Natalie",
+        "Sarah", "Alexis", "Grace", "Ella", "Brianna", "Hailey", "Taylor",
+        "Anna", "Kayla", "Lily", "Lauren", "Victoria", "Savannah", "Nevaeh",
+        "Jasmine", "Lillian", "Julia", "Sofia", "Kaylee", "Sydney",
+        "Gabriella", "Katherine", "Alexa", "Destiny", "Jessica", "Morgan",
+        "Kaitlyn", "Brooke", "Allison", "Makayla", "Avery", "Alexandra",
+        "Jocelyn");
+    girlsNames.addAll(femaleNames);
+    girlsNamesWithDefault.addAll(femaleNames);
+    girlsNamesWithDefault.setDefaultSuggestionsFromText(femaleNames);
+  }
+
+  /**
+   * This is the entry point method.
+   */
+  public Widget createIssue() {
+    VerticalPanel panel = new VerticalPanel();
+
+    panel.add(new HTML(
+        "Select the show button, nothing should open <br/> Type 'e' and select the button again, now a suggestion list should open and close."));
+    panel.add(manuallyShowAndHide());
+    panel.add(new Label(
+        "Click on suggest box, it should open automatically. Check that First item is not selected"));
+    panel.add(suggestBoxWithDefault());
+    return panel;
+  }
+
+  @Override
+  public String getInstructions() {
+    return "Follow the directions above each suggest box";
+  }
+
+  @Override
+  public String getSummary() {
+    return "suggest box visuals";
+  }
+
+  @Override
+  public boolean hasCSS() {
+    return false;
+  }
+
+  private Widget manuallyShowAndHide() {
+    FlexTable t = new FlexTable();
+    t.getFlexCellFormatter().setColSpan(0, 0, 20);
+    final SuggestBox box = simpleSuggestBox();
+    box.setAnimationEnabled(true);
+    t.setWidget(0, 0, box);
+
+    Button showSuggestions = new Button(
+        "show suggestions, then hide after 2  seconds", new ClickHandler() {
+          public void onClick(ClickEvent event) {
+            box.showSuggestionList();
+            new Timer() {
+
+              @Override
+              public void run() {
+                box.hideSuggestionList();
+              }
+
+            }.schedule(2000);
+          }
+        });
+    t.setWidget(1, 0, showSuggestions);
+    return t;
+  }
+
+  private SuggestBox simpleSuggestBox() {
+
+    SuggestBox b = new SuggestBox(girlsNames);
+    return b;
+  }
+
+  private SuggestBox suggestBoxWithDefault() {
+    final SuggestBox b = new SuggestBox(girlsNamesWithDefault);
+    b.setSelectsFirstItem(false);
+    b.getTextBox().addMouseDownHandler(new MouseDownHandler() {
+
+      public void onMouseDown(MouseDownEvent event) {
+        b.showSuggestionList();
+      }
+
+    });
+    return b;
+  }
+}
\ No newline at end of file
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForTextEvents.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForTextEvents.java
index 5bff5ec..76cfe4a 100644
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForTextEvents.java
+++ b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForTextEvents.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2008 Google Inc.
+ * Copyright 2009 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
@@ -18,6 +18,7 @@
 
 import com.google.gwt.event.dom.client.ClickEvent;
 import com.google.gwt.event.dom.client.ClickHandler;
+import com.google.gwt.event.dom.client.HandlesAllKeyEvents;
 import com.google.gwt.museum.client.common.AbstractIssue;
 import com.google.gwt.museum.client.common.EventReporter;
 import com.google.gwt.user.client.ui.Button;
@@ -48,8 +49,7 @@
       }
     }));
     b.addKeyboardListener(handler);
-    handler.addKeyHandlersTo(b);
-    b.addChangeHandler(handler);
+    HandlesAllKeyEvents.addHandlers(b, handler);
     b.addChangeListener(handler);
     b.addFocusHandler(handler);
     b.addBlurHandler(handler);
@@ -62,7 +62,8 @@
     p.add(rich);
     handler = new EventReporter<String, Object>(p);
     rich.addKeyboardListener(handler);
-    handler.addKeyHandlersTo(rich);
+    HandlesAllKeyEvents.addHandlers(rich,handler);
+
     rich.addBlurHandler(handler);
     rich.addFocusHandler(handler);
     rich.addClickHandler(handler);
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForTree.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForTree.java
index ca8e319..8a280c1 100644
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForTree.java
+++ b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForTree.java
@@ -18,8 +18,11 @@
 
 import com.google.gwt.museum.client.common.AbstractIssue;
 import com.google.gwt.user.client.ui.CheckBox;
+import com.google.gwt.user.client.ui.Focusable;
+import com.google.gwt.user.client.ui.HorizontalPanel;
 import com.google.gwt.user.client.ui.Label;
 import com.google.gwt.user.client.ui.RadioButton;
+import com.google.gwt.user.client.ui.SimpleCheckBox;
 import com.google.gwt.user.client.ui.SimplePanel;
 import com.google.gwt.user.client.ui.Tree;
 import com.google.gwt.user.client.ui.TreeItem;
@@ -30,8 +33,38 @@
  * A simple tree used to quickly exercise tree behavior.
  */
 public class VisualsForTree extends AbstractIssue {
+
+  static class DelegatingFocusPanel extends HorizontalPanel implements
+      Focusable {
+
+    public int getTabIndex() {
+      return getFocusable().getTabIndex();
+    }
+
+    public void setAccessKey(char key) {
+      getFocusable().setAccessKey(key);
+    }
+
+    public void setFocus(boolean focused) {
+      getFocusable().setFocus(focused);
+    }
+
+    public void setTabIndex(int index) {
+      getFocusable().setTabIndex(index);
+    }
+
+    private Focusable getFocusable() {
+      for (Widget widget : this.getChildren()) {
+        if (widget instanceof Focusable) {
+          return (Focusable) widget;
+        }
+      }
+      throw new IllegalArgumentException("No focusable children to focus on");
+    }
+  }
+
   public static Tree createTree() {
-    Tree t = new Tree();
+    Tree tree = new Tree();
     TreeItem a = new TreeItem("a");
     TreeItem b = new TreeItem(
         "b, though this is a very, very long text field in order to trigger text wrapping bugs, if there are any such bugs currently in the tree.");
@@ -47,18 +80,38 @@
     panel.setWidget(new Label("There should not be any space above me"));
     TreeItem f = new TreeItem(panel);
 
-    t.setSelectedItem(b);
-    t.addItem(a);
-    t.addItem(b);
-    t.addItem(c);
-    t.addItem(d);
-    t.addItem(e);
-    t.addItem(f);
+    tree.setSelectedItem(b);
+    tree.addItem(a);
+    tree.addItem(b);
+    tree.addItem(c);
+    tree.addItem(d);
+    tree.addItem(e);
+    tree.addItem(f);
     b.addItem(ba);
     b.addItem(bb);
     bb.addItem(bba);
     b.addItem(bc);
-    return t;
+
+    // Focus checks
+    DelegatingFocusPanel focus = new DelegatingFocusPanel();
+    focus.add(new Label("first check box should have focus "));
+    focus.add(new SimpleCheckBox());
+    focus.add(new SimpleCheckBox());
+
+    final DelegatingFocusPanel focus2 = new DelegatingFocusPanel();
+    focus2.add(new Label("second check box should have focus "));
+    focus2.add(new SimpleCheckBox());
+    focus2.add(new SimpleCheckBox());
+
+    TreeItem customFocus = new TreeItem(focus2) {
+      @Override
+      public Focusable getFocusable() {
+        return (Focusable) focus2.getWidget(2);
+      }
+    };
+    tree.addItem(focus);
+    tree.addItem(customFocus);
+    return tree;
   }
 
   @Override
diff --git a/samples/build.xml b/samples/build.xml
index 81d72a3..3d44771 100644
--- a/samples/build.xml
+++ b/samples/build.xml
@@ -51,9 +51,7 @@
       </antcall>
     </gwt.timer>
     <length property="gwt.sample.length">
-      <fileset dir="${gwt.build.out}/samples">
-        <include name="**/www/com*/**"/>
-      </fileset>
+      <fileset dir="${gwt.build.out}/samples" includes="*/war/*/*.cache.html,*/war/*/*.cache.js"/>
     </length>
     <echo message="compiled size of all samples is ${gwt.sample.length} bytes."/>
   </target>
diff --git a/samples/common.ant.xml b/samples/common.ant.xml
index 12df2bc..ef167f4 100755
--- a/samples/common.ant.xml
+++ b/samples/common.ant.xml
@@ -3,8 +3,8 @@
   <property name="project.tail" value="samples/${sample.root}" />
   <import file="${gwt.root}/common.ant.xml" />
 
-  <property name="sample.package" value="${sample.root}" />
-  <property name="sample.main" value="${sample.module}" />
+  <property name="sample.lower" value="${sample.root}" />
+  <property name="sample.upper" value="${sample.module}" />
 
   <property.ensure name="gwt.user.jar" location="${gwt.build.lib}/gwt-user.jar" />
   <!-- Platform shouldn't matter here, just picking one -->
@@ -13,18 +13,22 @@
   <!-- Mirror directory for scripts; makes building distro easier -->
   <property name="samples.scripts" value="${gwt.build.out}/samples-scripts" />
   <!-- Use the uppercase name rather than the lowercase name -->
-  <property name="sample.build" value="${gwt.build.out}/samples/${sample.main}" />
+  <property name="sample.build" value="${gwt.build.out}/samples/${sample.upper}" />
 
   <target name="source" description="Copy source to the output folder">
     <mkdir dir="${sample.build}/src" />
     <copy todir="${sample.build}/src">
       <fileset dir="src" />
     </copy>
+    <mkdir dir="${sample.build}/war" />
+    <copy todir="${sample.build}/war">
+      <fileset dir="war" excludes="WEB-INF/classes/**"/>
+    </copy>
   </target>
 
   <target name="compile" description="Compile all java files">
-    <mkdir dir="${sample.build}/bin" />
-    <gwt.javac destdir="${sample.build}/bin">
+    <mkdir dir="${sample.build}/war/WEB-INF/classes" />
+    <gwt.javac destdir="${sample.build}/war/WEB-INF/classes">
       <classpath>
         <pathelement location="${gwt.user.jar}" />
         <pathelement location="${gwt.dev.jar}" />
@@ -36,48 +40,47 @@
     <outofdate>
       <sourcefiles>
         <fileset dir="src" />
-        <fileset dir="${sample.build}/bin" />
+        <fileset dir="${sample.build}/war/WEB-INF/classes" />
         <fileset file="${gwt.user.jar}" />
         <fileset file="${gwt.dev.jar}" />
       </sourcefiles>
-      <targetfiles path="${sample.build}/www/com.google.gwt.sample.${sample.package}.${sample.module}/com.google.gwt.sample.${sample.package}.${sample.module}.nocache.js" />
+      <targetfiles path="${sample.build}/war/${sample.lower}/${sample.lower}.nocache.js" />
       <sequential>
-        <mkdir dir="${sample.build}/www" />
-        <gwt.timer name="${sample.main}">
-          <java dir="${sample.build}" classname="com.google.gwt.dev.GWTCompiler" classpath="src:${sample.build}/bin:${gwt.user.jar}:${gwt.dev.jar}" fork="yes" failonerror="true">
+        <mkdir dir="${sample.build}/war" />
+        <gwt.timer name="${sample.upper}">
+          <java dir="${sample.build}" classname="com.google.gwt.dev.Compiler" classpath="src:${sample.build}/war/WEB-INF/classes:${gwt.user.jar}:${gwt.dev.jar}" fork="yes" failonerror="true">
             <jvmarg value="-Xmx256M"/>
-            <arg value="-out" />
-            <arg file="${sample.build}/www" />
-            <arg value="com.google.gwt.sample.${sample.package}.${sample.module}" />
+            <arg value="-war" />
+            <arg file="${sample.build}/war" />
+            <arg value="com.google.gwt.sample.${sample.lower}.${sample.upper}" />
           </java>
         </gwt.timer>
         <length property="sample.size">
-          <fileset dir="${sample.build}/www/com.google.gwt.sample.${sample.package}.${sample.module}"/>
+          <fileset dir="${sample.build}/war/${sample.lower}" includes="*.cache.html,*.cache.js"/>
         </length>
-        <echo message="output size for ${sample.main} is ${sample.size} bytes"/>
+        <echo message="output size for ${sample.upper} is ${sample.size} bytes"/>
       </sequential>
     </outofdate>
   </target>
 
-  <macrodef name="applicationCreator">
+  <macrodef name="webAppCreator">
     <attribute name="platform" />
     <attribute name="extension" default="" />
     <sequential>
       <outofdate>
         <sourcefiles />
         <targetfiles>
-          <pathelement location="${samples.scripts}/@{platform}/${sample.main}/${sample.main}-compile@{extension}" />
-          <pathelement location="${samples.scripts}/@{platform}/${sample.main}/${sample.main}-shell@{extension}" />
+          <pathelement location="${samples.scripts}/@{platform}/${sample.upper}/build.xml" />
         </targetfiles>
         <sequential>
-          <mkdir dir="${samples.scripts}/@{platform}/${sample.main}" />
-          <java classname="com.google.gwt.user.tools.ApplicationCreator" classpath="${gwt.user.jar}:${gwt.dev.jar}" failonerror="true">
+          <mkdir dir="${samples.scripts}/@{platform}/${sample.upper}" />
+          <java classname="com.google.gwt.user.tools.WebAppCreator" classpath="${gwt.user.jar}:${gwt.dev.jar}" failonerror="true">
             <!-- Relative path is important! Paths will be relative in final distro -->
             <sysproperty key="gwt.devjar" value="../../gwt-dev-@{platform}.jar" />
-            <arg value="-ignore" />
+            <arg value="-overwrite" />
             <arg value="-out" />
-            <arg file="${samples.scripts}/@{platform}/${sample.main}" />
-            <arg value="com.google.gwt.sample.${sample.package}.client.${sample.main}" />
+            <arg file="${samples.scripts}/@{platform}/${sample.upper}" />
+            <arg value="com.google.gwt.sample.${sample.lower}.${sample.upper}" />
           </java>
         </sequential>
       </outofdate>
@@ -85,9 +88,9 @@
   </macrodef>
 
   <target name="scripts" description="Create launch scripts">
-    <applicationCreator platform="linux" />
-    <applicationCreator platform="windows" extension=".cmd" />
-    <applicationCreator platform="mac" />
+    <webAppCreator platform="linux" />
+    <webAppCreator platform="windows" extension=".cmd" />
+    <webAppCreator platform="mac" />
   </target>
 
   <target name="build" depends="source, compile, gwtc, scripts" description="Build and package this project" />
@@ -102,7 +105,7 @@
     <delete dir="${sample.build}" />
     <delete includeemptydirs="true">
       <fileset dir="${samples.scripts}">
-        <include name="*/${sample.main}/**" />
+        <include name="*/${sample.upper}/**" />
       </fileset>
     </delete>
   </target>
diff --git a/samples/dynatable/src/com/google/gwt/sample/dynatable/DynaTable.gwt.xml b/samples/dynatable/src/com/google/gwt/sample/dynatable/DynaTable.gwt.xml
index a23f676..137a008 100644
--- a/samples/dynatable/src/com/google/gwt/sample/dynatable/DynaTable.gwt.xml
+++ b/samples/dynatable/src/com/google/gwt/sample/dynatable/DynaTable.gwt.xml
@@ -12,7 +12,7 @@
 <!-- implied. License for the specific language governing permissions and   -->
 <!-- limitations under the License.                                         -->
 
-<module>
+<module rename-to="dynatable">
 	<inherits name='com.google.gwt.user.User'/>
 	<entry-point class='com.google.gwt.sample.dynatable.client.DynaTable'/>
 	<servlet path='/calendar' class='com.google.gwt.sample.dynatable.server.SchoolCalendarServiceImpl'/>
diff --git a/samples/dynatable/src/com/google/gwt/sample/dynatable/DynaTable2.gwt.xml b/samples/dynatable/src/com/google/gwt/sample/dynatable/DynaTable2.gwt.xml
deleted file mode 100644
index 64a55e8..0000000
--- a/samples/dynatable/src/com/google/gwt/sample/dynatable/DynaTable2.gwt.xml
+++ /dev/null
@@ -1,20 +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   -->
-<!-- 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. License for the specific language governing permissions and   -->
-<!-- limitations under the License.                                         -->
-
-<module rename-to="dynatable" deploy-to="/gwtc">
-	<inherits name='com.google.gwt.user.User'/>
-	<entry-point class='com.google.gwt.sample.dynatable.client.DynaTable'/>
-</module>
-
-
diff --git a/samples/dynatable/src/com/google/gwt/sample/dynatable/public/DynaTable.css b/samples/dynatable/war/DynaTable.css
similarity index 100%
rename from samples/dynatable/src/com/google/gwt/sample/dynatable/public/DynaTable.css
rename to samples/dynatable/war/DynaTable.css
diff --git a/samples/dynatable/src/com/google/gwt/sample/dynatable/public/DynaTable.html b/samples/dynatable/war/DynaTable.html
similarity index 93%
rename from samples/dynatable/src/com/google/gwt/sample/dynatable/public/DynaTable.html
rename to samples/dynatable/war/DynaTable.html
index 7df5ec8..8ede80d 100644
--- a/samples/dynatable/src/com/google/gwt/sample/dynatable/public/DynaTable.html
+++ b/samples/dynatable/war/DynaTable.html
@@ -21,7 +21,7 @@
   </head>
   <body>
   <iframe src="javascript:''" id='__gwt_historyFrame' tabIndex='-1' style='width:0;height:0;border:0'></iframe>
-	<script type="text/javascript" language='javascript' src='com.google.gwt.sample.dynatable.DynaTable.nocache.js'></script>
+	<script type="text/javascript" language='javascript' src='dynatable/dynatable.nocache.js'></script>
     <h1>School Schedule for Professors and Students</h1>
     <table width="100%" border="0" summary="School Schedule for Professors and Students">
       <tr valign="top">
diff --git a/samples/dynatable/war/WEB-INF/classes/marker b/samples/dynatable/war/WEB-INF/classes/marker
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/samples/dynatable/war/WEB-INF/classes/marker
diff --git a/samples/dynatable/war/WEB-INF/web.xml b/samples/dynatable/war/WEB-INF/web.xml
new file mode 100644
index 0000000..d1b2b78
--- /dev/null
+++ b/samples/dynatable/war/WEB-INF/web.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<web-app>
+
+	<servlet>
+		<servlet-name>calendar</servlet-name>
+		<servlet-class>
+			com.google.gwt.sample.dynatable.server.SchoolCalendarServiceImpl
+		</servlet-class>
+	</servlet>
+	<servlet-mapping>
+		<servlet-name>calendar</servlet-name>
+		<url-pattern>/dynatable/calendar</url-pattern>
+	</servlet-mapping>
+
+</web-app>
diff --git a/samples/hello/src/com/google/gwt/sample/hello/Hello.gwt.xml b/samples/hello/src/com/google/gwt/sample/hello/Hello.gwt.xml
index 8cc53cd..e5432b9 100644
--- a/samples/hello/src/com/google/gwt/sample/hello/Hello.gwt.xml
+++ b/samples/hello/src/com/google/gwt/sample/hello/Hello.gwt.xml
@@ -12,7 +12,7 @@
 <!-- implied. License for the specific language governing permissions and   -->
 <!-- limitations under the License.                                         -->
 
-<module>
+<module rename-to="hello">
 	<inherits name="com.google.gwt.user.User"/>
 	<entry-point class="com.google.gwt.sample.hello.client.Hello"/>
 </module>
diff --git a/samples/hello/src/com/google/gwt/sample/hello/public/Hello.html b/samples/hello/war/Hello.html
similarity index 91%
rename from samples/hello/src/com/google/gwt/sample/hello/public/Hello.html
rename to samples/hello/war/Hello.html
index eeedb3c..ba2d093 100644
--- a/samples/hello/src/com/google/gwt/sample/hello/public/Hello.html
+++ b/samples/hello/war/Hello.html
@@ -19,6 +19,6 @@
     <title>Hello</title>
   </head>
   <body bgcolor="white"> 
-    <script type="text/javascript" language="javascript" src="com.google.gwt.sample.hello.Hello.nocache.js"></script>
+    <script type="text/javascript" language="javascript" src="hello/hello.nocache.js"></script>
   </body>
 </html>
diff --git a/samples/hello/war/WEB-INF/classes/marker b/samples/hello/war/WEB-INF/classes/marker
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/samples/hello/war/WEB-INF/classes/marker
diff --git a/samples/i18n/src/com/google/gwt/sample/i18n/I18N.gwt.xml b/samples/i18n/src/com/google/gwt/sample/i18n/I18N.gwt.xml
index 69e34a2..ae0afae 100644
--- a/samples/i18n/src/com/google/gwt/sample/i18n/I18N.gwt.xml
+++ b/samples/i18n/src/com/google/gwt/sample/i18n/I18N.gwt.xml
@@ -12,7 +12,7 @@
 <!-- implied. License for the specific language governing permissions and   -->
 <!-- limitations under the License.                                         -->
 
-<module>
+<module rename-to="i18n">
 	<inherits name="com.google.gwt.user.User" />
     <inherits name="com.google.gwt.i18n.I18N"/>
 	<entry-point class="com.google.gwt.sample.i18n.client.I18N" />
diff --git a/samples/i18n/src/com/google/gwt/sample/i18n/public/I18N.css b/samples/i18n/war/I18N.css
similarity index 100%
rename from samples/i18n/src/com/google/gwt/sample/i18n/public/I18N.css
rename to samples/i18n/war/I18N.css
diff --git a/samples/i18n/src/com/google/gwt/sample/i18n/public/I18N.html b/samples/i18n/war/I18N.html
similarity index 99%
rename from samples/i18n/src/com/google/gwt/sample/i18n/public/I18N.html
rename to samples/i18n/war/I18N.html
index fa1e8cc..93435c3 100644
--- a/samples/i18n/src/com/google/gwt/sample/i18n/public/I18N.html
+++ b/samples/i18n/war/I18N.html
@@ -38,7 +38,7 @@
 <title>Internationalization Sample</title>
 
 <script type="text/javascript" language="javascript"
-  src="com.google.gwt.sample.i18n.I18N.nocache.js"></script>
+  src="i18n/i18n.nocache.js"></script>
 
 </head>
 
diff --git a/samples/i18n/war/WEB-INF/classes/marker b/samples/i18n/war/WEB-INF/classes/marker
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/samples/i18n/war/WEB-INF/classes/marker
diff --git a/samples/json/src/com/google/gwt/sample/json/JSON.gwt.xml b/samples/json/src/com/google/gwt/sample/json/JSON.gwt.xml
index a0b8262..a8c264b 100644
--- a/samples/json/src/com/google/gwt/sample/json/JSON.gwt.xml
+++ b/samples/json/src/com/google/gwt/sample/json/JSON.gwt.xml
@@ -12,7 +12,7 @@
 <!-- implied. License for the specific language governing permissions and   -->
 <!-- limitations under the License.                                         -->
 
-<module>
+<module rename-to="json">
 	<inherits name='com.google.gwt.user.User'/>
 	<inherits name='com.google.gwt.http.HTTP'/>
 	<inherits name='com.google.gwt.json.JSON'/>
diff --git a/samples/json/src/com/google/gwt/sample/json/client/JSON.java b/samples/json/src/com/google/gwt/sample/json/client/JSON.java
index 7c20f98..47b16d7 100644
--- a/samples/json/src/com/google/gwt/sample/json/client/JSON.java
+++ b/samples/json/src/com/google/gwt/sample/json/client/JSON.java
@@ -15,6 +15,7 @@
  */
 package com.google.gwt.sample.json.client;
 
+import com.google.gwt.core.client.GWT;
 import com.google.gwt.event.dom.client.ClickEvent;
 import com.google.gwt.event.dom.client.ClickHandler;
 import com.google.gwt.http.client.Request;
@@ -50,7 +51,6 @@
   /**
    * Class for handling the response text associated with a request for a JSON
    * object.
-   * 
    */
   private class JSONResponseTextHandler implements RequestCallback {
     public void onError(Request request, Throwable exception) {
@@ -84,13 +84,11 @@
    * Default URL to use to fetch JSON objects. Note that the contents of this
    * JSON result were as a result of requesting the following URL:
    * 
-   * 
-   * 
-   * 
    * http://api.search.yahoo.com/ImageSearchService/V1/imageSearch?appid=YahooDemo
    * &query=potato&results=2&output=json
    */
-  private static final String DEFAULT_SEARCH_URL = "search-results.js";
+  private static final String DEFAULT_SEARCH_URL = GWT.getModuleBaseURL()
+      + "search-results.js";
 
   /*
    * Text displayed on the fetch button when we are in a default state.
@@ -102,14 +100,14 @@
    */
   private static final String SEARCH_BUTTON_WAITING_TEXT = "Waiting for JSON Response...";
 
+  private Tree jsonTree = new Tree();
+
   /*
    * RequestBuilder used to issue HTTP GET requests.
    */
   private final RequestBuilder requestBuilder = new RequestBuilder(
       RequestBuilder.GET, DEFAULT_SEARCH_URL);
 
-  private Tree jsonTree = new Tree();
-
   private Button searchButton = new Button();
 
   /**
diff --git a/samples/json/src/com/google/gwt/sample/json/public/JSON.css b/samples/json/war/JSON.css
similarity index 100%
rename from samples/json/src/com/google/gwt/sample/json/public/JSON.css
rename to samples/json/war/JSON.css
diff --git a/samples/json/src/com/google/gwt/sample/json/public/JSON.html b/samples/json/war/JSON.html
similarity index 92%
rename from samples/json/src/com/google/gwt/sample/json/public/JSON.html
rename to samples/json/war/JSON.html
index b3367e6..fd38344 100644
--- a/samples/json/src/com/google/gwt/sample/json/public/JSON.html
+++ b/samples/json/war/JSON.html
@@ -16,12 +16,11 @@
 <html>
 	<head>
 		<meta http-equiv="content-type" content="text/html; charset=UTF-8">
-                <link type="text/css" rel='stylesheet' href='JSON.css'>
+		<link type="text/css" rel='stylesheet' href='JSON.css'>
 		<title>JSON Interoperability Example</title>
 	</head>
 	<body>
-		<script type="text/javascript" language='javascript' 
-                        src='com.google.gwt.sample.json.JSON.nocache.js'></script>
+		<script type="text/javascript" language='javascript' src='json/json.nocache.js'></script>
 		
 		<h1>JSON Interop Using JSNI</h1>
 		
diff --git a/samples/json/war/WEB-INF/classes/marker b/samples/json/war/WEB-INF/classes/marker
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/samples/json/war/WEB-INF/classes/marker
diff --git a/samples/mail/src/com/google/gwt/sample/mail/Mail.gwt.xml b/samples/mail/src/com/google/gwt/sample/mail/Mail.gwt.xml
index ac13a60..6cca2a8 100644
--- a/samples/mail/src/com/google/gwt/sample/mail/Mail.gwt.xml
+++ b/samples/mail/src/com/google/gwt/sample/mail/Mail.gwt.xml
@@ -12,8 +12,7 @@
 <!-- implied. License for the specific language governing permissions and   -->
 <!-- limitations under the License.                                         -->
 
-<module>
+<module rename-to="mail">
 	<inherits name='com.google.gwt.user.User'/>
 	<entry-point class='com.google.gwt.sample.mail.client.Mail'/>
-	<stylesheet src='Mail.css'/>
 </module>
diff --git a/samples/mail/src/com/google/gwt/sample/mail/client/Shortcuts.java b/samples/mail/src/com/google/gwt/sample/mail/client/Shortcuts.java
index 211aafe..c58b71a 100644
--- a/samples/mail/src/com/google/gwt/sample/mail/client/Shortcuts.java
+++ b/samples/mail/src/com/google/gwt/sample/mail/client/Shortcuts.java
@@ -51,9 +51,9 @@
    */
   public Shortcuts(Images images) {
     // Create the groups within the stack panel.
-    add(images, new Mailboxes(images), images.mailgroup(), "Mail");
-    add(images, new Tasks(), images.tasksgroup(), "Tasks");
-    add(images, new Contacts(images), images.contactsgroup(), "Contacts");
+    add(new Mailboxes(images), images.mailgroup(), "Mail");
+    add(new Tasks(), images.tasksgroup(), "Tasks");
+    add(new Contacts(images), images.contactsgroup(), "Contacts");
 
     initWidget(stackPanel);
   }
@@ -64,8 +64,8 @@
     stackPanel.showStack(0);
   }
 
-  private void add(Images images, Widget widget,
-      AbstractImagePrototype imageProto, String caption) {
+  private void add(Widget widget, AbstractImagePrototype imageProto,
+      String caption) {
     widget.addStyleName("mail-StackContent");
     stackPanel.add(widget, createHeaderHTML(imageProto, caption), true);
   }
diff --git a/samples/mail/src/com/google/gwt/sample/mail/public/Mail.css b/samples/mail/war/Mail.css
similarity index 100%
rename from samples/mail/src/com/google/gwt/sample/mail/public/Mail.css
rename to samples/mail/war/Mail.css
diff --git a/samples/mail/src/com/google/gwt/sample/mail/public/Mail.html b/samples/mail/war/Mail.html
similarity index 88%
rename from samples/mail/src/com/google/gwt/sample/mail/public/Mail.html
rename to samples/mail/war/Mail.html
index 2fd2947..8f34e6e 100644
--- a/samples/mail/src/com/google/gwt/sample/mail/public/Mail.html
+++ b/samples/mail/war/Mail.html
@@ -15,10 +15,10 @@
 <html>
   <head>
     <meta http-equiv="content-type" content="text/html; charset=UTF-8">
+    <link type="text/css" rel='stylesheet' href='Mail.css'>
     <title>Mail App</title>
   </head>
   <body>
-    <script type="text/javascript" language='javascript'
-      src='com.google.gwt.sample.mail.Mail.nocache.js'></script>
+    <script type="text/javascript" language='javascript' src='mail/mail.nocache.js'></script>
   </body>
 </html>
diff --git a/samples/mail/war/WEB-INF/classes/marker b/samples/mail/war/WEB-INF/classes/marker
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/samples/mail/war/WEB-INF/classes/marker
diff --git a/samples/mail/src/com/google/gwt/sample/mail/public/gradient.gif b/samples/mail/war/gradient.gif
similarity index 100%
rename from samples/mail/src/com/google/gwt/sample/mail/public/gradient.gif
rename to samples/mail/war/gradient.gif
Binary files differ
diff --git a/samples/mail/src/com/google/gwt/sample/mail/public/leftCorner.gif b/samples/mail/war/leftCorner.gif
similarity index 100%
rename from samples/mail/src/com/google/gwt/sample/mail/public/leftCorner.gif
rename to samples/mail/war/leftCorner.gif
Binary files differ
diff --git a/samples/mail/src/com/google/gwt/sample/mail/public/rightCorner.gif b/samples/mail/war/rightCorner.gif
similarity index 100%
rename from samples/mail/src/com/google/gwt/sample/mail/public/rightCorner.gif
rename to samples/mail/war/rightCorner.gif
Binary files differ
diff --git a/samples/showcase/src/com/google/gwt/sample/showcase/Showcase.gwt.xml b/samples/showcase/src/com/google/gwt/sample/showcase/Showcase.gwt.xml
index d25810a..4a3b79f 100644
--- a/samples/showcase/src/com/google/gwt/sample/showcase/Showcase.gwt.xml
+++ b/samples/showcase/src/com/google/gwt/sample/showcase/Showcase.gwt.xml
@@ -1,4 +1,4 @@
-<module>
+<module rename-to="showcase">
   <!-- Inherit the core Web Toolkit stuff. -->
   <inherits name="com.google.gwt.core.Core"/>
   <inherits name='com.google.gwt.user.User'/>
diff --git a/samples/showcase/src/com/google/gwt/sample/showcase/public/Showcase.html b/samples/showcase/war/Showcase.html
similarity index 81%
rename from samples/showcase/src/com/google/gwt/sample/showcase/public/Showcase.html
rename to samples/showcase/war/Showcase.html
index 0f4f1c9..33c7752 100644
--- a/samples/showcase/src/com/google/gwt/sample/showcase/public/Showcase.html
+++ b/samples/showcase/war/Showcase.html
@@ -10,7 +10,7 @@
         lastLogOn: "2/2/2006"
       };
     </script>
-    <script language='javascript' src='com.google.gwt.sample.showcase.Showcase.nocache.js'></script>
+    <script language='javascript' src='showcase/showcase.nocache.js'></script>
   </head>
   <body>
     <iframe src="javascript:''" id="__gwt_historyFrame" style="position:absolute;width:0;height:0;border:0"></iframe>
diff --git a/samples/showcase/war/WEB-INF/classes/marker b/samples/showcase/war/WEB-INF/classes/marker
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/samples/showcase/war/WEB-INF/classes/marker
diff --git a/samples/simplerpc/src/com/google/gwt/sample/simplerpc/SimpleRPC.gwt.xml b/samples/simplerpc/src/com/google/gwt/sample/simplerpc/SimpleRPC.gwt.xml
index 76b3778..deee741 100644
--- a/samples/simplerpc/src/com/google/gwt/sample/simplerpc/SimpleRPC.gwt.xml
+++ b/samples/simplerpc/src/com/google/gwt/sample/simplerpc/SimpleRPC.gwt.xml
@@ -12,10 +12,8 @@
 <!-- implied. License for the specific language governing permissions and   -->
 <!-- limitations under the License.                                         -->
 
-<module>
+<module rename-to="simplerpc">
 	<inherits name='com.google.gwt.user.User'/>
 	<entry-point class='com.google.gwt.sample.simplerpc.client.SimpleRPC'/>
 	<servlet path='/simpleRPC' class='com.google.gwt.sample.simplerpc.server.SimpleRPCServiceImpl'/>
 </module>
-
-
diff --git a/samples/simplerpc/src/com/google/gwt/sample/simplerpc/client/SimpleRPC.java b/samples/simplerpc/src/com/google/gwt/sample/simplerpc/client/SimpleRPC.java
index 18a1cc1..c405009 100644
--- a/samples/simplerpc/src/com/google/gwt/sample/simplerpc/client/SimpleRPC.java
+++ b/samples/simplerpc/src/com/google/gwt/sample/simplerpc/client/SimpleRPC.java
@@ -19,7 +19,6 @@
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.user.client.Window;
 import com.google.gwt.user.client.rpc.AsyncCallback;
-import com.google.gwt.user.client.rpc.ServiceDefTarget;
 import com.google.gwt.user.client.ui.FlexTable;
 import com.google.gwt.user.client.ui.HTML;
 import com.google.gwt.user.client.ui.Panel;
@@ -142,21 +141,6 @@
    * the asynchronous interface automatically.
    */
   private SimpleRPCServiceAsync createSimpleRPCServiceAsync() {
-    SimpleRPCServiceAsync simpleRPCService = GWT.create(SimpleRPCService.class);
-    setServiceURL(simpleRPCService);
-    return simpleRPCService;
-  }
-
-  /**
-   * Sets the URL where our service implementation is running.
-   * <p>
-   * Note that due to the same origin security policy enforced by the browser
-   * implementations the target URL must reside on the same domain, port and
-   * protocol from which the host page was served.
-   */
-  private void setServiceURL(SimpleRPCServiceAsync simpleRPCService) {
-    ServiceDefTarget endpoint = (ServiceDefTarget) simpleRPCService;
-    String moduleRelativeURL = GWT.getModuleBaseURL() + "simpleRPC";
-    endpoint.setServiceEntryPoint(moduleRelativeURL);
+    return GWT.<SimpleRPCServiceAsync> create(SimpleRPCService.class);
   }
 }
diff --git a/samples/simplerpc/src/com/google/gwt/sample/simplerpc/client/SimpleRPCException.java b/samples/simplerpc/src/com/google/gwt/sample/simplerpc/client/SimpleRPCException.java
index 9fa5b8f..4b646d3 100644
--- a/samples/simplerpc/src/com/google/gwt/sample/simplerpc/client/SimpleRPCException.java
+++ b/samples/simplerpc/src/com/google/gwt/sample/simplerpc/client/SimpleRPCException.java
@@ -13,24 +13,23 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-
 package com.google.gwt.sample.simplerpc.client;
 
-import com.google.gwt.user.client.rpc.SerializableException;
-
 /**
  * Simple RPC exception.
  */
-public class SimpleRPCException extends SerializableException {
+public class SimpleRPCException extends Exception {
 
-  /** 
-   * Constructor for <code>SimpleRPCException</code>. Needed to support serialization.
+  /**
+   * Constructor for <code>SimpleRPCException</code>. Needed to support
+   * serialization.
    */
   public SimpleRPCException() {
   }
 
   /**
    * Constructor for <code>SimpleRPCException</code>.
+   * 
    * @param message message for the <code>SimplePRCException</code>
    */
   public SimpleRPCException(String message) {
diff --git a/samples/simplerpc/src/com/google/gwt/sample/simplerpc/client/SimpleRPCService.java b/samples/simplerpc/src/com/google/gwt/sample/simplerpc/client/SimpleRPCService.java
index 8911550..93e9ce7 100644
--- a/samples/simplerpc/src/com/google/gwt/sample/simplerpc/client/SimpleRPCService.java
+++ b/samples/simplerpc/src/com/google/gwt/sample/simplerpc/client/SimpleRPCService.java
@@ -16,6 +16,7 @@
 package com.google.gwt.sample.simplerpc.client;
 
 import com.google.gwt.user.client.rpc.RemoteService;
+import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;
 
 import java.util.List;
 import java.util.Map;
@@ -23,6 +24,7 @@
 /**
  * The sample service.
  */
+@RemoteServiceRelativePath("simpleRPC")
 public interface SimpleRPCService extends RemoteService {
   /**
    * Returns a string from the server associated with the given index.
@@ -36,9 +38,6 @@
   /**
    * Given a list of indexes, returns a map of indexes --> string values.
    * 
-   * @gwt.typeArgs indexes <java.lang.Integer>
-   * @gwt.typeArgs <java.lang.String> 
-   *
    * @param indexes indexes to be mapped
    * @return map of indexes --> string values
    */
diff --git a/samples/simplerpc/src/com/google/gwt/sample/simplerpc/public/SimpleRPC.css b/samples/simplerpc/war/SimpleRPC.css
similarity index 100%
rename from samples/simplerpc/src/com/google/gwt/sample/simplerpc/public/SimpleRPC.css
rename to samples/simplerpc/war/SimpleRPC.css
diff --git a/samples/simplerpc/src/com/google/gwt/sample/simplerpc/public/SimpleRPC.html b/samples/simplerpc/war/SimpleRPC.html
similarity index 92%
rename from samples/simplerpc/src/com/google/gwt/sample/simplerpc/public/SimpleRPC.html
rename to samples/simplerpc/war/SimpleRPC.html
index 5e4e762..2b9f758 100644
--- a/samples/simplerpc/src/com/google/gwt/sample/simplerpc/public/SimpleRPC.html
+++ b/samples/simplerpc/war/SimpleRPC.html
@@ -21,8 +21,7 @@
 	</head>
 	<body>
 		<iframe src="javascript:''" id='__gwt_historyFrame' tabIndex='-1' style='width:0;height:0;border:0'></iframe>
-		<script type="text/javascript" language='javascript' src='com.google.gwt.sample.simplerpc.SimpleRPC.nocache.js'>
-    </script>
+		<script type="text/javascript" language='javascript' src='simplerpc/simplerpc.nocache.js'></script>
 		<h1> Simple RPC</h1>
 		<p>
 		  Simple example of RPC, check out the DynaTable sample if you want to see real RPC coolness. 
diff --git a/samples/simplerpc/war/WEB-INF/classes/marker b/samples/simplerpc/war/WEB-INF/classes/marker
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/samples/simplerpc/war/WEB-INF/classes/marker
diff --git a/samples/simplerpc/war/WEB-INF/web.xml b/samples/simplerpc/war/WEB-INF/web.xml
new file mode 100644
index 0000000..30af99f
--- /dev/null
+++ b/samples/simplerpc/war/WEB-INF/web.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<web-app>
+
+	<servlet>
+		<servlet-name>simpleRPC</servlet-name>
+		<servlet-class>
+			com.google.gwt.sample.simplerpc.server.SimpleRPCServiceImpl
+		</servlet-class>
+	</servlet>
+	<servlet-mapping>
+		<servlet-name>simpleRPC</servlet-name>
+		<url-pattern>/simplerpc/simpleRPC</url-pattern>
+	</servlet-mapping>
+
+</web-app>
diff --git a/samples/simplexml/src/com/google/gwt/sample/simplexml/SimpleXML.gwt.xml b/samples/simplexml/src/com/google/gwt/sample/simplexml/SimpleXML.gwt.xml
index 2f0ddfc..7d531a4 100644
--- a/samples/simplexml/src/com/google/gwt/sample/simplexml/SimpleXML.gwt.xml
+++ b/samples/simplexml/src/com/google/gwt/sample/simplexml/SimpleXML.gwt.xml
@@ -12,7 +12,7 @@
 <!-- implied. License for the specific language governing permissions and   -->
 <!-- limitations under the License.                                         -->
 
-<module>
+<module rename-to="simplexml">
 	<inherits name="com.google.gwt.user.User"/>
 	<inherits name ="com.google.gwt.http.HTTP"/>
 	<inherits name ="com.google.gwt.xml.XML"/>
diff --git a/samples/simplexml/src/com/google/gwt/sample/simplexml/public/SimpleXML.css b/samples/simplexml/war/SimpleXML.css
similarity index 100%
rename from samples/simplexml/src/com/google/gwt/sample/simplexml/public/SimpleXML.css
rename to samples/simplexml/war/SimpleXML.css
diff --git a/samples/simplexml/src/com/google/gwt/sample/simplexml/public/SimpleXML.html b/samples/simplexml/war/SimpleXML.html
similarity index 91%
rename from samples/simplexml/src/com/google/gwt/sample/simplexml/public/SimpleXML.html
rename to samples/simplexml/war/SimpleXML.html
index 6c2ba07..c134c61 100644
--- a/samples/simplexml/src/com/google/gwt/sample/simplexml/public/SimpleXML.html
+++ b/samples/simplexml/war/SimpleXML.html
@@ -20,8 +20,7 @@
 		<link rel="stylesheet" type="text/css" href="SimpleXML.css">
 	</head>
 	<body bgcolor="white"> 
-		<script type="text/javascript" language="javascript" src="com.google.gwt.sample.simplexml.SimpleXML.nocache.js">
-		</script>
+		<script type="text/javascript" language="javascript" src="simplexml/simplexml.nocache.js"></script>
 		<h1> Simple XML Example</h1>
 		<p>
 		  Simple example of loading an XML file from the server and parsing it.
diff --git a/samples/simplexml/war/WEB-INF/classes/marker b/samples/simplexml/war/WEB-INF/classes/marker
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/samples/simplexml/war/WEB-INF/classes/marker
diff --git a/tools/api-checker/build.xml b/tools/api-checker/build.xml
index 8afcaea..52e8864 100755
--- a/tools/api-checker/build.xml
+++ b/tools/api-checker/build.xml
@@ -37,7 +37,6 @@
     <mkdir dir="${gwt.build.lib}" />
                     
     <gwt.jar>
-      <fileset dir="src" excludes="**/package.html" />
       <fileset dir="${javac.out}" />
     </gwt.jar>
   </target>
diff --git a/tools/api-checker/config/gwt15_16userApi.conf b/tools/api-checker/config/gwt15_16userApi.conf
index e55f642..020f74a 100644
--- a/tools/api-checker/config/gwt15_16userApi.conf
+++ b/tools/api-checker/config/gwt15_16userApi.conf
@@ -3,8 +3,38 @@
 dirRoot_old @OLDROOT@/
 name_old gwt15userApi
 #sourceFiles and excludedFiles are specified as colon-separated list of files
-sourceFiles_old dev/core/super:user/src:user/super
-excludedFiles_old user/src/com/google/gwt/benchmarks:user/src/com/google/gwt/i18n/rebind:user/src/com/google/gwt/i18n/tools:user/src/com/google/gwt/json:user/src/com/google/gwt/junit:user/src/com/google/gwt/user/client/rpc/core/java/util/LinkedHashMap_CustomFieldSerializer.java:user/src/com/google/gwt/user/rebind:user/src/com/google/gwt/user/server:user/src/com/google/gwt/user/tools:user/super/com/google/gwt/benchmarks:user/super/com/google/gwt/junit
+sourceFiles_old dev/core/super\
+:user/src\
+:user/super\
+
+excludedFiles_old user/src/com/google/gwt/benchmarks/BenchmarkReport.java\
+:user/src/com/google/gwt/benchmarks/BenchmarkShell.java\
+:user/src/com/google/gwt/benchmarks/client/Benchmark.java\
+:user/src/com/google/gwt/benchmarks/rebind\
+:user/src/com/google/gwt/i18n/rebind\
+:user/src/com/google/gwt/i18n/tools\
+:user/src/com/google/gwt/junit/GWTMockUtilities.java\
+:user/src/com/google/gwt/junit/GWTDummyBridge.java\
+:user/src/com/google/gwt/junit/JUnitMessageQueue.java\
+:user/src/com/google/gwt/junit/JUnitShell.java\
+:user/src/com/google/gwt/junit/RunStyle.java\
+:user/src/com/google/gwt/junit/RunStyleExternalBrowser.java\
+:user/src/com/google/gwt/junit/RunStyleLocalHosted.java\
+:user/src/com/google/gwt/junit/RunStyleLocalWeb.java\
+:user/src/com/google/gwt/junit/RunStyleManual.java\
+:user/src/com/google/gwt/junit/RunStyleRemote.java\
+:user/src/com/google/gwt/junit/RunStyleRemoteWeb.java\
+:user/src/com/google/gwt/junit/RunStyleSelenium.java\
+:user/src/com/google/gwt/junit/client/GWTTestCase.java\
+:user/src/com/google/gwt/junit/client/impl/GWTRunner.java\
+:user/src/com/google/gwt/junit/rebind\
+:user/src/com/google/gwt/junit/remote\
+:user/src/com/google/gwt/junit/server\
+:user/src/com/google/gwt/junit/tools\
+:user/src/com/google/gwt/user/client/rpc/core/java/util/LinkedHashMap_CustomFieldSerializer.java\
+:user/src/com/google/gwt/user/rebind\
+:user/src/com/google/gwt/user/server\
+:user/src/com/google/gwt/user/tools\
 
 ##############################################
 #new Api
@@ -12,12 +42,49 @@
 dirRoot_new ./
 name_new gwt16userApi
 #sourceFiles and excludedFiles are specified as colon-separated list of files
-sourceFiles_new dev/core/super:user/src:user/super
-excludedFiles_new user/src/com/google/gwt/benchmarks:user/src/com/google/gwt/i18n/rebind:user/src/com/google/gwt/i18n/tools:user/src/com/google/gwt/json:user/src/com/google/gwt/junit:user/src/com/google/gwt/user/client/rpc/core/java/util/LinkedHashMap_CustomFieldSerializer.java:user/src/com/google/gwt/user/rebind:user/src/com/google/gwt/user/server:user/src/com/google/gwt/user/tools:user/super/com/google/gwt/benchmarks:user/super/com/google/gwt/junit
+sourceFiles_new dev/core/super\
+:user/src\
+:user/super\
+
+excludedFiles_new user/src/com/google/gwt/benchmarks/BenchmarkReport.java\
+:user/src/com/google/gwt/benchmarks/BenchmarkShell.java\
+:user/src/com/google/gwt/benchmarks/client/Benchmark.java\
+:user/src/com/google/gwt/benchmarks/rebind\
+:user/src/com/google/gwt/i18n/rebind\
+:user/src/com/google/gwt/i18n/tools\
+:user/src/com/google/gwt/junit/GWTMockUtilities.java\
+:user/src/com/google/gwt/junit/GWTDummyBridge.java\
+:user/src/com/google/gwt/junit/JUnitMessageQueue.java\
+:user/src/com/google/gwt/junit/JUnitShell.java\
+:user/src/com/google/gwt/junit/RunStyle.java\
+:user/src/com/google/gwt/junit/RunStyleExternalBrowser.java\
+:user/src/com/google/gwt/junit/RunStyleLocalHosted.java\
+:user/src/com/google/gwt/junit/RunStyleLocalWeb.java\
+:user/src/com/google/gwt/junit/RunStyleManual.java\
+:user/src/com/google/gwt/junit/RunStyleRemote.java\
+:user/src/com/google/gwt/junit/RunStyleRemoteWeb.java\
+:user/src/com/google/gwt/junit/RunStyleSelenium.java\
+:user/src/com/google/gwt/junit/client/GWTTestCase.java\
+:user/src/com/google/gwt/junit/client/impl/GWTRunner.java\
+:user/src/com/google/gwt/junit/rebind\
+:user/src/com/google/gwt/junit/remote\
+:user/src/com/google/gwt/junit/server\
+:user/src/com/google/gwt/junit/tools\
+:user/src/com/google/gwt/user/client/rpc/core/java/util/LinkedHashMap_CustomFieldSerializer.java\
+:user/src/com/google/gwt/user/rebind\
+:user/src/com/google/gwt/user/server\
+:user/src/com/google/gwt/user/tools\
 
 ##############################################
 #excluded packages
-excludedPackages com.google.gwt.core.client.impl:com.google.gwt.i18n.client.impl:com.google.gwt.user.client.impl:com.google.gwt.user.client.rpc.impl:com.google.gwt.user.client.ui.impl:com.google.gwt.xml.client.impl
+excludedPackages com.google.gwt.core.client.impl\
+:com.google.gwt.i18n.client.impl\
+:com.google.gwt.i18n.client.impl.cldr\
+:com.google.gwt.i18n.client.impl.plurals\
+:com.google.gwt.user.client.impl\
+:com.google.gwt.user.client.rpc.impl\
+:com.google.gwt.user.client.ui.impl\
+:com.google.gwt.xml.client.impl\
 
 ##############################################
 #Api  whitelist
@@ -31,5 +98,6 @@
 # to be hard. Come back and fix this issue, if more such cases come up. 
 java.lang.StringBuilder::append(Ljava/lang/StringBuffer;) OVERRIDABLE_METHOD_ARGUMENT_TYPE_CHANGE
 com.google.gwt.user.client.ui.Button::Button(Ljava/lang/String;Lcom/google/gwt/user/client/ui/ClickListener;) OVERLOADED_METHOD_CALL
+com.google.gwt.user.client.ui.MultiWordSuggestOracle::addAll(Ljava/util/Collection;) FINAL_ADDED
 com.google.gwt.user.client.ui.ToggleButton::ToggleButton(Lcom/google/gwt/user/client/ui/Image;Lcom/google/gwt/user/client/ui/Image;Lcom/google/gwt/user/client/ui/ClickListener;) OVERLOADED_METHOD_CALL 
-com.google.gwt.user.client.ui.Tree::setImageBase(Ljava/lang/String;) MISSING
\ No newline at end of file
+com.google.gwt.user.client.ui.Tree::setImageBase(Ljava/lang/String;) MISSING
diff --git a/tools/api-checker/src/com/google/gwt/tools/apichecker/ApiCompatibilityChecker.java b/tools/api-checker/src/com/google/gwt/tools/apichecker/ApiCompatibilityChecker.java
index 30fb98b..ea1bbe2 100644
--- a/tools/api-checker/src/com/google/gwt/tools/apichecker/ApiCompatibilityChecker.java
+++ b/tools/api-checker/src/com/google/gwt/tools/apichecker/ApiCompatibilityChecker.java
@@ -784,8 +784,8 @@
     try {
       return new JarFile(str);
     } catch (IOException ex) {
-      System.err.println("exception in getting jar from name "
-          + ex.getMessage());
+      System.err.println("exception in getting jar from fileName: " + str
+          + ", message: " + ex.getMessage());
       return null;
     }
   }
@@ -858,7 +858,7 @@
         "com/google/gwt/dev/jjs/intrinsic/com/google/gwt/lang",
         "com/google/gwt/lang",}));
     cu = new JarFileCompilationUnits(new JarFile[] {gwtDevJar},
-        gwtIncludedPaths, null, logger);
+        gwtIncludedPaths, new HashSet<String>(), logger);
     units.addAll(cu.getCompilationUnits());
     return units;
   }
diff --git a/user/build.xml b/user/build.xml
index 0539253..a17f78a 100755
--- a/user/build.xml
+++ b/user/build.xml
@@ -10,6 +10,8 @@
   <fileset id="default.hosted.tests" dir="${javac.junit.out}" 
        includes="${gwt.junit.testcase.includes}" />
 
+  <fileset id="default.emma.tests" dir="${javac.junit.out}" 
+       includes="**/EmmaClassLoadingTest.class" />
   <!--
     Default web mode test cases
   -->
@@ -100,6 +102,12 @@
         <pathelement location="${gwt.build}/out/dev/core/bin-test" />
       </extraclasspaths>
     </gwt.junit>
+    <gwt.junit test.args="${test.args}" test.out="${junit.out}/${build.host.platform}-hosted-mode-emma" test.cases="default.emma.tests" >
+      <extraclasspaths>
+        <pathelement location="${gwt.build}/out/dev/core/bin-test" />
+        <pathelement location="${gwt.tools.redist}/emma/emma.jar" />
+      </extraclasspaths>
+    </gwt.junit>
   </target>
 
   <target name="test.web" depends="compile, compile.tests" description="Run only web-mode tests for this project.">
diff --git a/user/src/com/google/gwt/dom/client/DOMImplIE6.java b/user/src/com/google/gwt/dom/client/DOMImplIE6.java
index 36fad77..ba1dfaa 100644
--- a/user/src/com/google/gwt/dom/client/DOMImplIE6.java
+++ b/user/src/com/google/gwt/dom/client/DOMImplIE6.java
@@ -41,16 +41,28 @@
 
   @Override
   public native int getAbsoluteLeft(Element elem) /*-{
-    return (elem.getBoundingClientRect().left /
-      this.@com.google.gwt.dom.client.DOMImplIE6::getZoomMultiple()()) +
-      @com.google.gwt.user.client.impl.DocumentRootImpl::documentRoot.scrollLeft;
+    // getBoundingClientRect() throws a JS exception if the elem is not attached
+    // to the document, so we wrap it in a try/catch block
+    try {
+      return (elem.getBoundingClientRect().left /
+        this.@com.google.gwt.dom.client.DOMImplIE6::getZoomMultiple()()) +
+        @com.google.gwt.user.client.impl.DocumentRootImpl::documentRoot.scrollLeft;
+    } catch (e) {
+      return 0;
+    }
   }-*/;
 
   @Override
   public native int getAbsoluteTop(Element elem) /*-{
-    return (elem.getBoundingClientRect().top /
-      this.@com.google.gwt.dom.client.DOMImplIE6::getZoomMultiple()()) +
-      @com.google.gwt.user.client.impl.DocumentRootImpl::documentRoot.scrollTop;
+    // getBoundingClientRect() throws a JS exception if the elem is not attached
+    // to the document, so we wrap it in a try/catch block
+    try {
+      return (elem.getBoundingClientRect().top /
+        this.@com.google.gwt.dom.client.DOMImplIE6::getZoomMultiple()()) +
+        @com.google.gwt.user.client.impl.DocumentRootImpl::documentRoot.scrollTop;
+    } catch (e) {
+      return 0;
+    }
   }-*/;
 
   public native int getBodyOffsetLeft() /*-{
diff --git a/user/src/com/google/gwt/event/dom/client/BlurEvent.java b/user/src/com/google/gwt/event/dom/client/BlurEvent.java
index d641d2e..acbd82c 100644
--- a/user/src/com/google/gwt/event/dom/client/BlurEvent.java
+++ b/user/src/com/google/gwt/event/dom/client/BlurEvent.java
@@ -47,13 +47,13 @@
   }
 
   @Override
-  protected void dispatch(BlurHandler handler) {
-    handler.onBlur(this);
+  public final Type<BlurHandler> getAssociatedType() {
+    return TYPE;
   }
 
   @Override
-  protected final Type<BlurHandler> getAssociatedType() {
-    return TYPE;
+  protected void dispatch(BlurHandler handler) {
+    handler.onBlur(this);
   }
 
 }
diff --git a/user/src/com/google/gwt/event/dom/client/ChangeEvent.java b/user/src/com/google/gwt/event/dom/client/ChangeEvent.java
index 58b4278..f66f3cd 100644
--- a/user/src/com/google/gwt/event/dom/client/ChangeEvent.java
+++ b/user/src/com/google/gwt/event/dom/client/ChangeEvent.java
@@ -47,13 +47,13 @@
   }
 
   @Override
-  protected void dispatch(ChangeHandler handler) {
-    handler.onChange(this);
+  public final Type<ChangeHandler> getAssociatedType() {
+    return TYPE;
   }
 
   @Override
-  protected final Type<ChangeHandler> getAssociatedType() {
-    return TYPE;
+  protected void dispatch(ChangeHandler handler) {
+    handler.onChange(this);
   }
 
 }
diff --git a/user/src/com/google/gwt/event/dom/client/ClickEvent.java b/user/src/com/google/gwt/event/dom/client/ClickEvent.java
index 88f9a77..805c956 100644
--- a/user/src/com/google/gwt/event/dom/client/ClickEvent.java
+++ b/user/src/com/google/gwt/event/dom/client/ClickEvent.java
@@ -47,13 +47,13 @@
   }
 
   @Override
-  protected void dispatch(ClickHandler handler) {
-    handler.onClick(this);
+  public final Type<ClickHandler> getAssociatedType() {
+    return TYPE;
   }
 
   @Override
-  protected final Type<ClickHandler> getAssociatedType() {
-    return TYPE;
+  protected void dispatch(ClickHandler handler) {
+    handler.onClick(this);
   }
 
 }
diff --git a/user/src/com/google/gwt/event/dom/client/ContextMenuEvent.java b/user/src/com/google/gwt/event/dom/client/ContextMenuEvent.java
index 126ed99..513fd2b 100644
--- a/user/src/com/google/gwt/event/dom/client/ContextMenuEvent.java
+++ b/user/src/com/google/gwt/event/dom/client/ContextMenuEvent.java
@@ -47,13 +47,13 @@
   }
 
   @Override
-  protected void dispatch(ContextMenuHandler handler) {
-    handler.onContextMenu(this);
+  public final Type<ContextMenuHandler> getAssociatedType() {
+    return TYPE;
   }
 
   @Override
-  protected final Type<ContextMenuHandler> getAssociatedType() {
-    return TYPE;
+  protected void dispatch(ContextMenuHandler handler) {
+    handler.onContextMenu(this);
   }
 
 }
diff --git a/user/src/com/google/gwt/event/dom/client/DomEvent.java b/user/src/com/google/gwt/event/dom/client/DomEvent.java
index 7e2df65..b8b7135 100644
--- a/user/src/com/google/gwt/event/dom/client/DomEvent.java
+++ b/user/src/com/google/gwt/event/dom/client/DomEvent.java
@@ -131,6 +131,9 @@
 
   private Event nativeEvent;
 
+  @Override
+  public abstract DomEvent.Type<H> getAssociatedType();
+
   public final Event getNativeEvent() {
     assertLive();
     return nativeEvent;
@@ -161,7 +164,4 @@
     assertLive();
     nativeEvent.cancelBubble(true);
   }
-
-  @Override
-  protected abstract DomEvent.Type<H> getAssociatedType();
 }
diff --git a/user/src/com/google/gwt/event/dom/client/DoubleClickEvent.java b/user/src/com/google/gwt/event/dom/client/DoubleClickEvent.java
index 0d24cf4..972b645 100644
--- a/user/src/com/google/gwt/event/dom/client/DoubleClickEvent.java
+++ b/user/src/com/google/gwt/event/dom/client/DoubleClickEvent.java
@@ -47,13 +47,13 @@
   }
 
   @Override
-  protected void dispatch(DoubleClickHandler handler) {
-    handler.onDoubleClick(this);
+  public final Type<DoubleClickHandler> getAssociatedType() {
+    return TYPE;
   }
 
   @Override
-  protected final Type<DoubleClickHandler> getAssociatedType() {
-    return TYPE;
+  protected void dispatch(DoubleClickHandler handler) {
+    handler.onDoubleClick(this);
   }
 
 }
diff --git a/user/src/com/google/gwt/event/dom/client/ErrorEvent.java b/user/src/com/google/gwt/event/dom/client/ErrorEvent.java
index 62084de..0c9a007 100644
--- a/user/src/com/google/gwt/event/dom/client/ErrorEvent.java
+++ b/user/src/com/google/gwt/event/dom/client/ErrorEvent.java
@@ -47,13 +47,13 @@
   }
 
   @Override
-  protected void dispatch(ErrorHandler handler) {
-    handler.onError(this);
+  public final Type<ErrorHandler> getAssociatedType() {
+    return TYPE;
   }
 
   @Override
-  protected final Type<ErrorHandler> getAssociatedType() {
-    return TYPE;
+  protected void dispatch(ErrorHandler handler) {
+    handler.onError(this);
   }
 
 }
diff --git a/user/src/com/google/gwt/event/dom/client/FocusEvent.java b/user/src/com/google/gwt/event/dom/client/FocusEvent.java
index 898c03a..c2ca7bd 100644
--- a/user/src/com/google/gwt/event/dom/client/FocusEvent.java
+++ b/user/src/com/google/gwt/event/dom/client/FocusEvent.java
@@ -47,13 +47,13 @@
   }
 
   @Override
-  protected void dispatch(FocusHandler handler) {
-    handler.onFocus(this);
+  public final Type<FocusHandler> getAssociatedType() {
+    return TYPE;
   }
 
   @Override
-  protected final Type<FocusHandler> getAssociatedType() {
-    return TYPE;
+  protected void dispatch(FocusHandler handler) {
+    handler.onFocus(this);
   }
 
 }
diff --git a/user/src/com/google/gwt/event/dom/client/HandlesAllFocusEvents.java b/user/src/com/google/gwt/event/dom/client/HandlesAllFocusEvents.java
index 594b906..0d00ce3 100644
--- a/user/src/com/google/gwt/event/dom/client/HandlesAllFocusEvents.java
+++ b/user/src/com/google/gwt/event/dom/client/HandlesAllFocusEvents.java
@@ -27,7 +27,7 @@
    * source.
    * 
    * @param <H> receiver type, must implement both {@link FocusHandler} and
-   * {@link BlurHandler} handlers
+   *          {@link BlurHandler} handlers
    * @param eventSource the event source
    * @param reciever the receiver implementing both focus and blur handlers
    */
diff --git a/user/src/com/google/gwt/event/dom/client/HasAllFocusHandlers.java b/user/src/com/google/gwt/event/dom/client/HasAllFocusHandlers.java
index 7053d22..daa1f84 100644
--- a/user/src/com/google/gwt/event/dom/client/HasAllFocusHandlers.java
+++ b/user/src/com/google/gwt/event/dom/client/HasAllFocusHandlers.java
@@ -20,9 +20,10 @@
  * This is a convenience interface that includes all focus handlers defined by
  * the core GWT system.
  * 
- * <p> WARNING, PLEASE READ: As this interface is intended for developers who
- * wish to handle all focus events in GWT, in the unlikely event that a new
- * focus event is added, this interface will change.
+ * <p>
+ * WARNING, PLEASE READ: As this interface is intended for developers who wish
+ * to handle all focus events in GWT, in the unlikely event that a new focus
+ * event is added, this interface will change.
  * </p>
  */
 public interface HasAllFocusHandlers extends HasFocusHandlers, HasBlurHandlers {
diff --git a/user/src/com/google/gwt/event/dom/client/HasAllMouseHandlers.java b/user/src/com/google/gwt/event/dom/client/HasAllMouseHandlers.java
index b82c76e..c600a13 100644
--- a/user/src/com/google/gwt/event/dom/client/HasAllMouseHandlers.java
+++ b/user/src/com/google/gwt/event/dom/client/HasAllMouseHandlers.java
@@ -20,9 +20,9 @@
  * This is a convenience interface that includes all mouse handlers defined by
  * the core GWT system.
  * <p>
- * WARNING, PLEASE READ: As this interface is intended for developers who
- * wish to handle all mouse events in GWT, new mouse event handlers will be
- * added to it. Therefore, updates can cause breaking API changes.
+ * WARNING, PLEASE READ: As this interface is intended for developers who wish
+ * to handle all mouse events in GWT, new mouse event handlers will be added to
+ * it. Therefore, updates can cause breaking API changes.
  * </p>
  */
 public interface HasAllMouseHandlers extends HasMouseDownHandlers,
diff --git a/user/src/com/google/gwt/event/dom/client/KeyCodeEvent.java b/user/src/com/google/gwt/event/dom/client/KeyCodeEvent.java
index 66dfff9..7f29144 100644
--- a/user/src/com/google/gwt/event/dom/client/KeyCodeEvent.java
+++ b/user/src/com/google/gwt/event/dom/client/KeyCodeEvent.java
@@ -51,7 +51,7 @@
   public int getNativeKeyCode() {
     return getNativeEvent().getKeyCode();
   }
- 
+
   /**
    * Is this a key down arrow?
    * 
diff --git a/user/src/com/google/gwt/event/dom/client/KeyDownEvent.java b/user/src/com/google/gwt/event/dom/client/KeyDownEvent.java
index f826bec..1b58b03 100644
--- a/user/src/com/google/gwt/event/dom/client/KeyDownEvent.java
+++ b/user/src/com/google/gwt/event/dom/client/KeyDownEvent.java
@@ -47,13 +47,13 @@
   }
 
   @Override
-  protected void dispatch(KeyDownHandler handler) {
-    handler.onKeyDown(this);
+  public final Type<KeyDownHandler> getAssociatedType() {
+    return TYPE;
   }
 
   @Override
-  protected final Type<KeyDownHandler> getAssociatedType() {
-    return TYPE;
+  protected void dispatch(KeyDownHandler handler) {
+    handler.onKeyDown(this);
   }
 
 }
diff --git a/user/src/com/google/gwt/event/dom/client/KeyDownHandler.java b/user/src/com/google/gwt/event/dom/client/KeyDownHandler.java
index 67ef308..7ad34b2 100644
--- a/user/src/com/google/gwt/event/dom/client/KeyDownHandler.java
+++ b/user/src/com/google/gwt/event/dom/client/KeyDownHandler.java
@@ -20,7 +20,7 @@
 /**
  * Handler interface for {@link KeyDownEvent} events.
  */
-public interface KeyDownHandler extends EventHandler  {
+public interface KeyDownHandler extends EventHandler {
   /**
    * Called when {@link KeyDownEvent} is fired.
    * 
diff --git a/user/src/com/google/gwt/event/dom/client/KeyEvent.java b/user/src/com/google/gwt/event/dom/client/KeyEvent.java
index 18e7d2c..c6367e2 100644
--- a/user/src/com/google/gwt/event/dom/client/KeyEvent.java
+++ b/user/src/com/google/gwt/event/dom/client/KeyEvent.java
@@ -22,7 +22,7 @@
  * (http://www.quirksmode.org/js/keys.html), we do some trivial normalization
  * here, but do not attempt any complex patching, so user be warned.
  * 
- * @param <H> The event handler type 
+ * @param <H> The event handler type
  */
 public abstract class KeyEvent<H extends EventHandler> extends DomEvent<H> {
 
diff --git a/user/src/com/google/gwt/event/dom/client/KeyPressEvent.java b/user/src/com/google/gwt/event/dom/client/KeyPressEvent.java
index 1f8528e..f955e3c 100644
--- a/user/src/com/google/gwt/event/dom/client/KeyPressEvent.java
+++ b/user/src/com/google/gwt/event/dom/client/KeyPressEvent.java
@@ -46,6 +46,11 @@
   protected KeyPressEvent() {
   }
 
+  @Override
+  public final Type<KeyPressHandler> getAssociatedType() {
+    return TYPE;
+  }
+
   /**
    * Gets the char code for this event.
    * 
@@ -65,13 +70,8 @@
     handler.onKeyPress(this);
   }
 
-  @Override
-  protected final Type<KeyPressHandler> getAssociatedType() {
-    return TYPE;
-  }
-
   private native char getCharCode(Event e)/*-{
-      return e.charCode || e.keyCode;
-    }-*/;
+        return e.charCode || e.keyCode;
+      }-*/;
 
 }
diff --git a/user/src/com/google/gwt/event/dom/client/KeyUpEvent.java b/user/src/com/google/gwt/event/dom/client/KeyUpEvent.java
index f9cfdbd..5a07977 100644
--- a/user/src/com/google/gwt/event/dom/client/KeyUpEvent.java
+++ b/user/src/com/google/gwt/event/dom/client/KeyUpEvent.java
@@ -47,13 +47,13 @@
   }
 
   @Override
-  protected void dispatch(KeyUpHandler handler) {
-    handler.onKeyUp(this);
+  public final Type<KeyUpHandler> getAssociatedType() {
+    return TYPE;
   }
 
   @Override
-  protected final Type<KeyUpHandler> getAssociatedType() {
-    return TYPE;
+  protected void dispatch(KeyUpHandler handler) {
+    handler.onKeyUp(this);
   }
 
 }
diff --git a/user/src/com/google/gwt/event/dom/client/LoadEvent.java b/user/src/com/google/gwt/event/dom/client/LoadEvent.java
index 7e2bac5..3255c4b 100644
--- a/user/src/com/google/gwt/event/dom/client/LoadEvent.java
+++ b/user/src/com/google/gwt/event/dom/client/LoadEvent.java
@@ -47,13 +47,13 @@
   }
 
   @Override
-  protected void dispatch(LoadHandler handler) {
-    handler.onLoad(this);
+  public final Type<LoadHandler> getAssociatedType() {
+    return TYPE;
   }
 
   @Override
-  protected final Type<LoadHandler> getAssociatedType() {
-    return TYPE;
+  protected void dispatch(LoadHandler handler) {
+    handler.onLoad(this);
   }
 
 }
diff --git a/user/src/com/google/gwt/event/dom/client/LoseCaptureEvent.java b/user/src/com/google/gwt/event/dom/client/LoseCaptureEvent.java
index 270f0cd..857e8d0 100644
--- a/user/src/com/google/gwt/event/dom/client/LoseCaptureEvent.java
+++ b/user/src/com/google/gwt/event/dom/client/LoseCaptureEvent.java
@@ -47,13 +47,13 @@
   }
 
   @Override
-  protected void dispatch(LoseCaptureHandler handler) {
-    handler.onLoseCapture(this);
+  public final Type<LoseCaptureHandler> getAssociatedType() {
+    return TYPE;
   }
 
   @Override
-  protected final Type<LoseCaptureHandler> getAssociatedType() {
-    return TYPE;
+  protected void dispatch(LoseCaptureHandler handler) {
+    handler.onLoseCapture(this);
   }
 
 }
diff --git a/user/src/com/google/gwt/event/dom/client/MouseDownEvent.java b/user/src/com/google/gwt/event/dom/client/MouseDownEvent.java
index 23336ad..dd36ec2 100644
--- a/user/src/com/google/gwt/event/dom/client/MouseDownEvent.java
+++ b/user/src/com/google/gwt/event/dom/client/MouseDownEvent.java
@@ -47,13 +47,13 @@
   }
 
   @Override
-  protected void dispatch(MouseDownHandler handler) {
-    handler.onMouseDown(this);
+  public final Type<MouseDownHandler> getAssociatedType() {
+    return TYPE;
   }
 
   @Override
-  protected final Type<MouseDownHandler> getAssociatedType() {
-    return TYPE;
+  protected void dispatch(MouseDownHandler handler) {
+    handler.onMouseDown(this);
   }
 
 }
diff --git a/user/src/com/google/gwt/event/dom/client/MouseMoveEvent.java b/user/src/com/google/gwt/event/dom/client/MouseMoveEvent.java
index fd64fbb..cafa24c 100644
--- a/user/src/com/google/gwt/event/dom/client/MouseMoveEvent.java
+++ b/user/src/com/google/gwt/event/dom/client/MouseMoveEvent.java
@@ -47,13 +47,13 @@
   }
 
   @Override
-  protected void dispatch(MouseMoveHandler handler) {
-    handler.onMouseMove(this);
+  public final Type<MouseMoveHandler> getAssociatedType() {
+    return TYPE;
   }
 
   @Override
-  protected final Type<MouseMoveHandler> getAssociatedType() {
-    return TYPE;
+  protected void dispatch(MouseMoveHandler handler) {
+    handler.onMouseMove(this);
   }
 
 }
diff --git a/user/src/com/google/gwt/event/dom/client/MouseOutEvent.java b/user/src/com/google/gwt/event/dom/client/MouseOutEvent.java
index 96d817e..7b1d47e 100644
--- a/user/src/com/google/gwt/event/dom/client/MouseOutEvent.java
+++ b/user/src/com/google/gwt/event/dom/client/MouseOutEvent.java
@@ -47,6 +47,11 @@
   protected MouseOutEvent() {
   }
 
+  @Override
+  public final Type<MouseOutHandler> getAssociatedType() {
+    return TYPE;
+  }
+
   /**
    * Gets the element from which the mouse pointer was moved.
    * 
@@ -72,9 +77,4 @@
     handler.onMouseOut(this);
   }
 
-  @Override
-  protected final Type<MouseOutHandler> getAssociatedType() {
-    return TYPE;
-  }
-
 }
diff --git a/user/src/com/google/gwt/event/dom/client/MouseOverEvent.java b/user/src/com/google/gwt/event/dom/client/MouseOverEvent.java
index 1925791..90a664c 100644
--- a/user/src/com/google/gwt/event/dom/client/MouseOverEvent.java
+++ b/user/src/com/google/gwt/event/dom/client/MouseOverEvent.java
@@ -47,6 +47,11 @@
   protected MouseOverEvent() {
   }
 
+  @Override
+  public final Type<MouseOverHandler> getAssociatedType() {
+    return TYPE;
+  }
+
   /**
    * Gets the element from which the mouse pointer was moved.
    * 
@@ -72,9 +77,4 @@
     handler.onMouseOver(this);
   }
 
-  @Override
-  protected final Type<MouseOverHandler> getAssociatedType() {
-    return TYPE;
-  }
-
 }
diff --git a/user/src/com/google/gwt/event/dom/client/MouseUpEvent.java b/user/src/com/google/gwt/event/dom/client/MouseUpEvent.java
index 3a733db..9817f07 100644
--- a/user/src/com/google/gwt/event/dom/client/MouseUpEvent.java
+++ b/user/src/com/google/gwt/event/dom/client/MouseUpEvent.java
@@ -47,13 +47,13 @@
   }
 
   @Override
-  protected void dispatch(MouseUpHandler handler) {
-    handler.onMouseUp(this);
+  public final Type<MouseUpHandler> getAssociatedType() {
+    return TYPE;
   }
 
   @Override
-  protected final Type<MouseUpHandler> getAssociatedType() {
-    return TYPE;
+  protected void dispatch(MouseUpHandler handler) {
+    handler.onMouseUp(this);
   }
 
 }
diff --git a/user/src/com/google/gwt/event/dom/client/MouseWheelEvent.java b/user/src/com/google/gwt/event/dom/client/MouseWheelEvent.java
index f8248c5..d8fed04 100644
--- a/user/src/com/google/gwt/event/dom/client/MouseWheelEvent.java
+++ b/user/src/com/google/gwt/event/dom/client/MouseWheelEvent.java
@@ -47,13 +47,47 @@
   }
 
   @Override
-  protected void dispatch(MouseWheelHandler handler) {
-    handler.onMouseWheel(this);
-  }
-
-  @Override
-  protected final Type<MouseWheelHandler> getAssociatedType() {
+  public final Type<MouseWheelHandler> getAssociatedType() {
     return TYPE;
   }
 
+  /**
+   * Get the change in the mouse wheel position along the Y-axis; positive if
+   * the mouse wheel is moving north (toward the top of the screen) or negative
+   * if the mouse wheel is moving south (toward the bottom of the screen).
+   * 
+   * Note that delta values are not normalized across browsers or OSes.
+   * 
+   * @return the delta of the mouse wheel along the y axis
+   */
+  public int getDeltaY() {
+    return getNativeEvent().getMouseWheelVelocityY();
+  }
+
+  /**
+   * Convenience method that returns <code>true</code> if {@link #getDeltaY()}
+   * is a negative value (ie, the velocity is directed toward the top of the
+   * screen).
+   * 
+   * @return true if the velocity is directed toward the top of the screen
+   */
+  public boolean isNorth() {
+    return getDeltaY() < 0;
+  }
+
+  /**
+   * Convenience method that returns <code>true</code> if {@link #getDeltaY()}
+   * is a positive value (ie, the velocity is directed toward the bottom of the
+   * screen).
+   * 
+   * @return true if the velocity is directed toward the bottom of the screen
+   */
+  public boolean isSouth() {
+    return getDeltaY() > 0;
+  }
+
+  @Override
+  protected void dispatch(MouseWheelHandler handler) {
+    handler.onMouseWheel(this);
+  }
 }
diff --git a/user/src/com/google/gwt/event/dom/client/ScrollEvent.java b/user/src/com/google/gwt/event/dom/client/ScrollEvent.java
index ff8e836..21910e9 100644
--- a/user/src/com/google/gwt/event/dom/client/ScrollEvent.java
+++ b/user/src/com/google/gwt/event/dom/client/ScrollEvent.java
@@ -47,13 +47,13 @@
   }
 
   @Override
-  protected void dispatch(ScrollHandler handler) {
-    handler.onScroll(this);
+  public final Type<ScrollHandler> getAssociatedType() {
+    return TYPE;
   }
 
   @Override
-  protected final Type<ScrollHandler> getAssociatedType() {
-    return TYPE;
+  protected void dispatch(ScrollHandler handler) {
+    handler.onScroll(this);
   }
 
 }
diff --git a/user/src/com/google/gwt/event/logical/shared/BeforeSelectionEvent.java b/user/src/com/google/gwt/event/logical/shared/BeforeSelectionEvent.java
index 556335a..7ff45c6 100644
--- a/user/src/com/google/gwt/event/logical/shared/BeforeSelectionEvent.java
+++ b/user/src/com/google/gwt/event/logical/shared/BeforeSelectionEvent.java
@@ -87,6 +87,14 @@
     canceled = true;
   }
 
+  // The instance knows its BeforeSelectionHandler is of type I, but the TYPE
+  // field itself does not, so we have to do an unsafe cast here.
+  @SuppressWarnings("unchecked")
+  @Override
+  public Type<BeforeSelectionHandler<I>> getAssociatedType() {
+    return (Type) TYPE;
+  }
+
   /**
    * Gets the item.
    * 
@@ -110,14 +118,6 @@
     handler.onBeforeSelection(this);
   }
 
-  // The instance knows its BeforeSelectionHandler is of type I, but the TYPE
-  // field itself does not, so we have to do an unsafe cast here.
-  @SuppressWarnings("unchecked")
-  @Override
-  protected Type<BeforeSelectionHandler<I>> getAssociatedType() {
-    return (Type) TYPE;
-  }
-
   /**
    * Sets the item.
    * 
diff --git a/user/src/com/google/gwt/event/logical/shared/CloseEvent.java b/user/src/com/google/gwt/event/logical/shared/CloseEvent.java
index c68536b..85006a7 100644
--- a/user/src/com/google/gwt/event/logical/shared/CloseEvent.java
+++ b/user/src/com/google/gwt/event/logical/shared/CloseEvent.java
@@ -50,8 +50,8 @@
    * @param target the target
    * @param autoClosed was the target closed automatically
    */
-  public static <T> void fire(
-      HasCloseHandlers<T> source, T target, boolean autoClosed) {
+  public static <T> void fire(HasCloseHandlers<T> source, T target,
+      boolean autoClosed) {
     if (TYPE != null) {
       HandlerManager handlers = source.getHandlers();
       if (handlers != null) {
@@ -85,6 +85,14 @@
     this.target = target;
   }
 
+  // The instance knows its of type T, but the TYPE
+  // field itself does not, so we have to do an unsafe cast here.
+  @SuppressWarnings("unchecked")
+  @Override
+  public final Type<CloseHandler<T>> getAssociatedType() {
+    return (Type) TYPE;
+  }
+
   /**
    * Gets the target.
    * 
@@ -107,12 +115,4 @@
   protected void dispatch(CloseHandler<T> handler) {
     handler.onClose(this);
   }
-
-  // The instance knows its of type T, but the TYPE
-  // field itself does not, so we have to do an unsafe cast here.
-  @SuppressWarnings("unchecked")
-  @Override
-  protected final Type<CloseHandler<T>> getAssociatedType() {
-    return (Type) TYPE;
-  }
 }
diff --git a/user/src/com/google/gwt/event/logical/shared/HighlightEvent.java b/user/src/com/google/gwt/event/logical/shared/HighlightEvent.java
index ad1b514..38f785f 100644
--- a/user/src/com/google/gwt/event/logical/shared/HighlightEvent.java
+++ b/user/src/com/google/gwt/event/logical/shared/HighlightEvent.java
@@ -73,6 +73,14 @@
     this.highlighted = highlighted;
   }
 
+  // Because of type erasure, our static type is
+  // wild carded, yet the "real" type should use our I param.
+  @SuppressWarnings("unchecked")
+  @Override
+  public final Type<HighlightHandler<V>> getAssociatedType() {
+    return (Type) TYPE;
+  }
+
   /**
    * Gets the value highlighted.
    * 
@@ -86,12 +94,4 @@
   protected void dispatch(HighlightHandler<V> handler) {
     handler.onHighlight(this);
   }
-
-  // Because of type erasure, our static type is
-  // wild carded, yet the "real" type should use our I param.
-  @SuppressWarnings("unchecked")
-  @Override
-  protected final Type<HighlightHandler<V>> getAssociatedType() {
-    return (Type) TYPE;
-  }
 }
diff --git a/user/src/com/google/gwt/event/logical/shared/OpenEvent.java b/user/src/com/google/gwt/event/logical/shared/OpenEvent.java
index ca8c1a6..a6a11c2 100644
--- a/user/src/com/google/gwt/event/logical/shared/OpenEvent.java
+++ b/user/src/com/google/gwt/event/logical/shared/OpenEvent.java
@@ -71,6 +71,12 @@
     this.target = target;
   }
 
+  @SuppressWarnings("unchecked")
+  @Override
+  public final Type<OpenHandler<T>> getAssociatedType() {
+    return (Type) TYPE;
+  }
+
   /**
    * Gets the target.
    * 
@@ -80,17 +86,11 @@
     return target;
   }
 
-  @Override
-  protected void dispatch(OpenHandler<T> handler) {
-    handler.onOpen(this);
-  }
-
   // Because of type erasure, our static type is
   // wild carded, yet the "real" type should use our I param.
 
-  @SuppressWarnings("unchecked")
   @Override
-  protected final Type<OpenHandler<T>> getAssociatedType() {
-    return (Type) TYPE;
+  protected void dispatch(OpenHandler<T> handler) {
+    handler.onOpen(this);
   }
 }
diff --git a/user/src/com/google/gwt/event/logical/shared/ResizeEvent.java b/user/src/com/google/gwt/event/logical/shared/ResizeEvent.java
index 351b86c..f3b1393 100644
--- a/user/src/com/google/gwt/event/logical/shared/ResizeEvent.java
+++ b/user/src/com/google/gwt/event/logical/shared/ResizeEvent.java
@@ -75,6 +75,11 @@
     this.height = height;
   }
 
+  @Override
+  public Type<ResizeHandler> getAssociatedType() {
+    return TYPE;
+  }
+
   /**
    * Returns the new height.
    * 
@@ -103,9 +108,4 @@
   protected void dispatch(ResizeHandler handler) {
     handler.onResize(this);
   }
-
-  @Override
-  protected Type<ResizeHandler> getAssociatedType() {
-    return TYPE;
-  }
 }
diff --git a/user/src/com/google/gwt/event/logical/shared/SelectionEvent.java b/user/src/com/google/gwt/event/logical/shared/SelectionEvent.java
index c43ab56..342b179 100644
--- a/user/src/com/google/gwt/event/logical/shared/SelectionEvent.java
+++ b/user/src/com/google/gwt/event/logical/shared/SelectionEvent.java
@@ -72,6 +72,14 @@
     this.selectedItem = selectedItem;
   }
 
+  // The instance knows its BeforeSelectionHandler is of type I, but the TYPE
+  // field itself does not, so we have to do an unsafe cast here.
+  @SuppressWarnings("unchecked")
+  @Override
+  public Type<SelectionHandler<I>> getAssociatedType() {
+    return (Type) TYPE;
+  }
+
   /**
    * Gets the selected item.
    * 
@@ -85,12 +93,4 @@
   protected void dispatch(SelectionHandler<I> handler) {
     handler.onSelection(this);
   }
-
-  // The instance knows its BeforeSelectionHandler is of type I, but the TYPE
-  // field itself does not, so we have to do an unsafe cast here.
-  @SuppressWarnings("unchecked")
-  @Override
-  protected Type<SelectionHandler<I>> getAssociatedType() {
-    return (Type) TYPE;
-  }
 }
diff --git a/user/src/com/google/gwt/event/logical/shared/ShowRangeEvent.java b/user/src/com/google/gwt/event/logical/shared/ShowRangeEvent.java
index 34d3c88..5733bff 100644
--- a/user/src/com/google/gwt/event/logical/shared/ShowRangeEvent.java
+++ b/user/src/com/google/gwt/event/logical/shared/ShowRangeEvent.java
@@ -21,7 +21,7 @@
 
 /**
  * Represents a show range event. This logical event should be used when a
- * widget displays a range of values to the user.  This event should not be fired until a widget is displaying t
+ * widget displays a range of values to the user.
  * 
  * @param <V> the type of range
  */
@@ -79,6 +79,14 @@
     this.end = end;
   }
 
+  // Because of type erasure, our static type is
+  // wild carded, yet the "real" type should use our I param.
+  @SuppressWarnings("unchecked")
+  @Override
+  public final Type<ShowRangeHandler<V>> getAssociatedType() {
+    return (Type) TYPE;
+  }
+
   /**
    * Gets the end of the range.
    * 
@@ -101,12 +109,4 @@
   protected void dispatch(ShowRangeHandler<V> handler) {
     handler.onShowRange(this);
   }
-
-  // Because of type erasure, our static type is
-  // wild carded, yet the "real" type should use our I param.
-  @SuppressWarnings("unchecked")
-  @Override
-  protected final Type<ShowRangeHandler<V>> getAssociatedType() {
-    return (Type) TYPE;
-  }
-}
\ No newline at end of file
+}
diff --git a/user/src/com/google/gwt/event/logical/shared/ValueChangeEvent.java b/user/src/com/google/gwt/event/logical/shared/ValueChangeEvent.java
index 5a769dc..5dfe97f 100644
--- a/user/src/com/google/gwt/event/logical/shared/ValueChangeEvent.java
+++ b/user/src/com/google/gwt/event/logical/shared/ValueChangeEvent.java
@@ -106,6 +106,14 @@
     this.value = value;
   }
 
+  // The instance knows its BeforeSelectionHandler is of type I, but the TYPE
+  // field itself does not, so we have to do an unsafe cast here.
+  @SuppressWarnings("unchecked")
+  @Override
+  public Type<ValueChangeHandler<I>> getAssociatedType() {
+    return (Type) TYPE;
+  }
+
   /**
    * Gets the value.
    * 
@@ -119,12 +127,4 @@
   protected void dispatch(ValueChangeHandler<I> handler) {
     handler.onValueChange(this);
   }
-
-  // The instance knows its BeforeSelectionHandler is of type I, but the TYPE
-  // field itself does not, so we have to do an unsafe cast here.
-  @SuppressWarnings("unchecked")
-  @Override
-  protected Type<ValueChangeHandler<I>> getAssociatedType() {
-    return (Type) TYPE;
-  }
 }
diff --git a/user/src/com/google/gwt/event/shared/GwtEvent.java b/user/src/com/google/gwt/event/shared/GwtEvent.java
index 33787e2..c3a38d8 100644
--- a/user/src/com/google/gwt/event/shared/GwtEvent.java
+++ b/user/src/com/google/gwt/event/shared/GwtEvent.java
@@ -25,7 +25,6 @@
  * 
  */
 public abstract class GwtEvent<H extends EventHandler> {
-
   /**
    * Type class used to register events with the {@link HandlerManager}.
    * <p>
@@ -68,6 +67,14 @@
   }
 
   /**
+   * Returns the type used to register this event. Used by handler manager to
+   * dispatch events to the correct handlers.
+   * 
+   * @return the type
+   */
+  public abstract Type<H> getAssociatedType();
+
+  /**
    * Returns the source that last fired this event.
    * 
    * @return object representing the source of this event
@@ -93,9 +100,8 @@
 
   /**
    * The toString() for abstract event is overridden to avoid accidently
-   * including class literals in the the compiled output. Use
-   * {@link GwtEvent} #toDebugString to get more information about the
-   * event.
+   * including class literals in the the compiled output. Use {@link GwtEvent}
+   * #toDebugString to get more information about the event.
    */
   @Override
   public String toString() {
@@ -120,14 +126,6 @@
   protected abstract void dispatch(H handler);
 
   /**
-   * Returns the type used to register this event. Used by handler manager to
-   * dispatch events to the correct handlers.
-   * 
-   * @return the type
-   */
-  protected abstract Type<H> getAssociatedType();
-
-  /**
    * Is the event current live?
    * 
    * @return whether the event is live
@@ -137,8 +135,8 @@
   }
 
   /**
-   * Kill the event.  After the event has been killed, users cannot really on
-   * its values or functions being available.
+   * Kill the event. After the event has been killed, users cannot really on its
+   * values or functions being available.
    */
   protected void kill() {
     dead = true;
diff --git a/user/src/com/google/gwt/user/client/DOM.java b/user/src/com/google/gwt/user/client/DOM.java
index 8ddd25b..082a87e 100644
--- a/user/src/com/google/gwt/user/client/DOM.java
+++ b/user/src/com/google/gwt/user/client/DOM.java
@@ -626,7 +626,10 @@
    * 
    * @param evt the event whose key code is to be set
    * @param key the new key code
+   * @deprecated this method only works in IE and should not have been added to
+   *             the API
    */
+  @Deprecated
   public static void eventSetKeyCode(Event evt, char key) {
     impl.eventSetKeyCode(evt, key);
   }
diff --git a/user/src/com/google/gwt/user/client/Event.java b/user/src/com/google/gwt/user/client/Event.java
index 4ec22fe..ff156f1 100644
--- a/user/src/com/google/gwt/user/client/Event.java
+++ b/user/src/com/google/gwt/user/client/Event.java
@@ -34,19 +34,6 @@
  * from, and can be accessed in JavaScript code as expected. This is typically
  * done by calling methods in the {@link com.google.gwt.user.client.DOM} class.
  * </p>
- * 
- * <h3>Event Attributes</h3>
- * <p>
- * In hosted mode, most accessors (eg. Event{@link #getKeyCode()} and
- * {@link Event#getButton()}) assert that the requested attribute is reliable
- * across all supported browsers.  This means that attempting to retrieve an
- * attribute for an {@link Event} that does not support that attribute will
- * throw an {@link AssertionError}.  For example, an {@link Event} of type
- * {@link Event#ONCLICK} will throw an {@link AssertionError} if you attempt
- * to get the mouse button that was clicked using {@link Event#getButton()}
- * because the mouse button attribute is not defined for {@link Event#ONCLICK}
- * on Internet Explorer. 
- * </p>
  */
 public class Event extends JavaScriptObject {
   /**
@@ -144,6 +131,11 @@
       isConsumed = true;
     }
 
+    @Override
+    public Type<NativePreviewHandler> getAssociatedType() {
+      return TYPE;
+    }
+
     public Event getNativeEvent() {
       return nativeEvent;
     }
@@ -176,11 +168,6 @@
     }
 
     @Override
-    protected Type<NativePreviewHandler> getAssociatedType() {
-      return TYPE;
-    }
-
-    @Override
     protected void revive() {
       super.revive();
       isCanceled = false;
@@ -631,10 +618,6 @@
    * Gets the mouse x-position on the user's display.
    * 
    * @return the mouse x-position
-   * @throws AssertionError if event type is not one of
-   *           {@link Event#MOUSEEVENTS}, {@link Event#ONMOUSEWHEEL},
-   *           {@link Event#ONCLICK}, {@link Event#ONDBLCLICK}, or
-   *           {@link Event#ONCONTEXTMENU}
    */
   public final int getScreenX() {
     return DOM.eventGetScreenX(this);
diff --git a/user/src/com/google/gwt/user/client/History.java b/user/src/com/google/gwt/user/client/History.java
index bbac932..795ed67 100644
--- a/user/src/com/google/gwt/user/client/History.java
+++ b/user/src/com/google/gwt/user/client/History.java
@@ -77,6 +77,7 @@
    * Adds a listener to be informed of changes to the browser's history stack.
    * 
    * @param listener the listener to be added
+   * @deprecated use {@link History#addValueChangeHandler(ValueChangeHandler)} instead
    */
   @Deprecated
   public static void addHistoryListener(HistoryListener listener) {
@@ -88,6 +89,7 @@
    * to be informed of changes to the browser's history stack.
    * 
    * @param handler the handler
+   * @return the registration used to remove this value change handler
    */
   public static HandlerRegistration addValueChangeHandler(
       ValueChangeHandler<String> handler) {
diff --git a/user/src/com/google/gwt/user/client/HistoryListener.java b/user/src/com/google/gwt/user/client/HistoryListener.java
index b4a607f..b8cc0c1 100644
--- a/user/src/com/google/gwt/user/client/HistoryListener.java
+++ b/user/src/com/google/gwt/user/client/HistoryListener.java
@@ -18,6 +18,9 @@
 /**
  * Implement this interface to receive notification of changes to the browser
  * history state. It is used with {@link com.google.gwt.user.client.History}.
+ * 
+ * @deprecated use
+ *             {@link History#addValueChangeHandler(com.google.gwt.event.logical.shared.ValueChangeHandler)} instead
  */
 @Deprecated
 public interface HistoryListener extends java.util.EventListener {
diff --git a/user/src/com/google/gwt/user/client/Window.java b/user/src/com/google/gwt/user/client/Window.java
index 392bd01..58ab514 100644
--- a/user/src/com/google/gwt/user/client/Window.java
+++ b/user/src/com/google/gwt/user/client/Window.java
@@ -63,6 +63,11 @@
      */
     private String message = null;
 
+    @Override
+    public Type<ClosingHandler> getAssociatedType() {
+      return TYPE;
+    }
+
     /**
      * Get the message that will be presented to the user in a confirmation
      * dialog that asks the user whether or not she wishes to navigate away from
@@ -90,11 +95,6 @@
     protected void dispatch(ClosingHandler handler) {
       handler.onWindowClosing(this);
     }
-
-    @Override
-    protected Type<ClosingHandler> getAssociatedType() {
-      return TYPE;
-    }
   }
 
   /**
@@ -331,6 +331,11 @@
       this.scrollTop = scrollTop;
     }
 
+    @Override
+    public Type<ScrollHandler> getAssociatedType() {
+      return TYPE;
+    }
+
     /**
      * Gets the window's scroll left.
      * 
@@ -353,11 +358,6 @@
     protected void dispatch(ScrollHandler handler) {
       handler.onWindowScroll(this);
     }
-
-    @Override
-    protected Type<ScrollHandler> getAssociatedType() {
-      return TYPE;
-    }
   }
 
   /**
@@ -399,7 +399,6 @@
   private static boolean resizeHandlersInitialized;
   private static final WindowImpl impl = GWT.create(WindowImpl.class);
 
-
   /**
    * Adds a {@link CloseEvent} handler.
    * 
@@ -426,6 +425,8 @@
   /**
    * Adds a listener to receive window closing events.
    * 
+   * @deprecated use {@link Window#addWindowClosingHandler(ClosingHandler)} and
+   *             {@link Window#addCloseHandler(CloseHandler)} instead
    * @param listener the listener to be informed when the window is closing
    */
   @Deprecated
@@ -449,6 +450,7 @@
    * Adds a listener to receive window resize events.
    * 
    * @param listener the listener to be informed when the window is resized
+   * @deprecated use {@link Window#addResizeHandler(ResizeHandler)} instead
    */
   @Deprecated
   public static void addWindowResizeListener(WindowResizeListener listener) {
@@ -472,6 +474,7 @@
    * Adds a listener to receive window scroll events.
    * 
    * @param listener the listener to be informed when the window is scrolled
+   * @deprecated use {@link Window#addWindowScrollHandler(ScrollHandler)} instead
    */
   @Deprecated
   public static void addWindowScrollListener(WindowScrollListener listener) {
diff --git a/user/src/com/google/gwt/user/client/WindowCloseListener.java b/user/src/com/google/gwt/user/client/WindowCloseListener.java
index aa5806c..5e6ed4a 100644
--- a/user/src/com/google/gwt/user/client/WindowCloseListener.java
+++ b/user/src/com/google/gwt/user/client/WindowCloseListener.java
@@ -19,6 +19,9 @@
  * Implement this interface to receive closing events from the browser window.
  * 
  * @see com.google.gwt.user.client.Window#addWindowCloseListener(WindowCloseListener)
+ * @deprecated use {@link Window.ClosingHandler} and
+ *             {@link com.google.gwt.event.logical.shared.CloseHandler} instead
+ * 
  */
 @Deprecated
 public interface WindowCloseListener extends java.util.EventListener {
diff --git a/user/src/com/google/gwt/user/client/WindowResizeListener.java b/user/src/com/google/gwt/user/client/WindowResizeListener.java
index 04cfd25..4240327 100644
--- a/user/src/com/google/gwt/user/client/WindowResizeListener.java
+++ b/user/src/com/google/gwt/user/client/WindowResizeListener.java
@@ -19,6 +19,8 @@
  * Implement this interface to receive resize events from the browser window.
  * 
  * @see com.google.gwt.user.client.Window#addWindowResizeListener(WindowResizeListener)
+ * @deprecated use {@link com.google.gwt.event.logical.shared.ResizeHandler}
+ *             instead
  */
 @Deprecated
 public interface WindowResizeListener extends java.util.EventListener {
diff --git a/user/src/com/google/gwt/user/client/WindowScrollListener.java b/user/src/com/google/gwt/user/client/WindowScrollListener.java
index bf3f3a1..186bb78 100644
--- a/user/src/com/google/gwt/user/client/WindowScrollListener.java
+++ b/user/src/com/google/gwt/user/client/WindowScrollListener.java
@@ -19,6 +19,9 @@
  * Implement this interface to receive scroll events from the browser window.
  * 
  * @see com.google.gwt.user.client.Window#addWindowScrollListener(WindowScrollListener)
+ * @deprecated use
+ *             {@link Window#addWindowScrollHandler(com.google.gwt.user.client.Window.ScrollHandler)}
+ *             instead instead
  */
 @Deprecated
 public interface WindowScrollListener extends java.util.EventListener {
diff --git a/user/src/com/google/gwt/user/client/ui/Button.java b/user/src/com/google/gwt/user/client/ui/Button.java
index c7738c8..e571bbd 100644
--- a/user/src/com/google/gwt/user/client/ui/Button.java
+++ b/user/src/com/google/gwt/user/client/ui/Button.java
@@ -99,6 +99,7 @@
    * 
    * @param html the HTML caption
    * @param listener the click listener
+   * @deprecated use {@link Button#Button(String, ClickHandler)} instead
    */
   @Deprecated
   public Button(String html, ClickListener listener) {
diff --git a/user/src/com/google/gwt/user/client/ui/ChangeListener.java b/user/src/com/google/gwt/user/client/ui/ChangeListener.java
index cf75a46..c93a7e1 100644
--- a/user/src/com/google/gwt/user/client/ui/ChangeListener.java
+++ b/user/src/com/google/gwt/user/client/ui/ChangeListener.java
@@ -20,7 +20,10 @@
 /**
  * Event listener interface for 'change' events.
  * 
- * @deprecated use {@link com.google.gwt.event.dom.client.ChangeHandler} instead
+ * @deprecated we have now separated dom and logical change events. Use {@link com.google.gwt.event.dom.client.ChangeHandler} if the
+ *             change listener was triggered by a dom change event or
+ *             {@link com.google.gwt.event.logical.shared.ValueChangeHandler} if
+ *             it was based on a logical event
  */
 @Deprecated
 public interface ChangeListener extends EventListener {
@@ -30,6 +33,12 @@
    * sending the event.
    * 
    * @param sender the widget that has changed
+   * 
+   * @deprecated use
+   *             {@link com.google.gwt.event.dom.client.ChangeHandler#onChange(com.google.gwt.event.dom.client.ChangeEvent)}
+   *             if the change listener was triggered by a dom change event or
+   *             {@link com.google.gwt.event.logical.shared.ValueChangeHandler#onValueChange(com.google.gwt.event.logical.shared.ValueChangeEvent)}
+   *             if it was based on a logical event
    */
   @Deprecated
   void onChange(Widget sender);
diff --git a/user/src/com/google/gwt/user/client/ui/ChangeListenerCollection.java b/user/src/com/google/gwt/user/client/ui/ChangeListenerCollection.java
index ea4ca5a..c0504e2 100644
--- a/user/src/com/google/gwt/user/client/ui/ChangeListenerCollection.java
+++ b/user/src/com/google/gwt/user/client/ui/ChangeListenerCollection.java
@@ -23,7 +23,10 @@
  * type {@link com.google.gwt.user.client.ui.ChangeListener}.
  * 
  * @deprecated use <code>addDomHandler(myHandler, ChangeEvent.getType())</code>
- *             instead to manage handlers for your widget
+ *             for dom based change events and use
+ *             <code>addHandler(myHandler, ValueChangeEvent.getType())</code>
+ *             for logical change events instead to manage handlers for your
+ *             widget
  */
 @Deprecated
 public class ChangeListenerCollection extends ArrayList<ChangeListener> {
diff --git a/user/src/com/google/gwt/user/client/ui/CheckBox.java b/user/src/com/google/gwt/user/client/ui/CheckBox.java
index a40700b..e2f96cf 100644
--- a/user/src/com/google/gwt/user/client/ui/CheckBox.java
+++ b/user/src/com/google/gwt/user/client/ui/CheckBox.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2008 Google Inc.
+ * Copyright 2009 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
@@ -34,10 +34,12 @@
  * </p>
  * 
  * <h3>CSS Style Rules</h3>
- * <ul class='css'>
- * <li>.gwt-CheckBox { }</li>
- * <li>.gwt-CheckBox-disabled { Applied when Checkbox is disabled }</li>
- * </ul>
+ * <dl>
+ * <dt>.gwt-CheckBox</dt>
+ * <dd>the outer element</dd>
+ * <dt>.gwt-CheckBox-disabled</dt>
+ * <dd>applied when Checkbox is disabled</dd>
+ * </dl>
  * 
  * <p>
  * <h3>Example</h3>
@@ -46,6 +48,7 @@
  */
 public class CheckBox extends ButtonBase implements HasName, HasValue<Boolean> {
   private Element inputElem, labelElem;
+  private boolean valueChangeHandlerInitialized;
 
   /**
    * Creates a check box with no label.
@@ -104,10 +107,11 @@
       ValueChangeHandler<Boolean> handler) {
     // Is this the first value change handler? If so, time to listen to clicks
     // on the checkbox
-    if (!isEventHandled(ValueChangeEvent.getType())) {
+    if (!valueChangeHandlerInitialized) {
+      valueChangeHandlerInitialized = true;
       this.addClickHandler(new ClickHandler() {
         public void onClick(ClickEvent event) {
-          // No need to compare old value and new value--click handler 
+          // No need to compare old value and new value--click handler
           // only fires on real click, and value always toggles
           ValueChangeEvent.fire(CheckBox.this, isChecked());
         }
@@ -166,7 +170,7 @@
 
   /**
    * Checks or unchecks this check box. Does not fire {@link ValueChangeEvent}.
-   * (If you want the event to fire, use {@link #setValue(boolean, boolean)})
+   * (If you want the event to fire, use {@link #setValue(Boolean, boolean)})
    * 
    * @param checked <code>true</code> to check the check box.
    */
@@ -220,7 +224,8 @@
   }
 
   /**
-   * Checks or unchecks the text box. 
+   * Checks or unchecks the text box.
+   * 
    * @param value true to check, false to uncheck. Must not be null.
    * @thows IllegalArgumentException if value is null
    */
@@ -229,12 +234,12 @@
   }
 
   /**
-   * Checks or unchecks the text box, firing {@link ValueChangeEvent}
-   * if appropriate.
-   *
+   * Checks or unchecks the text box, firing {@link ValueChangeEvent} if
+   * appropriate.
+   * 
    * @param value true to check, false to uncheck. Must not be null.
    * @param fireEvents If true, and value has changed, fire a
-   * {@link ValueChangeEvent}
+   *          {@link ValueChangeEvent}
    * @thows IllegalArgumentException if value is null
    */
   public void setValue(Boolean value, boolean fireEvents) {
diff --git a/user/src/com/google/gwt/user/client/ui/ClickListener.java b/user/src/com/google/gwt/user/client/ui/ClickListener.java
index cf998cc..1c5e15d 100644
--- a/user/src/com/google/gwt/user/client/ui/ClickListener.java
+++ b/user/src/com/google/gwt/user/client/ui/ClickListener.java
@@ -19,6 +19,7 @@
 
 /**
  * Event listener interface for click events.
+ * 
  * @deprecated use {@link com.google.gwt.event.dom.client.ClickHandler} instead
  */
 @Deprecated
diff --git a/user/src/com/google/gwt/user/client/ui/Composite.java b/user/src/com/google/gwt/user/client/ui/Composite.java
index c7ed3bd..a628c78 100644
--- a/user/src/com/google/gwt/user/client/ui/Composite.java
+++ b/user/src/com/google/gwt/user/client/ui/Composite.java
@@ -49,11 +49,11 @@
   public void onBrowserEvent(Event event) {
     // Fire any handler added to the composite itself.
     super.onBrowserEvent(event);
-    
+
     // Delegate events to the widget.
     widget.onBrowserEvent(event);
   }
- 
+
   /**
    * Provides subclasses access to the topmost widget that defines this
    * composite.
diff --git a/user/src/com/google/gwt/user/client/ui/DelegatingChangeListenerCollection.java b/user/src/com/google/gwt/user/client/ui/DelegatingChangeListenerCollection.java
index e283f85..c32c990 100644
--- a/user/src/com/google/gwt/user/client/ui/DelegatingChangeListenerCollection.java
+++ b/user/src/com/google/gwt/user/client/ui/DelegatingChangeListenerCollection.java
@@ -38,6 +38,8 @@
  *    changeListeners.add(listener);
  *  }
  *</pre>
+ * 
+ * @deprecated use <code>Widget#delegateEvent</code> instead
  */
 @Deprecated
 public class DelegatingChangeListenerCollection extends
diff --git a/user/src/com/google/gwt/user/client/ui/DelegatingClickListenerCollection.java b/user/src/com/google/gwt/user/client/ui/DelegatingClickListenerCollection.java
index 0e66518..f6feae8 100644
--- a/user/src/com/google/gwt/user/client/ui/DelegatingClickListenerCollection.java
+++ b/user/src/com/google/gwt/user/client/ui/DelegatingClickListenerCollection.java
@@ -38,6 +38,8 @@
  *    clickListeners.add(listener);
  *  }
  *</pre>
+ * 
+ * @deprecated use <code>Widget#delegateEvent</code> instead
  */
 @Deprecated
 public class DelegatingClickListenerCollection extends ClickListenerCollection
diff --git a/user/src/com/google/gwt/user/client/ui/DelegatingFocusListenerCollection.java b/user/src/com/google/gwt/user/client/ui/DelegatingFocusListenerCollection.java
index 7c937e0..9d26eee 100644
--- a/user/src/com/google/gwt/user/client/ui/DelegatingFocusListenerCollection.java
+++ b/user/src/com/google/gwt/user/client/ui/DelegatingFocusListenerCollection.java
@@ -38,6 +38,8 @@
  *    focusListeners.add(listener);
  *  }
  *</pre>
+ * 
+ * @deprecated use <code>Widget#delegateEvent</code> instead
  */
 @Deprecated
 public class DelegatingFocusListenerCollection extends FocusListenerCollection
diff --git a/user/src/com/google/gwt/user/client/ui/DelegatingKeyboardListenerCollection.java b/user/src/com/google/gwt/user/client/ui/DelegatingKeyboardListenerCollection.java
index 6994c25..ccae9d2 100644
--- a/user/src/com/google/gwt/user/client/ui/DelegatingKeyboardListenerCollection.java
+++ b/user/src/com/google/gwt/user/client/ui/DelegatingKeyboardListenerCollection.java
@@ -27,7 +27,7 @@
  * source of the event. To use a {@link DelegatingKeyboardListenerCollection},
  * simply use the {@link DelegatingKeyboardListenerCollection} instead of a
  * {@link KeyboardListenerCollection}. For example, in {@link SuggestBox}, the
- * following code is used to listen to keyboard events on the {@link SuggestBox}'s
+ * following code is used to listen to keyboard events on the {@link SuggestBox}
  * underlying widget.
  * </p>
  * 
@@ -39,13 +39,15 @@
  *    keyboardListeners.add(listener);
  *  }
  *</pre>
+ * 
+ * @deprecated use <code>Widget#delegateEvent</code> instead
  */
 @Deprecated
 public class DelegatingKeyboardListenerCollection extends
     KeyboardListenerCollection implements KeyboardListener {
 
   private final Widget owner;
-  
+
   /**
    * Constructor for {@link DelegatingKeyboardListenerCollection}.
    * 
diff --git a/user/src/com/google/gwt/user/client/ui/DisclosureEvent.java b/user/src/com/google/gwt/user/client/ui/DisclosureEvent.java
index f5405d0..8488ed5 100644
--- a/user/src/com/google/gwt/user/client/ui/DisclosureEvent.java
+++ b/user/src/com/google/gwt/user/client/ui/DisclosureEvent.java
@@ -19,6 +19,10 @@
 
 /**
  * Event object containing information about {@link DisclosurePanel} changes.
+ * 
+ * @deprecated use
+ *             {@link com.google.gwt.event.logical.shared.CloseEvent} and
+ *             {@link  com.google.gwt.event.logical.shared.OpenEvent} instead
  */
 @Deprecated
 public class DisclosureEvent extends EventObject {
diff --git a/user/src/com/google/gwt/user/client/ui/DisclosureHandler.java b/user/src/com/google/gwt/user/client/ui/DisclosureHandler.java
index dd283e5..3145353 100644
--- a/user/src/com/google/gwt/user/client/ui/DisclosureHandler.java
+++ b/user/src/com/google/gwt/user/client/ui/DisclosureHandler.java
@@ -14,14 +14,15 @@
  * the License.
  */
 package com.google.gwt.user.client.ui;
- 
+
 import java.util.EventListener;
 
 /**
  * Event handler interface for {@link DisclosureEvent}.
  * 
  * @deprecated use {@link com.google.gwt.event.logical.shared.CloseHandler}
- *             and/or {@link com.google.gwt.event.logical.shared.OpenHandler} instead
+ *             and/or {@link com.google.gwt.event.logical.shared.OpenHandler}
+ *             instead
  * @see DisclosurePanel
  */
 @Deprecated
@@ -30,6 +31,8 @@
    * Fired when the panel is closed.
    * 
    * @param event event representing this action.
+   * @deprecated use {@link com.google.gwt.event.logical.shared.CloseHandler}
+   *             instead
    */
   @Deprecated
   void onClose(DisclosureEvent event);
@@ -38,6 +41,7 @@
    * Fired when the panel is opened.
    * 
    * @param event event representing this action.
+   * @deprecated use {@link com.google.gwt.event.logical.shared.OpenHandler} instead
    */
   @Deprecated
   void onOpen(DisclosureEvent event);
diff --git a/user/src/com/google/gwt/user/client/ui/FiresDisclosureEvents.java b/user/src/com/google/gwt/user/client/ui/FiresDisclosureEvents.java
index 2731117..b91e4d0 100644
--- a/user/src/com/google/gwt/user/client/ui/FiresDisclosureEvents.java
+++ b/user/src/com/google/gwt/user/client/ui/FiresDisclosureEvents.java
@@ -15,7 +15,6 @@
  */
 package com.google.gwt.user.client.ui;
 
-
 /**
  * A widget that implements this interface fires the events defined by the
  * {@link DisclosureHandler} interface.
diff --git a/user/src/com/google/gwt/user/client/ui/FocusListener.java b/user/src/com/google/gwt/user/client/ui/FocusListener.java
index 23b707d..fa82aca 100644
--- a/user/src/com/google/gwt/user/client/ui/FocusListener.java
+++ b/user/src/com/google/gwt/user/client/ui/FocusListener.java
@@ -30,6 +30,9 @@
    * Fired when a widget receives keyboard focus.
    * 
    * @param sender the widget receiving focus.
+   * @deprecated use
+   *             {@link com.google.gwt.event.dom.client.FocusHandler#onFocus(com.google.gwt.event.dom.client.FocusEvent)}
+   *             instead
    */
   @Deprecated
   void onFocus(Widget sender);
@@ -38,6 +41,9 @@
    * Fired when a widget loses keyboard focus.
    * 
    * @param sender the widget losing focus.
+   * @deprecated use
+   *             {@link com.google.gwt.event.dom.client.BlurHandler#onBlur(com.google.gwt.event.dom.client.BlurEvent)}
+   *             instead
    */
   @Deprecated
   void onLostFocus(Widget sender);
diff --git a/user/src/com/google/gwt/user/client/ui/FocusListenerCollection.java b/user/src/com/google/gwt/user/client/ui/FocusListenerCollection.java
index b2981aa..5488f26 100644
--- a/user/src/com/google/gwt/user/client/ui/FocusListenerCollection.java
+++ b/user/src/com/google/gwt/user/client/ui/FocusListenerCollection.java
@@ -27,8 +27,8 @@
  * type {@link com.google.gwt.user.client.ui.FocusListener}
  * 
  * @deprecated use <code>addDomHandler(myHandler, FocusEvent.getType())</code>
- *             and <code>addDomHandler(myHandler, BlurEvent.getType())</code>
- *             to manage your widget's handlers instead
+ *             and <code>addDomHandler(myHandler, BlurEvent.getType())</code> to
+ *             manage your widget's handlers instead
  */
 @Deprecated
 public class FocusListenerCollection extends ArrayList<FocusListener> {
diff --git a/user/src/com/google/gwt/user/client/ui/Focusable.java b/user/src/com/google/gwt/user/client/ui/Focusable.java
new file mode 100644
index 0000000..a7828eb
--- /dev/null
+++ b/user/src/com/google/gwt/user/client/ui/Focusable.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2008 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.ui;
+
+/**
+ * A widget that implements this interface can receive keyboard focus.
+ */
+public interface Focusable {
+
+  /**
+   * Gets the widget's position in the tab index.
+   * 
+   * @return the widget's tab index
+   */
+  int getTabIndex();
+
+  /**
+   * Sets the widget's 'access key'. This key is used (in conjunction with a
+   * browser-specific modifier key) to automatically focus the widget.
+   * 
+   * @param key the widget's access key
+   */
+  void setAccessKey(char key);
+
+  /**
+   * Explicitly focus/unfocus this widget. Only one widget can have focus at a
+   * time, and the widget that does will receive all keyboard events.
+   * 
+   * @param focused whether this widget should take focus or release it
+   */
+  void setFocus(boolean focused);
+
+  /**
+   * Sets the widget's position in the tab index. If more than one widget has
+   * the same tab index, each such widget will receive focus in an arbitrary
+   * order. Setting the tab index to <code>-1</code> will cause this widget to
+   * be removed from the tab order.
+   * 
+   * @param index the widget's tab index
+   */
+  void setTabIndex(int index);
+}
diff --git a/user/src/com/google/gwt/user/client/ui/FormHandler.java b/user/src/com/google/gwt/user/client/ui/FormHandler.java
index f4f8ab8..cc18975 100644
--- a/user/src/com/google/gwt/user/client/ui/FormHandler.java
+++ b/user/src/com/google/gwt/user/client/ui/FormHandler.java
@@ -19,7 +19,9 @@
 
 /**
  * Handler interface for form submit events.
- * @deprecated use {@link FormPanel.SubmitCompleteHandler} and/or {@link FormPanel.SubmitHandler} instead
+ * 
+ * @deprecated use {@link FormPanel.SubmitCompleteHandler} and/or
+ *             {@link FormPanel.SubmitHandler} instead
  */
 @Deprecated
 public interface FormHandler extends EventListener {
@@ -29,12 +31,13 @@
    * 
    * <p>
    * The FormPanel must <em>not</em> be detached (i.e. removed from its parent
-   * or otherwise disconnected from a {@link RootPanel}) until the submission
-   * is complete. Otherwise, notification of submission will fail.
+   * or otherwise disconnected from a {@link RootPanel}) until the submission is
+   * complete. Otherwise, notification of submission will fail.
    * </p>
    * 
    * @param event an event object containing information about the form
    *          submission
+   * @deprecated use {@link FormPanel.SubmitHandler} instead
    */
   @Deprecated
   void onSubmit(FormSubmitEvent event);
@@ -44,6 +47,7 @@
    * 
    * @param event an event object containing information about the form
    *          submission
+   * @deprecated use {@link FormPanel.SubmitCompleteHandler} instead
    */
   @Deprecated
   void onSubmitComplete(FormSubmitCompleteEvent event);
diff --git a/user/src/com/google/gwt/user/client/ui/FormHandlerCollection.java b/user/src/com/google/gwt/user/client/ui/FormHandlerCollection.java
index 66c6a4c..af6a126 100644
--- a/user/src/com/google/gwt/user/client/ui/FormHandlerCollection.java
+++ b/user/src/com/google/gwt/user/client/ui/FormHandlerCollection.java
@@ -19,8 +19,8 @@
 
 /**
  * Helper class for widgets that accept
- * {@link com.google.gwt.user.client.ui.FormHandler FormHandlers}. This
- * subclass of ArrayList assumes that all items added to it will be of type
+ * {@link com.google.gwt.user.client.ui.FormHandler FormHandlers}. This subclass
+ * of ArrayList assumes that all items added to it will be of type
  * {@link com.google.gwt.user.client.ui.FormHandler}.
  * 
  * @deprecated {@link FormPanel} now handles all handler management internally
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 619849e..4aa7b90 100644
--- a/user/src/com/google/gwt/user/client/ui/FormPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/FormPanel.java
@@ -88,12 +88,18 @@
 
     /**
      * Create a submit complete event
+     * 
      * @param resultsHtml the results from submitting the form
      */
     protected SubmitCompleteEvent(String resultsHtml) {
       this.resultHtml = resultsHtml;
     }
 
+    @Override
+    public Type<SubmitCompleteHandler> getAssociatedType() {
+      return TYPE;
+    }
+
     /**
      * Gets the result text of the form submission.
      * 
@@ -110,11 +116,6 @@
     protected void dispatch(SubmitCompleteHandler handler) {
       handler.onSubmitComplete(this);
     }
-
-    @Override
-    protected Type<SubmitCompleteHandler> getAssociatedType() {
-      return TYPE;
-    }
   }
 
   /**
@@ -160,6 +161,11 @@
       this.canceled = true;
     }
 
+    @Override
+    public Type<FormPanel.SubmitHandler> getAssociatedType() {
+      return TYPE;
+    }
+
     /**
      * Gets whether this form submit will be canceled.
      * 
@@ -174,14 +180,11 @@
       handler.onSubmit(this);
     }
 
-    @Override
-    protected Type<FormPanel.SubmitHandler> getAssociatedType() {
-      return TYPE;
-    }
-
     /**
      * This method is used for legacy support and should be removed when
      * {@link FormHandler} is removed.
+     * 
+     * @deprecated use {@link FormPanel.SubmitEvent#cancel()} instead
      */
     @Deprecated
     void setCanceled(boolean canceled) {
diff --git a/user/src/com/google/gwt/user/client/ui/FormSubmitCompleteEvent.java b/user/src/com/google/gwt/user/client/ui/FormSubmitCompleteEvent.java
index 0dd426a..74c8c44 100644
--- a/user/src/com/google/gwt/user/client/ui/FormSubmitCompleteEvent.java
+++ b/user/src/com/google/gwt/user/client/ui/FormSubmitCompleteEvent.java
@@ -38,8 +38,8 @@
   /**
    * Gets the result text of the form submission.
    * 
-   * @return the result html, or <code>null</code> if there was an error
-   *         reading it
+   * @return the result html, or <code>null</code> if there was an error reading
+   *         it
    * @tip The result html can be <code>null</code> as a result of submitting a
    *      form to a different domain.
    */
diff --git a/user/src/com/google/gwt/user/client/ui/HTMLTable.java b/user/src/com/google/gwt/user/client/ui/HTMLTable.java
index 77bd5eb..ee099c1 100644
--- a/user/src/com/google/gwt/user/client/ui/HTMLTable.java
+++ b/user/src/com/google/gwt/user/client/ui/HTMLTable.java
@@ -823,6 +823,7 @@
    * @param listener listener to add
    * @deprecated add a click handler instead and use {@link HTMLTable#getCellForEvent(ClickEvent)} to get the cell information
    */
+  @Deprecated
   public void addTableListener(TableListener listener) {
     ListenerWrapper.Table.add(this, listener);
   }
diff --git a/user/src/com/google/gwt/user/client/ui/HasFocus.java b/user/src/com/google/gwt/user/client/ui/HasFocus.java
index c869bd4..e0e999e 100644
--- a/user/src/com/google/gwt/user/client/ui/HasFocus.java
+++ b/user/src/com/google/gwt/user/client/ui/HasFocus.java
@@ -17,40 +17,11 @@
 
 /**
  * A widget that implements this interface can receive keyboard focus.
+ * 
+ * @deprecated use {@link Focusable} instead
  */
-@SuppressWarnings("deprecation")
-public interface HasFocus extends SourcesFocusEvents, SourcesKeyboardEvents {
+@Deprecated
+public interface HasFocus extends Focusable, SourcesFocusEvents,
+    SourcesKeyboardEvents {
 
-  /**
-   * Gets the widget's position in the tab index.
-   * 
-   * @return the widget's tab index
-   */
-  int getTabIndex();
-
-  /**
-   * Sets the widget's 'access key'. This key is used (in conjunction with a
-   * browser-specific modifier key) to automatically focus the widget.
-   * 
-   * @param key the widget's access key
-   */
-  void setAccessKey(char key);
-
-  /**
-   * Explicitly focus/unfocus this widget. Only one widget can have focus at a
-   * time, and the widget that does will receive all keyboard events.
-   * 
-   * @param focused whether this widget should take focus or release it
-   */
-  void setFocus(boolean focused);
-
-  /**
-   * Sets the widget's position in the tab index. If more than one widget has
-   * the same tab index, each such widget will receive focus in an arbitrary
-   * order. Setting the tab index to <code>-1</code> will cause this widget to
-   * be removed from the tab order.
-   * 
-   * @param index the widget's tab index
-   */
-  void setTabIndex(int index);
 }
diff --git a/user/src/com/google/gwt/user/client/ui/KeyboardListener.java b/user/src/com/google/gwt/user/client/ui/KeyboardListener.java
index e0a90d1..fbf314e 100644
--- a/user/src/com/google/gwt/user/client/ui/KeyboardListener.java
+++ b/user/src/com/google/gwt/user/client/ui/KeyboardListener.java
@@ -20,32 +20,156 @@
 /**
  * Event listener interface for keyboard events.
  * 
- * @deprecated use {@link com.google.gwt.event.dom.client.KeyDownHandler}, {@link com.google.gwt.event.dom.client.KeyUpHandler} and/or {@link com.google.gwt.event.dom.client.KeyPressHandler}
- *             instead
+ * @deprecated use {@link com.google.gwt.event.dom.client.KeyDownHandler},
+ *             {@link com.google.gwt.event.dom.client.KeyUpHandler} and/or
+ *             {@link com.google.gwt.event.dom.client.KeyPressHandler} instead
  */
 @Deprecated
 public interface KeyboardListener extends EventListener {
-
+  /**
+   * @deprecated use {@link com.google.gwt.event.dom.client.KeyCodes#KEY_ALT}
+   *             instead
+   */
+  @Deprecated
   int KEY_ALT = 18;
+
+  /**
+   * @deprecated use
+   *             {@link com.google.gwt.event.dom.client.KeyCodes#KEY_BACKSPACE}
+   *             instead
+   */
+  @Deprecated
   int KEY_BACKSPACE = 8;
+
+  /**
+   * @deprecated use {@link com.google.gwt.event.dom.client.KeyCodes#KEY_CTRL}
+   *             instead
+   */
+  @Deprecated
   int KEY_CTRL = 17;
+
+  /**
+   * @deprecated use {@link com.google.gwt.event.dom.client.KeyCodes#KEY_DELETE}
+   *             instead
+   */
+  @Deprecated
   int KEY_DELETE = 46;
+
+  /**
+   * @deprecated use {@link com.google.gwt.event.dom.client.KeyCodes#KEY_DOWN}
+   *             instead
+   */
+  @Deprecated
   int KEY_DOWN = 40;
+
+  /**
+   * @deprecated use {@link com.google.gwt.event.dom.client.KeyCodes#KEY_END}
+   *             instead
+   */
+  @Deprecated
   int KEY_END = 35;
+
+  /**
+   * @deprecated use {@link com.google.gwt.event.dom.client.KeyCodes#KEY_ENTER}
+   *             instead
+   */
+  @Deprecated
   int KEY_ENTER = 13;
+
+  /**
+   * @deprecated use {@link com.google.gwt.event.dom.client.KeyCodes#KEY_ESCAPE}
+   *             instead
+   */
+  @Deprecated
   int KEY_ESCAPE = 27;
+
+  /**
+   * @deprecated use {@link com.google.gwt.event.dom.client.KeyCodes#KEY_HOME}
+   *             instead
+   */
+  @Deprecated
   int KEY_HOME = 36;
+
+  /**
+   * @deprecated use {@link com.google.gwt.event.dom.client.KeyCodes#KEY_LEFT}
+   *             instead
+   */
+  @Deprecated
   int KEY_LEFT = 37;
+
+  /**
+   * @deprecated use
+   *             {@link com.google.gwt.event.dom.client.KeyCodes#KEY_PAGEDOWN}
+   *             instead
+   */
+  @Deprecated
   int KEY_PAGEDOWN = 34;
+
+  /**
+   * @deprecated use {@link com.google.gwt.event.dom.client.KeyCodes#KEY_PAGEUP}
+   *             instead
+   */
+  @Deprecated
   int KEY_PAGEUP = 33;
+
+  /**
+   * @deprecated use {@link com.google.gwt.event.dom.client.KeyCodes#KEY_RIGHT}
+   *             instead
+   */
+  @Deprecated
   int KEY_RIGHT = 39;
+
+  /**
+   * @deprecated use {@link com.google.gwt.event.dom.client.KeyCodes#KEY_SHIFT}
+   *             instead
+   */
+  @Deprecated
   int KEY_SHIFT = 16;
+
+  /**
+   * @deprecated use {@link com.google.gwt.event.dom.client.KeyCodes#KEY_TAB}
+   *             instead
+   */
+  @Deprecated
   int KEY_TAB = 9;
+
+  /**
+   * @deprecated use {@link com.google.gwt.event.dom.client.KeyCodes#KEY_UP}
+   *             instead
+   */
+  @Deprecated
   int KEY_UP = 38;
 
+  /**
+   * @deprecated use
+   *             {@link com.google.gwt.event.dom.client.KeyCodeEvent#isAltKeyDown()}
+   *             instead
+   */
+  @Deprecated
   int MODIFIER_ALT = 4;
+
+  /**
+   * @deprecated use
+   *             {@link com.google.gwt.event.dom.client.KeyCodeEvent#isControlKeyDown()}
+   *             instead
+   */
+  @Deprecated
   int MODIFIER_CTRL = 2;
+
+  /**
+   * @deprecated use
+   *             {@link com.google.gwt.event.dom.client.KeyCodeEvent#isMetaKeyDown()}
+   *             instead
+   */
+  @Deprecated
   int MODIFIER_META = 8;
+
+  /**
+   * @deprecated use
+   *             {@link com.google.gwt.event.dom.client.KeyCodeEvent#isShiftKeyDown()}
+   *             instead
+   */
+  @Deprecated
   int MODIFIER_SHIFT = 1;
 
   /**
@@ -58,8 +182,14 @@
    *          value is a combination of the bits defined by
    *          {@link KeyboardListener#MODIFIER_SHIFT},
    *          {@link KeyboardListener#MODIFIER_CTRL}, and
-   *          {@link KeyboardListener#MODIFIER_ALT}.
+   *          {@link KeyboardListener#MODIFIER_ALT}
+   * 
+   * 
+   * @deprecated use
+   *             {@link com.google.gwt.event.dom.client.KeyDownHandler#onKeyDown(com.google.gwt.event.dom.client.KeyDownEvent)}
+   *             instead
    */
+  @Deprecated
   void onKeyDown(Widget sender, char keyCode, int modifiers);
 
   /**
@@ -81,8 +211,12 @@
    *          value is a combination of the bits defined by
    *          {@link KeyboardListener#MODIFIER_SHIFT},
    *          {@link KeyboardListener#MODIFIER_CTRL}, and
-   *          {@link KeyboardListener#MODIFIER_ALT}.
+   *          {@link KeyboardListener#MODIFIER_ALT}
+   * @deprecated use
+   *             {@link com.google.gwt.event.dom.client.KeyPressHandler#onKeyPress(com.google.gwt.event.dom.client.KeyPressEvent)}
+   *             instead
    */
+  @Deprecated
   void onKeyPress(Widget sender, char keyCode, int modifiers);
 
   /**
@@ -95,7 +229,11 @@
    *          value is a combination of the bits defined by
    *          {@link KeyboardListener#MODIFIER_SHIFT},
    *          {@link KeyboardListener#MODIFIER_CTRL}, and
-   *          {@link KeyboardListener#MODIFIER_ALT}.
+   *          {@link KeyboardListener#MODIFIER_ALT}
+   * @deprecated use
+   *             {@link com.google.gwt.event.dom.client.KeyUpHandler#onKeyUp(com.google.gwt.event.dom.client.KeyUpEvent)}
+   *             instead
    */
+  @Deprecated
   void onKeyUp(Widget sender, char keyCode, int modifiers);
 }
diff --git a/user/src/com/google/gwt/user/client/ui/LazyPanel.java b/user/src/com/google/gwt/user/client/ui/LazyPanel.java
index 5aca1a2..58b0f53 100644
--- a/user/src/com/google/gwt/user/client/ui/LazyPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/LazyPanel.java
@@ -21,11 +21,10 @@
  * instantiated until {@link #setVisible}(true) or {@link #ensureWidget} is
  * called.
  * <p>
- * <h3>Example</h3>
- * {@example com.google.gwt.examples.LazyPanelExample}
+ * <h3>Example</h3> {@example com.google.gwt.examples.LazyPanelExample}
  */
 public abstract class LazyPanel extends SimplePanel {
-  
+
   public LazyPanel() {
   }
 
@@ -51,13 +50,13 @@
   }
 
   @Override
-  /**
-   * Sets whether this object is visible. If <code>visible</code> is 
+  /*
+   * Sets whether this object is visible. If <code>visible</code> is
    * <code>true</code>, creates the sole child widget if necessary by calling
    * {@link #ensureWidget}.
    * 
-   * @param visible <code>true</code> to show the object, <code>false</code>
-   * to hide it
+   * @param visible <code>true</code> to show the object, <code>false</code> to
+   * hide it
    */
   public void setVisible(boolean visible) {
     if (visible) {
diff --git a/user/src/com/google/gwt/user/client/ui/ListenerWrapper.java b/user/src/com/google/gwt/user/client/ui/ListenerWrapper.java
index ce639b9..321815d 100644
--- a/user/src/com/google/gwt/user/client/ui/ListenerWrapper.java
+++ b/user/src/com/google/gwt/user/client/ui/ListenerWrapper.java
@@ -33,6 +33,7 @@
 import com.google.gwt.event.dom.client.HasAllKeyHandlers;
 import com.google.gwt.event.dom.client.HasChangeHandlers;
 import com.google.gwt.event.dom.client.HasClickHandlers;
+import com.google.gwt.event.dom.client.HasErrorHandlers;
 import com.google.gwt.event.dom.client.HasLoadHandlers;
 import com.google.gwt.event.dom.client.HasMouseDownHandlers;
 import com.google.gwt.event.dom.client.HasMouseMoveHandlers;
@@ -226,8 +227,10 @@
   public static class Load extends ListenerWrapper<LoadListener> implements
       LoadHandler, ErrorHandler {
 
-    public static void add(HasLoadHandlers source, LoadListener listener) {
-      source.addLoadHandler(new Load(listener));
+    public static <S extends HasLoadHandlers & HasErrorHandlers>void add(S source, LoadListener listener) {
+      Load l = new Load(listener);
+      source.addLoadHandler(l);
+      source.addErrorHandler(l);
     }
 
     public static void remove(Widget eventSource, LoadListener listener) {
diff --git a/user/src/com/google/gwt/user/client/ui/LoadListener.java b/user/src/com/google/gwt/user/client/ui/LoadListener.java
index fed7374..47acf54 100644
--- a/user/src/com/google/gwt/user/client/ui/LoadListener.java
+++ b/user/src/com/google/gwt/user/client/ui/LoadListener.java
@@ -20,9 +20,8 @@
 /**
  * Event listener interface for 'load' events.
  * 
- * @deprecated use {@link com.google.gwt.event.dom.client.LoadHandler}
- *             and/or {@link com.google.gwt.event.dom.client.ErrorHandler}
- *             instead
+ * @deprecated use {@link com.google.gwt.event.dom.client.LoadHandler} and/or
+ *             {@link com.google.gwt.event.dom.client.ErrorHandler} instead
  */
 @Deprecated
 public interface LoadListener extends EventListener {
diff --git a/user/src/com/google/gwt/user/client/ui/MouseListener.java b/user/src/com/google/gwt/user/client/ui/MouseListener.java
index f80c5c8..0ad8fb8 100644
--- a/user/src/com/google/gwt/user/client/ui/MouseListener.java
+++ b/user/src/com/google/gwt/user/client/ui/MouseListener.java
@@ -20,8 +20,7 @@
 /**
  * Event listener interface for mouse events.
  * 
- * @deprecated use
- *             {@link com.google.gwt.event.dom.client.MouseDownHandler},
+ * @deprecated use {@link com.google.gwt.event.dom.client.MouseDownHandler},
  *             {@link com.google.gwt.event.dom.client.MouseUpHandler},
  *             {@link com.google.gwt.event.dom.client.MouseOverHandler},
  *             {@link com.google.gwt.event.dom.client.MouseMoveHandler}, and/or
@@ -36,21 +35,33 @@
    * @param sender the widget sending the event
    * @param x the x coordinate of the mouse
    * @param y the y coordinate of the mouse
+   * @deprecated use
+   *             {@link com.google.gwt.event.dom.client.MouseDownHandler#onMouseDown(com.google.gwt.event.dom.client.MouseDownEvent)}
+   *             instead
    */
+  @Deprecated
   void onMouseDown(Widget sender, int x, int y);
 
   /**
    * Fired when the mouse enters a widget's area.
    * 
    * @param sender the widget sending the event
+   * @deprecated use
+   *             {@link com.google.gwt.event.dom.client.MouseOverHandler#onMouseOver(com.google.gwt.event.dom.client.MouseOverEvent)}
+   *             instead
    */
+  @Deprecated
   void onMouseEnter(Widget sender);
 
   /**
    * Fired when the mouse leaves a widget's area.
    * 
    * @param sender the widget sending the event
+   * @deprecated use
+   *             {@link com.google.gwt.event.dom.client.MouseOutHandler#onMouseOut(com.google.gwt.event.dom.client.MouseOutEvent)}
+   *             instead
    */
+  @Deprecated
   void onMouseLeave(Widget sender);
 
   /**
@@ -59,7 +70,11 @@
    * @param sender the widget sending the event
    * @param x the x coordinate of the mouse
    * @param y the y coordinate of the mouse
+   * @deprecated use
+   *             {@link com.google.gwt.event.dom.client.MouseMoveHandler#onMouseMove(com.google.gwt.event.dom.client.MouseMoveEvent)}
+   *             instead
    */
+  @Deprecated
   void onMouseMove(Widget sender, int x, int y);
 
   /**
@@ -68,6 +83,10 @@
    * @param sender the widget sending the event
    * @param x the x coordinate of the mouse
    * @param y the y coordinate of the mouse
+   * @deprecated use
+   *             {@link com.google.gwt.event.dom.client.MouseUpHandler#onMouseUp(com.google.gwt.event.dom.client.MouseUpEvent)}
+   *             instead
    */
+  @Deprecated
   void onMouseUp(Widget sender, int x, int y);
 }
diff --git a/user/src/com/google/gwt/user/client/ui/MouseListenerAdapter.java b/user/src/com/google/gwt/user/client/ui/MouseListenerAdapter.java
index 10b5018..601ab6c 100644
--- a/user/src/com/google/gwt/user/client/ui/MouseListenerAdapter.java
+++ b/user/src/com/google/gwt/user/client/ui/MouseListenerAdapter.java
@@ -19,8 +19,7 @@
  * An adapter to simplify mouse event listeners that do not need all events
  * defined on the MouseListener interface.
  * 
- * @deprecated use
- *             {@link com.google.gwt.event.dom.client.MouseDownHandler},
+ * @deprecated use {@link com.google.gwt.event.dom.client.MouseDownHandler},
  *             {@link com.google.gwt.event.dom.client.MouseUpHandler},
  *             {@link com.google.gwt.event.dom.client.MouseOverHandler},
  *             {@link com.google.gwt.event.dom.client.MouseMoveHandler}, and/or
diff --git a/user/src/com/google/gwt/user/client/ui/MouseListenerCollection.java b/user/src/com/google/gwt/user/client/ui/MouseListenerCollection.java
index 08c1336..390b2c6 100644
--- a/user/src/com/google/gwt/user/client/ui/MouseListenerCollection.java
+++ b/user/src/com/google/gwt/user/client/ui/MouseListenerCollection.java
@@ -66,12 +66,10 @@
    */
   public void fireMouseEvent(Widget sender, Event event) {
     final Element senderElem = sender.getElement();
-    int x = DOM.eventGetClientX(event)
-        - DOM.getAbsoluteLeft(senderElem)
+    int x = DOM.eventGetClientX(event) - DOM.getAbsoluteLeft(senderElem)
         + DOM.getElementPropertyInt(senderElem, "scrollLeft")
         + Window.getScrollLeft();
-    int y = DOM.eventGetClientY(event)
-        - DOM.getAbsoluteTop(senderElem)
+    int y = DOM.eventGetClientY(event) - DOM.getAbsoluteTop(senderElem)
         + DOM.getElementPropertyInt(senderElem, "scrollTop")
         + Window.getScrollTop();
 
diff --git a/user/src/com/google/gwt/user/client/ui/MouseWheelListener.java b/user/src/com/google/gwt/user/client/ui/MouseWheelListener.java
index b60bd93..65c4499 100644
--- a/user/src/com/google/gwt/user/client/ui/MouseWheelListener.java
+++ b/user/src/com/google/gwt/user/client/ui/MouseWheelListener.java
@@ -1,12 +1,12 @@
 /*
  * 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
@@ -20,16 +20,16 @@
 /**
  * Event listener interface for mouse wheel events.
  * 
- * @deprecated use
- *             {@link com.google.gwt.event.dom.client.MouseWheelHandler} instead
- *             
+ * @deprecated use {@link com.google.gwt.event.dom.client.MouseWheelHandler}
+ *             instead
+ * 
  */
 @Deprecated
 public interface MouseWheelListener extends EventListener {
 
   /**
    * Fired when the user scrolls the mouse wheel over a widget.
-   *
+   * 
    * @param sender the widget sending the event
    * @param velocity the velocity information for the wheel event
    */
diff --git a/user/src/com/google/gwt/user/client/ui/MouseWheelVelocity.java b/user/src/com/google/gwt/user/client/ui/MouseWheelVelocity.java
index bf66739..86732d3 100644
--- a/user/src/com/google/gwt/user/client/ui/MouseWheelVelocity.java
+++ b/user/src/com/google/gwt/user/client/ui/MouseWheelVelocity.java
@@ -25,8 +25,10 @@
  * 
  * @see com.google.gwt.user.client.DOM#eventGetMouseWheelVelocityY An
  *      explanation of the units used for mouse wheel velocity.
+ * @deprecated use
+ *             {@link com.google.gwt.event.dom.client.MouseWheelEvent#getDeltaY()}
+ *             instead
  */
-
 @Deprecated
 public class MouseWheelVelocity {
 
@@ -59,7 +61,11 @@
    *         if the mouse wheel is moving north (toward the top of the screen)
    *         or negative if the mouse wheel is moving south (toward the bottom
    *         of the screen)
+   * @deprecated use
+   *             {@link com.google.gwt.event.dom.client.MouseWheelEvent#getDeltaY()}
+   *             instead
    */
+  @Deprecated
   public int getDeltaY() {
     return vY;
   }
@@ -75,7 +81,11 @@
    * 
    * @return <code>true</code> if the velocity includes a component directed
    *         toword the top of the screen
+   * @deprecated use
+   *             {@link com.google.gwt.event.dom.client.MouseWheelEvent#isNorth()}
+   *             instead
    */
+  @Deprecated
   public boolean isNorth() {
     return getDeltaY() < 0;
   }
@@ -86,7 +96,11 @@
    * 
    * @return <code>true</code> if the velocity includes a component directed
    *         toword the bottom of the screen
+   * @deprecated use
+   *             {@link com.google.gwt.event.dom.client.MouseWheelEvent#isSouth()}
+   *             instead
    */
+  @Deprecated
   public boolean isSouth() {
     return getDeltaY() > 0;
   }
diff --git a/user/src/com/google/gwt/user/client/ui/MultiWordSuggestOracle.java b/user/src/com/google/gwt/user/client/ui/MultiWordSuggestOracle.java
index a4f91b3..645dc23 100644
--- a/user/src/com/google/gwt/user/client/ui/MultiWordSuggestOracle.java
+++ b/user/src/com/google/gwt/user/client/ui/MultiWordSuggestOracle.java
@@ -38,29 +38,29 @@
  * <p>
  * <table width = "100%" border = "1">
  * <tr>
- * <td><b> All Suggestions </b> </td>
- * <td><b>Query string</b> </td>
+ * <td><b> All Suggestions </b></td>
+ * <td><b>Query string</b></td>
  * <td><b>Matching Suggestions</b></td>
  * </tr>
  * <tr>
- * <td> John Smith, Joe Brown, Jane Doe, Jane Smith, Bob Jones</td>
- * <td> Jo</td>
- * <td> John Smith, Joe Brown, Bob Jones</td>
+ * <td>John Smith, Joe Brown, Jane Doe, Jane Smith, Bob Jones</td>
+ * <td>Jo</td>
+ * <td>John Smith, Joe Brown, Bob Jones</td>
  * </tr>
  * <tr>
- * <td> John Smith, Joe Brown, Jane Doe, Jane Smith, Bob Jones</td>
- * <td> Smith</td>
- * <td> John Smith, Jane Smith</td>
+ * <td>John Smith, Joe Brown, Jane Doe, Jane Smith, Bob Jones</td>
+ * <td>Smith</td>
+ * <td>John Smith, Jane Smith</td>
  * </tr>
  * <tr>
- * <td> Georgia, New York, California</td>
- * <td> g</td>
- * <td> Georgia</td>
+ * <td>Georgia, New York, California</td>
+ * <td>g</td>
+ * <td>Georgia</td>
  * </tr>
  * </table>
  * </p>
  */
-public final class MultiWordSuggestOracle extends SuggestOracle {
+public class MultiWordSuggestOracle extends SuggestOracle {
 
   /**
    * Suggestion class for {@link MultiWordSuggestOracle}.
@@ -127,9 +127,11 @@
    */
   private char[] whitespaceChars;
 
+  private Response defaultResponse;
+
   /**
-   * Constructor for <code>MultiWordSuggestOracle</code>. This uses a space
-   * as the whitespace character.
+   * Constructor for <code>MultiWordSuggestOracle</code>. This uses a space as
+   * the whitespace character.
    * 
    * @see #MultiWordSuggestOracle(String)
    */
@@ -138,8 +140,8 @@
   }
 
   /**
-   * Constructor for <code>MultiWordSuggestOracle</code> which takes in a set
-   * of whitespace chars that filter its input.
+   * Constructor for <code>MultiWordSuggestOracle</code> which takes in a set of
+   * whitespace chars that filter its input.
    * <p>
    * Example: If <code>".,"</code> is passed in as whitespace, then the string
    * "foo.bar" would match the queries "foo", "bar", "foo.bar", "foo...bar", and
@@ -186,7 +188,7 @@
    * 
    * @param collection the collection
    */
-  public void addAll(Collection<String> collection) {
+  public final void addAll(Collection<String> collection) {
     for (String suggestion : collection) {
       add(suggestion);
     }
@@ -207,6 +209,15 @@
   }
 
   @Override
+  public void requestDefaultSuggestions(Request request, Callback callback) {
+    if (defaultResponse != null) {
+      callback.onSuggestionsReady(request, defaultResponse);
+    } else {
+      super.requestDefaultSuggestions(request, callback);
+    }
+  }
+
+  @Override
   public void requestSuggestions(Request request, Callback callback) {
     final List<MultiWordSuggestion> suggestions = computeItemsFor(
         request.getQuery(), request.getLimit());
@@ -214,6 +225,45 @@
     callback.onSuggestionsReady(request, response);
   }
 
+  /**
+   * Sets the default suggestion collection.
+   * 
+   * @param suggestionList the default list of suggestions
+   */
+  public void setDefaultSuggestions(Collection<Suggestion> suggestionList) {
+    this.defaultResponse = new Response(suggestionList);
+  }
+
+  /**
+   * A convenience method to set default suggestions using plain text strings.
+   * 
+   * Note to use this method each default suggestion must be plain text.
+   * 
+   * @param suggestionList the default list of suggestions
+   */
+  public final void setDefaultSuggestionsFromText(
+      Collection<String> suggestionList) {
+    Collection<Suggestion> accum = new ArrayList<Suggestion>();
+    for (String candidate : suggestionList) {
+      accum.add(createSuggestion(candidate, candidate));
+    }
+    setDefaultSuggestions(accum);
+  }
+
+  /**
+   * Creates the suggestion based on the given replacement and display strings.
+   * 
+   * @param replacementString the string to enter into the SuggestBox's text box
+   *          if the suggestion is chosen
+   * @param displayString the display string
+   * 
+   * @return the suggestion created
+   */
+  protected MultiWordSuggestion createSuggestion(String replacementString,
+      String displayString) {
+    return new MultiWordSuggestion(replacementString, displayString);
+  }
+
   String escapeText(String escapeMe) {
     convertMe.setText(escapeMe);
     String escaped = convertMe.getHTML();
@@ -284,8 +334,8 @@
       // Finish creating the formatted string.
       String end = escapeText(formattedSuggestion.substring(cursor));
       accum.append(end);
-      MultiWordSuggestion suggestion = new MultiWordSuggestion(
-          formattedSuggestion, accum.toString());
+      MultiWordSuggestion suggestion = createSuggestion(formattedSuggestion,
+          accum.toString());
       suggestions.add(suggestion);
     }
     return suggestions;
diff --git a/user/src/com/google/gwt/user/client/ui/PopupListener.java b/user/src/com/google/gwt/user/client/ui/PopupListener.java
index 98cef26..0a38b23 100644
--- a/user/src/com/google/gwt/user/client/ui/PopupListener.java
+++ b/user/src/com/google/gwt/user/client/ui/PopupListener.java
@@ -20,8 +20,8 @@
 /**
  * Event listener interface for popup events.
  * 
- * @deprecated use
- *             {@link com.google.gwt.event.logical.shared.CloseHandler} instead
+ * @deprecated use {@link com.google.gwt.event.logical.shared.CloseHandler}
+ *             instead
  */
 @Deprecated
 public interface PopupListener extends EventListener {
@@ -30,8 +30,8 @@
    * Fired when the popup is closed.
    * 
    * @param sender popup being closed.
-   * @param autoClosed <code>true</code> if the popup was automatically
-   *          closed; <code>false</code> if it was closed programmatically.
+   * @param autoClosed <code>true</code> if the popup was automatically closed;
+   *          <code>false</code> if it was closed programmatically.
    */
   @Deprecated
   void onPopupClosed(PopupPanel sender, boolean autoClosed);
diff --git a/user/src/com/google/gwt/user/client/ui/PopupListenerCollection.java b/user/src/com/google/gwt/user/client/ui/PopupListenerCollection.java
index 0c18403..b1c21b4 100644
--- a/user/src/com/google/gwt/user/client/ui/PopupListenerCollection.java
+++ b/user/src/com/google/gwt/user/client/ui/PopupListenerCollection.java
@@ -21,8 +21,9 @@
  * A helper class for implementers of the SourcesPopupEvents interface. This
  * subclass of {@link ArrayList} assumes that all objects added to it will be of
  * type {@link com.google.gwt.user.client.ui.PopupListener}.
- * @deprecated use <code>addHandler(myHandler,  CloseEvent.getType())</code>
- *             to manage handlers within your widget instead
+ * 
+ * @deprecated use <code>addHandler(myHandler,  CloseEvent.getType())</code> to
+ *             manage handlers within your widget instead
  */
 @Deprecated
 public class PopupListenerCollection extends ArrayList<PopupListener> {
@@ -31,8 +32,8 @@
    * Fires a popup closed event to all listeners.
    * 
    * @param sender the widget sending the event.
-   * @param autoClosed <code>true</code> if the popup was automatically
-   *          closed; <code>false</code> if it was closed programmatically.
+   * @param autoClosed <code>true</code> if the popup was automatically closed;
+   *          <code>false</code> if it was closed programmatically.
    */
   @Deprecated
   public void firePopupClosed(PopupPanel sender, boolean autoClosed) {
diff --git a/user/src/com/google/gwt/user/client/ui/PopupPanel.java b/user/src/com/google/gwt/user/client/ui/PopupPanel.java
index 105b3be..707fc0b 100644
--- a/user/src/com/google/gwt/user/client/ui/PopupPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/PopupPanel.java
@@ -34,6 +34,9 @@
 import com.google.gwt.user.client.Event.NativePreviewHandler;
 import com.google.gwt.user.client.ui.impl.PopupImpl;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * A panel that can "pop up" over other widgets. It overlays the browser's
  * client area (and any previously-created popups).
@@ -97,7 +100,7 @@
    * </ul>
    */
   static enum AnimationType {
-    CENTER, ONE_WAY_CORNER
+    CENTER, ONE_WAY_CORNER, ROLL_DOWN
   }
 
   /**
@@ -141,7 +144,7 @@
 
       // Determine if we need to animate
       boolean animate = curPanel.isAnimationEnabled;
-      if (curPanel.animType == AnimationType.ONE_WAY_CORNER && !showing) {
+      if (curPanel.animType != AnimationType.CENTER && !showing) {
         animate = false;
       }
 
@@ -207,17 +210,25 @@
       int bottom = 0;
       int height = (int) (progress * offsetHeight);
       int width = (int) (progress * offsetWidth);
-      if (curPanel.animType == AnimationType.CENTER) {
-        top = (offsetHeight - height) >> 1;
-        left = (offsetWidth - width) >> 1;
-      } else if (curPanel.animType == AnimationType.ONE_WAY_CORNER) {
-        if (LocaleInfo.getCurrentLocale().isRTL()) {
-          left = offsetWidth - width;
-        }
+      switch (curPanel.animType) {
+        case ROLL_DOWN:
+          right = offsetWidth;
+          bottom = height;
+          break;
+        case CENTER:
+          top = (offsetHeight - height) >> 1;
+          left = (offsetWidth - width) >> 1;
+          right = left + width;
+          bottom = top + height;
+          break;
+        case ONE_WAY_CORNER:
+          if (LocaleInfo.getCurrentLocale().isRTL()) {
+            left = offsetWidth - width;
+          }
+          right = left + width;
+          bottom = top + height;
+          break;
       }
-      right = left + width;
-      bottom = top + height;
-
       // Set the rect clipping
       impl.setClip(curPanel.getElement(), getRectString(top, right, bottom,
           left));
@@ -280,7 +291,7 @@
 
   private boolean isAnimationEnabled = false;
 
-  private Element autoHidePartner;
+  private List<Element> autoHidePartners;
 
   /**
    * The {@link ResizeAnimation} used to open and close the {@link PopupPanel}s.
@@ -334,6 +345,20 @@
     this.modal = modal;
   }
 
+  /**
+   * Mouse events that occur within an autoHide partner will not hide a panel
+   * set to autoHide.
+   * 
+   * @param partner the auto hide partner to add
+   */
+  public void addAutoHidePartner(Element partner) {
+    assert partner != null : "partner cannot be null";
+    if (autoHidePartners == null) {
+      autoHidePartners = new ArrayList<Element>();
+    }
+    autoHidePartners.add(partner);
+  }
+
   public HandlerRegistration addCloseHandler(CloseHandler<PopupPanel> handler) {
     return addHandler(handler, CloseEvent.getType());
   }
@@ -422,14 +447,16 @@
   }
 
   /**
-   * Hides the popup. This has no effect if it is not currently visible.
+   * Hides the popup and detaches it from the page. This has no effect if it is
+   * not currently showing.
    */
   public void hide() {
     hide(false);
   }
 
   /**
-   * Hides the popup. This has no effect if it is not currently visible.
+   * Hides the popup and detaches it from the page. This has no effect if it is
+   * not currently showing.
    * 
    * @param autoClosed the value that will be passed to
    *          {@link CloseHandler#onClose(CloseEvent)} when the popup is closed
@@ -484,6 +511,31 @@
   }
 
   /**
+   * Determines whether or not this popup is showing.
+   * 
+   * @return <code>true</code> if the popup is showing
+   * @see #show()
+   * @see #hide()
+   */
+  public boolean isShowing() {
+    return showing;
+  }
+
+  /**
+   * Determines whether or not this popup is visible. Note that this just checks
+   * the <code>visibility</code> style attribute, which is set in the
+   * {@link #setVisible(boolean)} method. If you want to know if the popup is
+   * attached to the page, use {@link #isShowing()} instead.
+   * 
+   * @return <code>true</code> if the object is visible
+   * @see #setVisible(boolean)
+   */
+  @Override
+  public boolean isVisible() {
+    return !"hidden".equals(getElement().getStyle().getProperty("visibility"));
+  }
+
+  /**
    * @deprecated use {@link #onPreviewNativeEvent(NativePreviewEvent)} instead
    */
   @Deprecated
@@ -536,6 +588,18 @@
     return true;
   }
 
+  /**
+   * Remove an autoHide partner.
+   * 
+   * @param partner the auto hide partner to remove
+   */
+  public void removeAutoHidePartner(Element partner) {
+    assert partner != null : "partner cannot be null";
+    if (autoHidePartners != null) {
+      autoHidePartners.remove(partner);
+    }
+  }
+
   @Deprecated
   public void removePopupListener(PopupListener listener) {
     ListenerWrapper.Popup.remove(this, listener);
@@ -556,16 +620,6 @@
   }
 
   /**
-   * If the auto hide partner is non null, its mouse events will not hide a
-   * panel set to autohide.
-   * 
-   * @param element new auto hide partner
-   */
-  public void setAutoHidePartner(Element element) {
-    this.autoHidePartner = element;
-  }
-
-  /**
    * Sets the height of the panel's child widget. If the panel's child widget
    * has not been set, the height passed in will be cached and used to set the
    * height immediately after the child widget is set.
@@ -670,10 +724,14 @@
   }
 
   /**
-   * Sets whether this object is visible.
+   * Sets whether this object is visible. This method just sets the
+   * <code>visibility</code> style attribute. You need to call {@link #show()}
+   * to actually attached/detach the {@link PopupPanel} to the page.
    * 
    * @param visible <code>true</code> to show the object, <code>false</code> to
    *          hide it
+   * @see #show()
+   * @see #hide()
    */
   @Override
   public void setVisible(boolean visible) {
@@ -720,7 +778,8 @@
   }
 
   /**
-   * Shows the popup. It must have a child widget before this method is called.
+   * Shows the popup and attach it to the page. It must have a child widget
+   * before this method is called.
    */
   public void show() {
     if (showing) {
@@ -834,14 +893,23 @@
   }-*/;
 
   /**
-   * Does the event target the partner element?
+   * Does the event target one of the partner elements?
    * 
    * @param event the native event
-   * @return true if the event targets the partner
+   * @return true if the event targets a partner
    */
   private boolean eventTargetsPartner(Event event) {
-    return autoHidePartner != null
-        && autoHidePartner.isOrHasChild(event.getTarget());
+    if (autoHidePartners == null) {
+      return false;
+    }
+
+    Element target = event.getTarget();
+    for (Element elem : autoHidePartners) {
+      if (elem.isOrHasChild(target)) {
+        return true;
+      }
+    }
+    return false;
   }
 
   /**
@@ -855,7 +923,7 @@
   }
 
   /**
-   * Get the element that {@link PopupImpl} uses.  PopupImpl creates an element
+   * Get the element that {@link PopupImpl} uses. PopupImpl creates an element
    * that goes inside of the outer element, so all methods in PopupImpl are
    * relative to the first child of the outer element, not the outer element
    * itself.
@@ -867,7 +935,8 @@
   }
 
   /**
-   * Positions the popup, called after the offset width and height of the popup are known.
+   * Positions the popup, called after the offset width and height of the popup
+   * are known.
    * 
    * @param relativeObject the ui object to position relative to
    * @param offsetWidth the drop down's offset width
diff --git a/user/src/com/google/gwt/user/client/ui/ScrollListener.java b/user/src/com/google/gwt/user/client/ui/ScrollListener.java
index 6b50121..c8f3a4d 100644
--- a/user/src/com/google/gwt/user/client/ui/ScrollListener.java
+++ b/user/src/com/google/gwt/user/client/ui/ScrollListener.java
@@ -20,8 +20,7 @@
 /**
  * Event listener interface for scroll events.
  * 
- * @deprecated use {@link com.google.gwt.event.dom.client.ScrollHandler}
- *             instead
+ * @deprecated use {@link com.google.gwt.event.dom.client.ScrollHandler} instead
  */
 @Deprecated
 public interface ScrollListener extends EventListener {
diff --git a/user/src/com/google/gwt/user/client/ui/SourcesChangeEvents.java b/user/src/com/google/gwt/user/client/ui/SourcesChangeEvents.java
index 268f3ad..1987220 100644
--- a/user/src/com/google/gwt/user/client/ui/SourcesChangeEvents.java
+++ b/user/src/com/google/gwt/user/client/ui/SourcesChangeEvents.java
@@ -19,8 +19,13 @@
  * A widget that implements this interface sources the events defined by the
  * {@link com.google.gwt.user.client.ui.ChangeListener} interface.
  * 
- * @deprecated use {@link com.google.gwt.event.dom.client.HasChangeHandlers}
- *             instead
+ * @deprecated we have now separated dom and logical change events. Use
+ *             {@link com.google.gwt.event.dom.client.HasChangeHandlers} if the
+ *             change listener was triggered by a dom change event or
+ *             {@link com.google.gwt.event.logical.shared.HasValueChangeHandlers}
+ *             if it was based on a logical event
+ * 
+ * 
  */
 @Deprecated
 public interface SourcesChangeEvents {
@@ -29,7 +34,8 @@
    * Adds a listener interface to receive change events.
    * 
    * @param listener the listener interface to add
-   * @deprecated use <code>addChangeHandler</code> instead
+   * @deprecated use <code>addChangeHandler</code> or
+   *             <code>addValueChangeHandler</code> instead
    */
   @Deprecated
   void addChangeListener(ChangeListener listener);
diff --git a/user/src/com/google/gwt/user/client/ui/SourcesTabEvents.java b/user/src/com/google/gwt/user/client/ui/SourcesTabEvents.java
index 709d98e..d017a68 100644
--- a/user/src/com/google/gwt/user/client/ui/SourcesTabEvents.java
+++ b/user/src/com/google/gwt/user/client/ui/SourcesTabEvents.java
@@ -15,7 +15,6 @@
  */
 package com.google.gwt.user.client.ui;
 
-
 /**
  * A widget that implements this interface sources the events defined by the
  * {@link com.google.gwt.user.client.ui.TabListener} interface.
diff --git a/user/src/com/google/gwt/user/client/ui/SourcesTreeEvents.java b/user/src/com/google/gwt/user/client/ui/SourcesTreeEvents.java
index e47c443..2a986df 100644
--- a/user/src/com/google/gwt/user/client/ui/SourcesTreeEvents.java
+++ b/user/src/com/google/gwt/user/client/ui/SourcesTreeEvents.java
@@ -22,8 +22,7 @@
  * @deprecated use
  *             {@link com.google.gwt.event.logical.shared.HasBeforeSelectionHandlers}
  *             , {@link com.google.gwt.event.logical.shared.HasOpenHandlers},
- *             {@link com.google.gwt.event.dom.client.HasClickHandlers}
- *             instead
+ *             {@link com.google.gwt.event.dom.client.HasClickHandlers} instead
  */
 @Deprecated
 public interface SourcesTreeEvents {
diff --git a/user/src/com/google/gwt/user/client/ui/SuggestBox.java b/user/src/com/google/gwt/user/client/ui/SuggestBox.java
index eacf785..02bede2 100644
--- a/user/src/com/google/gwt/user/client/ui/SuggestBox.java
+++ b/user/src/com/google/gwt/user/client/ui/SuggestBox.java
@@ -15,13 +15,10 @@
  */
 package com.google.gwt.user.client.ui;
 
-import static com.google.gwt.event.dom.client.KeyCodes.KEY_DOWN;
-import static com.google.gwt.event.dom.client.KeyCodes.KEY_ENTER;
-import static com.google.gwt.event.dom.client.KeyCodes.KEY_TAB;
-import static com.google.gwt.event.dom.client.KeyCodes.KEY_UP;
-
+import com.google.gwt.event.dom.client.ChangeEvent;
 import com.google.gwt.event.dom.client.HandlesAllKeyEvents;
 import com.google.gwt.event.dom.client.HasAllKeyHandlers;
+import com.google.gwt.event.dom.client.KeyCodes;
 import com.google.gwt.event.dom.client.KeyDownEvent;
 import com.google.gwt.event.dom.client.KeyDownHandler;
 import com.google.gwt.event.dom.client.KeyPressEvent;
@@ -34,10 +31,8 @@
 import com.google.gwt.event.logical.shared.ValueChangeEvent;
 import com.google.gwt.event.logical.shared.ValueChangeHandler;
 import com.google.gwt.event.shared.HandlerRegistration;
-import com.google.gwt.i18n.client.LocaleInfo;
 import com.google.gwt.user.client.Command;
 import com.google.gwt.user.client.DOM;
-import com.google.gwt.user.client.Window;
 import com.google.gwt.user.client.ui.PopupPanel.AnimationType;
 import com.google.gwt.user.client.ui.SuggestOracle.Callback;
 import com.google.gwt.user.client.ui.SuggestOracle.Request;
@@ -46,6 +41,7 @@
 
 import java.util.Collection;
 import java.util.List;
+
 /**
  * A {@link SuggestBox} is a text box or text area which displays a
  * pre-configured set of selections that match the user's input.
@@ -91,31 +87,53 @@
  * <img class='gallery' src='SuggestBox.png'/>
  * </p>
  * 
- * <h3>CSS Style Rules</h3> 
- * <ul class='css'> 
- * <li>.gwt-SuggestBox { the suggest
- * box itself }</li> 
- * <li>.gwt-SuggestBoxPopup { the suggestion popup }</li> 
- * <li>.gwt-SuggestBoxPopup .item { an unselected suggestion }</li> 
- * <li>.gwt-SuggestBoxPopup .item-selected { a selected suggestion }</li> 
- * <li>.gwt-SuggestBoxPopup .suggestPopupTopLeft { the top left cell }</li> 
- * <li>.gwt-SuggestBoxPopup .suggestPopupTopLeftInner { the inner element of the cell }</li> 
- * <li>.gwt-SuggestBoxPopup .suggestPopupTopCenter { the top center cell }</li> 
- * <li>.gwt-SuggestBoxPopup .suggestPopupTopCenterInner { the inner element of the cell }</li> 
- * <li>.gwt-SuggestBoxPopup .suggestPopupTopRight { the top right cell }</li> 
- * <li>.gwt-SuggestBoxPopup .suggestPopupTopRightInner { the inner element of the cell }</li> 
- * <li>.gwt-SuggestBoxPopup .suggestPopupMiddleLeft { the middle left cell }</li> 
- * <li>.gwt-SuggestBoxPopup .suggestPopupMiddleLeftInner { the inner element of the cell }</li> 
- * <li>.gwt-SuggestBoxPopup .suggestPopupMiddleCenter { the middle center cell }</li> 
- * <li>.gwt-SuggestBoxPopup .suggestPopupMiddleCenterInner { the inner element of the cell }</li> 
- * <li>.gwt-SuggestBoxPopup .suggestPopupMiddleRight { the middle right cell }</li> 
- * <li>.gwt-SuggestBoxPopup .suggestPopupMiddleRightInner { the inner element of the cell }</li> 
- * <li>.gwt-SuggestBoxPopup .suggestPopupBottomLeft { the bottom left cell }</li> 
- * <li>.gwt-SuggestBoxPopup .suggestPopupBottomLeftInner { the inner element of the cell }</li> 
- * <li>.gwt-SuggestBoxPopup .suggestPopupBottomCenter { the bottom center cell }</li> 
- * <li>.gwt-SuggestBoxPopup .suggestPopupBottomCenterInner { the inner element of the cell }</li> 
- * <li>.gwt-SuggestBoxPopup .suggestPopupBottomRight { the bottom right cell }</li> 
- * <li>.gwt-SuggestBoxPopup .suggestPopupBottomRightInner { the inner element of the cell }</li> </ul>
+ * <h3>CSS Style Rules</h3>
+ * <dl>
+ * <dt>.gwt-SuggestBox</dt>
+ * <dd>the suggest box itself</dd>
+ * <dt>.gwt-SuggestBoxPopup</dt>
+ * <dd>the suggestion popup</dd>
+ * <dt>.gwt-SuggestBoxPopup .item</dt>
+ * <dd>an unselected suggestion</dd>
+ * <dt>.gwt-SuggestBoxPopup .item-selected</dt>
+ * <dd>a selected suggestion</dd>
+ * <dt>.gwt-SuggestBoxPopup .suggestPopupTopLeft</dt>
+ * <dd>the top left cell</dd>
+ * <dt>.gwt-SuggestBoxPopup .suggestPopupTopLeftInner</dt>
+ * <dd>the inner element of the cell</dd>
+ * <dt>.gwt-SuggestBoxPopup .suggestPopupTopCenter</dt>
+ * <dd>the top center cell</dd>
+ * <dt>.gwt-SuggestBoxPopup .suggestPopupTopCenterInner</dt>
+ * <dd>the inner element of the cell</dd>
+ * <dt>.gwt-SuggestBoxPopup .suggestPopupTopRight</dt>
+ * <dd>the top right cell</dd>
+ * <dt>.gwt-SuggestBoxPopup .suggestPopupTopRightInner</dt>
+ * <dd>the inner element of the cell</dd>
+ * <dt>.gwt-SuggestBoxPopup .suggestPopupMiddleLeft</dt>
+ * <dd>the middle left cell</dd>
+ * <dt>.gwt-SuggestBoxPopup .suggestPopupMiddleLeftInner</dt>
+ * <dd>the inner element of the cell</dd>
+ * <dt>.gwt-SuggestBoxPopup .suggestPopupMiddleCenter</dt>
+ * <dd>the middle center cell</dd>
+ * <dt>.gwt-SuggestBoxPopup .suggestPopupMiddleCenterInner</dt>
+ * <dd>the inner element of the cell</dd>
+ * <dt>.gwt-SuggestBoxPopup .suggestPopupMiddleRight</dt>
+ * <dd>the middle right cell</dd>
+ * <dt>.gwt-SuggestBoxPopup .suggestPopupMiddleRightInner</dt>
+ * <dd>the inner element of the cell</dd>
+ * <dt>.gwt-SuggestBoxPopup .suggestPopupBottomLeft</dt>
+ * <dd>the bottom left cell</dd>
+ * <dt>.gwt-SuggestBoxPopup .suggestPopupBottomLeftInner</dt>
+ * <dd>the inner element of the cell</dd>
+ * <dt>.gwt-SuggestBoxPopup .suggestPopupBottomCenter</dt>
+ * <dd>the bottom center cell</dd>
+ * <dt>.gwt-SuggestBoxPopup .suggestPopupBottomCenterInner</dt>
+ * <dd>the inner element of the cell</dd>
+ * <dt>.gwt-SuggestBoxPopup .suggestPopupBottomRight</dt>
+ * <dd>the bottom right cell</dd>
+ * <dt>.gwt-SuggestBoxPopup .suggestPopupBottomRightInner</dt>
+ * <dd>the inner element of the cell</dd>
+ * </dl>
  * 
  * @see SuggestOracle
  * @see MultiWordSuggestOracle
@@ -222,179 +240,16 @@
     }
   }
 
-  /**
-   * A PopupPanel with a SuggestionMenu as its widget. The SuggestionMenu is
-   * placed in a PopupPanel so that it can be displayed at various positions
-   * around the SuggestBox's text field. Moreover, the SuggestionMenu needs to
-   * appear on top of any other widgets on the page, and the PopupPanel provides
-   * this behavior.
-   * 
-   * A non-static member class is used because the popup uses the SuggestBox's
-   * SuggestionMenu as its widget, and the position of the SuggestBox's TextBox
-   * is needed in order to correctly position the popup.
-   */
-  private class SuggestionPopup extends DecoratedPopupPanel {
-    private static final String STYLENAME_DEFAULT = "gwt-SuggestBoxPopup";
-
-    public SuggestionPopup() {
-      super(true, false, "suggestPopup");
-      setWidget(suggestionMenu);
-      setStyleName(STYLENAME_DEFAULT);
-      setPreviewingAllNativeEvents(true);
-    }
-
-    /**
-     * The default position of the SuggestPopup is directly below the
-     * SuggestBox's text box, with its left edge aligned with the left edge of
-     * the text box. Depending on the width and height of the popup and the
-     * distance from the text box to the bottom and right edges of the window,
-     * the popup may be displayed directly above the text box, and/or its right
-     * edge may be aligned with the right edge of the text box.
-     */
-    public void showAlignedPopup() {
-
-      // Set the position of the popup right before it is shown.
-      setPopupPositionAndShow(new PositionCallback() {
-        public void setPosition(int offsetWidth, int offsetHeight) {
-
-          // Calculate left position for the popup. The computation for
-          // the left position is bidi-sensitive.
-
-          int textBoxOffsetWidth = box.getOffsetWidth();
-
-          // Compute the difference between the popup's width and the
-          // textbox's width
-          int offsetWidthDiff = offsetWidth - textBoxOffsetWidth;
-
-          int left;
-
-          if (LocaleInfo.getCurrentLocale().isRTL()) { // RTL case
-
-            int textBoxAbsoluteLeft = box.getAbsoluteLeft();
-
-            // Right-align the popup. Note that this computation is
-            // valid in the case where offsetWidthDiff is negative.
-            left = textBoxAbsoluteLeft - offsetWidthDiff;
-
-            // If the suggestion popup is not as wide as the text box, always
-            // align to the right edge of the text box. Otherwise, figure out
-            // whether to right-align or left-align the popup.
-            if (offsetWidthDiff > 0) {
-
-              // Make sure scrolling is taken into account, since
-              // box.getAbsoluteLeft() takes scrolling into account.
-              int windowRight = Window.getClientWidth()
-                  + Window.getScrollLeft();
-              int windowLeft = Window.getScrollLeft();
-
-              // Compute the left value for the right edge of the textbox
-              int textBoxLeftValForRightEdge = textBoxAbsoluteLeft
-                  + textBoxOffsetWidth;
-
-              // Distance from the right edge of the text box to the right edge
-              // of the window
-              int distanceToWindowRight = windowRight
-                  - textBoxLeftValForRightEdge;
-
-              // Distance from the right edge of the text box to the left edge
-              // of the window
-              int distanceFromWindowLeft = textBoxLeftValForRightEdge
-                  - windowLeft;
-
-              // If there is not enough space for the overflow of the popup's
-              // width to the right of the text box and there IS enough space
-              // for the overflow to the right of the text box, then left-align
-              // the popup. However, if there is not enough space on either
-              // side, stick with right-alignment.
-              if (distanceFromWindowLeft < offsetWidth
-                  && distanceToWindowRight >= offsetWidthDiff) {
-                // Align with the left edge of the text box.
-                left = textBoxAbsoluteLeft;
-              }
-            }
-          } else { // LTR case
-
-            // Left-align the popup.
-            left = box.getAbsoluteLeft();
-
-            // If the suggestion popup is not as wide as the text box, always
-            // align to the left edge of the text box. Otherwise, figure out
-            // whether to left-align or right-align the popup.
-            if (offsetWidthDiff > 0) {
-              // Make sure scrolling is taken into account, since
-              // box.getAbsoluteLeft() takes scrolling into account.
-              int windowRight = Window.getClientWidth()
-                  + Window.getScrollLeft();
-              int windowLeft = Window.getScrollLeft();
-
-              // Distance from the left edge of the text box to the right edge
-              // of the window
-              int distanceToWindowRight = windowRight - left;
-
-              // Distance from the left edge of the text box to the left edge of
-              // the window
-              int distanceFromWindowLeft = left - windowLeft;
-
-              // If there is not enough space for the overflow of the popup's
-              // width to the right of hte text box, and there IS enough space
-              // for the overflow to the left of the text box, then right-align
-              // the popup. However, if there is not enough space on either
-              // side, then stick with left-alignment.
-              if (distanceToWindowRight < offsetWidth
-                  && distanceFromWindowLeft >= offsetWidthDiff) {
-                // Align with the right edge of the text box.
-                left -= offsetWidthDiff;
-              }
-            }
-          }
-
-          // Calculate top position for the popup
-
-          int top = box.getAbsoluteTop();
-
-          // Make sure scrolling is taken into account, since
-          // box.getAbsoluteTop() takes scrolling into account.
-          int windowTop = Window.getScrollTop();
-          int windowBottom = Window.getScrollTop() + Window.getClientHeight();
-
-          // Distance from the top edge of the window to the top edge of the
-          // text box
-          int distanceFromWindowTop = top - windowTop;
-
-          // Distance from the bottom edge of the window to the bottom edge of
-          // the text box
-          int distanceToWindowBottom = windowBottom
-              - (top + box.getOffsetHeight());
-
-          // If there is not enough space for the popup's height below the text
-          // box and there IS enough space for the popup's height above the text
-          // box, then then position the popup above the text box. However, if
-          // there is not enough space on either side, then stick with
-          // displaying the popup below the text box.
-          if (distanceToWindowBottom < offsetHeight
-              && distanceFromWindowTop >= offsetHeight) {
-            top -= offsetHeight;
-          } else {
-            // Position above the text box
-            top += box.getOffsetHeight();
-          }
-
-          setPopupPosition(left, top);
-        }
-      });
-    }
-  }
-
   private static final String STYLENAME_DEFAULT = "gwt-SuggestBox";
 
   private int limit = 20;
-  private boolean selectsFirstItem = false;
+  private boolean selectsFirstItem = true;
   private SuggestOracle oracle;
   private String currentText;
   private final SuggestionMenu suggestionMenu;
-  private final SuggestionPopup suggestionPopup;
+  private final PopupPanel suggestionPopup;
   private final TextBoxBase box;
-  private final Callback callBack = new Callback() {
+  private final Callback callback = new Callback() {
     public void onSuggestionsReady(Request request, Response response) {
       showSuggestions(response.getSuggestions());
     }
@@ -434,8 +289,8 @@
     // suggestionMenu must be created before suggestionPopup, because
     // suggestionMenu is suggestionPopup's widget
     suggestionMenu = new SuggestionMenu(true);
-    suggestionPopup = new SuggestionPopup();
-    suggestionPopup.setAnimationType(AnimationType.ONE_WAY_CORNER);
+    suggestionPopup = createPopup();
+    suggestionPopup.setAnimationType(AnimationType.ROLL_DOWN);
 
     addEventsToTextBox();
 
@@ -455,7 +310,7 @@
   public void addChangeListener(final ChangeListener listener) {
     ListenerWrapper.Change legacy = new ListenerWrapper.Change(listener);
     legacy.setSource(this);
-    box.addChangeHandler(legacy);
+    box.addDomHandler(legacy, ChangeEvent.getType());
   }
 
   /**
@@ -533,9 +388,9 @@
   }
 
   /**
-   * Returns whether or not the first suggestion will be automatically
-   * selected. This behavior is off by default.
-   *
+   * Returns whether or not the first suggestion will be automatically selected.
+   * This behavior is off by default.
+   * 
    * @return true if the first suggestion will be automatically selected
    */
   public boolean getSelectsFirstItem() {
@@ -572,10 +427,24 @@
     return box.getValue();
   }
 
+  /**
+   * Hide current suggestions.
+   */
+  public void hideSuggestionList() {
+    this.suggestionPopup.hide();
+  }
+
   public boolean isAnimationEnabled() {
     return suggestionPopup.isAnimationEnabled();
   }
 
+  /**
+   * @return true if the list of suggestions is currently showing, false if not
+   */
+  public boolean isSuggestionListShowing() {
+    return suggestionPopup.isShowing();
+  }
+
   @Deprecated
   public void removeChangeListener(ChangeListener listener) {
     ListenerWrapper.Change.remove(box, listener);
@@ -636,7 +505,7 @@
   /**
    * Turns on or off the behavior that automatically selects the first suggested
    * item. It defaults to off.
-   *
+   * 
    * @param selectsFirstItem Whether or not to automatically select the first
    *          suggested
    */
@@ -661,6 +530,16 @@
   }
 
   /**
+   * Show the current list of suggestions.
+   */
+  public void showSuggestionList() {
+    if (isAttached()) {
+      currentText = null;
+      refreshSuggestions();
+    }
+  }
+
+  /**
    * <b>Affected Elements:</b>
    * <ul>
    * <li>-popup = The popup that appears with suggestions.</li>
@@ -676,6 +555,41 @@
     suggestionMenu.setMenuItemDebugIds(baseID);
   }
 
+  /**
+   * Gets the specified suggestion from the suggestions currently showing.
+   * 
+   * @param index the index at which the suggestion lives
+   * 
+   * @throws IndexOutOfBoundsException if the index is greater then the number
+   *           of suggestions currently showing
+   * 
+   * @return the given suggestion
+   */
+  Suggestion getSuggestion(int index) {
+    if (!isSuggestionListShowing()) {
+      throw new IndexOutOfBoundsException(
+          "No suggestions showing, so cannot show " + index);
+    }
+    return ((SuggestionMenuItem) suggestionMenu.getItems().get(index)).suggestion;
+  }
+
+  /**
+   * Get the number of suggestions that are currently showing.
+   * 
+   * @return the number of suggestions currently showing, 0 if there are none
+   */
+  int getSuggestionCount() {
+    return isSuggestionListShowing() ? suggestionMenu.getNumItems() : 0;
+  }
+
+  void showSuggestions(String query) {
+    if (query.length() == 0) {
+      oracle.requestDefaultSuggestions(new Request(null, limit), callback);
+    } else {
+      oracle.requestSuggestions(new Request(query, limit), callback);
+    }
+  }
+
   private void addEventsToTextBox() {
     class TextBoxEvents extends HandlesAllKeyEvents implements
         ValueChangeHandler<String> {
@@ -685,14 +599,14 @@
         // are only relevant when choosing a suggestion.
         if (suggestionPopup.isAttached()) {
           switch (event.getNativeKeyCode()) {
-            case KEY_DOWN:
+            case KeyCodes.KEY_DOWN:
               suggestionMenu.selectItem(suggestionMenu.getSelectedItemIndex() + 1);
               break;
-            case KEY_UP:
+            case KeyCodes.KEY_UP:
               suggestionMenu.selectItem(suggestionMenu.getSelectedItemIndex() - 1);
               break;
-            case KEY_ENTER:
-            case KEY_TAB:
+            case KeyCodes.KEY_ENTER:
+            case KeyCodes.KEY_TAB:
               if (suggestionMenu.getSelectedItemIndex() < 0) {
                 suggestionPopup.hide();
               } else {
@@ -701,40 +615,21 @@
               break;
           }
         }
-        fireEvent(event);
+        delegateEvent(SuggestBox.this, event);
       }
 
       public void onKeyPress(KeyPressEvent event) {
-        fireEvent(event);
+        delegateEvent(SuggestBox.this, event);
       }
 
       public void onKeyUp(KeyUpEvent event) {
         // After every user key input, refresh the popup's suggestions.
         refreshSuggestions();
-        fireEvent(event);
+        delegateEvent(SuggestBox.this, event);
       }
 
       public void onValueChange(ValueChangeEvent<String> event) {
-         fireEvent(event);
-      }
-
-      private void refreshSuggestions() {
-        // Get the raw text.
-        String text = box.getText();
-        if (text.equals(currentText)) {
-          return;
-        } else {
-          currentText = text;
-        }
-
-        if (text.length() == 0) {
-          // Optimization to avoid calling showSuggestions with an empty
-          // string
-          suggestionPopup.hide();
-          suggestionMenu.clearItems();
-        } else {
-          showSuggestions(text);
-        }
+        delegateEvent(SuggestBox.this, event);
       }
     }
 
@@ -743,10 +638,30 @@
     box.addValueChangeHandler(events);
   }
 
+  private PopupPanel createPopup() {
+    PopupPanel p = new DecoratedPopupPanel(true, false, "suggestPopup");
+    p.setWidget(suggestionMenu);
+    p.setStyleName("gwt-SuggestBoxPopup");
+    p.setPreviewingAllNativeEvents(true);
+    p.addAutoHidePartner(getTextBox().getElement());
+    return p;
+  }
+
   private void fireSuggestionEvent(Suggestion selectedSuggestion) {
     SelectionEvent.fire(this, selectedSuggestion);
   }
 
+  private void refreshSuggestions() {
+    // Get the raw text.
+    String text = box.getText();
+    if (text.equals(currentText)) {
+      return;
+    } else {
+      currentText = text;
+    }
+    showSuggestions(text);
+  }
+
   private void setNewSelection(SuggestionMenuItem menuItem) {
     Suggestion curSuggestion = menuItem.getSuggestion();
     currentText = curSuggestion.getReplacementString();
@@ -777,7 +692,6 @@
       // and added to the menu.
       boolean isAnimationEnabled = suggestionPopup.isAnimationEnabled();
       if (suggestionPopup.isAttached()) {
-        suggestionPopup.setAnimationEnabled(false);
         suggestionPopup.hide();
       }
 
@@ -800,14 +714,10 @@
         suggestionMenu.selectItem(0);
       }
 
-      suggestionPopup.showAlignedPopup();
+      suggestionPopup.showRelativeTo(getTextBox());
       suggestionPopup.setAnimationEnabled(isAnimationEnabled);
     } else {
       suggestionPopup.hide();
     }
   }
-
-  private void showSuggestions(String query) {
-    oracle.requestSuggestions(new Request(query, limit), callBack);
-  }
 }
diff --git a/user/src/com/google/gwt/user/client/ui/SuggestOracle.java b/user/src/com/google/gwt/user/client/ui/SuggestOracle.java
index 6a90447..5218ff3 100644
--- a/user/src/com/google/gwt/user/client/ui/SuggestOracle.java
+++ b/user/src/com/google/gwt/user/client/ui/SuggestOracle.java
@@ -17,6 +17,7 @@
 
 import com.google.gwt.user.client.rpc.IsSerializable;
 
+import java.util.ArrayList;
 import java.util.Collection;
 
 /**
@@ -26,39 +27,12 @@
  * 
  * @see SuggestBox
  */
-public abstract class SuggestOracle {
-
-  /**
-   * Constructor for {@link com.google.gwt.user.client.ui.SuggestOracle}.
-   */
-  public SuggestOracle() {
-  }
-
-  /**
-   * Should {@link Suggestion} display strings be treated as HTML? If true, this
-   * all suggestions' display strings will be interpreted as HTML, otherwise as
-   * text.
-   * 
-   * @return by default, returns false
-   */
-  public boolean isDisplayStringHTML() {
-    return false;
-  }
-
-  /**
-   * Generate a {@link Response} based on a specific {@link Request}. After the
-   * {@link Response} is created, it is passed into
-   * {@link Callback#onSuggestionsReady(com.google.gwt.user.client.ui.SuggestOracle.Request, com.google.gwt.user.client.ui.SuggestOracle.Response)}.
-   * 
-   * @param request the request
-   * @param callback the callback to use for the response
-   */
-  public abstract void requestSuggestions(Request request, Callback callback);
-
+public abstract class SuggestOracle { 
+  private Response emptyResponse = new Response(new ArrayList<Suggestion>());
   /**
    * Callback for {@link com.google.gwt.user.client.ui.SuggestOracle}. Every
    * {@link Request} should be associated with a callback that should be called
-   * after a {@link  Response} is generated.
+   * after a {@link Response} is generated.
    */
   public interface Callback {
     /**
@@ -257,4 +231,49 @@
      */
     String getReplacementString();
   }
+
+  /**
+   * Constructor for {@link com.google.gwt.user.client.ui.SuggestOracle}.
+   */
+  public SuggestOracle() {
+  }
+
+  /**
+   * Should {@link Suggestion} display strings be treated as HTML? If true, this
+   * all suggestions' display strings will be interpreted as HTML, otherwise as
+   * text.
+   * 
+   * @return by default, returns false
+   */
+  public boolean isDisplayStringHTML() {
+    return false;
+  }
+
+  /**
+   * Generate a {@link Response} based on a default request. The request query
+   * must be null as it represents the results the oracle should return based on
+   * no query string.
+   * <p>
+   * After the {@link Response} is created, it is passed into
+   * {@link Callback#onSuggestionsReady(com.google.gwt.user.client.ui.SuggestOracle.Request, com.google.gwt.user.client.ui.SuggestOracle.Response)}
+   * .
+   * </p>
+   * 
+   * @param request the request
+   * @param callback the callback to use for the response
+   */
+  public void requestDefaultSuggestions(Request request, Callback callback) {
+    assert (request.query == null);
+    callback.onSuggestionsReady(request, emptyResponse);
+  }
+
+  /**
+   * Generate a {@link Response} based on a specific {@link Request}. After the
+   * {@link Response} is created, it is passed into
+   * {@link Callback#onSuggestionsReady(com.google.gwt.user.client.ui.SuggestOracle.Request, com.google.gwt.user.client.ui.SuggestOracle.Response)}.
+   * 
+   * @param request the request
+   * @param callback the callback to use for the response
+   */
+  public abstract void requestSuggestions(Request request, Callback callback);
 }
diff --git a/user/src/com/google/gwt/user/client/ui/SuggestionEvent.java b/user/src/com/google/gwt/user/client/ui/SuggestionEvent.java
index 3ae2bc0..813666b 100644
--- a/user/src/com/google/gwt/user/client/ui/SuggestionEvent.java
+++ b/user/src/com/google/gwt/user/client/ui/SuggestionEvent.java
@@ -1,12 +1,12 @@
 /*
  * 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
@@ -20,7 +20,7 @@
 /**
  * Event object containing information about the selection of a
  * {@link SuggestOracle.Suggestion} displayed by a {@link SuggestBox}.
- *
+ * 
  * @see SuggestBox#addEventHandler(SuggestionHandler)
  */
 public class SuggestionEvent extends EventObject {
@@ -28,7 +28,7 @@
   private SuggestOracle.Suggestion selectedSuggestion;
 
   public SuggestionEvent(SuggestBox sender,
-                         SuggestOracle.Suggestion selectedSuggestion) {
+      SuggestOracle.Suggestion selectedSuggestion) {
     super(sender);
     this.selectedSuggestion = selectedSuggestion;
   }
@@ -36,7 +36,7 @@
   /**
    * Gets the <code>Suggestion</code> object for the suggestion chosen by the
    * user.
-   *
+   * 
    * @return the <code>Suggestion</code> object for the selected suggestion
    */
   public SuggestOracle.Suggestion getSelectedSuggestion() {
@@ -48,13 +48,13 @@
    * the string representation of the SuggestBox from which the event originated
    * (the source), and the string representation of the Suggestion that was
    * selected.
-   *
+   * 
    * @return the string representation of this event object containing the
    *         source SuggestBox and the selected Suggestion
    */
   @Override
   public String toString() {
-    return "[source=" + getSource() +
-        ", selectedSuggestion=" + getSelectedSuggestion() + "]";
+    return "[source=" + getSource() + ", selectedSuggestion="
+        + getSelectedSuggestion() + "]";
   }
 }
diff --git a/user/src/com/google/gwt/user/client/ui/SuggestionHandler.java b/user/src/com/google/gwt/user/client/ui/SuggestionHandler.java
index 112e069..e11900b 100644
--- a/user/src/com/google/gwt/user/client/ui/SuggestionHandler.java
+++ b/user/src/com/google/gwt/user/client/ui/SuggestionHandler.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2008 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
@@ -19,19 +19,25 @@
 
 /**
  * Event handler interface for {@link SuggestionEvent}.
- *
+ * 
  * @see SuggestBox
+ * 
+ * @deprecated use {@link com.google.gwt.event.logical.shared.SelectionHandler}
+ *             instead
  */
 @Deprecated
 public interface SuggestionHandler extends EventListener {
 
   /**
-   * Fired when a suggestion is selected. Users can select a suggestion from
-   * the SuggestBox by clicking on one of the suggestions, or by pressing
-   * the ENTER key to select the suggestion that is currently highlighted.
-   *
-   * @param event the object containing information about this event
+   * Fired when a suggestion is selected. Users can select a suggestion from the
+   * SuggestBox by clicking on one of the suggestions, or by pressing the ENTER
+   * key to select the suggestion that is currently highlighted.
+   * 
+   * @param event the object containing information about this event deprecated
+   *          use
+   *          {@link com.google.gwt.event.logical.shared.SelectionHandler#onSelection(com.google.gwt.event.logical.shared.SelectionEvent)}
+   *          instead
    */
-  @Deprecated
+
   void onSuggestionSelected(SuggestionEvent event);
 }
diff --git a/user/src/com/google/gwt/user/client/ui/TabListener.java b/user/src/com/google/gwt/user/client/ui/TabListener.java
index 478fac3..a6ebad7 100644
--- a/user/src/com/google/gwt/user/client/ui/TabListener.java
+++ b/user/src/com/google/gwt/user/client/ui/TabListener.java
@@ -21,6 +21,12 @@
  * Event listener interface for tab events, used primarily by
  * {@link com.google.gwt.user.client.ui.TabBar} and
  * {@link com.google.gwt.user.client.ui.TabPanel}.
+ * 
+ * @deprecated use
+ *             {@link TabPanel#addBeforeSelectionHandler(com.google.gwt.event.logical.shared.BeforeSelectionHandler)}
+ *             and/or
+ *             {@link TabPanel#addSelectionHandler(com.google.gwt.event.logical.shared.SelectionHandler)}
+ *             instead
  */
 @Deprecated
 public interface TabListener extends EventListener {
@@ -33,6 +39,9 @@
    * @param tabIndex the index of the tab about to be selected
    * @return <code>false</code> to disallow the selection. If any listener
    *         returns false, then the selection will be disallowed.
+   * @deprecated use
+   *             {@link TabPanel#addBeforeSelectionHandler(com.google.gwt.event.logical.shared.BeforeSelectionHandler)}
+   *             instead
    */
   @Deprecated
   boolean onBeforeTabSelected(SourcesTabEvents sender, int tabIndex);
@@ -42,6 +51,9 @@
    * 
    * @param sender the {@link TabBar} or {@link TabPanel} whose tab was selected
    * @param tabIndex the index of the tab that was selected
+   * @deprecated use
+   *             {@link TabPanel#addSelectionHandler(com.google.gwt.event.logical.shared.SelectionHandler)}
+   *             instead
    */
   @Deprecated
   void onTabSelected(SourcesTabEvents sender, int tabIndex);
diff --git a/user/src/com/google/gwt/user/client/ui/TabListenerCollection.java b/user/src/com/google/gwt/user/client/ui/TabListenerCollection.java
index 4693454..968fed3 100644
--- a/user/src/com/google/gwt/user/client/ui/TabListenerCollection.java
+++ b/user/src/com/google/gwt/user/client/ui/TabListenerCollection.java
@@ -35,7 +35,6 @@
    * @param sender the widget sending the event
    * @param tabIndex the index of the tab being selected
    */
-  @Deprecated
   public boolean fireBeforeTabSelected(SourcesTabEvents sender, int tabIndex) {
     for (TabListener listener : this) {
       if (!listener.onBeforeTabSelected(sender, tabIndex)) {
@@ -51,7 +50,6 @@
    * @param sender the widget sending the event
    * @param tabIndex the index of the tab being selected
    */
-  @Deprecated
   public void fireTabSelected(SourcesTabEvents sender, int tabIndex) {
     for (TabListener listener : this) {
       listener.onTabSelected(sender, tabIndex);
diff --git a/user/src/com/google/gwt/user/client/ui/TabPanel.java b/user/src/com/google/gwt/user/client/ui/TabPanel.java
index 2203703..2a3bf67 100644
--- a/user/src/com/google/gwt/user/client/ui/TabPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/TabPanel.java
@@ -354,22 +354,12 @@
     return deck.iterator();
   }
 
-  public void onBeforeSelection(BeforeSelectionEvent<Integer> event) {
-    if (!onBeforeTabSelected(tabBar, event.getItem().intValue())) {
-      event.cancel();
-    }
-  }
-
   @Deprecated
   public boolean onBeforeTabSelected(SourcesTabEvents sender, int tabIndex) {
     BeforeSelectionEvent<Integer> event = BeforeSelectionEvent.fire(this, tabIndex);
     return event == null || !event.isCanceled();
   }
 
-  public void onSelection(SelectionEvent<Integer> event) {
-    onTabSelected(tabBar, event.getSelectedItem().intValue());
-  }
-
   @Deprecated
   public void onTabSelected(SourcesTabEvents sender, int tabIndex) {
     deck.showWidget(tabIndex);
diff --git a/user/src/com/google/gwt/user/client/ui/TableListener.java b/user/src/com/google/gwt/user/client/ui/TableListener.java
index eab2ec9..c714321 100644
--- a/user/src/com/google/gwt/user/client/ui/TableListener.java
+++ b/user/src/com/google/gwt/user/client/ui/TableListener.java
@@ -19,6 +19,10 @@
 
 /**
  * Event listener interface for table events.
+ * 
+ * @deprecated use {@link com.google.gwt.event.dom.client.ClickHandler} and
+ *             {@link HTMLTable#getCellForEvent(com.google.gwt.event.dom.client.ClickEvent)}
+ *             instead
  */
 @Deprecated
 public interface TableListener extends EventListener {
@@ -29,6 +33,10 @@
    * @param sender the widget sending the event
    * @param row the row of the cell being clicked
    * @param cell the index of the cell being clicked
+   * 
+   * @deprecated use {@link com.google.gwt.event.dom.client.ClickHandler} and
+   *             {@link HTMLTable#getCellForEvent(com.google.gwt.event.dom.client.ClickEvent)}
+   *             instead
    */
   @Deprecated
   void onCellClicked(SourcesTableEvents sender, int row, int cell);
diff --git a/user/src/com/google/gwt/user/client/ui/TextBoxBase.java b/user/src/com/google/gwt/user/client/ui/TextBoxBase.java
index 62a6d9a..ca4d3ae 100644
--- a/user/src/com/google/gwt/user/client/ui/TextBoxBase.java
+++ b/user/src/com/google/gwt/user/client/ui/TextBoxBase.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2007 Google Inc.
+ * Copyright 2009 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
@@ -19,7 +19,6 @@
 import com.google.gwt.dom.client.Element;
 import com.google.gwt.event.dom.client.ChangeEvent;
 import com.google.gwt.event.dom.client.ChangeHandler;
-import com.google.gwt.event.dom.client.HasChangeHandlers;
 import com.google.gwt.event.logical.shared.ValueChangeEvent;
 import com.google.gwt.event.logical.shared.ValueChangeHandler;
 import com.google.gwt.event.shared.HandlerRegistration;
@@ -32,7 +31,7 @@
  */
 @SuppressWarnings("deprecation")
 public class TextBoxBase extends FocusWidget implements SourcesChangeEvents,
-    HasChangeHandlers, HasText, HasName, HasValue<String> {
+    HasText, HasName, HasValue<String> {
 
   /**
    * Text alignment constant, used in
@@ -77,6 +76,7 @@
   private static TextBoxImpl impl = GWT.create(TextBoxImpl.class);
 
   private Event currentEvent;
+  private boolean valueChangeHandlerInitialized;
 
   /**
    * Creates a text box that wraps the given browser element handle. This is
@@ -88,24 +88,21 @@
     super(elem);
   }
 
-  public HandlerRegistration addChangeHandler(ChangeHandler handler) {
-    return addDomHandler(handler, ChangeEvent.getType());
-  }
-
   @Deprecated
   public void addChangeListener(ChangeListener listener) {
-    addChangeHandler(new ListenerWrapper.Change(listener));
+    addDomHandler(new ListenerWrapper.Change(listener), ChangeEvent.getType());
   }
 
   public HandlerRegistration addValueChangeHandler(
       ValueChangeHandler<String> handler) {
     // Initialization code
-    if (!isEventHandled(ValueChangeEvent.getType())) {
-      addChangeHandler(new ChangeHandler() {
+    if (!valueChangeHandlerInitialized) {
+      valueChangeHandlerInitialized = true;
+      addDomHandler(new ChangeHandler() {
         public void onChange(ChangeEvent event) {
-          setValue(getText());
+          ValueChangeEvent.fire(TextBoxBase.this, getText());
         }
-      });
+      }, ChangeEvent.getType());
     }
     return addHandler(handler, ValueChangeEvent.getType());
   }
@@ -229,7 +226,10 @@
    * listeners to easily filter keyboard input.
    * 
    * @param key the new key value
+   * @deprecated this method only works in IE and should not have been added to
+   *             the API
    */
+  @Deprecated
   public void setKey(char key) {
     if (currentEvent != null) {
       DOM.eventSetKeyCode(currentEvent, key);
diff --git a/user/src/com/google/gwt/user/client/ui/Tree.java b/user/src/com/google/gwt/user/client/ui/Tree.java
index 3f794ba..f27b247 100644
--- a/user/src/com/google/gwt/user/client/ui/Tree.java
+++ b/user/src/com/google/gwt/user/client/ui/Tree.java
@@ -72,11 +72,14 @@
  * <img class='gallery' src='Tree.png'/>
  * </p>
  * <h3>CSS Style Rules</h3>
- * <ul class='css'>
- * <li>.gwt-Tree { the tree itself }</li>
- * <li>.gwt-Tree .gwt-TreeItem { a tree item }</li>
- * <li>.gwt-Tree .gwt-TreeItem-selected { a selected tree item }</li>
- * </ul>
+ * <dl>
+ * <dt>.gwt-Tree</dt>
+ * <dd>the tree itself</dd>
+ * <dt>.gwt-Tree .gwt-TreeItem</dt>
+ * <dd>a tree item</dd>
+ * <dt>.gwt-Tree .gwt-TreeItem-selected</dt>
+ * <dd>a selected tree item</dd>
+ * </dl>
  * <p>
  * <h3>Example</h3>
  * {@example com.google.gwt.examples.TreeExample}
@@ -353,7 +356,7 @@
   }
 
   public HandlerRegistration addMouseDownHandler(MouseDownHandler handler) {
-    return addHandler(handler,MouseDownEvent.getType());
+    return addHandler(handler, MouseDownEvent.getType());
   }
 
   @Deprecated
@@ -362,23 +365,23 @@
   }
 
   public HandlerRegistration addMouseMoveHandler(MouseMoveHandler handler) {
-    return addDomHandler(handler,MouseMoveEvent.getType());
+    return addDomHandler(handler, MouseMoveEvent.getType());
   }
 
   public HandlerRegistration addMouseOutHandler(MouseOutHandler handler) {
-    return addDomHandler(handler,MouseOutEvent.getType());
+    return addDomHandler(handler, MouseOutEvent.getType());
   }
 
   public HandlerRegistration addMouseOverHandler(MouseOverHandler handler) {
-    return addDomHandler(handler,MouseOverEvent.getType());
+    return addDomHandler(handler, MouseOverEvent.getType());
   }
 
   public HandlerRegistration addMouseUpHandler(MouseUpHandler handler) {
-    return addDomHandler(handler,MouseUpEvent.getType());
+    return addDomHandler(handler, MouseUpEvent.getType());
   }
 
   public HandlerRegistration addMouseWheelHandler(MouseWheelHandler handler) {
-    return addDomHandler(handler,MouseWheelEvent.getType());
+    return addDomHandler(handler, MouseWheelEvent.getType());
   }
 
   public final HandlerRegistration addOpenHandler(OpenHandler<TreeItem> handler) {
@@ -1039,7 +1042,7 @@
    * Move the tree focus to the specified selected item.
    */
   private void moveFocus() {
-    HasFocus focusableWidget = curSelection.getFocusableWidget();
+    Focusable focusableWidget = curSelection.getFocusable();
     if (focusableWidget != null) {
       focusableWidget.setFocus(true);
       DOM.scrollIntoView(((Widget) focusableWidget).getElement());
diff --git a/user/src/com/google/gwt/user/client/ui/TreeItem.java b/user/src/com/google/gwt/user/client/ui/TreeItem.java
index c3c808f..38c5756 100644
--- a/user/src/com/google/gwt/user/client/ui/TreeItem.java
+++ b/user/src/com/google/gwt/user/client/ui/TreeItem.java
@@ -619,11 +619,35 @@
   }
 
   /**
+   * Returns a suggested {@link Focusable} instance to use when this tree item
+   * is selected. The tree maintains focus if this method returns null. By
+   * default, if the tree item contains a focusable widget, that widget is
+   * returned.
+   * 
+   * Note, the {@link Tree} will ignore this value if the user clicked on an
+   * input element such as a button or text area when selecting this item.
+   * 
+   * @return the focusable item
+   */
+  protected Focusable getFocusable() {
+    Focusable focus = getFocusableWidget();
+    if (focus == null) {
+      Widget w = getWidget();
+      if (w instanceof Focusable) {
+        focus = (Focusable) w;
+      }
+    }
+    return focus;
+  }
+
+  /**
    * Returns the widget, if any, that should be focused on if this TreeItem is
    * selected.
    * 
+   * @deprecated use {@link #getFocusable()} instead
    * @return widget to be focused.
    */
+  @Deprecated
   protected HasFocus getFocusableWidget() {
     Widget w = getWidget();
     if (w instanceof HasFocus) {
diff --git a/user/src/com/google/gwt/user/client/ui/TreeListener.java b/user/src/com/google/gwt/user/client/ui/TreeListener.java
index e879df6..c251be0 100644
--- a/user/src/com/google/gwt/user/client/ui/TreeListener.java
+++ b/user/src/com/google/gwt/user/client/ui/TreeListener.java
@@ -19,6 +19,10 @@
 
 /**
  * Event listener interface for tree events.
+ * 
+ * @deprecated use {@link com.google.gwt.event.logical.shared.SelectionHandler},
+ *             {@link com.google.gwt.event.logical.shared.OpenHandler}, and/or
+ *             {@link com.google.gwt.event.logical.shared.CloseHandler} instead
  */
 @Deprecated
 public interface TreeListener extends EventListener {
@@ -27,6 +31,9 @@
    * Fired when a tree item is selected.
    * 
    * @param item the item being selected.
+   * @deprecated use
+   *             {@link com.google.gwt.event.logical.shared.SelectionHandler#onSelection(com.google.gwt.event.logical.shared.SelectionEvent)}
+   *             instead
    */
   @Deprecated
   void onTreeItemSelected(TreeItem item);
@@ -35,6 +42,10 @@
    * Fired when a tree item is opened or closed.
    * 
    * @param item the item whose state is changing.
+   * @deprecated use
+   *             {@link com.google.gwt.event.logical.shared.OpenHandler#onOpen(com.google.gwt.event.logical.shared.OpenEvent)}
+   *             and/or
+   *             {@link com.google.gwt.event.logical.shared.CloseHandler#onClose(com.google.gwt.event.logical.shared.CloseEvent)}
    */
   @Deprecated
   void onTreeItemStateChanged(TreeItem item);
diff --git a/user/src/com/google/gwt/user/client/ui/TreeListenerCollection.java b/user/src/com/google/gwt/user/client/ui/TreeListenerCollection.java
index 92bd35d..f1099f5 100644
--- a/user/src/com/google/gwt/user/client/ui/TreeListenerCollection.java
+++ b/user/src/com/google/gwt/user/client/ui/TreeListenerCollection.java
@@ -32,7 +32,6 @@
    * 
    * @param item the tree item being selected.
    */
-  @Deprecated
   public void fireItemSelected(TreeItem item) {
     for (TreeListener listener : this) {
       listener.onTreeItemSelected(item);
@@ -44,7 +43,6 @@
    * 
    * @param item the tree item whose state has changed.
    */
-  @Deprecated
   public void fireItemStateChanged(TreeItem item) {
     for (TreeListener listener : this) {
       listener.onTreeItemStateChanged(item);
diff --git a/user/src/com/google/gwt/user/client/ui/Widget.java b/user/src/com/google/gwt/user/client/ui/Widget.java
index 7f23170..e544e6a 100644
--- a/user/src/com/google/gwt/user/client/ui/Widget.java
+++ b/user/src/com/google/gwt/user/client/ui/Widget.java
@@ -41,7 +41,6 @@
    */
   int eventsToSink;
   private boolean attached;
-
   private Object layoutData;
   private Widget parent;
   private HandlerManager handlerManager;
@@ -129,8 +128,8 @@
   /**
    * Overridden to defer the call to super.sinkEvents until the first time this
    * widget is attached to the dom, as a performance enhancement. Subclasses
-   * wishing to customize sinkEvents can preserve this deferred sink behavior
-   * by putting their implementation behind a check of {@link #isOrWasAttached()}:
+   * wishing to customize sinkEvents can preserve this deferred sink behavior by
+   * putting their implementation behind a check of <code>isOrWasAttached()</code>:
    * 
    * <pre>
    * {@literal @}Override
@@ -183,6 +182,17 @@
   }
 
   /**
+   * Fires an event on a child widget. Used to delegate the handling of an event
+   * from one widget to another.
+   * 
+   * @param event the event
+   * @param target fire the event on the given target
+   */
+  protected void delegateEvent(Widget target, GwtEvent<?> event) {
+    target.fireEvent(event);
+  }
+
+  /**
    * If a widget contains one or more child widgets that are not in the logical
    * widget hierarchy (the child is physically connected only on the DOM level),
    * it must override this method and call {@link #onAttach()} for each of its
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 d9fc83d..1332561 100644
--- a/user/src/com/google/gwt/user/datepicker/client/DateBox.java
+++ b/user/src/com/google/gwt/user/datepicker/client/DateBox.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2008 Google Inc.
+ * Copyright 2009 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
@@ -70,9 +70,9 @@
    * If that fails, we then try to parse again using the default browser date
    * parsing.
    * </p>
-   * If that fails, the <code>dateBoxFormatError</code> css style is
-   * applied to the {@link DateBox}. The style will be removed when either a
-   * successful {@link #parse(DateBox,String, boolean)} is called or
+   * If that fails, the <code>dateBoxFormatError</code> css style is applied to
+   * the {@link DateBox}. The style will be removed when either a successful
+   * {@link #parse(DateBox,String, boolean)} is called or
    * {@link #format(DateBox,Date)} is called.
    * <p>
    * Use a different {@link DateBox.Format} instance to change that behavior.
@@ -183,7 +183,7 @@
       CloseHandler<PopupPanel> {
 
     public void onBlur(BlurEvent event) {
-      if (isDatePickerVisible() == false) {
+      if (isDatePickerShowing() == false) {
         updateDateFromTextBox();
       }
     }
@@ -201,7 +201,7 @@
     }
 
     public void onFocus(FocusEvent event) {
-      if (allowDPShow && isDatePickerVisible() == false) {
+      if (allowDPShow && isDatePickerShowing() == false) {
         showDatePicker();
       }
     }
@@ -267,7 +267,7 @@
     this.format = format;
 
     popup.setAutoHideEnabled(true);
-    popup.setAutoHidePartner(box.getElement());
+    popup.addAutoHidePartner(box.getElement());
     popup.setWidget(picker);
     popup.setStyleName("dateBoxPopup");
 
@@ -354,10 +354,10 @@
   }
 
   /**
-   * @return true if date picker is currently visible, false if not
+   * @return true if date picker is currently showing, false if not
    */
-  public boolean isDatePickerVisible() {
-    return popup.isVisible();
+  public boolean isDatePickerShowing() {
+    return popup.isShowing();
   }
 
   /**
diff --git a/user/src/com/google/gwt/user/rebind/rpc/ProxyCreator.java b/user/src/com/google/gwt/user/rebind/rpc/ProxyCreator.java
index 77726a2..e237865 100644
--- a/user/src/com/google/gwt/user/rebind/rpc/ProxyCreator.java
+++ b/user/src/com/google/gwt/user/rebind/rpc/ProxyCreator.java
@@ -580,8 +580,8 @@
         pw.print(", "
             + Boolean.toString(deserializationSto.maybeInstantiated(type)));
         pw.print(", " + Boolean.toString(serializationSto.isSerializable(type)));
-        pw.println(", "
-            + Boolean.toString(serializationSto.maybeInstantiated(type)));
+        pw.print(", "
+            + Boolean.toString(serializationSto.maybeInstantiated(type)) + '\n');
       }
 
       // Closes the wrapped streams.
diff --git a/user/src/com/google/gwt/user/rebind/rpc/SerializableTypeOracleBuilder.java b/user/src/com/google/gwt/user/rebind/rpc/SerializableTypeOracleBuilder.java
index 73c4564..4c50a95 100644
--- a/user/src/com/google/gwt/user/rebind/rpc/SerializableTypeOracleBuilder.java
+++ b/user/src/com/google/gwt/user/rebind/rpc/SerializableTypeOracleBuilder.java
@@ -340,10 +340,6 @@
   /**
    * Returns <code>true</code> if this type is part of the standard java
    * packages.
-   * 
-   * NOTE: This code is copied from
-   * {@link com.google.gwt.dev.shell.CompilingClassLoader CompilingClassLoader};
-   * don't change one without changing the other.
    */
   static boolean isInStandardJavaPackage(String className) {
     if (className.startsWith("java.")) {
diff --git a/user/src/com/google/gwt/user/tools/.classpathsrc b/user/src/com/google/gwt/user/tools/.classpathsrc
index 19b3e77..d2b73b6 100644
--- a/user/src/com/google/gwt/user/tools/.classpathsrc
+++ b/user/src/com/google/gwt/user/tools/.classpathsrc
@@ -1,10 +1,8 @@
 <?xml version="1.0" encoding="utf-8" ?>
 <classpath>
    <classpathentry kind="src" path="src"/>
-   <classpathentry kind="src" path="test"/>
-   <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
    <classpathentry kind="lib" path="@gwtUserPath"/>
+   <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
    <classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/3"/>
    <classpathentry kind="output" path="war/WEB-INF/classes"/>
-@eclipseClassPathEntries
 </classpath>
diff --git a/user/src/com/google/gwt/user/tools/.projectsrc b/user/src/com/google/gwt/user/tools/.projectsrc
index 23afa59..2436f15 100644
--- a/user/src/com/google/gwt/user/tools/.projectsrc
+++ b/user/src/com/google/gwt/user/tools/.projectsrc
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8" ?>
 <projectDescription>
-   <name>@projectName</name>
-   <comment>@projectName project</comment>
+   <name>@moduleShortName</name>
+   <comment>@moduleShortName project</comment>
    <projects/>
    <buildSpec>
        <buildCommand>
diff --git a/user/src/com/google/gwt/user/tools/App.launchsrc b/user/src/com/google/gwt/user/tools/App.launchsrc
index 1f9e95c..428e717 100644
--- a/user/src/com/google/gwt/user/tools/App.launchsrc
+++ b/user/src/com/google/gwt/user/tools/App.launchsrc
@@ -3,15 +3,13 @@
 <booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="false"/>
 <stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="@shellClass"/>
 <listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
-<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.eclipse.jdt.launching.JRE_CONTAINER&quot; javaProject=&quot;@projectName&quot; path=&quot;1&quot; type=&quot;4&quot;/&gt;&#13;&#10;"/>
-<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/@projectName/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
-<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry id=&quot;org.eclipse.jdt.launching.classpathentry.defaultClasspath&quot;&gt;&#13;&#10;&lt;memento project=&quot;@projectName&quot;/&gt;&#13;&#10;&lt;/runtimeClasspathEntry&gt;&#13;&#10;"/>
-<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry externalArchive=&quot;@gwtDevPath&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
-@eclipseExtraLaunchPaths
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.eclipse.jdt.launching.JRE_CONTAINER&quot; javaProject=&quot;@moduleShortName&quot; path=&quot;1&quot; type=&quot;4&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/@moduleShortName/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry id=&quot;org.eclipse.jdt.launching.classpathentry.defaultClasspath&quot;&gt;&#10;&lt;memento project=&quot;@moduleShortName&quot;/&gt;&#10;&lt;/runtimeClasspathEntry&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry externalArchive=&quot;@gwtDevPath&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
 </listAttribute>
-<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="@vmargs -Xmx256M"/>
-<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-out
-  war -startupUrl @startupUrl @moduleName"/>
-<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="@projectName"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xmx256M@vmargs"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-startupUrl&#10;@startupUrl @moduleName"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="@moduleShortName"/>
 <booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
 </launchConfiguration>
diff --git a/user/src/com/google/gwt/user/tools/AppClassTemplate.javasrc b/user/src/com/google/gwt/user/tools/AppClassTemplate.javasrc
index f2cd244..6a25968 100644
--- a/user/src/com/google/gwt/user/tools/AppClassTemplate.javasrc
+++ b/user/src/com/google/gwt/user/tools/AppClassTemplate.javasrc
@@ -2,21 +2,25 @@
 
 import com.google.gwt.core.client.EntryPoint;
 import com.google.gwt.core.client.GWT;
+import com.google.gwt.event.dom.client.ClickEvent;
+import com.google.gwt.event.dom.client.ClickHandler;
 import com.google.gwt.user.client.Window;
 import com.google.gwt.user.client.rpc.AsyncCallback;
-import com.google.gwt.user.client.rpc.ServiceDefTarget;
 import com.google.gwt.user.client.ui.Button;
-import com.google.gwt.user.client.ui.ClickListener;
 import com.google.gwt.user.client.ui.DialogBox;
 import com.google.gwt.user.client.ui.Image;
 import com.google.gwt.user.client.ui.RootPanel;
 import com.google.gwt.user.client.ui.VerticalPanel;
-import com.google.gwt.user.client.ui.Widget;
 
 /**
  * Entry point classes define <code>onModuleLoad()</code>.
  */
-public class @className implements EntryPoint {
+public class @moduleShortName implements EntryPoint {
+
+  /**
+   * Create a remote service proxy to talk to the server-side Echo service.
+   */
+  private final EchoServiceAsync echoService = GWT.create(EchoService.class);
 
   /**
    * This is the entry point method.
@@ -24,12 +28,12 @@
   public void onModuleLoad() {
     Image img = new Image("http://code.google.com/webtoolkit/logo-185x175.png");
     Button button = new Button("Click me");
-    
+
     // We can add style names
     button.addStyleName("pc-template-btn");
     // or we can set an id on a specific element for styling
     img.getElement().setId("pc-template-img");
-    
+
     VerticalPanel vPanel = new VerticalPanel();
     vPanel.setWidth("100%");
     vPanel.setHorizontalAlignment(VerticalPanel.ALIGN_CENTER);
@@ -48,28 +52,18 @@
     dialogVPanel.setHorizontalAlignment(VerticalPanel.ALIGN_CENTER);
     dialogVPanel.add(closeButton);
 
-    closeButton.addClickListener(new ClickListener() {
-      public void onClick(Widget sender) {
+    closeButton.addClickHandler(new ClickHandler() {
+      public void onClick(ClickEvent event) {
         dialogBox.hide();
       }
     });
-    
+
     // Set the contents of the Widget
     dialogBox.setWidget(dialogVPanel);
- 
-    final EchoServiceAsync echoService = GWT.create(EchoService.class);
-    ServiceDefTarget target = (ServiceDefTarget) echoService;
 
-    // Use a module-relative URLs to ensure that this client code can find
-    // its way home, even when the URL changes (as might happen when you
-    // deploy this as a webapp under an external servlet container).
-    String moduleRelativeURL = GWT.getModuleBaseURL() + "echo";
-    target.setServiceEntryPoint(moduleRelativeURL);
-    
-    final String textToServer = "Hello GWT World!";
-    
-    button.addClickListener(new ClickListener() {
-      public void onClick(Widget sender) {
+    button.addClickHandler(new ClickHandler() {
+      public void onClick(ClickEvent event) {
+        final String textToServer = "Hello GWT World!";
         final String dialogBoxText = "Sending to the server: " + textToServer;
         dialogBox.setText(dialogBoxText);
         dialogBox.center();
diff --git a/user/src/com/google/gwt/user/tools/AppHtml.htmlsrc b/user/src/com/google/gwt/user/tools/AppHtml.htmlsrc
index 2090fe7..47a42e3 100644
--- a/user/src/com/google/gwt/user/tools/AppHtml.htmlsrc
+++ b/user/src/com/google/gwt/user/tools/AppHtml.htmlsrc
@@ -12,18 +12,18 @@
     <!--                                                               -->
     <!-- Consider inlining CSS to reduce the number of requested files -->
     <!--                                                               -->
-    <link type="text/css" rel="stylesheet" href="@className.css">
+    <link type="text/css" rel="stylesheet" href="@moduleShortName.css">
     <!--                                           -->
     <!-- Any title is fine                         -->
     <!--                                           -->
-    <title>@className</title>
+    <title>@moduleShortName</title>
     
     <!--                                           -->
     <!-- This script loads your compiled module.   -->
     <!-- If you add any GWT meta tags, they must   -->
     <!-- be added before this line.                -->
     <!--                                           -->
-    <script type="text/javascript" language="javascript" src="@newModuleName/@newModuleName.nocache.js"></script>
+    <script type="text/javascript" language="javascript" src="@renameTo/@renameTo.nocache.js"></script>
   </head>
 
   <!--                                           -->
diff --git a/user/src/com/google/gwt/user/tools/ApplicationCreator.java b/user/src/com/google/gwt/user/tools/ApplicationCreator.java
index 8ea80bb..9097740 100644
--- a/user/src/com/google/gwt/user/tools/ApplicationCreator.java
+++ b/user/src/com/google/gwt/user/tools/ApplicationCreator.java
@@ -15,525 +15,15 @@
  */
 package com.google.gwt.user.tools;
 
-import com.google.gwt.dev.cfg.ModuleDefLoader;
-import com.google.gwt.user.tools.util.ArgHandlerAddToClassPath;
-import com.google.gwt.user.tools.util.ArgHandlerEclipse;
-import com.google.gwt.user.tools.util.ArgHandlerIgnore;
-import com.google.gwt.user.tools.util.ArgHandlerOverwrite;
-import com.google.gwt.user.tools.util.CreatorUtilities;
-import com.google.gwt.util.tools.ArgHandlerExtra;
-import com.google.gwt.util.tools.ArgHandlerOutDir;
-import com.google.gwt.util.tools.ArgHandlerString;
-import com.google.gwt.util.tools.ToolBase;
-import com.google.gwt.util.tools.Utility;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.StringTokenizer;
-
 /**
- * Creates a GWT application skeleton.
+ * Legacy ApplicationCreator that will let users know that they should run
+ * {@link WebAppCreator} instead.
  */
-public final class ApplicationCreator extends ToolBase {
-
-  /*
-   * Arguments for the application creator.
-   */
-
-  /**
-   * Add an extra module injection into the top level module file.
-   */
-  protected class ArgHandlerAddModule extends ArgHandlerString {
-    private List<String> extraModuleList = new ArrayList<String>();
-
-    public List<String> getExtraModuleList() {
-      return extraModuleList;
-    }
-
-    @Override
-    public String getPurpose() {
-      return "Adds extra GWT modules to be inherited.";
-    }
-
-    @Override
-    public String getTag() {
-      return "-addModule";
-    }
-
-    @Override
-    public String[] getTagArgs() {
-      return new String[] {"module"};
-    }
-
-    @Override
-    public boolean setString(String str) {
-      // Parse out a comma separated list
-      StringTokenizer st = new StringTokenizer(str, ",");
-      while (st.hasMoreTokens()) {
-        String module = st.nextToken();
-
-        // Check className to see that it is a period separated string of words.
-        if (!module.matches("[\\w\\$]+(\\.[\\w\\$]+)+")) {
-          System.err.println("'" + module
-              + "' does not appear to be a valid fully-qualified module name");
-          return false;
-        }
-        extraModuleList.add(module);
-      }
-
-      return true;
-    }
-  }
-
-  /**
-   * Specify the top level class name of the application to create.
-   */
-  protected class ArgHandlerAppClass extends ArgHandlerExtra {
-
-    @Override
-    public boolean addExtraArg(String arg) {
-      if (fullClassName != null) {
-        System.err.println("Too many arguments");
-        return false;
-      }
-
-      // Check className for certain properties
-      if (!arg.matches("[\\w\\$]+(\\.[\\w\\$]+)+")) {
-        System.err.println("'" + arg
-            + "' does not appear to be a valid fully-qualified Java class name");
-        return false;
-      }
-
-      // Check out the class name.
-      if (arg.indexOf('$') != -1) {
-        System.err.println("'" + arg
-            + "': This version of the tool does not support nested classes");
-        return false;
-      }
-
-      String[] parts = arg.split("\\.");
-      if (parts.length < 2 || !parts[parts.length - 2].equals("client")) {
-        System.err.println("'"
-            + arg
-            + "': Please use 'client' as the final package, as in 'com.example.foo.client.MyApp'.\n"
-            + "It isn't technically necessary, but this tool enforces the best practice.");
-        return false;
-      }
-
-      fullClassName = arg;
-      return true;
-    }
-
-    @Override
-    public String getPurpose() {
-      return "The fully-qualified name of the application class to create";
-    }
-
-    @Override
-    public String[] getTagArgs() {
-      return new String[] {"className"};
-    }
-
-    @Override
-    public boolean isRequired() {
-      return true;
-    }
-  }
-
-  static class FileCreator {
-    private final File dir;
-    private final String sourceName;
-    private final String className;
-
-    FileCreator(File dir, String sourceName, String className) {
-      this.dir = dir;
-      this.sourceName = sourceName;
-      this.className = className;
-    }
-  }
-
-  private static final String PACKAGE_PATH;
-
-  static {
-    String path = ApplicationCreator.class.getName();
-    path = path.substring(0, path.lastIndexOf('.') + 1);
-    PACKAGE_PATH = path.replace('.', '/');
-  }
+public final class ApplicationCreator {
 
   public static void main(String[] args) {
-    ApplicationCreator creator = new ApplicationCreator();
-    if (creator.processArgs(args)) {
-      if (creator.run()) {
-        return;
-      }
-    }
+    System.err.println("This application no longer exists!");
+    System.err.println("Please see " + WebAppCreator.class.getName());
     System.exit(1);
   }
-
-  /**
-   * @param fullClassName Name of the fully-qualified Java class to create as an
-   *          Application.
-   * @param outDir Where to put the output files
-   * @param eclipse The name of a project to attach a .launch config to
-   * @param overwrite Overwrite an existing files if they exist.
-   * @param ignore Ignore existing files if they exist.
-   * @throws IOException
-   */
-  static void createApplication(String fullClassName, File outDir,
-      String eclipse, boolean overwrite, boolean ignore) throws IOException {
-    createApplication(fullClassName, outDir, eclipse, overwrite, ignore, null,
-        null);
-  }
-
-  /**
-   * @param fullClassName Name of the fully-qualified Java class to create as an
-   *          Application.
-   * @param outDir Where to put the output files
-   * @param eclipse The name of a project to attach a .launch config to
-   * @param overwrite Overwrite an existing files if they exist.
-   * @param ignore Ignore existing files if they exist.
-   * @param extraClassPaths A list of paths to append to the class path for
-   *          launch configs.
-   * @param extraModules A list of GWT modules to add 'inherits' tags for.
-   * @throws IOException
-   */
-  static void createApplication(String fullClassName, File outDir,
-      String eclipse, boolean overwrite, boolean ignore,
-      List<String> extraClassPaths, List<String> extraModules)
-      throws IOException {
-    createApplication(fullClassName, outDir, eclipse, overwrite, ignore,
-        extraClassPaths, extraModules, null);
-  }
-
-  /**
-   * @param fullClassName Name of the fully-qualified Java class to create as an
-   *          Application.
-   * @param outDir Where to put the output files
-   * @param eclipse The name of a project to attach a .launch config to
-   * @param overwrite Overwrite an existing files if they exist.
-   * @param ignore Ignore existing files if they exist.
-   * @param extraClassPaths A list of paths to append to the class path for
-   *          launch configs.
-   * @param extraModules A list of GWT modules to add 'inherits' tags for.
-   * @param newModuleName The new module name
-   * @throws IOException
-   */
-  static void createApplication(String fullClassName, File outDir,
-      String eclipse, boolean overwrite, boolean ignore,
-      List<String> extraClassPaths, List<String> extraModules,
-      String newModuleName) throws IOException {
-
-    // Figure out the installation directory
-
-    String installPath = Utility.getInstallPath();
-    String gwtUserPath = installPath + '/' + "gwt-user.jar";
-    String gwtDevPath = installPath + '/' + Utility.getDevJarName();
-    String gwtServletPath = installPath + '/' + "gwt-servlet.jar";
-
-    // Validate the arguments for extra class path entries and modules.
-    if (!CreatorUtilities.validatePathsAndModules(gwtUserPath, extraClassPaths,
-        extraModules)) {
-      return;
-    }
-    // Figure out what platform we're on
-    // 
-    boolean isWindows = gwtDevPath.substring(gwtDevPath.lastIndexOf('/') + 1).indexOf(
-        "windows") >= 0;
-    boolean isMacOsX = gwtDevPath.substring(gwtDevPath.lastIndexOf('/') + 1).indexOf(
-        "mac") >= 0;
-
-    // If the path from here to the install directory is relative, we need to
-    // set specific "base" directory tags; this is for sample generation during
-    // the build.
-    String basePathEnv;
-    if (!new File(installPath).isAbsolute()) {
-      if (isWindows) {
-        basePathEnv = "%~dp0\\";
-      } else {
-        basePathEnv = "$APPDIR/";
-      }
-    } else {
-      basePathEnv = "";
-    }
-
-    // Check out the class and package names.
-    //
-    int pos = fullClassName.lastIndexOf('.');
-    String clientPackageName = fullClassName.substring(0, pos);
-    String className = fullClassName.substring(pos + 1);
-
-    // Compute module name and directories
-    //
-    pos = clientPackageName.lastIndexOf('.');
-    File basePackageDir;
-    String moduleName;
-    String serverPackageName = null;
-    File javaDir = Utility.getDirectory(outDir, "src", true);
-    Utility.getDirectory(outDir, "test", true);
-    File warDir = Utility.getDirectory(outDir, "war", true);
-    File webInfDir = Utility.getDirectory(warDir, "WEB-INF", true);
-    if (pos >= 0) {
-      String basePackage = clientPackageName.substring(0, pos);
-      moduleName = basePackage + "." + className;
-      serverPackageName = basePackage + ".server";
-      basePackage = basePackage.replace('.', '/');
-      basePackageDir = Utility.getDirectory(javaDir, basePackage, true);
-    } else {
-      moduleName = className;
-      basePackageDir = javaDir;
-      serverPackageName = "server";
-    }
-    File clientDir = Utility.getDirectory(basePackageDir, "client", true);
-    File serverDir = Utility.getDirectory(basePackageDir, "server", true);
-    String startupUrl = className + ".html";
-
-    // Create a map of replacements
-    //
-    Map<String, String> replacements = new HashMap<String, String>();
-    replacements.put("@className", className);
-    replacements.put("@moduleName", moduleName);
-    replacements.put("@clientPackage", clientPackageName);
-    replacements.put("@serverPackage", serverPackageName);
-    replacements.put("@gwtUserPath", basePathEnv + gwtUserPath);
-    replacements.put("@gwtDevPath", basePathEnv + gwtDevPath);
-    replacements.put("@shellClass", "com.google.gwt.dev.GWTHosted");
-    replacements.put("@compileClass", "com.google.gwt.dev.GWTCompiler");
-    replacements.put("@startupUrl", startupUrl);
-    replacements.put("@antVmargs", isMacOsX
-        ? "<jvmarg value=\"-XstartOnFirstThread\"/>" : "");
-    replacements.put("@vmargs", isMacOsX ? "-XstartOnFirstThread" : "");
-    replacements.put("@eclipseExtraLaunchPaths",
-        CreatorUtilities.createEclipseExtraLaunchPaths(extraClassPaths));
-    replacements.put("@extraModuleInherits",
-        createExtraModuleInherits(extraModules));
-    replacements.put("@extraClassPathsColon", CreatorUtilities.appendPaths(":",
-        extraClassPaths));
-    replacements.put("@extraClassPathsSemicolon", CreatorUtilities.appendPaths(
-        ";", extraClassPaths));
-    replacements.put("@newModuleName", (newModuleName != null) ? newModuleName
-        : moduleName);
-
-    {
-      // create the module xml file, skeleton html file, skeleton css file,
-      // web.xml file
-      FileCreator fileCreators[] = new FileCreator[] {
-          new FileCreator(basePackageDir, "Module.gwt.xml", className
-              + ModuleDefLoader.GWT_MODULE_XML_SUFFIX),
-          new FileCreator(warDir, "AppHtml.html", className + ".html"),
-          new FileCreator(warDir, "AppCss.css", className + ".css"),
-          new FileCreator(webInfDir, "web.xml", "web.xml"),};
-      for (FileCreator fileCreator : fileCreators) {
-        File file = Utility.createNormalFile(fileCreator.dir,
-            fileCreator.className, overwrite, ignore);
-        if (file != null) {
-          String out = Utility.getFileFromClassPath(PACKAGE_PATH
-              + fileCreator.sourceName + "src");
-          Utility.writeTemplateFile(file, out, replacements);
-        }
-      }
-    }
-
-    {
-      /*
-       * Create a skeleton Application: main client class, rpc stub for the
-       * client, async counterpart of the rpc stub, rpc implementation on the
-       * server.
-       */
-      FileCreator fileCreators[] = new FileCreator[] {
-          new FileCreator(clientDir, "AppClass", className),
-          new FileCreator(clientDir, "RpcClient", "EchoService"),
-          new FileCreator(clientDir, "RpcAsyncClient", "EchoServiceAsync"),
-          new FileCreator(serverDir, "RpcServer", "EchoServiceImpl"),};
-      for (FileCreator fileCreator : fileCreators) {
-        File javaClass = Utility.createNormalFile(fileCreator.dir,
-            fileCreator.className + ".java", overwrite, ignore);
-        if (javaClass != null) {
-          String out = Utility.getFileFromClassPath(PACKAGE_PATH
-              + fileCreator.sourceName + "Template.javasrc");
-          Utility.writeTemplateFile(javaClass, out, replacements);
-        }
-      }
-    }
-
-    if (eclipse != null) {
-      replacements.put("@projectName", eclipse);
-      // Build the list of extra paths
-      replacements.put("@gwtServletPath", basePathEnv + gwtServletPath);
-      StringBuilder buf = new StringBuilder();
-      if (extraClassPaths != null) {
-        for (String path : extraClassPaths) {
-          buf.append("    <pathelement path=\"" + path + "\"/>");
-        }
-      }
-      replacements.put("@extraAntPathElements", buf.toString());
-
-      StringBuilder classpathEntries = new StringBuilder();
-      if (extraClassPaths != null) {
-        for (String path : extraClassPaths) {
-          File f = new File(path);
-
-          if (!f.exists()) {
-            throw new FileNotFoundException("extraClassPath: " + path
-                + " must be present before .launch file can be created.");
-          }
-          // Handle both .jar files and paths
-          String kindString;
-          if (f.isDirectory()) {
-            kindString = "output";
-          } else if (path.endsWith(".jar")) {
-            kindString = "lib";
-          } else {
-            throw new RuntimeException("Don't know how to handle path: " + path
-                + ". It doesn't appear to be a directory or a .jar file");
-          }
-          classpathEntries.append("   <classpathentry kind=\"");
-          classpathEntries.append(kindString);
-          classpathEntries.append("\" path=\"");
-          classpathEntries.append(path);
-          classpathEntries.append("\"/>\n");
-        }
-      }
-      replacements.put("@eclipseClassPathEntries", classpathEntries.toString());
-
-      /*
-       * create an ant file, an eclipse .project, an eclipse .classpath, and an
-       * eclipse launch-config
-       */
-      FileCreator fileCreators[] = new FileCreator[] {
-          new FileCreator(outDir, "project.ant.xml", "build.xml"),
-          new FileCreator(outDir, ".project", ".project"),
-          new FileCreator(outDir, ".classpath", ".classpath"),
-          new FileCreator(outDir, "App.launch", className + ".launch"),};
-      for (FileCreator fileCreator : fileCreators) {
-        File file = Utility.createNormalFile(fileCreator.dir,
-            fileCreator.className, overwrite, ignore);
-        if (file != null) {
-          String out = Utility.getFileFromClassPath(PACKAGE_PATH
-              + fileCreator.sourceName + "src");
-          Utility.writeTemplateFile(file, out, replacements);
-        }
-      }
-    }
-  }
-
-  private static String createExtraModuleInherits(List<String> modules) {
-    if (modules == null) {
-      return "";
-    }
-    // Create an <inherits> tag in the gwt.xml file for each extra module
-    StringBuilder buf = new StringBuilder();
-    for (String module : modules) {
-      buf.append("      <inherits name=\"");
-      buf.append(module);
-      buf.append("\" />\n");
-    }
-    return buf.toString();
-  }
-
-  private ArgHandlerAddToClassPath classPathHandler = new ArgHandlerAddToClassPath();
-  private String eclipse = null;
-  private String fullClassName = null;
-  private boolean ignore = false;
-  private ArgHandlerAddModule moduleHandler = new ArgHandlerAddModule();
-  private File outDir;
-  private boolean overwrite = false;
-  private String newModuleName = null;
-
-  protected ApplicationCreator() {
-
-    registerHandler(new ArgHandlerEclipse() {
-      @Override
-      public String getPurpose() {
-        return "Creates an ant file, an eclipse project, and a launch config";
-      }
-
-      @Override
-      public boolean setString(String str) {
-        eclipse = str;
-        return true;
-      }
-    });
-
-    registerHandler(new ArgHandlerOutDir() {
-      @Override
-      public void setDir(File dir) {
-        outDir = dir;
-      }
-    });
-
-    registerHandler(new ArgHandlerOverwrite() {
-      @Override
-      public boolean setFlag() {
-        if (ignore) {
-          System.err.println("-overwrite cannot be used with -ignore");
-          return false;
-        }
-        overwrite = true;
-        return true;
-      }
-    });
-
-    registerHandler(new ArgHandlerIgnore() {
-      @Override
-      public boolean setFlag() {
-        if (overwrite) {
-          System.err.println("-ignore cannot be used with -overwrite");
-          return false;
-        }
-        ignore = true;
-        return true;
-      }
-    });
-
-    // handler to process newModuleName argument
-    registerHandler(new ArgHandlerString() {
-      @Override
-      public String[] getDefaultArgs() {
-        return null; // later reset to moduleName
-      }
-
-      @Override
-      public String getPurpose() {
-        return "Specifies the new name of the module";
-      }
-
-      @Override
-      public String getTag() {
-        return "-moduleName";
-      }
-
-      @Override
-      public String[] getTagArgs() {
-        return new String[] {"moduleName"};
-      }
-
-      @Override
-      public boolean setString(String str) {
-        newModuleName = str;
-        return true;
-      }
-    });
-
-    registerHandler(new ArgHandlerAppClass());
-    registerHandler(classPathHandler);
-    registerHandler(moduleHandler);
-  }
-
-  protected boolean run() {
-    try {
-      createApplication(fullClassName, outDir, eclipse, overwrite, ignore,
-          classPathHandler.getExtraClassPathList(),
-          moduleHandler.getExtraModuleList(), newModuleName);
-      return true;
-    } catch (IOException e) {
-      System.err.println(e.getClass().getName() + ": " + e.getMessage());
-      return false;
-    }
-  }
-
 }
diff --git a/user/src/com/google/gwt/user/tools/Module.gwt.xmlsrc b/user/src/com/google/gwt/user/tools/Module.gwt.xmlsrc
index 51c660a..03f9a70 100644
--- a/user/src/com/google/gwt/user/tools/Module.gwt.xmlsrc
+++ b/user/src/com/google/gwt/user/tools/Module.gwt.xmlsrc
@@ -1,18 +1,17 @@
-<module rename-to='@newModuleName'>
+<?xml version="1.0" encoding="UTF-8"?>@gwtModuleDtd
+<module rename-to='@renameTo'>
+  <!-- Inherit the core Web Toolkit stuff.                        -->
+  <inherits name='com.google.gwt.user.User'/>
 
-      <!-- Inherit the core Web Toolkit stuff.                        -->
-      <inherits name='com.google.gwt.user.User'/>
-	
-      <!-- Inherit the default GWT style sheet.  You can change       -->
-      <!-- the theme of your GWT application by uncommenting          -->
-      <!-- any one of the following lines.                            -->
-      <inherits name='com.google.gwt.user.theme.standard.Standard'/>
-      <!-- <inherits name='com.google.gwt.user.theme.chrome.Chrome'/> -->
-      <!-- <inherits name='com.google.gwt.user.theme.dark.Dark'/>     -->
+  <!-- Inherit the default GWT style sheet.  You can change       -->
+  <!-- the theme of your GWT application by uncommenting          -->
+  <!-- any one of the following lines.                            -->
+  <inherits name='com.google.gwt.user.theme.standard.Standard'/>
+  <!-- <inherits name='com.google.gwt.user.theme.chrome.Chrome'/> -->
+  <!-- <inherits name='com.google.gwt.user.theme.dark.Dark'/>     -->
 
-      <!-- Other module inherits                                      -->
-@extraModuleInherits
+  <!-- Other module inherits                                      -->
 
-      <!-- Specify the app entry point class.                         -->
-      <entry-point class='@clientPackage.@className'/>
+  <!-- Specify the app entry point class.                         -->
+  <entry-point class='@clientPackage.@moduleShortName'/>
 </module>
diff --git a/user/src/com/google/gwt/user/tools/ProjectCreator.java b/user/src/com/google/gwt/user/tools/ProjectCreator.java
index 2b5f92e..09438ad 100644
--- a/user/src/com/google/gwt/user/tools/ProjectCreator.java
+++ b/user/src/com/google/gwt/user/tools/ProjectCreator.java
@@ -17,14 +17,13 @@
 
 /**
  * Legacy ProjectCreator that will let users know that they should run
- * ApplicationCreator instead.
+ * {@link WebAppCreator} instead.
  */
 public final class ProjectCreator {
 
   public static void main(String[] args) {
     System.err.println("This application no longer exists!");
-    System.err.println("It has been merged with com.google.gwt.user.tools.ApplicationCreator in gwt-user.jar");
+    System.err.println("Please see " + WebAppCreator.class.getName());
     System.exit(1);
   }
-
 }
diff --git a/user/src/com/google/gwt/user/tools/RpcAsyncClientTemplate.javasrc b/user/src/com/google/gwt/user/tools/RpcAsyncClientTemplate.javasrc
index 52eef3e..c15d89b 100644
--- a/user/src/com/google/gwt/user/tools/RpcAsyncClientTemplate.javasrc
+++ b/user/src/com/google/gwt/user/tools/RpcAsyncClientTemplate.javasrc
@@ -6,5 +6,5 @@
  * The async counterpart of <code>EchoService</code>. 
  */
 public interface EchoServiceAsync {
-  void echo (String input, AsyncCallback<String> callback);
+  void echo(String input, AsyncCallback<String> callback);
 }
diff --git a/user/src/com/google/gwt/user/tools/RpcClientTemplate.javasrc b/user/src/com/google/gwt/user/tools/RpcClientTemplate.javasrc
index 419660c..aeeeff7 100644
--- a/user/src/com/google/gwt/user/tools/RpcClientTemplate.javasrc
+++ b/user/src/com/google/gwt/user/tools/RpcClientTemplate.javasrc
@@ -1,10 +1,12 @@
 package @clientPackage;
 
 import com.google.gwt.user.client.rpc.RemoteService;
+import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;
 
 /**
  * The client side stub for the Rpc service.
  */
+@RemoteServiceRelativePath("echo")
 public interface EchoService extends RemoteService {
-  String echo (String input);
+  String echo(String input);
 }
diff --git a/user/src/com/google/gwt/user/tools/WebAppCreator.java b/user/src/com/google/gwt/user/tools/WebAppCreator.java
new file mode 100644
index 0000000..d324a83
--- /dev/null
+++ b/user/src/com/google/gwt/user/tools/WebAppCreator.java
@@ -0,0 +1,264 @@
+/*
+ * Copyright 2008 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.tools;
+
+import com.google.gwt.dev.About;
+import com.google.gwt.dev.ArgProcessorBase;
+import com.google.gwt.dev.Compiler;
+import com.google.gwt.dev.HostedMode;
+import com.google.gwt.dev.util.Util;
+import com.google.gwt.user.tools.util.ArgHandlerIgnore;
+import com.google.gwt.user.tools.util.ArgHandlerOverwrite;
+import com.google.gwt.user.tools.util.CreatorUtilities;
+import com.google.gwt.util.tools.ArgHandlerExtra;
+import com.google.gwt.util.tools.ArgHandlerOutDir;
+import com.google.gwt.util.tools.Utility;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Creates a GWT application skeleton.
+ */
+public final class WebAppCreator {
+
+  class ArgProcessor extends ArgProcessorBase {
+
+    private final class ArgHandlerOutDirExtension extends ArgHandlerOutDir {
+      @Override
+      public void setDir(File dir) {
+        outDir = dir;
+      }
+    }
+
+    public ArgProcessor() {
+      registerHandler(new ArgHandlerOverwriteExtension());
+      registerHandler(new ArgHandlerIgnoreExtension());
+      registerHandler(new ArgHandlerModuleName());
+      registerHandler(new ArgHandlerOutDirExtension());
+    }
+
+    @Override
+    protected String getName() {
+      return WebAppCreator.class.getName();
+    }
+  }
+
+  private final class ArgHandlerIgnoreExtension extends ArgHandlerIgnore {
+    @Override
+    public boolean setFlag() {
+      if (overwrite) {
+        System.err.println("-ignore cannot be used with -overwrite");
+        return false;
+      }
+      ignore = true;
+      return true;
+    }
+  }
+
+  /*
+   * Arguments for the application creator.
+   */
+
+  private final class ArgHandlerModuleName extends ArgHandlerExtra {
+    @Override
+    public boolean addExtraArg(String arg) {
+      if (moduleName != null) {
+        System.err.println("Too many arguments.");
+        return false;
+      }
+
+      if (!CreatorUtilities.isValidModuleName(arg)) {
+        System.err.println("'"
+            + arg
+            + "' does not appear to be a valid fully-qualified Java class name.");
+        return false;
+      }
+
+      moduleName = arg;
+      return true;
+    }
+
+    @Override
+    public String getPurpose() {
+      return "The name of the module to create (fully-qualified Java class name)";
+    }
+
+    @Override
+    public String[] getTagArgs() {
+      return new String[] {"moduleName"};
+    }
+
+    @Override
+    public boolean isRequired() {
+      return true;
+    }
+  }
+
+  private final class ArgHandlerOverwriteExtension extends ArgHandlerOverwrite {
+    @Override
+    public boolean setFlag() {
+      if (ignore) {
+        System.err.println("-overwrite cannot be used with -ignore");
+        return false;
+      }
+      overwrite = true;
+      return true;
+    }
+  }
+
+  private static final class FileCreator {
+    private final String destName;
+    private final File destDir;
+    private final String sourceName;
+
+    public FileCreator(File destDir, String destName, String sourceName) {
+      this.destDir = destDir;
+      this.sourceName = sourceName;
+      this.destName = destName;
+    }
+  }
+
+  public static void main(String[] args) {
+    WebAppCreator creator = new WebAppCreator();
+    ArgProcessor argProcessor = creator.new ArgProcessor();
+    if (argProcessor.processArgs(args)) {
+      if (creator.run()) {
+        return;
+      }
+    }
+    System.exit(1);
+  }
+
+  /**
+   * @param moduleName name of the fully-qualified GWT module to create as an
+   *          Application.
+   * @param outDir Where to put the output files
+   * @param overwrite Overwrite an existing files if they exist.
+   * @param ignore Ignore existing files if they exist.
+   * @throws IOException
+   */
+  static void createApplication(String moduleName, File outDir,
+      boolean overwrite, boolean ignore) throws IOException {
+
+    // Figure out the installation directory
+    String installPath = Utility.getInstallPath();
+    String gwtUserPath = installPath + '/' + "gwt-user.jar";
+    String gwtDevPath = installPath + '/' + Utility.getDevJarName();
+    String gwtServletPath = installPath + '/' + "gwt-servlet.jar";
+
+    // Public builds generate a DTD reference.
+    String gwtModuleDtd = "";
+    if (!About.GWT_VERSION_NUM.endsWith(".999")
+        && !About.GWT_VERSION_NUM.startsWith("0.0")) {
+      gwtModuleDtd = "\n<!DOCTYPE module PUBLIC \"-//Google Inc.//DTD Google Web Toolkit "
+          + About.GWT_VERSION_NUM
+          + "//EN\" \"http://google-web-toolkit.googlecode.com/svn/tags/"
+          + About.GWT_VERSION_NUM + "/distro-source/core/src/gwt-module.dtd\">";
+    }
+
+    // Figure out what platform we're on
+    boolean isMacOsX = gwtDevPath.substring(gwtDevPath.lastIndexOf('/') + 1).indexOf(
+        "mac") >= 0;
+
+    // Compute module package and name.
+    int pos = moduleName.lastIndexOf('.');
+    String modulePackageName = moduleName.substring(0, pos);
+    String moduleShortName = moduleName.substring(pos + 1);
+
+    // Compute module name and directories
+    File srcDir = Utility.getDirectory(outDir, "src", true);
+    File warDir = Utility.getDirectory(outDir, "war", true);
+    File webInfDir = Utility.getDirectory(warDir, "WEB-INF", true);
+    File moduleDir = Utility.getDirectory(srcDir, modulePackageName.replace(
+        '.', '/'), true);
+    File clientDir = Utility.getDirectory(moduleDir, "client", true);
+    File serverDir = Utility.getDirectory(moduleDir, "server", true);
+
+    // Create a map of replacements
+    Map<String, String> replacements = new HashMap<String, String>();
+    replacements.put("@moduleShortName", moduleShortName);
+    replacements.put("@moduleName", moduleName);
+    replacements.put("@clientPackage", modulePackageName + ".client");
+    replacements.put("@serverPackage", modulePackageName + ".server");
+    replacements.put("@gwtUserPath", gwtUserPath);
+    replacements.put("@gwtDevPath", gwtDevPath);
+    replacements.put("@gwtServletPath", gwtServletPath);
+    replacements.put("@gwtVersion", About.GWT_VERSION_NUM);
+    replacements.put("@gwtModuleDtd", gwtModuleDtd);
+    replacements.put("@shellClass", HostedMode.class.getName());
+    replacements.put("@compileClass", Compiler.class.getName());
+    replacements.put("@startupUrl", moduleShortName + ".html");
+    replacements.put("@antVmargs", isMacOsX
+        ? "\n<jvmarg value=\"-XstartOnFirstThread\"/>" : "");
+    replacements.put("@vmargs", isMacOsX ? "&#10;-XstartOnFirstThread" : "");
+    replacements.put("@renameTo", moduleShortName.toLowerCase());
+
+    List<FileCreator> files = new ArrayList<FileCreator>();
+    files.add(new FileCreator(moduleDir, moduleShortName + ".gwt.xml",
+        "Module.gwt.xml"));
+    files.add(new FileCreator(warDir, moduleShortName + ".html", "AppHtml.html"));
+    files.add(new FileCreator(warDir, moduleShortName + ".css", "AppCss.css"));
+    files.add(new FileCreator(webInfDir, "web.xml", "web.xml"));
+    files.add(new FileCreator(clientDir, moduleShortName + ".java",
+        "AppClassTemplate.java"));
+    files.add(new FileCreator(clientDir, "EchoService" + ".java",
+        "RpcClientTemplate.java"));
+    files.add(new FileCreator(clientDir, "EchoServiceAsync" + ".java",
+        "RpcAsyncClientTemplate.java"));
+    files.add(new FileCreator(serverDir, "EchoServiceImpl" + ".java",
+        "RpcServerTemplate.java"));
+    files.add(new FileCreator(outDir, "build.xml", "project.ant.xml"));
+    files.add(new FileCreator(outDir, ".project", ".project"));
+    files.add(new FileCreator(outDir, ".classpath", ".classpath"));
+    files.add(new FileCreator(outDir, moduleShortName + ".launch", "App.launch"));
+
+    for (FileCreator fileCreator : files) {
+      File file = Utility.createNormalFile(fileCreator.destDir,
+          fileCreator.destName, overwrite, ignore);
+      if (file != null) {
+        URL url = WebAppCreator.class.getResource(fileCreator.sourceName
+            + "src");
+        if (url == null) {
+          throw new FileNotFoundException(fileCreator.sourceName + "src");
+        }
+        String data = Util.readURLAsString(url);
+        Utility.writeTemplateFile(file, data, replacements);
+      }
+    }
+  }
+
+  private boolean ignore = false;
+  private String moduleName;
+  private File outDir;
+  private boolean overwrite = false;
+
+  protected boolean run() {
+    try {
+      createApplication(moduleName, outDir, overwrite, ignore);
+      return true;
+    } catch (IOException e) {
+      System.err.println(e.getClass().getName() + ": " + e.getMessage());
+      return false;
+    }
+  }
+}
diff --git a/user/src/com/google/gwt/user/tools/project.ant.xmlsrc b/user/src/com/google/gwt/user/tools/project.ant.xmlsrc
index a9d8e3a..9b6e4a9 100644
--- a/user/src/com/google/gwt/user/tools/project.ant.xmlsrc
+++ b/user/src/com/google/gwt/user/tools/project.ant.xmlsrc
@@ -1,85 +1,65 @@
 <?xml version="1.0" encoding="utf-8" ?>
-<project name="@projectName" default="build" basedir=".">
-  <description>
-    @projectName build file.  This is used to package up your project as a jar,
-    if you want to distribute it.  This isn't needed for normal operation.
-  </description>
-  <property name="outdir" location="war" />
+<project name="@moduleShortName" default="build" basedir=".">
 
-  <!-- set classpath -->
   <path id="project.class.path">
-    <pathelement path="${java.class.path}/"/>
-    <pathelement path="@gwtUserPath"/>
-@extraAntPathElements
-    <!-- Additional dependencies (such as junit) go here -->
+    <pathelement location="war/WEB-INF/classes"/>
+    <pathelement location="@gwtUserPath"/>
+    <!-- Add any additional non-server libs (such as JUnit) -->
+    <fileset dir="war/WEB-INF/lib">
+      <include name="**/*.jar"/>
+    </fileset>
   </path>
 
-  <!-- TODO:  
-   1. revisit this once GWT supports shared dir as a first-clas citizen
-   2. For a 1.4 server, split this so that the server side code is compiled
-   with a target=1.4 build rule -->
-  <target name="javac" description="Compile project to WEB-INF/classes">
+  <target name="libs" description="Copy libs to WEB-INF/lib">
+    <mkdir dir="war/WEB-INF/lib" />
+    <copy todir="war/WEB-INF/lib" file="@gwtServletPath" />
+    <!-- Add any additional server libs that need to be copied -->
+  </target>
+
+  <target name="javac" depends="libs" description="Compile java source">
     <mkdir dir="war/WEB-INF/classes"/>
-    <javac srcdir="src:test"
-      destdir="war/WEB-INF/classes"
-      includes="**"
-      debug="true"
-      debuglevel="lines,vars,source"
-      source="1.5"
-      target="1.5"
-      nowarn="true"
-      encoding="utf-8">
+    <javac srcdir="src" includes="**" encoding="utf-8"
+        destdir="war/WEB-INF/classes"
+        source="1.5" target="1.5" nowarn="true"
+        debug="true" debuglevel="lines,vars,source">
       <classpath refid="project.class.path"/>
     </javac>
   </target>
 
-  <target name="deploy" depends="gwtc" description="Copy output to the war folder">
-    <mkdir dir="war/WEB-INF/lib" />
-    <copy todir="war/WEB-INF/lib" file="@gwtServletPath" />
-  </target>
-
   <!-- can add additional arguments like -logLevel INFO or -style PRETTY -->
-  <target name="gwtc" depends="javac" description="Compile to JavaScript">
-    <java failonerror="true" fork="true"
-          classname="@compileClass">
+  <target name="gwtc" depends="javac" description="GWT compile to JavaScript">
+    <java failonerror="true" fork="true" classname="@compileClass">
       <classpath>
         <pathelement location="src"/>
-        <pathelement location="war/WEB-INF/classes"/>
-        <pathelement path="${project.class.path}/"/>
+        <path refid="project.class.path"/>
         <pathelement location="@gwtDevPath"/>
       </classpath>
-     <!-- add jvmarg -Xss16M or similar if you see a StackOverflowError -->
-      <jvmarg value="-Xmx256M"/>
-      @antVmargs
+      <!-- add jvmarg -Xss16M or similar if you see a StackOverflowError -->
+      <jvmarg value="-Xmx256M"/>@antVmargs
       <arg value="@moduleName"/>
     </java>
   </target>
 
-  <!-- can add additional arguments like -logLevel INFO -->
-  <target name="shell" depends="javac" description="Run the deployed app in GWT hosted mode">
-    <java failonerror="true" fork="true"
-          classname="@shellClass">
+  <target name="hosted" depends="javac" description="Run hosted mode">
+    <java failonerror="true" fork="true" classname="@shellClass">
       <classpath>
         <pathelement location="src"/>
+        <path refid="project.class.path"/>
         <pathelement location="@gwtDevPath"/>
-        <pathelement path="${java.class.path}/"/>
-        <pathelement path="@gwtUserPath"/>
       </classpath>
-      <jvmarg value="-Xmx256M"/>
-      @antVmargs
+      <jvmarg value="-Xmx256M"/>@antVmargs
       <arg value="-startupUrl"/>
       <arg value="@startupUrl"/>
       <arg value="@moduleName"/>
+      <!-- Additional arguments like -style PRETTY or -logLevel DEBUG -->
     </java>
   </target>
 
-  <target name="build" depends="javac, gwtc, deploy" description="Build this project" />
+  <target name="build" depends="gwtc" description="Build this project" />
 
-  <target name="clean" description="Cleans this project's intermediate and
-    output files">
-    <!-- uncomment if the WEB-INF/classes dir only contains GWT output --> 
-    <!-- <delete dir="war/WEB-INF/classes" failonerror="false" /> -->
-    <delete dir="war/@newModuleName" failonerror="false" />
+  <target name="clean" description="Cleans this project">
+    <delete dir="war/WEB-INF/classes" failonerror="false" />
+    <delete dir="war/@renameTo" failonerror="false" />
   </target>
 
 </project>
diff --git a/user/src/com/google/gwt/user/tools/util/CreatorUtilities.java b/user/src/com/google/gwt/user/tools/util/CreatorUtilities.java
index e21775b..2c9a802 100644
--- a/user/src/com/google/gwt/user/tools/util/CreatorUtilities.java
+++ b/user/src/com/google/gwt/user/tools/util/CreatorUtilities.java
@@ -76,7 +76,7 @@
       }
 
       String lcPath = path.toLowerCase();
-      
+
       if (f.isDirectory()) {
         // For a directory, we assume it contains compiled class files
         buf.append("<listEntry value=\"&lt;?xml version=&quot;1.0&quot; ");
@@ -103,6 +103,14 @@
   }
 
   /**
+   * Returns <code>true</code> if <code>moduleName</code> is a valid module
+   * name.
+   */
+  public static boolean isValidModuleName(String moduleName) {
+    return moduleName.matches("[\\w]+(\\.[\\w]+)+");
+  }
+
+  /**
    * Check to see that the userJar and pathList files all exist, and that the
    * moduleList entries can be found within the jars.
    * 
diff --git a/user/src/com/google/gwt/user/tools/web.xmlsrc b/user/src/com/google/gwt/user/tools/web.xmlsrc
index 60ade4d..62ca7c8 100644
--- a/user/src/com/google/gwt/user/tools/web.xmlsrc
+++ b/user/src/com/google/gwt/user/tools/web.xmlsrc
@@ -8,7 +8,7 @@
   
   <servlet-mapping>
     <servlet-name>echoServlet</servlet-name>
-    <url-pattern>/@newModuleName/echo</url-pattern>
+    <url-pattern>/@renameTo/echo</url-pattern>
   </servlet-mapping>
 
 </web-app>
diff --git a/user/test/com/google/gwt/dev/shell/rewrite/EmmaClassLoadingTest.gwt.xml b/user/test/com/google/gwt/dev/shell/rewrite/EmmaClassLoadingTest.gwt.xml
new file mode 100644
index 0000000..f8cb006
--- /dev/null
+++ b/user/test/com/google/gwt/dev/shell/rewrite/EmmaClassLoadingTest.gwt.xml
@@ -0,0 +1,3 @@
+<module>
+  <inherits name="com.google.gwt.user.User"/>
+</module>
diff --git a/user/test/com/google/gwt/dev/shell/rewrite/client/EmmaClassLoadingTest.java b/user/test/com/google/gwt/dev/shell/rewrite/client/EmmaClassLoadingTest.java
new file mode 100644
index 0000000..35250a3
--- /dev/null
+++ b/user/test/com/google/gwt/dev/shell/rewrite/client/EmmaClassLoadingTest.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright 2008 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.dev.shell.rewrite.client;
+
+import com.google.gwt.junit.client.GWTTestCase;
+
+/**
+ * Test-case to check if the jsni blocks are mapped correctly between the
+ * synthetic and anonymous classes generated by the javac and the jdt compiler.
+ * <p>
+ * This issue arises when emma.jar is in the classpath. Gwt then follows the
+ * emma strategy and loads (offline-instrumented) classes from the disk. These
+ * classes could have been generated by any java compiler -- the java compiler
+ * does not have to be jdt and frequently is javac. These class files may
+ * contain references to synthetic classes and anonymous classes that the jdt
+ * does not know about. This testcase checks that gwt handles these cases
+ * correctly.
+ */
+public class EmmaClassLoadingTest extends GWTTestCase {
+
+  enum EnumTest {
+    A, B, C,
+  }
+
+  interface TestInterface {
+    void foo();
+  }
+
+  private static String messages[] = {
+      "a foo", "b foo", "enum A", "d foo", "e foo"};
+
+  private static int logCount = 0;
+
+  private static void log(String msg) {
+    assertEquals(messages[logCount++], msg);
+  }
+
+  @Override
+  public String getModuleName() {
+    return "com.google.gwt.dev.shell.rewrite.EmmaClassLoadingTest";
+  }
+
+  public void test1() {
+    TestInterface a = new TestInterface() {
+      public void foo() {
+        log("a foo");
+      }
+    };
+    a.foo();
+
+    TestInterface b = new TestInterface() {
+      public native void foo() /*-{
+        @com.google.gwt.dev.shell.rewrite.client.EmmaClassLoadingTest::log(Ljava/lang/String;)("b foo");
+      }-*/;
+    };
+    b.foo();
+
+    if (false) {
+      TestInterface c = new TestInterface() {
+        public native void foo() /*-{
+          @com.google.gwt.dev.shell.rewrite.client.EmmaClassLoadingTest::log(Ljava/lang/String;)("ANY_FOO_1");
+        }-*/;
+      };
+    }
+    EnumTest et = EnumTest.A;
+    switch (et) {
+      case A:
+        log("enum A");
+        break;
+      case B:
+        log("ANY_FOO_2");
+        break;
+      case C:
+        log("ANY_FOO_3");
+        break;
+    }
+
+    TestInterface d = new TestInterface() {
+      public native void foo() /*-{
+        @com.google.gwt.dev.shell.rewrite.client.EmmaClassLoadingTest::log(Ljava/lang/String;)("d foo");
+      }-*/;
+    };
+    d.foo();
+
+    /*
+     * jdt generates $1 (a), $2 (b), $3 (d), $4 (e). javac generates $1 (a), $2
+     * (b), $3 (c), $4 (d), $5 (e), $6 (synthetic). Added e so that the test
+     * fails quickly. Otherwise, it had to wait for a time-out (in looking
+     * through jdt generated code for non-existent jsni methods of $4) to fail.
+     */
+    TestInterface e = new TestInterface() {
+      public native void foo() /*-{
+        @com.google.gwt.dev.shell.rewrite.client.EmmaClassLoadingTest::log(Ljava/lang/String;)("e foo");
+      }-*/;
+    };
+  } 
+}
diff --git a/user/test/com/google/gwt/user/UISuite.java b/user/test/com/google/gwt/user/UISuite.java
index 515955b..c7483be 100644
--- a/user/test/com/google/gwt/user/UISuite.java
+++ b/user/test/com/google/gwt/user/UISuite.java
@@ -67,6 +67,7 @@
 import com.google.gwt.user.client.ui.SimpleRadioButtonTest;
 import com.google.gwt.user.client.ui.SplitPanelTest;
 import com.google.gwt.user.client.ui.StackPanelTest;
+import com.google.gwt.user.client.ui.SuggestBoxTest;
 import com.google.gwt.user.client.ui.TabBarTest;
 import com.google.gwt.user.client.ui.TabPanelTest;
 import com.google.gwt.user.client.ui.TextAreaTest;
@@ -144,6 +145,7 @@
     suite.addTestSuite(SimpleRadioButtonTest.class);
     suite.addTestSuite(SplitPanelTest.class);
     suite.addTestSuite(StackPanelTest.class);
+    suite.addTestSuite(SuggestBoxTest.class);
     suite.addTestSuite(TabBarTest.class);
     suite.addTestSuite(TabPanelTest.class);
     suite.addTestSuite(TextAreaTest.class);
diff --git a/user/test/com/google/gwt/user/client/ui/DateBoxTest.java b/user/test/com/google/gwt/user/client/ui/DateBoxTest.java
index 624359a..f8ee4a7 100644
--- a/user/test/com/google/gwt/user/client/ui/DateBoxTest.java
+++ b/user/test/com/google/gwt/user/client/ui/DateBoxTest.java
@@ -22,13 +22,23 @@
  * Tests DateBox.
  */
 public class DateBoxTest extends GWTTestCase {
+  @Override
   public String getModuleName() {
     return "com.google.gwt.user.User";
   }
-  
+
+  public void testAccessors() {
+    DateBox db = new DateBox();
+    assertFalse(db.isDatePickerShowing());
+    db.showDatePicker();
+    assertTrue(db.isDatePickerShowing());
+    db.hideDatePicker();
+    assertFalse(db.isDatePickerShowing());
+  }
+
   public void testValueChangeEvent() {
     DateBox db = new DateBox();
     RootPanel.get().add(db);
-    new DateValueChangeTester(db).run();    
+    new DateValueChangeTester(db).run();
   }
 }
diff --git a/user/test/com/google/gwt/user/client/ui/ImageTest.java b/user/test/com/google/gwt/user/client/ui/ImageTest.java
index a59794d..2201dd2 100644
--- a/user/test/com/google/gwt/user/client/ui/ImageTest.java
+++ b/user/test/com/google/gwt/user/client/ui/ImageTest.java
@@ -421,4 +421,34 @@
     assertEquals(16, image.getHeight());
     assertEquals("clipped", getCurrentImageStateName(image));
   }
+  
+
+  private int firedLoad;
+  private int firedError;
+  @SuppressWarnings("deprecation")
+  public void testLoadListenerWiring() {
+    Image im = new Image();
+
+    im.addLoadListener(new LoadListener() {
+
+      public void onError(Widget sender) {
+        ++firedError;
+      }
+
+      public void onLoad(Widget sender) {
+        ++firedLoad;
+      }
+    });
+    im.fireEvent(new LoadEvent() {
+      // Replaced by Joel's event firing when possible.
+    });
+    assertEquals(1, firedLoad);
+    assertEquals(0, firedError);
+    im.fireEvent(new ErrorEvent() {
+      // Replaced by Joel's event firing when possible.
+    });
+    assertEquals(1, firedLoad);
+    assertEquals(1, firedError);
+  }
+
 }
diff --git a/user/test/com/google/gwt/user/client/ui/PopupTest.java b/user/test/com/google/gwt/user/client/ui/PopupTest.java
index 8aa91e3..a8611bd 100644
--- a/user/test/com/google/gwt/user/client/ui/PopupTest.java
+++ b/user/test/com/google/gwt/user/client/ui/PopupTest.java
@@ -15,13 +15,15 @@
  */
 package com.google.gwt.user.client.ui;
 
+import com.google.gwt.dom.client.DivElement;
+import com.google.gwt.dom.client.Document;
 import com.google.gwt.junit.client.GWTTestCase;
 import com.google.gwt.user.client.Element;
 import com.google.gwt.user.client.Timer;
 import com.google.gwt.user.client.Window;
 
 /**
- * TODO: document me.
+ * Tests for {@link PopupPanel}.
  */
 public class PopupTest extends GWTTestCase {
 
@@ -80,6 +82,32 @@
     assertTrue(popup.isPreviewingAllNativeEvents());
     popup.setPreviewingAllNativeEvents(false);
     assertFalse(popup.isPreviewingAllNativeEvents());
+
+    // setVisible
+    assertTrue(popup.isVisible());
+    popup.setVisible(false);
+    assertFalse(popup.isVisible());
+    popup.setVisible(true);
+    assertTrue(popup.isVisible());
+
+    // isShowing
+    assertFalse(popup.isShowing());
+    popup.show();
+    assertTrue(popup.isShowing());
+    popup.hide();
+    assertFalse(popup.isShowing());
+  }
+
+  public void testAutoHidePartner() {
+    final PopupPanel popup = new PopupPanel();
+
+    // Add a partner
+    DivElement partner0 = Document.get().createDivElement();
+    popup.addAutoHidePartner(partner0);
+    popup.addAutoHidePartner(Document.get().createDivElement());
+
+    // Remove a partner
+    popup.removeAutoHidePartner(partner0);
   }
 
   /**
diff --git a/user/test/com/google/gwt/user/client/ui/SuggestBoxTest.java b/user/test/com/google/gwt/user/client/ui/SuggestBoxTest.java
new file mode 100644
index 0000000..82546d8
--- /dev/null
+++ b/user/test/com/google/gwt/user/client/ui/SuggestBoxTest.java
@@ -0,0 +1,123 @@
+/*
+ * Copyright 2009 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.ui;
+
+import com.google.gwt.junit.client.GWTTestCase;
+
+import java.util.Arrays;
+
+/**
+ * Tests for {@link SuggestBoxTest}.
+ */
+public class SuggestBoxTest extends GWTTestCase {
+
+  @Override
+  public String getModuleName() {
+    return "com.google.gwt.user.User";
+  }
+
+  /**
+   * Test the basic accessors.
+   */
+  public void testAccessors() {
+    SuggestBox box = createSuggestBox();
+
+    // setLimit
+    box.setLimit(5);
+    assertEquals(5, box.getLimit());
+
+    // setSelectsFirstItem
+    box.setSelectsFirstItem(true);
+    assertTrue(box.getSelectsFirstItem());
+    box.setSelectsFirstItem(false);
+    assertFalse(box.getSelectsFirstItem());
+
+    // isSuggestionListShowing
+    assertFalse(box.isSuggestionListShowing());
+    box.showSuggestions("test");
+    assertTrue(box.isSuggestionListShowing());
+  }
+
+  public void testShowAndHide() {
+    SuggestBox box = createSuggestBox();
+    assertFalse(box.isSuggestionListShowing());
+    // should do nothing, box is not attached.
+    box.showSuggestionList();
+    assertFalse(box.isSuggestionListShowing());
+
+    // Adds the suggest box to the root panel.
+    RootPanel.get().add(box);
+    assertFalse(box.isSuggestionListShowing());
+
+    // Hides the list of suggestions, should be a no-op.
+    box.hideSuggestionList();
+
+    // Should try to show, but still fail, as there are no default suggestions.
+    box.showSuggestionList();
+    assertFalse(box.isSuggestionListShowing());
+
+    // Now, finally, should be true
+    box.setText("t");
+    box.showSuggestionList();
+    assertTrue(box.isSuggestionListShowing());
+
+    // Hides it for real this time.
+    box.hideSuggestionList();
+    assertFalse(box.isSuggestionListShowing());
+  }
+
+  public void testDefaults() {
+    MultiWordSuggestOracle oracle = new MultiWordSuggestOracle();
+    oracle.setDefaultSuggestionsFromText(Arrays.asList("A", "B"));
+    SuggestBox box = new SuggestBox(oracle);
+    RootPanel.get().add(box);
+    box.showSuggestionList();
+    assertTrue(box.isSuggestionListShowing());
+    assertEquals(2, box.getSuggestionCount());
+    assertEquals("A", box.getSuggestion(0).getReplacementString());
+    assertEquals("B", box.getSuggestion(1).getReplacementString());
+  }
+
+  public void testShowFirst() {
+    SuggestBox box = createSuggestBox();
+    assertTrue(box.getSelectsFirstItem());
+    SuggestBox box2 = createSuggestBox();
+    assertTrue(box2.getSelectsFirstItem());
+    box.setSelectsFirstItem(false);
+    assertFalse(box.getSelectsFirstItem());
+    box.setText("t");
+    box.showSuggestionList();
+    // Todo(ecc) once event triggering is enabled, submit a return key to the
+    // text box and ensure that we see the correct behavior.
+  }
+
+  @Override
+  public void gwtTearDown() throws Exception {
+    super.gwtTearDown();
+    RootPanel.get().clear();
+  }
+
+  protected SuggestBox createSuggestBox() {
+    MultiWordSuggestOracle oracle = new MultiWordSuggestOracle();
+    oracle.add("test");
+    oracle.add("test1");
+    oracle.add("test2");
+    oracle.add("test3");
+    oracle.add("test4");
+    oracle.add("john");
+    return new SuggestBox(oracle);
+  }
+}
