Creating 2.4.0-rc1 tag.



git-svn-id: https://google-web-toolkit.googlecode.com/svn/tags/2.4.0-rc1@10464 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/2.4/build-tools/ant-gwt/build.xml b/2.4/build-tools/ant-gwt/build.xml
deleted file mode 100644
index bec9154..0000000
--- a/2.4/build-tools/ant-gwt/build.xml
+++ /dev/null
@@ -1,55 +0,0 @@
-<project name="ant-gwt" default="build" basedir=".">
-  <property name="gwt.root" location="../.." />
-  <property name="project.tail" value="build-tools/ant-gwt" />
-  <import file="${gwt.root}/common.ant.xml" />
-
-  <property name="gwt.junit.testcase.antgwt.includes" value="**/*Test.class" />
-  <property name="gwt.junit.testcase.antgwt.excludes" value="" />
-
-  <target name="compile" description="Compiles this project">
-    <mkdir dir="${javac.out}" />
-    <gwt.javac>
-      <classpath>
-        <pathelement location="${gwt.tools.lib}/apache/ant-1.6.5.jar" />
-      </classpath>
-    </gwt.javac>
-  </target>
-
-  <target name="compile.tests" depends="build, compile.emma.if.enabled" description="Compiles the test code for this project">
-    <mkdir dir="${javac.junit.out}" />
-    <gwt.javac srcdir="test" destdir="${javac.junit.out}">
-      <classpath>
-        <pathelement location="${javac.out}" />
-        <pathelement location="${gwt.tools.lib}/junit/junit-4.8.2.jar" />
-      </classpath>
-    </gwt.javac>
-  </target>
-
-  <target name="build" depends="compile" description="Packages this project into a jar">
-    <mkdir dir="${gwt.build.lib}" />
-    <!-- we can't use the gwt.jar macro, as it needs the gwt-ant.jar being packaged here -->
-    <jar destfile="${gwt.build.lib}/${ant.project.name}.jar" duplicate="fail" filesonly="true" 
-         index="true" update="true">
-      <fileset dir="${javac.out}" />
-      <fileset dir="src" />
-    </jar>
-  </target>
-
-  <target name="test" depends="build, compile.tests" description="Run unit tests for this project.">
-    <fileset id="tests.antgwt" dir="${javac.junit.out}" includes="${gwt.junit.testcase.antgwt.includes}" excludes="${gwt.junit.testcase.antgwt.excludes}" />
-    <gwt.junit test.name="ant-gwt" test.out="${junit.out}"
-        test.cases="tests.antgwt" />
-  </target>
-
-  <target name="checkstyle" description="Static analysis of source">
-    <gwt.checkstyle>
-      <fileset dir="src" />
-    </gwt.checkstyle>
-  </target>
-
-  <target name="clean" description="Cleans this project's intermediate and output files">
-    <delete dir="${project.build}" />
-    <delete file="${project.lib}" />
-  </target>
-
-</project>
diff --git a/2.4/build-tools/ant-gwt/src/com/google/gwt/ant/taskdefs/CommandRunner.java b/2.4/build-tools/ant-gwt/src/com/google/gwt/ant/taskdefs/CommandRunner.java
deleted file mode 100644
index eaa4da6..0000000
--- a/2.4/build-tools/ant-gwt/src/com/google/gwt/ant/taskdefs/CommandRunner.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * 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.ant.taskdefs;
-
-import org.apache.tools.ant.BuildException;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.LineNumberReader;
-
-/**
- * Utility class to run external commands.
- */
-class CommandRunner {
-
-  /**
-   * Returns the output of running a command as a string. Will fail if the
-   * invoked process returns a non-zero status code and
-   * <code>checkStatusCode</code> is <code>true</code>.
-   */
-  public static String getCommandOutput(boolean checkStatusCode, File workDir,
-      String... cmd) {
-    Process process = runCommandIgnoringErr(workDir, cmd);
-    StringBuilder output = new StringBuilder();
-    LineNumberReader lnr = new LineNumberReader(new InputStreamReader(
-        process.getInputStream()));
-    try {
-      for (String line = lnr.readLine(); line != null; line = lnr.readLine()) {
-        output.append(line);
-        output.append('\n');
-      }
-      int statusCode = process.waitFor();
-      if (checkStatusCode && statusCode != 0) {
-        throw new BuildException("Non-zero status code result (" + statusCode
-            + ") running command: " + makeCmdString(cmd));
-      }
-      return output.toString();
-    } catch (IOException e) {
-      throw new BuildException("Unable to read command: " + makeCmdString(cmd),
-          e);
-    } catch (InterruptedException e) {
-      throw new BuildException("Interrupted waiting for command: "
-          + makeCmdString(cmd), e);
-    } finally {
-      if (lnr != null) {
-        try {
-          lnr.close();
-        } catch (IOException e) {
-          // do nothing
-        }
-      }
-    }
-  }
-
-  /**
-   * Returns the output of running a command as a string. Will fail if the
-   * invoked process returns a non-zero status code.
-   */
-  public static String getCommandOutput(File workDir, String... cmd) {
-    return getCommandOutput(true, workDir, cmd);
-  }
-
-  /**
-   * Runs the specified command and returns the {@link Process}. The caller
-   * must handle both the output and error streams to avoid blocking the
-   * underlying process.
-   */
-  public static Process runCommand(File workDir, String... cmd) {
-    ProcessBuilder pb = new ProcessBuilder(cmd);
-    pb.directory(workDir);
-    try {
-      return pb.start();
-    } catch (IOException e) {
-      throw new BuildException("Unable to launch command: "
-          + makeCmdString(cmd), e);
-    }
-  }
-
-  /**
-   * Runs the specified command and returns the {@link Process}. The resulting
-   * process's error stream will be continually drained in a daemon thread to
-   * prevent the underlying process from blocking. The caller must handle both
-   * output stream to avoid blocking the underlying process.
-   */
-  public static Process runCommandIgnoringErr(File workDir, String... cmd) {
-    final Process process = runCommand(workDir, cmd);
-    // Consume error output on another thread to avoid blocking.
-    Thread errThread = new Thread(new Runnable() {
-      public void run() {
-        InputStream errorStream = process.getErrorStream();
-        try {
-          byte[] buf = new byte[8192];
-          int read;
-          do {
-            read = errorStream.read(buf);
-          } while (read >= 0);
-        } catch (IOException e) {
-        } finally {
-          try {
-            errorStream.close();
-          } catch (IOException e) {
-          }
-        }
-      }
-    });
-    errThread.setDaemon(true);
-    errThread.start();
-    return process;
-  }
-
-  /**
-   * Turns a command array into a printable string.
-   */
-  static String makeCmdString(String... cmd) {
-    StringBuilder sb = new StringBuilder();
-    for (String arg : cmd) {
-      if (sb.length() > 0) {
-        sb.append(' ');
-      }
-      sb.append(arg);
-    }
-    String cmdString = sb.toString();
-    return cmdString;
-  }
-}
diff --git a/2.4/build-tools/ant-gwt/src/com/google/gwt/ant/taskdefs/LatestTimeJar.java b/2.4/build-tools/ant-gwt/src/com/google/gwt/ant/taskdefs/LatestTimeJar.java
deleted file mode 100644
index fa4b01b..0000000
--- a/2.4/build-tools/ant-gwt/src/com/google/gwt/ant/taskdefs/LatestTimeJar.java
+++ /dev/null
@@ -1,253 +0,0 @@
-/*
- * 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.ant.taskdefs;
-
-import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.Project;
-import org.apache.tools.ant.taskdefs.Jar;
-import org.apache.tools.zip.ZipExtraField;
-import org.apache.tools.zip.ZipOutputStream;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.Map;
-import java.util.Random;
-import java.util.TreeMap;
-
-/**
- * A variation on Jar which handles duplicate entries by only archiving the most
- * recent of any given path. This is done by keeping a map of paths (as shown in
- * the jar file) against {@link EntryInfo} objects identifying the input source
- * and its timestamp. Most of the actual archiving is deferred until archive
- * finalization, when we've decided on the actual de-duplicated set of entries.
- */
-public class LatestTimeJar extends Jar {
-
-  /**
-   * Metadata about pending entries in the jar, for replacement if newer entries
-   * are found. Subclasses of EntryInfo are held in the
-   */
-  protected abstract class EntryInfo {
-    protected long timestamp;
-    protected int mode;
-
-    public EntryInfo(long lastModified, int mode) {
-      this.timestamp = lastModified;
-      this.mode = mode;
-    }
-
-    /**
-     * Called to actually add the entry to a given zip stream.
-     * 
-     * @param out
-     * @param path
-     * @throws IOException
-     */
-    public abstract void addToZip(ZipOutputStream out, String path)
-        throws IOException;
-
-    public long getLastModified() {
-      return timestamp;
-    }
-
-    public int getMode() {
-      return mode;
-    }
-  }
-
-  /**
-   * Metadata about a directory entry.
-   */
-  protected class DirEntryInfo extends EntryInfo {
-    protected File dir;
-    protected ZipExtraField extra[];
-
-    public DirEntryInfo(File dir, long touchTime, int mode,
-        ZipExtraField extra[]) {
-      super(touchTime, mode);
-      this.dir = dir;
-      this.extra = extra;
-    }
-
-    @Override
-    public void addToZip(ZipOutputStream out, String path) throws IOException {
-      doZipDir(dir, out, path, mode, extra);
-    }
-  }
-
-  /**
-   * Metadata about a file entry.
-   */
-  protected class FileEntryInfo extends EntryInfo {
-    private File tmpFile;
-    private File archive;
-
-    public FileEntryInfo(InputStream in, long lastModified, File fromArchive,
-        int mode) throws IOException {
-      super(lastModified, mode);
-      tmpFile = createTempFile("gwtjar", "");
-      tmpFile.deleteOnExit();
-      OutputStream fos = new FileOutputStream(tmpFile);
-      int readLen = in.read(buffer);
-      while (readLen > 0) {
-        fos.write(buffer, 0, readLen);
-        readLen = in.read(buffer);
-      }
-      fos.close();
-      archive = fromArchive;
-    }
-
-    @Override
-    public void addToZip(ZipOutputStream out, String path) throws IOException {
-      FileInputStream inStream = new FileInputStream(tmpFile);
-      try {
-        doZipFile(inStream, out, path, timestamp, archive, mode);
-        tmpFile.delete();
-      } finally {
-        inStream.close();
-      }
-    }
-  }
-
-  /**
-   * Used to generate temporary file names.
-   */
-  private static long counter = -1;
-
-  /**
-   * Creates a temporary file.
-   * 
-   * @param prefix the file prefix
-   * @param suffix the file suffix
-   * @return the new file
-   * @throws IOException if the file cannot be created
-   */
-  private static File createTempFile(String prefix, String suffix)
-      throws IOException {
-    if (suffix == null) {
-      suffix = ".tmp";
-    }
-
-    // Get the temp file directory.
-    File tmpDir = new File(System.getProperty("java.io.tmpdir"));
-    tmpDir.mkdirs();
-
-    // Generate a random name.
-    if (counter == -1) {
-      counter = new Random().nextLong();
-    }
-    boolean created = false;
-    File tmpFile;
-    do {
-      counter++;
-      tmpFile = new File(tmpDir, prefix + Long.toString(counter) + suffix);
-      if (!tmpFile.exists()) {
-        created = tmpFile.createNewFile();
-        if (!created) {
-          // If we fail the create the temp file, it must have been created by
-          // another thread between lines 161 and 162.  We re-seed to avoid
-          // further race conditions.
-          counter = new Random().nextLong();
-        }
-      }
-    } while (!created);
-
-    // Create the file.
-    tmpFile.createNewFile();
-    return tmpFile;
-  }
-
-  private byte buffer[] = new byte[16 * 1024];
-  private Map<String, EntryInfo> paths = new TreeMap<String, EntryInfo>();
-
-  @Override
-  protected void finalizeZipOutputStream(ZipOutputStream out)
-      throws IOException, BuildException {
-    for (String path : paths.keySet()) {
-      paths.get(path).addToZip(out, path);
-    }
-    super.finalizeZipOutputStream(out);
-  }
-
-  @Override
-  protected void zipDir(File dir,
-      @SuppressWarnings("unused") ZipOutputStream out, String path, int mode,
-      ZipExtraField[] extra) throws IOException {
-    long thisTouchTime = (dir == null ? 0L : dir.lastModified());
-    String dirName = (dir == null ? "<null>" : dir.getAbsolutePath());
-    if (shouldReplace(path, thisTouchTime)) {
-      if (paths.get(path) != null) {
-        log("Obsoleting older " + path + " with " + dirName,
-            Project.MSG_VERBOSE);
-      }
-      paths.put(path, new DirEntryInfo(dir, thisTouchTime, mode, extra));
-    } else {
-      log("Newer " + path + " already added, skipping " + dirName,
-          Project.MSG_VERBOSE);
-    }
-  }
-
-  @Override
-  protected void zipFile(InputStream in,
-      @SuppressWarnings("unused") ZipOutputStream out, String path,
-      long lastModified, File fromArchive, int mode) throws IOException {
-
-    String desc = (fromArchive == null ? "file" : "file from "
-        + fromArchive.getAbsolutePath());
-
-    if (shouldReplace(path, lastModified)) {
-      if (paths.get(path) != null) {
-        log("Obsoleting older " + path + " with " + desc, Project.MSG_VERBOSE);
-      }
-      paths.put(path, new FileEntryInfo(in, lastModified, fromArchive, mode));
-    } else {
-      log("Newer " + path + " already added, skipping " + desc,
-          Project.MSG_VERBOSE);
-    }
-  }
-
-  private void doZipDir(File dir, ZipOutputStream out, String entryName,
-      int mode, ZipExtraField[] extra) throws IOException {
-    super.zipDir(dir, out, entryName, mode, extra);
-  }
-
-  private void doZipFile(InputStream inStream, ZipOutputStream out,
-      String entryName, long timestamp, File archive, int mode)
-      throws IOException {
-    super.zipFile(inStream, out, entryName, timestamp, archive, mode);
-  }
-
-  /**
-   * Checks whether an entry should be replaced, by touch dates and duplicates
-   * setting.
-   * 
-   * @param path the path of an entry being considered
-   * @param touchTime the lastModified of the candiate replacement
-   * @return true if the file should be replaced
-   */
-  private boolean shouldReplace(String path, long touchTime) {
-    EntryInfo oldInfo = paths.get(path);
-    // adding from jars, we get directories with 0L time; missing should be
-    // earlier than that, -1L.
-    long existingTouchTime = ((oldInfo != null) ? oldInfo.getLastModified()
-        : -1L);
-    return (existingTouchTime < touchTime || (existingTouchTime == touchTime && this.duplicate.equals("add")));
-  }
-}
diff --git a/2.4/build-tools/ant-gwt/src/com/google/gwt/ant/taskdefs/SvnInfo.java b/2.4/build-tools/ant-gwt/src/com/google/gwt/ant/taskdefs/SvnInfo.java
deleted file mode 100644
index 02d356a..0000000
--- a/2.4/build-tools/ant-gwt/src/com/google/gwt/ant/taskdefs/SvnInfo.java
+++ /dev/null
@@ -1,377 +0,0 @@
-/*
- * 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.ant.taskdefs;
-
-import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.Task;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.LineNumberReader;
-import java.io.StringReader;
-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.
- */
-public class SvnInfo extends Task {
-
-  /**
-   * Structured svn info.
-   */
-  static class Info {
-    /**
-     * The relative path of this svn working copy within the root of the remote
-     * repository. That is, if the root is "http://example.com/svn" and the
-     * working copy URL is "http://example.com/svn/tags/w00t", this will be set
-     * to "tags/w00t".
-     */
-    public final String branch;
-
-    /**
-     * The revision of this working copy. Initially set to the value parsed from
-     * "svn info" given a more detailed value via "svnversion".
-     */
-    public String revision;
-
-    public Info(String branch, String revision) {
-      this.branch = branch;
-      this.revision = revision;
-    }
-  }
-
-  /**
-   * A regex that matches a URL.
-   */
-  static final String URL_REGEX = "\\w+://\\S*";
-
-  /**
-   * A pattern that matches the URL line in svn info output.  Note that it
-   * <i>also</i> matches Repository Root; to support i18n subversion clients,
-   * we're positionally dependent that URL will be the first match, and
-   * Repository Root the second.
-   */
-  private static final Pattern BRANCH_PATTERN = Pattern.compile("[^:]*:\\s*("
-      + URL_REGEX + ")\\s*");
-
-  /**
-   * A pattern that matches the Revision line in svn info output.  <i>Also</i>
-   * matches Last Changed Rev; we're positionally dependent (revision is
-   * earlier) to support internationalized svn client output.
-   */
-  private static final Pattern REVISION_PATTERN = Pattern.compile("[^:]*:\\s*(\\d+)\\s*");
-
-  /**
-   * A pattern that matches the Repository Root line in svn info output.
-   */
-  private static final Pattern ROOT_PATTERN = Pattern.compile("[^:]*:\\s*("
-      + URL_REGEX + "/svn)\\s*");
-
-  /**
-   * Returns true if this git working copy matches the specified svn revision,
-   * and also has no local modifications.
-   */
-  static boolean doesGitWorkingCopyMatchSvnRevision(File dir, String svnRevision) {
-    String workingRev = getGitWorkingRev(dir);
-    String targetRev = getGitRevForSvnRev(dir, svnRevision);
-    if (!workingRev.equals(targetRev)) {
-      return false;
-    }
-    String status = getGitStatus(dir);
-    return status.contains("nothing to commit (working directory clean)");
-  }
-
-  /**
-   * Returns the git commit number matching the specified svn revision.
-   */
-  static String getGitRevForSvnRev(File dir, String svnRevision) {
-    String output = CommandRunner.getCommandOutput(dir, "git", "svn",
-        "find-rev", "r" + svnRevision);
-    output = output.trim();
-    if (output.length() == 0) {
-      throw new BuildException("git svn find-rev didn't give any answer");
-    }
-    return output;
-  }
-
-  /**
-   * Runs "git status" and returns the result.
-   */
-  static String getGitStatus(File dir) {
-    // git status returns 1 for a status code, so just don't check it.
-    String output = CommandRunner.getCommandOutput(false, dir, "git", "status");
-    if (output.length() == 0) {
-      throw new BuildException("git status didn't give any answer");
-    }
-    return output;
-  }
-
-  /**
-   * Runs "git svn info", returning the output as a string.
-   */
-  static String getGitSvnInfo(File dir) {
-    String output = CommandRunner.getCommandOutput(dir, "git", "svn", "info");
-    if (output.length() == 0) {
-      throw new BuildException("git svn info didn't give any answer");
-    }
-    return output;
-  }
-
-  /**
-   * Returns the current git commit number of the working copy.
-   */
-  static String getGitWorkingRev(File dir) {
-    String output = CommandRunner.getCommandOutput(dir, "git", "rev-list",
-        "--max-count=1", "HEAD");
-    output = output.trim();
-    if (output.length() == 0) {
-      throw new BuildException("git rev-list didn't give any answer");
-    }
-    return output;
-  }
-
-  /**
-   * Runs "svn info", returning the output as a string.
-   */
-  static String getSvnInfo(File dir) {
-    String output = CommandRunner.getCommandOutput(dir, "svn", "info");
-    if (output.length() == 0) {
-      throw new BuildException("svn info didn't give any answer");
-    }
-    return output;
-  }
-
-  /**
-   * Runs "svnversion", returning the output as a string.
-   */
-  static String getSvnVersion(File dir) {
-    String output = CommandRunner.getCommandOutput(dir, "svnversion", ".");
-    output = output.trim();
-    if (output.length() == 0) {
-      throw new BuildException("svnversion didn't give any answer");
-    }
-    return output;
-  }
-
-  /**
-   * Determine if this directory is a part of a .git repository.
-   * 
-   * @param dir working directory to start looking for the repository.
-   * @return <code>true</code> if a .git repo is found. Returns
-   *         <code>false</false> if a .git repo cannot be found, or if 
-   *         this directory is part of a subversion repository.
-   */
-  static boolean looksLikeGit(File dir) {
-    if (looksLikeSvn(dir)) {
-      return false;
-    }
-    File gitDir = findGitDir(dir);
-
-    if (gitDir != null && gitDir.isDirectory()) {
-      return new File(gitDir, "svn").isDirectory();
-    }
-    return false;
-  }
-
-  /**
-   * Returns <code>true</code> if the specified directory looks like an svn
-   * working copy.
-   */
-  static boolean looksLikeSvn(File dir) {
-    return new File(dir, ".svn").isDirectory();
-  }
-
-  /**
-   * Parses the output of running "svn info".
-   */
-  static Info parseInfo(String svnInfo) {
-    String rootUrl = null;
-    String branchUrl = null;
-    String revision = null;
-    LineNumberReader lnr = new LineNumberReader(new StringReader(svnInfo));
-    try {
-      for (String line = lnr.readLine(); line != null; line = lnr.readLine()) {
-        Matcher m;
-        if ((m = ROOT_PATTERN.matcher(line)) != null && m.matches()) {
-          rootUrl = m.group(1);
-        } else if ((m = BRANCH_PATTERN.matcher(line)) != null && m.matches()) {
-          if (branchUrl == null) {
-            branchUrl = m.group(1);
-          } // else skip the 2nd and later matches
-        } else if ((m = REVISION_PATTERN.matcher(line)) != null && m.matches()) {
-          if (revision == null) {
-            revision = m.group(1);
-          } // else skip the 2nd and later matches
-        }
-      }
-    } catch (IOException e) {
-      throw new BuildException("Should never happen", e);
-    }
-
-    if (rootUrl == null) {
-      throw new BuildException("svn info didn't get root URL: " + svnInfo);
-    }
-    if (branchUrl == null) {
-      throw new BuildException("svn info didn't get branch URL: " + svnInfo);
-    }
-    if (revision == null) {
-      throw new BuildException("svn info didn't get revision: " + svnInfo);
-    }
-    rootUrl = removeTrailingSlash(rootUrl);
-    branchUrl = removeTrailingSlash(branchUrl);
-    if (!branchUrl.startsWith(rootUrl)) {
-      throw new BuildException("branch URL (" + branchUrl + ") and root URL ("
-          + rootUrl + ") did not match");
-    }
-
-    String branch;
-    if (branchUrl.length() == rootUrl.length()) {
-      branch = "";
-    } else {
-      branch = branchUrl.substring(rootUrl.length() + 1);
-    }
-    return new Info(branch, revision);
-  }
-
-  static String removeTrailingSlash(String url) {
-    if (url.endsWith("/")) {
-      return url.substring(0, url.length() - 1);
-    }
-    return url;
-  }
-
-  /**
-   * Find the GIT working directory.
-   * 
-   * First checks for the presence of the env variable GIT_DIR, then, looks up
-   * the the tree for a directory named '.git'.
-   * 
-   * @param dir Current working directory
-   * @return An object representing the .git directory. Returns
-   *         <code>null</code> if none can be found.
-   */
-  private static File findGitDir(File dir) {
-    String gitDirPath = System.getenv("GIT_DIR");
-    if (gitDirPath != null) {
-      File gitDir = new File(gitDirPath).getAbsoluteFile();
-      if (gitDir.isDirectory()) {
-        return gitDir;
-      }
-    }
-
-    dir = dir.getAbsoluteFile();
-    while (dir != null) {
-      File gitDir = new File(dir, ".git"); 
-      if (gitDir.isDirectory()) {
-        return gitDir;
-      }
-      dir = dir.getParentFile();
-    }
-    return null;
-  }
-
-  private String fileprop;
-
-  private String outprop;
-
-  private String workdir;
-
-  public SvnInfo() {
-    super();
-  }
-
-  @Override
-  public void execute() throws BuildException {
-    if (outprop == null) {
-      throw new BuildException(
-          "<svninfo> task requires an outputproperty attribute");
-    }
-    if (workdir == null) {
-      workdir = getProject().getProperty("basedir");
-    }
-    File workDirFile = new File(workdir);
-    if (!workDirFile.isDirectory()) {
-      throw new BuildException(workdir + " is not a directory");
-    }
-
-    if (getProject().getProperty(outprop) == null) {
-      Info info;
-      if (looksLikeSvn(workDirFile)) {
-        info = parseInfo(getSvnInfo(workDirFile));
-  
-        // Use svnversion to get a more exact revision string.
-        info.revision = getSvnVersion(workDirFile);
-      } else if (looksLikeGit(workDirFile)) {
-        info = parseInfo(getGitSvnInfo(workDirFile));
-  
-        // Add a 'M' tag if this working copy is not pristine.
-        if (!doesGitWorkingCopyMatchSvnRevision(workDirFile, info.revision)) {
-          info.revision += "M";
-        }
-      } else {
-        info = new Info("unknown", "unknown");
-      }
-      getProject().setNewProperty(outprop, info.branch + "@" + info.revision);
-    } else {
-      String propval = getProject().getProperty(outprop);
-      if (!propval.matches("[^@]+@[0-9]+")) {
-        throw new BuildException(
-          "predefined " + outprop +
-              "should look like branch-spec@revison-number");
-      }
-    }
-    if (fileprop != null) {
-      String outpropval = getProject().getProperty(outprop);
-      int atIndex = outpropval.indexOf('@');
-      String branch = outpropval.substring(0, atIndex);
-      String revision = outpropval.substring(atIndex + 1);
-      
-      getProject().setNewProperty(fileprop,
-          branch.replace('/', '-') + "-" + revision.replace(':', '-'));
-    }
-  }
-
-  /**
-   * Establishes the directory used as the SVN workspace to fetch version
-   * information.
-   * 
-   * @param srcdir workspace directory name
-   */
-  public void setDirectory(String srcdir) {
-    workdir = srcdir;
-  }
-
-  /**
-   * Establishes the property containing the SVN output string, branch@rev.
-   * 
-   * @param propname Name of a property
-   */
-  public void setOutputFileProperty(String propname) {
-    fileprop = propname;
-  }
-
-  /**
-   * Establishes the property containing the SVN output string, branch@rev.
-   * 
-   * @param propname Name of a property
-   */
-  public void setOutputProperty(String propname) {
-    outprop = propname;
-  }
-}
diff --git a/2.4/build-tools/ant-gwt/src/com/google/gwt/ant/taskdefs/TarCat.java b/2.4/build-tools/ant-gwt/src/com/google/gwt/ant/taskdefs/TarCat.java
deleted file mode 100644
index 125daf8..0000000
--- a/2.4/build-tools/ant-gwt/src/com/google/gwt/ant/taskdefs/TarCat.java
+++ /dev/null
@@ -1,256 +0,0 @@
-/*
- * 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.ant.taskdefs;
-
-import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.taskdefs.Tar;
-import org.apache.tools.ant.types.EnumeratedAttribute;
-import org.apache.tools.bzip2.CBZip2InputStream;
-import org.apache.tools.tar.TarEntry;
-import org.apache.tools.tar.TarInputStream;
-import org.apache.tools.tar.TarOutputStream;
-
-import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.IdentityHashMap;
-import java.util.Map;
-import java.util.zip.GZIPInputStream;
-
-/**
- * An extension to the Ant Tar task that supports slurping in other tar files
- * without loss of information (such as permissions or symlinks). It behaves in
- * all respects like the basic Tar task, but adds the nested element
- * {@code <includetar>} which declares another tar file whose <i>contents</i>
- * should be added to the file being created.
- * 
- * In addition to preserving permissions and symlinks no matter what the host
- * operating system is, there are performance advantages to this approach.
- * Bypassing the file system cuts the disk activity to 50% or less. The
- * intermediate files normally generated require data the size of the tar itself
- * to be both written and read, not to mention the overhead of creating the
- * individual files, which will generally have to be deleted later. Furthurmore,
- * since the source and target are often zipped, the savings can be well over
- * 50%.
- * 
- * Example use:
- * 
- * <pre>
- * &lt;taskdef name="tar.cat"
- *     classname="com.google.gwt.ant.taskdefs.TarCat"
- *     classpath="${gwt.build.lib}/ant-gwt.jar" /&gt;
- * &lt;tar.cat destfile="foo.tar.gz" compression="gzip" longfile="gnu"&gt;
- *   &lt;!-- all normal tar attributes and elements supported --&gt;
- *   &lt;tarfileset dir="foo/src"&gt;
- *     &lt;include name="*.class" /&gt;
- *   &lt;/tarfileset&gt;
- *   &lt;!-- tar.cat adds the ability to directly slurp in other tar files --&gt;
- *   &lt;includetar src="bar.tar.gz" compression="gzip" prefix="bar/" /&gt;
- * &lt;/tar.cat&gt;
- * </pre>
- */
-public class TarCat extends Tar {
-
-  /**
-   * This is a tar file that should be included into a tar operation.
-   */
-  public static class IncludeTar {
-    /**
-     * The compression method to use to access the included tar file.
-     */
-    private UntarCompressionMethod compression = new UntarCompressionMethod();
-
-    /**
-     * This instance's peer object that is a member of {@link TarCat}'s
-     * superclass.
-     */
-    private TarFileSet peer;
-
-    /**
-     * Constructs a new IncludeTar.
-     * 
-     * @param peer this instance's peer object that is a member of
-     *          {@link TarCat}'s superclass
-     */
-    public IncludeTar(TarFileSet peer) {
-      this.peer = peer;
-    }
-
-    /**
-     * Set decompression algorithm to use; default=none.
-     * 
-     * Allowable values are
-     * <ul>
-     * <li>none - no compression
-     * <li>gzip - Gzip compression
-     * <li>bzip2 - Bzip2 compression
-     * </ul>
-     * 
-     * @param method compression method
-     */
-    public void setCompression(UntarCompressionMethod method) {
-      compression = method;
-    }
-
-    /**
-     * If the prefix attribute is set, all files in the fileset are prefixed
-     * with that path in the archive. optional.
-     * 
-     * @param prefix the path prefix.
-     */
-    public void setPrefix(String prefix) {
-      peer.setPrefix(prefix);
-    }
-
-    /**
-     * Set the name/location of a tar file to add to a tar operation.
-     * 
-     * @param tarFile the tar file to read
-     */
-    public void setSrc(File tarFile) {
-      peer.setFile(tarFile);
-    }
-  }
-
-  /**
-   * Straight copy from
-   * {@link org.apache.tools.ant.taskdefs.Untar.UntarCompressionMethod} due to
-   * access restrictions.
-   */
-  public static final class UntarCompressionMethod extends EnumeratedAttribute {
-
-    private static final String BZIP2 = "bzip2";
-    private static final String GZIP = "gzip";
-    private static final String NONE = "none";
-
-    public UntarCompressionMethod() {
-      super();
-      setValue(NONE);
-    }
-
-    public String[] getValues() {
-      return new String[] {NONE, GZIP, BZIP2};
-    }
-
-    private InputStream decompress(final File file, final InputStream istream)
-        throws IOException, BuildException {
-      final String value = getValue();
-      if (GZIP.equals(value)) {
-        return new GZIPInputStream(istream);
-      } else {
-        if (BZIP2.equals(value)) {
-          final char[] magic = new char[] {'B', 'Z'};
-          for (int i = 0; i < magic.length; i++) {
-            if (istream.read() != magic[i]) {
-              throw new BuildException("Invalid bz2 file." + file.toString());
-            }
-          }
-          return new CBZip2InputStream(istream);
-        }
-      }
-      return istream;
-    }
-  }
-
-  /**
-   * A map to the set of {@link IncludeTar}s from their peer objects.
-   */
-  private final Map<TarFileSet, IncludeTar> peerMap = new IdentityHashMap<TarFileSet, IncludeTar>();
-
-  /**
-   * Creates a task instance.
-   */
-  public TarCat() {
-  }
-
-  /**
-   * Add a new tar to include in this tar operation.
-   */
-  public IncludeTar createIncludeTar() {
-    /*
-     * Create a peer TarFileSet corresponding to one of our own IncludeTars.
-     * This causes the superclass to call us back during execution.
-     */
-    TarFileSet peer = super.createTarFileSet();
-    IncludeTar includeTar = new IncludeTar(peer);
-    peerMap.put(peer, includeTar);
-    return includeTar;
-  }
-
-  protected void tarFile(File file, TarOutputStream tOut, String vPath,
-      TarFileSet tarFileSet) throws IOException {
-    if (!peerMap.containsKey(tarFileSet)) {
-      // Not one of ours, punt to superclass.
-      super.tarFile(file, tOut, vPath, tarFileSet);
-      return;
-    }
-
-    IncludeTar includeTar = peerMap.get(tarFileSet);
-    String prefix = tarFileSet.getPrefix();
-    if (prefix.length() > 0 && !prefix.endsWith("/")) {
-      // '/' is appended for compatibility with the zip task.
-      prefix = prefix + "/";
-    }
-    TarInputStream tIn = null;
-    try {
-      tIn = new TarInputStream(includeTar.compression.decompress(file,
-          new BufferedInputStream(new FileInputStream(file))));
-      TarEntry te = null;
-      while ((te = tIn.getNextEntry()) != null) {
-        vPath = te.getName();
-
-        // don't add "" to the archive
-        if (vPath.length() <= 0) {
-          continue;
-        }
-
-        if (te.isDirectory() && !vPath.endsWith("/")) {
-          vPath += "/";
-        }
-
-        vPath = prefix + vPath;
-
-        te.setName(vPath);
-        tOut.putNextEntry(te);
-
-        if (te.getSize() > 0) {
-          byte[] buffer = new byte[8 * 1024];
-          while (true) {
-            int count = tIn.read(buffer, 0, buffer.length);
-            if (count < 0) {
-              break;
-            }
-            tOut.write(buffer, 0, count);
-          }
-        }
-        tOut.closeEntry();
-      }
-
-    } catch (IOException e) {
-      throw new BuildException("Error while expanding " + file.getPath(), e,
-          getLocation());
-    } finally {
-      if (tIn != null) {
-        try {
-          tIn.close();
-        } catch (IOException ignored) {
-        }
-      }
-    }
-  }
-}
diff --git a/2.4/build-tools/ant-gwt/src/com/google/gwt/ant/taskdefs/Timer.java b/2.4/build-tools/ant-gwt/src/com/google/gwt/ant/taskdefs/Timer.java
deleted file mode 100644
index 7b6db5d..0000000
--- a/2.4/build-tools/ant-gwt/src/com/google/gwt/ant/taskdefs/Timer.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * 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.ant.taskdefs;
-
-import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.Task;
-import org.apache.tools.ant.TaskContainer;
-
-import java.util.Vector;
-
-/**
- * A timer task for ant, which reports the total time to execute the contained
- * tasks.  It reports both a millisecond total and hour:minute:second.fraction
- * formats.
- */
-public class Timer extends Task implements TaskContainer {
-
-  private static final int MS_IN_HOUR = 60 * 60 * 1000;
-  private static final int MS_IN_MINUTE =  60 * 1000;
-  private static final int MS_IN_SECOND =  1000;
-
-  private Vector<Task> nested;
-  private String name;
-
-  public Timer() {
-    super();
-    nested = new Vector<Task>();
-    name = "";
-  }
-
-  public void addTask(Task newtask) {
-    nested.addElement(newtask);
-  }
-
-  public void execute() throws BuildException {
-    long start = System.currentTimeMillis();
-    for (Task task : nested) {
-      task.perform();
-    }
-
-    long durationMsec = (System.currentTimeMillis() - start);
-    long duration = durationMsec; 
-    long hrs = duration / MS_IN_HOUR;
-    duration -= hrs * MS_IN_HOUR;
-    long min = duration  / MS_IN_MINUTE;
-    duration -= min * MS_IN_MINUTE;
-    long sec = duration / MS_IN_SECOND;
-    duration -= sec * MS_IN_SECOND;
-    long msec = duration;
-
-    log("timer " + name + " timed " + durationMsec + " ms. " +
-        String.format("(%02d:%02d:%02d.%03d)", hrs, min, sec, msec)); 
-  }
-
-  public void setName(String newname) {
-    name = newname;
-  }
-}
diff --git a/2.4/build-tools/ant-gwt/test/com/google/gwt/ant/taskdefs/CommandRunnerTest.java b/2.4/build-tools/ant-gwt/test/com/google/gwt/ant/taskdefs/CommandRunnerTest.java
deleted file mode 100644
index 89ad78d..0000000
--- a/2.4/build-tools/ant-gwt/test/com/google/gwt/ant/taskdefs/CommandRunnerTest.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * 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.ant.taskdefs;
-
-import junit.framework.TestCase;
-
-import java.io.File;
-
-/**
- * Tests for {@link CommandRunner}.
- */
-public class CommandRunnerTest extends TestCase {
-
-  /**
-   * Test that "java -help" runs successfully.
-   */
-  public void testGetCommandOutput() {
-    String output = CommandRunner.getCommandOutput(new File("."), new File(
-        System.getProperty("java.home"), "bin/java").getAbsolutePath(), "-help");
-    assertNotNull(output);
-  }
-
-  /**
-   * Test that a command array is correctly turned into a printable string.
-   */
-  public void testMakeCmdString() {
-    assertEquals("java", CommandRunner.makeCmdString("java"));
-    assertEquals("java -version", CommandRunner.makeCmdString("java",
-        "-version"));
-  }
-
-}
diff --git a/2.4/build-tools/ant-gwt/test/com/google/gwt/ant/taskdefs/SvnInfoTest.java b/2.4/build-tools/ant-gwt/test/com/google/gwt/ant/taskdefs/SvnInfoTest.java
deleted file mode 100644
index 2d09fd7..0000000
--- a/2.4/build-tools/ant-gwt/test/com/google/gwt/ant/taskdefs/SvnInfoTest.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * 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.ant.taskdefs;
-
-import com.google.gwt.ant.taskdefs.SvnInfo.Info;
-
-import junit.framework.TestCase;
-
-import java.io.File;
-
-/**
- * Tests for {@link SvnInfo}.
- */
-public class SvnInfoTest extends TestCase {
-
-  /**
-   * The current directory.
-   */
-  private static final File dir = new File(".");
-
-  /**
-   * A cached copy of 'git svn info' so we don't have to keep running it (makes
-   * the tests run faster).
-   */
-  private static String gitSvnInfo = null;
-
-  /**
-   * Check that this is a valid git rev.
-   */
-  private static void assertIsValidGitRev(String rev) {
-    assertNotNull(rev);
-    assertEquals(rev, 40, rev.length());
-    for (char ch : rev.toCharArray()) {
-      assertTrue(isHexDigit(ch));
-    }
-  }
-
-  private static String getGitSvnInfo() {
-    if (gitSvnInfo == null) {
-      gitSvnInfo = SvnInfo.getGitSvnInfo(dir);
-    }
-    return gitSvnInfo;
-  }
-
-  private static boolean isHexDigit(char ch) {
-    return (ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'F')
-        || (ch >= 'a' && ch <= 'f');
-  }
-
-  /**
-   * Test that doesGitWorkingCopyMatchSvnRevision finishes.
-   */
-  public void testDoesGitWorkingCopyMatchSvnRevision() {
-    if (SvnInfo.looksLikeGit(dir)) {
-      Info info = SvnInfo.parseInfo(getGitSvnInfo());
-      SvnInfo.doesGitWorkingCopyMatchSvnRevision(dir, info.revision);
-    }
-  }
-
-  /**
-   * Test that getGitRevForSvnRev returns a 40-character git hash.
-   */
-  public void testGetGitRevForSvnRev() {
-    if (SvnInfo.looksLikeGit(dir)) {
-      Info info = SvnInfo.parseInfo(getGitSvnInfo());
-      String rev = SvnInfo.getGitRevForSvnRev(dir, info.revision);
-      assertIsValidGitRev(rev);
-    }
-  }
-
-  public void testGetGitStatus() {
-    if (SvnInfo.looksLikeGit(dir)) {
-      String status = SvnInfo.getGitStatus(dir);
-      assertNotNull(status);
-      assertTrue(!"".equals(status));
-    }
-  }
-
-  public void testGetGitSvnInfo() {
-    if (SvnInfo.looksLikeGit(dir)) {
-      String info = getGitSvnInfo();
-      assertNotNull(info);
-      assertTrue(!"".equals(info));
-    }
-  }
-
-  public void testGetGitSvnWorkingRev() {
-    if (SvnInfo.looksLikeGit(dir)) {
-      String rev = SvnInfo.getGitWorkingRev(dir);
-      assertIsValidGitRev(rev);
-    }
-  }
-
-  /**
-   * If this is an svn working copy, just verify that "svn info" succeeds and
-   * returns something.
-   */
-  public void testGetSvnInfo() {
-    if (SvnInfo.looksLikeSvn(dir)) {
-      String info = SvnInfo.getSvnInfo(dir);
-      assertNotNull(info);
-      assertTrue(!"".equals(info));
-    }
-  }
-
-  /**
-   * If this is an svn working copy, just verify that "svnversion" succeeds and
-   * returns something.
-   */
-  public void testGetSvnVersion() {
-    if (SvnInfo.looksLikeSvn(dir)) {
-      String version = SvnInfo.getSvnVersion(dir);
-      assertNotNull(version);
-      assertTrue(!"".equals(version));
-    }
-  }
-
-  /**
-   * Test that the correct info is parsed out of a canned result.
-   */
-  public void testParseInfo() {
-    String svnInfo = "Path: .\n" + "URL: http://example.com/svn/tags/w00t\n"
-        + "Repository Root: http://example.com/svn\n"
-        + "Repository UUID: 00000000-0000-0000-0000-000000000000\n"
-        + "Revision: 9999\n" + "Node Kind: directory\n" + "Schedule: normal\n"
-        + "Last Changed Author: foo@example.com\n" + "Last Changed Rev: 8888\n"
-        + "Last Changed Date: 2009-01-01 00:00:00 +0000 (Thu, 01 Jan 2009)\n";
-    Info info = SvnInfo.parseInfo(svnInfo);
-    assertEquals("tags/w00t", info.branch);
-    assertEquals("9999", info.revision);
-  }
-
-  /**
-   * Test that trailing slashes are removed correctly.
-   */
-  public void testRemoveTrailingSlash() {
-    assertEquals("http://example.com/svn",
-        SvnInfo.removeTrailingSlash("http://example.com/svn"));
-    assertEquals("http://example.com/svn",
-        SvnInfo.removeTrailingSlash("http://example.com/svn/"));
-  }
-}
diff --git a/2.4/build-tools/build.xml b/2.4/build-tools/build.xml
deleted file mode 100644
index f81b120..0000000
--- a/2.4/build-tools/build.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<project name="buildtools" default="build" basedir=".">
-  <property name="gwt.root" location=".." />
-  <property name="project.tail" value="build-tools" />
-  <import file="${gwt.root}/common.ant.xml" />
-
-  <!-- "build" is the default when subprojects are directly targetted -->
-  <property name="target" value="build" />
-
-  <target name="ant-gwt" description="Builds GWT specific Ant extensions">
-    <gwt.ant dir="ant-gwt" />
-  </target>
-
-  <target name="customchecks" description="Build the checkstyle extensions">
-    <gwt.ant dir="customchecks" />
-  </target>
-  
-  <target name="doctool" description="Build the doctool">
-    <gwt.ant dir="doctool" />
-  </target>
-
-  <target name="-do" depends="ant-gwt, customchecks, doctool" description="Run all subprojects"/>
-  
-  <target name="build" description="Builds GWT">
-    <antcall target="-do">
-      <param name="target" value="build" />
-    </antcall>
-  </target>
-
-  <target name="checkstyle" depends="build" description="Static analysis of GWT source">
-    <antcall target="-do">
-      <param name="target" value="checkstyle" />
-    </antcall>
-  </target>
-
-  <target name="test" depends="build" description="Test GWT">
-    <antcall target="-do">
-      <param name="target" value="test" />
-    </antcall>
-  </target>
-</project>
diff --git a/2.4/build-tools/customchecks/build.xml b/2.4/build-tools/customchecks/build.xml
deleted file mode 100644
index f929b2d..0000000
--- a/2.4/build-tools/customchecks/build.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<project name="customchecks" default="build" basedir=".">
-  <property name="gwt.root" location="../.." />
-  <property name="project.tail" value="build-tools/customchecks" />
-  <import file="${gwt.root}/common.ant.xml" />
-
-  <target name="compile" description="Compiles this project">
-    <mkdir dir="${javac.out}" />
-    <gwt.javac>
-      <classpath>
-        <pathelement location="${gwt.tools.antlib}/checkstyle-all-4.2.jar" />
-      </classpath>
-    </gwt.javac>
-  </target>
-
-  <target name="build" depends="compile" description="Packages this project into a jar">
-    <mkdir dir="${gwt.build.lib}" />
-    <gwt.jar>
-      <fileset dir="src" />
-      <fileset dir="${javac.out}" />
-    </gwt.jar>
-  </target>
-
-  <target name="checkstyle">
-    <!-- NOTE: This project doesn't have the checkstyle rule since it participates in bootstrapping. -->
-  </target>
-
-  <target name="clean" description="Cleans this project's intermediate and output files">
-    <delete dir="${project.build}" />
-    <delete file="${project.lib}" />
-  </target>
-
-</project>
diff --git a/2.4/build-tools/customchecks/src/com/google/gwt/checkstyle/FieldCheck.java b/2.4/build-tools/customchecks/src/com/google/gwt/checkstyle/FieldCheck.java
deleted file mode 100644
index 4044209..0000000
--- a/2.4/build-tools/customchecks/src/com/google/gwt/checkstyle/FieldCheck.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright 2006 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.checkstyle;
-
-import com.puppycrawl.tools.checkstyle.api.DetailAST;
-import com.puppycrawl.tools.checkstyle.api.TokenTypes;
-import com.puppycrawl.tools.checkstyle.checks.naming.MemberNameCheck;
-
-/**
- * Override MemberNameCheck to correctly use match rather than find.
- */
-public class FieldCheck extends MemberNameCheck {
-  public FieldCheck() {
-    // Specifically stopping fields such as fMainWnd from being allowed.
-    setFormat("([a-eg-z]|(f[a-z0-9]))[a-zA-Z0-9]*");
-  }
-
-  public void visitToken(DetailAST aAST) {
-    if (mustCheckName(aAST)) {
-      final DetailAST nameAST = aAST.findFirstToken(TokenTypes.IDENT);
-      if (!getRegexp().matcher(nameAST.getText()).matches()) {
-        log(
-            nameAST.getLineNo(),
-            nameAST.getText()
-                + ": Field names must start with [a-z], may not start with f[A-Z], and should not contain '_''s.");
-      }
-    }
-  }
-}
diff --git a/2.4/build-tools/customchecks/src/com/google/gwt/checkstyle/OrderCheck.java b/2.4/build-tools/customchecks/src/com/google/gwt/checkstyle/OrderCheck.java
deleted file mode 100644
index 5e69331..0000000
--- a/2.4/build-tools/customchecks/src/com/google/gwt/checkstyle/OrderCheck.java
+++ /dev/null
@@ -1,215 +0,0 @@
-// CHECKSTYLE_OFF:Must use GNU license for code based on checkstyle
-// /////////////////////////////////////////////////////////////////////////////
-// checkstyle: Checks Java source code for adherence to a set of rules.
-// Copyright (C) 2001-2005 Oliver Burn
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License, or (at your option) any later version.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-// //////////////////////////////////////////////////////////////////////////////
-// CHECKSTYLE_ON
-
-// This class is based upon the
-// com.puppycrawl.tools.checkstyle.checks.coding.DeclarationOrderCheck
-
-package com.google.gwt.checkstyle;
-
-import com.puppycrawl.tools.checkstyle.api.Check;
-import com.puppycrawl.tools.checkstyle.api.DetailAST;
-import com.puppycrawl.tools.checkstyle.api.Scope;
-import com.puppycrawl.tools.checkstyle.api.ScopeUtils;
-import com.puppycrawl.tools.checkstyle.api.TokenTypes;
-
-import java.util.Stack;
-
-/**
- * Checks that the parts of a class or interface declaration appear in the order
- * specified by the 'Making GWT better' style guide.
- */
-
-public class OrderCheck extends Check {
-  /**
-   * Encapsulate the state in each class scope in order to handle inner classes.
-   */
-  private static class ScopeState {
-    /**
-     * Current state.
-     */
-    private int state = State.TYPE;
-
-    /**
-     * Current access modifier for state.
-     */
-    private Scope visibility = Scope.PUBLIC;
-  }
-
-  /**
-   * Ordered category states for code elements.
-   */
-  private static class State {
-    private static final int TYPE = 0;
-    private static final int STATIC_FIELDS = 1;
-    private static final int STATIC_INITS = 2;
-    private static final int STATIC_METHODS = 3;
-    private static final int INSTANCE_FIELDS = 4;
-    private static final int INSTANCE_INITS = 5;
-    private static final int CONSTRUCTORS = 6;
-    private static final int INSTANCE_METHODS = 7;
-  }
-
-  /**
-   * List of Declaration States. This is necessary due to inner classes that
-   * have their own state.
-   */
-  private final Stack<ScopeState> classScopes = new Stack<ScopeState>();
-
-  /**
-   * Previous method name, used for alphabetical ordering.
-   */
-  private String previousMethodName;
-
-  public int[] getDefaultTokens() {
-    return new int[] {
-        TokenTypes.CTOR_DEF, TokenTypes.METHOD_DEF, TokenTypes.MODIFIERS,
-        TokenTypes.STATIC_INIT, TokenTypes.INSTANCE_INIT, TokenTypes.OBJBLOCK};
-  }
-
-  public void leaveToken(DetailAST aAST) {
-    switch (aAST.getType()) {
-      case TokenTypes.OBJBLOCK:
-        classScopes.pop();
-        previousMethodName = null;
-        break;
-      case TokenTypes.METHOD_DEF:
-        // If the previous method was in the same class, with the same
-        // modifiers, check that it is alphabetically before the current
-        // method.
-        String methodName = aAST.findFirstToken(TokenTypes.IDENT).getText();
-        if (previousMethodName != null
-            && (previousMethodName.compareToIgnoreCase(methodName)) > 0) {
-          log(aAST, methodName + " is not alphabetical.");
-        }
-        previousMethodName = methodName;
-        break;
-      default:
-    }
-  }
-
-  public void visitToken(DetailAST aAST) {
-    try {
-      int parentType = 0;
-      if (aAST.getParent() != null) {
-        parentType = aAST.getParent().getType();
-      }
-      switch (aAST.getType()) {
-        case TokenTypes.OBJBLOCK:
-          classScopes.push(new ScopeState());
-          previousMethodName = null;
-          break;
-
-        case TokenTypes.CTOR_DEF:
-          if (parentType != TokenTypes.OBJBLOCK) {
-            return;
-          }
-          checkState(aAST, State.CONSTRUCTORS, "Constructor");
-          break;
-
-        case TokenTypes.MODIFIERS:
-          if (parentType == TokenTypes.VARIABLE_DEF) {
-            checkVariable(aAST);
-          }
-          if (parentType == TokenTypes.METHOD_DEF) {
-            checkMethod(aAST);
-          }
-          break;
-        case TokenTypes.STATIC_INIT: {
-          checkState(aAST, State.STATIC_INITS, "Static initializer");
-          break;
-        }
-        case TokenTypes.INSTANCE_INIT: {
-          checkState(aAST, State.INSTANCE_INITS, "Instance initializer");
-        }
-          break;
-        default:
-      }
-    } catch (Throwable t) {
-      // CheckStyle swallows errors in general, we want OrderCheck errors to be
-      // visible.
-      t.printStackTrace();
-      throw new RuntimeException("Exception/Error in OrderCheck", t);
-    }
-  }
-
-  /**
-   * Check the modifiers of a method for order conflicts.
-   */
-  private void checkMethod(DetailAST aAST) {
-    if (aAST.getParent().getParent().getType() != TokenTypes.OBJBLOCK) {
-      return;
-    }
-    if (aAST.findFirstToken(TokenTypes.LITERAL_STATIC) != null) {
-      if (checkState(aAST, State.STATIC_METHODS, "Static method")) {
-        previousMethodName = null;
-      }
-    } else {
-      if (checkState(aAST, State.INSTANCE_METHODS, "Instance method")) {
-        previousMethodName = null;
-      }
-    }
-  }
-
-  /**
-   * Checks the category and visibility of declarations.
-   * 
-   * @return whether the state or visibility modifiers have changed
-   */
-  private boolean checkState(DetailAST aAST, int curState, String type) {
-    ScopeState scope = classScopes.peek();
-    if (scope.state > curState) {
-      log(aAST, type + " in wrong order.");
-      // Wrong type implies at least a temporary state switch.
-      return true;
-    } else if (scope.state == curState) {
-      final Scope curVisibility = ScopeUtils.getScopeFromMods(aAST);
-      if (scope.visibility.compareTo(curVisibility) > 0) {
-        log(aAST, curVisibility.getName() + " " + type
-            + " should not occur after " + scope.visibility.getName() + " "
-            + type);
-        return false;
-      } else if (scope.visibility != curVisibility) {
-        scope.visibility = curVisibility;
-        return true;
-      } else {
-        return false;
-      }
-    } else {
-      scope.state = curState;
-      scope.visibility = Scope.PUBLIC;
-      return true;
-    }
-  }
-
-  /**
-   * Check the modifiers of a variable for order conflicts.
-   */
-  private void checkVariable(DetailAST aAST) {
-    if (aAST.getParent().getParent().getType() != TokenTypes.OBJBLOCK) {
-      return;
-    }
-    if (aAST.findFirstToken(TokenTypes.LITERAL_STATIC) != null) {
-      checkState(aAST, State.STATIC_FIELDS, "Static field");
-    } else {
-      checkState(aAST, State.INSTANCE_FIELDS, "Instance field");
-    }
-  }
-}
\ No newline at end of file
diff --git a/2.4/build-tools/doctool/build.xml b/2.4/build-tools/doctool/build.xml
deleted file mode 100644
index bc9cbbd..0000000
--- a/2.4/build-tools/doctool/build.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<project name="doctool" default="build" basedir=".">
-  <property name="gwt.root" location="../.." />
-  <property name="project.tail" value="build-tools/doctool" />
-  <import file="${gwt.root}/common.ant.xml" />
-
-  <property.ensure name="java.tools.path" location="${java.home}/../lib/tools.jar" unless="build.host.ismac" message="Cannot find ${java.home}/../lib/tools.jar; please use a JDK when building doc rather than a JRE." />
-
-  <target name="compile" description="Compiles this project">
-    <mkdir dir="${javac.out}" />
-    <gwt.javac>
-      <classpath>
-        <pathelement location="${java.tools.path}" />
-      </classpath>
-    </gwt.javac>
-  </target>
-
-  <target name="build" depends="compile" description="Packages this project into a jar">
-    <mkdir dir="${gwt.build.lib}" />
-    <gwt.jar>
-      <fileset dir="src" />
-      <fileset dir="${javac.out}" />
-    </gwt.jar>
-  </target>
-
-  <target name="checkstyle" description="Static analysis of source">
-    <gwt.checkstyle>
-      <fileset dir="src" />
-    </gwt.checkstyle>
-  </target>
-
-  <target name="clean" description="Cleans this project's intermediate and output files">
-    <delete dir="${project.build}" />
-    <delete file="${project.lib}" />
-  </target>
-
-</project>
diff --git a/2.4/build-tools/doctool/src/booklet.xsd b/2.4/build-tools/doctool/src/booklet.xsd
deleted file mode 100644
index f1daf8f..0000000
--- a/2.4/build-tools/doctool/src/booklet.xsd
+++ /dev/null
@@ -1,304 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- edited with XMLSpy v2005 rel. 3 U (http://www.altova.com) by Bruce Johnson (private) -->
-<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
-	<xs:element name="booklet">
-		<xs:annotation>
-			<xs:documentation>The documentation for the entire API</xs:documentation>
-		</xs:annotation>
-		<xs:complexType>
-			<xs:sequence>
-				<xs:group ref="sectionHead"/>
-				<xs:element ref="package" maxOccurs="unbounded"/>
-			</xs:sequence>
-		</xs:complexType>
-	</xs:element>
-	<xs:element name="package">
-		<xs:complexType>
-			<xs:sequence>
-				<xs:group ref="sectionHead"/>
-				<xs:choice minOccurs="0" maxOccurs="unbounded">
-					<xs:element ref="class"/>
-					<xs:element ref="interface"/>
-				</xs:choice>
-			</xs:sequence>
-		</xs:complexType>
-	</xs:element>
-	<xs:element name="class">
-		<xs:complexType>
-			<xs:sequence>
-				<xs:group ref="sectionHead"/>
-				<xs:group ref="access" minOccurs="0"/>
-				<xs:sequence>
-					<xs:element name="isAbstract" minOccurs="0"/>
-					<xs:element name="isStatic" minOccurs="0"/>
-					<xs:element name="isFinal" minOccurs="0"/>
-				</xs:sequence>
-				<xs:sequence>
-					<xs:element name="superclass" minOccurs="0">
-						<xs:complexType>
-							<xs:simpleContent>
-								<xs:extension base="xs:string">
-									<xs:attribute name="ref">
-										<xs:annotation>
-											<xs:documentation>The id of the type of the superclass</xs:documentation>
-										</xs:annotation>
-									</xs:attribute>
-								</xs:extension>
-							</xs:simpleContent>
-						</xs:complexType>
-					</xs:element>
-					<xs:element ref="superinterface" minOccurs="0" maxOccurs="unbounded"/>
-				</xs:sequence>
-				<xs:choice minOccurs="0" maxOccurs="unbounded">
-					<xs:element ref="field"/>
-					<xs:element ref="method"/>
-					<xs:element ref="class"/>
-					<xs:element ref="interface"/>
-					<xs:element ref="constructor"/>
-				</xs:choice>
-			</xs:sequence>
-		</xs:complexType>
-	</xs:element>
-	<xs:element name="interface">
-		<xs:complexType>
-			<xs:sequence>
-				<xs:group ref="sectionHead"/>
-				<xs:group ref="access" minOccurs="0"/>
-				<xs:sequence>
-					<xs:element name="isAbstract" minOccurs="0">
-						<xs:annotation>
-							<xs:documentation>Implied but harmless</xs:documentation>
-						</xs:annotation>
-					</xs:element>
-					<xs:element name="isStatic" minOccurs="0">
-						<xs:annotation>
-							<xs:documentation>Implied but harmless on a nested interface</xs:documentation>
-						</xs:annotation>
-					</xs:element>
-				</xs:sequence>
-				<xs:element ref="superinterface" minOccurs="0" maxOccurs="unbounded"/>
-				<xs:choice minOccurs="0" maxOccurs="unbounded">
-					<xs:element ref="field"/>
-					<xs:element ref="method"/>
-					<xs:element ref="class"/>
-					<xs:element ref="interface"/>
-				</xs:choice>
-			</xs:sequence>
-		</xs:complexType>
-	</xs:element>
-	<xs:element name="method">
-		<xs:complexType>
-			<xs:sequence>
-				<xs:group ref="sectionHead"/>
-				<xs:group ref="access" minOccurs="0"/>
-				<xs:choice minOccurs="0">
-					<xs:element name="isAbstract"/>
-					<xs:element name="isStatic">
-						<xs:annotation>
-							<xs:documentation>N/A when the method appears in an interface</xs:documentation>
-						</xs:annotation>
-					</xs:element>
-					<xs:element name="isFinal">
-						<xs:annotation>
-							<xs:documentation>N/A when the method appears in an interface</xs:documentation>
-						</xs:annotation>
-					</xs:element>
-				</xs:choice>
-				<xs:element ref="flatSignature"/>
-				<xs:element name="isSynchronized" minOccurs="0"/>
-				<xs:element name="type">
-					<xs:annotation>
-						<xs:documentation>The method return type</xs:documentation>
-					</xs:annotation>
-				</xs:element>
-				<xs:element ref="params"/>
-				<xs:element ref="throws" minOccurs="0"/>
-			</xs:sequence>
-		</xs:complexType>
-	</xs:element>
-	<xs:element name="field">
-		<xs:complexType>
-			<xs:sequence>
-				<xs:group ref="sectionHead"/>
-				<xs:group ref="access" minOccurs="0"/>
-				<xs:sequence>
-					<xs:element name="isStatic" minOccurs="0"/>
-					<xs:element name="isFinal" minOccurs="0"/>
-				</xs:sequence>
-				<xs:element name="type">
-					<xs:annotation>
-						<xs:documentation>The field type</xs:documentation>
-					</xs:annotation>
-				</xs:element>
-			</xs:sequence>
-		</xs:complexType>
-	</xs:element>
-	<xs:element name="link">
-		<xs:annotation>
-			<xs:documentation>An explicit link to an id in this same document format (relies on special treatment from XSLT)</xs:documentation>
-		</xs:annotation>
-		<xs:complexType mixed="true">
-			<xs:attribute name="ref">
-				<xs:annotation>
-					<xs:documentation>The link target id</xs:documentation>
-				</xs:annotation>
-			</xs:attribute>
-		</xs:complexType>
-	</xs:element>
-	<xs:element name="superinterface">
-		<xs:complexType>
-			<xs:simpleContent>
-				<xs:extension base="xs:string">
-					<xs:attribute name="ref">
-						<xs:annotation>
-							<xs:documentation>The id of the interface type</xs:documentation>
-						</xs:annotation>
-					</xs:attribute>
-				</xs:extension>
-			</xs:simpleContent>
-		</xs:complexType>
-	</xs:element>
-	<xs:element name="params">
-		<xs:annotation>
-			<xs:documentation>Method/constructor parameters in left-to-right order</xs:documentation>
-		</xs:annotation>
-		<xs:complexType>
-			<xs:sequence>
-				<xs:element name="param" minOccurs="0" maxOccurs="unbounded">
-					<xs:complexType>
-						<xs:sequence>
-							<xs:element name="type">
-								<xs:annotation>
-									<xs:documentation>The param type, as it should appear to the reader</xs:documentation>
-								</xs:annotation>
-								<xs:complexType>
-									<xs:simpleContent>
-										<xs:extension base="xs:string">
-											<xs:attribute name="ref">
-												<xs:annotation>
-													<xs:documentation>A reference to the type id of the param type</xs:documentation>
-												</xs:annotation>
-											</xs:attribute>
-										</xs:extension>
-									</xs:simpleContent>
-								</xs:complexType>
-							</xs:element>
-							<xs:element name="name" type="xs:string">
-								<xs:annotation>
-									<xs:documentation>The name of the param</xs:documentation>
-								</xs:annotation>
-							</xs:element>
-						</xs:sequence>
-					</xs:complexType>
-				</xs:element>
-			</xs:sequence>
-		</xs:complexType>
-	</xs:element>
-	<xs:element name="flatSignature">
-		<xs:annotation>
-			<xs:documentation>A simple param signature enclosed in parentheses that would differentitate overloads in a table of mehod links, such as "(int, Widget)"</xs:documentation>
-		</xs:annotation>
-	</xs:element>
-	<xs:group name="sectionHead">
-		<xs:sequence>
-			<xs:element name="id">
-				<xs:annotation>
-					<xs:documentation>The id of this section, which can be the target of a link and which should be unique across all documents which might want to link to this section </xs:documentation>
-				</xs:annotation>
-			</xs:element>
-			<xs:element name="name">
-				<xs:annotation>
-					<xs:documentation>The name/title of this section; if a @title tag is found, it should be used rather than the programmatic name</xs:documentation>
-				</xs:annotation>
-			</xs:element>
-			<xs:element name="location" minOccurs="0">
-				<xs:annotation>
-					<xs:documentation>TODO - replace me with better XSLT - A sequence of links that indicate structure back to the logical parent of this component within the doc hierarchy</xs:documentation>
-				</xs:annotation>
-				<xs:complexType>
-					<xs:sequence minOccurs="0" maxOccurs="unbounded">
-						<xs:element ref="link"/>
-					</xs:sequence>
-				</xs:complexType>
-			</xs:element>
-			<xs:element name="lead">
-				<xs:annotation>
-					<xs:documentation>Simple HTML intro text (a single phrase or sentence) that might appear in an overview table</xs:documentation>
-				</xs:annotation>
-				<xs:complexType mixed="true">
-					<xs:sequence minOccurs="0" maxOccurs="unbounded">
-						<xs:any namespace="##any" processContents="skip"/>
-					</xs:sequence>
-				</xs:complexType>
-			</xs:element>
-			<xs:element name="description">
-				<xs:annotation>
-					<xs:documentation>Detailed narrative related to the topic</xs:documentation>
-				</xs:annotation>
-				<xs:complexType mixed="true">
-					<xs:sequence minOccurs="0" maxOccurs="unbounded">
-						<xs:any namespace="##any" processContents="skip">
-							<xs:annotation>
-								<xs:documentation>HTML description; "link" elements inteded to be parsed and fixed up</xs:documentation>
-							</xs:annotation>
-						</xs:any>
-					</xs:sequence>
-				</xs:complexType>
-			</xs:element>
-			<xs:element name="tags" minOccurs="0">
-				<xs:annotation>
-					<xs:documentation>Arbitrary tags for which a particular XSLT might handle specially such as "param", "returns", "throws"; some well-known ones are included for reference</xs:documentation>
-				</xs:annotation>
-				<xs:complexType>
-					<xs:sequence minOccurs="0" maxOccurs="unbounded">
-						<xs:any namespace="##any" processContents="skip">
-							<xs:annotation>
-								<xs:documentation>@link or any out-of-band tag, such as those found in JavaDoc, go here for potential XSLT special treatment</xs:documentation>
-							</xs:annotation>
-						</xs:any>
-					</xs:sequence>
-				</xs:complexType>
-			</xs:element>
-		</xs:sequence>
-	</xs:group>
-	<xs:group name="access">
-		<xs:choice>
-			<xs:element name="isPublic"/>
-			<xs:element name="isProtected"/>
-			<xs:element name="isPackagePrivate"/>
-			<xs:element name="isPrivate"/>
-		</xs:choice>
-	</xs:group>
-	<xs:element name="constructor">
-		<xs:complexType>
-			<xs:sequence>
-				<xs:group ref="sectionHead"/>
-				<xs:group ref="access" minOccurs="0"/>
-				<xs:element ref="flatSignature"/>
-				<xs:element ref="params"/>
-				<xs:element ref="throws" minOccurs="0"/>
-			</xs:sequence>
-		</xs:complexType>
-	</xs:element>
-	<xs:element name="throws">
-		<xs:annotation>
-			<xs:documentation>A list of exception that might be thrown</xs:documentation>
-		</xs:annotation>
-		<xs:complexType>
-			<xs:sequence minOccurs="0" maxOccurs="unbounded">
-				<xs:element name="throw">
-					<xs:annotation>
-						<xs:documentation>Indicates a method/ctor might throw this type</xs:documentation>
-					</xs:annotation>
-					<xs:complexType mixed="true">
-						<xs:attribute name="ref">
-							<xs:annotation>
-								<xs:documentation>A reference to the id of the class that can be thrown</xs:documentation>
-							</xs:annotation>
-						</xs:attribute>
-					</xs:complexType>
-				</xs:element>
-			</xs:sequence>
-		</xs:complexType>
-	</xs:element>
-</xs:schema>
diff --git a/2.4/build-tools/doctool/src/com/google/doctool/Booklet.java b/2.4/build-tools/doctool/src/com/google/doctool/Booklet.java
deleted file mode 100644
index 8f0fbdb..0000000
--- a/2.4/build-tools/doctool/src/com/google/doctool/Booklet.java
+++ /dev/null
@@ -1,1002 +0,0 @@
-/*
- * Copyright 2006 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.doctool;
-
-import com.google.doctool.LinkResolver.ExtraClassResolver;
-
-import com.sun.javadoc.ClassDoc;
-import com.sun.javadoc.ConstructorDoc;
-import com.sun.javadoc.Doc;
-import com.sun.javadoc.DocErrorReporter;
-import com.sun.javadoc.ExecutableMemberDoc;
-import com.sun.javadoc.FieldDoc;
-import com.sun.javadoc.MemberDoc;
-import com.sun.javadoc.MethodDoc;
-import com.sun.javadoc.PackageDoc;
-import com.sun.javadoc.ParamTag;
-import com.sun.javadoc.Parameter;
-import com.sun.javadoc.ProgramElementDoc;
-import com.sun.javadoc.RootDoc;
-import com.sun.javadoc.SeeTag;
-import com.sun.javadoc.SourcePosition;
-import com.sun.javadoc.Tag;
-import com.sun.javadoc.Type;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileReader;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Stack;
-
-/**
- * Generates XML from Javadoc source, with particular idioms to make it possible
- * to translate into either expository doc or API doc.
- */
-public class Booklet {
-
-  private static final String OPT_BKCODE = "-bkcode";
-  private static final String OPT_BKDOCPKG = "-bkdocpkg";
-  private static final String OPT_BKOUT = "-bkout";
-
-  private static Booklet sBooklet;
-
-  public static void main(String[] args) {
-    // Strip off our arguments at the beginning.
-    //
-    com.sun.tools.javadoc.Main.execute(args);
-  }
-
-  public static int optionLength(String option) {
-    if (option.equals(OPT_BKOUT)) {
-      return 2;
-    } else if (option.equals(OPT_BKDOCPKG)) {
-      return 2;
-    } else if (option.equals(OPT_BKCODE)) {
-      return 1;
-    }
-    return 0;
-  }
-
-  public static String slurpSource(SourcePosition position) {
-    BufferedReader br = null;
-    try {
-      br = new BufferedReader(new FileReader(position.file()));
-      for (int i = 0, n = position.line() - 1; i < n; ++i) {
-        br.readLine();
-      }
-
-      StringBuffer lines = new StringBuffer();
-      String line = br.readLine();
-      int braceDepth = 0;
-      int indent = -1;
-      boolean seenSemiColonOrBrace = false;
-      while (line != null) {
-        if (indent == -1) {
-          for (indent = 0; Character.isWhitespace(line.charAt(indent)); ++indent) {
-            // just accumulate
-          }
-        }
-
-        if (line.length() >= indent) {
-          line = line.substring(indent);
-        }
-
-        lines.append(line + "\n");
-        for (int i = 0, n = line.length(); i < n; ++i) {
-          char c = line.charAt(i);
-          if (c == '{') {
-            seenSemiColonOrBrace = true;
-            ++braceDepth;
-          } else if (c == '}') {
-            --braceDepth;
-          } else if (c == ';') {
-            seenSemiColonOrBrace = true;
-          }
-        }
-
-        if (braceDepth > 0 || !seenSemiColonOrBrace) {
-          line = br.readLine();
-        } else {
-          break;
-        }
-      }
-
-      String code = lines.toString();
-      return code;
-    } catch (Exception e) {
-      e.printStackTrace();
-    } finally {
-      try {
-        if (br != null) {
-          br.close();
-        }
-      } catch (IOException e) {
-        e.printStackTrace();
-      }
-    }
-    return "";
-  }
-
-  public static boolean start(RootDoc rootDoc) {
-    getBooklet().process(rootDoc);
-    return true;
-  }
-
-  public static boolean validOptions(String[][] options,
-      DocErrorReporter reporter) {
-    return getBooklet().analyzeOptions(options, reporter);
-  }
-
-  private static Booklet getBooklet() {
-    if (sBooklet == null) {
-      sBooklet = new Booklet();
-    }
-    return sBooklet;
-  }
-
-  private String outputPath;
-
-  private HashSet packagesToGenerate;
-
-  private RootDoc initialRootDoc;
-
-  private String rootDocId;
-
-  private boolean showCode;
-
-  private HashSet standardTagKinds = new HashSet();
-
-  private Stack tagStack = new Stack();
-
-  private PrintWriter pw;
-
-  public Booklet() {
-    // Set up standard tags (to ignore during tag processing)
-    //
-    standardTagKinds.add("@see");
-    standardTagKinds.add("@serial");
-    standardTagKinds.add("@throws");
-    standardTagKinds.add("@param");
-    standardTagKinds.add("@id");
-  }
-
-  private boolean analyzeOptions(String[][] options, DocErrorReporter reporter) {
-    for (int i = 0, n = options.length; i < n; ++i) {
-      if (options[i][0].equals(OPT_BKOUT)) {
-        outputPath = options[i][1];
-      } else if (options[i][0].equals(OPT_BKDOCPKG)) {
-        String[] packages = options[i][1].split(";");
-        packagesToGenerate = new HashSet();
-        for (int packageIndex = 0; packageIndex < packages.length; ++packageIndex) {
-          packagesToGenerate.add(packages[packageIndex]);
-        }
-      } else if (options[i][0].equals(OPT_BKCODE)) {
-        showCode = true;
-      }
-    }
-
-    if (outputPath == null) {
-      reporter.printError("You must specify an output directory with "
-          + OPT_BKOUT);
-      return false;
-    }
-
-    return true;
-  }
-
-  private void begin(String tag) {
-    pw.print("<" + tag + ">");
-    tagStack.push(tag);
-  }
-
-  private void begin(String tag, String attr, String value) {
-    pw.print("<" + tag + " " + attr + "='" + value + "'>");
-    tagStack.push(tag);
-  }
-
-  private void beginCDATA() {
-    pw.print("<![CDATA[");
-  }
-
-  private void beginEndln(String tag) {
-    pw.println("<" + tag + "/>");
-  }
-
-  private void beginln(String tag) {
-    pw.println();
-    begin(tag);
-  }
-
-  private void beginln(String tag, String attr, String value) {
-    pw.println();
-    begin(tag, attr, value);
-  }
-
-  private void emitDescription(ClassDoc enclosing, Doc forWhat,
-      Tag[] leadInline, Tag[] descInline) {
-    emitJRELink(enclosing, forWhat);
-
-    beginln("lead");
-    processTags(leadInline);
-    endln();
-
-    beginln("description");
-    processTags(descInline);
-    endln();
-  }
-
-  private void emitIdentity(String id, String name) {
-    beginln("id");
-    text(id);
-    endln();
-
-    beginln("name");
-    text(name);
-    endln();
-  }
-
-  private void emitJRELink(ClassDoc enclosing, Doc doc) {
-    String jreLink = "http://java.sun.com/j2se/1.5.0/docs/api/";
-    if (doc instanceof ClassDoc) {
-      ClassDoc classDoc = (ClassDoc) doc;
-      String pkg = classDoc.containingPackage().name();
-      if (!pkg.startsWith("java.")) {
-        return;
-      }
-      String clazz = classDoc.name();
-
-      jreLink += pkg.replace('.', '/') + "/";
-      jreLink += clazz;
-      jreLink += ".html";
-    } else if (doc instanceof ExecutableMemberDoc) {
-      ExecutableMemberDoc execMemberDoc = (ExecutableMemberDoc) doc;
-      String pkg = enclosing.containingPackage().name();
-      if (!pkg.startsWith("java.")) {
-        return;
-      }
-      String clazz = enclosing.name();
-      String method = execMemberDoc.name();
-      String sig = execMemberDoc.signature();
-
-      jreLink += pkg.replace('.', '/') + "/";
-      jreLink += clazz;
-      jreLink += ".html";
-      jreLink += "#";
-      jreLink += method;
-      jreLink += sig;
-    } else if (doc instanceof PackageDoc) {
-      String pkg = doc.name();
-      if (!pkg.startsWith("java.")) {
-        return;
-      }
-      jreLink += pkg.replace('.', '/') + "/package-summary.html";
-    } else if (doc instanceof FieldDoc) {
-      FieldDoc fieldDoc = (FieldDoc) doc;
-      String pkg = enclosing.containingPackage().name();
-      if (!pkg.startsWith("java.")) {
-        return;
-      }
-      String clazz = fieldDoc.containingClass().name();
-      String field = fieldDoc.name();
-
-      jreLink += pkg.replace('.', '/') + "/";
-      jreLink += clazz;
-      jreLink += ".html";
-      jreLink += "#";
-      jreLink += field;
-    }
-
-    // Add the link.
-    //
-    beginln("jre");
-    text(jreLink);
-    endln();
-  }
-
-  private void emitLocation(Doc doc) {
-    Doc parent = getParentDoc(doc);
-    if (parent != null) {
-      beginln("location");
-      emitLocationLink(parent);
-      endln();
-    }
-  }
-
-  private void emitLocationLink(Doc doc) {
-    // Intentionally reverses the order.
-    //
-    String myId;
-    String myTitle;
-    if (doc instanceof MemberDoc) {
-      MemberDoc memberDoc = (MemberDoc) doc;
-      myId = getId(memberDoc);
-      myTitle = memberDoc.name();
-    } else if (doc instanceof ClassDoc) {
-      ClassDoc classDoc = (ClassDoc) doc;
-      myId = getId(classDoc);
-      myTitle = classDoc.name();
-    } else if (doc instanceof PackageDoc) {
-      PackageDoc pkgDoc = (PackageDoc) doc;
-      myId = getId(pkgDoc);
-      myTitle = pkgDoc.name();
-    } else if (doc instanceof RootDoc) {
-      myId = rootDocId;
-      myTitle = initialRootDoc.name();
-    } else {
-      throw new IllegalStateException(
-          "Expected only a member, type, or package");
-    }
-
-    Doc parent = getParentDoc(doc);
-    if (parent != null) {
-      emitLocationLink(parent);
-    }
-
-    beginln("link", "ref", myId);
-
-    Tag[] titleTag = doc.tags("@title");
-    if (titleTag.length > 0) {
-      myTitle = titleTag[0].text().trim();
-    }
-
-    if (myTitle == null || myTitle.length() == 0) {
-      myTitle = "[NO TITLE]";
-    }
-
-    text(myTitle);
-
-    endln();
-  }
-
-  private void emitModifiers(ProgramElementDoc doc) {
-    if (doc.isPrivate()) {
-      beginEndln("isPrivate");
-    } else if (doc.isProtected()) {
-      beginEndln("isProtected");
-    } else if (doc.isPublic()) {
-      beginEndln("isPublic");
-    } else if (doc.isPackagePrivate()) {
-      beginEndln("isPackagePrivate");
-    }
-
-    if (doc.isStatic()) {
-      beginEndln("isStatic");
-    }
-
-    if (doc.isFinal()) {
-      beginEndln("isFinal");
-    }
-
-    if (doc instanceof MethodDoc) {
-      MethodDoc methodDoc = (MethodDoc) doc;
-
-      if (methodDoc.isAbstract()) {
-        beginEndln("isAbstract");
-      }
-
-      if (methodDoc.isSynchronized()) {
-        beginEndln("isSynchronized");
-      }
-    }
-  }
-
-  private void emitOutOfLineTags(Tag[] tags) {
-    beginln("tags");
-    processTags(tags);
-    endln();
-  }
-
-  private void emitType(Type type) {
-    ClassDoc typeAsClass = type.asClassDoc();
-
-    if (typeAsClass != null) {
-      begin("type", "ref", getId(typeAsClass));
-    } else {
-      begin("type");
-    }
-
-    String typeName = type.typeName();
-    String dims = type.dimension();
-
-    text(typeName + dims);
-
-    end();
-  }
-
-  private void end() {
-    pw.print("</" + tagStack.pop() + ">");
-  }
-
-  private void endCDATA() {
-    pw.print("]]>");
-  }
-
-  private void endln() {
-    end();
-    pw.println();
-  }
-
-  private MethodDoc findMatchingInterfaceMethodDoc(ClassDoc[] interfaces,
-      MethodDoc methodDoc) {
-    if (interfaces != null) {
-      // Look through the methods on superInterface for a matching methodDoc.
-      //
-      for (int intfIndex = 0; intfIndex < interfaces.length; ++intfIndex) {
-        ClassDoc currentIntfDoc = interfaces[intfIndex];
-        MethodDoc[] intfMethodDocs = currentIntfDoc.methods();
-        for (int methodIndex = 0; methodIndex < intfMethodDocs.length; ++methodIndex) {
-          MethodDoc intfMethodDoc = intfMethodDocs[methodIndex];
-          String methodDocName = methodDoc.name();
-          String intfMethodDocName = intfMethodDoc.name();
-          if (methodDocName.equals(intfMethodDocName)) {
-            if (methodDoc.signature().equals(intfMethodDoc.signature())) {
-              // It's a match!
-              //
-              return intfMethodDoc;
-            }
-          }
-        }
-
-        // Try the superinterfaces of this interface.
-        //
-        MethodDoc foundMethodDoc = findMatchingInterfaceMethodDoc(
-            currentIntfDoc.interfaces(), methodDoc);
-        if (foundMethodDoc != null) {
-          return foundMethodDoc;
-        }
-      }
-    }
-
-    // Just didn't find it anywhere. Must not be based on an implemented
-    // interface.
-    //
-    return null;
-  }
-
-  private ExtraClassResolver getExtraClassResolver(Tag tag) {
-
-    if (tag.holder() instanceof PackageDoc) {
-      return new ExtraClassResolver() {
-        public ClassDoc findClass(String className) {
-          return initialRootDoc.classNamed(className);
-        }
-      };
-    }
-
-    return null;
-  }
-
-  private String getId(ClassDoc classDoc) {
-    return classDoc.qualifiedName();
-  }
-
-  private String getId(ExecutableMemberDoc memberDoc) {
-    // Use the mangled name to look up a unique id (based on its hashCode).
-    //
-    String clazz = memberDoc.containingClass().qualifiedName();
-    String id = clazz + "#" + memberDoc.name() + memberDoc.signature();
-    return id;
-  }
-
-  private String getId(FieldDoc fieldDoc) {
-    String clazz = fieldDoc.containingClass().qualifiedName();
-    String id = clazz + "#" + fieldDoc.name();
-    return id;
-  }
-
-  private String getId(MemberDoc memberDoc) {
-    if (memberDoc.isMethod()) {
-      return getId((MethodDoc) memberDoc);
-    } else if (memberDoc.isConstructor()) {
-      return getId((ConstructorDoc) memberDoc);
-    } else if (memberDoc.isField()) {
-      return getId((FieldDoc) memberDoc);
-    } else {
-      throw new RuntimeException("Unknown member type");
-    }
-  }
-
-  private String getId(PackageDoc packageDoc) {
-    return packageDoc.name();
-  }
-
-  private Doc getParentDoc(Doc doc) {
-    if (doc instanceof MemberDoc) {
-      MemberDoc memberDoc = (MemberDoc) doc;
-      return memberDoc.containingClass();
-    } else if (doc instanceof ClassDoc) {
-      ClassDoc classDoc = (ClassDoc) doc;
-      Doc enclosingClass = classDoc.containingClass();
-      if (enclosingClass != null) {
-        return enclosingClass;
-      } else {
-        return classDoc.containingPackage();
-      }
-    } else if (doc instanceof PackageDoc) {
-      return initialRootDoc;
-    } else if (doc instanceof RootDoc) {
-      return null;
-    } else {
-      throw new IllegalStateException(
-          "Expected only a member, type, or package");
-    }
-  }
-
-  private boolean looksSynthesized(ExecutableMemberDoc memberDoc) {
-    SourcePosition memberPos = memberDoc.position();
-    int memberLine = memberPos.line();
-
-    SourcePosition classPos = memberDoc.containingClass().position();
-    int classLine = classPos.line();
-
-    if (memberLine == classLine) {
-      return true;
-    } else {
-      return false;
-    }
-  }
-
-  private void process(ClassDoc enclosing, ClassDoc classDoc) {
-    // Make sure it isn't a @skip-ped topic.
-    //
-    if (classDoc.tags("@skip").length > 0) {
-      // This one is explicitly skipped right now.
-      //
-      return;
-    }
-
-    if (classDoc.isInterface()) {
-      beginln("interface");
-    } else {
-      beginln("class");
-    }
-
-    emitIdentity(getId(classDoc), classDoc.name());
-    emitLocation(classDoc);
-    emitDescription(enclosing, classDoc, classDoc.firstSentenceTags(),
-        classDoc.inlineTags());
-    emitOutOfLineTags(classDoc.tags());
-    emitModifiers(classDoc);
-
-    ClassDoc superclassDoc = classDoc.superclass();
-    if (superclassDoc != null) {
-      beginln("superclass", "ref", getId(superclassDoc));
-      text(superclassDoc.name());
-      endln();
-    }
-
-    ClassDoc[] superinterfacesDoc = classDoc.interfaces();
-    for (int i = 0; i < superinterfacesDoc.length; i++) {
-      ClassDoc superinterfaceDoc = superinterfacesDoc[i];
-      beginln("superinterface", "ref", getId(superinterfaceDoc));
-      text(superinterfaceDoc.name());
-      endln();
-    }
-
-    ClassDoc[] cda = classDoc.innerClasses();
-    for (int i = 0; i < cda.length; i++) {
-      process(classDoc, cda[i]);
-    }
-
-    FieldDoc[] fda = classDoc.fields();
-    for (int i = 0; i < fda.length; i++) {
-      process(classDoc, fda[i]);
-    }
-
-    ConstructorDoc[] ctorDocs = classDoc.constructors();
-    for (int i = 0; i < ctorDocs.length; i++) {
-      process(classDoc, ctorDocs[i]);
-    }
-
-    MethodDoc[] methods = classDoc.methods();
-    for (int i = 0; i < methods.length; i++) {
-      process(classDoc, methods[i]);
-    }
-
-    endln();
-  }
-
-  private void process(ClassDoc enclosing, ExecutableMemberDoc memberDoc) {
-    if (looksSynthesized(memberDoc)) {
-      // Skip it.
-      //
-      return;
-    }
-
-    // Make sure it isn't a @skip-ped member.
-    //
-    if (memberDoc.tags("@skip").length > 0) {
-      // This one is explicitly skipped right now.
-      //
-      return;
-    }
-
-    if (memberDoc instanceof MethodDoc) {
-      beginln("method");
-      emitIdentity(getId(memberDoc), memberDoc.name());
-      emitLocation(memberDoc);
-
-      // If this method is not explicitly documented, use the best inherited
-      // one.
-      //
-      String rawComment = memberDoc.getRawCommentText();
-      if (rawComment.length() == 0) {
-        // Switch out the member doc being used.
-        //
-        MethodDoc methodDoc = (MethodDoc) memberDoc;
-        MethodDoc superMethodDoc = methodDoc.overriddenMethod();
-
-        if (superMethodDoc == null) {
-
-          ClassDoc classDocToTry = methodDoc.containingClass();
-          while (classDocToTry != null) {
-            // See if this is a method from an interface.
-            // If so, borrow its description.
-            //
-            superMethodDoc = findMatchingInterfaceMethodDoc(
-                classDocToTry.interfaces(), methodDoc);
-
-            if (superMethodDoc != null) {
-              break;
-            }
-
-            classDocToTry = classDocToTry.superclass();
-          }
-        }
-
-        if (superMethodDoc != null) {
-          // Borrow the description from the superclass/superinterface.
-          //
-          memberDoc = superMethodDoc;
-        }
-      }
-    } else if (memberDoc instanceof ConstructorDoc) {
-      beginln("constructor");
-      emitIdentity(getId(memberDoc), memberDoc.containingClass().name());
-      emitLocation(memberDoc);
-    } else {
-      throw new IllegalStateException("What kind of executable member is this?");
-    }
-
-    emitDescription(enclosing, memberDoc, memberDoc.firstSentenceTags(),
-        memberDoc.inlineTags());
-    emitOutOfLineTags(memberDoc.tags());
-    emitModifiers(memberDoc);
-
-    begin("flatSignature");
-    text(memberDoc.flatSignature());
-    end();
-
-    // Return type if it's a method
-    //
-    if (memberDoc instanceof MethodDoc) {
-      emitType(((MethodDoc) memberDoc).returnType());
-    }
-
-    // Parameters
-    //
-    beginln("params");
-    Parameter[] pda = memberDoc.parameters();
-    for (int i = 0; i < pda.length; i++) {
-      Parameter pd = pda[i];
-
-      begin("param");
-      emitType(pd.type());
-      begin("name");
-      text(pd.name());
-      end();
-      end();
-    }
-    endln();
-
-    // Exceptions thrown
-    //
-    ClassDoc[] tea = memberDoc.thrownExceptions();
-    if (tea.length > 0) {
-      beginln("throws");
-      for (int i = 0; i < tea.length; ++i) {
-        ClassDoc te = tea[i];
-        beginln("throw", "ref", getId(te));
-        text(te.name());
-        endln();
-      }
-      endln();
-    }
-
-    // Maybe show code
-    //
-    if (showCode) {
-      SourcePosition pos = memberDoc.position();
-      if (pos != null) {
-        beginln("code");
-        String source = slurpSource(pos);
-        begin("pre", "class", "code");
-        beginCDATA();
-        text(source);
-        endCDATA();
-        endln();
-        endln();
-      }
-    }
-
-    endln();
-  }
-
-  private void process(ClassDoc enclosing, FieldDoc fieldDoc) {
-    // Make sure it isn't @skip-ped.
-    //
-    if (fieldDoc.tags("@skip").length > 0) {
-      // This one is explicitly skipped right now.
-      //
-      return;
-    }
-
-    String commentText = fieldDoc.commentText();
-    if (fieldDoc.isPrivate()
-        && (commentText == null || commentText.length() == 0)) {
-      return;
-    }
-
-    beginln("field");
-    emitIdentity(fieldDoc.qualifiedName(), fieldDoc.name());
-    emitLocation(fieldDoc);
-    emitDescription(enclosing, fieldDoc, fieldDoc.firstSentenceTags(),
-        fieldDoc.inlineTags());
-    emitOutOfLineTags(fieldDoc.tags());
-    emitModifiers(fieldDoc);
-    emitType(fieldDoc.type());
-    endln();
-  }
-
-  private void process(PackageDoc packageDoc) {
-    beginln("package");
-
-    emitIdentity(packageDoc.name(), packageDoc.name());
-    emitLocation(packageDoc);
-    emitDescription(null, packageDoc, packageDoc.firstSentenceTags(),
-        packageDoc.inlineTags());
-    emitOutOfLineTags(packageDoc.tags());
-
-    // Top-level classes
-    //
-    ClassDoc[] cda = packageDoc.allClasses();
-    for (int i = 0; i < cda.length; i++) {
-      ClassDoc cd = cda[i];
-
-      // Make sure we have source.
-      //
-      SourcePosition p = cd.position();
-      if (p == null || p.line() == 0) {
-        // Skip this since it isn't ours (otherwise we would have source).
-        //
-        continue;
-      }
-
-      if (cd.containingClass() == null) {
-        process(cd, cda[i]);
-      } else {
-        // Not a top-level class.
-        //
-        cd = cda[i];
-      }
-    }
-
-    endln();
-  }
-
-  private void process(RootDoc rootDoc) {
-    try {
-      initialRootDoc = rootDoc;
-      File outputFile = new File(outputPath);
-      // Ignore result since the next line will fail if the directory doesn't
-      // exist.
-      outputFile.getParentFile().mkdirs();
-      FileWriter fw = new FileWriter(outputFile);
-      pw = new PrintWriter(fw, true);
-
-      beginln("booklet");
-
-      rootDocId = "";
-      String title = "";
-      Tag[] idTags = rootDoc.tags("@id");
-      if (idTags.length > 0) {
-        rootDocId = idTags[0].text();
-      } else {
-        initialRootDoc.printWarning("Expecting @id in an overview html doc; see -overview");
-      }
-
-      Tag[] titleTags = rootDoc.tags("@title");
-      if (titleTags.length > 0) {
-        title = titleTags[0].text();
-      } else {
-        initialRootDoc.printWarning("Expecting @title in an overview html doc; see -overview");
-      }
-
-      emitIdentity(rootDocId, title);
-      emitLocation(rootDoc);
-      emitDescription(null, rootDoc, rootDoc.firstSentenceTags(),
-          rootDoc.inlineTags());
-      emitOutOfLineTags(rootDoc.tags());
-
-      // Create a list of the packages to iterate over.
-      //
-      HashSet packageNames = new HashSet();
-      ClassDoc[] cda = initialRootDoc.classes();
-      for (int i = 0; i < cda.length; i++) {
-        ClassDoc cd = cda[i];
-        // Only top-level classes matter.
-        //
-        if (cd.containingClass() == null) {
-          packageNames.add(cd.containingPackage().name());
-        }
-      }
-
-      // Packages
-      //
-      for (Iterator iter = packageNames.iterator(); iter.hasNext();) {
-        String packageName = (String) iter.next();
-
-        // Only process this package if either no "docpkg" is set, or it is
-        // included.
-        //
-        if (packagesToGenerate == null
-            || packagesToGenerate.contains(packageName)) {
-          PackageDoc pd = initialRootDoc.packageNamed(packageName);
-          process(pd);
-        }
-      }
-
-      endln();
-    } catch (Exception e) {
-      e.printStackTrace();
-      initialRootDoc.printError("Caught exception: " + e.toString());
-    }
-  }
-
-  private void processSeeTag(SeeTag seeTag) {
-    String ref = null;
-    ClassDoc cd = null;
-    PackageDoc pd = null;
-    MemberDoc md = null;
-    String title = null;
-
-    // Check for HTML links
-    if (seeTag.text().startsWith("<")) {
-      // TODO: ignore for now
-      return;
-    }
-    // Ordered: most-specific to least-specific
-    if (null != (md = seeTag.referencedMember())) {
-      ref = getId(md);
-    } else if (null != (cd = seeTag.referencedClass())) {
-      ref = getId(cd);
-
-      // See if the target has a title.
-      //
-      Tag[] titleTag = cd.tags("@title");
-      if (titleTag.length > 0) {
-        title = titleTag[0].text().trim();
-        if (title.length() == 0) {
-          title = null;
-        }
-      }
-    } else if (null != (pd = seeTag.referencedPackage())) {
-      ref = getId(pd);
-    }
-
-    String label = seeTag.label();
-
-    // If there is a label, use it.
-    if (label == null || label.trim().length() == 0) {
-
-      // If there isn't a label, see if the @see target has a @title.
-      //
-      if (title != null) {
-        label = title;
-      } else {
-        label = seeTag.text();
-
-        if (label.endsWith(".")) {
-          label = label.substring(0, label.length() - 1);
-        }
-
-        // Rip off all but the last interesting part to prevent fully-qualified
-        // names everywhere.
-        //
-        int last1 = label.lastIndexOf('.');
-        int last2 = label.lastIndexOf('#');
-
-        if (last2 > last1) {
-          // Use the class name plus the member name.
-          //
-          label = label.substring(last1 + 1).replace('#', '.');
-        } else if (last1 != -1) {
-          label = label.substring(last1 + 1);
-        }
-
-        if (label.charAt(0) == '.') {
-          // Started with "#" so remove the dot.
-          //
-          label = label.substring(1);
-        }
-      }
-    }
-
-    if (ref != null) {
-      begin("link", "ref", ref);
-      text(label != null ? label.trim() : "");
-      end();
-    } else {
-      initialRootDoc.printWarning(seeTag.position(),
-          "Unverifiable cross-reference to '" + seeTag.text() + "'");
-      // The link probably won't work, but emit it anyway.
-      begin("link");
-      text(label != null ? label.trim() : "");
-      end();
-    }
-  }
-
-  private void processTags(Tag[] tags) {
-    for (int i = 0; i < tags.length; i++) {
-      Tag tag = tags[i];
-      String tagKind = tag.kind();
-      if (tagKind.equals("Text")) {
-        text(tag.text());
-      } else if (tagKind.equals("@see")) {
-        processSeeTag((SeeTag) tag);
-      } else if (tagKind.equals("@param")) {
-        ParamTag paramTag = (ParamTag) tag;
-        beginln("param");
-        begin("name");
-        text(paramTag.parameterName());
-        end();
-        begin("description");
-        processTags(paramTag.inlineTags());
-        end();
-        endln();
-      } else if (tagKind.equals("@example")) {
-        ExtraClassResolver extraClassResolver = getExtraClassResolver(tag);
-        SourcePosition pos = LinkResolver.resolveLink(tag, extraClassResolver);
-        String source = slurpSource(pos);
-        begin("pre", "class", "code");
-        beginCDATA();
-        text(source);
-        endCDATA();
-        endln();
-      } else if (tagKind.equals("@gwt.include")) {
-        String contents = ResourceIncluder.getResourceFromClasspathScrubbedForHTML(tag);
-        begin("pre", "class", "code");
-        text(contents);
-        endln();
-      } else if (!standardTagKinds.contains(tag.name())) {
-        // Custom tag; pass it along other tag.
-        //
-        String tagName = tag.name().substring(1);
-        begin(tagName);
-        processTags(tag.inlineTags());
-        end();
-      }
-    }
-  }
-
-  private void text(String s) {
-    pw.print(s);
-  }
-}
diff --git a/2.4/build-tools/doctool/src/com/google/doctool/DocTool.java b/2.4/build-tools/doctool/src/com/google/doctool/DocTool.java
deleted file mode 100644
index 1ed6032..0000000
--- a/2.4/build-tools/doctool/src/com/google/doctool/DocTool.java
+++ /dev/null
@@ -1,732 +0,0 @@
-/*
- * Copyright 2006 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.doctool;
-
-import org.xml.sax.Attributes;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-import org.xml.sax.XMLReader;
-import org.xml.sax.helpers.DefaultHandler;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.FileReader;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.PrintStream;
-import java.io.StringReader;
-import java.io.StringWriter;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerConfigurationException;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.stream.StreamResult;
-import javax.xml.transform.stream.StreamSource;
-
-/**
- * Orchestrates the behavior of {@link Booklet}, {@link SplitterJoiner} and
- * other tools to create user documentation and API documentation.
- */
-public class DocTool {
-
-  private class ImageCopier extends DefaultHandler {
-
-    private final File htmlDir;
-
-    private ImageCopier(File htmlDir) {
-      this.htmlDir = htmlDir;
-    }
-
-    public void startElement(String uri, String localName, String qName,
-        Attributes attributes) throws SAXException {
-      if (qName.equalsIgnoreCase("img")) {
-        String imgSrc = attributes.getValue("src");
-        if (imgSrc != null) {
-          boolean found = false;
-          for (int i = 0, n = imagePath.length; i < n; ++i) {
-            File dir = imagePath[i];
-            File inFile = new File(dir, imgSrc);
-            if (inFile.exists()) {
-              // Copy it over.
-              //
-              found = true;
-              File outFile = new File(htmlDir, imgSrc);
-
-              if (outFile.exists()) {
-                if (outFile.lastModified() > inFile.lastModified()) {
-                  // Already up to date.
-                  break;
-                }
-              } else {
-                File outFileDir = outFile.getParentFile();
-                if (!outFileDir.exists() && !outFileDir.mkdirs()) {
-                  err.println("Unable to create image output dir " + outFileDir);
-                  break;
-                }
-              }
-              if (!copyFile(inFile, outFile)) {
-                err.println("Unable to copy image file " + outFile);
-              }
-            }
-          }
-          if (!found) {
-            err.println("Unable to find image " + imgSrc);
-          }
-        }
-      }
-    }
-  }
-
-  private static final Pattern IN_XML_FILENAME = Pattern.compile(
-      "(.+)\\.([^\\.]+)\\.xml", Pattern.CASE_INSENSITIVE);
-
-  public static void main(String[] args) {
-    DocToolFactory factory = new DocToolFactory();
-    String arg;
-    String pathSep = System.getProperty("path.separator");
-    for (int i = 0, n = args.length; i < n; ++i) {
-      if (tryParseFlag(args, i, "-help")) {
-        printHelp();
-        return;
-      } else if (null != (arg = tryParseArg(args, i, "-out"))) {
-        ++i;
-        factory.setOutDir(arg);
-      } else if (null != (arg = tryParseArg(args, i, "-html"))) {
-        ++i;
-        factory.setGenerateHtml(true);
-        factory.setTitle(arg);
-
-        // Slurp every arg not prefixed with "-".
-        for (; i + 1 < n && !args[i + 1].startsWith("-"); ++i) {
-          factory.addHtmlFileBase(args[i + 1]);
-        }
-      } else if (null != (arg = tryParseArg(args, i, "-overview"))) {
-        ++i;
-        factory.setOverviewFile(arg);
-      } else if (null != (arg = tryParseArg(args, i, "-sourcepath"))) {
-        ++i;
-        String[] entries = arg.split("\\" + pathSep);
-        for (int entryIndex = 0; entryIndex < entries.length; entryIndex++) {
-          factory.addToSourcePath(entries[entryIndex]);
-        }
-      } else if (null != (arg = tryParseArg(args, i, "-classpath"))) {
-        ++i;
-        String[] entries = arg.split("\\" + pathSep);
-        for (int entryIndex = 0; entryIndex < entries.length; entryIndex++) {
-          factory.addToClassPath(entries[entryIndex]);
-        }
-      } else if (null != (arg = tryParseArg(args, i, "-packages"))) {
-        ++i;
-        String[] entries = arg.split("\\" + pathSep);
-        for (int entryIndex = 0; entryIndex < entries.length; entryIndex++) {
-          factory.addToPackages(entries[entryIndex]);
-        }
-      } else if (null != (arg = tryParseArg(args, i, "-imagepath"))) {
-        ++i;
-        String[] entries = arg.split("\\" + pathSep);
-        for (int entryIndex = 0; entryIndex < entries.length; entryIndex++) {
-          factory.addToImagePath(entries[entryIndex]);
-        }
-      } else {
-        if (factory.getFileType() == null) {
-          factory.setFileType(args[i]);
-        } else {
-          factory.setFileBase(args[i]);
-        }
-      }
-    }
-
-    DocTool docTool = factory.create(System.out, System.err);
-    if (docTool != null) {
-      docTool.process();
-    }
-  }
-
-  public static boolean recursiveDelete(File file) {
-    if (file.isDirectory()) {
-      File[] children = file.listFiles();
-      if (children != null) {
-        for (int i = 0; i < children.length; i++) {
-          if (!recursiveDelete(children[i])) {
-            return false;
-          }
-        }
-      }
-    }
-    if (!file.delete()) {
-      System.err.println("Unable to delete " + file.getAbsolutePath());
-      return false;
-    }
-    return true;
-  }
-
-  private static void printHelp() {
-    String s = "";
-    s += "DocTool (filetype filebase)? [docset-creation-options] [html-creation-options]\n";
-    s += "    Creates structured javadoc xml output from Java source and/or\n";
-    s += "    a table of contents and a set of cross-linked html files.\n";
-    s += "    Specifying filebase/filetype produces output file \"filebase.filetype.xml\".\n";
-    s += "    Specifying -html produces output files in ${out}/html.\n";
-    s += "\n";
-    s += "[docset-creation-options] are\n";
-    s += "  -out\n";
-    s += "    The output directory\n";
-    s += "  -overview\n";
-    s += "    The overview html file for this doc set\n";
-    s += "  -sourcepath path\n";
-    s += "    The path to find Java source for this doc set\n";
-    s += "  -classpath path\n";
-    s += "    The path to find imported classes for this doc set\n";
-    s += "  -packages package-names\n";
-    s += "    The command-separated list of package names to include in this doc set\n";
-    s += "\n";
-    s += "[html-creation-options] are\n";
-    s += "  -html title filebase+\n";
-    s += "    Causes topics in the named filebase(s) to be merged and converted into html\n";
-    s += "  -imagepath\n";
-    s += "    The semicolon-separated path to find images for html\n";
-    System.out.println(s);
-  }
-
-  /**
-   * Parse a flag with a argument.
-   */
-  private static String tryParseArg(String[] args, int i, String name) {
-    if (i < args.length) {
-      if (args[i].equals(name)) {
-        if (i + 1 < args.length) {
-          String arg = args[i + 1];
-          if (arg.startsWith("-")) {
-            System.out.println("Warning: arg to " + name
-                + " looks more like a flag: " + arg);
-          }
-          return arg;
-        } else {
-          throw new IllegalArgumentException("Expecting an argument after "
-              + name);
-        }
-      }
-    }
-    return null;
-  }
-
-  /**
-   * Parse just a flag with no subsequent argument.
-   */
-  private static boolean tryParseFlag(String[] args, int i, String name) {
-    if (i < args.length) {
-      if (args[i].equals(name)) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  private final File[] classPath;
-
-  private final String[] packages;
-
-  private final PrintStream err;
-
-  private final String base;
-
-  private final String fileType;
-
-  private final boolean generateHtml;
-
-  private final String[] htmlFileBases;
-
-  private final File[] imagePath;
-
-  private final PrintStream out;
-
-  private final File outDir;
-
-  private final File overviewFile;
-
-  private final File[] sourcePath;
-
-  private final String title;
-
-  DocTool(PrintStream out, PrintStream err, File outDir, boolean generateHtml,
-      String title, String[] htmlFileBases, String fileType, String fileBase,
-      File overviewFile, File[] sourcePath, File[] classPath,
-      String[] packages, File[] imagePath) {
-    this.out = out;
-    this.err = err;
-    this.outDir = outDir;
-    this.generateHtml = generateHtml;
-    this.base = fileBase;
-    this.fileType = fileType;
-    this.overviewFile = overviewFile;
-    this.sourcePath = sourcePath;
-    this.classPath = classPath;
-    this.packages = packages;
-    this.imagePath = imagePath;
-    this.title = title;
-    this.htmlFileBases = htmlFileBases.clone();
-  }
-
-  public boolean copyFile(File in, File out) {
-    FileInputStream fis = null;
-    FileOutputStream fos = null;
-    try {
-      fis = new FileInputStream(in);
-      fos = new FileOutputStream(out);
-      byte[] buf = new byte[4096];
-      int i = 0;
-      while ((i = fis.read(buf)) != -1) {
-        fos.write(buf, 0, i);
-      }
-      return true;
-    } catch (IOException e) {
-      return false;
-    } finally {
-      close(fis);
-      close(fos);
-    }
-  }
-
-  private void close(InputStream is) {
-    if (is != null) {
-      try {
-        is.close();
-      } catch (IOException e) {
-        e.printStackTrace(err);
-      }
-    }
-  }
-
-  private void close(OutputStream os) {
-    if (os != null) {
-      try {
-        os.close();
-      } catch (IOException e) {
-        e.printStackTrace(err);
-      }
-    }
-  }
-
-  private boolean copyImages(File htmlDir, File mergedTopicsFile) {
-    FileReader fileReader = null;
-    Throwable caught = null;
-    try {
-      fileReader = new FileReader(mergedTopicsFile);
-      SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
-      InputSource inputSource = new InputSource(fileReader);
-      XMLReader xmlReader = parser.getXMLReader();
-      xmlReader.setContentHandler(new ImageCopier(htmlDir));
-      xmlReader.parse(inputSource);
-      return true;
-    } catch (SAXException e) {
-      caught = e;
-      Exception inner = e.getException();
-      if (inner != null) {
-        caught = inner;
-      }
-    } catch (ParserConfigurationException e) {
-      caught = e;
-    } catch (IOException e) {
-      caught = e;
-    } finally {
-      try {
-        if (fileReader != null) {
-          fileReader.close();
-        }
-      } catch (IOException e) {
-        e.printStackTrace(err);
-      }
-    }
-    caught.printStackTrace(err);
-    return false;
-  }
-
-  private Set findSourcePackages() {
-    Set results = new HashSet();
-    for (int i = 0, n = sourcePath.length; i < n; ++i) {
-      File srcDir = sourcePath[i];
-      findSourcePackages(results, srcDir, "");
-    }
-    return results;
-  }
-
-  private void findSourcePackages(Set results, File dir, String parentPackage) {
-    File[] children = dir.listFiles();
-    if (children != null) {
-      for (int i = 0, n = children.length; i < n; ++i) {
-        File child = children[i];
-        String childName = parentPackage
-            + (parentPackage.length() > 0 ? "." : "") + child.getName();
-        if (child.isDirectory()) {
-          // Recurse
-          findSourcePackages(results, child, childName);
-        } else if (child.getName().endsWith(".java")) {
-          // Only include this dir as a result if there's at least one java file
-          results.add(parentPackage);
-        }
-      }
-    }
-  }
-
-  private String flattenPath(File[] entries) {
-    String pathSep = System.getProperty("path.separator");
-    String path = "";
-    for (int i = 0, n = entries.length; i < n; ++i) {
-      File entry = entries[i];
-      if (i > 0) {
-        path += pathSep;
-      }
-      path += entry.getAbsolutePath();
-    }
-    return path;
-  }
-
-  private void freshenIf(File file) {
-    if (!file.isFile()) {
-      return;
-    }
-
-    String name = file.getName();
-    Matcher matcher = IN_XML_FILENAME.matcher(name);
-    if (matcher.matches()) {
-      String suffix = "." + matcher.group(2) + ".xml";
-      File topicFile = tryReplaceSuffix(file, suffix, ".topics.xml");
-      if (topicFile != null) {
-        if (file.lastModified() > topicFile.lastModified()) {
-          String xsltFileName = matcher.group(2) + "-" + "topics.xslt";
-          String xslt = getFileFromClassPath(xsltFileName); // yucky slow
-          out.println(file + " -> " + topicFile);
-          transform(xslt, file, topicFile, null);
-        }
-      }
-    }
-  }
-
-  private boolean genHtml() {
-    // Make sure the html directory exists.
-    //
-    File htmlDir = new File(outDir, "html");
-    if (!htmlDir.exists() && !htmlDir.mkdirs()) {
-      err.println("Cannot create html output directory "
-          + htmlDir.getAbsolutePath());
-      return false;
-    }
-
-    // Merge all *.topics.xml into one topics.xml file.
-    //
-    File mergedTopicsFile = new File(outDir, "topics.xml");
-    if (!mergeTopics(mergedTopicsFile)) {
-      return false;
-    }
-
-    // Parse it all to find the images and copy them over.
-    //
-    copyImages(htmlDir, mergedTopicsFile);
-
-    // Transform to merged topics into merged htmls.
-    //
-    File mergedHtmlsFile = new File(htmlDir, "topics.htmls");
-    long lastModifiedHtmls = mergedHtmlsFile.lastModified();
-    long lastModifiedTopics = mergedTopicsFile.lastModified();
-    if (!mergedHtmlsFile.exists() || lastModifiedHtmls < lastModifiedTopics) {
-      String xsltHtmls = getFileFromClassPath("topics-htmls.xslt");
-
-      Map params = new HashMap();
-      params.put("title", title);
-
-      transform(xsltHtmls, mergedTopicsFile, mergedHtmlsFile, params);
-
-      // Split the merged htmls into many html files.
-      //
-      if (!splitHtmls(mergedHtmlsFile)) {
-        return false;
-      }
-
-      // Create a table of contents.
-      //
-      File tocFile = new File(htmlDir, "contents.html");
-      String xsltToc = getFileFromClassPath("topics-toc.xslt");
-      transform(xsltToc, mergedTopicsFile, tocFile, params);
-
-      // Copy the CSS file over.
-      //
-      String css = getFileFromClassPath("doc.css");
-      try {
-        FileWriter cssWriter = new FileWriter(new File(htmlDir, "doc.css"));
-        cssWriter.write(css);
-        cssWriter.close();
-      } catch (IOException e) {
-        e.printStackTrace(err);
-      }
-    } else {
-      out.println("Skipping html creation since nothing seems to have changed since "
-          + mergedHtmlsFile.getAbsolutePath());
-    }
-
-    return true;
-  }
-
-  private String getFileFromClassPath(String filename) {
-    InputStream in = null;
-    try {
-      in = getClass().getClassLoader().getResourceAsStream(filename);
-      try {
-        if (in == null) {
-          throw new RuntimeException("Cannot find file: " + filename);
-        }
-        StringWriter sw = new StringWriter();
-        int ch;
-        while ((ch = in.read()) != -1) {
-          sw.write(ch);
-        }
-        return sw.toString();
-      } finally {
-        if (in != null) {
-          in.close();
-        }
-      }
-    } catch (IOException e) {
-      throw new RuntimeException(e);
-    }
-  }
-
-  private boolean mergeTopics(File mergedTopicsFile) {
-    try {
-      List args = new ArrayList();
-      args.add("join"); // what to do
-      args.add("topics"); // the outer element is <topics>
-      args.add(mergedTopicsFile.getAbsolutePath());
-
-      // For each of the htmlFileBases, try to find a file having that name to
-      // merge into the big topics doc.
-      //
-      boolean foundAny = false;
-      for (int i = 0, n = htmlFileBases.length; i < n; ++i) {
-        String filebase = htmlFileBases[i];
-        File fileToMerge = new File(outDir, filebase + ".topics.xml");
-        if (fileToMerge.exists()) {
-          foundAny = true;
-          args.add(fileToMerge.getAbsolutePath());
-        } else {
-          err.println("Unable to find " + fileToMerge.getName());
-        }
-      }
-
-      if (foundAny) {
-        String[] argArray = (String[]) args.toArray(new String[0]);
-        traceCommand("SplitterJoiner", argArray);
-        SplitterJoiner.main(argArray);
-      } else {
-        err.println("No topics found");
-        return false;
-      }
-    } catch (IOException e) {
-      e.printStackTrace(err);
-      return false;
-    }
-    return true;
-  }
-
-  /**
-   * Runs the help process.
-   */
-  private boolean process() {
-    if (fileType != null) {
-      // Produce XML from JavaDoc.
-      //
-      String fileName = base + "." + fileType + ".xml";
-      if (!runBooklet(new File(outDir, fileName))) {
-        return false;
-      }
-    }
-
-    // Process existing files to get them into topics format.
-    // Done afterwards for convenience when debugging your doc.
-    //
-    transformExistingIntoTopicXml();
-
-    if (generateHtml) {
-      // Merge into HTML.
-      if (!genHtml()) {
-        return false;
-      }
-    }
-
-    return true;
-  }
-
-  private boolean runBooklet(File bkoutFile) {
-    // Write out the list of packages that can be found on the source path.
-    out.println("Creating " + bkoutFile.getAbsolutePath());
-    Set srcPackages = findSourcePackages();
-    if (srcPackages.isEmpty()) {
-      err.println("No input files found");
-      return false;
-    }
-
-    List args = new ArrayList();
-
-    // For now, harded-coded, but could be passed through
-    args.add("-source");
-    args.add("1.5");
-
-    // The doclet
-    args.add("-doclet");
-    args.add(Booklet.class.getName());
-
-    // Class path
-    args.add("-classpath");
-    args.add(flattenPath(classPath));
-
-    // Source path
-    args.add("-sourcepath");
-    args.add(flattenPath(sourcePath));
-    
-    // Encoding is always UTF-8
-    args.add("-encoding");
-    args.add("UTF-8");
-
-    // Overview file
-    if (overviewFile != null) {
-      args.add("-overview");
-      args.add(overviewFile.getAbsolutePath());
-    }
-
-    // Output file
-    args.add("-bkout");
-    args.add(bkoutFile.getAbsolutePath());
-
-    if (packages != null) {
-      // Specify the packages to actually emit doc for
-      StringBuffer bkdocpkg = new StringBuffer();
-      for (int i = 0; i < packages.length; i++) {
-        String pkg = packages[i];
-        bkdocpkg.append(pkg);
-        bkdocpkg.append(";");
-      }
-      args.add("-bkdocpkg");
-      args.add(bkdocpkg.toString());
-    }
-
-    args.add("-breakiterator");
-
-    // Specify the set of input packages (needed by JavaDoc)
-    args.addAll(srcPackages);
-
-    String[] argArray = (String[]) args.toArray(new String[0]);
-    traceCommand("Booklet", argArray);
-    Booklet.main(argArray);
-
-    return bkoutFile.exists();
-  }
-
-  private boolean splitHtmls(File mergedHtmlsFile) {
-    try {
-      List args = new ArrayList();
-      args.add("split"); // what to do
-      args.add(mergedHtmlsFile.getAbsolutePath());
-      String[] argArray = (String[]) args.toArray(new String[0]);
-      traceCommand("SplitterJoiner", argArray);
-      SplitterJoiner.main(argArray);
-    } catch (IOException e) {
-      e.printStackTrace(err);
-      return false;
-    }
-    return true;
-  }
-
-  private void traceCommand(String cmd, String[] args) {
-    out.print(cmd);
-    for (int i = 0, n = args.length; i < n; ++i) {
-      String arg = args[i];
-      out.print(" ");
-      out.print(arg);
-    }
-    out.println();
-  }
-
-  private void transform(String xslt, File inFile, File outFile, Map params) {
-    Throwable caught = null;
-    try {
-      TransformerFactory transformerFactory = TransformerFactory.newInstance();
-      StreamSource xsltSource = new StreamSource(new StringReader(xslt));
-      Transformer transformer = transformerFactory.newTransformer(xsltSource);
-      transformer.setOutputProperty(
-          javax.xml.transform.OutputKeys.OMIT_XML_DECLARATION, "yes");
-      transformer.setOutputProperty(javax.xml.transform.OutputKeys.INDENT,
-          "yes");
-      transformer.setOutputProperty(
-          "{http://xml.apache.org/xslt}indent-amount", "4");
-
-      if (params != null) {
-        for (Iterator iter = params.entrySet().iterator(); iter.hasNext();) {
-          Map.Entry entry = (Map.Entry) iter.next();
-          transformer.setParameter((String) entry.getKey(), entry.getValue());
-        }
-      }
-
-      FileOutputStream fos = new FileOutputStream(outFile);
-      StreamResult result = new StreamResult(fos);
-      StreamSource xmlSource = new StreamSource(new FileReader(inFile));
-      transformer.transform(xmlSource, result);
-      fos.close();
-      return;
-    } catch (TransformerConfigurationException e) {
-      caught = e;
-    } catch (TransformerException e) {
-      caught = e;
-    } catch (IOException e) {
-      caught = e;
-    }
-    throw new RuntimeException("Unable to complete the xslt tranform", caught);
-  }
-
-  private void transformExistingIntoTopicXml() {
-    File[] children = outDir.listFiles();
-    if (children != null) {
-      for (int i = 0, n = children.length; i < n; ++i) {
-        File file = children[i];
-        freshenIf(file);
-      }
-    }
-  }
-
-  private File tryReplaceSuffix(File file, String oldSuffix, String newSuffix) {
-    String name = file.getName();
-    if (name.endsWith(oldSuffix)) {
-      String baseName = name.substring(0, name.length() - oldSuffix.length());
-      return new File(file.getParent(), baseName + newSuffix);
-    } else {
-      return null;
-    }
-  }
-}
diff --git a/2.4/build-tools/doctool/src/com/google/doctool/DocToolFactory.java b/2.4/build-tools/doctool/src/com/google/doctool/DocToolFactory.java
deleted file mode 100644
index b9acc5f..0000000
--- a/2.4/build-tools/doctool/src/com/google/doctool/DocToolFactory.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * Copyright 2006 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.doctool;
-
-import java.io.File;
-import java.io.PrintStream;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Supports two-phase creation of {@link DocTool} objects.
- */
-public class DocToolFactory {
-
-  private final List classPathEntries = new ArrayList();
-
-  private String fileBase;
-
-  private String fileType;
-
-  private boolean generateHtml;
-
-  private final List htmlFileBases = new ArrayList();
-
-  private final List imagePathEntries = new ArrayList();
-
-  private File outDir;
-
-  private File overviewFile;
-
-  private final List packageNameEntries = new ArrayList();
-
-  private final List srcPathEntries = new ArrayList();
-
-  private String title;
-
-  public DocToolFactory() {
-  }
-
-  public void addHtmlFileBase(String filebase) {
-    htmlFileBases.add(filebase);
-  }
-
-  public void addToClassPath(String path) {
-    classPathEntries.add(new File(path));
-  }
-
-  public void addToImagePath(String path) {
-    imagePathEntries.add(new File(path));
-  }
-
-  public void addToPackages(String packageName) {
-    this.packageNameEntries.add(packageName);
-  }
-
-  public void addToSourcePath(String path) {
-    srcPathEntries.add(new File(path));
-  }
-
-  public DocTool create(PrintStream out, PrintStream err) {
-    File localOutDir = outDir;
-    if (localOutDir == null) {
-      localOutDir = new File(System.getProperty("user.dir"), "out");
-      out.println("Using default output directory: "
-          + localOutDir.getAbsolutePath());
-    }
-
-    File[] classPath = null;
-    File[] sourcePath = null;
-    String[] packageNames = null;
-    if (fileType != null) {
-      // Generating a doc set implies other settings.
-      //
-      if (fileBase == null) {
-        err.println("A file base must be specified when generating doc");
-        return null;
-      }
-      // if (overviewFile == null) {
-      // err
-      // .println("An overview file must be specified when generating doc; if
-      // you don't have one, use this:");
-      // err.println("<html><body>");
-      // err.println(" " + fileBase + "documentation");
-      // err.println(" @id " + fileBase + "-doc");
-      // err.println(" @title Documentation for " + fileBase);
-      // err.println("</body></html>");
-      // return null;
-      // }
-      classPath = (File[]) classPathEntries.toArray(new File[0]);
-      sourcePath = (File[]) srcPathEntries.toArray(new File[0]);
-      packageNames = (String[]) packageNameEntries.toArray(new String[0]);
-    }
-
-    if (generateHtml) {
-      if (title == null) {
-        out.println("A title must be specified when generating html");
-        return null;
-      }
-
-      if (htmlFileBases.isEmpty()) {
-        out.println("No html filebases were specified");
-        return null;
-      }
-    }
-
-    String[] htmlFileBaseArray = (String[]) htmlFileBases.toArray(new String[0]);
-
-    // Handle -imagepath
-    //
-    List localImagePathEntries = new ArrayList(imagePathEntries);
-    if (localImagePathEntries.isEmpty()) {
-      out.println("No image path specified; using only the output dir");
-    }
-
-    localImagePathEntries.add(localOutDir);
-    File[] imagePath = (File[]) imagePathEntries.toArray(new File[0]);
-
-    return new DocTool(out, err, localOutDir, generateHtml, title,
-        htmlFileBaseArray, fileType, fileBase, overviewFile, sourcePath,
-        classPath, packageNames, imagePath);
-  }
-
-  public String getFileType() {
-    return fileType;
-  }
-
-  public void setFileBase(String fileBase) {
-    this.fileBase = fileBase;
-  }
-
-  public void setFileType(String fileType) {
-    this.fileType = fileType;
-  }
-
-  public void setGenerateHtml(boolean generateHtml) {
-    this.generateHtml = generateHtml;
-  }
-
-  public void setOutDir(String outDirPath) {
-    this.outDir = new File(outDirPath);
-  }
-
-  public void setOverviewFile(String overviewFile) {
-    this.overviewFile = new File(overviewFile);
-  }
-
-  public void setTitle(String title) {
-    this.title = title;
-  }
-}
diff --git a/2.4/build-tools/doctool/src/com/google/doctool/JreDocTool.java b/2.4/build-tools/doctool/src/com/google/doctool/JreDocTool.java
deleted file mode 100644
index 40b7b5c..0000000
--- a/2.4/build-tools/doctool/src/com/google/doctool/JreDocTool.java
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- * 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.doctool;
-
-import com.google.doctool.custom.EztDoclet;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * Uses the Javadoc tool to produce wiki output documenting the JRE emulation
- * classes in GWT.
- */
-public class JreDocTool {
-
-  public static void main(String[] args) {
-    JreDocToolFactory factory = new JreDocToolFactory();
-    String arg;
-
-    for (int i = 0; i < args.length; i++) {
-      if (tryParseFlag(args, i, "-help")) {
-        printHelp();
-        return;
-      } else if (null != (arg = tryParseArg(args, i, "-classpath"))) {
-        i++;
-        factory.setClasspath(arg);
-      } else if (null != (arg = tryParseArg(args, i, "-out"))) {
-        i++;
-        factory.setOutputFile(arg);
-      } else if (null != (arg = tryParseArg(args, i, "-packages"))) {
-        i++;
-        factory.setPackages(arg);
-      } else if (null != (arg = tryParseArg(args, i, "-sourcepath"))) {
-        i++;
-        factory.setSourcepath(arg);
-      }
-    }
-
-    JreDocTool docTool = factory.create(System.err);
-    if (docTool != null) {
-      docTool.process();
-    }
-  }
-
-  /**
-   * Prints help for using JreDocTool.
-   */
-  private static void printHelp() {
-    String s = "";
-    s += "JreDocTool\n";
-    s += "    Creates EZT format member listing from Java source";
-    s += "    for emulated JRE classes.\n";
-    s += "\n";
-    s += "Required arguments:\n";
-    s += "  -classpath\n";
-    s += "    The path to find imported classes for this doc set.\n";
-    s += "  -sourcepath\n";
-    s += "    The path to find Java source for this doc set.\n";
-    s += "    E.g. /gwt/src/trunk/user/super/com/google/gwt/emul\n";
-    s += "  -out\n";
-    s += "    The path and filename of the output file\n";
-    s += "  -packages\n";
-    s += "    A semicolon-separated list of fully-qualified package names.\n";
-    s += "    E.g. java.lang;java.lang.annotation;java.util;java.io;java.sql\n";
-    s += "\n";
-    System.out.println(s);
-  }
-
-  /**
-   * Parse a flag with a argument.
-   */
-  private static String tryParseArg(String[] args, int i, String name) {
-    if (i < args.length) {
-      if (args[i].equals(name)) {
-        if (i + 1 < args.length) {
-          String arg = args[i + 1];
-          if (arg.startsWith("-")) {
-            System.out.println("Warning: arg to " + name
-                + " looks more like a flag: " + arg);
-          }
-          return arg;
-        } else {
-          throw new IllegalArgumentException("Expecting an argument after "
-              + name);
-        }
-      }
-    }
-    return null;
-  }
-
-  /**
-   * Parse just a flag with no subsequent argument.
-   */
-  private static boolean tryParseFlag(String[] args, int i, String name) {
-    if (i < args.length) {
-      if (args[i].equals(name)) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  private String classpath;
-
-  private String outputFile;
-
-  private String packages;
-
-  private String sourcepath;
-
-  JreDocTool(String classpath, String outputFile, String packages,
-      String sourcepath) {
-    this.classpath = classpath;
-    this.outputFile = outputFile;
-    this.packages = packages;
-    this.sourcepath = sourcepath;
-  }
-
-  private void process() {
-    List<String> args = new ArrayList<String>();
-
-    args.add("-public");
-
-    args.add("-quiet");
-
-    args.add("-source");
-    args.add("1.5");
-
-    args.add("-doclet");
-    args.add(EztDoclet.class.getName());
-
-    args.add("-classpath");
-    args.add(this.classpath);
-
-    args.add("-sourcepath");
-    args.add(this.sourcepath);
-
-    args.add(EztDoclet.OPT_EZTFILE);
-    args.add(this.outputFile);
-
-    args.addAll(Arrays.asList(this.packages.split(";")));
-
-    com.sun.tools.javadoc.Main.execute(args.toArray(new String[0]));
-  }
-}
diff --git a/2.4/build-tools/doctool/src/com/google/doctool/JreDocToolFactory.java b/2.4/build-tools/doctool/src/com/google/doctool/JreDocToolFactory.java
deleted file mode 100644
index 0e7ac66..0000000
--- a/2.4/build-tools/doctool/src/com/google/doctool/JreDocToolFactory.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * 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.doctool;
-
-import java.io.PrintStream;
-
-/**
- * Supports two-phase creation of {@link JreDocTool} objects.
- */
-public class JreDocToolFactory {
-
-  private String classpath;
-
-  private String outputFile;
-
-  private String packages;
-
-  private String sourcepath;
-
-  public JreDocTool create(PrintStream err) {
-    if (this.classpath == null) {
-      err.println("You must specify the -classpath");
-      return null;
-    }
-
-    if (this.outputFile == null) {
-      err.println("You must specify the output file (-out)");
-      return null;
-    }
-
-    if (this.packages == null) {
-      err.println("You must specify the -packages");
-      return null;
-    }
-
-    if (this.sourcepath == null) {
-      err.println("You must specify the -sourcepath");
-      return null;
-    }
-
-    return new JreDocTool(classpath, outputFile, packages, sourcepath);
-  }
-
-  public void setClasspath(String classpath) {
-    this.classpath = classpath;
-  }
-
-  public void setOutputFile(String outputFile) {
-    this.outputFile = outputFile;
-  }
-
-  public void setPackages(String packages) {
-    this.packages = packages;
-  }
-
-  public void setSourcepath(String sourcePath) {
-    this.sourcepath = sourcePath;
-  }
-}
diff --git a/2.4/build-tools/doctool/src/com/google/doctool/LinkResolver.java b/2.4/build-tools/doctool/src/com/google/doctool/LinkResolver.java
deleted file mode 100644
index f16777d..0000000
--- a/2.4/build-tools/doctool/src/com/google/doctool/LinkResolver.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Copyright 2006 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.doctool;
-
-import com.sun.javadoc.ClassDoc;
-import com.sun.javadoc.Doc;
-import com.sun.javadoc.MemberDoc;
-import com.sun.javadoc.MethodDoc;
-import com.sun.javadoc.PackageDoc;
-import com.sun.javadoc.Parameter;
-import com.sun.javadoc.SourcePosition;
-import com.sun.javadoc.Tag;
-
-/**
- * Methods related to resolving cross-references in source.
- */
-public class LinkResolver {
-
-  /**
-   * Abstracts out mechanisms for finding different bits of doc.
-   */
-  public interface ExtraClassResolver {
-    ClassDoc findClass(String className);
-  }
-
-  public static SourcePosition resolveLink(Tag tag) {
-    return resolveLink(tag, null);
-  }
-
-  public static SourcePosition resolveLink(Tag tag,
-      ExtraClassResolver classResolver) {
-    String linkText = tag.text();
-    String className;
-    String methodSig;
-    int pos = linkText.indexOf('#');
-    if (pos >= 0) {
-      className = linkText.substring(0, pos);
-      methodSig = linkText.substring(pos + 1);
-    } else {
-      className = linkText;
-      methodSig = null;
-    }
-
-    ClassDoc containingClass = null;
-    Doc holder = tag.holder();
-    if (holder instanceof ClassDoc) {
-      containingClass = (ClassDoc) holder;
-    } else if (holder instanceof MemberDoc) {
-      containingClass = ((MemberDoc) holder).containingClass();
-    }
-
-    ClassDoc targetClass = null;
-    if (className.length() == 0) {
-      targetClass = containingClass;
-    } else if (holder instanceof PackageDoc) {
-      targetClass = ((PackageDoc) holder).findClass(className);
-    } else {
-      targetClass = containingClass.findClass(className);
-    }
-
-    if (targetClass == null) {
-      if (classResolver != null) {
-        targetClass = classResolver.findClass(className);
-      }
-      if (targetClass == null) {
-        System.err.println(tag.position().toString()
-            + ": unable to resolve class " + className + " for " + tag);
-        System.exit(1);
-      }
-    }
-
-    if (methodSig == null) {
-      return targetClass.position();
-    }
-
-    String paramSig = methodSig.substring(methodSig.indexOf('(') + 1,
-        methodSig.lastIndexOf(')'));
-    String[] resolvedParamTypes;
-    if (paramSig.length() > 0) {
-      String[] unresolvedParamTypes = paramSig.split("\\s*,\\s*");
-      resolvedParamTypes = new String[unresolvedParamTypes.length];
-      for (int i = 0; i < unresolvedParamTypes.length; ++i) {
-        ClassDoc paramType = containingClass.findClass(unresolvedParamTypes[i]);
-        if (paramType == null && classResolver != null) {
-          paramType = classResolver.findClass(unresolvedParamTypes[i]);
-        }
-        if (paramType == null) {
-          System.err.println(tag.position().toString()
-              + ": unable to resolve class " + unresolvedParamTypes[i]
-              + " for " + tag);
-          System.exit(1);
-        }
-        resolvedParamTypes[i] = paramType.qualifiedTypeName();
-      }
-    } else {
-      resolvedParamTypes = new String[0];
-    }
-
-    String possibleOverloads = "";
-
-    MethodDoc[] methods = targetClass.methods();
-    outer : for (int i = 0; i < methods.length; ++i) {
-      MethodDoc methodDoc = methods[i];
-      if (methodSig.startsWith(methodDoc.name())) {
-        possibleOverloads += "\n" + methodDoc.flatSignature();
-        Parameter[] tryParams = methodDoc.parameters();
-        if (resolvedParamTypes.length != tryParams.length) {
-          // param count mismatch
-          continue outer;
-        }
-        for (int j = 0; j < tryParams.length; ++j) {
-          if (!tryParams[j].type().qualifiedTypeName().equals(
-              resolvedParamTypes[j])) {
-            // param type mismatch
-            continue outer;
-          }
-        }
-        return methodDoc.position();
-      }
-    }
-
-    System.err.println(tag.position().toString()
-        + ": unable to resolve method for " + tag);
-    if (possibleOverloads.length() > 0) {
-      System.err.println("Possible overloads: " + possibleOverloads);
-    }
-    System.exit(1);
-    return null;
-  }
-
-}
diff --git a/2.4/build-tools/doctool/src/com/google/doctool/ResourceIncluder.java b/2.4/build-tools/doctool/src/com/google/doctool/ResourceIncluder.java
deleted file mode 100644
index 97833c2..0000000
--- a/2.4/build-tools/doctool/src/com/google/doctool/ResourceIncluder.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright 2006 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.doctool;
-
-import com.sun.javadoc.Tag;
-
-import java.io.ByteArrayOutputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * Utility methods related to including external resources in doc.
- */
-public class ResourceIncluder {
-
-  /**
-   * Copied from {@link com.google.gwt.util.tools.Utility#close(InputStream)}.
-   */
-  public static void close(InputStream is) {
-    try {
-      if (is != null) {
-        is.close();
-      }
-    } catch (IOException e) {
-    }
-  }
-
-  public static String getResourceFromClasspathScrubbedForHTML(Tag tag) {
-    String partialPath = tag.text();
-    try {
-      String contents;
-      contents = getFileFromClassPath(partialPath);
-      contents = scrubForHtml(contents);
-      return contents;
-    } catch (IOException e) {
-      System.err.println(tag.position().toString()
-          + ": unable to include resource " + partialPath + " for tag " + tag);
-      System.exit(1);
-      return null;
-    }
-  }
-
-  /**
-   * Copied from
-   * {@link com.google.gwt.util.tools.Utility#getFileFromClassPath(String)}.
-   */
-  private static String getFileFromClassPath(String partialPath)
-      throws IOException {
-    InputStream in = ResourceIncluder.class.getClassLoader().getResourceAsStream(
-        partialPath);
-    try {
-      if (in == null) {
-        throw new FileNotFoundException(partialPath);
-      }
-      ByteArrayOutputStream os = new ByteArrayOutputStream();
-      int ch;
-      while ((ch = in.read()) != -1) {
-        os.write(ch);
-      }
-      return new String(os.toByteArray(), "UTF-8");
-    } finally {
-      close(in);
-    }
-  }
-
-  private static String scrubForHtml(String contents) {
-    char[] chars = contents.toCharArray();
-    int len = chars.length;
-    StringBuffer sb = new StringBuffer(len);
-    for (int i = 0; i < len; ++i) {
-      char c = chars[i];
-      switch (c) {
-        case '\r':
-          // collapse \r\n into \n
-          if (i == len - 1 || chars[i + 1] != '\n') {
-            sb.append('\n');
-          }
-          break;
-        case '&':
-          sb.append("&amp;");
-          break;
-        case '<':
-          sb.append("&lt;");
-          break;
-        case '>':
-          sb.append("&gt;");
-          break;
-        default:
-          sb.append(c);
-          break;
-      }
-    }
-    return sb.toString();
-  }
-}
diff --git a/2.4/build-tools/doctool/src/com/google/doctool/SplitterJoiner.java b/2.4/build-tools/doctool/src/com/google/doctool/SplitterJoiner.java
deleted file mode 100644
index 2288d6f..0000000
--- a/2.4/build-tools/doctool/src/com/google/doctool/SplitterJoiner.java
+++ /dev/null
@@ -1,288 +0,0 @@
-/*
- * Copyright 2006 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.doctool;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-import org.xml.sax.SAXException;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileReader;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.PrintWriter;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.stream.StreamResult;
-
-/**
- * Takes an input stream and splits it into multiple files. A new file begins
- * when a line in the input stream begins with a specific prefix followed by
- * whitespace then an absolute or relative file name to create.
- */
-public class SplitterJoiner {
-
-  public static void main(String[] args) throws IOException {
-    if (args.length < 2) {
-      help();
-      return;
-    } else if (args[0].equals("split")) {
-      String[] files = new String[args.length - 1];
-      System.arraycopy(args, 1, files, 0, args.length - 1);
-      split(files);
-    } else if (args[0].equals("join")) {
-      if (args.length < 4) {
-        help();
-        return;
-      }
-      String[] files = new String[args.length - 3];
-      System.arraycopy(args, 3, files, 0, args.length - 3);
-      merge(args[1], args[2], files);
-    } else {
-      if (!args[0].equals("-h") && !args[0].equals("-?")) {
-        System.err.println("Error: don't know '" + args[0] + "'");
-      }
-      help();
-      return;
-    }
-  }
-
-  private static void emitFile(PrintWriter out, File outputFile, File inputFile)
-      throws IOException, ParserConfigurationException, SAXException,
-      TransformerException {
-    if (!inputFile.exists()) {
-      System.err.println("Error: Cannot find input file " + inputFile.getPath());
-      return;
-    }
-
-    if (inputFile.getCanonicalFile().equals(outputFile)) {
-      // skip
-      return;
-    }
-
-    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
-    DocumentBuilder builder = factory.newDocumentBuilder();
-    Document doc = builder.parse(inputFile);
-    writeTopLevelChildren(doc, out);
-  }
-
-  private static void help() {
-    System.out.println("Usage: SplitterJoiner split infile+");
-    System.out.println("Usage: SplitterJoiner join tag outfile (infile|dir)+");
-    System.out.println("\tsplit         indicates that inputs file should be split into multiple output files");
-    System.out.println("\tjoin          indicates xml files (or directories) should be merged into one big xml file (on stdout)");
-    System.out.println("\ttag           when joining, the outermost xml tag name");
-    System.out.println("\toutfile       when joining, the file to write the joined output into");
-    System.out.println("\tinfile        if splitting, an input file to split");
-    System.out.println("\t              if joining, a file whose contents should be merged in");
-    System.out.println("\tdir           when joining, a directory whose xml files' contents should be merged in");
-  }
-
-  private static boolean isNewerThan(File file, long lastModified) {
-    if (file.isFile()) {
-      return file.lastModified() > lastModified;
-    }
-
-    File[] children = file.listFiles();
-    if (children != null) {
-      for (int i = 0, n = children.length; i < n; ++i) {
-        File child = children[i];
-        if (isNewerThan(child, lastModified)) {
-          return true;
-        }
-      }
-    }
-
-    return false;
-  }
-
-  private static void merge(String tag, String outputPath, String files[]) {
-    File outputFile = null;
-    try {
-      outputFile = new File(outputPath).getCanonicalFile();
-    } catch (IOException e) {
-      e.printStackTrace();
-      return;
-    }
-
-    // Maybe we don't need to do anything.
-    //
-    boolean skipMerge = true;
-    if (!outputFile.exists()) {
-      skipMerge = false;
-    } else {
-      long outputFileLastModified = outputFile.lastModified();
-      for (int i = 0, n = files.length; i < n; ++i) {
-        if (isNewerThan(new File(files[i]), outputFileLastModified)) {
-          skipMerge = false;
-          break;
-        }
-      }
-    }
-
-    if (skipMerge) {
-      // Nothing to do.
-      //
-      return;
-    }
-
-    try {
-      PrintWriter out = new PrintWriter(new FileWriter(outputFile), true);
-
-      out.println("<?xml version='1.0'?>");
-      out.println("<" + tag + ">");
-
-      for (int i = 0; i < files.length; i++) {
-        File file = new File(files[i]);
-        if (file.isFile()) {
-          emitFile(out, outputFile, file);
-        } else {
-          File[] children = file.listFiles();
-          if (children != null) {
-            for (int j = 0; j < children.length; ++j) {
-              if (children[j].isFile()
-                  && children[j].getPath().endsWith(".xml")) {
-                emitFile(out, outputFile, children[j]);
-              }
-            }
-          }
-        }
-      }
-      out.println("</" + tag + ">");
-      out.close();
-    } catch (IOException e) {
-      outputFile.deleteOnExit();
-      e.printStackTrace();
-    } catch (ParserConfigurationException e) {
-      outputFile.deleteOnExit();
-      e.printStackTrace();
-    } catch (SAXException e) {
-      outputFile.deleteOnExit();
-      e.printStackTrace();
-    } catch (TransformerException e) {
-      e.printStackTrace();
-    }
-  }
-
-  private static void split(String[] files) throws IOException {
-    String prefix = null;
-    File inputFile = null;
-
-    for (int i = 0; i < files.length; i++) {
-      BufferedReader reader = null;
-      try {
-        // Open the reader.
-        //                
-        String file = files[i];
-        inputFile = new File(file);
-        if (!inputFile.exists()) {
-          System.err.println("Error: Cannot find input file "
-              + inputFile.getPath());
-          return;
-        }
-        reader = new BufferedReader(new FileReader(inputFile));
-
-        // Parse the input
-        //
-        File outFile = null;
-        PrintWriter writer = null;
-        String line = reader.readLine();
-        while (line != null) {
-          if (prefix == null) {
-            // Learn the prefix.
-            //
-            prefix = line.trim();
-            if (prefix.length() == 0) {
-              // The first line with anything on it counts as the prefix.
-              // 
-              prefix = null;
-            }
-          } else if (line.startsWith(prefix)) {
-            // Close the current writer.
-            //
-            if (writer != null) {
-              writer.close();
-            }
-
-            // Create the next writer.
-            //
-            String outPath = line.substring(prefix.length()).trim();
-            outFile = new File(outPath);
-            if (!outFile.isAbsolute()) {
-              // Make the created file relative to the input file.
-              //
-              File absoluteParentDir = inputFile.getCanonicalFile().getParentFile();
-              outFile = new File(absoluteParentDir, outPath);
-              // Ignore result since the next line will fail if the directory
-              // doesn't exist.
-              outFile.getParentFile().mkdirs();
-            }
-
-            writer = new PrintWriter(new FileWriter(outFile), true);
-
-            writer.println("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">");
-
-          } else if (writer != null) {
-            // Write this line to the current file.
-            //
-            writer.println(line);
-          } else {
-            // Ignored -- haven't yet seen a starting prefix.
-            //
-          }
-
-          line = reader.readLine();
-        }
-
-        if (writer != null) {
-          writer.close();
-        }
-      } finally {
-        // Close the current reader, if any.
-        if (reader != null) {
-          reader.close();
-        }
-      }
-    }
-  }
-
-  private static void writeTopLevelChildren(Document doc, PrintWriter out)
-      throws TransformerException {
-    StreamResult result = new StreamResult(out);
-    TransformerFactory transformerFactory = TransformerFactory.newInstance();
-    Transformer transformer = transformerFactory.newTransformer();
-    transformer.setOutputProperty(
-        javax.xml.transform.OutputKeys.OMIT_XML_DECLARATION, "yes");
-    transformer.setOutputProperty(javax.xml.transform.OutputKeys.INDENT, "yes");
-    transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount",
-        "4");
-
-    Node child = doc.getDocumentElement().getFirstChild();
-    while (child != null) {
-      DOMSource domSource = new DOMSource(child);
-      transformer.transform(domSource, result);
-      child = child.getNextSibling();
-    }
-  }
-
-}
diff --git a/2.4/build-tools/doctool/src/com/google/doctool/custom/ExampleTaglet.java b/2.4/build-tools/doctool/src/com/google/doctool/custom/ExampleTaglet.java
deleted file mode 100644
index 49c3001..0000000
--- a/2.4/build-tools/doctool/src/com/google/doctool/custom/ExampleTaglet.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Copyright 2006 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.doctool.custom;
-
-import com.google.doctool.Booklet;
-import com.google.doctool.LinkResolver;
-import com.google.doctool.LinkResolver.ExtraClassResolver;
-
-import com.sun.javadoc.ClassDoc;
-import com.sun.javadoc.SourcePosition;
-import com.sun.javadoc.Tag;
-import com.sun.tools.doclets.Taglet;
-
-import java.util.Map;
-
-/**
- * A taglet for slurping examples into javadoc output.
- */
-public class ExampleTaglet implements Taglet {
-
-  public static void register(Map tagletMap) {
-    ExampleTaglet tag = new ExampleTaglet();
-    Taglet t = (Taglet) tagletMap.get(tag.getName());
-    if (t != null) {
-      tagletMap.remove(tag.getName());
-    }
-    tagletMap.put(tag.getName(), tag);
-  }
-
-  public String getName() {
-    return "example";
-  }
-
-  public boolean inConstructor() {
-    return true;
-  }
-
-  public boolean inField() {
-    return true;
-  }
-
-  public boolean inMethod() {
-    return true;
-  }
-
-  public boolean inOverview() {
-    return true;
-  }
-
-  public boolean inPackage() {
-    return true;
-  }
-
-  public boolean inType() {
-    return true;
-  }
-
-  public boolean isInlineTag() {
-    return true;
-  }
-
-  public String toString(Tag tag) {
-    SourcePosition position = LinkResolver.resolveLink(tag,
-        new ExtraClassResolver() {
-          public ClassDoc findClass(String className) {
-            return GWTJavaDoclet.root.classNamed(className);
-          }
-        });
-
-    String slurpSource = Booklet.slurpSource(position);
-    // The <pre> tag still requires '<' and '>' characters to be escaped
-    slurpSource = slurpSource.replace("<", "&lt;");
-    slurpSource = slurpSource.replace(">", "&gt;");
-    return "<blockquote><pre>" + slurpSource + "</pre></blockquote>";
-  }
-
-  public String toString(Tag[] tags) {
-    if (tags == null || tags.length == 0) {
-      return null;
-    }
-    String result = "";
-    for (int i = 0; i < tags.length; i++) {
-      result += toString(tags[i]);
-    }
-    return result;
-  }
-
-}
diff --git a/2.4/build-tools/doctool/src/com/google/doctool/custom/EztDoclet.java b/2.4/build-tools/doctool/src/com/google/doctool/custom/EztDoclet.java
deleted file mode 100644
index 2fa575a..0000000
--- a/2.4/build-tools/doctool/src/com/google/doctool/custom/EztDoclet.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * 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.doctool.custom;
-
-import com.sun.javadoc.ClassDoc;
-import com.sun.javadoc.DocErrorReporter;
-import com.sun.javadoc.ExecutableMemberDoc;
-import com.sun.javadoc.FieldDoc;
-import com.sun.javadoc.PackageDoc;
-import com.sun.javadoc.RootDoc;
-
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Comparator;
-import java.util.Iterator;
-
-/**
- * A doclet for using producing EZT output listing the specified classes and
- * their methods and constructors.
- */
-public class EztDoclet {
-
-  public static final String OPT_EZTFILE = "-eztfile";
-
-  private static EztDoclet EZT_DOCLET;
-
-  private static final String JAVADOC_URL = "http://java.sun.com/javase/6/docs/api/";
-
-  public static int optionLength(String option) {
-    if (option.equals(OPT_EZTFILE)) {
-      return 2;
-    }
-    return 0;
-  }
-
-  public static boolean start(RootDoc root) {
-    getDoclet().process(root);
-    return true;
-  }
-
-  public static boolean validOptions(String[][] options,
-      DocErrorReporter reporter) {
-    return getDoclet().analyzeOptions(options, reporter);
-  }
-
-  private static EztDoclet getDoclet() {
-    if (EZT_DOCLET == null) {
-      EZT_DOCLET = new EztDoclet();
-    }
-    return EZT_DOCLET;
-  }
-
-  private String outputFile;
-
-  private boolean analyzeOptions(String[][] options, DocErrorReporter reporter) {
-    for (int i = 0; i < options.length; i++) {
-      if (options[i][0] == OPT_EZTFILE) {
-        outputFile = options[i][1];
-      }
-    }
-
-    if (outputFile == null) {
-      reporter.printError("You must specify an output filepath with "
-          + OPT_EZTFILE);
-      return false;
-    }
-
-    return true;
-  }
-
-  private String createFieldList(Collection<FieldDoc> fields) {
-    StringBuffer buffer = new StringBuffer();
-    Iterator<FieldDoc> iter = fields.iterator();
-    while (iter.hasNext()) {
-      FieldDoc field = iter.next();
-      buffer.append(field.name());
-      if (iter.hasNext()) {
-        buffer.append(", ");
-      }
-    }
-    return buffer.toString();
-  }
-
-  private String createMemberList(Collection<ExecutableMemberDoc> members) {
-    StringBuffer buffer = new StringBuffer();
-    Iterator<ExecutableMemberDoc> iter = members.iterator();
-    while (iter.hasNext()) {
-      ExecutableMemberDoc member = iter.next();
-      buffer.append(member.name() + member.flatSignature());
-      if (iter.hasNext()) {
-        buffer.append(", ");
-      }
-    }
-    return buffer.toString();
-  }
-
-  private void process(RootDoc root) {
-    try {
-      File outFile = new File(outputFile);
-      outFile.getParentFile().mkdirs();
-      FileWriter fw = new FileWriter(outFile);
-      PrintWriter pw = new PrintWriter(fw, true);
-
-      pw.println("<ol class=\"toc\" id=\"pageToc\">");
-      for (PackageDoc pack : root.specifiedPackages()) {
-        pw.format("  <li><a href=\"#Package_%s\">%s</a></li>\n",
-            pack.name().replace('.', '_'), pack.name());
-      }
-      pw.println("</ol>\n");
-
-      for (PackageDoc pack : root.specifiedPackages()) {
-        pw.format("<h1 id=\"Package_%s\">Package %s</h1>\n",
-            pack.name().replace('.', '_'), pack.name());
-        pw.println("<dl>");
-
-        String packURL = JAVADOC_URL + pack.name().replace(".", "/") + "/";
-
-        // Sort the classes alphabetically
-        ClassDoc[] classes = pack.allClasses(true);
-        Arrays.sort(classes, new Comparator<ClassDoc>() {
-          public int compare(ClassDoc arg0, ClassDoc arg1) {
-            return arg0.name().compareTo(arg1.name());
-          }
-        });
-
-        Iterator<ClassDoc> iter = Arrays.asList(classes).iterator();
-        while (iter.hasNext()) {
-          ClassDoc cls = iter.next();
-
-          // Each class links to Sun's main JavaDoc
-          pw.format("  <dt><a href=\"%s%s.html\">%s</a></dt>\n", packURL,
-              cls.name(), cls.name());
-
-          // Print out all fields
-          Collection<FieldDoc> fields = new ArrayList<FieldDoc>();
-          fields.addAll(Arrays.asList(cls.fields(true)));
-
-          if (!fields.isEmpty()) {
-            pw.format("  <dd style='margin-bottom: 0.5em;'>%s</dd>\n", createFieldList(fields));
-          }
-
-          // Print out all constructors and methods
-          Collection<ExecutableMemberDoc> members = new ArrayList<ExecutableMemberDoc>();
-          members.addAll(Arrays.asList(cls.constructors(true)));
-          members.addAll(Arrays.asList(cls.methods(true)));
-
-          if (!members.isEmpty()) {
-            pw.format("  <dd>%s</dd>\n", createMemberList(members));
-          }
-
-          if (iter.hasNext()) {
-            pw.print("\n");
-          }
-        }
-
-        pw.println("</dl>\n");
-      }
-      pw.close();
-    } catch (IOException e) {
-      throw new RuntimeException(e);
-    }
-  }
-}
diff --git a/2.4/build-tools/doctool/src/com/google/doctool/custom/FindPackages.java b/2.4/build-tools/doctool/src/com/google/doctool/custom/FindPackages.java
deleted file mode 100644
index 4014a43..0000000
--- a/2.4/build-tools/doctool/src/com/google/doctool/custom/FindPackages.java
+++ /dev/null
@@ -1,221 +0,0 @@
-/*
- * Copyright 2010 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.doctool.custom;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.PrintStream;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.regex.Pattern;
-
-/**
- * Used by trunk/doc/build.xml to generate the packages.properties file.
- */
-public class FindPackages {
-
-  /**
-   * A list of regular expressions to exclude. For readability, a '.' character
-   * will be interpreted literally (i.e., it will be transformed into '\.'
-   * before being compiled). Add rules here as needed.
-   */
-  private static final String[] EXCLUSIONS = {
-      "^com.example.", "^com.google.gwt.dev(.|$)", "^com.google.gwt.emul.",
-      "^com.google.gwt.examples(.|$)", "^com.google.gwt.i18n.server(.|$)",
-      "^com.google.gwt.i18n.tools", "^com.google.gwt.lang",
-      "^com.google.gwt.junit(.|$)", "^com.google.gwt.resources.css(.|$)",
-      "^com.google.gwt.resources.rg(.|$)",
-      "^com.google.gwt.rpc.client.ast(.|$)", "^com.google.gwt.soyc(.|$)",
-      "^com.google.gwt.validation(.|$)",
-      "^com.google.gwt.user.client.rpc.core.", "^javax.", "^junit.", "^org.",
-      ".impl(.|$)", ".rebind(.|$)"
-  };
-
-  /**
-   * A list of emulated packages in the java.* namespace, to be emitted as
-   * the JAVA_PKGS property.  Add packages here as needed.
-   */
-  private static final String[] JAVA_PKGS = {
-    "java.lang", "java.lang.annotation", "java.math", "java.io", "java.sql", "java.util", "java.util.logging"};
-
-  /**
-   * User packages to include, regardless of exclusions.  Add packages here
-   * as needed.
-   */
-  private static final String[] PACKAGE_WHITELIST = {
-      "com.google.gwt.i18n.rebind.format", "com.google.gwt.i18n.rebind.keygen",
-      "com.google.gwt.junit.client"};
-
-  /**
-   * Source directories under the root directory to traverse.  Add directories
-   * here as needed.
-   */
-  private static final String[] SOURCE_DIRS = {
-      "user/src", "user/javadoc", "user/super", "dev/core/src",
-      "dev/core/super"};
-
-  /**
-   * Individual user classes to include, even if the rest of their packages
-   * is not included.  Add classes here as needed.
-   */
-  private static final String[] USER_CLASSES = {
-      "user/src/com/google/gwt/junit/tools/GWTTestSuite.java",
-      "user/src/com/google/gwt/i18n/rebind/LocaleUtils.java",
-      "user/src/com/google/gwt/i18n/server/GwtLocaleFactoryImpl.java",
-      "user/src/com/google/gwt/i18n/server/GwtLocaleImpl.java"};
-
-  private static Pattern exclusions;
-  static {
-    StringBuilder sb = new StringBuilder();
-    for (int i = 0; i < EXCLUSIONS.length; i++) {
-      String ex = EXCLUSIONS[i];
-      ex = ex.replace(".", "\\.");
-      if (i < EXCLUSIONS.length - 1) {
-        sb.append(ex + "|");
-      } else {
-        sb.append(ex);
-      }
-    }
-    exclusions = Pattern.compile(sb.toString());
-  }
-
-  public static void main(String[] args) {
-    if (args.length < 1) {
-      System.err.println("usage: java com.google.doctool.custom.FindPackages <root dir>");
-      System.exit(1);
-    }
-
-    try {
-      File rootDir = new File(args[0]);
-      // Output to <root>/doc/packages.properties
-      File build = new File(rootDir, "build");
-      File buildOut = new File(build, "out");
-      File outFile = new File(buildOut, "packages.properties");
-      PrintStream out = new PrintStream(new FileOutputStream(outFile), false, "UTF-8");
-
-      out.println("# THIS FILE IS AUTOMATICALLY GENERATED BY");
-      out.println("# com.google.doctool.custom.FindPackages");
-      out.println("#");
-      out.println("# This file contains all of the user javadoc packages");
-      out.println("#");
-      out.println("# JRE emulation packages");
-      out.println("JAVA_PKGS=\\");
-      for (int i = 0; i < JAVA_PKGS.length; i++) {
-        if (i < JAVA_PKGS.length - 1) {
-          out.println(JAVA_PKGS[i] + ";\\");
-        } else {
-          out.println(JAVA_PKGS[i]);
-        }
-      }
-      out.println("# The last package should not have a trailing semicolon");
-      out.println("");
-      out.println("# Individual classes to include when we don't want to include an entire package");
-      out.println("USER_CLASSES=\\");
-
-      // Output a package-info.java once for each package
-      Set<String> classPaths = new HashSet<String>();
-      for (int i = 0; i < USER_CLASSES.length; i++) {
-        String className = USER_CLASSES[i];
-        String classPath = className.substring(0, className.lastIndexOf('/'));
-        if (!classPaths.contains(classPath)) {
-          classPaths.add(classPath);
-          out.println("${gwt.root}/" + classPath + "/package-info.java" + ":\\");
-        }
-        if (i < USER_CLASSES.length - 1) {
-          out.println("${gwt.root}/" + className + ":\\");
-        } else {
-          out.println("${gwt.root}/" + className);
-        }
-      }
-      out.println("");
-      out.println("# Packages to include");
-      out.println("USER_PKGS=\\");
-
-      Set<String> packages = new HashSet<String>();
-      for (String dir : SOURCE_DIRS) {
-        File f = new File(rootDir, dir);
-        findPackages(f, null, packages);
-      }
-      for (String s : PACKAGE_WHITELIST) {
-        packages.add(s);
-      }
-
-      ArrayList<String> packageList = new ArrayList<String>(packages);
-      Collections.sort(packageList);
-
-      for (int i = 0; i < packages.size(); i++) {
-        if (i < packages.size() - 1) {
-          out.println(packageList.get(i) + ";\\");
-        } else {
-          out.println(packageList.get(i));
-        }
-      }
-      out.println("# The last package should not have a trailing semicolon");
-      out.close();
-    } catch (IOException e) {
-      System.err.println("Got I/O Exception: " + e);
-      System.exit(2);
-    }
-  }
-
-  /**
-   * Recursively find java packages under the given directory.
-   *
-   * @param dir the root directory
-   * @param packageName the package name so far
-   * @param packages the set of packages to output to
-   */
-  private static void findPackages(File dir, String packageName,
-      Set<String> packages) {
-    File[] files = dir.listFiles();
-    if (files == null) {
-      return;
-    }
-    boolean hasJava = false;
-    for (File f : files) {
-      String name = f.getName();
-      if (f.isDirectory()) {
-        String subPackage = packageName == null ? name : packageName + "."
-            + name;
-        findPackages(f, subPackage, packages);
-      } else {
-        // If there is a java file in the directory, include the package
-        // for further processing.
-        if (!hasJava && name.endsWith(".java")) {
-          hasJava = true;
-        }
-      }
-    }
-
-    // Clean up translatable/ and super/ paths
-    // Emit the package name if not excluded
-    if (hasJava && packageName != null) {
-      int index;
-      if ((index = packageName.indexOf(".translatable.")) != -1) {
-        packageName = packageName.substring(index + 14);
-      }
-      if ((index = packageName.indexOf(".super.")) != -1) {
-        packageName = packageName.substring(index + 7);
-      }
-      if (!exclusions.matcher(packageName).find()) {
-        packages.add(packageName);
-      }
-    }
-  }
-}
diff --git a/2.4/build-tools/doctool/src/com/google/doctool/custom/GWTJavaDoclet.java b/2.4/build-tools/doctool/src/com/google/doctool/custom/GWTJavaDoclet.java
deleted file mode 100644
index ad9e747..0000000
--- a/2.4/build-tools/doctool/src/com/google/doctool/custom/GWTJavaDoclet.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright 2006 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.doctool.custom;
-
-import com.sun.javadoc.Doclet;
-import com.sun.javadoc.RootDoc;
-import com.sun.tools.doclets.standard.Standard;
-import com.sun.tools.javadoc.Main;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * A doclet for using GWT-specific tags in standard javadoc output.
- */
-public class GWTJavaDoclet extends Doclet {
-
-  static RootDoc root = null;
-
-  private static final String[] TAGLET_ARGS = new String[] {
-      "-taglet", ExampleTaglet.class.getName(), "-taglet",
-      TipTaglet.class.getName(), "-taglet", IncludeTaglet.class.getName()};
-
-  public static void main(String[] args) {
-    List examplePackages = new ArrayList();
-    List filteredArgs = new ArrayList();
-
-    // filter out and save packages args
-    for (int i = 0; i < args.length; ++i) {
-      if (args[i].equalsIgnoreCase("-examplepackages")) {
-        String nextArg = args[++i];
-        String[] split = nextArg.split(":|;");
-        for (int j = 0; j < split.length; ++j) {
-          examplePackages.add(split[j]);
-        }
-      } else if (args[i].equalsIgnoreCase("-packages")) {
-        String nextArg = args[++i];
-        String[] split = nextArg.split(":|;");
-        for (int j = 0; j < split.length; ++j) {
-          filteredArgs.add(split[j]);
-        }
-      } else {
-        filteredArgs.add(args[i]);
-      }
-    }
-
-    // Build a javadoc structure that includes example packages for reference
-    String name = GWTJavaDoclet.class.getName();
-    List myArgs = new ArrayList();
-    myArgs.addAll(filteredArgs);
-    myArgs.addAll(examplePackages);
-    Main.execute(name, name, (String[]) myArgs.toArray(new String[] {}));
-
-    // Now delegate to the real javadoc without the example packages
-    filteredArgs.addAll(0, Arrays.asList(TAGLET_ARGS));
-    Main.execute((String[]) filteredArgs.toArray(new String[] {}));
-  }
-
-  public static int optionLength(String option) {
-    // delegate
-    return Standard.optionLength(option);
-  }
-
-  public static boolean start(RootDoc root) {
-    // cache the root; ExampleTag will use it for reference later.
-    GWTJavaDoclet.root = root;
-    return true;
-  }
-
-}
diff --git a/2.4/build-tools/doctool/src/com/google/doctool/custom/IncludeTaglet.java b/2.4/build-tools/doctool/src/com/google/doctool/custom/IncludeTaglet.java
deleted file mode 100644
index 26e18bf..0000000
--- a/2.4/build-tools/doctool/src/com/google/doctool/custom/IncludeTaglet.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright 2006 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.doctool.custom;
-
-import com.google.doctool.ResourceIncluder;
-
-import com.sun.javadoc.Tag;
-import com.sun.tools.doclets.Taglet;
-
-import java.util.Map;
-
-/**
- * A taglet for slurping in the content of artbitrary files appearing on the
- * classpath into javadoc.
- */
-public class IncludeTaglet implements Taglet {
-
-  public static void register(Map tagletMap) {
-    IncludeTaglet tag = new IncludeTaglet();
-    Taglet t = (Taglet) tagletMap.get(tag.getName());
-    if (t != null) {
-      tagletMap.remove(tag.getName());
-    }
-    tagletMap.put(tag.getName(), tag);
-  }
-
-  public String getName() {
-    return "gwt.include";
-  }
-
-  public boolean inConstructor() {
-    return true;
-  }
-
-  public boolean inField() {
-    return true;
-  }
-
-  public boolean inMethod() {
-    return true;
-  }
-
-  public boolean inOverview() {
-    return true;
-  }
-
-  public boolean inPackage() {
-    return true;
-  }
-
-  public boolean inType() {
-    return true;
-  }
-
-  public boolean isInlineTag() {
-    return true;
-  }
-
-  public String toString(Tag tag) {
-    String contents = ResourceIncluder.getResourceFromClasspathScrubbedForHTML(tag);
-    return "<blockquote><pre>" + contents + "</pre></blockquote>";
-  }
-
-  public String toString(Tag[] tags) {
-    return null;
-  }
-
-}
diff --git a/2.4/build-tools/doctool/src/com/google/doctool/custom/TipTaglet.java b/2.4/build-tools/doctool/src/com/google/doctool/custom/TipTaglet.java
deleted file mode 100644
index a17e0b3..0000000
--- a/2.4/build-tools/doctool/src/com/google/doctool/custom/TipTaglet.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright 2006 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.doctool.custom;
-
-import com.sun.javadoc.Tag;
-import com.sun.tools.doclets.Taglet;
-
-import java.util.Map;
-
-/**
- * A taglet for including GWT tip tags in javadoc output.
- */
-public class TipTaglet implements Taglet {
-
-  public static void register(Map tagletMap) {
-    TipTaglet tag = new TipTaglet();
-    Taglet t = (Taglet) tagletMap.get(tag.getName());
-    if (t != null) {
-      tagletMap.remove(tag.getName());
-    }
-    tagletMap.put(tag.getName(), tag);
-  }
-
-  public TipTaglet() {
-  }
-
-  public String getName() {
-    return "tip";
-  }
-
-  public boolean inConstructor() {
-    return true;
-  }
-
-  public boolean inField() {
-    return true;
-  }
-
-  public boolean inMethod() {
-    return true;
-  }
-
-  public boolean inOverview() {
-    return true;
-  }
-
-  public boolean inPackage() {
-    return true;
-  }
-
-  public boolean inType() {
-    return true;
-  }
-
-  public boolean isInlineTag() {
-    return false;
-  }
-
-  public String toString(Tag tag) {
-    return null;
-  }
-
-  public String toString(Tag[] tags) {
-    if (tags == null || tags.length == 0) {
-      return null;
-    }
-    String result = "<DT><B>Tip:</B></DT><DD>";
-    if (tags.length == 1) {
-      result += tags[0].text();
-    } else {
-      result += "<UL>";
-      for (int i = 0; i < tags.length; i++) {
-        result += "<LI>" + tags[i].text() + "</LI>";
-      }
-      result += "</UL>";
-    }
-    result += "</DD>";
-    return result;
-  }
-
-}
diff --git a/2.4/build-tools/doctool/src/doc-topics.xslt b/2.4/build-tools/doctool/src/doc-topics.xslt
deleted file mode 100644
index ac0019f..0000000
--- a/2.4/build-tools/doctool/src/doc-topics.xslt
+++ /dev/null
@@ -1,82 +0,0 @@
-<?xml version="1.0"?>
-<!-- Transforms booklet expositive documentation into Topics -->
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-    <xsl:output method="xml"/>
-
-    <xsl:template match="/">
-    	<topics>
-			<xsl:apply-templates select="booklet"/>
-		</topics>
-    </xsl:template>
-
-    <xsl:template match="booklet">
-        <xsl:apply-templates select="package/*"/>
-    </xsl:template>
-
-    <xsl:template match="class | interface">
-        <topic>
-            <id><xsl:value-of select="id"/></id>
-
-            <xsl:if test="tags/order">
-                <order><xsl:value-of select="tags/order"/></order>
-            </xsl:if>
-
-            <xsl:variable name="title">
-                <xsl:value-of select="tags/title"/>
-                <xsl:if test="not(tags/title)">
-                    <xsl:comment>[Missing title]</xsl:comment>
-                </xsl:if>
-			</xsl:variable>
-
-            <title>
-            	<xsl:value-of select="$title"/>
-            </title>
-
-            <xsl:if test="location/link">
-	            <location>
-                    <xsl:for-each select="location/link">
-	                	<xsl:if test="position() > 2">
-							<span class="item"><xsl:copy-of select="."/></span> &gt;
-						</xsl:if>
-                    </xsl:for-each>
-					<span class="selected item">
-	                    <xsl:value-of select="$title"/>
-	                </span>
-	            </location>
-            </xsl:if>
-
-            <xsl:for-each select="tags/index">
-                <index><xsl:value-of select="."/></index>
-            </xsl:for-each>
-
-            <xsl:for-each select="tags/tip">
-                <xsl:copy-of select="."/>
-            </xsl:for-each>
-
-            <xsl:if test="tags/synopsis">
-                <synopsis><xsl:copy-of select="tags/synopsis/node()"/></synopsis>
-            </xsl:if>
-    
-            <body><xsl:copy-of select="description/node()"/></body>
-
-            <!-- See also -->
-            <xsl:if test="tags/link">
-				<seeAlso>
-					<xsl:for-each select="tags/link">
-						<xsl:copy-of select="."/>
-					</xsl:for-each>
-				</seeAlso>
-            </xsl:if>
-        
-            <xsl:if test="tags/childIntro">
-                <childIntro><xsl:copy-of select="tags/childIntro/node()"/></childIntro>
-            </xsl:if>
-
-            <xsl:apply-templates select="class | interface"/>
-        </topic>        
-    </xsl:template>
-
-    <xsl:template match="*|node()">
-        <!-- quiet -->
-    </xsl:template>
-</xsl:stylesheet>
diff --git a/2.4/build-tools/doctool/src/doc.css b/2.4/build-tools/doctool/src/doc.css
deleted file mode 100644
index 1f748c0..0000000
--- a/2.4/build-tools/doctool/src/doc.css
+++ /dev/null
@@ -1,239 +0,0 @@
-/*
- * Copyright 2007 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-TABLE {
-   font-family: Arial, sans-serif;
-   font-size: small;
-}
-
-H2.api {
-   background-color: #f5f5f5;
-}
-
-H3.api {
-   margin-bottom: 0.5em;
-}
-
-H4.api {
-   margin-bottom: 0.5em;
-}
-
-UL.featurelist LI {
-   margin-bottom: 0.5em;
-}
-
-#nextprev {
-   float: right;
-   padding-right: 6px;
-}
-
-#nextprev nobr {
-   margin: 0 0.2em 0 0.2em;
-}
-
-DD {
-   margin-bottom: 1em;
-}
-
-DIV.tipContainer {
-   position: relative;
-   background-color: #e5ecf9;
-   padding: 0.8em 1em 1em 0em;
-   margin: 1em 0 1em 0;
-}
-
-DIV.tipCallout {
-   position: absolute;
-   padding: 0;
-   top: 0.8em;
-   left: 0.8em;
-   font-weight: bold;
-}
-
-DIV.tipBody {
-   padding-left: 3.2em;
-}
-
-DIV.topicHeader {
-   border-bottom: 2px solid blue;
-   margin: 0 1em 1em 1em;
-}
-
-DIV.topicHeader A {
-   text-decoration: none;
-}
-
-DIV.topicHeader A:hover {
-   text-decoration: underline;
-}
-
-DIV.topicHeader NOBR A {
-   text-decoration: none;
-}
-
-DIV.topicHeader NOBR A:hover {
-   text-decoration: underline;
-}
-
-DIV.topicBody {
-   margin: 1em 1em 1em 1em;
-}
-
-DIV.topicChildren {
-   margin-left: 1em;
-}
-
-DIV.topicSeeAlso {
-   margin-left: 2em;
-}
-
-DIV.topicSeeAlso H2 {
-   margin-left: -1em;
-}
-
-DIV.memberOf {
-   font-size: small;
-   margin-bottom: 1em;
-}
-
-DIV.apiSection {
-   margin-left: 2em;
-}
-
-TABLE.members {
-   font-size: 100%;
-}
-
-TABLE.members TR {
-   vertical-align: top;
-}
-
-TABLE.members TR TH {
-   font-weight: bold;
-   background-color: #CCCCCC;
-   text-align: left;
-   padding: 4px 6px 4px 6px;
-}
-
-TABLE.members TR TD {
-   background-color: white;
-   text-align: left;
-   padding: 4px 6px 4px 6px;
-   margin: 1px;
-}
-
-DIV.memberSig {
-   font-family: "bogus font here" , monospace;
-   font-size: 100%;
-   margin-bottom: 1em;
-   overflow: auto;
-}
-
-DIV.classSig {
-   color: #007000;
-   font-family: "bogus font here" , monospace;
-   font-size: 100%;
-   background-color: #f5f5f5;
-   padding: 0.5em;
-   margin-bottom: 1em;
-   overflow: auto;
-}
-
-UL.css LI {
-   font-style: normal;
-   font-family: Courier New;
-   list-style-type: none;
-}
-
-DL.fixed DT {
-   font-style: normal;
-   font-family: Courier New;
-}
-
-DL.memberDetail {
-   margin-top: 0em;
-}
-
-DL.memberDetail DT {
-   font-family: "bogus font here" , monospace;
-}
-
-DL.memberDetail DD {
-   margin-bottom: 1em;
-}
-
-TD {
-   padding: 0.2em;
-   vertical-align: top;
-}
-
-TH {
-   text-align: left;
-}
-
-TR.gallery-link TD {
-   text-align: center;
-   vertical-align: bottom;
-   padding-top: 1em;
-}
-
-TR.gallery TD {
-   text-align: center;
-   vertical-align: top;
-   padding-top: 0.25em;
-   padding-bottom: 1em;
-   padding-left: 1em;
-   padding-right: 1em;
-}
-
-IMG.gallery {
-   border: 1px solid #95BBFC;
-   padding: 4px;
-}
-
-UL.childToc {
-	margin: 0;
-	padding: 0;
-	list-style-type: none;
-}
-
-UL.childToc LI {
-	margin: 0 0 18pt 0;
-	padding: 0;
-}
-
-UL.childToc LI DIV.heading {
-	font-weight: bold;
-}
-
-UL.childToc LI DIV.synopsis A {
-	text-decoration: none;
-	color: black;
-}
-
-UL.childToc UL {
-	width: 80%;
-	list-style-type: none;
-	padding: 0;
-	margin: 4pt 0 0 24pt;
-}
-
-UL.childToc UL LI {
-	white-space: nowrap;
-	display: inline;
-	margin: 0;
-	padding: 0;
-}
diff --git a/2.4/build-tools/doctool/src/java-topics.xslt b/2.4/build-tools/doctool/src/java-topics.xslt
deleted file mode 100644
index 10fb8e6..0000000
--- a/2.4/build-tools/doctool/src/java-topics.xslt
+++ /dev/null
@@ -1,459 +0,0 @@
-<?xml version="1.0"?>
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-    <xsl:output method="xml" />
-    <xsl:strip-space elements="*"/>
-    
-    <xsl:param name="id"/>
-    <xsl:param name="name"/>
-    <xsl:param name="synopsis"/>
-    <xsl:param name="childIntro"/>
-
-    <xsl:key name="extendsInterface" match="//interface/superinterface" use="@ref"/>
-    <xsl:key name="implementsInterface" match="//class/superinterface" use="@ref"/>
-    <xsl:key name="extendsClass" match="//class/superclass" use="@ref"/>
-
-    <xsl:template match="/">
-        <topics>
-           <xsl:apply-templates select="booklet"/>
-        </topics>
-    </xsl:template>
-
-    <xsl:template match="booklet">
-      <topic>
-            <xsl:copy-of select="id"/>
-            <title><xsl:value-of select="name"/></title>
-           <location>
-               <span class="selected item">
-                  <xsl:value-of select="name"/>
-               </span>
-         </location>
-            <synopsis><xsl:apply-templates select="lead/node()"/></synopsis>
-            <header><h1><xsl:apply-templates select="name/node()"/></h1></header>
-            <body>
-                <!-- Lengthier description -->
-                <xsl:apply-templates select="description/node()"/>
-
-                <xsl:call-template name="memberTable">
-                    <xsl:with-param name="members" select="package"/>
-                    <xsl:with-param name="title">Packages</xsl:with-param>
-                </xsl:call-template>
-            </body>
-            <xsl:apply-templates select="package">
-                <xsl:sort select="name"/>
-            </xsl:apply-templates>
-      </topic>
-    </xsl:template>
-
-    <xsl:template name="emit-location">
-       <xsl:if test="location">
-           <location>
-            <xsl:for-each select="location/link">
-               <span class="item"><xsl:copy-of select="."/></span> &gt;
-            </xsl:for-each>
-            <span class="selected item">
-                  <xsl:value-of select="name"/>
-               </span>
-           </location>
-      </xsl:if>
-    </xsl:template>
-
-    <xsl:template match="package">
-        <topic>
-            <id><xsl:value-of select="id"/></id>
-            <title><xsl:value-of select="name"/></title>
-            <xsl:call-template name="emit-location"/>
-            <index><xsl:value-of select="name"/> package</index>
-            <xsl:if test="lead/node()">
-                <synopsis><xsl:apply-templates select="lead/node()"/></synopsis>
-            </xsl:if>
-            <header>
-                <xsl:call-template name="memberHeader">
-                    <xsl:with-param name="member" select="."/>
-                </xsl:call-template>
-            </header>
-            <body>
-                <!-- Lengthier description -->
-                <xsl:apply-templates select="description/node()"/>
-
-                <xsl:call-template name="memberTable">
-                    <xsl:with-param name="members" select="class"/>
-                    <xsl:with-param name="title">Classes</xsl:with-param>
-                </xsl:call-template>
-
-                <xsl:call-template name="memberTable">
-                    <xsl:with-param name="members" select="interface"/>
-                    <xsl:with-param name="title">Interfaces</xsl:with-param>
-                </xsl:call-template>
-            </body>
-            <xsl:apply-templates select="class">
-                <xsl:sort select="name"/>
-            </xsl:apply-templates>
-            <xsl:apply-templates select="interface">
-                <xsl:sort select="name"/>
-            </xsl:apply-templates>
-        </topic>        
-    </xsl:template>
-
-    <xsl:template match="class|interface">
-        <topic>
-            <xsl:copy-of select="id"/>
-            <title><xsl:value-of select="name"/></title>
-            <xsl:call-template name="emit-location"/>
-            <index>
-                <xsl:value-of select="name"/>
-                <xsl:if test="name()='class'"> class</xsl:if>
-                <xsl:if test="name()='interface'"> interface</xsl:if>
-            </index>
-            <synopsis><xsl:apply-templates select="lead/node()"/></synopsis>
-            <header>
-                <xsl:call-template name="memberHeader">
-                    <xsl:with-param name="member" select="."/>
-                </xsl:call-template>
-            </header>
-            <body>
-                <!-- Lengthier description -->
-                <xsl:apply-templates select="description/node()"/>
-            
-                <xsl:call-template name="memberTable">
-                    <xsl:with-param name="members" select="class"/>
-                    <xsl:with-param name="title">Nested Classes</xsl:with-param>
-                </xsl:call-template>
-
-                <xsl:call-template name="memberTable">
-                    <xsl:with-param name="members" select="interface"/>
-                    <xsl:with-param name="title">Nested Interfaces</xsl:with-param>
-                </xsl:call-template>
-
-                <xsl:call-template name="memberTable">
-                    <xsl:with-param name="members" select="field"/>
-                    <xsl:with-param name="title">Fields</xsl:with-param>
-                </xsl:call-template>
-
-                <xsl:call-template name="memberTable">
-                    <xsl:with-param name="members" select="constructor"/>
-                    <xsl:with-param name="title">Constructors</xsl:with-param>
-                </xsl:call-template>
-
-                <xsl:call-template name="memberTable">
-                    <xsl:with-param name="members" select="method"/>
-                    <xsl:with-param name="title">Methods</xsl:with-param>
-                </xsl:call-template>
-
-                <!-- See also -->
-                <xsl:if test="tags/link">
-                    <h2 class="api">See Also</h2>
-                     <xsl:for-each select="tags/link">
-                           <xsl:copy-of select="."/>
-                           <xsl:if test="position()!=last()">, </xsl:if> 
-                     </xsl:for-each>
-                </xsl:if>
-
-               <xsl:for-each select="field[not(jre)]">
-                   <xsl:sort select="name"/>
-                   <xsl:if test="position() = 1">
-                     <h2 class="api">Field Detail</h2>
-                   </xsl:if>
-                   <xsl:apply-templates select="."/>
-                   <xsl:if test="position() != last()">
-                     <hr/>
-                   </xsl:if>
-               </xsl:for-each>
-   
-               <xsl:for-each select="constructor[not(jre)]">
-                   <xsl:sort select="name"/>
-                   <xsl:if test="position() = 1">
-                     <h2 class="api">Constructor Detail</h2>
-                   </xsl:if>
-                   <xsl:apply-templates select="."/>
-                   <xsl:if test="position() != last()">
-                     <hr/>
-                   </xsl:if>
-               </xsl:for-each>
-   
-               <xsl:for-each select="method[not(jre)]">
-                   <xsl:sort select="name"/>
-                   <xsl:if test="position() = 1">
-                     <h2 class="api">Method Detail</h2>
-                   </xsl:if>
-                   <xsl:apply-templates select="."/>
-                   <xsl:if test="position() != last()">
-                     <hr/>
-                   </xsl:if>
-               </xsl:for-each>
-                
-            </body>
-
-            <xsl:apply-templates select="interface">
-                <xsl:sort select="name"/>
-            </xsl:apply-templates>
-
-            <xsl:apply-templates select="class">
-                <xsl:sort select="name"/>
-            </xsl:apply-templates>
-        </topic>
-    </xsl:template>
-
-    <xsl:template match="method|constructor">
-      <!-- Anchor -->
-      <xsl:if test="string-length(substring-after(id, &quot;#&quot;)) != 0">
-         <a name="{substring-after(id, &quot;#&quot;)}"/>
-      </xsl:if>
-      
-      <!-- The simple name -->
-      <h3 class="api"><xsl:value-of select="name"/></h3>    
-    
-      <!-- The signature -->
-      <div class="memberSig">
-         <xsl:call-template name="memberSig">
-            <xsl:with-param name="member" select="."/>
-         </xsl:call-template>
-      </div>
-   
-      <!-- Lengthier description -->
-      <xsl:apply-templates select="description/node()"/>
-
-      <!-- Parameter description -->
-      <xsl:if test="params/param">
-         <h4 class="api">Parameters</h4>
-         <dl class="memberDetail">
-         <xsl:for-each select="params/param">
-            <dt><xsl:value-of select="name"/></dt>
-            <dd>
-               <xsl:variable name="paramDesc" select="../../tags/param[name=current()/name]/description/node()"/>
-               <xsl:apply-templates select="$paramDesc"/>
-               <xsl:if test="not($paramDesc)"><xsl:comment>[Missing documentation]</xsl:comment></xsl:if>
-            </dd>
-         </xsl:for-each>
-         </dl>
-      </xsl:if>
-
-      <!-- Return value description -->
-      <xsl:if test="tags/return">
-         <h4 class="api">Return Value</h4>
-         <xsl:apply-templates select="tags/return/node()"/>
-      </xsl:if>
-
-      <!-- See also -->
-      <xsl:if test="tags/link">
-         <h4 class="api">See Also</h4>
-         <xsl:for-each select="tags/link">
-            <xsl:copy-of select="."/>
-            <xsl:if test="position()!=last()">, </xsl:if> 
-         </xsl:for-each>
-      </xsl:if>
-    </xsl:template>
-
-    <xsl:template match="field">
-      <!-- Anchor -->
-      <xsl:if test="string-length(substring-after(id, &quot;#&quot;)) != 0">
-         <a name="#{substring-after(id, &quot;#&quot;)}"/>
-      </xsl:if>
-
-      <!-- The simple name -->
-      <h3 class="api"><xsl:value-of select="name"/></h3>    
-
-      <!-- The signature -->
-      <div class="memberSig">
-         <xsl:call-template name="memberSig">
-            <xsl:with-param name="member" select="."/>
-         </xsl:call-template>
-      </div>
-
-      <!-- Lengthier description -->
-      <xsl:apply-templates select="description/node()"/>
-    </xsl:template>
-
-    <xsl:template match="@*|node()">
-      <xsl:copy>
-         <xsl:apply-templates select="@*|node()"/>
-      </xsl:copy>
-    </xsl:template>
-
-    <xsl:template name="memberTable">
-        <xsl:param name="members"/>
-        <xsl:param name="title"/>
-        
-        <xsl:if test="$members">
-            <h2 class="api"><xsl:value-of select="$title"/></h2>
-            <table cellspacing="1" cellpadding="1" class="members">
-                    <xsl:apply-templates select="$members" mode="memberTableImpl">
-                  <xsl:sort case-order="lower-first" data-type="text" order="ascending" select="name"/>
-                    </xsl:apply-templates>
-            </table>
-        </xsl:if>
-    </xsl:template>
-
-   <xsl:template match="*" mode="memberTableImpl">
-      <tr>
-         <td>
-            <xsl:choose>
-               <xsl:when test="jre and (name()='method' or name()='constructor' or name()='field')">
-                  <a href="{jre}"><xsl:value-of select="name"/><xsl:value-of select="flatSignature"/></a>
-               </xsl:when>
-               <xsl:otherwise>
-                  <link ref="{id}"><xsl:value-of select="name"/><xsl:value-of select="flatSignature"/></link>
-               </xsl:otherwise>
-            </xsl:choose>
-         </td>
-         <td>
-            <xsl:apply-templates select="lead/node()"/><xsl:text> </xsl:text>
-         </td>
-      </tr>
-   </xsl:template>
-
-    <xsl:template name="memberHeader">
-        <xsl:param name="member"/>
-        <xsl:variable name="parent" select="$member/.."/>
-
-        <!-- The header announces the simple name of the member -->
-        <h1>
-            <xsl:if test="name()='package'">Package </xsl:if>
-            <xsl:if test="name()='class'">Class </xsl:if>
-            <xsl:if test="name()='interface'">Interface </xsl:if>
-            <xsl:if test="name()='method'">Method </xsl:if>
-            <xsl:if test="name()='constructor'">Constructor </xsl:if>
-            <xsl:if test="name()='field'">Field </xsl:if>
-            <xsl:value-of select="name"/>
-        </h1>
-
-        <xsl:if test="name()!='package'">
-            <!-- A signature for the member -->
-            <div class="classSig">
-                <xsl:call-template name="memberSig">
-                    <xsl:with-param name="member" select="."/>
-                </xsl:call-template>
-                
-               <!-- Show the implementing classes and extending interfaces -->
-               <xsl:if test="name()='interface'">
-                  <xsl:variable name="id" select="id"/>
-                  <xsl:for-each select="key('extendsInterface', $id)/..">
-                     <xsl:if test="position() = 1">
-                        <br/><br/>
-                        <xsl:text>// Extended by </xsl:text>
-                     </xsl:if>
-                     <code><link ref="{id}"><xsl:value-of select="name"/></link></code>
-                     <xsl:if test="position() != last()">, </xsl:if>
-                  </xsl:for-each>
-
-                  <xsl:for-each select="key('implementsInterface', $id)/..">
-                     <xsl:if test="position() = 1">
-                        <xsl:if test="not(key('extendsInterface', $id)/..)">
-                           <!-- Extra break needed -->
-                           <br/>
-                        </xsl:if>
-                        <br/>
-                        <xsl:text>// Implemented by </xsl:text>
-                     </xsl:if>
-                     <code><link ref="{id}"><xsl:value-of select="name"/></link></code>
-                     <xsl:if test="position() != last()">, </xsl:if>
-                  </xsl:for-each>
-               </xsl:if>
-
-               <!-- Show the derived classes -->
-               <xsl:if test="name()='class'">
-                  <xsl:variable name="id" select="id"/>
-                  <xsl:if test="name!='Object' and key('extendsClass', $id)">
-                     <br/><br/>
-                     <xsl:text>// Superclass of </xsl:text>
-                     <xsl:for-each select="key('extendsClass', $id)/..">
-                        <code><link ref="{id}"><xsl:value-of select="name"/></link></code>
-                        <xsl:if test="position() != last()">, </xsl:if>
-                     </xsl:for-each>
-                  </xsl:if>
-               </xsl:if>
-            </div>
-        </xsl:if>
-
-    </xsl:template>
-    
-    <xsl:template name="memberSig">
-        <xsl:param name="member"/>
-
-        <xsl:if test="isPublic">public </xsl:if>
-        <xsl:if test="isProtected">protected </xsl:if>
-        <xsl:if test="isPrivate">private </xsl:if>
-        <xsl:if test="isPackagePrivate">/*package*/ </xsl:if>
-        <xsl:if test="isStatic">static </xsl:if>
-        <xsl:if test="isFinal">final </xsl:if>
-        <xsl:if test="isAbstract">abstract </xsl:if>
-        <xsl:if test="isSynchronized">synchronized </xsl:if>
-
-        <xsl:if test="name()='class'">
-            class 
-            <xsl:value-of select="name"/>
-            <xsl:if test="superclass">
-                <br/>extends
-                <link ref="{superclass/@ref}"><xsl:value-of select="superclass"/></link>
-            </xsl:if>
-            <xsl:if test="superinterface">
-                <br/>implements 
-                <xsl:for-each select="superinterface">
-                    <link ref="{@ref}"><xsl:value-of select="."/></link>
-                    <xsl:if test="position() != last()">, </xsl:if>
-                </xsl:for-each>
-            </xsl:if>
-        </xsl:if>
-
-        <xsl:if test="name()='interface'">
-            interface 
-            <b><xsl:value-of select="name"/></b>
-            <xsl:if test="superinterface">
-                <br/>extends 
-                <xsl:for-each select="superinterface">
-                    <link ref="{@ref}"><xsl:value-of select="."/></link>
-                    <xsl:if test="position() != last()">, </xsl:if>
-                </xsl:for-each>
-            </xsl:if>
-        </xsl:if>
-
-        <xsl:if test="name()='field'">
-            <xsl:if test="@ref">
-                <link ref="{@ref}"><xsl:value-of select="type"/></link>
-            </xsl:if>
-            <xsl:if test="not(@ref)">
-                <xsl:value-of select="type"/>
-            </xsl:if>
-            <xsl:text> </xsl:text>
-            <b><xsl:value-of select="name"/></b>
-        </xsl:if>
-
-        <xsl:if test="name()='method' or name()='constructor'">
-            <xsl:if test="type/@ref">
-                <link ref="{type/@ref}"><xsl:value-of select="type"/></link>
-            </xsl:if>
-            <xsl:if test="not(type/@ref)">
-                <xsl:value-of select="type"/>
-            </xsl:if>
-            <b><xsl:text> </xsl:text><xsl:value-of select="name"/></b><xsl:text>(</xsl:text>
-            <xsl:if test="params/param">
-               <xsl:for-each select="params/param">
-                  <nobr>
-                  <xsl:if test="type/@ref">
-                     <link ref="{type/@ref}"><xsl:value-of select="type"/></link> 
-                  </xsl:if>
-                  <xsl:if test="not(type/@ref)">
-                     <xsl:value-of select="type"/> 
-                  </xsl:if>
-                  <xsl:text> </xsl:text>
-                  <xsl:value-of select="name"/> 
-                  <xsl:if test="position() != last()">, </xsl:if>
-                  </nobr>
-               </xsl:for-each>
-            </xsl:if><xsl:text>)</xsl:text>
-            <xsl:if test="throws/throw">
-               <br/>&#160;&#160;&#160;&#160;
-                throws
-                <xsl:for-each select="throws/throw">
-                    <xsl:text> </xsl:text>
-                    <xsl:if test="@ref">
-                        <link ref="{@ref}"><xsl:value-of select="."/></link>
-                    </xsl:if>
-                    <xsl:if test="not(@ref)">
-                        <xsl:value-of select="."/>
-                    </xsl:if>
-                    <xsl:if test="position() != last()">,</xsl:if>
-                </xsl:for-each>
-            </xsl:if>            
-        </xsl:if>
-    </xsl:template>
-</xsl:stylesheet>
diff --git a/2.4/build-tools/doctool/src/javascript-topics.xslt b/2.4/build-tools/doctool/src/javascript-topics.xslt
deleted file mode 100644
index 383ae50..0000000
--- a/2.4/build-tools/doctool/src/javascript-topics.xslt
+++ /dev/null
@@ -1,420 +0,0 @@
-<?xml version="1.0"?>
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-    <xsl:output method="xml" />
-    <xsl:strip-space elements="*"/>
-    
-    <xsl:param name="id"/>
-    <xsl:param name="name"/>
-    <xsl:param name="synopsis"/>
-    <xsl:param name="childIntro"/>
-
-    <xsl:template match="*|node()">
-		<!-- no echo -->
-    </xsl:template>
-
-    <xsl:template match="/">
-        <xsl:apply-templates select="booklet"/>
-    </xsl:template>
-
-    <xsl:template match="booklet">
-        <topic>
-            <xsl:copy-of select="id"/>
-            <title><xsl:value-of select="name"/></title>
-            <synopsis><xsl:copy-of select="lead/node()"/></synopsis>
-            <header><h1><xsl:copy-of select="name/node()"/></h1></header>
-            <body>
-                <!-- Lengthier description -->
-                <xsl:copy-of select="description/node()"/>
-            <xsl:apply-templates select="package">
-                <xsl:sort select="name"/>
-            </xsl:apply-templates>
-            </body>
-        </topic>
-    </xsl:template>
-
-    <xsl:template match="package">
-		<xsl:call-template name="memberTable">
-			<xsl:with-param name="members" select="class"/>
-			<xsl:with-param name="title">Classes</xsl:with-param>
-		</xsl:call-template>
-<!--
-		<xsl:call-template name="memberTable">
-			<xsl:with-param name="members" select="interface"/>
-			<xsl:with-param name="title">Interfaces</xsl:with-param>
-		</xsl:call-template>
--->
-		<xsl:apply-templates select="class">
-			<xsl:sort select="name"/>
-		</xsl:apply-templates>
-    </xsl:template>
-
-    <xsl:template match="class|interface">
-        <topic>
-            <xsl:copy-of select="id"/>
-            <title><xsl:value-of select="name"/></title>
-            <index>
-                <xsl:value-of select="name"/>
-                <xsl:if test="name()='class'"> class</xsl:if>
-                <xsl:if test="name()='interface'"> interface</xsl:if>
-            </index>
-            <synopsis><xsl:copy-of select="lead/node()"/></synopsis>
-            <header>
-                <xsl:call-template name="memberHeader">
-                    <xsl:with-param name="member" select="."/>
-                </xsl:call-template>
-            </header>
-            <body>
-                <!-- Lengthier description -->
-                <xsl:copy-of select="description/node()"/>
-            
-                <xsl:call-template name="memberTable">
-                    <xsl:with-param name="members" select="class"/>
-                    <xsl:with-param name="title">Nested classes</xsl:with-param>
-                </xsl:call-template>
-
-                <xsl:call-template name="memberTable">
-                    <xsl:with-param name="members" select="interface"/>
-                    <xsl:with-param name="title">Nested interfaces</xsl:with-param>
-                </xsl:call-template>
-
-                <xsl:call-template name="memberTable">
-                    <xsl:with-param name="members" select="field"/>
-                    <xsl:with-param name="title">Fields</xsl:with-param>
-                </xsl:call-template>
-
-                <xsl:call-template name="memberTable">
-                    <xsl:with-param name="members" select="constructor"/>
-                    <xsl:with-param name="title">Constructors</xsl:with-param>
-                </xsl:call-template>
-
-                <xsl:call-template name="memberTable">
-                    <xsl:with-param name="members" select="method"/>
-                    <xsl:with-param name="title">Methods</xsl:with-param>
-                </xsl:call-template>
-
-                <!-- See also -->
-                <xsl:if test="tags/link">
-                    <h2>See Also</h2>
-                    <div class="apiSection">
-                        <xsl:for-each select="tags/link">
-                            <xsl:copy-of select="."/>
-                            <xsl:if test="position()!=last()">, </xsl:if> 
-                        </xsl:for-each>
-                    </div>
-                </xsl:if>
-            </body>
-
-            <xsl:apply-templates select="interface">
-                <xsl:sort select="name"/>
-            </xsl:apply-templates>
-
-            <xsl:apply-templates select="class">
-                <xsl:sort select="name"/>
-            </xsl:apply-templates>
-
-            <xsl:apply-templates select="field">
-                <xsl:sort select="name"/>
-            </xsl:apply-templates>
-
-            <xsl:apply-templates select="constructor">
-                <xsl:sort select="name"/>
-            </xsl:apply-templates>
-
-            <xsl:apply-templates select="method">
-                <xsl:sort select="name"/>
-            </xsl:apply-templates>
-        </topic>
-    </xsl:template>
-
-    <xsl:template match="method|constructor">
-        <topic>
-            <id><xsl:value-of select="id"/></id>
-            <title>
-				<xsl:call-template name="emitFlatSig">
-					<xsl:with-param name="methodOrCtor" select="current()"/>
-				</xsl:call-template>
-			</title>
-            <index>
-                <xsl:value-of select="name"/>
-                <xsl:if test="name()='method'"> method</xsl:if>
-                <xsl:if test="name()='constructor'"> constructor</xsl:if>
-            </index>
-            <synopsis><xsl:copy-of select="lead/node()"/></synopsis>
-            <header>
-                <xsl:call-template name="memberHeader">
-                    <xsl:with-param name="member" select="."/>
-                </xsl:call-template>
-            </header>
-            <body>
-                <!-- Lengthier description -->
-                <xsl:copy-of select="description/node()"/>
-
-                <!-- Parameter description -->
-                <xsl:if test="params/param">
-                    <h2>Parameters</h2>
-                    <div class="apiSection">
-                        <dl>
-                        <xsl:for-each select="params/param">
-                            <dt>							
-								<xsl:if test="starts-with(name, '_')">
-									<xsl:value-of select="substring(name,2)"/><xsl:text>?</xsl:text>
-								</xsl:if>
-								<xsl:if test="not(starts-with(name, '_'))">
-									<xsl:value-of select="name"/> 
-								</xsl:if>
-                            </dt>
-                            <dd>
-								<xsl:if test="starts-with(name, '_')">
-									<em>[Optional] </em>
-								</xsl:if>
-                                <xsl:variable name="paramDesc" select="../../tags/param[name=current()/name]/description/node()"/>
-                                <xsl:copy-of select="$paramDesc"/>
-                                <xsl:if test="not($paramDesc)"><xsl:comment>[Missing documentation]</xsl:comment></xsl:if>
-                            </dd>
-                        </xsl:for-each>
-                        </dl>
-                    </div>
-                </xsl:if>
-
-                <!-- Return value description -->
-                <xsl:if test="tags/return">
-                    <h2>Return Value</h2>
-                    <div class="apiSection">
-                        <xsl:copy-of select="tags/return/node()"/>
-                    </div>
-                </xsl:if>
-
-                <!-- See also -->
-                <xsl:if test="tags/link">
-                    <h2>See Also</h2>
-                    <div class="apiSection">
-                        <xsl:for-each select="tags/link">
-                            <xsl:copy-of select="."/>
-                            <xsl:if test="position()!=last()">, </xsl:if> 
-                        </xsl:for-each>
-                    </div>
-                </xsl:if>
-            </body>
-        </topic>
-    </xsl:template>
-
-    <xsl:template match="field">
-        <topic>
-            <id><xsl:value-of select="id"/></id>
-            <title><xsl:value-of select="name"/></title>
-            <index><xsl:value-of select="name"/> field</index>
-            <synopsis><xsl:copy-of select="lead/node()"/></synopsis>
-            <header>
-                <xsl:call-template name="memberHeader">
-                    <xsl:with-param name="member" select="."/>
-                </xsl:call-template>
-            </header>
-            <body>
-                <!-- Lengthier description -->
-                <xsl:copy-of select="description/node()"/>
-            </body>
-        </topic>
-    </xsl:template>
-
-    <xsl:template match="*|node()">
-        <!-- quiet -->
-    </xsl:template>
-    
-    <xsl:template name="memberTable">
-        <xsl:param name="members"/>
-        <xsl:param name="title"/>
-        
-        <xsl:if test="$members">
-            <h2><xsl:value-of select="$title"/></h2>
-            <table class="members" cellspacing="1" cellpadding="0">
-                    <xsl:apply-templates select="$members" mode="memberTableImpl">
-						<xsl:sort case-order="lower-first" data-type="text" order="ascending" select="."/>
-                    </xsl:apply-templates>
-            </table>
-        </xsl:if>
-    </xsl:template>
-
-	<xsl:template match="*" mode="memberTableImpl">
-		<tr>
-			<td width="1%">
-				<nobr>
-					<link ref="{id}">
-						<xsl:call-template name="emitFlatSig">
-							<xsl:with-param name="methodOrCtor" select="current()"/>
-						</xsl:call-template>
-					</link>
-				</nobr>
-			</td>
-			<td><xsl:copy-of select="lead/node()"/><xsl:text> </xsl:text></td>
-		</tr>
-	</xsl:template>
-
-    <xsl:template name="memberHeader">
-        <xsl:param name="member"/>
-        <xsl:variable name="parent" select="$member/.."/>
-
-        <div class="memberHeader">
-
-            <!-- The header announces the simple name of the member -->
-            <h1>
-                <xsl:if test="name()='package'">Package </xsl:if>
-                <xsl:if test="name()='class'">Class </xsl:if>
-                <xsl:if test="name()='interface'">Interface </xsl:if>
-                <xsl:if test="name()='method'">Method </xsl:if>
-                <xsl:if test="name()='constructor'">Constructor </xsl:if>
-                <xsl:if test="name()='field'">Field </xsl:if>
-                <xsl:value-of select="name"/>
-            </h1>
-
-            <xsl:if test="name()!='package'">
-                <!-- Tell where this member lives -->
-<!--
-                <div class="memberOf">
-                    Member of <link ref="{$parent/id}"><xsl:value-of select="$parent/name"/></link>
-                </div>
--->            
-                <!-- A signature for the member -->
-                <code class="signature">
-                    <xsl:call-template name="memberSig">
-                        <xsl:with-param name="member" select="."/>
-                    </xsl:call-template>
-                </code>
-            </xsl:if>
-        </div>
-        
-    </xsl:template>
-    
-    <xsl:template name="memberSig">
-        <xsl:param name="member"/>
-
-<!--
-        <xsl:if test="isPublic">public </xsl:if>
-        <xsl:if test="isProtected">protected </xsl:if>
-        <xsl:if test="isPrivate">private </xsl:if>
-        <xsl:if test="isPackagePrivate">/*package*/ </xsl:if>
-        <xsl:if test="isStatic">static </xsl:if>
-        <xsl:if test="isFinal">final </xsl:if>
-        <xsl:if test="isAbstract">abstract </xsl:if>
-        <xsl:if test="isSynchronized">synchronized </xsl:if>
--->
-        <xsl:if test="name()='class'">
-            class 
-            <b><xsl:value-of select="name"/></b>
-<!--
-            <xsl:if test="superclass[@ref != 'java.lang.Object']">
-                <br/>derives from 
-                <link ref="{superclass/@ref}"><xsl:value-of select="superclass"/></link>
-            </xsl:if>
--->
-<!--            
-            <xsl:if test="superinterface">
-                <br/>can be used as 
-                <xsl:for-each select="superinterface">
-                    <link ref="{@ref}"><xsl:value-of select="."/></link>
-                    <xsl:if test="position() != last()">, </xsl:if>
-                </xsl:for-each>
-            </xsl:if>
--->
-        </xsl:if>
-<!--        
-        <xsl:if test="name()='interface'">
-            interface 
-            <b><xsl:value-of select="name"/></b>
-            <xsl:if test="superinterface">
-                <br/>extends 
-                <xsl:for-each select="superinterface">
-                    <link ref="{@ref}"><xsl:value-of select="."/></link>
-                    <xsl:if test="position() != last()">, </xsl:if>
-                </xsl:for-each>
-            </xsl:if>
-        </xsl:if>
--->
-        <xsl:if test="name()='field'">
-            <xsl:if test="@ref">
-                <link ref="{@ref}"><xsl:value-of select="type"/></link>
-            </xsl:if>
-            <xsl:if test="not(@ref)">
-                <xsl:value-of select="type"/>
-            </xsl:if>
-            <xsl:text> </xsl:text>
-            <b><xsl:value-of select="name"/></b>
-        </xsl:if>
-
-        <xsl:if test="name()='method' or name()='constructor'">
-<!--        
-            <xsl:if test="type/@ref">
-                <link ref="{type/@ref}"><xsl:value-of select="type"/></link>
-            </xsl:if>
-            <xsl:if test="not(type/@ref)">
-                <xsl:value-of select="type"/>
-            </xsl:if>
--->
-            <b><xsl:value-of select="name"/></b><xsl:text>(</xsl:text>
-            <xsl:if test="params/param">
-					<xsl:for-each select="params/param">
-<!--						   
-						<div style="margin-left: 2em">
-						   <nobr>
-							<xsl:if test="type/@ref">
-								<link ref="{type/@ref}"><xsl:value-of select="type"/></link> 
-							</xsl:if>
-							<xsl:if test="not(type/@ref)">
-								<xsl:value-of select="type"/> 
-							</xsl:if>
-							<xsl:text> </xsl:text>
--->
-							<xsl:if test="starts-with(name, '_')">
-								<xsl:value-of select="substring(name,2)"/><xsl:text>?</xsl:text>
-							</xsl:if>
-							<xsl:if test="not(starts-with(name, '_'))">
-								<xsl:value-of select="name"/> 
-							</xsl:if>
-							<xsl:if test="position() != last()">, </xsl:if>
-<!--							
-							</nobr>
-						</div>
--->
-					</xsl:for-each>
-            </xsl:if>
-            <xsl:text>)</xsl:text>
-            <xsl:if test="throws/throw">
-                <br/>
-                throws
-                <xsl:for-each select="throws/throw">
-                    <xsl:text> </xsl:text>
-                    <xsl:if test="@ref">
-                        <link ref="{@ref}"><xsl:value-of select="."/></link>
-                    </xsl:if>
-                    <xsl:if test="not(@ref)">
-                        <xsl:value-of select="."/>
-                    </xsl:if>
-                    <xsl:if test="position() != last()">,</xsl:if>
-                </xsl:for-each>
-            </xsl:if>            
-        </xsl:if>
-    </xsl:template>
-
-	<xsl:template name="emitFlatSig">
-		<xsl:param name="methodOrCtor"/>
-		<xsl:value-of select="$methodOrCtor/name"/>
-		<xsl:text>(</xsl:text>
-			<xsl:for-each select="$methodOrCtor/params/param">
-				<xsl:call-template name="emitParamName">
-					<xsl:with-param name="param" select="."/>
-				</xsl:call-template>
-                    <xsl:if test="position() != last()">, </xsl:if>
-			</xsl:for-each>
-		<xsl:text>)</xsl:text>
-	</xsl:template>
-
-	<xsl:template name="emitParamName">
-		<xsl:param name="param"/>
-		<xsl:if test="starts-with($param/name, '_')">
-			<xsl:value-of select="substring($param/name,2)"/><xsl:text>?</xsl:text>
-		</xsl:if>
-		<xsl:if test="not(starts-with($param/name, '_'))">
-			<xsl:value-of select="$param/name"/> 
-		</xsl:if>
-	</xsl:template>
-    
-</xsl:stylesheet>
diff --git a/2.4/build-tools/doctool/src/topics-hhc.xslt b/2.4/build-tools/doctool/src/topics-hhc.xslt
deleted file mode 100644
index 8ce3bd3..0000000
--- a/2.4/build-tools/doctool/src/topics-hhc.xslt
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0"?>
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-    <xsl:output method="html"/>
-    <xsl:template match="/">
-        <html>
-            <body>
-                <ul>
-                    <xsl:apply-templates select="topic">
-                        <xsl:sort select="order" data-type="number" order="descending"/>
-                    </xsl:apply-templates>
-                </ul>
-            </body>
-        </html>
-    </xsl:template>
-    
-    <xsl:template match="topic">
-        <li>
-            <object type="text/sitemap">
-                <xsl:element name="param">
-                    <xsl:attribute name="name">Name</xsl:attribute>
-                    <xsl:attribute name="value"><xsl:value-of select="title" /></xsl:attribute>
-                </xsl:element>
-                <xsl:element name="param">
-                    <xsl:attribute name="name">Local</xsl:attribute>
-                    <xsl:attribute name="value"><xsl:value-of select="id" />.html</xsl:attribute>
-                </xsl:element>
-            </object>
-        </li>
-        <xsl:if test="topic">
-            <ul>
-                <xsl:apply-templates select="topic" />
-            </ul>
-        </xsl:if>
-    </xsl:template>
-
-    <!-- If a topic doesn't have a title, we pretend it isn't there and hoist its children up in its place -->
-    <xsl:template match="topic[not(title)]">
-        <xsl:apply-templates select="topic">
-            <xsl:sort select="order" data-type="number" order="descending"/>        
-        </xsl:apply-templates>
-    </xsl:template>
-</xsl:stylesheet>
diff --git a/2.4/build-tools/doctool/src/topics-hhk.xslt b/2.4/build-tools/doctool/src/topics-hhk.xslt
deleted file mode 100644
index ada0d3b..0000000
--- a/2.4/build-tools/doctool/src/topics-hhk.xslt
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0"?>
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-    <xsl:output method="html"/>
-    <xsl:template match="/">
-        <html>
-            <body>
-                <ul>
-                    <xsl:for-each select="//topic/index">
-                        <xsl:sort select="."/>
-                        <li>
-                            <object type="text/sitemap">
-                                <xsl:element name="param">
-                                    <xsl:attribute name="name">Name</xsl:attribute>
-                                    <xsl:attribute name="value">
-                                        <xsl:value-of select="." />
-                                    </xsl:attribute>
-                                </xsl:element>
-                                <xsl:element name="param">
-                                    <xsl:attribute name="name">Local</xsl:attribute>
-                                    <xsl:attribute name="value"><xsl:value-of select="../id" />.html</xsl:attribute>
-                                </xsl:element>
-                            </object>
-                        </li>
-                    </xsl:for-each>
-                </ul>
-            </body>
-        </html>
-    </xsl:template>
-</xsl:stylesheet>
diff --git a/2.4/build-tools/doctool/src/topics-hhp.xslt b/2.4/build-tools/doctool/src/topics-hhp.xslt
deleted file mode 100644
index 980a1eb..0000000
--- a/2.4/build-tools/doctool/src/topics-hhp.xslt
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0"?>
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-    <xsl:output method="text"/>
-
-    <xsl:param name="title"/>
-    <xsl:param name="filebase"/>
-    <xsl:param name="chm"><xsl:value-of select="$filebase"/>.chm</xsl:param>
-    <xsl:param name="hhc"><xsl:value-of select="$filebase"/>.hhc</xsl:param>
-    <xsl:param name="hhk"><xsl:value-of select="$filebase"/>.hhk</xsl:param>
-    <xsl:param name="css"><xsl:value-of select="$filebase"/>.css</xsl:param>
-    <xsl:template match="/">
-[Options]
-Compatibility = 1.1 Or later
-Compiled file = <xsl:value-of select="$chm"/>
-Contents file = <xsl:value-of select="$hhc"/>
-Default Font = Arial, 9, 0
-Default Window=Main
-Display compile notes=No
-Display compile progress=No
-Error log file=error.log
-Full-text search=Yes
-Index file = <xsl:value-of select="$hhk"/>
-Language=0x409 English (United States)
-Title=<xsl:value-of select="$title"/>
-
-[Windows]
-Main=&quot;<xsl:value-of select="$title"/>&quot;,&quot;<xsl:value-of select="$hhc"/>&quot;,&quot;<xsl:value-of select="$hhk"/>&quot;,,,,,,,0x62520,,0x304c,[10,10,610,510],,,,,,,0
-
-[Files]
-<xsl:for-each select="//topic[title]">
-<xsl:sort select="order" data-type="number" order="descending"/>        
-<xsl:value-of select="id"/>.html
-</xsl:for-each>
-    </xsl:template>
-
-</xsl:stylesheet>
diff --git a/2.4/build-tools/doctool/src/topics-htmls.xslt b/2.4/build-tools/doctool/src/topics-htmls.xslt
deleted file mode 100644
index 80a843e..0000000
--- a/2.4/build-tools/doctool/src/topics-htmls.xslt
+++ /dev/null
@@ -1,540 +0,0 @@
-<?xml version="1.0"?>
-
-<!--
-Copyright 2007 Google Inc.
-
-Licensed under the Apache License, Version 2.0 (the "License"); you may not
-use this file except in compliance with the License. You may obtain a copy of
-the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-License for the specific language governing permissions and limitations under
-the License.
--->
-<xsl:stylesheet version="1.0"
-  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-  <xsl:output method="html" />
-  <xsl:strip-space elements="*" />
-  <xsl:key name="topicSearch" match="//topic" use="id" />
-  <xsl:param name="css" />
-  <xsl:param name="title" />
-  <xsl:template match="/">
-    @FILE
-    <xsl:apply-templates select="//topic" />
-  </xsl:template>
-  <xsl:template name="gen-side">
-    <div id="side">
-
-      <div id="menu">
-
-        <h4>
-          <a href="http://code.google.com/webtoolkit/">
-            <xsl:text>Google Web Toolkit</xsl:text>
-          </a>
-        </h4>
-
-        <ul>
-          <li>
-            <a href="http://code.google.com/webtoolkit/download.html">
-              <xsl:text>Download GWT</xsl:text>
-            </a>
-          </li>
-        </ul>
-
-        <!-- Section: Product Overview -->
-        <ul>
-          <li>
-            <a href="http://code.google.com/webtoolkit/overview.html">
-              <xsl:text>Product Overview</xsl:text>
-            </a>
-          </li>
-          <li>
-            <a
-              href="./gettingstarted.html">
-              <xsl:text>Getting Started Guide</xsl:text>
-            </a>
-          </li>
-          <li>
-            <a
-              href="http://code.google.com/webtoolkit/documentation/examples/">
-              <xsl:text>Example Projects</xsl:text>
-            </a>
-          </li>
-        </ul>
-
-        <!-- Section: Developer Guide -->
-        <ul>
-
-          <!-- If the page is inside the dev guide, show the link as selected -->
-          <li>
-            <xsl:element name="a">
-              <xsl:if test="contains(id, 'com.google.gwt.doc')">
-                <xsl:attribute name="class">
-                  <xsl:text>selected</xsl:text>
-                </xsl:attribute>
-              </xsl:if>
-              <xsl:variable name="href">
-                ./com.google.gwt.doc.DeveloperGuide.html
-              </xsl:variable>
-              <xsl:attribute name="href">
-                <xsl:value-of select="normalize-space($href)" />
-              </xsl:attribute>
-              <xsl:text>Developer Guide</xsl:text>
-            </xsl:element>
-          </li>
-
-          <!-- If the page is inside the GWT class ref, show the link as selected -->
-          <li>
-            <xsl:element name="a">
-              <xsl:if
-                test="not(contains(id, 'com.google.gwt.doc.')) and (contains(id, 'com.google.gwt.') or contains(id, 'java.') or id = 'gwt' or id = 'jre')">
-                <xsl:attribute name="class">
-                  <xsl:text>selected</xsl:text>
-                </xsl:attribute>
-              </xsl:if>
-              <xsl:variable name="href">./gwt.html</xsl:variable>
-              <xsl:attribute name="href">
-                <xsl:value-of select="normalize-space($href)" />
-              </xsl:attribute>
-              <xsl:text>Class Reference</xsl:text>
-            </xsl:element>
-          </li>
-          <li>
-            <a href="http://code.google.com/webtoolkit/issues/">
-              <xsl:text>Issue Tracking</xsl:text>
-            </a>
-          </li>
-          <li>
-            <a
-              href="http://groups.google.com/group/Google-Web-Toolkit">
-              <xsl:text>Developer Forum</xsl:text>
-            </a>
-          </li>
-        </ul>
-
-        <!-- Section: Important uncategorized links -->
-        <ul>
-          <li>
-            <a href="http://googlewebtoolkit.blogspot.com/">
-              <xsl:text>GWT Blog</xsl:text>
-            </a>
-          </li>
-          <li>
-            <a href="http://code.google.com/webtoolkit/faq.html">
-              <xsl:text>GWT FAQ</xsl:text>
-            </a>
-          </li>
-          <li>
-            <a
-              href="http://code.google.com/webtoolkit/makinggwtbetter.html">
-              <xsl:text>Making GWT Better</xsl:text>
-            </a>
-          </li>
-        </ul>
-
-        <ul>
-          <li>
-            <a
-              href="http://code.google.com/webtoolkit/thirdparty.html">
-              <xsl:text>Third Party Tools</xsl:text>
-            </a>
-          </li>
-        </ul>
-
-      </div>
-
-      <div id="search">
-        <form id="searchbox_015986126177484454297:pfmwlvdl42y" action="http://www.google.com/cse">
-          <input type="hidden" name="cx" value="015986126177484454297:pfmwlvdl42y" />
-          <input type="hidden" name="cof" value="FORID:0" />
-          <div class="header">Search Google Code:</div>
-          <input name="q" type="text" size="20" />
-          <input type="submit" name="sa" value="Search" /><br/>
-        </form>
-        <script type="text/javascript" src="http://google.com/coop/cse/brand?form=searchbox_015986126177484454297:pfmwlvdl42y"></script>
-      </div>
-      
-    </div>
-  </xsl:template>
-
-  <xsl:template name="gen-header">
-    <div id="gaia">&#160;</div>
-    <div id="header">
-      <div id="logo">
-        <a href="http://code.google.com/">
-          <img src="http://code.google.com/images/code_sm.png"
-            alt="Google" />
-        </a>
-      </div>
-      <!-- The title for the entire docset -->
-      <div id="title">
-        <xsl:value-of select="$title" />
-      </div>
-      <div id="breadcrumbs">
-        <div id="nextprev">
-          <xsl:call-template name="emitPrevTopic">
-            <xsl:with-param name="start" select="." />
-          </xsl:call-template>
-          <xsl:text></xsl:text>
-          <xsl:call-template name="emitNextTopic">
-            <xsl:with-param name="start" select="." />
-          </xsl:call-template>
-        </div>
-        <span class="item">
-          <a href="http://code.google.com/">
-            <xsl:text>Google Code Home</xsl:text>
-          </a>
-        </span>
-        &gt;
-        <span class="item">
-          <a href="http://code.google.com/webtoolkit/">
-            <xsl:text>Google Web Toolkit</xsl:text>
-          </a>
-        </span>
-        &gt;
-        <!-- The topic location -->
-        <xsl:if test="location">
-          <xsl:apply-templates select="location/@*|location/node()" />
-        </xsl:if>
-      </div>
-    </div>
-  </xsl:template>
-
-  <xsl:template name="emitPrevTopic">
-    <xsl:param name="start" />
-    <xsl:variable name="prev"
-      select="$start/preceding-sibling::topic[position()=1]" />
-    <xsl:variable name="parentLastChild" select="$prev" />
-    <xsl:variable name="parent" select="$start/parent::topic" />
-    <xsl:choose>
-      <!-- if there's a previous sibling, use "last deepest child" algorithm -->
-      <xsl:when test="$prev/topic">
-        <xsl:call-template name="emitDeepestPriorChild">
-          <xsl:with-param name="start" select="$prev" />
-        </xsl:call-template>
-      </xsl:when>
-      <!-- if there's a previous sibling without a child, use it -->
-      <xsl:when test="$prev">
-        <nobr>
-          <a href="{$prev/id}.html">&#171; prev</a>
-        </nobr>
-      </xsl:when>
-      <!-- if there's a parent, use it -->
-      <xsl:when test="$parent">
-        <nobr>
-          <a href="{$parent/id}.html">&#171; prev</a>
-        </nobr>
-      </xsl:when>
-      <xsl:otherwise>
-        <nobr style="visibility:hidden">&#171; prev</nobr>
-      </xsl:otherwise>
-    </xsl:choose>
-  </xsl:template>
-
-  <xsl:template name="emitDeepestPriorChild">
-    <xsl:param name="start" />
-    <xsl:choose>
-      <xsl:when test="$start/topic">
-        <xsl:call-template name="emitDeepestPriorChild">
-          <xsl:with-param name="start"
-            select="$start/topic[position()=last()]" />
-        </xsl:call-template>
-      </xsl:when>
-      <xsl:otherwise>
-        <nobr>
-          <a href="{$start/id}.html">&#171; prev</a>
-        </nobr>
-      </xsl:otherwise>
-    </xsl:choose>
-  </xsl:template>
-
-  <xsl:template name="emitNextTopic">
-    <xsl:param name="start" />
-    <xsl:variable name="child" select="$start/topic[position()=1]" />
-    <xsl:variable name="next"
-      select="$start/following-sibling::topic[position()=1]" />
-    <xsl:variable name="parentNext"
-      select="$start/ancestor::topic[following-sibling::topic]/following-sibling::topic" />
-    <xsl:choose>
-      <!-- if there's a first child, use it -->
-      <xsl:when test="$child">
-        <nobr>
-          <a href="{$child/id}.html">next &#187;</a>
-        </nobr>
-      </xsl:when>
-      <!-- if there's a next sibling, use it -->
-      <xsl:when test="$next">
-        <nobr>
-          <a href="{$next/id}.html">next &#187;</a>
-        </nobr>
-      </xsl:when>
-      <!-- find the first parent that has a next sibling -->
-      <xsl:when test="$parentNext">
-        <nobr>
-          <a href="{$parentNext/id}.html">next &#187;</a>
-        </nobr>
-      </xsl:when>
-      <xsl:otherwise>
-        <nobr style="visibility:hidden">next &#187;</nobr>
-      </xsl:otherwise>
-    </xsl:choose>
-  </xsl:template>
-
-  <!-- Only topics that have titles get pulled in -->
-  <xsl:template match="topic[title]">
-    <xsl:variable name="filedelim">
-      <xsl:text>&#10;</xsl:text>
-      <xsl:text>@FILE &#32;</xsl:text>
-      <xsl:value-of select="normalize-space(id)" />
-      <xsl:text>.html</xsl:text>
-      <xsl:text>&#10;</xsl:text>
-    </xsl:variable>
-    <xsl:value-of select="$filedelim" />
-    <html xmlns="http://www.w3.org/1999/xhtml">
-      <head>
-        <title>
-          Google Web Toolkit
-          <xsl:if test="title">
-            -
-            <xsl:value-of select="title" />
-          </xsl:if>
-        </title>
-        <meta http-equiv="content-type"
-          content="text/html; charset=utf-8" />
-        <link href="../css/base.css" rel="stylesheet" type="text/css" />
-        <link href="./doc.css" rel="stylesheet" type="text/css" />
-        <link href="../css/print.css" rel="stylesheet" media="print"
-          type="text/css" />
-      </head>
-      <body>
-        <xsl:call-template name="gen-header" />
-        <xsl:call-template name="gen-side" />
-        <div id="body">
-          <!-- If there is a header, prefer it to the title -->
-          <xsl:choose>
-            <xsl:when test="header">
-              <xsl:apply-templates select="header/@*|header/node()" />
-            </xsl:when>
-            <xsl:otherwise>
-              <!-- The title for this topic -->
-              <h1>
-                <xsl:value-of select="title" />
-              </h1>
-            </xsl:otherwise>
-          </xsl:choose>
-          <!-- The topic body -->
-          <xsl:if test="body">
-            <xsl:apply-templates select="body/@*|body/node()" />
-          </xsl:if>
-          <!-- Tips -->
-          <xsl:for-each select="tip">
-            <div class="tipContainer">
-              <div class="tipCallout">Tip</div>
-              <div class="tipBody">
-                <xsl:apply-templates select="node()" />
-              </div>
-            </div>
-          </xsl:for-each>
-          
-          <!-- Links to child topics -->
-		  <xsl:if test="childIntro">
-		    <xsl:if test="childIntro/text()">
-		      <h2>
-		        <xsl:value-of select="childIntro/text()" />
-		      </h2>
-		    </xsl:if>
-		    
-		    <xsl:if test="topic">
-		    	<ul class="childToc">
-		            <xsl:for-each select="topic">
-		            	<li>
-		            	
-				          <div class="heading">
-				            <xsl:call-template name="makeLink">
-				              <xsl:with-param name="linkText"
-				                select="title/node()" />
-				              <xsl:with-param name="linkTarget" select="." />
-				            </xsl:call-template>
-				          </div>
-				          
-				          <xsl:if test="synopsis">
-				            <div class="synopsis">
-				              <xsl:apply-templates select="synopsis/node()" />
-				            </div>
-				          </xsl:if>
-
-				          <xsl:if test="topic">
-				            <ul>
-			                  <xsl:for-each select="topic">
-			                  	<li>
-						            <xsl:call-template name="makeLink">
-						              <xsl:with-param name="linkText"
-						                select="title/node()" />
-						              <xsl:with-param name="linkTarget" select="." />
-						            </xsl:call-template>
-						            <xsl:if test="position() != last()">,</xsl:if>
-						      	</li>
-			  	              </xsl:for-each>
-				            </ul>
-				          </xsl:if>
-
-						</li>
-			          
-		            </xsl:for-each>
-				</ul>
-			</xsl:if>
-		  </xsl:if>
-          
-          <!-- See also links -->
-          <xsl:if test="seeAlso/link">
-            <div class="topicSeeAlso">
-              <h2>Related topics</h2>
-              <xsl:for-each select="seeAlso/link">
-                <xsl:apply-templates select="." />
-                <xsl:if test="position()!=last()">, </xsl:if>
-              </xsl:for-each>
-            </div>
-          </xsl:if>
-        </div>
-
-        <div id="footer">
-          &#169;2007 Google
-          <span class="noprint">
-            -
-            <a href="http://www.google.com/">
-              <xsl:text>Google Home</xsl:text>
-            </a>
-            -
-            <a href="http://www.google.com/jobs/">
-              <xsl:text>We're Hiring</xsl:text>
-            </a>
-            -
-            <a href="http://www.google.com/privacy.html">
-              <xsl:text>Privacy Policy</xsl:text>
-            </a>
-            -
-            <a href="http://www.google.com/terms_of_service.html">
-              <xsl:text>Terms of Service</xsl:text>
-            </a>
-            -
-            <a href="mailto:code@google.com">
-              <xsl:text>Contact Us</xsl:text>
-            </a>
-          </span>
-
-          <div id="license"
-            style="text-align: center; margin: 1em 0em 1em 0em">
-            Except as otherwise
-            <a
-              href="http://code.google.com/policies.html#restrictions">
-              <xsl:text>noted</xsl:text>
-            </a>
-            <xsl:text>, the content of this &#32;</xsl:text>
-
-            <xsl:text>page is licensed under the &#32;</xsl:text>
-            <a rel="license"
-              href="http://creativecommons.org/licenses/by/2.5/">
-              <xsl:variable name="cclicense">
-                Creative Commons Attribution 2.5 License
-              </xsl:variable>
-              <xsl:value-of select="normalize-space($cclicense)" />
-            </a>
-            <xsl:text>.</xsl:text>
-            <xsl:text disable-output-escaping="yes">
-              <![CDATA[<!--]]>
-            </xsl:text>
-            <rdf:RDF xmlns="http://web.resource.org/cc/"
-              xmlns:dc="http://purl.org/dc/elements/1.1/"
-              xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
-              <Work rdf:about="">
-                <license
-                  rdf:resource="http://creativecommons.org/licenses/by/2.5/" />
-              </Work>
-              <License
-                rdf:about="http://creativecommons.org/licenses/by/2.5/">
-                <permits
-                  rdf:resource="http://web.resource.org/cc/Reproduction" />
-                <permits
-                  rdf:resource="http://web.resource.org/cc/Distribution" />
-                <requires
-                  rdf:resource="http://web.resource.org/cc/Notice" />
-                <requires
-                  rdf:resource="http://web.resource.org/cc/Attribution" />
-                <permits
-                  rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
-              </License>
-            </rdf:RDF>
-            <xsl:text disable-output-escaping="yes">
-              <![CDATA[-->]]>
-            </xsl:text>
-          </div>
-        </div>
-
-        <!-- analytics -->
-        <script src="https://ssl.google-analytics.com/urchin.js"
-          type="text/javascript" />
-        <script type="text/javascript">
-          _uacct="UA-18071-1"; _uanchor=1; urchinTracker();
-        </script>
-      </body>
-    </html>
-  </xsl:template>
-  
-  <xsl:template match="@*|node()">
-    <xsl:copy>
-      <xsl:apply-templates select="@*|node()" />
-    </xsl:copy>
-  </xsl:template>
-
-  <xsl:template match="link">
-    <xsl:variable name="testLinkBase"
-      select="substring-before(@ref, &quot;#&quot;)" />
-    <xsl:variable name="linkBase">
-      <xsl:if test="string-length($testLinkBase) != 0">
-        <xsl:value-of select="$testLinkBase" />
-      </xsl:if>
-      <xsl:if test="string-length($testLinkBase) = 0">
-        <xsl:value-of select="@ref" />
-      </xsl:if>
-    </xsl:variable>
-    <xsl:call-template name="makeLink">
-      <xsl:with-param name="linkRef" select="@ref" />
-      <xsl:with-param name="linkText" select="node()" />
-      <xsl:with-param name="linkTarget"
-        select="key('topicSearch', $linkBase)" />
-    </xsl:call-template>
-  </xsl:template>
-
-  <xsl:template name="makeLink">
-    <!-- This only becomes a hyperlink if the cross-ref can be resolved -->
-    <xsl:param name="linkRef" />
-    <xsl:param name="linkText" />
-    <xsl:param name="linkTarget" />
-    <xsl:choose>
-      <xsl:when test="$linkTarget">
-        <xsl:variable name="extra"
-          select="substring-after($linkRef, &quot;#&quot;)" />
-        <xsl:element name="a">
-          <xsl:attribute name="href">
-            <xsl:value-of select="$linkTarget/id" />
-            <xsl:text>.html</xsl:text>
-            <xsl:if test="string-length($extra) != 0">
-              <xsl:text>#</xsl:text>
-              <xsl:value-of select="$extra" />
-            </xsl:if>
-          </xsl:attribute>
-          <xsl:apply-templates select="$linkText" />
-        </xsl:element>
-      </xsl:when>
-      <xsl:otherwise>
-        <!-- plain text -->
-        <xsl:apply-templates select="$linkText" />
-      </xsl:otherwise>
-    </xsl:choose>
-  </xsl:template>
-
-</xsl:stylesheet>
diff --git a/2.4/build-tools/doctool/src/topics-index.xslt b/2.4/build-tools/doctool/src/topics-index.xslt
deleted file mode 100644
index 0620bc8..0000000
--- a/2.4/build-tools/doctool/src/topics-index.xslt
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0"?>
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-	<xsl:output method="html"/>
-	<xsl:param name="title"/>
-	<xsl:template match="/">
-		<html>
-			<head>
-				<link rel="stylesheet" href="help.css" type="text/css"/>
-			</head>
-			<body style="margin: 0.5em">
-				<h1>
-					<xsl:value-of select="$title"/>
-				</h1>
-				<xsl:apply-templates select="//topic[index]">
-					<xsl:sort select="index" order="ascending"/>
-				</xsl:apply-templates>
-			</body>
-		</html>
-	</xsl:template>
-	<xsl:template match="topic[index]">
-		<div>
-			<xsl:value-of select="index"/>
-			<xsl:text> - </xsl:text>
-			<xsl:element name="a">
-				<xsl:attribute name="href"><xsl:value-of select="id"/>.html</xsl:attribute>
-				<xsl:attribute name="class">tocLink</xsl:attribute>
-				<xsl:value-of select="title"/>
-			</xsl:element>
-		</div>
-	</xsl:template>
-</xsl:stylesheet>
diff --git a/2.4/build-tools/doctool/src/topics-toc.xslt b/2.4/build-tools/doctool/src/topics-toc.xslt
deleted file mode 100644
index 70d285e..0000000
--- a/2.4/build-tools/doctool/src/topics-toc.xslt
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0"?>
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-	<xsl:output method="html"/>
-	<xsl:param name="title"/>
-	<xsl:template match="/">
-		<html>
-			<head>
-				<link rel="stylesheet" href="help.css" type="text/css"/>
-			</head>
-			<body style="margin: 0.5em">
-				<h1>
-					<xsl:value-of select="$title"/>
-				</h1>
-				<xsl:apply-templates select="/topics/topic">
-					<xsl:sort select="order" data-type="number" order="descending"/>
-				</xsl:apply-templates>
-			</body>
-		</html>
-	</xsl:template>
-
-	<xsl:template match="topic">
-		<div style="margin-left: 2%">
-			<xsl:element name="a">
-				<xsl:attribute name="href"><xsl:value-of select="id"/>.html</xsl:attribute>
-				<xsl:attribute name="class">tocLink</xsl:attribute>
-				<xsl:value-of select="title"/>
-			</xsl:element>
-			<xsl:apply-templates select="topic"/>
-		</div>
-	</xsl:template>
-</xsl:stylesheet>
diff --git a/2.4/build-tools/doctool/src/topics.xsd b/2.4/build-tools/doctool/src/topics.xsd
deleted file mode 100644
index 7f8342f..0000000
--- a/2.4/build-tools/doctool/src/topics.xsd
+++ /dev/null
@@ -1,104 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- edited with XMLSpy v2005 rel. 3 U (http://www.altova.com) by Bruce Johnson (private) -->
-<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
-	<xs:element name="topics">
-		<xs:complexType>
-			<xs:sequence>
-				<xs:element ref="topic" minOccurs="0" maxOccurs="unbounded"/>
-			</xs:sequence>
-		</xs:complexType>
-	</xs:element>
-	<xs:element name="topic">
-		<xs:annotation>
-			<xs:documentation>Topic element; can be freely nested</xs:documentation>
-		</xs:annotation>
-		<xs:complexType>
-			<xs:sequence>
-				<xs:sequence minOccurs="0">
-					<xs:element name="id" type="xs:string">
-						<xs:annotation>
-							<xs:documentation>The id for this topic, which should be unique for the entire library</xs:documentation>
-						</xs:annotation>
-					</xs:element>
-					<xs:element name="order" type="xs:int" minOccurs="0">
-						<xs:annotation>
-							<xs:documentation>An arbitrary number used to indicate sorting order</xs:documentation>
-						</xs:annotation>
-					</xs:element>
-					<xs:element name="title" type="xs:string">
-						<xs:annotation>
-							<xs:documentation>A simple title for the topic</xs:documentation>
-						</xs:annotation>
-					</xs:element>
-					<xs:element name="index" type="xs:string" minOccurs="0" maxOccurs="unbounded">
-						<xs:annotation>
-							<xs:documentation>A word or phrase to include in the documentation index that points to this topic</xs:documentation>
-						</xs:annotation>
-					</xs:element>
-					<xs:element name="synopsis" minOccurs="0">
-						<xs:annotation>
-							<xs:documentation>A short (one phrase or sentence) that summaries the point of the topic</xs:documentation>
-						</xs:annotation>
-						<xs:complexType mixed="true">
-							<xs:sequence>
-								<xs:any namespace="##any" processContents="skip" minOccurs="0" maxOccurs="unbounded"/>
-							</xs:sequence>
-						</xs:complexType>
-					</xs:element>
-					<xs:element name="header">
-						<xs:annotation>
-							<xs:documentation>HTML header that may get special treatment in the published documentation</xs:documentation>
-						</xs:annotation>
-						<xs:complexType mixed="true">
-							<xs:sequence>
-								<xs:any namespace="##any" processContents="skip" minOccurs="0" maxOccurs="unbounded"/>
-							</xs:sequence>
-						</xs:complexType>
-					</xs:element>
-					<xs:element name="body">
-						<xs:annotation>
-							<xs:documentation>HTML body that constitutes the primary content of the topic</xs:documentation>
-						</xs:annotation>
-						<xs:complexType mixed="true">
-							<xs:sequence>
-								<xs:any namespace="##any" processContents="skip" minOccurs="0" maxOccurs="unbounded"/>
-							</xs:sequence>
-						</xs:complexType>
-					</xs:element>
-					<xs:element name="seeAlso" minOccurs="0" maxOccurs="unbounded">
-						<xs:annotation>
-							<xs:documentation>A list of related cross-ref links</xs:documentation>
-						</xs:annotation>
-						<xs:complexType>
-							<xs:sequence>
-								<xs:element name="link" minOccurs="0" maxOccurs="unbounded">
-									<xs:annotation>
-										<xs:documentation>Links to topics that are not necessarily child topics</xs:documentation>
-									</xs:annotation>
-									<xs:complexType mixed="true">
-										<xs:sequence minOccurs="0" maxOccurs="unbounded">
-											<xs:any namespace="##any" processContents="skip">
-												<xs:annotation>
-													<xs:documentation>HTML representing the link caption</xs:documentation>
-												</xs:annotation>
-											</xs:any>
-										</xs:sequence>
-										<xs:attribute name="ref">
-											<xs:annotation>
-												<xs:documentation>The target id of a topic anywhere in the library; if absent, it a link that could not be resolved</xs:documentation>
-											</xs:annotation>
-										</xs:attribute>
-									</xs:complexType>
-								</xs:element>
-							</xs:sequence>
-						</xs:complexType>
-					</xs:element>
-				</xs:sequence>
-				<xs:sequence>
-					<xs:element name="childIntro" minOccurs="0"/>
-					<xs:element ref="topic" minOccurs="0" maxOccurs="unbounded"/>
-				</xs:sequence>
-			</xs:sequence>
-		</xs:complexType>
-	</xs:element>
-</xs:schema>
diff --git a/2.4/build-tools/drtool/BuildGlobalTOC.py b/2.4/build-tools/drtool/BuildGlobalTOC.py
deleted file mode 100644
index 6600c1e..0000000
--- a/2.4/build-tools/drtool/BuildGlobalTOC.py
+++ /dev/null
@@ -1,73 +0,0 @@
-#!/usr/bin/env python
-#
-# Copyright 2007 Google Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-"""
-Routines for constructing a TOCNode from a file on disk.
-"""
-
-from TOCNode import TOCNode
-import re
-
-def BuildTOC(toc_filename, displayname):
-  """This will return a list of toplevel TOCNodes, each of which may have
-  nested children."""
-
-  infile = open(toc_filename)
-  bytes = infile.read()
-  lines = bytes.split("\n")
-
-  out = TOCNode(displayname)
-  parentstack = [(out, -1)]
-  previndent = 0
-  prevnode = None
-
-  for line in lines:
-    if line.startswith("#"): continue
-
-    indentlevel = line.find("*")
-    if -1 == indentlevel: continue
-
-    postindent = line[indentlevel:]
-    poststar = postindent[2:]
-
-    if poststar.startswith('['):
-      splitted  = re.split("[\[\] ]", poststar)
-      wikiWord = splitted[1]
-      caption = " ".join(splitted[2:])
-      caption = caption.replace("&", "and")
-      caption = caption.strip()
-
-      tocnode = TOCNode(caption, wikiWord)
-    else:
-      caption = poststar
-      caption = caption.replace("&", "and")
-      caption = caption.strip()
-
-      tocnode = TOCNode(caption)
-
-    if indentlevel > previndent:
-      if prevnode:
-        parentstack.append((prevnode, previndent))
-    elif indentlevel < previndent:
-      while (parentstack and parentstack[-1][1] >= indentlevel ):
-        parentstack.pop()
-
-    parentstack[-1][0].addChild(tocnode)
-
-    prevnode = tocnode
-    previndent = indentlevel
-  return out.AsTree()
diff --git a/2.4/build-tools/drtool/TOCNode.py b/2.4/build-tools/drtool/TOCNode.py
deleted file mode 100644
index 891c83b..0000000
--- a/2.4/build-tools/drtool/TOCNode.py
+++ /dev/null
@@ -1,55 +0,0 @@
-#!/usr/bin/env python
-#
-# Copyright 2007 Google Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-"""Routines and a class for describing and manipulating data from a
-TableOfContents wiki page.
-"""
-
-nodes = {}
-def lookup(wikiWord):
-  if nodes.has_key(wikiWord):
-    return nodes[wikiWord]
-  else:
-    return None
-
-class TOCNode:
-  def __init__(self, caption, wikiWord=None):
-    self.caption = caption
-    self.wikiWord = wikiWord
-    self.children = []
-
-    if(wikiWord):
-      nodes[wikiWord] = self
-
-  def addChild(self, child):
-    self.children.append(child)
-
-  def AsTree(self):
-    out = {"caption":self.caption, "wikiword":self.wikiWord}
-
-    if(not self.children):
-      out["children"] = None
-    else:
-      out["children"] = map(TOCNode.AsTree, self.children)
-
-    return out
-
-  def __repr__(self):
-    return str(self)
-
-  def __str__(self):
-    return "(((%s)))" % self.caption
diff --git a/2.4/build-tools/drtool/drtool.py b/2.4/build-tools/drtool/drtool.py
deleted file mode 100755
index 7feb72e..0000000
--- a/2.4/build-tools/drtool/drtool.py
+++ /dev/null
@@ -1,270 +0,0 @@
-#!/usr/bin/env python
-#
-# 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.
-#
-
-"""drtool is for moving your wiki documents between googlecode projects.
-
-drtool actually does three things:
-  - copy all of your wiki documentation between googlecode projects. This is
-    done via the "copy" command. References to a project will be changed during
-    the move.
-
-  - tell you what wiki pages are not referenced by your docreader-enabled
-    TableOfContents page. Use "nothave" or "orphans" or "list-orphans" for
-    this.
-
-  - find all of the http references to your subversion repository in your wiki
-    docs. "references" or "refs".
-
-It's assumed that you have svn checkouts of both projects.
-"""
-
-import sys
-import shutil
-import re
-import os.path
-import glob
-import TOCNode
-from BuildGlobalTOC import BuildTOC
-
-NOTHAVE = ["nothave", "orphans", "list-orphans"]
-REFERENCES = ["references", "refs"]
-COPY = ["copy"]
-
-wikipatterns = {}
-svnpatterns = {}
-
-def getpattern(table, template, projectname):
-  if table.has_key(projectname):
-    return table[projectname]
-  else:
-    pattern = (template % projectname)
-    compiled = re.compile(pattern)
-    table[projectname] = compiled
-    return compiled
-
-def wikipattern(projectname):
-  return getpattern(wikipatterns,
-                    "http://code.google.com/p/(%s)/wiki/([^\s\]]+)",
-                    projectname)
-
-def svnpattern(projectname):
-  return getpattern(svnpatterns,
-                    "http://(%s).googlecode.com([^\s\]]+)",
-                    projectname)
-
-def change_ref(link, oldproject, newproject):
-  return link.replace(oldproject, newproject)
-
-def change_references(bytes, oldprojectname, newprojectname):
-  """Returns the string that is the new text for the wiki page, with all
-  of the references changed to point to the new project."""
-
-  svn = svnpattern(oldprojectname)
-  wiki = wikipattern(oldprojectname)
-
-  postsvn = ""
-  postwiki = ""
-  ## step one, do all the svn references.
-  svnreferences = re.finditer(svn, bytes)
-  append_start = 0
-
-  for match in svnreferences:
-    matchstart, matchend = match.span()
-
-    ## take all of the stuff from the end of the last match to the beginning
-    ## of this one and append it to the output.
-    postsvn += bytes[append_start:matchstart]
-
-    ## append the version of this match with the project names replaced
-    postsvn += change_ref(match.group(0), oldprojectname, newprojectname)
-    append_start = matchend
-  postsvn += bytes[append_start:]
-
-  ## step two, do all the wiki references (should be rarer?)
-  wikireferences = re.finditer(wiki, postsvn)
-  append_start = 0
-
-  for match in wikireferences:
-    matchstart, matchend = match.span()
-
-    ## take all of the stuff from the end of the last match to the beginning
-    ## of this one and append it to the output.
-    postwiki += postsvn[append_start:matchstart]
-
-    ## append the version of this match with the project names replaced
-    postwiki += change_ref(match.group(0),
-                           oldprojectname,
-                           newprojectname)
-    append_start = matchend
-  postwiki += postsvn[append_start:]
-
-  return postwiki
-
-def find_references(bytes, projectname, fn):
-  """Return a list of all the references to a given project in this string"""
-  def find_refs(pattern):
-    compiled = re.compile(pattern)
-    refs  = re.findall(compiled, bytes)
-    return refs
-
-  svn = svnpattern(projectname)
-  wiki = wikipattern(projectname)
-
-  return find_refs(svn) + find_refs(wiki)
-
-def print_references(bytes, projectname, fn):
-  refs = find_references(bytes, projectname, fn)
-  if refs:
-    print ("** %s" % fn)
-    for ref in refs:
-      print ":::", ref
-
-def usage():
-  commands = (", ").join(NOTHAVE + REFERENCES + COPY)
-  print ("usage: %s <cmd> prj1 [prj2]" % sys.argv[0])
-  print "\tcmd is one of: ", commands 
-  print "\tprj2 is required for 'copy' command"
-
-def copy_into_target(source_project, target_project, source_path,
-                     relative_filename, target_dir):
-  """Copy one file into the target directory."""
-  target_path = os.path.join(target_dir, relative_filename)
-
-  if relative_filename.endswith(".wiki"):
-    infile = open(source_path)
-    bytes = infile.read()
-    changed = change_references(bytes, source_project, target_project)
-
-    head,tail = os.path.split(target_path)
-    if not os.path.isdir(head):
-      os.makedirs(head)
-
-    outfile = open(target_path, "w")
-    outfile.write(changed)
-    outfile.close()
-
-    # print ("%s: changed references, wrote into %s." %
-    #        (relative_filename, target_project) )
-  else:
-    shutil.copyfile(source_path, target_path)
-    # print ("%s: not a wiki file, copied into the new %s" %
-    #        (relative_filename, target_project))
-
-  pass
-
-def find_wikipath(target):
-  normalized = os.path.normpath(target)
-
-  if not normalized.endswith("/wiki"):
-    normalized += "/wiki"
-  return normalized
-
-def all_wiki_docs(wikipath):
-  """All of the .wiki files in our wiki directory, with paths, recursively."""
-  out = []
-  for root, dirs, fileshere in os.walk(wikipath):
-    path_elements = root.split(os.sep)
-    if ".svn" in path_elements:
-      continue
-
-    for fn in fileshere:
-      if fn.endswith(".wiki"):
-        whole_pathname = os.path.join(root, fn)
-        out.append(whole_pathname)
-  return out
-
-def nothave(wikipath, projectname):
-  toc_path = wikipath + os.path.sep + "TableOfContents.wiki"
-  if not os.path.exists(toc_path):
-    print "Could not find TableOfContents.wiki for that project."
-    return
-
-  listed = BuildTOC(toc_path, projectname)
-  all_wiki_pages = all_wiki_docs(wikipath)
-
-  ## run through every .wiki file (recursively under the wiki directory, and if
-  ## it's not mentioned in the TOC, print it out.
-
-  for wikipage in all_wiki_pages:
-    basename = os.path.basename(wikipage)
-    wikiword = basename[:-5]
-    node = TOCNode.lookup(wikiword)
-
-    if not node:
-      print " ", wikipage
-
-def file_references(fn, projectname):
-  infile = open(fn)
-  bytes = infile.read()
-  print_references(bytes, projectname, fn)
-
-def references(wikipath, projectname):
-  wikipaths = all_wiki_docs(wikipath)
-
-  for wikipath  in wikipaths:
-    file_references(wikipath, projectname)
-
-def wikicopy(source_dir, source_project, target_dir, target_project):
-  print "Copying from", source_project,
-  print "to", target_project, "and changing references...",
-
-  ## Walk every file in source_dir. Skip .svn directories.
-  for root, dirs, fileshere in os.walk(source_dir):
-    path_elements = root.split(os.sep)
-    if ".svn" in path_elements:
-      continue
-
-    for filename in fileshere:
-      ## Find the part of the path after source_dir
-      whole_pathname = os.path.join(root, filename)
-      after_source_dir = whole_pathname[len(source_dir):]
-      if after_source_dir.startswith("/"):
-        after_source_dir = after_source_dir[1:]
-
-      copy_into_target(source_project, target_project, whole_pathname,
-                       after_source_dir, target_dir)
-
-  print "OK!"
-  ## Warn about wiki pages that are not referenced by TOC.
-  print "Careful: these wiki pages aren't referenced in your TableOfContents:"
-  nothave(source_dir, source_project)
-  print "Done."
-
-def main(argv):
-  if len(argv) < 3:
-    usage()
-    return
-
-  source_dir = find_wikipath(argv[2])
-  source_projectname = source_dir.split(os.path.sep)[-2]
-
-  if len(argv) > 3:
-    target_dir = find_wikipath(argv[3])
-    target_projectname = target_dir.split(os.path.sep)[-2]
-
-  if argv[1] in NOTHAVE:
-    nothave(source_dir, source_projectname)
-  elif argv[1] in REFERENCES:
-    references(source_dir, source_projectname)
-  elif argv[1] in COPY:
-    if not target_dir:
-      usage()
-      return
-    wikicopy(source_dir, source_projectname, target_dir, target_projectname)
-
-if __name__ == '__main__':
-  main(sys.argv)
diff --git a/2.4/build.xml b/2.4/build.xml
deleted file mode 100755
index 22dd94b..0000000
--- a/2.4/build.xml
+++ /dev/null
@@ -1,212 +0,0 @@
-<project name="GWT" default="dist" basedir=".">
-  <property name="gwt.root" location="." />
-  <property name="project.tail" value="" />
-  <import file="${gwt.root}/common.ant.xml" />
-
-  <!-- "build" is the default when subprojects are directly targetted  -->
-  <property name="target" value="build" />
-  <property name="emma.merged.out" value="${project.build}/emma-coverage" />
-
-  <!-- 
-     Convenience for the lateral calls we make.  Use gwt.ant to
-     descend into another directory, and this to call in the same build.xml.
-     NOTE THE USE OF $TARGET, here and in common's gwt.ant.  This has the
-     effect of dividing rules into subdirectory rules (using gwt.ant and
-     sensitive to $target) and action rules (using call-subproject and
-     setting $target)... but it is Bad for a subdirectory rule to depend
-     on another one, as they are both sensitive to $target, but you probably
-     mean that subdirB needed subdirA to be _built_, not $target'ed (tested,
-     etc.)
-
-     In other words, DO NOT USE DEPENDS=... IN A TARGET WITH GWT.ANT.    
-    -->
-  <macrodef name="call-subproject">
-    <attribute name="subproject" />
-    <attribute name="subtarget" />
-    <sequential>
-      <antcall target="@{subproject}">
-        <param name="target" value="@{subtarget}" />
-      </antcall>
-    </sequential>
-  </macrodef>
-
-  <property name="gwt.apicheck.config" 
-    location="tools/api-checker/config/gwt23_24userApi.conf"/>
-
-  <target name="buildonly"
-          description="[action] Minimal one-platform devel build, without distro packaging">
-    <call-subproject subproject="dev" subtarget="build" />
-    <call-subproject subproject="user" subtarget="build" />
-    <call-subproject subproject="requestfactory" subtarget="build" />
-    <call-subproject subproject="servlet" subtarget="build" />
-    <call-subproject subproject="jni" subtarget="build" />
-  </target>
-
-  <target name="dist" depends="build, doc" description="[action] Make all the distributions">
-    <gwt.ant dir="distro-source" />
-  </target>
-
-  <target name="dist-dev" depends="buildonly" description="[action] Make this platform's distribution, minus doc and samples">
-    <gwt.ant dir="distro-source" target="build" />
-  </target>
-
-  <target name="dev" description="[subdir] Builds (or runs ${target} if set) all the dev libraries">
-    <call-subproject subproject="buildtools" subtarget="build" />
-    <gwt.ant dir="dev" />
-  </target>
-
-  <target name="user" description="[subdir] Builds (or runs ${target} if set) only the user library">
-    <call-subproject subproject="dev" subtarget="build"/>
-    <gwt.ant dir="user" />
-  </target>
-
-  <target name="soyc" description="[subdir] Builds (or runs ${target} if set) only the soyc library">
-    <call-subproject subproject="dev" subtarget="build"/>
-    <call-subproject subproject="user" subtarget="build"/>
-    <gwt.ant dir="tools/soyc-vis" />
-  </target>
-
-  <target name="tools" description="[subdir] Builds (or runs ${target} if set) only the tools">
-    <call-subproject subproject="user" subtarget="build"/>
-    <gwt.ant dir="tools" />
-  </target>
-
-  <target name="requestfactory" description="[subdir] Builds (or runs ${target} if set) only the requestfactory jars">
-    <call-subproject subproject="user" subtarget="build" />
-    <gwt.ant dir="requestfactory" />
-  </target>
-
-  <target name="servlet" description="[subdir] Builds (or runs ${target} if set) only the servlet jar">
-    <call-subproject subproject="user" subtarget="build" />
-    <gwt.ant dir="servlet" />
-  </target>
-
-  <target name="jni" description="[subdir] Builds (or runs ${target} if set) jni for all platforms">
-    <gwt.ant dir="jni" />
-  </target>
-
-  <target name="doc" description="[subdir] Builds (or runs ${target} if set) the doc">
-    <call-subproject subproject="user" subtarget="build" />
-    <gwt.ant dir="doc" />
-  </target>
-
-  <target name="samples" description="[subdir] Builds (or runs ${target} if set) the samples">
-    <call-subproject subproject="user" subtarget="build" />
-    <gwt.ant dir="samples" />
-  </target>
-
-  <target name="buildtools" description="[subdir] Build (or runs ${target} if set) the build tools">
-    <gwt.ant dir="build-tools" />
-  </target>
-
-  <target name="build" description="[action] Builds GWT, including samples, but without distro packaging">
-    <call-subproject subproject="dev" subtarget="build"/>
-    <call-subproject subproject="user" subtarget="build"/>
-    <call-subproject subproject="requestfactory" subtarget="build"/>
-    <call-subproject subproject="servlet" subtarget="build"/>
-    <call-subproject subproject="tools" subtarget="build"/>
-    <call-subproject subproject="jni" subtarget="build"/>
-    <call-subproject subproject="samples" subtarget="build"/>
-  </target>
-
-  <target name="checkstyle" description="[action] Does static analysis of GWT source">
-    <call-subproject subproject="buildtools" subtarget="checkstyle" />
-    <call-subproject subproject="dev" subtarget="checkstyle" />
-    <call-subproject subproject="user" subtarget="checkstyle" />
-    <call-subproject subproject="requestfactory" subtarget="checkstyle" />
-    <call-subproject subproject="servlet" subtarget="checkstyle" />
-    <call-subproject subproject="tools" subtarget="checkstyle" />
-    <call-subproject subproject="samples" subtarget="checkstyle" />
-  </target>
-
-  <target name="test" depends="dist-dev,apicheck,checkstyle" 
-          description="[action] Runs all the GWT tests, including checkstyle and apicheck">
-    <call-subproject subproject="buildtools" subtarget="test" />
-    <call-subproject subproject="dev" subtarget="test" />
-    <call-subproject subproject="user" subtarget="test" />
-    <call-subproject subproject="requestfactory" subtarget="test" />
-    <call-subproject subproject="servlet" subtarget="test" />
-    <call-subproject subproject="tools" subtarget="test" />
-  </target>
-
-  <target name="testrf" depends="dist-dev" 
-          description="[action] Runs the GWT RequestFactory tests">
-    <call-subproject subproject="dev" subtarget="compile.tests" />
-    <call-subproject subproject="user" subtarget="compile.tests" />
-    <call-subproject subproject="requestfactory" subtarget="test" />
-  </target>
-
-  <target name="benchmark" depends="dist-dev" 
-          description="[action] Runs all the GWT benchmarks">
-    <call-subproject subproject="user" subtarget="benchmark" />
-  </target>
-
-  <path id="emma.classpath.src">
-    <pathelement location="${gwt.root}/user/src" />
-    <pathelement location="${gwt.root}/dev/**/src/com/google" />
-    <pathelement location="${gwt.root}/build-tools/**/src/com/google" />
-    <pathelement location="${gwt.root}/tools/**/src/com/google" />
-  </path>
-
-  <target name="emma.merge" description="Merges coverage data for all projects">
-    <delete dir="${emma.merged.out}" />
-    <mkdir dir="${emma.merged.out}" />
-    <emma>
-      <merge outfile="${emma.merged.out}/merged.emma" >
-        <fileset dir="${project.build}">
-          <include name="**/*.emma" />
-          <exclude name="**/merged.emma" />
-        </fileset>
-      </merge>
-    </emma>
-    <emma>
-      <report sourcepath="${emma.classpath.src}">
-        <fileset dir="${project.build}">
-          <patternset>
-            <include name="**/metadata.emma"/>
-          </patternset>
-        </fileset>
-        <fileset file="${emma.merged.out}/merged.emma" />
-        <txt outfile="${emma.merged.out}/coverage.txt" />
-        <html outfile="${emma.merged.out}/coverage.html" />
-        <xml outfile="${emma.merged.out}/coverage.xml" />
-      </report>
-    </emma>
-  </target>
-
-  <target name="clean" description="[action] Cleans the entire GWT build">
-    <delete dir="${gwt.build}" />
-    <delete file="${gwt.root}/doc/packages.properties" />
-  </target>
-
-  <target name ="presubmit" description="[action] Deprecated for test, which now does checkstyle and apicheck"
-          depends="test">
-  </target>
-
-  <target name="apicheck-nobuild" 
-    description="[action] Checks API compatibility to prior GWT revision">
-    <java failonerror="true" fork="true"
-          classname="com.google.gwt.tools.apichecker.ApiCompatibilityChecker">
-      <jvmarg line="-Xmx512m" />
-      <classpath>
-        <pathelement location="${gwt.build.out}/tools/api-checker/bin"/>
-        <fileset dir="${gwt.build.lib}" includes="gwt-user.jar,gwt-dev.jar" />
-        <pathelement path="${java.class.path}"/>
-        <pathelement location="${gwt.tools.lib}/apache/ant-1.6.5.jar" />
-      </classpath>
-      <arg value="-refJar"/>
-      <arg path="${gwt.root}/tools/api-checker/reference/gwt-dev-modified.jar:${gwt.root}/tools/api-checker/reference/gwt-user-modified.jar"/>
-      <arg value="-configFile"/>
-      <arg file="${gwt.apicheck.config}"/>
-      <arg value="-logLevel"/>
-      <arg value="ERROR"/>
-      <!-- Needed for checking types that include validation APIs -->
-      <arg value="-validationSourceJars" />
-      <arg path="${gwt.tools.lib}/javax/validation/validation-api-1.0.0.GA-sources.jar" />
-    </java>
-  </target>
-
-  <target name="apicheck" depends="buildonly,tools,apicheck-nobuild" 
-          description="[action] Builds GWT and checks API compatiblity to prior release"/>
-
-</project>
diff --git a/2.4/common.ant.xml b/2.4/common.ant.xml
deleted file mode 100755
index 166568e..0000000
--- a/2.4/common.ant.xml
+++ /dev/null
@@ -1,432 +0,0 @@
-<project name="common">
-  <!-- it's okay for this not to exist, but it gives a place to store
-       personal property settings, if any, persistently.  For example, you
-       might use it to set gwt.junit.testcase.includes to a narrower subset
-       of test cases to exercise. -->
-  <property file="local.ant.properties" />
-
-  <!-- gwt.build.iscasesensitivefs is true if the filesystem of the
-    build machine is case-sensitive, false otherwise.  Update with
-    new lines for any supported platforms with case-insensitive
-    filesystems
-  -->
-  <condition property="gwt.build.iscasesensitivefs" else="false">
-    <not>
-      <or>
-        <os family="windows"/>
-      </or>
-    </not>
-  </condition>
-
-  <property name="test.ant.file" location="${gwt.root}/${project.tail}/build.xml" />
-  <condition property="project.valid">
-    <equals arg1="${ant.file}" arg2="${test.ant.file}"
-      casesensitive="${gwt.build.iscasesensitivefs}"/>
-  </condition>
-  <fail unless="project.valid" message="This build file is in an inconsistent state (${ant.file} != ${test.ant.file})." />
-
-  <!-- Global Properties -->
-  <property environment="env" />
-  <condition property="gwt.version" value="${env.GWT_VERSION}" else="0.0.0">
-    <isset property="env.GWT_VERSION" />
-  </condition>
-  <condition property="gwt.tools.check" value="${env.GWT_TOOLS}" else="${gwt.root}/../tools">
-    <isset property="env.GWT_TOOLS" />
-  </condition>
-  <property name="gwt.tools" location="${gwt.tools.check}" />
-  <property name="gwt.tools.lib" location="${gwt.tools}/lib" />
-  <property name="gwt.tools.antlib" location="${gwt.tools}/antlib" />
-  <property name="gwt.tools.redist" location="${gwt.tools}/redist" />
-  <property name="gwt.build" location="${gwt.root}/build" />
-  <property name="gwt.build.out" location="${gwt.build}/out" />
-  <property name="gwt.build.lib" location="${gwt.build}/lib" />
-  <property name="gwt.build.jni" location="${gwt.build}/jni" />
-  <property name="gwt.build.staging" location="${gwt.build}/staging" />
-  <property name="gwt.build.dist" location="${gwt.build}/dist" />
-  <!-- gwt.threadsPerProcessor supercedes gwt.threadCount unless set to 0 --> 
-  <property name="gwt.threadsPerProcessor" value="1" />
-  <property name="gwt.threadCount" value="1" />
-  <property name="project.build" location="${gwt.build.out}/${project.tail}" />
-  <property name="project.lib" location="${gwt.build.lib}/gwt-${ant.project.name}.jar" />
-  <property name="project.jni" location="${gwt.build}/${project.tail}" />
-  <property name="javac.out" location="${project.build}/bin" />
-  <property name="javac.junit.out" location="${project.build}/bin-test" />
-  <property name="javac.emma.out" location="${project.build}/bin-emma" />
-  <property name="javac.debug" value="true" />
-  <property name="javac.debuglevel" value="lines,vars,source" />
-  <property name="javac.encoding" value="utf-8" />
-  <property name="javac.source" value="1.5" />
-  <property name="javac.target" value="1.5" />
-  <property name="javac.nowarn" value="true" />
-  <property name="junit.out" location="${project.build}/test" />
-  <property name="emma.dir" value="${gwt.tools.redist}/emma" />
-  <property name="emma.filter.exclude" value="" />
-  
-  <!-- Sanity check -->
-  <available file="${gwt.tools}" type="dir" property="gwt.tools.exists" />
-  <fail unless="gwt.tools.exists" message="Cannot find '${gwt.tools}' tools directory; perhaps you should define the GWT_TOOLS environment variable" />
-
-  <!-- Platform identification -->
-  <condition property="build.host.islinux">
-    <and>
-      <os family="unix" />
-      <not>
-        <contains string="${os.name}" substring="mac" casesensitive="false" />
-      </not>
-    </and>
-  </condition>
-  <condition property="build.host.platform" value="linux">
-    <isset property="build.host.islinux" />
-  </condition>
-
-  <condition property="build.host.ismac">
-    <and>
-      <os family="unix" />
-      <contains string="${os.name}" substring="mac" casesensitive="false" />
-    </and>
-  </condition>
-  <condition property="build.host.platform" value="mac">
-    <isset property="build.host.ismac" />
-  </condition>
-
-  <condition property="build.host.iswindows">
-    <os family="windows" />
-  </condition>
-  <condition property="build.host.platform" value="windows">
-    <isset property="build.host.iswindows" />
-  </condition>
-  <fail unless="build.host.platform" message="Building on ${os.name} is not supported" />
-  
-  <!-- JVM -->
-  <condition property="build.jvm.is15">
-     <equals arg1="${ant.java.version}" arg2="1.5"/>
-  </condition>  
-
-  <condition property="build.jvm.is16">
-     <equals arg1="${ant.java.version}" arg2="1.6"/>
-  </condition> 
-  
-  <!-- JUnit support -->
-  <property name="gwt.dev.staging.jar" location="${gwt.build.staging}/gwt-${gwt.version}/gwt-dev.jar" />
-  <property name="gwt.junit.port" value="8888" />
-  <property name="gwt.junit.testcase.includes" value="**/*Suite.class"/>
-
-  <!-- Benchmark support -->
-  <property name="gwt.benchmark.testcase.includes" value="**/*SuiteBenchmark.class"/>
-
-  <!-- Shared class paths -->
-  <path id="project.classpath.class">
-    <pathelement location="${javac.out}" />
-  </path>
-  <path id="project.classpath.src">
-    <pathelement location="${gwt.root}/${project.tail}/src" />
-  </path>
-
-  <!-- Pulls in tasks defined in ant-contrib, i.e. foreach -->
-  <taskdef resource="net/sf/antcontrib/antlib.xml">
-    <classpath>
-      <pathelement location="${gwt.tools.antlib}/ant-contrib-1.0b3.jar" />
-    </classpath>
-  </taskdef>
-  
-  
-  <!-- Pulls in tasks defined in antcount, i.e. countfilter -->
-  <taskdef resource="net/sf/antcount/antlib.xml">
-    <classpath>
-      <pathelement location="${gwt.tools.antlib}/antcount-1.2.jar" />
-    </classpath>
-  </taskdef>
-  
-
-  <!-- Global Custom Tasks -->
-  <presetdef name="gwt.ant">
-    <ant inheritall="false" target="${target}">
-      <propertyset>
-        <propertyref name="gwt.version" />
-        <propertyref name="gwt.junit.port" />
-        <propertyref name="gwt.remote.browsers" />
-        <propertyref name="emma.enabled" />
-        <propertyref name="emma.compiled" />
-      </propertyset>
-    </ant>
-  </presetdef>
-
-  <presetdef name="gwt.javac">
-    <javac srcdir="src" destdir="${javac.out}" debug="${javac.debug}" debuglevel="${javac.debuglevel}" source="${javac.source}" target="${javac.target}" nowarn="${javac.nowarn}" encoding="${javac.encoding}" fork="true" memoryMaximumSize="1024m" />
-  </presetdef>
-
-  <macrodef name="gwt.jar">
-    <attribute name="destfile" default="${project.lib}"/>
-    <attribute name="duplicate" default="fail"/>
-    <attribute name="update" default="true"/>
-    <element name="jarcontents" implicit="true"/>
-    <sequential>
-      <taskdef name="jar.bydate"
-          classname="com.google.gwt.ant.taskdefs.LatestTimeJar"
-          classpath="${gwt.build.lib}/ant-gwt.jar" />
-
-      <jar.bydate destfile="@{destfile}" duplicate="@{duplicate}" filesonly="false"
-          index="true" update="@{update}">
-        <jarcontents/>
-      </jar.bydate>
-    </sequential>
-  </macrodef>
-
-  <macrodef name="gwt.junit">
-    <!-- TODO: Because dev has core, oophm splits, the "common pattern" here doesn't work
-         for it (and we use extraclasspaths entries instead).  Once we lose SWT, we can
-         consolidate dev/core and dev/oophm, and that can instead more to the normal
-         pattern.  Note also special casing regarding (dev/) core/test. -->
-    <attribute name="test.args" default="" />
-    <attribute name="test.jvmargs" default="" />
-    <attribute name="test.out" default="" />
-    <attribute name="test.reports" default="@{test.out}/reports" />
-    <attribute name="test.emma.coverage" default="@{test.out}/emma-coverage" />
-    <attribute name="test.cases" default="" />
-    <attribute name="test.name" default="" />
-    <attribute name="test.extra.jvmargs" default="" />
-    <attribute name="haltonfailure" default="true" />
-    <element name="extraclasspaths" optional="true" />
-    <sequential>
-      <taskdef name="junit" classname="org.apache.tools.ant.taskdefs.optional.junit.JUnitTask">
-        <classpath>
-          <pathelement location="${gwt.tools.lib}/junit/junit-4.8.2.jar" />
-          <pathelement location="${gwt.tools.antlib}/ant-junit-1.6.5.jar" />
-          <pathelement location="${gwt.tools.lib}/selenium/selenium-java-client-driver.jar" />
-        </classpath>
-      </taskdef>
-
-      <echo message="Writing test results to @{test.reports} for @{test.cases}" />
-      <mkdir dir="@{test.reports}" />
-
-      <antcall target="-create.emma.coverage.if.enabled">
-    	  <param name="test.emma.coverage" value="@{test.emma.coverage}"/>
-      </antcall>
-      <condition property="emma.lib" value="${emma.dir}/emma-2.0.5312-patched.jar"
-            else="${emma.dir}/no-emma-requested">
-        <isset property="emma.enabled" />
-      </condition>
-
-      <junit dir="@{test.out}" fork="yes" printsummary="yes"
-             failureproperty="junit.failure" tempdir="@{test.out}">
-        <jvmarg line="-Xmx768m" />
-        <jvmarg line="-Xss4M" />
-        <jvmarg value="-Demma.coverage.out.file=@{test.emma.coverage}/coverage.emma" />
-        <jvmarg value="-Demma.coverage.out.merge=true" />
-        <jvmarg value="-Dcom.google.gwt.junit.reportPath=reports" />
-        <jvmarg line="@{test.jvmargs}" />
-        <sysproperty key="gwt.args" value="@{test.args}" />
-        <sysproperty key="java.awt.headless" value="true" />
-        <classpath>
-          <path refid="project.classpath.src" />
-          <pathelement location="${gwt.root}/${project.tail}/super" />
-          <pathelement location="${gwt.root}/${project.tail}/test" />
-          <!-- TODO: this is here because e.g. ClassPathEntryTest otherwise fails,
-               expecting the src entry (core/test) to be earlier than the bin entry
-               (${javac.junit.out}). -->
-          <pathelement location="${gwt.root}/${project.tail}/core/test" />
-          <!-- Emma compiled classes must appear before non-emma compiled
-               classes to generate code coverage stats.  javac.emma.out is
-               empty unless emma is enabled. -->
-          <pathelement location="${javac.emma.out}" />
-          <pathelement location="${javac.junit.out}" />
-          <path refid="project.classpath.class" />
-          <pathelement location="${emma.lib}" />
-          <pathelement location="${gwt.dev.staging.jar}" />
-          <pathelement location="${gwt.tools.lib}/junit/junit-4.8.2.jar" />
-          <pathelement location="${gwt.tools.lib}/selenium/selenium-java-client-driver.jar" />
-          <pathelement location="${gwt.tools.lib}/w3c/sac/sac-1.3.jar" />
-          <pathelement location="${gwt.tools.lib}/w3c/flute/flute-1.3-gg2.jar" />
-          <extraclasspaths />
-        </classpath>
-
-        <formatter type="plain" />
-        <formatter type="xml" />
-
-        <batchtest todir="@{test.reports}">
-          <fileset refid="@{test.cases}" />
-        </batchtest>
-      </junit>
-
-      <emma enabled="${emma.enabled}">
-        <report sourcepath="${project.classpath.src}">
-          <fileset file="${javac.emma.out}/metadata.emma" />
-          <fileset dir="@{test.emma.coverage}">
-            <include name="*.emma" />
-          </fileset>
-          <txt outfile="@{test.emma.coverage}/coverage.txt" />
-          <html outfile="@{test.emma.coverage}/coverage.html" />
-          <xml outfile="@{test.emma.coverage}/coverage.xml" />
-        </report>
-      </emma>
-
-      <condition property="junit.stop.build" value="true"> 
-        <and>
-          <istrue value="@{haltonfailure}"/>
-          <isset property="junit.failure"/>
-        </and>
-      </condition>
-      <fail
-          message="One or more junit tests failed for target: @{test.name} @{test.args}"
-          if="junit.stop.build" status="2" />
-    </sequential>
-  </macrodef>
-
-  <macrodef name="gwt.tgz.cat">
-    <attribute name="destfile" />
-    <attribute name="compression" default="gzip" />
-    <element name="tar.elements" implicit="true" optional="true" />
-    <sequential>
-      <taskdef name="tar.cat" classname="com.google.gwt.ant.taskdefs.TarCat" classpath="${gwt.build.lib}/ant-gwt.jar" />
-      <tar.cat destfile="@{destfile}" compression="@{compression}" longfile="gnu">
-        <tar.elements />
-      </tar.cat>
-    </sequential>
-  </macrodef>
-
-  <macrodef name="gwt.getsvninfo" description="Identifies the SVN info of a workspace">
-    <sequential>
-      <taskdef name="svninfo"
-         classname="com.google.gwt.ant.taskdefs.SvnInfo"
-         classpath="${gwt.build.lib}/ant-gwt.jar" />
-      <svninfo directory="${gwt.root}" outputproperty="gwt.svnrev"
-          outputfileproperty="gwt.svnrev.filename" />
-      <!-- Generally, filtering requires a sentinel file so that changes to svn rev will
-         be noticed as invalidating the previously-generated filter output.  This property
-         names where such a sentinel lives; it is tested with <available/> and created
-         with <touch/> -->
-      <mkdir dir="${project.build}/sentinels" /> 
-      <property name="filter.sentinel" 
-          location="${project.build}/sentinels/gwt-${gwt.version}-svn-${gwt.svnrev.filename}" /> 
-    </sequential>
-  </macrodef>
-  
-  <macrodef name="gwt.revfilter" description="Filters files for versioning">
-    <attribute name="todir" description="Destination for the filtered copy"/>
-    
-    <element name="src.fileset" implicit="true" 
-      description="Source for the filtered copy"/>
-    <sequential>
-      <!-- These files must be filtered for versioning -->
-      <echo message="Branding as GWT version ${gwt.version}, SVN rev ${gwt.svnrev}"/>
-      <mkdir dir="@{todir}" />
-      <copy todir="@{todir}" overwrite="true">
-        <src.fileset/>
-        <filterset>
-          <filter token="GWT_VERSION" value="${gwt.version}" />
-          <filter token="GWT_SVNREV" value="${gwt.svnrev}" />
-        </filterset>
-      </copy>
-    </sequential>
-  </macrodef>
-
-  <macrodef name="gwt.timer">
-    <attribute name="name"/>
-    <element name="timer.elements" implicit="true" optional="false"/>
-    <sequential>
-      <taskdef name="timer" 
-        classname="com.google.gwt.ant.taskdefs.Timer"
-        classpath="${gwt.build.lib}/ant-gwt.jar" />
-      <timer name="@{name}">
-        <timer.elements/>
-      </timer>
-    </sequential>
-  </macrodef>
-
-  <macrodef name="gwt.checkstyle">
-    <attribute name="outputdirectory" default="${project.build}"/>
-    <element name="sourcepath" implicit="yes" optional="true" />
-    <sequential>
-      <taskdef resource="checkstyletask.properties" classpath="${gwt.tools.antlib}/checkstyle-all-4.2.jar;${gwt.build.lib}/gwt-customchecks.jar" />
-      <mkdir dir="@{outputdirectory}"/>
-      <checkstyle config="${gwt.root}/eclipse/settings/code-style/gwt-checkstyle.xml" maxErrors="0" failOnViolation="false" failureProperty="gwt.checkstyle.failed">
-        <formatter type="xml" toFile="@{outputdirectory}/checkstyle_log.xml"/>
-        <property key="checkstyle.header.file" file="${gwt.root}/eclipse/settings/code-style/google.header" />
-        <sourcepath />
-      </checkstyle>
-      <fail message="Checkstyle errors exist, and are reported at @{outputdirectory}/checkstyle_log.xml" if="gwt.checkstyle.failed" />
-    </sequential>
-  </macrodef>
-
-  <macrodef name="gwt.checkstyle.tests">
-    <attribute name="outputdirectory" default="${project.build}"/>
-    <element name="sourcepath" implicit="yes" optional="true" />
-    <sequential>
-      <taskdef resource="checkstyletask.properties" classpath="${gwt.tools.antlib}/checkstyle-all-4.2.jar;${gwt.build.lib}/gwt-customchecks.jar" />
-      <mkdir dir="@{outputdirectory}"/>
-      <checkstyle config="${gwt.root}/eclipse/settings/code-style/gwt-checkstyle-tests.xml" maxErrors="0" failOnViolation="false" failureProperty="gwt.checkstyle-tests.failed">
-        <formatter type="xml" toFile="@{outputdirectory}/checkstyle_tests_log.xml"/>
-        <property key="checkstyle.header.file" file="${gwt.root}/eclipse/settings/code-style/google.header" />
-        <sourcepath />
-      </checkstyle>
-      <fail message="Checkstyle errors exist in tests, and are reported at @{outputdirectory}/checkstyle_tests_log.xml" if="gwt.checkstyle-tests.failed" />
-    </sequential>
-  </macrodef>
-
-  <macrodef name="property.ensure">
-    <attribute name="name" />
-    <attribute name="location" />
-    <attribute name="message" default="Cannot find dependency ${@{name}}" />
-    <attribute name="unless" default="__nonexistent_property__" />
-    <sequential>
-      <property name="@{name}" location="@{location}" />
-      <condition property="@{name}.exists">
-        <or>
-          <available file="${@{name}}" />
-          <isset property="@{unless}" />
-        </or>
-      </condition>
-      <fail unless="@{name}.exists" message="@{message}" />
-    </sequential>
-  </macrodef>
-
-  <!-- Targets for emma support.  To run tests with emma enabled, use 
-       ant <test-target> -Demma.enabled=true -->
-  <path id="emma.taskdef.lib">
-    <pathelement location="${emma.dir}/emma-2.0.5312-patched.jar" />
-    <pathelement location="${emma.dir}/emma_ant-2.0.5312.jar" />
-  </path>
-
-  <taskdef resource="emma_ant.properties" classpathref="emma.taskdef.lib" />
-
-  <!-- Instruments emma classes -->
-  <target name="compile.emma.if.enabled" unless="emma.compiled">
-    <delete dir="${javac.emma.out}" />
-    <property name="emma.compiled" value="true" />
-    <antcall target="-compile.emma.if.enabled" />
-  </target>
-
-  <!-- Instruments emma classes -->
-  <target name="-compile.emma.if.enabled" if="emma.enabled">
-    <mkdir dir="${javac.emma.out}" />
-    <path id="emma.classpath">
-      <pathelement location="${javac.out}" />
-    </path>
-    <emma enabled="${emma.enabled}" >
-      <instr instrpathref="emma.classpath" destdir="${javac.emma.out}" metadatafile="${javac.emma.out}/metadata.emma" merge="false">
-        <filter includes="com.google.*" />
-        <filter excludes="${emma.filter.exclude}" />
-      </instr>
-    </emma>
-  </target>
-
-  <!-- Create the emma coverage directory -->
-  <target name="-create.emma.coverage.if.enabled" if="emma.enabled">
-    <delete dir="${test.emma.coverage}" />
-    <mkdir dir="${test.emma.coverage}" />
-  </target>
-
-  <!-- Default implementations of the required targets; projects should
-  override the ones that matter -->
-  <target name="all" depends="verify" />
-  <target name="verify" depends="checkstyle, test"
-      description="Runs tests and checkstyle static analysis" />
-  <target name="checkstyle" />
-  <target name="test" depends="build" />
-  <target name="build" />
-
-  <target name="clean">
-    <delete dir="${project.build}" />
-  </target>
-
-</project>
diff --git a/2.4/dev-ext/build.xml b/2.4/dev-ext/build.xml
deleted file mode 100644
index 8be986b..0000000
--- a/2.4/dev-ext/build.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<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/2.4/dev/build.xml b/2.4/dev/build.xml
deleted file mode 100755
index 48381ab..0000000
--- a/2.4/dev/build.xml
+++ /dev/null
@@ -1,341 +0,0 @@
-<project name="dev" default="build" basedir=".">
-  <property name="gwt.root" location=".." />
-  <property name="project.tail" value="dev" />
-  <property name="test.args" value="-ea" />
-  <property name="test.jvmargs" value="-ea" />
-  <import file="${gwt.root}/platforms.ant.xml" />
-  <import file="${gwt.root}/common.ant.xml" />
-
-  <property name="alldeps.jar" location="${project.build}/alldeps.jar" />
-  <property name="gwt.junit.testcase.dev.core.includes" value="**/com/google/**/*Test.class" />
-  <!-- BrowserManagerTest is brought in from user and is not instantiable. -->
-  <property name="gwt.junit.testcase.dev.core.excludes" value="**/BrowserManagerTest.class" />
-
-  <target name="clean" description="Cleans this project's intermediate and output files">
-    <delete dir="${project.build}" failonerror="false" />
-    <delete file="${project.lib}" failonerror="false" />
-    <delete failonerror="false">
-      <fileset dir="${gwt.build.lib}"  includes="gwt-dev.jar"/>
-    </delete>
-  </target>
-
-  <target name="compile.tests" depends="build, compile.emma.if.enabled, build.alldeps.jar" description="Compiles the test code for this project">
-    <mkdir dir="${javac.junit.out}" />
-    <gwt.javac srcdir="" destdir="${javac.junit.out}">
-      <src path="core/src" />
-      <src path="core/test" />
-      <classpath>
-        <pathelement location="${javac.out}" />
-        <pathelement location="${alldeps.jar}" />
-        <pathelement location="${gwt.tools.lib}/junit/junit-4.8.2.jar" />
-      </classpath>
-    </gwt.javac>
-    <gwt.javac srcdir="${gwt.root}/user/src" destdir="${javac.junit.out}"
-      excludes="**/super/**">
-      <classpath>
-        <pathelement location="${javac.out}" />
-        <pathelement location="${gwt.tools.lib}/tomcat/servlet-api-2.5.jar" />
-        <pathelement location="${gwt.tools.lib}/junit/junit-4.8.2.jar" />
-        <pathelement location="${gwt.tools.lib}/jfreechart/jfreechart-1.0.3.jar" />
-        <pathelement location="${gwt.tools.lib}/selenium/selenium-java-client-driver.jar" />
-        <pathelement location="${gwt.tools.lib}/w3c/sac/sac-1.3.jar" />
-        <pathelement location="${gwt.tools.lib}/w3c/flute/flute-1.3-gg2.jar" />
-        <pathelement location="${gwt.tools}/redist/json/r2_20080312/json-1.5.jar" />
-        <pathelement location="${gwt.tools.lib}/hibernate/validator/hibernate-validator-4.1.0.Final.jar" />
-        <pathelement location="${gwt.tools.lib}/javax/validation/validation-api-1.0.0.GA.jar" />
-        <pathelement location="${gwt.build.lib}/gwt-dev-${build.host.platform}.jar" />
-        <pathelement location="${alldeps.jar}" />
-      </classpath>
-    </gwt.javac>
-
-  </target>
-
-  <target name="build.alldeps.jar" description="Merges all dependency jars into a single jar">
-    <mkdir dir="${project.build}" />
-    <outofdate> <!-- saves rescanning all the source jars' contents -->
-      <sourcefiles>
-        <fileset dir="${gwt.tools.lib}">
-          <include name="apache/tapestry-util-text-4.0.2.jar" />
-          <include name="apache/ant-1.6.5.jar" />
-          <include name="eclipse/jdt-3.4.2.jar" />
-          <include name="guava/guava-r06/guava-r06-rebased-2.jar" />
-          <include name="jetty/jetty-6.1.11.jar" />
-          <include name="icu4j/4.4.2/icu4j.jar" />
-          <include name="protobuf/protobuf-2.2.0/protobuf-java-rebased-2.2.0.jar" />
-          <include name="tomcat/ant-launcher-1.6.5.jar" />
-          <include name="tomcat/catalina-1.0.jar" />
-          <include name="tomcat/catalina-optional-1.0.jar" />
-          <include name="tomcat/commons-beanutils-1.6.jar" />
-          <include name="tomcat/commons-collections-3.1.jar" />
-          <include name="tomcat/commons-digester-1.5.jar" />
-          <include name="tomcat/commons-el-1.0.jar" />
-          <include name="tomcat/commons-logging-1.0.jar" />
-          <include name="tomcat/commons-modeler-1.1.jar" />
-          <include name="tomcat/jakarta-regexp-1.3.jar" />
-          <include name="tomcat/jasper-compiler-1.0.jar" />
-          <include name="tomcat/jasper-runtime-1.0.jar" />
-          <include name="tomcat/jsp-api-2.0.jar" />
-          <include name="tomcat/mx4j-jmx-1.1.jar" />
-          <include name="tomcat/naming-common-1.0.jar" />
-          <include name="tomcat/naming-factory-1.0.jar" />
-          <include name="tomcat/naming-java-1.0.jar" />
-          <include name="tomcat/naming-resources-1.0.jar" />
-          <include name="tomcat/servlet-api-2.5.jar" />
-          <include name="tomcat/servlet-api-2.4.jar" />
-          <include name="tomcat/servlets-common-1.0.jar" />
-          <include name="tomcat/servlets-default-1.0.jar" />
-          <include name="tomcat/servlets-invoker-1.0.jar" />
-          <include name="tomcat/tomcat-coyote-1.0.jar" />
-          <include name="tomcat/tomcat-http11-1.0.jar" />
-          <include name="tomcat/tomcat-jk2-2.1.jar" />
-          <include name="tomcat/tomcat-util-5.1.jar" />
-          <!-- htmlunit dependencies not already included: BEGIN -->
-          <include name="apache/http/httpclient-4.0.1.jar" />
-          <include name="apache/http/httpcore-4.0.1.jar" />
-          <include name="apache/http/httpmime-4.0.1.jar" />
-          <include name="apache/james/apache-mime4j-0.6.jar" />
-          <include name="apache/commons/commons-codec-1.3.jar" />
-          <include name="apache/commons/commons-io-1.4.jar" />
-          <include name="apache/commons/commons-lang-2.4.jar" />
-          <include name="cssparser/cssparser-0.9.5.jar" />
-          <include name="htmlunit/htmlunit-r5940/htmlunit-r5940.jar" />
-          <include name="htmlunit/htmlunit-r5940/htmlunit-core-js-r5940.jar" />
-          <include name="nekohtml/nekohtml-1.9.13.jar" />
-          <include name="streamhtmlparser/streamhtmlparser-jsilver-r10/streamhtmlparser-jsilver-r10-1.5-rebased.jar" />
-          <include name="cup/java-cup-11a.jar" />
-          <include name="xalan/xalan-2.7.1-nocup.jar" />
-          <include name="xerces/xerces-2_9_1/serializer.jar" />
-          <include name="xerces/xerces-2_9_1/xercesImpl-NoMetaInf.jar" />
-          <include name="xerces/xerces-2_9_1/xml-apis.jar" />
-          <include name="w3c/sac/sac-1.3.jar" />
-          <!-- htmlunit dependencies not already included: END -->
-          <include name="sun/swingworker/swing-worker-1.1.jar" />
-          <include name="guava/guava-r06/guava-r06-rebased-2.jar" />
-        </fileset>
-        <fileset file="build.xml"/>
-      </sourcefiles>
-      <targetfiles>
-        <fileset file="${alldeps.jar}"/>
-      </targetfiles>
-      <sequential>
-        <gwt.jar destfile="${alldeps.jar}">
-          <zipfileset src="${gwt.tools.lib}/apache/tapestry-util-text-4.0.2.jar" />
-          <zipfileset src="${gwt.tools.lib}/apache/ant-1.6.5.jar" />
-          <zipfileset src="${gwt.tools.lib}/eclipse/jdt-3.4.2.jar" />
-          <zipfileset src="${gwt.tools.lib}/guava/guava-r06/guava-r06-rebased-2.jar" />
-          <zipfileset src="${gwt.tools.lib}/jetty/jetty-6.1.11.jar" />
-          <zipfileset src="${gwt.tools.lib}/icu4j/4.4.2/icu4j.jar" />
-          <zipfileset src="${gwt.tools.lib}/protobuf/protobuf-2.2.0/protobuf-java-rebased-2.2.0.jar" />
-          <zipfileset src="${gwt.tools.lib}/streamhtmlparser/streamhtmlparser-jsilver-r10/streamhtmlparser-jsilver-r10-1.5-rebased.jar" />
-          <zipfileset src="${gwt.tools.lib}/tomcat/ant-launcher-1.6.5.jar" />
-          <zipfileset src="${gwt.tools.lib}/tomcat/catalina-1.0.jar" />
-          <zipfileset src="${gwt.tools.lib}/tomcat/catalina-optional-1.0.jar" />
-          <zipfileset src="${gwt.tools.lib}/tomcat/commons-beanutils-1.6.jar" />
-          <zipfileset src="${gwt.tools.lib}/tomcat/commons-collections-3.1.jar" />
-          <zipfileset src="${gwt.tools.lib}/tomcat/commons-digester-1.5.jar" />
-          <zipfileset src="${gwt.tools.lib}/tomcat/commons-el-1.0.jar" />
-          <zipfileset src="${gwt.tools.lib}/tomcat/commons-logging-1.0.jar" />
-          <zipfileset src="${gwt.tools.lib}/tomcat/commons-modeler-1.1.jar" />
-          <zipfileset src="${gwt.tools.lib}/tomcat/jakarta-regexp-1.3.jar" />
-          <zipfileset src="${gwt.tools.lib}/tomcat/jasper-compiler-1.0.jar" />
-          <zipfileset src="${gwt.tools.lib}/tomcat/jasper-runtime-1.0.jar" />
-          <zipfileset src="${gwt.tools.lib}/tomcat/jsp-api-2.0.jar" />
-          <zipfileset src="${gwt.tools.lib}/tomcat/mx4j-jmx-1.1.jar" />
-          <zipfileset src="${gwt.tools.lib}/tomcat/naming-common-1.0.jar" />
-          <zipfileset src="${gwt.tools.lib}/tomcat/naming-factory-1.0.jar" />
-          <zipfileset src="${gwt.tools.lib}/tomcat/naming-java-1.0.jar" />
-          <zipfileset src="${gwt.tools.lib}/tomcat/naming-resources-1.0.jar" />
-          <zipfileset src="${gwt.tools.lib}/tomcat/servlet-api-2.5.jar" />
-          <zipfileset src="${gwt.tools.lib}/tomcat/servlet-api-2.4.jar" />
-          <zipfileset src="${gwt.tools.lib}/tomcat/servlets-common-1.0.jar" />
-          <zipfileset src="${gwt.tools.lib}/tomcat/servlets-default-1.0.jar" />
-          <zipfileset src="${gwt.tools.lib}/tomcat/servlets-invoker-1.0.jar" />
-          <zipfileset src="${gwt.tools.lib}/tomcat/tomcat-coyote-1.0.jar" />
-          <zipfileset src="${gwt.tools.lib}/tomcat/tomcat-http11-1.0.jar" />
-          <zipfileset src="${gwt.tools.lib}/tomcat/tomcat-jk2-2.1.jar" />
-          <zipfileset src="${gwt.tools.lib}/tomcat/tomcat-util-5.1.jar" />
-          <!-- htmlunit dependencies not already included: BEGIN -->
-          <zipfileset src="${gwt.tools.lib}/apache/http/httpclient-4.0.1.jar" />
-          <zipfileset src="${gwt.tools.lib}/apache/http/httpcore-4.0.1.jar" />
-          <zipfileset src="${gwt.tools.lib}/apache/http/httpmime-4.0.1.jar" />
-          <zipfileset src="${gwt.tools.lib}/apache/james/apache-mime4j-0.6.jar" />
-          <zipfileset src="${gwt.tools.lib}/apache/commons/commons-codec-1.3.jar" />
-          <zipfileset src="${gwt.tools.lib}/apache/commons/commons-io-1.4.jar" />
-          <zipfileset src="${gwt.tools.lib}/apache/commons/commons-lang-2.4.jar" />
-          <zipfileset src="${gwt.tools.lib}/cssparser/cssparser-0.9.5.jar" />
-          <zipfileset src="${gwt.tools.lib}/htmlunit/htmlunit-r5940/htmlunit-r5940.jar" />
-          <zipfileset src="${gwt.tools.lib}/htmlunit/htmlunit-r5940/htmlunit-core-js-r5940.jar" />
-          <zipfileset src="${gwt.tools.lib}/nekohtml/nekohtml-1.9.13.jar" />
-          <zipfileset src="${gwt.tools.lib}/cup/java-cup-11a.jar" />
-          <zipfileset src="${gwt.tools.lib}/xalan/xalan-2.7.1-nocup.jar" />
-          <zipfileset src="${gwt.tools.lib}/xerces/xerces-2_9_1/serializer.jar" />
-          <zipfileset src="${gwt.tools.lib}/xerces/xerces-2_9_1/xercesImpl-NoMetaInf.jar" />
-          <zipfileset src="${gwt.tools.lib}/xerces/xerces-2_9_1/xml-apis.jar" />
-          <zipfileset src="${gwt.tools.lib}/w3c/sac/sac-1.3.jar" />
-          <!-- htmlunit dependencies not already included: END -->
-          <zipfileset src="${gwt.tools.lib}/sun/swingworker/swing-worker-1.1.jar" />
-          <zipfileset src="${gwt.tools.lib}/guava/guava-r06/guava-r06-rebased-2.jar" />
-        </gwt.jar>
-      </sequential>
-    </outofdate>
-  </target>
-
-  <property name="filter.pattern" value="com/google/gwt/dev/About.properties" />
-
-  <target name="-filter.props" description="Creates filtered About.properties with version info"
-     unless="filter.uptodate">
-    <gwt.revfilter todir="${javac.out}">
-      <fileset dir="core/src" includes="${filter.pattern}" />
-    </gwt.revfilter>
-    <touch file="${filter.sentinel}" />
-  </target>
-
-  <target name="compiler.standalone" description="Validates that the standalone gwt-compiler project can build.">
-    <mkdir dir="${javac.out}" />
-    <gwt.javac srcdir="core/super" excludes="com/google/gwt/dev/jjs/intrinsic/"/>
-    <gwt.javac srcdir="core/src">
-      <include name="com/google/gwt/core/ext/**"/>
-      <include name="com/google/gwt/core/linker/**"/>
-      <include name="com/google/gwt/dev/About.java"/>
-      <include name="com/google/gwt/dev/GwtVersion.java"/>
-      <include name="com/google/gwt/dev/Permutation.java"/>
-      <include name="com/google/gwt/dev/asm/**"/>
-      <include name="com/google/gwt/dev/cfg/**"/>
-      <include name="com/google/gwt/dev/javac/**"/>
-      <include name="com/google/gwt/dev/jdt/**"/>
-      <include name="com/google/gwt/dev/jjs/**"/>
-      <include name="com/google/gwt/dev/js/**"/>
-      <include name="com/google/gwt/dev/json/**"/>
-      <include name="com/google/gwt/dev/resource/**"/>
-      <include name="com/google/gwt/dev/util/**"/>
-      <include name="com/google/gwt/soyc/**"/>
-      <include name="com/google/gwt/util/**"/>
-      <include name="org/eclipse/jdt/**"/>
-      <classpath>
-          <pathelement location="${gwt.tools.lib}/apache/ant-1.6.5.jar" />
-          <pathelement location="${gwt.tools.lib}/eclipse/jdt-3.4.2.jar" />
-          <pathelement location="${gwt.tools.lib}/tomcat/commons-collections-3.1.jar" />
-          <pathelement location="${gwt.tools.lib}/guava/guava-r06/guava-r06-rebased-2.jar" />
-      </classpath>
-    </gwt.javac>
-  </target>
-  
-  <target name="compile" depends="compiler.standalone, build.alldeps.jar" description="Compiles this project">
-    <gwt.javac srcdir="" excludes="${filter.pattern}">
-      <src path="core/src" />
-      <classpath>
-        <pathelement location="${alldeps.jar}" />
-      </classpath>
-    </gwt.javac>
-    <copy todir="${javac.out}">
-      <fileset dir="core/src" includes="**/*.properties" excludes="${filter.pattern}"/>
-    </copy>
-
-    <!-- Files with hardcoded version information must be filtered -->
-    <gwt.getsvninfo />
-    <condition property="filter.uptodate">
-      <and>
-        <available file="${filter.sentinel}" />
-        <uptodate>
-          <srcfiles dir="core/src" includes="${filter.pattern}" />
-          <globmapper from="*" to="${javac.out}/*" />
-        </uptodate>
-      </and>
-    </condition>
-    <antcall target="-filter.props" />
-  </target>
-
-  <target name="generate.remotemessageproto.java">
-    <!-- Generate the java code -->
-    <exec executable="protoc" failonerror="true">
-        <arg value="--java_out=core/src"/>
-        <arg value="./core/src/com/google/gwt/dev/shell/remoteui/remotemessage.proto"/>
-    </exec>
-      
-    <!-- Rebase the java code to match the rebased protobuf library -->
-    <replace file="./core/src/com/google/gwt/dev/shell/remoteui/RemoteMessageProto.java">
-        <replacefilter token="com.google.protobuf" value="com.google.gwt.dev.protobuf"/>
-    </replace>
-  </target>
-      
-  <target name="checkstyle" description="Static analysis of source">
-    <gwt.checkstyle>
-      <fileset dir="core/src">
-        <filename name="com/google/gwt/dev/shell/remoteui/RemoteMessageProto.java" negate="yes" />
-        <filename name="com/google/gwt/dev/asm/**/*.java" negate="yes" />
-        <filename name="com/google/gwt/dev/js/rhino/**/*.java" negate="yes" />
-        <filename name="org/eclipse/**/*.java" negate="yes" />
-        <filename name="org/apache/**/*.java" negate="yes" />
-      </fileset>
-    </gwt.checkstyle>
-
-    <gwt.checkstyle>
-      <fileset dir="core/super/com/google/gwt/dev/jjs/intrinsic" />
-    </gwt.checkstyle>
-
-  </target>
-
-  <target name="test" depends="build, compile.tests" description="Run unit tests for this project.">
-    <fileset id="tests.dev.core" dir="${javac.junit.out}" includes="${gwt.junit.testcase.dev.core.includes}" excludes="${gwt.junit.testcase.dev.core.excludes}" />
-    <gwt.junit test.name="dev" test.out="${junit.out}"
-        test.args="${test.args}"
-        test.jvmargs="${test.jvmargs}"
-        test.cases="tests.dev.core" >
-      <extraclasspaths>
-        <pathelement location="${alldeps.jar}" />
-        <!-- TODO: the following six items are needed because dev (alone) does
-            not adhere to the .../{src,super,test} convention, having a split
-            between core and (historically) oophm and the OS platforms.  When
-            that unifies, these should go away. -->
-        <pathelement location="${gwt.root}/${project.tail}/core/src" />
-        <pathelement location="${gwt.root}/${project.tail}/core/super" />
-        <pathelement location="${gwt.root}/${project.tail}/core/test" />
-        <!-- Pull in gwt-dev and gwt-user sources for .gwt.xml files -->
-        <pathelement location="${gwt.root}/user/src/" />
-        <pathelement location="${gwt.root}/user/super/" />
-        <!-- CompilerTest compiles the hello sample. -->
-        <pathelement location="${gwt.root}/samples/hello/src/" />
-      </extraclasspaths>
-    </gwt.junit>
-  </target>
-
-  <property.ensure name="gwt.tools.soyc" location="${gwt.root}/tools/soyc-vis" />
-  <target name="build" depends="compile" description="Build and package this project">
-    <mkdir dir="${gwt.build.lib}" />
-    <outofdate>
-      <sourcefiles>
-        <fileset dir="core/src">
-          <exclude name="**/package.html"/>
-          <exclude name="**/*.properties"/> <!-- copied and/or filtered into bin -->
-        </fileset>
-        <fileset dir="core/super" excludes="**/package.html" />
-        <fileset dir="${javac.out}" />
-        <fileset dir="${project.build}/bin" />
-        <fileset file="${project.build}/alldeps.jar" />
-        <fileset file="${gwt.tools.soyc}/classLevel.css"/>
-        <fileset file="${gwt.tools.soyc}/roundedCorners.css"/>
-      </sourcefiles>
-      <targetfiles>
-        <fileset file="${project.lib}"/>
-      </targetfiles>
-      <sequential>
-        <gwt.jar>
-          <fileset dir="core/src">
-            <exclude name="**/package.html"/>
-            <exclude name="**/*.properties"/> <!-- copied and/or filtered into bin -->
-          </fileset>
-          <fileset dir="core/super" excludes="**/package.html" />
-          <fileset dir="${javac.out}" />
-          <zipfileset src="${alldeps.jar}" />
-
-          <zipfileset file="${gwt.tools.soyc}/classLevel.css" prefix="com/google/gwt/soyc/resources/"/>
-          <zipfileset file="${gwt.tools.soyc}/roundedCorners.css" prefix="com/google/gwt/soyc/resources/"/>
-
-          <manifest>
-            <attribute name="Main-Class" value="com.google.gwt.dev.GWTMain" />
-          </manifest>
-        </gwt.jar>
-      </sequential>
-    </outofdate>
-  </target>
-</project>
diff --git a/2.4/dev/common.ant.xml b/2.4/dev/common.ant.xml
deleted file mode 100755
index 262d3ba..0000000
--- a/2.4/dev/common.ant.xml
+++ /dev/null
@@ -1,60 +0,0 @@
-<project name="dev-common">
-  <property name="gwt.root" location="../.." />
-  <import file="${gwt.root}/common.ant.xml" />
-
-  <property.ensure name="gwt.core.root" location="../core" />
-  <property.ensure name="gwt.core.build" location="${project.build}/../core" />
-
-  <target name="compile" description="Compile all java files">
-    <mkdir dir="${javac.out}" />
-    <gwt.javac>
-      <classpath>
-        <pathelement location="${gwt.core.build}/bin" />
-        <pathelement location="${gwt.core.build}/alldeps.jar" />
-      </classpath>
-    </gwt.javac>
-  </target>
-
-  <target name="build" depends="compile" description="Build and package this project">
-    <mkdir dir="${gwt.build.lib}" />
-    <outofdate>
-      <sourcefiles>
-        <fileset dir="src" excludes="**/package.html"/>
-        <fileset dir="${gwt.core.root}/src">
-          <exclude name="**/package.html"/>
-          <exclude name="**/*.properties"/> <!-- copied and/or filtered into bin -->
-        </fileset>
-        <fileset dir="${gwt.core.root}/super" excludes="**/package.html" />
-        <fileset dir="${javac.out}" />
-        <fileset dir="${gwt.core.build}/bin" />
-        <fileset file="${gwt.core.build}/alldeps.jar" />
-      </sourcefiles>
-      <targetfiles>
-        <fileset file="${project.lib}"/>
-      </targetfiles>
-      <sequential>
-        <gwt.jar>
-          <fileset dir="src" excludes="**/package.html"/>
-          <fileset dir="${gwt.core.root}/src">
-            <exclude name="**/package.html"/>
-            <exclude name="**/*.properties"/> <!-- copied and/or filtered into bin -->
-          </fileset>
-          <fileset dir="${gwt.core.root}/super" excludes="**/package.html" />
-          <fileset dir="${javac.out}" />
-          <fileset dir="${gwt.core.build}/bin" />
-          <zipfileset src="${gwt.core.build}/alldeps.jar" />
-
-          <manifest>
-            <attribute name="Main-Class" value="com.google.gwt.dev.GWTMain" />
-          </manifest>
-        </gwt.jar>
-      </sequential>
-    </outofdate>
-  </target>
-
-  <target name="clean" description="Cleans this project's intermediate and output files">
-    <delete dir="${project.build}" failonerror="false" />
-    <delete file="${project.lib}" failonerror="false" />
-  </target>
-
-</project>
diff --git a/2.4/dev/core/src/com/google/gwt/core/ext/BadPropertyValueException.java b/2.4/dev/core/src/com/google/gwt/core/ext/BadPropertyValueException.java
deleted file mode 100644
index 2220c7b..0000000
--- a/2.4/dev/core/src/com/google/gwt/core/ext/BadPropertyValueException.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright 2006 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.core.ext;
-
-/**
- * Thrown when a deferred binding property contains an invalid value.
- */
-public class BadPropertyValueException extends Exception {
-
-  private final String badValue;
-
-  private final String propName;
-  
-  public BadPropertyValueException(String propName) {
-    super("Missing property '" + propName + "' was not specified");
-
-    this.propName = propName;
-    this.badValue = "<null>";
-  }
-
-  public BadPropertyValueException(String propName, String badValue) {
-    super("Property '" + propName + "' cannot be set to unexpected value '"
-      + badValue + "'");
-
-    this.propName = propName;
-    this.badValue = badValue;
-  }
-
-  String getBadValue() {
-    return badValue;
-  }
-  String getPropName() {
-    return propName;
-  }
-}
diff --git a/2.4/dev/core/src/com/google/gwt/core/ext/ConfigurationProperty.java b/2.4/dev/core/src/com/google/gwt/core/ext/ConfigurationProperty.java
deleted file mode 100644
index 4967881..0000000
--- a/2.4/dev/core/src/com/google/gwt/core/ext/ConfigurationProperty.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * 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.core.ext;
-
-import java.util.List;
-
-/**
- * A named configuration (property, values) pair.
- */
-public interface ConfigurationProperty {
-  
-  /**
-   * The name of the property.
-   * 
-   * @return the property name as a String.
-   * */
-  String getName();
-
-  /**
-   * The values for the permutation currently being considered.
-   * 
-   * @return the property values as a List of Strings.
-   */
-  List<String> getValues();
-}
diff --git a/2.4/dev/core/src/com/google/gwt/core/ext/DefaultConfigurationProperty.java b/2.4/dev/core/src/com/google/gwt/core/ext/DefaultConfigurationProperty.java
deleted file mode 100644
index 5948806..0000000
--- a/2.4/dev/core/src/com/google/gwt/core/ext/DefaultConfigurationProperty.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * 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.core.ext;
-
-import java.util.List;
-
-/**
- * Default immutable implementation of ConfigurationProperty that receives its
- * values in its constructor.
- */
-public class DefaultConfigurationProperty implements ConfigurationProperty {
-
-  private final String name;
-  private final List<String> values;
-
-  /**
-   * Construct a configuration property.
-   *  
-   * @param name the name of this property, must not be null
-   * @param values the list of possible values, must not be null and
-   *     will be returned to callers, so a copy should be passed into this
-   *     ctor if the caller will use this set later
-   */
-  public DefaultConfigurationProperty(String name, List<String> values) {
-    assert name != null;
-    assert values != null;
-    this.name = name;
-    this.values = values;
-  }
-
-  @Override
-  public boolean equals(Object obj) {
-    if (this == obj) {
-      return true;
-    }
-    if (obj == null) {
-      return false;
-    }
-    if (getClass() != obj.getClass()) {
-      return false;
-    }
-    DefaultConfigurationProperty other = (DefaultConfigurationProperty) obj;
-    return name.equals(other.name)
-        && values.equals(other.values);
-  }
-
-  public String getName() {
-    return name;
-  }
-
-  public List<String> getValues() {
-    return values;
-  }
-
-  @Override
-  public int hashCode() {
-    final int prime = 31;
-    int result = 1;
-    result = prime * result + name.hashCode();
-    result = prime * result + values.hashCode();
-    return result;
-  }
-  
-  @Override
-  public String toString() {
-    return "ConfigProp " + name + ": " + values.toString();
-  }
-}
diff --git a/2.4/dev/core/src/com/google/gwt/core/ext/DefaultSelectionProperty.java b/2.4/dev/core/src/com/google/gwt/core/ext/DefaultSelectionProperty.java
deleted file mode 100644
index bf6cafd..0000000
--- a/2.4/dev/core/src/com/google/gwt/core/ext/DefaultSelectionProperty.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * 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.core.ext;
-
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.SortedSet;
-
-/**
- * Default immutable implementation of SelectionProperty that receives its
- * values in its constructor.
- */
-public class DefaultSelectionProperty implements SelectionProperty {
-
-  private final String currentValue;
-  private final String fallbackValue;
-  private final String name;
-  private final SortedSet<String> possibleValues;
-  private final Map<String, ? extends List<? extends Set<String>>> fallbackValueMap;
-
-  /**
-   * Construct a selection property.
-   *  
-   * @param currentValue current value of this property, must not be null
-   * @param fallbackValue the fallback value to use, must not be null
-   * @param name the name of this property, must not be null
-   * @param possibleValues the set of possible values, must not be null and
-   *     will be returned to callers, so a copy should be passed into this
-   *     ctor if the caller will use this set later
-   */
-  public DefaultSelectionProperty(String currentValue, String fallbackValue,
-      String name, SortedSet<String> possibleValues) {
-    this(currentValue, fallbackValue, name, possibleValues, null);
-  }
-
-  /**
-   * Construct a selection property.
-   *  
-   * @param currentValue current value of this property, must not be null
-   * @param fallbackValue the fallback value to use, must not be null
-   * @param name the name of this property, must not be null
-   * @param possibleValues the set of possible values, must not be null and
-   *     will be returned to callers, so a copy should be passed into this
-   *     ctor if the caller will use this set later
-   * @param fallbackValueMap the map propertyValue to fallback values
-   */
-  public DefaultSelectionProperty(String currentValue, String fallbackValue,
-      String name, SortedSet<String> possibleValues,
-      Map<String, ? extends List<? extends Set<String>>> fallbackValueMap) {
-    assert currentValue != null;
-    assert fallbackValue != null;
-    assert name != null;
-    assert possibleValues != null;
-    this.currentValue = currentValue;
-    this.fallbackValue = fallbackValue;
-    this.name = name;
-    this.possibleValues = possibleValues;
-    this.fallbackValueMap = fallbackValueMap;
-  }
-
-  @Override
-  public boolean equals(Object obj) {
-    if (this == obj) {
-      return true;
-    }
-    if (obj == null) {
-      return false;
-    }
-    if (getClass() != obj.getClass()) {
-      return false;
-    }
-    DefaultSelectionProperty other = (DefaultSelectionProperty) obj;
-    return currentValue.equals(other.currentValue)
-        && fallbackValue.equals(other.fallbackValue)
-        && name.equals(other.name)
-        && possibleValues.equals(other.possibleValues);
-  }
-
-  public String getCurrentValue() {
-    return currentValue;
-  }
-
-  public String getFallbackValue() {
-    return fallbackValue;
-  }
-
-  public List<? extends Set<String>> getFallbackValues(String value) {
-    return (null != fallbackValueMap) ? fallbackValueMap.get(value) : null;
-  }
-
-  public String getName() {
-    return name;
-  }
-
-  public SortedSet<String> getPossibleValues() {
-    return possibleValues;
-  }
-
-  @Override
-  public int hashCode() {
-    final int prime = 31;
-    int result = 1;
-    result = prime * result + currentValue.hashCode();
-    result = prime * result + fallbackValue.hashCode();
-    result = prime * result + name.hashCode();
-    result = prime * result + possibleValues.hashCode();
-    return result;
-  }
-  
-  @Override
-  public String toString() {
-    return "SelectionProp " + name + ": " + currentValue + " of "
-        + possibleValues.toString() + ", fallback =" + fallbackValue;
-  }
-}
diff --git a/2.4/dev/core/src/com/google/gwt/core/ext/Generator.java b/2.4/dev/core/src/com/google/gwt/core/ext/Generator.java
deleted file mode 100644
index 524dddb..0000000
--- a/2.4/dev/core/src/com/google/gwt/core/ext/Generator.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright 2006 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.core.ext;
-
-/**
- * Generates source code for subclasses during deferred binding requests.
- * Subclasses must be thread-safe.
- */
-public abstract class Generator {
-
-  /**
-   * Escapes string content to be a valid string literal.
-   * 
-   * @return an escaped version of <code>unescaped</code>, suitable for being
-   *         enclosed in double quotes in Java source
-   */
-  public static String escape(String unescaped) {
-    int extra = 0;
-    for (int in = 0, n = unescaped.length(); in < n; ++in) {
-      switch (unescaped.charAt(in)) {
-        case '\0':
-        case '\n':
-        case '\r':
-        case '\"':
-        case '\\':
-          ++extra;
-          break;
-      }
-    }
-
-    if (extra == 0) {
-      return unescaped;
-    }
-
-    char[] oldChars = unescaped.toCharArray();
-    char[] newChars = new char[oldChars.length + extra];
-    for (int in = 0, out = 0, n = oldChars.length; in < n; ++in, ++out) {
-      char c = oldChars[in];
-      switch (c) {
-        case '\0':
-          newChars[out++] = '\\';
-          c = '0';
-          break;
-        case '\n':
-          newChars[out++] = '\\';
-          c = 'n';
-          break;
-        case '\r':
-          newChars[out++] = '\\';
-          c = 'r';
-          break;
-        case '\"':
-          newChars[out++] = '\\';
-          c = '"';
-          break;
-        case '\\':
-          newChars[out++] = '\\';
-          c = '\\';
-          break;
-      }
-      newChars[out] = c;
-    }
-
-    return String.valueOf(newChars);
-  }
-
-  /**
-   * Generate a default constructible subclass of the requested type. The
-   * generator throws <code>UnableToCompleteException</code> if for any reason
-   * it cannot provide a substitute class
-   * 
-   * @return the name of a subclass to substitute for the requested class, or
-   *         return <code>null</code> to cause the requested type itself to be
-   *         used
-   * 
-   */
-  public abstract String generate(TreeLogger logger, GeneratorContext context,
-      String typeName) throws UnableToCompleteException;
-}
diff --git a/2.4/dev/core/src/com/google/gwt/core/ext/GeneratorContext.java b/2.4/dev/core/src/com/google/gwt/core/ext/GeneratorContext.java
deleted file mode 100644
index 6e70447..0000000
--- a/2.4/dev/core/src/com/google/gwt/core/ext/GeneratorContext.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Copyright 2007 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.core.ext;
-
-import com.google.gwt.core.ext.linker.Artifact;
-import com.google.gwt.core.ext.linker.GeneratedResource;
-import com.google.gwt.core.ext.typeinfo.TypeOracle;
-import com.google.gwt.dev.resource.ResourceOracle;
-
-import java.io.OutputStream;
-import java.io.PrintWriter;
-
-/**
- * Provides metadata to deferred binding generators.
- */
-public interface GeneratorContext {
-
-  /**
-   * Checks whether a rebind rule is available for a given sourceTypeName, such
-   * as can appear in a replace-with or generate-with rule.
-   * 
-   * @param sourceTypeName the name of a type to check for rebind rule
-   *          availability.
-   * @return true if a rebind rule is available
-   */
-  boolean checkRebindRuleAvailable(String sourceTypeName);
-
-  /**
-   * Commits source generation begun with
-   * {@link #tryCreate(TreeLogger, String, String)}.
-   */
-  void commit(TreeLogger logger, PrintWriter pw);
-
-  /**
-   * Add an Artifact to the {@link com.google.gwt.core.ext.linker.ArtifactSet}
-   * that will be presented to the {@link Linker} chain at the end of the
-   * compilation cycle. Custom sub-classes of Artifact can be used to write
-   * cooperating Generator and Linker combinations. This method is semantically
-   * equivalent to calling
-   * {@link com.google.gwt.core.ext.linker.ArtifactSet#replace(Artifact)} if an
-   * equivalent Artifact had previously been committed.
-   * 
-   * @param logger a logger; normally the logger passed into
-   *          {@link Generator#generate(TreeLogger, GeneratorContext, String)}
-   *          or a branch thereof
-   * @param artifact the Artifact to provide to the Linker chain.
-   */
-  void commitArtifact(TreeLogger logger, Artifact<?> artifact) throws UnableToCompleteException;
-
-  /**
-   * Commits resource generation begun with
-   * {@link #tryCreateResource(TreeLogger, String)}.
-   * 
-   * @return the GeneratedResource that was created as a result of committing
-   *         the OutputStream.
-   * @throws UnableToCompleteException if the resource cannot be written to
-   *           disk, if the specified stream is unknown, or if the stream has
-   *           already been committed
-   */
-  GeneratedResource commitResource(TreeLogger logger, OutputStream os)
-      throws UnableToCompleteException;
-
-  /**
-   * Gets the property oracle for the current generator context. Generators can
-   * use the property oracle to query deferred binding properties.
-   */
-  PropertyOracle getPropertyOracle();
-
-  /**
-   * Returns a resource oracle containing all resources that are mapped into the
-   * module's source (or super-source) paths. Conceptually, this resource oracle
-   * exposes resources which are "siblings" to GWT-compatible Java classes. For
-   * example, if the module includes <code>com.google.gwt.core.client</code> as
-   * a source package, then a resource at
-   * <code>com/google/gwt/core/client/Foo.properties</code> would be exposed by
-   * this resource oracle.
-   */
-  ResourceOracle getResourcesOracle();
-
-  /**
-   * Gets the type oracle for the current generator context. Generators can use
-   * the type oracle to ask questions about the entire translatable code base.
-   * 
-   * @return a TypeOracle over all the relevant translatable compilation units
-   *         in the source path
-   */
-  TypeOracle getTypeOracle();
-
-  /**
-   * Attempts to get a <code>PrintWriter</code> so that the caller can generate
-   * the source code for the named type. If the named types already exists,
-   * <code>null</code> is returned to indicate that no work needs to be done.
-   * The file is not committed until {@link #commit(TreeLogger, PrintWriter)} is
-   * called.
-   * 
-   * @param logger a logger; normally the logger passed into
-   *          {@link Generator#generate(TreeLogger, GeneratorContext, String)}
-   *          or a branch thereof
-   * @param packageName the name of the package to which the create type belongs
-   * @param simpleName the unqualified source name of the type being generated
-   * @return <code>null</code> if the package and class already exists,
-   *         otherwise a <code>PrintWriter</code> is returned.
-   */
-  PrintWriter tryCreate(TreeLogger logger, String packageName, String simpleName);
-
-  /**
-   * Attempts to get an <code>OutputStream</code> so that the caller can write
-   * file contents into the named file underneath the compilation output
-   * directory. The file is not committed until
-   * {@link #commitResource(TreeLogger, OutputStream)} is called.
-   * 
-   * @param logger a logger; normally the logger passed into
-   *          {@link Generator#generate(TreeLogger, GeneratorContext, String)}
-   *          or a branch thereof
-   * @param partialPath the name of the file whose contents are to be written;
-   *          the name can include subdirectories separated by forward slashes
-   *          ('/')
-   * @return an <code>OutputStream</code> into which file contents can be
-   *         written, or <code>null</code> if a resource by that name is already
-   *         pending or already exists
-   * @throws UnableToCompleteException if the resource could not be initialized
-   *           for some reason, such as if the specified partial path is invalid
-   */
-  OutputStream tryCreateResource(TreeLogger logger, String partialPath)
-      throws UnableToCompleteException;
-}
diff --git a/2.4/dev/core/src/com/google/gwt/core/ext/GeneratorContextExt.java b/2.4/dev/core/src/com/google/gwt/core/ext/GeneratorContextExt.java
deleted file mode 100644
index 7153684..0000000
--- a/2.4/dev/core/src/com/google/gwt/core/ext/GeneratorContextExt.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright 2010 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.core.ext;
-
-import com.google.gwt.dev.javac.rebind.CachedRebindResult;
-
-/**
- * EXPERIMENTAL and subject to change. Do not use this in production code.
- * <p>
- * An extension to GeneratorContext which includes access to previously cached
- * rebind results.
- * <p> 
- * TODO(jbrosenberg): Merge this into {@link GeneratorContext} directly, once 
- * the api has stabilized and we can remove the "experimental" moniker.
- */
-public interface GeneratorContextExt extends GeneratorContext {
-  
-  /**
-   * Get cached result from a previous run of the current generator, if available.
-   * 
-   * @return A {@link com.google.gwt.dev.javac.rebind.CachedRebindResult} object,
-   *         if one has been provided to the context.  Null is returned if there
-   *         is no previous result, or if generator result caching is not enabled.
-   */
-  CachedRebindResult getCachedGeneratorResult();
-  
-  /**
-   * Check whether generator result caching is currently enabled.
-   */
-  boolean isGeneratorResultCachingEnabled();
-
-  /**
-   * Returns true if generators are being run to produce code for a
-   * production compile. Returns false for dev mode. Generators can use this
-   * information to produce code optimized for the target. 
-   */
-  boolean isProdMode();
-  
-  /**
-   * Mark a type to be reused from the generator result cache.  Calling this
-   * method with a successful response indicates that the calling generator will 
-   * not re-generate this type.  A cached version of this type will be added
-   * to the context once the calling generator returns from 
-   * {@link GeneratorExt#generateIncrementally}, with a result containing 
-   * {@link com.google.gwt.dev.javac.rebind.RebindStatus#USE_PARTIAL_CACHED}.
-   * 
-   * @param typeName the fully qualified name of a type.
-   * @return true if the requested type is available from the generator result 
-   *         cache, false otherwise.
-   */
-  boolean reuseTypeFromCacheIfAvailable(String typeName);
-}
diff --git a/2.4/dev/core/src/com/google/gwt/core/ext/GeneratorContextExtWrapper.java b/2.4/dev/core/src/com/google/gwt/core/ext/GeneratorContextExtWrapper.java
deleted file mode 100644
index b429da3..0000000
--- a/2.4/dev/core/src/com/google/gwt/core/ext/GeneratorContextExtWrapper.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Copyright 2010 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.core.ext;
-
-import com.google.gwt.core.ext.linker.Artifact;
-import com.google.gwt.core.ext.linker.GeneratedResource;
-import com.google.gwt.core.ext.typeinfo.TypeOracle;
-import com.google.gwt.dev.javac.rebind.CachedRebindResult;
-import com.google.gwt.dev.resource.ResourceOracle;
-
-import java.io.OutputStream;
-import java.io.PrintWriter;
-
-/**
- * EXPERIMENTAL and subject to change. Do not use this in production code.
- * <p>
- * A wrapper to access a base {@link GeneratorContext} instance as a
- * {@link GeneratorContextExt} instance. Methods from the
- * {@link GeneratorContext} interface are passed through to the baseContext,
- * while methods from the {@link GeneratorContextExt} interface are given
- * default stub implementations.
- */
-public class GeneratorContextExtWrapper implements GeneratorContextExt {
-
-  /**
-   * Get a new instance wrapped from a base {@link GeneratorContext}
-   * implementation.
-   */
-  public static GeneratorContextExt newInstance(GeneratorContext baseContext) {
-    return new GeneratorContextExtWrapper(baseContext);
-  }
-
-  private final GeneratorContext baseContext;
-
-  private GeneratorContextExtWrapper(GeneratorContext baseContext) {
-    this.baseContext = baseContext;
-  }
-
-  public boolean checkRebindRuleAvailable(String sourceTypeName) {
-    return baseContext.checkRebindRuleAvailable(sourceTypeName);
-  }
-
-  public void commit(TreeLogger logger, PrintWriter pw) {
-    baseContext.commit(logger, pw);
-  }
-
-  public void commitArtifact(TreeLogger logger, Artifact<?> artifact)
-      throws UnableToCompleteException {
-    baseContext.commitArtifact(logger, artifact);
-  }
-
-  public GeneratedResource commitResource(TreeLogger logger, OutputStream os)
-      throws UnableToCompleteException {
-    return baseContext.commitResource(logger, os);
-  }
-
-  public CachedRebindResult getCachedGeneratorResult() {
-    return null;
-  }
-
-  public PropertyOracle getPropertyOracle() {
-    return baseContext.getPropertyOracle();
-  }
-
-  public ResourceOracle getResourcesOracle() {
-    return baseContext.getResourcesOracle();
-  }
-
-  public TypeOracle getTypeOracle() {
-    return baseContext.getTypeOracle();
-  }
-
-  public boolean isGeneratorResultCachingEnabled() {
-    return false;
-  }
-
-  public boolean isProdMode() {
-    throw new UnsupportedOperationException(
-        "isProdMode is only available from GeneratorContextExt.");
-  }
-
-  public boolean reuseTypeFromCacheIfAvailable(String typeName) {
-    return false;
-  }
-
-  public PrintWriter tryCreate(TreeLogger logger, String packageName, String simpleName) {
-    return baseContext.tryCreate(logger, packageName, simpleName);
-  }
-
-  public OutputStream tryCreateResource(TreeLogger logger, String partialPath)
-      throws UnableToCompleteException {
-    return baseContext.tryCreateResource(logger, partialPath);
-  }
-}
diff --git a/2.4/dev/core/src/com/google/gwt/core/ext/GeneratorExt.java b/2.4/dev/core/src/com/google/gwt/core/ext/GeneratorExt.java
deleted file mode 100644
index 4e24aaf..0000000
--- a/2.4/dev/core/src/com/google/gwt/core/ext/GeneratorExt.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright 2010 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.core.ext;
-
-import com.google.gwt.dev.javac.rebind.RebindResult;
-
-/**
- * EXPERIMENTAL and subject to change. Do not use this in production code.
- * <p>
- * Adds a new {@link #generateIncrementally} method.
- * <p> 
- * TODO(jbrosenberg): Merge this into {@link Generator} directly, once the api
- * has stabilized and we can remove the "experimental" moniker.
- */
-public abstract class GeneratorExt extends Generator {
- 
-  /**
-   * A default implementation of the abstract method defined in the base
-   * {@link Generator} class.  This will wrap a call to
-   * {@link #generateIncrementally}, and attempt no caching.  This supports
-   * backwards compatibility for applications or other generators which call 
-   * this generator directly, as outside of the normal internal rebind process.
-   * <p>
-   * It is recommended that {@link #generateIncrementally} be used instead.
-   * 
-   * @return the name of a subclass to substitute for the requested class, or
-   *         return <code>null</code> to cause the requested type itself to be
-   *         used
-   */
-  @Override
-  public String generate(TreeLogger logger, GeneratorContext context,
-      String typeName) throws UnableToCompleteException {
-    
-    // wrap the passed in context
-    GeneratorContextExt contextExt = context instanceof GeneratorContextExt
-        ? (GeneratorContextExt) context
-        : GeneratorContextExtWrapper.newInstance(context);
-    
-    RebindResult result = generateIncrementally(logger, contextExt, typeName);
-    return result.getReturnedTypeName();
-  }
-  
-  /**
-   * Incrementally generate a default constructible subclass of the requested 
-   * type.  The generator can use information from the context to determine
-   * whether it needs to regenerate everything, or whether it can selectively
-   * regenerate a subset of its output, or whether it can return quickly to
-   * allow reuse of all previously cached objects.  It will return a 
-   * {@link RebindResult}, which contains a
-   * {@link com.google.gwt.dev.javac.rebind.RebindStatus} field indicating
-   * whether to use previously cached artifacts, newly generated ones, or a
-   * partial mixture of both cached and newly generated objects.
-   * <p>
-   * The result also includes a field for the name of the subclass to 
-   * substitute for the requested class.
-   * <p>
-   * The generator throws an <code>UnableToCompleteException</code> if for 
-   * any reason it cannot complete successfully.
-   * 
-   * @return a RebindResult
-   */
-  public abstract RebindResult generateIncrementally(TreeLogger logger, 
-      GeneratorContextExt context, String typeName) 
-      throws UnableToCompleteException;
-}
diff --git a/2.4/dev/core/src/com/google/gwt/core/ext/GeneratorExtWrapper.java b/2.4/dev/core/src/com/google/gwt/core/ext/GeneratorExtWrapper.java
deleted file mode 100644
index bc8a250..0000000
--- a/2.4/dev/core/src/com/google/gwt/core/ext/GeneratorExtWrapper.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright 2010 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.core.ext;
-
-import com.google.gwt.dev.javac.rebind.RebindResult;
-import com.google.gwt.dev.javac.rebind.RebindStatus;
-
-/**
- * EXPERIMENTAL and subject to change. Do not use this in production code.
- * <p>  
- * A wrapper class for using base {@link Generator} implementations where
- * a {@link GeneratorExt} instance is needed.
- */
-public class GeneratorExtWrapper extends GeneratorExt {
- 
-  /**
-   * Get a new instance wrapped from a base {@link Generator} implementation.
-   */
-  public static GeneratorExt newInstance(Generator baseGenerator) {
-    return new GeneratorExtWrapper(baseGenerator);
-  }
-
-  private final Generator baseGenerator;
- 
-  public GeneratorExtWrapper(Generator baseGenerator) {
-    this.baseGenerator = baseGenerator;
-  }
- 
-  /**
-   * Pass through to the base generator's generate method.
-   */
-  @Override
-  public String generate(TreeLogger logger, GeneratorContext context,
-      String typeName) throws UnableToCompleteException {
-    return this.baseGenerator.generate(logger, context, typeName);
-  }
-
-  /**
-   * Call base generator's generate method, and don't attempt any caching.
-   */
-  @Override
-  public RebindResult generateIncrementally(TreeLogger logger, 
-      GeneratorContextExt context, String typeName) 
-      throws UnableToCompleteException {
-
-    RebindStatus status;
-    String resultTypeName = generate(logger, context, typeName);
-    if (resultTypeName == null) {
-      status = RebindStatus.USE_EXISTING;
-      resultTypeName = typeName;
-    } else {
-      status = RebindStatus.USE_ALL_NEW_WITH_NO_CACHING;
-    }
-
-    return new RebindResult(status, resultTypeName);
-  }
-}
\ No newline at end of file
diff --git a/2.4/dev/core/src/com/google/gwt/core/ext/Linker.java b/2.4/dev/core/src/com/google/gwt/core/ext/Linker.java
deleted file mode 100644
index 82c1731..0000000
--- a/2.4/dev/core/src/com/google/gwt/core/ext/Linker.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * 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.core.ext;
-
-import com.google.gwt.core.ext.linker.ArtifactSet;
-import com.google.gwt.core.ext.linker.Shardable;
-
-/**
- * Defines a linker for the GWT compiler. Each Linker must be annotated with a
- * {@link com.google.gwt.core.ext.linker.LinkerOrder} annotation to determine
- * the relative ordering of the Linkers. Exact order of Linker execution will be
- * determined by the order of <code>add-linker</code> tags in the module
- * configuration. Each Linker should also be annotated with {@link Shardable};
- * non-shardable linkers are deprecated and will eventually not be supported.
- * 
- * <p>
- * A new instance of a linker is created each time a module is compiled or
- * during hosted mode when a module first loads (or is refreshed). During a
- * compile, {@link #link(TreeLogger, LinkerContext, ArtifactSet)} is called
- * exactly once on each non-shardable linker, and the artifact set will contain
- * any and all generated artifacts. For shardable linkers,
- * {@link #link(TreeLogger, LinkerContext, ArtifactSet, boolean)} is called once
- * for each compiled permutation and once after all compiles are finished. The
- * precise artifacts supplied differ with each call and are described in the
- * method's documentation.
- * 
- * <p>
- * When hosted mode starts for a module, it calls
- * {@link #link(TreeLogger, LinkerContext, ArtifactSet)} for non-shardable
- * linkers and {@link #link(TreeLogger, LinkerContext, ArtifactSet, boolean)}
- * for shardable ones, passing <code>false</code> as the
- * <code>onePermutation</code> argument. If any artifacts are subsequently
- * generated during the course of running hosted mode,
- * {@link #relink(TreeLogger, LinkerContext, ArtifactSet)} will be called with
- * the new artifacts.
- * </p>
- */
-public abstract class Linker {
-  /**
-   * Returns a human-readable String describing the Linker.
-   */
-  public abstract String getDescription();
-
-  /**
-   * Check whether this class is considered a shardable linker. A linker is
-   * shardable if it either implements the {@link Shardable} annotation or it
-   * has a field named <code>gwtIsShardable</code>. If such a field is present,
-   * it doesn't matter what value the field holds. The latter mechanism is only
-   * intended to support linkers that must compile against older versions of
-   * GWT.
-   */
-  public final boolean isShardable() {
-    if (getClass().isAnnotationPresent(Shardable.class)) {
-      return true;
-    }
-
-    try {
-      getClass().getDeclaredField("gwtIsShardable");
-      return true;
-    } catch (NoSuchFieldException e) {
-      // The field does not exist; fall through
-    }
-
-    return false;
-  }
-  
-  /**
-   * This method is invoked for linkers not annotated with {@link Shardable}. It
-   * sees all artifacts across the whole compile and can modify them
-   * arbitrarily. This method is only called if the linker is not annotated with
-   * {@link Shardable}.
-   * 
-   * @param logger the TreeLogger to record to
-   * @param context provides access to the Linker's environment
-   * @param artifacts an unmodifiable view of the artifacts to link
-   * @return the artifacts that should be propagated through the linker chain
-   * @throws UnableToCompleteException if compilation violates assumptions made
-   *           by the Linker or for errors encountered by the Linker
-   */
-  public ArtifactSet link(TreeLogger logger, LinkerContext context,
-      ArtifactSet artifacts) throws UnableToCompleteException {
-    assert !isShardable();
-    return artifacts;
-  }
-
-  /**
-   * <p>
-   * This method is invoked for linkers annotated with {@link Shardable}. It is
-   * called at two points during compilation: after the compile of each
-   * permutation, and after all compilation has finished. The
-   * <code>onePermutation</code> is <code>true</code> for a per-permutation call
-   * and <code>false</code> for a global final-link call.
-   * 
-   * <p>
-   * For one-permutation calls, this method is passed all artifacts generated
-   * for just the one permutation. For the global call at the end of
-   * compilation, this method sees artifacts for the whole compilation, but with
-   * two modifications intended to support builds on computer clusters:
-   * <ol>
-   * <li>All EmittedArtifacts have been converted to BinaryEmittedArtifacts
-   * <li>All artifacts not marked as
-   * {@link com.google.gwt.core.ext.linker.Transferable} have been discarded.
-   * </ol>
-   * 
-   * @param logger the TreeLogger to record to
-   * @param context provides access to the Linker's environment
-   * @param artifacts an unmodifiable view of the artifacts to link
-   * @param onePermutation true for a one-permutation call
-   * @return the artifacts that should be propagated through the linker chain
-   * @throws UnableToCompleteException if compilation violates assumptions made
-   *           by the Linker or for errors encountered by the Linker
-   */
-  public ArtifactSet link(TreeLogger logger, LinkerContext context,
-      ArtifactSet artifacts, boolean onePermutation)
-      throws UnableToCompleteException {
-    assert isShardable();
-    return artifacts;
-  }
-
-  /**
-   * Re-invoke the Linker with newly generated artifacts. Linkers that need to
-   * reference the original artifact set passed into
-   * {@link #link(TreeLogger, LinkerContext, ArtifactSet)} should retain a copy
-   * of the original artifact set in an instance variable.
-   * 
-   * @param logger the TreeLogger to record to
-   * @param context provides access to the Linker's environment
-   * @param newArtifacts an unmodifiable view of the newly generated artifacts
-   * @return the new artifacts that should be propagated through the linker
-   *         chain; it is not necessary to return any artifacts from the
-   *         original link (or previous calls to relink) that have not been
-   *         modified
-   * @throws UnableToCompleteException if compilation violates assumptions made
-   *           by the Linker or for errors encountered by the Linker
-   */
-  public ArtifactSet relink(TreeLogger logger, LinkerContext context,
-      ArtifactSet newArtifacts) throws UnableToCompleteException {
-    return newArtifacts;
-  }
-
-  /**
-   * Returns {@code true} if this linker supports DevMode.
-   * 
-   * @param context a LinkerContext
-   */
-  public boolean supportsDevModeInJunit(LinkerContext context) {
-    // By default, linkers do not support Dev Mode
-    return false;
-  }
-}
diff --git a/2.4/dev/core/src/com/google/gwt/core/ext/LinkerContext.java b/2.4/dev/core/src/com/google/gwt/core/ext/LinkerContext.java
deleted file mode 100644
index 7f1d37f..0000000
--- a/2.4/dev/core/src/com/google/gwt/core/ext/LinkerContext.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * 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.core.ext;
-
-import com.google.gwt.core.ext.linker.ConfigurationProperty;
-import com.google.gwt.core.ext.linker.SelectionProperty;
-
-import java.util.SortedSet;
-
-/**
- * Provides access to data about the linking process. Methods that return a
- * {@link SortedSet} are guaranteed to have stable iteration order between runs
- * of the compiler over identical input. Unless otherwise specified, the exact
- * iteration order is left as an implementation detail.
- */
-public interface LinkerContext {
-  /**
-   * Returns all configuration properties defined in the module. Configuration
-   * properties do not have any impact on deferred-binding decisions, but may
-   * affect the behaviors of Generators and Linkers.
-   */
-  SortedSet<ConfigurationProperty> getConfigurationProperties();
-
-  /**
-   * Returns the name of the module's bootstrap function.
-   */
-  String getModuleFunctionName();
-
-  /**
-   * Returns the time at which the module being compiled was last modified. Can
-   * be used to set an appropriate timestamp on artifacts which depend solely on
-   * the module definition.
-   */
-  long getModuleLastModified();
-
-  /**
-   * Returns the name of the module being compiled.
-   */
-  String getModuleName();
-
-  /**
-   * Returns all deferred binding properties defined in the module. The
-   * SelectionProperties will be sorted by the standard string comparison
-   * function on the name of the property.
-   */
-  SortedSet<SelectionProperty> getProperties();
-
-  /**
-   * Returns <code>true</code> if the output should be as compact is possible
-   * and <code>false</code> if the output should be human-readable.
-   */
-  boolean isOutputCompact();
-
-  /**
-   * Applies optimizations to a JavaScript program. This method is intended to
-   * be applied to bootstrap scripts in order to apply context-specific
-   * transformations to the program, based on the compiler's configuration. The
-   * return value will be functionally-equivalent JavaScript, although the exact
-   * transformations and structure of the output should be considered opaque.
-   * 
-   * While this function can be safely applied multiple times, the best results
-   * will be obtained by performing all JavaScript assembly and calling the
-   * function just before writing the selection script to disk.
-   */
-  String optimizeJavaScript(TreeLogger logger, String jsProgram)
-      throws UnableToCompleteException;
-}
diff --git a/2.4/dev/core/src/com/google/gwt/core/ext/PropertyOracle.java b/2.4/dev/core/src/com/google/gwt/core/ext/PropertyOracle.java
deleted file mode 100644
index bb46a69..0000000
--- a/2.4/dev/core/src/com/google/gwt/core/ext/PropertyOracle.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * 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.core.ext;
-
-/**
- * Provides deferred binding property values.
- */
-public interface PropertyOracle {
-
-  /**
-   * Attempts to get a named configuration property. Throws
-   * <code>BadPropertyValueException</code> if the property is undefined. The
-   * result of invoking this method with the same <code>propertyName</code> must
-   * be stable.
-   * 
-   * @param propertyName 
-   * @return the configuration property instance (never null)
-   * @throws BadPropertyValueException if the property is unknown or not a
-   *     configuration property
-   */
-  ConfigurationProperty getConfigurationProperty(String propertyName)
-      throws BadPropertyValueException;
-
-  /**
-   * Attempts to get a named deferred binding property or configuration
-   * property. Throws <code>BadPropertyValueException</code> if the property is
-   * either undefined or has a value that is unsupported. The result of invoking
-   * this method with the same <code>propertyName</code> must be stable.
-   * 
-   * @param logger the current logger
-   * @param propertyName the name of the property
-   * @return a value for the property
-   * @throws BadPropertyValueException if the property is unknown or not of the
-   *     right type
-   */
-  @Deprecated
-  String getPropertyValue(TreeLogger logger, String propertyName)
-      throws BadPropertyValueException;
-
-  /**
-   * Attempts to get a named deferred binding property and returns the list of
-   * possible values. Throws <code>BadPropertyValueException</code> if the
-   * property is a configuration property or is undefined. The result of
-   * invoking this method with the same <code>propertyName</code> must be
-   * stable.
-   * 
-   * @param logger the current logger
-   * @param propertyName the name of the property
-   * @return the possible values for the property
-   * @throws BadPropertyValueException if the property is unknown or not of the
-   *     right type 
-   */
-  @Deprecated
-  String[] getPropertyValueSet(TreeLogger logger, String propertyName)
-      throws BadPropertyValueException;
-
-  /**
-   * Attempts to get a named deferred binding property. Throws
-   * <code>BadPropertyValueException</code> if the property is either undefined
-   * or has a value that is unsupported. The result of invoking this method with
-   * the same <code>propertyName</code> must be stable.
-   * @param logger 
-   * @param propertyName 
-   * @return the selection property instance (never null)
-   * @throws BadPropertyValueException if the property is unknown or not a
-   *     selection property
-   */
-  SelectionProperty getSelectionProperty(TreeLogger logger, String propertyName)
-      throws BadPropertyValueException;
-}
diff --git a/2.4/dev/core/src/com/google/gwt/core/ext/SelectionProperty.java b/2.4/dev/core/src/com/google/gwt/core/ext/SelectionProperty.java
deleted file mode 100644
index e286d75..0000000
--- a/2.4/dev/core/src/com/google/gwt/core/ext/SelectionProperty.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * 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.core.ext;
-
-import java.util.List;
-import java.util.Set;
-import java.util.SortedSet;
-
-/**
- * A named deferred binding (property, value) pair for use in generators.
- * 
- * @see com.google.gwt.core.ext.linker.SelectionProperty A similarly-named
- * analog for linkers.
- */
-public interface SelectionProperty {
-  
-  /**
-   * The name of the property.
-   * 
-   * @return the property name as a String.
-   * */
-  String getName();
-
-  /**
-   * The value for the permutation currently being considered.
-   * 
-   * @return the property value as a String.
-   */
-  String getCurrentValue();
-
-  /**
-   * Gets the fallback value for the property.
-   * @return the fallback, or ""
-   */
-  String getFallbackValue(); 
-
-  /**
-   * Returns the list of fall back values for a given value. 
-   * @param value the property value
-   * @return the fall back list of values by increasing order
-   *         of preference.
-   */
-  List<? extends Set<String>> getFallbackValues(String value);
-
-  /**
-   * Returns the possible values for the property in sorted order.
-   * 
-   * @return a SortedSet of Strings containing the possible property values.
-   */
-  SortedSet<String> getPossibleValues();
-}
diff --git a/2.4/dev/core/src/com/google/gwt/core/ext/ServletContainer.java b/2.4/dev/core/src/com/google/gwt/core/ext/ServletContainer.java
deleted file mode 100644
index acd2a25..0000000
--- a/2.4/dev/core/src/com/google/gwt/core/ext/ServletContainer.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * 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.core.ext;
-
-/**
- * An instance of a servlet container that can be used by the shell. It is
- * assumed that this servlet container serves a web app from the directory
- * specified when this servlet container was created.
- */
-public abstract class ServletContainer {
-
-  /**
-   * Returns the host on which the servlet container is running. Defaults to
-   * "localhost". Used to construct a URL to reach the servlet container.
-   */
-  public String getHost() {
-    return "localhost";
-  }
-
-  /**
-   * Returns the port on which the server is running.Used to construct a URL to
-   * reach the servlet container.
-   */
-  public abstract int getPort();
-
-  /**
-   * Causes the web app to pick up changes made within the app root dir while
-   * running. This method cannot be called after {@link #stop()} has been
-   * called.
-   * 
-   * TODO(bruce): need to determine whether all the important servlet containers
-   * will let us do this (e.g. ensure they don't lock files we would need to
-   * update)
-   * 
-   * @throws UnableToCompleteException
-   */
-  public abstract void refresh() throws UnableToCompleteException;
-
-  /**
-   * Stops the running servlet container. It cannot be restarted after this.
-   * 
-   * @throws UnableToCompleteException
-   */
-  public abstract void stop() throws UnableToCompleteException;
-}
diff --git a/2.4/dev/core/src/com/google/gwt/core/ext/ServletContainerLauncher.java b/2.4/dev/core/src/com/google/gwt/core/ext/ServletContainerLauncher.java
deleted file mode 100644
index cd47771..0000000
--- a/2.4/dev/core/src/com/google/gwt/core/ext/ServletContainerLauncher.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * 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.core.ext;
-
-import java.io.File;
-import java.net.BindException;
-
-/**
- * Defines the service provider interface for launching servlet containers that
- * can be used by the GWT development mode.
- * <p>
- * Subclasses should be careful about calling any methods defined on this class
- * or else they risk failing when used with a version of GWT that did not have
- * those methods.
- */
-public abstract class ServletContainerLauncher {
-  /*
-   * NOTE: Any new methods must have default implementations, and any users of
-   * this class must be prepared to handle LinkageErrors when calling new
-   * methods.
-   */
-
-  /**
-   * @return byte array containing an icon (fitting into 24x24) to
-   *     use for the server, or null if only the name should be used
-   */
-  public byte[] getIconBytes() {
-    return null;
-  }
-
-  /**
-   * @return a path to a 24-pixel high image file (relative to the classpath) to
-   *     be used for this servlet container, or null if none.
-   * @deprecated see {@link #getIconBytes} instead.
-   */
-  @Deprecated
-  public String getIconPath() {
-    return null;
-  }
-
-  /**
-   * @return a short human-readable name of this servlet container, or null
-   *     if no name should be displayed.
-   */
-  public String getName() {
-    return "Web Server";
-  }
-  /**
-   * Return true if this servlet container launcher is configured for secure
-   * operation (ie, HTTPS).  This value is only queried after arguments, if any,
-   * have been processed.
-   * 
-   * The default implementation just returns false.
-   * 
-   * @return true if HTTPS is in use
-   */
-  public boolean isSecure() {
-    return false;
-  }
-
-  /**
-   * Process any supplied arguments.
-   * <p>
-   * Will be called before {@link #start(TreeLogger, int, File)}, if at all.
-   * 
-   * @param logger logger to use for warnings/errors
-   * @param arguments single string containing the arguments for this SCL, the
-   *     format to be defined by the SCL
-   * @return true if the arguments were processed successfully
-   */
-  public boolean processArguments(TreeLogger logger, String arguments) {
-    logger.log(TreeLogger.ERROR, getName() + " does not accept any arguments");
-    return false;
-  }
-
-  /**
-   * Set the bind address for the web server socket.
-   * <p>
-   * Will be called before {@link #start(TreeLogger, int, File)}, if at all.
-   * If not called, the SCL should listen on all addresses.
-   * 
-   * @param bindAddress host name or IP address, suitable for use with
-   *     {@link java.net.InetAddress#getByName(String)}
-   */
-  public void setBindAddress(String bindAddress) {
-    /*
-     * By default, we do nothing, which means that old SCL implementations
-     * will bind to all addresses.
-     */
-  }
-  
-  /**
-   * Start an embedded HTTP servlet container.
-   * 
-   * @param logger the server logger
-   * @param port the TCP port to serve on; if 0 is requested, a port should be
-   *          automatically selected
-   * @param appRootDir the base WAR directory
-   * @return the launched servlet container
-   * @throws BindException if the requested port is already in use
-   * @throws Exception if the server fails to start for any other reason
-   */
-  public abstract ServletContainer start(TreeLogger logger, int port,
-      File appRootDir) throws BindException, Exception;
-}
diff --git a/2.4/dev/core/src/com/google/gwt/core/ext/TreeLogger.java b/2.4/dev/core/src/com/google/gwt/core/ext/TreeLogger.java
deleted file mode 100644
index a57463f..0000000
--- a/2.4/dev/core/src/com/google/gwt/core/ext/TreeLogger.java
+++ /dev/null
@@ -1,301 +0,0 @@
-/*
- * 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.core.ext;
-
-import java.net.URL;
-
-/**
- * An interface used to log messages in deferred binding generators.
- */
-public abstract class TreeLogger {
-
-  /**
-   * Provides extra information to the user, generally details of what caused
-   * the problem or what the user should do to fix the problem. How this
-   * information is interpreted and displayed is implementation-dependent.
-   */
-  public abstract static class HelpInfo {
-
-    /**
-     * @return the text to use for an anchor if not null and getURL is non-null.
-     */
-    public String getAnchorText() {
-      return null;
-    }
-
-    /**
-     * @return the prefix to go before the link.
-     */
-    public String getPrefix() {
-      return "More info: ";
-    }
-
-    /**
-     * @return a URL containing extra information about the problem, or null if
-     *     none.
-     */
-    public URL getURL() {
-      return null;
-    }
-  }
-
-  /**
-   * A type-safe enum of all possible logging severity types.
-   */
-  @SuppressWarnings("hiding")
-  public enum Type {
-
-    /**
-     * Logs an error.
-     */
-    ERROR(true),
-
-    /**
-     * Logs a warning.
-     */
-    WARN(true),
-
-    /**
-     * Logs information.
-     */
-    INFO(false),
-
-    /**
-     * Logs information related to lower-level operation.
-     */
-    TRACE(false),
-
-    /**
-     * Logs detailed information that could be useful during debugging.
-     */
-    DEBUG(false),
-
-    /**
-     * Logs extremely verbose and detailed information that is typically useful
-     * only to product implementors.
-     */
-    SPAM(false),
-
-    /**
-     * Logs everything -- quite a bit of stuff.
-     */
-    ALL(false);
-
-    /**
-     * Gets all the possible severity types as an array.
-     * 
-     * @return an array of severity types
-     */
-    public static Type[] instances() {
-      return Type.values();
-    }
-
-    private final boolean needsAttention;
-
-    /**
-     * Constructs a log type with an optional parent.
-     */
-    private Type(boolean needsAttention) {
-      this.needsAttention = needsAttention;
-    }
-
-    /**
-     * Gets the label for this severity type.
-     * 
-     * @return the label
-     */
-    public String getLabel() {
-      return this.toString();
-    }
-
-    /**
-     * Determines whether this log type is of lower priority than some other log
-     * type.
-     * 
-     * @param other the other log type
-     * @return <code>true</code> if this log type is lower priority
-     */
-    public boolean isLowerPriorityThan(Type other) {
-      // Counterintuitive: higher number is lower priority.
-      return this.ordinal() > other.ordinal();
-    }
-
-    /**
-     * Indicates whether this severity type represents a high severity that
-     * should be highlighted for the user.
-     * 
-     * @return <code>true</code> if this severity is high, otherwise
-     *         <code>false</code>.
-     */
-    public boolean needsAttention() {
-      return needsAttention;
-    }
-  }
-
-  /**
-   * Logs an error.
-   */
-  public static final Type ERROR = Type.ERROR;
-
-  /**
-   * Logs a warning.
-   */
-  public static final Type WARN = Type.WARN;
-
-  /**
-   * Logs information.
-   */
-  public static final Type INFO = Type.INFO;
-
-  /**
-   * Logs information related to lower-level operation.
-   */
-  public static final Type TRACE = Type.TRACE;
-
-  /**
-   * Logs detailed information that could be useful during debugging.
-   */
-  public static final Type DEBUG = Type.DEBUG;
-
-  /**
-   * Logs extremely verbose and detailed information that is typically useful
-   * only to product implementors.
-   */
-  public static final Type SPAM = Type.SPAM;
-
-  /**
-   * Logs everything -- quite a bit of stuff.
-   */
-  public static final Type ALL = Type.ALL;
-
-  /**
-   * A valid logger that ignores all messages. Occasionally useful when calling
-   * methods that require a logger parameter.
-   */
-  public static final TreeLogger NULL = new TreeLogger() {
-    @Override
-    public TreeLogger branch(Type type, String msg, Throwable caught,
-        HelpInfo helpInfo) {
-      return this;
-    }
-
-    @Override
-    public boolean isLoggable(Type type) {
-      return false;
-    }
-
-    @Override
-    public void log(Type type, String msg, Throwable caught, HelpInfo helpInfo) {
-      // nothing
-    }
-  };
-
-  /**
-   * Calls
-   * {@link #branch(com.google.gwt.core.ext.TreeLogger.Type, String, Throwable, com.google.gwt.core.ext.TreeLogger.HelpInfo)}
-   * with a <code>null</code> <code>caught</code> and <code>helpInfo</code>.
-   */
-  public final TreeLogger branch(TreeLogger.Type type, String msg) {
-    return branch(type, msg, null, null);
-  }
-
-  /**
-   * Calls
-   * {@link #branch(com.google.gwt.core.ext.TreeLogger.Type, String, Throwable, com.google.gwt.core.ext.TreeLogger.HelpInfo)}
-   * with a <code>null</code> <code>helpInfo</code>.
-   */
-  public final TreeLogger branch(TreeLogger.Type type, String msg,
-      Throwable caught) {
-    return branch(type, msg, caught, null);
-  }
-
-  /**
-   * Produces a branched logger, which can be used to write messages that are
-   * logically grouped together underneath the current logger. The details of
-   * how/if the resulting messages are displayed is implementation-dependent.
-   * 
-   * <p>
-   * The log message supplied when branching serves two purposes. First, the
-   * message should be considered a heading for all the child messages below it.
-   * Second, the <code>type</code> of the message provides a hint as to the
-   * importance of the children below it. As an optimization, an implementation
-   * could return a "no-op" logger if messages of the specified type weren't
-   * being logged, which the implication being that all nested log messages were
-   * no more important than the level of their branch parent.
-   * </p>
-   * 
-   * <p>
-   * As an example of how hierarchical logging can be used, a branched logger in
-   * a GUI could write log message as child items of a parent node in a tree
-   * control. If logging to streams, such as a text console, the branched logger
-   * could prefix each entry with a unique string and indent its text so that it
-   * could be sorted later to reconstruct a proper hierarchy.
-   * </p>
-   * 
-   * @param type
-   * @param msg an optional message to log, which can be <code>null</code> if
-   *          only an exception is being logged
-   * @param caught an optional exception to log, which can be <code>null</code>
-   *          if only a message is being logged
-   * @param helpInfo extra information that might be used by the logger to
-   *          provide extended information to the user
-   * @return an instance of {@link TreeLogger} representing the new branch of
-   *         the log; may be the same instance on which this method is called
-   */
-  public abstract TreeLogger branch(TreeLogger.Type type, String msg,
-      Throwable caught, HelpInfo helpInfo);
-
-  /**
-   * Determines whether or not a log entry of the specified type would actually
-   * be logged. Caller use this method to avoid constructing log messages that
-   * would be thrown away.
-   */
-  public abstract boolean isLoggable(TreeLogger.Type type);
-
-  /**
-   * Calls {@link #log(TreeLogger.Type, String, Throwable, HelpInfo)} with a
-   * <code>null</code> <code>caught</code> and <code>helpInfo</code>.
-   */
-  public final void log(TreeLogger.Type type, String msg) {
-    log(type, msg, null, null);
-  }
-
-  /**
-   * Calls {@link #log(TreeLogger.Type, String, Throwable, HelpInfo)} with a
-   * <code>null</code> <code>helpInfo</code>.
-   */
-  public final void log(TreeLogger.Type type, String msg, Throwable caught) {
-    log(type, msg, caught, null);
-  }
-
-  /**
-   * Logs a message and/or an exception, with optional help info. It is also
-   * legal to call this method using <code>null</code> arguments for <i>both</i>
-   * <code>msg</code> and <code>caught</code>, in which case the log event
-   * can be ignored. The <code>info</code> can provide extra information to
-   * the logger; a logger may choose to ignore this info.
-   * 
-   * @param type
-   * @param msg an optional message to log, which can be <code>null</code> if
-   *          only an exception is being logged
-   * @param caught an optional exception to log, which can be <code>null</code>
-   *          if only a message is being logged
-   * @param helpInfo extra information that might be used by the logger to
-   *          provide extended information to the user
-   */
-  public abstract void log(TreeLogger.Type type, String msg, Throwable caught,
-      HelpInfo helpInfo);
-}
diff --git a/2.4/dev/core/src/com/google/gwt/core/ext/UnableToCompleteException.java b/2.4/dev/core/src/com/google/gwt/core/ext/UnableToCompleteException.java
deleted file mode 100644
index 5424c53..0000000
--- a/2.4/dev/core/src/com/google/gwt/core/ext/UnableToCompleteException.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright 2006 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.core.ext;
-
-/**
- * Used to indicate that some part of a multi-step process failed. Typically,
- * operation can continue after this exception is caught.
- * 
- * Before throwing an object of this type, the thrower
- * <ul>
- * <li>must log a detailed user-facing message describing the failure,</li>
- * <li>must report any caught exception using the logger that contributed to
- * the failure, and </li>
- * <li>must not include the cause of the failure in the thrown exception
- * because (1) it will already have been associated with the detailed log entry
- * above and (2) doing so would create a misunderstanding of how to find the
- * causes of low-level errors in that sometimes there is an underlying an
- * exception, sometimes not, but there can <em>always</em> be a preceding log
- * entry. </li>
- * </ul>
- * 
- * After catching an object of this type, the catcher
- * <ul>
- * <li>can be assured that the thrower has already logged a message about the
- * lower-level problem</li>
- * <li>can optionally itself log a higher-level description of the process that
- * was interrupted and the implications of the failure, and if so,</li>
- * <li>should report this caught exception via the logger as well.</li>
- * </ul>
- * 
- * <pre>
- *  void lowLevel(Logger logger) throws UnableToCompleteException {
- *      try {
- *          doSomethingThatMightFail();
- *      catch (SomeException e) {
- *          // Log low-level detail and the caught exception.
- *          //
- *          logger.log("detailed problem explanation for user eyes...", e);
- *          
- *          // Do not include the caught exception.
- *          //
- *          throw new UnableToCompleteException();
- *      }
- *  }
- *  
- *  void highLevel(Logger logger) {
- *      try {
- *          // Multiple calls are shown to indicate that the process can 
- *          // include any number of steps.
- *          //
- *          lowLevel(logger);
- *          lowLevel(logger);
- *          lowLevel(logger);
- *      }
- *      catch (UnableToCompleteException e) {
- *          logger.log("high-level thing failed", e);
- *      }    
- *  }
- * </pre>
- * 
- */
-public class UnableToCompleteException extends Exception {
-  public UnableToCompleteException() {
-    super("(see previous log entries)");
-  }
-}
diff --git a/2.4/dev/core/src/com/google/gwt/core/ext/debug/JsoEval.java b/2.4/dev/core/src/com/google/gwt/core/ext/debug/JsoEval.java
deleted file mode 100644
index 2b140f0..0000000
--- a/2.4/dev/core/src/com/google/gwt/core/ext/debug/JsoEval.java
+++ /dev/null
@@ -1,471 +0,0 @@
-/*
- * Copyright 2011 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.core.ext.debug;
-
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-/**
- * Provides facilities for debuggers to call methods on 
- * {@link com.google.gwt.core.client.JavaScriptObject JavaScriptObjects}.
- * <p/>
- * Because devmode does extensive rewriting of JSO bytecode, debuggers can't
- * figure out how to evaluate JSO method calls. This class can be used directly
- * by users to evaluate JSO methods in their debuggers. Additionally, debuggers
- * with GWT support use this class to transparently evaluate JSO expressions in
- * breakpoints, watch windows, etc.
- * <p>
- * Example uses:
- * <code><pre>
- *   JsoEval.call(Element.class, myElement, "getAbsoluteTop");
- *   JsoEval.call(Node.class, myNode, "cloneNode", Boolean.TRUE); 
- *   JsoEval.call(Element.class, element.getFirstChildElement(), "setPropertyString", "phase", 
- *     "gamma"); 
- * </pre></code> 
- * @noinspection UnusedDeclaration
- */
-public class JsoEval {
-  
-  /* TODO: Error messages generated from JsoEval are reported with mangled
-   * method names and signatures instead of original source code values.
-   * We could de-mangle the names for the errors, but it really only matters
-   * for users who don't have IDE support.
-   */
-  
-  // TODO: Update the wiki doc to include a better description of JSO transformations and reference
-  // it from here.
-  
-  private static Map<Class,Class> boxedTypeForPrimitiveType = new HashMap<Class,Class>(8);
-  private static Map<Class,Class> primitiveTypeForBoxedType = new HashMap<Class,Class>(8);
-
-  private static final String JSO_IMPL_CLASS = "com.google.gwt.core.client.JavaScriptObject$";
-
-  static {
-    boxedTypeForPrimitiveType.put(boolean.class, Boolean.class);
-    boxedTypeForPrimitiveType.put(byte.class, Byte.class);
-    boxedTypeForPrimitiveType.put(short.class, Short.class);
-    boxedTypeForPrimitiveType.put(char.class, Character.class);
-    boxedTypeForPrimitiveType.put(int.class, Integer.class);
-    boxedTypeForPrimitiveType.put(float.class, Float.class);
-    boxedTypeForPrimitiveType.put(long.class, Long.class);
-    boxedTypeForPrimitiveType.put(double.class, Double.class);
-    
-    for (Map.Entry<Class,Class> entry : boxedTypeForPrimitiveType.entrySet()) {
-      primitiveTypeForBoxedType.put(entry.getValue(), entry.getKey());
-    }
-  }
-
-  /**
-   * Reflectively invokes a method on a JavaScriptObject.   
-   * 
-   * @param klass Either a class of type JavaScriptObject or an interface
-   * implemented by a JavaScriptObject. The class must contain the method to
-   * be invoked.
-   * @param obj The JavaScriptObject to invoke the method on. Must be null if
-   * the method is static. Must be not-null if the method is not static
-   * @param methodName The name of the method
-   * @param types The types of the arguments
-   * @param args The values of the arguments
-   * 
-   * @return The result of the method invocation or the failure as a String
-   */
-  public static Object call(Class klass, Object obj, String methodName, Class[] types,
-      Object... args) {
-    try {
-      return callEx(klass, obj, methodName, types, args);
-    } catch (Exception e) {
-      return toString(e);
-    }
-  }
-
-  /**
-   * A convenience form of 
-   * {@link #call(Class, Object, String, Class[], Object...)} for use directly
-   * by users in a debugger. This method guesses at the types of the method
-   * based on the values of {@code args}.
-   * 
-   * @return The result of the method invocation or the failure as a String
-   */
-  public static Object call(Class klass, Object obj, String methodName, Object... args) {
-    try {
-      return callEx(klass, obj, methodName, args);
-    } catch (Exception e) {
-      return toString(e);
-    }
-  }
-  
-  /**
-   * Reflectively invokes a method on a JavaScriptObject.   
-   * 
-   * @param klass Either a class of type JavaScriptObject or an interface
-   * implemented by a JavaScriptObject. The class must contain the method to
-   * be invoked.
-   * @param obj The JavaScriptObject to invoke the method on. Must be null if
-   * the method is static. Must be not-null if the method is not static
-   * @param methodName The name of the method
-   * @param types The types of the arguments
-   * @param args The values of the arguments
-   * 
-   * @return The result of the method invocation
-   */
-  public static Object callEx(Class klass, Object obj, String methodName, Class[] types,
-      Object... args)
-      throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException,
-      IllegalAccessException {
-    return invoke(klass, obj, getJsoMethod(klass, obj, methodName, types), args);
-  }
-
-  /**
-   * A convenience form of 
-   * {@link #call(Class, Object, String, Class[], Object...)} for use directly
-   * by users in a debugger. This method guesses at the types of the method
-   * based on the values of {@code args}.
-   */
-  public static Object callEx(Class klass, Object obj, String methodName, Object... args)
-      throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException,
-      IllegalAccessException {
-    if (args == null) {
-      // A single-argument varargs null can come in unboxed  
-      args = new Object[]{null};
-    }
-
-    if (obj != null) {
-      if (!obj.getClass().getName().equals(JSO_IMPL_CLASS)) {
-        throw new RuntimeException(obj + " is not a JavaScriptObject.");
-      }
-    }
-
-    // First check java.lang.Object methods for exact matches
-    Method[] methods = Object.class.getMethods();
-    nextMethod: for (Method m : methods) {
-      if (m.getName().equals(methodName)) {
-        Class[] types = m.getParameterTypes();
-        if (types.length != args.length) {
-          continue;
-        }
-        for (int i = 0, j = 0; i < args.length; ++i, ++j) {
-          if (!isAssignable(types[i], args[j])) {
-            continue nextMethod;
-          }
-        }
-        return m.invoke(obj, args);
-      }
-    }
-    
-    ClassLoader ccl = getCompilingClassLoader(klass, obj);
-    boolean isJso = isJso(ccl, klass);
-    boolean isStaticifiedDispatch = isJso && obj != null;
-    int actualNumArgs = isStaticifiedDispatch ? args.length + 1 : args.length;
-
-    ArrayList<Method> matchingMethods = new ArrayList<Method>(Arrays.asList(
-        isJso ? getSisterJsoImpl(klass, ccl).getMethods() : getJsoImplClass(ccl).getMethods()));
-
-    String mangledMethodName = mangleMethod(klass, methodName, isJso, isStaticifiedDispatch);
-    
-    // Filter the methods in multiple passes to give better error messages.
-    for (Iterator<Method> it = matchingMethods.iterator(); it.hasNext();) {
-      Method m = it.next();
-      if (!m.getName().equalsIgnoreCase(mangledMethodName)) {
-        it.remove();
-      }
-    }
-
-    if (matchingMethods.isEmpty()) {
-      throw new RuntimeException(
-          "No methods by the name, " + methodName + ", could be found in " + klass);
-    }
-
-    ArrayList<Method> candidates = new ArrayList<Method>(matchingMethods);
-    
-    for (Iterator<Method> it = matchingMethods.iterator(); it.hasNext();) {
-      Method m = it.next();
-      if (m.getParameterTypes().length != actualNumArgs) {
-        it.remove();
-      }
-    }
-
-    if (matchingMethods.isEmpty()) {
-      throw new RuntimeException(
-          "No methods by the name, " + methodName + ", in " + klass + " accept "
-              + args.length + " parameters. Candidates are:\n" + candidates);
-    }
-    
-    candidates = new ArrayList<Method>(matchingMethods);
-    
-    nextMethod: for (Iterator<Method> it = matchingMethods.iterator(); it.hasNext();) {
-      Method m = it.next();
-      Class[] methodTypes = m.getParameterTypes();
-      for (int i = isStaticifiedDispatch ? 1 : 0, j = 0; i < methodTypes.length; ++i, ++j) {
-        if (!isAssignable(methodTypes[i], args[j])) {
-          it.remove();
-          continue nextMethod;
-        }
-      }
-    }
-
-    if (matchingMethods.isEmpty()) {
-      throw new RuntimeException(
-          "No methods accepting " + Arrays.asList(args) + " were found for, " + methodName
-              + ", in " + klass + ". Candidates:\n" + candidates);
-    }
-
-    candidates = new ArrayList<Method>(matchingMethods);
-    
-    if (matchingMethods.size() > 1) {
-      // Try to filter by exact name on the crazy off chance there are two
-      // methods by same name but different case.
-      for (Iterator<Method> it = matchingMethods.iterator(); it.hasNext();) {
-        Method m = it.next();
-        if (!m.getName().equals(mangledMethodName)) {
-          it.remove();
-        }
-      }      
-    }
-
-    if (matchingMethods.isEmpty()) {
-      throw new RuntimeException(
-          "Multiple methods with a case-insensitive match were found for, " + methodName
-              + ", in " + klass + ". Candidates:\n" + candidates);
-    }
-    
-    if (matchingMethods.size() > 1) {
-      throw new RuntimeException(
-          "Found more than one matching method. Please specify the types of the parameters. "
-              + "Candidates:\n" + matchingMethods);
-    }
-    
-    return invoke(klass, obj, matchingMethods.get(0), args);
-  }
-  
-  /**
-   * Reflectively invokes a static method on a JavaScriptObject. Has the same
-   * effect as calling {@link #call(Class, Object, String, Class[], Object...) 
-   * call(klass, null, methodName, types, args)}
-   *
-   * @return The result of the method invocation or the failure as a String
-   */
-  public static Object callStatic(Class klass, String methodName, Class[] types, Object... args) {
-    try {
-      return callStaticEx(klass, methodName, types, args);
-    } catch (Exception e) {
-      return toString(e);
-    }
-  }
-  
-  /**
-   * Reflectively invokes a static method on a JavaScriptObject. Has the same
-   * effect as calling {@link #call(Class, Object, String, Class[], Object...)
-   * call(klass, null, methodName, types, args)}
-   */
-  public static Object callStaticEx(Class klass, String methodName, Class[] types, Object... args)
-      throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException,
-      IllegalAccessException {
-    return call(klass, null, methodName, types, args);
-  }
-    
-  /**
-   * Try to find the CompilingClassLoader. This can fail if<ol> 
-   * <li> the user provides an object that isn't a JSO or
-   * <li>the user provides a null JSO and a Class that wasn't loaded by the
-   * CompilingClassLoader
-   * </ol> 
-   * I don't have any great solutions for that scenario.
-   */
-  private static ClassLoader getCompilingClassLoader(Class klass, Object obj) {
-    ClassLoader ccl;
-
-    if (obj != null) {
-      ccl = obj.getClass().getClassLoader();
-    } else {
-      // try passed in class
-      ccl = klass.getClassLoader();
-    }
-
-    if (ccl == null || 
-        !ccl.getClass().getName().equals("com.google.gwt.dev.shell.CompilingClassLoader")) {
-      if (obj != null) {
-        throw new RuntimeException(
-            "The object, " + obj + ", does not appear to be a JavaScriptObject or an interface " +
-                "implemented by a JavaScriptObject. GWT could not find a CompilingClassLoader " +
-                "for it.");
-      } else {
-        throw new RuntimeException(
-            "The class, " + klass + ", does not appear to be a JavaScriptObject or an interface " +
-                "implemented by a JavaScriptObject. GWT could not find a CompilingClassLoader " + 
-                " for it.");
-      }
-    }
-    return ccl;
-  }
-
-  /**
-   * Returns the class for {@code JavaScriptObject}. We need the version which
-   * is loaded by a specific CompilingClassLoader.
-   */
-  private static Class getJsoClass(ClassLoader cl) {
-    try {
-      return Class.forName("com.google.gwt.core.client.JavaScriptObject", false, cl);
-    } catch (ClassNotFoundException e) {
-      throw new RuntimeException("Failed to find JavaScriptObject", e);
-    }
-  }
-
-  /**
-   * Returns the class for {@code JavaScriptObject$}. We need the version which
-   * is loaded by a specific CompilingClassLoader.
-   */
-  private static Class getJsoImplClass(ClassLoader cl) {
-    try {
-      return Class.forName(JSO_IMPL_CLASS, false, cl);
-    } catch (ClassNotFoundException e) {
-      throw new RuntimeException("Failed to find " + JSO_IMPL_CLASS, e);
-    }
-  }
-
-  private static Method getJsoMethod(Class klass, Object obj, String methodName, Class[] types)
-      throws ClassNotFoundException, NoSuchMethodException {
-    if (obj != null) {
-      if (!obj.getClass().getName().equals(JSO_IMPL_CLASS)) {
-        throw new RuntimeException(obj + " is not a JavaScriptObject.");
-      }
-    }
-    
-    // First see if it's a method inherited from java.lang.Object
-    Method[] methods = Object.class.getMethods();
-    for (Method m : methods) {
-      if (m.getName().equals(methodName) && Arrays.equals(m.getParameterTypes(), types)) {
-        return m;
-      }
-    }
-    
-    ClassLoader ccl = getCompilingClassLoader(klass, obj);
-    boolean isJso = isJso(ccl, klass);
-    boolean isStaticifiedDispatch = isJso && obj != null;    
-    String mangledMethod = mangleMethod(klass, methodName, isJso, isStaticifiedDispatch);
-    
-    if (!isJso) {
-      // If this is interface dispatch, then the method lives on
-      // JavaScriptObject$ and is mangled so that it doesn't conflict with any
-      // other classes.
-      Class jsoImplClass = getJsoImplClass(ccl);
-      try {
-        return jsoImplClass.getMethod(mangledMethod, types);
-      } catch (NoSuchMethodException e) {
-        throw new RuntimeException("Unable to find the interface method, " + methodName
-            + ". Is there a JSO that implements it?", e);
-      }
-    }
-
-    // All other methods lives on the impl subclass of JavaScriptObject$,
-    // and have been rewritten to be static dispatch.        
-    Class jsoImplSubclass = getSisterJsoImpl(klass, ccl);
-    
-    if (obj != null) {
-      // If this is an instance method, we need to insert obj as the "this" ref
-      // in the args
-      Class[] newTypes = new Class[types.length + 1];
-      newTypes[0] = klass;
-      System.arraycopy(types, 0, newTypes, 1, types.length);
-      types = newTypes;
-    }
-    
-    return jsoImplSubclass.getMethod(mangledMethod, types);
-  }
-
-  private static Class<?> getSisterJsoImpl(Class klass, ClassLoader ccl)
-      throws ClassNotFoundException {
-    return Class.forName(klass.getName() + '$', false, ccl);
-  }
-
-  private static Object invoke(Class klass, Object obj, Method m, Object... args)
-      throws InvocationTargetException, IllegalAccessException, ClassNotFoundException,
-      NoSuchMethodException {
-    if (args == null) {
-      // A single-argument varargs null can come in unboxed  
-      args = new Object[]{null};
-    }
-    
-    ClassLoader ccl = getCompilingClassLoader(klass, obj);
-
-    if (!isJso(ccl, klass)) {
-      // Calling through a non-JSO interface - normal instance dispatch.
-      Object result = m.invoke(obj, args);
-      return m.getReturnType() == void.class ? "[success]" : result;
-    }
-
-    // All other methods lives on the impl subclass of JavaScriptObject$,
-    // and have been rewritten to be static dispatch.        
-    if (obj != null) {
-      // If this is an instance method, we need to insert obj as the "this" 
-      // ref in the args
-      Object[] newArgs = new Object[args.length + 1];
-      newArgs[0] = obj;
-      System.arraycopy(args, 0, newArgs, 1, args.length);
-      args = newArgs;
-    }
-
-    Object result = m.invoke(obj, args);
-    return m.getReturnType() == void.class ? "[success]" : result;
-  }
-
-  private static boolean isAssignable(Class type, Object value) {
-    if (value == null) {
-      return !type.isPrimitive();
-    }
-    Class valueType = value.getClass();
-    if (type.isAssignableFrom(valueType)) {
-      return true;
-    }
-    if (boxedTypeForPrimitiveType.get(valueType) == type
-        || primitiveTypeForBoxedType.get(valueType) == type) {
-      return true;
-    }
-    return false;
-  }
-
-  private static boolean isJso(ClassLoader ccl, Class klass) {
-    return getJsoClass(ccl).isAssignableFrom(klass);
-  }
-    
-  private static String mangleMethod(Class klass, String methodName, boolean isJso, 
-      boolean isVirtual) {
-    // If this is interface dispatch from a non-JSO, then the method lives on
-    // JavaScriptObject$ and is mangled with the fully qualified class name so
-    // that it doesn't conflict with methods from other classes. Otherwise
-    // virtual dispatch is re-written to static dispatch, and a '$' is 
-    // appended to the name of the method. 
-    return isJso ? isVirtual ? methodName + '$' : methodName
-        : klass.getName().replace('.', '_') + '_' + methodName;
-  }
-  
-  private static String toString(Exception e) {
-    StringWriter sw = new StringWriter();
-    PrintWriter w = new PrintWriter(sw);
-    e.printStackTrace(w);
-    w.close();
-    return sw.toString();    
-  }
-  
-  private JsoEval() {    
-  }    
-}
diff --git a/2.4/dev/core/src/com/google/gwt/core/ext/linker/AbstractLinker.java b/2.4/dev/core/src/com/google/gwt/core/ext/linker/AbstractLinker.java
deleted file mode 100644
index e8313f4..0000000
--- a/2.4/dev/core/src/com/google/gwt/core/ext/linker/AbstractLinker.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * 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.core.ext.linker;
-
-import com.google.gwt.core.ext.Linker;
-import com.google.gwt.core.ext.TreeLogger;
-import com.google.gwt.core.ext.UnableToCompleteException;
-import com.google.gwt.dev.util.Util;
-
-import java.io.ByteArrayOutputStream;
-import java.io.InputStream;
-
-/**
- * Provides basic functions common to all Linker implementations.
- */
-public abstract class AbstractLinker extends Linker {
-  /**
-   * A helper method to create an artifact from an array of bytes.
-   * 
-   * @param logger a TreeLogger
-   * @param what the data to emit
-   * @param partialPath the partial path of the resource
-   * @return an artifact that contains the given data
-   * @throws UnableToCompleteException
-   */
-  protected final SyntheticArtifact emitBytes(TreeLogger logger, byte[] what,
-      String partialPath) throws UnableToCompleteException {
-    return new SyntheticArtifact(getClass(), partialPath, what);
-  }
-
-  /**
-   * A helper method to create an artifact from an array of bytes.
-   * 
-   * @param logger a TreeLogger
-   * @param what the data to emit
-   * @param partialPath the partial path of the resource
-   * @return an artifact that contains the given data
-   * @param lastModified the last modified time of the new artifact
-   * @throws UnableToCompleteException
-   */
-  protected final SyntheticArtifact emitBytes(TreeLogger logger, byte[] what,
-      String partialPath, long lastModified) throws UnableToCompleteException {
-    return new SyntheticArtifact(getClass(), partialPath, what, lastModified);
-  }
-
-  /**
-   * A helper method to create an artifact to emit the contents of an
-   * InputStream.
-   * 
-   * @param logger a TreeLogger
-   * @param what the source InputStream
-   * @param partialPath the partial path of the emitted resource
-   * @return an artifact that contains the contents of the InputStream
-   */
-  protected final SyntheticArtifact emitInputStream(TreeLogger logger,
-      InputStream what, String partialPath) throws UnableToCompleteException {
-    ByteArrayOutputStream out = new ByteArrayOutputStream();
-    Util.copy(logger, what, out);
-    return emitBytes(logger, out.toByteArray(), partialPath);
-  }
-
-  /**
-   * A helper method to create an artifact to emit the contents of an
-   * InputStream.
-   * 
-   * @param logger a TreeLogger
-   * @param what the source InputStream
-   * @param partialPath the partial path of the emitted resource
-   * @param lastModified the last modified time of the new artifact
-   * @return an artifact that contains the contents of the InputStream
-   */
-  protected final SyntheticArtifact emitInputStream(TreeLogger logger,
-      InputStream what, String partialPath, long lastModified)
-      throws UnableToCompleteException {
-    ByteArrayOutputStream out = new ByteArrayOutputStream();
-    Util.copy(logger, what, out);
-    return emitBytes(logger, out.toByteArray(), partialPath, lastModified);
-  }
-
-  /**
-   * A helper method to create an artifact to emit a String.
-   * 
-   * @param logger a TreeLogger
-   * @param what the contents of the Artifact to emit
-   * @param partialPath the partial path of the emitted resource
-   * @return an artifact that contains the contents of the given String
-   */
-  protected final SyntheticArtifact emitString(TreeLogger logger, String what,
-      String partialPath) throws UnableToCompleteException {
-    return emitBytes(logger, Util.getBytes(what), partialPath);
-  }
-
-  /**
-   * A helper method to create an artifact to emit a String.
-   * 
-   * @param logger a TreeLogger
-   * @param what the contents of the Artifact to emit
-   * @param partialPath the partial path of the emitted resource
-   * @param lastModified the last modified time of the new artifact
-   * @return an artifact that contains the contents of the given String
-   */
-  protected final SyntheticArtifact emitString(TreeLogger logger, String what,
-      String partialPath, long lastModified) throws UnableToCompleteException {
-    return emitBytes(logger, Util.getBytes(what), partialPath, lastModified);
-  }
-
-  /**
-   * A helper method to create an artifact from an array of bytes with a strong
-   * name.
-   * 
-   * @param logger a TreeLogger
-   * @param what the data to emit
-   * @param prefix a non-null string to prepend to the hash to determine the
-   *          Artifact's partial path
-   * @param suffix a non-null string to append to the hash to determine the
-   *          Artifact's partial path
-   * @return an artifact that contains the given data
-   */
-  protected final SyntheticArtifact emitWithStrongName(TreeLogger logger,
-      byte[] what, String prefix, String suffix)
-      throws UnableToCompleteException {
-    String strongName = prefix + Util.computeStrongName(what) + suffix;
-    return emitBytes(logger, what, strongName);
-  }
-
-  /**
-   * A helper method to create an artifact from an array of bytes with a strong
-   * name.
-   * 
-   * @param logger a TreeLogger
-   * @param what the data to emit
-   * @param prefix a non-null string to prepend to the hash to determine the
-   *          Artifact's partial path
-   * @param suffix a non-null string to append to the hash to determine the
-   *          Artifact's partial path
-   * @param lastModified the last modified time of the new artifact
-   * @return an artifact that contains the given data
-   */
-  protected final SyntheticArtifact emitWithStrongName(TreeLogger logger,
-      byte[] what, String prefix, String suffix, long lastModified)
-      throws UnableToCompleteException {
-    String strongName = prefix + Util.computeStrongName(what) + suffix;
-    return emitBytes(logger, what, strongName, lastModified);
-  }
-}
diff --git a/2.4/dev/core/src/com/google/gwt/core/ext/linker/Artifact.java b/2.4/dev/core/src/com/google/gwt/core/ext/linker/Artifact.java
deleted file mode 100644
index 185246c..0000000
--- a/2.4/dev/core/src/com/google/gwt/core/ext/linker/Artifact.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * 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.core.ext.linker;
-
-import com.google.gwt.core.ext.Linker;
-
-import java.io.Serializable;
-
-/**
- * A base type for all artifacts relating to the link process. In order to
- * ensure stable output between runs of the compiler, Artifact types must
- * implement a stable comparison between instances of a relevant base type (the
- * exact comparison order is irrelevant).
- * 
- * @param <C> The type of Artifact interface that the Artifact can be compared
- *          to.
- */
-public abstract class Artifact<C extends Artifact<C>> implements
-    Comparable<Artifact<?>>, Serializable {
-  private transient Class<? extends Linker> linker;
-  private final String linkerName;
-
-  /**
-   * Constructor.
-   * 
-   * @param linker the type of Linker that instantiated the Artifact.
-   */
-  protected Artifact(Class<? extends Linker> linker) {
-    assert linker != null;
-    this.linkerName = linker.getName();
-    this.linker = linker;
-  }
-
-  public final int compareTo(Artifact<?> o) {
-    if (getComparableArtifactType().equals(o.getComparableArtifactType())) {
-      return compareToComparableArtifact(getComparableArtifactType().cast(o));
-    } else {
-      return getComparableArtifactType().getName().compareTo(
-          o.getComparableArtifactType().getName());
-    }
-  }
-
-  /**
-   * Delegates to {@link #compareTo(Artifact)}.
-   */
-  @Override
-  public final boolean equals(Object obj) {
-    if (obj instanceof Artifact<?>) {
-      return compareTo((Artifact<?>) obj) == 0;
-    } else {
-      return false;
-    }
-  }
-
-  /**
-   * Returns the Linker that created the Artifact.
-   */
-  public final Class<? extends Linker> getLinker() {
-    // linker is null when deserialized.
-    if (linker == null) {
-      try {
-        Class<?> clazz = Class.forName(linkerName, false,
-            Thread.currentThread().getContextClassLoader());
-        linker = clazz.asSubclass(Linker.class);
-      } catch (ClassNotFoundException e) {
-        // The class may not be available.
-        linker = Linker.class;
-      }
-    }
-    return linker;
-  }
-
-  /**
-   * The class which is returned from {@link #getComparableArtifactType()} must
-   * declare a final implementation which returns the same hash code for objects
-   * for which {@link #compareToComparableArtifact(Artifact)} returns 0.
-   */
-  @Override
-  public abstract int hashCode();
-
-  /**
-   * Returns whether the {@link Transferable} annotation is present on this
-   * class. See {@link Transferable} for the implications.
-   */
-  public final boolean isTransferableFromShards() {
-    return getClass().isAnnotationPresent(Transferable.class);
-  }
-
-  @Override
-  public String toString() {
-    return getClass().getName() + " created by " + getLinker().getName();
-  }
-
-  /**
-   * Performs comparison with an artifact of a compatible base type. Objects
-   * which compare to 0 are assumed equal, and must return the same
-   * {@link #hashCode()}.
-   */
-  protected abstract int compareToComparableArtifact(C o);
-
-  /**
-   * Returns the base type to use for comparisons between Artifacts. All
-   * concrete implementations of this methods must be final.
-   */
-  protected abstract Class<C> getComparableArtifactType();
-}
diff --git a/2.4/dev/core/src/com/google/gwt/core/ext/linker/ArtifactSet.java b/2.4/dev/core/src/com/google/gwt/core/ext/linker/ArtifactSet.java
deleted file mode 100644
index 28502a7..0000000
--- a/2.4/dev/core/src/com/google/gwt/core/ext/linker/ArtifactSet.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
- * 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.core.ext.linker;
-
-import java.io.Serializable;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.SortedSet;
-import java.util.TreeSet;
-
-/**
- * Provides stable ordering and de-duplication of artifacts.
- */
-public final class ArtifactSet implements SortedSet<Artifact<?>>, Serializable {
-
-  private SortedSet<Artifact<?>> treeSet = new TreeSet<Artifact<?>>();
-
-  public ArtifactSet() {
-  }
-
-  public ArtifactSet(Collection<? extends Artifact<?>> copyFrom) {
-    addAll(copyFrom);
-  }
-
-  public boolean add(Artifact<?> o) {
-    return treeSet.add(o);
-  }
-
-  public boolean addAll(Collection<? extends Artifact<?>> c) {
-    return treeSet.addAll(c);
-  }
-
-  public void clear() {
-    treeSet.clear();
-  }
-
-  public Comparator<? super Artifact<?>> comparator() {
-    return treeSet.comparator();
-  }
-
-  public boolean contains(Object o) {
-    return treeSet.contains(o);
-  }
-
-  public boolean containsAll(Collection<?> c) {
-    return treeSet.containsAll(c);
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    return treeSet.equals(o);
-  }
-
-  /**
-   * Find all Artifacts assignable to some base type. The returned value will be
-   * a snapshot of the values in the ArtifactSet. An example of how this could
-   * be used:
-   * 
-   * <pre>
-   *   for (EmittedArtifact ea : artifactSet.find(EmittedArtifact.class)) {
-   *     ...
-   *   }
-   * </pre>
-   * 
-   * @param <T> the desired type of Artifact
-   * @param artifactType the desired type of Artifact
-   * @return all Artifacts in the ArtifactSet assignable to the desired type
-   */
-  public <T extends Artifact<? super T>> SortedSet<T> find(
-      Class<T> artifactType) {
-    // TODO make this sub-linear (but must retain order for styles/scripts!)
-    SortedSet<T> toReturn = new TreeSet<T>();
-    for (Artifact<?> artifact : this) {
-      if (artifactType.isInstance(artifact)) {
-        toReturn.add(artifactType.cast(artifact));
-      }
-    }
-    return toReturn;
-  }
-
-  public Artifact<?> first() {
-    return treeSet.first();
-  }
-
-  /**
-   * Prevent further modification of the the ArtifactSet. Any attempts to alter
-   * the ArtifactSet after invoking this method will result in an
-   * UnsupportedOperationException.
-   */
-  public void freeze() {
-    if (treeSet instanceof TreeSet<?>) {
-      treeSet = Collections.unmodifiableSortedSet(treeSet);
-    }
-  }
-
-  @Override
-  public int hashCode() {
-    return treeSet.hashCode();
-  }
-
-  public SortedSet<Artifact<?>> headSet(Artifact<?> toElement) {
-    return treeSet.headSet(toElement);
-  }
-
-  public boolean isEmpty() {
-    return treeSet.isEmpty();
-  }
-
-  public Iterator<Artifact<?>> iterator() {
-    return treeSet.iterator();
-  }
-
-  public Artifact<?> last() {
-    return treeSet.last();
-  }
-
-  public boolean remove(Object o) {
-    return treeSet.remove(o);
-  }
-
-  public boolean removeAll(Collection<?> c) {
-    return treeSet.removeAll(c);
-  }
-
-  /**
-   * Possibly replace an existing Artifact.
-   * 
-   * @param artifact the replacement Artifact
-   * @return <code>true</code> if an equivalent Artifact was already present.
-   */
-  public boolean replace(Artifact<?> artifact) {
-    boolean toReturn = treeSet.remove(artifact);
-    treeSet.add(artifact);
-    return toReturn;
-  }
-
-  public boolean retainAll(Collection<?> c) {
-    return treeSet.retainAll(c);
-  }
-
-  public int size() {
-    return treeSet.size();
-  }
-
-  public SortedSet<Artifact<?>> subSet(Artifact<?> fromElement,
-      Artifact<?> toElement) {
-    return treeSet.subSet(fromElement, toElement);
-  }
-
-  public SortedSet<Artifact<?>> tailSet(Artifact<?> fromElement) {
-    return treeSet.tailSet(fromElement);
-  }
-
-  public Object[] toArray() {
-    return treeSet.toArray();
-  }
-
-  public <T> T[] toArray(T[] a) {
-    return treeSet.toArray(a);
-  }
-
-  @Override
-  public String toString() {
-    return treeSet.toString();
-  }
-}
diff --git a/2.4/dev/core/src/com/google/gwt/core/ext/linker/BinaryEmittedArtifact.java b/2.4/dev/core/src/com/google/gwt/core/ext/linker/BinaryEmittedArtifact.java
deleted file mode 100644
index 54679fb..0000000
--- a/2.4/dev/core/src/com/google/gwt/core/ext/linker/BinaryEmittedArtifact.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * 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.core.ext.linker;
-
-import com.google.gwt.core.ext.linker.impl.StandardLinkerContext;
-
-/**
- * <p>
- * A thinned down version of some {@link EmittedArtifact}. Only its essentials,
- * including name and contents, are available.
- * </p>
- * 
- * <p>
- * This class should only be extended within the GWT implementation.
- * </p>
- */
-public abstract class BinaryEmittedArtifact extends EmittedArtifact {
-  protected BinaryEmittedArtifact(String partialPath) {
-    super(StandardLinkerContext.class, partialPath);
-  }
-  
-  /**
-   * Force subclasses to define.
-   */
-  @Override
-  public abstract long getLastModified();
-}
diff --git a/2.4/dev/core/src/com/google/gwt/core/ext/linker/CastableTypeMap.java b/2.4/dev/core/src/com/google/gwt/core/ext/linker/CastableTypeMap.java
deleted file mode 100644
index 62f0b50..0000000
--- a/2.4/dev/core/src/com/google/gwt/core/ext/linker/CastableTypeMap.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright 2010 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.core.ext.linker;
-
-import java.io.Serializable;
-
-/**
- * An encapsulation of a JSON map containing a set of castable type ids.
- */
-public interface CastableTypeMap extends Serializable {
-  
-    /**
-     * Returns an eval-able JSON object.
-     */
-    String toJs();
-}
diff --git a/2.4/dev/core/src/com/google/gwt/core/ext/linker/CompilationMetricsArtifact.java b/2.4/dev/core/src/com/google/gwt/core/ext/linker/CompilationMetricsArtifact.java
deleted file mode 100644
index ab467dd..0000000
--- a/2.4/dev/core/src/com/google/gwt/core/ext/linker/CompilationMetricsArtifact.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * Copyright 2010 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.core.ext.linker;
-
-import com.google.gwt.core.ext.Linker;
-import com.google.gwt.core.linker.SoycReportLinker;
-import com.google.gwt.dev.js.SizeBreakdown;
-
-/**
- * Captures some metrics from the compile permutations step of the build.
- */
-@Transferable
-public class CompilationMetricsArtifact extends Artifact<CompilationMetricsArtifact> {
-
-  private long compileElapsedMilliseconds;
-  private long elapsedMilliseconds;
-  private final int permutationId;
-  private String permutationDescription;
-  private int[] jsSize;
-
-  public CompilationMetricsArtifact(int permutationId) { 
-    this(SoycReportLinker.class, permutationId);
-  }
-  
-  protected CompilationMetricsArtifact(Class<? extends Linker> linker, int permutationId) {
-    super(linker);
-    this.permutationId = permutationId;
-  }
-
-  /**
-   * @return wall clock time elapsed since start of compilation
-   */
-  public long getCompileElapsedMilliseconds() {
-    return compileElapsedMilliseconds;
-  }
-
-  /**
-   * @return wall clock time elapsed since start of execution
-   */
-  public long getElapsedMilliseconds() {
-    return elapsedMilliseconds;
-  }
-
-  /**
-   * @return a map containing the name of the JavaScript fragments and their
-   *         sizes.
-   */
-  public int[] getJsSize() {
-    return this.jsSize;
-  }
-
-  /**
-   * @return the permutation id associated with compiling this permutation.
-   */
-  public int getPermuationId() {
-    return permutationId;
-  }
-
-  /**
-   * @return human readable description of the permutation
-   */
-  public String getPermutationDescription() {
-    return permutationDescription;
-  }
-
-  @Override
-  public int hashCode() {
-    return getName().hashCode();
-  }
-
-  /**
-   * @param compileElapsedMilliseconds wall clock time elapsed since start of
-   *        compilation
-   */
-  public CompilationMetricsArtifact setCompileElapsedMilliseconds(long compileElapsedMilliseconds) {
-    this.compileElapsedMilliseconds = compileElapsedMilliseconds;
-    return this;
-  }
-
-  /**
-   * @param elapsedMilliseconds wall clock time elapsed since JVM startup
-   */
-  public CompilationMetricsArtifact setElapsedMilliseconds(long elapsedMilliseconds) {
-    this.elapsedMilliseconds = elapsedMilliseconds;
-    return this;
-  }
-
-  /**
-   * @param sizeBreakdowns breakdown of sizes in JavaScript fragments
-   */
-  public void setJsSize(SizeBreakdown[] sizeBreakdowns) {
-    this.jsSize = new int[sizeBreakdowns.length];
-    for (int i = 0; i < sizeBreakdowns.length; ++i) {
-      this.jsSize[i] = sizeBreakdowns[i].getSize();
-    }
-  }
-
-  /**
-   * @param permutationDescription human readable description of the permutation
-   */
-  public CompilationMetricsArtifact setPermutationDescription(String permutationDescription) {
-    this.permutationDescription = permutationDescription;
-    return this;
-  }
-
-  @Override
-  protected int compareToComparableArtifact(CompilationMetricsArtifact o) {
-    return getName().compareTo(o.getName());
-  }
-
-  @Override
-  protected final Class<CompilationMetricsArtifact> getComparableArtifactType() {
-    return CompilationMetricsArtifact.class;
-  }
-
-  private String getName() {
-    return "CompilationMetricsArtifact-" + permutationId;
-  }
-}
diff --git a/2.4/dev/core/src/com/google/gwt/core/ext/linker/CompilationResult.java b/2.4/dev/core/src/com/google/gwt/core/ext/linker/CompilationResult.java
deleted file mode 100644
index a83a59a..0000000
--- a/2.4/dev/core/src/com/google/gwt/core/ext/linker/CompilationResult.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * 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.core.ext.linker;
-
-import com.google.gwt.core.ext.Linker;
-
-import java.util.Map;
-import java.util.SortedMap;
-import java.util.SortedSet;
-
-/**
- * Represents a unique compilation of the module. Multiple permutations may
- * result in identical JavaScript.
- */
-public abstract class CompilationResult extends Artifact<CompilationResult> {
-
-  protected CompilationResult(Class<? extends Linker> linkerType) {
-    super(linkerType);
-  }
-
-  /**
-   * Returns the JavaScript compilation. The first element of the array contains
-   * the code that should be run when the application starts up. The remaining
-   * elements are loaded via
-   * {@link com.google.gwt.core.client.GWT#runAsync(com.google.gwt.core.client.RunAsyncCallback)
-   * GWT.runAsync}. See
-   * {@link com.google.gwt.core.client.impl.AsyncFragmentLoader
-   * AsyncFragmentLoader} for details on the necessary linker support for
-   * runAsync.
-   */
-  public abstract String[] getJavaScript();
-
-  /**
-   * Returns the permutation ID.
-   */
-  public abstract int getPermutationId();
-
-  /**
-   * Provides values for {@link SelectionProperty} instances that are not
-   * explicitly set during the compilation phase. This method will return
-   * multiple mappings, one for each permutation that resulted in the
-   * compilation.
-   */
-  public abstract SortedSet<SortedMap<SelectionProperty, String>> getPropertyMap();
-
-  /**
-   * Returns the permutations of the collapsed deferred-binding property values
-   * that are compiled into the CompilationResult.
-   */
-  public abstract SoftPermutation[] getSoftPermutations();
-
-  /**
-   * Returns the statement ranges for the JavaScript returned by
-   * {@link #getJavaScript()}. Some subclasses return <code>null</code>, in
-   * which case there is no statement range information available.
-   */
-  public StatementRanges[] getStatementRanges() {
-    return null;
-  }
-
-  /**
-   * Return a string that uniquely identifies this compilation result. Typically
-   * this is a cryptographic hash of the compiled data.
-   */
-  public abstract String getStrongName();
-
-  /**
-   * Returns a sorted array of obfuscated symbol names in the compilation to
-   * metadata about the symbol. This data can allow for on-the-fly deobfuscation
-   * of stack trace information or to allow server components to have in-depth
-   * knowledge of the runtime structure of compiled objects.
-   */
-  public abstract SymbolData[] getSymbolMap();
-
-  @Override
-  public final int hashCode() {
-    return getStrongName().hashCode();
-  }
-
-  @Override
-  public String toString() {
-    StringBuffer b = new StringBuffer();
-    b.append("{");
-    for (SortedMap<SelectionProperty, String> map : getPropertyMap()) {
-      b.append(" {");
-      for (Map.Entry<SelectionProperty, String> entry : map.entrySet()) {
-        b.append(" ").append(entry.getKey().getName()).append(":").append(
-            entry.getValue());
-      }
-      b.append(" }");
-    }
-    b.append(" }");
-
-    return b.toString();
-  }
-
-  @Override
-  protected final int compareToComparableArtifact(CompilationResult o) {
-    return getStrongName().compareTo(o.getStrongName());
-  }
-
-  @Override
-  protected final Class<CompilationResult> getComparableArtifactType() {
-    return CompilationResult.class;
-  }
-}
diff --git a/2.4/dev/core/src/com/google/gwt/core/ext/linker/ConfigurationProperty.java b/2.4/dev/core/src/com/google/gwt/core/ext/linker/ConfigurationProperty.java
deleted file mode 100644
index dfaf77a..0000000
--- a/2.4/dev/core/src/com/google/gwt/core/ext/linker/ConfigurationProperty.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * 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.core.ext.linker;
-
-import java.util.List;
-
-/**
- * Represents a configuration property. These properties do not affect
- * deferred-binding decisions, but may affect the behavior of Linkers and
- * Generators.
- */
-public interface ConfigurationProperty {
-  /*
-   * NB: This is not a super-interface of SelectionProperty, since these kinds
-   * of properties are always guaranteed to have a defined value. The only
-   * commonality is getName() which doesn't seem all that useful to extract.
-   */
-
-  /**
-   * Returns the name of the configuration property.
-   */
-  String getName();
-  
-  /**
-   * Returns the defined value for the configuration property.  If the property
-   * has multiple values, this returns the first value only.
-   */
-  @Deprecated
-  String getValue();
-  
-  /**
-   * Returns the defined values for the configuration property as a List
-   * of Strings.
-   */
-  List<String> getValues();
-
-  /**
-   * Returns true if this property has more than one value.
-   */
-  boolean hasMultipleValues();
-}
diff --git a/2.4/dev/core/src/com/google/gwt/core/ext/linker/DelegatingCompilationResult.java b/2.4/dev/core/src/com/google/gwt/core/ext/linker/DelegatingCompilationResult.java
deleted file mode 100644
index 687cecd..0000000
--- a/2.4/dev/core/src/com/google/gwt/core/ext/linker/DelegatingCompilationResult.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright 2011 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.core.ext.linker;
-
-import com.google.gwt.core.ext.Linker;
-
-import java.util.SortedMap;
-import java.util.SortedSet;
-
-/**
- * A delegate for {@link CompilationResult} intended for third party linkers
- * that want to modify a compilation result.  Extending this class should insulate
- * against future changes to the CompilationResult type.
- */
-public class DelegatingCompilationResult extends CompilationResult {
-  private final CompilationResult delegate;
-
-  public DelegatingCompilationResult(Class<? extends Linker> linkerType,
-      CompilationResult compilationResult) {
-    super(linkerType);
-    this.delegate = compilationResult;
-  }
-
-  @Override
-  public String[] getJavaScript() {
-    return delegate.getJavaScript();
-  }
-
-  @Override
-  public int getPermutationId() {
-    return delegate.getPermutationId();
-  }
-
-  @Override
-  public SortedSet<SortedMap<SelectionProperty, String>> getPropertyMap() {
-    return delegate.getPropertyMap();
-  }
-
-  @Override
-  public SoftPermutation[] getSoftPermutations() {
-    return delegate.getSoftPermutations();
-  }
-
-  @Override
-  public StatementRanges[] getStatementRanges() {
-    return delegate.getStatementRanges();
-  }
-
-  @Override
-  public String getStrongName() {
-    return delegate.getStrongName();
-  }
-
-  @Override
-  public SymbolData[] getSymbolMap() {
-    return delegate.getSymbolMap();
-  }
-
-  @Override
-  public String toString() {
-    return delegate.toString();
-  }
-}
diff --git a/2.4/dev/core/src/com/google/gwt/core/ext/linker/EmittedArtifact.java b/2.4/dev/core/src/com/google/gwt/core/ext/linker/EmittedArtifact.java
deleted file mode 100644
index 067c238..0000000
--- a/2.4/dev/core/src/com/google/gwt/core/ext/linker/EmittedArtifact.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- * 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.core.ext.linker;
-
-import com.google.gwt.core.ext.Linker;
-import com.google.gwt.core.ext.TreeLogger;
-import com.google.gwt.core.ext.UnableToCompleteException;
-import com.google.gwt.dev.util.Util;
-import com.google.gwt.util.tools.Utility;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-/**
- * An artifact that will be emitted into the output. All EmittedArtifacts
- * contained in the {@link ArtifactSet} at the end of the Linking process will
- * be emitted by the compiler into the module's output directory. This type may
- * be extended by Linker providers to provide alternative implementations of
- * {@link #getContents(TreeLogger)}.
- * 
- * TODO(bobv): provide a timestamp so we can make the time on output files match
- * that of input files?
- */
-public abstract class EmittedArtifact extends Artifact<EmittedArtifact> {
-
-  /**
-   * Describes the visibility of an artifact.
-   */
-  public enum Visibility {
-
-    /**
-     * A public artifact is something that may be served to clients.
-     */
-    Public,
-    
-    /**
-     * A private artifact is something that is only used during the build
-     * process.
-     */
-    Private {
-      @Override
-      public boolean matches(Visibility visibility) {
-        switch (visibility) {
-          case LegacyDeploy:
-          case Private:
-            return true;
-          default:
-            return false;
-        }
-      }
-    },
-    
-    /**
-     * A deploy artifact is deployed to the server but is never served to the
-     * client.
-     */
-    Deploy {
-      @Override
-      public boolean matches(Visibility visibility) {
-        switch (visibility) {
-          case Deploy:
-          case LegacyDeploy:
-            return true;
-          default:
-            return false;
-        }
-      }
-    },
-    
-    /**
-     * For legacy use only - used for artifacts that were previously marked as
-     * private because they should not be delivered to the client, but actually
-     * should be visible to the server.  These artifacts will now be treated as
-     * both Private and Deploy, so that existing build tools that expect to find
-     * them in the output directory for Private artifacts will find them.
-     * 
-     * New code should use Deploy instead.
-     */
-    LegacyDeploy {
-      @Override
-      public boolean matches(Visibility visibility) {
-        switch (visibility) {
-          case Deploy:
-          case LegacyDeploy:
-          case Private:
-            return true;
-          default:
-            return false;
-        }
-      }
-    };
-    
-    /**
-     * Returns true if this visibility matches the requested visibility level,
-     * dealing with the fact that {@link #LegacyDeploy} matches both
-     * {@link #Private} and {@link #Deploy}.
-     * 
-     * @param visibility
-     * @return true if this visibility matches the requested level
-     */
-    public boolean matches(Visibility visibility) {
-      return this == visibility;
-    }
-  }
-
-  private final String partialPath;
-
-  /**
-   * This is mutable because it has no effect on identity.
-   */
-  private Visibility visibility;
-
-  protected EmittedArtifact(Class<? extends Linker> linker, String partialPath) {
-    super(linker);
-    assert partialPath != null;
-    this.partialPath = partialPath;
-    visibility = Visibility.Public;
-  }
-
-  /**
-   * Provides access to the contents of the EmittedResource.
-   */
-  public abstract InputStream getContents(TreeLogger logger)
-      throws UnableToCompleteException;
-
-  /**
-   * Returns the time, measured in milliseconds from the epoch, at which the
-   * Artifact was last modified. This will be used to set the last-modified
-   * timestamp on the files written to disk.
-   * <p>
-   * The default implementation always returns the current time. Subclasses
-   * should override this method to provide a type-appropriate value.
-   * 
-   * @return the time at which the Artifact was last modified
-   */
-  public long getLastModified() {
-    return System.currentTimeMillis();
-  }
-
-  /**
-   * Returns the partial path within the output directory of the
-   * EmittedArtifact.
-   */
-  public final String getPartialPath() {
-    return partialPath;
-  }
-
-  /**
-   * @return the visibility
-   */
-  public Visibility getVisibility() {
-    return visibility;
-  }
-
-  @Override
-  public final int hashCode() {
-    return getPartialPath().hashCode();
-  }
-
-  /**
-   * Returns whether or not the data contained in the EmittedArtifact should be
-   * written into the module output directory or into an auxiliary directory.
-   * <p>
-   * EmittedArtifacts that return <code>true</code> for this method will not
-   * be emitted into the normal module output location, but will instead be
-   * written into a directory that is a sibling to the module output directory.
-   * The partial path of the EmittedArtifact will be prepended with the
-   * short-name of the Linker type that created the EmittedArtifact.
-   * <p>
-   * Private EmittedArtifacts are intended for resources that generally should
-   * not be deployed to the server in the same location as the module
-   * compilation artifacts.
-   * 
-   * @deprecated use {@link #getVisibility()} instead
-   */
-  @Deprecated
-  public boolean isPrivate() {
-    return visibility == Visibility.Private;
-  }
-
-  /**
-   * Sets the private attribute of the EmittedResource.
-   * 
-   * @param isPrivate true if this artifact is private
-   *
-   * @deprecated use {@link #setVisibility(Visibility)} instead
-   */
-  @Deprecated
-  public void setPrivate(boolean isPrivate) {
-    this.visibility = isPrivate ? Visibility.Private : Visibility.Public;
-  }
-
-  /**
-   * @param visibility the visibility to set
-   */
-  public void setVisibility(Visibility visibility) {
-    this.visibility = visibility;
-  }
-
-  @Override
-  public String toString() {
-    return getPartialPath();
-  }
-
-  /**
-   * Provides access to the contents of the EmittedResource.
-   */
-  public void writeTo(TreeLogger logger, OutputStream out)
-      throws UnableToCompleteException {
-    try {
-      InputStream in = getContents(logger);
-      Util.copyNoClose(in, out);
-      Utility.close(in);
-    } catch (IOException e) {
-      logger.log(TreeLogger.ERROR, "Unable to read or write stream", e);
-      throw new UnableToCompleteException();
-    }
-  }
-
-  @Override
-  protected final int compareToComparableArtifact(EmittedArtifact o) {
-    return getPartialPath().compareTo(o.getPartialPath());
-  }
-
-  @Override
-  protected final Class<EmittedArtifact> getComparableArtifactType() {
-    return EmittedArtifact.class;
-  }
-}
diff --git a/2.4/dev/core/src/com/google/gwt/core/ext/linker/GeneratedResource.java b/2.4/dev/core/src/com/google/gwt/core/ext/linker/GeneratedResource.java
deleted file mode 100644
index 3bb8000..0000000
--- a/2.4/dev/core/src/com/google/gwt/core/ext/linker/GeneratedResource.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * 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.core.ext.linker;
-
-import com.google.gwt.core.ext.Generator;
-import com.google.gwt.core.ext.Linker;
-
-/**
- * A resource created by a {@link Generator} invoking
- * {@link com.google.gwt.core.ext.GeneratorContext#tryCreateResource(com.google.gwt.core.ext.TreeLogger, String)}
- * during the compilation process.
- */
-public abstract class GeneratedResource extends EmittedArtifact {
-  private final String generatorTypeName;
-  private transient Class<? extends Generator> generatorType;
-
-  protected GeneratedResource(Class<? extends Linker> linkerType,
-      Class<? extends Generator> generatorType, String partialPath) {
-    super(linkerType, partialPath);
-    this.generatorTypeName = generatorType.getName();
-    this.generatorType = generatorType;
-  }
-
-  /**
-   * The type of Generator that created the resource.
-   */
-  public final Class<? extends Generator> getGenerator() {
-    // generatorType is null when deserialized.
-    if (generatorType == null) {
-      try {
-        Class<?> clazz = Class.forName(generatorTypeName, false,
-            Thread.currentThread().getContextClassLoader());
-        generatorType = clazz.asSubclass(Generator.class);
-      } catch (ClassNotFoundException e) {
-        // The class may not be available.
-        generatorType = Generator.class;
-      }
-    }
-    return generatorType;
-  }
-}
diff --git a/2.4/dev/core/src/com/google/gwt/core/ext/linker/LinkerOrder.java b/2.4/dev/core/src/com/google/gwt/core/ext/linker/LinkerOrder.java
deleted file mode 100644
index 038a9cd..0000000
--- a/2.4/dev/core/src/com/google/gwt/core/ext/linker/LinkerOrder.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * 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.core.ext.linker;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Inherited;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Defines the relative order in which a Linker will be run.
- */
-@Documented
-@Inherited
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.TYPE)
-public @interface LinkerOrder {
-  /**
-   * Allowable values for the LinkerOrder.
-   */
-  public enum Order {
-    /**
-     * Runs after the primary linker.
-     */
-    POST,
-
-    /**
-     * Runs before the primary linker.
-     */
-    PRE,
-
-    /**
-     * Defines the primary linker. Adding a primary linker to the Linker stack
-     * will override the previously-set primary linker.
-     */
-    PRIMARY;
-  }
-
-  Order value();
-}
diff --git a/2.4/dev/core/src/com/google/gwt/core/ext/linker/ModuleMetricsArtifact.java b/2.4/dev/core/src/com/google/gwt/core/ext/linker/ModuleMetricsArtifact.java
deleted file mode 100644
index ba325f2..0000000
--- a/2.4/dev/core/src/com/google/gwt/core/ext/linker/ModuleMetricsArtifact.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Copyright 2010 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.core.ext.linker;
-
-import com.google.gwt.core.ext.Linker;
-import com.google.gwt.core.linker.SoycReportLinker;
-
-import java.util.Collection;
-import java.util.concurrent.atomic.AtomicInteger;
-
-/**
- * Captures some metrics from the module load and initial type oracle compile
- * step.
- */
-@Transferable
-public class ModuleMetricsArtifact extends Artifact<ModuleMetricsArtifact> {
-  /*
-   * In an ideal world, there should be only one of these module instances, but
-   * since this information is recomputed for each precompile task, there will
-   * be multiple entries which are all about the same.
-   */
-  private static AtomicInteger nextInstance = new AtomicInteger(0);
-
-  private final int instanceId;
-  private long elapsedMilliseconds;
-  private String[] sourceFiles;
-  private String[] initialTypes;
-
-  public ModuleMetricsArtifact() {
-    this(SoycReportLinker.class, nextInstance.getAndIncrement());
-  }
-  
-  protected ModuleMetricsArtifact(Class<? extends Linker> linker, int instanceId) {
-    super(linker);
-    this.instanceId = instanceId;
-  }
-
-  /**
-   * @return wall clock time elapsed since start of module load to end of the
-   *         initial type oracle build.
-   */
-  public long getElapsedMilliseconds() {
-    return elapsedMilliseconds;
-  }
-
-  /**
-   * @return the number of types resulting from the type oracle build which
-   *         compiles all of the source files initially presented to the
-   *         compiler.
-   */
-  public String[] getInitialTypes() {
-    return initialTypes;
-  }
-
-  /**
-   * @return the source files initially presented to the compiler
-   */
-  public String[] getSourceFiles() {
-    return sourceFiles;
-  }
-
-  @Override
-  public int hashCode() {
-    return getName().hashCode();
-  }
-
-  /**
-   * @param elapsedMilliseconds wall clock time elapsed since start of module
-   *        load to end of the initial type oracle build.
-   */
-  public ModuleMetricsArtifact setElapsedMilliseconds(long elapsedMilliseconds) {
-    this.elapsedMilliseconds = elapsedMilliseconds;
-    return this;
-  }
-
-  /**
-   * @param initialTypes the number of types resulting from the initial type
-   *        oracle build which compiles all of the source files initially
-   *        presented to the compiler.
-   */
-  public ModuleMetricsArtifact setInitialTypes(Collection<String> initialTypes) {
-    this.initialTypes = initialTypes.toArray(new String[initialTypes.size()]);
-    return this;
-  }
-
-  /**
-   * @param sourceFiles the list of source files presented to the compiler on
-   *        the module source path.
-   */
-  public ModuleMetricsArtifact setSourceFiles(String[] sourceFiles) {
-    this.sourceFiles = sourceFiles;
-    return this;
-  }
-
-  @Override
-  protected int compareToComparableArtifact(ModuleMetricsArtifact o) {
-    return getName().compareTo(o.getName());
-  }
-
-  @Override
-  protected final Class<ModuleMetricsArtifact> getComparableArtifactType() {
-    return ModuleMetricsArtifact.class;
-  }
-
-  private String getName() {
-    return "ModuleMetricsArtifact-" + instanceId;
-  }
-}
diff --git a/2.4/dev/core/src/com/google/gwt/core/ext/linker/PrecompilationMetricsArtifact.java b/2.4/dev/core/src/com/google/gwt/core/ext/linker/PrecompilationMetricsArtifact.java
deleted file mode 100644
index 73013db..0000000
--- a/2.4/dev/core/src/com/google/gwt/core/ext/linker/PrecompilationMetricsArtifact.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright 2010 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.core.ext.linker;
-
-import com.google.gwt.core.ext.Linker;
-import com.google.gwt.core.linker.SoycReportLinker;
-
-import java.util.List;
-
-/**
- * Captures some metrics from the precompilation step.
- */
-@Transferable
-public class PrecompilationMetricsArtifact extends Artifact<PrecompilationMetricsArtifact> {
-
-  private long elapsedMilliseconds;
-  private final int permutationBase;
-  private int[] permutationIds;
-  private String[] finalTypeOracleTypes;
-  private String[] referencedAstTypes;
-
-  public PrecompilationMetricsArtifact(int permutationId) {
-    this(SoycReportLinker.class, permutationId);
-  }
-  
-  protected PrecompilationMetricsArtifact(Class<? extends Linker> linker, int permutationBase) {
-    super(linker);
-    this.permutationBase = permutationBase;
-  }
-
-  /**
-   * @return the number of types referenced by the AST.
-   */
-  public String[] getAstTypes() {
-    return referencedAstTypes;
-  }
-
-  /**
-   * @return wall clock time elapsed since start of precompilation
-   */
-  public long getElapsedMilliseconds() {
-    return elapsedMilliseconds;
-  }
-
-  /**
-   * @return types all types referenced by type oracle after compiling the
-   *        sources on the source path with JDT.
-   */
-  public String[] getFinalTypeOracleTypes() {
-    return this.finalTypeOracleTypes;
-  }
-
-  /**
-   * @return the first permutation Id associated with compiling this permutation.
-   */
-  public int getPermuationBase() {
-    return permutationBase;
-  }
-  
-  /**
-   * @return the permutation ids associated with this precompilation. 
-   */
-  public int[] getPermutationIds() {
-    return permutationIds;
-  }  
-
-  @Override
-  public int hashCode() {
-    return getName().hashCode();
-  }
-
-  /**
-   * @param astTypes an array of types referenced by the Java AST.
-   */
-  public PrecompilationMetricsArtifact setAstTypes(String[] astTypes) {
-    this.referencedAstTypes = astTypes;
-    return this;
-  }
-
-  /**
-   * @param elapsedMilliseconds wall clock time elapsed since start of
-   *        precompilation
-   */
-  public PrecompilationMetricsArtifact setElapsedMilliseconds(long elapsedMilliseconds) {
-    this.elapsedMilliseconds = elapsedMilliseconds;
-    return this;
-  }
-
-  /**
-   * @param types all types referenced by type oracle after compiling the
-   *        sources on the source path with JDT.
-   */
-  public PrecompilationMetricsArtifact setFinalTypeOracleTypes(List<String> types) {
-    this.finalTypeOracleTypes = types.toArray(new String[types.size()]);
-    return this;
-  }
-
-  /**
-   * @param ids the permutation ids associated with this precompilation. 
-   */
-  public PrecompilationMetricsArtifact setPermuationIds(int[] ids) {
-    this.permutationIds = ids;
-    return this;
-  }    
-  @Override
-  protected int compareToComparableArtifact(PrecompilationMetricsArtifact o) {
-    return getName().compareTo(o.getName());
-  }
-
-  @Override
-  protected final Class<PrecompilationMetricsArtifact> getComparableArtifactType() {
-    return PrecompilationMetricsArtifact.class;
-  }
-
-  private String getName() {
-    return "PrecompilationMetricsArtifact-" + permutationBase;
-  }
-}
diff --git a/2.4/dev/core/src/com/google/gwt/core/ext/linker/PropertyProviderGenerator.java b/2.4/dev/core/src/com/google/gwt/core/ext/linker/PropertyProviderGenerator.java
deleted file mode 100644
index fd8f1d3..0000000
--- a/2.4/dev/core/src/com/google/gwt/core/ext/linker/PropertyProviderGenerator.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright 2010 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.core.ext.linker;
-
-import com.google.gwt.core.ext.TreeLogger;
-import com.google.gwt.core.ext.UnableToCompleteException;
-
-import java.util.SortedSet;
-
-/**
- * An interface for generating a property provider JS implementation, rather
- * than having it defined in a module file.
- * 
- * Use it like this:
- * <pre>
- *   &lt;property-provider name="foo" generator="org.example.FooGenerator"/&gt;
- * </pre>
- * A default implementation in JS can be included inside the property-provider
- * tag as usual, and will be used if the generator returns {@code null}.
- */
-public interface PropertyProviderGenerator {
-
-  /**
-   * Generate a property provider.
-   *
-   * @param logger TreeLogger
-   * @param possibleValues the possible values of this property
-   * @param fallback the fallback value for this property, or null
-   * @param configProperties the configuration properties for this module
-   * @return the JS source of the property provider (the complete body of a JS
-   *     function taking no arguments, including open/close braces), or null to
-   *     use the default implementation in the property-provider tag
-   * @throws UnableToCompleteException after logging the message if processing
-   *     is unable to continue
-   */
-  String generate(TreeLogger logger, SortedSet<String> possibleValues,
-      String fallback, SortedSet<ConfigurationProperty> configProperties)
-      throws UnableToCompleteException;
-}
diff --git a/2.4/dev/core/src/com/google/gwt/core/ext/linker/PublicResource.java b/2.4/dev/core/src/com/google/gwt/core/ext/linker/PublicResource.java
deleted file mode 100644
index e1ffe9e..0000000
--- a/2.4/dev/core/src/com/google/gwt/core/ext/linker/PublicResource.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * 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.core.ext.linker;
-
-import com.google.gwt.core.ext.Linker;
-
-/**
- * A resource in the module's public path.
- */
-public abstract class PublicResource extends EmittedArtifact {
-  protected PublicResource(Class<? extends Linker> linkerType,
-      String partialPath) {
-    super(linkerType, partialPath);
-  }
-}
diff --git a/2.4/dev/core/src/com/google/gwt/core/ext/linker/ScriptReference.java b/2.4/dev/core/src/com/google/gwt/core/ext/linker/ScriptReference.java
deleted file mode 100644
index 1e28710..0000000
--- a/2.4/dev/core/src/com/google/gwt/core/ext/linker/ScriptReference.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * 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.core.ext.linker;
-
-import com.google.gwt.core.ext.Linker;
-
-/**
- * An external script file referenced in the module manifest. The index is
- * important because output order must match module declaration order.
- */
-public abstract class ScriptReference extends Artifact<ScriptReference> {
-  private final int index;
-  private final String src;
-
-  protected ScriptReference(Class<? extends Linker> linkerType, String src,
-      int index) {
-    super(linkerType);
-    this.src = src;
-    this.index = index;
-  }
-
-  /**
-   * The <code>src</code> attribute of the resource. This string is returned
-   * raw and may be a partial path or a URL.
-   */
-  public final String getSrc() {
-    return src;
-  }
-
-  @Override
-  public final int hashCode() {
-    return getSrc().hashCode();
-  }
-
-  @Override
-  public String toString() {
-    return "<script src='" + getSrc() + "'>";
-  }
-
-  @Override
-  protected final int compareToComparableArtifact(ScriptReference o) {
-    return index - o.index;
-  }
-
-  @Override
-  protected final Class<ScriptReference> getComparableArtifactType() {
-    return ScriptReference.class;
-  }
-}
diff --git a/2.4/dev/core/src/com/google/gwt/core/ext/linker/SelectionProperty.java b/2.4/dev/core/src/com/google/gwt/core/ext/linker/SelectionProperty.java
deleted file mode 100644
index 6f27aba..0000000
--- a/2.4/dev/core/src/com/google/gwt/core/ext/linker/SelectionProperty.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * 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.core.ext.linker;
-
-import com.google.gwt.core.ext.TreeLogger;
-import com.google.gwt.core.ext.UnableToCompleteException;
-
-import java.util.SortedSet;
-
-/**
- * Represents a deferred binding property. The deferred binding property may or
- * may not have a single value applied across all permutations.
- * 
- * SelectionProperty implementations must support object identity comparisons.
- * 
- * @see com.google.gwt.core.ext.SelectionProperty A similarly-named interface
- *      used in generators.
- */
-public interface SelectionProperty {
-
-  /**
-   * Returns the fallback value or an empty string if not defined.
-   */
-  String getFallbackValue();
-
-  /**
-   * Returns the name of the deferred binding property.
-   */
-  String getName();
-
-  /**
-   * Returns all possible values for this deferred binding property.
-   */
-  SortedSet<String> getPossibleValues();
-
-  /**
-   * Returns a raw function body that provides the runtime value to be used for
-   * a deferred binding property.
-   * 
-   * @param logger logger to use for any warnings/errors
-   * @param configProperties set of configuration properties
-   * @throws UnableToCompleteException if execution cannot continue, after
-   *     having logged a message
-   */
-  String getPropertyProvider(TreeLogger logger,
-      SortedSet<ConfigurationProperty> configProperties)
-      throws UnableToCompleteException;
-
-  /**
-   * Returns <code>true</code> if the value of the SelectionProperty is always
-   * derived from other SelectionProperties and, as a consequence, the property
-   * provider never needs to be evaluated.
-   */
-  boolean isDerived();
-
-  /**
-   * Returns the defined value for the deferred binding property or
-   * <code>null</code> if the value of the property is not constant.
-   * 
-   * @see CompilationResult#getPropertyMap()
-   */
-  String tryGetValue();
-}
\ No newline at end of file
diff --git a/2.4/dev/core/src/com/google/gwt/core/ext/linker/Shardable.java b/2.4/dev/core/src/com/google/gwt/core/ext/linker/Shardable.java
deleted file mode 100644
index 03921d0..0000000
--- a/2.4/dev/core/src/com/google/gwt/core/ext/linker/Shardable.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * 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.core.ext.linker;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * This annotation, when placed on a {@link com.google.gwt.core.ext.Linker}
- * class, indicates that the linker supports the shardable version of the Linker
- * API. Specifically, it implements
- * {@link com.google.gwt.core.ext.Linker#link(com.google.gwt.core.ext.TreeLogger, com.google.gwt.core.ext.LinkerContext, ArtifactSet, boolean)}
- * rather than
- * {@link com.google.gwt.core.ext.Linker#link(com.google.gwt.core.ext.TreeLogger, com.google.gwt.core.ext.LinkerContext, ArtifactSet)}
- * .
- */
-@Documented
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.TYPE)
-public @interface Shardable {
-}
diff --git a/2.4/dev/core/src/com/google/gwt/core/ext/linker/SoftPermutation.java b/2.4/dev/core/src/com/google/gwt/core/ext/linker/SoftPermutation.java
deleted file mode 100644
index 08c9410..0000000
--- a/2.4/dev/core/src/com/google/gwt/core/ext/linker/SoftPermutation.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright 2010 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.core.ext.linker;
-
-import java.io.Serializable;
-import java.util.SortedMap;
-
-/**
- * Represents a permutation of collapsed deferred-binding property values.
- */
-public abstract class SoftPermutation implements Serializable {
-
-  /**
-   * Returns the soft permutation id that should be passed into
-   * <code>gwtOnLoad</code>. The range of ids used for a compilation's soft
-   * permutations may be disjoint and may not correspond to the index of the
-   * SoftPermutation within the array returned from
-   * {@link CompilationResult#getSoftPermutations()}.
-   */
-  public abstract int getId();
-
-  /**
-   * Returns only the collapsed selection properties that resulted in the
-   * particular soft permutation. The SelectionProperties used may be disjoint
-   * from the properties returned by {@link CompilationResult#getPropertyMap()}.
-   */
-  public abstract SortedMap<SelectionProperty, String> getPropertyMap();
-}
\ No newline at end of file
diff --git a/2.4/dev/core/src/com/google/gwt/core/ext/linker/StatementRanges.java b/2.4/dev/core/src/com/google/gwt/core/ext/linker/StatementRanges.java
deleted file mode 100644
index 30f919f..0000000
--- a/2.4/dev/core/src/com/google/gwt/core/ext/linker/StatementRanges.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * 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.core.ext.linker;
-
-/**
- * Describes the source-code positions of top-level statements in a string of
- * JavaScript.
- */
-public interface StatementRanges {
-  /**
-   * The end of the ith statement.
-   */
-  int end(int i);
-
-  /**
-   * The number of statements in the associated JavaScript.
-   */
-  int numStatements();
-
-  /**
-   * The start of the ith statement.
-   */
-  int start(int i);
-}
diff --git a/2.4/dev/core/src/com/google/gwt/core/ext/linker/StylesheetReference.java b/2.4/dev/core/src/com/google/gwt/core/ext/linker/StylesheetReference.java
deleted file mode 100644
index 6d3aeb0..0000000
--- a/2.4/dev/core/src/com/google/gwt/core/ext/linker/StylesheetReference.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * 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.core.ext.linker;
-
-import com.google.gwt.core.ext.Linker;
-
-/**
- * An external stylesheet referenced in the module manifest. The index is
- * important because output order must match module declaration order.
- */
-public abstract class StylesheetReference extends Artifact<StylesheetReference> {
-  private final String src;
-  private final int index;
-
-  protected StylesheetReference(Class<? extends Linker> linkerType, String src,
-      int index) {
-    super(linkerType);
-    this.src = src;
-    this.index = index;
-  }
-
-  /**
-   * The <code>src</code> attribute of the resource. This string is returned
-   * raw and may be a partial path or a URL.
-   */
-  public final String getSrc() {
-    return src;
-  }
-
-  @Override
-  public final int hashCode() {
-    return getSrc().hashCode();
-  }
-
-  @Override
-  public String toString() {
-    return "<style src='" + getSrc() + "'>";
-  }
-
-  @Override
-  protected final int compareToComparableArtifact(StylesheetReference o) {
-    return index - o.index;
-  }
-
-  @Override
-  protected Class<StylesheetReference> getComparableArtifactType() {
-    return StylesheetReference.class;
-  }
-}
diff --git a/2.4/dev/core/src/com/google/gwt/core/ext/linker/SymbolData.java b/2.4/dev/core/src/com/google/gwt/core/ext/linker/SymbolData.java
deleted file mode 100644
index 368acec..0000000
--- a/2.4/dev/core/src/com/google/gwt/core/ext/linker/SymbolData.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * 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.core.ext.linker;
-
-import java.io.Serializable;
-import java.util.Comparator;
-
-/**
- * Provides basic information about symbols in the generated JavaScript.
- * 
- * @see CompilationResult#getSymbolMap()
- */
-public interface SymbolData extends Serializable {
-  /*
-   * NB: This class is intended to provide enough data to synthesize
-   * StackTraceElements, however we don't want to use STE in our API in the case
-   * that we want to provide additional data in the future.
-   * 
-   * Note also that this class does not provide the name of the symbol it is
-   * describing, mainly because the JS compilation process results in multiple
-   * symbols that are mapped onto the same SymbolData (e.g. MakeCallsStatic).
-   */
-
-  /**
-   * A Comparator for use when presenting the data to humans. This Comparator
-   * orders SymbolData objects by their class names or JSNI idents.
-   */
-  class ClassIdentComparator implements Comparator<SymbolData>, Serializable {
-    public int compare(SymbolData o1, SymbolData o2) {
-      if (o1 == o2) {
-        return 0;
-      }
-      int result = o1.getClassName().compareTo(o2.getClassName());
-      if (result != 0) {
-        return result;
-      }
-
-      // A Class sorts before any member of that class.
-      if (o1.isClass()) {
-        if (o2.isClass()) {
-          return 0;
-        } else {
-          return -1;
-        }
-      } else if (o2.isClass()) {
-        return 1;
-      }
-
-      result = o1.getMemberName().compareTo(o2.getMemberName());
-      if (result != 0) {
-        return result;
-      }
-
-      // A Field sorts before any Method that has the same name.
-      if (o1.isField()) {
-        if (o2.isField()) {
-          return 0;
-        } else {
-          return -1;
-        }
-      } else if (o2.isField()) {
-        return 1;
-      }
-
-      // Must compare jsni signatures to distinguish overloaded methods.
-      return o1.getJsniIdent().compareTo(o2.getJsniIdent());
-    }
-  }
-  
-  /**
-   * Returns a JSON map of castableTypes.
-   */
-  CastableTypeMap getCastableTypeMap();
-
-  /**
-   * Returns the name of the type or enclosing type if the symbol is a method or
-   * field.
-   */
-  String getClassName();
-
-  /**
-   * Returns a JSNI-like identifier for the symbol if it a method or field,
-   * otherwise <code>null</code>.
-   */
-  String getJsniIdent();
-
-  /**
-   * Returns the name of the member if the symbol is a method or field.
-   */
-  String getMemberName();
-
-  /**
-   * Returns the queryId for castability comparisons.
-   */
-  int getQueryId();
-
-  /**
-   * Returns the line number on which the symbol was originally declared or
-   * <code>-1</code> if the line number is unknown.
-   */
-  int getSourceLine();
-
-  /**
-   * Returns a URI string representing the location of the source. This method
-   * will return <code>null</code> if the symbol was derived from a transient
-   * or unknown source.
-   */
-  String getSourceUri();
-
-  /**
-   * Returns the JavaScript symbol this data maps to.
-   */
-  String getSymbolName();
-
-  /**
-   * Returns <code>true</code> if the symbol represents a class.
-   */
-  boolean isClass();
-
-  /**
-   * Returns <code>true</code> if the symbol represents a field.
-   */
-  boolean isField();
-
-  /**
-   * Returns <code>true</code> if the symbol represents a method.
-   */
-  boolean isMethod();
-}
diff --git a/2.4/dev/core/src/com/google/gwt/core/ext/linker/SyntheticArtifact.java b/2.4/dev/core/src/com/google/gwt/core/ext/linker/SyntheticArtifact.java
deleted file mode 100644
index 8fbb6f8..0000000
--- a/2.4/dev/core/src/com/google/gwt/core/ext/linker/SyntheticArtifact.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * 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.core.ext.linker;
-
-import com.google.gwt.core.ext.Linker;
-import com.google.gwt.core.ext.TreeLogger;
-import com.google.gwt.core.ext.UnableToCompleteException;
-import com.google.gwt.dev.util.DiskCache;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.io.OutputStream;
-
-/**
- * Artifacts created by {@link AbstractLinker}.
- */
-public class SyntheticArtifact extends EmittedArtifact {
-  private static final DiskCache diskCache = DiskCache.INSTANCE;
-
-  private final long lastModified;
-  private transient long token;
-
-  public SyntheticArtifact(Class<? extends Linker> linkerType,
-      String partialPath, byte[] data) {
-    this(linkerType, partialPath, data, System.currentTimeMillis());
-  }
-
-  public SyntheticArtifact(Class<? extends Linker> linkerType,
-      String partialPath, byte[] data, long lastModified) {
-    super(linkerType, partialPath);
-    assert data != null;
-    this.lastModified = lastModified;
-    this.token = diskCache.writeByteArray(data);
-  }
-
-  @Override
-  public InputStream getContents(TreeLogger logger)
-      throws UnableToCompleteException {
-    return new ByteArrayInputStream(diskCache.readByteArray(token));
-  }
-
-  @Override
-  public long getLastModified() {
-    return lastModified;
-  }
-
-  @Override
-  public void writeTo(TreeLogger logger, OutputStream out)
-      throws UnableToCompleteException {
-    diskCache.transferToStream(token, out);
-  }
-
-  private void readObject(ObjectInputStream stream) throws IOException,
-      ClassNotFoundException {
-    stream.defaultReadObject();
-    token = diskCache.transferFromStream(stream);
-  }
-
-  private void writeObject(ObjectOutputStream stream) throws IOException {
-    stream.defaultWriteObject();
-    diskCache.transferToStream(token, stream);
-  }
-}
diff --git a/2.4/dev/core/src/com/google/gwt/core/ext/linker/Transferable.java b/2.4/dev/core/src/com/google/gwt/core/ext/linker/Transferable.java
deleted file mode 100644
index 1c50432..0000000
--- a/2.4/dev/core/src/com/google/gwt/core/ext/linker/Transferable.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * 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.core.ext.linker;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Inherited;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * An artifact marked with this annotation is passed through a compilation all
- * the way to the final call to
- * {@link com.google.gwt.core.ext.Linker#link(com.google.gwt.core.ext.TreeLogger, com.google.gwt.core.ext.LinkerContext, ArtifactSet, boolean)}
- * . Try to minimize the number of artifacts so marked.
- */
-@Documented
-@Inherited
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.TYPE)
-public @interface Transferable {
-}
diff --git a/2.4/dev/core/src/com/google/gwt/core/ext/linker/impl/BinaryOnlyArtifactWrapper.java b/2.4/dev/core/src/com/google/gwt/core/ext/linker/impl/BinaryOnlyArtifactWrapper.java
deleted file mode 100644
index 787c11d..0000000
--- a/2.4/dev/core/src/com/google/gwt/core/ext/linker/impl/BinaryOnlyArtifactWrapper.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * 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.core.ext.linker.impl;
-
-import com.google.gwt.core.ext.TreeLogger;
-import com.google.gwt.core.ext.UnableToCompleteException;
-import com.google.gwt.core.ext.linker.BinaryEmittedArtifact;
-import com.google.gwt.core.ext.linker.EmittedArtifact;
-
-import java.io.InputStream;
-
-/**
- * A wrapper around an emitted artifact that only allows reading the artifact's
- * path and its binary contents.
- */
-public class BinaryOnlyArtifactWrapper extends BinaryEmittedArtifact {
-  private final EmittedArtifact underlyingArtifact;
-
-  public BinaryOnlyArtifactWrapper(String path, EmittedArtifact artifact) {
-    super(path);
-    setVisibility(artifact.getVisibility());
-    this.underlyingArtifact = artifact;
-  }
-
-  @Override
-  public InputStream getContents(TreeLogger logger)
-      throws UnableToCompleteException {
-    return underlyingArtifact.getContents(logger);
-  }
-
-  @Override
-  public long getLastModified() {
-    return underlyingArtifact.getLastModified();
-  }
-}
diff --git a/2.4/dev/core/src/com/google/gwt/core/ext/linker/impl/HostedModeLinker.java b/2.4/dev/core/src/com/google/gwt/core/ext/linker/impl/HostedModeLinker.java
deleted file mode 100644
index ced3eee..0000000
--- a/2.4/dev/core/src/com/google/gwt/core/ext/linker/impl/HostedModeLinker.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * 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.core.ext.linker.impl;
-
-import com.google.gwt.core.ext.LinkerContext;
-import com.google.gwt.core.ext.TreeLogger;
-import com.google.gwt.core.ext.UnableToCompleteException;
-import com.google.gwt.core.ext.linker.ArtifactSet;
-import com.google.gwt.core.ext.linker.Shardable;
-import com.google.gwt.util.tools.Utility;
-
-import java.io.IOException;
-
-/**
- * This is a partial implementation of the Linker interface to support hosted
- * mode.
- */
-@Shardable
-public final class HostedModeLinker extends SelectionScriptLinker {
-
-  public static String getHostedHtml() throws IOException {
-    return Utility.getFileFromClassPath("com/google/gwt/core/ext/linker/impl/hosted.html");
-  }
-
-  /**
-   * TODO: When this class is removed, move SelectionScriptLinker to gwt-user.
-   */
-
-  @Override
-  public String generateSelectionScript(TreeLogger logger,
-      LinkerContext context, ArtifactSet artifacts)
-      throws UnableToCompleteException {
-    return super.generateSelectionScript(logger, context, artifacts);
-  }
-
-  @Override
-  public String getDescription() {
-    return "Hosted Mode";
-  }
-
-  @Override
-  public ArtifactSet link(TreeLogger logger, LinkerContext context,
-      ArtifactSet artifacts) throws UnableToCompleteException {
-    return unsupported(logger);
-  }
-
-  @Override
-  protected String getCompilationExtension(TreeLogger logger,
-      LinkerContext context) throws UnableToCompleteException {
-    return unsupported(logger);
-  }
-
-  @Override
-  protected String getModulePrefix(TreeLogger logger, LinkerContext context,
-      String strongName) throws UnableToCompleteException {
-    return unsupported(logger);
-  }
-
-  @Override
-  protected String getModuleSuffix(TreeLogger logger, LinkerContext context)
-      throws UnableToCompleteException {
-    return unsupported(logger);
-  }
-
-  @Override
-  protected String getSelectionScriptTemplate(TreeLogger logger, LinkerContext context) {
-    return "com/google/gwt/core/ext/linker/impl/HostedModeTemplate.js";
-  }
-
-  private <T> T unsupported(TreeLogger logger) throws UnableToCompleteException {
-    logger.log(TreeLogger.ERROR,
-        "HostedModeLinker does not support this function", null);
-    throw new UnableToCompleteException();
-  }
-}
diff --git a/2.4/dev/core/src/com/google/gwt/core/ext/linker/impl/HostedModeTemplate.js b/2.4/dev/core/src/com/google/gwt/core/ext/linker/impl/HostedModeTemplate.js
deleted file mode 100644
index 3bbb4a2..0000000
--- a/2.4/dev/core/src/com/google/gwt/core/ext/linker/impl/HostedModeTemplate.js
+++ /dev/null
@@ -1,473 +0,0 @@
-/*
- * 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.
- */
-
-function __MODULE_FUNC__() {
-  // ---------------- INTERNAL GLOBALS ----------------
-
-  // Cache symbols locally for good obfuscation
-  var $wnd = window
-  ,$doc = document
-  ,$stats = $wnd.__gwtStatsEvent ? function(a) {return $wnd.__gwtStatsEvent(a);} : null
-
-  // These variables gate calling gwtOnLoad; all must be true to start
-  ,scriptsDone, loadDone, bodyDone
-
-  // If non-empty, an alternate base url for this module
-  ,base = ''
-
-  // A map of properties that were declared in meta tags
-  ,metaProps = {}
-
-  // Maps property names onto sets of legal values for that property.
-  ,values = []
-
-  // Maps property names onto a function to compute that property.
-  ,providers = []
-
-  // A multi-tier lookup map that uses actual property values to quickly find
-  // the strong name of the cache.js file to load.
-  ,answers = []
-
-  // Error functions.  Default unset in compiled mode, may be set by meta props.
-  ,onLoadErrorFunc, propertyErrorFunc
-
-  ; // end of global vars
-
-  // Only fire the event if really Development Mode; in Production Mode the
-  // compiled selection script will fire its own startup event.
-  if (isHostedMode()) {
-    $stats && $stats({
-      moduleName: '__MODULE_NAME__',
-      sessionId: $sessionId,
-      subSystem: 'startup',
-      evtGroup: 'bootstrap', 
-      millis:(new Date()).getTime(), 
-      type: 'begin'
-    });
-  }
-
-  // ------------------ TRUE GLOBALS ------------------
-
-  // Maps to synchronize the loading of styles and scripts; resources are loaded
-  // only once, even when multiple modules depend on them.  This API must not
-  // change across GWT versions.
-  if (!$wnd.__gwt_stylesLoaded) { $wnd.__gwt_stylesLoaded = {}; }
-  if (!$wnd.__gwt_scriptsLoaded) { $wnd.__gwt_scriptsLoaded = {}; }
-
-  // --------------- INTERNAL FUNCTIONS ---------------
-
-  function isHostedMode() {
-    var result = false;
-    try {
-      var query = $wnd.location.search;
-      return (query.indexOf('gwt.codesvr=') != -1
-          || query.indexOf('gwt.hosted=') != -1 
-          || ($wnd.external && $wnd.external.gwtOnLoad)) &&
-          (query.indexOf('gwt.hybrid') == -1);
-    } catch (e) {
-      // Defensive: some versions of IE7 reportedly can throw an exception
-      // evaluating "external.gwtOnLoad".
-    }
-    isHostedMode = function() { return result; };
-    return result;
-  }
-
-  // Called by onScriptLoad(), onInjectionDone(), and onload(). It causes
-  // the specified module to be cranked up.
-  //
-  function maybeStartModule() {
-    if (scriptsDone && loadDone) {
-      var iframe = $doc.getElementById('__MODULE_NAME__');
-      var frameWnd = iframe.contentWindow;
-      // inject Development Mode property evaluation function
-      if (isHostedMode()) {
-        frameWnd.__gwt_getProperty = function(name) {
-          return computePropValue(name);
-        };
-      }
-      // remove this whole function from the global namespace to allow GC
-      __MODULE_FUNC__ = null;
-      // JavaToJavaScriptCompiler logs onModuleLoadStart for each EntryPoint.
-      frameWnd.gwtOnLoad(onLoadErrorFunc, '__MODULE_NAME__', base);
-      // Record when the module EntryPoints return.
-      $stats && $stats({
-        moduleName: '__MODULE_NAME__',
-        sessionId: $sessionId,
-        subSystem: 'startup',
-        evtGroup: 'moduleStartup',
-        millis:(new Date()).getTime(),
-        type: 'end'
-      });
-    }
-  }
-
-  // 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() {
-    var thisScript
-    ,markerId = "__gwt_marker___MODULE_NAME__"
-    ,markerScript;
-
-    $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.
-    function getDirectoryOfFile(path) {
-      // Truncate starting at the first '?' or '#', whichever comes first. 
-      var hashIndex = path.lastIndexOf('#');
-      if (hashIndex == -1) {
-        hashIndex = path.length;
-      }
-      var queryIndex = path.indexOf('?');
-      if (queryIndex == -1) {
-        queryIndex = path.length;
-      }
-      var slashIndex = path.lastIndexOf('/', Math.min(queryIndex, hashIndex));
-      return (slashIndex >= 0) ? path.substring(0, slashIndex + 1) : '';
-    };
-
-    if (thisScript && thisScript.src) {
-      // Compute our base url
-      base = getDirectoryOfFile(thisScript.src);
-    }
-
-    // Make the base URL absolute
-    if (base == '') {
-      // If there's a base tag, use it.
-      var baseElements = $doc.getElementsByTagName('base');
-      if (baseElements.length > 0) {
-        // It's always the last parsed base tag that will apply to this script.
-        base = baseElements[baseElements.length - 1].href;
-      } else {
-        // No base tag; the base must be the same as the document location.
-        base = getDirectoryOfFile($doc.location.href);
-      }
-    } else if ((base.match(/^\w+:\/\//))) {
-      // If the URL is obviously absolute, do nothing.
-    } else {
-      // Probably a relative URL; use magic to make the browser absolutify it.
-      // I wish there were a better way to do this, but this seems the only
-      // sure way!  (A side benefit is it preloads clear.cache.gif)
-      // Note: this trick is harmless if the URL was really already absolute.
-      var img = $doc.createElement("img");
-      img.src = base + 'clear.cache.gif';
-      base = getDirectoryOfFile(img.src);
-    }
-
-    if (markerScript) {
-      // remove the marker element
-      markerScript.parentNode.removeChild(markerScript);
-    }
-  }
-
-  // Called to slurp up all <meta> tags:
-  // gwt:property, gwt:onPropertyErrorFn, gwt:onLoadErrorFn
-  //
-  function processMetas() {
-    var metas = document.getElementsByTagName('meta');
-    for (var i = 0, n = metas.length; i < n; ++i) {
-      var meta = metas[i], name = meta.getAttribute('name'), content;
-
-      if (name) {
-        if (name == 'gwt:property') {
-          content = meta.getAttribute('content');
-          if (content) {
-            var value, eq = content.indexOf('=');
-            if (eq >= 0) {
-              name = content.substring(0, eq);
-              value = content.substring(eq+1);
-            } else {
-              name = content;
-              value = '';
-            }
-            metaProps[name] = value;
-          }
-        } else if (name == 'gwt:onPropertyErrorFn') {
-          content = meta.getAttribute('content');
-          if (content) {
-            try {
-              propertyErrorFunc = eval(content);
-            } catch (e) {
-              alert('Bad handler \"' + content +
-                '\" for \"gwt:onPropertyErrorFn\"');
-            }
-          }
-        } else if (name == 'gwt:onLoadErrorFn') {
-          content = meta.getAttribute('content');
-          if (content) {
-            try {
-              onLoadErrorFunc = eval(content);
-            } catch (e) {
-              alert('Bad handler \"' + content + '\" for \"gwt:onLoadErrorFn\"');
-            }
-          }
-        }
-      }
-    }
-  }
-
-  /**
-   * Determines whether or not a particular property value is allowed. Called by
-   * property providers.
-   *
-   * @param propName the name of the property being checked
-   * @param propValue the property value being tested
-   */
-  function __gwt_isKnownPropertyValue(propName, propValue) {
-    return propValue in values[propName];
-  }
-
-  /**
-   * Returns a meta property value, if any.  Used by DefaultPropertyProvider.
-   */
-  function __gwt_getMetaProperty(name) {
-    var value = metaProps[name];
-    return (value == null) ? null : value;
-  }
-
-  // Deferred-binding mapper function.  Sets a value into the several-level-deep
-  // answers map. The keys are specified by a non-zero-length propValArray,
-  // which should be a flat array target property values. Used by the generated
-  // PERMUTATIONS code.
-  //
-  function unflattenKeylistIntoAnswers(propValArray, value) {
-    var answer = answers;
-    for (var i = 0, n = propValArray.length - 1; i < n; ++i) {
-      // lazy initialize an empty object for the current key if needed
-      answer = answer[propValArray[i]] || (answer[propValArray[i]] = []);
-    }
-    // set the final one to the value
-    answer[propValArray[n]] = value;
-  }
-
-  // Computes the value of a given property.  propName must be a valid property
-  // name. Used by the generated PERMUTATIONS code.
-  //
-  function computePropValue(propName) {
-    var value = providers[propName](), allowedValuesMap = values[propName];
-    if (value in allowedValuesMap) {
-      return value;
-    }
-    var allowedValuesList = [];
-    for (var k in allowedValuesMap) {
-      allowedValuesList[allowedValuesMap[k]] = k;
-    }
-    if (propertyErrorFunc) {
-      propertyErrorFunc(propName, allowedValuesList, value);
-    }
-    throw null;
-  }
-
-  var frameInjected;
-  function maybeInjectFrame() {
-    if (!frameInjected) {
-      frameInjected = true;
-      var iframe = $doc.createElement('iframe');
-      // Prevents mixed mode security in IE6/7.
-      iframe.src = "javascript:''";
-      iframe.id = "__MODULE_NAME__";
-      iframe.style.cssText = "position:absolute;width:0;height:0;border:none";
-      iframe.tabIndex = -1;
-      // Due to an IE6/7 refresh quirk, this must be an appendChild.
-      $doc.body.appendChild(iframe);
-      
-      /* 
-       * The src has to be set after the iframe is attached to the DOM to avoid
-       * refresh quirks in Safari.  We have to use the location.replace trick to
-       * avoid FF2 refresh quirks.
-       */
-      $stats && $stats({
-        moduleName:'__MODULE_NAME__',
-        sessionId: $sessionId,
-        subSystem:'startup', 
-        evtGroup: 'moduleStartup', 
-        millis:(new Date()).getTime(), 
-        type: 'moduleRequested'
-      });
-      iframe.contentWindow.location.replace(base + strongName);
-    }
-  }
-
-  // --------------- PROPERTY PROVIDERS --------------- 
-
-// __PROPERTIES_BEGIN__
-// __PROPERTIES_END__
-
-  // --------------- EXPOSED FUNCTIONS ----------------
-
-  // Called when the compiled script identified by moduleName is done loading.
-  //
-  __MODULE_FUNC__.onScriptLoad = function() {
-    // IE7 bookmark bug. A phantom (presumably cached) version of our compiled iframe
-    // can call onScriptLoad before we even properly inject the iframe. So if this is
-    // called before the frame was injected ... it is completely bogus.
-    if (frameInjected) {
-      // Mark this module's script as done loading and (possibly) start the module.
-      loadDone = true;
-      maybeStartModule();
-    }
-  }
-
-  // Called when the script injection is complete.
-  //
-  __MODULE_FUNC__.onInjectionDone = function() {
-    // Mark this module's script injection done and (possibly) start the module.
-    scriptsDone = true;
-    $stats && $stats({
-      moduleName:'__MODULE_NAME__',
-      sessionId: $sessionId,
-      subSystem:'startup', 
-      evtGroup: 'loadExternalRefs', 
-      millis:(new Date()).getTime(), 
-      type: 'end'
-    });
-    maybeStartModule();
-  }
-
-  // --------------- STRAIGHT-LINE CODE ---------------
-
-  // do it early for compile/browse rebasing
-  computeScriptBase();
-
-// __SHELL_SERVLET_ONLY_BEGIN__
-  // Force shell servlet to serve compiled output for Production Mode
-  if (!isHostedMode()) {
-    $doc.write('<script src="' + base + '__MODULE_NAME__.nocache.js?compiled"></script>');
-    return;
-  }
-
-  // Default shell servlet load error function
-  //
-  onLoadErrorFunc = function() {
-    alert('Failed to load module __MODULE_NAME__' +
-      '".\nPlease see the log in the development shell for details.');
-  };
-
-  // Default shell servlet property error function
-  //
-  propertyErrorFunc = function(propName, allowedValues, badValue) {
-    var msg = 'While attempting to load module __MODULE_NAME__, property \"'
-      + propName;
-    if (badValue != null) {
-      msg += '\" was set to the unexpected value \"' + badValue + '\"';
-    } else {
-      msg += '\" was not specified';
-    }
-    msg += 'Allowed values: ' + allowedValues;
-    alert(msg);
-  };
-
-// __SHELL_SERVLET_ONLY_END__
-
-  processMetas();
-
-  // --------------- WINDOW ONLOAD HOOK ---------------
-
-  $stats && $stats({
-    moduleName:'__MODULE_NAME__',
-    sessionId: $sessionId,
-    subSystem:'startup', 
-    evtGroup: 'bootstrap', 
-    millis:(new Date()).getTime(), 
-    type: 'selectingPermutation'
-  });
-
-  var strongName;
-  if (isHostedMode()) {
-    strongName = "hosted.html?__MODULE_FUNC__";
-    // Hang an expando for hosted.html to be able to grab the module name early.
-    __MODULE_FUNC__.moduleName = '__MODULE_NAME__';
-  } else {
-    try {
-// __PERMUTATIONS_BEGIN__
-      // Permutation logic
-// __PERMUTATIONS_END__
-    } catch (e) {
-      // intentionally silent on property failure
-      return;
-    }
-  }
-
-  var onBodyDoneTimerId;
-  function onBodyDone() {
-    if (!bodyDone) {
-      bodyDone = true;
-// __MODULE_STYLES_BEGIN__
-     // Style resources are injected here to prevent operation aborted errors on ie
-// __MODULE_STYLES_END__
-      maybeStartModule();
-
-      if ($doc.removeEventListener) {
-        $doc.removeEventListener("DOMContentLoaded", onBodyDone, false);
-      }
-      if (onBodyDoneTimerId) {
-        clearInterval(onBodyDoneTimerId);
-      }
-    }
-  }
-
-  // For everyone that supports DOMContentLoaded.
-  if ($doc.addEventListener) {
-    $doc.addEventListener("DOMContentLoaded", function() {
-      maybeInjectFrame();
-      onBodyDone();
-    }, false);
-  }
-
-  // Fallback. If onBodyDone() gets fired twice, it's not a big deal.
-  var onBodyDoneTimerId = setInterval(function() {
-    if (/loaded|complete/.test($doc.readyState)) {
-      maybeInjectFrame();
-      onBodyDone();
-    }
-  }, 50);
-
-  $stats && $stats({
-    moduleName:'__MODULE_NAME__',
-    sessionId: $sessionId,
-    subSystem:'startup', 
-    evtGroup: 'bootstrap', 
-    millis:(new Date()).getTime(), 
-    type: 'end'
-  });
-
-  $stats && $stats({
-    moduleName:'__MODULE_NAME__',
-    sessionId: $sessionId,
-    subSystem:'startup',
-    evtGroup: 'loadExternalRefs',
-    millis:(new Date()).getTime(),
-    type: 'begin'
-  });
-
-// __MODULE_SCRIPTS_BEGIN__
-  // Script resources are injected here
-// __MODULE_SCRIPTS_END__
-
-  $doc.write('<script defer="defer">__MODULE_FUNC__.onInjectionDone(\'__MODULE_NAME__\')</script>');
-}
-
-__MODULE_FUNC__();
diff --git a/2.4/dev/core/src/com/google/gwt/core/ext/linker/impl/JarEntryEmittedArtifact.java b/2.4/dev/core/src/com/google/gwt/core/ext/linker/impl/JarEntryEmittedArtifact.java
deleted file mode 100644
index 89678d2..0000000
--- a/2.4/dev/core/src/com/google/gwt/core/ext/linker/impl/JarEntryEmittedArtifact.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * 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.core.ext.linker.impl;
-
-import com.google.gwt.core.ext.TreeLogger;
-import com.google.gwt.core.ext.UnableToCompleteException;
-import com.google.gwt.core.ext.linker.BinaryEmittedArtifact;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.jar.JarEntry;
-import java.util.jar.JarFile;
-
-/**
- *A <code>BinaryEmittedArtifact</code> that reads a jar entry.
- */
-public class JarEntryEmittedArtifact extends BinaryEmittedArtifact {
-  /**
-   * An input stream that has its own open {@link JarFile}. When this stream is
-   * closed, the {@link JarFile} is as well.
-   */
-  private class JarEntryInputStream extends InputStream {
-    private JarFile jarFile;
-    private InputStream stream;
-
-    public JarEntryInputStream() throws IOException {
-      this.jarFile = new JarFile(file);
-      this.stream = jarFile.getInputStream(entry);
-    }
-
-    @Override
-    public void close() throws IOException {
-      stream.close();
-      jarFile.close();
-    }
-
-    @Override
-    public int read() throws IOException {
-      return stream.read();
-    }
-
-    @Override