diff --git a/dev/core/src/com/google/gwt/dev/Compiler.java b/dev/core/src/com/google/gwt/dev/Compiler.java
index be43d78..8f8a348 100644
--- a/dev/core/src/com/google/gwt/dev/Compiler.java
+++ b/dev/core/src/com/google/gwt/dev/Compiler.java
@@ -25,7 +25,6 @@
 import com.google.gwt.dev.cfg.ModuleDefLoader;
 import com.google.gwt.dev.jjs.JJSOptions;
 import com.google.gwt.dev.shell.CheckForUpdates;
-import com.google.gwt.dev.shell.PlatformSpecific;
 import com.google.gwt.dev.shell.CheckForUpdates.UpdateResult;
 import com.google.gwt.dev.util.FileBackedObject;
 import com.google.gwt.dev.util.PerfLogger;
@@ -132,12 +131,12 @@
         public boolean run(TreeLogger logger) throws UnableToCompleteException {
           FutureTask<UpdateResult> updater = null;
           if (!options.isUpdateCheckDisabled()) {
-            updater = PlatformSpecific.checkForUpdatesInBackgroundThread(
-                logger, CheckForUpdates.ONE_DAY);
+            updater = CheckForUpdates.checkForUpdatesInBackgroundThread(logger,
+                CheckForUpdates.ONE_DAY);
           }
           boolean success = new Compiler(options).run(logger);
           if (success) {
-            PlatformSpecific.logUpdateAvailable(logger, updater);
+            CheckForUpdates.logUpdateAvailable(logger, updater);
           }
           return success;
         }
diff --git a/dev/core/src/com/google/gwt/dev/GWTCompiler.java b/dev/core/src/com/google/gwt/dev/GWTCompiler.java
index 08d7f85..4224a2f 100644
--- a/dev/core/src/com/google/gwt/dev/GWTCompiler.java
+++ b/dev/core/src/com/google/gwt/dev/GWTCompiler.java
@@ -24,7 +24,6 @@
 import com.google.gwt.dev.cfg.ModuleDefLoader;
 import com.google.gwt.dev.jjs.JJSOptions;
 import com.google.gwt.dev.shell.CheckForUpdates;
-import com.google.gwt.dev.shell.PlatformSpecific;
 import com.google.gwt.dev.shell.CheckForUpdates.UpdateResult;
 import com.google.gwt.dev.util.FileBackedObject;
 import com.google.gwt.dev.util.PerfLogger;
@@ -119,12 +118,12 @@
         public boolean run(TreeLogger logger) throws UnableToCompleteException {
           FutureTask<UpdateResult> updater = null;
           if (!options.isUpdateCheckDisabled()) {
-            updater = PlatformSpecific.checkForUpdatesInBackgroundThread(
+            updater = CheckForUpdates.checkForUpdatesInBackgroundThread(
                 logger, CheckForUpdates.ONE_DAY);
           }
           boolean success = new GWTCompiler(options).run(logger);
           if (success) {
-            PlatformSpecific.logUpdateAvailable(logger, updater);
+            CheckForUpdates.logUpdateAvailable(logger, updater);
           }
           return success;
         }
diff --git a/dev/core/src/com/google/gwt/dev/HostedModeBase.java b/dev/core/src/com/google/gwt/dev/HostedModeBase.java
index f99d8dd..ecdf0d9 100644
--- a/dev/core/src/com/google/gwt/dev/HostedModeBase.java
+++ b/dev/core/src/com/google/gwt/dev/HostedModeBase.java
@@ -29,7 +29,6 @@
 import com.google.gwt.dev.shell.BrowserWindowController;
 import com.google.gwt.dev.shell.CheckForUpdates;
 import com.google.gwt.dev.shell.ModuleSpaceHost;
-import com.google.gwt.dev.shell.PlatformSpecific;
 import com.google.gwt.dev.shell.ShellModuleSpaceHost;
 import com.google.gwt.dev.util.Util;
 import com.google.gwt.dev.util.arg.ArgHandlerDisableAggressiveOptimization;
@@ -193,6 +192,7 @@
       HostedModeBase.this.compile(getLogger());
     }
 
+    @Deprecated
     public void compile(String[] moduleNames) throws UnableToCompleteException {
       if (!isLegacyMode()) {
         throw new UnsupportedOperationException();
@@ -431,6 +431,8 @@
 
   /**
    * Compiles all modules.
+   * 
+   * @throws UnableToCompleteException
    */
   protected abstract void compile(TreeLogger logger)
       throws UnableToCompleteException;
@@ -481,12 +483,12 @@
     // Check for updates
     final TreeLogger logger = getTopLogger();
     final CheckForUpdates updateChecker
-        = PlatformSpecific.createUpdateChecker(logger);
+        = CheckForUpdates.createUpdateChecker(logger);
     if (updateChecker != null) {
       Thread checkerThread = new Thread("GWT Update Checker") {
         @Override
         public void run() {
-          PlatformSpecific.logUpdateAvailable(logger,
+          CheckForUpdates.logUpdateAvailable(logger,
               updateChecker.check(checkForUpdatesInterval()));
         }
       };
diff --git a/dev/core/src/com/google/gwt/dev/Precompile.java b/dev/core/src/com/google/gwt/dev/Precompile.java
index fb64d94..4609a65 100644
--- a/dev/core/src/com/google/gwt/dev/Precompile.java
+++ b/dev/core/src/com/google/gwt/dev/Precompile.java
@@ -38,7 +38,6 @@
 import com.google.gwt.dev.jjs.UnifiedAst;
 import com.google.gwt.dev.jjs.impl.FragmentLoaderCreator;
 import com.google.gwt.dev.shell.CheckForUpdates;
-import com.google.gwt.dev.shell.PlatformSpecific;
 import com.google.gwt.dev.shell.StandardRebindOracle;
 import com.google.gwt.dev.shell.CheckForUpdates.UpdateResult;
 import com.google.gwt.dev.util.PerfLogger;
@@ -299,12 +298,12 @@
         public boolean run(TreeLogger logger) throws UnableToCompleteException {
           FutureTask<UpdateResult> updater = null;
           if (!options.isUpdateCheckDisabled()) {
-            updater = PlatformSpecific.checkForUpdatesInBackgroundThread(
-                logger, CheckForUpdates.ONE_DAY);
+            updater = CheckForUpdates.checkForUpdatesInBackgroundThread(logger,
+                CheckForUpdates.ONE_DAY);
           }
           boolean success = new Precompile(options).run(logger);
           if (success) {
-            PlatformSpecific.logUpdateAvailable(logger, updater);
+            CheckForUpdates.logUpdateAvailable(logger, updater);
           }
           return success;
         }
diff --git a/dev/core/src/com/google/gwt/dev/SwtHostedModeBase.java b/dev/core/src/com/google/gwt/dev/SwtHostedModeBase.java
index a737d3b..8a73bb5 100644
--- a/dev/core/src/com/google/gwt/dev/SwtHostedModeBase.java
+++ b/dev/core/src/com/google/gwt/dev/SwtHostedModeBase.java
@@ -22,7 +22,6 @@
 import com.google.gwt.dev.shell.BrowserWidget;
 import com.google.gwt.dev.shell.BrowserWidgetHost;
 import com.google.gwt.dev.shell.ModuleSpaceHost;
-import com.google.gwt.dev.shell.PlatformSpecific;
 import com.google.gwt.dev.shell.ShellMainWindow;
 import com.google.gwt.dev.shell.ShellModuleSpaceHost;
 import com.google.gwt.dev.util.log.AbstractTreeLogger;
@@ -35,9 +34,12 @@
 import org.eclipse.swt.graphics.Rectangle;
 import org.eclipse.swt.internal.Library;
 import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.Shell;
 
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -74,6 +76,16 @@
     }
   }
 
+  /**
+   * All of these classes must extend BrowserWidget. The first one that loads
+   * will be used, so it is important that only the correct one be on the
+   * classpath.
+   */
+  private static final String[] browserClassNames = new String[] {
+      "com.google.gwt.dev.shell.ie.BrowserWidgetIE6",
+      "com.google.gwt.dev.shell.moz.BrowserWidgetMoz",
+      "com.google.gwt.dev.shell.mac.BrowserWidgetSaf"};
+
   static {
     // Force ToolBase to clinit, which causes SWT stuff to happen.
     new ToolBase() {
@@ -82,6 +94,47 @@
     Display.setAppName("GWT");
   }
 
+  private static BrowserWidget createBrowserWidget(TreeLogger logger,
+      Composite parent, BrowserWidgetHost host)
+      throws UnableToCompleteException {
+    Throwable caught = null;
+    try {
+      for (int i = 0; i < browserClassNames.length; i++) {
+        Class<? extends BrowserWidget> clazz = null;
+        try {
+          clazz = Class.forName(browserClassNames[i]).asSubclass(
+              BrowserWidget.class);
+          Constructor<? extends BrowserWidget> ctor = clazz.getDeclaredConstructor(new Class[] {
+              Shell.class, BrowserWidgetHost.class});
+          BrowserWidget bw = ctor.newInstance(new Object[] {parent, host});
+          return bw;
+        } catch (ClassNotFoundException e) {
+          caught = e;
+        }
+      }
+      logger.log(TreeLogger.ERROR,
+          "No instantiable browser widget class could be found", caught);
+      throw new UnableToCompleteException();
+    } catch (SecurityException e) {
+      caught = e;
+    } catch (NoSuchMethodException e) {
+      caught = e;
+    } catch (IllegalArgumentException e) {
+      caught = e;
+    } catch (InstantiationException e) {
+      caught = e;
+    } catch (IllegalAccessException e) {
+      caught = e;
+    } catch (InvocationTargetException e) {
+      caught = e.getTargetException();
+    } catch (ClassCastException e) {
+      caught = e;
+    }
+    logger.log(TreeLogger.ERROR,
+        "The browser widget class could not be instantiated", caught);
+    throw new UnableToCompleteException();
+  }
+
   private BrowserWidgetHostImpl browserHost = new SwtBrowserWidgetHostImpl();
 
   private final List<Shell> browserShells = new ArrayList<Shell>();
@@ -147,8 +200,7 @@
     boolean succeeded = false;
     Shell s = createTrackedBrowserShell();
     try {
-      BrowserWidget bw = PlatformSpecific.createBrowserWidget(getTopLogger(),
-          s, browserHost);
+      BrowserWidget bw = createBrowserWidget(getTopLogger(), s, browserHost);
 
       if (mainWnd != null) {
         Rectangle r = mainWnd.getShell().getBounds();
diff --git a/dev/core/src/com/google/gwt/dev/shell/CheckForUpdates.java b/dev/core/src/com/google/gwt/dev/shell/CheckForUpdates.java
index 51bfbe4..e02230d 100644
--- a/dev/core/src/com/google/gwt/dev/shell/CheckForUpdates.java
+++ b/dev/core/src/com/google/gwt/dev/shell/CheckForUpdates.java
@@ -16,6 +16,7 @@
 package com.google.gwt.dev.shell;
 
 import com.google.gwt.core.ext.TreeLogger;
+import com.google.gwt.core.ext.TreeLogger.HelpInfo;
 import com.google.gwt.dev.About;
 
 import org.w3c.dom.Document;
@@ -33,10 +34,16 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.PrintWriter;
+import java.lang.reflect.Constructor;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.net.URLConnection;
 import java.util.Date;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.FutureTask;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
 import java.util.prefs.Preferences;
 
 import javax.xml.parsers.DocumentBuilder;
@@ -182,6 +189,110 @@
   // The real URL that should be used.
   private static final String QUERY_URL = "http://tools.google.com/webtoolkit/currentversion.xml";
 
+  /**
+   * All of these classes must extend CheckForUpdates. Note that currently only
+   * IE has a custom implementation (to handle proxies) and that CheckForUpdates
+   * must be the last one in the list.
+   */
+  private static final String[] updaterClassNames = new String[] {
+      "com.google.gwt.dev.shell.ie.CheckForUpdatesIE6",
+      "com.google.gwt.dev.shell.CheckForUpdates"};
+
+  public static FutureTask<UpdateResult> checkForUpdatesInBackgroundThread(
+      final TreeLogger logger, final long minCheckMillis) {
+    final String entryPoint = computeEntryPoint();
+    FutureTask<UpdateResult> task = new FutureTask<UpdateResult>(
+        new Callable<UpdateResult>() {
+          public UpdateResult call() throws Exception {
+            final CheckForUpdates updateChecker = createUpdateChecker(logger,
+                entryPoint);
+            return updateChecker == null ? null
+                : updateChecker.check(minCheckMillis);
+          }
+        });
+    Thread checkerThread = new Thread(task, "GWT Update Checker");
+    checkerThread.setDaemon(true);
+    checkerThread.start();
+    return task;
+  }
+
+  /**
+   * Find the first method named "main" on the call stack and use its class as
+   * the entry point.
+   */
+  public static String computeEntryPoint() {
+    Throwable t = new Throwable();
+    for (StackTraceElement stackTrace : t.getStackTrace()) {
+      if (stackTrace.getMethodName().equals("main")) {
+        // Strip package name from main's class
+        String className = stackTrace.getClassName();
+        int i = className.lastIndexOf('.');
+        if (i >= 0) {
+          return className.substring(i + 1);
+        }
+        return className;
+      }
+    }
+    return null;
+  }
+
+  public static CheckForUpdates createUpdateChecker(TreeLogger logger) {
+    return createUpdateChecker(logger, computeEntryPoint());
+  }
+
+  public static CheckForUpdates createUpdateChecker(TreeLogger logger,
+      String entryPoint) {
+    try {
+      for (int i = 0; i < updaterClassNames.length; i++) {
+        try {
+          Class<? extends CheckForUpdates> clazz = Class.forName(
+              updaterClassNames[i]).asSubclass(CheckForUpdates.class);
+          Constructor<? extends CheckForUpdates> ctor = clazz.getDeclaredConstructor(new Class[] {
+              TreeLogger.class, String.class});
+          CheckForUpdates checker = ctor.newInstance(new Object[] {
+              logger, entryPoint});
+          return checker;
+        } catch (Exception e) {
+          // Other exceptions can occur besides ClassNotFoundException,
+          // so ignore them all so we can find a functional updater.
+        }
+      }
+    } catch (Throwable e) {
+      // silently ignore any errors
+    }
+    return null;
+  }
+
+  public static void logUpdateAvailable(TreeLogger logger,
+      FutureTask<UpdateResult> updater) {
+    if (updater != null && updater.isDone()) {
+      UpdateResult result = null;
+      try {
+        result = updater.get(0, TimeUnit.MILLISECONDS);
+      } catch (InterruptedException e) {
+        // Silently ignore exception
+      } catch (ExecutionException e) {
+        // Silently ignore exception
+      } catch (TimeoutException e) {
+        // Silently ignore exception
+      }
+      logUpdateAvailable(logger, result);
+    }
+  }
+
+  public static void logUpdateAvailable(TreeLogger logger, UpdateResult result) {
+    if (result != null) {
+      final URL url = result.getURL();
+      logger.log(TreeLogger.WARN, "A new version of GWT ("
+          + result.getNewVersion() + ") is available", null, new HelpInfo() {
+        @Override
+        public URL getURL() {
+          return url;
+        }
+      });
+    }
+  }
+
   private static String getTextOfLastElementHavingTag(Document doc,
       String tagName) {
     NodeList nodeList = doc.getElementsByTagName(tagName);
@@ -201,7 +312,9 @@
   }
 
   private String entryPoint;
+
   private TreeLogger logger;
+
   private GwtVersion myVersion;
 
   /**
diff --git a/dev/core/src/com/google/gwt/dev/shell/PlatformSpecific.java b/dev/core/src/com/google/gwt/dev/shell/PlatformSpecific.java
deleted file mode 100644
index dfeaa8b..0000000
--- a/dev/core/src/com/google/gwt/dev/shell/PlatformSpecific.java
+++ /dev/null
@@ -1,192 +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.dev.shell;
-
-import com.google.gwt.core.ext.TreeLogger;
-import com.google.gwt.core.ext.UnableToCompleteException;
-import com.google.gwt.core.ext.TreeLogger.HelpInfo;
-import com.google.gwt.dev.shell.CheckForUpdates.UpdateResult;
-
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Shell;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
-import java.net.URL;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.FutureTask;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-
-/**
- * Performs platform-specific class selection.
- */
-public class PlatformSpecific {
-
-  /**
-   * All of these classes must extend BrowserWidget.
-   */
-  private static final String[] browserClassNames = new String[] {
-      "com.google.gwt.dev.shell.ie.BrowserWidgetIE6",
-      "com.google.gwt.dev.shell.moz.BrowserWidgetMoz",
-      "com.google.gwt.dev.shell.mac.BrowserWidgetSaf"};
-
-  /**
-   * All of these classes must extend CheckForUpdates. Note that currently only
-   * IE has a custom implementation (to handle proxies) and that CheckForUpdates
-   * must be the last one in the list.
-   */
-  private static final String[] updaterClassNames = new String[] {
-      "com.google.gwt.dev.shell.ie.CheckForUpdatesIE6",
-      "com.google.gwt.dev.shell.CheckForUpdates"};
-
-  public static FutureTask<UpdateResult> checkForUpdatesInBackgroundThread(
-      final TreeLogger logger, final long minCheckMillis) {
-    final String entryPoint = PlatformSpecific.computeEntryPoint();
-    FutureTask<UpdateResult> task = new FutureTask<UpdateResult>(
-        new Callable<UpdateResult>() {
-          public UpdateResult call() throws Exception {
-            final CheckForUpdates updateChecker = createUpdateChecker(logger,
-                entryPoint);
-            return updateChecker == null ? null
-                : updateChecker.check(minCheckMillis);
-          }
-        });
-    Thread checkerThread = new Thread(task, "GWT Update Checker");
-    checkerThread.setDaemon(true);
-    checkerThread.start();
-    return task;
-  }
-
-  /**
-   * Find the first method named "main" on the call stack and use its class as
-   * the entry point.
-   */
-  public static String computeEntryPoint() {
-    Throwable t = new Throwable();
-    for (StackTraceElement stackTrace : t.getStackTrace()) {
-      if (stackTrace.getMethodName().equals("main")) {
-        // Strip package name from main's class
-        String className = stackTrace.getClassName();
-        int i = className.lastIndexOf('.');
-        if (i >= 0) {
-          return className.substring(i + 1);
-        }
-        return className;
-      }
-    }
-    return null;
-  }
-
-  public static BrowserWidget createBrowserWidget(TreeLogger logger,
-      Composite parent, BrowserWidgetHost host)
-      throws UnableToCompleteException {
-    Throwable caught = null;
-    try {
-      for (int i = 0; i < browserClassNames.length; i++) {
-        Class<? extends BrowserWidget> clazz = null;
-        try {
-          clazz = Class.forName(browserClassNames[i]).asSubclass(
-              BrowserWidget.class);
-          Constructor<? extends BrowserWidget> ctor = clazz.getDeclaredConstructor(new Class[] {
-              Shell.class, BrowserWidgetHost.class});
-          BrowserWidget bw = ctor.newInstance(new Object[] {parent, host});
-          return bw;
-        } catch (ClassNotFoundException e) {
-          caught = e;
-        }
-      }
-      logger.log(TreeLogger.ERROR,
-          "No instantiable browser widget class could be found", caught);
-      throw new UnableToCompleteException();
-    } catch (SecurityException e) {
-      caught = e;
-    } catch (NoSuchMethodException e) {
-      caught = e;
-    } catch (IllegalArgumentException e) {
-      caught = e;
-    } catch (InstantiationException e) {
-      caught = e;
-    } catch (IllegalAccessException e) {
-      caught = e;
-    } catch (InvocationTargetException e) {
-      caught = e.getTargetException();
-    } catch (ClassCastException e) {
-      caught = e;
-    }
-    logger.log(TreeLogger.ERROR,
-        "The browser widget class could not be instantiated", caught);
-    throw new UnableToCompleteException();
-  }
-
-  public static CheckForUpdates createUpdateChecker(TreeLogger logger) {
-    return createUpdateChecker(logger, computeEntryPoint());
-  }
-
-  public static CheckForUpdates createUpdateChecker(TreeLogger logger,
-      String entryPoint) {
-    try {
-      for (int i = 0; i < updaterClassNames.length; i++) {
-        try {
-          Class<? extends CheckForUpdates> clazz = Class.forName(
-              updaterClassNames[i]).asSubclass(CheckForUpdates.class);
-          Constructor<? extends CheckForUpdates> ctor = clazz.getDeclaredConstructor(new Class[] {
-              TreeLogger.class, String.class});
-          CheckForUpdates checker = ctor.newInstance(new Object[] {
-              logger, entryPoint});
-          return checker;
-        } catch (Exception e) {
-          // Other exceptions can occur besides ClassNotFoundException,
-          // so ignore them all so we can find a functional updater.
-        }
-      }
-    } catch (Throwable e) {
-      // silently ignore any errors
-    }
-    return null;
-  }
-
-  public static void logUpdateAvailable(TreeLogger logger,
-      FutureTask<UpdateResult> updater) {
-    if (updater != null && updater.isDone()) {
-      UpdateResult result = null;
-      try {
-        result = updater.get(0, TimeUnit.MILLISECONDS);
-      } catch (InterruptedException e) {
-        // Silently ignore exception
-      } catch (ExecutionException e) {
-        // Silently ignore exception
-      } catch (TimeoutException e) {
-        // Silently ignore exception
-      }
-      logUpdateAvailable(logger, result);
-    }
-  }
-
-  public static void logUpdateAvailable(TreeLogger logger, UpdateResult result) {
-    if (result != null) {
-      final URL url = result.getURL();
-      logger.log(TreeLogger.INFO, "A new version of GWT ("
-          + result.getNewVersion() + ") is available", null, new HelpInfo() {
-        @Override
-        public URL getURL() {
-          return url;
-        }
-      });
-    }
-  }
-}
diff --git a/dev/oophm/overlay/com/google/gwt/dev/shell/PlatformSpecific.java b/dev/oophm/overlay/com/google/gwt/dev/shell/PlatformSpecific.java
deleted file mode 100644
index 09bf046..0000000
--- a/dev/oophm/overlay/com/google/gwt/dev/shell/PlatformSpecific.java
+++ /dev/null
@@ -1,138 +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.dev.shell;
-
-import com.google.gwt.core.ext.TreeLogger;
-import com.google.gwt.core.ext.TreeLogger.HelpInfo;
-import com.google.gwt.dev.shell.CheckForUpdates.UpdateResult;
-
-import java.lang.reflect.Constructor;
-import java.net.URL;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.FutureTask;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-
-/**
- * Performs platform-specific class selection.
- */
-public class PlatformSpecific {
-
-  /**
-   * All of these classes must extend CheckForUpdates. Note that currently only
-   * IE has a custom implementation (to handle proxies) and that CheckForUpdates
-   * must be the last one in the list.
-   */
-  private static final String[] updaterClassNames = new String[] {
-      "com.google.gwt.dev.shell.ie.CheckForUpdatesIE6",
-      "com.google.gwt.dev.shell.CheckForUpdates"};
-
-  public static FutureTask<UpdateResult> checkForUpdatesInBackgroundThread(
-      final TreeLogger logger, final long minCheckMillis) {
-    final String entryPoint = PlatformSpecific.computeEntryPoint();
-    FutureTask<UpdateResult> task = new FutureTask<UpdateResult>(
-        new Callable<UpdateResult>() {
-          public UpdateResult call() throws Exception {
-            final CheckForUpdates updateChecker = createUpdateChecker(logger,
-                entryPoint);
-            return updateChecker == null ? null
-                : updateChecker.check(minCheckMillis);
-          }
-        });
-    Thread checkerThread = new Thread(task, "GWT Update Checker");
-    checkerThread.setDaemon(true);
-    checkerThread.start();
-    return task;
-  }
-
-  /**
-   * Find the first method named "main" on the call stack and use its class as
-   * the entry point.
-   */
-  public static String computeEntryPoint() {
-    Throwable t = new Throwable();
-    for (StackTraceElement stackTrace : t.getStackTrace()) {
-      if (stackTrace.getMethodName().equals("main")) {
-        // Strip package name from main's class
-        String className = stackTrace.getClassName();
-        int i = className.lastIndexOf('.');
-        if (i >= 0) {
-          return className.substring(i + 1);
-        }
-        return className;
-      }
-    }
-    return null;
-  }
-
-  public static CheckForUpdates createUpdateChecker(TreeLogger logger) {
-    return createUpdateChecker(logger, computeEntryPoint());
-  }
-
-  public static CheckForUpdates createUpdateChecker(TreeLogger logger,
-      String entryPoint) {
-    try {
-      for (int i = 0; i < updaterClassNames.length; i++) {
-        try {
-          Class<? extends CheckForUpdates> clazz = Class.forName(
-              updaterClassNames[i]).asSubclass(CheckForUpdates.class);
-          Constructor<? extends CheckForUpdates> ctor = clazz.getDeclaredConstructor(new Class[] {
-              TreeLogger.class, String.class});
-          CheckForUpdates checker = ctor.newInstance(new Object[] {
-              logger, entryPoint});
-          return checker;
-        } catch (Exception e) {
-          // Other exceptions can occur besides ClassNotFoundException,
-          // so ignore them all so we can find a functional updater.
-        }
-      }
-    } catch (Throwable e) {
-      // silently ignore any errors
-    }
-    return null;
-  }
-
-  public static void logUpdateAvailable(TreeLogger logger,
-      FutureTask<UpdateResult> updater) {
-    if (updater != null && updater.isDone()) {
-      UpdateResult result = null;
-      try {
-        result = updater.get(0, TimeUnit.MILLISECONDS);
-      } catch (InterruptedException e) {
-        // Silently ignore exception
-      } catch (ExecutionException e) {
-        // Silently ignore exception
-      } catch (TimeoutException e) {
-        // Silently ignore exception
-      }
-      logUpdateAvailable(logger, result);
-    }
-  }
-
-  public static void logUpdateAvailable(TreeLogger logger, UpdateResult result) {
-    if (result != null) {
-      final URL url = result.getURL();
-      logger.log(TreeLogger.WARN, "A new version of GWT ("
-          + result.getNewVersion() + ") is available", null, new HelpInfo() {
-        @Override
-        public URL getURL() {
-          return url;
-        }
-      });
-    }
-  }
-}
