diff --git a/dev/linux/src/com/google/gwt/dev/BootStrapPlatform.java b/dev/linux/src/com/google/gwt/dev/BootStrapPlatform.java
index ed20a30..bb52b54 100644
--- a/dev/linux/src/com/google/gwt/dev/BootStrapPlatform.java
+++ b/dev/linux/src/com/google/gwt/dev/BootStrapPlatform.java
@@ -1,4 +1,18 @@
-// Copyright 2006 Google Inc. All Rights Reserved.
+/*
+ * 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;
 
 /**
diff --git a/dev/linux/src/com/google/gwt/dev/shell/moz/BrowserWidgetMoz.java b/dev/linux/src/com/google/gwt/dev/shell/moz/BrowserWidgetMoz.java
index 499511a..92bd41e 100644
--- a/dev/linux/src/com/google/gwt/dev/shell/moz/BrowserWidgetMoz.java
+++ b/dev/linux/src/com/google/gwt/dev/shell/moz/BrowserWidgetMoz.java
@@ -22,10 +22,6 @@
 
   private class ExternalObjectImpl implements ExternalObject {
 
-    public int resolveReference(String ident) {
-      return LowLevelMoz.JSVAL_VOID;
-    }
-
     public boolean gwtOnLoad(int scriptObject, String moduleName) {
       try {
         if (moduleName == null) {
@@ -38,7 +34,7 @@
         // Attach a new ModuleSpace to make it programmable.
         //
         ModuleSpaceHost msh = getHost().createModuleSpaceHost(
-          BrowserWidgetMoz.this, moduleName);
+            BrowserWidgetMoz.this, moduleName);
         ModuleSpace moduleSpace = new ModuleSpaceMoz(msh, scriptObject);
         attachModuleSpace(moduleName, moduleSpace);
         return true;
@@ -48,21 +44,28 @@
         // things like NoClassDefFoundError.
         // 
         getHost().getLogger().log(TreeLogger.ERROR,
-          "Failure to load module '" + moduleName + "'", e);
+            "Failure to load module '" + moduleName + "'", e);
         return false;
       }
     }
+
+    public int resolveReference(String ident) {
+      return LowLevelMoz.JSVAL_VOID;
+    }
   }
 
   public BrowserWidgetMoz(Shell shell, BrowserWidgetHost host) {
     super(shell, host);
 
     // Expose a 'window.external' object factory. The created object's
-    // gwtOnLoad() method will be called when a hosted mode application's wrapper
+    // gwtOnLoad() method will be called when a hosted mode application's
+    // wrapper
     // HTML is done loading.
     //
     final ExternalFactory externalFactory = new ExternalFactory() {
 
+      private ExternalObject externalObject = null;
+
       public ExternalObject createExternalObject() {
         if (externalObject == null) {
           externalObject = new ExternalObjectImpl();
@@ -71,8 +74,8 @@
       }
 
       public boolean matchesDOMWindow(int domWindow) {
-        nsIWebBrowser webBrowser = (nsIWebBrowser) LowLevel
-          .snatchFieldObjectValue(browser.getClass(), browser, "webBrowser");
+        nsIWebBrowser webBrowser = (nsIWebBrowser) LowLevel.snatchFieldObjectValue(
+            browser.getClass(), browser, "webBrowser");
         int[] aContentDOMWindow = new int[1];
         webBrowser.GetContentDOMWindow(aContentDOMWindow);
         if (aContentDOMWindow[0] == domWindow) {
@@ -81,8 +84,6 @@
         return false;
       }
 
-      private ExternalObject externalObject = null;
-
     };
 
     LowLevelMoz.registerExternalFactory(externalFactory);
diff --git a/dev/linux/src/com/google/gwt/dev/shell/moz/CheckForUpdatesMoz.java b/dev/linux/src/com/google/gwt/dev/shell/moz/CheckForUpdatesMoz.java
index 4261f53..d42ceb1 100644
--- a/dev/linux/src/com/google/gwt/dev/shell/moz/CheckForUpdatesMoz.java
+++ b/dev/linux/src/com/google/gwt/dev/shell/moz/CheckForUpdatesMoz.java
@@ -1,4 +1,18 @@
-// Copyright 2006 Google Inc. All Rights Reserved.
+/*
+ * 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.moz;
 
 import com.google.gwt.dev.shell.CheckForUpdates;
diff --git a/dev/linux/src/com/google/gwt/dev/shell/moz/GeckoDispatchAdapter.java b/dev/linux/src/com/google/gwt/dev/shell/moz/GeckoDispatchAdapter.java
index 7265b20..c6d6252 100644
--- a/dev/linux/src/com/google/gwt/dev/shell/moz/GeckoDispatchAdapter.java
+++ b/dev/linux/src/com/google/gwt/dev/shell/moz/GeckoDispatchAdapter.java
@@ -19,18 +19,11 @@
  */
 class GeckoDispatchAdapter implements DispatchObject {
 
-  /**
-   * This constructor initializes a dispatcher, around a particular instance.
-   * 
-   * @param cl this class's classLoader
-   * @param aScriptObject the execution iframe's window
-   * @param target the object being wrapped as an IDispatch
-   */
-  GeckoDispatchAdapter(CompilingClassLoader cl, int aScriptObject, Object target) {
-    javaDispatch = new JavaDispatchImpl(cl, target);
-    classLoader = cl;
-    scriptObject = aScriptObject;
-  }
+  private final CompilingClassLoader classLoader;
+
+  private final JavaDispatch javaDispatch;
+
+  private final int scriptObject;
 
   /**
    * This constructor initializes as the static dispatcher, which handles only
@@ -45,6 +38,19 @@
     scriptObject = aScriptObject;
   }
 
+  /**
+   * This constructor initializes a dispatcher, around a particular instance.
+   * 
+   * @param cl this class's classLoader
+   * @param aScriptObject the execution iframe's window
+   * @param target the object being wrapped as an IDispatch
+   */
+  GeckoDispatchAdapter(CompilingClassLoader cl, int aScriptObject, Object target) {
+    javaDispatch = new JavaDispatchImpl(cl, target);
+    classLoader = cl;
+    scriptObject = aScriptObject;
+  }
+
   public int getField(String name) {
     int dispId = classLoader.getDispId(name);
     if (dispId < 0) {
@@ -85,8 +91,4 @@
         field.getType(), value);
     javaDispatch.setFieldValue(dispId, val);
   }
-
-  private final CompilingClassLoader classLoader;
-  private final JavaDispatch javaDispatch;
-  private final int scriptObject;
 }
diff --git a/dev/linux/src/com/google/gwt/dev/shell/moz/HandleMoz.java b/dev/linux/src/com/google/gwt/dev/shell/moz/HandleMoz.java
index 8a46b50..c5bc609 100644
--- a/dev/linux/src/com/google/gwt/dev/shell/moz/HandleMoz.java
+++ b/dev/linux/src/com/google/gwt/dev/shell/moz/HandleMoz.java
@@ -1,4 +1,18 @@
-// Copyright 2006 Google Inc. All Rights Reserved.
+/*
+ * 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.moz;
 
 import com.google.gwt.dev.shell.Handle;
@@ -10,16 +24,20 @@
     new HandleMoz();
   }
 
+  public static Object createHandle(Class type, int ptr) {
+    return Handle.createHandle(type, ptr);
+  }
+
+  public static int getJSObjectFromHandle(Object o) {
+    return LowLevelMoz.unwrapJSObject(getPtrFromHandle(o));
+  }
+
   /**
    * Not instantiable.
    */
   private HandleMoz() {
   }
 
-  public static Object createHandle(Class type, int ptr) {
-    return Handle.createHandle(type, ptr);
-  }
-
   protected void lockPtr(int ptr) {
     SwtGeckoGlue.addRefInt(ptr);
   }
@@ -28,8 +46,4 @@
     SwtGeckoGlue.releaseInt(ptr);
   }
 
-  public static int getJSObjectFromHandle(Object o) {
-    return LowLevelMoz.unwrapJSObject(getPtrFromHandle(o));
-  }
-
 }
diff --git a/dev/linux/src/com/google/gwt/dev/shell/moz/LowLevelMoz.java b/dev/linux/src/com/google/gwt/dev/shell/moz/LowLevelMoz.java
index f373803..5a35e2d 100644
--- a/dev/linux/src/com/google/gwt/dev/shell/moz/LowLevelMoz.java
+++ b/dev/linux/src/com/google/gwt/dev/shell/moz/LowLevelMoz.java
@@ -400,7 +400,8 @@
 
   /**
    * @param scriptObject An opaque handle to the script frame window
-   * @param dispObj the DispatchMethod to wrap
+   * @param name the name of the function to be wrapped
+   * @param dispMeth the DispatchMethod to wrap
    * @return the wrapped method as a jsval JSObject
    */
   public static int wrapFunction(int scriptObject, String name,
diff --git a/dev/linux/src/com/google/gwt/dev/shell/moz/MethodDispatch.java b/dev/linux/src/com/google/gwt/dev/shell/moz/MethodDispatch.java
index bb14c4d..8c2521a 100644
--- a/dev/linux/src/com/google/gwt/dev/shell/moz/MethodDispatch.java
+++ b/dev/linux/src/com/google/gwt/dev/shell/moz/MethodDispatch.java
@@ -1,4 +1,18 @@
-// Copyright 2006 Google Inc. All Rights Reserved.
+/*
+ * 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.moz;
 
 import com.google.gwt.dev.shell.CompilingClassLoader;
@@ -14,6 +28,12 @@
  */
 class MethodDispatch implements DispatchMethod {
 
+  private final CompilingClassLoader classLoader;
+
+  private final Method method;
+
+  private final int scriptObject;
+
   public MethodDispatch(CompilingClassLoader classLoader, Method method,
       int scriptObject) {
     this.scriptObject = scriptObject;
@@ -64,8 +84,4 @@
       return LowLevelMoz.JSVAL_VOID;
     }
   }
-
-  private final CompilingClassLoader classLoader;
-  private final Method method;
-  private final int scriptObject;
 }
\ No newline at end of file
diff --git a/dev/linux/src/com/google/gwt/dev/shell/moz/ModuleSpaceMoz.java b/dev/linux/src/com/google/gwt/dev/shell/moz/ModuleSpaceMoz.java
index f50d6fd..8e90c1c 100644
--- a/dev/linux/src/com/google/gwt/dev/shell/moz/ModuleSpaceMoz.java
+++ b/dev/linux/src/com/google/gwt/dev/shell/moz/ModuleSpaceMoz.java
@@ -1,4 +1,18 @@
-// Copyright 2006 Google Inc. All Rights Reserved.
+/*
+ * 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.moz;
 
 import com.google.gwt.dev.shell.ModuleSpace;
@@ -11,6 +25,10 @@
  */
 public class ModuleSpaceMoz extends ModuleSpace {
 
+  private DispatchObject staticDispatch;
+
+  private final int window;
+
   /**
    * Constructs a browser interface for use with a Mozilla global window object.
    */
@@ -38,8 +56,7 @@
   }
 
   public void exceptionCaught(int number, String name, String message) {
-    RuntimeException thrown = (RuntimeException) sThrownJavaExceptionObject
-      .get();
+    RuntimeException thrown = (RuntimeException) sThrownJavaExceptionObject.get();
 
     // See if the caught exception is null (thus thrown by us)
     if (thrown != null) {
@@ -51,7 +68,7 @@
     }
 
     sCaughtJavaExceptionObject.set(createJavaScriptException(
-      getIsolatedClassLoader(), name, message));
+        getIsolatedClassLoader(), name, message));
   }
 
   public boolean invokeNativeBoolean(String name, Object jthis, Class[] types,
@@ -159,20 +176,19 @@
   }
 
   protected void initializeStaticDispatcher() {
-    staticDispatch = new GeckoDispatchAdapter(getIsolatedClassLoader(),
-      window);
+    staticDispatch = new GeckoDispatchAdapter(getIsolatedClassLoader(), window);
 
     // Define the static dispatcher for use by JavaScript.
     //
     createNative("initializeStaticDispatcher", 0, "__defineStatic",
-      new String[]{"__arg0"}, "window.__static = __arg0;");
-    invokeNativeVoid("__defineStatic", null, new Class[]{Object.class},
-      new Object[]{staticDispatch});
+        new String[] {"__arg0"}, "window.__static = __arg0;");
+    invokeNativeVoid("__defineStatic", null, new Class[] {Object.class},
+        new Object[] {staticDispatch});
   }
 
   int wrapObjectAsJSObject(Object o) {
     return SwtGeckoGlue.wrapObjectAsJSObject(getIsolatedClassLoader(), window,
-      o);
+        o);
   }
 
   /**
@@ -196,7 +212,7 @@
     int argv[] = new int[argc];
     for (int i = 0; i < argc; ++i) {
       argv[i] = SwtGeckoGlue.convertObjectToJSVal(window,
-        getIsolatedClassLoader(), types[i], args[i]);
+          getIsolatedClassLoader(), types[i], args[i]);
     }
 
     int result = LowLevelMoz.invoke(window, name, jsthis, argv);
@@ -214,8 +230,4 @@
     throw thrown;
   }
 
-  private DispatchObject staticDispatch;
-
-  private final int window;
-
 }
diff --git a/dev/linux/src/com/google/gwt/dev/shell/moz/SwtGeckoGlue.java b/dev/linux/src/com/google/gwt/dev/shell/moz/SwtGeckoGlue.java
index fdd5a4b..46b8e29 100644
--- a/dev/linux/src/com/google/gwt/dev/shell/moz/SwtGeckoGlue.java
+++ b/dev/linux/src/com/google/gwt/dev/shell/moz/SwtGeckoGlue.java
@@ -1,4 +1,18 @@
-// Copyright 2006 Google Inc. All Rights Reserved.
+/*
+ * 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.moz;
 
 import com.google.gwt.dev.shell.CompilingClassLoader;
@@ -42,93 +56,6 @@
   }
 
   /**
-   * Wrapper for XPCOM's nsISupports::Release().
-   */
-  public static int releaseInt(int nsISupports) {
-    ensureMethodsInitialized();
-    Throwable rethrow = null;
-    try {
-      Object retVal = XPCOMVtblCall.invoke(null, new Object[] {
-          new Integer(2), new Integer(nsISupports)});
-      return ((Integer) retVal).intValue();
-    } catch (IllegalArgumentException e) {
-      rethrow = e;
-    } catch (IllegalAccessException e) {
-      rethrow = e;
-    } catch (InvocationTargetException e) {
-      rethrow = e;
-    }
-    throw new RuntimeException(ERRMSG_CANNOT_INVOKE, rethrow);
-  }
-
-  /**
-   * Converts a java object to its equivalent variant. A ClassLoader is passed
-   * here so that Handles can be manipulated properly.
-   */
-  public static int convertObjectToJSVal(int scriptObject,
-      CompilingClassLoader cl, Class type, Object o) {
-    if (o == null) {
-      return LowLevelMoz.JSVAL_NULL;
-    }
-
-    if (type.equals(String.class)) {
-      return LowLevelMoz.convertString(scriptObject, (String) o);
-    } else if (type.equals(boolean.class)) {
-      return LowLevelMoz.convertBoolean(scriptObject,
-          ((Boolean) o).booleanValue());
-    } else if (type.equals(byte.class)) {
-      return LowLevelMoz.convertByte(scriptObject, ((Byte) o).byteValue());
-    } else if (type.equals(short.class)) {
-      return LowLevelMoz.convertShort(scriptObject, ((Short) o).shortValue());
-    } else if (type.equals(char.class)) {
-      return LowLevelMoz.convertChar(scriptObject, ((Character) o).charValue());
-    } else if (type.equals(int.class)) {
-      return LowLevelMoz.convertInt(scriptObject, ((Integer) o).intValue());
-    } else if (type.equals(long.class)) {
-      return LowLevelMoz.convertLong(scriptObject, ((Long) o).longValue());
-    } else if (type.equals(float.class)) {
-      return LowLevelMoz.convertFloat(scriptObject, ((Float) o).floatValue());
-    } else if (type.equals(double.class)) {
-      return LowLevelMoz.convertDouble(scriptObject, ((Double) o).doubleValue());
-    }
-
-    // Handle
-    try {
-      Class jso = Class.forName(HandleMoz.HANDLE_CLASS, true, cl);
-      if (jso.isAssignableFrom(type) && jso.isAssignableFrom(o.getClass())) {
-        // Variant never AddRef's its contents.
-        //
-        return HandleMoz.getJSObjectFromHandle(o);
-      }
-    } catch (ClassNotFoundException e) {
-      // Ignore the exception, if we can't find the class then obviously we
-      // don't have to worry about o being one
-    }
-
-    // Fallthrough case: Object.
-    //
-    return wrapObjectAsJSObject(cl, scriptObject, o);
-  }
-
-  /**
-   * Wraps a Java object as a JSObject.
-   */
-  public static int wrapObjectAsJSObject(CompilingClassLoader cl,
-      int scriptObject, Object jthis) {
-    if (jthis == null) {
-      return LowLevelMoz.JSVAL_NULL;
-    }
-
-    DispatchObject dispObj;
-    if (jthis instanceof DispatchObject) {
-      dispObj = (DispatchObject) jthis;
-    } else {
-      dispObj = new GeckoDispatchAdapter(cl, scriptObject, jthis);
-    }
-    return LowLevelMoz.wrapDispatch(scriptObject, dispObj);
-  }
-
-  /**
    * Try to convert based on the Java method parameter type.
    */
   public static Object convertJSValToObject(int scriptObject, Class paramType,
@@ -198,28 +125,90 @@
   }
 
   /**
-   * Decides what to do with an incoming JSObject arg. Two possibilities here:
-   * (1) We received a true javascript object (e.g. DOM object), in which case
-   * we wrap it in a Handle. (2) We received a Java object that was passed
-   * through the outside world and back, in which case we use black magic to get
-   * it back.
+   * Converts a java object to its equivalent variant. A ClassLoader is passed
+   * here so that Handles can be manipulated properly.
    */
-  private static Object translateJSObject(int scriptObject, Class type,
-      int jsval) {
-    if (LowLevelMoz.isWrappedDispatch(scriptObject, jsval)) {
-      DispatchObject dispObj = LowLevelMoz.unwrapDispatch(scriptObject, jsval);
-      return dispObj.getTarget();
+  public static int convertObjectToJSVal(int scriptObject,
+      CompilingClassLoader cl, Class type, Object o) {
+    if (o == null) {
+      return LowLevelMoz.JSVAL_NULL;
     }
-    int wrapper = 0;
+
+    if (type.equals(String.class)) {
+      return LowLevelMoz.convertString(scriptObject, (String) o);
+    } else if (type.equals(boolean.class)) {
+      return LowLevelMoz.convertBoolean(scriptObject,
+          ((Boolean) o).booleanValue());
+    } else if (type.equals(byte.class)) {
+      return LowLevelMoz.convertByte(scriptObject, ((Byte) o).byteValue());
+    } else if (type.equals(short.class)) {
+      return LowLevelMoz.convertShort(scriptObject, ((Short) o).shortValue());
+    } else if (type.equals(char.class)) {
+      return LowLevelMoz.convertChar(scriptObject, ((Character) o).charValue());
+    } else if (type.equals(int.class)) {
+      return LowLevelMoz.convertInt(scriptObject, ((Integer) o).intValue());
+    } else if (type.equals(long.class)) {
+      return LowLevelMoz.convertLong(scriptObject, ((Long) o).longValue());
+    } else if (type.equals(float.class)) {
+      return LowLevelMoz.convertFloat(scriptObject, ((Float) o).floatValue());
+    } else if (type.equals(double.class)) {
+      return LowLevelMoz.convertDouble(scriptObject, ((Double) o).doubleValue());
+    }
+
+    // Handle
     try {
-      wrapper = LowLevelMoz.wrapJSObject(scriptObject, jsval);
-      return HandleMoz.createHandle(type, wrapper);
-    } finally {
-      // Handle should AddRef
-      if (wrapper != 0) {
-        releaseInt(wrapper);
+      Class jso = Class.forName(HandleMoz.HANDLE_CLASS, true, cl);
+      if (jso.isAssignableFrom(type) && jso.isAssignableFrom(o.getClass())) {
+        // Variant never AddRef's its contents.
+        //
+        return HandleMoz.getJSObjectFromHandle(o);
       }
+    } catch (ClassNotFoundException e) {
+      // Ignore the exception, if we can't find the class then obviously we
+      // don't have to worry about o being one
     }
+
+    // Fallthrough case: Object.
+    //
+    return wrapObjectAsJSObject(cl, scriptObject, o);
+  }
+
+  /**
+   * Wrapper for XPCOM's nsISupports::Release().
+   */
+  public static int releaseInt(int nsISupports) {
+    ensureMethodsInitialized();
+    Throwable rethrow = null;
+    try {
+      Object retVal = XPCOMVtblCall.invoke(null, new Object[] {
+          new Integer(2), new Integer(nsISupports)});
+      return ((Integer) retVal).intValue();
+    } catch (IllegalArgumentException e) {
+      rethrow = e;
+    } catch (IllegalAccessException e) {
+      rethrow = e;
+    } catch (InvocationTargetException e) {
+      rethrow = e;
+    }
+    throw new RuntimeException(ERRMSG_CANNOT_INVOKE, rethrow);
+  }
+
+  /**
+   * Wraps a Java object as a JSObject.
+   */
+  public static int wrapObjectAsJSObject(CompilingClassLoader cl,
+      int scriptObject, Object jthis) {
+    if (jthis == null) {
+      return LowLevelMoz.JSVAL_NULL;
+    }
+
+    DispatchObject dispObj;
+    if (jthis instanceof DispatchObject) {
+      dispObj = (DispatchObject) jthis;
+    } else {
+      dispObj = new GeckoDispatchAdapter(cl, scriptObject, jthis);
+    }
+    return LowLevelMoz.wrapDispatch(scriptObject, dispObj);
   }
 
   private static void ensureMethodsInitialized() {
@@ -244,4 +233,29 @@
     }
   }
 
+  /**
+   * Decides what to do with an incoming JSObject arg. Two possibilities here:
+   * (1) We received a true javascript object (e.g. DOM object), in which case
+   * we wrap it in a Handle. (2) We received a Java object that was passed
+   * through the outside world and back, in which case we use black magic to get
+   * it back.
+   */
+  private static Object translateJSObject(int scriptObject, Class type,
+      int jsval) {
+    if (LowLevelMoz.isWrappedDispatch(scriptObject, jsval)) {
+      DispatchObject dispObj = LowLevelMoz.unwrapDispatch(scriptObject, jsval);
+      return dispObj.getTarget();
+    }
+    int wrapper = 0;
+    try {
+      wrapper = LowLevelMoz.wrapJSObject(scriptObject, jsval);
+      return HandleMoz.createHandle(type, wrapper);
+    } finally {
+      // Handle should AddRef
+      if (wrapper != 0) {
+        releaseInt(wrapper);
+      }
+    }
+  }
+
 }
diff --git a/dev/windows/src/com/google/gwt/dev/BootStrapPlatform.java b/dev/windows/src/com/google/gwt/dev/BootStrapPlatform.java
index c029eb7..05f9b78 100644
--- a/dev/windows/src/com/google/gwt/dev/BootStrapPlatform.java
+++ b/dev/windows/src/com/google/gwt/dev/BootStrapPlatform.java
@@ -1,4 +1,18 @@
-// Copyright 2006 Google Inc. All Rights Reserved.
+/*
+ * 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;
 
 /**
@@ -9,5 +23,4 @@
   public static void go() {
     // nothing to do
   }
-
 }
diff --git a/dev/windows/src/com/google/gwt/dev/shell/ie/BrowserWidgetIE6.java b/dev/windows/src/com/google/gwt/dev/shell/ie/BrowserWidgetIE6.java
index 7450308..8cefd40 100644
--- a/dev/windows/src/com/google/gwt/dev/shell/ie/BrowserWidgetIE6.java
+++ b/dev/windows/src/com/google/gwt/dev/shell/ie/BrowserWidgetIE6.java
@@ -1,4 +1,18 @@
-// Copyright 2006 Google Inc. All Rights Reserved.
+/*
+ * 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.ie;
 
 import com.google.gwt.core.ext.TreeLogger;
@@ -42,7 +56,7 @@
         // Attach a new ModuleSpace to make it programmable.
         //
         ModuleSpaceHost msh = getHost().createModuleSpaceHost(
-          BrowserWidgetIE6.this, moduleName);
+            BrowserWidgetIE6.this, moduleName);
         ModuleSpaceIE6 moduleSpace = new ModuleSpaceIE6(msh, frameWnd);
         attachModuleSpace(moduleName, moduleSpace);
         return true;
@@ -52,7 +66,7 @@
         // things like NoClassDefFoundError.
         // 
         getHost().getLogger().log(TreeLogger.ERROR,
-          "Failure to load module '" + moduleName + "'", e);
+            "Failure to load module '" + moduleName + "'", e);
         return false;
       }
     }
@@ -83,9 +97,9 @@
         if ((flags & COM.DISPATCH_METHOD) != 0) {
           // Invoke
           Object[] javaParams = SwtOleGlue.convertVariantsToObjects(
-            new Class[]{
-              IDispatch.class, String.class, String.class, String.class},
-            params, "Calling method 'gwtOnLoad'");
+              new Class[] {
+                  IDispatch.class, String.class, String.class, String.class},
+              params, "Calling method 'gwtOnLoad'");
 
           IDispatch frameWnd = (IDispatch) javaParams[0];
           String moduleName = (String) javaParams[1];
@@ -97,7 +111,7 @@
           // property get on the method itself
           try {
             Method gwtOnLoadMethod = getClass().getMethod("gwtOnLoad",
-              new Class[]{IDispatch.class, String.class});
+                new Class[] {IDispatch.class, String.class});
             IDispatchImpl funcObj = new MethodDispatch(null, gwtOnLoadMethod);
             IDispatch disp = new IDispatch(funcObj.getAddress());
             disp.AddRef();
diff --git a/dev/windows/src/com/google/gwt/dev/shell/ie/COMObjectProxy.java b/dev/windows/src/com/google/gwt/dev/shell/ie/COMObjectProxy.java
index 4fc180d..53bb5f2 100644
--- a/dev/windows/src/com/google/gwt/dev/shell/ie/COMObjectProxy.java
+++ b/dev/windows/src/com/google/gwt/dev/shell/ie/COMObjectProxy.java
@@ -1,4 +1,18 @@
-// Copyright 2006 Google Inc. All Rights Reserved.
+/*
+ * 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.ie;
 
 import com.google.gwt.dev.shell.LowLevel;
@@ -40,7 +54,7 @@
     // Make sure the interface isn't too big.
     if (argCounts != null && argCounts.length >= MAX_METHODS_WRAPPED) {
       throw new IllegalArgumentException("No more than " + MAX_METHODS_WRAPPED
-        + " methods can be wrapped right now.");
+          + " methods can be wrapped right now.");
     }
   }
 
@@ -57,7 +71,7 @@
 
     // Get the COMObject ObjectMap so that we can hijack the target's slot.
     Map objectMap = (Map) LowLevel.snatchFieldObjectValue(COMObject.class,
-      null, "ObjectMap");
+        null, "ObjectMap");
     Integer ppVtableTarget = new Integer(target.getAddress());
 
     // First, make sure that the target is still actually in the map.
diff --git a/dev/windows/src/com/google/gwt/dev/shell/ie/HandleIE6.java b/dev/windows/src/com/google/gwt/dev/shell/ie/HandleIE6.java
index 3038feb..95784bd 100644
--- a/dev/windows/src/com/google/gwt/dev/shell/ie/HandleIE6.java
+++ b/dev/windows/src/com/google/gwt/dev/shell/ie/HandleIE6.java
@@ -1,4 +1,18 @@
-// Copyright 2006 Google Inc. All Rights Reserved.
+/*
+ * 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.ie;
 
 import com.google.gwt.dev.shell.Handle;
@@ -11,12 +25,6 @@
     // put myself in Handle's sImpl field
     new HandleIE6();
   }
-  
-  /**
-   * Not instantiable.
-   */
-  private HandleIE6() {
-  }
 
   public static Object createHandle(Class type, int ptr) {
     return Handle.createHandle(type, ptr);
@@ -27,6 +35,12 @@
     return new IDispatch(ptr);
   }
 
+  /**
+   * Not instantiable.
+   */
+  private HandleIE6() {
+  }
+
   protected void lockPtr(int ptr) {
     SwtOleGlue.addRefInt(ptr);
   }
diff --git a/dev/windows/src/com/google/gwt/dev/shell/ie/IDispatchImpl.java b/dev/windows/src/com/google/gwt/dev/shell/ie/IDispatchImpl.java
index 02dc773..6cc4b81 100644
--- a/dev/windows/src/com/google/gwt/dev/shell/ie/IDispatchImpl.java
+++ b/dev/windows/src/com/google/gwt/dev/shell/ie/IDispatchImpl.java
@@ -1,4 +1,18 @@
-// Copyright 2006 Google Inc. All Rights Reserved.
+/*
+ * 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.ie;
 
 import com.google.gwt.dev.shell.CompilingClassLoader;
@@ -28,6 +42,10 @@
    * An exception for wrapping bad HR's.
    */
   protected static class HResultException extends Exception {
+    private int fHR;
+
+    private String fSource;
+
     /**
      * Constructs a standard bad HR exception.
      */
@@ -71,9 +89,6 @@
     public int getHResult() {
       return fHR;
     }
-
-    private int fHR;
-    private String fSource;
   }
 
   // This one isn't defined in SWT for some reason.
@@ -83,8 +98,8 @@
       Variant[] params, Method method) throws InvocationTargetException,
       HResultException {
     Object[] javaParams = SwtOleGlue.convertVariantsToObjects(
-      method.getParameterTypes(), params, "Calling method '" + method.getName()
-        + "'");
+        method.getParameterTypes(), params, "Calling method '"
+            + method.getName() + "'");
 
     Object result = null;
     try {
@@ -125,15 +140,18 @@
     return SwtOleGlue.convertObjectToVariant(cl, returnType, result);
   }
 
+  protected int refCount;
+
   public IDispatchImpl() {
-    super(new int[]{2, 0, 0, 1, 3, 5, 8});
+    super(new int[] {2, 0, 0, 1, 3, 5, 8});
   }
 
-//CHECKSTYLE_OFF
+  // CHECKSTYLE_OFF
   public int AddRef() {
     return ++refCount;
   }
-//CHECKSTYLE_ON
+
+  // CHECKSTYLE_ON
 
   public int method0(int[] args) {
     return QueryInterface(args[0], args[1]);
@@ -143,24 +161,24 @@
     return AddRef();
   }
 
-  public int method2(int[] args) {
-    return Release();
-  }
-
   // method3 GetTypeInfoCount - not implemented
 
   // method4 GetTypeInfo - not implemented
 
+  public int method2(int[] args) {
+    return Release();
+  }
+
   public int method5(int[] args) {
     return GetIDsOfNames(args[0], args[1], args[2], args[3], args[4]);
   }
 
   public int method6(int[] args) {
     return Invoke(args[0], args[1], args[2], args[3], args[4], args[5],
-      args[6], args[7]);
+        args[6], args[7]);
   }
 
-//CHECKSTYLE_OFF
+  // CHECKSTYLE_OFF
   public int QueryInterface(int riid, int ppvObject) {
     if (riid == 0 || ppvObject == 0) {
       return COM.E_NOINTERFACE;
@@ -169,18 +187,18 @@
     COM.MoveMemory(guid, riid, GUID.sizeof);
 
     if (COM.IsEqualGUID(guid, COM.IIDIUnknown)) {
-      COM.MoveMemory(ppvObject, new int[]{getAddress()}, 4);
+      COM.MoveMemory(ppvObject, new int[] {getAddress()}, 4);
       AddRef();
       return COM.S_OK;
     }
 
     if (COM.IsEqualGUID(guid, COM.IIDIDispatch)) {
-      COM.MoveMemory(ppvObject, new int[]{getAddress()}, 4);
+      COM.MoveMemory(ppvObject, new int[] {getAddress()}, 4);
       AddRef();
       return COM.S_OK;
     }
 
-    COM.MoveMemory(ppvObject, new int[]{0}, 4);
+    COM.MoveMemory(ppvObject, new int[] {0}, 4);
     return COM.E_NOINTERFACE;
   }
 
@@ -190,7 +208,8 @@
     }
     return refCount;
   }
-//CHECKSTYLE_ON
+
+  // CHECKSTYLE_ON
 
   /**
    * Override this method to implement GetIDsOfNames().
@@ -216,7 +235,7 @@
     return variants;
   }
 
-//CHECKSTYLE_OFF
+  // CHECKSTYLE_OFF
   private final int GetIDsOfNames(int riid, int rgszNames, int cNames,
       int lcid, int rgDispId) {
 
@@ -228,7 +247,7 @@
       // Extract the requested names and build an answer array init'ed with -1.
       //
       String[] names = SwtOleGlue.extractStringArrayFromOleCharPtrPtr(
-        rgszNames, cNames);
+          rgszNames, cNames);
       int[] ids = new int[names.length];
       Arrays.fill(ids, -1);
 
@@ -272,7 +291,7 @@
         re = (RuntimeException) t;
       } else {
         re = new RuntimeException("Checked exception thrown into JavaScript"
-          + " (web mode behavior may differ)", t);
+            + " (web mode behavior may differ)", t);
       }
       ex = new HResultException(re);
       ModuleSpace.setThrownJavaException(re);
@@ -304,7 +323,5 @@
 
     return COM.S_OK;
   }
-//CHECKSTYLE_ON
-
-  protected int refCount;
+  // CHECKSTYLE_ON
 }
diff --git a/dev/windows/src/com/google/gwt/dev/shell/ie/IDispatchProxy.java b/dev/windows/src/com/google/gwt/dev/shell/ie/IDispatchProxy.java
index 7398376..5accc16 100644
--- a/dev/windows/src/com/google/gwt/dev/shell/ie/IDispatchProxy.java
+++ b/dev/windows/src/com/google/gwt/dev/shell/ie/IDispatchProxy.java
@@ -1,4 +1,18 @@
-// Copyright 2006 Google Inc. All Rights Reserved.
+/*
+ * 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.ie;
 
 import com.google.gwt.dev.shell.CompilingClassLoader;
@@ -44,6 +58,14 @@
   // A magic dispid for getting a global ref to this object.
   public static final int DISPID_MAGIC_GETGLOBALREF = 0xC131FB56;
 
+  private final CompilingClassLoader classLoader;
+
+  private boolean isDisposed = false;
+
+  private final JavaDispatch javaDispatch;
+
+  private final int myGlobalRef;
+
   /**
    * This constructor initializes as the static dispatcher, which handles only
    * static method calls and field references.
@@ -116,7 +138,7 @@
           if ((flags & COM.DISPATCH_METHOD) != 0) {
             // This is a method call.
             return callMethod(classLoader, javaDispatch.getTarget(), params,
-              method);
+                method);
           } else if (flags == COM.DISPATCH_PROPERTYGET) {
             // The function is being accessed as a property.
             IDispatchImpl funcObj = new MethodDispatch(classLoader, method);
@@ -128,11 +150,11 @@
           Field field = javaDispatch.getField(dispId);
           if (flags == COM.DISPATCH_PROPERTYGET) {
             return SwtOleGlue.convertObjectToVariant(classLoader,
-              field.getType(), javaDispatch.getFieldValue(dispId));
+                field.getType(), javaDispatch.getFieldValue(dispId));
           } else if ((flags & (COM.DISPATCH_PROPERTYPUT | COM.DISPATCH_PROPERTYPUTREF)) != 0) {
             javaDispatch.setFieldValue(dispId,
-              SwtOleGlue.convertVariantToObject(field.getType(), params[0],
-                "Setting field '" + field.getName() + "'"));
+                SwtOleGlue.convertVariantToObject(field.getType(), params[0],
+                    "Setting field '" + field.getName() + "'"));
             return new Variant();
           }
         }
@@ -147,12 +169,7 @@
     }
 
     System.err.println("IDispatchProxy cannot be invoked with flags: "
-      + Integer.toHexString(flags));
+        + Integer.toHexString(flags));
     throw new HResultException(COM.E_NOTSUPPORTED);
   }
-
-  private final CompilingClassLoader classLoader;
-  private boolean isDisposed = false;
-  private final JavaDispatch javaDispatch;
-  private final int myGlobalRef;
 }
diff --git a/dev/windows/src/com/google/gwt/dev/shell/ie/LowLevelIE6.java b/dev/windows/src/com/google/gwt/dev/shell/ie/LowLevelIE6.java
index 80f675b..0a95c60 100644
--- a/dev/windows/src/com/google/gwt/dev/shell/ie/LowLevelIE6.java
+++ b/dev/windows/src/com/google/gwt/dev/shell/ie/LowLevelIE6.java
@@ -23,17 +23,6 @@
 class LowLevelIE6 {
 
   /**
-   * Not instantiable.
-   */
-  private LowLevelIE6() {
-  }
-
-  public static synchronized void init() {
-    // Force LowLevel initialization to load gwt-ll
-    LowLevel.init();
-  }
-
-  /**
    * Does an HTTP GET that works with Windows proxy settings. Set the system
    * property <code>gwt.debugLowLevelHttpGet</code> to print failure status
    * codes to stderr.
@@ -57,8 +46,20 @@
     }
   }
 
+  public static synchronized void init() {
+    // Force LowLevel initialization to load gwt-ll
+    LowLevel.init();
+  }
+
   // CHECKSTYLE_OFF
   // out must be an array of size 1 to receive the array answer
   private static native int _httpGet(String userAgent, String url, byte[][] out);
+
   // CHECKSTYLE_ON
+
+  /**
+   * Not instantiable.
+   */
+  private LowLevelIE6() {
+  }
 }
diff --git a/dev/windows/src/com/google/gwt/dev/shell/ie/MethodDispatch.java b/dev/windows/src/com/google/gwt/dev/shell/ie/MethodDispatch.java
index 2b76089..d4ab64e 100644
--- a/dev/windows/src/com/google/gwt/dev/shell/ie/MethodDispatch.java
+++ b/dev/windows/src/com/google/gwt/dev/shell/ie/MethodDispatch.java
@@ -32,6 +32,10 @@
  */
 class MethodDispatch extends IDispatchImpl {
 
+  private final CompilingClassLoader classLoader;
+
+  private final Method method;
+
   public MethodDispatch(CompilingClassLoader classLoader, Method method) {
     this.classLoader = classLoader;
     this.method = method;
@@ -86,7 +90,7 @@
            * methods). If method is static, it can be null.
            */
           Object jthis = SwtOleGlue.convertVariantToObject(
-            method.getDeclaringClass(), params[0], "this");
+              method.getDeclaringClass(), params[0], "this");
           Variant[] otherParams = new Variant[params.length - 1];
           System.arraycopy(params, 1, otherParams, 0, otherParams.length);
           return callMethod(classLoader, jthis, otherParams, method);
@@ -98,7 +102,4 @@
     }
     throw new HResultException(COM.E_NOTSUPPORTED);
   }
-
-  private final CompilingClassLoader classLoader;
-  private final Method method;
 }
\ No newline at end of file
diff --git a/dev/windows/src/com/google/gwt/dev/shell/ie/ModuleSpaceIE6.java b/dev/windows/src/com/google/gwt/dev/shell/ie/ModuleSpaceIE6.java
index 15ca94f..3638eb4 100644
--- a/dev/windows/src/com/google/gwt/dev/shell/ie/ModuleSpaceIE6.java
+++ b/dev/windows/src/com/google/gwt/dev/shell/ie/ModuleSpaceIE6.java
@@ -1,4 +1,18 @@
-// Copyright 2006 Google Inc. All Rights Reserved.
+/*
+ * 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.ie;
 
 import com.google.gwt.core.ext.TreeLogger;
@@ -19,11 +33,11 @@
  */
 public class ModuleSpaceIE6 extends ModuleSpace {
 
-//CHECKSTYLE_OFF
+  // CHECKSTYLE_OFF
   private static int CODE(int hresult) {
     return hresult & 0xFFFF;
   }
-//CHECKSTYLE_ON
+  // CHECKSTYLE_ON
 
   private Variant fStaticDispatch;
 
@@ -55,8 +69,8 @@
       }
     } catch (RuntimeException e) {
       throw new RuntimeException(file + "(" + line
-        + "): Failed to create JSNI method with signature '" + jsniSignature
-        + "'", e);
+          + "): Failed to create JSNI method with signature '" + jsniSignature
+          + "'", e);
     }
   }
 
@@ -93,14 +107,13 @@
   }
 
   public void exceptionCaught(int number, String name, String message) {
-    RuntimeException thrown = (RuntimeException) sThrownJavaExceptionObject
-      .get();
+    RuntimeException thrown = (RuntimeException) sThrownJavaExceptionObject.get();
 
     // See if the caught exception matches the thrown exception
     if (thrown != null) {
       HResultException hre = new HResultException(thrown);
       if (CODE(hre.getHResult()) == CODE(number)
-        && hre.getMessage().equals(message)) {
+          && hre.getMessage().equals(message)) {
         sCaughtJavaExceptionObject.set(thrown);
         sThrownJavaExceptionObject.set(null);
         return;
@@ -108,7 +121,7 @@
     }
 
     sCaughtJavaExceptionObject.set(createJavaScriptException(
-      getIsolatedClassLoader(), name, message));
+        getIsolatedClassLoader(), name, message));
   }
 
   public boolean invokeNativeBoolean(String name, Object jthis, Class[] types,
@@ -205,8 +218,8 @@
         return null;
       }
 
-      return HandleIE6.createHandle(returnType, result.getDispatch()
-        .getAddress());
+      return HandleIE6.createHandle(returnType,
+          result.getDispatch().getAddress());
     } finally {
       if (result != null) {
         result.dispose();
@@ -255,7 +268,7 @@
         return null;
       } else {
         return SwtOleGlue.convertVariantToObject(Object.class, result,
-          "Returning from method '" + name + "'");
+            "Returning from method '" + name + "'");
       }
     } finally {
       if (result != null) {
@@ -321,13 +334,13 @@
     // Define the static dispatcher for use by JavaScript.
     //
     createNative("initializeStaticDispatcher", 0, "__defineStatic",
-      new String[]{"__arg0"}, "window.__static = __arg0;");
-    invokeNativeVoid("__defineStatic", null, new Class[]{Variant.class},
-      new Object[]{fStaticDispatch});
+        new String[] {"__arg0"}, "window.__static = __arg0;");
+    invokeNativeVoid("__defineStatic", null, new Class[] {Variant.class},
+        new Object[] {fStaticDispatch});
   }
 
   private Variant execute(OleAutomation window, String code) {
-    int[] dispIds = window.getIDsOfNames(new String[]{"execScript", "code"});
+    int[] dispIds = window.getIDsOfNames(new String[] {"execScript", "code"});
     Variant[] vArgs = new Variant[1];
     vArgs[0] = new Variant(code);
     int[] namedArgs = new int[1];
@@ -337,7 +350,7 @@
     if (result == null) {
       String lastError = window.getLastError();
       throw new RuntimeException("Error (" + lastError
-        + ") executing JavaScript:\n" + code);
+          + ") executing JavaScript:\n" + code);
     }
     return result;
   }
@@ -365,25 +378,24 @@
       //
       int len = args.length;
       vArgs = new Variant[len + 1];
-      vArgs[0] = SwtOleGlue
-        .wrapObjectAsVariant(getIsolatedClassLoader(), jthis);
+      vArgs[0] = SwtOleGlue.wrapObjectAsVariant(getIsolatedClassLoader(), jthis);
 
       for (int i = 0; i < len; ++i) {
         vArgs[i + 1] = SwtOleGlue.convertObjectToVariant(
-          getIsolatedClassLoader(), types[i], args[i]);
+            getIsolatedClassLoader(), types[i], args[i]);
       }
 
       // Get the function object and its 'call' method.
       //
-      int[] ids = fWindow.getIDsOfNames(new String[]{name});
+      int[] ids = fWindow.getIDsOfNames(new String[] {name});
       if (ids == null) {
         throw new RuntimeException(
-          "Could not find a native method with the signature '" + name + "'");
+            "Could not find a native method with the signature '" + name + "'");
       }
       int functionId = ids[0];
       funcObjVar = fWindow.getProperty(functionId);
       funcObj = funcObjVar.getAutomation();
-      int callDispId = funcObj.getIDsOfNames(new String[]{"call"})[0];
+      int callDispId = funcObj.getIDsOfNames(new String[] {"call"})[0];
 
       // Invoke it and return the result.
       //
@@ -393,19 +405,21 @@
           if (result.getType() == OLE.VT_EMPTY) {
             // Function was required to return something.
             //
-            throw new RuntimeException("JavaScript method '" + name
-              + "' returned 'undefined'. This can happen either because of a "
-              + "missing return statement, or explicitly returning a value "
-              + "of 'undefined' (e.g. 'return element[nonexistent property]')");
+            throw new RuntimeException(
+                "JavaScript method '"
+                    + name
+                    + "' returned 'undefined'. This can happen either because of a "
+                    + "missing return statement, or explicitly returning a value "
+                    + "of 'undefined' (e.g. 'return element[nonexistent property]')");
           }
         } else {
           if (result.getType() != OLE.VT_EMPTY) {
             // Function is not allowed to return something.
             //
             getLogger().log(
-              TreeLogger.WARN,
-              "JavaScript method '" + name
-                + "' is not supposed to return a value", null);
+                TreeLogger.WARN,
+                "JavaScript method '" + name
+                    + "' is not supposed to return a value", null);
           }
         }
         return result;
diff --git a/dev/windows/src/com/google/gwt/dev/shell/ie/OS2.java b/dev/windows/src/com/google/gwt/dev/shell/ie/OS2.java
index 2cd1877..f65f872 100644
--- a/dev/windows/src/com/google/gwt/dev/shell/ie/OS2.java
+++ b/dev/windows/src/com/google/gwt/dev/shell/ie/OS2.java
@@ -1,4 +1,18 @@
-// Copyright 2006 Google Inc. All Rights Reserved.
+/*
+ * 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.ie;
 
 /**
diff --git a/dev/windows/src/com/google/gwt/dev/shell/ie/SwtOleGlue.java b/dev/windows/src/com/google/gwt/dev/shell/ie/SwtOleGlue.java
index 652582b..09f74e3 100644
--- a/dev/windows/src/com/google/gwt/dev/shell/ie/SwtOleGlue.java
+++ b/dev/windows/src/com/google/gwt/dev/shell/ie/SwtOleGlue.java
@@ -1,4 +1,18 @@
-// Copyright 2006 Google Inc. All Rights Reserved.
+/*
+ * 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.ie;
 
 import com.google.gwt.dev.shell.CompilingClassLoader;
@@ -243,6 +257,11 @@
     COMObjectProxy webSiteProxy = new COMObjectProxy(new int[] {
         2, 0, 0, 4, 1, 5, 0, 0, 1, 1, 1, 3, 3, 2, 2, 1, 3, 2}) {
 
+      {
+        // make sure we hold onto a ref on the external object
+        external.AddRef();
+      }
+
       public int method15(int[] args) {
         // GetExternal() is method 15.
         //
@@ -257,9 +276,9 @@
         return result;
       }
 
-//CHECKSTYLE_OFF
+      // CHECKSTYLE_OFF
       int GetExternal(int ppDispatch) {
-//CHECKSTYLE_ON
+        // CHECKSTYLE_ON
         if (ppDispatch != 0) {
           try {
             // Return the 'external' object.
@@ -276,11 +295,6 @@
         }
       }
 
-      {
-        // make sure we hold onto a ref on the external object
-        external.AddRef();
-      }
-
     };
 
     // Interpose the proxy in front of the browser's iDocHostUiHandler.
